diff --git a/main.js b/main.js index a40e711..6de0785 100644 --- a/main.js +++ b/main.js @@ -67781,14 +67781,14 @@ var TimestampPlugin = class extends import_obsidian4.Plugin { this.addCommand({ id: "pause-player", name: "Pause player", - editorCallback: (editor, view) => { + callback: () => { this.setPlaying(!this.player.props.playing); } }); this.addCommand({ id: "seek-forward", name: "Seek Forward", - editorCallback: (editor, view) => { + callback: () => { if (this.player) this.player.seekTo(this.player.getCurrentTime() + parseInt(this.settings.forwardSeek)); } @@ -67796,7 +67796,7 @@ var TimestampPlugin = class extends import_obsidian4.Plugin { this.addCommand({ id: "seek-backward", name: "Seek Backward", - editorCallback: (editor, view) => { + callback: () => { if (this.player) this.player.seekTo(this.player.getCurrentTime() - parseInt(this.settings.backwardsSeek)); } @@ -67820,6 +67820,9 @@ var TimestampPlugin = class extends import_obsidian4.Plugin { id: "add-subtitles", name: "Add subtitle file", callback: () => __async(this, null, function* () { + if (!this.player) { + return new import_obsidian4.Notice("Player is not working right now"); + } var input = document.createElement("input"); input.type = "file"; input.accept = ".srt,.vtt"; @@ -67876,12 +67879,12 @@ var TimestampPlugin = class extends import_obsidian4.Plugin { } activateView(url, editor) { return __async(this, null, function* () { - this.app.workspace.detachLeavesOfType(VIDEO_VIEW); - yield this.app.workspace.getRightLeaf(false).setViewState({ - type: VIDEO_VIEW, - active: true - }); - this.app.workspace.revealLeaf(this.app.workspace.getLeavesOfType(VIDEO_VIEW)[0]); + if (this.app.workspace.getLeavesOfType(VIDEO_VIEW).length == 0) { + yield this.app.workspace.getRightLeaf(false).setViewState({ + type: VIDEO_VIEW, + active: true + }); + } this.app.workspace.getLeavesOfType(VIDEO_VIEW).forEach((leaf) => __async(this, null, function* () { if (leaf.view instanceof VideoView) { var localhost_url; @@ -68301,4 +68304,4 @@ object-assign * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbG9hZC1zY3JpcHQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RlZXBtZXJnZS9kaXN0L2Nqcy5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BhdHRlcm5zLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1wbGF5ZXIvbGF6eS9wbGF5ZXJzL1lvdVR1YmUuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BsYXllcnMvU291bmRDbG91ZC5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGxheWVycy9WaW1lby5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGxheWVycy9GYWNlYm9vay5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGxheWVycy9TdHJlYW1hYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1wbGF5ZXIvbGF6eS9wbGF5ZXJzL1dpc3RpYS5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGxheWVycy9Ud2l0Y2guanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BsYXllcnMvRGFpbHlNb3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BsYXllcnMvTWl4Y2xvdWQuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BsYXllcnMvVmlkeWFyZC5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGxheWVycy9LYWx0dXJhLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1wbGF5ZXIvbGF6eS9wbGF5ZXJzL0ZpbGVQbGF5ZXIuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BsYXllcnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21lbW9pemUtb25lL2Rpc3QvbWVtb2l6ZS1vbmUuY2pzLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1mYXN0LWNvbXBhcmUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCAibm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbGliL2hhcy5qcyIsICJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsICJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsICJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanMiLCAibm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3Byb3BzLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1wbGF5ZXIvbGF6eS9QbGF5ZXIuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L1ByZXZpZXcuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L1JlYWN0UGxheWVyLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1wbGF5ZXIvbGF6eS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMiLCAibm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2xpZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kZXBkL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9ieXRlcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY29udGVudC10eXBlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zZXRwcm90b3R5cGVvZi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc3RhdHVzZXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCAibm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzLmpzIiwgIm5vZGVfbW9kdWxlcy90b2lkZW50aWZpZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtZXJyb3JzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2JvZHktcGFyc2VyL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvZGVidWcuanMiLCAibm9kZV9tb2R1bGVzL2JvZHktcGFyc2VyL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvYm9keS1wYXJzZXIvbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9ub2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kZXN0cm95L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zYWZlci1idWZmZXIvc2FmZXIuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvbGliL2JvbS1oYW5kbGluZy5qcyIsICJub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvaW50ZXJuYWwuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL3V0ZjE2LmpzIiwgIm5vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy91dGY3LmpzIiwgIm5vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy9zYmNzLWNvZGVjLmpzIiwgIm5vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy9zYmNzLWRhdGEuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL3NiY3MtZGF0YS1nZW5lcmF0ZWQuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL2RiY3MtY29kZWMuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL2RiY3MtZGF0YS5qcyIsICJub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvbGliL3N0cmVhbXMuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvbGliL2V4dGVuZC1ub2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9pY29udi1saXRlL2xpYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdW5waXBlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9yYXctYm9keS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZWUtZmlyc3QvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL29uLWZpbmlzaGVkL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvcmVhZC5qcyIsICJub2RlX21vZHVsZXMvbWVkaWEtdHlwZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21pbWUtZGIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21pbWUtdHlwZXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3R5cGUtaXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2JvZHktcGFyc2VyL2xpYi90eXBlcy9qc29uLmpzIiwgIm5vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvdHlwZXMvcmF3LmpzIiwgIm5vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvdHlwZXMvdGV4dC5qcyIsICJub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvc2hhbXMuanMiLCAibm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9oYXMtcHJvdG8vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW1wbGVtZW50YXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2hhcy9zcmMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2dldC1pbnRyaW5zaWMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcyIsICJub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvdXRpbC5pbnNwZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9vYmplY3QtaW5zcGVjdC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc2lkZS1jaGFubmVsL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qcyIsICJub2RlX21vZHVsZXMvcXMvbGliL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwgIm5vZGVfbW9kdWxlcy9xcy9saWIvcGFyc2UuanMiLCAibm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYm9keS1wYXJzZXIvbGliL3R5cGVzL3VybGVuY29kZWQuanMiLCAibm9kZV9tb2R1bGVzL2JvZHktcGFyc2VyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9tZXJnZS1kZXNjcmlwdG9ycy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmluYWxoYW5kbGVyL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmluYWxoYW5kbGVyL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvZGVidWcuanMiLCAibm9kZV9tb2R1bGVzL2ZpbmFsaGFuZGxlci9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCAibm9kZV9tb2R1bGVzL2ZpbmFsaGFuZGxlci9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL2ZpbmFsaGFuZGxlci9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9lbmNvZGV1cmwvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2VzY2FwZS1odG1sL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9wYXJzZXVybC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmluYWxoYW5kbGVyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2RlYnVnLmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL2V4cHJlc3Mvbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYXJyYXktZmxhdHRlbi9hcnJheS1mbGF0dGVuLmpzIiwgIm5vZGVfbW9kdWxlcy9wYXRoLXRvLXJlZ2V4cC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvcm91dGVyL2xheWVyLmpzIiwgIm5vZGVfbW9kdWxlcy9tZXRob2RzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9yb3V0ZXIvcm91dGUuanMiLCAibm9kZV9tb2R1bGVzL3V0aWxzLW1lcmdlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9yb3V0ZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL21pZGRsZXdhcmUvaW5pdC5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvbWlkZGxld2FyZS9xdWVyeS5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvdmlldy5qcyIsICJub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NvbnRlbnQtZGlzcG9zaXRpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3NlbmQvbm9kZV9tb2R1bGVzL2RlYnVnL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc2VuZC9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2RlYnVnLmpzIiwgIm5vZGVfbW9kdWxlcy9zZW5kL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvc2VuZC9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL3NlbmQvbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXRhZy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZnJlc2gvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21pbWUvbWltZS5qcyIsICJub2RlX21vZHVsZXMvc2VuZC9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JhbmdlLXBhcnNlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc2VuZC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZm9yd2FyZGVkL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcGFkZHIuanMvbGliL2lwYWRkci5qcyIsICJub2RlX21vZHVsZXMvcHJveHktYWRkci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL2FwcGxpY2F0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9uZWdvdGlhdG9yL2xpYi9jaGFyc2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9uZWdvdGlhdG9yL2xpYi9lbmNvZGluZy5qcyIsICJub2RlX21vZHVsZXMvbmVnb3RpYXRvci9saWIvbGFuZ3VhZ2UuanMiLCAibm9kZV9tb2R1bGVzL25lZ290aWF0b3IvbGliL21lZGlhVHlwZS5qcyIsICJub2RlX21vZHVsZXMvbmVnb3RpYXRvci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYWNjZXB0cy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvcmVxdWVzdC5qcyIsICJub2RlX21vZHVsZXMvY29va2llLXNpZ25hdHVyZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY29va2llL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy92YXJ5L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9yZXNwb25zZS5qcyIsICJub2RlX21vZHVsZXMvc2VydmUtc3RhdGljL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9leHByZXNzLmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kZXRlY3QtZmlsZS1lbmNvZGluZy1hbmQtbGFuZ3VhZ2Uvc3JjL2NvbXBvbmVudHMvY2hlY2tVVEYuanMiLCAibm9kZV9tb2R1bGVzL2RldGVjdC1maWxlLWVuY29kaW5nLWFuZC1sYW5ndWFnZS9zcmMvY29uZmlnL2xhbmd1YWdlT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kZXRlY3QtZmlsZS1lbmNvZGluZy1hbmQtbGFuZ3VhZ2Uvc3JjL2NvbXBvbmVudHMvcHJvY2Vzc2luZy1jb250ZW50L2NvdW50QWxsTWF0Y2hlcy5qcyIsICJub2RlX21vZHVsZXMvZGV0ZWN0LWZpbGUtZW5jb2RpbmctYW5kLWxhbmd1YWdlL3NyYy9jb21wb25lbnRzL3Byb2Nlc3NpbmctY29udGVudC9jYWxjdWxhdGVDb25maWRlbmNlU2NvcmUuanMiLCAibm9kZV9tb2R1bGVzL2RldGVjdC1maWxlLWVuY29kaW5nLWFuZC1sYW5ndWFnZS9zcmMvY29uZmlnL2J5dGVPcmRlck1hcmtPYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2RldGVjdC1maWxlLWVuY29kaW5nLWFuZC1sYW5ndWFnZS9zcmMvY29tcG9uZW50cy9wcm9jZXNzQ29udGVudC5qcyIsICJub2RlX21vZHVsZXMvZGV0ZWN0LWZpbGUtZW5jb2RpbmctYW5kLWxhbmd1YWdlL3NyYy9jb21wb25lbnRzL2NoZWNrQnl0ZU9yZGVyTWFyay5qcyIsICJub2RlX21vZHVsZXMvZGV0ZWN0LWZpbGUtZW5jb2RpbmctYW5kLWxhbmd1YWdlL3NyYy9pbmRleC1ub2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9yZXF1aXJlcy1wb3J0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5L2xpYi9odHRwLXByb3h5L2NvbW1vbi5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS9saWIvaHR0cC1wcm94eS9wYXNzZXMvd2ViLW91dGdvaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsICJub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCAibm9kZV9tb2R1bGVzL2hhcy1mbGFnL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZm9sbG93LXJlZGlyZWN0cy9kZWJ1Zy5qcyIsICJub2RlX21vZHVsZXMvZm9sbG93LXJlZGlyZWN0cy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS9saWIvaHR0cC1wcm94eS9wYXNzZXMvd2ViLWluY29taW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5L2xpYi9odHRwLXByb3h5L3Bhc3Nlcy93cy1pbmNvbWluZy5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS9saWIvaHR0cC1wcm94eS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS9saWIvaHR0cC1wcm94eS5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9lcnJvcnMuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtcHJveHktbWlkZGxld2FyZS9kaXN0L2xvZ2dlci5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS1taWRkbGV3YXJlL2Rpc3QvY29uZmlnLWZhY3RvcnkuanMiLCAibm9kZV9tb2R1bGVzL2lzLWV4dGdsb2IvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lzLWdsb2IvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvc3RyaW5naWZ5LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1udW1iZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3RvLXJlZ2V4LXJhbmdlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9maWxsLXJhbmdlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9icmFjZXMvbGliL2NvbXBpbGUuanMiLCAibm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvZXhwYW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9icmFjZXMvbGliL2NvbnN0YW50cy5qcyIsICJub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9wYXJzZS5qcyIsICJub2RlX21vZHVsZXMvYnJhY2VzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL2NvbnN0YW50cy5qcyIsICJub2RlX21vZHVsZXMvcGljb21hdGNoL2xpYi91dGlscy5qcyIsICJub2RlX21vZHVsZXMvcGljb21hdGNoL2xpYi9zY2FuLmpzIiwgIm5vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3BpY29tYXRjaC5qcyIsICJub2RlX21vZHVsZXMvcGljb21hdGNoL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hdGNoL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9jb250ZXh0LW1hdGNoZXIuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtcHJveHktbWlkZGxld2FyZS9kaXN0L19oYW5kbGVycy5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS1taWRkbGV3YXJlL2Rpc3QvcGF0aC1yZXdyaXRlci5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS1taWRkbGV3YXJlL2Rpc3Qvcm91dGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9odHRwLXByb3h5LW1pZGRsZXdhcmUuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtcHJveHktbWlkZGxld2FyZS9kaXN0L2hhbmRsZXJzL3Jlc3BvbnNlLWludGVyY2VwdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9oYW5kbGVycy9maXgtcmVxdWVzdC1ib2R5LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9oYW5kbGVycy9wdWJsaWMuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtcHJveHktbWlkZGxld2FyZS9kaXN0L2hhbmRsZXJzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMveG1sL2xpYi9lc2NhcGVGb3JYTUwuanMiLCAibm9kZV9tb2R1bGVzL3htbC9saWIveG1sLmpzIiwgIm1haW4udHMiLCAidmlldy9WaWRlb1ZpZXcudHN4IiwgInZpZXcvVmlkZW9Db250YWluZXIudHN4IiwgInNldHRpbmdzLnRzIiwgImhhbmRsZXJzL3NlcnZlci50cyIsICJoYW5kbGVycy9iaWxpYmlsaS50cyIsICJoYW5kbGVycy9taXNjLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4ndXNlIHN0cmljdCc7dmFyIGw9U3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIiksbj1TeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLHA9U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLHE9U3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpLHI9U3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLHQ9U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpLHU9U3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIiksdj1TeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksdz1TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIikseD1TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKSx5PVN5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpLHo9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIEEoYSl7aWYobnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYSlyZXR1cm4gbnVsbDthPXomJmFbel18fGFbXCJAQGl0ZXJhdG9yXCJdO3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhP2E6bnVsbH1cbnZhciBCPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxDPU9iamVjdC5hc3NpZ24sRD17fTtmdW5jdGlvbiBFKGEsYixlKXt0aGlzLnByb3BzPWE7dGhpcy5jb250ZXh0PWI7dGhpcy5yZWZzPUQ7dGhpcy51cGRhdGVyPWV8fEJ9RS5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fTtcbkUucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGEsYil7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBhJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSYmbnVsbCE9YSl0aHJvdyBFcnJvcihcInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLlwiKTt0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsYSxiLFwic2V0U3RhdGVcIil9O0UucHJvdG90eXBlLmZvcmNlVXBkYXRlPWZ1bmN0aW9uKGEpe3RoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcyxhLFwiZm9yY2VVcGRhdGVcIil9O2Z1bmN0aW9uIEYoKXt9Ri5wcm90b3R5cGU9RS5wcm90b3R5cGU7ZnVuY3Rpb24gRyhhLGIsZSl7dGhpcy5wcm9wcz1hO3RoaXMuY29udGV4dD1iO3RoaXMucmVmcz1EO3RoaXMudXBkYXRlcj1lfHxCfXZhciBIPUcucHJvdG90eXBlPW5ldyBGO1xuSC5jb25zdHJ1Y3Rvcj1HO0MoSCxFLnByb3RvdHlwZSk7SC5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgST1BcnJheS5pc0FycmF5LEo9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxLPXtjdXJyZW50Om51bGx9LEw9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIE0oYSxiLGUpe3ZhciBkLGM9e30saz1udWxsLGg9bnVsbDtpZihudWxsIT1iKWZvcihkIGluIHZvaWQgMCE9PWIucmVmJiYoaD1iLnJlZiksdm9pZCAwIT09Yi5rZXkmJihrPVwiXCIrYi5rZXkpLGIpSi5jYWxsKGIsZCkmJiFMLmhhc093blByb3BlcnR5KGQpJiYoY1tkXT1iW2RdKTt2YXIgZz1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWcpYy5jaGlsZHJlbj1lO2Vsc2UgaWYoMTxnKXtmb3IodmFyIGY9QXJyYXkoZyksbT0wO208ZzttKyspZlttXT1hcmd1bWVudHNbbSsyXTtjLmNoaWxkcmVuPWZ9aWYoYSYmYS5kZWZhdWx0UHJvcHMpZm9yKGQgaW4gZz1hLmRlZmF1bHRQcm9wcyxnKXZvaWQgMD09PWNbZF0mJihjW2RdPWdbZF0pO3JldHVybnskJHR5cGVvZjpsLHR5cGU6YSxrZXk6ayxyZWY6aCxwcm9wczpjLF9vd25lcjpLLmN1cnJlbnR9fVxuZnVuY3Rpb24gTihhLGIpe3JldHVybnskJHR5cGVvZjpsLHR5cGU6YS50eXBlLGtleTpiLHJlZjphLnJlZixwcm9wczphLnByb3BzLF9vd25lcjphLl9vd25lcn19ZnVuY3Rpb24gTyhhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09bH1mdW5jdGlvbiBlc2NhcGUoYSl7dmFyIGI9e1wiPVwiOlwiPTBcIixcIjpcIjpcIj0yXCJ9O3JldHVyblwiJFwiK2EucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfSl9dmFyIFA9L1xcLysvZztmdW5jdGlvbiBRKGEsYil7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmbnVsbCE9YS5rZXk/ZXNjYXBlKFwiXCIrYS5rZXkpOmIudG9TdHJpbmcoMzYpfVxuZnVuY3Rpb24gUihhLGIsZSxkLGMpe3ZhciBrPXR5cGVvZiBhO2lmKFwidW5kZWZpbmVkXCI9PT1rfHxcImJvb2xlYW5cIj09PWspYT1udWxsO3ZhciBoPSExO2lmKG51bGw9PT1hKWg9ITA7ZWxzZSBzd2l0Y2goayl7Y2FzZSBcInN0cmluZ1wiOmNhc2UgXCJudW1iZXJcIjpoPSEwO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjpzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSBsOmNhc2UgbjpoPSEwfX1pZihoKXJldHVybiBoPWEsYz1jKGgpLGE9XCJcIj09PWQ/XCIuXCIrUShoLDApOmQsSShjKT8oZT1cIlwiLG51bGwhPWEmJihlPWEucmVwbGFjZShQLFwiJCYvXCIpK1wiL1wiKSxSKGMsYixlLFwiXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGF9KSk6bnVsbCE9YyYmKE8oYykmJihjPU4oYyxlKyghYy5rZXl8fGgmJmgua2V5PT09Yy5rZXk/XCJcIjooXCJcIitjLmtleSkucmVwbGFjZShQLFwiJCYvXCIpK1wiL1wiKSthKSksYi5wdXNoKGMpKSwxO2g9MDtkPVwiXCI9PT1kP1wiLlwiOmQrXCI6XCI7aWYoSShhKSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl7az1cbmFbZ107dmFyIGY9ZCtRKGssZyk7aCs9UihrLGIsZSxmLGMpfWVsc2UgaWYoZj1BKGEpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmKWZvcihhPWYuY2FsbChhKSxnPTA7IShrPWEubmV4dCgpKS5kb25lOylrPWsudmFsdWUsZj1kK1EoayxnKyspLGgrPVIoayxiLGUsZixjKTtlbHNlIGlmKFwib2JqZWN0XCI9PT1rKXRocm93IGI9U3RyaW5nKGEpLEVycm9yKFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIisoXCJbb2JqZWN0IE9iamVjdF1cIj09PWI/XCJvYmplY3Qgd2l0aCBrZXlzIHtcIitPYmplY3Qua2V5cyhhKS5qb2luKFwiLCBcIikrXCJ9XCI6YikrXCIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuXCIpO3JldHVybiBofVxuZnVuY3Rpb24gUyhhLGIsZSl7aWYobnVsbD09YSlyZXR1cm4gYTt2YXIgZD1bXSxjPTA7UihhLGQsXCJcIixcIlwiLGZ1bmN0aW9uKGEpe3JldHVybiBiLmNhbGwoZSxhLGMrKyl9KTtyZXR1cm4gZH1mdW5jdGlvbiBUKGEpe2lmKC0xPT09YS5fc3RhdHVzKXt2YXIgYj1hLl9yZXN1bHQ7Yj1iKCk7Yi50aGVuKGZ1bmN0aW9uKGIpe2lmKDA9PT1hLl9zdGF0dXN8fC0xPT09YS5fc3RhdHVzKWEuX3N0YXR1cz0xLGEuX3Jlc3VsdD1ifSxmdW5jdGlvbihiKXtpZigwPT09YS5fc3RhdHVzfHwtMT09PWEuX3N0YXR1cylhLl9zdGF0dXM9MixhLl9yZXN1bHQ9Yn0pOy0xPT09YS5fc3RhdHVzJiYoYS5fc3RhdHVzPTAsYS5fcmVzdWx0PWIpfWlmKDE9PT1hLl9zdGF0dXMpcmV0dXJuIGEuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IGEuX3Jlc3VsdDt9XG52YXIgVT17Y3VycmVudDpudWxsfSxWPXt0cmFuc2l0aW9uOm51bGx9LFc9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6VSxSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzpWLFJlYWN0Q3VycmVudE93bmVyOkt9O2V4cG9ydHMuQ2hpbGRyZW49e21hcDpTLGZvckVhY2g6ZnVuY3Rpb24oYSxiLGUpe1MoYSxmdW5jdGlvbigpe2IuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlKX0sY291bnQ6ZnVuY3Rpb24oYSl7dmFyIGI9MDtTKGEsZnVuY3Rpb24oKXtiKyt9KTtyZXR1cm4gYn0sdG9BcnJheTpmdW5jdGlvbihhKXtyZXR1cm4gUyhhLGZ1bmN0aW9uKGEpe3JldHVybiBhfSl8fFtdfSxvbmx5OmZ1bmN0aW9uKGEpe2lmKCFPKGEpKXRocm93IEVycm9yKFwiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuXCIpO3JldHVybiBhfX07ZXhwb3J0cy5Db21wb25lbnQ9RTtleHBvcnRzLkZyYWdtZW50PXA7XG5leHBvcnRzLlByb2ZpbGVyPXI7ZXhwb3J0cy5QdXJlQ29tcG9uZW50PUc7ZXhwb3J0cy5TdHJpY3RNb2RlPXE7ZXhwb3J0cy5TdXNwZW5zZT13O2V4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9VztcbmV4cG9ydHMuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGEsYixlKXtpZihudWxsPT09YXx8dm9pZCAwPT09YSl0aHJvdyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiK2ErXCIuXCIpO3ZhciBkPUMoe30sYS5wcm9wcyksYz1hLmtleSxrPWEucmVmLGg9YS5fb3duZXI7aWYobnVsbCE9Yil7dm9pZCAwIT09Yi5yZWYmJihrPWIucmVmLGg9Sy5jdXJyZW50KTt2b2lkIDAhPT1iLmtleSYmKGM9XCJcIitiLmtleSk7aWYoYS50eXBlJiZhLnR5cGUuZGVmYXVsdFByb3BzKXZhciBnPWEudHlwZS5kZWZhdWx0UHJvcHM7Zm9yKGYgaW4gYilKLmNhbGwoYixmKSYmIUwuaGFzT3duUHJvcGVydHkoZikmJihkW2ZdPXZvaWQgMD09PWJbZl0mJnZvaWQgMCE9PWc/Z1tmXTpiW2ZdKX12YXIgZj1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWYpZC5jaGlsZHJlbj1lO2Vsc2UgaWYoMTxmKXtnPUFycmF5KGYpO1xuZm9yKHZhciBtPTA7bTxmO20rKylnW21dPWFyZ3VtZW50c1ttKzJdO2QuY2hpbGRyZW49Z31yZXR1cm57JCR0eXBlb2Y6bCx0eXBlOmEudHlwZSxrZXk6YyxyZWY6ayxwcm9wczpkLF9vd25lcjpofX07ZXhwb3J0cy5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGEpe2E9eyQkdHlwZW9mOnUsX2N1cnJlbnRWYWx1ZTphLF9jdXJyZW50VmFsdWUyOmEsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsLF9kZWZhdWx0VmFsdWU6bnVsbCxfZ2xvYmFsTmFtZTpudWxsfTthLlByb3ZpZGVyPXskJHR5cGVvZjp0LF9jb250ZXh0OmF9O3JldHVybiBhLkNvbnN1bWVyPWF9O2V4cG9ydHMuY3JlYXRlRWxlbWVudD1NO2V4cG9ydHMuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihhKXt2YXIgYj1NLmJpbmQobnVsbCxhKTtiLnR5cGU9YTtyZXR1cm4gYn07ZXhwb3J0cy5jcmVhdGVSZWY9ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpudWxsfX07XG5leHBvcnRzLmZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJueyQkdHlwZW9mOnYscmVuZGVyOmF9fTtleHBvcnRzLmlzVmFsaWRFbGVtZW50PU87ZXhwb3J0cy5sYXp5PWZ1bmN0aW9uKGEpe3JldHVybnskJHR5cGVvZjp5LF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6YX0sX2luaXQ6VH19O2V4cG9ydHMubWVtbz1mdW5jdGlvbihhLGIpe3JldHVybnskJHR5cGVvZjp4LHR5cGU6YSxjb21wYXJlOnZvaWQgMD09PWI/bnVsbDpifX07ZXhwb3J0cy5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9Vi50cmFuc2l0aW9uO1YudHJhbnNpdGlvbj17fTt0cnl7YSgpfWZpbmFsbHl7Vi50cmFuc2l0aW9uPWJ9fTtleHBvcnRzLnVuc3RhYmxlX2FjdD1mdW5jdGlvbigpe3Rocm93IEVycm9yKFwiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC5cIik7fTtcbmV4cG9ydHMudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUNhbGxiYWNrKGEsYil9O2V4cG9ydHMudXNlQ29udGV4dD1mdW5jdGlvbihhKXtyZXR1cm4gVS5jdXJyZW50LnVzZUNvbnRleHQoYSl9O2V4cG9ydHMudXNlRGVidWdWYWx1ZT1mdW5jdGlvbigpe307ZXhwb3J0cy51c2VEZWZlcnJlZFZhbHVlPWZ1bmN0aW9uKGEpe3JldHVybiBVLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShhKX07ZXhwb3J0cy51c2VFZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUVmZmVjdChhLGIpfTtleHBvcnRzLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIFUuY3VycmVudC51c2VJZCgpfTtleHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oYSxiLGUpe3JldHVybiBVLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShhLGIsZSl9O1xuZXhwb3J0cy51c2VJbnNlcnRpb25FZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChhLGIpfTtleHBvcnRzLnVzZUxheW91dEVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBVLmN1cnJlbnQudXNlTGF5b3V0RWZmZWN0KGEsYil9O2V4cG9ydHMudXNlTWVtbz1mdW5jdGlvbihhLGIpe3JldHVybiBVLmN1cnJlbnQudXNlTWVtbyhhLGIpfTtleHBvcnRzLnVzZVJlZHVjZXI9ZnVuY3Rpb24oYSxiLGUpe3JldHVybiBVLmN1cnJlbnQudXNlUmVkdWNlcihhLGIsZSl9O2V4cG9ydHMudXNlUmVmPWZ1bmN0aW9uKGEpe3JldHVybiBVLmN1cnJlbnQudXNlUmVmKGEpfTtleHBvcnRzLnVzZVN0YXRlPWZ1bmN0aW9uKGEpe3JldHVybiBVLmN1cnJlbnQudXNlU3RhdGUoYSl9O2V4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmU9ZnVuY3Rpb24oYSxiLGUpe3JldHVybiBVLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUoYSxiLGUpfTtcbmV4cG9ydHMudXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiBVLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtleHBvcnRzLnZlcnNpb249XCIxOC4xLjBcIjtcbiIsICIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdFZlcnNpb24gPSAnMTguMS4wJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbi8vIEFUVEVOVElPTlxuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9ICBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBkaXNwYXRjaGVyLlxuICovXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGJhdGNoJ3MgY29uZmlndXJhdGlvbiBzdWNoIGFzIGhvdyBsb25nIGFuIHVwZGF0ZVxuICogc2hvdWxkIHN1c3BlbmQgZm9yIGlmIGl0IG5lZWRzIHRvLlxuICovXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcgPSB7XG4gIHRyYW5zaXRpb246IG51bGxcbn07XG5cbnZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IHtcbiAgY3VycmVudDogbnVsbCxcbiAgLy8gVXNlZCB0byByZXByb2R1Y2UgYmVoYXZpb3Igb2YgYGJhdGNoZWRVcGRhdGVzYCBpbiBsZWdhY3kgbW9kZS5cbiAgaXNCYXRjaGluZ0xlZ2FjeTogZmFsc2UsXG4gIGRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlOiBmYWxzZVxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xudmFyIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBudWxsO1xuZnVuY3Rpb24gc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKSB7XG4gIHtcbiAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gIH1cbn1cblxue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZSA9IGZ1bmN0aW9uIChzdGFjaykge1xuICAgIHtcbiAgICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgICB9XG4gIH07IC8vIFN0YWNrIGltcGxlbWVudGF0aW9uIGluamVjdGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyLlxuXG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhY2sgPSAnJzsgLy8gQWRkIGFuIGV4dHJhIHRvcCBmcmFtZSB3aGlsZSBhbiBlbGVtZW50IGlzIGJlaW5nIHZhbGlkYXRlZFxuXG4gICAgaWYgKGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUpIHtcbiAgICAgIHN0YWNrICs9IGN1cnJlbnRFeHRyYVN0YWNrRnJhbWU7XG4gICAgfSAvLyBEZWxlZ2F0ZSB0byB0aGUgaW5qZWN0ZWQgcmVuZGVyZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cblxuXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcblxuICAgIGlmIChpbXBsKSB7XG4gICAgICBzdGFjayArPSBpbXBsKCkgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyXG59O1xuXG57XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlO1xufVxuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICB2YXIgX2NvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnO1xuICAgIHZhciB3YXJuaW5nS2V5ID0gY29tcG9uZW50TmFtZSArIFwiLlwiICsgY2FsbGVyTmFtZTtcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlcnJvcihcIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuIFwiICsgJ1RoaXMgaXMgYSBuby1vcCwgYnV0IGl0IG1pZ2h0IGluZGljYXRlIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uICcgKyAnSW5zdGVhZCwgYXNzaWduIHRvIGB0aGlzLnN0YXRlYCBkaXJlY3RseSBvciBkZWZpbmUgYSBgc3RhdGUgPSB7fTtgICcgKyAnY2xhc3MgcHJvcGVydHkgd2l0aCB0aGUgZGVzaXJlZCBzdGF0ZSBpbiB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gdHJ1ZTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xuXG5cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbkNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnZnVuY3Rpb24nICYmIHBhcnRpYWxTdGF0ZSAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhICcgKyAnZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLicpO1xuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbmFzc2lnbihwdXJlQ29tcG9uZW50UHJvdG90eXBlLCBDb21wb25lbnQucHJvdG90eXBlKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biwgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgY29uZmlnLl9fc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gY29uZmlnLl9fc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjcmVhdGVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gIHZhciBwcm9wcyA9IHt9O1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG5cbiAgICAgIHtcbiAgICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIiArIGVsZW1lbnQgKyBcIi5cIik7XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuXG5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0ga2V5LnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcblxuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgZWxlbWVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IEEgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEtleShlbGVtZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJiBlbGVtZW50ICE9PSBudWxsICYmIGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICB7XG4gICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXNjYXBlKCcnICsgZWxlbWVudC5rZXkpO1xuICB9IC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG5cblxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgc3dpdGNoIChjaGlsZHJlbi4kJHR5cGVvZikge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgIHZhciBfY2hpbGQgPSBjaGlsZHJlbjtcbiAgICB2YXIgbWFwcGVkQ2hpbGQgPSBjYWxsYmFjayhfY2hpbGQpOyAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3M6XG5cbiAgICB2YXIgY2hpbGRLZXkgPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0RWxlbWVudEtleShfY2hpbGQsIDApIDogbmFtZVNvRmFyO1xuXG4gICAgaWYgKGlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgICB2YXIgZXNjYXBlZENoaWxkS2V5ID0gJyc7XG5cbiAgICAgIGlmIChjaGlsZEtleSAhPSBudWxsKSB7XG4gICAgICAgIGVzY2FwZWRDaGlsZEtleSA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShjaGlsZEtleSkgKyAnLyc7XG4gICAgICB9XG5cbiAgICAgIG1hcEludG9BcnJheShtYXBwZWRDaGlsZCwgYXJyYXksIGVzY2FwZWRDaGlsZEtleSwgJycsIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgYGlmYCBzdGF0ZW1lbnQgaGVyZSBwcmV2ZW50cyBhdXRvLWRpc2FibGluZyBvZiB0aGUgc2FmZVxuICAgICAgICAgIC8vIGNvZXJjaW9uIEVTTGludCBydWxlLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGRpc2FibGUgaXQgYmVsb3cuXG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgICAgaWYgKG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1hcHBlZENoaWxkLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAgICBlc2NhcGVkUHJlZml4ICsgKCAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgbWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkgPyAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIGV4aXN0aW5nIGVsZW1lbnQncyBrZXkgY2FuIGJlIGEgbnVtYmVyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoJycgKyBtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgICAgfVxuXG4gICAgICBhcnJheS5wdXNoKG1hcHBlZENoaWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cblxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGl0ZXJhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGl0ZXJhYmxlQ2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgICAgd2FybignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlQ2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaWkgPSAwO1xuXG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKSB7XG4gIC8vIFRPRE86IFNlY29uZCBhcmd1bWVudCB1c2VkIHRvIGJlIGFuIG9wdGlvbmFsIGBjYWxjdWxhdGVDaGFuZ2VkQml0c2BcbiAgLy8gZnVuY3Rpb24uIFdhcm4gdG8gcmVzZXJ2ZSBmb3IgZnV0dXJlIHVzZT9cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsLFxuICAgIC8vIEFkZCB0aGVzZSB0byB1c2Ugc2FtZSBoaWRkZW4gY2xhc3MgaW4gVk0gYXMgU2VydmVyQ29udGV4dFxuICAgIF9kZWZhdWx0VmFsdWU6IG51bGwsXG4gICAgX2dsb2JhbE5hbWU6IG51bGxcbiAgfTtcbiAgY29udGV4dC5Qcm92aWRlciA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfUFJPVklERVJfVFlQRSxcbiAgICBfY29udGV4dDogY29udGV4dFxuICB9O1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IGZhbHNlO1xuXG4gIHtcbiAgICAvLyBBIHNlcGFyYXRlIG9iamVjdCwgYnV0IHByb3hpZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBvYmplY3QgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5XG4gICAgLy8gd2FybiBmb3IgdGhlIGluY29ycmVjdCB1c2FnZSBvZiBDb250ZXh0IGFzIGEgQ29uc3VtZXIuXG4gICAgdmFyIENvbnN1bWVyID0ge1xuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0XG4gICAgfTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbm90IHNldHRpbmcgYSB2YWx1ZSwgd2hpY2ggaXMgaW50ZW50aW9uYWwgaGVyZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ29uc3VtZXIsIHtcbiAgICAgIFByb3ZpZGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Qcm92aWRlcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX1Byb3ZpZGVyKSB7XG4gICAgICAgICAgY29udGV4dC5Qcm92aWRlciA9IF9Qcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IF9jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlMjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlMjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZTIpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfdGhyZWFkQ291bnQ6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3RocmVhZENvdW50O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfdGhyZWFkQ291bnQpIHtcbiAgICAgICAgICBjb250ZXh0Ll90aHJlYWRDb3VudCA9IF90aHJlYWRDb3VudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIENvbnN1bWVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Db25zdW1lcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Db25zdW1lcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlOYW1lOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpc3BsYXlOYW1lO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIpIHtcbiAgICAgICAgICAgIHdhcm4oJ1NldHRpbmcgYGRpc3BsYXlOYW1lYCBvbiBDb250ZXh0LkNvbnN1bWVyIGhhcyBubyBlZmZlY3QuICcgKyBcIllvdSBzaG91bGQgc2V0IGl0IGRpcmVjdGx5IG9uIHRoZSBjb250ZXh0IHdpdGggQ29udGV4dC5kaXNwbGF5TmFtZSA9ICclcycuXCIsIGRpc3BsYXlOYW1lKTtcblxuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pOyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBtaXNzaW5nIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgZGVmaW5lUHJvcGVydHlcblxuICAgIGNvbnRleHQuQ29uc3VtZXIgPSBDb25zdW1lcjtcbiAgfVxuXG4gIHtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBudWxsO1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlcjIgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbnZhciBVbmluaXRpYWxpemVkID0gLTE7XG52YXIgUGVuZGluZyA9IDA7XG52YXIgUmVzb2x2ZWQgPSAxO1xudmFyIFJlamVjdGVkID0gMjtcblxuZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgIHZhciB0aGVuYWJsZSA9IGN0b3IoKTsgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAvLyBUaGlzIG1pZ2h0IHRocm93IGVpdGhlciBiZWNhdXNlIGl0J3MgbWlzc2luZyBvciB0aHJvd3MuIElmIHNvLCB3ZSB0cmVhdCBpdFxuICAgIC8vIGFzIHN0aWxsIHVuaW5pdGlhbGl6ZWQgYW5kIHRyeSBhZ2FpbiBuZXh0IHRpbWUuIFdoaWNoIGlzIHRoZSBzYW1lIGFzIHdoYXRcbiAgICAvLyBoYXBwZW5zIGlmIHRoZSBjdG9yIG9yIGFueSB3cmFwcGVycyBwcm9jZXNzaW5nIHRoZSBjdG9yIHRocm93cy4gVGhpcyBtaWdodFxuICAgIC8vIGVuZCB1cCBmaXhpbmcgaXQgaWYgdGhlIHJlc29sdXRpb24gd2FzIGEgY29uY3VycmVuY3kgYnVnLlxuXG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZXNvbHZlZC5fc3RhdHVzID0gUmVzb2x2ZWQ7XG4gICAgICAgIHJlc29sdmVkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3Q7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZWplY3RlZC5fc3RhdHVzID0gUmVqZWN0ZWQ7XG4gICAgICAgIHJlamVjdGVkLl9yZXN1bHQgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIC8vIEluIGNhc2UsIHdlJ3JlIHN0aWxsIHVuaW5pdGlhbGl6ZWQsIHRoZW4gd2UncmUgd2FpdGluZyBmb3IgdGhlIHRoZW5hYmxlXG4gICAgICAvLyB0byByZXNvbHZlLiBTZXQgaXQgYXMgcGVuZGluZyBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICB2YXIgcGVuZGluZyA9IHBheWxvYWQ7XG4gICAgICBwZW5kaW5nLl9zdGF0dXMgPSBQZW5kaW5nO1xuICAgICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUmVzb2x2ZWQpIHtcbiAgICB2YXIgbW9kdWxlT2JqZWN0ID0gcGF5bG9hZC5fcmVzdWx0O1xuXG4gICAge1xuICAgICAgaWYgKG1vZHVsZU9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXAnICsgJ29ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2NvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXAnICsgXCJvcnQoJy4vTXlDb21wb25lbnQnKSlcXG5cXG5cIiArICdEaWQgeW91IGFjY2lkZW50YWxseSBwdXQgY3VybHkgYnJhY2VzIGFyb3VuZCB0aGUgaW1wb3J0PycsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKCEoJ2RlZmF1bHQnIGluIG1vZHVsZU9iamVjdCkpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVPYmplY3QuZGVmYXVsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBwYXlsb2FkLl9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBwYXlsb2FkID0ge1xuICAgIC8vIFdlIHVzZSB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC5cbiAgICBfc3RhdHVzOiBVbmluaXRpYWxpemVkLFxuICAgIF9yZXN1bHQ6IGN0b3JcbiAgfTtcbiAgdmFyIGxhenlUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9MQVpZX1RZUEUsXG4gICAgX3BheWxvYWQ6IHBheWxvYWQsXG4gICAgX2luaXQ6IGxhenlJbml0aWFsaXplclxuICB9O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICB2YXIgcHJvcFR5cGVzOyAvLyAkRmxvd0ZpeE1lXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsYXp5VHlwZSwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9wcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3RGVmYXVsdFByb3BzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYGRlZmF1bHRQcm9wc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIGRlZmF1bHRQcm9wcyA9IG5ld0RlZmF1bHRQcm9wczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAnZGVmYXVsdFByb3BzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvcFR5cGVzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BUeXBlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJvcFR5cGVzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIHByb3BUeXBlcyA9IG5ld1Byb3BUeXBlczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAncHJvcFR5cGVzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbGF6eVR5cGU7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSZWYocmVuZGVyKSB7XG4gIHtcbiAgICBpZiAocmVuZGVyICE9IG51bGwgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCAnICsgJ2NvbXBvbmVudC4gSW5zdGVhZCBvZiBmb3J3YXJkUmVmKG1lbW8oLi4uKSksIHVzZSAnICsgJ21lbW8oZm9yd2FyZFJlZiguLi4pKS4nKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuJywgcmVuZGVyID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHJlbmRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZW5kZXIubGVuZ3RoICE9PSAwICYmIHJlbmRlci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBhY2NlcHQgZXhhY3RseSB0d28gcGFyYW1ldGVyczogcHJvcHMgYW5kIHJlZi4gJXMnLCByZW5kZXIubGVuZ3RoID09PSAxID8gJ0RpZCB5b3UgZm9yZ2V0IHRvIHVzZSB0aGUgcmVmIHBhcmFtZXRlcj8nIDogJ0FueSBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyICE9IG51bGwpIHtcbiAgICAgIGlmIChyZW5kZXIuZGVmYXVsdFByb3BzICE9IG51bGwgfHwgcmVuZGVyLnByb3BUeXBlcyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgZG8gbm90IHN1cHBvcnQgcHJvcFR5cGVzIG9yIGRlZmF1bHRQcm9wcy4gJyArICdEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIGEgUmVhY3QgY29tcG9uZW50PycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICByZW5kZXI6IHJlbmRlclxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXJlbmRlci5uYW1lICYmICFyZW5kZXIuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0Lm1lbW8oKHByb3BzKSA9PiB7Li4ufSk7XG4gICAgICAgIC8vIFRoaXMga2luZCBvZiBpbm5lciBmdW5jdGlvbiBpcyBub3QgdXNlZCBlbHNld2hlcmUgc28gdGhlIHNpZGUgZWZmZWN0IGlzIG9rYXkuXG5cbiAgICAgICAgaWYgKCF0eXBlLm5hbWUgJiYgIXR5cGUuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICB0eXBlLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7XG5cbiAge1xuICAgIGlmIChkaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvcicgKyAnIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4nICsgJzMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpO1xuICAgIH1cbiAgfSAvLyBXaWxsIHJlc3VsdCBpbiBhIG51bGwgYWNjZXNzIGVycm9yIGlmIGFjY2Vzc2VkIG91dHNpZGUgcmVuZGVyIHBoYXNlLiBXZVxuICAvLyBpbnRlbnRpb25hbGx5IGRvbid0IHRocm93IG91ciBvd24gZXJyb3IgYmVjYXVzZSB0aGlzIGlzIGluIGEgaG90IHBhdGguXG4gIC8vIEFsc28gaGVscHMgZW5zdXJlIHRoaXMgaXMgaW5saW5lZC5cblxuXG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuZnVuY3Rpb24gdXNlQ29udGV4dChDb250ZXh0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZWFsQ29udGV4dCA9IENvbnRleHQuX2NvbnRleHQ7IC8vIERvbid0IGRlZHVwbGljYXRlIGJlY2F1c2UgdGhpcyBsZWdpdGltYXRlbHkgY2F1c2VzIGJ1Z3NcbiAgICAgIC8vIGFuZCBub2JvZHkgc2hvdWxkIGJlIHVzaW5nIHRoaXMgaW4gZXhpc3RpbmcgY29kZS5cblxuICAgICAgaWYgKHJlYWxDb250ZXh0LkNvbnN1bWVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Db25zdW1lcikgaXMgbm90IHN1cHBvcnRlZCwgbWF5IGNhdXNlIGJ1Z3MsIGFuZCB3aWxsIGJlICcgKyAncmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9IGVsc2UgaWYgKHJlYWxDb250ZXh0LlByb3ZpZGVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Qcm92aWRlcikgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ29udGV4dChDb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59XG5mdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xufVxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VNZW1vKGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZU1lbW8oY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gIHtcbiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICB9XG59XG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVRyYW5zaXRpb24oKTtcbn1cbmZ1bmN0aW9uIHVzZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUlkKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUlkKCk7XG59XG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbn1cblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMoZWxlbWVudFByb3BzKSB7XG4gIGlmIChlbGVtZW50UHJvcHMgIT09IG51bGwgJiYgZWxlbWVudFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oZWxlbWVudFByb3BzLl9fc291cmNlKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG5cblxudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICBpZiAoIWluZm8pIHtcbiAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZm87XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IHRydWU7IC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG5cbiAgICAgIHZhciBfbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIF9uYW1lIHx8ICdVbmtub3duJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhdHlwZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGEgZnJhZ21lbnQsIHZhbGlkYXRlIHRoYXQgaXQgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2l0aCBmcmFnbWVudCBwcm9wc1xuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHtcbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKHByb3BzKTtcblxuICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNjb3BlLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSB7fTtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2NvcGUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gZmFsc2U7XG52YXIgZW5xdWV1ZVRhc2tJbXBsID0gbnVsbDtcbmZ1bmN0aW9uIGVucXVldWVUYXNrKHRhc2spIHtcbiAgaWYgKGVucXVldWVUYXNrSW1wbCA9PT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICAvLyByZWFkIHJlcXVpcmUgb2ZmIHRoZSBtb2R1bGUgb2JqZWN0IHRvIGdldCBhcm91bmQgdGhlIGJ1bmRsZXJzLlxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIGRldGVjdCBhIHJlcXVpcmUgYW5kIGJ1bmRsZSBhIE5vZGUgcG9seWZpbGwuXG4gICAgICB2YXIgcmVxdWlyZVN0cmluZyA9ICgncmVxdWlyZScgKyBNYXRoLnJhbmRvbSgpKS5zbGljZSgwLCA3KTtcbiAgICAgIHZhciBub2RlUmVxdWlyZSA9IG1vZHVsZSAmJiBtb2R1bGVbcmVxdWlyZVN0cmluZ107IC8vIGFzc3VtaW5nIHdlJ3JlIGluIG5vZGUsIGxldCdzIHRyeSB0byBnZXQgbm9kZSdzXG4gICAgICAvLyB2ZXJzaW9uIG9mIHNldEltbWVkaWF0ZSwgYnlwYXNzaW5nIGZha2UgdGltZXJzIGlmIGFueS5cblxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gbm9kZVJlcXVpcmUuY2FsbChtb2R1bGUsICd0aW1lcnMnKS5zZXRJbW1lZGlhdGU7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgLy8gd2UncmUgaW4gYSBicm93c2VyXG4gICAgICAvLyB3ZSBjYW4ndCB1c2UgcmVndWxhciB0aW1lcnMgYmVjYXVzZSB0aGV5IG1heSBzdGlsbCBiZSBmYWtlZFxuICAgICAgLy8gc28gd2UgdHJ5IE1lc3NhZ2VDaGFubmVsK3Bvc3RNZXNzYWdlIGluc3RlYWRcbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBlcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ2hhbm5lbCBpbXBsZW1lbnRhdGlvbiwgJyArICdzbyBlbnF1ZXVpbmcgdGFza3MgdmlhIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pIHdpbGwgZmFpbC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzICcgKyAnaWYgeW91IGVuY291bnRlciB0aGlzIHdhcm5pbmcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW5xdWV1ZVRhc2tJbXBsKHRhc2spO1xufVxuXG52YXIgYWN0U2NvcGVEZXB0aCA9IDA7XG52YXIgZGlkV2Fybk5vQXdhaXRBY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGFjdChjYWxsYmFjaykge1xuICB7XG4gICAgLy8gYGFjdGAgY2FsbHMgY2FuIGJlIG5lc3RlZCwgc28gd2UgdHJhY2sgdGhlIGRlcHRoLiBUaGlzIHJlcHJlc2VudHMgdGhlXG4gICAgLy8gbnVtYmVyIG9mIGBhY3RgIHNjb3BlcyBvbiB0aGUgc3RhY2suXG4gICAgdmFyIHByZXZBY3RTY29wZURlcHRoID0gYWN0U2NvcGVEZXB0aDtcbiAgICBhY3RTY29wZURlcHRoKys7XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgb3V0ZXJtb3N0IGBhY3RgIHNjb3BlLiBJbml0aWFsaXplIHRoZSBxdWV1ZS4gVGhlIHJlY29uY2lsZXJcbiAgICAgIC8vIHdpbGwgZGV0ZWN0IHRoZSBxdWV1ZSBhbmQgdXNlIGl0IGluc3RlYWQgb2YgU2NoZWR1bGVyLlxuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgIH1cblxuICAgIHZhciBwcmV2SXNCYXRjaGluZ0xlZ2FjeSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3k7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLiBPbmx5XG4gICAgICAvLyBzZXQgdG8gYHRydWVgIHdoaWxlIHRoZSBnaXZlbiBjYWxsYmFjayBpcyBleGVjdXRlZCwgbm90IGZvciB1cGRhdGVzXG4gICAgICAvLyB0cmlnZ2VyZWQgZHVyaW5nIGFuIGFzeW5jIGV2ZW50LCBiZWNhdXNlIHRoaXMgaXMgaG93IHRoZSBsZWdhY3lcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIGBhY3RgIGJlaGF2ZWQuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7IC8vIFJlcGxpY2F0ZSBiZWhhdmlvciBvZiBvcmlnaW5hbCBgYWN0YCBpbXBsZW1lbnRhdGlvbiBpbiBsZWdhY3kgbW9kZSxcbiAgICAgIC8vIHdoaWNoIGZsdXNoZWQgdXBkYXRlcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgc2NvcGUgZnVuY3Rpb24gZXhpdHMsIGV2ZW5cbiAgICAgIC8vIGlmIGl0J3MgYW4gYXN5bmMgZnVuY3Rpb24uXG5cbiAgICAgIGlmICghcHJldklzQmF0Y2hpbmdMZWdhY3kgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gcHJldklzQmF0Y2hpbmdMZWdhY3k7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0aGVuYWJsZVJlc3VsdCA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIGFuIGFzeW5jIGZ1bmN0aW9uIChpLmUuIHJldHVybmVkIGEgcHJvbWlzZSkuIFdhaXRcbiAgICAgIC8vIGZvciBpdCB0byByZXNvbHZlIGJlZm9yZSBleGl0aW5nIHRoZSBjdXJyZW50IHNjb3BlLlxuXG4gICAgICB2YXIgd2FzQXdhaXRlZCA9IGZhbHNlO1xuICAgICAgdmFyIHRoZW5hYmxlID0ge1xuICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgd2FzQXdhaXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhlbmFibGVSZXN1bHQudGhlbihmdW5jdGlvbiAocmV0dXJuVmFsdWUpIHtcbiAgICAgICAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgICAgICAgLy8gV2UndmUgZXhpdGVkIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBSZWN1cnNpdmVseSBmbHVzaCB0aGVcbiAgICAgICAgICAgICAgLy8gcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLlxuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAge1xuICAgICAgICBpZiAoIWRpZFdhcm5Ob0F3YWl0QWN0ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge30pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF3YXNBd2FpdGVkKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBlcnJvcignWW91IGNhbGxlZCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aXRob3V0IGF3YWl0LiAnICsgJ1RoaXMgY291bGQgbGVhZCB0byB1bmV4cGVjdGVkIHRlc3RpbmcgYmVoYXZpb3VyLCAnICsgJ2ludGVybGVhdmluZyBtdWx0aXBsZSBhY3QgY2FsbHMgYW5kIG1peGluZyB0aGVpciAnICsgJ3Njb3Blcy4gJyArICdZb3Ugc2hvdWxkIC0gYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLik7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWUgPSByZXN1bHQ7IC8vIFRoZSBjYWxsYmFjayBpcyBub3QgYW4gYXN5bmMgZnVuY3Rpb24uIEV4aXQgdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgIC8vIGltbWVkaWF0ZWx5LCB3aXRob3V0IGF3YWl0aW5nLlxuXG4gICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG5cbiAgICAgIGlmIChhY3RTY29wZURlcHRoID09PSAwKSB7XG4gICAgICAgIC8vIEV4aXRpbmcgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIEZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKF9xdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUoX3F1ZXVlKTtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSAvLyBSZXR1cm4gYSB0aGVuYWJsZS4gSWYgdGhlIHVzZXIgYXdhaXRzIGl0LCB3ZSdsbCBmbHVzaCBhZ2FpbiBpblxuICAgICAgICAvLyBjYXNlIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkIGJ5IGEgbWljcm90YXNrLlxuXG5cbiAgICAgICAgdmFyIF90aGVuYWJsZSA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAvLyBDb25maXJtIHdlIGhhdmVuJ3QgcmUtZW50ZXJlZCBhbm90aGVyIGBhY3RgIHNjb3BlLCBpbiBjYXNlXG4gICAgICAgICAgICAvLyB0aGUgdXNlciBkb2VzIHNvbWV0aGluZyB3ZWlyZCBsaWtlIGF3YWl0IHRoZSB0aGVuYWJsZVxuICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMuXG4gICAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbHVzaCB0aGUgcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luY2Ugd2UncmUgaW5zaWRlIGEgbmVzdGVkIGBhY3RgIHNjb3BlLCB0aGUgcmV0dXJuZWQgdGhlbmFibGVcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmVzb2x2ZXMuIFRoZSBvdXRlciBzY29wZSB3aWxsIGZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF90aGVuYWJsZTIgPSB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpIHtcbiAge1xuICAgIGlmIChwcmV2QWN0U2NvcGVEZXB0aCAhPT0gYWN0U2NvcGVEZXB0aCAtIDEpIHtcbiAgICAgIGVycm9yKCdZb3Ugc2VlbSB0byBoYXZlIG92ZXJsYXBwaW5nIGFjdCgpIGNhbGxzLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnQmUgc3VyZSB0byBhd2FpdCBwcmV2aW91cyBhY3QoKSBjYWxscyBiZWZvcmUgbWFraW5nIGEgbmV3IG9uZS4gJyk7XG4gICAgfVxuXG4gICAgYWN0U2NvcGVEZXB0aCA9IHByZXZBY3RTY29wZURlcHRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCkge1xuICB7XG4gICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIHdvcmsgd2FzIHNjaGVkdWxlZC4gRmluaXNoLlxuICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gS2VlcCBmbHVzaGluZyB3b3JrIHVudGlsIHRoZXJlJ3Mgbm9uZSBsZWZ0LlxuICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0ZsdXNoaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQWN0UXVldWUocXVldWUpIHtcbiAge1xuICAgIGlmICghaXNGbHVzaGluZykge1xuICAgICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICAgIHF1ZXVlID0gcXVldWUuc2xpY2UoaSArIDEpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG5leHBvcnRzLlN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBSZWFjdFNoYXJlZEludGVybmFscztcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeTtcbmV4cG9ydHMuY3JlYXRlUmVmID0gY3JlYXRlUmVmO1xuZXhwb3J0cy5mb3J3YXJkUmVmID0gZm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnQgPSBpc1ZhbGlkRWxlbWVudDtcbmV4cG9ydHMubGF6eSA9IGxhenk7XG5leHBvcnRzLm1lbW8gPSBtZW1vO1xuZXhwb3J0cy5zdGFydFRyYW5zaXRpb24gPSBzdGFydFRyYW5zaXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2FjdCA9IGFjdDtcbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSB1c2VDYWxsYmFjaztcbmV4cG9ydHMudXNlQ29udGV4dCA9IHVzZUNvbnRleHQ7XG5leHBvcnRzLnVzZURlYnVnVmFsdWUgPSB1c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VEZWZlcnJlZFZhbHVlID0gdXNlRGVmZXJyZWRWYWx1ZTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0O1xuZXhwb3J0cy51c2VJZCA9IHVzZUlkO1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gdXNlSW1wZXJhdGl2ZUhhbmRsZTtcbmV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0ID0gdXNlSW5zZXJ0aW9uRWZmZWN0O1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3QgPSB1c2VMYXlvdXRFZmZlY3Q7XG5leHBvcnRzLnVzZU1lbW8gPSB1c2VNZW1vO1xuZXhwb3J0cy51c2VSZWR1Y2VyID0gdXNlUmVkdWNlcjtcbmV4cG9ydHMudXNlUmVmID0gdXNlUmVmO1xuZXhwb3J0cy51c2VTdGF0ZSA9IHVzZVN0YXRlO1xuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlO1xuZXhwb3J0cy51c2VUcmFuc2l0aW9uID0gdXNlVHJhbnNpdGlvbjtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBsb2FkIChzcmMsIG9wdHMsIGNiKSB7XG4gIHZhciBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0c1xuICAgIG9wdHMgPSB7fVxuICB9XG5cbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgY2IgPSBjYiB8fCBmdW5jdGlvbigpIHt9XG5cbiAgc2NyaXB0LnR5cGUgPSBvcHRzLnR5cGUgfHwgJ3RleHQvamF2YXNjcmlwdCdcbiAgc2NyaXB0LmNoYXJzZXQgPSBvcHRzLmNoYXJzZXQgfHwgJ3V0ZjgnO1xuICBzY3JpcHQuYXN5bmMgPSAnYXN5bmMnIGluIG9wdHMgPyAhIW9wdHMuYXN5bmMgOiB0cnVlXG4gIHNjcmlwdC5zcmMgPSBzcmNcblxuICBpZiAob3B0cy5hdHRycykge1xuICAgIHNldEF0dHJpYnV0ZXMoc2NyaXB0LCBvcHRzLmF0dHJzKVxuICB9XG5cbiAgaWYgKG9wdHMudGV4dCkge1xuICAgIHNjcmlwdC50ZXh0ID0gJycgKyBvcHRzLnRleHRcbiAgfVxuXG4gIHZhciBvbmVuZCA9ICdvbmxvYWQnIGluIHNjcmlwdCA/IHN0ZE9uRW5kIDogaWVPbkVuZFxuICBvbmVuZChzY3JpcHQsIGNiKVxuXG4gIC8vIHNvbWUgZ29vZCBsZWdhY3kgYnJvd3NlcnMgKGZpcmVmb3gpIGZhaWwgdGhlICdpbicgZGV0ZWN0aW9uIGFib3ZlXG4gIC8vIHNvIGFzIGEgZmFsbGJhY2sgd2UgYWx3YXlzIHNldCBvbmxvYWRcbiAgLy8gb2xkIElFIHdpbGwgaWdub3JlIHRoaXMgYW5kIG5ldyBJRSB3aWxsIHNldCBvbmxvYWRcbiAgaWYgKCFzY3JpcHQub25sb2FkKSB7XG4gICAgc3RkT25FbmQoc2NyaXB0LCBjYik7XG4gIH1cblxuICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdClcbn1cblxuZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhzY3JpcHQsIGF0dHJzKSB7XG4gIGZvciAodmFyIGF0dHIgaW4gYXR0cnMpIHtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJzW2F0dHJdKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGRPbkVuZCAoc2NyaXB0LCBjYikge1xuICBzY3JpcHQub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub25lcnJvciA9IHRoaXMub25sb2FkID0gbnVsbFxuICAgIGNiKG51bGwsIHNjcmlwdClcbiAgfVxuICBzY3JpcHQub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyB0aGlzLm9ubG9hZCA9IG51bGwgaGVyZSBpcyBuZWNlc3NhcnlcbiAgICAvLyBiZWNhdXNlIGV2ZW4gSUU5IHdvcmtzIG5vdCBsaWtlIG90aGVyc1xuICAgIHRoaXMub25lcnJvciA9IHRoaXMub25sb2FkID0gbnVsbFxuICAgIGNiKG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgJyArIHRoaXMuc3JjKSwgc2NyaXB0KVxuICB9XG59XG5cbmZ1bmN0aW9uIGllT25FbmQgKHNjcmlwdCwgY2IpIHtcbiAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9ICdjb21wbGV0ZScgJiYgdGhpcy5yZWFkeVN0YXRlICE9ICdsb2FkZWQnKSByZXR1cm5cbiAgICB0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGxcbiAgICBjYihudWxsLCBzY3JpcHQpIC8vIHRoZXJlIGlzIG5vIHdheSB0byBjYXRjaCBsb2FkaW5nIGVycm9ycyBpbiBJRThcbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzTWVyZ2VhYmxlT2JqZWN0ID0gZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsdWUpIHtcblx0cmV0dXJuIGlzTm9uTnVsbE9iamVjdCh2YWx1ZSlcblx0XHQmJiAhaXNTcGVjaWFsKHZhbHVlKVxufTtcblxuZnVuY3Rpb24gaXNOb25OdWxsT2JqZWN0KHZhbHVlKSB7XG5cdHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbn1cblxuZnVuY3Rpb24gaXNTcGVjaWFsKHZhbHVlKSB7XG5cdHZhciBzdHJpbmdWYWx1ZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cblx0cmV0dXJuIHN0cmluZ1ZhbHVlID09PSAnW29iamVjdCBSZWdFeHBdJ1xuXHRcdHx8IHN0cmluZ1ZhbHVlID09PSAnW29iamVjdCBEYXRlXSdcblx0XHR8fCBpc1JlYWN0RWxlbWVudCh2YWx1ZSlcbn1cblxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iL2I1YWM5NjNmYjc5MWQxMjk4ZTdmMzk2MjM2MzgzYmM5NTVmOTE2YzEvc3JjL2lzb21vcnBoaWMvY2xhc3NpYy9lbGVtZW50L1JlYWN0RWxlbWVudC5qcyNMMjEtTDI1XG52YXIgY2FuVXNlU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGNhblVzZVN5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcblxuZnVuY3Rpb24gaXNSZWFjdEVsZW1lbnQodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcbn1cblxuZnVuY3Rpb24gZW1wdHlUYXJnZXQodmFsKSB7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgPyBbXSA6IHt9XG59XG5cbmZ1bmN0aW9uIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSB7XG5cdHJldHVybiAob3B0aW9ucy5jbG9uZSAhPT0gZmFsc2UgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSkpXG5cdFx0PyBkZWVwbWVyZ2UoZW1wdHlUYXJnZXQodmFsdWUpLCB2YWx1ZSwgb3B0aW9ucylcblx0XHQ6IHZhbHVlXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdHJldHVybiB0YXJnZXQuY29uY2F0KHNvdXJjZSkubWFwKGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRyZXR1cm4gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoZWxlbWVudCwgb3B0aW9ucylcblx0fSlcbn1cblxuZnVuY3Rpb24gZ2V0TWVyZ2VGdW5jdGlvbihrZXksIG9wdGlvbnMpIHtcblx0aWYgKCFvcHRpb25zLmN1c3RvbU1lcmdlKSB7XG5cdFx0cmV0dXJuIGRlZXBtZXJnZVxuXHR9XG5cdHZhciBjdXN0b21NZXJnZSA9IG9wdGlvbnMuY3VzdG9tTWVyZ2Uoa2V5KTtcblx0cmV0dXJuIHR5cGVvZiBjdXN0b21NZXJnZSA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbU1lcmdlIDogZGVlcG1lcmdlXG59XG5cbmZ1bmN0aW9uIGdldEVudW1lcmFibGVPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSB7XG5cdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzXG5cdFx0PyBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkuZmlsdGVyKGZ1bmN0aW9uKHN5bWJvbCkge1xuXHRcdFx0cmV0dXJuIHRhcmdldC5wcm9wZXJ0eUlzRW51bWVyYWJsZShzeW1ib2wpXG5cdFx0fSlcblx0XHQ6IFtdXG59XG5cbmZ1bmN0aW9uIGdldEtleXModGFyZ2V0KSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyh0YXJnZXQpLmNvbmNhdChnZXRFbnVtZXJhYmxlT3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpXG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5SXNPbk9iamVjdChvYmplY3QsIHByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHByb3BlcnR5IGluIG9iamVjdFxuXHR9IGNhdGNoKF8pIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG4vLyBQcm90ZWN0cyBmcm9tIHByb3RvdHlwZSBwb2lzb25pbmcgYW5kIHVuZXhwZWN0ZWQgbWVyZ2luZyB1cCB0aGUgcHJvdG90eXBlIGNoYWluLlxuZnVuY3Rpb24gcHJvcGVydHlJc1Vuc2FmZSh0YXJnZXQsIGtleSkge1xuXHRyZXR1cm4gcHJvcGVydHlJc09uT2JqZWN0KHRhcmdldCwga2V5KSAvLyBQcm9wZXJ0aWVzIGFyZSBzYWZlIHRvIG1lcmdlIGlmIHRoZXkgZG9uJ3QgZXhpc3QgaW4gdGhlIHRhcmdldCB5ZXQsXG5cdFx0JiYgIShPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkgLy8gdW5zYWZlIGlmIHRoZXkgZXhpc3QgdXAgdGhlIHByb3RvdHlwZSBjaGFpbixcblx0XHRcdCYmIE9iamVjdC5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRhcmdldCwga2V5KSkgLy8gYW5kIGFsc28gdW5zYWZlIGlmIHRoZXkncmUgbm9uZW51bWVyYWJsZS5cbn1cblxuZnVuY3Rpb24gbWVyZ2VPYmplY3QodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0dmFyIGRlc3RpbmF0aW9uID0ge307XG5cdGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldCkpIHtcblx0XHRnZXRLZXlzKHRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh0YXJnZXRba2V5XSwgb3B0aW9ucyk7XG5cdFx0fSk7XG5cdH1cblx0Z2V0S2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG5cdFx0aWYgKHByb3BlcnR5SXNVbnNhZmUodGFyZ2V0LCBrZXkpKSB7XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cblx0XHRpZiAocHJvcGVydHlJc09uT2JqZWN0KHRhcmdldCwga2V5KSAmJiBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHNvdXJjZVtrZXldKSkge1xuXHRcdFx0ZGVzdGluYXRpb25ba2V5XSA9IGdldE1lcmdlRnVuY3Rpb24oa2V5LCBvcHRpb25zKSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdGlvbnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZXN0aW5hdGlvbltrZXldID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoc291cmNlW2tleV0sIG9wdGlvbnMpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBkZWVwbWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdG9wdGlvbnMuYXJyYXlNZXJnZSA9IG9wdGlvbnMuYXJyYXlNZXJnZSB8fCBkZWZhdWx0QXJyYXlNZXJnZTtcblx0b3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCA9IG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QgfHwgaXNNZXJnZWFibGVPYmplY3Q7XG5cdC8vIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIGlzIGFkZGVkIHRvIGBvcHRpb25zYCBzbyB0aGF0IGN1c3RvbSBhcnJheU1lcmdlKClcblx0Ly8gaW1wbGVtZW50YXRpb25zIGNhbiB1c2UgaXQuIFRoZSBjYWxsZXIgbWF5IG5vdCByZXBsYWNlIGl0LlxuXHRvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQ7XG5cblx0dmFyIHNvdXJjZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHNvdXJjZSk7XG5cdHZhciB0YXJnZXRJc0FycmF5ID0gQXJyYXkuaXNBcnJheSh0YXJnZXQpO1xuXHR2YXIgc291cmNlQW5kVGFyZ2V0VHlwZXNNYXRjaCA9IHNvdXJjZUlzQXJyYXkgPT09IHRhcmdldElzQXJyYXk7XG5cblx0aWYgKCFzb3VyY2VBbmRUYXJnZXRUeXBlc01hdGNoKSB7XG5cdFx0cmV0dXJuIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHNvdXJjZSwgb3B0aW9ucylcblx0fSBlbHNlIGlmIChzb3VyY2VJc0FycmF5KSB7XG5cdFx0cmV0dXJuIG9wdGlvbnMuYXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucylcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbWVyZ2VPYmplY3QodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpXG5cdH1cbn1cblxuZGVlcG1lcmdlLmFsbCA9IGZ1bmN0aW9uIGRlZXBtZXJnZUFsbChhcnJheSwgb3B0aW9ucykge1xuXHRpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXknKVxuXHR9XG5cblx0cmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbihwcmV2LCBuZXh0KSB7XG5cdFx0cmV0dXJuIGRlZXBtZXJnZShwcmV2LCBuZXh0LCBvcHRpb25zKVxuXHR9LCB7fSlcbn07XG5cbnZhciBkZWVwbWVyZ2VfMSA9IGRlZXBtZXJnZTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWVwbWVyZ2VfMTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucGFyc2VTdGFydFRpbWUgPSBwYXJzZVN0YXJ0VGltZTtcbmV4cG9ydHMucGFyc2VFbmRUaW1lID0gcGFyc2VFbmRUaW1lO1xuZXhwb3J0cy5yYW5kb21TdHJpbmcgPSByYW5kb21TdHJpbmc7XG5leHBvcnRzLnF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmc7XG5leHBvcnRzLmdldFNESyA9IGdldFNESztcbmV4cG9ydHMuZ2V0Q29uZmlnID0gZ2V0Q29uZmlnO1xuZXhwb3J0cy5vbWl0ID0gb21pdDtcbmV4cG9ydHMuY2FsbFBsYXllciA9IGNhbGxQbGF5ZXI7XG5leHBvcnRzLmlzTWVkaWFTdHJlYW0gPSBpc01lZGlhU3RyZWFtO1xuZXhwb3J0cy5pc0Jsb2JVcmwgPSBpc0Jsb2JVcmw7XG5leHBvcnRzLnN1cHBvcnRzV2ViS2l0UHJlc2VudGF0aW9uTW9kZSA9IHN1cHBvcnRzV2ViS2l0UHJlc2VudGF0aW9uTW9kZTtcblxudmFyIF9sb2FkU2NyaXB0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwibG9hZC1zY3JpcHRcIikpO1xuXG52YXIgX2RlZXBtZXJnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImRlZXBtZXJnZVwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG52YXIgTUFUQ0hfU1RBUlRfUVVFUlkgPSAvWz8mI10oPzpzdGFydHx0KT0oWzAtOWhtc10rKS87XG52YXIgTUFUQ0hfRU5EX1FVRVJZID0gL1s/JiNdZW5kPShbMC05aG1zXSspLztcbnZhciBNQVRDSF9TVEFSVF9TVEFNUCA9IC8oXFxkKykoaHxtfHMpL2c7XG52YXIgTUFUQ0hfTlVNRVJJQyA9IC9eXFxkKyQvOyAvLyBQYXJzZSBZb3VUdWJlIFVSTCBmb3IgYSBzdGFydCB0aW1lIHBhcmFtLCBpZSA/dD0xaDE0bTMwc1xuLy8gYW5kIHJldHVybiB0aGUgc3RhcnQgdGltZSBpbiBzZWNvbmRzXG5cbmZ1bmN0aW9uIHBhcnNlVGltZVBhcmFtKHVybCwgcGF0dGVybikge1xuICBpZiAodXJsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIG1hdGNoID0gdXJsLm1hdGNoKHBhdHRlcm4pO1xuXG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBzdGFtcCA9IG1hdGNoWzFdO1xuXG4gICAgaWYgKHN0YW1wLm1hdGNoKE1BVENIX1NUQVJUX1NUQU1QKSkge1xuICAgICAgcmV0dXJuIHBhcnNlVGltZVN0cmluZyhzdGFtcCk7XG4gICAgfVxuXG4gICAgaWYgKE1BVENIX05VTUVSSUMudGVzdChzdGFtcCkpIHtcbiAgICAgIHJldHVybiBwYXJzZUludChzdGFtcCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lU3RyaW5nKHN0YW1wKSB7XG4gIHZhciBzZWNvbmRzID0gMDtcbiAgdmFyIGFycmF5ID0gTUFUQ0hfU1RBUlRfU1RBTVAuZXhlYyhzdGFtcCk7XG5cbiAgd2hpbGUgKGFycmF5ICE9PSBudWxsKSB7XG4gICAgdmFyIF9hcnJheSA9IGFycmF5LFxuICAgICAgICBfYXJyYXkyID0gX3NsaWNlZFRvQXJyYXkoX2FycmF5LCAzKSxcbiAgICAgICAgY291bnQgPSBfYXJyYXkyWzFdLFxuICAgICAgICBwZXJpb2QgPSBfYXJyYXkyWzJdO1xuXG4gICAgaWYgKHBlcmlvZCA9PT0gJ2gnKSBzZWNvbmRzICs9IHBhcnNlSW50KGNvdW50LCAxMCkgKiA2MCAqIDYwO1xuICAgIGlmIChwZXJpb2QgPT09ICdtJykgc2Vjb25kcyArPSBwYXJzZUludChjb3VudCwgMTApICogNjA7XG4gICAgaWYgKHBlcmlvZCA9PT0gJ3MnKSBzZWNvbmRzICs9IHBhcnNlSW50KGNvdW50LCAxMCk7XG4gICAgYXJyYXkgPSBNQVRDSF9TVEFSVF9TVEFNUC5leGVjKHN0YW1wKTtcbiAgfVxuXG4gIHJldHVybiBzZWNvbmRzO1xufVxuXG5mdW5jdGlvbiBwYXJzZVN0YXJ0VGltZSh1cmwpIHtcbiAgcmV0dXJuIHBhcnNlVGltZVBhcmFtKHVybCwgTUFUQ0hfU1RBUlRfUVVFUlkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVuZFRpbWUodXJsKSB7XG4gIHJldHVybiBwYXJzZVRpbWVQYXJhbSh1cmwsIE1BVENIX0VORF9RVUVSWSk7XG59IC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM4NjIyNTQ1XG5cblxuZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDUpO1xufVxuXG5mdW5jdGlvbiBxdWVyeVN0cmluZyhvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoa2V5LCBcIj1cIikuY29uY2F0KG9iamVjdFtrZXldKTtcbiAgfSkuam9pbignJicpO1xufVxuXG5mdW5jdGlvbiBnZXRHbG9iYWwoa2V5KSB7XG4gIGlmICh3aW5kb3dba2V5XSkge1xuICAgIHJldHVybiB3aW5kb3dba2V5XTtcbiAgfVxuXG4gIGlmICh3aW5kb3cuZXhwb3J0cyAmJiB3aW5kb3cuZXhwb3J0c1trZXldKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5leHBvcnRzW2tleV07XG4gIH1cblxuICBpZiAod2luZG93Lm1vZHVsZSAmJiB3aW5kb3cubW9kdWxlLmV4cG9ydHMgJiYgd2luZG93Lm1vZHVsZS5leHBvcnRzW2tleV0pIHtcbiAgICByZXR1cm4gd2luZG93Lm1vZHVsZS5leHBvcnRzW2tleV07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gVXRpbCBmdW5jdGlvbiB0byBsb2FkIGFuIGV4dGVybmFsIFNES1xuLy8gb3IgcmV0dXJuIHRoZSBTREsgaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWRcblxuXG52YXIgcmVxdWVzdHMgPSB7fTtcblxuZnVuY3Rpb24gZ2V0U0RLKHVybCwgc2RrR2xvYmFsKSB7XG4gIHZhciBzZGtSZWFkeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgdmFyIGlzTG9hZGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIHZhciBmZXRjaFNjcmlwdCA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogX2xvYWRTY3JpcHRbXCJkZWZhdWx0XCJdO1xuICB2YXIgZXhpc3RpbmdHbG9iYWwgPSBnZXRHbG9iYWwoc2RrR2xvYmFsKTtcblxuICBpZiAoZXhpc3RpbmdHbG9iYWwgJiYgaXNMb2FkZWQoZXhpc3RpbmdHbG9iYWwpKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShleGlzdGluZ0dsb2JhbCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIC8vIElmIHdlIGFyZSBhbHJlYWR5IGxvYWRpbmcgdGhlIFNESywgYWRkIHRoZSByZXNvbHZlIGFuZCByZWplY3RcbiAgICAvLyBmdW5jdGlvbnMgdG8gdGhlIGV4aXN0aW5nIGFycmF5IG9mIHJlcXVlc3RzXG4gICAgaWYgKHJlcXVlc3RzW3VybF0pIHtcbiAgICAgIHJlcXVlc3RzW3VybF0ucHVzaCh7XG4gICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgIHJlamVjdDogcmVqZWN0XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXF1ZXN0c1t1cmxdID0gW3tcbiAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICByZWplY3Q6IHJlamVjdFxuICAgIH1dO1xuXG4gICAgdmFyIG9uTG9hZGVkID0gZnVuY3Rpb24gb25Mb2FkZWQoc2RrKSB7XG4gICAgICAvLyBXaGVuIGxvYWRlZCwgcmVzb2x2ZSBhbGwgcGVuZGluZyByZXF1ZXN0IHByb21pc2VzXG4gICAgICByZXF1ZXN0c1t1cmxdLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3QucmVzb2x2ZShzZGspO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChzZGtSZWFkeSkge1xuICAgICAgdmFyIHByZXZpb3VzT25SZWFkeSA9IHdpbmRvd1tzZGtSZWFkeV07XG5cbiAgICAgIHdpbmRvd1tzZGtSZWFkeV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChwcmV2aW91c09uUmVhZHkpIHByZXZpb3VzT25SZWFkeSgpO1xuICAgICAgICBvbkxvYWRlZChnZXRHbG9iYWwoc2RrR2xvYmFsKSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZldGNoU2NyaXB0KHVybCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICAvLyBMb2FkaW5nIHRoZSBTREsgZmFpbGVkIFx1MjAxMyByZWplY3QgYWxsIHJlcXVlc3RzIGFuZFxuICAgICAgICAvLyByZXNldCB0aGUgYXJyYXkgb2YgcmVxdWVzdHMgZm9yIHRoaXMgU0RLXG4gICAgICAgIHJlcXVlc3RzW3VybF0uZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybiByZXF1ZXN0LnJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxdWVzdHNbdXJsXSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCFzZGtSZWFkeSkge1xuICAgICAgICBvbkxvYWRlZChnZXRHbG9iYWwoc2RrR2xvYmFsKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWcocHJvcHMsIGRlZmF1bHRQcm9wcykge1xuICByZXR1cm4gKDAsIF9kZWVwbWVyZ2VbXCJkZWZhdWx0XCJdKShkZWZhdWx0UHJvcHMuY29uZmlnLCBwcm9wcy5jb25maWcpO1xufVxuXG5mdW5jdGlvbiBvbWl0KG9iamVjdCkge1xuICB2YXIgX3JlZjtcblxuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJyYXlzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcnJheXNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgdmFyIG9taXRLZXlzID0gKF9yZWYgPSBbXSkuY29uY2F0LmFwcGx5KF9yZWYsIGFycmF5cyk7XG5cbiAgdmFyIG91dHB1dCA9IHt9O1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgZm9yICh2YXIgX2kyID0gMCwgX2tleXMgPSBrZXlzOyBfaTIgPCBfa2V5cy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIGtleSA9IF9rZXlzW19pMl07XG5cbiAgICBpZiAob21pdEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgb3V0cHV0W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiBjYWxsUGxheWVyKG1ldGhvZCkge1xuICB2YXIgX3RoaXMkcGxheWVyO1xuXG4gIC8vIFV0aWwgbWV0aG9kIGZvciBjYWxsaW5nIGEgbWV0aG9kIG9uIHRoaXMucGxheWVyXG4gIC8vIGJ1dCBndWFyZCBhZ2FpbnN0IGVycm9ycyBhbmQgY29uc29sZS53YXJuIGluc3RlYWRcbiAgaWYgKCF0aGlzLnBsYXllciB8fCAhdGhpcy5wbGF5ZXJbbWV0aG9kXSkge1xuICAgIHZhciBtZXNzYWdlID0gXCJSZWFjdFBsYXllcjogXCIuY29uY2F0KHRoaXMuY29uc3RydWN0b3IuZGlzcGxheU5hbWUsIFwiIHBsYXllciBjb3VsZCBub3QgY2FsbCAlY1wiKS5jb25jYXQobWV0aG9kLCBcIiVjIFxcdTIwMTMgXCIpO1xuXG4gICAgaWYgKCF0aGlzLnBsYXllcikge1xuICAgICAgbWVzc2FnZSArPSAnVGhlIHBsYXllciB3YXMgbm90IGF2YWlsYWJsZSc7XG4gICAgfSBlbHNlIGlmICghdGhpcy5wbGF5ZXJbbWV0aG9kXSkge1xuICAgICAgbWVzc2FnZSArPSAnVGhlIG1ldGhvZCB3YXMgbm90IGF2YWlsYWJsZSc7XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UsICdmb250LXdlaWdodDogYm9sZCcsICcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuXG4gIHJldHVybiAoX3RoaXMkcGxheWVyID0gdGhpcy5wbGF5ZXIpW21ldGhvZF0uYXBwbHkoX3RoaXMkcGxheWVyLCBhcmdzKTtcbn1cblxuZnVuY3Rpb24gaXNNZWRpYVN0cmVhbSh1cmwpIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuTWVkaWFTdHJlYW0gIT09ICd1bmRlZmluZWQnICYmIHVybCBpbnN0YW5jZW9mIHdpbmRvdy5NZWRpYVN0cmVhbTtcbn1cblxuZnVuY3Rpb24gaXNCbG9iVXJsKHVybCkge1xuICByZXR1cm4gL15ibG9iOi8udGVzdCh1cmwpO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c1dlYktpdFByZXNlbnRhdGlvbk1vZGUoKSB7XG4gIHZhciB2aWRlbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgLy8gQ2hlY2sgaWYgU2FmYXJpIHN1cHBvcnRzIFBpUCwgYW5kIGlzIG5vdCBvbiBtb2JpbGUgKG90aGVyIHRoYW4gaVBhZClcbiAgLy8gaVBob25lIHNhZmFyaSBhcHBlYXJzIHRvIFwic3VwcG9ydFwiIFBpUCB0aHJvdWdoIHRoZSBjaGVjaywgaG93ZXZlciBQaVAgZG9lcyBub3QgZnVuY3Rpb25cbiAgdmFyIG5vdE1vYmlsZSA9IC9pUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA9PT0gZmFsc2U7XG4gIHJldHVybiB2aWRlby53ZWJraXRTdXBwb3J0c1ByZXNlbnRhdGlvbk1vZGUgJiYgdHlwZW9mIHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUgPT09ICdmdW5jdGlvbicgJiYgbm90TW9iaWxlO1xufSIsICJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2FuUGxheSA9IGV4cG9ydHMuRkxWX0VYVEVOU0lPTlMgPSBleHBvcnRzLkRBU0hfRVhURU5TSU9OUyA9IGV4cG9ydHMuSExTX0VYVEVOU0lPTlMgPSBleHBvcnRzLlZJREVPX0VYVEVOU0lPTlMgPSBleHBvcnRzLkFVRElPX0VYVEVOU0lPTlMgPSBleHBvcnRzLk1BVENIX1VSTF9LQUxUVVJBID0gZXhwb3J0cy5NQVRDSF9VUkxfVklEWUFSRCA9IGV4cG9ydHMuTUFUQ0hfVVJMX01JWENMT1VEID0gZXhwb3J0cy5NQVRDSF9VUkxfREFJTFlNT1RJT04gPSBleHBvcnRzLk1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTCA9IGV4cG9ydHMuTUFUQ0hfVVJMX1RXSVRDSF9WSURFTyA9IGV4cG9ydHMuTUFUQ0hfVVJMX1dJU1RJQSA9IGV4cG9ydHMuTUFUQ0hfVVJMX1NUUkVBTUFCTEUgPSBleHBvcnRzLk1BVENIX1VSTF9GQUNFQk9PS19XQVRDSCA9IGV4cG9ydHMuTUFUQ0hfVVJMX0ZBQ0VCT09LID0gZXhwb3J0cy5NQVRDSF9VUkxfVklNRU8gPSBleHBvcnRzLk1BVENIX1VSTF9TT1VORENMT1VEID0gZXhwb3J0cy5NQVRDSF9VUkxfWU9VVFVCRSA9IHZvaWQgMDtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgTUFUQ0hfVVJMX1lPVVRVQkUgPSAvKD86eW91dHVcXC5iZVxcL3x5b3V0dWJlKD86LW5vY29va2llKT9cXC5jb21cXC8oPzplbWJlZFxcL3x2XFwvfHdhdGNoXFwvfHdhdGNoXFw/dj18d2F0Y2hcXD8uKyZ2PXxzaG9ydHNcXC8pKSgoXFx3fC0pezExfSl8eW91dHViZVxcLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD18eW91dHViZVxcLmNvbVxcL3VzZXJcXC8vO1xuZXhwb3J0cy5NQVRDSF9VUkxfWU9VVFVCRSA9IE1BVENIX1VSTF9ZT1VUVUJFO1xudmFyIE1BVENIX1VSTF9TT1VORENMT1VEID0gLyg/OnNvdW5kY2xvdWRcXC5jb218c25kXFwuc2MpXFwvW14uXSskLztcbmV4cG9ydHMuTUFUQ0hfVVJMX1NPVU5EQ0xPVUQgPSBNQVRDSF9VUkxfU09VTkRDTE9VRDtcbnZhciBNQVRDSF9VUkxfVklNRU8gPSAvdmltZW9cXC5jb21cXC8oPyFwcm9ncmVzc2l2ZV9yZWRpcmVjdCkuKy87XG5leHBvcnRzLk1BVENIX1VSTF9WSU1FTyA9IE1BVENIX1VSTF9WSU1FTztcbnZhciBNQVRDSF9VUkxfRkFDRUJPT0sgPSAvXmh0dHBzPzpcXC9cXC8od3d3XFwuKT9mYWNlYm9va1xcLmNvbS4qXFwvKHZpZGVvKHMpP3x3YXRjaHxzdG9yeSkoXFwucGhwP3xcXC8pLiskLztcbmV4cG9ydHMuTUFUQ0hfVVJMX0ZBQ0VCT09LID0gTUFUQ0hfVVJMX0ZBQ0VCT09LO1xudmFyIE1BVENIX1VSTF9GQUNFQk9PS19XQVRDSCA9IC9eaHR0cHM/OlxcL1xcL2ZiXFwud2F0Y2hcXC8uKyQvO1xuZXhwb3J0cy5NQVRDSF9VUkxfRkFDRUJPT0tfV0FUQ0ggPSBNQVRDSF9VUkxfRkFDRUJPT0tfV0FUQ0g7XG52YXIgTUFUQ0hfVVJMX1NUUkVBTUFCTEUgPSAvc3RyZWFtYWJsZVxcLmNvbVxcLyhbYS16MC05XSspJC87XG5leHBvcnRzLk1BVENIX1VSTF9TVFJFQU1BQkxFID0gTUFUQ0hfVVJMX1NUUkVBTUFCTEU7XG52YXIgTUFUQ0hfVVJMX1dJU1RJQSA9IC8oPzp3aXN0aWFcXC4oPzpjb218bmV0KXx3aVxcLnN0KVxcLyg/Om1lZGlhc3xlbWJlZClcXC8oPzppZnJhbWVcXC8pPyguKikkLztcbmV4cG9ydHMuTUFUQ0hfVVJMX1dJU1RJQSA9IE1BVENIX1VSTF9XSVNUSUE7XG52YXIgTUFUQ0hfVVJMX1RXSVRDSF9WSURFTyA9IC8oPzp3d3dcXC58Z29cXC4pP3R3aXRjaFxcLnR2XFwvdmlkZW9zXFwvKFxcZCspKCR8XFw/KS87XG5leHBvcnRzLk1BVENIX1VSTF9UV0lUQ0hfVklERU8gPSBNQVRDSF9VUkxfVFdJVENIX1ZJREVPO1xudmFyIE1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTCA9IC8oPzp3d3dcXC58Z29cXC4pP3R3aXRjaFxcLnR2XFwvKFthLXpBLVowLTlfXSspKCR8XFw/KS87XG5leHBvcnRzLk1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTCA9IE1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTDtcbnZhciBNQVRDSF9VUkxfREFJTFlNT1RJT04gPSAvXig/Oig/Omh0dHBzPyk6KT8oPzpcXC9cXC8pPyg/Ond3d1xcLik/KD86KD86ZGFpbHltb3Rpb25cXC5jb20oPzpcXC9lbWJlZCk/XFwvdmlkZW8pfGRhaVxcLmx5KVxcLyhbYS16QS1aMC05XSspKD86X1tcXHdfLV0rKT8kLztcbmV4cG9ydHMuTUFUQ0hfVVJMX0RBSUxZTU9USU9OID0gTUFUQ0hfVVJMX0RBSUxZTU9USU9OO1xudmFyIE1BVENIX1VSTF9NSVhDTE9VRCA9IC9taXhjbG91ZFxcLmNvbVxcLyhbXi9dK1xcL1teL10rKS87XG5leHBvcnRzLk1BVENIX1VSTF9NSVhDTE9VRCA9IE1BVENIX1VSTF9NSVhDTE9VRDtcbnZhciBNQVRDSF9VUkxfVklEWUFSRCA9IC92aWR5YXJkLmNvbVxcLyg/OndhdGNoXFwvKT8oW2EtekEtWjAtOS1fXSspLztcbmV4cG9ydHMuTUFUQ0hfVVJMX1ZJRFlBUkQgPSBNQVRDSF9VUkxfVklEWUFSRDtcbnZhciBNQVRDSF9VUkxfS0FMVFVSQSA9IC9eaHR0cHM/OlxcL1xcL1thLXpBLVpdK1xcLmthbHR1cmEuKGNvbXxvcmcpXFwvcFxcLyhbMC05XSspXFwvc3BcXC8oWzAtOV0rKTAwXFwvZW1iZWRJZnJhbWVKc1xcL3VpY29uZl9pZFxcLyhbMC05XSspXFwvcGFydG5lcl9pZFxcLyhbMC05XSspKC4qKWVudHJ5X2lkLihbYS16QS1aMC05LV9dLiopJC87XG5leHBvcnRzLk1BVENIX1VSTF9LQUxUVVJBID0gTUFUQ0hfVVJMX0tBTFRVUkE7XG52YXIgQVVESU9fRVhURU5TSU9OUyA9IC9cXC4obTRhfG00YnxtcDRhfG1wZ2F8bXAyfG1wMmF8bXAzfG0yYXxtM2F8d2F2fHdlYmF8YWFjfG9nYXxzcHgpKCR8XFw/KS9pO1xuZXhwb3J0cy5BVURJT19FWFRFTlNJT05TID0gQVVESU9fRVhURU5TSU9OUztcbnZhciBWSURFT19FWFRFTlNJT05TID0gL1xcLihtcDR8b2dbZ3ZdfHdlYm18bW92fG00dikoI3Q9WyxcXGQrXSspPygkfFxcPykvaTtcbmV4cG9ydHMuVklERU9fRVhURU5TSU9OUyA9IFZJREVPX0VYVEVOU0lPTlM7XG52YXIgSExTX0VYVEVOU0lPTlMgPSAvXFwuKG0zdTgpKCR8XFw/KS9pO1xuZXhwb3J0cy5ITFNfRVhURU5TSU9OUyA9IEhMU19FWFRFTlNJT05TO1xudmFyIERBU0hfRVhURU5TSU9OUyA9IC9cXC4obXBkKSgkfFxcPykvaTtcbmV4cG9ydHMuREFTSF9FWFRFTlNJT05TID0gREFTSF9FWFRFTlNJT05TO1xudmFyIEZMVl9FWFRFTlNJT05TID0gL1xcLihmbHYpKCR8XFw/KS9pO1xuZXhwb3J0cy5GTFZfRVhURU5TSU9OUyA9IEZMVl9FWFRFTlNJT05TO1xuXG52YXIgY2FuUGxheUZpbGUgPSBmdW5jdGlvbiBjYW5QbGF5RmlsZSh1cmwpIHtcbiAgaWYgKHVybCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHVybCksXG4gICAgICAgIF9zdGVwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBpdGVtID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBjYW5QbGF5RmlsZShpdGVtKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhblBsYXlGaWxlKGl0ZW0uc3JjKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgoMCwgX3V0aWxzLmlzTWVkaWFTdHJlYW0pKHVybCkgfHwgKDAsIF91dGlscy5pc0Jsb2JVcmwpKHVybCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBBVURJT19FWFRFTlNJT05TLnRlc3QodXJsKSB8fCBWSURFT19FWFRFTlNJT05TLnRlc3QodXJsKSB8fCBITFNfRVhURU5TSU9OUy50ZXN0KHVybCkgfHwgREFTSF9FWFRFTlNJT05TLnRlc3QodXJsKSB8fCBGTFZfRVhURU5TSU9OUy50ZXN0KHVybCk7XG59O1xuXG52YXIgY2FuUGxheSA9IHtcbiAgeW91dHViZTogZnVuY3Rpb24geW91dHViZSh1cmwpIHtcbiAgICBpZiAodXJsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiB1cmwuZXZlcnkoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIE1BVENIX1VSTF9ZT1VUVUJFLnRlc3QoaXRlbSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gTUFUQ0hfVVJMX1lPVVRVQkUudGVzdCh1cmwpO1xuICB9LFxuICBzb3VuZGNsb3VkOiBmdW5jdGlvbiBzb3VuZGNsb3VkKHVybCkge1xuICAgIHJldHVybiBNQVRDSF9VUkxfU09VTkRDTE9VRC50ZXN0KHVybCkgJiYgIUFVRElPX0VYVEVOU0lPTlMudGVzdCh1cmwpO1xuICB9LFxuICB2aW1lbzogZnVuY3Rpb24gdmltZW8odXJsKSB7XG4gICAgcmV0dXJuIE1BVENIX1VSTF9WSU1FTy50ZXN0KHVybCkgJiYgIVZJREVPX0VYVEVOU0lPTlMudGVzdCh1cmwpICYmICFITFNfRVhURU5TSU9OUy50ZXN0KHVybCk7XG4gIH0sXG4gIGZhY2Vib29rOiBmdW5jdGlvbiBmYWNlYm9vayh1cmwpIHtcbiAgICByZXR1cm4gTUFUQ0hfVVJMX0ZBQ0VCT09LLnRlc3QodXJsKSB8fCBNQVRDSF9VUkxfRkFDRUJPT0tfV0FUQ0gudGVzdCh1cmwpO1xuICB9LFxuICBzdHJlYW1hYmxlOiBmdW5jdGlvbiBzdHJlYW1hYmxlKHVybCkge1xuICAgIHJldHVybiBNQVRDSF9VUkxfU1RSRUFNQUJMRS50ZXN0KHVybCk7XG4gIH0sXG4gIHdpc3RpYTogZnVuY3Rpb24gd2lzdGlhKHVybCkge1xuICAgIHJldHVybiBNQVRDSF9VUkxfV0lTVElBLnRlc3QodXJsKTtcbiAgfSxcbiAgdHdpdGNoOiBmdW5jdGlvbiB0d2l0Y2godXJsKSB7XG4gICAgcmV0dXJuIE1BVENIX1VSTF9UV0lUQ0hfVklERU8udGVzdCh1cmwpIHx8IE1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTC50ZXN0KHVybCk7XG4gIH0sXG4gIGRhaWx5bW90aW9uOiBmdW5jdGlvbiBkYWlseW1vdGlvbih1cmwpIHtcbiAgICByZXR1cm4gTUFUQ0hfVVJMX0RBSUxZTU9USU9OLnRlc3QodXJsKTtcbiAgfSxcbiAgbWl4Y2xvdWQ6IGZ1bmN0aW9uIG1peGNsb3VkKHVybCkge1xuICAgIHJldHVybiBNQVRDSF9VUkxfTUlYQ0xPVUQudGVzdCh1cmwpO1xuICB9LFxuICB2aWR5YXJkOiBmdW5jdGlvbiB2aWR5YXJkKHVybCkge1xuICAgIHJldHVybiBNQVRDSF9VUkxfVklEWUFSRC50ZXN0KHVybCk7XG4gIH0sXG4gIGthbHR1cmE6IGZ1bmN0aW9uIGthbHR1cmEodXJsKSB7XG4gICAgcmV0dXJuIE1BVENIX1VSTF9LQUxUVVJBLnRlc3QodXJsKTtcbiAgfSxcbiAgZmlsZTogY2FuUGxheUZpbGVcbn07XG5leHBvcnRzLmNhblBsYXkgPSBjYW5QbGF5OyIsICJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuXG52YXIgX3BhdHRlcm5zID0gcmVxdWlyZShcIi4uL3BhdHRlcm5zXCIpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTsgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyByZXR1cm4gY2FjaGU7IH07IHJldHVybiBjYWNoZTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBcImRlZmF1bHRcIjogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqW1wiZGVmYXVsdFwiXSA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxudmFyIFNES19VUkwgPSAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7XG52YXIgU0RLX0dMT0JBTCA9ICdZVCc7XG52YXIgU0RLX0dMT0JBTF9SRUFEWSA9ICdvbllvdVR1YmVJZnJhbWVBUElSZWFkeSc7XG52YXIgTUFUQ0hfUExBWUxJU1QgPSAvWz8mXSg/Omxpc3R8Y2hhbm5lbCk9KFthLXpBLVowLTlfLV0rKS87XG52YXIgTUFUQ0hfVVNFUl9VUExPQURTID0gL3VzZXJcXC8oW2EtekEtWjAtOV8tXSspXFwvPy87XG52YXIgTUFUQ0hfTk9DT09LSUUgPSAveW91dHViZS1ub2Nvb2tpZVxcLmNvbS87XG52YXIgTk9DT09LSUVfSE9TVCA9ICdodHRwczovL3d3dy55b3V0dWJlLW5vY29va2llLmNvbSc7XG5cbnZhciBZb3VUdWJlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhZb3VUdWJlLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFlvdVR1YmUpO1xuXG4gIGZ1bmN0aW9uIFlvdVR1YmUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFlvdVR1YmUpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwYXJzZVBsYXlsaXN0XCIsIGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgIGlmICh1cmwgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpc3RUeXBlOiAncGxheWxpc3QnLFxuICAgICAgICAgIHBsYXlsaXN0OiB1cmwubWFwKF90aGlzLmdldElEKS5qb2luKCcsJylcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKE1BVENIX1BMQVlMSVNULnRlc3QodXJsKSkge1xuICAgICAgICB2YXIgX3VybCRtYXRjaCA9IHVybC5tYXRjaChNQVRDSF9QTEFZTElTVCksXG4gICAgICAgICAgICBfdXJsJG1hdGNoMiA9IF9zbGljZWRUb0FycmF5KF91cmwkbWF0Y2gsIDIpLFxuICAgICAgICAgICAgcGxheWxpc3RJZCA9IF91cmwkbWF0Y2gyWzFdO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGlzdFR5cGU6ICdwbGF5bGlzdCcsXG4gICAgICAgICAgbGlzdDogcGxheWxpc3RJZC5yZXBsYWNlKC9eVUMvLCAnVVUnKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoTUFUQ0hfVVNFUl9VUExPQURTLnRlc3QodXJsKSkge1xuICAgICAgICB2YXIgX3VybCRtYXRjaDMgPSB1cmwubWF0Y2goTUFUQ0hfVVNFUl9VUExPQURTKSxcbiAgICAgICAgICAgIF91cmwkbWF0Y2g0ID0gX3NsaWNlZFRvQXJyYXkoX3VybCRtYXRjaDMsIDIpLFxuICAgICAgICAgICAgdXNlcm5hbWUgPSBfdXJsJG1hdGNoNFsxXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpc3RUeXBlOiAndXNlcl91cGxvYWRzJyxcbiAgICAgICAgICBsaXN0OiB1c2VybmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge307XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25TdGF0ZUNoYW5nZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uUGxheSA9IF90aGlzJHByb3BzLm9uUGxheSxcbiAgICAgICAgICBvblBhdXNlID0gX3RoaXMkcHJvcHMub25QYXVzZSxcbiAgICAgICAgICBvbkJ1ZmZlciA9IF90aGlzJHByb3BzLm9uQnVmZmVyLFxuICAgICAgICAgIG9uQnVmZmVyRW5kID0gX3RoaXMkcHJvcHMub25CdWZmZXJFbmQsXG4gICAgICAgICAgb25FbmRlZCA9IF90aGlzJHByb3BzLm9uRW5kZWQsXG4gICAgICAgICAgb25SZWFkeSA9IF90aGlzJHByb3BzLm9uUmVhZHksXG4gICAgICAgICAgbG9vcCA9IF90aGlzJHByb3BzLmxvb3AsXG4gICAgICAgICAgX3RoaXMkcHJvcHMkY29uZmlnID0gX3RoaXMkcHJvcHMuY29uZmlnLFxuICAgICAgICAgIHBsYXllclZhcnMgPSBfdGhpcyRwcm9wcyRjb25maWcucGxheWVyVmFycyxcbiAgICAgICAgICBvblVuc3RhcnRlZCA9IF90aGlzJHByb3BzJGNvbmZpZy5vblVuc3RhcnRlZDtcbiAgICAgIHZhciBfd2luZG93JFNES19HTE9CQUwkUGwgPSB3aW5kb3dbU0RLX0dMT0JBTF0uUGxheWVyU3RhdGUsXG4gICAgICAgICAgVU5TVEFSVEVEID0gX3dpbmRvdyRTREtfR0xPQkFMJFBsLlVOU1RBUlRFRCxcbiAgICAgICAgICBQTEFZSU5HID0gX3dpbmRvdyRTREtfR0xPQkFMJFBsLlBMQVlJTkcsXG4gICAgICAgICAgUEFVU0VEID0gX3dpbmRvdyRTREtfR0xPQkFMJFBsLlBBVVNFRCxcbiAgICAgICAgICBCVUZGRVJJTkcgPSBfd2luZG93JFNES19HTE9CQUwkUGwuQlVGRkVSSU5HLFxuICAgICAgICAgIEVOREVEID0gX3dpbmRvdyRTREtfR0xPQkFMJFBsLkVOREVELFxuICAgICAgICAgIENVRUQgPSBfd2luZG93JFNES19HTE9CQUwkUGwuQ1VFRDtcbiAgICAgIGlmIChkYXRhID09PSBVTlNUQVJURUQpIG9uVW5zdGFydGVkKCk7XG5cbiAgICAgIGlmIChkYXRhID09PSBQTEFZSU5HKSB7XG4gICAgICAgIG9uUGxheSgpO1xuICAgICAgICBvbkJ1ZmZlckVuZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSA9PT0gUEFVU0VEKSBvblBhdXNlKCk7XG4gICAgICBpZiAoZGF0YSA9PT0gQlVGRkVSSU5HKSBvbkJ1ZmZlcigpO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gRU5ERUQpIHtcbiAgICAgICAgdmFyIGlzUGxheWxpc3QgPSAhIV90aGlzLmNhbGxQbGF5ZXIoJ2dldFBsYXlsaXN0Jyk7IC8vIE9ubHkgbG9vcCBtYW51YWxseSBpZiBub3QgcGxheWluZyBhIHBsYXlsaXN0XG5cbiAgICAgICAgaWYgKGxvb3AgJiYgIWlzUGxheWxpc3QpIHtcbiAgICAgICAgICBpZiAocGxheWVyVmFycy5zdGFydCkge1xuICAgICAgICAgICAgX3RoaXMuc2Vla1RvKHBsYXllclZhcnMuc3RhcnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5wbGF5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb25FbmRlZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSA9PT0gQ1VFRCkgb25SZWFkeSgpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm11dGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuY2FsbFBsYXllcignbXV0ZScpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVubXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCd1bk11dGUnKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJyZWZcIiwgZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgICAgX3RoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFlvdVR1YmUsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0SURcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SUQodXJsKSB7XG4gICAgICBpZiAoIXVybCB8fCB1cmwgaW5zdGFuY2VvZiBBcnJheSB8fCBNQVRDSF9QTEFZTElTVC50ZXN0KHVybCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cmwubWF0Y2goX3BhdHRlcm5zLk1BVENIX1VSTF9ZT1VUVUJFKVsxXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCwgaXNSZWFkeSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHBsYXlpbmcgPSBfdGhpcyRwcm9wczIucGxheWluZyxcbiAgICAgICAgICBtdXRlZCA9IF90aGlzJHByb3BzMi5tdXRlZCxcbiAgICAgICAgICBwbGF5c2lubGluZSA9IF90aGlzJHByb3BzMi5wbGF5c2lubGluZSxcbiAgICAgICAgICBjb250cm9scyA9IF90aGlzJHByb3BzMi5jb250cm9scyxcbiAgICAgICAgICBsb29wID0gX3RoaXMkcHJvcHMyLmxvb3AsXG4gICAgICAgICAgY29uZmlnID0gX3RoaXMkcHJvcHMyLmNvbmZpZyxcbiAgICAgICAgICBfb25FcnJvciA9IF90aGlzJHByb3BzMi5vbkVycm9yO1xuICAgICAgdmFyIHBsYXllclZhcnMgPSBjb25maWcucGxheWVyVmFycyxcbiAgICAgICAgICBlbWJlZE9wdGlvbnMgPSBjb25maWcuZW1iZWRPcHRpb25zO1xuICAgICAgdmFyIGlkID0gdGhpcy5nZXRJRCh1cmwpO1xuXG4gICAgICBpZiAoaXNSZWFkeSkge1xuICAgICAgICBpZiAoTUFUQ0hfUExBWUxJU1QudGVzdCh1cmwpIHx8IE1BVENIX1VTRVJfVVBMT0FEUy50ZXN0KHVybCkgfHwgdXJsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICB0aGlzLnBsYXllci5sb2FkUGxheWxpc3QodGhpcy5wYXJzZVBsYXlsaXN0KHVybCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxheWVyLmN1ZVZpZGVvQnlJZCh7XG4gICAgICAgICAgdmlkZW9JZDogaWQsXG4gICAgICAgICAgc3RhcnRTZWNvbmRzOiAoMCwgX3V0aWxzLnBhcnNlU3RhcnRUaW1lKSh1cmwpIHx8IHBsYXllclZhcnMuc3RhcnQsXG4gICAgICAgICAgZW5kU2Vjb25kczogKDAsIF91dGlscy5wYXJzZUVuZFRpbWUpKHVybCkgfHwgcGxheWVyVmFycy5lbmRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgKDAsIF91dGlscy5nZXRTREspKFNES19VUkwsIFNES19HTE9CQUwsIFNES19HTE9CQUxfUkVBRFksIGZ1bmN0aW9uIChZVCkge1xuICAgICAgICByZXR1cm4gWVQubG9hZGVkO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoWVQpIHtcbiAgICAgICAgaWYgKCFfdGhpczIuY29udGFpbmVyKSByZXR1cm47XG4gICAgICAgIF90aGlzMi5wbGF5ZXIgPSBuZXcgWVQuUGxheWVyKF90aGlzMi5jb250YWluZXIsIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgdmlkZW9JZDogaWQsXG4gICAgICAgICAgcGxheWVyVmFyczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICAgIGF1dG9wbGF5OiBwbGF5aW5nID8gMSA6IDAsXG4gICAgICAgICAgICBtdXRlOiBtdXRlZCA/IDEgOiAwLFxuICAgICAgICAgICAgY29udHJvbHM6IGNvbnRyb2xzID8gMSA6IDAsXG4gICAgICAgICAgICBzdGFydDogKDAsIF91dGlscy5wYXJzZVN0YXJ0VGltZSkodXJsKSxcbiAgICAgICAgICAgIGVuZDogKDAsIF91dGlscy5wYXJzZUVuZFRpbWUpKHVybCksXG4gICAgICAgICAgICBvcmlnaW46IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sXG4gICAgICAgICAgICBwbGF5c2lubGluZTogcGxheXNpbmxpbmUgPyAxIDogMFxuICAgICAgICAgIH0sIF90aGlzMi5wYXJzZVBsYXlsaXN0KHVybCkpLCBwbGF5ZXJWYXJzKSxcbiAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgIG9uUmVhZHk6IGZ1bmN0aW9uIG9uUmVhZHkoKSB7XG4gICAgICAgICAgICAgIGlmIChsb29wKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLnBsYXllci5zZXRMb29wKHRydWUpOyAvLyBFbmFibGUgcGxheWxpc3QgbG9vcGluZ1xuXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfdGhpczIucHJvcHMub25SZWFkeSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uUGxheWJhY2tSYXRlQ2hhbmdlOiBmdW5jdGlvbiBvblBsYXliYWNrUmF0ZUNoYW5nZShldmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnByb3BzLm9uUGxheWJhY2tSYXRlQ2hhbmdlKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uU3RhdGVDaGFuZ2U6IF90aGlzMi5vblN0YXRlQ2hhbmdlLFxuICAgICAgICAgICAgb25FcnJvcjogZnVuY3Rpb24gb25FcnJvcihldmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gX29uRXJyb3IoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBob3N0OiBNQVRDSF9OT0NPT0tJRS50ZXN0KHVybCkgPyBOT0NPT0tJRV9IT1NUIDogdW5kZWZpbmVkXG4gICAgICAgIH0sIGVtYmVkT3B0aW9ucykpO1xuICAgICAgfSwgX29uRXJyb3IpO1xuXG4gICAgICBpZiAoZW1iZWRPcHRpb25zLmV2ZW50cykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VzaW5nIGBlbWJlZE9wdGlvbnMuZXZlbnRzYCB3aWxsIGxpa2VseSBicmVhayB0aGluZ3MuIFVzZSBSZWFjdFBsYXllclx1MjAxOXMgY2FsbGJhY2sgcHJvcHMgaW5zdGVhZCwgZWcgb25SZWFkeSwgb25QbGF5LCBvblBhdXNlJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheVZpZGVvJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwYXVzZVZpZGVvJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLmNhbGxQbGF5ZXIoJ2dldElmcmFtZScpKSkgcmV0dXJuO1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzdG9wVmlkZW8nKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2Vla1RvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlZWtUbyhhbW91bnQpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2Vla1RvJywgYW1vdW50KTtcblxuICAgICAgaWYgKCF0aGlzLnByb3BzLnBsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGZyYWN0aW9uKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldFZvbHVtZScsIGZyYWN0aW9uICogMTAwKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UGxheWJhY2tSYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBsYXliYWNrUmF0ZShyYXRlKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldFBsYXliYWNrUmF0ZScsIHJhdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRMb29wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldExvb3AobG9vcCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRMb29wJywgbG9vcCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbFBsYXllcignZ2V0RHVyYXRpb24nKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsUGxheWVyKCdnZXRDdXJyZW50VGltZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsUGxheWVyKCdnZXRWaWRlb0xvYWRlZEZyYWN0aW9uJykgKiB0aGlzLmdldER1cmF0aW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgZGlzcGxheSA9IHRoaXMucHJvcHMuZGlzcGxheTtcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgIGRpc3BsYXk6IGRpc3BsYXlcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5yZWZcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gWW91VHViZTtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gWW91VHViZTtcblxuX2RlZmluZVByb3BlcnR5KFlvdVR1YmUsIFwiZGlzcGxheU5hbWVcIiwgJ1lvdVR1YmUnKTtcblxuX2RlZmluZVByb3BlcnR5KFlvdVR1YmUsIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS55b3V0dWJlKTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcblxudmFyIF9wYXR0ZXJucyA9IHJlcXVpcmUoXCIuLi9wYXR0ZXJuc1wiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBTREtfVVJMID0gJ2h0dHBzOi8vdy5zb3VuZGNsb3VkLmNvbS9wbGF5ZXIvYXBpLmpzJztcbnZhciBTREtfR0xPQkFMID0gJ1NDJztcblxudmFyIFNvdW5kQ2xvdWQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFNvdW5kQ2xvdWQsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU291bmRDbG91ZCk7XG5cbiAgZnVuY3Rpb24gU291bmRDbG91ZCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU291bmRDbG91ZCk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImNhbGxQbGF5ZXJcIiwgX3V0aWxzLmNhbGxQbGF5ZXIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImR1cmF0aW9uXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImN1cnJlbnRUaW1lXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImZyYWN0aW9uTG9hZGVkXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm11dGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuc2V0Vm9sdW1lKDApO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVubXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMudm9sdW1lICE9PSBudWxsKSB7XG4gICAgICAgIF90aGlzLnNldFZvbHVtZShfdGhpcy5wcm9wcy52b2x1bWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlZlwiLCBmdW5jdGlvbiAoaWZyYW1lKSB7XG4gICAgICBfdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU291bmRDbG91ZCwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnByb3BzLm9uTW91bnQgJiYgdGhpcy5wcm9wcy5vbk1vdW50KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsLCBpc1JlYWR5KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgKDAsIF91dGlscy5nZXRTREspKFNES19VUkwsIFNES19HTE9CQUwpLnRoZW4oZnVuY3Rpb24gKFNDKSB7XG4gICAgICAgIGlmICghX3RoaXMyLmlmcmFtZSkgcmV0dXJuO1xuICAgICAgICB2YXIgX1NDJFdpZGdldCRFdmVudHMgPSBTQy5XaWRnZXQuRXZlbnRzLFxuICAgICAgICAgICAgUExBWSA9IF9TQyRXaWRnZXQkRXZlbnRzLlBMQVksXG4gICAgICAgICAgICBQTEFZX1BST0dSRVNTID0gX1NDJFdpZGdldCRFdmVudHMuUExBWV9QUk9HUkVTUyxcbiAgICAgICAgICAgIFBBVVNFID0gX1NDJFdpZGdldCRFdmVudHMuUEFVU0UsXG4gICAgICAgICAgICBGSU5JU0ggPSBfU0MkV2lkZ2V0JEV2ZW50cy5GSU5JU0gsXG4gICAgICAgICAgICBFUlJPUiA9IF9TQyRXaWRnZXQkRXZlbnRzLkVSUk9SO1xuXG4gICAgICAgIGlmICghaXNSZWFkeSkge1xuICAgICAgICAgIF90aGlzMi5wbGF5ZXIgPSBTQy5XaWRnZXQoX3RoaXMyLmlmcmFtZSk7XG5cbiAgICAgICAgICBfdGhpczIucGxheWVyLmJpbmQoUExBWSwgX3RoaXMyLnByb3BzLm9uUGxheSk7XG5cbiAgICAgICAgICBfdGhpczIucGxheWVyLmJpbmQoUEFVU0UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZW1haW5pbmcgPSBfdGhpczIuZHVyYXRpb24gLSBfdGhpczIuY3VycmVudFRpbWU7XG5cbiAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAwLjA1KSB7XG4gICAgICAgICAgICAgIC8vIFByZXZlbnQgb25QYXVzZSBmaXJpbmcgcmlnaHQgYmVmb3JlIG9uRW5kZWRcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpczIucHJvcHMub25QYXVzZSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMyLnBsYXllci5iaW5kKFBMQVlfUFJPR1JFU1MsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBfdGhpczIuY3VycmVudFRpbWUgPSBlLmN1cnJlbnRQb3NpdGlvbiAvIDEwMDA7XG4gICAgICAgICAgICBfdGhpczIuZnJhY3Rpb25Mb2FkZWQgPSBlLmxvYWRlZFByb2dyZXNzO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMyLnBsYXllci5iaW5kKEZJTklTSCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5wcm9wcy5vbkVuZGVkKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBfdGhpczIucGxheWVyLmJpbmQoRVJST1IsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyLnByb3BzLm9uRXJyb3IoZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczIucGxheWVyLmxvYWQodXJsLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMi5wcm9wcy5jb25maWcub3B0aW9ucyksIHt9LCB7XG4gICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgICAgICAgX3RoaXMyLnBsYXllci5nZXREdXJhdGlvbihmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgX3RoaXMyLmR1cmF0aW9uID0gZHVyYXRpb24gLyAxMDAwO1xuXG4gICAgICAgICAgICAgIF90aGlzMi5wcm9wcy5vblJlYWR5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwbGF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BsYXknKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BhdXNlJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHsvLyBOb3RoaW5nIHRvIGRvXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlZWtUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZWVrVG8oc2Vjb25kcykge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZWVrVG8nLCBzZWNvbmRzICogMTAwMCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFZvbHVtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWb2x1bWUoZnJhY3Rpb24pIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2V0Vm9sdW1lJywgZnJhY3Rpb24gKiAxMDApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VGltZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcmFjdGlvbkxvYWRlZCAqIHRoaXMuZHVyYXRpb247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgZGlzcGxheSA9IHRoaXMucHJvcHMuZGlzcGxheTtcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgIGRpc3BsYXk6IGRpc3BsYXlcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImlmcmFtZVwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHNyYzogXCJodHRwczovL3cuc291bmRjbG91ZC5jb20vcGxheWVyLz91cmw9XCIuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLnByb3BzLnVybCkpLFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGZyYW1lQm9yZGVyOiAwLFxuICAgICAgICBhbGxvdzogXCJhdXRvcGxheVwiXG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU291bmRDbG91ZDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gU291bmRDbG91ZDtcblxuX2RlZmluZVByb3BlcnR5KFNvdW5kQ2xvdWQsIFwiZGlzcGxheU5hbWVcIiwgJ1NvdW5kQ2xvdWQnKTtcblxuX2RlZmluZVByb3BlcnR5KFNvdW5kQ2xvdWQsIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS5zb3VuZGNsb3VkKTtcblxuX2RlZmluZVByb3BlcnR5KFNvdW5kQ2xvdWQsIFwibG9vcE9uRW5kZWRcIiwgdHJ1ZSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgU0RLX1VSTCA9ICdodHRwczovL3BsYXllci52aW1lby5jb20vYXBpL3BsYXllci5qcyc7XG52YXIgU0RLX0dMT0JBTCA9ICdWaW1lbyc7XG5cbnZhciBWaW1lbyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVmltZW8sIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoVmltZW8pO1xuXG4gIGZ1bmN0aW9uIFZpbWVvKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaW1lbyk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImNhbGxQbGF5ZXJcIiwgX3V0aWxzLmNhbGxQbGF5ZXIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImR1cmF0aW9uXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImN1cnJlbnRUaW1lXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInNlY29uZHNMb2FkZWRcIiwgbnVsbCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRWb2x1bWUoMCk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy52b2x1bWUgIT09IG51bGwpIHtcbiAgICAgICAgX3RoaXMuc2V0Vm9sdW1lKF90aGlzLnByb3BzLnZvbHVtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicmVmXCIsIGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICAgIF90aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB9KTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaW1lbywgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnByb3BzLm9uTW91bnQgJiYgdGhpcy5wcm9wcy5vbk1vdW50KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5kdXJhdGlvbiA9IG51bGw7XG4gICAgICAoMCwgX3V0aWxzLmdldFNESykoU0RLX1VSTCwgU0RLX0dMT0JBTCkudGhlbihmdW5jdGlvbiAoVmltZW8pIHtcbiAgICAgICAgaWYgKCFfdGhpczIuY29udGFpbmVyKSByZXR1cm47XG4gICAgICAgIHZhciBfdGhpczIkcHJvcHMkY29uZmlnID0gX3RoaXMyLnByb3BzLmNvbmZpZyxcbiAgICAgICAgICAgIHBsYXllck9wdGlvbnMgPSBfdGhpczIkcHJvcHMkY29uZmlnLnBsYXllck9wdGlvbnMsXG4gICAgICAgICAgICB0aXRsZSA9IF90aGlzMiRwcm9wcyRjb25maWcudGl0bGU7XG4gICAgICAgIF90aGlzMi5wbGF5ZXIgPSBuZXcgVmltZW8uUGxheWVyKF90aGlzMi5jb250YWluZXIsIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgIGF1dG9wbGF5OiBfdGhpczIucHJvcHMucGxheWluZyxcbiAgICAgICAgICBtdXRlZDogX3RoaXMyLnByb3BzLm11dGVkLFxuICAgICAgICAgIGxvb3A6IF90aGlzMi5wcm9wcy5sb29wLFxuICAgICAgICAgIHBsYXlzaW5saW5lOiBfdGhpczIucHJvcHMucGxheXNpbmxpbmUsXG4gICAgICAgICAgY29udHJvbHM6IF90aGlzMi5wcm9wcy5jb250cm9sc1xuICAgICAgICB9LCBwbGF5ZXJPcHRpb25zKSk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBpZnJhbWUgPSBfdGhpczIuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO1xuXG4gICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG5cbiAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgIGlmcmFtZS50aXRsZSA9IHRpdGxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlbXCJjYXRjaFwiXShfdGhpczIucHJvcHMub25FcnJvcik7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5vbignbG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMi5wcm9wcy5vblJlYWR5KCk7XG5cbiAgICAgICAgICBfdGhpczIucmVmcmVzaER1cmF0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3BsYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLnByb3BzLm9uUGxheSgpO1xuXG4gICAgICAgICAgX3RoaXMyLnJlZnJlc2hEdXJhdGlvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdwYXVzZScsIF90aGlzMi5wcm9wcy5vblBhdXNlKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdzZWVrZWQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIucHJvcHMub25TZWVrKGUuc2Vjb25kcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ2VuZGVkJywgX3RoaXMyLnByb3BzLm9uRW5kZWQpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ2Vycm9yJywgX3RoaXMyLnByb3BzLm9uRXJyb3IpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3RpbWV1cGRhdGUnLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBzZWNvbmRzID0gX3JlZi5zZWNvbmRzO1xuICAgICAgICAgIF90aGlzMi5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3Byb2dyZXNzJywgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIHNlY29uZHMgPSBfcmVmMi5zZWNvbmRzO1xuICAgICAgICAgIF90aGlzMi5zZWNvbmRzTG9hZGVkID0gc2Vjb25kcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5vbignYnVmZmVyc3RhcnQnLCBfdGhpczIucHJvcHMub25CdWZmZXIpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ2J1ZmZlcmVuZCcsIF90aGlzMi5wcm9wcy5vbkJ1ZmZlckVuZCk7XG4gICAgICB9LCB0aGlzLnByb3BzLm9uRXJyb3IpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWZyZXNoRHVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVmcmVzaER1cmF0aW9uKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHRoaXMucGxheWVyLmdldER1cmF0aW9uKCkudGhlbihmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgX3RoaXMzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmNhbGxQbGF5ZXIoJ3BsYXknKTtcblxuICAgICAgaWYgKHByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZVtcImNhdGNoXCJdKHRoaXMucHJvcHMub25FcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwYXVzZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3VubG9hZCcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKHNlY29uZHMpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2V0Q3VycmVudFRpbWUnLCBzZWNvbmRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vm9sdW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZvbHVtZShmcmFjdGlvbikge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRWb2x1bWUnLCBmcmFjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldExvb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TG9vcChsb29wKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldExvb3AnLCBsb29wKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UGxheWJhY2tSYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBsYXliYWNrUmF0ZShyYXRlKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldFBsYXliYWNrUmF0ZScsIHJhdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VGltZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWNvbmRzTG9hZGVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIGRpc3BsYXkgPSB0aGlzLnByb3BzLmRpc3BsYXk7XG4gICAgICB2YXIgc3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgIGRpc3BsYXk6IGRpc3BsYXlcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGtleTogdGhpcy5wcm9wcy51cmwsXG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFZpbWVvO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBWaW1lbztcblxuX2RlZmluZVByb3BlcnR5KFZpbWVvLCBcImRpc3BsYXlOYW1lXCIsICdWaW1lbycpO1xuXG5fZGVmaW5lUHJvcGVydHkoVmltZW8sIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS52aW1lbyk7XG5cbl9kZWZpbmVQcm9wZXJ0eShWaW1lbywgXCJmb3JjZUxvYWRcIiwgdHJ1ZSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBTREtfVVJMID0gJ2h0dHBzOi8vY29ubmVjdC5mYWNlYm9vay5uZXQvZW5fVVMvc2RrLmpzJztcbnZhciBTREtfR0xPQkFMID0gJ0ZCJztcbnZhciBTREtfR0xPQkFMX1JFQURZID0gJ2ZiQXN5bmNJbml0JztcbnZhciBQTEFZRVJfSURfUFJFRklYID0gJ2ZhY2Vib29rLXBsYXllci0nO1xuXG52YXIgRmFjZWJvb2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEZhY2Vib29rLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEZhY2Vib29rKTtcblxuICBmdW5jdGlvbiBGYWNlYm9vaygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmFjZWJvb2spO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwbGF5ZXJJRFwiLCBfdGhpcy5wcm9wcy5jb25maWcucGxheWVySWQgfHwgXCJcIi5jb25jYXQoUExBWUVSX0lEX1BSRUZJWCkuY29uY2F0KCgwLCBfdXRpbHMucmFuZG9tU3RyaW5nKSgpKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCdtdXRlJyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNhbGxQbGF5ZXIoJ3VubXV0ZScpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZhY2Vib29rLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMucHJvcHMub25Nb3VudCAmJiB0aGlzLnByb3BzLm9uTW91bnQodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZCh1cmwsIGlzUmVhZHkpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAoaXNSZWFkeSkge1xuICAgICAgICAoMCwgX3V0aWxzLmdldFNESykoU0RLX1VSTCwgU0RLX0dMT0JBTCwgU0RLX0dMT0JBTF9SRUFEWSkudGhlbihmdW5jdGlvbiAoRkIpIHtcbiAgICAgICAgICByZXR1cm4gRkIuWEZCTUwucGFyc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgKDAsIF91dGlscy5nZXRTREspKFNES19VUkwsIFNES19HTE9CQUwsIFNES19HTE9CQUxfUkVBRFkpLnRoZW4oZnVuY3Rpb24gKEZCKSB7XG4gICAgICAgIEZCLmluaXQoe1xuICAgICAgICAgIGFwcElkOiBfdGhpczIucHJvcHMuY29uZmlnLmFwcElkLFxuICAgICAgICAgIHhmYm1sOiB0cnVlLFxuICAgICAgICAgIHZlcnNpb246IF90aGlzMi5wcm9wcy5jb25maWcudmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgRkIuRXZlbnQuc3Vic2NyaWJlKCd4ZmJtbC5yZW5kZXInLCBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAgICAgLy8gSGVyZSB3ZSBrbm93IHRoZSBTREsgaGFzIGxvYWRlZCwgZXZlbiBpZiBvblJlYWR5L29uUGxheVxuICAgICAgICAgIC8vIGlzIG5vdCBjYWxsZWQgZHVlIHRvIGEgdmlkZW8gdGhhdCBjYW5ub3QgYmUgZW1iZWRkZWRcbiAgICAgICAgICBfdGhpczIucHJvcHMub25Mb2FkZWQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEZCLkV2ZW50LnN1YnNjcmliZSgneGZibWwucmVhZHknLCBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAgICAgaWYgKG1zZy50eXBlID09PSAndmlkZW8nICYmIG1zZy5pZCA9PT0gX3RoaXMyLnBsYXllcklEKSB7XG4gICAgICAgICAgICBfdGhpczIucGxheWVyID0gbXNnLmluc3RhbmNlO1xuXG4gICAgICAgICAgICBfdGhpczIucGxheWVyLnN1YnNjcmliZSgnc3RhcnRlZFBsYXlpbmcnLCBfdGhpczIucHJvcHMub25QbGF5KTtcblxuICAgICAgICAgICAgX3RoaXMyLnBsYXllci5zdWJzY3JpYmUoJ3BhdXNlZCcsIF90aGlzMi5wcm9wcy5vblBhdXNlKTtcblxuICAgICAgICAgICAgX3RoaXMyLnBsYXllci5zdWJzY3JpYmUoJ2ZpbmlzaGVkUGxheWluZycsIF90aGlzMi5wcm9wcy5vbkVuZGVkKTtcblxuICAgICAgICAgICAgX3RoaXMyLnBsYXllci5zdWJzY3JpYmUoJ3N0YXJ0ZWRCdWZmZXJpbmcnLCBfdGhpczIucHJvcHMub25CdWZmZXIpO1xuXG4gICAgICAgICAgICBfdGhpczIucGxheWVyLnN1YnNjcmliZSgnZmluaXNoZWRCdWZmZXJpbmcnLCBfdGhpczIucHJvcHMub25CdWZmZXJFbmQpO1xuXG4gICAgICAgICAgICBfdGhpczIucGxheWVyLnN1YnNjcmliZSgnZXJyb3InLCBfdGhpczIucHJvcHMub25FcnJvcik7XG5cbiAgICAgICAgICAgIGlmIChfdGhpczIucHJvcHMubXV0ZWQpIHtcbiAgICAgICAgICAgICAgX3RoaXMyLmNhbGxQbGF5ZXIoJ211dGUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIF90aGlzMi5jYWxsUGxheWVyKCd1bm11dGUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3RoaXMyLnByb3BzLm9uUmVhZHkoKTsgLy8gRm9yIHNvbWUgcmVhc29uIEZhY2Vib29rIGhhdmUgYWRkZWQgYHZpc2liaWxpdHk6IGhpZGRlbmBcbiAgICAgICAgICAgIC8vIHRvIHRoZSBpZnJhbWUgd2hlbiBhdXRvcGxheSBmYWlscywgc28gaGVyZSB3ZSBzZXQgaXQgYmFja1xuXG5cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKF90aGlzMi5wbGF5ZXJJRCkucXVlcnlTZWxlY3RvcignaWZyYW1lJykuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGF1c2UnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkgey8vIE5vdGhpbmcgdG8gZG9cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2Vla1RvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlZWtUbyhzZWNvbmRzKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NlZWsnLCBzZWNvbmRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vm9sdW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZvbHVtZShmcmFjdGlvbikge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRWb2x1bWUnLCBmcmFjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbFBsYXllcignZ2V0RHVyYXRpb24nKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsUGxheWVyKCdnZXRDdXJyZW50UG9zaXRpb24nKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2Vjb25kc0xvYWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTZWNvbmRzTG9hZGVkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMucHJvcHMuY29uZmlnLmF0dHJpYnV0ZXM7XG4gICAgICB2YXIgc3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGlkOiB0aGlzLnBsYXllcklELFxuICAgICAgICBjbGFzc05hbWU6IFwiZmItdmlkZW9cIixcbiAgICAgICAgXCJkYXRhLWhyZWZcIjogdGhpcy5wcm9wcy51cmwsXG4gICAgICAgIFwiZGF0YS1hdXRvcGxheVwiOiB0aGlzLnByb3BzLnBsYXlpbmcgPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgICBcImRhdGEtYWxsb3dmdWxsc2NyZWVuXCI6IFwidHJ1ZVwiLFxuICAgICAgICBcImRhdGEtY29udHJvbHNcIjogdGhpcy5wcm9wcy5jb250cm9scyA/ICd0cnVlJyA6ICdmYWxzZSdcbiAgICAgIH0sIGF0dHJpYnV0ZXMpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRmFjZWJvb2s7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEZhY2Vib29rO1xuXG5fZGVmaW5lUHJvcGVydHkoRmFjZWJvb2ssIFwiZGlzcGxheU5hbWVcIiwgJ0ZhY2Vib29rJyk7XG5cbl9kZWZpbmVQcm9wZXJ0eShGYWNlYm9vaywgXCJjYW5QbGF5XCIsIF9wYXR0ZXJucy5jYW5QbGF5LmZhY2Vib29rKTtcblxuX2RlZmluZVByb3BlcnR5KEZhY2Vib29rLCBcImxvb3BPbkVuZGVkXCIsIHRydWUpOyIsICJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuXG52YXIgX3BhdHRlcm5zID0gcmVxdWlyZShcIi4uL3BhdHRlcm5zXCIpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTsgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyByZXR1cm4gY2FjaGU7IH07IHJldHVybiBjYWNoZTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBcImRlZmF1bHRcIjogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqW1wiZGVmYXVsdFwiXSA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgU0RLX1VSTCA9ICdodHRwczovL2Nkbi5lbWJlZC5seS9wbGF5ZXItMC4xLjAubWluLmpzJztcbnZhciBTREtfR0xPQkFMID0gJ3BsYXllcmpzJztcblxudmFyIFN0cmVhbWFibGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFN0cmVhbWFibGUsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU3RyZWFtYWJsZSk7XG5cbiAgZnVuY3Rpb24gU3RyZWFtYWJsZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RyZWFtYWJsZSk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImNhbGxQbGF5ZXJcIiwgX3V0aWxzLmNhbGxQbGF5ZXIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImR1cmF0aW9uXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImN1cnJlbnRUaW1lXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInNlY29uZHNMb2FkZWRcIiwgbnVsbCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCdtdXRlJyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNhbGxQbGF5ZXIoJ3VubXV0ZScpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlZlwiLCBmdW5jdGlvbiAoaWZyYW1lKSB7XG4gICAgICBfdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU3RyZWFtYWJsZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnByb3BzLm9uTW91bnQgJiYgdGhpcy5wcm9wcy5vbk1vdW50KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgKDAsIF91dGlscy5nZXRTREspKFNES19VUkwsIFNES19HTE9CQUwpLnRoZW4oZnVuY3Rpb24gKHBsYXllcmpzKSB7XG4gICAgICAgIGlmICghX3RoaXMyLmlmcmFtZSkgcmV0dXJuO1xuICAgICAgICBfdGhpczIucGxheWVyID0gbmV3IHBsYXllcmpzLlBsYXllcihfdGhpczIuaWZyYW1lKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLnNldExvb3AoX3RoaXMyLnByb3BzLmxvb3ApO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3JlYWR5JywgX3RoaXMyLnByb3BzLm9uUmVhZHkpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3BsYXknLCBfdGhpczIucHJvcHMub25QbGF5KTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdwYXVzZScsIF90aGlzMi5wcm9wcy5vblBhdXNlKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdzZWVrZWQnLCBfdGhpczIucHJvcHMub25TZWVrKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdlbmRlZCcsIF90aGlzMi5wcm9wcy5vbkVuZGVkKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdlcnJvcicsIF90aGlzMi5wcm9wcy5vbkVycm9yKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCd0aW1ldXBkYXRlJywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICB2YXIgZHVyYXRpb24gPSBfcmVmLmR1cmF0aW9uLFxuICAgICAgICAgICAgICBzZWNvbmRzID0gX3JlZi5zZWNvbmRzO1xuICAgICAgICAgIF90aGlzMi5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgICAgICAgIF90aGlzMi5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ2J1ZmZlcmVkJywgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIHBlcmNlbnQgPSBfcmVmMi5wZXJjZW50O1xuXG4gICAgICAgICAgaWYgKF90aGlzMi5kdXJhdGlvbikge1xuICAgICAgICAgICAgX3RoaXMyLnNlY29uZHNMb2FkZWQgPSBfdGhpczIuZHVyYXRpb24gKiBwZXJjZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF90aGlzMi5wcm9wcy5tdXRlZCkge1xuICAgICAgICAgIF90aGlzMi5wbGF5ZXIubXV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzLnByb3BzLm9uRXJyb3IpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwbGF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BsYXknKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BhdXNlJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHsvLyBOb3RoaW5nIHRvIGRvXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlZWtUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZWVrVG8oc2Vjb25kcykge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRDdXJyZW50VGltZScsIHNlY29uZHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGZyYWN0aW9uKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldFZvbHVtZScsIGZyYWN0aW9uICogMTAwKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0TG9vcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRMb29wKGxvb3ApIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2V0TG9vcCcsIGxvb3ApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VGltZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWNvbmRzTG9hZGVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIGlkID0gdGhpcy5wcm9wcy51cmwubWF0Y2goX3BhdHRlcm5zLk1BVENIX1VSTF9TVFJFQU1BQkxFKVsxXTtcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImlmcmFtZVwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHNyYzogXCJodHRwczovL3N0cmVhbWFibGUuY29tL28vXCIuY29uY2F0KGlkKSxcbiAgICAgICAgZnJhbWVCb3JkZXI6IFwiMFwiLFxuICAgICAgICBzY3JvbGxpbmc6IFwibm9cIixcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBhbGxvdzogXCJlbmNyeXB0ZWQtbWVkaWE7IGF1dG9wbGF5OyBmdWxsc2NyZWVuO1wiXG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3RyZWFtYWJsZTtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gU3RyZWFtYWJsZTtcblxuX2RlZmluZVByb3BlcnR5KFN0cmVhbWFibGUsIFwiZGlzcGxheU5hbWVcIiwgJ1N0cmVhbWFibGUnKTtcblxuX2RlZmluZVByb3BlcnR5KFN0cmVhbWFibGUsIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS5zdHJlYW1hYmxlKTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcblxudmFyIF9wYXR0ZXJucyA9IHJlcXVpcmUoXCIuLi9wYXR0ZXJuc1wiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBTREtfVVJMID0gJ2h0dHBzOi8vZmFzdC53aXN0aWEuY29tL2Fzc2V0cy9leHRlcm5hbC9FLXYxLmpzJztcbnZhciBTREtfR0xPQkFMID0gJ1dpc3RpYSc7XG52YXIgUExBWUVSX0lEX1BSRUZJWCA9ICd3aXN0aWEtcGxheWVyLSc7XG5cbnZhciBXaXN0aWEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFdpc3RpYSwgX0NvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihXaXN0aWEpO1xuXG4gIGZ1bmN0aW9uIFdpc3RpYSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2lzdGlhKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBfYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIF9hcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KF9hcmdzKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiY2FsbFBsYXllclwiLCBfdXRpbHMuY2FsbFBsYXllcik7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicGxheWVySURcIiwgX3RoaXMucHJvcHMuY29uZmlnLnBsYXllcklkIHx8IFwiXCIuY29uY2F0KFBMQVlFUl9JRF9QUkVGSVgpLmNvbmNhdCgoMCwgX3V0aWxzLnJhbmRvbVN0cmluZykoKSkpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uUGxheVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM7XG5cbiAgICAgIHJldHVybiAoX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcykub25QbGF5LmFwcGx5KF90aGlzJHByb3BzLCBhcmd1bWVudHMpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uUGF1c2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMjtcblxuICAgICAgcmV0dXJuIChfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcykub25QYXVzZS5hcHBseShfdGhpcyRwcm9wczIsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25TZWVrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczM7XG5cbiAgICAgIHJldHVybiAoX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMpLm9uU2Vlay5hcHBseShfdGhpcyRwcm9wczMsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25FbmRlZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0O1xuXG4gICAgICByZXR1cm4gKF90aGlzJHByb3BzNCA9IF90aGlzLnByb3BzKS5vbkVuZGVkLmFwcGx5KF90aGlzJHByb3BzNCwgYXJndW1lbnRzKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblBsYXliYWNrUmF0ZUNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1O1xuXG4gICAgICByZXR1cm4gKF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzKS5vblBsYXliYWNrUmF0ZUNoYW5nZS5hcHBseShfdGhpcyRwcm9wczUsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCdtdXRlJyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNhbGxQbGF5ZXIoJ3VubXV0ZScpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFdpc3RpYSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnByb3BzLm9uTW91bnQgJiYgdGhpcy5wcm9wcy5vbk1vdW50KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzNiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzNi5wbGF5aW5nLFxuICAgICAgICAgIG11dGVkID0gX3RoaXMkcHJvcHM2Lm11dGVkLFxuICAgICAgICAgIGNvbnRyb2xzID0gX3RoaXMkcHJvcHM2LmNvbnRyb2xzLFxuICAgICAgICAgIF9vblJlYWR5ID0gX3RoaXMkcHJvcHM2Lm9uUmVhZHksXG4gICAgICAgICAgY29uZmlnID0gX3RoaXMkcHJvcHM2LmNvbmZpZyxcbiAgICAgICAgICBvbkVycm9yID0gX3RoaXMkcHJvcHM2Lm9uRXJyb3I7XG4gICAgICAoMCwgX3V0aWxzLmdldFNESykoU0RLX1VSTCwgU0RLX0dMT0JBTCkudGhlbihmdW5jdGlvbiAoV2lzdGlhKSB7XG4gICAgICAgIGlmIChjb25maWcuY3VzdG9tQ29udHJvbHMpIHtcbiAgICAgICAgICBjb25maWcuY3VzdG9tQ29udHJvbHMuZm9yRWFjaChmdW5jdGlvbiAoY29udHJvbCkge1xuICAgICAgICAgICAgcmV0dXJuIFdpc3RpYS5kZWZpbmVDb250cm9sKGNvbnRyb2wpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93Ll93cSA9IHdpbmRvdy5fd3EgfHwgW107XG5cbiAgICAgICAgd2luZG93Ll93cS5wdXNoKHtcbiAgICAgICAgICBpZDogX3RoaXMyLnBsYXllcklELFxuICAgICAgICAgIG9wdGlvbnM6IF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgYXV0b1BsYXk6IHBsYXlpbmcsXG4gICAgICAgICAgICBzaWxlbnRBdXRvUGxheTogJ2FsbG93JyxcbiAgICAgICAgICAgIG11dGVkOiBtdXRlZCxcbiAgICAgICAgICAgIGNvbnRyb2xzVmlzaWJsZU9uTG9hZDogY29udHJvbHMsXG4gICAgICAgICAgICBmdWxsc2NyZWVuQnV0dG9uOiBjb250cm9scyxcbiAgICAgICAgICAgIHBsYXliYXI6IGNvbnRyb2xzLFxuICAgICAgICAgICAgcGxheWJhY2tSYXRlQ29udHJvbDogY29udHJvbHMsXG4gICAgICAgICAgICBxdWFsaXR5Q29udHJvbDogY29udHJvbHMsXG4gICAgICAgICAgICB2b2x1bWVDb250cm9sOiBjb250cm9scyxcbiAgICAgICAgICAgIHNldHRpbmdzQ29udHJvbDogY29udHJvbHMsXG4gICAgICAgICAgICBzbWFsbFBsYXlCdXR0b246IGNvbnRyb2xzXG4gICAgICAgICAgfSwgY29uZmlnLm9wdGlvbnMpLFxuICAgICAgICAgIG9uUmVhZHk6IGZ1bmN0aW9uIG9uUmVhZHkocGxheWVyKSB7XG4gICAgICAgICAgICBfdGhpczIucGxheWVyID0gcGxheWVyO1xuXG4gICAgICAgICAgICBfdGhpczIudW5iaW5kKCk7XG5cbiAgICAgICAgICAgIF90aGlzMi5wbGF5ZXIuYmluZCgncGxheScsIF90aGlzMi5vblBsYXkpO1xuXG4gICAgICAgICAgICBfdGhpczIucGxheWVyLmJpbmQoJ3BhdXNlJywgX3RoaXMyLm9uUGF1c2UpO1xuXG4gICAgICAgICAgICBfdGhpczIucGxheWVyLmJpbmQoJ3NlZWsnLCBfdGhpczIub25TZWVrKTtcblxuICAgICAgICAgICAgX3RoaXMyLnBsYXllci5iaW5kKCdlbmQnLCBfdGhpczIub25FbmRlZCk7XG5cbiAgICAgICAgICAgIF90aGlzMi5wbGF5ZXIuYmluZCgncGxheWJhY2tyYXRlY2hhbmdlJywgX3RoaXMyLm9uUGxheWJhY2tSYXRlQ2hhbmdlKTtcblxuICAgICAgICAgICAgX29uUmVhZHkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgb25FcnJvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuYmluZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bmJpbmQoKSB7XG4gICAgICB0aGlzLnBsYXllci51bmJpbmQoJ3BsYXknLCB0aGlzLm9uUGxheSk7XG4gICAgICB0aGlzLnBsYXllci51bmJpbmQoJ3BhdXNlJywgdGhpcy5vblBhdXNlKTtcbiAgICAgIHRoaXMucGxheWVyLnVuYmluZCgnc2VlaycsIHRoaXMub25TZWVrKTtcbiAgICAgIHRoaXMucGxheWVyLnVuYmluZCgnZW5kJywgdGhpcy5vbkVuZGVkKTtcbiAgICAgIHRoaXMucGxheWVyLnVuYmluZCgncGxheWJhY2tyYXRlY2hhbmdlJywgdGhpcy5vblBsYXliYWNrUmF0ZUNoYW5nZSk7XG4gICAgfSAvLyBQcm94eSBtZXRob2RzIHRvIHByZXZlbnQgbGlzdGVuZXIgbGVha3NcblxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGF1c2UnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgdGhpcy51bmJpbmQoKTtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncmVtb3ZlJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlZWtUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZWVrVG8oc2Vjb25kcykge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCd0aW1lJywgc2Vjb25kcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFZvbHVtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWb2x1bWUoZnJhY3Rpb24pIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigndm9sdW1lJywgZnJhY3Rpb24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRQbGF5YmFja1JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UGxheWJhY2tSYXRlKHJhdGUpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheWJhY2tSYXRlJywgcmF0ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbFBsYXllcignZHVyYXRpb24nKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsUGxheWVyKCd0aW1lJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNlY29uZHNMb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2Vjb25kc0xvYWRlZCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHVybCA9IHRoaXMucHJvcHMudXJsO1xuICAgICAgdmFyIHZpZGVvSUQgPSB1cmwgJiYgdXJsLm1hdGNoKF9wYXR0ZXJucy5NQVRDSF9VUkxfV0lTVElBKVsxXTtcbiAgICAgIHZhciBjbGFzc05hbWUgPSBcIndpc3RpYV9lbWJlZCB3aXN0aWFfYXN5bmNfXCIuY29uY2F0KHZpZGVvSUQpO1xuICAgICAgdmFyIHN0eWxlID0ge1xuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgaWQ6IHRoaXMucGxheWVySUQsXG4gICAgICAgIGtleTogdmlkZW9JRCxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFdpc3RpYTtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gV2lzdGlhO1xuXG5fZGVmaW5lUHJvcGVydHkoV2lzdGlhLCBcImRpc3BsYXlOYW1lXCIsICdXaXN0aWEnKTtcblxuX2RlZmluZVByb3BlcnR5KFdpc3RpYSwgXCJjYW5QbGF5XCIsIF9wYXR0ZXJucy5jYW5QbGF5Lndpc3RpYSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShXaXN0aWEsIFwibG9vcE9uRW5kZWRcIiwgdHJ1ZSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgU0RLX1VSTCA9ICdodHRwczovL3BsYXllci50d2l0Y2gudHYvanMvZW1iZWQvdjEuanMnO1xudmFyIFNES19HTE9CQUwgPSAnVHdpdGNoJztcbnZhciBQTEFZRVJfSURfUFJFRklYID0gJ3R3aXRjaC1wbGF5ZXItJztcblxudmFyIFR3aXRjaCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVHdpdGNoLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFR3aXRjaCk7XG5cbiAgZnVuY3Rpb24gVHdpdGNoKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUd2l0Y2gpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwbGF5ZXJJRFwiLCBfdGhpcy5wcm9wcy5jb25maWcucGxheWVySWQgfHwgXCJcIi5jb25jYXQoUExBWUVSX0lEX1BSRUZJWCkuY29uY2F0KCgwLCBfdXRpbHMucmFuZG9tU3RyaW5nKSgpKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCdzZXRNdXRlZCcsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVubXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCdzZXRNdXRlZCcsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUd2l0Y2gsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCwgaXNSZWFkeSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcGxheXNpbmxpbmUgPSBfdGhpcyRwcm9wcy5wbGF5c2lubGluZSxcbiAgICAgICAgICBvbkVycm9yID0gX3RoaXMkcHJvcHMub25FcnJvcixcbiAgICAgICAgICBjb25maWcgPSBfdGhpcyRwcm9wcy5jb25maWcsXG4gICAgICAgICAgY29udHJvbHMgPSBfdGhpcyRwcm9wcy5jb250cm9scztcblxuICAgICAgdmFyIGlzQ2hhbm5lbCA9IF9wYXR0ZXJucy5NQVRDSF9VUkxfVFdJVENIX0NIQU5ORUwudGVzdCh1cmwpO1xuXG4gICAgICB2YXIgaWQgPSBpc0NoYW5uZWwgPyB1cmwubWF0Y2goX3BhdHRlcm5zLk1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTClbMV0gOiB1cmwubWF0Y2goX3BhdHRlcm5zLk1BVENIX1VSTF9UV0lUQ0hfVklERU8pWzFdO1xuXG4gICAgICBpZiAoaXNSZWFkeSkge1xuICAgICAgICBpZiAoaXNDaGFubmVsKSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIuc2V0Q2hhbm5lbChpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIuc2V0VmlkZW8oJ3YnICsgaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAoMCwgX3V0aWxzLmdldFNESykoU0RLX1VSTCwgU0RLX0dMT0JBTCkudGhlbihmdW5jdGlvbiAoVHdpdGNoKSB7XG4gICAgICAgIF90aGlzMi5wbGF5ZXIgPSBuZXcgVHdpdGNoLlBsYXllcihfdGhpczIucGxheWVySUQsIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHZpZGVvOiBpc0NoYW5uZWwgPyAnJyA6IGlkLFxuICAgICAgICAgIGNoYW5uZWw6IGlzQ2hhbm5lbCA/IGlkIDogJycsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBwbGF5c2lubGluZTogcGxheXNpbmxpbmUsXG4gICAgICAgICAgYXV0b3BsYXk6IF90aGlzMi5wcm9wcy5wbGF5aW5nLFxuICAgICAgICAgIG11dGVkOiBfdGhpczIucHJvcHMubXV0ZWQsXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0Nvb2tQZXRlL3JlYWN0LXBsYXllci9pc3N1ZXMvNzMzI2lzc3VlY29tbWVudC01NDkwODU4NTlcbiAgICAgICAgICBjb250cm9sczogaXNDaGFubmVsID8gdHJ1ZSA6IGNvbnRyb2xzLFxuICAgICAgICAgIHRpbWU6ICgwLCBfdXRpbHMucGFyc2VTdGFydFRpbWUpKHVybClcbiAgICAgICAgfSwgY29uZmlnLm9wdGlvbnMpKTtcbiAgICAgICAgdmFyIF9Ud2l0Y2gkUGxheWVyID0gVHdpdGNoLlBsYXllcixcbiAgICAgICAgICAgIFJFQURZID0gX1R3aXRjaCRQbGF5ZXIuUkVBRFksXG4gICAgICAgICAgICBQTEFZSU5HID0gX1R3aXRjaCRQbGF5ZXIuUExBWUlORyxcbiAgICAgICAgICAgIFBBVVNFID0gX1R3aXRjaCRQbGF5ZXIuUEFVU0UsXG4gICAgICAgICAgICBFTkRFRCA9IF9Ud2l0Y2gkUGxheWVyLkVOREVELFxuICAgICAgICAgICAgT05MSU5FID0gX1R3aXRjaCRQbGF5ZXIuT05MSU5FLFxuICAgICAgICAgICAgT0ZGTElORSA9IF9Ud2l0Y2gkUGxheWVyLk9GRkxJTkUsXG4gICAgICAgICAgICBTRUVLID0gX1R3aXRjaCRQbGF5ZXIuU0VFSztcblxuICAgICAgICBfdGhpczIucGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoUkVBRFksIF90aGlzMi5wcm9wcy5vblJlYWR5KTtcblxuICAgICAgICBfdGhpczIucGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoUExBWUlORywgX3RoaXMyLnByb3BzLm9uUGxheSk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5hZGRFdmVudExpc3RlbmVyKFBBVVNFLCBfdGhpczIucHJvcHMub25QYXVzZSk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5hZGRFdmVudExpc3RlbmVyKEVOREVELCBfdGhpczIucHJvcHMub25FbmRlZCk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5hZGRFdmVudExpc3RlbmVyKFNFRUssIF90aGlzMi5wcm9wcy5vblNlZWspOyAvLyBQcmV2ZW50IHdlaXJkIGlzTG9hZGluZyBiZWhhdmlvdXIgd2hlbiBzdHJlYW1zIGFyZSBvZmZsaW5lXG5cblxuICAgICAgICBfdGhpczIucGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoT05MSU5FLCBfdGhpczIucHJvcHMub25Mb2FkZWQpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcihPRkZMSU5FLCBfdGhpczIucHJvcHMub25Mb2FkZWQpO1xuICAgICAgfSwgb25FcnJvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGF1c2UnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwYXVzZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKHNlY29uZHMpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2VlaycsIHNlY29uZHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGZyYWN0aW9uKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldFZvbHVtZScsIGZyYWN0aW9uKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RHVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RHVyYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsUGxheWVyKCdnZXREdXJhdGlvbicpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VGltZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGxQbGF5ZXIoJ2dldEN1cnJlbnRUaW1lJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNlY29uZHNMb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2Vjb25kc0xvYWRlZCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHN0eWxlID0ge1xuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBpZDogdGhpcy5wbGF5ZXJJRFxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFR3aXRjaDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gVHdpdGNoO1xuXG5fZGVmaW5lUHJvcGVydHkoVHdpdGNoLCBcImRpc3BsYXlOYW1lXCIsICdUd2l0Y2gnKTtcblxuX2RlZmluZVByb3BlcnR5KFR3aXRjaCwgXCJjYW5QbGF5XCIsIF9wYXR0ZXJucy5jYW5QbGF5LnR3aXRjaCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShUd2l0Y2gsIFwibG9vcE9uRW5kZWRcIiwgdHJ1ZSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgU0RLX1VSTCA9ICdodHRwczovL2FwaS5kbWNkbi5uZXQvYWxsLmpzJztcbnZhciBTREtfR0xPQkFMID0gJ0RNJztcbnZhciBTREtfR0xPQkFMX1JFQURZID0gJ2RtQXN5bmNJbml0JztcblxudmFyIERhaWx5TW90aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhEYWlseU1vdGlvbiwgX0NvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihEYWlseU1vdGlvbik7XG5cbiAgZnVuY3Rpb24gRGFpbHlNb3Rpb24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERhaWx5TW90aW9uKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiY2FsbFBsYXllclwiLCBfdXRpbHMuY2FsbFBsYXllcik7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25EdXJhdGlvbkNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZHVyYXRpb24gPSBfdGhpcy5nZXREdXJhdGlvbigpO1xuXG4gICAgICBfdGhpcy5wcm9wcy5vbkR1cmF0aW9uKGR1cmF0aW9uKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJtdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNhbGxQbGF5ZXIoJ3NldE11dGVkJywgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNhbGxQbGF5ZXIoJ3NldE11dGVkJywgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlZlwiLCBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgICBfdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRGFpbHlNb3Rpb24sIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgY29udHJvbHMgPSBfdGhpcyRwcm9wcy5jb250cm9scyxcbiAgICAgICAgICBjb25maWcgPSBfdGhpcyRwcm9wcy5jb25maWcsXG4gICAgICAgICAgb25FcnJvciA9IF90aGlzJHByb3BzLm9uRXJyb3IsXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzLnBsYXlpbmc7XG5cbiAgICAgIHZhciBfdXJsJG1hdGNoID0gdXJsLm1hdGNoKF9wYXR0ZXJucy5NQVRDSF9VUkxfREFJTFlNT1RJT04pLFxuICAgICAgICAgIF91cmwkbWF0Y2gyID0gX3NsaWNlZFRvQXJyYXkoX3VybCRtYXRjaCwgMiksXG4gICAgICAgICAgaWQgPSBfdXJsJG1hdGNoMlsxXTtcblxuICAgICAgaWYgKHRoaXMucGxheWVyKSB7XG4gICAgICAgIHRoaXMucGxheWVyLmxvYWQoaWQsIHtcbiAgICAgICAgICBzdGFydDogKDAsIF91dGlscy5wYXJzZVN0YXJ0VGltZSkodXJsKSxcbiAgICAgICAgICBhdXRvcGxheTogcGxheWluZ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAoMCwgX3V0aWxzLmdldFNESykoU0RLX1VSTCwgU0RLX0dMT0JBTCwgU0RLX0dMT0JBTF9SRUFEWSwgZnVuY3Rpb24gKERNKSB7XG4gICAgICAgIHJldHVybiBETS5wbGF5ZXI7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChETSkge1xuICAgICAgICBpZiAoIV90aGlzMi5jb250YWluZXIpIHJldHVybjtcbiAgICAgICAgdmFyIFBsYXllciA9IERNLnBsYXllcjtcbiAgICAgICAgX3RoaXMyLnBsYXllciA9IG5ldyBQbGF5ZXIoX3RoaXMyLmNvbnRhaW5lciwge1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgdmlkZW86IGlkLFxuICAgICAgICAgIHBhcmFtczogX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgICBjb250cm9sczogY29udHJvbHMsXG4gICAgICAgICAgICBhdXRvcGxheTogX3RoaXMyLnByb3BzLnBsYXlpbmcsXG4gICAgICAgICAgICBtdXRlOiBfdGhpczIucHJvcHMubXV0ZWQsXG4gICAgICAgICAgICBzdGFydDogKDAsIF91dGlscy5wYXJzZVN0YXJ0VGltZSkodXJsKSxcbiAgICAgICAgICAgIG9yaWdpbjogd2luZG93LmxvY2F0aW9uLm9yaWdpblxuICAgICAgICAgIH0sIGNvbmZpZy5wYXJhbXMpLFxuICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgYXBpcmVhZHk6IF90aGlzMi5wcm9wcy5vblJlYWR5LFxuICAgICAgICAgICAgc2Vla2VkOiBmdW5jdGlvbiBzZWVrZWQoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczIucHJvcHMub25TZWVrKF90aGlzMi5wbGF5ZXIuY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpZGVvX2VuZDogX3RoaXMyLnByb3BzLm9uRW5kZWQsXG4gICAgICAgICAgICBkdXJhdGlvbmNoYW5nZTogX3RoaXMyLm9uRHVyYXRpb25DaGFuZ2UsXG4gICAgICAgICAgICBwYXVzZTogX3RoaXMyLnByb3BzLm9uUGF1c2UsXG4gICAgICAgICAgICBwbGF5aW5nOiBfdGhpczIucHJvcHMub25QbGF5LFxuICAgICAgICAgICAgd2FpdGluZzogX3RoaXMyLnByb3BzLm9uQnVmZmVyLFxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIGVycm9yKGV2ZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgb25FcnJvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGF1c2UnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkgey8vIE5vdGhpbmcgdG8gZG9cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2Vla1RvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlZWtUbyhzZWNvbmRzKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NlZWsnLCBzZWNvbmRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vm9sdW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZvbHVtZShmcmFjdGlvbikge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRWb2x1bWUnLCBmcmFjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmR1cmF0aW9uIHx8IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEN1cnJlbnRUaW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuYnVmZmVyZWRUaW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIGRpc3BsYXkgPSB0aGlzLnByb3BzLmRpc3BsYXk7XG4gICAgICB2YXIgc3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICBkaXNwbGF5OiBkaXNwbGF5XG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICByZWY6IHRoaXMucmVmXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERhaWx5TW90aW9uO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBEYWlseU1vdGlvbjtcblxuX2RlZmluZVByb3BlcnR5KERhaWx5TW90aW9uLCBcImRpc3BsYXlOYW1lXCIsICdEYWlseU1vdGlvbicpO1xuXG5fZGVmaW5lUHJvcGVydHkoRGFpbHlNb3Rpb24sIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS5kYWlseW1vdGlvbik7XG5cbl9kZWZpbmVQcm9wZXJ0eShEYWlseU1vdGlvbiwgXCJsb29wT25FbmRlZFwiLCB0cnVlKTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcblxudmFyIF9wYXR0ZXJucyA9IHJlcXVpcmUoXCIuLi9wYXR0ZXJuc1wiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBTREtfVVJMID0gJ2h0dHBzOi8vd2lkZ2V0Lm1peGNsb3VkLmNvbS9tZWRpYS9qcy93aWRnZXRBcGkuanMnO1xudmFyIFNES19HTE9CQUwgPSAnTWl4Y2xvdWQnO1xuXG52YXIgTWl4Y2xvdWQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE1peGNsb3VkLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKE1peGNsb3VkKTtcblxuICBmdW5jdGlvbiBNaXhjbG91ZCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWl4Y2xvdWQpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJkdXJhdGlvblwiLCBudWxsKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjdXJyZW50VGltZVwiLCBudWxsKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzZWNvbmRzTG9hZGVkXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm11dGVcIiwgZnVuY3Rpb24gKCkgey8vIE5vIHZvbHVtZSBzdXBwb3J0XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHsvLyBObyB2b2x1bWUgc3VwcG9ydFxuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlZlwiLCBmdW5jdGlvbiAoaWZyYW1lKSB7XG4gICAgICBfdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWl4Y2xvdWQsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICgwLCBfdXRpbHMuZ2V0U0RLKShTREtfVVJMLCBTREtfR0xPQkFMKS50aGVuKGZ1bmN0aW9uIChNaXhjbG91ZCkge1xuICAgICAgICBfdGhpczIucGxheWVyID0gTWl4Y2xvdWQuUGxheWVyV2lkZ2V0KF90aGlzMi5pZnJhbWUpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIucmVhZHkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLnBsYXllci5ldmVudHMucGxheS5vbihfdGhpczIucHJvcHMub25QbGF5KTtcblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIuZXZlbnRzLnBhdXNlLm9uKF90aGlzMi5wcm9wcy5vblBhdXNlKTtcblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIuZXZlbnRzLmVuZGVkLm9uKF90aGlzMi5wcm9wcy5vbkVuZGVkKTtcblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIuZXZlbnRzLmVycm9yLm9uKF90aGlzMi5wcm9wcy5lcnJvcik7XG5cbiAgICAgICAgICBfdGhpczIucGxheWVyLmV2ZW50cy5wcm9ncmVzcy5vbihmdW5jdGlvbiAoc2Vjb25kcywgZHVyYXRpb24pIHtcbiAgICAgICAgICAgIF90aGlzMi5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgICAgICBfdGhpczIuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMi5wcm9wcy5vblJlYWR5KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgdGhpcy5wcm9wcy5vbkVycm9yKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwbGF5Jyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwYXVzZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3AoKSB7Ly8gTm90aGluZyB0byBkb1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKHNlY29uZHMpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2VlaycsIHNlY29uZHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGZyYWN0aW9uKSB7Ly8gTm8gdm9sdW1lIHN1cHBvcnRcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RHVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RHVyYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdXJhdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGltZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2Vjb25kc0xvYWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTZWNvbmRzTG9hZGVkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHVybCA9IF90aGlzJHByb3BzLnVybCxcbiAgICAgICAgICBjb25maWcgPSBfdGhpcyRwcm9wcy5jb25maWc7XG4gICAgICB2YXIgaWQgPSB1cmwubWF0Y2goX3BhdHRlcm5zLk1BVENIX1VSTF9NSVhDTE9VRClbMV07XG4gICAgICB2YXIgc3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgICAgdmFyIHF1ZXJ5ID0gKDAsIF91dGlscy5xdWVyeVN0cmluZykoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjb25maWcub3B0aW9ucyksIHt9LCB7XG4gICAgICAgIGZlZWQ6IFwiL1wiLmNvbmNhdChpZCwgXCIvXCIpXG4gICAgICB9KSk7IC8vIFdlIGhhdmUgdG8gZ2l2ZSB0aGUgaWZyYW1lIGEga2V5IGhlcmUgdG8gcHJldmVudCBhXG4gICAgICAvLyB3ZWlyZCBkaWFsb2cgYXBwZWFyaW5nIHdoZW4gbG9hZGluZyBhIG5ldyB0cmFja1xuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImlmcmFtZVwiLCB7XG4gICAgICAgIGtleTogaWQsXG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgc3JjOiBcImh0dHBzOi8vd3d3Lm1peGNsb3VkLmNvbS93aWRnZXQvaWZyYW1lLz9cIi5jb25jYXQocXVlcnkpLFxuICAgICAgICBmcmFtZUJvcmRlcjogXCIwXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNaXhjbG91ZDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gTWl4Y2xvdWQ7XG5cbl9kZWZpbmVQcm9wZXJ0eShNaXhjbG91ZCwgXCJkaXNwbGF5TmFtZVwiLCAnTWl4Y2xvdWQnKTtcblxuX2RlZmluZVByb3BlcnR5KE1peGNsb3VkLCBcImNhblBsYXlcIiwgX3BhdHRlcm5zLmNhblBsYXkubWl4Y2xvdWQpO1xuXG5fZGVmaW5lUHJvcGVydHkoTWl4Y2xvdWQsIFwibG9vcE9uRW5kZWRcIiwgdHJ1ZSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgU0RLX1VSTCA9ICdodHRwczovL3BsYXkudmlkeWFyZC5jb20vZW1iZWQvdjQuanMnO1xudmFyIFNES19HTE9CQUwgPSAnVmlkeWFyZFY0JztcbnZhciBTREtfR0xPQkFMX1JFQURZID0gJ29uVmlkeWFyZEFQSSc7XG5cbnZhciBWaWR5YXJkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhWaWR5YXJkLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFZpZHlhcmQpO1xuXG4gIGZ1bmN0aW9uIFZpZHlhcmQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpZHlhcmQpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJtdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldFZvbHVtZSgwKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ1bm11dGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnByb3BzLnZvbHVtZSAhPT0gbnVsbCkge1xuICAgICAgICBfdGhpcy5zZXRWb2x1bWUoX3RoaXMucHJvcHMudm9sdW1lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJyZWZcIiwgZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgICAgX3RoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFZpZHlhcmQsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzLnBsYXlpbmcsXG4gICAgICAgICAgY29uZmlnID0gX3RoaXMkcHJvcHMuY29uZmlnLFxuICAgICAgICAgIG9uRXJyb3IgPSBfdGhpcyRwcm9wcy5vbkVycm9yLFxuICAgICAgICAgIG9uRHVyYXRpb24gPSBfdGhpcyRwcm9wcy5vbkR1cmF0aW9uO1xuICAgICAgdmFyIGlkID0gdXJsICYmIHVybC5tYXRjaChfcGF0dGVybnMuTUFUQ0hfVVJMX1ZJRFlBUkQpWzFdO1xuXG4gICAgICBpZiAodGhpcy5wbGF5ZXIpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgICgwLCBfdXRpbHMuZ2V0U0RLKShTREtfVVJMLCBTREtfR0xPQkFMLCBTREtfR0xPQkFMX1JFQURZKS50aGVuKGZ1bmN0aW9uIChWaWR5YXJkKSB7XG4gICAgICAgIGlmICghX3RoaXMyLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgICAgICBWaWR5YXJkLmFwaS5hZGRSZWFkeUxpc3RlbmVyKGZ1bmN0aW9uIChkYXRhLCBwbGF5ZXIpIHtcbiAgICAgICAgICBpZiAoX3RoaXMyLnBsYXllcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAgICAgICBfdGhpczIucGxheWVyLm9uKCdyZWFkeScsIF90aGlzMi5wcm9wcy5vblJlYWR5KTtcblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3BsYXknLCBfdGhpczIucHJvcHMub25QbGF5KTtcblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3BhdXNlJywgX3RoaXMyLnByb3BzLm9uUGF1c2UpO1xuXG4gICAgICAgICAgX3RoaXMyLnBsYXllci5vbignc2VlaycsIF90aGlzMi5wcm9wcy5vblNlZWspO1xuXG4gICAgICAgICAgX3RoaXMyLnBsYXllci5vbigncGxheWVyQ29tcGxldGUnLCBfdGhpczIucHJvcHMub25FbmRlZCk7XG4gICAgICAgIH0sIGlkKTtcbiAgICAgICAgVmlkeWFyZC5hcGkucmVuZGVyUGxheWVyKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHV1aWQ6IGlkLFxuICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMyLmNvbnRhaW5lcixcbiAgICAgICAgICBhdXRvcGxheTogcGxheWluZyA/IDEgOiAwXG4gICAgICAgIH0sIGNvbmZpZy5vcHRpb25zKSk7XG4gICAgICAgIFZpZHlhcmQuYXBpLmdldFBsYXllck1ldGFkYXRhKGlkKS50aGVuKGZ1bmN0aW9uIChtZXRhKSB7XG4gICAgICAgICAgX3RoaXMyLmR1cmF0aW9uID0gbWV0YS5sZW5ndGhfaW5fc2Vjb25kcztcbiAgICAgICAgICBvbkR1cmF0aW9uKG1ldGEubGVuZ3RoX2luX3NlY29uZHMpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIG9uRXJyb3IpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwbGF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BsYXknKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BhdXNlJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHdpbmRvdy5WaWR5YXJkVjQuYXBpLmRlc3Ryb3lQbGF5ZXIodGhpcy5wbGF5ZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKGFtb3VudCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZWVrJywgYW1vdW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vm9sdW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZvbHVtZShmcmFjdGlvbikge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRWb2x1bWUnLCBmcmFjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFBsYXliYWNrUmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQbGF5YmFja1JhdGUocmF0ZSkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRQbGF5YmFja1NwZWVkJywgcmF0ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZHVyYXRpb247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEN1cnJlbnRUaW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbFBsYXllcignY3VycmVudFRpbWUnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2Vjb25kc0xvYWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTZWNvbmRzTG9hZGVkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgZGlzcGxheSA9IHRoaXMucHJvcHMuZGlzcGxheTtcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgIGRpc3BsYXk6IGRpc3BsYXlcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5yZWZcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVmlkeWFyZDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gVmlkeWFyZDtcblxuX2RlZmluZVByb3BlcnR5KFZpZHlhcmQsIFwiZGlzcGxheU5hbWVcIiwgJ1ZpZHlhcmQnKTtcblxuX2RlZmluZVByb3BlcnR5KFZpZHlhcmQsIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS52aWR5YXJkKTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcblxudmFyIF9wYXR0ZXJucyA9IHJlcXVpcmUoXCIuLi9wYXR0ZXJuc1wiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxudmFyIFNES19VUkwgPSAnaHR0cHM6Ly9jZG4uZW1iZWQubHkvcGxheWVyLTAuMS4wLm1pbi5qcyc7XG52YXIgU0RLX0dMT0JBTCA9ICdwbGF5ZXJqcyc7XG5cbnZhciBLYWx0dXJhID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhLYWx0dXJhLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEthbHR1cmEpO1xuXG4gIGZ1bmN0aW9uIEthbHR1cmEoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEthbHR1cmEpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJkdXJhdGlvblwiLCBudWxsKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjdXJyZW50VGltZVwiLCBudWxsKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzZWNvbmRzTG9hZGVkXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm11dGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuY2FsbFBsYXllcignbXV0ZScpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVubXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCd1bm11dGUnKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJyZWZcIiwgZnVuY3Rpb24gKGlmcmFtZSkge1xuICAgICAgX3RoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEthbHR1cmEsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICgwLCBfdXRpbHMuZ2V0U0RLKShTREtfVVJMLCBTREtfR0xPQkFMKS50aGVuKGZ1bmN0aW9uIChwbGF5ZXJqcykge1xuICAgICAgICBpZiAoIV90aGlzMi5pZnJhbWUpIHJldHVybjtcbiAgICAgICAgX3RoaXMyLnBsYXllciA9IG5ldyBwbGF5ZXJqcy5QbGF5ZXIoX3RoaXMyLmlmcmFtZSk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5vbigncmVhZHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQW4gYXJiaXRyYXJ5IHRpbWVvdXQgaXMgcmVxdWlyZWQgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gdGhlIGV2ZW50IGxpc3RlbmVycyB3b25cdTIwMTl0IHdvcmtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMi5wbGF5ZXIuaXNSZWFkeSA9IHRydWU7XG5cbiAgICAgICAgICAgIF90aGlzMi5wbGF5ZXIuc2V0TG9vcChfdGhpczIucHJvcHMubG9vcCk7XG5cbiAgICAgICAgICAgIGlmIChfdGhpczIucHJvcHMubXV0ZWQpIHtcbiAgICAgICAgICAgICAgX3RoaXMyLnBsYXllci5tdXRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF90aGlzMi5hZGRMaXN0ZW5lcnMoX3RoaXMyLnBsYXllciwgX3RoaXMyLnByb3BzKTtcblxuICAgICAgICAgICAgX3RoaXMyLnByb3BzLm9uUmVhZHkoKTtcbiAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9KTtcbiAgICAgIH0sIHRoaXMucHJvcHMub25FcnJvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZExpc3RlbmVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRMaXN0ZW5lcnMocGxheWVyLCBwcm9wcykge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHBsYXllci5vbigncGxheScsIHByb3BzLm9uUGxheSk7XG4gICAgICBwbGF5ZXIub24oJ3BhdXNlJywgcHJvcHMub25QYXVzZSk7XG4gICAgICBwbGF5ZXIub24oJ2VuZGVkJywgcHJvcHMub25FbmRlZCk7XG4gICAgICBwbGF5ZXIub24oJ2Vycm9yJywgcHJvcHMub25FcnJvcik7XG4gICAgICBwbGF5ZXIub24oJ3RpbWV1cGRhdGUnLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBfcmVmLmR1cmF0aW9uLFxuICAgICAgICAgICAgc2Vjb25kcyA9IF9yZWYuc2Vjb25kcztcbiAgICAgICAgX3RoaXMzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgIF90aGlzMy5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwbGF5Jyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwYXVzZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3AoKSB7Ly8gTm90aGluZyB0byBkb1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKHNlY29uZHMpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2V0Q3VycmVudFRpbWUnLCBzZWNvbmRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vm9sdW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZvbHVtZShmcmFjdGlvbikge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRWb2x1bWUnLCBmcmFjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldExvb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TG9vcChsb29wKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldExvb3AnLCBsb29wKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RHVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RHVyYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdXJhdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGltZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2Vjb25kc0xvYWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTZWNvbmRzTG9hZGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2Vjb25kc0xvYWRlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImlmcmFtZVwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHNyYzogdGhpcy5wcm9wcy51cmwsXG4gICAgICAgIGZyYW1lQm9yZGVyOiBcIjBcIixcbiAgICAgICAgc2Nyb2xsaW5nOiBcIm5vXCIsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgYWxsb3c6IFwiZW5jcnlwdGVkLW1lZGlhOyBhdXRvcGxheTsgZnVsbHNjcmVlbjtcIixcbiAgICAgICAgcmVmZXJyZXJQb2xpY3k6IFwibm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGVcIlxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEthbHR1cmE7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEthbHR1cmE7XG5cbl9kZWZpbmVQcm9wZXJ0eShLYWx0dXJhLCBcImRpc3BsYXlOYW1lXCIsICdLYWx0dXJhJyk7XG5cbl9kZWZpbmVQcm9wZXJ0eShLYWx0dXJhLCBcImNhblBsYXlcIiwgX3BhdHRlcm5zLmNhblBsYXkua2FsdHVyYSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBIQVNfTkFWSUdBVE9SID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgSVNfSVBBRF9QUk8gPSBIQVNfTkFWSUdBVE9SICYmIG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxO1xudmFyIElTX0lPUyA9IEhBU19OQVZJR0FUT1IgJiYgKC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IElTX0lQQURfUFJPKSAmJiAhd2luZG93Lk1TU3RyZWFtO1xudmFyIEhMU19TREtfVVJMID0gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vaGxzLmpzQFZFUlNJT04vZGlzdC9obHMubWluLmpzJztcbnZhciBITFNfR0xPQkFMID0gJ0hscyc7XG52YXIgREFTSF9TREtfVVJMID0gJ2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2Rhc2hqcy9WRVJTSU9OL2Rhc2guYWxsLm1pbi5qcyc7XG52YXIgREFTSF9HTE9CQUwgPSAnZGFzaGpzJztcbnZhciBGTFZfU0RLX1VSTCA9ICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Zsdi5qc0BWRVJTSU9OL2Rpc3QvZmx2Lm1pbi5qcyc7XG52YXIgRkxWX0dMT0JBTCA9ICdmbHZqcyc7XG52YXIgTUFUQ0hfRFJPUEJPWF9VUkwgPSAvd3d3XFwuZHJvcGJveFxcLmNvbVxcLy4rLztcbnZhciBNQVRDSF9DTE9VREZMQVJFX1NUUkVBTSA9IC9odHRwczpcXC9cXC93YXRjaFxcLmNsb3VkZmxhcmVzdHJlYW1cXC5jb21cXC8oW2EtejAtOV0rKS87XG52YXIgUkVQTEFDRV9DTE9VREZMQVJFX1NUUkVBTSA9ICdodHRwczovL3ZpZGVvZGVsaXZlcnkubmV0L3tpZH0vbWFuaWZlc3QvdmlkZW8ubTN1OCc7XG5cbnZhciBGaWxlUGxheWVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhGaWxlUGxheWVyLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEZpbGVQbGF5ZXIpO1xuXG4gIGZ1bmN0aW9uIEZpbGVQbGF5ZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZpbGVQbGF5ZXIpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF9hcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgX2FyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoX2FyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblJlYWR5XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcztcblxuICAgICAgcmV0dXJuIChfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzKS5vblJlYWR5LmFwcGx5KF90aGlzJHByb3BzLCBhcmd1bWVudHMpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uUGxheVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyO1xuXG4gICAgICByZXR1cm4gKF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzKS5vblBsYXkuYXBwbHkoX3RoaXMkcHJvcHMyLCBhcmd1bWVudHMpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uQnVmZmVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczM7XG5cbiAgICAgIHJldHVybiAoX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMpLm9uQnVmZmVyLmFwcGx5KF90aGlzJHByb3BzMywgYXJndW1lbnRzKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkJ1ZmZlckVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0O1xuXG4gICAgICByZXR1cm4gKF90aGlzJHByb3BzNCA9IF90aGlzLnByb3BzKS5vbkJ1ZmZlckVuZC5hcHBseShfdGhpcyRwcm9wczQsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25QYXVzZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1O1xuXG4gICAgICByZXR1cm4gKF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzKS5vblBhdXNlLmFwcGx5KF90aGlzJHByb3BzNSwgYXJndW1lbnRzKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkVuZGVkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczY7XG5cbiAgICAgIHJldHVybiAoX3RoaXMkcHJvcHM2ID0gX3RoaXMucHJvcHMpLm9uRW5kZWQuYXBwbHkoX3RoaXMkcHJvcHM2LCBhcmd1bWVudHMpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uRXJyb3JcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNztcblxuICAgICAgcmV0dXJuIChfdGhpcyRwcm9wczcgPSBfdGhpcy5wcm9wcykub25FcnJvci5hcHBseShfdGhpcyRwcm9wczcsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25QbGF5QmFja1JhdGVDaGFuZ2VcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMub25QbGF5YmFja1JhdGVDaGFuZ2UoZXZlbnQudGFyZ2V0LnBsYXliYWNrUmF0ZSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25FbmFibGVQSVBcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzODtcblxuICAgICAgcmV0dXJuIChfdGhpcyRwcm9wczggPSBfdGhpcy5wcm9wcykub25FbmFibGVQSVAuYXBwbHkoX3RoaXMkcHJvcHM4LCBhcmd1bWVudHMpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uRGlzYWJsZVBJUFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzOSA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uRGlzYWJsZVBJUCA9IF90aGlzJHByb3BzOS5vbkRpc2FibGVQSVAsXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzOS5wbGF5aW5nO1xuICAgICAgb25EaXNhYmxlUElQKGUpO1xuXG4gICAgICBpZiAocGxheWluZykge1xuICAgICAgICBfdGhpcy5wbGF5KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25QcmVzZW50YXRpb25Nb2RlQ2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoX3RoaXMucGxheWVyICYmICgwLCBfdXRpbHMuc3VwcG9ydHNXZWJLaXRQcmVzZW50YXRpb25Nb2RlKShfdGhpcy5wbGF5ZXIpKSB7XG4gICAgICAgIHZhciB3ZWJraXRQcmVzZW50YXRpb25Nb2RlID0gX3RoaXMucGxheWVyLndlYmtpdFByZXNlbnRhdGlvbk1vZGU7XG5cbiAgICAgICAgaWYgKHdlYmtpdFByZXNlbnRhdGlvbk1vZGUgPT09ICdwaWN0dXJlLWluLXBpY3R1cmUnKSB7XG4gICAgICAgICAgX3RoaXMub25FbmFibGVQSVAoZSk7XG4gICAgICAgIH0gZWxzZSBpZiAod2Via2l0UHJlc2VudGF0aW9uTW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICBfdGhpcy5vbkRpc2FibGVQSVAoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblNlZWtcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLnByb3BzLm9uU2VlayhlLnRhcmdldC5jdXJyZW50VGltZSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5wbGF5ZXIubXV0ZWQgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVubXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5wbGF5ZXIubXV0ZWQgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJyZW5kZXJTb3VyY2VFbGVtZW50XCIsIGZ1bmN0aW9uIChzb3VyY2UsIGluZGV4KSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJzb3VyY2VcIiwge1xuICAgICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgICAgc3JjOiBzb3VyY2VcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFwic291cmNlXCIsIF9leHRlbmRzKHtcbiAgICAgICAga2V5OiBpbmRleFxuICAgICAgfSwgc291cmNlKSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicmVuZGVyVHJhY2tcIiwgZnVuY3Rpb24gKHRyYWNrLCBpbmRleCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJ0cmFja1wiLCBfZXh0ZW5kcyh7XG4gICAgICAgIGtleTogaW5kZXhcbiAgICAgIH0sIHRyYWNrKSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicmVmXCIsIGZ1bmN0aW9uIChwbGF5ZXIpIHtcbiAgICAgIGlmIChfdGhpcy5wbGF5ZXIpIHtcbiAgICAgICAgLy8gU3RvcmUgcHJldmlvdXMgcGxheWVyIHRvIGJlIHVzZWQgYnkgcmVtb3ZlTGlzdGVuZXJzKClcbiAgICAgICAgX3RoaXMucHJldlBsYXllciA9IF90aGlzLnBsYXllcjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMucGxheWVyID0gcGxheWVyO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZpbGVQbGF5ZXIsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICAgIHRoaXMuYWRkTGlzdGVuZXJzKHRoaXMucGxheWVyKTtcblxuICAgICAgaWYgKElTX0lPUykge1xuICAgICAgICB0aGlzLnBsYXllci5sb2FkKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRVc2VBdWRpbyh0aGlzLnByb3BzKSAhPT0gdGhpcy5zaG91bGRVc2VBdWRpbyhwcmV2UHJvcHMpKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzKHRoaXMucHJldlBsYXllciwgcHJldlByb3BzLnVybCk7XG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXJzKHRoaXMucGxheWVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMudXJsICE9PSBwcmV2UHJvcHMudXJsICYmICEoMCwgX3V0aWxzLmlzTWVkaWFTdHJlYW0pKHRoaXMucHJvcHMudXJsKSkge1xuICAgICAgICB0aGlzLnBsYXllci5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzKHRoaXMucGxheWVyKTtcblxuICAgICAgaWYgKHRoaXMuaGxzKSB7XG4gICAgICAgIHRoaXMuaGxzLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkTGlzdGVuZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZExpc3RlbmVycyhwbGF5ZXIpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczEwID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB1cmwgPSBfdGhpcyRwcm9wczEwLnVybCxcbiAgICAgICAgICBwbGF5c2lubGluZSA9IF90aGlzJHByb3BzMTAucGxheXNpbmxpbmU7XG4gICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigncGxheScsIHRoaXMub25QbGF5KTtcbiAgICAgIHBsYXllci5hZGRFdmVudExpc3RlbmVyKCd3YWl0aW5nJywgdGhpcy5vbkJ1ZmZlcik7XG4gICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigncGxheWluZycsIHRoaXMub25CdWZmZXJFbmQpO1xuICAgICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgdGhpcy5vblBhdXNlKTtcbiAgICAgIHBsYXllci5hZGRFdmVudExpc3RlbmVyKCdzZWVrZWQnLCB0aGlzLm9uU2Vlayk7XG4gICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCB0aGlzLm9uRW5kZWQpO1xuICAgICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5vbkVycm9yKTtcbiAgICAgIHBsYXllci5hZGRFdmVudExpc3RlbmVyKCdyYXRlY2hhbmdlJywgdGhpcy5vblBsYXlCYWNrUmF0ZUNoYW5nZSk7XG4gICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignZW50ZXJwaWN0dXJlaW5waWN0dXJlJywgdGhpcy5vbkVuYWJsZVBJUCk7XG4gICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignbGVhdmVwaWN0dXJlaW5waWN0dXJlJywgdGhpcy5vbkRpc2FibGVQSVApO1xuICAgICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHByZXNlbnRhdGlvbm1vZGVjaGFuZ2VkJywgdGhpcy5vblByZXNlbnRhdGlvbk1vZGVDaGFuZ2UpO1xuXG4gICAgICBpZiAoIXRoaXMuc2hvdWxkVXNlSExTKHVybCkpIHtcbiAgICAgICAgLy8gb25SZWFkeSBpcyBoYW5kbGVkIGJ5IGhscy5qc1xuICAgICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignY2FucGxheScsIHRoaXMub25SZWFkeSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwbGF5c2lubGluZSkge1xuICAgICAgICBwbGF5ZXIuc2V0QXR0cmlidXRlKCdwbGF5c2lubGluZScsICcnKTtcbiAgICAgICAgcGxheWVyLnNldEF0dHJpYnV0ZSgnd2Via2l0LXBsYXlzaW5saW5lJywgJycpO1xuICAgICAgICBwbGF5ZXIuc2V0QXR0cmlidXRlKCd4NS1wbGF5c2lubGluZScsICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlTGlzdGVuZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVycyhwbGF5ZXIsIHVybCkge1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCB0aGlzLm9uUmVhZHkpO1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXknLCB0aGlzLm9uUGxheSk7XG4gICAgICBwbGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2FpdGluZycsIHRoaXMub25CdWZmZXIpO1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCB0aGlzLm9uQnVmZmVyRW5kKTtcbiAgICAgIHBsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXVzZScsIHRoaXMub25QYXVzZSk7XG4gICAgICBwbGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgdGhpcy5vblNlZWspO1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgdGhpcy5vbkVuZGVkKTtcbiAgICAgIHBsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMub25FcnJvcik7XG4gICAgICBwbGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmF0ZWNoYW5nZScsIHRoaXMub25QbGF5QmFja1JhdGVDaGFuZ2UpO1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VudGVycGljdHVyZWlucGljdHVyZScsIHRoaXMub25FbmFibGVQSVApO1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xlYXZlcGljdHVyZWlucGljdHVyZScsIHRoaXMub25EaXNhYmxlUElQKTtcbiAgICAgIHBsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRwcmVzZW50YXRpb25tb2RlY2hhbmdlZCcsIHRoaXMub25QcmVzZW50YXRpb25Nb2RlQ2hhbmdlKTtcblxuICAgICAgaWYgKCF0aGlzLnNob3VsZFVzZUhMUyh1cmwpKSB7XG4gICAgICAgIC8vIG9uUmVhZHkgaXMgaGFuZGxlZCBieSBobHMuanNcbiAgICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCB0aGlzLm9uUmVhZHkpO1xuICAgICAgfVxuICAgIH0gLy8gUHJveHkgbWV0aG9kcyB0byBwcmV2ZW50IGxpc3RlbmVyIGxlYWtzXG5cbiAgfSwge1xuICAgIGtleTogXCJzaG91bGRVc2VBdWRpb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRVc2VBdWRpbyhwcm9wcykge1xuICAgICAgaWYgKHByb3BzLmNvbmZpZy5mb3JjZVZpZGVvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmNvbmZpZy5hdHRyaWJ1dGVzLnBvc3Rlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFVzZSA8dmlkZW8+IHNvIHRoYXQgcG9zdGVyIGlzIHNob3duXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfcGF0dGVybnMuQVVESU9fRVhURU5TSU9OUy50ZXN0KHByb3BzLnVybCkgfHwgcHJvcHMuY29uZmlnLmZvcmNlQXVkaW87XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZFVzZUhMU1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRVc2VITFModXJsKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5jb25maWcuZm9yY2VITFMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChJU19JT1MpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3BhdHRlcm5zLkhMU19FWFRFTlNJT05TLnRlc3QodXJsKSB8fCBNQVRDSF9DTE9VREZMQVJFX1NUUkVBTS50ZXN0KHVybCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZFVzZURBU0hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkVXNlREFTSCh1cmwpIHtcbiAgICAgIHJldHVybiBfcGF0dGVybnMuREFTSF9FWFRFTlNJT05TLnRlc3QodXJsKSB8fCB0aGlzLnByb3BzLmNvbmZpZy5mb3JjZURBU0g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZFVzZUZMVlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRVc2VGTFYodXJsKSB7XG4gICAgICByZXR1cm4gX3BhdHRlcm5zLkZMVl9FWFRFTlNJT05TLnRlc3QodXJsKSB8fCB0aGlzLnByb3BzLmNvbmZpZy5mb3JjZUZMVjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyRjb25maWcgPSB0aGlzLnByb3BzLmNvbmZpZyxcbiAgICAgICAgICBobHNWZXJzaW9uID0gX3RoaXMkcHJvcHMkY29uZmlnLmhsc1ZlcnNpb24sXG4gICAgICAgICAgaGxzT3B0aW9ucyA9IF90aGlzJHByb3BzJGNvbmZpZy5obHNPcHRpb25zLFxuICAgICAgICAgIGRhc2hWZXJzaW9uID0gX3RoaXMkcHJvcHMkY29uZmlnLmRhc2hWZXJzaW9uLFxuICAgICAgICAgIGZsdlZlcnNpb24gPSBfdGhpcyRwcm9wcyRjb25maWcuZmx2VmVyc2lvbjtcblxuICAgICAgaWYgKHRoaXMuaGxzKSB7XG4gICAgICAgIHRoaXMuaGxzLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGFzaCkge1xuICAgICAgICB0aGlzLmRhc2gucmVzZXQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvdWxkVXNlSExTKHVybCkpIHtcbiAgICAgICAgKDAsIF91dGlscy5nZXRTREspKEhMU19TREtfVVJMLnJlcGxhY2UoJ1ZFUlNJT04nLCBobHNWZXJzaW9uKSwgSExTX0dMT0JBTCkudGhlbihmdW5jdGlvbiAoSGxzKSB7XG4gICAgICAgICAgX3RoaXMyLmhscyA9IG5ldyBIbHMoaGxzT3B0aW9ucyk7XG5cbiAgICAgICAgICBfdGhpczIuaGxzLm9uKEhscy5FdmVudHMuTUFOSUZFU1RfUEFSU0VELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpczIucHJvcHMub25SZWFkeSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMyLmhscy5vbihIbHMuRXZlbnRzLkVSUk9SLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICAgICAgX3RoaXMyLnByb3BzLm9uRXJyb3IoZSwgZGF0YSwgX3RoaXMyLmhscywgSGxzKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChNQVRDSF9DTE9VREZMQVJFX1NUUkVBTS50ZXN0KHVybCkpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IHVybC5tYXRjaChNQVRDSF9DTE9VREZMQVJFX1NUUkVBTSlbMV07XG5cbiAgICAgICAgICAgIF90aGlzMi5obHMubG9hZFNvdXJjZShSRVBMQUNFX0NMT1VERkxBUkVfU1RSRUFNLnJlcGxhY2UoJ3tpZH0nLCBpZCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczIuaGxzLmxvYWRTb3VyY2UodXJsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczIuaGxzLmF0dGFjaE1lZGlhKF90aGlzMi5wbGF5ZXIpO1xuXG4gICAgICAgICAgX3RoaXMyLnByb3BzLm9uTG9hZGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG91bGRVc2VEQVNIKHVybCkpIHtcbiAgICAgICAgKDAsIF91dGlscy5nZXRTREspKERBU0hfU0RLX1VSTC5yZXBsYWNlKCdWRVJTSU9OJywgZGFzaFZlcnNpb24pLCBEQVNIX0dMT0JBTCkudGhlbihmdW5jdGlvbiAoZGFzaGpzKSB7XG4gICAgICAgICAgX3RoaXMyLmRhc2ggPSBkYXNoanMuTWVkaWFQbGF5ZXIoKS5jcmVhdGUoKTtcblxuICAgICAgICAgIF90aGlzMi5kYXNoLmluaXRpYWxpemUoX3RoaXMyLnBsYXllciwgdXJsLCBfdGhpczIucHJvcHMucGxheWluZyk7XG5cbiAgICAgICAgICBfdGhpczIuZGFzaC5vbignZXJyb3InLCBfdGhpczIucHJvcHMub25FcnJvcik7XG5cbiAgICAgICAgICBpZiAocGFyc2VJbnQoZGFzaFZlcnNpb24pIDwgMykge1xuICAgICAgICAgICAgX3RoaXMyLmRhc2guZ2V0RGVidWcoKS5zZXRMb2dUb0Jyb3dzZXJDb25zb2xlKGZhbHNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMyLmRhc2gudXBkYXRlU2V0dGluZ3Moe1xuICAgICAgICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBkYXNoanMuRGVidWcuTE9HX0xFVkVMX05PTkVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMyLnByb3BzLm9uTG9hZGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG91bGRVc2VGTFYodXJsKSkge1xuICAgICAgICAoMCwgX3V0aWxzLmdldFNESykoRkxWX1NES19VUkwucmVwbGFjZSgnVkVSU0lPTicsIGZsdlZlcnNpb24pLCBGTFZfR0xPQkFMKS50aGVuKGZ1bmN0aW9uIChmbHZqcykge1xuICAgICAgICAgIF90aGlzMi5mbHYgPSBmbHZqcy5jcmVhdGVQbGF5ZXIoe1xuICAgICAgICAgICAgdHlwZTogJ2ZsdicsXG4gICAgICAgICAgICB1cmw6IHVybFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMyLmZsdi5hdHRhY2hNZWRpYUVsZW1lbnQoX3RoaXMyLnBsYXllcik7XG5cbiAgICAgICAgICBfdGhpczIuZmx2Lm9uKGZsdmpzLkV2ZW50cy5FUlJPUiwgZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgICAgIF90aGlzMi5wcm9wcy5vbkVycm9yKGUsIGRhdGEsIF90aGlzMi5mbHYsIGZsdmpzKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMi5mbHYubG9hZCgpO1xuXG4gICAgICAgICAgX3RoaXMyLnByb3BzLm9uTG9hZGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodXJsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIG5ldyB1cmxzICg8c291cmNlPikgb24gYW4gYWxyZWFkeSBsb2FkZWQgdmlkZW8sXG4gICAgICAgIC8vIEhUTUxNZWRpYUVsZW1lbnQubG9hZCgpIGlzIG5lZWRlZCB0byByZXNldCB0aGUgbWVkaWEgZWxlbWVudFxuICAgICAgICAvLyBhbmQgcmVzdGFydCB0aGUgbWVkaWEgcmVzb3VyY2UuIEp1c3QgcmVwbGFjaW5nIGNoaWxkcmVuIHNvdXJjZVxuICAgICAgICAvLyBkb20gbm9kZXMgaXMgbm90IGVub3VnaFxuICAgICAgICB0aGlzLnBsYXllci5sb2FkKCk7XG4gICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbHMuaXNNZWRpYVN0cmVhbSkodXJsKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucGxheWVyLnNyY09iamVjdCA9IHVybDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMucGxheWVyLnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdmFyIHByb21pc2UgPSB0aGlzLnBsYXllci5wbGF5KCk7XG5cbiAgICAgIGlmIChwcm9taXNlKSB7XG4gICAgICAgIHByb21pc2VbXCJjYXRjaFwiXSh0aGlzLnByb3BzLm9uRXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMucGxheWVyLnBhdXNlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHRoaXMucGxheWVyLnJlbW92ZUF0dHJpYnV0ZSgnc3JjJyk7XG5cbiAgICAgIGlmICh0aGlzLmRhc2gpIHtcbiAgICAgICAgdGhpcy5kYXNoLnJlc2V0KCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlZWtUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZWVrVG8oc2Vjb25kcykge1xuICAgICAgdGhpcy5wbGF5ZXIuY3VycmVudFRpbWUgPSBzZWNvbmRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGZyYWN0aW9uKSB7XG4gICAgICB0aGlzLnBsYXllci52b2x1bWUgPSBmcmFjdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5hYmxlUElQXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZVBJUCgpIHtcbiAgICAgIGlmICh0aGlzLnBsYXllci5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSAmJiBkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudCAhPT0gdGhpcy5wbGF5ZXIpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIucmVxdWVzdFBpY3R1cmVJblBpY3R1cmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoKDAsIF91dGlscy5zdXBwb3J0c1dlYktpdFByZXNlbnRhdGlvbk1vZGUpKHRoaXMucGxheWVyKSAmJiB0aGlzLnBsYXllci53ZWJraXRQcmVzZW50YXRpb25Nb2RlICE9PSAncGljdHVyZS1pbi1waWN0dXJlJykge1xuICAgICAgICB0aGlzLnBsYXllci53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlKCdwaWN0dXJlLWluLXBpY3R1cmUnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzYWJsZVBJUFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlUElQKCkge1xuICAgICAgaWYgKGRvY3VtZW50LmV4aXRQaWN0dXJlSW5QaWN0dXJlICYmIGRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbGVtZW50ID09PSB0aGlzLnBsYXllcikge1xuICAgICAgICBkb2N1bWVudC5leGl0UGljdHVyZUluUGljdHVyZSgpO1xuICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWxzLnN1cHBvcnRzV2ViS2l0UHJlc2VudGF0aW9uTW9kZSkodGhpcy5wbGF5ZXIpICYmIHRoaXMucGxheWVyLndlYmtpdFByZXNlbnRhdGlvbk1vZGUgIT09ICdpbmxpbmUnKSB7XG4gICAgICAgIHRoaXMucGxheWVyLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUoJ2lubGluZScpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRQbGF5YmFja1JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UGxheWJhY2tSYXRlKHJhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMucGxheWVyLnBsYXliYWNrUmF0ZSA9IHJhdGU7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnByb3BzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5wbGF5ZXIpIHJldHVybiBudWxsO1xuICAgICAgdmFyIF90aGlzJHBsYXllciA9IHRoaXMucGxheWVyLFxuICAgICAgICAgIGR1cmF0aW9uID0gX3RoaXMkcGxheWVyLmR1cmF0aW9uLFxuICAgICAgICAgIHNlZWthYmxlID0gX3RoaXMkcGxheWVyLnNlZWthYmxlOyAvLyBvbiBpT1MsIGxpdmUgc3RyZWFtcyByZXR1cm4gSW5maW5pdHkgZm9yIHRoZSBkdXJhdGlvblxuICAgICAgLy8gc28gaW5zdGVhZCB3ZSB1c2UgdGhlIGVuZCBvZiB0aGUgc2Vla2FibGUgdGltZXJhbmdlXG5cbiAgICAgIGlmIChkdXJhdGlvbiA9PT0gSW5maW5pdHkgJiYgc2Vla2FibGUubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gc2Vla2FibGUuZW5kKHNlZWthYmxlLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZHVyYXRpb247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEN1cnJlbnRUaW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lKCkge1xuICAgICAgaWYgKCF0aGlzLnBsYXllcikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuY3VycmVudFRpbWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNlY29uZHNMb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2Vjb25kc0xvYWRlZCgpIHtcbiAgICAgIGlmICghdGhpcy5wbGF5ZXIpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGJ1ZmZlcmVkID0gdGhpcy5wbGF5ZXIuYnVmZmVyZWQ7XG5cbiAgICAgIGlmIChidWZmZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbmQgPSBidWZmZXJlZC5lbmQoYnVmZmVyZWQubGVuZ3RoIC0gMSk7XG4gICAgICB2YXIgZHVyYXRpb24gPSB0aGlzLmdldER1cmF0aW9uKCk7XG5cbiAgICAgIGlmIChlbmQgPiBkdXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbmQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNvdXJjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTb3VyY2UodXJsKSB7XG4gICAgICB2YXIgdXNlSExTID0gdGhpcy5zaG91bGRVc2VITFModXJsKTtcbiAgICAgIHZhciB1c2VEQVNIID0gdGhpcy5zaG91bGRVc2VEQVNIKHVybCk7XG4gICAgICB2YXIgdXNlRkxWID0gdGhpcy5zaG91bGRVc2VGTFYodXJsKTtcblxuICAgICAgaWYgKHVybCBpbnN0YW5jZW9mIEFycmF5IHx8ICgwLCBfdXRpbHMuaXNNZWRpYVN0cmVhbSkodXJsKSB8fCB1c2VITFMgfHwgdXNlREFTSCB8fCB1c2VGTFYpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKE1BVENIX0RST1BCT1hfVVJMLnRlc3QodXJsKSkge1xuICAgICAgICByZXR1cm4gdXJsLnJlcGxhY2UoJ3d3dy5kcm9wYm94LmNvbScsICdkbC5kcm9wYm94dXNlcmNvbnRlbnQuY29tJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMxMSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdXJsID0gX3RoaXMkcHJvcHMxMS51cmwsXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzMTEucGxheWluZyxcbiAgICAgICAgICBsb29wID0gX3RoaXMkcHJvcHMxMS5sb29wLFxuICAgICAgICAgIGNvbnRyb2xzID0gX3RoaXMkcHJvcHMxMS5jb250cm9scyxcbiAgICAgICAgICBtdXRlZCA9IF90aGlzJHByb3BzMTEubXV0ZWQsXG4gICAgICAgICAgY29uZmlnID0gX3RoaXMkcHJvcHMxMS5jb25maWcsXG4gICAgICAgICAgd2lkdGggPSBfdGhpcyRwcm9wczExLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzMTEuaGVpZ2h0O1xuICAgICAgdmFyIHVzZUF1ZGlvID0gdGhpcy5zaG91bGRVc2VBdWRpbyh0aGlzLnByb3BzKTtcbiAgICAgIHZhciBFbGVtZW50ID0gdXNlQXVkaW8gPyAnYXVkaW8nIDogJ3ZpZGVvJztcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6IHdpZHRoID09PSAnYXV0bycgPyB3aWR0aCA6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgPT09ICdhdXRvJyA/IGhlaWdodCA6ICcxMDAlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIF9leHRlbmRzKHtcbiAgICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgICAgc3JjOiB0aGlzLmdldFNvdXJjZSh1cmwpLFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIHByZWxvYWQ6IFwiYXV0b1wiLFxuICAgICAgICBhdXRvUGxheTogcGxheWluZyB8fCB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRyb2xzOiBjb250cm9scyxcbiAgICAgICAgbXV0ZWQ6IG11dGVkLFxuICAgICAgICBsb29wOiBsb29wXG4gICAgICB9LCBjb25maWcuYXR0cmlidXRlcyksIHVybCBpbnN0YW5jZW9mIEFycmF5ICYmIHVybC5tYXAodGhpcy5yZW5kZXJTb3VyY2VFbGVtZW50KSwgY29uZmlnLnRyYWNrcy5tYXAodGhpcy5yZW5kZXJUcmFjaykpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGaWxlUGxheWVyO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBGaWxlUGxheWVyO1xuXG5fZGVmaW5lUHJvcGVydHkoRmlsZVBsYXllciwgXCJkaXNwbGF5TmFtZVwiLCAnRmlsZVBsYXllcicpO1xuXG5fZGVmaW5lUHJvcGVydHkoRmlsZVBsYXllciwgXCJjYW5QbGF5XCIsIF9wYXR0ZXJucy5jYW5QbGF5LmZpbGUpOyIsICJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuXG52YXIgX3BhdHRlcm5zID0gcmVxdWlyZShcIi4uL3BhdHRlcm5zXCIpO1xuXG52YXIgX2RlZmF1bHQgPSBbe1xuICBrZXk6ICd5b3V0dWJlJyxcbiAgbmFtZTogJ1lvdVR1YmUnLFxuICBjYW5QbGF5OiBfcGF0dGVybnMuY2FuUGxheS55b3V0dWJlLFxuICBsYXp5UGxheWVyOiAvKiNfX1BVUkVfXyovKDAsIF9yZWFjdC5sYXp5KShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGltcG9ydChcbiAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiAncmVhY3RQbGF5ZXJZb3VUdWJlJyAqL1xuICAgICcuL1lvdVR1YmUnKTtcbiAgfSlcbn0sIHtcbiAga2V5OiAnc291bmRjbG91ZCcsXG4gIG5hbWU6ICdTb3VuZENsb3VkJyxcbiAgY2FuUGxheTogX3BhdHRlcm5zLmNhblBsYXkuc291bmRjbG91ZCxcbiAgbGF6eVBsYXllcjogLyojX19QVVJFX18qLygwLCBfcmVhY3QubGF6eSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpbXBvcnQoXG4gICAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyU291bmRDbG91ZCcgKi9cbiAgICAnLi9Tb3VuZENsb3VkJyk7XG4gIH0pXG59LCB7XG4gIGtleTogJ3ZpbWVvJyxcbiAgbmFtZTogJ1ZpbWVvJyxcbiAgY2FuUGxheTogX3BhdHRlcm5zLmNhblBsYXkudmltZW8sXG4gIGxhenlQbGF5ZXI6IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8qIHdlYnBhY2tDaHVua05hbWU6ICdyZWFjdFBsYXllclZpbWVvJyAqL1xuICAgICcuL1ZpbWVvJyk7XG4gIH0pXG59LCB7XG4gIGtleTogJ2ZhY2Vib29rJyxcbiAgbmFtZTogJ0ZhY2Vib29rJyxcbiAgY2FuUGxheTogX3BhdHRlcm5zLmNhblBsYXkuZmFjZWJvb2ssXG4gIGxhenlQbGF5ZXI6IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8qIHdlYnBhY2tDaHVua05hbWU6ICdyZWFjdFBsYXllckZhY2Vib29rJyAqL1xuICAgICcuL0ZhY2Vib29rJyk7XG4gIH0pXG59LCB7XG4gIGtleTogJ3N0cmVhbWFibGUnLFxuICBuYW1lOiAnU3RyZWFtYWJsZScsXG4gIGNhblBsYXk6IF9wYXR0ZXJucy5jYW5QbGF5LnN0cmVhbWFibGUsXG4gIGxhenlQbGF5ZXI6IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8qIHdlYnBhY2tDaHVua05hbWU6ICdyZWFjdFBsYXllclN0cmVhbWFibGUnICovXG4gICAgJy4vU3RyZWFtYWJsZScpO1xuICB9KVxufSwge1xuICBrZXk6ICd3aXN0aWEnLFxuICBuYW1lOiAnV2lzdGlhJyxcbiAgY2FuUGxheTogX3BhdHRlcm5zLmNhblBsYXkud2lzdGlhLFxuICBsYXp5UGxheWVyOiAvKiNfX1BVUkVfXyovKDAsIF9yZWFjdC5sYXp5KShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGltcG9ydChcbiAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiAncmVhY3RQbGF5ZXJXaXN0aWEnICovXG4gICAgJy4vV2lzdGlhJyk7XG4gIH0pXG59LCB7XG4gIGtleTogJ3R3aXRjaCcsXG4gIG5hbWU6ICdUd2l0Y2gnLFxuICBjYW5QbGF5OiBfcGF0dGVybnMuY2FuUGxheS50d2l0Y2gsXG4gIGxhenlQbGF5ZXI6IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8qIHdlYnBhY2tDaHVua05hbWU6ICdyZWFjdFBsYXllclR3aXRjaCcgKi9cbiAgICAnLi9Ud2l0Y2gnKTtcbiAgfSlcbn0sIHtcbiAga2V5OiAnZGFpbHltb3Rpb24nLFxuICBuYW1lOiAnRGFpbHlNb3Rpb24nLFxuICBjYW5QbGF5OiBfcGF0dGVybnMuY2FuUGxheS5kYWlseW1vdGlvbixcbiAgbGF6eVBsYXllcjogLyojX19QVVJFX18qLygwLCBfcmVhY3QubGF6eSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpbXBvcnQoXG4gICAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyRGFpbHlNb3Rpb24nICovXG4gICAgJy4vRGFpbHlNb3Rpb24nKTtcbiAgfSlcbn0sIHtcbiAga2V5OiAnbWl4Y2xvdWQnLFxuICBuYW1lOiAnTWl4Y2xvdWQnLFxuICBjYW5QbGF5OiBfcGF0dGVybnMuY2FuUGxheS5taXhjbG91ZCxcbiAgbGF6eVBsYXllcjogLyojX19QVVJFX18qLygwLCBfcmVhY3QubGF6eSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpbXBvcnQoXG4gICAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyTWl4Y2xvdWQnICovXG4gICAgJy4vTWl4Y2xvdWQnKTtcbiAgfSlcbn0sIHtcbiAga2V5OiAndmlkeWFyZCcsXG4gIG5hbWU6ICdWaWR5YXJkJyxcbiAgY2FuUGxheTogX3BhdHRlcm5zLmNhblBsYXkudmlkeWFyZCxcbiAgbGF6eVBsYXllcjogLyojX19QVVJFX18qLygwLCBfcmVhY3QubGF6eSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpbXBvcnQoXG4gICAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyVmlkeWFyZCcgKi9cbiAgICAnLi9WaWR5YXJkJyk7XG4gIH0pXG59LCB7XG4gIGtleTogJ2thbHR1cmEnLFxuICBuYW1lOiAnS2FsdHVyYScsXG4gIGNhblBsYXk6IF9wYXR0ZXJucy5jYW5QbGF5LmthbHR1cmEsXG4gIGxhenlQbGF5ZXI6IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8qIHdlYnBhY2tDaHVua05hbWU6ICdyZWFjdFBsYXllckthbHR1cmEnICovXG4gICAgJy4vS2FsdHVyYScpO1xuICB9KVxufSwge1xuICBrZXk6ICdmaWxlJyxcbiAgbmFtZTogJ0ZpbGVQbGF5ZXInLFxuICBjYW5QbGF5OiBfcGF0dGVybnMuY2FuUGxheS5maWxlLFxuICBjYW5FbmFibGVQSVA6IGZ1bmN0aW9uIGNhbkVuYWJsZVBJUCh1cmwpIHtcbiAgICByZXR1cm4gX3BhdHRlcm5zLmNhblBsYXkuZmlsZSh1cmwpICYmIChkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRW5hYmxlZCB8fCAoMCwgX3V0aWxzLnN1cHBvcnRzV2ViS2l0UHJlc2VudGF0aW9uTW9kZSkoKSkgJiYgIV9wYXR0ZXJucy5BVURJT19FWFRFTlNJT05TLnRlc3QodXJsKTtcbiAgfSxcbiAgbGF6eVBsYXllcjogLyojX19QVVJFX18qLygwLCBfcmVhY3QubGF6eSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpbXBvcnQoXG4gICAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyRmlsZVBsYXllcicgKi9cbiAgICAnLi9GaWxlUGxheWVyJyk7XG4gIH0pXG59XTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHNhZmVJc05hTiA9IE51bWJlci5pc05hTiB8fFxuICAgIGZ1bmN0aW9uIHBvbnlmaWxsKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSB2YWx1ZTtcbiAgICB9O1xuZnVuY3Rpb24gaXNFcXVhbChmaXJzdCwgc2Vjb25kKSB7XG4gICAgaWYgKGZpcnN0ID09PSBzZWNvbmQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzYWZlSXNOYU4oZmlyc3QpICYmIHNhZmVJc05hTihzZWNvbmQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBhcmVJbnB1dHNFcXVhbChuZXdJbnB1dHMsIGxhc3RJbnB1dHMpIHtcbiAgICBpZiAobmV3SW5wdXRzLmxlbmd0aCAhPT0gbGFzdElucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0lucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWlzRXF1YWwobmV3SW5wdXRzW2ldLCBsYXN0SW5wdXRzW2ldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtZW1vaXplT25lKHJlc3VsdEZuLCBpc0VxdWFsKSB7XG4gICAgaWYgKGlzRXF1YWwgPT09IHZvaWQgMCkgeyBpc0VxdWFsID0gYXJlSW5wdXRzRXF1YWw7IH1cbiAgICB2YXIgbGFzdFRoaXM7XG4gICAgdmFyIGxhc3RBcmdzID0gW107XG4gICAgdmFyIGxhc3RSZXN1bHQ7XG4gICAgdmFyIGNhbGxlZE9uY2UgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBtZW1vaXplZCgpIHtcbiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG5ld0FyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsbGVkT25jZSAmJiBsYXN0VGhpcyA9PT0gdGhpcyAmJiBpc0VxdWFsKG5ld0FyZ3MsIGxhc3RBcmdzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFJlc3VsdCA9IHJlc3VsdEZuLmFwcGx5KHRoaXMsIG5ld0FyZ3MpO1xuICAgICAgICBjYWxsZWRPbmNlID0gdHJ1ZTtcbiAgICAgICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgICAgICBsYXN0QXJncyA9IG5ld0FyZ3M7XG4gICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZU9uZTtcbiIsICIvKiBnbG9iYWwgTWFwOnJlYWRvbmx5LCBTZXQ6cmVhZG9ubHksIEFycmF5QnVmZmVyOnJlYWRvbmx5ICovXG5cbnZhciBoYXNFbGVtZW50VHlwZSA9IHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJztcbnZhciBoYXNNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nO1xudmFyIGhhc1NldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbic7XG52YXIgaGFzQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgISFBcnJheUJ1ZmZlci5pc1ZpZXc7XG5cbi8vIE5vdGU6IFdlICoqZG9uJ3QqKiBuZWVkIGBlbnZIYXNCaWdJbnQ2NEFycmF5YCBpbiBmZGUgZXM2L2luZGV4LmpzXG5cbmZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgLy8gU1RBUlQ6IGZhc3QtZGVlcC1lcXVhbCBlczYvaW5kZXguanMgMy4xLjFcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFNUQVJUOiBNb2RpZmljYXRpb25zOlxuICAgIC8vIDEuIEV4dHJhIGBoYXM8VHlwZT4gJiZgIGhlbHBlcnMgaW4gaW5pdGlhbCBjb25kaXRpb24gYWxsb3cgZXM2IGNvZGVcbiAgICAvLyAgICB0byBjby1leGlzdCB3aXRoIGVzNS5cbiAgICAvLyAyLiBSZXBsYWNlIGBmb3Igb2ZgIHdpdGggZXM1IGNvbXBsaWFudCBpdGVyYXRpb24gdXNpbmcgYGZvcmAuXG4gICAgLy8gICAgQmFzaWNhbGx5LCB0YWtlOlxuICAgIC8vXG4gICAgLy8gICAgYGBganNcbiAgICAvLyAgICBmb3IgKGkgb2YgYS5lbnRyaWVzKCkpXG4gICAgLy8gICAgICBpZiAoIWIuaGFzKGlbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgYGBgXG4gICAgLy9cbiAgICAvLyAgICAuLi4gYW5kIGNvbnZlcnQgdG86XG4gICAgLy9cbiAgICAvLyAgICBgYGBqc1xuICAgIC8vICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgLy8gICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAvLyAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICBgYGBcbiAgICAvL1xuICAgIC8vICAgICoqTm90ZSoqOiBgaWAgYWNjZXNzIHN3aXRjaGVzIHRvIGBpLnZhbHVlYC5cbiAgICB2YXIgaXQ7XG4gICAgaWYgKGhhc01hcCAmJiAoYSBpbnN0YW5jZW9mIE1hcCkgJiYgKGIgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFlcXVhbChpLnZhbHVlWzFdLCBiLmdldChpLnZhbHVlWzBdKSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChoYXNTZXQgJiYgKGEgaW5zdGFuY2VvZiBTZXQpICYmIChiIGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIEVORDogTW9kaWZpY2F0aW9uc1xuXG4gICAgaWYgKGhhc0FycmF5QnVmZmVyICYmIEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYikpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGEuY29uc3RydWN0b3IgPT09IFJlZ0V4cCkgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICAgIGlmIChhLnZhbHVlT2YgIT09IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZikgcmV0dXJuIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTtcbiAgICBpZiAoYS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykgcmV0dXJuIGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBFTkQ6IGZhc3QtZGVlcC1lcXVhbFxuXG4gICAgLy8gU1RBUlQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuICAgIC8vIGN1c3RvbSBoYW5kbGluZyBmb3IgRE9NIGVsZW1lbnRzXG4gICAgaWYgKGhhc0VsZW1lbnRUeXBlICYmIGEgaW5zdGFuY2VvZiBFbGVtZW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIFJlYWN0L1ByZWFjdFxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgaWYgKChrZXlzW2ldID09PSAnX293bmVyJyB8fCBrZXlzW2ldID09PSAnX192JyB8fCBrZXlzW2ldID09PSAnX19vJykgJiYgYS4kJHR5cGVvZikge1xuICAgICAgICAvLyBSZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBSZWFjdCBlbGVtZW50cycgX293bmVyXG4gICAgICAgIC8vIFByZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBQcmVhY3QgZWxlbWVudHMnIF9fdiBhbmQgX19vXG4gICAgICAgIC8vICAgIF9fdiA9ICRfb3JpZ2luYWwgLyAkX3Zub2RlXG4gICAgICAgIC8vICAgIF9fbyA9ICRfb3duZXJcbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBjb250YWluIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIGFyZSBub3QgbmVlZGVkIHdoZW5cbiAgICAgICAgLy8gY29tcGFyaW5nIHRoZSBhY3R1YWwgZWxlbWVudHMgKGFuZCBub3QgdGhlaXIgb3duZXJzKVxuICAgICAgICAvLyAuJCR0eXBlb2YgYW5kIC5fc3RvcmUgb24ganVzdCByZWFzb25hYmxlIG1hcmtlcnMgb2YgZWxlbWVudHNcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWxsIG90aGVyIHByb3BlcnRpZXMgc2hvdWxkIGJlIHRyYXZlcnNlZCBhcyB1c3VhbFxuICAgICAgaWYgKCFlcXVhbChhW2tleXNbaV1dLCBiW2tleXNbaV1dKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBFTkQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuXG4gICAgLy8gU1RBUlQ6IGZhc3QtZGVlcC1lcXVhbFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbn1cbi8vIGVuZCBmYXN0LWRlZXAtZXF1YWxcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXF1YWwoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCgoZXJyb3IubWVzc2FnZSB8fCAnJykubWF0Y2goL3N0YWNrfHJlY3Vyc2lvbi9pKSkpIHtcbiAgICAgIC8vIHdhcm4gb24gY2lyY3VsYXIgcmVmZXJlbmNlcywgZG9uJ3QgY3Jhc2hcbiAgICAgIC8vIGJyb3dzZXJzIGdpdmUgdGhpcyBkaWZmZXJlbnQgZXJyb3JzIG5hbWUgYW5kIG1lc3NhZ2VzOlxuICAgICAgLy8gY2hyb21lL3NhZmFyaTogXCJSYW5nZUVycm9yXCIsIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIlxuICAgICAgLy8gZmlyZWZveDogXCJJbnRlcm5hbEVycm9yXCIsIHRvbyBtdWNoIHJlY3Vyc2lvblwiXG4gICAgICAvLyBlZGdlOiBcIkVycm9yXCIsIFwiT3V0IG9mIHN0YWNrIHNwYWNlXCJcbiAgICAgIGNvbnNvbGUud2FybigncmVhY3QtZmFzdC1jb21wYXJlIGNhbm5vdCBoYW5kbGUgY2lyY3VsYXIgcmVmcycpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBzb21lIG90aGVyIGVycm9yLiB3ZSBzaG91bGQgZGVmaW5pdGVseSBrbm93IGFib3V0IHRoZXNlXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLCAiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgYj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLGM9Yj9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMyxkPWI/U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTo2MDEwNixlPWI/U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpOjYwMTA3LGY9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik6NjAxMDgsZz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTo2MDExNCxoPWI/U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpOjYwMTA5LGs9Yj9TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTo2MDExMCxsPWI/U3ltYm9sLmZvcihcInJlYWN0LmFzeW5jX21vZGVcIik6NjAxMTEsbT1iP1N5bWJvbC5mb3IoXCJyZWFjdC5jb25jdXJyZW50X21vZGVcIik6NjAxMTEsbj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTo2MDExMixwPWI/U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpOjYwMTEzLHE9Yj9cblN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpOjYwMTIwLHI9Yj9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSx0PWI/U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik6NjAxMTYsdj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5ibG9ja1wiKTo2MDEyMSx3PWI/U3ltYm9sLmZvcihcInJlYWN0LmZ1bmRhbWVudGFsXCIpOjYwMTE3LHg9Yj9TeW1ib2wuZm9yKFwicmVhY3QucmVzcG9uZGVyXCIpOjYwMTE4LHk9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc2NvcGVcIik6NjAxMTk7XG5mdW5jdGlvbiB6KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciB1PWEuJCR0eXBlb2Y7c3dpdGNoKHUpe2Nhc2UgYzpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBsOmNhc2UgbTpjYXNlIGU6Y2FzZSBnOmNhc2UgZjpjYXNlIHA6cmV0dXJuIGE7ZGVmYXVsdDpzd2l0Y2goYT1hJiZhLiQkdHlwZW9mLGEpe2Nhc2UgazpjYXNlIG46Y2FzZSB0OmNhc2UgcjpjYXNlIGg6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gdX19Y2FzZSBkOnJldHVybiB1fX19ZnVuY3Rpb24gQShhKXtyZXR1cm4geihhKT09PW19ZXhwb3J0cy5Bc3luY01vZGU9bDtleHBvcnRzLkNvbmN1cnJlbnRNb2RlPW07ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aztleHBvcnRzLkNvbnRleHRQcm92aWRlcj1oO2V4cG9ydHMuRWxlbWVudD1jO2V4cG9ydHMuRm9yd2FyZFJlZj1uO2V4cG9ydHMuRnJhZ21lbnQ9ZTtleHBvcnRzLkxhenk9dDtleHBvcnRzLk1lbW89cjtleHBvcnRzLlBvcnRhbD1kO1xuZXhwb3J0cy5Qcm9maWxlcj1nO2V4cG9ydHMuU3RyaWN0TW9kZT1mO2V4cG9ydHMuU3VzcGVuc2U9cDtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBBKGEpfHx6KGEpPT09bH07ZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlPUE7ZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lcj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWt9O2V4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ofTtleHBvcnRzLmlzRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09Y307ZXhwb3J0cy5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ufTtleHBvcnRzLmlzRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1lfTtleHBvcnRzLmlzTGF6eT1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PXR9O1xuZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1yfTtleHBvcnRzLmlzUG9ydGFsPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09ZH07ZXhwb3J0cy5pc1Byb2ZpbGVyPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09Z307ZXhwb3J0cy5pc1N0cmljdE1vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1mfTtleHBvcnRzLmlzU3VzcGVuc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1wfTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1lfHxhPT09bXx8YT09PWd8fGE9PT1mfHxhPT09cHx8YT09PXF8fFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJihhLiQkdHlwZW9mPT09dHx8YS4kJHR5cGVvZj09PXJ8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09a3x8YS4kJHR5cGVvZj09PW58fGEuJCR0eXBlb2Y9PT13fHxhLiQkdHlwZW9mPT09eHx8YS4kJHR5cGVvZj09PXl8fGEuJCR0eXBlb2Y9PT12KX07ZXhwb3J0cy50eXBlT2Y9ejtcbiIsICIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsICIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwgIm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB2YXIgaGFzID0gcmVxdWlyZSgnLi9saWIvaGFzJyk7XG5cbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHsgLyoqLyB9XG4gIH07XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKFxuICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgICAgICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICtcbiAgICAgICAgICAgICAgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICBsb2NhdGlvbiArICcgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgKyB0eXBlb2YgZXJyb3IgKyAnLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgKHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldHMgd2FybmluZyBjYWNoZSB3aGVuIHRlc3RpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vbGliL2hhcycpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgnLi9jaGVja1Byb3BUeXBlcycpO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICAgKlxuICAgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAgICpcbiAgICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAgICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAgICogICAgICAgLi4uXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gICAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gICAqXG4gICAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAgICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAgICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAgICpcbiAgICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICAgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICAgKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gICAqICAgICB9LFxuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICAgKlxuICAgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAgICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gICAqXG4gICAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAgICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICAgKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICAgKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gICAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgKiAgICAgICAgICApO1xuICAgKiAgICAgICAgfVxuICAgKiAgICAgIH1cbiAgICogICAgfSxcbiAgICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gICAqICB9KTtcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gICAgYmlnaW50OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYmlnaW50JyksXG4gICAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICAgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gICAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gICAgZWxlbWVudFR5cGU6IGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSxcbiAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIsXG4gICAgZXhhY3Q6IGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAqL1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSovXG4gIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gICAgfVxuICB9XG4gIC8qZXNsaW50LWVuYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuXG4gIC8qKlxuICAgKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsXG4gICAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIsIHdlIGRvbid0IHVzZSByZWFsXG4gICAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW1cbiAgICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdFxuICAgKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuXG4gICAqL1xuICBmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuZGF0YSA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YToge307XG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG4gIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cbiAgUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPSAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgICAgaWYgKHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgICAgICAgICAvLyBOZXcgYmVoYXZpb3Igb25seSBmb3IgdXNlcnMgb2YgYHByb3AtdHlwZXNgIHBhY2thZ2VcbiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgJ1VzZSBgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKClgIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAgICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICAgICAgICApO1xuICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE9sZCBiZWhhdmlvciBmb3IgcGVvcGxlIHVzaW5nIFJlYWN0LlByb3BUeXBlc1xuICAgICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldICYmXG4gICAgICAgICAgICAvLyBBdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZSBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIG5vdCBhY3Rpb25hYmxlIGV4Y2VwdCBmb3IgbGliIGF1dGhvcnNcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50IDwgM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgICAnWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gJyArXG4gICAgICAgICAgICAgICdmdW5jdGlvbiBmb3IgdGhlIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgcHJvcCBvbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgK1xuICAgICAgICAgICAgICAnYW5kIHdpbGwgdGhyb3cgaW4gdGhlIHN0YW5kYWxvbmUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgICAnWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAnICtcbiAgICAgICAgICAgICAgJ2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyAnICsgJ2ZvciBkZXRhaWxzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhblxuICAgICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJyksXG4gICAgICAgICAge2V4cGVjdGVkVHlwZTogZXhwZWN0ZWRUeXBlfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBhcnJheS4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycgKyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIVJlYWN0SXMuaXNWYWxpZEVsZW1lbnRUeXBlKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50IHR5cGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICAgIHZhciBleHBlY3RlZENsYXNzTmFtZSA9IGV4cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgYWN0dWFsQ2xhc3NOYW1lICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdpbnN0YW5jZSBvZiBgJyArIGV4cGVjdGVkQ2xhc3NOYW1lICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LCBnb3QgJyArIGFyZ3VtZW50cy5sZW5ndGggKyAnIGFyZ3VtZW50cy4gJyArXG4gICAgICAgICAgICAnQSBjb21tb24gbWlzdGFrZSBpcyB0byB3cml0ZSBvbmVPZih4LCB5LCB6KSBpbnN0ZWFkIG9mIG9uZU9mKFt4LCB5LCB6XSkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMsIGZ1bmN0aW9uIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIFN0cmluZyhwcm9wVmFsdWUpICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBvZiAnICsgdmFsdWVzU3RyaW5nICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIG9iamVjdC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7XG4gICAgICAgIGlmIChoYXMocHJvcFZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVVbmlvblR5cGVDaGVja2VyKGFycmF5T2ZUeXBlQ2hlY2tlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUuIEV4cGVjdGVkIGFuIGFycmF5IG9mIGNoZWNrIGZ1bmN0aW9ucywgYnV0ICcgK1xuICAgICAgICAgICdyZWNlaXZlZCAnICsgZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKGNoZWNrZXIpICsgJyBhdCBpbmRleCAnICsgaSArICcuJ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBleHBlY3RlZFR5cGVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgICB2YXIgY2hlY2tlclJlc3VsdCA9IGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChjaGVja2VyUmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tlclJlc3VsdC5kYXRhICYmIGhhcyhjaGVja2VyUmVzdWx0LmRhdGEsICdleHBlY3RlZFR5cGUnKSkge1xuICAgICAgICAgIGV4cGVjdGVkVHlwZXMucHVzaChjaGVja2VyUmVzdWx0LmRhdGEuZXhwZWN0ZWRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGV4cGVjdGVkVHlwZXNNZXNzYWdlID0gKGV4cGVjdGVkVHlwZXMubGVuZ3RoID4gMCkgPyAnLCBleHBlY3RlZCBvbmUgb2YgdHlwZSBbJyArIGV4cGVjdGVkVHlwZXMuam9pbignLCAnKSArICddJzogJyc7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgJyArIGV4cGVjdGVkVHlwZXNNZXNzYWdlICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghaXNOb2RlKHByb3BzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZhbGlkVmFsaWRhdG9yRXJyb3IoY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwga2V5LCB0eXBlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXkgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGUgKyAnYC4nXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFZhbGlkYXRvckVycm9yKGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIGtleSwgZ2V0UHJlY2lzZVR5cGUoY2hlY2tlcikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWxsIGtleXMgaW4gY2FzZSBzb21lIGFyZSByZXF1aXJlZCBidXQgbWlzc2luZyBmcm9tIHByb3BzLlxuICAgICAgdmFyIGFsbEtleXMgPSBhc3NpZ24oe30sIHByb3BzW3Byb3BOYW1lXSwgc2hhcGVUeXBlcyk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWxsS2V5cykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKGhhcyhzaGFwZVR5cGVzLCBrZXkpICYmIHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGludmFsaWRWYWxpZGF0b3JFcnJvcihjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBrZXksIGdldFByZWNpc2VUeXBlKGNoZWNrZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgICAnSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Aga2V5IGAnICsga2V5ICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJyArXG4gICAgICAgICAgICAnXFxuQmFkIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KHByb3BzW3Byb3BOYW1lXSwgbnVsbCwgJyAgJykgK1xuICAgICAgICAgICAgJ1xcblZhbGlkIGtleXM6ICcgKyBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzaGFwZVR5cGVzKSwgbnVsbCwgJyAgJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gIXByb3BWYWx1ZTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgLy8gTmF0aXZlIFN5bWJvbC5cbiAgICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBmYWxzeSB2YWx1ZSBjYW4ndCBiZSBhIFN5bWJvbFxuICAgIGlmICghcHJvcFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSA9PT0gJ1N5bWJvbCdcbiAgICBpZiAocHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMgd2hpY2ggYXJlIHBvbHlmaWxsZWQuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG4gIGZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkge1xuICAgIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgfVxuICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIE9sZCB3ZWJraXRzIChhdCBsZWFzdCB1bnRpbCBBbmRyb2lkIDQuMCkgcmV0dXJuICdmdW5jdGlvbicgcmF0aGVyIHRoYW5cbiAgICAgIC8vICdvYmplY3QnIGZvciB0eXBlb2YgYSBSZWdFeHAuIFdlJ2xsIG5vcm1hbGl6ZSB0aGlzIGhlcmUgc28gdGhhdCAvYmxhL1xuICAgICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBUaGlzIGhhbmRsZXMgbW9yZSB0eXBlcyB0aGFuIGBnZXRQcm9wVHlwZWAuIE9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gIC8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLlxuICBmdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJycgKyBwcm9wVmFsdWU7XG4gICAgfVxuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiAncmVnZXhwJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHBvc3RmaXhlZCB0byBhIHdhcm5pbmcgYWJvdXQgYW4gaW52YWxpZCB0eXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgXCJ1bmRlZmluZWRcIiBvciBcIm9mIHR5cGUgYXJyYXlcIlxuICBmdW5jdGlvbiBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiAnYW4gJyArIHR5cGU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAncmVnZXhwJzpcbiAgICAgICAgcmV0dXJuICdhICcgKyB0eXBlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QsIGlmIGFueS5cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKHByb3BWYWx1ZSkge1xuICAgIGlmICghcHJvcFZhbHVlLmNvbnN0cnVjdG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgcmV0dXJuIEFOT05ZTU9VUztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbiAgUmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMgPSBjaGVja1Byb3BUeXBlcztcbiAgUmVhY3RQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBjaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZTtcbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHt9XG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uV2l0aFJlc2V0KCkge31cbmVtcHR5RnVuY3Rpb25XaXRoUmVzZXQucmVzZXRXYXJuaW5nQ2FjaGUgPSBlbXB0eUZ1bmN0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBzaGltKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgaWYgKHNlY3JldCA9PT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgIC8vIEl0IGlzIHN0aWxsIHNhZmUgd2hlbiBjYWxsZWQgZnJvbSBSZWFjdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICdVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICk7XG4gICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgdGhyb3cgZXJyO1xuICB9O1xuICBzaGltLmlzUmVxdWlyZWQgPSBzaGltO1xuICBmdW5jdGlvbiBnZXRTaGltKCkge1xuICAgIHJldHVybiBzaGltO1xuICB9O1xuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IHNoaW0sXG4gICAgYmlnaW50OiBzaGltLFxuICAgIGJvb2w6IHNoaW0sXG4gICAgZnVuYzogc2hpbSxcbiAgICBudW1iZXI6IHNoaW0sXG4gICAgb2JqZWN0OiBzaGltLFxuICAgIHN0cmluZzogc2hpbSxcbiAgICBzeW1ib2w6IHNoaW0sXG5cbiAgICBhbnk6IHNoaW0sXG4gICAgYXJyYXlPZjogZ2V0U2hpbSxcbiAgICBlbGVtZW50OiBzaGltLFxuICAgIGVsZW1lbnRUeXBlOiBzaGltLFxuICAgIGluc3RhbmNlT2Y6IGdldFNoaW0sXG4gICAgbm9kZTogc2hpbSxcbiAgICBvYmplY3RPZjogZ2V0U2hpbSxcbiAgICBvbmVPZjogZ2V0U2hpbSxcbiAgICBvbmVPZlR5cGU6IGdldFNoaW0sXG4gICAgc2hhcGU6IGdldFNoaW0sXG4gICAgZXhhY3Q6IGdldFNoaW0sXG5cbiAgICBjaGVja1Byb3BUeXBlczogZW1wdHlGdW5jdGlvbldpdGhSZXNldCxcbiAgICByZXNldFdhcm5pbmdDYWNoZTogZW1wdHlGdW5jdGlvblxuICB9O1xuXG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0UHJvcHMgPSBleHBvcnRzLnByb3BUeXBlcyA9IHZvaWQgMDtcblxudmFyIF9wcm9wVHlwZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbnZhciBzdHJpbmcgPSBfcHJvcFR5cGVzW1wiZGVmYXVsdFwiXS5zdHJpbmcsXG4gICAgYm9vbCA9IF9wcm9wVHlwZXNbXCJkZWZhdWx0XCJdLmJvb2wsXG4gICAgbnVtYmVyID0gX3Byb3BUeXBlc1tcImRlZmF1bHRcIl0ubnVtYmVyLFxuICAgIGFycmF5ID0gX3Byb3BUeXBlc1tcImRlZmF1bHRcIl0uYXJyYXksXG4gICAgb25lT2ZUeXBlID0gX3Byb3BUeXBlc1tcImRlZmF1bHRcIl0ub25lT2ZUeXBlLFxuICAgIHNoYXBlID0gX3Byb3BUeXBlc1tcImRlZmF1bHRcIl0uc2hhcGUsXG4gICAgb2JqZWN0ID0gX3Byb3BUeXBlc1tcImRlZmF1bHRcIl0ub2JqZWN0LFxuICAgIGZ1bmMgPSBfcHJvcFR5cGVzW1wiZGVmYXVsdFwiXS5mdW5jLFxuICAgIG5vZGUgPSBfcHJvcFR5cGVzW1wiZGVmYXVsdFwiXS5ub2RlO1xudmFyIHByb3BUeXBlcyA9IHtcbiAgdXJsOiBvbmVPZlR5cGUoW3N0cmluZywgYXJyYXksIG9iamVjdF0pLFxuICBwbGF5aW5nOiBib29sLFxuICBsb29wOiBib29sLFxuICBjb250cm9sczogYm9vbCxcbiAgdm9sdW1lOiBudW1iZXIsXG4gIG11dGVkOiBib29sLFxuICBwbGF5YmFja1JhdGU6IG51bWJlcixcbiAgd2lkdGg6IG9uZU9mVHlwZShbc3RyaW5nLCBudW1iZXJdKSxcbiAgaGVpZ2h0OiBvbmVPZlR5cGUoW3N0cmluZywgbnVtYmVyXSksXG4gIHN0eWxlOiBvYmplY3QsXG4gIHByb2dyZXNzSW50ZXJ2YWw6IG51bWJlcixcbiAgcGxheXNpbmxpbmU6IGJvb2wsXG4gIHBpcDogYm9vbCxcbiAgc3RvcE9uVW5tb3VudDogYm9vbCxcbiAgbGlnaHQ6IG9uZU9mVHlwZShbYm9vbCwgc3RyaW5nXSksXG4gIHBsYXlJY29uOiBub2RlLFxuICBwcmV2aWV3VGFiSW5kZXg6IG51bWJlcixcbiAgZmFsbGJhY2s6IG5vZGUsXG4gIG9FbWJlZFVybDogc3RyaW5nLFxuICB3cmFwcGVyOiBvbmVPZlR5cGUoW3N0cmluZywgZnVuYywgc2hhcGUoe1xuICAgIHJlbmRlcjogZnVuYy5pc1JlcXVpcmVkXG4gIH0pXSksXG4gIGNvbmZpZzogc2hhcGUoe1xuICAgIHNvdW5kY2xvdWQ6IHNoYXBlKHtcbiAgICAgIG9wdGlvbnM6IG9iamVjdFxuICAgIH0pLFxuICAgIHlvdXR1YmU6IHNoYXBlKHtcbiAgICAgIHBsYXllclZhcnM6IG9iamVjdCxcbiAgICAgIGVtYmVkT3B0aW9uczogb2JqZWN0LFxuICAgICAgb25VbnN0YXJ0ZWQ6IGZ1bmNcbiAgICB9KSxcbiAgICBmYWNlYm9vazogc2hhcGUoe1xuICAgICAgYXBwSWQ6IHN0cmluZyxcbiAgICAgIHZlcnNpb246IHN0cmluZyxcbiAgICAgIHBsYXllcklkOiBzdHJpbmcsXG4gICAgICBhdHRyaWJ1dGVzOiBvYmplY3RcbiAgICB9KSxcbiAgICBkYWlseW1vdGlvbjogc2hhcGUoe1xuICAgICAgcGFyYW1zOiBvYmplY3RcbiAgICB9KSxcbiAgICB2aW1lbzogc2hhcGUoe1xuICAgICAgcGxheWVyT3B0aW9uczogb2JqZWN0LFxuICAgICAgdGl0bGU6IHN0cmluZ1xuICAgIH0pLFxuICAgIGZpbGU6IHNoYXBlKHtcbiAgICAgIGF0dHJpYnV0ZXM6IG9iamVjdCxcbiAgICAgIHRyYWNrczogYXJyYXksXG4gICAgICBmb3JjZVZpZGVvOiBib29sLFxuICAgICAgZm9yY2VBdWRpbzogYm9vbCxcbiAgICAgIGZvcmNlSExTOiBib29sLFxuICAgICAgZm9yY2VEQVNIOiBib29sLFxuICAgICAgZm9yY2VGTFY6IGJvb2wsXG4gICAgICBobHNPcHRpb25zOiBvYmplY3QsXG4gICAgICBobHNWZXJzaW9uOiBzdHJpbmcsXG4gICAgICBkYXNoVmVyc2lvbjogc3RyaW5nLFxuICAgICAgZmx2VmVyc2lvbjogc3RyaW5nXG4gICAgfSksXG4gICAgd2lzdGlhOiBzaGFwZSh7XG4gICAgICBvcHRpb25zOiBvYmplY3QsXG4gICAgICBwbGF5ZXJJZDogc3RyaW5nLFxuICAgICAgY3VzdG9tQ29udHJvbHM6IGFycmF5XG4gICAgfSksXG4gICAgbWl4Y2xvdWQ6IHNoYXBlKHtcbiAgICAgIG9wdGlvbnM6IG9iamVjdFxuICAgIH0pLFxuICAgIHR3aXRjaDogc2hhcGUoe1xuICAgICAgb3B0aW9uczogb2JqZWN0LFxuICAgICAgcGxheWVySWQ6IHN0cmluZ1xuICAgIH0pLFxuICAgIHZpZHlhcmQ6IHNoYXBlKHtcbiAgICAgIG9wdGlvbnM6IG9iamVjdFxuICAgIH0pXG4gIH0pLFxuICBvblJlYWR5OiBmdW5jLFxuICBvblN0YXJ0OiBmdW5jLFxuICBvblBsYXk6IGZ1bmMsXG4gIG9uUGF1c2U6IGZ1bmMsXG4gIG9uQnVmZmVyOiBmdW5jLFxuICBvbkJ1ZmZlckVuZDogZnVuYyxcbiAgb25FbmRlZDogZnVuYyxcbiAgb25FcnJvcjogZnVuYyxcbiAgb25EdXJhdGlvbjogZnVuYyxcbiAgb25TZWVrOiBmdW5jLFxuICBvblBsYXliYWNrUmF0ZUNoYW5nZTogZnVuYyxcbiAgb25Qcm9ncmVzczogZnVuYyxcbiAgb25DbGlja1ByZXZpZXc6IGZ1bmMsXG4gIG9uRW5hYmxlUElQOiBmdW5jLFxuICBvbkRpc2FibGVQSVA6IGZ1bmNcbn07XG5leHBvcnRzLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIHBsYXlpbmc6IGZhbHNlLFxuICBsb29wOiBmYWxzZSxcbiAgY29udHJvbHM6IGZhbHNlLFxuICB2b2x1bWU6IG51bGwsXG4gIG11dGVkOiBmYWxzZSxcbiAgcGxheWJhY2tSYXRlOiAxLFxuICB3aWR0aDogJzY0MHB4JyxcbiAgaGVpZ2h0OiAnMzYwcHgnLFxuICBzdHlsZToge30sXG4gIHByb2dyZXNzSW50ZXJ2YWw6IDEwMDAsXG4gIHBsYXlzaW5saW5lOiBmYWxzZSxcbiAgcGlwOiBmYWxzZSxcbiAgc3RvcE9uVW5tb3VudDogdHJ1ZSxcbiAgbGlnaHQ6IGZhbHNlLFxuICBmYWxsYmFjazogbnVsbCxcbiAgd3JhcHBlcjogJ2RpdicsXG4gIHByZXZpZXdUYWJJbmRleDogMCxcbiAgb0VtYmVkVXJsOiAnaHR0cHM6Ly9ub2VtYmVkLmNvbS9lbWJlZD91cmw9e3VybH0nLFxuICBjb25maWc6IHtcbiAgICBzb3VuZGNsb3VkOiB7XG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHZpc3VhbDogdHJ1ZSxcbiAgICAgICAgLy8gVW5kb2N1bWVudGVkLCBidXQgbWFrZXMgcGxheWVyIGZpbGwgY29udGFpbmVyIGFuZCBsb29rIGJldHRlclxuICAgICAgICBidXlpbmc6IGZhbHNlLFxuICAgICAgICBsaWtpbmc6IGZhbHNlLFxuICAgICAgICBkb3dubG9hZDogZmFsc2UsXG4gICAgICAgIHNoYXJpbmc6IGZhbHNlLFxuICAgICAgICBzaG93X2NvbW1lbnRzOiBmYWxzZSxcbiAgICAgICAgc2hvd19wbGF5Y291bnQ6IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICB5b3V0dWJlOiB7XG4gICAgICBwbGF5ZXJWYXJzOiB7XG4gICAgICAgIHBsYXlzaW5saW5lOiAxLFxuICAgICAgICBzaG93aW5mbzogMCxcbiAgICAgICAgcmVsOiAwLFxuICAgICAgICBpdl9sb2FkX3BvbGljeTogMyxcbiAgICAgICAgbW9kZXN0YnJhbmRpbmc6IDFcbiAgICAgIH0sXG4gICAgICBlbWJlZE9wdGlvbnM6IHt9LFxuICAgICAgb25VbnN0YXJ0ZWQ6IG5vb3BcbiAgICB9LFxuICAgIGZhY2Vib29rOiB7XG4gICAgICBhcHBJZDogJzEzMDk2OTcyMDU3NzI4MTknLFxuICAgICAgdmVyc2lvbjogJ3YzLjMnLFxuICAgICAgcGxheWVySWQ6IG51bGwsXG4gICAgICBhdHRyaWJ1dGVzOiB7fVxuICAgIH0sXG4gICAgZGFpbHltb3Rpb246IHtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBhcGk6IDEsXG4gICAgICAgICdlbmRzY3JlZW4tZW5hYmxlJzogZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICAgIHZpbWVvOiB7XG4gICAgICBwbGF5ZXJPcHRpb25zOiB7XG4gICAgICAgIGF1dG9wYXVzZTogZmFsc2UsXG4gICAgICAgIGJ5bGluZTogZmFsc2UsXG4gICAgICAgIHBvcnRyYWl0OiBmYWxzZSxcbiAgICAgICAgdGl0bGU6IGZhbHNlXG4gICAgICB9LFxuICAgICAgdGl0bGU6IG51bGxcbiAgICB9LFxuICAgIGZpbGU6IHtcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgdHJhY2tzOiBbXSxcbiAgICAgIGZvcmNlVmlkZW86IGZhbHNlLFxuICAgICAgZm9yY2VBdWRpbzogZmFsc2UsXG4gICAgICBmb3JjZUhMUzogZmFsc2UsXG4gICAgICBmb3JjZURBU0g6IGZhbHNlLFxuICAgICAgZm9yY2VGTFY6IGZhbHNlLFxuICAgICAgaGxzT3B0aW9uczoge30sXG4gICAgICBobHNWZXJzaW9uOiAnMS4xLjQnLFxuICAgICAgZGFzaFZlcnNpb246ICczLjEuMycsXG4gICAgICBmbHZWZXJzaW9uOiAnMS41LjAnXG4gICAgfSxcbiAgICB3aXN0aWE6IHtcbiAgICAgIG9wdGlvbnM6IHt9LFxuICAgICAgcGxheWVySWQ6IG51bGwsXG4gICAgICBjdXN0b21Db250cm9sczogbnVsbFxuICAgIH0sXG4gICAgbWl4Y2xvdWQ6IHtcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgaGlkZV9jb3ZlcjogMVxuICAgICAgfVxuICAgIH0sXG4gICAgdHdpdGNoOiB7XG4gICAgICBvcHRpb25zOiB7fSxcbiAgICAgIHBsYXllcklkOiBudWxsXG4gICAgfSxcbiAgICB2aWR5YXJkOiB7XG4gICAgICBvcHRpb25zOiB7fVxuICAgIH1cbiAgfSxcbiAgb25SZWFkeTogbm9vcCxcbiAgb25TdGFydDogbm9vcCxcbiAgb25QbGF5OiBub29wLFxuICBvblBhdXNlOiBub29wLFxuICBvbkJ1ZmZlcjogbm9vcCxcbiAgb25CdWZmZXJFbmQ6IG5vb3AsXG4gIG9uRW5kZWQ6IG5vb3AsXG4gIG9uRXJyb3I6IG5vb3AsXG4gIG9uRHVyYXRpb246IG5vb3AsXG4gIG9uU2Vlazogbm9vcCxcbiAgb25QbGF5YmFja1JhdGVDaGFuZ2U6IG5vb3AsXG4gIG9uUHJvZ3Jlc3M6IG5vb3AsXG4gIG9uQ2xpY2tQcmV2aWV3OiBub29wLFxuICBvbkVuYWJsZVBJUDogbm9vcCxcbiAgb25EaXNhYmxlUElQOiBub29wXG59O1xuZXhwb3J0cy5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmVhY3RGYXN0Q29tcGFyZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0LWZhc3QtY29tcGFyZVwiKSk7XG5cbnZhciBfcHJvcHMgPSByZXF1aXJlKFwiLi9wcm9wc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxudmFyIFNFRUtfT05fUExBWV9FWFBJUlkgPSA1MDAwO1xuXG52YXIgUGxheWVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQbGF5ZXIsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUGxheWVyKTtcblxuICBmdW5jdGlvbiBQbGF5ZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYXllcik7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgX2FyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBfYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChfYXJncykpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm1vdW50ZWRcIiwgZmFsc2UpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImlzUmVhZHlcIiwgZmFsc2UpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImlzUGxheWluZ1wiLCBmYWxzZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaXNMb2FkaW5nXCIsIHRydWUpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImxvYWRPblJlYWR5XCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInN0YXJ0T25QbGF5XCIsIHRydWUpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInNlZWtPblBsYXlcIiwgbnVsbCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25EdXJhdGlvbkNhbGxlZFwiLCBmYWxzZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlUGxheWVyTW91bnRcIiwgZnVuY3Rpb24gKHBsYXllcikge1xuICAgICAgaWYgKF90aGlzLnBsYXllcikgcmV0dXJuOyAvLyBQcmV2ZW50IGxvYWRpbmcgdHdpY2UgaW4gc3RyaWN0IG1vZGVcblxuICAgICAgX3RoaXMucGxheWVyID0gcGxheWVyO1xuXG4gICAgICBfdGhpcy5wbGF5ZXIubG9hZChfdGhpcy5wcm9wcy51cmwpO1xuXG4gICAgICBfdGhpcy5wcm9ncmVzcygpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldEludGVybmFsUGxheWVyXCIsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmICghX3RoaXMucGxheWVyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBfdGhpcy5wbGF5ZXJba2V5XTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwcm9ncmVzc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMudXJsICYmIF90aGlzLnBsYXllciAmJiBfdGhpcy5pc1JlYWR5KSB7XG4gICAgICAgIHZhciBwbGF5ZWRTZWNvbmRzID0gX3RoaXMuZ2V0Q3VycmVudFRpbWUoKSB8fCAwO1xuXG4gICAgICAgIHZhciBsb2FkZWRTZWNvbmRzID0gX3RoaXMuZ2V0U2Vjb25kc0xvYWRlZCgpO1xuXG4gICAgICAgIHZhciBkdXJhdGlvbiA9IF90aGlzLmdldER1cmF0aW9uKCk7XG5cbiAgICAgICAgaWYgKGR1cmF0aW9uKSB7XG4gICAgICAgICAgdmFyIHByb2dyZXNzID0ge1xuICAgICAgICAgICAgcGxheWVkU2Vjb25kczogcGxheWVkU2Vjb25kcyxcbiAgICAgICAgICAgIHBsYXllZDogcGxheWVkU2Vjb25kcyAvIGR1cmF0aW9uXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChsb2FkZWRTZWNvbmRzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9ncmVzcy5sb2FkZWRTZWNvbmRzID0gbG9hZGVkU2Vjb25kcztcbiAgICAgICAgICAgIHByb2dyZXNzLmxvYWRlZCA9IGxvYWRlZFNlY29uZHMgLyBkdXJhdGlvbjtcbiAgICAgICAgICB9IC8vIE9ubHkgY2FsbCBvblByb2dyZXNzIGlmIHZhbHVlcyBoYXZlIGNoYW5nZWRcblxuXG4gICAgICAgICAgaWYgKHByb2dyZXNzLnBsYXllZFNlY29uZHMgIT09IF90aGlzLnByZXZQbGF5ZWQgfHwgcHJvZ3Jlc3MubG9hZGVkU2Vjb25kcyAhPT0gX3RoaXMucHJldkxvYWRlZCkge1xuICAgICAgICAgICAgX3RoaXMucHJvcHMub25Qcm9ncmVzcyhwcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMucHJldlBsYXllZCA9IHByb2dyZXNzLnBsYXllZFNlY29uZHM7XG4gICAgICAgICAgX3RoaXMucHJldkxvYWRlZCA9IHByb2dyZXNzLmxvYWRlZFNlY29uZHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMucHJvZ3Jlc3NUaW1lb3V0ID0gc2V0VGltZW91dChfdGhpcy5wcm9ncmVzcywgX3RoaXMucHJvcHMucHJvZ3Jlc3NGcmVxdWVuY3kgfHwgX3RoaXMucHJvcHMucHJvZ3Jlc3NJbnRlcnZhbCk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5tb3VudGVkKSByZXR1cm47XG4gICAgICBfdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcbiAgICAgIF90aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb25SZWFkeSA9IF90aGlzJHByb3BzLm9uUmVhZHksXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzLnBsYXlpbmcsXG4gICAgICAgICAgdm9sdW1lID0gX3RoaXMkcHJvcHMudm9sdW1lLFxuICAgICAgICAgIG11dGVkID0gX3RoaXMkcHJvcHMubXV0ZWQ7XG4gICAgICBvblJlYWR5KCk7XG5cbiAgICAgIGlmICghbXV0ZWQgJiYgdm9sdW1lICE9PSBudWxsKSB7XG4gICAgICAgIF90aGlzLnBsYXllci5zZXRWb2x1bWUodm9sdW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLmxvYWRPblJlYWR5KSB7XG4gICAgICAgIF90aGlzLnBsYXllci5sb2FkKF90aGlzLmxvYWRPblJlYWR5LCB0cnVlKTtcblxuICAgICAgICBfdGhpcy5sb2FkT25SZWFkeSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHBsYXlpbmcpIHtcbiAgICAgICAgX3RoaXMucGxheWVyLnBsYXkoKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuaGFuZGxlRHVyYXRpb25DaGVjaygpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhbmRsZVBsYXlcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgIF90aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uU3RhcnQgPSBfdGhpcyRwcm9wczIub25TdGFydCxcbiAgICAgICAgICBvblBsYXkgPSBfdGhpcyRwcm9wczIub25QbGF5LFxuICAgICAgICAgIHBsYXliYWNrUmF0ZSA9IF90aGlzJHByb3BzMi5wbGF5YmFja1JhdGU7XG5cbiAgICAgIGlmIChfdGhpcy5zdGFydE9uUGxheSkge1xuICAgICAgICBpZiAoX3RoaXMucGxheWVyLnNldFBsYXliYWNrUmF0ZSAmJiBwbGF5YmFja1JhdGUgIT09IDEpIHtcbiAgICAgICAgICBfdGhpcy5wbGF5ZXIuc2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgIF90aGlzLnN0YXJ0T25QbGF5ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIG9uUGxheSgpO1xuXG4gICAgICBpZiAoX3RoaXMuc2Vla09uUGxheSkge1xuICAgICAgICBfdGhpcy5zZWVrVG8oX3RoaXMuc2Vla09uUGxheSk7XG5cbiAgICAgICAgX3RoaXMuc2Vla09uUGxheSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmhhbmRsZUR1cmF0aW9uQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJoYW5kbGVQYXVzZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cbiAgICAgIGlmICghX3RoaXMuaXNMb2FkaW5nKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uUGF1c2UoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlRW5kZWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGFjdGl2ZVBsYXllciA9IF90aGlzJHByb3BzMy5hY3RpdmVQbGF5ZXIsXG4gICAgICAgICAgbG9vcCA9IF90aGlzJHByb3BzMy5sb29wLFxuICAgICAgICAgIG9uRW5kZWQgPSBfdGhpcyRwcm9wczMub25FbmRlZDtcblxuICAgICAgaWYgKGFjdGl2ZVBsYXllci5sb29wT25FbmRlZCAmJiBsb29wKSB7XG4gICAgICAgIF90aGlzLnNlZWtUbygwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFsb29wKSB7XG4gICAgICAgIF90aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICBvbkVuZGVkKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlRXJyb3JcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNDtcblxuICAgICAgX3RoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgIChfdGhpcyRwcm9wczQgPSBfdGhpcy5wcm9wcykub25FcnJvci5hcHBseShfdGhpcyRwcm9wczQsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlRHVyYXRpb25DaGVja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjbGVhclRpbWVvdXQoX3RoaXMuZHVyYXRpb25DaGVja1RpbWVvdXQpO1xuXG4gICAgICB2YXIgZHVyYXRpb24gPSBfdGhpcy5nZXREdXJhdGlvbigpO1xuXG4gICAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKCFfdGhpcy5vbkR1cmF0aW9uQ2FsbGVkKSB7XG4gICAgICAgICAgX3RoaXMucHJvcHMub25EdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICAgICAgICBfdGhpcy5vbkR1cmF0aW9uQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuZHVyYXRpb25DaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KF90aGlzLmhhbmRsZUR1cmF0aW9uQ2hlY2ssIDEwMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlTG9hZGVkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNvbWV0aW1lcyB3ZSBrbm93IGxvYWRpbmcgaGFzIHN0b3BwZWQgYnV0IG9uUmVhZHkvb25QbGF5IGFyZSBuZXZlciBjYWxsZWRcbiAgICAgIC8vIHNvIHRoaXMgcHJvdmlkZXMgYSB3YXkgZm9yIHBsYXllcnMgdG8gYXZvaWQgZ2V0dGluZyBzdHVja1xuICAgICAgX3RoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUGxheWVyLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucHJvZ3Jlc3NUaW1lb3V0KTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmR1cmF0aW9uQ2hlY2tUaW1lb3V0KTtcblxuICAgICAgaWYgKHRoaXMuaXNSZWFkeSAmJiB0aGlzLnByb3BzLnN0b3BPblVubW91bnQpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIuc3RvcCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnBsYXllci5kaXNhYmxlUElQKSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIuZGlzYWJsZVBJUCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzblx1MjAxOXQgYSBwbGF5ZXIgYXZhaWxhYmxlLCBkb25cdTIwMTl0IGRvIGFueXRoaW5nXG4gICAgICBpZiAoIXRoaXMucGxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gSW52b2tlIHBsYXllciBtZXRob2RzIGJhc2VkIG9uIGNoYW5nZWQgcHJvcHNcblxuXG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB1cmwgPSBfdGhpcyRwcm9wczUudXJsLFxuICAgICAgICAgIHBsYXlpbmcgPSBfdGhpcyRwcm9wczUucGxheWluZyxcbiAgICAgICAgICB2b2x1bWUgPSBfdGhpcyRwcm9wczUudm9sdW1lLFxuICAgICAgICAgIG11dGVkID0gX3RoaXMkcHJvcHM1Lm11dGVkLFxuICAgICAgICAgIHBsYXliYWNrUmF0ZSA9IF90aGlzJHByb3BzNS5wbGF5YmFja1JhdGUsXG4gICAgICAgICAgcGlwID0gX3RoaXMkcHJvcHM1LnBpcCxcbiAgICAgICAgICBsb29wID0gX3RoaXMkcHJvcHM1Lmxvb3AsXG4gICAgICAgICAgYWN0aXZlUGxheWVyID0gX3RoaXMkcHJvcHM1LmFjdGl2ZVBsYXllcixcbiAgICAgICAgICBkaXNhYmxlRGVmZXJyZWRMb2FkaW5nID0gX3RoaXMkcHJvcHM1LmRpc2FibGVEZWZlcnJlZExvYWRpbmc7XG5cbiAgICAgIGlmICghKDAsIF9yZWFjdEZhc3RDb21wYXJlW1wiZGVmYXVsdFwiXSkocHJldlByb3BzLnVybCwgdXJsKSkge1xuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmcgJiYgIWFjdGl2ZVBsYXllci5mb3JjZUxvYWQgJiYgIWRpc2FibGVEZWZlcnJlZExvYWRpbmcgJiYgISgwLCBfdXRpbHMuaXNNZWRpYVN0cmVhbSkodXJsKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIlJlYWN0UGxheWVyOiB0aGUgYXR0ZW1wdCB0byBsb2FkIFwiLmNvbmNhdCh1cmwsIFwiIGlzIGJlaW5nIGRlZmVycmVkIHVudGlsIHRoZSBwbGF5ZXIgaGFzIGxvYWRlZFwiKSk7XG4gICAgICAgICAgdGhpcy5sb2FkT25SZWFkeSA9IHVybDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhcnRPblBsYXkgPSB0cnVlO1xuICAgICAgICB0aGlzLm9uRHVyYXRpb25DYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wbGF5ZXIubG9hZCh1cmwsIHRoaXMuaXNSZWFkeSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcHJldlByb3BzLnBsYXlpbmcgJiYgcGxheWluZyAmJiAhdGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIucGxheSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldlByb3BzLnBsYXlpbmcgJiYgIXBsYXlpbmcgJiYgdGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIucGF1c2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwcmV2UHJvcHMucGlwICYmIHBpcCAmJiB0aGlzLnBsYXllci5lbmFibGVQSVApIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIuZW5hYmxlUElQKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2UHJvcHMucGlwICYmICFwaXAgJiYgdGhpcy5wbGF5ZXIuZGlzYWJsZVBJUCkge1xuICAgICAgICB0aGlzLnBsYXllci5kaXNhYmxlUElQKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2UHJvcHMudm9sdW1lICE9PSB2b2x1bWUgJiYgdm9sdW1lICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMucGxheWVyLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldlByb3BzLm11dGVkICE9PSBtdXRlZCkge1xuICAgICAgICBpZiAobXV0ZWQpIHtcbiAgICAgICAgICB0aGlzLnBsYXllci5tdXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIudW5tdXRlKCk7XG5cbiAgICAgICAgICBpZiAodm9sdW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBTZXQgdm9sdW1lIG5leHQgdGljayB0byBmaXggYSBidWcgd2l0aCBEYWlseU1vdGlvblxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczIucGxheWVyLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2UHJvcHMucGxheWJhY2tSYXRlICE9PSBwbGF5YmFja1JhdGUgJiYgdGhpcy5wbGF5ZXIuc2V0UGxheWJhY2tSYXRlKSB7XG4gICAgICAgIHRoaXMucGxheWVyLnNldFBsYXliYWNrUmF0ZShwbGF5YmFja1JhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldlByb3BzLmxvb3AgIT09IGxvb3AgJiYgdGhpcy5wbGF5ZXIuc2V0TG9vcCkge1xuICAgICAgICB0aGlzLnBsYXllci5zZXRMb29wKGxvb3ApO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5pc1JlYWR5KSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLnBsYXllci5nZXREdXJhdGlvbigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VGltZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpIHtcbiAgICAgIGlmICghdGhpcy5pc1JlYWR5KSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLnBsYXllci5nZXRDdXJyZW50VGltZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICBpZiAoIXRoaXMuaXNSZWFkeSkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZ2V0U2Vjb25kc0xvYWRlZCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKGFtb3VudCwgdHlwZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIC8vIFdoZW4gc2Vla2luZyBiZWZvcmUgcGxheWVyIGlzIHJlYWR5LCBzdG9yZSB2YWx1ZSBhbmQgc2VlayBsYXRlclxuICAgICAgaWYgKCF0aGlzLmlzUmVhZHkpIHtcbiAgICAgICAgaWYgKGFtb3VudCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMuc2Vla09uUGxheSA9IGFtb3VudDtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMy5zZWVrT25QbGF5ID0gbnVsbDtcbiAgICAgICAgICB9LCBTRUVLX09OX1BMQVlfRVhQSVJZKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGlzRnJhY3Rpb24gPSAhdHlwZSA/IGFtb3VudCA+IDAgJiYgYW1vdW50IDwgMSA6IHR5cGUgPT09ICdmcmFjdGlvbic7XG5cbiAgICAgIGlmIChpc0ZyYWN0aW9uKSB7XG4gICAgICAgIC8vIENvbnZlcnQgZnJhY3Rpb24gdG8gc2Vjb25kcyBiYXNlZCBvbiBkdXJhdGlvblxuICAgICAgICB2YXIgZHVyYXRpb24gPSB0aGlzLnBsYXllci5nZXREdXJhdGlvbigpO1xuXG4gICAgICAgIGlmICghZHVyYXRpb24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlYWN0UGxheWVyOiBjb3VsZCBub3Qgc2VlayB1c2luZyBmcmFjdGlvbiBcdTIwMTNcdTAwQTBkdXJhdGlvbiBub3QgeWV0IGF2YWlsYWJsZScpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxheWVyLnNlZWtUbyhkdXJhdGlvbiAqIGFtb3VudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wbGF5ZXIuc2Vla1RvKGFtb3VudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgUGxheWVyID0gdGhpcy5wcm9wcy5hY3RpdmVQbGF5ZXI7XG5cbiAgICAgIGlmICghUGxheWVyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChQbGF5ZXIsIF9leHRlbmRzKHt9LCB0aGlzLnByb3BzLCB7XG4gICAgICAgIG9uTW91bnQ6IHRoaXMuaGFuZGxlUGxheWVyTW91bnQsXG4gICAgICAgIG9uUmVhZHk6IHRoaXMuaGFuZGxlUmVhZHksXG4gICAgICAgIG9uUGxheTogdGhpcy5oYW5kbGVQbGF5LFxuICAgICAgICBvblBhdXNlOiB0aGlzLmhhbmRsZVBhdXNlLFxuICAgICAgICBvbkVuZGVkOiB0aGlzLmhhbmRsZUVuZGVkLFxuICAgICAgICBvbkxvYWRlZDogdGhpcy5oYW5kbGVMb2FkZWQsXG4gICAgICAgIG9uRXJyb3I6IHRoaXMuaGFuZGxlRXJyb3JcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGxheWVyO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBQbGF5ZXI7XG5cbl9kZWZpbmVQcm9wZXJ0eShQbGF5ZXIsIFwiZGlzcGxheU5hbWVcIiwgJ1BsYXllcicpO1xuXG5fZGVmaW5lUHJvcGVydHkoUGxheWVyLCBcInByb3BUeXBlc1wiLCBfcHJvcHMucHJvcFR5cGVzKTtcblxuX2RlZmluZVByb3BlcnR5KFBsYXllciwgXCJkZWZhdWx0UHJvcHNcIiwgX3Byb3BzLmRlZmF1bHRQcm9wcyk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgSUNPTl9TSVpFID0gJzY0cHgnO1xudmFyIGNhY2hlID0ge307XG5cbnZhciBQcmV2aWV3ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQcmV2aWV3LCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFByZXZpZXcpO1xuXG4gIGZ1bmN0aW9uIFByZXZpZXcoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByZXZpZXcpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJtb3VudGVkXCIsIGZhbHNlKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzdGF0ZVwiLCB7XG4gICAgICBpbWFnZTogbnVsbFxuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhbmRsZUtleVByZXNzXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykge1xuICAgICAgICBfdGhpcy5wcm9wcy5vbkNsaWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUHJldmlldywgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5mZXRjaEltYWdlKHRoaXMucHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB1cmwgPSBfdGhpcyRwcm9wcy51cmwsXG4gICAgICAgICAgbGlnaHQgPSBfdGhpcyRwcm9wcy5saWdodDtcblxuICAgICAgaWYgKHByZXZQcm9wcy51cmwgIT09IHVybCB8fCBwcmV2UHJvcHMubGlnaHQgIT09IGxpZ2h0KSB7XG4gICAgICAgIHRoaXMuZmV0Y2hJbWFnZSh0aGlzLnByb3BzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmV0Y2hJbWFnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmZXRjaEltYWdlKF9yZWYpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgdXJsID0gX3JlZi51cmwsXG4gICAgICAgICAgbGlnaHQgPSBfcmVmLmxpZ2h0LFxuICAgICAgICAgIG9FbWJlZFVybCA9IF9yZWYub0VtYmVkVXJsO1xuXG4gICAgICBpZiAodHlwZW9mIGxpZ2h0ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpbWFnZTogbGlnaHRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhY2hlW3VybF0pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaW1hZ2U6IGNhY2hlW3VybF1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGltYWdlOiBudWxsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB3aW5kb3cuZmV0Y2gob0VtYmVkVXJsLnJlcGxhY2UoJ3t1cmx9JywgdXJsKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudGh1bWJuYWlsX3VybCAmJiBfdGhpczIubW91bnRlZCkge1xuICAgICAgICAgIHZhciBpbWFnZSA9IGRhdGEudGh1bWJuYWlsX3VybC5yZXBsYWNlKCdoZWlnaHQ9MTAwJywgJ2hlaWdodD00ODAnKTtcblxuICAgICAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpbWFnZTogaW1hZ2VcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhY2hlW3VybF0gPSBpbWFnZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMyLm9uQ2xpY2ssXG4gICAgICAgICAgcGxheUljb24gPSBfdGhpcyRwcm9wczIucGxheUljb24sXG4gICAgICAgICAgcHJldmlld1RhYkluZGV4ID0gX3RoaXMkcHJvcHMyLnByZXZpZXdUYWJJbmRleDtcbiAgICAgIHZhciBpbWFnZSA9IHRoaXMuc3RhdGUuaW1hZ2U7XG4gICAgICB2YXIgZmxleENlbnRlciA9IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInXG4gICAgICB9O1xuICAgICAgdmFyIHN0eWxlcyA9IHtcbiAgICAgICAgcHJldmlldzogX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IGltYWdlID8gXCJ1cmwoXCIuY29uY2F0KGltYWdlLCBcIilcIikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgYmFja2dyb3VuZFNpemU6ICdjb3ZlcicsXG4gICAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiAnY2VudGVyJyxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9LCBmbGV4Q2VudGVyKSxcbiAgICAgICAgc2hhZG93OiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAncmFkaWFsLWdyYWRpZW50KHJnYigwLCAwLCAwLCAwLjMpLCByZ2JhKDAsIDAsIDAsIDApIDYwJSknLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogSUNPTl9TSVpFLFxuICAgICAgICAgIHdpZHRoOiBJQ09OX1NJWkUsXG4gICAgICAgICAgaGVpZ2h0OiBJQ09OX1NJWkVcbiAgICAgICAgfSwgZmxleENlbnRlciksXG4gICAgICAgIHBsYXlJY29uOiB7XG4gICAgICAgICAgYm9yZGVyU3R5bGU6ICdzb2xpZCcsXG4gICAgICAgICAgYm9yZGVyV2lkdGg6ICcxNnB4IDAgMTZweCAyNnB4JyxcbiAgICAgICAgICBib3JkZXJDb2xvcjogJ3RyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHdoaXRlJyxcbiAgICAgICAgICBtYXJnaW5MZWZ0OiAnN3B4J1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgZGVmYXVsdFBsYXlJY29uID0gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiBzdHlsZXMuc2hhZG93LFxuICAgICAgICBjbGFzc05hbWU6IFwicmVhY3QtcGxheWVyX19zaGFkb3dcIlxuICAgICAgfSwgLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiBzdHlsZXMucGxheUljb24sXG4gICAgICAgIGNsYXNzTmFtZTogXCJyZWFjdC1wbGF5ZXJfX3BsYXktaWNvblwiXG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgc3R5bGU6IHN0eWxlcy5wcmV2aWV3LFxuICAgICAgICBjbGFzc05hbWU6IFwicmVhY3QtcGxheWVyX19wcmV2aWV3XCIsXG4gICAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICAgIHRhYkluZGV4OiBwcmV2aWV3VGFiSW5kZXgsXG4gICAgICAgIG9uS2V5UHJlc3M6IHRoaXMuaGFuZGxlS2V5UHJlc3NcbiAgICAgIH0sIHBsYXlJY29uIHx8IGRlZmF1bHRQbGF5SWNvbik7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFByZXZpZXc7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFByZXZpZXc7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNyZWF0ZVJlYWN0UGxheWVyID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9kZWVwbWVyZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJkZWVwbWVyZ2VcIikpO1xuXG52YXIgX21lbW9pemVPbmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJtZW1vaXplLW9uZVwiKSk7XG5cbnZhciBfcmVhY3RGYXN0Q29tcGFyZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0LWZhc3QtY29tcGFyZVwiKSk7XG5cbnZhciBfcHJvcHMgPSByZXF1aXJlKFwiLi9wcm9wc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG52YXIgX1BsYXllcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BsYXllclwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTsgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyByZXR1cm4gY2FjaGU7IH07IHJldHVybiBjYWNoZTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBcImRlZmF1bHRcIjogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqW1wiZGVmYXVsdFwiXSA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgUHJldmlldyA9IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGltcG9ydChcbiAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyUHJldmlldycgKi9cbiAgJy4vUHJldmlldycpO1xufSk7XG52YXIgSVNfQlJPV1NFUiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudDtcbnZhciBJU19HTE9CQUwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwud2luZG93ICYmIGdsb2JhbC53aW5kb3cuZG9jdW1lbnQ7XG52YXIgU1VQUE9SVEVEX1BST1BTID0gT2JqZWN0LmtleXMoX3Byb3BzLnByb3BUeXBlcyk7IC8vIFJldHVybiBudWxsIHdoZW4gcmVuZGVyaW5nIG9uIHRoZSBzZXJ2ZXJcbi8vIGFzIFN1c3BlbnNlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0XG5cbnZhciBVbml2ZXJzYWxTdXNwZW5zZSA9IElTX0JST1dTRVIgfHwgSVNfR0xPQkFMID8gX3JlYWN0LlN1c3BlbnNlIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG52YXIgY3VzdG9tUGxheWVycyA9IFtdO1xuXG52YXIgY3JlYXRlUmVhY3RQbGF5ZXIgPSBmdW5jdGlvbiBjcmVhdGVSZWFjdFBsYXllcihwbGF5ZXJzLCBmYWxsYmFjaykge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICByZXR1cm4gX3RlbXAgPSBfY2xhc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHMoUmVhY3RQbGF5ZXIsIF9Db21wb25lbnQpO1xuXG4gICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihSZWFjdFBsYXllcik7XG5cbiAgICBmdW5jdGlvbiBSZWFjdFBsYXllcigpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWN0UGxheWVyKTtcblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInN0YXRlXCIsIHtcbiAgICAgICAgc2hvd1ByZXZpZXc6ICEhX3RoaXMucHJvcHMubGlnaHRcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicmVmZXJlbmNlc1wiLCB7XG4gICAgICAgIHdyYXBwZXI6IGZ1bmN0aW9uIHdyYXBwZXIoX3dyYXBwZXIpIHtcbiAgICAgICAgICBfdGhpcy53cmFwcGVyID0gX3dyYXBwZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHBsYXllcjogZnVuY3Rpb24gcGxheWVyKF9wbGF5ZXIpIHtcbiAgICAgICAgICBfdGhpcy5wbGF5ZXIgPSBfcGxheWVyO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhbmRsZUNsaWNrUHJldmlld1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2hvd1ByZXZpZXc6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzLnByb3BzLm9uQ2xpY2tQcmV2aWV3KGUpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzaG93UHJldmlld1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzaG93UHJldmlldzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0RHVyYXRpb25cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIV90aGlzLnBsYXllcikgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBfdGhpcy5wbGF5ZXIuZ2V0RHVyYXRpb24oKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0Q3VycmVudFRpbWVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIV90aGlzLnBsYXllcikgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBfdGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0U2Vjb25kc0xvYWRlZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMucGxheWVyKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIF90aGlzLnBsYXllci5nZXRTZWNvbmRzTG9hZGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldEludGVybmFsUGxheWVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ3BsYXllcic7XG4gICAgICAgIGlmICghX3RoaXMucGxheWVyKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIF90aGlzLnBsYXllci5nZXRJbnRlcm5hbFBsYXllcihrZXkpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzZWVrVG9cIiwgZnVuY3Rpb24gKGZyYWN0aW9uLCB0eXBlKSB7XG4gICAgICAgIGlmICghX3RoaXMucGxheWVyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBfdGhpcy5wbGF5ZXIuc2Vla1RvKGZyYWN0aW9uLCB0eXBlKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5wcm9wcy5vblJlYWR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0QWN0aXZlUGxheWVyXCIsICgwLCBfbWVtb2l6ZU9uZVtcImRlZmF1bHRcIl0pKGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYXJyID0gW10uY29uY2F0KGN1c3RvbVBsYXllcnMsIF90b0NvbnN1bWFibGVBcnJheShwbGF5ZXJzKSk7IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgcGxheWVyID0gX2FycltfaV07XG5cbiAgICAgICAgICBpZiAocGxheWVyLmNhblBsYXkodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldENvbmZpZ1wiLCAoMCwgX21lbW9pemVPbmVbXCJkZWZhdWx0XCJdKShmdW5jdGlvbiAodXJsLCBrZXkpIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IF90aGlzLnByb3BzLmNvbmZpZztcbiAgICAgICAgcmV0dXJuIF9kZWVwbWVyZ2VbXCJkZWZhdWx0XCJdLmFsbChbX3Byb3BzLmRlZmF1bHRQcm9wcy5jb25maWcsIF9wcm9wcy5kZWZhdWx0UHJvcHMuY29uZmlnW2tleV0gfHwge30sIGNvbmZpZywgY29uZmlnW2tleV0gfHwge31dKTtcbiAgICAgIH0pKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldEF0dHJpYnV0ZXNcIiwgKDAsIF9tZW1vaXplT25lW1wiZGVmYXVsdFwiXSkoZnVuY3Rpb24gKHVybCkge1xuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5vbWl0KShfdGhpcy5wcm9wcywgU1VQUE9SVEVEX1BST1BTKTtcbiAgICAgIH0pKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlbmRlckFjdGl2ZVBsYXllclwiLCBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIGlmICghdXJsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICB2YXIgcGxheWVyID0gX3RoaXMuZ2V0QWN0aXZlUGxheWVyKHVybCk7XG5cbiAgICAgICAgaWYgKCFwbGF5ZXIpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHZhciBjb25maWcgPSBfdGhpcy5nZXRDb25maWcodXJsLCBwbGF5ZXIua2V5KTtcblxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChfUGxheWVyM1tcImRlZmF1bHRcIl0sIF9leHRlbmRzKHt9LCBfdGhpcy5wcm9wcywge1xuICAgICAgICAgIGtleTogcGxheWVyLmtleSxcbiAgICAgICAgICByZWY6IF90aGlzLnJlZmVyZW5jZXMucGxheWVyLFxuICAgICAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgICAgIGFjdGl2ZVBsYXllcjogcGxheWVyLmxhenlQbGF5ZXIgfHwgcGxheWVyLFxuICAgICAgICAgIG9uUmVhZHk6IF90aGlzLmhhbmRsZVJlYWR5XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKFJlYWN0UGxheWVyLCBbe1xuICAgICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgICAgICByZXR1cm4gISgwLCBfcmVhY3RGYXN0Q29tcGFyZVtcImRlZmF1bHRcIl0pKHRoaXMucHJvcHMsIG5leHRQcm9wcykgfHwgISgwLCBfcmVhY3RGYXN0Q29tcGFyZVtcImRlZmF1bHRcIl0pKHRoaXMuc3RhdGUsIG5leHRTdGF0ZSk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgICAgdmFyIGxpZ2h0ID0gdGhpcy5wcm9wcy5saWdodDtcblxuICAgICAgICBpZiAoIXByZXZQcm9wcy5saWdodCAmJiBsaWdodCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2hvd1ByZXZpZXc6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2UHJvcHMubGlnaHQgJiYgIWxpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzaG93UHJldmlldzogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJyZW5kZXJQcmV2aWV3XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyUHJldmlldyh1cmwpIHtcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgbGlnaHQgPSBfdGhpcyRwcm9wcy5saWdodCxcbiAgICAgICAgICAgIHBsYXlJY29uID0gX3RoaXMkcHJvcHMucGxheUljb24sXG4gICAgICAgICAgICBwcmV2aWV3VGFiSW5kZXggPSBfdGhpcyRwcm9wcy5wcmV2aWV3VGFiSW5kZXgsXG4gICAgICAgICAgICBvRW1iZWRVcmwgPSBfdGhpcyRwcm9wcy5vRW1iZWRVcmw7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFByZXZpZXcsIHtcbiAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICBsaWdodDogbGlnaHQsXG4gICAgICAgICAgcGxheUljb246IHBsYXlJY29uLFxuICAgICAgICAgIHByZXZpZXdUYWJJbmRleDogcHJldmlld1RhYkluZGV4LFxuICAgICAgICAgIG9FbWJlZFVybDogb0VtYmVkVXJsLFxuICAgICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tQcmV2aWV3XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJyZW5kZXJcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgdXJsID0gX3RoaXMkcHJvcHMyLnVybCxcbiAgICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMyLnN0eWxlLFxuICAgICAgICAgICAgd2lkdGggPSBfdGhpcyRwcm9wczIud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQgPSBfdGhpcyRwcm9wczIuaGVpZ2h0LFxuICAgICAgICAgICAgZmFsbGJhY2sgPSBfdGhpcyRwcm9wczIuZmFsbGJhY2ssXG4gICAgICAgICAgICBXcmFwcGVyID0gX3RoaXMkcHJvcHMyLndyYXBwZXI7XG4gICAgICAgIHZhciBzaG93UHJldmlldyA9IHRoaXMuc3RhdGUuc2hvd1ByZXZpZXc7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzKHVybCk7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFdyYXBwZXIsIF9leHRlbmRzKHtcbiAgICAgICAgICByZWY6IHRoaXMucmVmZXJlbmNlcy53cmFwcGVyLFxuICAgICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgICAgfSlcbiAgICAgICAgfSwgYXR0cmlidXRlcyksIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoVW5pdmVyc2FsU3VzcGVuc2UsIHtcbiAgICAgICAgICBmYWxsYmFjazogZmFsbGJhY2tcbiAgICAgICAgfSwgc2hvd1ByZXZpZXcgPyB0aGlzLnJlbmRlclByZXZpZXcodXJsKSA6IHRoaXMucmVuZGVyQWN0aXZlUGxheWVyKHVybCkpKTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gUmVhY3RQbGF5ZXI7XG4gIH0oX3JlYWN0LkNvbXBvbmVudCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiZGlzcGxheU5hbWVcIiwgJ1JlYWN0UGxheWVyJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwicHJvcFR5cGVzXCIsIF9wcm9wcy5wcm9wVHlwZXMpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImRlZmF1bHRQcm9wc1wiLCBfcHJvcHMuZGVmYXVsdFByb3BzKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzcywgXCJhZGRDdXN0b21QbGF5ZXJcIiwgZnVuY3Rpb24gKHBsYXllcikge1xuICAgIGN1c3RvbVBsYXllcnMucHVzaChwbGF5ZXIpO1xuICB9KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzcywgXCJyZW1vdmVDdXN0b21QbGF5ZXJzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBjdXN0b21QbGF5ZXJzLmxlbmd0aCA9IDA7XG4gIH0pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImNhblBsYXlcIiwgZnVuY3Rpb24gKHVybCkge1xuICAgIGZvciAodmFyIF9pMiA9IDAsIF9hcnIyID0gW10uY29uY2F0KGN1c3RvbVBsYXllcnMsIF90b0NvbnN1bWFibGVBcnJheShwbGF5ZXJzKSk7IF9pMiA8IF9hcnIyLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIHZhciBfUGxheWVyID0gX2FycjJbX2kyXTtcblxuICAgICAgaWYgKF9QbGF5ZXIuY2FuUGxheSh1cmwpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiY2FuRW5hYmxlUElQXCIsIGZ1bmN0aW9uICh1cmwpIHtcbiAgICBmb3IgKHZhciBfaTMgPSAwLCBfYXJyMyA9IFtdLmNvbmNhdChjdXN0b21QbGF5ZXJzLCBfdG9Db25zdW1hYmxlQXJyYXkocGxheWVycykpOyBfaTMgPCBfYXJyMy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICB2YXIgX1BsYXllcjIgPSBfYXJyM1tfaTNdO1xuXG4gICAgICBpZiAoX1BsYXllcjIuY2FuRW5hYmxlUElQICYmIF9QbGF5ZXIyLmNhbkVuYWJsZVBJUCh1cmwpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSksIF90ZW1wO1xufTtcblxuZXhwb3J0cy5jcmVhdGVSZWFjdFBsYXllciA9IGNyZWF0ZVJlYWN0UGxheWVyOyIsICJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3BsYXllcnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BsYXllcnNcIikpO1xuXG52YXIgX1JlYWN0UGxheWVyID0gcmVxdWlyZShcIi4vUmVhY3RQbGF5ZXJcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vLyBGYWxsIGJhY2sgdG8gRmlsZVBsYXllciBpZiBub3RoaW5nIGVsc2UgY2FuIHBsYXkgdGhlIFVSTFxudmFyIGZhbGxiYWNrID0gX3BsYXllcnNbXCJkZWZhdWx0XCJdW19wbGF5ZXJzW1wiZGVmYXVsdFwiXS5sZW5ndGggLSAxXTtcblxudmFyIF9kZWZhdWx0ID0gKDAsIF9SZWFjdFBsYXllci5jcmVhdGVSZWFjdFBsYXllcikoX3BsYXllcnNbXCJkZWZhdWx0XCJdLCBmYWxsYmFjayk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4ndXNlIHN0cmljdCc7ZnVuY3Rpb24gZihhLGIpe3ZhciBjPWEubGVuZ3RoO2EucHVzaChiKTthOmZvcig7MDxjOyl7dmFyIGQ9Yy0xPj4+MSxlPWFbZF07aWYoMDxnKGUsYikpYVtkXT1iLGFbY109ZSxjPWQ7ZWxzZSBicmVhayBhfX1mdW5jdGlvbiBoKGEpe3JldHVybiAwPT09YS5sZW5ndGg/bnVsbDphWzBdfWZ1bmN0aW9uIGsoYSl7aWYoMD09PWEubGVuZ3RoKXJldHVybiBudWxsO3ZhciBiPWFbMF0sYz1hLnBvcCgpO2lmKGMhPT1iKXthWzBdPWM7YTpmb3IodmFyIGQ9MCxlPWEubGVuZ3RoLHc9ZT4+PjE7ZDx3Oyl7dmFyIG09MiooZCsxKS0xLEM9YVttXSxuPW0rMSx4PWFbbl07aWYoMD5nKEMsYykpbjxlJiYwPmcoeCxDKT8oYVtkXT14LGFbbl09YyxkPW4pOihhW2RdPUMsYVttXT1jLGQ9bSk7ZWxzZSBpZihuPGUmJjA+Zyh4LGMpKWFbZF09eCxhW25dPWMsZD1uO2Vsc2UgYnJlYWsgYX19cmV0dXJuIGJ9XG5mdW5jdGlvbiBnKGEsYil7dmFyIGM9YS5zb3J0SW5kZXgtYi5zb3J0SW5kZXg7cmV0dXJuIDAhPT1jP2M6YS5pZC1iLmlkfWlmKFwib2JqZWN0XCI9PT10eXBlb2YgcGVyZm9ybWFuY2UmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBwZXJmb3JtYW5jZS5ub3cpe3ZhciBsPXBlcmZvcm1hbmNlO2V4cG9ydHMudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIGwubm93KCl9fWVsc2V7dmFyIHA9RGF0ZSxxPXAubm93KCk7ZXhwb3J0cy51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gcC5ub3coKS1xfX12YXIgcj1bXSx0PVtdLHU9MSx2PW51bGwseT0zLHo9ITEsQT0hMSxCPSExLEQ9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDpudWxsLEU9XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6bnVsbCxGPVwidW5kZWZpbmVkXCIhPT10eXBlb2Ygc2V0SW1tZWRpYXRlP3NldEltbWVkaWF0ZTpudWxsO1xuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBuYXZpZ2F0b3ImJnZvaWQgMCE9PW5hdmlnYXRvci5zY2hlZHVsaW5nJiZ2b2lkIDAhPT1uYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZyk7ZnVuY3Rpb24gRyhhKXtmb3IodmFyIGI9aCh0KTtudWxsIT09Yjspe2lmKG51bGw9PT1iLmNhbGxiYWNrKWsodCk7ZWxzZSBpZihiLnN0YXJ0VGltZTw9YSlrKHQpLGIuc29ydEluZGV4PWIuZXhwaXJhdGlvblRpbWUsZihyLGIpO2Vsc2UgYnJlYWs7Yj1oKHQpfX1mdW5jdGlvbiBIKGEpe0I9ITE7RyhhKTtpZighQSlpZihudWxsIT09aChyKSlBPSEwLEkoSik7ZWxzZXt2YXIgYj1oKHQpO251bGwhPT1iJiZLKEgsYi5zdGFydFRpbWUtYSl9fVxuZnVuY3Rpb24gSihhLGIpe0E9ITE7QiYmKEI9ITEsRShMKSxMPS0xKTt6PSEwO3ZhciBjPXk7dHJ5e0coYik7Zm9yKHY9aChyKTtudWxsIT09diYmKCEodi5leHBpcmF0aW9uVGltZT5iKXx8YSYmIU0oKSk7KXt2YXIgZD12LmNhbGxiYWNrO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2LmNhbGxiYWNrPW51bGw7eT12LnByaW9yaXR5TGV2ZWw7dmFyIGU9ZCh2LmV4cGlyYXRpb25UaW1lPD1iKTtiPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGU/di5jYWxsYmFjaz1lOnY9PT1oKHIpJiZrKHIpO0coYil9ZWxzZSBrKHIpO3Y9aChyKX1pZihudWxsIT09dil2YXIgdz0hMDtlbHNle3ZhciBtPWgodCk7bnVsbCE9PW0mJksoSCxtLnN0YXJ0VGltZS1iKTt3PSExfXJldHVybiB3fWZpbmFsbHl7dj1udWxsLHk9Yyx6PSExfX12YXIgTj0hMSxPPW51bGwsTD0tMSxQPTUsUT0tMTtcbmZ1bmN0aW9uIE0oKXtyZXR1cm4gZXhwb3J0cy51bnN0YWJsZV9ub3coKS1RPFA/ITE6ITB9ZnVuY3Rpb24gUigpe2lmKG51bGwhPT1PKXt2YXIgYT1leHBvcnRzLnVuc3RhYmxlX25vdygpO1E9YTt2YXIgYj0hMDt0cnl7Yj1PKCEwLGEpfWZpbmFsbHl7Yj9TKCk6KE49ITEsTz1udWxsKX19ZWxzZSBOPSExfXZhciBTO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBGKVM9ZnVuY3Rpb24oKXtGKFIpfTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgTWVzc2FnZUNoYW5uZWwpe3ZhciBUPW5ldyBNZXNzYWdlQ2hhbm5lbCxVPVQucG9ydDI7VC5wb3J0MS5vbm1lc3NhZ2U9UjtTPWZ1bmN0aW9uKCl7VS5wb3N0TWVzc2FnZShudWxsKX19ZWxzZSBTPWZ1bmN0aW9uKCl7RChSLDApfTtmdW5jdGlvbiBJKGEpe089YTtOfHwoTj0hMCxTKCkpfWZ1bmN0aW9uIEsoYSxiKXtMPUQoZnVuY3Rpb24oKXthKGV4cG9ydHMudW5zdGFibGVfbm93KCkpfSxiKX1cbmV4cG9ydHMudW5zdGFibGVfSWRsZVByaW9yaXR5PTU7ZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eT0xO2V4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHk9NDtleHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5PTM7ZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmc9bnVsbDtleHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5PTI7ZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihhKXthLmNhbGxiYWNrPW51bGx9O2V4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb249ZnVuY3Rpb24oKXtBfHx6fHwoQT0hMCxJKEopKX07XG5leHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGEpezA+YXx8MTI1PGE/Y29uc29sZS5lcnJvcihcImZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCBmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZFwiKTpQPTA8YT9NYXRoLmZsb29yKDFFMy9hKTo1fTtleHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHl9O2V4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gaChyKX07ZXhwb3J0cy51bnN0YWJsZV9uZXh0PWZ1bmN0aW9uKGEpe3N3aXRjaCh5KXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgYj0zO2JyZWFrO2RlZmF1bHQ6Yj15fXZhciBjPXk7eT1iO3RyeXtyZXR1cm4gYSgpfWZpbmFsbHl7eT1jfX07ZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbj1mdW5jdGlvbigpe307XG5leHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludD1mdW5jdGlvbigpe307ZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpicmVhaztkZWZhdWx0OmE9M312YXIgYz15O3k9YTt0cnl7cmV0dXJuIGIoKX1maW5hbGx5e3k9Y319O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1leHBvcnRzLnVuc3RhYmxlX25vdygpO1wib2JqZWN0XCI9PT10eXBlb2YgYyYmbnVsbCE9PWM/KGM9Yy5kZWxheSxjPVwibnVtYmVyXCI9PT10eXBlb2YgYyYmMDxjP2QrYzpkKTpjPWQ7c3dpdGNoKGEpe2Nhc2UgMTp2YXIgZT0tMTticmVhaztjYXNlIDI6ZT0yNTA7YnJlYWs7Y2FzZSA1OmU9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6ZT0xRTQ7YnJlYWs7ZGVmYXVsdDplPTVFM31lPWMrZTthPXtpZDp1KyssY2FsbGJhY2s6Yixwcmlvcml0eUxldmVsOmEsc3RhcnRUaW1lOmMsZXhwaXJhdGlvblRpbWU6ZSxzb3J0SW5kZXg6LTF9O2M+ZD8oYS5zb3J0SW5kZXg9YyxmKHQsYSksbnVsbD09PWgocikmJmE9PT1oKHQpJiYoQj8oRShMKSxMPS0xKTpCPSEwLEsoSCxjLWQpKSk6KGEuc29ydEluZGV4PWUsZihyLGEpLEF8fHp8fChBPSEwLEkoSikpKTtyZXR1cm4gYX07XG5leHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkPU07ZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7dmFyIGI9eTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz15O3k9Yjt0cnl7cmV0dXJuIGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7eT1jfX19O1xuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHNjaGVkdWxlci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcbnZhciBlbmFibGVQcm9maWxpbmcgPSBmYWxzZTtcbnZhciBmcmFtZVlpZWxkTXMgPSA1O1xuXG5mdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgdmFyIGluZGV4ID0gaGVhcC5sZW5ndGg7XG4gIGhlYXAucHVzaChub2RlKTtcbiAgc2lmdFVwKGhlYXAsIG5vZGUsIGluZGV4KTtcbn1cbmZ1bmN0aW9uIHBlZWsoaGVhcCkge1xuICByZXR1cm4gaGVhcC5sZW5ndGggPT09IDAgPyBudWxsIDogaGVhcFswXTtcbn1cbmZ1bmN0aW9uIHBvcChoZWFwKSB7XG4gIGlmIChoZWFwLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGZpcnN0ID0gaGVhcFswXTtcbiAgdmFyIGxhc3QgPSBoZWFwLnBvcCgpO1xuXG4gIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgIGhlYXBbMF0gPSBsYXN0O1xuICAgIHNpZnREb3duKGhlYXAsIGxhc3QsIDApO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG5mdW5jdGlvbiBzaWZ0VXAoaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuXG4gIHdoaWxlIChpbmRleCA+IDApIHtcbiAgICB2YXIgcGFyZW50SW5kZXggPSBpbmRleCAtIDEgPj4+IDE7XG4gICAgdmFyIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuXG4gICAgaWYgKGNvbXBhcmUocGFyZW50LCBub2RlKSA+IDApIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgbGFyZ2VyLiBTd2FwIHBvc2l0aW9ucy5cbiAgICAgIGhlYXBbcGFyZW50SW5kZXhdID0gbm9kZTtcbiAgICAgIGhlYXBbaW5kZXhdID0gcGFyZW50O1xuICAgICAgaW5kZXggPSBwYXJlbnRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaWZ0RG93bihoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG4gIHZhciBsZW5ndGggPSBoZWFwLmxlbmd0aDtcbiAgdmFyIGhhbGZMZW5ndGggPSBsZW5ndGggPj4+IDE7XG5cbiAgd2hpbGUgKGluZGV4IDwgaGFsZkxlbmd0aCkge1xuICAgIHZhciBsZWZ0SW5kZXggPSAoaW5kZXggKyAxKSAqIDIgLSAxO1xuICAgIHZhciBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdO1xuICAgIHZhciByaWdodEluZGV4ID0gbGVmdEluZGV4ICsgMTtcbiAgICB2YXIgcmlnaHQgPSBoZWFwW3JpZ2h0SW5kZXhdOyAvLyBJZiB0aGUgbGVmdCBvciByaWdodCBub2RlIGlzIHNtYWxsZXIsIHN3YXAgd2l0aCB0aGUgc21hbGxlciBvZiB0aG9zZS5cblxuICAgIGlmIChjb21wYXJlKGxlZnQsIG5vZGUpIDwgMCkge1xuICAgICAgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbGVmdCkgPCAwKSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFwW2luZGV4XSA9IGxlZnQ7XG4gICAgICAgIGhlYXBbbGVmdEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gbGVmdEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBub2RlKSA8IDApIHtcbiAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBjaGlsZCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgLy8gQ29tcGFyZSBzb3J0IGluZGV4IGZpcnN0LCB0aGVuIHRhc2sgaWQuXG4gIHZhciBkaWZmID0gYS5zb3J0SW5kZXggLSBiLnNvcnRJbmRleDtcbiAgcmV0dXJuIGRpZmYgIT09IDAgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG59XG5cbi8vIFRPRE86IFVzZSBzeW1ib2xzP1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gMTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSAzO1xudmFyIExvd1ByaW9yaXR5ID0gNDtcbnZhciBJZGxlUHJpb3JpdHkgPSA1O1xuXG5mdW5jdGlvbiBtYXJrVGFza0Vycm9yZWQodGFzaywgbXMpIHtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbnZhciBoYXNQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuaWYgKGhhc1BlcmZvcm1hbmNlTm93KSB7XG4gIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgbG9jYWxEYXRlID0gRGF0ZTtcbiAgdmFyIGluaXRpYWxUaW1lID0gbG9jYWxEYXRlLm5vdygpO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCkgLSBpbml0aWFsVGltZTtcbiAgfTtcbn0gLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxuXG5cbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7IC8vIFRpbWVzIG91dCBpbW1lZGlhdGVseVxuXG52YXIgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQgPSAtMTsgLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcblxudmFyIFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVCA9IDI1MDtcbnZhciBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVCA9IDUwMDA7XG52YXIgTE9XX1BSSU9SSVRZX1RJTUVPVVQgPSAxMDAwMDsgLy8gTmV2ZXIgdGltZXMgb3V0XG5cbnZhciBJRExFX1BSSU9SSVRZX1RJTUVPVVQgPSBtYXhTaWduZWQzMUJpdEludDsgLy8gVGFza3MgYXJlIHN0b3JlZCBvbiBhIG1pbiBoZWFwXG5cbnZhciB0YXNrUXVldWUgPSBbXTtcbnZhciB0aW1lclF1ZXVlID0gW107IC8vIEluY3JlbWVudGluZyBpZCBjb3VudGVyLiBVc2VkIHRvIG1haW50YWluIGluc2VydGlvbiBvcmRlci5cblxudmFyIHRhc2tJZENvdW50ZXIgPSAxOyAvLyBQYXVzaW5nIHRoZSBzY2hlZHVsZXIgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG52YXIgY3VycmVudFRhc2sgPSBudWxsO1xudmFyIGN1cnJlbnRQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7IC8vIFRoaXMgaXMgc2V0IHdoaWxlIHBlcmZvcm1pbmcgd29yaywgdG8gcHJldmVudCByZS1lbnRyYW5jZS5cblxudmFyIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbnZhciBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xudmFyIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTsgLy8gQ2FwdHVyZSBsb2NhbCByZWZlcmVuY2VzIHRvIG5hdGl2ZSBBUElzLCBpbiBjYXNlIGEgcG9seWZpbGwgb3ZlcnJpZGVzIHRoZW0uXG5cbnZhciBsb2NhbFNldFRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsQ2xlYXJUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxTZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyA/IHNldEltbWVkaWF0ZSA6IG51bGw7IC8vIElFIGFuZCBOb2RlLmpzICsganNkb21cblxudmFyIGlzSW5wdXRQZW5kaW5nID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcgIT09IHVuZGVmaW5lZCAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZykgOiBudWxsO1xuXG5mdW5jdGlvbiBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKSB7XG4gIC8vIENoZWNrIGZvciB0YXNrcyB0aGF0IGFyZSBubyBsb25nZXIgZGVsYXllZCBhbmQgYWRkIHRoZW0gdG8gdGhlIHF1ZXVlLlxuICB2YXIgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gIHdoaWxlICh0aW1lciAhPT0gbnVsbCkge1xuICAgIGlmICh0aW1lci5jYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGltZXIgd2FzIGNhbmNlbGxlZC5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKHRpbWVyLnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGltZXIgZmlyZWQuIFRyYW5zZmVyIHRvIHRoZSB0YXNrIHF1ZXVlLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgICAgdGltZXIuc29ydEluZGV4ID0gdGltZXIuZXhwaXJhdGlvblRpbWU7XG4gICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1haW5pbmcgdGltZXJzIGFyZSBwZW5kaW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUaW1lb3V0KGN1cnJlbnRUaW1lKSB7XG4gIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCkge1xuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgIT09IG51bGwpIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoV29yayhoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuXG5cbiAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgIC8vIFdlIHNjaGVkdWxlZCBhIHRpbWVvdXQgYnV0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC4gQ2FuY2VsIGl0LlxuICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICB9XG5cbiAgaXNQZXJmb3JtaW5nV29yayA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIGlmIChlbmFibGVQcm9maWxpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICAgICAgICAgIG1hcmtUYXNrRXJyb3JlZChjdXJyZW50VGFzaywgY3VycmVudFRpbWUpO1xuICAgICAgICAgIGN1cnJlbnRUYXNrLmlzUXVldWVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2F0Y2ggaW4gcHJvZCBjb2RlIHBhdGguXG4gICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VGFzayA9IG51bGw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGluaXRpYWxUaW1lO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG5cbiAgd2hpbGUgKGN1cnJlbnRUYXNrICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICkpIHtcbiAgICBpZiAoY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPiBjdXJyZW50VGltZSAmJiAoIWhhc1RpbWVSZW1haW5pbmcgfHwgc2hvdWxkWWllbGRUb0hvc3QoKSkpIHtcbiAgICAgIC8vIFRoaXMgY3VycmVudFRhc2sgaGFzbid0IGV4cGlyZWQsIGFuZCB3ZSd2ZSByZWFjaGVkIHRoZSBkZWFkbGluZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRUYXNrLmNhbGxiYWNrO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsO1xuICAgICAgdmFyIGRpZFVzZXJDYWxsYmFja1RpbWVvdXQgPSBjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZTtcblxuICAgICAgdmFyIGNvbnRpbnVhdGlvbkNhbGxiYWNrID0gY2FsbGJhY2soZGlkVXNlckNhbGxiYWNrVGltZW91dCk7XG4gICAgICBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrID09PSBwZWVrKHRhc2tRdWV1ZSkpIHtcbiAgICAgICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG4gIH0gLy8gUmV0dXJuIHdoZXRoZXIgdGhlcmUncyBhZGRpdGlvbmFsIHdvcmtcblxuXG4gIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsO1xuXG4gIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgIC8vIFNoaWZ0IGRvd24gdG8gbm9ybWFsIHByaW9yaXR5XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbnl0aGluZyBsb3dlciB0aGFuIG5vcm1hbCBwcmlvcml0eSBzaG91bGQgcmVtYWluIGF0IHRoZSBjdXJyZW50IGxldmVsLlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV93cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgdmFyIHBhcmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGEgZm9yayBvZiBydW5XaXRoUHJpb3JpdHksIGlubGluZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB2YXIgc3RhcnRUaW1lO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCkge1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZGVsYXk7XG5cbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lICsgZGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0O1xuXG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJRExFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gTE9XX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIHRpbWVvdXQgPSBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgdGltZW91dDtcbiAgdmFyIG5ld1Rhc2sgPSB7XG4gICAgaWQ6IHRhc2tJZENvdW50ZXIrKyxcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgc29ydEluZGV4OiAtMVxuICB9O1xuXG4gIGlmIChzdGFydFRpbWUgPiBjdXJyZW50VGltZSkge1xuICAgIC8vIFRoaXMgaXMgYSBkZWxheWVkIHRhc2suXG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBzdGFydFRpbWU7XG4gICAgcHVzaCh0aW1lclF1ZXVlLCBuZXdUYXNrKTtcblxuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgPT09IG51bGwgJiYgbmV3VGFzayA9PT0gcGVlayh0aW1lclF1ZXVlKSkge1xuICAgICAgLy8gQWxsIHRhc2tzIGFyZSBkZWxheWVkLCBhbmQgdGhpcyBpcyB0aGUgdGFzayB3aXRoIHRoZSBlYXJsaWVzdCBkZWxheS5cbiAgICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbiBleGlzdGluZyB0aW1lb3V0LlxuICAgICAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9IC8vIFNjaGVkdWxlIGEgdGltZW91dC5cblxuXG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IGV4cGlyYXRpb25UaW1lO1xuICAgIHB1c2godGFza1F1ZXVlLCBuZXdUYXNrKTtcbiAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgd2UgeWllbGQuXG5cblxuICAgIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3VGFzaztcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcGF1c2VFeGVjdXRpb24oKSB7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gcGVlayh0YXNrUXVldWUpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjayh0YXNrKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHlvdSBjYW4ndCByZW1vdmUgYXJiaXRyYXJ5IG5vZGVzIGZyb20gYW5cbiAgLy8gYXJyYXkgYmFzZWQgaGVhcCwgb25seSB0aGUgZmlyc3Qgb25lLilcblxuXG4gIHRhc2suY2FsbGJhY2sgPSBudWxsO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRQcmlvcml0eUxldmVsO1xufVxuXG52YXIgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbnZhciBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xudmFyIHRhc2tUaW1lb3V0SUQgPSAtMTsgLy8gU2NoZWR1bGVyIHBlcmlvZGljYWxseSB5aWVsZHMgaW4gY2FzZSB0aGVyZSBpcyBvdGhlciB3b3JrIG9uIHRoZSBtYWluXG4vLyB0aHJlYWQsIGxpa2UgdXNlciBldmVudHMuIEJ5IGRlZmF1bHQsIGl0IHlpZWxkcyBtdWx0aXBsZSB0aW1lcyBwZXIgZnJhbWUuXG4vLyBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGFsaWduIHdpdGggZnJhbWUgYm91bmRhcmllcywgc2luY2UgbW9zdCB0YXNrcyBkb24ndFxuLy8gbmVlZCB0byBiZSBmcmFtZSBhbGlnbmVkOyBmb3IgdGhvc2UgdGhhdCBkbywgdXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cblxudmFyIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG52YXIgc3RhcnRUaW1lID0gLTE7XG5cbmZ1bmN0aW9uIHNob3VsZFlpZWxkVG9Ib3N0KCkge1xuICB2YXIgdGltZUVsYXBzZWQgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpIC0gc3RhcnRUaW1lO1xuXG4gIGlmICh0aW1lRWxhcHNlZCA8IGZyYW1lSW50ZXJ2YWwpIHtcbiAgICAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIG9ubHkgYmVlbiBibG9ja2VkIGZvciBhIHJlYWxseSBzaG9ydCBhbW91bnQgb2YgdGltZTtcbiAgICAvLyBzbWFsbGVyIHRoYW4gYSBzaW5nbGUgZnJhbWUuIERvbid0IHlpZWxkIHlldC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBiZWVuIGJsb2NrZWQgZm9yIGEgbm9uLW5lZ2xpZ2libGUgYW1vdW50IG9mIHRpbWUuIFdlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFBhaW50KCkge1xuXG59XG5cbmZ1bmN0aW9uIGZvcmNlRnJhbWVSYXRlKGZwcykge1xuICBpZiAoZnBzIDwgMCB8fCBmcHMgPiAxMjUpIHtcbiAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICBjb25zb2xlWydlcnJvciddKCdmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgJyArICdmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmcHMgPiAwKSB7XG4gICAgZnJhbWVJbnRlcnZhbCA9IE1hdGguZmxvb3IoMTAwMCAvIGZwcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzZXQgdGhlIGZyYW1lcmF0ZVxuICAgIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG4gIH1cbn1cblxudmFyIHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHNjaGVkdWxlZEhvc3RDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IHRpbWUgc28gd2UgY2FuIG1lYXN1cmUgaG93IGxvbmcgdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gaGFzIGJlZW4gYmxvY2tlZC5cblxuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIHZhciBoYXNUaW1lUmVtYWluaW5nID0gdHJ1ZTsgLy8gSWYgYSBzY2hlZHVsZXIgdGFzayB0aHJvd3MsIGV4aXQgdGhlIGN1cnJlbnQgYnJvd3NlciB0YXNrIHNvIHRoZVxuICAgIC8vIGVycm9yIGNhbiBiZSBvYnNlcnZlZC5cbiAgICAvL1xuICAgIC8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGEgdHJ5LWNhdGNoLCBzaW5jZSB0aGF0IG1ha2VzIHNvbWUgZGVidWdnaW5nXG4gICAgLy8gdGVjaG5pcXVlcyBoYXJkZXIuIEluc3RlYWQsIGlmIGBzY2hlZHVsZWRIb3N0Q2FsbGJhY2tgIGVycm9ycywgdGhlblxuICAgIC8vIGBoYXNNb3JlV29ya2Agd2lsbCByZW1haW4gdHJ1ZSwgYW5kIHdlJ2xsIGNvbnRpbnVlIHRoZSB3b3JrIGxvb3AuXG5cbiAgICB2YXIgaGFzTW9yZVdvcmsgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhc01vcmVXb3JrID0gc2NoZWR1bGVkSG9zdENhbGxiYWNrKGhhc1RpbWVSZW1haW5pbmcsIGN1cnJlbnRUaW1lKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGhhc01vcmVXb3JrKSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSB3b3JrLCBzY2hlZHVsZSB0aGUgbmV4dCBtZXNzYWdlIGV2ZW50IGF0IHRoZSBlbmRcbiAgICAgICAgLy8gb2YgdGhlIHByZWNlZGluZyBvbmUuXG4gICAgICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICAgICAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICB9IC8vIFlpZWxkaW5nIHRvIHRoZSBicm93c2VyIHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0byBwYWludCwgc28gd2UgY2FuXG59O1xuXG52YXIgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbmlmICh0eXBlb2YgbG9jYWxTZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gTm9kZS5qcyBhbmQgb2xkIElFLlxuICAvLyBUaGVyZSdzIGEgZmV3IHJlYXNvbnMgZm9yIHdoeSB3ZSBwcmVmZXIgc2V0SW1tZWRpYXRlLlxuICAvL1xuICAvLyBVbmxpa2UgTWVzc2FnZUNoYW5uZWwsIGl0IGRvZXNuJ3QgcHJldmVudCBhIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gIC8vIChFdmVuIHRob3VnaCB0aGlzIGlzIGEgRE9NIGZvcmsgb2YgdGhlIFNjaGVkdWxlciwgeW91IGNvdWxkIGdldCBoZXJlXG4gIC8vIHdpdGggYSBtaXggb2YgTm9kZS5qcyAxNSssIHdoaWNoIGhhcyBhIE1lc3NhZ2VDaGFubmVsLCBhbmQganNkb20uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIwNzU2XG4gIC8vXG4gIC8vIEJ1dCBhbHNvLCBpdCBydW5zIGVhcmxpZXIgd2hpY2ggaXMgdGhlIHNlbWFudGljIHdlIHdhbnQuXG4gIC8vIElmIG90aGVyIGJyb3dzZXJzIGV2ZXIgaW1wbGVtZW50IGl0LCBpdCdzIGJldHRlciB0byB1c2UgaXQuXG4gIC8vIEFsdGhvdWdoIGJvdGggb2YgdGhlc2Ugd291bGQgYmUgaW5mZXJpb3IgdG8gbmF0aXZlIHNjaGVkdWxpbmcuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0SW1tZWRpYXRlKHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSk7XG4gIH07XG59IGVsc2UgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gRE9NIGFuZCBXb3JrZXIgZW52aXJvbm1lbnRzLlxuICAvLyBXZSBwcmVmZXIgTWVzc2FnZUNoYW5uZWwgYmVjYXVzZSBvZiB0aGUgNG1zIHNldFRpbWVvdXQgY2xhbXBpbmcuXG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydC5wb3N0TWVzc2FnZShudWxsKTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIFdlIHNob3VsZCBvbmx5IGZhbGxiYWNrIGhlcmUgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldFRpbWVvdXQocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lLCAwKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RDYWxsYmFjayhjYWxsYmFjaykge1xuICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICBpZiAoIWlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSB0cnVlO1xuICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RUaW1lb3V0KGNhbGxiYWNrLCBtcykge1xuICB0YXNrVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayhleHBvcnRzLnVuc3RhYmxlX25vdygpKTtcbiAgfSwgbXMpO1xufVxuXG5mdW5jdGlvbiBjYW5jZWxIb3N0VGltZW91dCgpIHtcbiAgbG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCk7XG4gIHRhc2tUaW1lb3V0SUQgPSAtMTtcbn1cblxudmFyIHVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHJlcXVlc3RQYWludDtcbnZhciB1bnN0YWJsZV9Qcm9maWxpbmcgPSAgbnVsbDtcblxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5ID0gTG93UHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZyA9IHVuc3RhYmxlX1Byb2ZpbGluZztcbmV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb24gPSB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmb3JjZUZyYW1lUmF0ZTtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUgPSB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZTtcbmV4cG9ydHMudW5zdGFibGVfbmV4dCA9IHVuc3RhYmxlX25leHQ7XG5leHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uID0gdW5zdGFibGVfcGF1c2VFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHVuc3RhYmxlX3JlcXVlc3RQYWludDtcbmV4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5ID0gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrID0gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBzaG91bGRZaWVsZFRvSG9zdDtcbmV4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrID0gdW5zdGFibGVfd3JhcENhbGxiYWNrO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuLypcbiBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiovXG4ndXNlIHN0cmljdCc7dmFyIGFhPXJlcXVpcmUoXCJyZWFjdFwiKSxiYT1yZXF1aXJlKFwic2NoZWR1bGVyXCIpO2Z1bmN0aW9uIHAoYSl7Zm9yKHZhciBiPVwiaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9XCIrYSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyliKz1cIiZhcmdzW109XCIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tjXSk7cmV0dXJuXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjXCIrYStcIjsgdmlzaXQgXCIrYitcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuXCJ9dmFyIGRhPW5ldyBTZXQsZWE9e307ZnVuY3Rpb24gZmEoYSxiKXtoYShhLGIpO2hhKGErXCJDYXB0dXJlXCIsYil9XG5mdW5jdGlvbiBoYShhLGIpe2VhW2FdPWI7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylkYS5hZGQoYlthXSl9XG52YXIgaWE9IShcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvd3x8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3cuZG9jdW1lbnR8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpLGphPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksa2E9L15bOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRdWzpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDBdKiQvLGxhPVxue30sbWE9e307ZnVuY3Rpb24gbmEoYSl7aWYoamEuY2FsbChtYSxhKSlyZXR1cm4hMDtpZihqYS5jYWxsKGxhLGEpKXJldHVybiExO2lmKGthLnRlc3QoYSkpcmV0dXJuIG1hW2FdPSEwO2xhW2FdPSEwO3JldHVybiExfWZ1bmN0aW9uIG9hKGEsYixjLGQpe2lmKG51bGwhPT1jJiYwPT09Yy50eXBlKXJldHVybiExO3N3aXRjaCh0eXBlb2YgYil7Y2FzZSBcImZ1bmN0aW9uXCI6Y2FzZSBcInN5bWJvbFwiOnJldHVybiEwO2Nhc2UgXCJib29sZWFuXCI6aWYoZClyZXR1cm4hMTtpZihudWxsIT09YylyZXR1cm4hYy5hY2NlcHRzQm9vbGVhbnM7YT1hLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw1KTtyZXR1cm5cImRhdGEtXCIhPT1hJiZcImFyaWEtXCIhPT1hO2RlZmF1bHQ6cmV0dXJuITF9fVxuZnVuY3Rpb24gcGEoYSxiLGMsZCl7aWYobnVsbD09PWJ8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYnx8b2EoYSxiLGMsZCkpcmV0dXJuITA7aWYoZClyZXR1cm4hMTtpZihudWxsIT09Yylzd2l0Y2goYy50eXBlKXtjYXNlIDM6cmV0dXJuIWI7Y2FzZSA0OnJldHVybiExPT09YjtjYXNlIDU6cmV0dXJuIGlzTmFOKGIpO2Nhc2UgNjpyZXR1cm4gaXNOYU4oYil8fDE+Yn1yZXR1cm4hMX1mdW5jdGlvbiB0KGEsYixjLGQsZSxmLGcpe3RoaXMuYWNjZXB0c0Jvb2xlYW5zPTI9PT1ifHwzPT09Ynx8ND09PWI7dGhpcy5hdHRyaWJ1dGVOYW1lPWQ7dGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2U9ZTt0aGlzLm11c3RVc2VQcm9wZXJ0eT1jO3RoaXMucHJvcGVydHlOYW1lPWE7dGhpcy50eXBlPWI7dGhpcy5zYW5pdGl6ZVVSTD1mO3RoaXMucmVtb3ZlRW1wdHlTdHJpbmc9Z312YXIgej17fTtcblwiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDAsITEsYSxudWxsLCExLCExKX0pO1tbXCJhY2NlcHRDaGFyc2V0XCIsXCJhY2NlcHQtY2hhcnNldFwiXSxbXCJjbGFzc05hbWVcIixcImNsYXNzXCJdLFtcImh0bWxGb3JcIixcImZvclwiXSxbXCJodHRwRXF1aXZcIixcImh0dHAtZXF1aXZcIl1dLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YVswXTt6W2JdPW5ldyB0KGIsMSwhMSxhWzFdLG51bGwsITEsITEpfSk7W1wiY29udGVudEVkaXRhYmxlXCIsXCJkcmFnZ2FibGVcIixcInNwZWxsQ2hlY2tcIixcInZhbHVlXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDIsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7XG5bXCJhdXRvUmV2ZXJzZVwiLFwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFwiLFwiZm9jdXNhYmxlXCIsXCJwcmVzZXJ2ZUFscGhhXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDIsITEsYSxudWxsLCExLCExKX0pO1wiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHQoYSwzLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuW1wiY2hlY2tlZFwiLFwibXVsdGlwbGVcIixcIm11dGVkXCIsXCJzZWxlY3RlZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHQoYSwzLCEwLGEsbnVsbCwhMSwhMSl9KTtbXCJjYXB0dXJlXCIsXCJkb3dubG9hZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHQoYSw0LCExLGEsbnVsbCwhMSwhMSl9KTtbXCJjb2xzXCIsXCJyb3dzXCIsXCJzaXplXCIsXCJzcGFuXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDYsITEsYSxudWxsLCExLCExKX0pO1tcInJvd1NwYW5cIixcInN0YXJ0XCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDUsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7dmFyIHFhPS9bXFwtOl0oW2Etel0pL2c7ZnVuY3Rpb24gcmEoYSl7cmV0dXJuIGFbMV0udG9VcHBlckNhc2UoKX1cblwiYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHRcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UocWEsXG5yYSk7eltiXT1uZXcgdChiLDEsITEsYSxudWxsLCExLCExKX0pO1wieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKHFhLHJhKTt6W2JdPW5ldyB0KGIsMSwhMSxhLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCExLCExKX0pO1tcInhtbDpiYXNlXCIsXCJ4bWw6bGFuZ1wiLFwieG1sOnNwYWNlXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKHFhLHJhKTt6W2JdPW5ldyB0KGIsMSwhMSxhLFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsITEsITEpfSk7W1widGFiSW5kZXhcIixcImNyb3NzT3JpZ2luXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDEsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7XG56LnhsaW5rSHJlZj1uZXcgdChcInhsaW5rSHJlZlwiLDEsITEsXCJ4bGluazpocmVmXCIsXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsITAsITEpO1tcInNyY1wiLFwiaHJlZlwiLFwiYWN0aW9uXCIsXCJmb3JtQWN0aW9uXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDEsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITAsITApfSk7XG5mdW5jdGlvbiBzYShhLGIsYyxkKXt2YXIgZT16Lmhhc093blByb3BlcnR5KGIpP3pbYl06bnVsbDtpZihudWxsIT09ZT8wIT09ZS50eXBlOmR8fCEoMjxiLmxlbmd0aCl8fFwib1wiIT09YlswXSYmXCJPXCIhPT1iWzBdfHxcIm5cIiE9PWJbMV0mJlwiTlwiIT09YlsxXSlwYShiLGMsZSxkKSYmKGM9bnVsbCksZHx8bnVsbD09PWU/bmEoYikmJihudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTphLnNldEF0dHJpYnV0ZShiLFwiXCIrYykpOmUubXVzdFVzZVByb3BlcnR5P2FbZS5wcm9wZXJ0eU5hbWVdPW51bGw9PT1jPzM9PT1lLnR5cGU/ITE6XCJcIjpjOihiPWUuYXR0cmlidXRlTmFtZSxkPWUuYXR0cmlidXRlTmFtZXNwYWNlLG51bGw9PT1jP2EucmVtb3ZlQXR0cmlidXRlKGIpOihlPWUudHlwZSxjPTM9PT1lfHw0PT09ZSYmITA9PT1jP1wiXCI6XCJcIitjLGQ/YS5zZXRBdHRyaWJ1dGVOUyhkLGIsYyk6YS5zZXRBdHRyaWJ1dGUoYixjKSkpfVxudmFyIHRhPWFhLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELHVhPVN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpLHZhPVN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIiksd2E9U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLHhhPVN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKSx6YT1TeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIiksQWE9U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpLEJhPVN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpLENhPVN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxEYT1TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIiksRWE9U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIiksRmE9U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIiksR2E9U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik7U3ltYm9sLmZvcihcInJlYWN0LnNjb3BlXCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlXCIpO1xudmFyIEhhPVN5bWJvbC5mb3IoXCJyZWFjdC5vZmZzY3JlZW5cIik7U3ltYm9sLmZvcihcInJlYWN0LmxlZ2FjeV9oaWRkZW5cIik7U3ltYm9sLmZvcihcInJlYWN0LmNhY2hlXCIpO1N5bWJvbC5mb3IoXCJyZWFjdC50cmFjaW5nX21hcmtlclwiKTt2YXIgSWE9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIEphKGEpe2lmKG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGEpcmV0dXJuIG51bGw7YT1JYSYmYVtJYV18fGFbXCJAQGl0ZXJhdG9yXCJdO3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhP2E6bnVsbH12YXIgQT1PYmplY3QuYXNzaWduLEthO2Z1bmN0aW9uIExhKGEpe2lmKHZvaWQgMD09PUthKXRyeXt0aHJvdyBFcnJvcigpO31jYXRjaChjKXt2YXIgYj1jLnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO0thPWImJmJbMV18fFwiXCJ9cmV0dXJuXCJcXG5cIitLYSthfXZhciBNYT0hMTtcbmZ1bmN0aW9uIE5hKGEsYil7aWYoIWF8fE1hKXJldHVyblwiXCI7TWE9ITA7dmFyIGM9RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9dm9pZCAwO3RyeXtpZihiKWlmKGI9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpO30sT2JqZWN0LmRlZmluZVByb3BlcnR5KGIucHJvdG90eXBlLFwicHJvcHNcIix7c2V0OmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKTt9fSksXCJvYmplY3RcIj09PXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KGIsW10pfWNhdGNoKGwpe3ZhciBkPWx9UmVmbGVjdC5jb25zdHJ1Y3QoYSxbXSxiKX1lbHNle3RyeXtiLmNhbGwoKX1jYXRjaChsKXtkPWx9YS5jYWxsKGIucHJvdG90eXBlKX1lbHNle3RyeXt0aHJvdyBFcnJvcigpO31jYXRjaChsKXtkPWx9YSgpfX1jYXRjaChsKXtpZihsJiZkJiZcInN0cmluZ1wiPT09dHlwZW9mIGwuc3RhY2spe2Zvcih2YXIgZT1sLnN0YWNrLnNwbGl0KFwiXFxuXCIpLFxuZj1kLnN0YWNrLnNwbGl0KFwiXFxuXCIpLGc9ZS5sZW5ndGgtMSxoPWYubGVuZ3RoLTE7MTw9ZyYmMDw9aCYmZVtnXSE9PWZbaF07KWgtLTtmb3IoOzE8PWcmJjA8PWg7Zy0tLGgtLSlpZihlW2ddIT09ZltoXSl7aWYoMSE9PWd8fDEhPT1oKXtkbyBpZihnLS0saC0tLDA+aHx8ZVtnXSE9PWZbaF0pe3ZhciBrPVwiXFxuXCIrZVtnXS5yZXBsYWNlKFwiIGF0IG5ldyBcIixcIiBhdCBcIik7YS5kaXNwbGF5TmFtZSYmay5pbmNsdWRlcyhcIjxhbm9ueW1vdXM+XCIpJiYoaz1rLnJlcGxhY2UoXCI8YW5vbnltb3VzPlwiLGEuZGlzcGxheU5hbWUpKTtyZXR1cm4ga313aGlsZSgxPD1nJiYwPD1oKX1icmVha319fWZpbmFsbHl7TWE9ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9Y31yZXR1cm4oYT1hP2EuZGlzcGxheU5hbWV8fGEubmFtZTpcIlwiKT9MYShhKTpcIlwifVxuZnVuY3Rpb24gT2EoYSl7c3dpdGNoKGEudGFnKXtjYXNlIDU6cmV0dXJuIExhKGEudHlwZSk7Y2FzZSAxNjpyZXR1cm4gTGEoXCJMYXp5XCIpO2Nhc2UgMTM6cmV0dXJuIExhKFwiU3VzcGVuc2VcIik7Y2FzZSAxOTpyZXR1cm4gTGEoXCJTdXNwZW5zZUxpc3RcIik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiBhPU5hKGEudHlwZSwhMSksYTtjYXNlIDExOnJldHVybiBhPU5hKGEudHlwZS5yZW5kZXIsITEpLGE7Y2FzZSAxOnJldHVybiBhPU5hKGEudHlwZSwhMCksYTtkZWZhdWx0OnJldHVyblwiXCJ9fVxuZnVuY3Rpb24gUGEoYSl7aWYobnVsbD09YSlyZXR1cm4gbnVsbDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gYS5kaXNwbGF5TmFtZXx8YS5uYW1lfHxudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtzd2l0Y2goYSl7Y2FzZSB3YTpyZXR1cm5cIkZyYWdtZW50XCI7Y2FzZSB2YTpyZXR1cm5cIlBvcnRhbFwiO2Nhc2UgemE6cmV0dXJuXCJQcm9maWxlclwiO2Nhc2UgeGE6cmV0dXJuXCJTdHJpY3RNb2RlXCI7Y2FzZSBEYTpyZXR1cm5cIlN1c3BlbnNlXCI7Y2FzZSBFYTpyZXR1cm5cIlN1c3BlbnNlTGlzdFwifWlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSlzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSBCYTpyZXR1cm4oYS5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLkNvbnN1bWVyXCI7Y2FzZSBBYTpyZXR1cm4oYS5fY29udGV4dC5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLlByb3ZpZGVyXCI7Y2FzZSBDYTp2YXIgYj1hLnJlbmRlcjthPWEuZGlzcGxheU5hbWU7YXx8KGE9Yi5kaXNwbGF5TmFtZXx8XG5iLm5hbWV8fFwiXCIsYT1cIlwiIT09YT9cIkZvcndhcmRSZWYoXCIrYStcIilcIjpcIkZvcndhcmRSZWZcIik7cmV0dXJuIGE7Y2FzZSBGYTpyZXR1cm4gYj1hLmRpc3BsYXlOYW1lfHxudWxsLG51bGwhPT1iP2I6UGEoYS50eXBlKXx8XCJNZW1vXCI7Y2FzZSBHYTpiPWEuX3BheWxvYWQ7YT1hLl9pbml0O3RyeXtyZXR1cm4gUGEoYShiKSl9Y2F0Y2goYyl7fX1yZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIFFhKGEpe3ZhciBiPWEudHlwZTtzd2l0Y2goYS50YWcpe2Nhc2UgMjQ6cmV0dXJuXCJDYWNoZVwiO2Nhc2UgOTpyZXR1cm4oYi5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLkNvbnN1bWVyXCI7Y2FzZSAxMDpyZXR1cm4oYi5fY29udGV4dC5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLlByb3ZpZGVyXCI7Y2FzZSAxODpyZXR1cm5cIkRlaHlkcmF0ZWRGcmFnbWVudFwiO2Nhc2UgMTE6cmV0dXJuIGE9Yi5yZW5kZXIsYT1hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fFwiXCIsYi5kaXNwbGF5TmFtZXx8KFwiXCIhPT1hP1wiRm9yd2FyZFJlZihcIithK1wiKVwiOlwiRm9yd2FyZFJlZlwiKTtjYXNlIDc6cmV0dXJuXCJGcmFnbWVudFwiO2Nhc2UgNTpyZXR1cm4gYjtjYXNlIDQ6cmV0dXJuXCJQb3J0YWxcIjtjYXNlIDM6cmV0dXJuXCJSb290XCI7Y2FzZSA2OnJldHVyblwiVGV4dFwiO2Nhc2UgMTY6cmV0dXJuIFBhKGIpO2Nhc2UgODpyZXR1cm4gYj09PXhhP1wiU3RyaWN0TW9kZVwiOlwiTW9kZVwiO2Nhc2UgMjI6cmV0dXJuXCJPZmZzY3JlZW5cIjtcbmNhc2UgMTI6cmV0dXJuXCJQcm9maWxlclwiO2Nhc2UgMjE6cmV0dXJuXCJTY29wZVwiO2Nhc2UgMTM6cmV0dXJuXCJTdXNwZW5zZVwiO2Nhc2UgMTk6cmV0dXJuXCJTdXNwZW5zZUxpc3RcIjtjYXNlIDI1OnJldHVyblwiVHJhY2luZ01hcmtlclwiO2Nhc2UgMTpjYXNlIDA6Y2FzZSAxNzpjYXNlIDI6Y2FzZSAxNDpjYXNlIDE1OmlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKXJldHVybiBiLmRpc3BsYXlOYW1lfHxiLm5hbWV8fG51bGw7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBiKXJldHVybiBifXJldHVybiBudWxsfWZ1bmN0aW9uIFJhKGEpe3N3aXRjaCh0eXBlb2YgYSl7Y2FzZSBcImJvb2xlYW5cIjpjYXNlIFwibnVtYmVyXCI6Y2FzZSBcInN0cmluZ1wiOmNhc2UgXCJ1bmRlZmluZWRcIjpyZXR1cm4gYTtjYXNlIFwib2JqZWN0XCI6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1cbmZ1bmN0aW9uIFNhKGEpe3ZhciBiPWEudHlwZTtyZXR1cm4oYT1hLm5vZGVOYW1lKSYmXCJpbnB1dFwiPT09YS50b0xvd2VyQ2FzZSgpJiYoXCJjaGVja2JveFwiPT09Ynx8XCJyYWRpb1wiPT09Yil9XG5mdW5jdGlvbiBUYShhKXt2YXIgYj1TYShhKT9cImNoZWNrZWRcIjpcInZhbHVlXCIsYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEuY29uc3RydWN0b3IucHJvdG90eXBlLGIpLGQ9XCJcIithW2JdO2lmKCFhLmhhc093blByb3BlcnR5KGIpJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIGMmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLmdldCYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGMuc2V0KXt2YXIgZT1jLmdldCxmPWMuc2V0O09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYSl7ZD1cIlwiK2E7Zi5jYWxsKHRoaXMsYSl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7ZW51bWVyYWJsZTpjLmVudW1lcmFibGV9KTtyZXR1cm57Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZH0sc2V0VmFsdWU6ZnVuY3Rpb24oYSl7ZD1cIlwiK2F9LHN0b3BUcmFja2luZzpmdW5jdGlvbigpe2EuX3ZhbHVlVHJhY2tlcj1cbm51bGw7ZGVsZXRlIGFbYl19fX19ZnVuY3Rpb24gVWEoYSl7YS5fdmFsdWVUcmFja2VyfHwoYS5fdmFsdWVUcmFja2VyPVRhKGEpKX1mdW5jdGlvbiBWYShhKXtpZighYSlyZXR1cm4hMTt2YXIgYj1hLl92YWx1ZVRyYWNrZXI7aWYoIWIpcmV0dXJuITA7dmFyIGM9Yi5nZXRWYWx1ZSgpO3ZhciBkPVwiXCI7YSYmKGQ9U2EoYSk/YS5jaGVja2VkP1widHJ1ZVwiOlwiZmFsc2VcIjphLnZhbHVlKTthPWQ7cmV0dXJuIGEhPT1jPyhiLnNldFZhbHVlKGEpLCEwKTohMX1mdW5jdGlvbiBXYShhKXthPWF8fChcInVuZGVmaW5lZFwiIT09dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50OnZvaWQgMCk7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhKXJldHVybiBudWxsO3RyeXtyZXR1cm4gYS5hY3RpdmVFbGVtZW50fHxhLmJvZHl9Y2F0Y2goYil7cmV0dXJuIGEuYm9keX19XG5mdW5jdGlvbiBYYShhLGIpe3ZhciBjPWIuY2hlY2tlZDtyZXR1cm4gQSh7fSxiLHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTp2b2lkIDAsY2hlY2tlZDpudWxsIT1jP2M6YS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gWWEoYSxiKXt2YXIgYz1udWxsPT1iLmRlZmF1bHRWYWx1ZT9cIlwiOmIuZGVmYXVsdFZhbHVlLGQ9bnVsbCE9Yi5jaGVja2VkP2IuY2hlY2tlZDpiLmRlZmF1bHRDaGVja2VkO2M9UmEobnVsbCE9Yi52YWx1ZT9iLnZhbHVlOmMpO2EuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbENoZWNrZWQ6ZCxpbml0aWFsVmFsdWU6Yyxjb250cm9sbGVkOlwiY2hlY2tib3hcIj09PWIudHlwZXx8XCJyYWRpb1wiPT09Yi50eXBlP251bGwhPWIuY2hlY2tlZDpudWxsIT1iLnZhbHVlfX1mdW5jdGlvbiBaYShhLGIpe2I9Yi5jaGVja2VkO251bGwhPWImJnNhKGEsXCJjaGVja2VkXCIsYiwhMSl9XG5mdW5jdGlvbiAkYShhLGIpe1phKGEsYik7dmFyIGM9UmEoYi52YWx1ZSksZD1iLnR5cGU7aWYobnVsbCE9YylpZihcIm51bWJlclwiPT09ZCl7aWYoMD09PWMmJlwiXCI9PT1hLnZhbHVlfHxhLnZhbHVlIT1jKWEudmFsdWU9XCJcIitjfWVsc2UgYS52YWx1ZSE9PVwiXCIrYyYmKGEudmFsdWU9XCJcIitjKTtlbHNlIGlmKFwic3VibWl0XCI9PT1kfHxcInJlc2V0XCI9PT1kKXthLnJlbW92ZUF0dHJpYnV0ZShcInZhbHVlXCIpO3JldHVybn1iLmhhc093blByb3BlcnR5KFwidmFsdWVcIik/YmIoYSxiLnR5cGUsYyk6Yi5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSYmYmIoYSxiLnR5cGUsUmEoYi5kZWZhdWx0VmFsdWUpKTtudWxsPT1iLmNoZWNrZWQmJm51bGwhPWIuZGVmYXVsdENoZWNrZWQmJihhLmRlZmF1bHRDaGVja2VkPSEhYi5kZWZhdWx0Q2hlY2tlZCl9XG5mdW5jdGlvbiBjYihhLGIsYyl7aWYoYi5oYXNPd25Qcm9wZXJ0eShcInZhbHVlXCIpfHxiLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpKXt2YXIgZD1iLnR5cGU7aWYoIShcInN1Ym1pdFwiIT09ZCYmXCJyZXNldFwiIT09ZHx8dm9pZCAwIT09Yi52YWx1ZSYmbnVsbCE9PWIudmFsdWUpKXJldHVybjtiPVwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTtjfHxiPT09YS52YWx1ZXx8KGEudmFsdWU9Yik7YS5kZWZhdWx0VmFsdWU9Yn1jPWEubmFtZTtcIlwiIT09YyYmKGEubmFtZT1cIlwiKTthLmRlZmF1bHRDaGVja2VkPSEhYS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkO1wiXCIhPT1jJiYoYS5uYW1lPWMpfVxuZnVuY3Rpb24gYmIoYSxiLGMpe2lmKFwibnVtYmVyXCIhPT1ifHxXYShhLm93bmVyRG9jdW1lbnQpIT09YSludWxsPT1jP2EuZGVmYXVsdFZhbHVlPVwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTphLmRlZmF1bHRWYWx1ZSE9PVwiXCIrYyYmKGEuZGVmYXVsdFZhbHVlPVwiXCIrYyl9dmFyIGRiPUFycmF5LmlzQXJyYXk7XG5mdW5jdGlvbiBlYihhLGIsYyxkKXthPWEub3B0aW9ucztpZihiKXtiPXt9O2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKWJbXCIkXCIrY1tlXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyllPWIuaGFzT3duUHJvcGVydHkoXCIkXCIrYVtjXS52YWx1ZSksYVtjXS5zZWxlY3RlZCE9PWUmJihhW2NdLnNlbGVjdGVkPWUpLGUmJmQmJihhW2NdLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtjPVwiXCIrUmEoYyk7Yj1udWxsO2ZvcihlPTA7ZTxhLmxlbmd0aDtlKyspe2lmKGFbZV0udmFsdWU9PT1jKXthW2VdLnNlbGVjdGVkPSEwO2QmJihhW2VdLmRlZmF1bHRTZWxlY3RlZD0hMCk7cmV0dXJufW51bGwhPT1ifHxhW2VdLmRpc2FibGVkfHwoYj1hW2VdKX1udWxsIT09YiYmKGIuc2VsZWN0ZWQ9ITApfX1cbmZ1bmN0aW9uIGZiKGEsYil7aWYobnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCl0aHJvdyBFcnJvcihwKDkxKSk7cmV0dXJuIEEoe30sYix7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46XCJcIithLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlfSl9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYz1iLnZhbHVlO2lmKG51bGw9PWMpe2M9Yi5jaGlsZHJlbjtiPWIuZGVmYXVsdFZhbHVlO2lmKG51bGwhPWMpe2lmKG51bGwhPWIpdGhyb3cgRXJyb3IocCg5MikpO2lmKGRiKGMpKXtpZigxPGMubGVuZ3RoKXRocm93IEVycm9yKHAoOTMpKTtjPWNbMF19Yj1jfW51bGw9PWImJihiPVwiXCIpO2M9Yn1hLl93cmFwcGVyU3RhdGU9e2luaXRpYWxWYWx1ZTpSYShjKX19XG5mdW5jdGlvbiBoYihhLGIpe3ZhciBjPVJhKGIudmFsdWUpLGQ9UmEoYi5kZWZhdWx0VmFsdWUpO251bGwhPWMmJihjPVwiXCIrYyxjIT09YS52YWx1ZSYmKGEudmFsdWU9YyksbnVsbD09Yi5kZWZhdWx0VmFsdWUmJmEuZGVmYXVsdFZhbHVlIT09YyYmKGEuZGVmYXVsdFZhbHVlPWMpKTtudWxsIT1kJiYoYS5kZWZhdWx0VmFsdWU9XCJcIitkKX1mdW5jdGlvbiBpYihhKXt2YXIgYj1hLnRleHRDb250ZW50O2I9PT1hLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlJiZcIlwiIT09YiYmbnVsbCE9PWImJihhLnZhbHVlPWIpfWZ1bmN0aW9uIGpiKGEpe3N3aXRjaChhKXtjYXNlIFwic3ZnXCI6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO2Nhc2UgXCJtYXRoXCI6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI7ZGVmYXVsdDpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIn19XG5mdW5jdGlvbiBrYihhLGIpe3JldHVybiBudWxsPT1hfHxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj09PWE/amIoYik6XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPT09YSYmXCJmb3JlaWduT2JqZWN0XCI9PT1iP1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiOmF9XG52YXIgbGIsbWI9ZnVuY3Rpb24oYSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBNU0FwcCYmTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24/ZnVuY3Rpb24oYixjLGQsZSl7TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gYShiLGMsZCxlKX0pfTphfShmdW5jdGlvbihhLGIpe2lmKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiE9PWEubmFtZXNwYWNlVVJJfHxcImlubmVySFRNTFwiaW4gYSlhLmlubmVySFRNTD1iO2Vsc2V7bGI9bGJ8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7bGIuaW5uZXJIVE1MPVwiPHN2Zz5cIitiLnZhbHVlT2YoKS50b1N0cmluZygpK1wiPC9zdmc+XCI7Zm9yKGI9bGIuZmlyc3RDaGlsZDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IoO2IuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChiLmZpcnN0Q2hpbGQpfX0pO1xuZnVuY3Rpb24gbmIoYSxiKXtpZihiKXt2YXIgYz1hLmZpcnN0Q2hpbGQ7aWYoYyYmYz09PWEubGFzdENoaWxkJiYzPT09Yy5ub2RlVHlwZSl7Yy5ub2RlVmFsdWU9YjtyZXR1cm59fWEudGV4dENvbnRlbnQ9Yn1cbnZhciBvYj17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYXNwZWN0UmF0aW86ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxjb2x1bW5zOiEwLGZsZXg6ITAsZmxleEdyb3c6ITAsZmxleFBvc2l0aXZlOiEwLGZsZXhTaHJpbms6ITAsZmxleE5lZ2F0aXZlOiEwLGZsZXhPcmRlcjohMCxncmlkQXJlYTohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1NwYW46ITAsZ3JpZFJvd1N0YXJ0OiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3BhbjohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZm9udFdlaWdodDohMCxsaW5lQ2xhbXA6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsdGFiU2l6ZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLFxuem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxwYj1bXCJXZWJraXRcIixcIm1zXCIsXCJNb3pcIixcIk9cIl07T2JqZWN0LmtleXMob2IpLmZvckVhY2goZnVuY3Rpb24oYSl7cGIuZm9yRWFjaChmdW5jdGlvbihiKXtiPWIrYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnN1YnN0cmluZygxKTtvYltiXT1vYlthXX0pfSk7ZnVuY3Rpb24gcWIoYSxiLGMpe3JldHVybiBudWxsPT1ifHxcImJvb2xlYW5cIj09PXR5cGVvZiBifHxcIlwiPT09Yj9cIlwiOmN8fFwibnVtYmVyXCIhPT10eXBlb2YgYnx8MD09PWJ8fG9iLmhhc093blByb3BlcnR5KGEpJiZvYlthXT8oXCJcIitiKS50cmltKCk6YitcInB4XCJ9XG5mdW5jdGlvbiByYihhLGIpe2E9YS5zdHlsZTtmb3IodmFyIGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD0wPT09Yy5pbmRleE9mKFwiLS1cIiksZT1xYihjLGJbY10sZCk7XCJmbG9hdFwiPT09YyYmKGM9XCJjc3NGbG9hdFwiKTtkP2Euc2V0UHJvcGVydHkoYyxlKTphW2NdPWV9fXZhciBzYj1BKHttZW51aXRlbTohMH0se2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0pO1xuZnVuY3Rpb24gdGIoYSxiKXtpZihiKXtpZihzYlthXSYmKG51bGwhPWIuY2hpbGRyZW58fG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHAoMTM3LGEpKTtpZihudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKXtpZihudWxsIT1iLmNoaWxkcmVuKXRocm93IEVycm9yKHAoNjApKTtpZihcIm9iamVjdFwiIT09dHlwZW9mIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUx8fCEoXCJfX2h0bWxcImluIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHAoNjEpKTt9aWYobnVsbCE9Yi5zdHlsZSYmXCJvYmplY3RcIiE9PXR5cGVvZiBiLnN0eWxlKXRocm93IEVycm9yKHAoNjIpKTt9fVxuZnVuY3Rpb24gdWIoYSxiKXtpZigtMT09PWEuaW5kZXhPZihcIi1cIikpcmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBiLmlzO3N3aXRjaChhKXtjYXNlIFwiYW5ub3RhdGlvbi14bWxcIjpjYXNlIFwiY29sb3ItcHJvZmlsZVwiOmNhc2UgXCJmb250LWZhY2VcIjpjYXNlIFwiZm9udC1mYWNlLXNyY1wiOmNhc2UgXCJmb250LWZhY2UtdXJpXCI6Y2FzZSBcImZvbnQtZmFjZS1mb3JtYXRcIjpjYXNlIFwiZm9udC1mYWNlLW5hbWVcIjpjYXNlIFwibWlzc2luZy1nbHlwaFwiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fXZhciB2Yj1udWxsO2Z1bmN0aW9uIHdiKGEpe2E9YS50YXJnZXR8fGEuc3JjRWxlbWVudHx8d2luZG93O2EuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJihhPWEuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpO3JldHVybiAzPT09YS5ub2RlVHlwZT9hLnBhcmVudE5vZGU6YX12YXIgeGI9bnVsbCx5Yj1udWxsLHpiPW51bGw7XG5mdW5jdGlvbiBBYihhKXtpZihhPUJiKGEpKXtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgeGIpdGhyb3cgRXJyb3IocCgyODApKTt2YXIgYj1hLnN0YXRlTm9kZTtiJiYoYj1DYihiKSx4YihhLnN0YXRlTm9kZSxhLnR5cGUsYikpfX1mdW5jdGlvbiBEYihhKXt5Yj96Yj96Yi5wdXNoKGEpOnpiPVthXTp5Yj1hfWZ1bmN0aW9uIEViKCl7aWYoeWIpe3ZhciBhPXliLGI9emI7emI9eWI9bnVsbDtBYihhKTtpZihiKWZvcihhPTA7YTxiLmxlbmd0aDthKyspQWIoYlthXSl9fWZ1bmN0aW9uIEZiKGEsYil7cmV0dXJuIGEoYil9ZnVuY3Rpb24gR2IoKXt9dmFyIEhiPSExO2Z1bmN0aW9uIEliKGEsYixjKXtpZihIYilyZXR1cm4gYShiLGMpO0hiPSEwO3RyeXtyZXR1cm4gRmIoYSxiLGMpfWZpbmFsbHl7aWYoSGI9ITEsbnVsbCE9PXlifHxudWxsIT09emIpR2IoKSxFYigpfX1cbmZ1bmN0aW9uIEpiKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7aWYobnVsbD09PWMpcmV0dXJuIG51bGw7dmFyIGQ9Q2IoYyk7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7Yz1kW2JdO2E6c3dpdGNoKGIpe2Nhc2UgXCJvbkNsaWNrXCI6Y2FzZSBcIm9uQ2xpY2tDYXB0dXJlXCI6Y2FzZSBcIm9uRG91YmxlQ2xpY2tcIjpjYXNlIFwib25Eb3VibGVDbGlja0NhcHR1cmVcIjpjYXNlIFwib25Nb3VzZURvd25cIjpjYXNlIFwib25Nb3VzZURvd25DYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VNb3ZlXCI6Y2FzZSBcIm9uTW91c2VNb3ZlQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlVXBcIjpjYXNlIFwib25Nb3VzZVVwQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlRW50ZXJcIjooZD0hZC5kaXNhYmxlZCl8fChhPWEudHlwZSxkPSEoXCJidXR0b25cIj09PWF8fFwiaW5wdXRcIj09PWF8fFwic2VsZWN0XCI9PT1hfHxcInRleHRhcmVhXCI9PT1hKSk7YT0hZDticmVhayBhO2RlZmF1bHQ6YT0hMX1pZihhKXJldHVybiBudWxsO2lmKGMmJlwiZnVuY3Rpb25cIiE9PVxudHlwZW9mIGMpdGhyb3cgRXJyb3IocCgyMzEsYix0eXBlb2YgYykpO3JldHVybiBjfXZhciBLYj0hMTtpZihpYSl0cnl7dmFyIExiPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShMYixcInBhc3NpdmVcIix7Z2V0OmZ1bmN0aW9uKCl7S2I9ITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsTGIsTGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidGVzdFwiLExiLExiKX1jYXRjaChhKXtLYj0hMX1mdW5jdGlvbiBNYihhLGIsYyxkLGUsZixnLGgsayl7dmFyIGw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO3RyeXtiLmFwcGx5KGMsbCl9Y2F0Y2gobil7dGhpcy5vbkVycm9yKG4pfX12YXIgTmI9ITEsT2I9bnVsbCxQYj0hMSxRYj1udWxsLFJiPXtvbkVycm9yOmZ1bmN0aW9uKGEpe05iPSEwO09iPWF9fTtmdW5jdGlvbiBTYihhLGIsYyxkLGUsZixnLGgsayl7TmI9ITE7T2I9bnVsbDtNYi5hcHBseShSYixhcmd1bWVudHMpfVxuZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYsZyxoLGspe1NiLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihOYil7aWYoTmIpe3ZhciBsPU9iO05iPSExO09iPW51bGx9ZWxzZSB0aHJvdyBFcnJvcihwKDE5OCkpO1BifHwoUGI9ITAsUWI9bCl9fWZ1bmN0aW9uIFViKGEpe3ZhciBiPWEsYz1hO2lmKGEuYWx0ZXJuYXRlKWZvcig7Yi5yZXR1cm47KWI9Yi5yZXR1cm47ZWxzZXthPWI7ZG8gYj1hLDAhPT0oYi5mbGFncyY0MDk4KSYmKGM9Yi5yZXR1cm4pLGE9Yi5yZXR1cm47d2hpbGUoYSl9cmV0dXJuIDM9PT1iLnRhZz9jOm51bGx9ZnVuY3Rpb24gVmIoYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9YS5tZW1vaXplZFN0YXRlO251bGw9PT1iJiYoYT1hLmFsdGVybmF0ZSxudWxsIT09YSYmKGI9YS5tZW1vaXplZFN0YXRlKSk7aWYobnVsbCE9PWIpcmV0dXJuIGIuZGVoeWRyYXRlZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBXYihhKXtpZihVYihhKSE9PWEpdGhyb3cgRXJyb3IocCgxODgpKTt9XG5mdW5jdGlvbiBYYihhKXt2YXIgYj1hLmFsdGVybmF0ZTtpZighYil7Yj1VYihhKTtpZihudWxsPT09Yil0aHJvdyBFcnJvcihwKDE4OCkpO3JldHVybiBiIT09YT9udWxsOmF9Zm9yKHZhciBjPWEsZD1iOzspe3ZhciBlPWMucmV0dXJuO2lmKG51bGw9PT1lKWJyZWFrO3ZhciBmPWUuYWx0ZXJuYXRlO2lmKG51bGw9PT1mKXtkPWUucmV0dXJuO2lmKG51bGwhPT1kKXtjPWQ7Y29udGludWV9YnJlYWt9aWYoZS5jaGlsZD09PWYuY2hpbGQpe2ZvcihmPWUuY2hpbGQ7Zjspe2lmKGY9PT1jKXJldHVybiBXYihlKSxhO2lmKGY9PT1kKXJldHVybiBXYihlKSxiO2Y9Zi5zaWJsaW5nfXRocm93IEVycm9yKHAoMTg4KSk7fWlmKGMucmV0dXJuIT09ZC5yZXR1cm4pYz1lLGQ9ZjtlbHNle2Zvcih2YXIgZz0hMSxoPWUuY2hpbGQ7aDspe2lmKGg9PT1jKXtnPSEwO2M9ZTtkPWY7YnJlYWt9aWYoaD09PWQpe2c9ITA7ZD1lO2M9ZjticmVha31oPWguc2libGluZ31pZighZyl7Zm9yKGg9Zi5jaGlsZDtoOyl7aWYoaD09PVxuYyl7Zz0hMDtjPWY7ZD1lO2JyZWFrfWlmKGg9PT1kKXtnPSEwO2Q9ZjtjPWU7YnJlYWt9aD1oLnNpYmxpbmd9aWYoIWcpdGhyb3cgRXJyb3IocCgxODkpKTt9fWlmKGMuYWx0ZXJuYXRlIT09ZCl0aHJvdyBFcnJvcihwKDE5MCkpO31pZigzIT09Yy50YWcpdGhyb3cgRXJyb3IocCgxODgpKTtyZXR1cm4gYy5zdGF0ZU5vZGUuY3VycmVudD09PWM/YTpifWZ1bmN0aW9uIFliKGEpe2E9WGIoYSk7cmV0dXJuIG51bGwhPT1hP1piKGEpOm51bGx9ZnVuY3Rpb24gWmIoYSl7aWYoNT09PWEudGFnfHw2PT09YS50YWcpcmV0dXJuIGE7Zm9yKGE9YS5jaGlsZDtudWxsIT09YTspe3ZhciBiPVpiKGEpO2lmKG51bGwhPT1iKXJldHVybiBiO2E9YS5zaWJsaW5nfXJldHVybiBudWxsfVxudmFyICRiPWJhLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssYWM9YmEudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2ssYmM9YmEudW5zdGFibGVfc2hvdWxkWWllbGQsY2M9YmEudW5zdGFibGVfcmVxdWVzdFBhaW50LEI9YmEudW5zdGFibGVfbm93LGRjPWJhLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLGVjPWJhLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LGZjPWJhLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LGdjPWJhLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LGhjPWJhLnVuc3RhYmxlX0xvd1ByaW9yaXR5LGljPWJhLnVuc3RhYmxlX0lkbGVQcmlvcml0eSxqYz1udWxsLGtjPW51bGw7ZnVuY3Rpb24gbGMoYSl7aWYoa2MmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBrYy5vbkNvbW1pdEZpYmVyUm9vdCl0cnl7a2Mub25Db21taXRGaWJlclJvb3QoamMsYSx2b2lkIDAsMTI4PT09KGEuY3VycmVudC5mbGFncyYxMjgpKX1jYXRjaChiKXt9fVxudmFyIG5jPU1hdGguY2x6MzI/TWF0aC5jbHozMjptYyxvYz1NYXRoLmxvZyxwYz1NYXRoLkxOMjtmdW5jdGlvbiBtYyhhKXthPj4+PTA7cmV0dXJuIDA9PT1hPzMyOjMxLShvYyhhKS9wY3wwKXwwfXZhciBxYz02NCxyYz00MTk0MzA0O1xuZnVuY3Rpb24gc2MoYSl7c3dpdGNoKGEmLWEpe2Nhc2UgMTpyZXR1cm4gMTtjYXNlIDI6cmV0dXJuIDI7Y2FzZSA0OnJldHVybiA0O2Nhc2UgODpyZXR1cm4gODtjYXNlIDE2OnJldHVybiAxNjtjYXNlIDMyOnJldHVybiAzMjtjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiBhJjQxOTQyNDA7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4gYSYxMzAwMjM0MjQ7Y2FzZSAxMzQyMTc3Mjg6cmV0dXJuIDEzNDIxNzcyODtjYXNlIDI2ODQzNTQ1NjpyZXR1cm4gMjY4NDM1NDU2O2Nhc2UgNTM2ODcwOTEyOnJldHVybiA1MzY4NzA5MTI7Y2FzZSAxMDczNzQxODI0OnJldHVybiAxMDczNzQxODI0O1xuZGVmYXVsdDpyZXR1cm4gYX19ZnVuY3Rpb24gdGMoYSxiKXt2YXIgYz1hLnBlbmRpbmdMYW5lcztpZigwPT09YylyZXR1cm4gMDt2YXIgZD0wLGU9YS5zdXNwZW5kZWRMYW5lcyxmPWEucGluZ2VkTGFuZXMsZz1jJjI2ODQzNTQ1NTtpZigwIT09Zyl7dmFyIGg9ZyZ+ZTswIT09aD9kPXNjKGgpOihmJj1nLDAhPT1mJiYoZD1zYyhmKSkpfWVsc2UgZz1jJn5lLDAhPT1nP2Q9c2MoZyk6MCE9PWYmJihkPXNjKGYpKTtpZigwPT09ZClyZXR1cm4gMDtpZigwIT09YiYmYiE9PWQmJjA9PT0oYiZlKSYmKGU9ZCYtZCxmPWImLWIsZT49Znx8MTY9PT1lJiYwIT09KGYmNDE5NDI0MCkpKXJldHVybiBiOzAhPT0oZCY0KSYmKGR8PWMmMTYpO2I9YS5lbnRhbmdsZWRMYW5lcztpZigwIT09Yilmb3IoYT1hLmVudGFuZ2xlbWVudHMsYiY9ZDswPGI7KWM9MzEtbmMoYiksZT0xPDxjLGR8PWFbY10sYiY9fmU7cmV0dXJuIGR9XG5mdW5jdGlvbiB1YyhhLGIpe3N3aXRjaChhKXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpyZXR1cm4gYisyNTA7Y2FzZSA4OmNhc2UgMTY6Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiBiKzVFMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybi0xO2Nhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1cbmZ1bmN0aW9uIHZjKGEsYil7Zm9yKHZhciBjPWEuc3VzcGVuZGVkTGFuZXMsZD1hLnBpbmdlZExhbmVzLGU9YS5leHBpcmF0aW9uVGltZXMsZj1hLnBlbmRpbmdMYW5lczswPGY7KXt2YXIgZz0zMS1uYyhmKSxoPTE8PGcsaz1lW2ddO2lmKC0xPT09ayl7aWYoMD09PShoJmMpfHwwIT09KGgmZCkpZVtnXT11YyhoLGIpfWVsc2Ugazw9YiYmKGEuZXhwaXJlZExhbmVzfD1oKTtmJj1+aH19ZnVuY3Rpb24gd2MoYSl7YT1hLnBlbmRpbmdMYW5lcyYtMTA3Mzc0MTgyNTtyZXR1cm4gMCE9PWE/YTphJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIHhjKCl7dmFyIGE9cWM7cWM8PD0xOzA9PT0ocWMmNDE5NDI0MCkmJihxYz02NCk7cmV0dXJuIGF9ZnVuY3Rpb24geWMoYSl7Zm9yKHZhciBiPVtdLGM9MDszMT5jO2MrKyliLnB1c2goYSk7cmV0dXJuIGJ9XG5mdW5jdGlvbiB6YyhhLGIsYyl7YS5wZW5kaW5nTGFuZXN8PWI7NTM2ODcwOTEyIT09YiYmKGEuc3VzcGVuZGVkTGFuZXM9MCxhLnBpbmdlZExhbmVzPTApO2E9YS5ldmVudFRpbWVzO2I9MzEtbmMoYik7YVtiXT1jfWZ1bmN0aW9uIEFjKGEsYil7dmFyIGM9YS5wZW5kaW5nTGFuZXMmfmI7YS5wZW5kaW5nTGFuZXM9YjthLnN1c3BlbmRlZExhbmVzPTA7YS5waW5nZWRMYW5lcz0wO2EuZXhwaXJlZExhbmVzJj1iO2EubXV0YWJsZVJlYWRMYW5lcyY9YjthLmVudGFuZ2xlZExhbmVzJj1iO2I9YS5lbnRhbmdsZW1lbnRzO3ZhciBkPWEuZXZlbnRUaW1lcztmb3IoYT1hLmV4cGlyYXRpb25UaW1lczswPGM7KXt2YXIgZT0zMS1uYyhjKSxmPTE8PGU7YltlXT0wO2RbZV09LTE7YVtlXT0tMTtjJj1+Zn19XG5mdW5jdGlvbiBCYyhhLGIpe3ZhciBjPWEuZW50YW5nbGVkTGFuZXN8PWI7Zm9yKGE9YS5lbnRhbmdsZW1lbnRzO2M7KXt2YXIgZD0zMS1uYyhjKSxlPTE8PGQ7ZSZifGFbZF0mYiYmKGFbZF18PWIpO2MmPX5lfX12YXIgQz0wO2Z1bmN0aW9uIENjKGEpe2EmPS1hO3JldHVybiAxPGE/NDxhPzAhPT0oYSYyNjg0MzU0NTUpPzE2OjUzNjg3MDkxMjo0OjF9dmFyIERjLEVjLEZjLEdjLEhjLEljPSExLEpjPVtdLEtjPW51bGwsTGM9bnVsbCxNYz1udWxsLE5jPW5ldyBNYXAsT2M9bmV3IE1hcCxQYz1bXSxRYz1cIm1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldCBzdWJtaXRcIi5zcGxpdChcIiBcIik7XG5mdW5jdGlvbiBSYyhhLGIpe3N3aXRjaChhKXtjYXNlIFwiZm9jdXNpblwiOmNhc2UgXCJmb2N1c291dFwiOktjPW51bGw7YnJlYWs7Y2FzZSBcImRyYWdlbnRlclwiOmNhc2UgXCJkcmFnbGVhdmVcIjpMYz1udWxsO2JyZWFrO2Nhc2UgXCJtb3VzZW92ZXJcIjpjYXNlIFwibW91c2VvdXRcIjpNYz1udWxsO2JyZWFrO2Nhc2UgXCJwb2ludGVyb3ZlclwiOmNhc2UgXCJwb2ludGVyb3V0XCI6TmMuZGVsZXRlKGIucG9pbnRlcklkKTticmVhaztjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpjYXNlIFwibG9zdHBvaW50ZXJjYXB0dXJlXCI6T2MuZGVsZXRlKGIucG9pbnRlcklkKX19XG5mdW5jdGlvbiBTYyhhLGIsYyxkLGUsZil7aWYobnVsbD09PWF8fGEubmF0aXZlRXZlbnQhPT1mKXJldHVybiBhPXtibG9ja2VkT246Yixkb21FdmVudE5hbWU6YyxldmVudFN5c3RlbUZsYWdzOmQsbmF0aXZlRXZlbnQ6Zix0YXJnZXRDb250YWluZXJzOltlXX0sbnVsbCE9PWImJihiPUJiKGIpLG51bGwhPT1iJiZFYyhiKSksYTthLmV2ZW50U3lzdGVtRmxhZ3N8PWQ7Yj1hLnRhcmdldENvbnRhaW5lcnM7bnVsbCE9PWUmJi0xPT09Yi5pbmRleE9mKGUpJiZiLnB1c2goZSk7cmV0dXJuIGF9XG5mdW5jdGlvbiBUYyhhLGIsYyxkLGUpe3N3aXRjaChiKXtjYXNlIFwiZm9jdXNpblwiOnJldHVybiBLYz1TYyhLYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJkcmFnZW50ZXJcIjpyZXR1cm4gTGM9U2MoTGMsYSxiLGMsZCxlKSwhMDtjYXNlIFwibW91c2VvdmVyXCI6cmV0dXJuIE1jPVNjKE1jLGEsYixjLGQsZSksITA7Y2FzZSBcInBvaW50ZXJvdmVyXCI6dmFyIGY9ZS5wb2ludGVySWQ7TmMuc2V0KGYsU2MoTmMuZ2V0KGYpfHxudWxsLGEsYixjLGQsZSkpO3JldHVybiEwO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOnJldHVybiBmPWUucG9pbnRlcklkLE9jLnNldChmLFNjKE9jLmdldChmKXx8bnVsbCxhLGIsYyxkLGUpKSwhMH1yZXR1cm4hMX1cbmZ1bmN0aW9uIFVjKGEpe3ZhciBiPVZjKGEudGFyZ2V0KTtpZihudWxsIT09Yil7dmFyIGM9VWIoYik7aWYobnVsbCE9PWMpaWYoYj1jLnRhZywxMz09PWIpe2lmKGI9VmIoYyksbnVsbCE9PWIpe2EuYmxvY2tlZE9uPWI7SGMoYS5wcmlvcml0eSxmdW5jdGlvbigpe0ZjKGMpfSk7cmV0dXJufX1lbHNlIGlmKDM9PT1iJiZjLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXthLmJsb2NrZWRPbj0zPT09Yy50YWc/Yy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3JldHVybn19YS5ibG9ja2VkT249bnVsbH1cbmZ1bmN0aW9uIFdjKGEpe2lmKG51bGwhPT1hLmJsb2NrZWRPbilyZXR1cm4hMTtmb3IodmFyIGI9YS50YXJnZXRDb250YWluZXJzOzA8Yi5sZW5ndGg7KXt2YXIgYz1YYyhhLmRvbUV2ZW50TmFtZSxhLmV2ZW50U3lzdGVtRmxhZ3MsYlswXSxhLm5hdGl2ZUV2ZW50KTtpZihudWxsPT09Yyl7Yz1hLm5hdGl2ZUV2ZW50O3ZhciBkPW5ldyBjLmNvbnN0cnVjdG9yKGMudHlwZSxjKTt2Yj1kO2MudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZCk7dmI9bnVsbH1lbHNlIHJldHVybiBiPUJiKGMpLG51bGwhPT1iJiZFYyhiKSxhLmJsb2NrZWRPbj1jLCExO2Iuc2hpZnQoKX1yZXR1cm4hMH1mdW5jdGlvbiBZYyhhLGIsYyl7V2MoYSkmJmMuZGVsZXRlKGIpfWZ1bmN0aW9uIFpjKCl7SWM9ITE7bnVsbCE9PUtjJiZXYyhLYykmJihLYz1udWxsKTtudWxsIT09TGMmJldjKExjKSYmKExjPW51bGwpO251bGwhPT1NYyYmV2MoTWMpJiYoTWM9bnVsbCk7TmMuZm9yRWFjaChZYyk7T2MuZm9yRWFjaChZYyl9XG5mdW5jdGlvbiAkYyhhLGIpe2EuYmxvY2tlZE9uPT09YiYmKGEuYmxvY2tlZE9uPW51bGwsSWN8fChJYz0hMCxiYS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKGJhLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFpjKSkpfVxuZnVuY3Rpb24gYWQoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gJGMoYixhKX1pZigwPEpjLmxlbmd0aCl7JGMoSmNbMF0sYSk7Zm9yKHZhciBjPTE7YzxKYy5sZW5ndGg7YysrKXt2YXIgZD1KY1tjXTtkLmJsb2NrZWRPbj09PWEmJihkLmJsb2NrZWRPbj1udWxsKX19bnVsbCE9PUtjJiYkYyhLYyxhKTtudWxsIT09TGMmJiRjKExjLGEpO251bGwhPT1NYyYmJGMoTWMsYSk7TmMuZm9yRWFjaChiKTtPYy5mb3JFYWNoKGIpO2ZvcihjPTA7YzxQYy5sZW5ndGg7YysrKWQ9UGNbY10sZC5ibG9ja2VkT249PT1hJiYoZC5ibG9ja2VkT249bnVsbCk7Zm9yKDswPFBjLmxlbmd0aCYmKGM9UGNbMF0sbnVsbD09PWMuYmxvY2tlZE9uKTspVWMoYyksbnVsbD09PWMuYmxvY2tlZE9uJiZQYy5zaGlmdCgpfXZhciBiZD10YS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxjZD0hMDtcbmZ1bmN0aW9uIGRkKGEsYixjLGQpe3ZhciBlPUMsZj1iZC50cmFuc2l0aW9uO2JkLnRyYW5zaXRpb249bnVsbDt0cnl7Qz0xLGVkKGEsYixjLGQpfWZpbmFsbHl7Qz1lLGJkLnRyYW5zaXRpb249Zn19ZnVuY3Rpb24gZmQoYSxiLGMsZCl7dmFyIGU9QyxmPWJkLnRyYW5zaXRpb247YmQudHJhbnNpdGlvbj1udWxsO3RyeXtDPTQsZWQoYSxiLGMsZCl9ZmluYWxseXtDPWUsYmQudHJhbnNpdGlvbj1mfX1cbmZ1bmN0aW9uIGVkKGEsYixjLGQpe2lmKGNkKXt2YXIgZT1YYyhhLGIsYyxkKTtpZihudWxsPT09ZSlnZChhLGIsZCxoZCxjKSxSYyhhLGQpO2Vsc2UgaWYoVGMoZSxhLGIsYyxkKSlkLnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoUmMoYSxkKSxiJjQmJi0xPFFjLmluZGV4T2YoYSkpe2Zvcig7bnVsbCE9PWU7KXt2YXIgZj1CYihlKTtudWxsIT09ZiYmRGMoZik7Zj1YYyhhLGIsYyxkKTtudWxsPT09ZiYmZ2QoYSxiLGQsaGQsYyk7aWYoZj09PWUpYnJlYWs7ZT1mfW51bGwhPT1lJiZkLnN0b3BQcm9wYWdhdGlvbigpfWVsc2UgZ2QoYSxiLGQsbnVsbCxjKX19dmFyIGhkPW51bGw7XG5mdW5jdGlvbiBYYyhhLGIsYyxkKXtoZD1udWxsO2E9d2IoZCk7YT1WYyhhKTtpZihudWxsIT09YSlpZihiPVViKGEpLG51bGw9PT1iKWE9bnVsbDtlbHNlIGlmKGM9Yi50YWcsMTM9PT1jKXthPVZiKGIpO2lmKG51bGwhPT1hKXJldHVybiBhO2E9bnVsbH1lbHNlIGlmKDM9PT1jKXtpZihiLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiAzPT09Yi50YWc/Yi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO2E9bnVsbH1lbHNlIGIhPT1hJiYoYT1udWxsKTtoZD1hO3JldHVybiBudWxsfVxuZnVuY3Rpb24gaWQoYSl7c3dpdGNoKGEpe2Nhc2UgXCJjYW5jZWxcIjpjYXNlIFwiY2xpY2tcIjpjYXNlIFwiY2xvc2VcIjpjYXNlIFwiY29udGV4dG1lbnVcIjpjYXNlIFwiY29weVwiOmNhc2UgXCJjdXRcIjpjYXNlIFwiYXV4Y2xpY2tcIjpjYXNlIFwiZGJsY2xpY2tcIjpjYXNlIFwiZHJhZ2VuZFwiOmNhc2UgXCJkcmFnc3RhcnRcIjpjYXNlIFwiZHJvcFwiOmNhc2UgXCJmb2N1c2luXCI6Y2FzZSBcImZvY3Vzb3V0XCI6Y2FzZSBcImlucHV0XCI6Y2FzZSBcImludmFsaWRcIjpjYXNlIFwia2V5ZG93blwiOmNhc2UgXCJrZXlwcmVzc1wiOmNhc2UgXCJrZXl1cFwiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwibW91c2V1cFwiOmNhc2UgXCJwYXN0ZVwiOmNhc2UgXCJwYXVzZVwiOmNhc2UgXCJwbGF5XCI6Y2FzZSBcInBvaW50ZXJjYW5jZWxcIjpjYXNlIFwicG9pbnRlcmRvd25cIjpjYXNlIFwicG9pbnRlcnVwXCI6Y2FzZSBcInJhdGVjaGFuZ2VcIjpjYXNlIFwicmVzZXRcIjpjYXNlIFwicmVzaXplXCI6Y2FzZSBcInNlZWtlZFwiOmNhc2UgXCJzdWJtaXRcIjpjYXNlIFwidG91Y2hjYW5jZWxcIjpjYXNlIFwidG91Y2hlbmRcIjpjYXNlIFwidG91Y2hzdGFydFwiOmNhc2UgXCJ2b2x1bWVjaGFuZ2VcIjpjYXNlIFwiY2hhbmdlXCI6Y2FzZSBcInNlbGVjdGlvbmNoYW5nZVwiOmNhc2UgXCJ0ZXh0SW5wdXRcIjpjYXNlIFwiY29tcG9zaXRpb25zdGFydFwiOmNhc2UgXCJjb21wb3NpdGlvbmVuZFwiOmNhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOmNhc2UgXCJiZWZvcmVibHVyXCI6Y2FzZSBcImFmdGVyYmx1clwiOmNhc2UgXCJiZWZvcmVpbnB1dFwiOmNhc2UgXCJibHVyXCI6Y2FzZSBcImZ1bGxzY3JlZW5jaGFuZ2VcIjpjYXNlIFwiZm9jdXNcIjpjYXNlIFwiaGFzaGNoYW5nZVwiOmNhc2UgXCJwb3BzdGF0ZVwiOmNhc2UgXCJzZWxlY3RcIjpjYXNlIFwic2VsZWN0c3RhcnRcIjpyZXR1cm4gMTtjYXNlIFwiZHJhZ1wiOmNhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2V4aXRcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6Y2FzZSBcImRyYWdvdmVyXCI6Y2FzZSBcIm1vdXNlbW92ZVwiOmNhc2UgXCJtb3VzZW91dFwiOmNhc2UgXCJtb3VzZW92ZXJcIjpjYXNlIFwicG9pbnRlcm1vdmVcIjpjYXNlIFwicG9pbnRlcm91dFwiOmNhc2UgXCJwb2ludGVyb3ZlclwiOmNhc2UgXCJzY3JvbGxcIjpjYXNlIFwidG9nZ2xlXCI6Y2FzZSBcInRvdWNobW92ZVwiOmNhc2UgXCJ3aGVlbFwiOmNhc2UgXCJtb3VzZWVudGVyXCI6Y2FzZSBcIm1vdXNlbGVhdmVcIjpjYXNlIFwicG9pbnRlcmVudGVyXCI6Y2FzZSBcInBvaW50ZXJsZWF2ZVwiOnJldHVybiA0O1xuY2FzZSBcIm1lc3NhZ2VcIjpzd2l0Y2goZGMoKSl7Y2FzZSBlYzpyZXR1cm4gMTtjYXNlIGZjOnJldHVybiA0O2Nhc2UgZ2M6Y2FzZSBoYzpyZXR1cm4gMTY7Y2FzZSBpYzpyZXR1cm4gNTM2ODcwOTEyO2RlZmF1bHQ6cmV0dXJuIDE2fWRlZmF1bHQ6cmV0dXJuIDE2fX12YXIgamQ9bnVsbCxrZD1udWxsLGxkPW51bGw7ZnVuY3Rpb24gbWQoKXtpZihsZClyZXR1cm4gbGQ7dmFyIGEsYj1rZCxjPWIubGVuZ3RoLGQsZT1cInZhbHVlXCJpbiBqZD9qZC52YWx1ZTpqZC50ZXh0Q29udGVudCxmPWUubGVuZ3RoO2ZvcihhPTA7YTxjJiZiW2FdPT09ZVthXTthKyspO3ZhciBnPWMtYTtmb3IoZD0xO2Q8PWcmJmJbYy1kXT09PWVbZi1kXTtkKyspO3JldHVybiBsZD1lLnNsaWNlKGEsMTxkPzEtZDp2b2lkIDApfVxuZnVuY3Rpb24gbmQoYSl7dmFyIGI9YS5rZXlDb2RlO1wiY2hhckNvZGVcImluIGE/KGE9YS5jaGFyQ29kZSwwPT09YSYmMTM9PT1iJiYoYT0xMykpOmE9YjsxMD09PWEmJihhPTEzKTtyZXR1cm4gMzI8PWF8fDEzPT09YT9hOjB9ZnVuY3Rpb24gb2QoKXtyZXR1cm4hMH1mdW5jdGlvbiBwZCgpe3JldHVybiExfVxuZnVuY3Rpb24gcWQoYSl7ZnVuY3Rpb24gYihiLGQsZSxmLGcpe3RoaXMuX3JlYWN0TmFtZT1iO3RoaXMuX3RhcmdldEluc3Q9ZTt0aGlzLnR5cGU9ZDt0aGlzLm5hdGl2ZUV2ZW50PWY7dGhpcy50YXJnZXQ9Zzt0aGlzLmN1cnJlbnRUYXJnZXQ9bnVsbDtmb3IodmFyIGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiYoYj1hW2NdLHRoaXNbY109Yj9iKGYpOmZbY10pO3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPShudWxsIT1mLmRlZmF1bHRQcmV2ZW50ZWQ/Zi5kZWZhdWx0UHJldmVudGVkOiExPT09Zi5yZXR1cm5WYWx1ZSk/b2Q6cGQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1wZDtyZXR1cm4gdGhpc31BKGIucHJvdG90eXBlLHtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMDt2YXIgYT10aGlzLm5hdGl2ZUV2ZW50O2EmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTpcInVua25vd25cIiE9PXR5cGVvZiBhLnJldHVyblZhbHVlJiZcbihhLnJldHVyblZhbHVlPSExKSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1vZCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmF0aXZlRXZlbnQ7YSYmKGEuc3RvcFByb3BhZ2F0aW9uP2Euc3RvcFByb3BhZ2F0aW9uKCk6XCJ1bmtub3duXCIhPT10eXBlb2YgYS5jYW5jZWxCdWJibGUmJihhLmNhbmNlbEJ1YmJsZT0hMCksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1vZCl9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt9LGlzUGVyc2lzdGVudDpvZH0pO3JldHVybiBifVxudmFyIHJkPXtldmVudFBoYXNlOjAsYnViYmxlczowLGNhbmNlbGFibGU6MCx0aW1lU3RhbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOjAsaXNUcnVzdGVkOjB9LHNkPXFkKHJkKSx0ZD1BKHt9LHJkLHt2aWV3OjAsZGV0YWlsOjB9KSx1ZD1xZCh0ZCksdmQsd2QseGQsemQ9QSh7fSx0ZCx7c2NyZWVuWDowLHNjcmVlblk6MCxjbGllbnRYOjAsY2xpZW50WTowLHBhZ2VYOjAscGFnZVk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTp5ZCxidXR0b246MCxidXR0b25zOjAscmVsYXRlZFRhcmdldDpmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YS5yZWxhdGVkVGFyZ2V0P2EuZnJvbUVsZW1lbnQ9PT1hLnNyY0VsZW1lbnQ/YS50b0VsZW1lbnQ6YS5mcm9tRWxlbWVudDphLnJlbGF0ZWRUYXJnZXR9LG1vdmVtZW50WDpmdW5jdGlvbihhKXtpZihcIm1vdmVtZW50WFwiaW5cbmEpcmV0dXJuIGEubW92ZW1lbnRYO2EhPT14ZCYmKHhkJiZcIm1vdXNlbW92ZVwiPT09YS50eXBlPyh2ZD1hLnNjcmVlblgteGQuc2NyZWVuWCx3ZD1hLnNjcmVlblkteGQuc2NyZWVuWSk6d2Q9dmQ9MCx4ZD1hKTtyZXR1cm4gdmR9LG1vdmVtZW50WTpmdW5jdGlvbihhKXtyZXR1cm5cIm1vdmVtZW50WVwiaW4gYT9hLm1vdmVtZW50WTp3ZH19KSxBZD1xZCh6ZCksQmQ9QSh7fSx6ZCx7ZGF0YVRyYW5zZmVyOjB9KSxDZD1xZChCZCksRGQ9QSh7fSx0ZCx7cmVsYXRlZFRhcmdldDowfSksRWQ9cWQoRGQpLEZkPUEoe30scmQse2FuaW1hdGlvbk5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLEdkPXFkKEZkKSxIZD1BKHt9LHJkLHtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGEpe3JldHVyblwiY2xpcGJvYXJkRGF0YVwiaW4gYT9hLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fSksSWQ9cWQoSGQpLEpkPUEoe30scmQse2RhdGE6MH0pLEtkPXFkKEpkKSxMZD17RXNjOlwiRXNjYXBlXCIsXG5TcGFjZWJhcjpcIiBcIixMZWZ0OlwiQXJyb3dMZWZ0XCIsVXA6XCJBcnJvd1VwXCIsUmlnaHQ6XCJBcnJvd1JpZ2h0XCIsRG93bjpcIkFycm93RG93blwiLERlbDpcIkRlbGV0ZVwiLFdpbjpcIk9TXCIsTWVudTpcIkNvbnRleHRNZW51XCIsQXBwczpcIkNvbnRleHRNZW51XCIsU2Nyb2xsOlwiU2Nyb2xsTG9ja1wiLE1velByaW50YWJsZUtleTpcIlVuaWRlbnRpZmllZFwifSxNZD17ODpcIkJhY2tzcGFjZVwiLDk6XCJUYWJcIiwxMjpcIkNsZWFyXCIsMTM6XCJFbnRlclwiLDE2OlwiU2hpZnRcIiwxNzpcIkNvbnRyb2xcIiwxODpcIkFsdFwiLDE5OlwiUGF1c2VcIiwyMDpcIkNhcHNMb2NrXCIsMjc6XCJFc2NhcGVcIiwzMjpcIiBcIiwzMzpcIlBhZ2VVcFwiLDM0OlwiUGFnZURvd25cIiwzNTpcIkVuZFwiLDM2OlwiSG9tZVwiLDM3OlwiQXJyb3dMZWZ0XCIsMzg6XCJBcnJvd1VwXCIsMzk6XCJBcnJvd1JpZ2h0XCIsNDA6XCJBcnJvd0Rvd25cIiw0NTpcIkluc2VydFwiLDQ2OlwiRGVsZXRlXCIsMTEyOlwiRjFcIiwxMTM6XCJGMlwiLDExNDpcIkYzXCIsMTE1OlwiRjRcIiwxMTY6XCJGNVwiLDExNzpcIkY2XCIsMTE4OlwiRjdcIixcbjExOTpcIkY4XCIsMTIwOlwiRjlcIiwxMjE6XCJGMTBcIiwxMjI6XCJGMTFcIiwxMjM6XCJGMTJcIiwxNDQ6XCJOdW1Mb2NrXCIsMTQ1OlwiU2Nyb2xsTG9ja1wiLDIyNDpcIk1ldGFcIn0sTmQ9e0FsdDpcImFsdEtleVwiLENvbnRyb2w6XCJjdHJsS2V5XCIsTWV0YTpcIm1ldGFLZXlcIixTaGlmdDpcInNoaWZ0S2V5XCJ9O2Z1bmN0aW9uIE9kKGEpe3ZhciBiPXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIGIuZ2V0TW9kaWZpZXJTdGF0ZT9iLmdldE1vZGlmaWVyU3RhdGUoYSk6KGE9TmRbYV0pPyEhYlthXTohMX1mdW5jdGlvbiB5ZCgpe3JldHVybiBPZH1cbnZhciBQZD1BKHt9LHRkLHtrZXk6ZnVuY3Rpb24oYSl7aWYoYS5rZXkpe3ZhciBiPUxkW2Eua2V5XXx8YS5rZXk7aWYoXCJVbmlkZW50aWZpZWRcIiE9PWIpcmV0dXJuIGJ9cmV0dXJuXCJrZXlwcmVzc1wiPT09YS50eXBlPyhhPW5kKGEpLDEzPT09YT9cIkVudGVyXCI6U3RyaW5nLmZyb21DaGFyQ29kZShhKSk6XCJrZXlkb3duXCI9PT1hLnR5cGV8fFwia2V5dXBcIj09PWEudHlwZT9NZFthLmtleUNvZGVdfHxcIlVuaWRlbnRpZmllZFwiOlwiXCJ9LGNvZGU6MCxsb2NhdGlvbjowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxyZXBlYXQ6MCxsb2NhbGU6MCxnZXRNb2RpZmllclN0YXRlOnlkLGNoYXJDb2RlOmZ1bmN0aW9uKGEpe3JldHVyblwia2V5cHJlc3NcIj09PWEudHlwZT9uZChhKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGEpe3JldHVyblwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/YS5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKGEpe3JldHVyblwia2V5cHJlc3NcIj09PVxuYS50eXBlP25kKGEpOlwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/YS5rZXlDb2RlOjB9fSksUWQ9cWQoUGQpLFJkPUEoe30semQse3BvaW50ZXJJZDowLHdpZHRoOjAsaGVpZ2h0OjAscHJlc3N1cmU6MCx0YW5nZW50aWFsUHJlc3N1cmU6MCx0aWx0WDowLHRpbHRZOjAsdHdpc3Q6MCxwb2ludGVyVHlwZTowLGlzUHJpbWFyeTowfSksU2Q9cWQoUmQpLFRkPUEoe30sdGQse3RvdWNoZXM6MCx0YXJnZXRUb3VjaGVzOjAsY2hhbmdlZFRvdWNoZXM6MCxhbHRLZXk6MCxtZXRhS2V5OjAsY3RybEtleTowLHNoaWZ0S2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTp5ZH0pLFVkPXFkKFRkKSxWZD1BKHt9LHJkLHtwcm9wZXJ0eU5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLFdkPXFkKFZkKSxYZD1BKHt9LHpkLHtkZWx0YVg6ZnVuY3Rpb24oYSl7cmV0dXJuXCJkZWx0YVhcImluIGE/YS5kZWx0YVg6XCJ3aGVlbERlbHRhWFwiaW4gYT8tYS53aGVlbERlbHRhWDowfSxcbmRlbHRhWTpmdW5jdGlvbihhKXtyZXR1cm5cImRlbHRhWVwiaW4gYT9hLmRlbHRhWTpcIndoZWVsRGVsdGFZXCJpbiBhPy1hLndoZWVsRGVsdGFZOlwid2hlZWxEZWx0YVwiaW4gYT8tYS53aGVlbERlbHRhOjB9LGRlbHRhWjowLGRlbHRhTW9kZTowfSksWWQ9cWQoWGQpLFpkPVs5LDEzLDI3LDMyXSwkZD1pYSYmXCJDb21wb3NpdGlvbkV2ZW50XCJpbiB3aW5kb3csYWU9bnVsbDtpYSYmXCJkb2N1bWVudE1vZGVcImluIGRvY3VtZW50JiYoYWU9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTt2YXIgYmU9aWEmJlwiVGV4dEV2ZW50XCJpbiB3aW5kb3cmJiFhZSxjZT1pYSYmKCEkZHx8YWUmJjg8YWUmJjExPj1hZSksZGU9U3RyaW5nLmZyb21DaGFyQ29kZSgzMiksZWU9ITE7XG5mdW5jdGlvbiBmZShhLGIpe3N3aXRjaChhKXtjYXNlIFwia2V5dXBcIjpyZXR1cm4tMSE9PVpkLmluZGV4T2YoYi5rZXlDb2RlKTtjYXNlIFwia2V5ZG93blwiOnJldHVybiAyMjkhPT1iLmtleUNvZGU7Y2FzZSBcImtleXByZXNzXCI6Y2FzZSBcIm1vdXNlZG93blwiOmNhc2UgXCJmb2N1c291dFwiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIGdlKGEpe2E9YS5kZXRhaWw7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZcImRhdGFcImluIGE/YS5kYXRhOm51bGx9dmFyIGhlPSExO2Z1bmN0aW9uIGllKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOnJldHVybiBnZShiKTtjYXNlIFwia2V5cHJlc3NcIjppZigzMiE9PWIud2hpY2gpcmV0dXJuIG51bGw7ZWU9ITA7cmV0dXJuIGRlO2Nhc2UgXCJ0ZXh0SW5wdXRcIjpyZXR1cm4gYT1iLmRhdGEsYT09PWRlJiZlZT9udWxsOmE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19XG5mdW5jdGlvbiBqZShhLGIpe2lmKGhlKXJldHVyblwiY29tcG9zaXRpb25lbmRcIj09PWF8fCEkZCYmZmUoYSxiKT8oYT1tZCgpLGxkPWtkPWpkPW51bGwsaGU9ITEsYSk6bnVsbDtzd2l0Y2goYSl7Y2FzZSBcInBhc3RlXCI6cmV0dXJuIG51bGw7Y2FzZSBcImtleXByZXNzXCI6aWYoIShiLmN0cmxLZXl8fGIuYWx0S2V5fHxiLm1ldGFLZXkpfHxiLmN0cmxLZXkmJmIuYWx0S2V5KXtpZihiLmNoYXImJjE8Yi5jaGFyLmxlbmd0aClyZXR1cm4gYi5jaGFyO2lmKGIud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYi53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6cmV0dXJuIGNlJiZcImtvXCIhPT1iLmxvY2FsZT9udWxsOmIuZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX1cbnZhciBrZT17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCxcImRhdGV0aW1lLWxvY2FsXCI6ITAsZW1haWw6ITAsbW9udGg6ITAsbnVtYmVyOiEwLHBhc3N3b3JkOiEwLHJhbmdlOiEwLHNlYXJjaDohMCx0ZWw6ITAsdGV4dDohMCx0aW1lOiEwLHVybDohMCx3ZWVrOiEwfTtmdW5jdGlvbiBsZShhKXt2YXIgYj1hJiZhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCJpbnB1dFwiPT09Yj8hIWtlW2EudHlwZV06XCJ0ZXh0YXJlYVwiPT09Yj8hMDohMX1mdW5jdGlvbiBtZShhLGIsYyxkKXtEYihkKTtiPW5lKGIsXCJvbkNoYW5nZVwiKTswPGIubGVuZ3RoJiYoYz1uZXcgc2QoXCJvbkNoYW5nZVwiLFwiY2hhbmdlXCIsbnVsbCxjLGQpLGEucHVzaCh7ZXZlbnQ6YyxsaXN0ZW5lcnM6Yn0pKX12YXIgb2U9bnVsbCxwZT1udWxsO2Z1bmN0aW9uIHFlKGEpe3JlKGEsMCl9ZnVuY3Rpb24gc2UoYSl7dmFyIGI9dGUoYSk7aWYoVmEoYikpcmV0dXJuIGF9XG5mdW5jdGlvbiB1ZShhLGIpe2lmKFwiY2hhbmdlXCI9PT1hKXJldHVybiBifXZhciB2ZT0hMTtpZihpYSl7dmFyIHdlO2lmKGlhKXt2YXIgeGU9XCJvbmlucHV0XCJpbiBkb2N1bWVudDtpZigheGUpe3ZhciB5ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3llLnNldEF0dHJpYnV0ZShcIm9uaW5wdXRcIixcInJldHVybjtcIik7eGU9XCJmdW5jdGlvblwiPT09dHlwZW9mIHllLm9uaW5wdXR9d2U9eGV9ZWxzZSB3ZT0hMTt2ZT13ZSYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fDk8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKX1mdW5jdGlvbiB6ZSgpe29lJiYob2UuZGV0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsQWUpLHBlPW9lPW51bGwpfWZ1bmN0aW9uIEFlKGEpe2lmKFwidmFsdWVcIj09PWEucHJvcGVydHlOYW1lJiZzZShwZSkpe3ZhciBiPVtdO21lKGIscGUsYSx3YihhKSk7SWIocWUsYil9fVxuZnVuY3Rpb24gQmUoYSxiLGMpe1wiZm9jdXNpblwiPT09YT8oemUoKSxvZT1iLHBlPWMsb2UuYXR0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsQWUpKTpcImZvY3Vzb3V0XCI9PT1hJiZ6ZSgpfWZ1bmN0aW9uIENlKGEpe2lmKFwic2VsZWN0aW9uY2hhbmdlXCI9PT1hfHxcImtleXVwXCI9PT1hfHxcImtleWRvd25cIj09PWEpcmV0dXJuIHNlKHBlKX1mdW5jdGlvbiBEZShhLGIpe2lmKFwiY2xpY2tcIj09PWEpcmV0dXJuIHNlKGIpfWZ1bmN0aW9uIEVlKGEsYil7aWYoXCJpbnB1dFwiPT09YXx8XCJjaGFuZ2VcIj09PWEpcmV0dXJuIHNlKGIpfWZ1bmN0aW9uIEZlKGEsYil7cmV0dXJuIGE9PT1iJiYoMCE9PWF8fDEvYT09PTEvYil8fGEhPT1hJiZiIT09Yn12YXIgR2U9XCJmdW5jdGlvblwiPT09dHlwZW9mIE9iamVjdC5pcz9PYmplY3QuaXM6RmU7XG5mdW5jdGlvbiBIZShhLGIpe2lmKEdlKGEsYikpcmV0dXJuITA7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBhfHxudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBifHxudWxsPT09YilyZXR1cm4hMTt2YXIgYz1PYmplY3Qua2V5cyhhKSxkPU9iamVjdC5rZXlzKGIpO2lmKGMubGVuZ3RoIT09ZC5sZW5ndGgpcmV0dXJuITE7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTtpZighamEuY2FsbChiLGUpfHwhR2UoYVtlXSxiW2VdKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBJZShhKXtmb3IoO2EmJmEuZmlyc3RDaGlsZDspYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9XG5mdW5jdGlvbiBKZShhLGIpe3ZhciBjPUllKGEpO2E9MDtmb3IodmFyIGQ7Yzspe2lmKDM9PT1jLm5vZGVUeXBlKXtkPWErYy50ZXh0Q29udGVudC5sZW5ndGg7aWYoYTw9YiYmZD49YilyZXR1cm57bm9kZTpjLG9mZnNldDpiLWF9O2E9ZH1hOntmb3IoO2M7KXtpZihjLm5leHRTaWJsaW5nKXtjPWMubmV4dFNpYmxpbmc7YnJlYWsgYX1jPWMucGFyZW50Tm9kZX1jPXZvaWQgMH1jPUllKGMpfX1mdW5jdGlvbiBLZShhLGIpe3JldHVybiBhJiZiP2E9PT1iPyEwOmEmJjM9PT1hLm5vZGVUeXBlPyExOmImJjM9PT1iLm5vZGVUeXBlP0tlKGEsYi5wYXJlbnROb2RlKTpcImNvbnRhaW5zXCJpbiBhP2EuY29udGFpbnMoYik6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2KTohMTohMX1cbmZ1bmN0aW9uIExlKCl7Zm9yKHZhciBhPXdpbmRvdyxiPVdhKCk7YiBpbnN0YW5jZW9mIGEuSFRNTElGcmFtZUVsZW1lbnQ7KXt0cnl7dmFyIGM9XCJzdHJpbmdcIj09PXR5cGVvZiBiLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZn1jYXRjaChkKXtjPSExfWlmKGMpYT1iLmNvbnRlbnRXaW5kb3c7ZWxzZSBicmVhaztiPVdhKGEuZG9jdW1lbnQpfXJldHVybiBifWZ1bmN0aW9uIE1lKGEpe3ZhciBiPWEmJmEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYiYmKFwiaW5wdXRcIj09PWImJihcInRleHRcIj09PWEudHlwZXx8XCJzZWFyY2hcIj09PWEudHlwZXx8XCJ0ZWxcIj09PWEudHlwZXx8XCJ1cmxcIj09PWEudHlwZXx8XCJwYXNzd29yZFwiPT09YS50eXBlKXx8XCJ0ZXh0YXJlYVwiPT09Ynx8XCJ0cnVlXCI9PT1hLmNvbnRlbnRFZGl0YWJsZSl9XG5mdW5jdGlvbiBOZShhKXt2YXIgYj1MZSgpLGM9YS5mb2N1c2VkRWxlbSxkPWEuc2VsZWN0aW9uUmFuZ2U7aWYoYiE9PWMmJmMmJmMub3duZXJEb2N1bWVudCYmS2UoYy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxjKSl7aWYobnVsbCE9PWQmJk1lKGMpKWlmKGI9ZC5zdGFydCxhPWQuZW5kLHZvaWQgMD09PWEmJihhPWIpLFwic2VsZWN0aW9uU3RhcnRcImluIGMpYy5zZWxlY3Rpb25TdGFydD1iLGMuc2VsZWN0aW9uRW5kPU1hdGgubWluKGEsYy52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYoYT0oYj1jLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmYi5kZWZhdWx0Vmlld3x8d2luZG93LGEuZ2V0U2VsZWN0aW9uKXthPWEuZ2V0U2VsZWN0aW9uKCk7dmFyIGU9Yy50ZXh0Q29udGVudC5sZW5ndGgsZj1NYXRoLm1pbihkLnN0YXJ0LGUpO2Q9dm9pZCAwPT09ZC5lbmQ/ZjpNYXRoLm1pbihkLmVuZCxlKTshYS5leHRlbmQmJmY+ZCYmKGU9ZCxkPWYsZj1lKTtlPUplKGMsZik7dmFyIGc9SmUoYyxcbmQpO2UmJmcmJigxIT09YS5yYW5nZUNvdW50fHxhLmFuY2hvck5vZGUhPT1lLm5vZGV8fGEuYW5jaG9yT2Zmc2V0IT09ZS5vZmZzZXR8fGEuZm9jdXNOb2RlIT09Zy5ub2RlfHxhLmZvY3VzT2Zmc2V0IT09Zy5vZmZzZXQpJiYoYj1iLmNyZWF0ZVJhbmdlKCksYi5zZXRTdGFydChlLm5vZGUsZS5vZmZzZXQpLGEucmVtb3ZlQWxsUmFuZ2VzKCksZj5kPyhhLmFkZFJhbmdlKGIpLGEuZXh0ZW5kKGcubm9kZSxnLm9mZnNldCkpOihiLnNldEVuZChnLm5vZGUsZy5vZmZzZXQpLGEuYWRkUmFuZ2UoYikpKX1iPVtdO2ZvcihhPWM7YT1hLnBhcmVudE5vZGU7KTE9PT1hLm5vZGVUeXBlJiZiLnB1c2goe2VsZW1lbnQ6YSxsZWZ0OmEuc2Nyb2xsTGVmdCx0b3A6YS5zY3JvbGxUb3B9KTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5mb2N1cyYmYy5mb2N1cygpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYT1iW2NdLGEuZWxlbWVudC5zY3JvbGxMZWZ0PWEubGVmdCxhLmVsZW1lbnQuc2Nyb2xsVG9wPWEudG9wfX1cbnZhciBPZT1pYSYmXCJkb2N1bWVudE1vZGVcImluIGRvY3VtZW50JiYxMT49ZG9jdW1lbnQuZG9jdW1lbnRNb2RlLFBlPW51bGwsUWU9bnVsbCxSZT1udWxsLFNlPSExO1xuZnVuY3Rpb24gVGUoYSxiLGMpe3ZhciBkPWMud2luZG93PT09Yz9jLmRvY3VtZW50Ojk9PT1jLm5vZGVUeXBlP2M6Yy5vd25lckRvY3VtZW50O1NlfHxudWxsPT1QZXx8UGUhPT1XYShkKXx8KGQ9UGUsXCJzZWxlY3Rpb25TdGFydFwiaW4gZCYmTWUoZCk/ZD17c3RhcnQ6ZC5zZWxlY3Rpb25TdGFydCxlbmQ6ZC5zZWxlY3Rpb25FbmR9OihkPShkLm93bmVyRG9jdW1lbnQmJmQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKSxkPXthbmNob3JOb2RlOmQuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6ZC5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOmQuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OmQuZm9jdXNPZmZzZXR9KSxSZSYmSGUoUmUsZCl8fChSZT1kLGQ9bmUoUWUsXCJvblNlbGVjdFwiKSwwPGQubGVuZ3RoJiYoYj1uZXcgc2QoXCJvblNlbGVjdFwiLFwic2VsZWN0XCIsbnVsbCxiLGMpLGEucHVzaCh7ZXZlbnQ6YixsaXN0ZW5lcnM6ZH0pLGIudGFyZ2V0PVBlKSkpfVxuZnVuY3Rpb24gVWUoYSxiKXt2YXIgYz17fTtjW2EudG9Mb3dlckNhc2UoKV09Yi50b0xvd2VyQ2FzZSgpO2NbXCJXZWJraXRcIithXT1cIndlYmtpdFwiK2I7Y1tcIk1velwiK2FdPVwibW96XCIrYjtyZXR1cm4gY312YXIgVmU9e2FuaW1hdGlvbmVuZDpVZShcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uRW5kXCIpLGFuaW1hdGlvbml0ZXJhdGlvbjpVZShcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uSXRlcmF0aW9uXCIpLGFuaW1hdGlvbnN0YXJ0OlVlKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25TdGFydFwiKSx0cmFuc2l0aW9uZW5kOlVlKFwiVHJhbnNpdGlvblwiLFwiVHJhbnNpdGlvbkVuZFwiKX0sV2U9e30sWGU9e307XG5pYSYmKFhlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikuc3R5bGUsXCJBbmltYXRpb25FdmVudFwiaW4gd2luZG93fHwoZGVsZXRlIFZlLmFuaW1hdGlvbmVuZC5hbmltYXRpb24sZGVsZXRlIFZlLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRlIFZlLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbiksXCJUcmFuc2l0aW9uRXZlbnRcImluIHdpbmRvd3x8ZGVsZXRlIFZlLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gWWUoYSl7aWYoV2VbYV0pcmV0dXJuIFdlW2FdO2lmKCFWZVthXSlyZXR1cm4gYTt2YXIgYj1WZVthXSxjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSYmYyBpbiBYZSlyZXR1cm4gV2VbYV09YltjXTtyZXR1cm4gYX12YXIgWmU9WWUoXCJhbmltYXRpb25lbmRcIiksJGU9WWUoXCJhbmltYXRpb25pdGVyYXRpb25cIiksYWY9WWUoXCJhbmltYXRpb25zdGFydFwiKSxiZj1ZZShcInRyYW5zaXRpb25lbmRcIiksY2Y9bmV3IE1hcCxkZj1cImFib3J0IGF1eENsaWNrIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsXCIuc3BsaXQoXCIgXCIpO1xuZnVuY3Rpb24gZWYoYSxiKXtjZi5zZXQoYSxiKTtmYShiLFthXSl9Zm9yKHZhciBmZj0wO2ZmPGRmLmxlbmd0aDtmZisrKXt2YXIgZ2Y9ZGZbZmZdLGhmPWdmLnRvTG93ZXJDYXNlKCksamY9Z2ZbMF0udG9VcHBlckNhc2UoKStnZi5zbGljZSgxKTtlZihoZixcIm9uXCIramYpfWVmKFplLFwib25BbmltYXRpb25FbmRcIik7ZWYoJGUsXCJvbkFuaW1hdGlvbkl0ZXJhdGlvblwiKTtlZihhZixcIm9uQW5pbWF0aW9uU3RhcnRcIik7ZWYoXCJkYmxjbGlja1wiLFwib25Eb3VibGVDbGlja1wiKTtlZihcImZvY3VzaW5cIixcIm9uRm9jdXNcIik7ZWYoXCJmb2N1c291dFwiLFwib25CbHVyXCIpO2VmKGJmLFwib25UcmFuc2l0aW9uRW5kXCIpO2hhKFwib25Nb3VzZUVudGVyXCIsW1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXSk7aGEoXCJvbk1vdXNlTGVhdmVcIixbXCJtb3VzZW91dFwiLFwibW91c2VvdmVyXCJdKTtoYShcIm9uUG9pbnRlckVudGVyXCIsW1wicG9pbnRlcm91dFwiLFwicG9pbnRlcm92ZXJcIl0pO1xuaGEoXCJvblBvaW50ZXJMZWF2ZVwiLFtcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdKTtmYShcIm9uQ2hhbmdlXCIsXCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFwiIFwiKSk7ZmEoXCJvblNlbGVjdFwiLFwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXCIgXCIpKTtmYShcIm9uQmVmb3JlSW5wdXRcIixbXCJjb21wb3NpdGlvbmVuZFwiLFwia2V5cHJlc3NcIixcInRleHRJbnB1dFwiLFwicGFzdGVcIl0pO2ZhKFwib25Db21wb3NpdGlvbkVuZFwiLFwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO2ZhKFwib25Db21wb3NpdGlvblN0YXJ0XCIsXCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpKTtcbmZhKFwib25Db21wb3NpdGlvblVwZGF0ZVwiLFwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO3ZhciBrZj1cImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nXCIuc3BsaXQoXCIgXCIpLGxmPW5ldyBTZXQoXCJjYW5jZWwgY2xvc2UgaW52YWxpZCBsb2FkIHNjcm9sbCB0b2dnbGVcIi5zcGxpdChcIiBcIikuY29uY2F0KGtmKSk7XG5mdW5jdGlvbiBtZihhLGIsYyl7dmFyIGQ9YS50eXBlfHxcInVua25vd24tZXZlbnRcIjthLmN1cnJlbnRUYXJnZXQ9YztUYihkLGIsdm9pZCAwLGEpO2EuY3VycmVudFRhcmdldD1udWxsfVxuZnVuY3Rpb24gcmUoYSxiKXtiPTAhPT0oYiY0KTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXSxlPWQuZXZlbnQ7ZD1kLmxpc3RlbmVyczthOnt2YXIgZj12b2lkIDA7aWYoYilmb3IodmFyIGc9ZC5sZW5ndGgtMTswPD1nO2ctLSl7dmFyIGg9ZFtnXSxrPWguaW5zdGFuY2UsbD1oLmN1cnJlbnRUYXJnZXQ7aD1oLmxpc3RlbmVyO2lmKGshPT1mJiZlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgYTttZihlLGgsbCk7Zj1rfWVsc2UgZm9yKGc9MDtnPGQubGVuZ3RoO2crKyl7aD1kW2ddO2s9aC5pbnN0YW5jZTtsPWguY3VycmVudFRhcmdldDtoPWgubGlzdGVuZXI7aWYoayE9PWYmJmUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBhO21mKGUsaCxsKTtmPWt9fX1pZihQYil0aHJvdyBhPVFiLFBiPSExLFFiPW51bGwsYTt9XG5mdW5jdGlvbiBEKGEsYil7dmFyIGM9YltuZl07dm9pZCAwPT09YyYmKGM9YltuZl09bmV3IFNldCk7dmFyIGQ9YStcIl9fYnViYmxlXCI7Yy5oYXMoZCl8fChvZihiLGEsMiwhMSksYy5hZGQoZCkpfWZ1bmN0aW9uIHBmKGEsYixjKXt2YXIgZD0wO2ImJihkfD00KTtvZihjLGEsZCxiKX12YXIgcWY9XCJfcmVhY3RMaXN0ZW5pbmdcIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiByZihhKXtpZighYVtxZl0pe2FbcWZdPSEwO2RhLmZvckVhY2goZnVuY3Rpb24oYil7XCJzZWxlY3Rpb25jaGFuZ2VcIiE9PWImJihsZi5oYXMoYil8fHBmKGIsITEsYSkscGYoYiwhMCxhKSl9KTt2YXIgYj05PT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudDtudWxsPT09Ynx8YltxZl18fChiW3FmXT0hMCxwZihcInNlbGVjdGlvbmNoYW5nZVwiLCExLGIpKX19XG5mdW5jdGlvbiBvZihhLGIsYyxkKXtzd2l0Y2goaWQoYikpe2Nhc2UgMTp2YXIgZT1kZDticmVhaztjYXNlIDQ6ZT1mZDticmVhaztkZWZhdWx0OmU9ZWR9Yz1lLmJpbmQobnVsbCxiLGMsYSk7ZT12b2lkIDA7IUtifHxcInRvdWNoc3RhcnRcIiE9PWImJlwidG91Y2htb3ZlXCIhPT1iJiZcIndoZWVsXCIhPT1ifHwoZT0hMCk7ZD92b2lkIDAhPT1lP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMse2NhcHR1cmU6ITAscGFzc2l2ZTplfSk6YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMCk6dm9pZCAwIT09ZT9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLHtwYXNzaXZlOmV9KTphLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX1cbmZ1bmN0aW9uIGdkKGEsYixjLGQsZSl7dmFyIGY9ZDtpZigwPT09KGImMSkmJjA9PT0oYiYyKSYmbnVsbCE9PWQpYTpmb3IoOzspe2lmKG51bGw9PT1kKXJldHVybjt2YXIgZz1kLnRhZztpZigzPT09Z3x8ND09PWcpe3ZhciBoPWQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87aWYoaD09PWV8fDg9PT1oLm5vZGVUeXBlJiZoLnBhcmVudE5vZGU9PT1lKWJyZWFrO2lmKDQ9PT1nKWZvcihnPWQucmV0dXJuO251bGwhPT1nOyl7dmFyIGs9Zy50YWc7aWYoMz09PWt8fDQ9PT1rKWlmKGs9Zy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxrPT09ZXx8OD09PWsubm9kZVR5cGUmJmsucGFyZW50Tm9kZT09PWUpcmV0dXJuO2c9Zy5yZXR1cm59Zm9yKDtudWxsIT09aDspe2c9VmMoaCk7aWYobnVsbD09PWcpcmV0dXJuO2s9Zy50YWc7aWYoNT09PWt8fDY9PT1rKXtkPWY9Zztjb250aW51ZSBhfWg9aC5wYXJlbnROb2RlfX1kPWQucmV0dXJufUliKGZ1bmN0aW9uKCl7dmFyIGQ9ZixlPXdiKGMpLGc9W107XG5hOnt2YXIgaD1jZi5nZXQoYSk7aWYodm9pZCAwIT09aCl7dmFyIGs9c2QsbT1hO3N3aXRjaChhKXtjYXNlIFwia2V5cHJlc3NcIjppZigwPT09bmQoYykpYnJlYWsgYTtjYXNlIFwia2V5ZG93blwiOmNhc2UgXCJrZXl1cFwiOms9UWQ7YnJlYWs7Y2FzZSBcImZvY3VzaW5cIjptPVwiZm9jdXNcIjtrPUVkO2JyZWFrO2Nhc2UgXCJmb2N1c291dFwiOm09XCJibHVyXCI7az1FZDticmVhaztjYXNlIFwiYmVmb3JlYmx1clwiOmNhc2UgXCJhZnRlcmJsdXJcIjprPUVkO2JyZWFrO2Nhc2UgXCJjbGlja1wiOmlmKDI9PT1jLmJ1dHRvbilicmVhayBhO2Nhc2UgXCJhdXhjbGlja1wiOmNhc2UgXCJkYmxjbGlja1wiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwibW91c2Vtb3ZlXCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwibW91c2VvdXRcIjpjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcImNvbnRleHRtZW51XCI6az1BZDticmVhaztjYXNlIFwiZHJhZ1wiOmNhc2UgXCJkcmFnZW5kXCI6Y2FzZSBcImRyYWdlbnRlclwiOmNhc2UgXCJkcmFnZXhpdFwiOmNhc2UgXCJkcmFnbGVhdmVcIjpjYXNlIFwiZHJhZ292ZXJcIjpjYXNlIFwiZHJhZ3N0YXJ0XCI6Y2FzZSBcImRyb3BcIjprPVxuQ2Q7YnJlYWs7Y2FzZSBcInRvdWNoY2FuY2VsXCI6Y2FzZSBcInRvdWNoZW5kXCI6Y2FzZSBcInRvdWNobW92ZVwiOmNhc2UgXCJ0b3VjaHN0YXJ0XCI6az1VZDticmVhaztjYXNlIFplOmNhc2UgJGU6Y2FzZSBhZjprPUdkO2JyZWFrO2Nhc2UgYmY6az1XZDticmVhaztjYXNlIFwic2Nyb2xsXCI6az11ZDticmVhaztjYXNlIFwid2hlZWxcIjprPVlkO2JyZWFrO2Nhc2UgXCJjb3B5XCI6Y2FzZSBcImN1dFwiOmNhc2UgXCJwYXN0ZVwiOms9SWQ7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJwb2ludGVyY2FuY2VsXCI6Y2FzZSBcInBvaW50ZXJkb3duXCI6Y2FzZSBcInBvaW50ZXJtb3ZlXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcnVwXCI6az1TZH12YXIgdz0wIT09KGImNCksSj0hdyYmXCJzY3JvbGxcIj09PWEsdj13P251bGwhPT1oP2grXCJDYXB0dXJlXCI6bnVsbDpoO3c9W107Zm9yKHZhciB4PWQscjtudWxsIT09XG54Oyl7cj14O3ZhciBGPXIuc3RhdGVOb2RlOzU9PT1yLnRhZyYmbnVsbCE9PUYmJihyPUYsbnVsbCE9PXYmJihGPUpiKHgsdiksbnVsbCE9RiYmdy5wdXNoKHNmKHgsRixyKSkpKTtpZihKKWJyZWFrO3g9eC5yZXR1cm59MDx3Lmxlbmd0aCYmKGg9bmV3IGsoaCxtLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmgsbGlzdGVuZXJzOnd9KSl9fWlmKDA9PT0oYiY3KSl7YTp7aD1cIm1vdXNlb3ZlclwiPT09YXx8XCJwb2ludGVyb3ZlclwiPT09YTtrPVwibW91c2VvdXRcIj09PWF8fFwicG9pbnRlcm91dFwiPT09YTtpZihoJiZjIT09dmImJihtPWMucmVsYXRlZFRhcmdldHx8Yy5mcm9tRWxlbWVudCkmJihWYyhtKXx8bVt0Zl0pKWJyZWFrIGE7aWYoa3x8aCl7aD1lLndpbmRvdz09PWU/ZTooaD1lLm93bmVyRG9jdW1lbnQpP2guZGVmYXVsdFZpZXd8fGgucGFyZW50V2luZG93OndpbmRvdztpZihrKXtpZihtPWMucmVsYXRlZFRhcmdldHx8Yy50b0VsZW1lbnQsaz1kLG09bT9WYyhtKTpudWxsLG51bGwhPT1cbm0mJihKPVViKG0pLG0hPT1KfHw1IT09bS50YWcmJjYhPT1tLnRhZykpbT1udWxsfWVsc2Ugaz1udWxsLG09ZDtpZihrIT09bSl7dz1BZDtGPVwib25Nb3VzZUxlYXZlXCI7dj1cIm9uTW91c2VFbnRlclwiO3g9XCJtb3VzZVwiO2lmKFwicG9pbnRlcm91dFwiPT09YXx8XCJwb2ludGVyb3ZlclwiPT09YSl3PVNkLEY9XCJvblBvaW50ZXJMZWF2ZVwiLHY9XCJvblBvaW50ZXJFbnRlclwiLHg9XCJwb2ludGVyXCI7Sj1udWxsPT1rP2g6dGUoayk7cj1udWxsPT1tP2g6dGUobSk7aD1uZXcgdyhGLHgrXCJsZWF2ZVwiLGssYyxlKTtoLnRhcmdldD1KO2gucmVsYXRlZFRhcmdldD1yO0Y9bnVsbDtWYyhlKT09PWQmJih3PW5ldyB3KHYseCtcImVudGVyXCIsbSxjLGUpLHcudGFyZ2V0PXIsdy5yZWxhdGVkVGFyZ2V0PUosRj13KTtKPUY7aWYoayYmbSliOnt3PWs7dj1tO3g9MDtmb3Iocj13O3I7cj11ZihyKSl4Kys7cj0wO2ZvcihGPXY7RjtGPXVmKEYpKXIrKztmb3IoOzA8eC1yOyl3PXVmKHcpLHgtLTtmb3IoOzA8ci14Oyl2PVxudWYodiksci0tO2Zvcig7eC0tOyl7aWYodz09PXZ8fG51bGwhPT12JiZ3PT09di5hbHRlcm5hdGUpYnJlYWsgYjt3PXVmKHcpO3Y9dWYodil9dz1udWxsfWVsc2Ugdz1udWxsO251bGwhPT1rJiZ2ZihnLGgsayx3LCExKTtudWxsIT09bSYmbnVsbCE9PUomJnZmKGcsSixtLHcsITApfX19YTp7aD1kP3RlKGQpOndpbmRvdztrPWgubm9kZU5hbWUmJmgubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihcInNlbGVjdFwiPT09a3x8XCJpbnB1dFwiPT09ayYmXCJmaWxlXCI9PT1oLnR5cGUpdmFyIFo9dWU7ZWxzZSBpZihsZShoKSlpZih2ZSlaPUVlO2Vsc2V7Wj1DZTt2YXIgeWE9QmV9ZWxzZShrPWgubm9kZU5hbWUpJiZcImlucHV0XCI9PT1rLnRvTG93ZXJDYXNlKCkmJihcImNoZWNrYm94XCI9PT1oLnR5cGV8fFwicmFkaW9cIj09PWgudHlwZSkmJihaPURlKTtpZihaJiYoWj1aKGEsZCkpKXttZShnLFosYyxlKTticmVhayBhfXlhJiZ5YShhLGgsZCk7XCJmb2N1c291dFwiPT09YSYmKHlhPWguX3dyYXBwZXJTdGF0ZSkmJlxueWEuY29udHJvbGxlZCYmXCJudW1iZXJcIj09PWgudHlwZSYmYmIoaCxcIm51bWJlclwiLGgudmFsdWUpfXlhPWQ/dGUoZCk6d2luZG93O3N3aXRjaChhKXtjYXNlIFwiZm9jdXNpblwiOmlmKGxlKHlhKXx8XCJ0cnVlXCI9PT15YS5jb250ZW50RWRpdGFibGUpUGU9eWEsUWU9ZCxSZT1udWxsO2JyZWFrO2Nhc2UgXCJmb2N1c291dFwiOlJlPVFlPVBlPW51bGw7YnJlYWs7Y2FzZSBcIm1vdXNlZG93blwiOlNlPSEwO2JyZWFrO2Nhc2UgXCJjb250ZXh0bWVudVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcImRyYWdlbmRcIjpTZT0hMTtUZShnLGMsZSk7YnJlYWs7Y2FzZSBcInNlbGVjdGlvbmNoYW5nZVwiOmlmKE9lKWJyZWFrO2Nhc2UgXCJrZXlkb3duXCI6Y2FzZSBcImtleXVwXCI6VGUoZyxjLGUpfXZhciBhYjtpZigkZCliOntzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjp2YXIgY2E9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIjticmVhayBiO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOmNhPVwib25Db21wb3NpdGlvbkVuZFwiO1xuYnJlYWsgYjtjYXNlIFwiY29tcG9zaXRpb251cGRhdGVcIjpjYT1cIm9uQ29tcG9zaXRpb25VcGRhdGVcIjticmVhayBifWNhPXZvaWQgMH1lbHNlIGhlP2ZlKGEsYykmJihjYT1cIm9uQ29tcG9zaXRpb25FbmRcIik6XCJrZXlkb3duXCI9PT1hJiYyMjk9PT1jLmtleUNvZGUmJihjYT1cIm9uQ29tcG9zaXRpb25TdGFydFwiKTtjYSYmKGNlJiZcImtvXCIhPT1jLmxvY2FsZSYmKGhlfHxcIm9uQ29tcG9zaXRpb25TdGFydFwiIT09Y2E/XCJvbkNvbXBvc2l0aW9uRW5kXCI9PT1jYSYmaGUmJihhYj1tZCgpKTooamQ9ZSxrZD1cInZhbHVlXCJpbiBqZD9qZC52YWx1ZTpqZC50ZXh0Q29udGVudCxoZT0hMCkpLHlhPW5lKGQsY2EpLDA8eWEubGVuZ3RoJiYoY2E9bmV3IEtkKGNhLGEsbnVsbCxjLGUpLGcucHVzaCh7ZXZlbnQ6Y2EsbGlzdGVuZXJzOnlhfSksYWI/Y2EuZGF0YT1hYjooYWI9Z2UoYyksbnVsbCE9PWFiJiYoY2EuZGF0YT1hYikpKSk7aWYoYWI9YmU/aWUoYSxjKTpqZShhLGMpKWQ9bmUoZCxcIm9uQmVmb3JlSW5wdXRcIiksXG4wPGQubGVuZ3RoJiYoZT1uZXcgS2QoXCJvbkJlZm9yZUlucHV0XCIsXCJiZWZvcmVpbnB1dFwiLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmUsbGlzdGVuZXJzOmR9KSxlLmRhdGE9YWIpfXJlKGcsYil9KX1mdW5jdGlvbiBzZihhLGIsYyl7cmV0dXJue2luc3RhbmNlOmEsbGlzdGVuZXI6YixjdXJyZW50VGFyZ2V0OmN9fWZ1bmN0aW9uIG5lKGEsYil7Zm9yKHZhciBjPWIrXCJDYXB0dXJlXCIsZD1bXTtudWxsIT09YTspe3ZhciBlPWEsZj1lLnN0YXRlTm9kZTs1PT09ZS50YWcmJm51bGwhPT1mJiYoZT1mLGY9SmIoYSxjKSxudWxsIT1mJiZkLnVuc2hpZnQoc2YoYSxmLGUpKSxmPUpiKGEsYiksbnVsbCE9ZiYmZC5wdXNoKHNmKGEsZixlKSkpO2E9YS5yZXR1cm59cmV0dXJuIGR9ZnVuY3Rpb24gdWYoYSl7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7ZG8gYT1hLnJldHVybjt3aGlsZShhJiY1IT09YS50YWcpO3JldHVybiBhP2E6bnVsbH1cbmZ1bmN0aW9uIHZmKGEsYixjLGQsZSl7Zm9yKHZhciBmPWIuX3JlYWN0TmFtZSxnPVtdO251bGwhPT1jJiZjIT09ZDspe3ZhciBoPWMsaz1oLmFsdGVybmF0ZSxsPWguc3RhdGVOb2RlO2lmKG51bGwhPT1rJiZrPT09ZClicmVhazs1PT09aC50YWcmJm51bGwhPT1sJiYoaD1sLGU/KGs9SmIoYyxmKSxudWxsIT1rJiZnLnVuc2hpZnQoc2YoYyxrLGgpKSk6ZXx8KGs9SmIoYyxmKSxudWxsIT1rJiZnLnB1c2goc2YoYyxrLGgpKSkpO2M9Yy5yZXR1cm59MCE9PWcubGVuZ3RoJiZhLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOmd9KX12YXIgd2Y9L1xcclxcbj8vZyx4Zj0vXFx1MDAwMHxcXHVGRkZEL2c7ZnVuY3Rpb24geWYoYSl7cmV0dXJuKFwic3RyaW5nXCI9PT10eXBlb2YgYT9hOlwiXCIrYSkucmVwbGFjZSh3ZixcIlxcblwiKS5yZXBsYWNlKHhmLFwiXCIpfWZ1bmN0aW9uIHpmKGEsYixjKXtiPXlmKGIpO2lmKHlmKGEpIT09YiYmYyl0aHJvdyBFcnJvcihwKDQyNSkpO31mdW5jdGlvbiBBZigpe31cbnZhciBCZj1udWxsLENmPW51bGw7ZnVuY3Rpb24gRGYoYSxiKXtyZXR1cm5cInRleHRhcmVhXCI9PT1hfHxcIm5vc2NyaXB0XCI9PT1hfHxcInN0cmluZ1wiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwibnVtYmVyXCI9PT10eXBlb2YgYi5jaGlsZHJlbnx8XCJvYmplY3RcIj09PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZudWxsIT09Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWx9XG52YXIgRWY9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDp2b2lkIDAsRmY9XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6dm9pZCAwLEdmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBQcm9taXNlP1Byb21pc2U6dm9pZCAwLElmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz9xdWV1ZU1pY3JvdGFzazpcInVuZGVmaW5lZFwiIT09dHlwZW9mIEdmP2Z1bmN0aW9uKGEpe3JldHVybiBHZi5yZXNvbHZlKG51bGwpLnRoZW4oYSkuY2F0Y2goSGYpfTpFZjtmdW5jdGlvbiBIZihhKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYTt9KX1cbmZ1bmN0aW9uIEpmKGEsYil7dmFyIGM9YixkPTA7ZG97dmFyIGU9Yy5uZXh0U2libGluZzthLnJlbW92ZUNoaWxkKGMpO2lmKGUmJjg9PT1lLm5vZGVUeXBlKWlmKGM9ZS5kYXRhLFwiLyRcIj09PWMpe2lmKDA9PT1kKXthLnJlbW92ZUNoaWxkKGUpO2FkKGIpO3JldHVybn1kLS19ZWxzZVwiJFwiIT09YyYmXCIkP1wiIT09YyYmXCIkIVwiIT09Y3x8ZCsrO2M9ZX13aGlsZShjKTthZChiKX1mdW5jdGlvbiBLZihhKXtmb3IoO251bGwhPWE7YT1hLm5leHRTaWJsaW5nKXt2YXIgYj1hLm5vZGVUeXBlO2lmKDE9PT1ifHwzPT09YilicmVhaztpZig4PT09Yil7Yj1hLmRhdGE7aWYoXCIkXCI9PT1ifHxcIiQhXCI9PT1ifHxcIiQ/XCI9PT1iKWJyZWFrO2lmKFwiLyRcIj09PWIpcmV0dXJuIG51bGx9fXJldHVybiBhfVxuZnVuY3Rpb24gTGYoYSl7YT1hLnByZXZpb3VzU2libGluZztmb3IodmFyIGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihcIiRcIj09PWN8fFwiJCFcIj09PWN8fFwiJD9cIj09PWMpe2lmKDA9PT1iKXJldHVybiBhO2ItLX1lbHNlXCIvJFwiPT09YyYmYisrfWE9YS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIE1mPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLE5mPVwiX19yZWFjdEZpYmVyJFwiK01mLE9mPVwiX19yZWFjdFByb3BzJFwiK01mLHRmPVwiX19yZWFjdENvbnRhaW5lciRcIitNZixuZj1cIl9fcmVhY3RFdmVudHMkXCIrTWYsUGY9XCJfX3JlYWN0TGlzdGVuZXJzJFwiK01mLFFmPVwiX19yZWFjdEhhbmRsZXMkXCIrTWY7XG5mdW5jdGlvbiBWYyhhKXt2YXIgYj1hW05mXTtpZihiKXJldHVybiBiO2Zvcih2YXIgYz1hLnBhcmVudE5vZGU7Yzspe2lmKGI9Y1t0Zl18fGNbTmZdKXtjPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1iLmNoaWxkfHxudWxsIT09YyYmbnVsbCE9PWMuY2hpbGQpZm9yKGE9TGYoYSk7bnVsbCE9PWE7KXtpZihjPWFbTmZdKXJldHVybiBjO2E9TGYoYSl9cmV0dXJuIGJ9YT1jO2M9YS5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIEJiKGEpe2E9YVtOZl18fGFbdGZdO3JldHVybiFhfHw1IT09YS50YWcmJjYhPT1hLnRhZyYmMTMhPT1hLnRhZyYmMyE9PWEudGFnP251bGw6YX1mdW5jdGlvbiB0ZShhKXtpZig1PT09YS50YWd8fDY9PT1hLnRhZylyZXR1cm4gYS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IocCgzMykpO31mdW5jdGlvbiBDYihhKXtyZXR1cm4gYVtPZl18fG51bGx9dmFyIFJmPVtdLFNmPS0xO2Z1bmN0aW9uIFRmKGEpe3JldHVybntjdXJyZW50OmF9fVxuZnVuY3Rpb24gRShhKXswPlNmfHwoYS5jdXJyZW50PVJmW1NmXSxSZltTZl09bnVsbCxTZi0tKX1mdW5jdGlvbiBHKGEsYil7U2YrKztSZltTZl09YS5jdXJyZW50O2EuY3VycmVudD1ifXZhciBVZj17fSxIPVRmKFVmKSxWZj1UZighMSksV2Y9VWY7ZnVuY3Rpb24gWGYoYSxiKXt2YXIgYz1hLnR5cGUuY29udGV4dFR5cGVzO2lmKCFjKXJldHVybiBVZjt2YXIgZD1hLnN0YXRlTm9kZTtpZihkJiZkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT1iKXJldHVybiBkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBlPXt9LGY7Zm9yKGYgaW4gYyllW2ZdPWJbZl07ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWIsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1lKTtyZXR1cm4gZX1cbmZ1bmN0aW9uIFlmKGEpe2E9YS5jaGlsZENvbnRleHRUeXBlcztyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWF9ZnVuY3Rpb24gWmYoKXtFKFZmKTtFKEgpfWZ1bmN0aW9uICRmKGEsYixjKXtpZihILmN1cnJlbnQhPT1VZil0aHJvdyBFcnJvcihwKDE2OCkpO0coSCxiKTtHKFZmLGMpfWZ1bmN0aW9uIGFnKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTtiPWIuY2hpbGRDb250ZXh0VHlwZXM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGQuZ2V0Q2hpbGRDb250ZXh0KXJldHVybiBjO2Q9ZC5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIGUgaW4gZClpZighKGUgaW4gYikpdGhyb3cgRXJyb3IocCgxMDgsUWEoYSl8fFwiVW5rbm93blwiLGUpKTtyZXR1cm4gQSh7fSxjLGQpfVxuZnVuY3Rpb24gYmcoYSl7YT0oYT1hLnN0YXRlTm9kZSkmJmEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHR8fFVmO1dmPUguY3VycmVudDtHKEgsYSk7RyhWZixWZi5jdXJyZW50KTtyZXR1cm4hMH1mdW5jdGlvbiBjZyhhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7aWYoIWQpdGhyb3cgRXJyb3IocCgxNjkpKTtjPyhhPWFnKGEsYixXZiksZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1hLEUoVmYpLEUoSCksRyhILGEpKTpFKFZmKTtHKFZmLGMpfXZhciBkZz1udWxsLGVnPSExLGZnPSExO2Z1bmN0aW9uIGdnKGEpe251bGw9PT1kZz9kZz1bYV06ZGcucHVzaChhKX1mdW5jdGlvbiBoZyhhKXtlZz0hMDtnZyhhKX1cbmZ1bmN0aW9uIGlnKCl7aWYoIWZnJiZudWxsIT09ZGcpe2ZnPSEwO3ZhciBhPTAsYj1DO3RyeXt2YXIgYz1kZztmb3IoQz0xO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZD1jW2FdO2RvIGQ9ZCghMCk7d2hpbGUobnVsbCE9PWQpfWRnPW51bGw7ZWc9ITF9Y2F0Y2goZSl7dGhyb3cgbnVsbCE9PWRnJiYoZGc9ZGcuc2xpY2UoYSsxKSksJGIoZWMsaWcpLGU7fWZpbmFsbHl7Qz1iLGZnPSExfX1yZXR1cm4gbnVsbH12YXIgamc9dGEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7ZnVuY3Rpb24ga2coYSxiKXtpZihhJiZhLmRlZmF1bHRQcm9wcyl7Yj1BKHt9LGIpO2E9YS5kZWZhdWx0UHJvcHM7Zm9yKHZhciBjIGluIGEpdm9pZCAwPT09YltjXSYmKGJbY109YVtjXSk7cmV0dXJuIGJ9cmV0dXJuIGJ9dmFyIGxnPVRmKG51bGwpLG1nPW51bGwsbmc9bnVsbCxvZz1udWxsO2Z1bmN0aW9uIHBnKCl7b2c9bmc9bWc9bnVsbH1cbmZ1bmN0aW9uIHFnKGEpe3ZhciBiPWxnLmN1cnJlbnQ7RShsZyk7YS5fY3VycmVudFZhbHVlPWJ9ZnVuY3Rpb24gcmcoYSxiLGMpe2Zvcig7bnVsbCE9PWE7KXt2YXIgZD1hLmFsdGVybmF0ZTsoYS5jaGlsZExhbmVzJmIpIT09Yj8oYS5jaGlsZExhbmVzfD1iLG51bGwhPT1kJiYoZC5jaGlsZExhbmVzfD1iKSk6bnVsbCE9PWQmJihkLmNoaWxkTGFuZXMmYikhPT1iJiYoZC5jaGlsZExhbmVzfD1iKTtpZihhPT09YylicmVhazthPWEucmV0dXJufX1mdW5jdGlvbiBzZyhhLGIpe21nPWE7b2c9bmc9bnVsbDthPWEuZGVwZW5kZW5jaWVzO251bGwhPT1hJiZudWxsIT09YS5maXJzdENvbnRleHQmJigwIT09KGEubGFuZXMmYikmJih0Zz0hMCksYS5maXJzdENvbnRleHQ9bnVsbCl9XG5mdW5jdGlvbiB1ZyhhKXt2YXIgYj1hLl9jdXJyZW50VmFsdWU7aWYob2chPT1hKWlmKGE9e2NvbnRleHQ6YSxtZW1vaXplZFZhbHVlOmIsbmV4dDpudWxsfSxudWxsPT09bmcpe2lmKG51bGw9PT1tZyl0aHJvdyBFcnJvcihwKDMwOCkpO25nPWE7bWcuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDphfX1lbHNlIG5nPW5nLm5leHQ9YTtyZXR1cm4gYn12YXIgdmc9bnVsbCx3Zz0hMTtmdW5jdGlvbiB4ZyhhKXthLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5tZW1vaXplZFN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpudWxsLGxhc3RCYXNlVXBkYXRlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowfSxlZmZlY3RzOm51bGx9fVxuZnVuY3Rpb24geWcoYSxiKXthPWEudXBkYXRlUXVldWU7Yi51cGRhdGVRdWV1ZT09PWEmJihiLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmEuZmlyc3RCYXNlVXBkYXRlLGxhc3RCYXNlVXBkYXRlOmEubGFzdEJhc2VVcGRhdGUsc2hhcmVkOmEuc2hhcmVkLGVmZmVjdHM6YS5lZmZlY3RzfSl9ZnVuY3Rpb24gemcoYSxiKXtyZXR1cm57ZXZlbnRUaW1lOmEsbGFuZTpiLHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19XG5mdW5jdGlvbiBBZyhhLGIpe3ZhciBjPWEudXBkYXRlUXVldWU7bnVsbCE9PWMmJihjPWMuc2hhcmVkLEJnKGEpPyhhPWMuaW50ZXJsZWF2ZWQsbnVsbD09PWE/KGIubmV4dD1iLG51bGw9PT12Zz92Zz1bY106dmcucHVzaChjKSk6KGIubmV4dD1hLm5leHQsYS5uZXh0PWIpLGMuaW50ZXJsZWF2ZWQ9Yik6KGE9Yy5wZW5kaW5nLG51bGw9PT1hP2IubmV4dD1iOihiLm5leHQ9YS5uZXh0LGEubmV4dD1iKSxjLnBlbmRpbmc9YikpfWZ1bmN0aW9uIENnKGEsYixjKXtiPWIudXBkYXRlUXVldWU7aWYobnVsbCE9PWImJihiPWIuc2hhcmVkLDAhPT0oYyY0MTk0MjQwKSkpe3ZhciBkPWIubGFuZXM7ZCY9YS5wZW5kaW5nTGFuZXM7Y3w9ZDtiLmxhbmVzPWM7QmMoYSxjKX19XG5mdW5jdGlvbiBEZyhhLGIpe3ZhciBjPWEudXBkYXRlUXVldWUsZD1hLmFsdGVybmF0ZTtpZihudWxsIT09ZCYmKGQ9ZC51cGRhdGVRdWV1ZSxjPT09ZCkpe3ZhciBlPW51bGwsZj1udWxsO2M9Yy5maXJzdEJhc2VVcGRhdGU7aWYobnVsbCE9PWMpe2Rve3ZhciBnPXtldmVudFRpbWU6Yy5ldmVudFRpbWUsbGFuZTpjLmxhbmUsdGFnOmMudGFnLHBheWxvYWQ6Yy5wYXlsb2FkLGNhbGxiYWNrOmMuY2FsbGJhY2ssbmV4dDpudWxsfTtudWxsPT09Zj9lPWY9ZzpmPWYubmV4dD1nO2M9Yy5uZXh0fXdoaWxlKG51bGwhPT1jKTtudWxsPT09Zj9lPWY9YjpmPWYubmV4dD1ifWVsc2UgZT1mPWI7Yz17YmFzZVN0YXRlOmQuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLGxhc3RCYXNlVXBkYXRlOmYsc2hhcmVkOmQuc2hhcmVkLGVmZmVjdHM6ZC5lZmZlY3RzfTthLnVwZGF0ZVF1ZXVlPWM7cmV0dXJufWE9Yy5sYXN0QmFzZVVwZGF0ZTtudWxsPT09YT9jLmZpcnN0QmFzZVVwZGF0ZT1iOmEubmV4dD1cbmI7Yy5sYXN0QmFzZVVwZGF0ZT1ifVxuZnVuY3Rpb24gRWcoYSxiLGMsZCl7dmFyIGU9YS51cGRhdGVRdWV1ZTt3Zz0hMTt2YXIgZj1lLmZpcnN0QmFzZVVwZGF0ZSxnPWUubGFzdEJhc2VVcGRhdGUsaD1lLnNoYXJlZC5wZW5kaW5nO2lmKG51bGwhPT1oKXtlLnNoYXJlZC5wZW5kaW5nPW51bGw7dmFyIGs9aCxsPWsubmV4dDtrLm5leHQ9bnVsbDtudWxsPT09Zz9mPWw6Zy5uZXh0PWw7Zz1rO3ZhciBuPWEuYWx0ZXJuYXRlO251bGwhPT1uJiYobj1uLnVwZGF0ZVF1ZXVlLGg9bi5sYXN0QmFzZVVwZGF0ZSxoIT09ZyYmKG51bGw9PT1oP24uZmlyc3RCYXNlVXBkYXRlPWw6aC5uZXh0PWwsbi5sYXN0QmFzZVVwZGF0ZT1rKSl9aWYobnVsbCE9PWYpe3ZhciB1PWUuYmFzZVN0YXRlO2c9MDtuPWw9az1udWxsO2g9Zjtkb3t2YXIgcT1oLmxhbmUseT1oLmV2ZW50VGltZTtpZigoZCZxKT09PXEpe251bGwhPT1uJiYobj1uLm5leHQ9e2V2ZW50VGltZTp5LGxhbmU6MCx0YWc6aC50YWcscGF5bG9hZDpoLnBheWxvYWQsY2FsbGJhY2s6aC5jYWxsYmFjayxcbm5leHQ6bnVsbH0pO2E6e3ZhciBtPWEsdz1oO3E9Yjt5PWM7c3dpdGNoKHcudGFnKXtjYXNlIDE6bT13LnBheWxvYWQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIG0pe3U9bS5jYWxsKHksdSxxKTticmVhayBhfXU9bTticmVhayBhO2Nhc2UgMzptLmZsYWdzPW0uZmxhZ3MmLTY1NTM3fDEyODtjYXNlIDA6bT13LnBheWxvYWQ7cT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgbT9tLmNhbGwoeSx1LHEpOm07aWYobnVsbD09PXF8fHZvaWQgMD09PXEpYnJlYWsgYTt1PUEoe30sdSxxKTticmVhayBhO2Nhc2UgMjp3Zz0hMH19bnVsbCE9PWguY2FsbGJhY2smJjAhPT1oLmxhbmUmJihhLmZsYWdzfD02NCxxPWUuZWZmZWN0cyxudWxsPT09cT9lLmVmZmVjdHM9W2hdOnEucHVzaChoKSl9ZWxzZSB5PXtldmVudFRpbWU6eSxsYW5lOnEsdGFnOmgudGFnLHBheWxvYWQ6aC5wYXlsb2FkLGNhbGxiYWNrOmguY2FsbGJhY2ssbmV4dDpudWxsfSxudWxsPT09bj8obD1uPXksaz11KTpuPW4ubmV4dD15LGd8PXE7XG5oPWgubmV4dDtpZihudWxsPT09aClpZihoPWUuc2hhcmVkLnBlbmRpbmcsbnVsbD09PWgpYnJlYWs7ZWxzZSBxPWgsaD1xLm5leHQscS5uZXh0PW51bGwsZS5sYXN0QmFzZVVwZGF0ZT1xLGUuc2hhcmVkLnBlbmRpbmc9bnVsbH13aGlsZSgxKTtudWxsPT09biYmKGs9dSk7ZS5iYXNlU3RhdGU9aztlLmZpcnN0QmFzZVVwZGF0ZT1sO2UubGFzdEJhc2VVcGRhdGU9bjtiPWUuc2hhcmVkLmludGVybGVhdmVkO2lmKG51bGwhPT1iKXtlPWI7ZG8gZ3w9ZS5sYW5lLGU9ZS5uZXh0O3doaWxlKGUhPT1iKX1lbHNlIG51bGw9PT1mJiYoZS5zaGFyZWQubGFuZXM9MCk7Rmd8PWc7YS5sYW5lcz1nO2EubWVtb2l6ZWRTdGF0ZT11fX1cbmZ1bmN0aW9uIEdnKGEsYixjKXthPWIuZWZmZWN0cztiLmVmZmVjdHM9bnVsbDtpZihudWxsIT09YSlmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLGU9ZC5jYWxsYmFjaztpZihudWxsIT09ZSl7ZC5jYWxsYmFjaz1udWxsO2Q9YztpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZSl0aHJvdyBFcnJvcihwKDE5MSxlKSk7ZS5jYWxsKGQpfX19dmFyIEhnPShuZXcgYWEuQ29tcG9uZW50KS5yZWZzO2Z1bmN0aW9uIElnKGEsYixjLGQpe2I9YS5tZW1vaXplZFN0YXRlO2M9YyhkLGIpO2M9bnVsbD09PWN8fHZvaWQgMD09PWM/YjpBKHt9LGIsYyk7YS5tZW1vaXplZFN0YXRlPWM7MD09PWEubGFuZXMmJihhLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1jKX1cbnZhciBNZz17aXNNb3VudGVkOmZ1bmN0aW9uKGEpe3JldHVybihhPWEuX3JlYWN0SW50ZXJuYWxzKT9VYihhKT09PWE6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihhLGIsYyl7YT1hLl9yZWFjdEludGVybmFsczt2YXIgZD1KZygpLGU9S2coYSksZj16ZyhkLGUpO2YucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZi5jYWxsYmFjaz1jKTtBZyhhLGYpO2I9TGcoYSxlLGQpO251bGwhPT1iJiZDZyhiLGEsZSl9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oYSxiLGMpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGQ9SmcoKSxlPUtnKGEpLGY9emcoZCxlKTtmLnRhZz0xO2YucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZi5jYWxsYmFjaz1jKTtBZyhhLGYpO2I9TGcoYSxlLGQpO251bGwhPT1iJiZDZyhiLGEsZSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihhLGIpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGM9SmcoKSxkPUtnKGEpLGU9emcoYyxcbmQpO2UudGFnPTI7dm9pZCAwIT09YiYmbnVsbCE9PWImJihlLmNhbGxiYWNrPWIpO0FnKGEsZSk7Yj1MZyhhLGQsYyk7bnVsbCE9PWImJkNnKGIsYSxkKX19O2Z1bmN0aW9uIE5nKGEsYixjLGQsZSxmLGcpe2E9YS5zdGF0ZU5vZGU7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGEuc2hvdWxkQ29tcG9uZW50VXBkYXRlP2Euc2hvdWxkQ29tcG9uZW50VXBkYXRlKGQsZixnKTpiLnByb3RvdHlwZSYmYi5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IUhlKGMsZCl8fCFIZShlLGYpOiEwfVxuZnVuY3Rpb24gT2coYSxiLGMpe3ZhciBkPSExLGU9VWY7dmFyIGY9Yi5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mP2Y9dWcoZik6KGU9WWYoYik/V2Y6SC5jdXJyZW50LGQ9Yi5jb250ZXh0VHlwZXMsZj0oZD1udWxsIT09ZCYmdm9pZCAwIT09ZCk/WGYoYSxlKTpVZik7Yj1uZXcgYihjLGYpO2EubWVtb2l6ZWRTdGF0ZT1udWxsIT09Yi5zdGF0ZSYmdm9pZCAwIT09Yi5zdGF0ZT9iLnN0YXRlOm51bGw7Yi51cGRhdGVyPU1nO2Euc3RhdGVOb2RlPWI7Yi5fcmVhY3RJbnRlcm5hbHM9YTtkJiYoYT1hLnN0YXRlTm9kZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9ZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWYpO3JldHVybiBifVxuZnVuY3Rpb24gUGcoYSxiLGMsZCl7YT1iLnN0YXRlO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLGQpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGMsZCk7Yi5zdGF0ZSE9PWEmJk1nLmVucXVldWVSZXBsYWNlU3RhdGUoYixiLnN0YXRlLG51bGwpfVxuZnVuY3Rpb24gUWcoYSxiLGMsZCl7dmFyIGU9YS5zdGF0ZU5vZGU7ZS5wcm9wcz1jO2Uuc3RhdGU9YS5tZW1vaXplZFN0YXRlO2UucmVmcz1IZzt4ZyhhKTt2YXIgZj1iLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY/ZS5jb250ZXh0PXVnKGYpOihmPVlmKGIpP1dmOkguY3VycmVudCxlLmNvbnRleHQ9WGYoYSxmKSk7ZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGU7Zj1iLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcImZ1bmN0aW9uXCI9PT10eXBlb2YgZiYmKElnKGEsYixmLGMpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHN8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnR8fChiPWUuc3RhdGUsXG5cImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnQmJmUuY29tcG9uZW50V2lsbE1vdW50KCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksYiE9PWUuc3RhdGUmJk1nLmVucXVldWVSZXBsYWNlU3RhdGUoZSxlLnN0YXRlLG51bGwpLEVnKGEsYyxlLGQpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnREaWRNb3VudCYmKGEuZmxhZ3N8PTQxOTQzMDgpfXZhciBSZz1bXSxTZz0wLFRnPW51bGwsVWc9MCxWZz1bXSxXZz0wLFhnPW51bGwsWWc9MSxaZz1cIlwiO2Z1bmN0aW9uICRnKGEsYil7UmdbU2crK109VWc7UmdbU2crK109VGc7VGc9YTtVZz1ifVxuZnVuY3Rpb24gYWgoYSxiLGMpe1ZnW1dnKytdPVlnO1ZnW1dnKytdPVpnO1ZnW1dnKytdPVhnO1hnPWE7dmFyIGQ9WWc7YT1aZzt2YXIgZT0zMi1uYyhkKS0xO2QmPX4oMTw8ZSk7Yys9MTt2YXIgZj0zMi1uYyhiKStlO2lmKDMwPGYpe3ZhciBnPWUtZSU1O2Y9KGQmKDE8PGcpLTEpLnRvU3RyaW5nKDMyKTtkPj49ZztlLT1nO1lnPTE8PDMyLW5jKGIpK2V8Yzw8ZXxkO1pnPWYrYX1lbHNlIFlnPTE8PGZ8Yzw8ZXxkLFpnPWF9ZnVuY3Rpb24gYmgoYSl7bnVsbCE9PWEucmV0dXJuJiYoJGcoYSwxKSxhaChhLDEsMCkpfWZ1bmN0aW9uIGNoKGEpe2Zvcig7YT09PVRnOylUZz1SZ1stLVNnXSxSZ1tTZ109bnVsbCxVZz1SZ1stLVNnXSxSZ1tTZ109bnVsbDtmb3IoO2E9PT1YZzspWGc9VmdbLS1XZ10sVmdbV2ddPW51bGwsWmc9VmdbLS1XZ10sVmdbV2ddPW51bGwsWWc9VmdbLS1XZ10sVmdbV2ddPW51bGx9dmFyIGRoPW51bGwsZWg9bnVsbCxJPSExLGZoPW51bGw7XG5mdW5jdGlvbiBnaChhLGIpe3ZhciBjPWhoKDUsbnVsbCxudWxsLDApO2MuZWxlbWVudFR5cGU9XCJERUxFVEVEXCI7Yy5zdGF0ZU5vZGU9YjtjLnJldHVybj1hO2I9YS5kZWxldGlvbnM7bnVsbD09PWI/KGEuZGVsZXRpb25zPVtjXSxhLmZsYWdzfD0xNik6Yi5wdXNoKGMpfVxuZnVuY3Rpb24gaWgoYSxiKXtzd2l0Y2goYS50YWcpe2Nhc2UgNTp2YXIgYz1hLnR5cGU7Yj0xIT09Yi5ub2RlVHlwZXx8Yy50b0xvd2VyQ2FzZSgpIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6YjtyZXR1cm4gbnVsbCE9PWI/KGEuc3RhdGVOb2RlPWIsZGg9YSxlaD1LZihiLmZpcnN0Q2hpbGQpLCEwKTohMTtjYXNlIDY6cmV0dXJuIGI9XCJcIj09PWEucGVuZGluZ1Byb3BzfHwzIT09Yi5ub2RlVHlwZT9udWxsOmIsbnVsbCE9PWI/KGEuc3RhdGVOb2RlPWIsZGg9YSxlaD1udWxsLCEwKTohMTtjYXNlIDEzOnJldHVybiBiPTghPT1iLm5vZGVUeXBlP251bGw6YixudWxsIT09Yj8oYz1udWxsIT09WGc/e2lkOllnLG92ZXJmbG93OlpnfTpudWxsLGEubWVtb2l6ZWRTdGF0ZT17ZGVoeWRyYXRlZDpiLHRyZWVDb250ZXh0OmMscmV0cnlMYW5lOjEwNzM3NDE4MjR9LGM9aGgoMTgsbnVsbCxudWxsLDApLGMuc3RhdGVOb2RlPWIsYy5yZXR1cm49YSxhLmNoaWxkPWMsZGg9YSxlaD1cbm51bGwsITApOiExO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIGpoKGEpe3JldHVybiAwIT09KGEubW9kZSYxKSYmMD09PShhLmZsYWdzJjEyOCl9ZnVuY3Rpb24ga2goYSl7aWYoSSl7dmFyIGI9ZWg7aWYoYil7dmFyIGM9YjtpZighaWgoYSxiKSl7aWYoamgoYSkpdGhyb3cgRXJyb3IocCg0MTgpKTtiPUtmKGMubmV4dFNpYmxpbmcpO3ZhciBkPWRoO2ImJmloKGEsYik/Z2goZCxjKTooYS5mbGFncz1hLmZsYWdzJi00MDk3fDIsST0hMSxkaD1hKX19ZWxzZXtpZihqaChhKSl0aHJvdyBFcnJvcihwKDQxOCkpO2EuZmxhZ3M9YS5mbGFncyYtNDA5N3wyO0k9ITE7ZGg9YX19fWZ1bmN0aW9uIGxoKGEpe2ZvcihhPWEucmV0dXJuO251bGwhPT1hJiY1IT09YS50YWcmJjMhPT1hLnRhZyYmMTMhPT1hLnRhZzspYT1hLnJldHVybjtkaD1hfVxuZnVuY3Rpb24gbWgoYSl7aWYoYSE9PWRoKXJldHVybiExO2lmKCFJKXJldHVybiBsaChhKSxJPSEwLCExO3ZhciBiOyhiPTMhPT1hLnRhZykmJiEoYj01IT09YS50YWcpJiYoYj1hLnR5cGUsYj1cImhlYWRcIiE9PWImJlwiYm9keVwiIT09YiYmIURmKGEudHlwZSxhLm1lbW9pemVkUHJvcHMpKTtpZihiJiYoYj1laCkpe2lmKGpoKGEpKXtmb3IoYT1laDthOylhPUtmKGEubmV4dFNpYmxpbmcpO3Rocm93IEVycm9yKHAoNDE4KSk7fWZvcig7YjspZ2goYSxiKSxiPUtmKGIubmV4dFNpYmxpbmcpfWxoKGEpO2lmKDEzPT09YS50YWcpe2E9YS5tZW1vaXplZFN0YXRlO2E9bnVsbCE9PWE/YS5kZWh5ZHJhdGVkOm51bGw7aWYoIWEpdGhyb3cgRXJyb3IocCgzMTcpKTthOnthPWEubmV4dFNpYmxpbmc7Zm9yKGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihcIi8kXCI9PT1jKXtpZigwPT09Yil7ZWg9S2YoYS5uZXh0U2libGluZyk7YnJlYWsgYX1iLS19ZWxzZVwiJFwiIT09YyYmXG5cIiQhXCIhPT1jJiZcIiQ/XCIhPT1jfHxiKyt9YT1hLm5leHRTaWJsaW5nfWVoPW51bGx9fWVsc2UgZWg9ZGg/S2YoYS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9ZnVuY3Rpb24gbmgoKXtlaD1kaD1udWxsO0k9ITF9ZnVuY3Rpb24gb2goYSl7bnVsbD09PWZoP2ZoPVthXTpmaC5wdXNoKGEpfVxuZnVuY3Rpb24gcGgoYSxiLGMpe2E9Yy5yZWY7aWYobnVsbCE9PWEmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiZcIm9iamVjdFwiIT09dHlwZW9mIGEpe2lmKGMuX293bmVyKXtjPWMuX293bmVyO2lmKGMpe2lmKDEhPT1jLnRhZyl0aHJvdyBFcnJvcihwKDMwOSkpO3ZhciBkPWMuc3RhdGVOb2RlfWlmKCFkKXRocm93IEVycm9yKHAoMTQ3LGEpKTt2YXIgZT1kLGY9XCJcIithO2lmKG51bGwhPT1iJiZudWxsIT09Yi5yZWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBiLnJlZiYmYi5yZWYuX3N0cmluZ1JlZj09PWYpcmV0dXJuIGIucmVmO2I9ZnVuY3Rpb24oYSl7dmFyIGI9ZS5yZWZzO2I9PT1IZyYmKGI9ZS5yZWZzPXt9KTtudWxsPT09YT9kZWxldGUgYltmXTpiW2ZdPWF9O2IuX3N0cmluZ1JlZj1mO3JldHVybiBifWlmKFwic3RyaW5nXCIhPT10eXBlb2YgYSl0aHJvdyBFcnJvcihwKDI4NCkpO2lmKCFjLl9vd25lcil0aHJvdyBFcnJvcihwKDI5MCxhKSk7fXJldHVybiBhfVxuZnVuY3Rpb24gcWgoYSxiKXthPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiKTt0aHJvdyBFcnJvcihwKDMxLFwiW29iamVjdCBPYmplY3RdXCI9PT1hP1wib2JqZWN0IHdpdGgga2V5cyB7XCIrT2JqZWN0LmtleXMoYikuam9pbihcIiwgXCIpK1wifVwiOmEpKTt9ZnVuY3Rpb24gcmgoYSl7dmFyIGI9YS5faW5pdDtyZXR1cm4gYihhLl9wYXlsb2FkKX1cbmZ1bmN0aW9uIHNoKGEpe2Z1bmN0aW9uIGIoYixjKXtpZihhKXt2YXIgZD1iLmRlbGV0aW9ucztudWxsPT09ZD8oYi5kZWxldGlvbnM9W2NdLGIuZmxhZ3N8PTE2KTpkLnB1c2goYyl9fWZ1bmN0aW9uIGMoYyxkKXtpZighYSlyZXR1cm4gbnVsbDtmb3IoO251bGwhPT1kOyliKGMsZCksZD1kLnNpYmxpbmc7cmV0dXJuIG51bGx9ZnVuY3Rpb24gZChhLGIpe2ZvcihhPW5ldyBNYXA7bnVsbCE9PWI7KW51bGwhPT1iLmtleT9hLnNldChiLmtleSxiKTphLnNldChiLmluZGV4LGIpLGI9Yi5zaWJsaW5nO3JldHVybiBhfWZ1bmN0aW9uIGUoYSxiKXthPXRoKGEsYik7YS5pbmRleD0wO2Euc2libGluZz1udWxsO3JldHVybiBhfWZ1bmN0aW9uIGYoYixjLGQpe2IuaW5kZXg9ZDtpZighYSlyZXR1cm4gYi5mbGFnc3w9MTA0ODU3NixjO2Q9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWQpcmV0dXJuIGQ9ZC5pbmRleCxkPGM/KGIuZmxhZ3N8PTIsYyk6ZDtiLmZsYWdzfD0yO3JldHVybiBjfWZ1bmN0aW9uIGcoYil7YSYmXG5udWxsPT09Yi5hbHRlcm5hdGUmJihiLmZsYWdzfD0yKTtyZXR1cm4gYn1mdW5jdGlvbiBoKGEsYixjLGQpe2lmKG51bGw9PT1ifHw2IT09Yi50YWcpcmV0dXJuIGI9dWgoYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gayhhLGIsYyxkKXt2YXIgZj1jLnR5cGU7aWYoZj09PXdhKXJldHVybiBuKGEsYixjLnByb3BzLmNoaWxkcmVuLGQsYy5rZXkpO2lmKG51bGwhPT1iJiYoYi5lbGVtZW50VHlwZT09PWZ8fFwib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWYmJmYuJCR0eXBlb2Y9PT1HYSYmcmgoZik9PT1iLnR5cGUpKXJldHVybiBkPWUoYixjLnByb3BzKSxkLnJlZj1waChhLGIsYyksZC5yZXR1cm49YSxkO2Q9dmgoYy50eXBlLGMua2V5LGMucHJvcHMsbnVsbCxhLm1vZGUsZCk7ZC5yZWY9cGgoYSxiLGMpO2QucmV0dXJuPWE7cmV0dXJuIGR9ZnVuY3Rpb24gbChhLGIsYyxkKXtpZihudWxsPT09Ynx8NCE9PWIudGFnfHxcbmIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8hPT1jLmNvbnRhaW5lckluZm98fGIuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uIT09Yy5pbXBsZW1lbnRhdGlvbilyZXR1cm4gYj13aChjLGEubW9kZSxkKSxiLnJldHVybj1hLGI7Yj1lKGIsYy5jaGlsZHJlbnx8W10pO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gbihhLGIsYyxkLGYpe2lmKG51bGw9PT1ifHw3IT09Yi50YWcpcmV0dXJuIGI9eGgoYyxhLm1vZGUsZCxmKSxiLnJldHVybj1hLGI7Yj1lKGIsYyk7Yi5yZXR1cm49YTtyZXR1cm4gYn1mdW5jdGlvbiB1KGEsYixjKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGImJlwiXCIhPT1ifHxcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI9dWgoXCJcIitiLGEubW9kZSxjKSxiLnJldHVybj1hLGI7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBiJiZudWxsIT09Yil7c3dpdGNoKGIuJCR0eXBlb2Ype2Nhc2UgdWE6cmV0dXJuIGM9dmgoYi50eXBlLGIua2V5LGIucHJvcHMsbnVsbCxhLm1vZGUsYyksXG5jLnJlZj1waChhLG51bGwsYiksYy5yZXR1cm49YSxjO2Nhc2UgdmE6cmV0dXJuIGI9d2goYixhLm1vZGUsYyksYi5yZXR1cm49YSxiO2Nhc2UgR2E6dmFyIGQ9Yi5faW5pdDtyZXR1cm4gdShhLGQoYi5fcGF5bG9hZCksYyl9aWYoZGIoYil8fEphKGIpKXJldHVybiBiPXhoKGIsYS5tb2RlLGMsbnVsbCksYi5yZXR1cm49YSxiO3FoKGEsYil9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcShhLGIsYyxkKXt2YXIgZT1udWxsIT09Yj9iLmtleTpudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYyYmXCJcIiE9PWN8fFwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbnVsbCE9PWU/bnVsbDpoKGEsYixcIlwiK2MsZCk7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yyl7c3dpdGNoKGMuJCR0eXBlb2Ype2Nhc2UgdWE6cmV0dXJuIGMua2V5PT09ZT9rKGEsYixjLGQpOm51bGw7Y2FzZSB2YTpyZXR1cm4gYy5rZXk9PT1lP2woYSxiLGMsZCk6bnVsbDtjYXNlIEdhOnJldHVybiBlPWMuX2luaXQscShhLFxuYixlKGMuX3BheWxvYWQpLGQpfWlmKGRiKGMpfHxKYShjKSlyZXR1cm4gbnVsbCE9PWU/bnVsbDpuKGEsYixjLGQsbnVsbCk7cWgoYSxjKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB5KGEsYixjLGQsZSl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBkJiZcIlwiIT09ZHx8XCJudW1iZXJcIj09PXR5cGVvZiBkKXJldHVybiBhPWEuZ2V0KGMpfHxudWxsLGgoYixhLFwiXCIrZCxlKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGQmJm51bGwhPT1kKXtzd2l0Y2goZC4kJHR5cGVvZil7Y2FzZSB1YTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsayhiLGEsZCxlKTtjYXNlIHZhOnJldHVybiBhPWEuZ2V0KG51bGw9PT1kLmtleT9jOmQua2V5KXx8bnVsbCxsKGIsYSxkLGUpO2Nhc2UgR2E6dmFyIGY9ZC5faW5pdDtyZXR1cm4geShhLGIsYyxmKGQuX3BheWxvYWQpLGUpfWlmKGRiKGQpfHxKYShkKSlyZXR1cm4gYT1hLmdldChjKXx8bnVsbCxuKGIsYSxkLGUsbnVsbCk7cWgoYixkKX1yZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIG0oZSxnLGgsayl7Zm9yKHZhciBsPW51bGwsbj1udWxsLHI9ZyxtPWc9MCx4PW51bGw7bnVsbCE9PXImJm08aC5sZW5ndGg7bSsrKXtyLmluZGV4Pm0/KHg9cixyPW51bGwpOng9ci5zaWJsaW5nO3ZhciB2PXEoZSxyLGhbbV0sayk7aWYobnVsbD09PXYpe251bGw9PT1yJiYocj14KTticmVha31hJiZyJiZudWxsPT09di5hbHRlcm5hdGUmJmIoZSxyKTtnPWYodixnLG0pO251bGw9PT1uP2w9djpuLnNpYmxpbmc9djtuPXY7cj14fWlmKG09PT1oLmxlbmd0aClyZXR1cm4gYyhlLHIpLEkmJiRnKGUsbSksbDtpZihudWxsPT09cil7Zm9yKDttPGgubGVuZ3RoO20rKylyPXUoZSxoW21dLGspLG51bGwhPT1yJiYoZz1mKHIsZyxtKSxudWxsPT09bj9sPXI6bi5zaWJsaW5nPXIsbj1yKTtJJiYkZyhlLG0pO3JldHVybiBsfWZvcihyPWQoZSxyKTttPGgubGVuZ3RoO20rKyl4PXkocixlLG0saFttXSxrKSxudWxsIT09eCYmKGEmJm51bGwhPT14LmFsdGVybmF0ZSYmci5kZWxldGUobnVsbD09PVxueC5rZXk/bTp4LmtleSksZz1mKHgsZyxtKSxudWxsPT09bj9sPXg6bi5zaWJsaW5nPXgsbj14KTthJiZyLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGIoZSxhKX0pO0kmJiRnKGUsbSk7cmV0dXJuIGx9ZnVuY3Rpb24gdyhlLGcsaCxrKXt2YXIgbD1KYShoKTtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgbCl0aHJvdyBFcnJvcihwKDE1MCkpO2g9bC5jYWxsKGgpO2lmKG51bGw9PWgpdGhyb3cgRXJyb3IocCgxNTEpKTtmb3IodmFyIG49bD1udWxsLG09ZyxyPWc9MCx4PW51bGwsdj1oLm5leHQoKTtudWxsIT09bSYmIXYuZG9uZTtyKyssdj1oLm5leHQoKSl7bS5pbmRleD5yPyh4PW0sbT1udWxsKTp4PW0uc2libGluZzt2YXIgdz1xKGUsbSx2LnZhbHVlLGspO2lmKG51bGw9PT13KXtudWxsPT09bSYmKG09eCk7YnJlYWt9YSYmbSYmbnVsbD09PXcuYWx0ZXJuYXRlJiZiKGUsbSk7Zz1mKHcsZyxyKTtudWxsPT09bj9sPXc6bi5zaWJsaW5nPXc7bj13O209eH1pZih2LmRvbmUpcmV0dXJuIGMoZSxcbm0pLEkmJiRnKGUsciksbDtpZihudWxsPT09bSl7Zm9yKDshdi5kb25lO3IrKyx2PWgubmV4dCgpKXY9dShlLHYudmFsdWUsayksbnVsbCE9PXYmJihnPWYodixnLHIpLG51bGw9PT1uP2w9djpuLnNpYmxpbmc9dixuPXYpO0kmJiRnKGUscik7cmV0dXJuIGx9Zm9yKG09ZChlLG0pOyF2LmRvbmU7cisrLHY9aC5uZXh0KCkpdj15KG0sZSxyLHYudmFsdWUsayksbnVsbCE9PXYmJihhJiZudWxsIT09di5hbHRlcm5hdGUmJm0uZGVsZXRlKG51bGw9PT12LmtleT9yOnYua2V5KSxnPWYodixnLHIpLG51bGw9PT1uP2w9djpuLnNpYmxpbmc9dixuPXYpO2EmJm0uZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYihlLGEpfSk7SSYmJGcoZSxyKTtyZXR1cm4gbH1mdW5jdGlvbiBKKGEsZCxmLGgpe1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWYmJmYudHlwZT09PXdhJiZudWxsPT09Zi5rZXkmJihmPWYucHJvcHMuY2hpbGRyZW4pO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWYpe3N3aXRjaChmLiQkdHlwZW9mKXtjYXNlIHVhOmE6e2Zvcih2YXIgaz1cbmYua2V5LGw9ZDtudWxsIT09bDspe2lmKGwua2V5PT09ayl7az1mLnR5cGU7aWYoaz09PXdhKXtpZig3PT09bC50YWcpe2MoYSxsLnNpYmxpbmcpO2Q9ZShsLGYucHJvcHMuY2hpbGRyZW4pO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9fWVsc2UgaWYobC5lbGVtZW50VHlwZT09PWt8fFwib2JqZWN0XCI9PT10eXBlb2YgayYmbnVsbCE9PWsmJmsuJCR0eXBlb2Y9PT1HYSYmcmgoayk9PT1sLnR5cGUpe2MoYSxsLnNpYmxpbmcpO2Q9ZShsLGYucHJvcHMpO2QucmVmPXBoKGEsbCxmKTtkLnJldHVybj1hO2E9ZDticmVhayBhfWMoYSxsKTticmVha31lbHNlIGIoYSxsKTtsPWwuc2libGluZ31mLnR5cGU9PT13YT8oZD14aChmLnByb3BzLmNoaWxkcmVuLGEubW9kZSxoLGYua2V5KSxkLnJldHVybj1hLGE9ZCk6KGg9dmgoZi50eXBlLGYua2V5LGYucHJvcHMsbnVsbCxhLm1vZGUsaCksaC5yZWY9cGgoYSxkLGYpLGgucmV0dXJuPWEsYT1oKX1yZXR1cm4gZyhhKTtjYXNlIHZhOmE6e2ZvcihsPWYua2V5O251bGwhPT1cbmQ7KXtpZihkLmtleT09PWwpaWYoND09PWQudGFnJiZkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvPT09Zi5jb250YWluZXJJbmZvJiZkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbj09PWYuaW1wbGVtZW50YXRpb24pe2MoYSxkLnNpYmxpbmcpO2Q9ZShkLGYuY2hpbGRyZW58fFtdKTtkLnJldHVybj1hO2E9ZDticmVhayBhfWVsc2V7YyhhLGQpO2JyZWFrfWVsc2UgYihhLGQpO2Q9ZC5zaWJsaW5nfWQ9d2goZixhLm1vZGUsaCk7ZC5yZXR1cm49YTthPWR9cmV0dXJuIGcoYSk7Y2FzZSBHYTpyZXR1cm4gbD1mLl9pbml0LEooYSxkLGwoZi5fcGF5bG9hZCksaCl9aWYoZGIoZikpcmV0dXJuIG0oYSxkLGYsaCk7aWYoSmEoZikpcmV0dXJuIHcoYSxkLGYsaCk7cWgoYSxmKX1yZXR1cm5cInN0cmluZ1wiPT09dHlwZW9mIGYmJlwiXCIhPT1mfHxcIm51bWJlclwiPT09dHlwZW9mIGY/KGY9XCJcIitmLG51bGwhPT1kJiY2PT09ZC50YWc/KGMoYSxkLnNpYmxpbmcpLGQ9ZShkLGYpLGQucmV0dXJuPWEsYT1kKTpcbihjKGEsZCksZD11aChmLGEubW9kZSxoKSxkLnJldHVybj1hLGE9ZCksZyhhKSk6YyhhLGQpfXJldHVybiBKfXZhciB5aD1zaCghMCksemg9c2goITEpLEFoPXt9LEJoPVRmKEFoKSxDaD1UZihBaCksRGg9VGYoQWgpO2Z1bmN0aW9uIEVoKGEpe2lmKGE9PT1BaCl0aHJvdyBFcnJvcihwKDE3NCkpO3JldHVybiBhfWZ1bmN0aW9uIEZoKGEsYil7RyhEaCxiKTtHKENoLGEpO0coQmgsQWgpO2E9Yi5ub2RlVHlwZTtzd2l0Y2goYSl7Y2FzZSA5OmNhc2UgMTE6Yj0oYj1iLmRvY3VtZW50RWxlbWVudCk/Yi5uYW1lc3BhY2VVUkk6a2IobnVsbCxcIlwiKTticmVhaztkZWZhdWx0OmE9OD09PWE/Yi5wYXJlbnROb2RlOmIsYj1hLm5hbWVzcGFjZVVSSXx8bnVsbCxhPWEudGFnTmFtZSxiPWtiKGIsYSl9RShCaCk7RyhCaCxiKX1mdW5jdGlvbiBHaCgpe0UoQmgpO0UoQ2gpO0UoRGgpfVxuZnVuY3Rpb24gSGgoYSl7RWgoRGguY3VycmVudCk7dmFyIGI9RWgoQmguY3VycmVudCk7dmFyIGM9a2IoYixhLnR5cGUpO2IhPT1jJiYoRyhDaCxhKSxHKEJoLGMpKX1mdW5jdGlvbiBJaChhKXtDaC5jdXJyZW50PT09YSYmKEUoQmgpLEUoQ2gpKX12YXIgSz1UZigwKTtcbmZ1bmN0aW9uIEpoKGEpe2Zvcih2YXIgYj1hO251bGwhPT1iOyl7aWYoMTM9PT1iLnRhZyl7dmFyIGM9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1jJiYoYz1jLmRlaHlkcmF0ZWQsbnVsbD09PWN8fFwiJD9cIj09PWMuZGF0YXx8XCIkIVwiPT09Yy5kYXRhKSlyZXR1cm4gYn1lbHNlIGlmKDE5PT09Yi50YWcmJnZvaWQgMCE9PWIubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlcil7aWYoMCE9PShiLmZsYWdzJjEyOCkpcmV0dXJuIGJ9ZWxzZSBpZihudWxsIT09Yi5jaGlsZCl7Yi5jaGlsZC5yZXR1cm49YjtiPWIuY2hpbGQ7Y29udGludWV9aWYoYj09PWEpYnJlYWs7Zm9yKDtudWxsPT09Yi5zaWJsaW5nOyl7aWYobnVsbD09PWIucmV0dXJufHxiLnJldHVybj09PWEpcmV0dXJuIG51bGw7Yj1iLnJldHVybn1iLnNpYmxpbmcucmV0dXJuPWIucmV0dXJuO2I9Yi5zaWJsaW5nfXJldHVybiBudWxsfXZhciBLaD1bXTtcbmZ1bmN0aW9uIExoKCl7Zm9yKHZhciBhPTA7YTxLaC5sZW5ndGg7YSsrKUtoW2FdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7S2gubGVuZ3RoPTB9dmFyIE1oPXRhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsTmg9dGEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsT2g9MCxMPW51bGwsTT1udWxsLE49bnVsbCxQaD0hMSxRaD0hMSxSaD0wLFNoPTA7ZnVuY3Rpb24gTygpe3Rocm93IEVycm9yKHAoMzIxKSk7fWZ1bmN0aW9uIFRoKGEsYil7aWYobnVsbD09PWIpcmV0dXJuITE7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aCYmYzxhLmxlbmd0aDtjKyspaWYoIUdlKGFbY10sYltjXSkpcmV0dXJuITE7cmV0dXJuITB9XG5mdW5jdGlvbiBVaChhLGIsYyxkLGUsZil7T2g9ZjtMPWI7Yi5tZW1vaXplZFN0YXRlPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO2IubGFuZXM9MDtNaC5jdXJyZW50PW51bGw9PT1hfHxudWxsPT09YS5tZW1vaXplZFN0YXRlP1ZoOldoO2E9YyhkLGUpO2lmKFFoKXtmPTA7ZG97UWg9ITE7Umg9MDtpZigyNTw9Zil0aHJvdyBFcnJvcihwKDMwMSkpO2YrPTE7Tj1NPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO01oLmN1cnJlbnQ9WGg7YT1jKGQsZSl9d2hpbGUoUWgpfU1oLmN1cnJlbnQ9WWg7Yj1udWxsIT09TSYmbnVsbCE9PU0ubmV4dDtPaD0wO049TT1MPW51bGw7UGg9ITE7aWYoYil0aHJvdyBFcnJvcihwKDMwMCkpO3JldHVybiBhfWZ1bmN0aW9uIFpoKCl7dmFyIGE9MCE9PVJoO1JoPTA7cmV0dXJuIGF9XG5mdW5jdGlvbiAkaCgpe3ZhciBhPXttZW1vaXplZFN0YXRlOm51bGwsYmFzZVN0YXRlOm51bGwsYmFzZVF1ZXVlOm51bGwscXVldWU6bnVsbCxuZXh0Om51bGx9O251bGw9PT1OP0wubWVtb2l6ZWRTdGF0ZT1OPWE6Tj1OLm5leHQ9YTtyZXR1cm4gTn1mdW5jdGlvbiBhaSgpe2lmKG51bGw9PT1NKXt2YXIgYT1MLmFsdGVybmF0ZTthPW51bGwhPT1hP2EubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgYT1NLm5leHQ7dmFyIGI9bnVsbD09PU4/TC5tZW1vaXplZFN0YXRlOk4ubmV4dDtpZihudWxsIT09YilOPWIsTT1hO2Vsc2V7aWYobnVsbD09PWEpdGhyb3cgRXJyb3IocCgzMTApKTtNPWE7YT17bWVtb2l6ZWRTdGF0ZTpNLm1lbW9pemVkU3RhdGUsYmFzZVN0YXRlOk0uYmFzZVN0YXRlLGJhc2VRdWV1ZTpNLmJhc2VRdWV1ZSxxdWV1ZTpNLnF1ZXVlLG5leHQ6bnVsbH07bnVsbD09PU4/TC5tZW1vaXplZFN0YXRlPU49YTpOPU4ubmV4dD1hfXJldHVybiBOfVxuZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYj9iKGEpOmJ9XG5mdW5jdGlvbiBjaShhKXt2YXIgYj1haSgpLGM9Yi5xdWV1ZTtpZihudWxsPT09Yyl0aHJvdyBFcnJvcihwKDMxMSkpO2MubGFzdFJlbmRlcmVkUmVkdWNlcj1hO3ZhciBkPU0sZT1kLmJhc2VRdWV1ZSxmPWMucGVuZGluZztpZihudWxsIT09Zil7aWYobnVsbCE9PWUpe3ZhciBnPWUubmV4dDtlLm5leHQ9Zi5uZXh0O2YubmV4dD1nfWQuYmFzZVF1ZXVlPWU9ZjtjLnBlbmRpbmc9bnVsbH1pZihudWxsIT09ZSl7Zj1lLm5leHQ7ZD1kLmJhc2VTdGF0ZTt2YXIgaD1nPW51bGwsaz1udWxsLGw9Zjtkb3t2YXIgbj1sLmxhbmU7aWYoKE9oJm4pPT09biludWxsIT09ayYmKGs9ay5uZXh0PXtsYW5lOjAsYWN0aW9uOmwuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6bC5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6bC5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLGQ9bC5oYXNFYWdlclN0YXRlP2wuZWFnZXJTdGF0ZTphKGQsbC5hY3Rpb24pO2Vsc2V7dmFyIHU9e2xhbmU6bixhY3Rpb246bC5hY3Rpb24saGFzRWFnZXJTdGF0ZTpsLmhhc0VhZ2VyU3RhdGUsXG5lYWdlclN0YXRlOmwuZWFnZXJTdGF0ZSxuZXh0Om51bGx9O251bGw9PT1rPyhoPWs9dSxnPWQpOms9ay5uZXh0PXU7TC5sYW5lc3w9bjtGZ3w9bn1sPWwubmV4dH13aGlsZShudWxsIT09bCYmbCE9PWYpO251bGw9PT1rP2c9ZDprLm5leHQ9aDtHZShkLGIubWVtb2l6ZWRTdGF0ZSl8fCh0Zz0hMCk7Yi5tZW1vaXplZFN0YXRlPWQ7Yi5iYXNlU3RhdGU9ZztiLmJhc2VRdWV1ZT1rO2MubGFzdFJlbmRlcmVkU3RhdGU9ZH1hPWMuaW50ZXJsZWF2ZWQ7aWYobnVsbCE9PWEpe2U9YTtkbyBmPWUubGFuZSxMLmxhbmVzfD1mLEZnfD1mLGU9ZS5uZXh0O3doaWxlKGUhPT1hKX1lbHNlIG51bGw9PT1lJiYoYy5sYW5lcz0wKTtyZXR1cm5bYi5tZW1vaXplZFN0YXRlLGMuZGlzcGF0Y2hdfVxuZnVuY3Rpb24gZGkoYSl7dmFyIGI9YWkoKSxjPWIucXVldWU7aWYobnVsbD09PWMpdGhyb3cgRXJyb3IocCgzMTEpKTtjLmxhc3RSZW5kZXJlZFJlZHVjZXI9YTt2YXIgZD1jLmRpc3BhdGNoLGU9Yy5wZW5kaW5nLGY9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1lKXtjLnBlbmRpbmc9bnVsbDt2YXIgZz1lPWUubmV4dDtkbyBmPWEoZixnLmFjdGlvbiksZz1nLm5leHQ7d2hpbGUoZyE9PWUpO0dlKGYsYi5tZW1vaXplZFN0YXRlKXx8KHRnPSEwKTtiLm1lbW9pemVkU3RhdGU9ZjtudWxsPT09Yi5iYXNlUXVldWUmJihiLmJhc2VTdGF0ZT1mKTtjLmxhc3RSZW5kZXJlZFN0YXRlPWZ9cmV0dXJuW2YsZF19ZnVuY3Rpb24gZWkoKXt9XG5mdW5jdGlvbiBmaShhLGIpe3ZhciBjPUwsZD1haSgpLGU9YigpLGY9IUdlKGQubWVtb2l6ZWRTdGF0ZSxlKTtmJiYoZC5tZW1vaXplZFN0YXRlPWUsdGc9ITApO2Q9ZC5xdWV1ZTtnaShoaS5iaW5kKG51bGwsYyxkLGEpLFthXSk7aWYoZC5nZXRTbmFwc2hvdCE9PWJ8fGZ8fG51bGwhPT1OJiZOLm1lbW9pemVkU3RhdGUudGFnJjEpe2MuZmxhZ3N8PTIwNDg7aWkoOSxqaS5iaW5kKG51bGwsYyxkLGUsYiksdm9pZCAwLG51bGwpO2lmKG51bGw9PT1QKXRocm93IEVycm9yKHAoMzQ5KSk7MCE9PShPaCYzMCl8fGtpKGMsYixlKX1yZXR1cm4gZX1mdW5jdGlvbiBraShhLGIsYyl7YS5mbGFnc3w9MTYzODQ7YT17Z2V0U25hcHNob3Q6Yix2YWx1ZTpjfTtiPUwudXBkYXRlUXVldWU7bnVsbD09PWI/KGI9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0sTC51cGRhdGVRdWV1ZT1iLGIuc3RvcmVzPVthXSk6KGM9Yi5zdG9yZXMsbnVsbD09PWM/Yi5zdG9yZXM9W2FdOmMucHVzaChhKSl9XG5mdW5jdGlvbiBqaShhLGIsYyxkKXtiLnZhbHVlPWM7Yi5nZXRTbmFwc2hvdD1kO2xpKGIpJiZMZyhhLDEsLTEpfWZ1bmN0aW9uIGhpKGEsYixjKXtyZXR1cm4gYyhmdW5jdGlvbigpe2xpKGIpJiZMZyhhLDEsLTEpfSl9ZnVuY3Rpb24gbGkoYSl7dmFyIGI9YS5nZXRTbmFwc2hvdDthPWEudmFsdWU7dHJ5e3ZhciBjPWIoKTtyZXR1cm4hR2UoYSxjKX1jYXRjaChkKXtyZXR1cm4hMH19ZnVuY3Rpb24gbWkoYSl7dmFyIGI9JGgoKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmKGE9YSgpKTtiLm1lbW9pemVkU3RhdGU9Yi5iYXNlU3RhdGU9YTthPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjpiaSxsYXN0UmVuZGVyZWRTdGF0ZTphfTtiLnF1ZXVlPWE7YT1hLmRpc3BhdGNoPW5pLmJpbmQobnVsbCxMLGEpO3JldHVybltiLm1lbW9pemVkU3RhdGUsYV19XG5mdW5jdGlvbiBpaShhLGIsYyxkKXthPXt0YWc6YSxjcmVhdGU6YixkZXN0cm95OmMsZGVwczpkLG5leHQ6bnVsbH07Yj1MLnVwZGF0ZVF1ZXVlO251bGw9PT1iPyhiPXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LEwudXBkYXRlUXVldWU9YixiLmxhc3RFZmZlY3Q9YS5uZXh0PWEpOihjPWIubGFzdEVmZmVjdCxudWxsPT09Yz9iLmxhc3RFZmZlY3Q9YS5uZXh0PWE6KGQ9Yy5uZXh0LGMubmV4dD1hLGEubmV4dD1kLGIubGFzdEVmZmVjdD1hKSk7cmV0dXJuIGF9ZnVuY3Rpb24gb2koKXtyZXR1cm4gYWkoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIHBpKGEsYixjLGQpe3ZhciBlPSRoKCk7TC5mbGFnc3w9YTtlLm1lbW9pemVkU3RhdGU9aWkoMXxiLGMsdm9pZCAwLHZvaWQgMD09PWQ/bnVsbDpkKX1cbmZ1bmN0aW9uIHFpKGEsYixjLGQpe3ZhciBlPWFpKCk7ZD12b2lkIDA9PT1kP251bGw6ZDt2YXIgZj12b2lkIDA7aWYobnVsbCE9PU0pe3ZhciBnPU0ubWVtb2l6ZWRTdGF0ZTtmPWcuZGVzdHJveTtpZihudWxsIT09ZCYmVGgoZCxnLmRlcHMpKXtlLm1lbW9pemVkU3RhdGU9aWkoYixjLGYsZCk7cmV0dXJufX1MLmZsYWdzfD1hO2UubWVtb2l6ZWRTdGF0ZT1paSgxfGIsYyxmLGQpfWZ1bmN0aW9uIHJpKGEsYil7cmV0dXJuIHBpKDgzOTA2NTYsOCxhLGIpfWZ1bmN0aW9uIGdpKGEsYil7cmV0dXJuIHFpKDIwNDgsOCxhLGIpfWZ1bmN0aW9uIHNpKGEsYil7cmV0dXJuIHFpKDQsMixhLGIpfWZ1bmN0aW9uIHRpKGEsYil7cmV0dXJuIHFpKDQsNCxhLGIpfVxuZnVuY3Rpb24gdWkoYSxiKXtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYilyZXR1cm4gYT1hKCksYihhKSxmdW5jdGlvbigpe2IobnVsbCl9O2lmKG51bGwhPT1iJiZ2b2lkIDAhPT1iKXJldHVybiBhPWEoKSxiLmN1cnJlbnQ9YSxmdW5jdGlvbigpe2IuY3VycmVudD1udWxsfX1mdW5jdGlvbiB2aShhLGIsYyl7Yz1udWxsIT09YyYmdm9pZCAwIT09Yz9jLmNvbmNhdChbYV0pOm51bGw7cmV0dXJuIHFpKDQsNCx1aS5iaW5kKG51bGwsYixhKSxjKX1mdW5jdGlvbiB3aSgpe31mdW5jdGlvbiB4aShhLGIpe3ZhciBjPWFpKCk7Yj12b2lkIDA9PT1iP251bGw6Yjt2YXIgZD1jLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWQmJm51bGwhPT1iJiZUaChiLGRbMV0pKXJldHVybiBkWzBdO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX1cbmZ1bmN0aW9uIHlpKGEsYil7dmFyIGM9YWkoKTtiPXZvaWQgMD09PWI/bnVsbDpiO3ZhciBkPWMubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZCYmbnVsbCE9PWImJlRoKGIsZFsxXSkpcmV0dXJuIGRbMF07YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfWZ1bmN0aW9uIHppKGEsYixjKXtpZigwPT09KE9oJjIxKSlyZXR1cm4gYS5iYXNlU3RhdGUmJihhLmJhc2VTdGF0ZT0hMSx0Zz0hMCksYS5tZW1vaXplZFN0YXRlPWM7R2UoYyxiKXx8KGM9eGMoKSxMLmxhbmVzfD1jLEZnfD1jLGEuYmFzZVN0YXRlPSEwKTtyZXR1cm4gYn1mdW5jdGlvbiBBaShhLGIpe3ZhciBjPUM7Qz0wIT09YyYmND5jP2M6NDthKCEwKTt2YXIgZD1OaC50cmFuc2l0aW9uO05oLnRyYW5zaXRpb249e307dHJ5e2EoITEpLGIoKX1maW5hbGx5e0M9YyxOaC50cmFuc2l0aW9uPWR9fWZ1bmN0aW9uIEJpKCl7cmV0dXJuIGFpKCkubWVtb2l6ZWRTdGF0ZX1cbmZ1bmN0aW9uIENpKGEsYixjKXt2YXIgZD1LZyhhKTtjPXtsYW5lOmQsYWN0aW9uOmMsaGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTtEaShhKT9FaShiLGMpOihGaShhLGIsYyksYz1KZygpLGE9TGcoYSxkLGMpLG51bGwhPT1hJiZHaShhLGIsZCkpfVxuZnVuY3Rpb24gbmkoYSxiLGMpe3ZhciBkPUtnKGEpLGU9e2xhbmU6ZCxhY3Rpb246YyxoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKERpKGEpKUVpKGIsZSk7ZWxzZXtGaShhLGIsZSk7dmFyIGY9YS5hbHRlcm5hdGU7aWYoMD09PWEubGFuZXMmJihudWxsPT09Znx8MD09PWYubGFuZXMpJiYoZj1iLmxhc3RSZW5kZXJlZFJlZHVjZXIsbnVsbCE9PWYpKXRyeXt2YXIgZz1iLmxhc3RSZW5kZXJlZFN0YXRlLGg9ZihnLGMpO2UuaGFzRWFnZXJTdGF0ZT0hMDtlLmVhZ2VyU3RhdGU9aDtpZihHZShoLGcpKXJldHVybn1jYXRjaChrKXt9ZmluYWxseXt9Yz1KZygpO2E9TGcoYSxkLGMpO251bGwhPT1hJiZHaShhLGIsZCl9fWZ1bmN0aW9uIERpKGEpe3ZhciBiPWEuYWx0ZXJuYXRlO3JldHVybiBhPT09THx8bnVsbCE9PWImJmI9PT1MfVxuZnVuY3Rpb24gRWkoYSxiKXtRaD1QaD0hMDt2YXIgYz1hLnBlbmRpbmc7bnVsbD09PWM/Yi5uZXh0PWI6KGIubmV4dD1jLm5leHQsYy5uZXh0PWIpO2EucGVuZGluZz1ifWZ1bmN0aW9uIEZpKGEsYixjKXtCZyhhKT8oYT1iLmludGVybGVhdmVkLG51bGw9PT1hPyhjLm5leHQ9YyxudWxsPT09dmc/dmc9W2JdOnZnLnB1c2goYikpOihjLm5leHQ9YS5uZXh0LGEubmV4dD1jKSxiLmludGVybGVhdmVkPWMpOihhPWIucGVuZGluZyxudWxsPT09YT9jLm5leHQ9YzooYy5uZXh0PWEubmV4dCxhLm5leHQ9YyksYi5wZW5kaW5nPWMpfWZ1bmN0aW9uIEdpKGEsYixjKXtpZigwIT09KGMmNDE5NDI0MCkpe3ZhciBkPWIubGFuZXM7ZCY9YS5wZW5kaW5nTGFuZXM7Y3w9ZDtiLmxhbmVzPWM7QmMoYSxjKX19XG52YXIgWWg9e3JlYWRDb250ZXh0OnVnLHVzZUNhbGxiYWNrOk8sdXNlQ29udGV4dDpPLHVzZUVmZmVjdDpPLHVzZUltcGVyYXRpdmVIYW5kbGU6Tyx1c2VJbnNlcnRpb25FZmZlY3Q6Tyx1c2VMYXlvdXRFZmZlY3Q6Tyx1c2VNZW1vOk8sdXNlUmVkdWNlcjpPLHVzZVJlZjpPLHVzZVN0YXRlOk8sdXNlRGVidWdWYWx1ZTpPLHVzZURlZmVycmVkVmFsdWU6Tyx1c2VUcmFuc2l0aW9uOk8sdXNlTXV0YWJsZVNvdXJjZTpPLHVzZVN5bmNFeHRlcm5hbFN0b3JlOk8sdXNlSWQ6Tyx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LFZoPXtyZWFkQ29udGV4dDp1Zyx1c2VDYWxsYmFjazpmdW5jdGlvbihhLGIpeyRoKCkubWVtb2l6ZWRTdGF0ZT1bYSx2b2lkIDA9PT1iP251bGw6Yl07cmV0dXJuIGF9LHVzZUNvbnRleHQ6dWcsdXNlRWZmZWN0OnJpLHVzZUltcGVyYXRpdmVIYW5kbGU6ZnVuY3Rpb24oYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBwaSg0MTk0MzA4LFxuNCx1aS5iaW5kKG51bGwsYixhKSxjKX0sdXNlTGF5b3V0RWZmZWN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHBpKDQxOTQzMDgsNCxhLGIpfSx1c2VJbnNlcnRpb25FZmZlY3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcGkoNCwyLGEsYil9LHVzZU1lbW86ZnVuY3Rpb24oYSxiKXt2YXIgYz0kaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfSx1c2VSZWR1Y2VyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0kaCgpO2I9dm9pZCAwIT09Yz9jKGIpOmI7ZC5tZW1vaXplZFN0YXRlPWQuYmFzZVN0YXRlPWI7YT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6YSxsYXN0UmVuZGVyZWRTdGF0ZTpifTtkLnF1ZXVlPWE7YT1hLmRpc3BhdGNoPUNpLmJpbmQobnVsbCxMLGEpO3JldHVybltkLm1lbW9pemVkU3RhdGUsYV19LHVzZVJlZjpmdW5jdGlvbihhKXt2YXIgYj1cbiRoKCk7YT17Y3VycmVudDphfTtyZXR1cm4gYi5tZW1vaXplZFN0YXRlPWF9LHVzZVN0YXRlOm1pLHVzZURlYnVnVmFsdWU6d2ksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gJGgoKS5tZW1vaXplZFN0YXRlPWF9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1taSghMSksYj1hWzBdO2E9QWkuYmluZChudWxsLGFbMV0pOyRoKCkubWVtb2l6ZWRTdGF0ZT1hO3JldHVybltiLGFdfSx1c2VNdXRhYmxlU291cmNlOmZ1bmN0aW9uKCl7fSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9TCxlPSRoKCk7aWYoSSl7aWYodm9pZCAwPT09Yyl0aHJvdyBFcnJvcihwKDQwNykpO2M9YygpfWVsc2V7Yz1iKCk7aWYobnVsbD09PVApdGhyb3cgRXJyb3IocCgzNDkpKTswIT09KE9oJjMwKXx8a2koZCxiLGMpfWUubWVtb2l6ZWRTdGF0ZT1jO3ZhciBmPXt2YWx1ZTpjLGdldFNuYXBzaG90OmJ9O2UucXVldWU9ZjtyaShoaS5iaW5kKG51bGwsZCxcbmYsYSksW2FdKTtkLmZsYWdzfD0yMDQ4O2lpKDksamkuYmluZChudWxsLGQsZixjLGIpLHZvaWQgMCxudWxsKTtyZXR1cm4gY30sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgYT0kaCgpLGI9UC5pZGVudGlmaWVyUHJlZml4O2lmKEkpe3ZhciBjPVpnO3ZhciBkPVlnO2M9KGQmfigxPDwzMi1uYyhkKS0xKSkudG9TdHJpbmcoMzIpK2M7Yj1cIjpcIitiK1wiUlwiK2M7Yz1SaCsrOzA8YyYmKGIrPVwiSFwiK2MudG9TdHJpbmcoMzIpKTtiKz1cIjpcIn1lbHNlIGM9U2grKyxiPVwiOlwiK2IrXCJyXCIrYy50b1N0cmluZygzMikrXCI6XCI7cmV0dXJuIGEubWVtb2l6ZWRTdGF0ZT1ifSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LFdoPXtyZWFkQ29udGV4dDp1Zyx1c2VDYWxsYmFjazp4aSx1c2VDb250ZXh0OnVnLHVzZUVmZmVjdDpnaSx1c2VJbXBlcmF0aXZlSGFuZGxlOnZpLHVzZUluc2VydGlvbkVmZmVjdDpzaSx1c2VMYXlvdXRFZmZlY3Q6dGksdXNlTWVtbzp5aSx1c2VSZWR1Y2VyOmNpLHVzZVJlZjpvaSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjaShiaSl9LFxudXNlRGVidWdWYWx1ZTp3aSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPWFpKCk7cmV0dXJuIHppKGIsTS5tZW1vaXplZFN0YXRlLGEpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9Y2koYmkpWzBdLGI9YWkoKS5tZW1vaXplZFN0YXRlO3JldHVyblthLGJdfSx1c2VNdXRhYmxlU291cmNlOmVpLHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZpLHVzZUlkOkJpLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sWGg9e3JlYWRDb250ZXh0OnVnLHVzZUNhbGxiYWNrOnhpLHVzZUNvbnRleHQ6dWcsdXNlRWZmZWN0OmdpLHVzZUltcGVyYXRpdmVIYW5kbGU6dmksdXNlSW5zZXJ0aW9uRWZmZWN0OnNpLHVzZUxheW91dEVmZmVjdDp0aSx1c2VNZW1vOnlpLHVzZVJlZHVjZXI6ZGksdXNlUmVmOm9pLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGRpKGJpKX0sdXNlRGVidWdWYWx1ZTp3aSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPWFpKCk7cmV0dXJuIG51bGw9PT1cbk0/Yi5tZW1vaXplZFN0YXRlPWE6emkoYixNLm1lbW9pemVkU3RhdGUsYSl9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1kaShiaSlbMF0sYj1haSgpLm1lbW9pemVkU3RhdGU7cmV0dXJuW2EsYl19LHVzZU11dGFibGVTb3VyY2U6ZWksdXNlU3luY0V4dGVybmFsU3RvcmU6ZmksdXNlSWQ6QmksdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfTtmdW5jdGlvbiBIaShhLGIpe3RyeXt2YXIgYz1cIlwiLGQ9YjtkbyBjKz1PYShkKSxkPWQucmV0dXJuO3doaWxlKGQpO3ZhciBlPWN9Y2F0Y2goZil7ZT1cIlxcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6IFwiK2YubWVzc2FnZStcIlxcblwiK2Yuc3RhY2t9cmV0dXJue3ZhbHVlOmEsc291cmNlOmIsc3RhY2s6ZX19ZnVuY3Rpb24gSWkoYSxiKXt0cnl7Y29uc29sZS5lcnJvcihiLnZhbHVlKX1jYXRjaChjKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYzt9KX19XG52YXIgSmk9XCJmdW5jdGlvblwiPT09dHlwZW9mIFdlYWtNYXA/V2Vha01hcDpNYXA7ZnVuY3Rpb24gS2koYSxiLGMpe2M9emcoLTEsYyk7Yy50YWc9MztjLnBheWxvYWQ9e2VsZW1lbnQ6bnVsbH07dmFyIGQ9Yi52YWx1ZTtjLmNhbGxiYWNrPWZ1bmN0aW9uKCl7TGl8fChMaT0hMCxNaT1kKTtJaShhLGIpfTtyZXR1cm4gY31cbmZ1bmN0aW9uIE5pKGEsYixjKXtjPXpnKC0xLGMpO2MudGFnPTM7dmFyIGQ9YS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZCl7dmFyIGU9Yi52YWx1ZTtjLnBheWxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZChlKX07Yy5jYWxsYmFjaz1mdW5jdGlvbigpe0lpKGEsYil9fXZhciBmPWEuc3RhdGVOb2RlO251bGwhPT1mJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5jb21wb25lbnREaWRDYXRjaCYmKGMuY2FsbGJhY2s9ZnVuY3Rpb24oKXtJaShhLGIpO1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBkJiYobnVsbD09PU9pP09pPW5ldyBTZXQoW3RoaXNdKTpPaS5hZGQodGhpcykpO3ZhciBjPWIuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaChiLnZhbHVlLHtjb21wb25lbnRTdGFjazpudWxsIT09Yz9jOlwiXCJ9KX0pO3JldHVybiBjfVxuZnVuY3Rpb24gUGkoYSxiLGMpe3ZhciBkPWEucGluZ0NhY2hlO2lmKG51bGw9PT1kKXtkPWEucGluZ0NhY2hlPW5ldyBKaTt2YXIgZT1uZXcgU2V0O2Quc2V0KGIsZSl9ZWxzZSBlPWQuZ2V0KGIpLHZvaWQgMD09PWUmJihlPW5ldyBTZXQsZC5zZXQoYixlKSk7ZS5oYXMoYyl8fChlLmFkZChjKSxhPVFpLmJpbmQobnVsbCxhLGIsYyksYi50aGVuKGEsYSkpfWZ1bmN0aW9uIFJpKGEpe2Rve3ZhciBiO2lmKGI9MTM9PT1hLnRhZyliPWEubWVtb2l6ZWRTdGF0ZSxiPW51bGwhPT1iP251bGwhPT1iLmRlaHlkcmF0ZWQ/ITA6ITE6ITA7aWYoYilyZXR1cm4gYTthPWEucmV0dXJufXdoaWxlKG51bGwhPT1hKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIFNpKGEsYixjLGQsZSl7aWYoMD09PShhLm1vZGUmMSkpcmV0dXJuIGE9PT1iP2EuZmxhZ3N8PTY1NTM2OihhLmZsYWdzfD0xMjgsYy5mbGFnc3w9MTMxMDcyLGMuZmxhZ3MmPS01MjgwNSwxPT09Yy50YWcmJihudWxsPT09Yy5hbHRlcm5hdGU/Yy50YWc9MTc6KGI9emcoLTEsMSksYi50YWc9MixBZyhjLGIpKSksYy5sYW5lc3w9MSksYTthLmZsYWdzfD02NTUzNjthLmxhbmVzPWU7cmV0dXJuIGF9dmFyIFRpLFVpLFZpLFdpO1xuVGk9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yi5jaGlsZDtudWxsIT09Yzspe2lmKDU9PT1jLnRhZ3x8Nj09PWMudGFnKWEuYXBwZW5kQ2hpbGQoYy5zdGF0ZU5vZGUpO2Vsc2UgaWYoNCE9PWMudGFnJiZudWxsIT09Yy5jaGlsZCl7Yy5jaGlsZC5yZXR1cm49YztjPWMuY2hpbGQ7Y29udGludWV9aWYoYz09PWIpYnJlYWs7Zm9yKDtudWxsPT09Yy5zaWJsaW5nOyl7aWYobnVsbD09PWMucmV0dXJufHxjLnJldHVybj09PWIpcmV0dXJuO2M9Yy5yZXR1cm59Yy5zaWJsaW5nLnJldHVybj1jLnJldHVybjtjPWMuc2libGluZ319O1VpPWZ1bmN0aW9uKCl7fTtcblZpPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWEubWVtb2l6ZWRQcm9wcztpZihlIT09ZCl7YT1iLnN0YXRlTm9kZTtFaChCaC5jdXJyZW50KTt2YXIgZj1udWxsO3N3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjplPVhhKGEsZSk7ZD1YYShhLGQpO2Y9W107YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmU9QSh7fSxlLHt2YWx1ZTp2b2lkIDB9KTtkPUEoe30sZCx7dmFsdWU6dm9pZCAwfSk7Zj1bXTticmVhaztjYXNlIFwidGV4dGFyZWFcIjplPWZiKGEsZSk7ZD1mYihhLGQpO2Y9W107YnJlYWs7ZGVmYXVsdDpcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5vbkNsaWNrJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5vbkNsaWNrJiYoYS5vbmNsaWNrPUFmKX10YihjLGQpO3ZhciBnO2M9bnVsbDtmb3IobCBpbiBlKWlmKCFkLmhhc093blByb3BlcnR5KGwpJiZlLmhhc093blByb3BlcnR5KGwpJiZudWxsIT1lW2xdKWlmKFwic3R5bGVcIj09PWwpe3ZhciBoPWVbbF07Zm9yKGcgaW4gaCloLmhhc093blByb3BlcnR5KGcpJiZcbihjfHwoYz17fSksY1tnXT1cIlwiKX1lbHNlXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiIT09bCYmXCJjaGlsZHJlblwiIT09bCYmXCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWwmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1sJiZcImF1dG9Gb2N1c1wiIT09bCYmKGVhLmhhc093blByb3BlcnR5KGwpP2Z8fChmPVtdKTooZj1mfHxbXSkucHVzaChsLG51bGwpKTtmb3IobCBpbiBkKXt2YXIgaz1kW2xdO2g9bnVsbCE9ZT9lW2xdOnZvaWQgMDtpZihkLmhhc093blByb3BlcnR5KGwpJiZrIT09aCYmKG51bGwhPWt8fG51bGwhPWgpKWlmKFwic3R5bGVcIj09PWwpaWYoaCl7Zm9yKGcgaW4gaCkhaC5oYXNPd25Qcm9wZXJ0eShnKXx8ayYmay5oYXNPd25Qcm9wZXJ0eShnKXx8KGN8fChjPXt9KSxjW2ddPVwiXCIpO2ZvcihnIGluIGspay5oYXNPd25Qcm9wZXJ0eShnKSYmaFtnXSE9PWtbZ10mJihjfHwoYz17fSksY1tnXT1rW2ddKX1lbHNlIGN8fChmfHwoZj1bXSksZi5wdXNoKGwsXG5jKSksYz1rO2Vsc2VcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1sPyhrPWs/ay5fX2h0bWw6dm9pZCAwLGg9aD9oLl9faHRtbDp2b2lkIDAsbnVsbCE9ayYmaCE9PWsmJihmPWZ8fFtdKS5wdXNoKGwsaykpOlwiY2hpbGRyZW5cIj09PWw/XCJzdHJpbmdcIiE9PXR5cGVvZiBrJiZcIm51bWJlclwiIT09dHlwZW9mIGt8fChmPWZ8fFtdKS5wdXNoKGwsXCJcIitrKTpcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09bCYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWwmJihlYS5oYXNPd25Qcm9wZXJ0eShsKT8obnVsbCE9ayYmXCJvblNjcm9sbFwiPT09bCYmRChcInNjcm9sbFwiLGEpLGZ8fGg9PT1rfHwoZj1bXSkpOihmPWZ8fFtdKS5wdXNoKGwsaykpfWMmJihmPWZ8fFtdKS5wdXNoKFwic3R5bGVcIixjKTt2YXIgbD1mO2lmKGIudXBkYXRlUXVldWU9bCliLmZsYWdzfD00fX07V2k9ZnVuY3Rpb24oYSxiLGMsZCl7YyE9PWQmJihiLmZsYWdzfD00KX07XG5mdW5jdGlvbiBYaShhLGIpe2lmKCFJKXN3aXRjaChhLnRhaWxNb2RlKXtjYXNlIFwiaGlkZGVuXCI6Yj1hLnRhaWw7Zm9yKHZhciBjPW51bGw7bnVsbCE9PWI7KW51bGwhPT1iLmFsdGVybmF0ZSYmKGM9YiksYj1iLnNpYmxpbmc7bnVsbD09PWM/YS50YWlsPW51bGw6Yy5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSBcImNvbGxhcHNlZFwiOmM9YS50YWlsO2Zvcih2YXIgZD1udWxsO251bGwhPT1jOyludWxsIT09Yy5hbHRlcm5hdGUmJihkPWMpLGM9Yy5zaWJsaW5nO251bGw9PT1kP2J8fG51bGw9PT1hLnRhaWw/YS50YWlsPW51bGw6YS50YWlsLnNpYmxpbmc9bnVsbDpkLnNpYmxpbmc9bnVsbH19XG5mdW5jdGlvbiBRKGEpe3ZhciBiPW51bGwhPT1hLmFsdGVybmF0ZSYmYS5hbHRlcm5hdGUuY2hpbGQ9PT1hLmNoaWxkLGM9MCxkPTA7aWYoYilmb3IodmFyIGU9YS5jaGlsZDtudWxsIT09ZTspY3w9ZS5sYW5lc3xlLmNoaWxkTGFuZXMsZHw9ZS5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQsZHw9ZS5mbGFncyYxNDY4MDA2NCxlLnJldHVybj1hLGU9ZS5zaWJsaW5nO2Vsc2UgZm9yKGU9YS5jaGlsZDtudWxsIT09ZTspY3w9ZS5sYW5lc3xlLmNoaWxkTGFuZXMsZHw9ZS5zdWJ0cmVlRmxhZ3MsZHw9ZS5mbGFncyxlLnJldHVybj1hLGU9ZS5zaWJsaW5nO2Euc3VidHJlZUZsYWdzfD1kO2EuY2hpbGRMYW5lcz1jO3JldHVybiBifVxuZnVuY3Rpb24gWWkoYSxiLGMpe3ZhciBkPWIucGVuZGluZ1Byb3BzO2NoKGIpO3N3aXRjaChiLnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIFEoYiksbnVsbDtjYXNlIDE6cmV0dXJuIFlmKGIudHlwZSkmJlpmKCksUShiKSxudWxsO2Nhc2UgMzpkPWIuc3RhdGVOb2RlO0doKCk7RShWZik7RShIKTtMaCgpO2QucGVuZGluZ0NvbnRleHQmJihkLmNvbnRleHQ9ZC5wZW5kaW5nQ29udGV4dCxkLnBlbmRpbmdDb250ZXh0PW51bGwpO2lmKG51bGw9PT1hfHxudWxsPT09YS5jaGlsZCltaChiKT9iLmZsYWdzfD00Om51bGw9PT1hfHxhLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYwPT09KGIuZmxhZ3MmMjU2KXx8KGIuZmxhZ3N8PTEwMjQsbnVsbCE9PWZoJiYoWmkoZmgpLGZoPW51bGwpKTtVaShhLGIpO1EoYik7cmV0dXJuIG51bGw7Y2FzZSA1OkloKGIpO3ZhciBlPUVoKERoLmN1cnJlbnQpO1xuYz1iLnR5cGU7aWYobnVsbCE9PWEmJm51bGwhPWIuc3RhdGVOb2RlKVZpKGEsYixjLGQsZSksYS5yZWYhPT1iLnJlZiYmKGIuZmxhZ3N8PTUxMixiLmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFkKXtpZihudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IocCgxNjYpKTtRKGIpO3JldHVybiBudWxsfWE9RWgoQmguY3VycmVudCk7aWYobWgoYikpe2Q9Yi5zdGF0ZU5vZGU7Yz1iLnR5cGU7dmFyIGY9Yi5tZW1vaXplZFByb3BzO2RbTmZdPWI7ZFtPZl09ZjthPTAhPT0oYi5tb2RlJjEpO3N3aXRjaChjKXtjYXNlIFwiZGlhbG9nXCI6RChcImNhbmNlbFwiLGQpO0QoXCJjbG9zZVwiLGQpO2JyZWFrO2Nhc2UgXCJpZnJhbWVcIjpjYXNlIFwib2JqZWN0XCI6Y2FzZSBcImVtYmVkXCI6RChcImxvYWRcIixkKTticmVhaztjYXNlIFwidmlkZW9cIjpjYXNlIFwiYXVkaW9cIjpmb3IoZT0wO2U8a2YubGVuZ3RoO2UrKylEKGtmW2VdLGQpO2JyZWFrO2Nhc2UgXCJzb3VyY2VcIjpEKFwiZXJyb3JcIixkKTticmVhaztjYXNlIFwiaW1nXCI6Y2FzZSBcImltYWdlXCI6Y2FzZSBcImxpbmtcIjpEKFwiZXJyb3JcIixcbmQpO0QoXCJsb2FkXCIsZCk7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpEKFwidG9nZ2xlXCIsZCk7YnJlYWs7Y2FzZSBcImlucHV0XCI6WWEoZCxmKTtEKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpkLl93cmFwcGVyU3RhdGU9e3dhc011bHRpcGxlOiEhZi5tdWx0aXBsZX07RChcImludmFsaWRcIixkKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpnYihkLGYpLEQoXCJpbnZhbGlkXCIsZCl9dGIoYyxmKTtlPW51bGw7Zm9yKHZhciBnIGluIGYpaWYoZi5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIGg9ZltnXTtcImNoaWxkcmVuXCI9PT1nP1wic3RyaW5nXCI9PT10eXBlb2YgaD9kLnRleHRDb250ZW50IT09aCYmKCEwIT09Zi5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJnpmKGQudGV4dENvbnRlbnQsaCxhKSxlPVtcImNoaWxkcmVuXCIsaF0pOlwibnVtYmVyXCI9PT10eXBlb2YgaCYmZC50ZXh0Q29udGVudCE9PVwiXCIraCYmKCEwIT09Zi5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJnpmKGQudGV4dENvbnRlbnQsXG5oLGEpLGU9W1wiY2hpbGRyZW5cIixcIlwiK2hdKTplYS5oYXNPd25Qcm9wZXJ0eShnKSYmbnVsbCE9aCYmXCJvblNjcm9sbFwiPT09ZyYmRChcInNjcm9sbFwiLGQpfXN3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjpVYShkKTtjYihkLGYsITApO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOlVhKGQpO2liKGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpjYXNlIFwib3B0aW9uXCI6YnJlYWs7ZGVmYXVsdDpcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5vbkNsaWNrJiYoZC5vbmNsaWNrPUFmKX1kPWU7Yi51cGRhdGVRdWV1ZT1kO251bGwhPT1kJiYoYi5mbGFnc3w9NCl9ZWxzZXtnPTk9PT1lLm5vZGVUeXBlP2U6ZS5vd25lckRvY3VtZW50O1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPT09YSYmKGE9amIoYykpO1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPT09YT9cInNjcmlwdFwiPT09Yz8oYT1nLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksYS5pbm5lckhUTUw9XCI8c2NyaXB0PlxceDNjL3NjcmlwdD5cIixhPWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKSk6XG5cInN0cmluZ1wiPT09dHlwZW9mIGQuaXM/YT1nLmNyZWF0ZUVsZW1lbnQoYyx7aXM6ZC5pc30pOihhPWcuY3JlYXRlRWxlbWVudChjKSxcInNlbGVjdFwiPT09YyYmKGc9YSxkLm11bHRpcGxlP2cubXVsdGlwbGU9ITA6ZC5zaXplJiYoZy5zaXplPWQuc2l6ZSkpKTphPWcuY3JlYXRlRWxlbWVudE5TKGEsYyk7YVtOZl09YjthW09mXT1kO1RpKGEsYiwhMSwhMSk7Yi5zdGF0ZU5vZGU9YTthOntnPXViKGMsZCk7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpEKFwiY2FuY2VsXCIsYSk7RChcImNsb3NlXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpZnJhbWVcIjpjYXNlIFwib2JqZWN0XCI6Y2FzZSBcImVtYmVkXCI6RChcImxvYWRcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcInZpZGVvXCI6Y2FzZSBcImF1ZGlvXCI6Zm9yKGU9MDtlPGtmLmxlbmd0aDtlKyspRChrZltlXSxhKTtlPWQ7YnJlYWs7Y2FzZSBcInNvdXJjZVwiOkQoXCJlcnJvclwiLGEpO2U9ZDticmVhaztjYXNlIFwiaW1nXCI6Y2FzZSBcImltYWdlXCI6Y2FzZSBcImxpbmtcIjpEKFwiZXJyb3JcIixcbmEpO0QoXCJsb2FkXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJkZXRhaWxzXCI6RChcInRvZ2dsZVwiLGEpO2U9ZDticmVhaztjYXNlIFwiaW5wdXRcIjpZYShhLGQpO2U9WGEoYSxkKTtEKFwiaW52YWxpZFwiLGEpO2JyZWFrO2Nhc2UgXCJvcHRpb25cIjplPWQ7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmEuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFkLm11bHRpcGxlfTtlPUEoe30sZCx7dmFsdWU6dm9pZCAwfSk7RChcImludmFsaWRcIixhKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpnYihhLGQpO2U9ZmIoYSxkKTtEKFwiaW52YWxpZFwiLGEpO2JyZWFrO2RlZmF1bHQ6ZT1kfXRiKGMsZSk7aD1lO2ZvcihmIGluIGgpaWYoaC5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIGs9aFtmXTtcInN0eWxlXCI9PT1mP3JiKGEsayk6XCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09Zj8oaz1rP2suX19odG1sOnZvaWQgMCxudWxsIT1rJiZtYihhLGspKTpcImNoaWxkcmVuXCI9PT1mP1wic3RyaW5nXCI9PT10eXBlb2Ygaz8oXCJ0ZXh0YXJlYVwiIT09XG5jfHxcIlwiIT09aykmJm5iKGEsayk6XCJudW1iZXJcIj09PXR5cGVvZiBrJiZuYihhLFwiXCIrayk6XCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWYmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1mJiZcImF1dG9Gb2N1c1wiIT09ZiYmKGVhLmhhc093blByb3BlcnR5KGYpP251bGwhPWsmJlwib25TY3JvbGxcIj09PWYmJkQoXCJzY3JvbGxcIixhKTpudWxsIT1rJiZzYShhLGYsayxnKSl9c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOlVhKGEpO2NiKGEsZCwhMSk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VWEoYSk7aWIoYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOm51bGwhPWQudmFsdWUmJmEuc2V0QXR0cmlidXRlKFwidmFsdWVcIixcIlwiK1JhKGQudmFsdWUpKTticmVhaztjYXNlIFwic2VsZWN0XCI6YS5tdWx0aXBsZT0hIWQubXVsdGlwbGU7Zj1kLnZhbHVlO251bGwhPWY/ZWIoYSwhIWQubXVsdGlwbGUsZiwhMSk6bnVsbCE9ZC5kZWZhdWx0VmFsdWUmJmViKGEsISFkLm11bHRpcGxlLGQuZGVmYXVsdFZhbHVlLFxuITApO2JyZWFrO2RlZmF1bHQ6XCJmdW5jdGlvblwiPT09dHlwZW9mIGUub25DbGljayYmKGEub25jbGljaz1BZil9c3dpdGNoKGMpe2Nhc2UgXCJidXR0b25cIjpjYXNlIFwiaW5wdXRcIjpjYXNlIFwic2VsZWN0XCI6Y2FzZSBcInRleHRhcmVhXCI6ZD0hIWQuYXV0b0ZvY3VzO2JyZWFrIGE7Y2FzZSBcImltZ1wiOmQ9ITA7YnJlYWsgYTtkZWZhdWx0OmQ9ITF9fWQmJihiLmZsYWdzfD00KX1udWxsIT09Yi5yZWYmJihiLmZsYWdzfD01MTIsYi5mbGFnc3w9MjA5NzE1Mil9UShiKTtyZXR1cm4gbnVsbDtjYXNlIDY6aWYoYSYmbnVsbCE9Yi5zdGF0ZU5vZGUpV2koYSxiLGEubWVtb2l6ZWRQcm9wcyxkKTtlbHNle2lmKFwic3RyaW5nXCIhPT10eXBlb2YgZCYmbnVsbD09PWIuc3RhdGVOb2RlKXRocm93IEVycm9yKHAoMTY2KSk7Yz1FaChEaC5jdXJyZW50KTtFaChCaC5jdXJyZW50KTtpZihtaChiKSl7ZD1iLnN0YXRlTm9kZTtjPWIubWVtb2l6ZWRQcm9wcztkW05mXT1iO2lmKGY9ZC5ub2RlVmFsdWUhPT1jKWlmKGE9XG5kaCxudWxsIT09YSlzd2l0Y2goYS50YWcpe2Nhc2UgMzp6ZihkLm5vZGVWYWx1ZSxjLDAhPT0oYS5tb2RlJjEpKTticmVhaztjYXNlIDU6ITAhPT1hLm1lbW9pemVkUHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJiZ6ZihkLm5vZGVWYWx1ZSxjLDAhPT0oYS5tb2RlJjEpKX1mJiYoYi5mbGFnc3w9NCl9ZWxzZSBkPSg5PT09Yy5ub2RlVHlwZT9jOmMub3duZXJEb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoZCksZFtOZl09YixiLnN0YXRlTm9kZT1kfVEoYik7cmV0dXJuIG51bGw7Y2FzZSAxMzpFKEspO2Q9Yi5tZW1vaXplZFN0YXRlO2lmKEkmJm51bGwhPT1laCYmMCE9PShiLm1vZGUmMSkmJjA9PT0oYi5mbGFncyYxMjgpKXtmb3IoZD1laDtkOylkPUtmKGQubmV4dFNpYmxpbmcpO25oKCk7Yi5mbGFnc3w9OTg1NjA7cmV0dXJuIGJ9aWYobnVsbCE9PWQmJm51bGwhPT1kLmRlaHlkcmF0ZWQpe2Q9bWgoYik7aWYobnVsbD09PWEpe2lmKCFkKXRocm93IEVycm9yKHAoMzE4KSk7ZD1cbmIubWVtb2l6ZWRTdGF0ZTtkPW51bGwhPT1kP2QuZGVoeWRyYXRlZDpudWxsO2lmKCFkKXRocm93IEVycm9yKHAoMzE3KSk7ZFtOZl09Yn1lbHNlIG5oKCksMD09PShiLmZsYWdzJjEyOCkmJihiLm1lbW9pemVkU3RhdGU9bnVsbCksYi5mbGFnc3w9NDtRKGIpO3JldHVybiBudWxsfW51bGwhPT1maCYmKFppKGZoKSxmaD1udWxsKTtpZigwIT09KGIuZmxhZ3MmMTI4KSlyZXR1cm4gYi5sYW5lcz1jLGI7ZD1udWxsIT09ZDtjPSExO251bGw9PT1hP21oKGIpOmM9bnVsbCE9PWEubWVtb2l6ZWRTdGF0ZTtkIT09YyYmZCYmKGIuY2hpbGQuZmxhZ3N8PTgxOTIsMCE9PShiLm1vZGUmMSkmJihudWxsPT09YXx8MCE9PShLLmN1cnJlbnQmMSk/MD09PVImJihSPTMpOiRpKCkpKTtudWxsIT09Yi51cGRhdGVRdWV1ZSYmKGIuZmxhZ3N8PTQpO1EoYik7cmV0dXJuIG51bGw7Y2FzZSA0OnJldHVybiBHaCgpLFVpKGEsYiksbnVsbD09PWEmJnJmKGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLFEoYiksXG5udWxsO2Nhc2UgMTA6cmV0dXJuIHFnKGIudHlwZS5fY29udGV4dCksUShiKSxudWxsO2Nhc2UgMTc6cmV0dXJuIFlmKGIudHlwZSkmJlpmKCksUShiKSxudWxsO2Nhc2UgMTk6RShLKTtmPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsPT09ZilyZXR1cm4gUShiKSxudWxsO2Q9MCE9PShiLmZsYWdzJjEyOCk7Zz1mLnJlbmRlcmluZztpZihudWxsPT09ZylpZihkKVhpKGYsITEpO2Vsc2V7aWYoMCE9PVJ8fG51bGwhPT1hJiYwIT09KGEuZmxhZ3MmMTI4KSlmb3IoYT1iLmNoaWxkO251bGwhPT1hOyl7Zz1KaChhKTtpZihudWxsIT09Zyl7Yi5mbGFnc3w9MTI4O1hpKGYsITEpO2Q9Zy51cGRhdGVRdWV1ZTtudWxsIT09ZCYmKGIudXBkYXRlUXVldWU9ZCxiLmZsYWdzfD00KTtiLnN1YnRyZWVGbGFncz0wO2Q9Yztmb3IoYz1iLmNoaWxkO251bGwhPT1jOylmPWMsYT1kLGYuZmxhZ3MmPTE0NjgwMDY2LGc9Zi5hbHRlcm5hdGUsbnVsbD09PWc/KGYuY2hpbGRMYW5lcz0wLGYubGFuZXM9YSxmLmNoaWxkPVxubnVsbCxmLnN1YnRyZWVGbGFncz0wLGYubWVtb2l6ZWRQcm9wcz1udWxsLGYubWVtb2l6ZWRTdGF0ZT1udWxsLGYudXBkYXRlUXVldWU9bnVsbCxmLmRlcGVuZGVuY2llcz1udWxsLGYuc3RhdGVOb2RlPW51bGwpOihmLmNoaWxkTGFuZXM9Zy5jaGlsZExhbmVzLGYubGFuZXM9Zy5sYW5lcyxmLmNoaWxkPWcuY2hpbGQsZi5zdWJ0cmVlRmxhZ3M9MCxmLmRlbGV0aW9ucz1udWxsLGYubWVtb2l6ZWRQcm9wcz1nLm1lbW9pemVkUHJvcHMsZi5tZW1vaXplZFN0YXRlPWcubWVtb2l6ZWRTdGF0ZSxmLnVwZGF0ZVF1ZXVlPWcudXBkYXRlUXVldWUsZi50eXBlPWcudHlwZSxhPWcuZGVwZW5kZW5jaWVzLGYuZGVwZW5kZW5jaWVzPW51bGw9PT1hP251bGw6e2xhbmVzOmEubGFuZXMsZmlyc3RDb250ZXh0OmEuZmlyc3RDb250ZXh0fSksYz1jLnNpYmxpbmc7RyhLLEsuY3VycmVudCYxfDIpO3JldHVybiBiLmNoaWxkfWE9YS5zaWJsaW5nfW51bGwhPT1mLnRhaWwmJkIoKT5haiYmKGIuZmxhZ3N8PVxuMTI4LGQ9ITAsWGkoZiwhMSksYi5sYW5lcz00MTk0MzA0KX1lbHNle2lmKCFkKWlmKGE9SmgoZyksbnVsbCE9PWEpe2lmKGIuZmxhZ3N8PTEyOCxkPSEwLGM9YS51cGRhdGVRdWV1ZSxudWxsIT09YyYmKGIudXBkYXRlUXVldWU9YyxiLmZsYWdzfD00KSxYaShmLCEwKSxudWxsPT09Zi50YWlsJiZcImhpZGRlblwiPT09Zi50YWlsTW9kZSYmIWcuYWx0ZXJuYXRlJiYhSSlyZXR1cm4gUShiKSxudWxsfWVsc2UgMipCKCktZi5yZW5kZXJpbmdTdGFydFRpbWU+YWomJjEwNzM3NDE4MjQhPT1jJiYoYi5mbGFnc3w9MTI4LGQ9ITAsWGkoZiwhMSksYi5sYW5lcz00MTk0MzA0KTtmLmlzQmFja3dhcmRzPyhnLnNpYmxpbmc9Yi5jaGlsZCxiLmNoaWxkPWcpOihjPWYubGFzdCxudWxsIT09Yz9jLnNpYmxpbmc9ZzpiLmNoaWxkPWcsZi5sYXN0PWcpfWlmKG51bGwhPT1mLnRhaWwpcmV0dXJuIGI9Zi50YWlsLGYucmVuZGVyaW5nPWIsZi50YWlsPWIuc2libGluZyxmLnJlbmRlcmluZ1N0YXJ0VGltZT1cbkIoKSxiLnNpYmxpbmc9bnVsbCxjPUsuY3VycmVudCxHKEssZD9jJjF8MjpjJjEpLGI7UShiKTtyZXR1cm4gbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIGJqKCksZD1udWxsIT09Yi5tZW1vaXplZFN0YXRlLG51bGwhPT1hJiZudWxsIT09YS5tZW1vaXplZFN0YXRlIT09ZCYmKGIuZmxhZ3N8PTgxOTIpLGQmJjAhPT0oYi5tb2RlJjEpPzAhPT0oY2omMTA3Mzc0MTgyNCkmJihRKGIpLGIuc3VidHJlZUZsYWdzJjYmJihiLmZsYWdzfD04MTkyKSk6UShiKSxudWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7Y2FzZSAyNTpyZXR1cm4gbnVsbH10aHJvdyBFcnJvcihwKDE1NixiLnRhZykpO312YXIgZGo9dGEuUmVhY3RDdXJyZW50T3duZXIsdGc9ITE7ZnVuY3Rpb24gZWooYSxiLGMsZCl7Yi5jaGlsZD1udWxsPT09YT96aChiLG51bGwsYyxkKTp5aChiLGEuY2hpbGQsYyxkKX1cbmZ1bmN0aW9uIGZqKGEsYixjLGQsZSl7Yz1jLnJlbmRlcjt2YXIgZj1iLnJlZjtzZyhiLGUpO2Q9VWgoYSxiLGMsZCxmLGUpO2M9WmgoKTtpZihudWxsIT09YSYmIXRnKXJldHVybiBiLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsYi5mbGFncyY9LTIwNTMsYS5sYW5lcyY9fmUsZ2ooYSxiLGUpO0kmJmMmJmJoKGIpO2IuZmxhZ3N8PTE7ZWooYSxiLGQsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBoaihhLGIsYyxkLGUpe2lmKG51bGw9PT1hKXt2YXIgZj1jLnR5cGU7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGYmJiFpaihmKSYmdm9pZCAwPT09Zi5kZWZhdWx0UHJvcHMmJm51bGw9PT1jLmNvbXBhcmUmJnZvaWQgMD09PWMuZGVmYXVsdFByb3BzKXJldHVybiBiLnRhZz0xNSxiLnR5cGU9ZixqaihhLGIsZixkLGUpO2E9dmgoYy50eXBlLG51bGwsZCxiLGIubW9kZSxlKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9Zj1hLmNoaWxkO2lmKDA9PT0oYS5sYW5lcyZlKSl7dmFyIGc9Zi5tZW1vaXplZFByb3BzO2M9Yy5jb21wYXJlO2M9bnVsbCE9PWM/YzpIZTtpZihjKGcsZCkmJmEucmVmPT09Yi5yZWYpcmV0dXJuIGdqKGEsYixlKX1iLmZsYWdzfD0xO2E9dGgoZixkKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9XG5mdW5jdGlvbiBqaihhLGIsYyxkLGUpe2lmKG51bGwhPT1hKXt2YXIgZj1hLm1lbW9pemVkUHJvcHM7aWYoSGUoZixkKSYmYS5yZWY9PT1iLnJlZilpZih0Zz0hMSxiLnBlbmRpbmdQcm9wcz1kPWYsMCE9PShhLmxhbmVzJmUpKTAhPT0oYS5mbGFncyYxMzEwNzIpJiYodGc9ITApO2Vsc2UgcmV0dXJuIGIubGFuZXM9YS5sYW5lcyxnaihhLGIsZSl9cmV0dXJuIGtqKGEsYixjLGQsZSl9XG5mdW5jdGlvbiBsaihhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1kLmNoaWxkcmVuLGY9bnVsbCE9PWE/YS5tZW1vaXplZFN0YXRlOm51bGw7aWYoXCJoaWRkZW5cIj09PWQubW9kZSlpZigwPT09KGIubW9kZSYxKSliLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LEcobWosY2opLGNqfD1jO2Vsc2UgaWYoMCE9PShjJjEwNzM3NDE4MjQpKWIubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjAsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0sZD1udWxsIT09Zj9mLmJhc2VMYW5lczpjLEcobWosY2opLGNqfD1kO2Vsc2UgcmV0dXJuIGE9bnVsbCE9PWY/Zi5iYXNlTGFuZXN8YzpjLGIubGFuZXM9Yi5jaGlsZExhbmVzPTEwNzM3NDE4MjQsYi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6YSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxiLnVwZGF0ZVF1ZXVlPW51bGwsRyhtaixjaiksY2p8PWEsbnVsbDtcbmVsc2UgbnVsbCE9PWY/KGQ9Zi5iYXNlTGFuZXN8YyxiLm1lbW9pemVkU3RhdGU9bnVsbCk6ZD1jLEcobWosY2opLGNqfD1kO2VqKGEsYixlLGMpO3JldHVybiBiLmNoaWxkfWZ1bmN0aW9uIG5qKGEsYil7dmFyIGM9Yi5yZWY7aWYobnVsbD09PWEmJm51bGwhPT1jfHxudWxsIT09YSYmYS5yZWYhPT1jKWIuZmxhZ3N8PTUxMixiLmZsYWdzfD0yMDk3MTUyfWZ1bmN0aW9uIGtqKGEsYixjLGQsZSl7dmFyIGY9WWYoYyk/V2Y6SC5jdXJyZW50O2Y9WGYoYixmKTtzZyhiLGUpO2M9VWgoYSxiLGMsZCxmLGUpO2Q9WmgoKTtpZihudWxsIT09YSYmIXRnKXJldHVybiBiLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsYi5mbGFncyY9LTIwNTMsYS5sYW5lcyY9fmUsZ2ooYSxiLGUpO0kmJmQmJmJoKGIpO2IuZmxhZ3N8PTE7ZWooYSxiLGMsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBvaihhLGIsYyxkLGUpe2lmKFlmKGMpKXt2YXIgZj0hMDtiZyhiKX1lbHNlIGY9ITE7c2coYixlKTtpZihudWxsPT09Yi5zdGF0ZU5vZGUpbnVsbCE9PWEmJihhLmFsdGVybmF0ZT1udWxsLGIuYWx0ZXJuYXRlPW51bGwsYi5mbGFnc3w9MiksT2coYixjLGQpLFFnKGIsYyxkLGUpLGQ9ITA7ZWxzZSBpZihudWxsPT09YSl7dmFyIGc9Yi5zdGF0ZU5vZGUsaD1iLm1lbW9pemVkUHJvcHM7Zy5wcm9wcz1oO3ZhciBrPWcuY29udGV4dCxsPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBsJiZudWxsIT09bD9sPXVnKGwpOihsPVlmKGMpP1dmOkguY3VycmVudCxsPVhmKGIsbCkpO3ZhciBuPWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHU9XCJmdW5jdGlvblwiPT09dHlwZW9mIG58fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlO3V8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZcblwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09ZHx8ayE9PWwpJiZQZyhiLGcsZCxsKTt3Zz0hMTt2YXIgcT1iLm1lbW9pemVkU3RhdGU7Zy5zdGF0ZT1xO0VnKGIsZCxnLGUpO2s9Yi5tZW1vaXplZFN0YXRlO2ghPT1kfHxxIT09a3x8VmYuY3VycmVudHx8d2c/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBuJiYoSWcoYixjLG4sZCksaz1iLm1lbW9pemVkU3RhdGUpLChoPXdnfHxOZyhiLGMsaCxkLHEsayxsKSk/KHV8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudHx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudCYmZy5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksXCJmdW5jdGlvblwiPT09XG50eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQxOTQzMDgpKTooXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmZsYWdzfD00MTk0MzA4KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9ayksZy5wcm9wcz1kLGcuc3RhdGU9ayxnLmNvbnRleHQ9bCxkPWgpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQxOTQzMDgpLGQ9ITEpfWVsc2V7Zz1iLnN0YXRlTm9kZTt5ZyhhLGIpO2g9Yi5tZW1vaXplZFByb3BzO2w9Yi50eXBlPT09Yi5lbGVtZW50VHlwZT9oOmtnKGIudHlwZSxoKTtnLnByb3BzPWw7dT1iLnBlbmRpbmdQcm9wcztxPWcuY29udGV4dDtrPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09az9rPXVnKGspOihrPVlmKGMpP1dmOkguY3VycmVudCxrPVhmKGIsaykpO3ZhciB5PWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhuPVwiZnVuY3Rpb25cIj09PVxudHlwZW9mIHl8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKXx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09dXx8cSE9PWspJiZQZyhiLGcsZCxrKTt3Zz0hMTtxPWIubWVtb2l6ZWRTdGF0ZTtnLnN0YXRlPXE7RWcoYixkLGcsZSk7dmFyIG09Yi5tZW1vaXplZFN0YXRlO2ghPT11fHxxIT09bXx8VmYuY3VycmVudHx8d2c/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiB5JiYoSWcoYixjLHksZCksbT1iLm1lbW9pemVkU3RhdGUpLChsPXdnfHxOZyhiLGMsbCxkLHEsbSxrKXx8ITEpPyhufHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFVwZGF0ZXx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGUmJlxuZy5jb21wb25lbnRXaWxsVXBkYXRlKGQsbSxrKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShkLG0saykpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZSYmKGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlJiYoYi5mbGFnc3w9MTAyNCkpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnE9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcT09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTEwMjQpLGIubWVtb2l6ZWRQcm9wcz1kLGIubWVtb2l6ZWRTdGF0ZT1tKSxnLnByb3BzPWQsZy5zdGF0ZT1tLGcuY29udGV4dD1cbmssZD1sKTooXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlfHxoPT09YS5tZW1vaXplZFByb3BzJiZxPT09YS5tZW1vaXplZFN0YXRlfHwoYi5mbGFnc3w9NCksXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnE9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD0xMDI0KSxkPSExKX1yZXR1cm4gcGooYSxiLGMsZCxmLGUpfVxuZnVuY3Rpb24gcGooYSxiLGMsZCxlLGYpe25qKGEsYik7dmFyIGc9MCE9PShiLmZsYWdzJjEyOCk7aWYoIWQmJiFnKXJldHVybiBlJiZjZyhiLGMsITEpLGdqKGEsYixmKTtkPWIuc3RhdGVOb2RlO2RqLmN1cnJlbnQ9Yjt2YXIgaD1nJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I/bnVsbDpkLnJlbmRlcigpO2IuZmxhZ3N8PTE7bnVsbCE9PWEmJmc/KGIuY2hpbGQ9eWgoYixhLmNoaWxkLG51bGwsZiksYi5jaGlsZD15aChiLG51bGwsaCxmKSk6ZWooYSxiLGgsZik7Yi5tZW1vaXplZFN0YXRlPWQuc3RhdGU7ZSYmY2coYixjLCEwKTtyZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiBxaihhKXt2YXIgYj1hLnN0YXRlTm9kZTtiLnBlbmRpbmdDb250ZXh0PyRmKGEsYi5wZW5kaW5nQ29udGV4dCxiLnBlbmRpbmdDb250ZXh0IT09Yi5jb250ZXh0KTpiLmNvbnRleHQmJiRmKGEsYi5jb250ZXh0LCExKTtGaChhLGIuY29udGFpbmVySW5mbyl9XG5mdW5jdGlvbiByaihhLGIsYyxkLGUpe25oKCk7b2goZSk7Yi5mbGFnc3w9MjU2O2VqKGEsYixjLGQpO3JldHVybiBiLmNoaWxkfXZhciBzaj17ZGVoeWRyYXRlZDpudWxsLHRyZWVDb250ZXh0Om51bGwscmV0cnlMYW5lOjB9O2Z1bmN0aW9uIHRqKGEpe3JldHVybntiYXNlTGFuZXM6YSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfX1mdW5jdGlvbiB1aihhLGIpe3JldHVybntiYXNlTGFuZXM6YS5iYXNlTGFuZXN8YixjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczphLnRyYW5zaXRpb25zfX1cbmZ1bmN0aW9uIHZqKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPUsuY3VycmVudCxmPSExLGc9MCE9PShiLmZsYWdzJjEyOCksaDsoaD1nKXx8KGg9bnVsbCE9PWEmJm51bGw9PT1hLm1lbW9pemVkU3RhdGU/ITE6MCE9PShlJjIpKTtpZihoKWY9ITAsYi5mbGFncyY9LTEyOTtlbHNlIGlmKG51bGw9PT1hfHxudWxsIT09YS5tZW1vaXplZFN0YXRlKWV8PTE7RyhLLGUmMSk7aWYobnVsbD09PWEpe2toKGIpO2E9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1hJiYoYT1hLmRlaHlkcmF0ZWQsbnVsbCE9PWEpKXJldHVybiAwPT09KGIubW9kZSYxKT9iLmxhbmVzPTE6XCIkIVwiPT09YS5kYXRhP2IubGFuZXM9ODpiLmxhbmVzPTEwNzM3NDE4MjQsbnVsbDtlPWQuY2hpbGRyZW47YT1kLmZhbGxiYWNrO3JldHVybiBmPyhkPWIubW9kZSxmPWIuY2hpbGQsZT17bW9kZTpcImhpZGRlblwiLGNoaWxkcmVuOmV9LDA9PT0oZCYxKSYmbnVsbCE9PWY/KGYuY2hpbGRMYW5lcz0wLGYucGVuZGluZ1Byb3BzPVxuZSk6Zj13aihlLGQsMCxudWxsKSxhPXhoKGEsZCxjLG51bGwpLGYucmV0dXJuPWIsYS5yZXR1cm49YixmLnNpYmxpbmc9YSxiLmNoaWxkPWYsYi5jaGlsZC5tZW1vaXplZFN0YXRlPXRqKGMpLGIubWVtb2l6ZWRTdGF0ZT1zaixhKTp4aihiLGUpfWU9YS5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1lKXtoPWUuZGVoeWRyYXRlZDtpZihudWxsIT09aCl7aWYoZyl7aWYoYi5mbGFncyYyNTYpcmV0dXJuIGIuZmxhZ3MmPS0yNTcseWooYSxiLGMsRXJyb3IocCg0MjIpKSk7aWYobnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSlyZXR1cm4gYi5jaGlsZD1hLmNoaWxkLGIuZmxhZ3N8PTEyOCxudWxsO2Y9ZC5mYWxsYmFjaztlPWIubW9kZTtkPXdqKHttb2RlOlwidmlzaWJsZVwiLGNoaWxkcmVuOmQuY2hpbGRyZW59LGUsMCxudWxsKTtmPXhoKGYsZSxjLG51bGwpO2YuZmxhZ3N8PTI7ZC5yZXR1cm49YjtmLnJldHVybj1iO2Quc2libGluZz1mO2IuY2hpbGQ9ZDswIT09KGIubW9kZSYxKSYmeWgoYixhLmNoaWxkLFxubnVsbCxjKTtiLmNoaWxkLm1lbW9pemVkU3RhdGU9dGooYyk7Yi5tZW1vaXplZFN0YXRlPXNqO3JldHVybiBmfWlmKDA9PT0oYi5tb2RlJjEpKWI9eWooYSxiLGMsbnVsbCk7ZWxzZSBpZihcIiQhXCI9PT1oLmRhdGEpYj15aihhLGIsYyxFcnJvcihwKDQxOSkpKTtlbHNlIGlmKGQ9MCE9PShjJmEuY2hpbGRMYW5lcyksdGd8fGQpe2Q9UDtpZihudWxsIT09ZCl7c3dpdGNoKGMmLWMpe2Nhc2UgNDpmPTI7YnJlYWs7Y2FzZSAxNjpmPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OmY9MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6Zj1cbjI2ODQzNTQ1NjticmVhaztkZWZhdWx0OmY9MH1kPTAhPT0oZiYoZC5zdXNwZW5kZWRMYW5lc3xjKSk/MDpmOzAhPT1kJiZkIT09ZS5yZXRyeUxhbmUmJihlLnJldHJ5TGFuZT1kLExnKGEsZCwtMSkpfSRpKCk7Yj15aihhLGIsYyxFcnJvcihwKDQyMSkpKX1lbHNlXCIkP1wiPT09aC5kYXRhPyhiLmZsYWdzfD0xMjgsYi5jaGlsZD1hLmNoaWxkLGI9emouYmluZChudWxsLGEpLGguX3JlYWN0UmV0cnk9YixiPW51bGwpOihjPWUudHJlZUNvbnRleHQsZWg9S2YoaC5uZXh0U2libGluZyksZGg9YixJPSEwLGZoPW51bGwsbnVsbCE9PWMmJihWZ1tXZysrXT1ZZyxWZ1tXZysrXT1aZyxWZ1tXZysrXT1YZyxZZz1jLmlkLFpnPWMub3ZlcmZsb3csWGc9YiksYj14aihiLGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuKSxiLmZsYWdzfD00MDk2KTtyZXR1cm4gYn1pZihmKXJldHVybiBkPUFqKGEsYixkLmNoaWxkcmVuLGQuZmFsbGJhY2ssYyksZj1iLmNoaWxkLGU9YS5jaGlsZC5tZW1vaXplZFN0YXRlLFxuZi5tZW1vaXplZFN0YXRlPW51bGw9PT1lP3RqKGMpOnVqKGUsYyksZi5jaGlsZExhbmVzPWEuY2hpbGRMYW5lcyZ+YyxiLm1lbW9pemVkU3RhdGU9c2osZDtjPUJqKGEsYixkLmNoaWxkcmVuLGMpO2IubWVtb2l6ZWRTdGF0ZT1udWxsO3JldHVybiBjfWlmKGYpcmV0dXJuIGQ9QWooYSxiLGQuY2hpbGRyZW4sZC5mYWxsYmFjayxjKSxmPWIuY2hpbGQsZT1hLmNoaWxkLm1lbW9pemVkU3RhdGUsZi5tZW1vaXplZFN0YXRlPW51bGw9PT1lP3RqKGMpOnVqKGUsYyksZi5jaGlsZExhbmVzPWEuY2hpbGRMYW5lcyZ+YyxiLm1lbW9pemVkU3RhdGU9c2osZDtjPUJqKGEsYixkLmNoaWxkcmVuLGMpO2IubWVtb2l6ZWRTdGF0ZT1udWxsO3JldHVybiBjfWZ1bmN0aW9uIHhqKGEsYil7Yj13aih7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjpifSxhLm1vZGUsMCxudWxsKTtiLnJldHVybj1hO3JldHVybiBhLmNoaWxkPWJ9XG5mdW5jdGlvbiBCaihhLGIsYyxkKXt2YXIgZT1hLmNoaWxkO2E9ZS5zaWJsaW5nO2M9dGgoZSx7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjpjfSk7MD09PShiLm1vZGUmMSkmJihjLmxhbmVzPWQpO2MucmV0dXJuPWI7Yy5zaWJsaW5nPW51bGw7bnVsbCE9PWEmJihkPWIuZGVsZXRpb25zLG51bGw9PT1kPyhiLmRlbGV0aW9ucz1bYV0sYi5mbGFnc3w9MTYpOmQucHVzaChhKSk7cmV0dXJuIGIuY2hpbGQ9Y31cbmZ1bmN0aW9uIEFqKGEsYixjLGQsZSl7dmFyIGY9Yi5tb2RlO2E9YS5jaGlsZDt2YXIgZz1hLnNpYmxpbmcsaD17bW9kZTpcImhpZGRlblwiLGNoaWxkcmVuOmN9OzA9PT0oZiYxKSYmYi5jaGlsZCE9PWE/KGM9Yi5jaGlsZCxjLmNoaWxkTGFuZXM9MCxjLnBlbmRpbmdQcm9wcz1oLGIuZGVsZXRpb25zPW51bGwpOihjPXRoKGEsaCksYy5zdWJ0cmVlRmxhZ3M9YS5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQpO251bGwhPT1nP2Q9dGgoZyxkKTooZD14aChkLGYsZSxudWxsKSxkLmZsYWdzfD0yKTtkLnJldHVybj1iO2MucmV0dXJuPWI7Yy5zaWJsaW5nPWQ7Yi5jaGlsZD1jO3JldHVybiBkfWZ1bmN0aW9uIHlqKGEsYixjLGQpe251bGwhPT1kJiZvaChkKTt5aChiLGEuY2hpbGQsbnVsbCxjKTthPXhqKGIsYi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4pO2EuZmxhZ3N8PTI7Yi5tZW1vaXplZFN0YXRlPW51bGw7cmV0dXJuIGF9XG5mdW5jdGlvbiBDaihhLGIsYyl7YS5sYW5lc3w9Yjt2YXIgZD1hLmFsdGVybmF0ZTtudWxsIT09ZCYmKGQubGFuZXN8PWIpO3JnKGEucmV0dXJuLGIsYyl9ZnVuY3Rpb24gRGooYSxiLGMsZCxlKXt2YXIgZj1hLm1lbW9pemVkU3RhdGU7bnVsbD09PWY/YS5tZW1vaXplZFN0YXRlPXtpc0JhY2t3YXJkczpiLHJlbmRlcmluZzpudWxsLHJlbmRlcmluZ1N0YXJ0VGltZTowLGxhc3Q6ZCx0YWlsOmMsdGFpbE1vZGU6ZX06KGYuaXNCYWNrd2FyZHM9YixmLnJlbmRlcmluZz1udWxsLGYucmVuZGVyaW5nU3RhcnRUaW1lPTAsZi5sYXN0PWQsZi50YWlsPWMsZi50YWlsTW9kZT1lKX1cbmZ1bmN0aW9uIEVqKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPWQucmV2ZWFsT3JkZXIsZj1kLnRhaWw7ZWooYSxiLGQuY2hpbGRyZW4sYyk7ZD1LLmN1cnJlbnQ7aWYoMCE9PShkJjIpKWQ9ZCYxfDIsYi5mbGFnc3w9MTI4O2Vsc2V7aWYobnVsbCE9PWEmJjAhPT0oYS5mbGFncyYxMjgpKWE6Zm9yKGE9Yi5jaGlsZDtudWxsIT09YTspe2lmKDEzPT09YS50YWcpbnVsbCE9PWEubWVtb2l6ZWRTdGF0ZSYmQ2ooYSxjLGIpO2Vsc2UgaWYoMTk9PT1hLnRhZylDaihhLGMsYik7ZWxzZSBpZihudWxsIT09YS5jaGlsZCl7YS5jaGlsZC5yZXR1cm49YTthPWEuY2hpbGQ7Y29udGludWV9aWYoYT09PWIpYnJlYWsgYTtmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fGEucmV0dXJuPT09YilicmVhayBhO2E9YS5yZXR1cm59YS5zaWJsaW5nLnJldHVybj1hLnJldHVybjthPWEuc2libGluZ31kJj0xfUcoSyxkKTtpZigwPT09KGIubW9kZSYxKSliLm1lbW9pemVkU3RhdGU9XG5udWxsO2Vsc2Ugc3dpdGNoKGUpe2Nhc2UgXCJmb3J3YXJkc1wiOmM9Yi5jaGlsZDtmb3IoZT1udWxsO251bGwhPT1jOylhPWMuYWx0ZXJuYXRlLG51bGwhPT1hJiZudWxsPT09SmgoYSkmJihlPWMpLGM9Yy5zaWJsaW5nO2M9ZTtudWxsPT09Yz8oZT1iLmNoaWxkLGIuY2hpbGQ9bnVsbCk6KGU9Yy5zaWJsaW5nLGMuc2libGluZz1udWxsKTtEaihiLCExLGUsYyxmKTticmVhaztjYXNlIFwiYmFja3dhcmRzXCI6Yz1udWxsO2U9Yi5jaGlsZDtmb3IoYi5jaGlsZD1udWxsO251bGwhPT1lOyl7YT1lLmFsdGVybmF0ZTtpZihudWxsIT09YSYmbnVsbD09PUpoKGEpKXtiLmNoaWxkPWU7YnJlYWt9YT1lLnNpYmxpbmc7ZS5zaWJsaW5nPWM7Yz1lO2U9YX1EaihiLCEwLGMsbnVsbCxmKTticmVhaztjYXNlIFwidG9nZXRoZXJcIjpEaihiLCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6Yi5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBnaihhLGIsYyl7bnVsbCE9PWEmJihiLmRlcGVuZGVuY2llcz1hLmRlcGVuZGVuY2llcyk7Rmd8PWIubGFuZXM7aWYoMD09PShjJmIuY2hpbGRMYW5lcykpcmV0dXJuIG51bGw7aWYobnVsbCE9PWEmJmIuY2hpbGQhPT1hLmNoaWxkKXRocm93IEVycm9yKHAoMTUzKSk7aWYobnVsbCE9PWIuY2hpbGQpe2E9Yi5jaGlsZDtjPXRoKGEsYS5wZW5kaW5nUHJvcHMpO2IuY2hpbGQ9Yztmb3IoYy5yZXR1cm49YjtudWxsIT09YS5zaWJsaW5nOylhPWEuc2libGluZyxjPWMuc2libGluZz10aChhLGEucGVuZGluZ1Byb3BzKSxjLnJldHVybj1iO2Muc2libGluZz1udWxsfXJldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gRmooYSxiLGMpe3N3aXRjaChiLnRhZyl7Y2FzZSAzOnFqKGIpO25oKCk7YnJlYWs7Y2FzZSA1OkhoKGIpO2JyZWFrO2Nhc2UgMTpZZihiLnR5cGUpJiZiZyhiKTticmVhaztjYXNlIDQ6RmgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTticmVhaztjYXNlIDEwOnZhciBkPWIudHlwZS5fY29udGV4dCxlPWIubWVtb2l6ZWRQcm9wcy52YWx1ZTtHKGxnLGQuX2N1cnJlbnRWYWx1ZSk7ZC5fY3VycmVudFZhbHVlPWU7YnJlYWs7Y2FzZSAxMzpkPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZCl7aWYobnVsbCE9PWQuZGVoeWRyYXRlZClyZXR1cm4gRyhLLEsuY3VycmVudCYxKSxiLmZsYWdzfD0xMjgsbnVsbDtpZigwIT09KGMmYi5jaGlsZC5jaGlsZExhbmVzKSlyZXR1cm4gdmooYSxiLGMpO0coSyxLLmN1cnJlbnQmMSk7YT1naihhLGIsYyk7cmV0dXJuIG51bGwhPT1hP2Euc2libGluZzpudWxsfUcoSyxLLmN1cnJlbnQmMSk7YnJlYWs7Y2FzZSAxOTpkPTAhPT0oYyZcbmIuY2hpbGRMYW5lcyk7aWYoMCE9PShhLmZsYWdzJjEyOCkpe2lmKGQpcmV0dXJuIEVqKGEsYixjKTtiLmZsYWdzfD0xMjh9ZT1iLm1lbW9pemVkU3RhdGU7bnVsbCE9PWUmJihlLnJlbmRlcmluZz1udWxsLGUudGFpbD1udWxsLGUubGFzdEVmZmVjdD1udWxsKTtHKEssSy5jdXJyZW50KTtpZihkKWJyZWFrO2Vsc2UgcmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBiLmxhbmVzPTAsbGooYSxiLGMpfXJldHVybiBnaihhLGIsYyl9XG5mdW5jdGlvbiBHaihhLGIpe2NoKGIpO3N3aXRjaChiLnRhZyl7Y2FzZSAxOnJldHVybiBZZihiLnR5cGUpJiZaZigpLGE9Yi5mbGFncyxhJjY1NTM2PyhiLmZsYWdzPWEmLTY1NTM3fDEyOCxiKTpudWxsO2Nhc2UgMzpyZXR1cm4gR2goKSxFKFZmKSxFKEgpLExoKCksYT1iLmZsYWdzLDAhPT0oYSY2NTUzNikmJjA9PT0oYSYxMjgpPyhiLmZsYWdzPWEmLTY1NTM3fDEyOCxiKTpudWxsO2Nhc2UgNTpyZXR1cm4gSWgoYiksbnVsbDtjYXNlIDEzOkUoSyk7YT1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWEmJm51bGwhPT1hLmRlaHlkcmF0ZWQpe2lmKG51bGw9PT1iLmFsdGVybmF0ZSl0aHJvdyBFcnJvcihwKDM0MCkpO25oKCl9YT1iLmZsYWdzO3JldHVybiBhJjY1NTM2PyhiLmZsYWdzPWEmLTY1NTM3fDEyOCxiKTpudWxsO2Nhc2UgMTk6cmV0dXJuIEUoSyksbnVsbDtjYXNlIDQ6cmV0dXJuIEdoKCksbnVsbDtjYXNlIDEwOnJldHVybiBxZyhiLnR5cGUuX2NvbnRleHQpLG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBiaigpLFxubnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBIaj0hMSxTPSExLElqPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWFrU2V0P1dlYWtTZXQ6U2V0LFQ9bnVsbDtmdW5jdGlvbiBKaihhLGIpe3ZhciBjPWEucmVmO2lmKG51bGwhPT1jKWlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBjKXRyeXtjKG51bGwpfWNhdGNoKGQpe1UoYSxiLGQpfWVsc2UgYy5jdXJyZW50PW51bGx9ZnVuY3Rpb24gS2ooYSxiLGMpe3RyeXtjKCl9Y2F0Y2goZCl7VShhLGIsZCl9fXZhciBMaj0hMTtcbmZ1bmN0aW9uIE1qKGEsYil7QmY9Y2Q7YT1MZSgpO2lmKE1lKGEpKXtpZihcInNlbGVjdGlvblN0YXJ0XCJpbiBhKXZhciBjPXtzdGFydDphLnNlbGVjdGlvblN0YXJ0LGVuZDphLnNlbGVjdGlvbkVuZH07ZWxzZSBhOntjPShjPWEub3duZXJEb2N1bWVudCkmJmMuZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgZD1jLmdldFNlbGVjdGlvbiYmYy5nZXRTZWxlY3Rpb24oKTtpZihkJiYwIT09ZC5yYW5nZUNvdW50KXtjPWQuYW5jaG9yTm9kZTt2YXIgZT1kLmFuY2hvck9mZnNldCxmPWQuZm9jdXNOb2RlO2Q9ZC5mb2N1c09mZnNldDt0cnl7Yy5ub2RlVHlwZSxmLm5vZGVUeXBlfWNhdGNoKFope2M9bnVsbDticmVhayBhfXZhciBnPTAsaD0tMSxrPS0xLGw9MCxuPTAsdT1hLHE9bnVsbDtiOmZvcig7Oyl7Zm9yKHZhciB5Ozspe3UhPT1jfHwwIT09ZSYmMyE9PXUubm9kZVR5cGV8fChoPWcrZSk7dSE9PWZ8fDAhPT1kJiYzIT09dS5ub2RlVHlwZXx8KGs9ZytkKTszPT09dS5ub2RlVHlwZSYmKGcrPVxudS5ub2RlVmFsdWUubGVuZ3RoKTtpZihudWxsPT09KHk9dS5maXJzdENoaWxkKSlicmVhaztxPXU7dT15fWZvcig7Oyl7aWYodT09PWEpYnJlYWsgYjtxPT09YyYmKytsPT09ZSYmKGg9Zyk7cT09PWYmJisrbj09PWQmJihrPWcpO2lmKG51bGwhPT0oeT11Lm5leHRTaWJsaW5nKSlicmVhazt1PXE7cT11LnBhcmVudE5vZGV9dT15fWM9LTE9PT1ofHwtMT09PWs/bnVsbDp7c3RhcnQ6aCxlbmQ6a319ZWxzZSBjPW51bGx9Yz1jfHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBjPW51bGw7Q2Y9e2ZvY3VzZWRFbGVtOmEsc2VsZWN0aW9uUmFuZ2U6Y307Y2Q9ITE7Zm9yKFQ9YjtudWxsIT09VDspaWYoYj1ULGE9Yi5jaGlsZCwwIT09KGIuc3VidHJlZUZsYWdzJjEwMjgpJiZudWxsIT09YSlhLnJldHVybj1iLFQ9YTtlbHNlIGZvcig7bnVsbCE9PVQ7KXtiPVQ7dHJ5e3ZhciBtPWIuYWx0ZXJuYXRlO2lmKDAhPT0oYi5mbGFncyYxMDI0KSlzd2l0Y2goYi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6YnJlYWs7XG5jYXNlIDE6aWYobnVsbCE9PW0pe3ZhciB3PW0ubWVtb2l6ZWRQcm9wcyxKPW0ubWVtb2l6ZWRTdGF0ZSx2PWIuc3RhdGVOb2RlLHg9di5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShiLmVsZW1lbnRUeXBlPT09Yi50eXBlP3c6a2coYi50eXBlLHcpLEopO3YuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9eH1icmVhaztjYXNlIDM6dmFyIHI9Yi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztpZigxPT09ci5ub2RlVHlwZSlyLnRleHRDb250ZW50PVwiXCI7ZWxzZSBpZig5PT09ci5ub2RlVHlwZSl7dmFyIEY9ci5ib2R5O251bGwhPUYmJihGLnRleHRDb250ZW50PVwiXCIpfWJyZWFrO2Nhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDE2MykpO319Y2F0Y2goWil7VShiLGIucmV0dXJuLFopfWE9Yi5zaWJsaW5nO2lmKG51bGwhPT1hKXthLnJldHVybj1iLnJldHVybjtUPWE7YnJlYWt9VD1iLnJldHVybn1tPUxqO0xqPSExO3JldHVybiBtfVxuZnVuY3Rpb24gTmooYSxiLGMpe3ZhciBkPWIudXBkYXRlUXVldWU7ZD1udWxsIT09ZD9kLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09ZCl7dmFyIGU9ZD1kLm5leHQ7ZG97aWYoKGUudGFnJmEpPT09YSl7dmFyIGY9ZS5kZXN0cm95O2UuZGVzdHJveT12b2lkIDA7dm9pZCAwIT09ZiYmS2ooYixjLGYpfWU9ZS5uZXh0fXdoaWxlKGUhPT1kKX19ZnVuY3Rpb24gT2ooYSxiKXtiPWIudXBkYXRlUXVldWU7Yj1udWxsIT09Yj9iLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09Yil7dmFyIGM9Yj1iLm5leHQ7ZG97aWYoKGMudGFnJmEpPT09YSl7dmFyIGQ9Yy5jcmVhdGU7Yy5kZXN0cm95PWQoKX1jPWMubmV4dH13aGlsZShjIT09Yil9fWZ1bmN0aW9uIFBqKGEpe3ZhciBiPWEucmVmO2lmKG51bGwhPT1iKXt2YXIgYz1hLnN0YXRlTm9kZTtzd2l0Y2goYS50YWcpe2Nhc2UgNTphPWM7YnJlYWs7ZGVmYXVsdDphPWN9XCJmdW5jdGlvblwiPT09dHlwZW9mIGI/YihhKTpiLmN1cnJlbnQ9YX19XG5mdW5jdGlvbiBRaihhKXt2YXIgYj1hLmFsdGVybmF0ZTtudWxsIT09YiYmKGEuYWx0ZXJuYXRlPW51bGwsUWooYikpO2EuY2hpbGQ9bnVsbDthLmRlbGV0aW9ucz1udWxsO2Euc2libGluZz1udWxsOzU9PT1hLnRhZyYmKGI9YS5zdGF0ZU5vZGUsbnVsbCE9PWImJihkZWxldGUgYltOZl0sZGVsZXRlIGJbT2ZdLGRlbGV0ZSBiW25mXSxkZWxldGUgYltQZl0sZGVsZXRlIGJbUWZdKSk7YS5zdGF0ZU5vZGU9bnVsbDthLnJldHVybj1udWxsO2EuZGVwZW5kZW5jaWVzPW51bGw7YS5tZW1vaXplZFByb3BzPW51bGw7YS5tZW1vaXplZFN0YXRlPW51bGw7YS5wZW5kaW5nUHJvcHM9bnVsbDthLnN0YXRlTm9kZT1udWxsO2EudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBSaihhKXtyZXR1cm4gNT09PWEudGFnfHwzPT09YS50YWd8fDQ9PT1hLnRhZ31cbmZ1bmN0aW9uIFNqKGEpe2E6Zm9yKDs7KXtmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fFJqKGEucmV0dXJuKSlyZXR1cm4gbnVsbDthPWEucmV0dXJufWEuc2libGluZy5yZXR1cm49YS5yZXR1cm47Zm9yKGE9YS5zaWJsaW5nOzUhPT1hLnRhZyYmNiE9PWEudGFnJiYxOCE9PWEudGFnOyl7aWYoYS5mbGFncyYyKWNvbnRpbnVlIGE7aWYobnVsbD09PWEuY2hpbGR8fDQ9PT1hLnRhZyljb250aW51ZSBhO2Vsc2UgYS5jaGlsZC5yZXR1cm49YSxhPWEuY2hpbGR9aWYoIShhLmZsYWdzJjIpKXJldHVybiBhLnN0YXRlTm9kZX19XG5mdW5jdGlvbiBUaihhLGIsYyl7dmFyIGQ9YS50YWc7aWYoNT09PWR8fDY9PT1kKWE9YS5zdGF0ZU5vZGUsYj84PT09Yy5ub2RlVHlwZT9jLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsYik6Yy5pbnNlcnRCZWZvcmUoYSxiKTooOD09PWMubm9kZVR5cGU/KGI9Yy5wYXJlbnROb2RlLGIuaW5zZXJ0QmVmb3JlKGEsYykpOihiPWMsYi5hcHBlbmRDaGlsZChhKSksYz1jLl9yZWFjdFJvb3RDb250YWluZXIsbnVsbCE9PWMmJnZvaWQgMCE9PWN8fG51bGwhPT1iLm9uY2xpY2t8fChiLm9uY2xpY2s9QWYpKTtlbHNlIGlmKDQhPT1kJiYoYT1hLmNoaWxkLG51bGwhPT1hKSlmb3IoVGooYSxiLGMpLGE9YS5zaWJsaW5nO251bGwhPT1hOylUaihhLGIsYyksYT1hLnNpYmxpbmd9XG5mdW5jdGlvbiBVaihhLGIsYyl7dmFyIGQ9YS50YWc7aWYoNT09PWR8fDY9PT1kKWE9YS5zdGF0ZU5vZGUsYj9jLmluc2VydEJlZm9yZShhLGIpOmMuYXBwZW5kQ2hpbGQoYSk7ZWxzZSBpZig0IT09ZCYmKGE9YS5jaGlsZCxudWxsIT09YSkpZm9yKFVqKGEsYixjKSxhPWEuc2libGluZztudWxsIT09YTspVWooYSxiLGMpLGE9YS5zaWJsaW5nfXZhciBWPW51bGwsVmo9ITE7ZnVuY3Rpb24gV2ooYSxiLGMpe2ZvcihjPWMuY2hpbGQ7bnVsbCE9PWM7KVhqKGEsYixjKSxjPWMuc2libGluZ31cbmZ1bmN0aW9uIFhqKGEsYixjKXtpZihrYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGtjLm9uQ29tbWl0RmliZXJVbm1vdW50KXRyeXtrYy5vbkNvbW1pdEZpYmVyVW5tb3VudChqYyxjKX1jYXRjaChoKXt9c3dpdGNoKGMudGFnKXtjYXNlIDU6U3x8SmooYyxiKTtjYXNlIDY6dmFyIGQ9VixlPVZqO1Y9bnVsbDtXaihhLGIsYyk7Vj1kO1ZqPWU7bnVsbCE9PVYmJihWaj8oYT1WLGM9Yy5zdGF0ZU5vZGUsOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOmEucmVtb3ZlQ2hpbGQoYykpOlYucmVtb3ZlQ2hpbGQoYy5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDE4Om51bGwhPT1WJiYoVmo/KGE9VixjPWMuc3RhdGVOb2RlLDg9PT1hLm5vZGVUeXBlP0pmKGEucGFyZW50Tm9kZSxjKToxPT09YS5ub2RlVHlwZSYmSmYoYSxjKSxhZChhKSk6SmYoVixjLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgNDpkPVY7ZT1WajtWPWMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87Vmo9ITA7XG5XaihhLGIsYyk7Vj1kO1ZqPWU7YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFTJiYoZD1jLnVwZGF0ZVF1ZXVlLG51bGwhPT1kJiYoZD1kLmxhc3RFZmZlY3QsbnVsbCE9PWQpKSl7ZT1kPWQubmV4dDtkb3t2YXIgZj1lLGc9Zi5kZXN0cm95O2Y9Zi50YWc7dm9pZCAwIT09ZyYmKDAhPT0oZiYyKT9LaihjLGIsZyk6MCE9PShmJjQpJiZLaihjLGIsZykpO2U9ZS5uZXh0fXdoaWxlKGUhPT1kKX1XaihhLGIsYyk7YnJlYWs7Y2FzZSAxOmlmKCFTJiYoSmooYyxiKSxkPWMuc3RhdGVOb2RlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLmNvbXBvbmVudFdpbGxVbm1vdW50KSl0cnl7ZC5wcm9wcz1jLm1lbW9pemVkUHJvcHMsZC5zdGF0ZT1jLm1lbW9pemVkU3RhdGUsZC5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKGgpe1UoYyxiLGgpfVdqKGEsYixjKTticmVhaztjYXNlIDIxOldqKGEsYixjKTticmVhaztjYXNlIDIyOmMubW9kZSYxPyhTPShkPVMpfHxudWxsIT09XG5jLm1lbW9pemVkU3RhdGUsV2ooYSxiLGMpLFM9ZCk6V2ooYSxiLGMpO2JyZWFrO2RlZmF1bHQ6V2ooYSxiLGMpfX1mdW5jdGlvbiBZaihhKXt2YXIgYj1hLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1iKXthLnVwZGF0ZVF1ZXVlPW51bGw7dmFyIGM9YS5zdGF0ZU5vZGU7bnVsbD09PWMmJihjPWEuc3RhdGVOb2RlPW5ldyBJaik7Yi5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPVpqLmJpbmQobnVsbCxhLGIpO2MuaGFzKGIpfHwoYy5hZGQoYiksYi50aGVuKGQsZCkpfSl9fVxuZnVuY3Rpb24gYWsoYSxiKXt2YXIgYz1iLmRlbGV0aW9ucztpZihudWxsIT09Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt0cnl7dmFyIGY9YSxnPWIsaD1nO2E6Zm9yKDtudWxsIT09aDspe3N3aXRjaChoLnRhZyl7Y2FzZSA1OlY9aC5zdGF0ZU5vZGU7Vmo9ITE7YnJlYWsgYTtjYXNlIDM6Vj1oLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1ZqPSEwO2JyZWFrIGE7Y2FzZSA0OlY9aC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztWaj0hMDticmVhayBhfWg9aC5yZXR1cm59aWYobnVsbD09PVYpdGhyb3cgRXJyb3IocCgxNjApKTtYaihmLGcsZSk7Vj1udWxsO1ZqPSExO3ZhciBrPWUuYWx0ZXJuYXRlO251bGwhPT1rJiYoay5yZXR1cm49bnVsbCk7ZS5yZXR1cm49bnVsbH1jYXRjaChsKXtVKGUsYixsKX19aWYoYi5zdWJ0cmVlRmxhZ3MmMTI4NTQpZm9yKGI9Yi5jaGlsZDtudWxsIT09YjspYmsoYixhKSxiPWIuc2libGluZ31cbmZ1bmN0aW9uIGJrKGEsYil7dmFyIGM9YS5hbHRlcm5hdGUsZD1hLmZsYWdzO3N3aXRjaChhLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmFrKGIsYSk7Y2soYSk7aWYoZCY0KXt0cnl7TmooMyxhLGEucmV0dXJuKSxPaigzLGEpfWNhdGNoKG0pe1UoYSxhLnJldHVybixtKX10cnl7TmooNSxhLGEucmV0dXJuKX1jYXRjaChtKXtVKGEsYS5yZXR1cm4sbSl9fWJyZWFrO2Nhc2UgMTphayhiLGEpO2NrKGEpO2QmNTEyJiZudWxsIT09YyYmSmooYyxjLnJldHVybik7YnJlYWs7Y2FzZSA1OmFrKGIsYSk7Y2soYSk7ZCY1MTImJm51bGwhPT1jJiZKaihjLGMucmV0dXJuKTtpZihhLmZsYWdzJjMyKXt2YXIgZT1hLnN0YXRlTm9kZTt0cnl7bmIoZSxcIlwiKX1jYXRjaChtKXtVKGEsYS5yZXR1cm4sbSl9fWlmKGQmNCYmKGU9YS5zdGF0ZU5vZGUsbnVsbCE9ZSkpe3ZhciBmPWEubWVtb2l6ZWRQcm9wcyxnPW51bGwhPT1jP2MubWVtb2l6ZWRQcm9wczpmLGg9YS50eXBlLGs9YS51cGRhdGVRdWV1ZTtcbmEudXBkYXRlUXVldWU9bnVsbDtpZihudWxsIT09ayl0cnl7XCJpbnB1dFwiPT09aCYmXCJyYWRpb1wiPT09Zi50eXBlJiZudWxsIT1mLm5hbWUmJlphKGUsZik7dWIoaCxnKTt2YXIgbD11YihoLGYpO2ZvcihnPTA7ZzxrLmxlbmd0aDtnKz0yKXt2YXIgbj1rW2ddLHU9a1tnKzFdO1wic3R5bGVcIj09PW4/cmIoZSx1KTpcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1uP21iKGUsdSk6XCJjaGlsZHJlblwiPT09bj9uYihlLHUpOnNhKGUsbix1LGwpfXN3aXRjaChoKXtjYXNlIFwiaW5wdXRcIjokYShlLGYpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGUsZik7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOnZhciBxPWUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9ISFmLm11bHRpcGxlO3ZhciB5PWYudmFsdWU7bnVsbCE9eT9lYihlLCEhZi5tdWx0aXBsZSx5LCExKTpxIT09ISFmLm11bHRpcGxlJiYobnVsbCE9Zi5kZWZhdWx0VmFsdWU/ZWIoZSwhIWYubXVsdGlwbGUsXG5mLmRlZmF1bHRWYWx1ZSwhMCk6ZWIoZSwhIWYubXVsdGlwbGUsZi5tdWx0aXBsZT9bXTpcIlwiLCExKSl9ZVtPZl09Zn1jYXRjaChtKXtVKGEsYS5yZXR1cm4sbSl9fWJyZWFrO2Nhc2UgNjphayhiLGEpO2NrKGEpO2lmKGQmNCl7aWYobnVsbD09PWEuc3RhdGVOb2RlKXRocm93IEVycm9yKHAoMTYyKSk7bD1hLnN0YXRlTm9kZTtuPWEubWVtb2l6ZWRQcm9wczt0cnl7bC5ub2RlVmFsdWU9bn1jYXRjaChtKXtVKGEsYS5yZXR1cm4sbSl9fWJyZWFrO2Nhc2UgMzphayhiLGEpO2NrKGEpO2lmKGQmNCYmbnVsbCE9PWMmJmMubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpdHJ5e2FkKGIuY29udGFpbmVySW5mbyl9Y2F0Y2gobSl7VShhLGEucmV0dXJuLG0pfWJyZWFrO2Nhc2UgNDphayhiLGEpO2NrKGEpO2JyZWFrO2Nhc2UgMTM6YWsoYixhKTtjayhhKTtsPWEuY2hpbGQ7bC5mbGFncyY4MTkyJiZudWxsIT09bC5tZW1vaXplZFN0YXRlJiYobnVsbD09PWwuYWx0ZXJuYXRlfHxudWxsPT09bC5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSkmJlxuKGRrPUIoKSk7ZCY0JiZZaihhKTticmVhaztjYXNlIDIyOmw9bnVsbCE9PWMmJm51bGwhPT1jLm1lbW9pemVkU3RhdGU7YS5tb2RlJjE/KFM9KG49Uyl8fGwsYWsoYixhKSxTPW4pOmFrKGIsYSk7Y2soYSk7aWYoZCY4MTkyKXtuPW51bGwhPT1hLm1lbW9pemVkU3RhdGU7YTpmb3IodT1udWxsLHE9YTs7KXtpZig1PT09cS50YWcpe2lmKG51bGw9PT11KXt1PXE7dHJ5e2U9cS5zdGF0ZU5vZGUsbj8oZj1lLnN0eWxlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLnNldFByb3BlcnR5P2Yuc2V0UHJvcGVydHkoXCJkaXNwbGF5XCIsXCJub25lXCIsXCJpbXBvcnRhbnRcIik6Zi5kaXNwbGF5PVwibm9uZVwiKTooaD1xLnN0YXRlTm9kZSxrPXEubWVtb2l6ZWRQcm9wcy5zdHlsZSxnPXZvaWQgMCE9PWsmJm51bGwhPT1rJiZrLmhhc093blByb3BlcnR5KFwiZGlzcGxheVwiKT9rLmRpc3BsYXk6bnVsbCxoLnN0eWxlLmRpc3BsYXk9cWIoXCJkaXNwbGF5XCIsZykpfWNhdGNoKG0pe1UoYSxhLnJldHVybixtKX19fWVsc2UgaWYoNj09PVxucS50YWcpe2lmKG51bGw9PT11KXRyeXtxLnN0YXRlTm9kZS5ub2RlVmFsdWU9bj9cIlwiOnEubWVtb2l6ZWRQcm9wc31jYXRjaChtKXtVKGEsYS5yZXR1cm4sbSl9fWVsc2UgaWYoKDIyIT09cS50YWcmJjIzIT09cS50YWd8fG51bGw9PT1xLm1lbW9pemVkU3RhdGV8fHE9PT1hKSYmbnVsbCE9PXEuY2hpbGQpe3EuY2hpbGQucmV0dXJuPXE7cT1xLmNoaWxkO2NvbnRpbnVlfWlmKHE9PT1hKWJyZWFrIGE7Zm9yKDtudWxsPT09cS5zaWJsaW5nOyl7aWYobnVsbD09PXEucmV0dXJufHxxLnJldHVybj09PWEpYnJlYWsgYTt1PT09cSYmKHU9bnVsbCk7cT1xLnJldHVybn11PT09cSYmKHU9bnVsbCk7cS5zaWJsaW5nLnJldHVybj1xLnJldHVybjtxPXEuc2libGluZ31pZihuJiYhbCYmMCE9PShhLm1vZGUmMSkpZm9yKFQ9YSxhPWEuY2hpbGQ7bnVsbCE9PWE7KXtmb3IobD1UPWE7bnVsbCE9PVQ7KXtuPVQ7dT1uLmNoaWxkO3N3aXRjaChuLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1Ok5qKDQsXG5uLG4ucmV0dXJuKTticmVhaztjYXNlIDE6SmoobixuLnJldHVybik7Zj1uLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5jb21wb25lbnRXaWxsVW5tb3VudCl7cT1uO3k9bi5yZXR1cm47dHJ5e2U9cSxmLnByb3BzPWUubWVtb2l6ZWRQcm9wcyxmLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxmLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gobSl7VShxLHksbSl9fWJyZWFrO2Nhc2UgNTpKaihuLG4ucmV0dXJuKTticmVhaztjYXNlIDIyOmlmKG51bGwhPT1uLm1lbW9pemVkU3RhdGUpe2VrKGwpO2NvbnRpbnVlfX1udWxsIT09dT8odS5yZXR1cm49bixUPXUpOmVrKGwpfWE9YS5zaWJsaW5nfX1icmVhaztjYXNlIDE5OmFrKGIsYSk7Y2soYSk7ZCY0JiZZaihhKTticmVhaztjYXNlIDIxOmJyZWFrO2RlZmF1bHQ6YWsoYixhKSxjayhhKX19XG5mdW5jdGlvbiBjayhhKXt2YXIgYj1hLmZsYWdzO2lmKGImMil7dHJ5e2E6e2Zvcih2YXIgYz1hLnJldHVybjtudWxsIT09Yzspe2lmKFJqKGMpKXt2YXIgZD1jO2JyZWFrIGF9Yz1jLnJldHVybn10aHJvdyBFcnJvcihwKDE2MCkpO31zd2l0Y2goZC50YWcpe2Nhc2UgNTp2YXIgZT1kLnN0YXRlTm9kZTtkLmZsYWdzJjMyJiYobmIoZSxcIlwiKSxkLmZsYWdzJj0tMzMpO3ZhciBmPVNqKGEpO1VqKGEsZixlKTticmVhaztjYXNlIDM6Y2FzZSA0OnZhciBnPWQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8saD1TaihhKTtUaihhLGgsZyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDE2MSkpO319Y2F0Y2goayl7VShhLGEucmV0dXJuLGspfWEuZmxhZ3MmPS0zfWImNDA5NiYmKGEuZmxhZ3MmPS00MDk3KX1mdW5jdGlvbiBmayhhLGIsYyl7VD1hO2drKGEsYixjKX1cbmZ1bmN0aW9uIGdrKGEsYixjKXtmb3IodmFyIGQ9MCE9PShhLm1vZGUmMSk7bnVsbCE9PVQ7KXt2YXIgZT1ULGY9ZS5jaGlsZDtpZigyMj09PWUudGFnJiZkKXt2YXIgZz1udWxsIT09ZS5tZW1vaXplZFN0YXRlfHxIajtpZighZyl7dmFyIGg9ZS5hbHRlcm5hdGUsaz1udWxsIT09aCYmbnVsbCE9PWgubWVtb2l6ZWRTdGF0ZXx8UztoPUhqO3ZhciBsPVM7SGo9ZztpZigoUz1rKSYmIWwpZm9yKFQ9ZTtudWxsIT09VDspZz1ULGs9Zy5jaGlsZCwyMj09PWcudGFnJiZudWxsIT09Zy5tZW1vaXplZFN0YXRlP2hrKGUpOm51bGwhPT1rPyhrLnJldHVybj1nLFQ9ayk6aGsoZSk7Zm9yKDtudWxsIT09ZjspVD1mLGdrKGYsYixjKSxmPWYuc2libGluZztUPWU7SGo9aDtTPWx9aWsoYSxiLGMpfWVsc2UgMCE9PShlLnN1YnRyZWVGbGFncyY4NzcyKSYmbnVsbCE9PWY/KGYucmV0dXJuPWUsVD1mKTppayhhLGIsYyl9fVxuZnVuY3Rpb24gaWsoYSl7Zm9yKDtudWxsIT09VDspe3ZhciBiPVQ7aWYoMCE9PShiLmZsYWdzJjg3NzIpKXt2YXIgYz1iLmFsdGVybmF0ZTt0cnl7aWYoMCE9PShiLmZsYWdzJjg3NzIpKXN3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpTfHxPaig1LGIpO2JyZWFrO2Nhc2UgMTp2YXIgZD1iLnN0YXRlTm9kZTtpZihiLmZsYWdzJjQmJiFTKWlmKG51bGw9PT1jKWQuY29tcG9uZW50RGlkTW91bnQoKTtlbHNle3ZhciBlPWIuZWxlbWVudFR5cGU9PT1iLnR5cGU/Yy5tZW1vaXplZFByb3BzOmtnKGIudHlwZSxjLm1lbW9pemVkUHJvcHMpO2QuY29tcG9uZW50RGlkVXBkYXRlKGUsYy5tZW1vaXplZFN0YXRlLGQuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpfXZhciBmPWIudXBkYXRlUXVldWU7bnVsbCE9PWYmJkdnKGIsZixkKTticmVhaztjYXNlIDM6dmFyIGc9Yi51cGRhdGVRdWV1ZTtpZihudWxsIT09Zyl7Yz1udWxsO2lmKG51bGwhPT1iLmNoaWxkKXN3aXRjaChiLmNoaWxkLnRhZyl7Y2FzZSA1OmM9XG5iLmNoaWxkLnN0YXRlTm9kZTticmVhaztjYXNlIDE6Yz1iLmNoaWxkLnN0YXRlTm9kZX1HZyhiLGcsYyl9YnJlYWs7Y2FzZSA1OnZhciBoPWIuc3RhdGVOb2RlO2lmKG51bGw9PT1jJiZiLmZsYWdzJjQpe2M9aDt2YXIgaz1iLm1lbW9pemVkUHJvcHM7c3dpdGNoKGIudHlwZSl7Y2FzZSBcImJ1dHRvblwiOmNhc2UgXCJpbnB1dFwiOmNhc2UgXCJzZWxlY3RcIjpjYXNlIFwidGV4dGFyZWFcIjprLmF1dG9Gb2N1cyYmYy5mb2N1cygpO2JyZWFrO2Nhc2UgXCJpbWdcIjprLnNyYyYmKGMuc3JjPWsuc3JjKX19YnJlYWs7Y2FzZSA2OmJyZWFrO2Nhc2UgNDpicmVhaztjYXNlIDEyOmJyZWFrO2Nhc2UgMTM6aWYobnVsbD09PWIubWVtb2l6ZWRTdGF0ZSl7dmFyIGw9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWwpe3ZhciBuPWwubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09bil7dmFyIHU9bi5kZWh5ZHJhdGVkO251bGwhPT11JiZhZCh1KX19fWJyZWFrO2Nhc2UgMTk6Y2FzZSAxNzpjYXNlIDIxOmNhc2UgMjI6Y2FzZSAyMzpicmVhaztcbmRlZmF1bHQ6dGhyb3cgRXJyb3IocCgxNjMpKTt9U3x8Yi5mbGFncyY1MTImJlBqKGIpfWNhdGNoKHEpe1UoYixiLnJldHVybixxKX19aWYoYj09PWEpe1Q9bnVsbDticmVha31jPWIuc2libGluZztpZihudWxsIT09Yyl7Yy5yZXR1cm49Yi5yZXR1cm47VD1jO2JyZWFrfVQ9Yi5yZXR1cm59fWZ1bmN0aW9uIGVrKGEpe2Zvcig7bnVsbCE9PVQ7KXt2YXIgYj1UO2lmKGI9PT1hKXtUPW51bGw7YnJlYWt9dmFyIGM9Yi5zaWJsaW5nO2lmKG51bGwhPT1jKXtjLnJldHVybj1iLnJldHVybjtUPWM7YnJlYWt9VD1iLnJldHVybn19XG5mdW5jdGlvbiBoayhhKXtmb3IoO251bGwhPT1UOyl7dmFyIGI9VDt0cnl7c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnZhciBjPWIucmV0dXJuO3RyeXtPaig0LGIpfWNhdGNoKGspe1UoYixjLGspfWJyZWFrO2Nhc2UgMTp2YXIgZD1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5jb21wb25lbnREaWRNb3VudCl7dmFyIGU9Yi5yZXR1cm47dHJ5e2QuY29tcG9uZW50RGlkTW91bnQoKX1jYXRjaChrKXtVKGIsZSxrKX19dmFyIGY9Yi5yZXR1cm47dHJ5e1BqKGIpfWNhdGNoKGspe1UoYixmLGspfWJyZWFrO2Nhc2UgNTp2YXIgZz1iLnJldHVybjt0cnl7UGooYil9Y2F0Y2goayl7VShiLGcsayl9fX1jYXRjaChrKXtVKGIsYi5yZXR1cm4sayl9aWYoYj09PWEpe1Q9bnVsbDticmVha312YXIgaD1iLnNpYmxpbmc7aWYobnVsbCE9PWgpe2gucmV0dXJuPWIucmV0dXJuO1Q9aDticmVha31UPWIucmV0dXJufX1cbnZhciBqaz1NYXRoLmNlaWwsa2s9dGEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixsaz10YS5SZWFjdEN1cnJlbnRPd25lcixtaz10YS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxXPTAsUD1udWxsLFg9bnVsbCxZPTAsY2o9MCxtaj1UZigwKSxSPTAsbms9bnVsbCxGZz0wLG9rPTAscGs9MCxxaz1udWxsLHJrPW51bGwsZGs9MCxhaj1JbmZpbml0eSxzaz1udWxsLExpPSExLE1pPW51bGwsT2k9bnVsbCx0az0hMSx1az1udWxsLHZrPTAsd2s9MCx4az1udWxsLHlrPS0xLHprPTA7ZnVuY3Rpb24gSmcoKXtyZXR1cm4gMCE9PShXJjYpP0IoKTotMSE9PXlrP3lrOnlrPUIoKX1cbmZ1bmN0aW9uIEtnKGEpe2lmKDA9PT0oYS5tb2RlJjEpKXJldHVybiAxO2lmKDAhPT0oVyYyKSYmMCE9PVkpcmV0dXJuIFkmLVk7aWYobnVsbCE9PWpnLnRyYW5zaXRpb24pcmV0dXJuIDA9PT16ayYmKHprPXhjKCkpLHprO2E9QztpZigwIT09YSlyZXR1cm4gYTthPXdpbmRvdy5ldmVudDthPXZvaWQgMD09PWE/MTY6aWQoYS50eXBlKTtyZXR1cm4gYX1mdW5jdGlvbiBMZyhhLGIsYyl7aWYoNTA8d2spdGhyb3cgd2s9MCx4az1udWxsLEVycm9yKHAoMTg1KSk7dmFyIGQ9QWsoYSxiKTtpZihudWxsPT09ZClyZXR1cm4gbnVsbDt6YyhkLGIsYyk7aWYoMD09PShXJjIpfHxkIT09UClkPT09UCYmKDA9PT0oVyYyKSYmKG9rfD1iKSw0PT09UiYmQmsoZCxZKSksQ2soZCxjKSwxPT09YiYmMD09PVcmJjA9PT0oYS5tb2RlJjEpJiYoYWo9QigpKzUwMCxlZyYmaWcoKSk7cmV0dXJuIGR9XG5mdW5jdGlvbiBBayhhLGIpe2EubGFuZXN8PWI7dmFyIGM9YS5hbHRlcm5hdGU7bnVsbCE9PWMmJihjLmxhbmVzfD1iKTtjPWE7Zm9yKGE9YS5yZXR1cm47bnVsbCE9PWE7KWEuY2hpbGRMYW5lc3w9YixjPWEuYWx0ZXJuYXRlLG51bGwhPT1jJiYoYy5jaGlsZExhbmVzfD1iKSxjPWEsYT1hLnJldHVybjtyZXR1cm4gMz09PWMudGFnP2Muc3RhdGVOb2RlOm51bGx9ZnVuY3Rpb24gQmcoYSl7cmV0dXJuKG51bGwhPT1QfHxudWxsIT09dmcpJiYwIT09KGEubW9kZSYxKSYmMD09PShXJjIpfVxuZnVuY3Rpb24gQ2soYSxiKXt2YXIgYz1hLmNhbGxiYWNrTm9kZTt2YyhhLGIpO3ZhciBkPXRjKGEsYT09PVA/WTowKTtpZigwPT09ZCludWxsIT09YyYmYWMoYyksYS5jYWxsYmFja05vZGU9bnVsbCxhLmNhbGxiYWNrUHJpb3JpdHk9MDtlbHNlIGlmKGI9ZCYtZCxhLmNhbGxiYWNrUHJpb3JpdHkhPT1iKXtudWxsIT1jJiZhYyhjKTtpZigxPT09YikwPT09YS50YWc/aGcoRGsuYmluZChudWxsLGEpKTpnZyhEay5iaW5kKG51bGwsYSkpLElmKGZ1bmN0aW9uKCl7MD09PVcmJmlnKCl9KSxjPW51bGw7ZWxzZXtzd2l0Y2goQ2MoZCkpe2Nhc2UgMTpjPWVjO2JyZWFrO2Nhc2UgNDpjPWZjO2JyZWFrO2Nhc2UgMTY6Yz1nYzticmVhaztjYXNlIDUzNjg3MDkxMjpjPWljO2JyZWFrO2RlZmF1bHQ6Yz1nY31jPUVrKGMsRmsuYmluZChudWxsLGEpKX1hLmNhbGxiYWNrUHJpb3JpdHk9YjthLmNhbGxiYWNrTm9kZT1jfX1cbmZ1bmN0aW9uIEZrKGEsYil7eWs9LTE7ems9MDtpZigwIT09KFcmNikpdGhyb3cgRXJyb3IocCgzMjcpKTt2YXIgYz1hLmNhbGxiYWNrTm9kZTtpZihHaygpJiZhLmNhbGxiYWNrTm9kZSE9PWMpcmV0dXJuIG51bGw7dmFyIGQ9dGMoYSxhPT09UD9ZOjApO2lmKDA9PT1kKXJldHVybiBudWxsO2lmKDAhPT0oZCYzMCl8fDAhPT0oZCZhLmV4cGlyZWRMYW5lcyl8fGIpYj1IayhhLGQpO2Vsc2V7Yj1kO3ZhciBlPVc7V3w9Mjt2YXIgZj1JaygpO2lmKFAhPT1hfHxZIT09Yilzaz1udWxsLGFqPUIoKSs1MDAsSmsoYSxiKTtkbyB0cnl7S2soKTticmVha31jYXRjaChoKXtMayhhLGgpfXdoaWxlKDEpO3BnKCk7a2suY3VycmVudD1mO1c9ZTtudWxsIT09WD9iPTA6KFA9bnVsbCxZPTAsYj1SKX1pZigwIT09Yil7Mj09PWImJihlPXdjKGEpLDAhPT1lJiYoZD1lLGI9TWsoYSxlKSkpO2lmKDE9PT1iKXRocm93IGM9bmssSmsoYSwwKSxCayhhLGQpLENrKGEsQigpKSxjO2lmKDY9PT1iKUJrKGEsZCk7XG5lbHNle2U9YS5jdXJyZW50LmFsdGVybmF0ZTtpZigwPT09KGQmMzApJiYhTmsoZSkmJihiPUhrKGEsZCksMj09PWImJihmPXdjKGEpLDAhPT1mJiYoZD1mLGI9TWsoYSxmKSkpLDE9PT1iKSl0aHJvdyBjPW5rLEprKGEsMCksQmsoYSxkKSxDayhhLEIoKSksYzthLmZpbmlzaGVkV29yaz1lO2EuZmluaXNoZWRMYW5lcz1kO3N3aXRjaChiKXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKHAoMzQ1KSk7Y2FzZSAyOk9rKGEscmssc2spO2JyZWFrO2Nhc2UgMzpCayhhLGQpO2lmKChkJjEzMDAyMzQyNCk9PT1kJiYoYj1kays1MDAtQigpLDEwPGIpKXtpZigwIT09dGMoYSwwKSlicmVhaztlPWEuc3VzcGVuZGVkTGFuZXM7aWYoKGUmZCkhPT1kKXtKZygpO2EucGluZ2VkTGFuZXN8PWEuc3VzcGVuZGVkTGFuZXMmZTticmVha31hLnRpbWVvdXRIYW5kbGU9RWYoT2suYmluZChudWxsLGEscmssc2spLGIpO2JyZWFrfU9rKGEscmssc2spO2JyZWFrO2Nhc2UgNDpCayhhLGQpO2lmKChkJjQxOTQyNDApPT09XG5kKWJyZWFrO2I9YS5ldmVudFRpbWVzO2ZvcihlPS0xOzA8ZDspe3ZhciBnPTMxLW5jKGQpO2Y9MTw8ZztnPWJbZ107Zz5lJiYoZT1nKTtkJj1+Zn1kPWU7ZD1CKCktZDtkPSgxMjA+ZD8xMjA6NDgwPmQ/NDgwOjEwODA+ZD8xMDgwOjE5MjA+ZD8xOTIwOjNFMz5kPzNFMzo0MzIwPmQ/NDMyMDoxOTYwKmprKGQvMTk2MCkpLWQ7aWYoMTA8ZCl7YS50aW1lb3V0SGFuZGxlPUVmKE9rLmJpbmQobnVsbCxhLHJrLHNrKSxkKTticmVha31PayhhLHJrLHNrKTticmVhaztjYXNlIDU6T2soYSxyayxzayk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDMyOSkpO319fUNrKGEsQigpKTtyZXR1cm4gYS5jYWxsYmFja05vZGU9PT1jP0ZrLmJpbmQobnVsbCxhKTpudWxsfVxuZnVuY3Rpb24gTWsoYSxiKXt2YXIgYz1xazthLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQmJihKayhhLGIpLmZsYWdzfD0yNTYpO2E9SGsoYSxiKTsyIT09YSYmKGI9cmsscms9YyxudWxsIT09YiYmWmkoYikpO3JldHVybiBhfWZ1bmN0aW9uIFppKGEpe251bGw9PT1yaz9yaz1hOnJrLnB1c2guYXBwbHkocmssYSl9XG5mdW5jdGlvbiBOayhhKXtmb3IodmFyIGI9YTs7KXtpZihiLmZsYWdzJjE2Mzg0KXt2YXIgYz1iLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1jJiYoYz1jLnN0b3JlcyxudWxsIT09YykpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF0sZj1lLmdldFNuYXBzaG90O2U9ZS52YWx1ZTt0cnl7aWYoIUdlKGYoKSxlKSlyZXR1cm4hMX1jYXRjaChnKXtyZXR1cm4hMX19fWM9Yi5jaGlsZDtpZihiLnN1YnRyZWVGbGFncyYxNjM4NCYmbnVsbCE9PWMpYy5yZXR1cm49YixiPWM7ZWxzZXtpZihiPT09YSlicmVhaztmb3IoO251bGw9PT1iLnNpYmxpbmc7KXtpZihudWxsPT09Yi5yZXR1cm58fGIucmV0dXJuPT09YSlyZXR1cm4hMDtiPWIucmV0dXJufWIuc2libGluZy5yZXR1cm49Yi5yZXR1cm47Yj1iLnNpYmxpbmd9fXJldHVybiEwfVxuZnVuY3Rpb24gQmsoYSxiKXtiJj1+cGs7YiY9fm9rO2Euc3VzcGVuZGVkTGFuZXN8PWI7YS5waW5nZWRMYW5lcyY9fmI7Zm9yKGE9YS5leHBpcmF0aW9uVGltZXM7MDxiOyl7dmFyIGM9MzEtbmMoYiksZD0xPDxjO2FbY109LTE7YiY9fmR9fWZ1bmN0aW9uIERrKGEpe2lmKDAhPT0oVyY2KSl0aHJvdyBFcnJvcihwKDMyNykpO0drKCk7dmFyIGI9dGMoYSwwKTtpZigwPT09KGImMSkpcmV0dXJuIENrKGEsQigpKSxudWxsO3ZhciBjPUhrKGEsYik7aWYoMCE9PWEudGFnJiYyPT09Yyl7dmFyIGQ9d2MoYSk7MCE9PWQmJihiPWQsYz1NayhhLGQpKX1pZigxPT09Yyl0aHJvdyBjPW5rLEprKGEsMCksQmsoYSxiKSxDayhhLEIoKSksYztpZig2PT09Yyl0aHJvdyBFcnJvcihwKDM0NSkpO2EuZmluaXNoZWRXb3JrPWEuY3VycmVudC5hbHRlcm5hdGU7YS5maW5pc2hlZExhbmVzPWI7T2soYSxyayxzayk7Q2soYSxCKCkpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gUGsoYSxiKXt2YXIgYz1XO1d8PTE7dHJ5e3JldHVybiBhKGIpfWZpbmFsbHl7Vz1jLDA9PT1XJiYoYWo9QigpKzUwMCxlZyYmaWcoKSl9fWZ1bmN0aW9uIFFrKGEpe251bGwhPT11ayYmMD09PXVrLnRhZyYmMD09PShXJjYpJiZHaygpO3ZhciBiPVc7V3w9MTt2YXIgYz1tay50cmFuc2l0aW9uLGQ9Qzt0cnl7aWYobWsudHJhbnNpdGlvbj1udWxsLEM9MSxhKXJldHVybiBhKCl9ZmluYWxseXtDPWQsbWsudHJhbnNpdGlvbj1jLFc9YiwwPT09KFcmNikmJmlnKCl9fWZ1bmN0aW9uIGJqKCl7Y2o9bWouY3VycmVudDtFKG1qKX1cbmZ1bmN0aW9uIEprKGEsYil7YS5maW5pc2hlZFdvcms9bnVsbDthLmZpbmlzaGVkTGFuZXM9MDt2YXIgYz1hLnRpbWVvdXRIYW5kbGU7LTEhPT1jJiYoYS50aW1lb3V0SGFuZGxlPS0xLEZmKGMpKTtpZihudWxsIT09WClmb3IoYz1YLnJldHVybjtudWxsIT09Yzspe3ZhciBkPWM7Y2goZCk7c3dpdGNoKGQudGFnKXtjYXNlIDE6ZD1kLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7bnVsbCE9PWQmJnZvaWQgMCE9PWQmJlpmKCk7YnJlYWs7Y2FzZSAzOkdoKCk7RShWZik7RShIKTtMaCgpO2JyZWFrO2Nhc2UgNTpJaChkKTticmVhaztjYXNlIDQ6R2goKTticmVhaztjYXNlIDEzOkUoSyk7YnJlYWs7Y2FzZSAxOTpFKEspO2JyZWFrO2Nhc2UgMTA6cWcoZC50eXBlLl9jb250ZXh0KTticmVhaztjYXNlIDIyOmNhc2UgMjM6YmooKX1jPWMucmV0dXJufVA9YTtYPWE9dGgoYS5jdXJyZW50LG51bGwpO1k9Y2o9YjtSPTA7bms9bnVsbDtwaz1vaz1GZz0wO3JrPXFrPW51bGw7aWYobnVsbCE9PXZnKXtmb3IoYj1cbjA7Yjx2Zy5sZW5ndGg7YisrKWlmKGM9dmdbYl0sZD1jLmludGVybGVhdmVkLG51bGwhPT1kKXtjLmludGVybGVhdmVkPW51bGw7dmFyIGU9ZC5uZXh0LGY9Yy5wZW5kaW5nO2lmKG51bGwhPT1mKXt2YXIgZz1mLm5leHQ7Zi5uZXh0PWU7ZC5uZXh0PWd9Yy5wZW5kaW5nPWR9dmc9bnVsbH1yZXR1cm4gYX1cbmZ1bmN0aW9uIExrKGEsYil7ZG97dmFyIGM9WDt0cnl7cGcoKTtNaC5jdXJyZW50PVloO2lmKFBoKXtmb3IodmFyIGQ9TC5tZW1vaXplZFN0YXRlO251bGwhPT1kOyl7dmFyIGU9ZC5xdWV1ZTtudWxsIT09ZSYmKGUucGVuZGluZz1udWxsKTtkPWQubmV4dH1QaD0hMX1PaD0wO049TT1MPW51bGw7UWg9ITE7Umg9MDtsay5jdXJyZW50PW51bGw7aWYobnVsbD09PWN8fG51bGw9PT1jLnJldHVybil7Uj0xO25rPWI7WD1udWxsO2JyZWFrfWE6e3ZhciBmPWEsZz1jLnJldHVybixoPWMsaz1iO2I9WTtoLmZsYWdzfD0zMjc2ODtpZihudWxsIT09ayYmXCJvYmplY3RcIj09PXR5cGVvZiBrJiZcImZ1bmN0aW9uXCI9PT10eXBlb2Ygay50aGVuKXt2YXIgbD1rLG49aCx1PW4udGFnO2lmKDA9PT0obi5tb2RlJjEpJiYoMD09PXV8fDExPT09dXx8MTU9PT11KSl7dmFyIHE9bi5hbHRlcm5hdGU7cT8obi51cGRhdGVRdWV1ZT1xLnVwZGF0ZVF1ZXVlLG4ubWVtb2l6ZWRTdGF0ZT1xLm1lbW9pemVkU3RhdGUsXG5uLmxhbmVzPXEubGFuZXMpOihuLnVwZGF0ZVF1ZXVlPW51bGwsbi5tZW1vaXplZFN0YXRlPW51bGwpfXZhciB5PVJpKGcpO2lmKG51bGwhPT15KXt5LmZsYWdzJj0tMjU3O1NpKHksZyxoLGYsYik7eS5tb2RlJjEmJlBpKGYsbCxiKTtiPXk7az1sO3ZhciBtPWIudXBkYXRlUXVldWU7aWYobnVsbD09PW0pe3ZhciB3PW5ldyBTZXQ7dy5hZGQoayk7Yi51cGRhdGVRdWV1ZT13fWVsc2UgbS5hZGQoayk7YnJlYWsgYX1lbHNle2lmKDA9PT0oYiYxKSl7UGkoZixsLGIpOyRpKCk7YnJlYWsgYX1rPUVycm9yKHAoNDI2KSl9fWVsc2UgaWYoSSYmaC5tb2RlJjEpe3ZhciBKPVJpKGcpO2lmKG51bGwhPT1KKXswPT09KEouZmxhZ3MmNjU1MzYpJiYoSi5mbGFnc3w9MjU2KTtTaShKLGcsaCxmLGIpO29oKGspO2JyZWFrIGF9fWY9azs0IT09UiYmKFI9Mik7bnVsbD09PXFrP3FrPVtmXTpxay5wdXNoKGYpO2s9SGkoayxoKTtoPWc7ZG97c3dpdGNoKGgudGFnKXtjYXNlIDM6aC5mbGFnc3w9NjU1MzY7XG5iJj0tYjtoLmxhbmVzfD1iO3ZhciB2PUtpKGgsayxiKTtEZyhoLHYpO2JyZWFrIGE7Y2FzZSAxOmY9azt2YXIgeD1oLnR5cGUscj1oLnN0YXRlTm9kZTtpZigwPT09KGguZmxhZ3MmMTI4KSYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiB4LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8bnVsbCE9PXImJlwiZnVuY3Rpb25cIj09PXR5cGVvZiByLmNvbXBvbmVudERpZENhdGNoJiYobnVsbD09PU9pfHwhT2kuaGFzKHIpKSkpe2guZmxhZ3N8PTY1NTM2O2ImPS1iO2gubGFuZXN8PWI7dmFyIEY9TmkoaCxmLGIpO0RnKGgsRik7YnJlYWsgYX19aD1oLnJldHVybn13aGlsZShudWxsIT09aCl9UmsoYyl9Y2F0Y2goWil7Yj1aO1g9PT1jJiZudWxsIT09YyYmKFg9Yz1jLnJldHVybik7Y29udGludWV9YnJlYWt9d2hpbGUoMSl9ZnVuY3Rpb24gSWsoKXt2YXIgYT1ray5jdXJyZW50O2trLmN1cnJlbnQ9WWg7cmV0dXJuIG51bGw9PT1hP1loOmF9XG5mdW5jdGlvbiAkaSgpe2lmKDA9PT1SfHwzPT09Unx8Mj09PVIpUj00O251bGw9PT1QfHwwPT09KEZnJjI2ODQzNTQ1NSkmJjA9PT0ob2smMjY4NDM1NDU1KXx8QmsoUCxZKX1mdW5jdGlvbiBIayhhLGIpe3ZhciBjPVc7V3w9Mjt2YXIgZD1JaygpO2lmKFAhPT1hfHxZIT09Yilzaz1udWxsLEprKGEsYik7ZG8gdHJ5e1NrKCk7YnJlYWt9Y2F0Y2goZSl7TGsoYSxlKX13aGlsZSgxKTtwZygpO1c9Yztray5jdXJyZW50PWQ7aWYobnVsbCE9PVgpdGhyb3cgRXJyb3IocCgyNjEpKTtQPW51bGw7WT0wO3JldHVybiBSfWZ1bmN0aW9uIFNrKCl7Zm9yKDtudWxsIT09WDspVGsoWCl9ZnVuY3Rpb24gS2soKXtmb3IoO251bGwhPT1YJiYhYmMoKTspVGsoWCl9ZnVuY3Rpb24gVGsoYSl7dmFyIGI9VWsoYS5hbHRlcm5hdGUsYSxjaik7YS5tZW1vaXplZFByb3BzPWEucGVuZGluZ1Byb3BzO251bGw9PT1iP1JrKGEpOlg9Yjtsay5jdXJyZW50PW51bGx9XG5mdW5jdGlvbiBSayhhKXt2YXIgYj1hO2Rve3ZhciBjPWIuYWx0ZXJuYXRlO2E9Yi5yZXR1cm47aWYoMD09PShiLmZsYWdzJjMyNzY4KSl7aWYoYz1ZaShjLGIsY2opLG51bGwhPT1jKXtYPWM7cmV0dXJufX1lbHNle2M9R2ooYyxiKTtpZihudWxsIT09Yyl7Yy5mbGFncyY9MzI3Njc7WD1jO3JldHVybn1pZihudWxsIT09YSlhLmZsYWdzfD0zMjc2OCxhLnN1YnRyZWVGbGFncz0wLGEuZGVsZXRpb25zPW51bGw7ZWxzZXtSPTY7WD1udWxsO3JldHVybn19Yj1iLnNpYmxpbmc7aWYobnVsbCE9PWIpe1g9YjtyZXR1cm59WD1iPWF9d2hpbGUobnVsbCE9PWIpOzA9PT1SJiYoUj01KX1mdW5jdGlvbiBPayhhLGIsYyl7dmFyIGQ9QyxlPW1rLnRyYW5zaXRpb247dHJ5e21rLnRyYW5zaXRpb249bnVsbCxDPTEsVmsoYSxiLGMsZCl9ZmluYWxseXttay50cmFuc2l0aW9uPWUsQz1kfXJldHVybiBudWxsfVxuZnVuY3Rpb24gVmsoYSxiLGMsZCl7ZG8gR2soKTt3aGlsZShudWxsIT09dWspO2lmKDAhPT0oVyY2KSl0aHJvdyBFcnJvcihwKDMyNykpO2M9YS5maW5pc2hlZFdvcms7dmFyIGU9YS5maW5pc2hlZExhbmVzO2lmKG51bGw9PT1jKXJldHVybiBudWxsO2EuZmluaXNoZWRXb3JrPW51bGw7YS5maW5pc2hlZExhbmVzPTA7aWYoYz09PWEuY3VycmVudCl0aHJvdyBFcnJvcihwKDE3NykpO2EuY2FsbGJhY2tOb2RlPW51bGw7YS5jYWxsYmFja1ByaW9yaXR5PTA7dmFyIGY9Yy5sYW5lc3xjLmNoaWxkTGFuZXM7QWMoYSxmKTthPT09UCYmKFg9UD1udWxsLFk9MCk7MD09PShjLnN1YnRyZWVGbGFncyYyMDY0KSYmMD09PShjLmZsYWdzJjIwNjQpfHx0a3x8KHRrPSEwLEVrKGdjLGZ1bmN0aW9uKCl7R2soKTtyZXR1cm4gbnVsbH0pKTtmPTAhPT0oYy5mbGFncyYxNTk5MCk7aWYoMCE9PShjLnN1YnRyZWVGbGFncyYxNTk5MCl8fGYpe2Y9bWsudHJhbnNpdGlvbjttay50cmFuc2l0aW9uPW51bGw7XG52YXIgZz1DO0M9MTt2YXIgaD1XO1d8PTQ7bGsuY3VycmVudD1udWxsO01qKGEsYyk7YmsoYyxhKTtOZShDZik7Y2Q9ISFCZjtDZj1CZj1udWxsO2EuY3VycmVudD1jO2ZrKGMsYSxlKTtjYygpO1c9aDtDPWc7bWsudHJhbnNpdGlvbj1mfWVsc2UgYS5jdXJyZW50PWM7dGsmJih0az0hMSx1az1hLHZrPWUpO2Y9YS5wZW5kaW5nTGFuZXM7MD09PWYmJihPaT1udWxsKTtsYyhjLnN0YXRlTm9kZSxkKTtDayhhLEIoKSk7aWYobnVsbCE9PWIpZm9yKGQ9YS5vblJlY292ZXJhYmxlRXJyb3IsYz0wO2M8Yi5sZW5ndGg7YysrKWQoYltjXSk7aWYoTGkpdGhyb3cgTGk9ITEsYT1NaSxNaT1udWxsLGE7MCE9PSh2ayYxKSYmMCE9PWEudGFnJiZHaygpO2Y9YS5wZW5kaW5nTGFuZXM7MCE9PShmJjEpP2E9PT14az93aysrOih3az0wLHhrPWEpOndrPTA7aWcoKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIEdrKCl7aWYobnVsbCE9PXVrKXt2YXIgYT1DYyh2ayksYj1tay50cmFuc2l0aW9uLGM9Qzt0cnl7bWsudHJhbnNpdGlvbj1udWxsO0M9MTY+YT8xNjphO2lmKG51bGw9PT11ayl2YXIgZD0hMTtlbHNle2E9dWs7dWs9bnVsbDt2az0wO2lmKDAhPT0oVyY2KSl0aHJvdyBFcnJvcihwKDMzMSkpO3ZhciBlPVc7V3w9NDtmb3IoVD1hLmN1cnJlbnQ7bnVsbCE9PVQ7KXt2YXIgZj1ULGc9Zi5jaGlsZDtpZigwIT09KFQuZmxhZ3MmMTYpKXt2YXIgaD1mLmRlbGV0aW9ucztpZihudWxsIT09aCl7Zm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba107Zm9yKFQ9bDtudWxsIT09VDspe3ZhciBuPVQ7c3dpdGNoKG4udGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1Ok5qKDgsbixmKX12YXIgdT1uLmNoaWxkO2lmKG51bGwhPT11KXUucmV0dXJuPW4sVD11O2Vsc2UgZm9yKDtudWxsIT09VDspe249VDt2YXIgcT1uLnNpYmxpbmcseT1uLnJldHVybjtRaihuKTtpZihuPT09XG5sKXtUPW51bGw7YnJlYWt9aWYobnVsbCE9PXEpe3EucmV0dXJuPXk7VD1xO2JyZWFrfVQ9eX19fXZhciBtPWYuYWx0ZXJuYXRlO2lmKG51bGwhPT1tKXt2YXIgdz1tLmNoaWxkO2lmKG51bGwhPT13KXttLmNoaWxkPW51bGw7ZG97dmFyIEo9dy5zaWJsaW5nO3cuc2libGluZz1udWxsO3c9Sn13aGlsZShudWxsIT09dyl9fVQ9Zn19aWYoMCE9PShmLnN1YnRyZWVGbGFncyYyMDY0KSYmbnVsbCE9PWcpZy5yZXR1cm49ZixUPWc7ZWxzZSBiOmZvcig7bnVsbCE9PVQ7KXtmPVQ7aWYoMCE9PShmLmZsYWdzJjIwNDgpKXN3aXRjaChmLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpOaig5LGYsZi5yZXR1cm4pfXZhciB2PWYuc2libGluZztpZihudWxsIT09dil7di5yZXR1cm49Zi5yZXR1cm47VD12O2JyZWFrIGJ9VD1mLnJldHVybn19dmFyIHg9YS5jdXJyZW50O2ZvcihUPXg7bnVsbCE9PVQ7KXtnPVQ7dmFyIHI9Zy5jaGlsZDtpZigwIT09KGcuc3VidHJlZUZsYWdzJjIwNjQpJiZudWxsIT09XG5yKXIucmV0dXJuPWcsVD1yO2Vsc2UgYjpmb3IoZz14O251bGwhPT1UOyl7aD1UO2lmKDAhPT0oaC5mbGFncyYyMDQ4KSl0cnl7c3dpdGNoKGgudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1Ok9qKDksaCl9fWNhdGNoKFope1UoaCxoLnJldHVybixaKX1pZihoPT09Zyl7VD1udWxsO2JyZWFrIGJ9dmFyIEY9aC5zaWJsaW5nO2lmKG51bGwhPT1GKXtGLnJldHVybj1oLnJldHVybjtUPUY7YnJlYWsgYn1UPWgucmV0dXJufX1XPWU7aWcoKTtpZihrYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGtjLm9uUG9zdENvbW1pdEZpYmVyUm9vdCl0cnl7a2Mub25Qb3N0Q29tbWl0RmliZXJSb290KGpjLGEpfWNhdGNoKFope31kPSEwfXJldHVybiBkfWZpbmFsbHl7Qz1jLG1rLnRyYW5zaXRpb249Yn19cmV0dXJuITF9ZnVuY3Rpb24gV2soYSxiLGMpe2I9SGkoYyxiKTtiPUtpKGEsYiwxKTtBZyhhLGIpO2I9SmcoKTthPUFrKGEsMSk7bnVsbCE9PWEmJih6YyhhLDEsYiksQ2soYSxiKSl9XG5mdW5jdGlvbiBVKGEsYixjKXtpZigzPT09YS50YWcpV2soYSxhLGMpO2Vsc2UgZm9yKDtudWxsIT09Yjspe2lmKDM9PT1iLnRhZyl7V2soYixhLGMpO2JyZWFrfWVsc2UgaWYoMT09PWIudGFnKXt2YXIgZD1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09T2l8fCFPaS5oYXMoZCkpKXthPUhpKGMsYSk7YT1OaShiLGEsMSk7QWcoYixhKTthPUpnKCk7Yj1BayhiLDEpO251bGwhPT1iJiYoemMoYiwxLGEpLENrKGIsYSkpO2JyZWFrfX1iPWIucmV0dXJufX1cbmZ1bmN0aW9uIFFpKGEsYixjKXt2YXIgZD1hLnBpbmdDYWNoZTtudWxsIT09ZCYmZC5kZWxldGUoYik7Yj1KZygpO2EucGluZ2VkTGFuZXN8PWEuc3VzcGVuZGVkTGFuZXMmYztQPT09YSYmKFkmYyk9PT1jJiYoND09PVJ8fDM9PT1SJiYoWSYxMzAwMjM0MjQpPT09WSYmNTAwPkIoKS1kaz9KayhhLDApOnBrfD1jKTtDayhhLGIpfWZ1bmN0aW9uIFhrKGEsYil7MD09PWImJigwPT09KGEubW9kZSYxKT9iPTE6KGI9cmMscmM8PD0xLDA9PT0ocmMmMTMwMDIzNDI0KSYmKHJjPTQxOTQzMDQpKSk7dmFyIGM9SmcoKTthPUFrKGEsYik7bnVsbCE9PWEmJih6YyhhLGIsYyksQ2soYSxjKSl9ZnVuY3Rpb24gemooYSl7dmFyIGI9YS5tZW1vaXplZFN0YXRlLGM9MDtudWxsIT09YiYmKGM9Yi5yZXRyeUxhbmUpO1hrKGEsYyl9XG5mdW5jdGlvbiBaaihhLGIpe3ZhciBjPTA7c3dpdGNoKGEudGFnKXtjYXNlIDEzOnZhciBkPWEuc3RhdGVOb2RlO3ZhciBlPWEubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZSYmKGM9ZS5yZXRyeUxhbmUpO2JyZWFrO2Nhc2UgMTk6ZD1hLnN0YXRlTm9kZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHAoMzE0KSk7fW51bGwhPT1kJiZkLmRlbGV0ZShiKTtYayhhLGMpfXZhciBVaztcblVrPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSlpZihhLm1lbW9pemVkUHJvcHMhPT1iLnBlbmRpbmdQcm9wc3x8VmYuY3VycmVudCl0Zz0hMDtlbHNle2lmKDA9PT0oYS5sYW5lcyZjKSYmMD09PShiLmZsYWdzJjEyOCkpcmV0dXJuIHRnPSExLEZqKGEsYixjKTt0Zz0wIT09KGEuZmxhZ3MmMTMxMDcyKT8hMDohMX1lbHNlIHRnPSExLEkmJjAhPT0oYi5mbGFncyYxMDQ4NTc2KSYmYWgoYixVZyxiLmluZGV4KTtiLmxhbmVzPTA7c3dpdGNoKGIudGFnKXtjYXNlIDI6dmFyIGQ9Yi50eXBlO251bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpO2E9Yi5wZW5kaW5nUHJvcHM7dmFyIGU9WGYoYixILmN1cnJlbnQpO3NnKGIsYyk7ZT1VaChudWxsLGIsZCxhLGUsYyk7dmFyIGY9WmgoKTtiLmZsYWdzfD0xO1wib2JqZWN0XCI9PT10eXBlb2YgZSYmbnVsbCE9PWUmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLnJlbmRlciYmdm9pZCAwPT09ZS4kJHR5cGVvZj9cbihiLnRhZz0xLGIubWVtb2l6ZWRTdGF0ZT1udWxsLGIudXBkYXRlUXVldWU9bnVsbCxZZihkKT8oZj0hMCxiZyhiKSk6Zj0hMSxiLm1lbW9pemVkU3RhdGU9bnVsbCE9PWUuc3RhdGUmJnZvaWQgMCE9PWUuc3RhdGU/ZS5zdGF0ZTpudWxsLHhnKGIpLGUudXBkYXRlcj1NZyxiLnN0YXRlTm9kZT1lLGUuX3JlYWN0SW50ZXJuYWxzPWIsUWcoYixkLGEsYyksYj1waihudWxsLGIsZCwhMCxmLGMpKTooYi50YWc9MCxJJiZmJiZiaChiKSxlaihudWxsLGIsZSxjKSxiPWIuY2hpbGQpO3JldHVybiBiO2Nhc2UgMTY6ZD1iLmVsZW1lbnRUeXBlO2E6e251bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpO2E9Yi5wZW5kaW5nUHJvcHM7ZT1kLl9pbml0O2Q9ZShkLl9wYXlsb2FkKTtiLnR5cGU9ZDtlPWIudGFnPVlrKGQpO2E9a2coZCxhKTtzd2l0Y2goZSl7Y2FzZSAwOmI9a2oobnVsbCxiLGQsYSxjKTticmVhayBhO2Nhc2UgMTpiPW9qKG51bGwsYixcbmQsYSxjKTticmVhayBhO2Nhc2UgMTE6Yj1maihudWxsLGIsZCxhLGMpO2JyZWFrIGE7Y2FzZSAxNDpiPWhqKG51bGwsYixkLGtnKGQudHlwZSxhKSxjKTticmVhayBhfXRocm93IEVycm9yKHAoMzA2LGQsXCJcIikpO31yZXR1cm4gYjtjYXNlIDA6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmtnKGQsZSksa2ooYSxiLGQsZSxjKTtjYXNlIDE6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmtnKGQsZSksb2ooYSxiLGQsZSxjKTtjYXNlIDM6YTp7cWooYik7aWYobnVsbD09PWEpdGhyb3cgRXJyb3IocCgzODcpKTtkPWIucGVuZGluZ1Byb3BzO2Y9Yi5tZW1vaXplZFN0YXRlO2U9Zi5lbGVtZW50O3lnKGEsYik7RWcoYixkLG51bGwsYyk7dmFyIGc9Yi5tZW1vaXplZFN0YXRlO2Q9Zy5lbGVtZW50O2lmKGYuaXNEZWh5ZHJhdGVkKWlmKGY9e2VsZW1lbnQ6ZCxpc0RlaHlkcmF0ZWQ6ITEsXG5jYWNoZTpnLmNhY2hlLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6Zy5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLHRyYW5zaXRpb25zOmcudHJhbnNpdGlvbnN9LGIudXBkYXRlUXVldWUuYmFzZVN0YXRlPWYsYi5tZW1vaXplZFN0YXRlPWYsYi5mbGFncyYyNTYpe2U9RXJyb3IocCg0MjMpKTtiPXJqKGEsYixkLGMsZSk7YnJlYWsgYX1lbHNlIGlmKGQhPT1lKXtlPUVycm9yKHAoNDI0KSk7Yj1yaihhLGIsZCxjLGUpO2JyZWFrIGF9ZWxzZSBmb3IoZWg9S2YoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxkaD1iLEk9ITAsZmg9bnVsbCxjPXpoKGIsbnVsbCxkLGMpLGIuY2hpbGQ9YztjOyljLmZsYWdzPWMuZmxhZ3MmLTN8NDA5NixjPWMuc2libGluZztlbHNle25oKCk7aWYoZD09PWUpe2I9Z2ooYSxiLGMpO2JyZWFrIGF9ZWooYSxiLGQsYyl9Yj1iLmNoaWxkfXJldHVybiBiO2Nhc2UgNTpyZXR1cm4gSGgoYiksbnVsbD09PWEmJmtoKGIpLGQ9Yi50eXBlLGU9XG5iLnBlbmRpbmdQcm9wcyxmPW51bGwhPT1hP2EubWVtb2l6ZWRQcm9wczpudWxsLGc9ZS5jaGlsZHJlbixEZihkLGUpP2c9bnVsbDpudWxsIT09ZiYmRGYoZCxmKSYmKGIuZmxhZ3N8PTMyKSxuaihhLGIpLGVqKGEsYixnLGMpLGIuY2hpbGQ7Y2FzZSA2OnJldHVybiBudWxsPT09YSYma2goYiksbnVsbDtjYXNlIDEzOnJldHVybiB2aihhLGIsYyk7Y2FzZSA0OnJldHVybiBGaChiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLGQ9Yi5wZW5kaW5nUHJvcHMsbnVsbD09PWE/Yi5jaGlsZD15aChiLG51bGwsZCxjKTplaihhLGIsZCxjKSxiLmNoaWxkO2Nhc2UgMTE6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmtnKGQsZSksZmooYSxiLGQsZSxjKTtjYXNlIDc6cmV0dXJuIGVqKGEsYixiLnBlbmRpbmdQcm9wcyxjKSxiLmNoaWxkO2Nhc2UgODpyZXR1cm4gZWooYSxiLGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGMpLGIuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gZWooYSxcbmIsYi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sYyksYi5jaGlsZDtjYXNlIDEwOmE6e2Q9Yi50eXBlLl9jb250ZXh0O2U9Yi5wZW5kaW5nUHJvcHM7Zj1iLm1lbW9pemVkUHJvcHM7Zz1lLnZhbHVlO0cobGcsZC5fY3VycmVudFZhbHVlKTtkLl9jdXJyZW50VmFsdWU9ZztpZihudWxsIT09ZilpZihHZShmLnZhbHVlLGcpKXtpZihmLmNoaWxkcmVuPT09ZS5jaGlsZHJlbiYmIVZmLmN1cnJlbnQpe2I9Z2ooYSxiLGMpO2JyZWFrIGF9fWVsc2UgZm9yKGY9Yi5jaGlsZCxudWxsIT09ZiYmKGYucmV0dXJuPWIpO251bGwhPT1mOyl7dmFyIGg9Zi5kZXBlbmRlbmNpZXM7aWYobnVsbCE9PWgpe2c9Zi5jaGlsZDtmb3IodmFyIGs9aC5maXJzdENvbnRleHQ7bnVsbCE9PWs7KXtpZihrLmNvbnRleHQ9PT1kKXtpZigxPT09Zi50YWcpe2s9emcoLTEsYyYtYyk7ay50YWc9Mjt2YXIgbD1mLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1sKXtsPWwuc2hhcmVkO3ZhciBuPWwucGVuZGluZztudWxsPT09bj9rLm5leHQ9XG5rOihrLm5leHQ9bi5uZXh0LG4ubmV4dD1rKTtsLnBlbmRpbmc9a319Zi5sYW5lc3w9YztrPWYuYWx0ZXJuYXRlO251bGwhPT1rJiYoay5sYW5lc3w9Yyk7cmcoZi5yZXR1cm4sYyxiKTtoLmxhbmVzfD1jO2JyZWFrfWs9ay5uZXh0fX1lbHNlIGlmKDEwPT09Zi50YWcpZz1mLnR5cGU9PT1iLnR5cGU/bnVsbDpmLmNoaWxkO2Vsc2UgaWYoMTg9PT1mLnRhZyl7Zz1mLnJldHVybjtpZihudWxsPT09Zyl0aHJvdyBFcnJvcihwKDM0MSkpO2cubGFuZXN8PWM7aD1nLmFsdGVybmF0ZTtudWxsIT09aCYmKGgubGFuZXN8PWMpO3JnKGcsYyxiKTtnPWYuc2libGluZ31lbHNlIGc9Zi5jaGlsZDtpZihudWxsIT09ZylnLnJldHVybj1mO2Vsc2UgZm9yKGc9ZjtudWxsIT09Zzspe2lmKGc9PT1iKXtnPW51bGw7YnJlYWt9Zj1nLnNpYmxpbmc7aWYobnVsbCE9PWYpe2YucmV0dXJuPWcucmV0dXJuO2c9ZjticmVha31nPWcucmV0dXJufWY9Z31laihhLGIsZS5jaGlsZHJlbixjKTtiPWIuY2hpbGR9cmV0dXJuIGI7XG5jYXNlIDk6cmV0dXJuIGU9Yi50eXBlLGQ9Yi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sc2coYixjKSxlPXVnKGUpLGQ9ZChlKSxiLmZsYWdzfD0xLGVqKGEsYixkLGMpLGIuY2hpbGQ7Y2FzZSAxNDpyZXR1cm4gZD1iLnR5cGUsZT1rZyhkLGIucGVuZGluZ1Byb3BzKSxlPWtnKGQudHlwZSxlKSxoaihhLGIsZCxlLGMpO2Nhc2UgMTU6cmV0dXJuIGpqKGEsYixiLnR5cGUsYi5wZW5kaW5nUHJvcHMsYyk7Y2FzZSAxNzpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6a2coZCxlKSxudWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmZsYWdzfD0yKSxiLnRhZz0xLFlmKGQpPyhhPSEwLGJnKGIpKTphPSExLHNnKGIsYyksT2coYixkLGUpLFFnKGIsZCxlLGMpLHBqKG51bGwsYixkLCEwLGEsYyk7Y2FzZSAxOTpyZXR1cm4gRWooYSxiLGMpO2Nhc2UgMjI6cmV0dXJuIGxqKGEsYixjKX10aHJvdyBFcnJvcihwKDE1NixcbmIudGFnKSk7fTtmdW5jdGlvbiBFayhhLGIpe3JldHVybiAkYihhLGIpfWZ1bmN0aW9uIFprKGEsYixjLGQpe3RoaXMudGFnPWE7dGhpcy5rZXk9Yzt0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsO3RoaXMuaW5kZXg9MDt0aGlzLnJlZj1udWxsO3RoaXMucGVuZGluZ1Byb3BzPWI7dGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGw7dGhpcy5tb2RlPWQ7dGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wO3RoaXMuZGVsZXRpb25zPW51bGw7dGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MDt0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIGhoKGEsYixjLGQpe3JldHVybiBuZXcgWmsoYSxiLGMsZCl9XG5mdW5jdGlvbiBpaihhKXthPWEucHJvdG90eXBlO3JldHVybiEoIWF8fCFhLmlzUmVhY3RDb21wb25lbnQpfWZ1bmN0aW9uIFlrKGEpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKXJldHVybiBpaihhKT8xOjA7aWYodm9pZCAwIT09YSYmbnVsbCE9PWEpe2E9YS4kJHR5cGVvZjtpZihhPT09Q2EpcmV0dXJuIDExO2lmKGE9PT1GYSlyZXR1cm4gMTR9cmV0dXJuIDJ9XG5mdW5jdGlvbiB0aChhLGIpe3ZhciBjPWEuYWx0ZXJuYXRlO251bGw9PT1jPyhjPWhoKGEudGFnLGIsYS5rZXksYS5tb2RlKSxjLmVsZW1lbnRUeXBlPWEuZWxlbWVudFR5cGUsYy50eXBlPWEudHlwZSxjLnN0YXRlTm9kZT1hLnN0YXRlTm9kZSxjLmFsdGVybmF0ZT1hLGEuYWx0ZXJuYXRlPWMpOihjLnBlbmRpbmdQcm9wcz1iLGMudHlwZT1hLnR5cGUsYy5mbGFncz0wLGMuc3VidHJlZUZsYWdzPTAsYy5kZWxldGlvbnM9bnVsbCk7Yy5mbGFncz1hLmZsYWdzJjE0NjgwMDY0O2MuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXM7Yy5sYW5lcz1hLmxhbmVzO2MuY2hpbGQ9YS5jaGlsZDtjLm1lbW9pemVkUHJvcHM9YS5tZW1vaXplZFByb3BzO2MubWVtb2l6ZWRTdGF0ZT1hLm1lbW9pemVkU3RhdGU7Yy51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlO2I9YS5kZXBlbmRlbmNpZXM7Yy5kZXBlbmRlbmNpZXM9bnVsbD09PWI/bnVsbDp7bGFuZXM6Yi5sYW5lcyxmaXJzdENvbnRleHQ6Yi5maXJzdENvbnRleHR9O1xuYy5zaWJsaW5nPWEuc2libGluZztjLmluZGV4PWEuaW5kZXg7Yy5yZWY9YS5yZWY7cmV0dXJuIGN9XG5mdW5jdGlvbiB2aChhLGIsYyxkLGUsZil7dmFyIGc9MjtkPWE7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpaWooYSkmJihnPTEpO2Vsc2UgaWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKWc9NTtlbHNlIGE6c3dpdGNoKGEpe2Nhc2Ugd2E6cmV0dXJuIHhoKGMuY2hpbGRyZW4sZSxmLGIpO2Nhc2UgeGE6Zz04O2V8PTg7YnJlYWs7Y2FzZSB6YTpyZXR1cm4gYT1oaCgxMixjLGIsZXwyKSxhLmVsZW1lbnRUeXBlPXphLGEubGFuZXM9ZixhO2Nhc2UgRGE6cmV0dXJuIGE9aGgoMTMsYyxiLGUpLGEuZWxlbWVudFR5cGU9RGEsYS5sYW5lcz1mLGE7Y2FzZSBFYTpyZXR1cm4gYT1oaCgxOSxjLGIsZSksYS5lbGVtZW50VHlwZT1FYSxhLmxhbmVzPWYsYTtjYXNlIEhhOnJldHVybiB3aihjLGUsZixiKTtkZWZhdWx0OmlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpc3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgQWE6Zz0xMDticmVhayBhO2Nhc2UgQmE6Zz05O2JyZWFrIGE7Y2FzZSBDYTpnPTExO1xuYnJlYWsgYTtjYXNlIEZhOmc9MTQ7YnJlYWsgYTtjYXNlIEdhOmc9MTY7ZD1udWxsO2JyZWFrIGF9dGhyb3cgRXJyb3IocCgxMzAsbnVsbD09YT9hOnR5cGVvZiBhLFwiXCIpKTt9Yj1oaChnLGMsYixlKTtiLmVsZW1lbnRUeXBlPWE7Yi50eXBlPWQ7Yi5sYW5lcz1mO3JldHVybiBifWZ1bmN0aW9uIHhoKGEsYixjLGQpe2E9aGgoNyxhLGQsYik7YS5sYW5lcz1jO3JldHVybiBhfWZ1bmN0aW9uIHdqKGEsYixjLGQpe2E9aGgoMjIsYSxkLGIpO2EuZWxlbWVudFR5cGU9SGE7YS5sYW5lcz1jO2Euc3RhdGVOb2RlPXt9O3JldHVybiBhfWZ1bmN0aW9uIHVoKGEsYixjKXthPWhoKDYsYSxudWxsLGIpO2EubGFuZXM9YztyZXR1cm4gYX1cbmZ1bmN0aW9uIHdoKGEsYixjKXtiPWhoKDQsbnVsbCE9PWEuY2hpbGRyZW4/YS5jaGlsZHJlbjpbXSxhLmtleSxiKTtiLmxhbmVzPWM7Yi5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86YS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmEuaW1wbGVtZW50YXRpb259O3JldHVybiBifVxuZnVuY3Rpb24gJGsoYSxiLGMsZCxlKXt0aGlzLnRhZz1iO3RoaXMuY29udGFpbmVySW5mbz1hO3RoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsO3RoaXMudGltZW91dEhhbmRsZT0tMTt0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsO3RoaXMuY2FsbGJhY2tQcmlvcml0eT0wO3RoaXMuZXZlbnRUaW1lcz15YygwKTt0aGlzLmV4cGlyYXRpb25UaW1lcz15YygtMSk7dGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wO3RoaXMuZW50YW5nbGVtZW50cz15YygwKTt0aGlzLmlkZW50aWZpZXJQcmVmaXg9ZDt0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj1lO3RoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1cbm51bGx9ZnVuY3Rpb24gYWwoYSxiLGMsZCxlLGYsZyxoLGspe2E9bmV3ICRrKGEsYixjLGgsayk7MT09PWI/KGI9MSwhMD09PWYmJihifD04KSk6Yj0wO2Y9aGgoMyxudWxsLG51bGwsYik7YS5jdXJyZW50PWY7Zi5zdGF0ZU5vZGU9YTtmLm1lbW9pemVkU3RhdGU9e2VsZW1lbnQ6ZCxpc0RlaHlkcmF0ZWQ6YyxjYWNoZTpudWxsLHRyYW5zaXRpb25zOm51bGwscGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczpudWxsfTt4ZyhmKTtyZXR1cm4gYX1mdW5jdGlvbiBibChhLGIsYyl7dmFyIGQ9Mzxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOnZhLGtleTpudWxsPT1kP251bGw6XCJcIitkLGNoaWxkcmVuOmEsY29udGFpbmVySW5mbzpiLGltcGxlbWVudGF0aW9uOmN9fVxuZnVuY3Rpb24gY2woYSl7aWYoIWEpcmV0dXJuIFVmO2E9YS5fcmVhY3RJbnRlcm5hbHM7YTp7aWYoVWIoYSkhPT1hfHwxIT09YS50YWcpdGhyb3cgRXJyb3IocCgxNzApKTt2YXIgYj1hO2Rve3N3aXRjaChiLnRhZyl7Y2FzZSAzOmI9Yi5zdGF0ZU5vZGUuY29udGV4dDticmVhayBhO2Nhc2UgMTppZihZZihiLnR5cGUpKXtiPWIuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O2JyZWFrIGF9fWI9Yi5yZXR1cm59d2hpbGUobnVsbCE9PWIpO3Rocm93IEVycm9yKHAoMTcxKSk7fWlmKDE9PT1hLnRhZyl7dmFyIGM9YS50eXBlO2lmKFlmKGMpKXJldHVybiBhZyhhLGMsYil9cmV0dXJuIGJ9XG5mdW5jdGlvbiBkbChhLGIsYyxkLGUsZixnLGgsayl7YT1hbChjLGQsITAsYSxlLGYsZyxoLGspO2EuY29udGV4dD1jbChudWxsKTtjPWEuY3VycmVudDtkPUpnKCk7ZT1LZyhjKTtmPXpnKGQsZSk7Zi5jYWxsYmFjaz12b2lkIDAhPT1iJiZudWxsIT09Yj9iOm51bGw7QWcoYyxmKTthLmN1cnJlbnQubGFuZXM9ZTt6YyhhLGUsZCk7Q2soYSxkKTtyZXR1cm4gYX1mdW5jdGlvbiBlbChhLGIsYyxkKXt2YXIgZT1iLmN1cnJlbnQsZj1KZygpLGc9S2coZSk7Yz1jbChjKTtudWxsPT09Yi5jb250ZXh0P2IuY29udGV4dD1jOmIucGVuZGluZ0NvbnRleHQ9YztiPXpnKGYsZyk7Yi5wYXlsb2FkPXtlbGVtZW50OmF9O2Q9dm9pZCAwPT09ZD9udWxsOmQ7bnVsbCE9PWQmJihiLmNhbGxiYWNrPWQpO0FnKGUsYik7YT1MZyhlLGcsZik7bnVsbCE9PWEmJkNnKGEsZSxnKTtyZXR1cm4gZ31cbmZ1bmN0aW9uIGZsKGEpe2E9YS5jdXJyZW50O2lmKCFhLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChhLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gZ2woYSxiKXthPWEubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YSYmbnVsbCE9PWEuZGVoeWRyYXRlZCl7dmFyIGM9YS5yZXRyeUxhbmU7YS5yZXRyeUxhbmU9MCE9PWMmJmM8Yj9jOmJ9fWZ1bmN0aW9uIGhsKGEsYil7Z2woYSxiKTsoYT1hLmFsdGVybmF0ZSkmJmdsKGEsYil9ZnVuY3Rpb24gaWwoKXtyZXR1cm4gbnVsbH12YXIgamw9XCJmdW5jdGlvblwiPT09dHlwZW9mIHJlcG9ydEVycm9yP3JlcG9ydEVycm9yOmZ1bmN0aW9uKGEpe2NvbnNvbGUuZXJyb3IoYSl9O2Z1bmN0aW9uIGtsKGEpe3RoaXMuX2ludGVybmFsUm9vdD1hfVxubGwucHJvdG90eXBlLnJlbmRlcj1rbC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2ludGVybmFsUm9vdDtpZihudWxsPT09Yil0aHJvdyBFcnJvcihwKDQwOSkpO2VsKGEsYixudWxsLG51bGwpfTtsbC5wcm90b3R5cGUudW5tb3VudD1rbC5wcm90b3R5cGUudW5tb3VudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuX2ludGVybmFsUm9vdDtpZihudWxsIT09YSl7dGhpcy5faW50ZXJuYWxSb290PW51bGw7dmFyIGI9YS5jb250YWluZXJJbmZvO1FrKGZ1bmN0aW9uKCl7ZWwobnVsbCxhLG51bGwsbnVsbCl9KTtiW3RmXT1udWxsfX07ZnVuY3Rpb24gbGwoYSl7dGhpcy5faW50ZXJuYWxSb290PWF9XG5sbC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb249ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9R2MoKTthPXtibG9ja2VkT246bnVsbCx0YXJnZXQ6YSxwcmlvcml0eTpifTtmb3IodmFyIGM9MDtjPFBjLmxlbmd0aCYmMCE9PWImJmI8UGNbY10ucHJpb3JpdHk7YysrKTtQYy5zcGxpY2UoYywwLGEpOzA9PT1jJiZVYyhhKX19O2Z1bmN0aW9uIG1sKGEpe3JldHVybiEoIWF8fDEhPT1hLm5vZGVUeXBlJiY5IT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlKX1mdW5jdGlvbiBubChhKXtyZXR1cm4hKCFhfHwxIT09YS5ub2RlVHlwZSYmOSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZSYmKDghPT1hLm5vZGVUeXBlfHxcIiByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSBcIiE9PWEubm9kZVZhbHVlKSl9ZnVuY3Rpb24gb2woKXt9XG5mdW5jdGlvbiBwbChhLGIsYyxkLGUpe2lmKGUpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2YXIgZj1kO2Q9ZnVuY3Rpb24oKXt2YXIgYT1mbChnKTtmLmNhbGwoYSl9fXZhciBnPWRsKGIsZCxhLDAsbnVsbCwhMSwhMSxcIlwiLG9sKTthLl9yZWFjdFJvb3RDb250YWluZXI9ZzthW3RmXT1nLmN1cnJlbnQ7cmYoOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmEpO1FrKCk7cmV0dXJuIGd9Zm9yKDtlPWEubGFzdENoaWxkOylhLnJlbW92ZUNoaWxkKGUpO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2YXIgaD1kO2Q9ZnVuY3Rpb24oKXt2YXIgYT1mbChrKTtoLmNhbGwoYSl9fXZhciBrPWFsKGEsMCwhMSxudWxsLG51bGwsITEsITEsXCJcIixvbCk7YS5fcmVhY3RSb290Q29udGFpbmVyPWs7YVt0Zl09ay5jdXJyZW50O3JmKDg9PT1hLm5vZGVUeXBlP2EucGFyZW50Tm9kZTphKTtRayhmdW5jdGlvbigpe2VsKGIsayxjLGQpfSk7cmV0dXJuIGt9XG5mdW5jdGlvbiBxbChhLGIsYyxkLGUpe3ZhciBmPWMuX3JlYWN0Um9vdENvbnRhaW5lcjtpZihmKXt2YXIgZz1mO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlKXt2YXIgaD1lO2U9ZnVuY3Rpb24oKXt2YXIgYT1mbChnKTtoLmNhbGwoYSl9fWVsKGIsZyxhLGUpfWVsc2UgZz1wbChjLGIsYSxlLGQpO3JldHVybiBmbChnKX1EYz1mdW5jdGlvbihhKXtzd2l0Y2goYS50YWcpe2Nhc2UgMzp2YXIgYj1hLnN0YXRlTm9kZTtpZihiLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe3ZhciBjPXNjKGIucGVuZGluZ0xhbmVzKTswIT09YyYmKEJjKGIsY3wxKSxDayhiLEIoKSksMD09PShXJjYpJiYoYWo9QigpKzUwMCxpZygpKSl9YnJlYWs7Y2FzZSAxMzp2YXIgZD1KZygpO1FrKGZ1bmN0aW9uKCl7cmV0dXJuIExnKGEsMSxkKX0pO2hsKGEsMSl9fTtFYz1mdW5jdGlvbihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1KZygpO0xnKGEsMTM0MjE3NzI4LGIpO2hsKGEsMTM0MjE3NzI4KX19O1xuRmM9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9SmcoKSxjPUtnKGEpO0xnKGEsYyxiKTtobChhLGMpfX07R2M9ZnVuY3Rpb24oKXtyZXR1cm4gQ307SGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1DO3RyeXtyZXR1cm4gQz1hLGIoKX1maW5hbGx5e0M9Y319O1xueGI9ZnVuY3Rpb24oYSxiLGMpe3N3aXRjaChiKXtjYXNlIFwiaW5wdXRcIjokYShhLGMpO2I9Yy5uYW1lO2lmKFwicmFkaW9cIj09PWMudHlwZSYmbnVsbCE9Yil7Zm9yKGM9YTtjLnBhcmVudE5vZGU7KWM9Yy5wYXJlbnROb2RlO2M9Yy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbbmFtZT1cIitKU09OLnN0cmluZ2lmeShcIlwiK2IpKyddW3R5cGU9XCJyYWRpb1wiXScpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07aWYoZCE9PWEmJmQuZm9ybT09PWEuZm9ybSl7dmFyIGU9Q2IoZCk7aWYoIWUpdGhyb3cgRXJyb3IocCg5MCkpO1ZhKGQpOyRhKGQsZSl9fX1icmVhaztjYXNlIFwidGV4dGFyZWFcIjpoYihhLGMpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpiPWMudmFsdWUsbnVsbCE9YiYmZWIoYSwhIWMubXVsdGlwbGUsYiwhMSl9fTtGYj1QaztHYj1RaztcbnZhciBybD17dXNpbmdDbGllbnRFbnRyeVBvaW50OiExLEV2ZW50czpbQmIsdGUsQ2IsRGIsRWIsUGtdfSxzbD17ZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6VmMsYnVuZGxlVHlwZTowLHZlcnNpb246XCIxOC4xLjBcIixyZW5kZXJlclBhY2thZ2VOYW1lOlwicmVhY3QtZG9tXCJ9O1xudmFyIHRsPXtidW5kbGVUeXBlOnNsLmJ1bmRsZVR5cGUsdmVyc2lvbjpzbC52ZXJzaW9uLHJlbmRlcmVyUGFja2FnZU5hbWU6c2wucmVuZGVyZXJQYWNrYWdlTmFtZSxyZW5kZXJlckNvbmZpZzpzbC5yZW5kZXJlckNvbmZpZyxvdmVycmlkZUhvb2tTdGF0ZTpudWxsLG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDpudWxsLG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aDpudWxsLG92ZXJyaWRlUHJvcHM6bnVsbCxvdmVycmlkZVByb3BzRGVsZXRlUGF0aDpudWxsLG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoOm51bGwsc2V0RXJyb3JIYW5kbGVyOm51bGwsc2V0U3VzcGVuc2VIYW5kbGVyOm51bGwsc2NoZWR1bGVVcGRhdGU6bnVsbCxjdXJyZW50RGlzcGF0Y2hlclJlZjp0YS5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOmZ1bmN0aW9uKGEpe2E9WWIoYSk7cmV0dXJuIG51bGw9PT1hP251bGw6YS5zdGF0ZU5vZGV9LGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOnNsLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlfHxcbmlsLGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDpudWxsLHNjaGVkdWxlUmVmcmVzaDpudWxsLHNjaGVkdWxlUm9vdDpudWxsLHNldFJlZnJlc2hIYW5kbGVyOm51bGwsZ2V0Q3VycmVudEZpYmVyOm51bGwscmVjb25jaWxlclZlcnNpb246XCIxOC4xLjAtbmV4dC0yMmVkYjlmNzctMjAyMjA0MjZcIn07aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pe3ZhciB1bD1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoIXVsLmlzRGlzYWJsZWQmJnVsLnN1cHBvcnRzRmliZXIpdHJ5e2pjPXVsLmluamVjdCh0bCksa2M9dWx9Y2F0Y2goYSl7fX1leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPXJsO1xuZXhwb3J0cy5jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtpZighbWwoYikpdGhyb3cgRXJyb3IocCgyMDApKTtyZXR1cm4gYmwoYSxiLG51bGwsYyl9O2V4cG9ydHMuY3JlYXRlUm9vdD1mdW5jdGlvbihhLGIpe2lmKCFtbChhKSl0aHJvdyBFcnJvcihwKDI5OSkpO3ZhciBjPSExLGQ9XCJcIixlPWpsO251bGwhPT1iJiZ2b2lkIDAhPT1iJiYoITA9PT1iLnVuc3RhYmxlX3N0cmljdE1vZGUmJihjPSEwKSx2b2lkIDAhPT1iLmlkZW50aWZpZXJQcmVmaXgmJihkPWIuaWRlbnRpZmllclByZWZpeCksdm9pZCAwIT09Yi5vblJlY292ZXJhYmxlRXJyb3ImJihlPWIub25SZWNvdmVyYWJsZUVycm9yKSk7Yj1hbChhLDEsITEsbnVsbCxudWxsLGMsITEsZCxlKTthW3RmXT1iLmN1cnJlbnQ7cmYoOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmEpO3JldHVybiBuZXcga2woYil9O1xuZXhwb3J0cy5maW5kRE9NTm9kZT1mdW5jdGlvbihhKXtpZihudWxsPT1hKXJldHVybiBudWxsO2lmKDE9PT1hLm5vZGVUeXBlKXJldHVybiBhO3ZhciBiPWEuX3JlYWN0SW50ZXJuYWxzO2lmKHZvaWQgMD09PWIpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnJlbmRlcil0aHJvdyBFcnJvcihwKDE4OCkpO2E9T2JqZWN0LmtleXMoYSkuam9pbihcIixcIik7dGhyb3cgRXJyb3IocCgyNjgsYSkpO31hPVliKGIpO2E9bnVsbD09PWE/bnVsbDphLnN0YXRlTm9kZTtyZXR1cm4gYX07ZXhwb3J0cy5mbHVzaFN5bmM9ZnVuY3Rpb24oYSl7cmV0dXJuIFFrKGEpfTtleHBvcnRzLmh5ZHJhdGU9ZnVuY3Rpb24oYSxiLGMpe2lmKCFubChiKSl0aHJvdyBFcnJvcihwKDIwMCkpO3JldHVybiBxbChudWxsLGEsYiwhMCxjKX07XG5leHBvcnRzLmh5ZHJhdGVSb290PWZ1bmN0aW9uKGEsYixjKXtpZighbWwoYSkpdGhyb3cgRXJyb3IocCg0MDUpKTt2YXIgZD1udWxsIT1jJiZjLmh5ZHJhdGVkU291cmNlc3x8bnVsbCxlPSExLGY9XCJcIixnPWpsO251bGwhPT1jJiZ2b2lkIDAhPT1jJiYoITA9PT1jLnVuc3RhYmxlX3N0cmljdE1vZGUmJihlPSEwKSx2b2lkIDAhPT1jLmlkZW50aWZpZXJQcmVmaXgmJihmPWMuaWRlbnRpZmllclByZWZpeCksdm9pZCAwIT09Yy5vblJlY292ZXJhYmxlRXJyb3ImJihnPWMub25SZWNvdmVyYWJsZUVycm9yKSk7Yj1kbChiLG51bGwsYSwxLG51bGwhPWM/YzpudWxsLGUsITEsZixnKTthW3RmXT1iLmN1cnJlbnQ7cmYoYSk7aWYoZClmb3IoYT0wO2E8ZC5sZW5ndGg7YSsrKWM9ZFthXSxlPWMuX2dldFZlcnNpb24sZT1lKGMuX3NvdXJjZSksbnVsbD09Yi5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhP2IubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1bYyxlXTpiLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChjLFxuZSk7cmV0dXJuIG5ldyBsbChiKX07ZXhwb3J0cy5yZW5kZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKCFubChiKSl0aHJvdyBFcnJvcihwKDIwMCkpO3JldHVybiBxbChudWxsLGEsYiwhMSxjKX07ZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlPWZ1bmN0aW9uKGEpe2lmKCFubChhKSl0aHJvdyBFcnJvcihwKDQwKSk7cmV0dXJuIGEuX3JlYWN0Um9vdENvbnRhaW5lcj8oUWsoZnVuY3Rpb24oKXtxbChudWxsLG51bGwsYSwhMSxmdW5jdGlvbigpe2EuX3JlYWN0Um9vdENvbnRhaW5lcj1udWxsO2FbdGZdPW51bGx9KX0pLCEwKTohMX07ZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1QaztcbmV4cG9ydHMudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIW5sKGMpKXRocm93IEVycm9yKHAoMjAwKSk7aWYobnVsbD09YXx8dm9pZCAwPT09YS5fcmVhY3RJbnRlcm5hbHMpdGhyb3cgRXJyb3IocCgzOCkpO3JldHVybiBxbChhLGIsYywhMSxkKX07ZXhwb3J0cy52ZXJzaW9uPVwiMTguMS4wLW5leHQtMjJlZGI5Zjc3LTIwMjIwNDI2XCI7XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBTY2hlZHVsZXIgPSByZXF1aXJlKCdzY2hlZHVsZXInKTtcblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbnZhciBzdXBwcmVzc1dhcm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHNldFN1cHByZXNzV2FybmluZyhuZXdTdXBwcmVzc1dhcm5pbmcpIHtcbiAge1xuICAgIHN1cHByZXNzV2FybmluZyA9IG5ld1N1cHByZXNzV2FybmluZztcbiAgfVxufSAvLyBJbiBERVYsIGNhbGxzIHRvIGNvbnNvbGUud2FybiBhbmQgY29uc29sZS5lcnJvciBnZXQgcmVwbGFjZWRcbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBpZiAoIXN1cHByZXNzV2FybmluZykge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxudmFyIEZ1bmN0aW9uQ29tcG9uZW50ID0gMDtcbnZhciBDbGFzc0NvbXBvbmVudCA9IDE7XG52YXIgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCA9IDI7IC8vIEJlZm9yZSB3ZSBrbm93IHdoZXRoZXIgaXQgaXMgZnVuY3Rpb24gb3IgY2xhc3NcblxudmFyIEhvc3RSb290ID0gMzsgLy8gUm9vdCBvZiBhIGhvc3QgdHJlZS4gQ291bGQgYmUgbmVzdGVkIGluc2lkZSBhbm90aGVyIG5vZGUuXG5cbnZhciBIb3N0UG9ydGFsID0gNDsgLy8gQSBzdWJ0cmVlLiBDb3VsZCBiZSBhbiBlbnRyeSBwb2ludCB0byBhIGRpZmZlcmVudCByZW5kZXJlci5cblxudmFyIEhvc3RDb21wb25lbnQgPSA1O1xudmFyIEhvc3RUZXh0ID0gNjtcbnZhciBGcmFnbWVudCA9IDc7XG52YXIgTW9kZSA9IDg7XG52YXIgQ29udGV4dENvbnN1bWVyID0gOTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSAxMDtcbnZhciBGb3J3YXJkUmVmID0gMTE7XG52YXIgUHJvZmlsZXIgPSAxMjtcbnZhciBTdXNwZW5zZUNvbXBvbmVudCA9IDEzO1xudmFyIE1lbW9Db21wb25lbnQgPSAxNDtcbnZhciBTaW1wbGVNZW1vQ29tcG9uZW50ID0gMTU7XG52YXIgTGF6eUNvbXBvbmVudCA9IDE2O1xudmFyIEluY29tcGxldGVDbGFzc0NvbXBvbmVudCA9IDE3O1xudmFyIERlaHlkcmF0ZWRGcmFnbWVudCA9IDE4O1xudmFyIFN1c3BlbnNlTGlzdENvbXBvbmVudCA9IDE5O1xudmFyIFNjb3BlQ29tcG9uZW50ID0gMjE7XG52YXIgT2Zmc2NyZWVuQ29tcG9uZW50ID0gMjI7XG52YXIgTGVnYWN5SGlkZGVuQ29tcG9uZW50ID0gMjM7XG52YXIgQ2FjaGVDb21wb25lbnQgPSAyNDtcbnZhciBUcmFjaW5nTWFya2VyQ29tcG9uZW50ID0gMjU7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoID0gdHJ1ZTsgLy8gVE9ETzogTmVlZCB0byByZXZpZXcgdGhpcyBjb2RlIG9uZSBtb3JlIHRpbWUgYmVmb3JlIGxhbmRpbmdcbi8vIHRoZSByZWFjdC1yZWNvbmNpbGVyIHBhY2thZ2UuXG5cbnZhciBlbmFibGVOZXdSZWNvbmNpbGVyID0gZmFsc2U7IC8vIFN1cHBvcnQgbGVnYWN5IFByaW1lciBzdXBwb3J0IG9uIGludGVybmFsIEZCIHd3d1xuXG52YXIgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiA9IGZhbHNlOyAvLyBGQi1vbmx5IHVzYWdlLiBUaGUgbmV3IEFQSSBoYXMgZGlmZmVyZW50IHNlbWFudGljcy5cblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcblxudmFyIGVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2sgPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpenpcbi8vIFJlYWN0IERPTSBDaG9wcGluZyBCbG9ja1xuLy9cbi8vIFNpbWlsYXIgdG8gbWFpbiBDaG9wcGluZyBCbG9jayBidXQgb25seSBmbGFncyByZWxhdGVkIHRvIFJlYWN0IERPTS4gVGhlc2UgYXJlXG4vLyBncm91cGVkIGJlY2F1c2Ugd2Ugd2lsbCBsaWtlbHkgYmF0Y2ggYWxsIG9mIHRoZW0gaW50byBhIHNpbmdsZSBtYWpvciByZWxlYXNlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpc2FibGUgc3VwcG9ydCBmb3IgY29tbWVudCBub2RlcyBhcyBSZWFjdCBET00gY29udGFpbmVycy4gQWxyZWFkeSBkaXNhYmxlZFxuLy8gaW4gb3BlbiBzb3VyY2UsIGJ1dCB3d3cgY29kZWJhc2Ugc3RpbGwgcmVsaWVzIG9uIGl0LiBOZWVkIHRvIHJlbW92ZS5cblxudmFyIGRpc2FibGVDb21tZW50c0FzRE9NQ29udGFpbmVycyA9IHRydWU7IC8vIERpc2FibGUgamF2YXNjcmlwdDogVVJMIHN0cmluZ3MgaW4gaHJlZiBmb3IgWFNTIHByb3RlY3Rpb24uXG4vLyBhbmQgY2xpZW50IHJlbmRlcmluZywgbW9zdGx5IHRvIGFsbG93IEpTWCBhdHRyaWJ1dGVzIHRvIGFwcGx5IHRvIHRoZSBjdXN0b21cbi8vIGVsZW1lbnQncyBvYmplY3QgcHJvcGVydGllcyBpbnN0ZWFkIG9mIG9ubHkgSFRNTCBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTM0N1xuXG52YXIgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA9IGZhbHNlOyAvLyBEaXNhYmxlcyBjaGlsZHJlbiBmb3IgPHRleHRhcmVhPiBlbGVtZW50c1xudmFyIHdhcm5BYm91dFN0cmluZ1JlZnMgPSBmYWxzZTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlYnVnZ2luZyBhbmQgRGV2VG9vbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBZGRzIHVzZXIgdGltaW5nIG1hcmtzIGZvciBlLmcuIHN0YXRlIHVwZGF0ZXMsIHN1c3BlbnNlLCBhbmQgd29yayBsb29wIHN0dWZmLFxuLy8gZm9yIGFuIGV4cGVyaW1lbnRhbCB0aW1lbGluZSB0b29sLlxuXG52YXIgZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyID0gdHJ1ZTsgLy8gSGVscHMgaWRlbnRpZnkgc2lkZSBlZmZlY3RzIGluIHJlbmRlci1waGFzZSBsaWZlY3ljbGUgaG9va3MgYW5kIHNldFN0YXRlXG5cbnZhciBlbmFibGVQcm9maWxlclRpbWVyID0gdHJ1ZTsgLy8gUmVjb3JkIGR1cmF0aW9ucyBmb3IgY29tbWl0IGFuZCBwYXNzaXZlIGVmZmVjdHMgcGhhc2VzLlxuXG52YXIgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyA9IHRydWU7IC8vIFBoYXNlIHBhcmFtIHBhc3NlZCB0byBvblJlbmRlciBjYWxsYmFjayBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIGFuIFwidXBkYXRlXCIgYW5kIGEgXCJjYXNjYWRpbmctdXBkYXRlXCIuXG5cbnZhciBhbGxOYXRpdmVFdmVudHMgPSBuZXcgU2V0KCk7XG4vKipcbiAqIE1hcHBpbmcgZnJvbSByZWdpc3RyYXRpb24gbmFtZSB0byBldmVudCBuYW1lXG4gKi9cblxuXG52YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IHt9O1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbixcbiAqIHVzZWQgdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzLiBBdmFpbGFibGVcbiAqIG9ubHkgaW4gdHJ1ZS5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxudmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSAge30gOyAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gdHJ1ZVxuXG5mdW5jdGlvbiByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgJ0NhcHR1cmUnLCBkZXBlbmRlbmNpZXMpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdKSB7XG4gICAgICBlcnJvcignRXZlbnRSZWdpc3RyeTogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgJyArICdyZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuXG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5vbmRibGNsaWNrID0gcmVnaXN0cmF0aW9uTmFtZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5hZGQoZGVwZW5kZW5jaWVzW2ldKTtcbiAgfVxufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qXG4gKiBUaGUgYCcnICsgdmFsdWVgIHBhdHRlcm4gKHVzZWQgaW4gaW4gcGVyZi1zZW5zaXRpdmUgY29kZSkgdGhyb3dzIGZvciBTeW1ib2xcbiAqIGFuZCBUZW1wb3JhbC4qIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjIwNjQuXG4gKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB3aWxsIHRocm93IGFuIGVhc2llci10by11bmRlcnN0YW5kLFxuICogZWFzaWVyLXRvLWRlYnVnIGV4Y2VwdGlvbiB3aXRoIGEgY2xlYXIgZXJyb3JzIG1lc3NhZ2UgbWVzc2FnZSBleHBsYWluaW5nIHRoZVxuICogcHJvYmxlbS4gKEluc3RlYWQgb2YgYSBjb25mdXNpbmcgZXhjZXB0aW9uIHRocm93biBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uXG4gKiBvZiB0aGUgYHZhbHVlYCBvYmplY3QpLlxuICovXG4vLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAge1xuICAgIC8vIHRvU3RyaW5nVGFnIGlzIG5lZWRlZCBmb3IgbmFtZXNwYWNlZCB0eXBlcyBsaWtlIFRlbXBvcmFsLkluc3RhbnRcbiAgICB2YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZztcbiAgICB2YXIgdHlwZSA9IGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JztcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGF0dHJpYnV0ZU5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBhdHRyaWJ1dGUgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgYXR0cmlidXRlTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUHJvcFN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIHByb3AgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgcHJvcE5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIENTUyBwcm9wZXJ0eSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBwcm9wTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0h0bWxTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBIVE1MIG1hcmt1cCB1c2VzIGEgdmFsdWUgb2YgdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdGb3JtIGZpZWxkIHZhbHVlcyAodmFsdWUsIGNoZWNrZWQsIGRlZmF1bHRWYWx1ZSwgb3IgZGVmYXVsdENoZWNrZWQgcHJvcHMpJyArICcgbXVzdCBiZSBzdHJpbmdzLCBub3QgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG4vLyBBIHJlc2VydmVkIGF0dHJpYnV0ZS5cbi8vIEl0IGlzIGhhbmRsZWQgYnkgUmVhY3Qgc2VwYXJhdGVseSBhbmQgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cbnZhciBSRVNFUlZFRCA9IDA7IC8vIEEgc2ltcGxlIHN0cmluZyBhdHRyaWJ1dGUuXG4vLyBBdHRyaWJ1dGVzIHRoYXQgYXJlbid0IGluIHRoZSBmaWx0ZXIgYXJlIHByZXN1bWVkIHRvIGhhdmUgdGhpcyB0eXBlLlxuXG52YXIgU1RSSU5HID0gMTsgLy8gQSBzdHJpbmcgYXR0cmlidXRlIHRoYXQgYWNjZXB0cyBib29sZWFucyBpbiBSZWFjdC4gSW4gSFRNTCwgdGhlc2UgYXJlIGNhbGxlZFxuLy8gXCJlbnVtZXJhdGVkXCIgYXR0cmlidXRlcyB3aXRoIFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIgYXMgcG9zc2libGUgdmFsdWVzLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJ0cnVlXCIgc3RyaW5nLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIHNldCB0byBhIFwiZmFsc2VcIiBzdHJpbmcuXG5cbnZhciBCT09MRUFOSVNIX1NUUklORyA9IDI7IC8vIEEgcmVhbCBib29sZWFuIGF0dHJpYnV0ZS5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBvbWl0dGVkLlxuXG52YXIgQk9PTEVBTiA9IDM7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZmxhZyBhcyB3ZWxsIGFzIHdpdGggYSB2YWx1ZS5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBvbWl0dGVkLlxuLy8gRm9yIGFueSBvdGhlciB2YWx1ZSwgc2hvdWxkIGJlIHByZXNlbnQgd2l0aCB0aGF0IHZhbHVlLlxuXG52YXIgT1ZFUkxPQURFRF9CT09MRUFOID0gNDsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgTlVNRVJJQyA9IDU7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIHBvc2l0aXZlIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cblxudmFyIFBPU0lUSVZFX05VTUVSSUMgPSA2O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG52YXIgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiA9IFwiOkEtWl9hLXpcXFxcdTAwQzAtXFxcXHUwMEQ2XFxcXHUwMEQ4LVxcXFx1MDBGNlxcXFx1MDBGOC1cXFxcdTAyRkZcXFxcdTAzNzAtXFxcXHUwMzdEXFxcXHUwMzdGLVxcXFx1MUZGRlxcXFx1MjAwQy1cXFxcdTIwMERcXFxcdTIwNzAtXFxcXHUyMThGXFxcXHUyQzAwLVxcXFx1MkZFRlxcXFx1MzAwMS1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZGRFwiO1xuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuICovXG5cbnZhciBBVFRSSUJVVEVfTkFNRV9DSEFSID0gQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArIFwiXFxcXC0uMC05XFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDBcIjtcbnZhciBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCA9IG5ldyBSZWdFeHAoJ15bJyArIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyAnXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5mdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblxuICB7XG4gICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOiAvLyAkRmxvd0lzc3VlIHN5bWJvbCBpcyBwZXJmZWN0bHkgdmFsaWQgaGVyZVxuXG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICB7XG4gICAgICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZWZpeCA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5cbnJlc2VydmVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBSRVNFUlZFRCwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIEEgZmV3IFJlYWN0IHN0cmluZyBhdHRyaWJ1dGVzIGhhdmUgYSBkaWZmZXJlbnQgbmFtZS5cbi8vIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gUmVhY3QgcHJvcCBuYW1lcyB0byB0aGUgYXR0cmlidXRlIG5hbWVzLlxuXG5bWydhY2NlcHRDaGFyc2V0JywgJ2FjY2VwdC1jaGFyc2V0J10sIFsnY2xhc3NOYW1lJywgJ2NsYXNzJ10sIFsnaHRtbEZvcicsICdmb3InXSwgWydodHRwRXF1aXYnLCAnaHR0cC1lcXVpdiddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBuYW1lID0gX3JlZlswXSxcbiAgICAgIGF0dHJpYnV0ZU5hbWUgPSBfcmVmWzFdO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuXG5bJ2NvbnRlbnRFZGl0YWJsZScsICdkcmFnZ2FibGUnLCAnc3BlbGxDaGVjaycsICd2YWx1ZSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBcImVudW1lcmF0ZWRcIiBTVkcgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cbi8vIFNpbmNlIHRoZXNlIGFyZSBTVkcgYXR0cmlidXRlcywgdGhlaXIgYXR0cmlidXRlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cblxuWydhdXRvUmV2ZXJzZScsICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywgJ2ZvY3VzYWJsZScsICdwcmVzZXJ2ZUFscGhhJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOSVNIX1NUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGJvb2xlYW4gYXR0cmlidXRlcy5cblxuWydhbGxvd0Z1bGxTY3JlZW4nLCAnYXN5bmMnLCAvLyBOb3RlOiB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgd3JpdHRlbiB0byB0aGUgRE9NXG4vLyBvbiB0aGUgY2xpZW50IHNpZGUgYmVjYXVzZSB0aGUgYnJvd3NlcnMgYXJlIGluY29uc2lzdGVudC4gSW5zdGVhZCB3ZSBjYWxsIGZvY3VzKCkuXG4nYXV0b0ZvY3VzJywgJ2F1dG9QbGF5JywgJ2NvbnRyb2xzJywgJ2RlZmF1bHQnLCAnZGVmZXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLCAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJywgJ2Zvcm1Ob1ZhbGlkYXRlJywgJ2hpZGRlbicsICdsb29wJywgJ25vTW9kdWxlJywgJ25vVmFsaWRhdGUnLCAnb3BlbicsICdwbGF5c0lubGluZScsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdyZXZlcnNlZCcsICdzY29wZWQnLCAnc2VhbWxlc3MnLCAvLyBNaWNyb2RhdGFcbidpdGVtU2NvcGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSB0aGUgZmV3IFJlYWN0IHByb3BzIHRoYXQgd2Ugc2V0IGFzIERPTSBwcm9wZXJ0aWVzXG4vLyByYXRoZXIgdGhhbiBhdHRyaWJ1dGVzLiBUaGVzZSBhcmUgYWxsIGJvb2xlYW5zLlxuXG5bJ2NoZWNrZWQnLCAvLyBOb3RlOiBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4gV2UgaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciBoYW5kbGluZyB0aGlzLlxuJ211bHRpcGxlJywgJ211dGVkJywgJ3NlbGVjdGVkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCB0cnVlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFwib3ZlcmxvYWRlZCBib29sZWFuc1wiOiB0aGV5IGJlaGF2ZSBsaWtlXG4vLyBib29sZWFucywgYnV0IGNhbiBhbHNvIGFjY2VwdCBhIHN0cmluZyB2YWx1ZS5cblxuWydjYXB0dXJlJywgJ2Rvd25sb2FkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBPVkVSTE9BREVEX0JPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXJzLlxuXG5bJ2NvbHMnLCAncm93cycsICdzaXplJywgJ3NwYW4nIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFBPU0lUSVZFX05VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBudW1iZXJzLlxuXG5bJ3Jvd1NwYW4nLCAnc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE5VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7XG52YXIgQ0FNRUxJWkUgPSAvW1xcLVxcOl0oW2Etel0pL2c7XG5cbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIHJldHVybiB0b2tlblsxXS50b1VwcGVyQ2FzZSgpO1xufTsgLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIFNWRyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBzcGVjaWFsIGNhc2luZywgbmFtZXNwYWNpbmcsXG4vLyBvciBib29sZWFuIHZhbHVlIGFzc2lnbm1lbnQuIFJlZ3VsYXIgYXR0cmlidXRlcyB0aGF0IGp1c3QgYWNjZXB0IHN0cmluZ3Ncbi8vIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFyZSBvbWl0dGVkLCBqdXN0IGxpa2UgaW4gdGhlIEhUTUwgYXR0cmlidXRlIGZpbHRlci5cbi8vIFNvbWUgb2YgdGhlc2UgYXR0cmlidXRlcyBjYW4gYmUgaGFyZCB0byBmaW5kLiBUaGlzIGxpc3Qgd2FzIGNyZWF0ZWQgYnlcbi8vIHNjcmFwaW5nIHRoZSBNRE4gZG9jdW1lbnRhdGlvbi5cblxuXG5bJ2FjY2VudC1oZWlnaHQnLCAnYWxpZ25tZW50LWJhc2VsaW5lJywgJ2FyYWJpYy1mb3JtJywgJ2Jhc2VsaW5lLXNoaWZ0JywgJ2NhcC1oZWlnaHQnLCAnY2xpcC1wYXRoJywgJ2NsaXAtcnVsZScsICdjb2xvci1pbnRlcnBvbGF0aW9uJywgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsICdjb2xvci1wcm9maWxlJywgJ2NvbG9yLXJlbmRlcmluZycsICdkb21pbmFudC1iYXNlbGluZScsICdlbmFibGUtYmFja2dyb3VuZCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2Zsb29kLWNvbG9yJywgJ2Zsb29kLW9wYWNpdHknLCAnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywgJ2ZvbnQtc2l6ZS1hZGp1c3QnLCAnZm9udC1zdHJldGNoJywgJ2ZvbnQtc3R5bGUnLCAnZm9udC12YXJpYW50JywgJ2ZvbnQtd2VpZ2h0JywgJ2dseXBoLW5hbWUnLCAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCcsICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCcsICdob3Jpei1hZHYteCcsICdob3Jpei1vcmlnaW4teCcsICdpbWFnZS1yZW5kZXJpbmcnLCAnbGV0dGVyLXNwYWNpbmcnLCAnbGlnaHRpbmctY29sb3InLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdvdmVybGluZS1wb3NpdGlvbicsICdvdmVybGluZS10aGlja25lc3MnLCAncGFpbnQtb3JkZXInLCAncGFub3NlLTEnLCAncG9pbnRlci1ldmVudHMnLCAncmVuZGVyaW5nLWludGVudCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycsICdzdHJva2UtZGFzaGFycmF5JywgJ3N0cm9rZS1kYXNob2Zmc2V0JywgJ3N0cm9rZS1saW5lY2FwJywgJ3N0cm9rZS1saW5lam9pbicsICdzdHJva2UtbWl0ZXJsaW1pdCcsICdzdHJva2Utb3BhY2l0eScsICdzdHJva2Utd2lkdGgnLCAndGV4dC1hbmNob3InLCAndGV4dC1kZWNvcmF0aW9uJywgJ3RleHQtcmVuZGVyaW5nJywgJ3VuZGVybGluZS1wb3NpdGlvbicsICd1bmRlcmxpbmUtdGhpY2tuZXNzJywgJ3VuaWNvZGUtYmlkaScsICd1bmljb2RlLXJhbmdlJywgJ3VuaXRzLXBlci1lbScsICd2LWFscGhhYmV0aWMnLCAndi1oYW5naW5nJywgJ3YtaWRlb2dyYXBoaWMnLCAndi1tYXRoZW1hdGljYWwnLCAndmVjdG9yLWVmZmVjdCcsICd2ZXJ0LWFkdi15JywgJ3ZlcnQtb3JpZ2luLXgnLCAndmVydC1vcmlnaW4teScsICd3b3JkLXNwYWNpbmcnLCAnd3JpdGluZy1tb2RlJywgJ3htbG5zOnhsaW5rJywgJ3gtaGVpZ2h0JyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeGxpbmsgbmFtZXNwYWNlLlxuXG5bJ3hsaW5rOmFjdHVhdGUnLCAneGxpbms6YXJjcm9sZScsICd4bGluazpyb2xlJywgJ3hsaW5rOnNob3cnLCAneGxpbms6dGl0bGUnLCAneGxpbms6dHlwZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bWwgbmFtZXNwYWNlLlxuXG5bJ3htbDpiYXNlJywgJ3htbDpsYW5nJywgJ3htbDpzcGFjZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlIGV4aXN0cyBib3RoIGluIEhUTUwgYW5kIFNWRy5cbi8vIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBjYXNlLXNlbnNpdGl2ZSBpbiBTVkcgc28gd2UgY2FuJ3QganVzdCB1c2Vcbi8vIHRoZSBSZWFjdCBuYW1lIGxpa2Ugd2UgZG8gZm9yIGF0dHJpYnV0ZXMgdGhhdCBleGlzdCBvbmx5IGluIEhUTUwuXG5cblsndGFiSW5kZXgnLCAnY3Jvc3NPcmlnaW4nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlcyBhY2NlcHQgVVJMcy4gVGhlc2UgbXVzdCBub3QgYWxsb3cgamF2YXNjcmlwdDogVVJMUy5cbi8vIFRoZXNlIHdpbGwgYWxzbyBuZWVkIHRvIGFjY2VwdCBUcnVzdGVkIFR5cGVzIG9iamVjdCBpbiB0aGUgZnV0dXJlLlxuXG52YXIgeGxpbmtIcmVmID0gJ3hsaW5rSHJlZic7XG5wcm9wZXJ0aWVzW3hsaW5rSHJlZl0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKCd4bGlua0hyZWYnLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbid4bGluazpocmVmJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCB0cnVlLCAvLyBzYW5pdGl6ZVVSTFxuZmFsc2UpO1xuWydzcmMnLCAnaHJlZicsICdhY3Rpb24nLCAnZm9ybUFjdGlvbiddLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgcHJvcGVydGllc1thdHRyaWJ1dGVOYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoYXR0cmlidXRlTmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbiAgdHJ1ZSk7XG59KTtcblxuLy8gYW5kIGFueSBuZXdsaW5lIG9yIHRhYiBhcmUgZmlsdGVyZWQgb3V0IGFzIGlmIHRoZXkncmUgbm90IHBhcnQgb2YgdGhlIFVSTC5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLXBhcnNpbmdcbi8vIFRhYiBvciBuZXdsaW5lIGFyZSBkZWZpbmVkIGFzIFxcclxcblxcdDpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS10YWItb3ItbmV3bGluZVxuLy8gQSBDMCBjb250cm9sIGlzIGEgY29kZSBwb2ludCBpbiB0aGUgcmFuZ2UgXFx1MDAwMCBOVUxMIHRvIFxcdTAwMUZcbi8vIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkUsIGluY2x1c2l2ZTpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjMC1jb250cm9sLW9yLXNwYWNlXG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxudmFyIGlzSmF2YVNjcmlwdFByb3RvY29sID0gL15bXFx1MDAwMC1cXHUwMDFGIF0qaltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSp2W1xcclxcblxcdF0qYVtcXHJcXG5cXHRdKnNbXFxyXFxuXFx0XSpjW1xcclxcblxcdF0qcltcXHJcXG5cXHRdKmlbXFxyXFxuXFx0XSpwW1xcclxcblxcdF0qdFtcXHJcXG5cXHRdKlxcOi9pO1xudmFyIGRpZFdhcm4gPSBmYWxzZTtcblxuZnVuY3Rpb24gc2FuaXRpemVVUkwodXJsKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm4gJiYgaXNKYXZhU2NyaXB0UHJvdG9jb2wudGVzdCh1cmwpKSB7XG4gICAgICBkaWRXYXJuID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ0EgZnV0dXJlIHZlcnNpb24gb2YgUmVhY3Qgd2lsbCBibG9jayBqYXZhc2NyaXB0OiBVUkxzIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4gJyArICdVc2UgZXZlbnQgaGFuZGxlcnMgaW5zdGVhZCBpZiB5b3UgY2FuLiBJZiB5b3UgbmVlZCB0byBnZW5lcmF0ZSB1bnNhZmUgSFRNTCB0cnkgJyArICd1c2luZyBkYW5nZXJvdXNseVNldElubmVySFRNTCBpbnN0ZWFkLiBSZWFjdCB3YXMgcGFzc2VkICVzLicsIEpTT04uc3RyaW5naWZ5KHVybCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLiBPbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqIFRoZSBcImV4cGVjdGVkXCIgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuXG4gKiBTb21lIHByb3BlcnRpZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvKSB7XG4gIHtcbiAgICBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG4gICAgICByZXR1cm4gbm9kZVtwcm9wZXJ0eU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIHByb3RlY3RzIG11bHRpcGxlIHVzZXMgb2YgYGV4cGVjdGVkYCwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb24gcnVsZSBpcyBkaXNhYmxlZCBpbiBzZXZlcmFsIHNwb3RzXG4gICAgICAvLyBiZWxvdy5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggcHJvcGVydHlJbmZvLnNhbml0aXplVVJMKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgZnVsbHkgZGlzYWJsZWQgamF2YXNjcmlwdDogVVJMcywgYW5kIGlmXG4gICAgICAgIC8vIHRoZSBoeWRyYXRpb24gaXMgc3VjY2Vzc2Z1bCBvZiBhIGphdmFzY3JpcHQ6IFVSTCwgd2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byB3YXJuIG9uIHRoZSBjbGllbnQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBzYW5pdGl6ZVVSTCgnJyArIGV4cGVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgIHZhciBzdHJpbmdWYWx1ZSA9IG51bGw7XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOKSB7XG4gICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAvLyBXZSBoYWQgYW4gYXR0cmlidXRlIGJ1dCBzaG91bGRuJ3QgaGF2ZSBoYWQgb25lLCBzbyByZWFkIGl0XG4gICAgICAgICAgLy8gZm9yIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGEgYm9vbGVhbiwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgdmFsdWUgaXNcbiAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkLlxuICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgfSAvLyBFdmVuIGlmIHRoaXMgcHJvcGVydHkgdXNlcyBhIG5hbWVzcGFjZSB3ZSB1c2UgZ2V0QXR0cmlidXRlXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXNzdW1lIGl0cyBuYW1lc3BhY2VkIG5hbWUgaXMgdGhlIHNhbWUgYXMgb3VyIGNvbmZpZy5cbiAgICAgICAgLy8gVG8gdXNlIGdldEF0dHJpYnV0ZU5TIHdlIG5lZWQgdGhlIGxvY2FsIG5hbWUgd2hpY2ggd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAvLyBpbiBvdXIgY29uZmlnIGF0bS5cblxuXG4gICAgICAgIHN0cmluZ1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gbnVsbCA/IGV4cGVjdGVkIDogc3RyaW5nVmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCkge1xuICB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXG4gICAge1xuICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCB2YWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcblxuICBpZiAoc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICB2YWx1ZSA9IG51bGw7XG4gIH0gLy8gSWYgdGhlIHByb3AgaXNuJ3QgaW4gdGhlIHNwZWNpYWwgbGlzdCwgdHJlYXQgaXQgYXMgYSBzaW1wbGUgYXR0cmlidXRlLlxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAge1xuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cblxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJyk7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG52YXIgUkVBQ1RfQ0FDSEVfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5jYWNoZScpO1xudmFyIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3QudHJhY2luZ19tYXJrZXInKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSAgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoY3Rvciwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShjdG9yLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlcikge1xuICB2YXIgb3duZXIgPSAgZmliZXIuX2RlYnVnT3duZXIgPyBmaWJlci5fZGVidWdPd25lci50eXBlIDogbnVsbCA7XG4gIHZhciBzb3VyY2UgPSAgZmliZXIuX2RlYnVnU291cmNlIDtcblxuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnTGF6eScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUucmVuZGVyKTtcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2Qod29ya0luUHJvZ3Jlc3MpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICBkbyB7XG4gICAgICBpbmZvICs9IGRlc2NyaWJlRmliZXIobm9kZSk7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSk7XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfSBjYXRjaCAoeCkge1xuICAgIHJldHVybiAnXFxuRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogJyArIHgubWVzc2FnZSArICdcXG4nICsgeC5zdGFjaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZSQxKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lIHx8IChmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWUpO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCBzaGFyZWQvZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUkMSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikge1xuICB2YXIgdGFnID0gZmliZXIudGFnLFxuICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdDYWNoZSc7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZSQxKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAgcmV0dXJuICdEZWh5ZHJhdGVkRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lJDEodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAvLyBIb3N0IGNvbXBvbmVudCB0eXBlIGlzIHRoZSBkaXNwbGF5IG5hbWUgKGUuZy4gXCJkaXZcIiwgXCJWaWV3XCIpXG4gICAgICByZXR1cm4gdHlwZTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gJ1Jvb3QnO1xuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiAnVGV4dCc7XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICAvLyBOYW1lIGNvbWVzIGZyb20gdGhlIHR5cGUgaW4gdGhpcyBjYXNlOyB3ZSBkb24ndCBoYXZlIGEgdGFnLlxuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgIGNhc2UgTW9kZTpcbiAgICAgIGlmICh0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFKSB7XG4gICAgICAgIC8vIERvbid0IGJlIGxlc3Mgc3BlY2lmaWMgdGhhbiBzaGFyZWQvZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlXG4gICAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnTW9kZSc7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnT2Zmc2NyZWVuJztcblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1Njb3BlJztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdUcmFjaW5nTWFya2VyJztcbiAgICAvLyBUaGUgZGlzcGxheSBuYW1lIGZvciB0aGlzIHRhZ3MgY29tZSBmcm9tIHRoZSB1c2VyLXByb3ZpZGVkIHR5cGU6XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xudmFyIGN1cnJlbnQgPSBudWxsO1xudmFyIGlzUmVuZGVyaW5nID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgb3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIHR5cGVvZiBvd25lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldigpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSAvLyBTYWZlIGJlY2F1c2UgaWYgY3VycmVudCBmaWJlciBleGlzdHMsIHdlIGFyZSByZWNvbmNpbGluZyxcbiAgICAvLyBhbmQgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgd29yay1pbi1wcm9ncmVzcyB2ZXJzaW9uLlxuXG5cbiAgICByZXR1cm4gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGN1cnJlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuICAgIGN1cnJlbnQgPSBudWxsO1xuICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRGaWJlcihmaWJlcikge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBmaWJlciA9PT0gbnVsbCA/IG51bGwgOiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2O1xuICAgIGN1cnJlbnQgPSBmaWJlcjtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNSZW5kZXJpbmcocmVuZGVyaW5nKSB7XG4gIHtcbiAgICBpc1JlbmRlcmluZyA9IHJlbmRlcmluZztcbiAgfVxufVxuXG4vLyBGbG93IGRvZXMgbm90IGFsbG93IHN0cmluZyBjb25jYXRlbmF0aW9uIG9mIG1vc3Qgbm9uLXN0cmluZyB0eXBlcy4gVG8gd29ya1xuLy8gYXJvdW5kIHRoaXMgbGltaXRhdGlvbiwgd2UgdXNlIGFuIG9wYXF1ZSB0eXBlIHRoYXQgY2FuIG9ubHkgYmUgb2J0YWluZWQgYnlcbi8vIHBhc3NpbmcgdGhlIHZhbHVlIHRocm91Z2ggZ2V0VG9TdHJpbmdWYWx1ZSBmaXJzdC5cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIFRoZSBjb2VyY2lvbiBzYWZldHkgY2hlY2sgaXMgcGVyZm9ybWVkIGluIGdldFRvU3RyaW5nVmFsdWUoKS5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkge1xuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGZ1bmN0aW9uLCBzeW1ib2wgYXJlIGFzc2lnbmVkIGFzIGVtcHR5IHN0cmluZ3NcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG52YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHtcbiAgYnV0dG9uOiB0cnVlLFxuICBjaGVja2JveDogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGhpZGRlbjogdHJ1ZSxcbiAgcmFkaW86IHRydWUsXG4gIHJlc2V0OiB0cnVlLFxuICBzdWJtaXQ6IHRydWVcbn07XG5mdW5jdGlvbiBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKHRhZ05hbWUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoIShoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLm9uSW5wdXQgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMudmFsdWUgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cblxuICAgIGlmICghKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmNoZWNrZWQgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDaGVja2FibGUoZWxlbSkge1xuICB2YXIgdHlwZSA9IGVsZW0udHlwZTtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrZXIobm9kZSkge1xuICByZXR1cm4gbm9kZS5fdmFsdWVUcmFja2VyO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hUcmFja2VyKG5vZGUpIHtcbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZSA9ICcnO1xuXG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmIChpc0NoZWNrYWJsZShub2RlKSkge1xuICAgIHZhbHVlID0gbm9kZS5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRyYWNrVmFsdWVPbk5vZGUobm9kZSkge1xuICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJ2NoZWNrZWQnIDogJ3ZhbHVlJztcbiAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUuY29uc3RydWN0b3IucHJvdG90eXBlLCB2YWx1ZUZpZWxkKTtcblxuICB7XG4gICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKG5vZGVbdmFsdWVGaWVsZF0pO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRWYWx1ZSA9ICcnICsgbm9kZVt2YWx1ZUZpZWxkXTsgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgLy8gYnV0IGl0J3MgYmV0dGVyIHRoZW4gYSBoYXJkIGZhaWx1cmVcbiAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuXG4gIGlmIChub2RlLmhhc093blByb3BlcnR5KHZhbHVlRmllbGQpIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0LFxuICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIHNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICB9XG4gIH0pOyAvLyBXZSBjb3VsZCd2ZSBwYXNzZWQgdGhpcyB0aGUgZmlyc3QgdGltZVxuICAvLyBidXQgaXQgdHJpZ2dlcnMgYSBidWcgaW4gSUUxMSBhbmQgRWRnZSAxNC8xNS5cbiAgLy8gQ2FsbGluZyBkZWZpbmVQcm9wZXJ0eSgpIGFnYWluIHNob3VsZCBiZSBlcXVpdmFsZW50LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExNzY4XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGVcbiAgfSk7XG4gIHZhciB0cmFja2VyID0ge1xuICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIH0sXG4gICAgc2V0VmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgIH0sXG4gICAgc3RvcFRyYWNraW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXRhY2hUcmFja2VyKG5vZGUpO1xuICAgICAgZGVsZXRlIG5vZGVbdmFsdWVGaWVsZF07XG4gICAgfVxuICB9O1xuICByZXR1cm4gdHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2sobm9kZSkge1xuICBpZiAoZ2V0VHJhY2tlcihub2RlKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBUT0RPOiBPbmNlIGl0J3MganVzdCBGaWJlciB3ZSBjYW4gbW92ZSB0aGlzIHRvIG5vZGUuX3dyYXBwZXJTdGF0ZVxuXG5cbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gdHJhY2tWYWx1ZU9uTm9kZShub2RlKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRyYWNrZXIgPSBnZXRUcmFja2VyKG5vZGUpOyAvLyBpZiB0aGVyZSBpcyBubyB0cmFja2VyIGF0IHRoaXMgcG9pbnQgaXQncyB1bmxpa2VseVxuICAvLyB0aGF0IHRyeWluZyBhZ2FpbiB3aWxsIHN1Y2NlZWRcblxuICBpZiAoIXRyYWNrZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBsYXN0VmFsdWUgPSB0cmFja2VyLmdldFZhbHVlKCk7XG4gIHZhciBuZXh0VmFsdWUgPSBnZXRWYWx1ZUZyb21Ob2RlKG5vZGUpO1xuXG4gIGlmIChuZXh0VmFsdWUgIT09IGxhc3RWYWx1ZSkge1xuICAgIHRyYWNrZXIuc2V0VmFsdWUobmV4dFZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudChkb2MpIHtcbiAgZG9jID0gZG9jIHx8ICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiB1bmRlZmluZWQpO1xuXG4gIGlmICh0eXBlb2YgZG9jID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jLmFjdGl2ZUVsZW1lbnQgfHwgZG9jLmJvZHk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZG9jLmJvZHk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gZmFsc2U7XG52YXIgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0NvbnRyb2xsZWQocHJvcHMpIHtcbiAgdmFyIHVzZXNDaGVja2VkID0gcHJvcHMudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wcy50eXBlID09PSAncmFkaW8nO1xuICByZXR1cm4gdXNlc0NoZWNrZWQgPyBwcm9wcy5jaGVja2VkICE9IG51bGwgOiBwcm9wcy52YWx1ZSAhPSBudWxsO1xufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxpbnB1dD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyB0aGVzZSBvcHRpb25hbFxuICogcHJvcHM6IGBjaGVja2VkYCwgYHZhbHVlYCwgYGRlZmF1bHRDaGVja2VkYCwgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICpcbiAqIElmIGBjaGVja2VkYCBvciBgdmFsdWVgIGFyZSBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zXG4gKiB0aGF0IGFmZmVjdCB0aGUgY2hlY2tlZCBzdGF0ZSBvciB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiB0aGV5IGFyZSBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgbm90XG4gKiB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBwcm9wcyBtdXN0IGNoYW5nZSBpbiBvcmRlciBmb3JcbiAqIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCBhcyB1bmNoZWNrZWQgKG9yIGBkZWZhdWx0Q2hlY2tlZGApXG4gKiB3aXRoIGFuIGVtcHR5IHZhbHVlIChvciBgZGVmYXVsdFZhbHVlYCkuXG4gKlxuICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTIvV0QtaHRtbDUtMjAxMjEwMjUvdGhlLWlucHV0LWVsZW1lbnQuaHRtbFxuICovXG5cblxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuICB2YXIgaG9zdFByb3BzID0gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGRlZmF1bHRDaGVja2VkOiB1bmRlZmluZWQsXG4gICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGVja2VkOiBjaGVja2VkICE9IG51bGwgPyBjaGVja2VkIDogbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkXG4gIH0pO1xuICByZXR1cm4gaG9zdFByb3BzO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZShlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygnaW5wdXQnLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuY2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCBjaGVja2VkIGFuZCBkZWZhdWx0Q2hlY2tlZCBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgY2hlY2tlZCBwcm9wLCBvciB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG5cbiAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgPyAnJyA6IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxDaGVja2VkOiBwcm9wcy5jaGVja2VkICE9IG51bGwgPyBwcm9wcy5jaGVja2VkIDogcHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlICE9IG51bGwgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZSksXG4gICAgY29udHJvbGxlZDogaXNDb250cm9sbGVkKHByb3BzKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlQ2hlY2tlZChlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDtcblxuICBpZiAoY2hlY2tlZCAhPSBudWxsKSB7XG4gICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCAnY2hlY2tlZCcsIGNoZWNrZWQsIGZhbHNlKTtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIHZhciBjb250cm9sbGVkID0gaXNDb250cm9sbGVkKHByb3BzKTtcblxuICAgIGlmICghbm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgY29udHJvbGxlZCAmJiAhZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGFuIHVuY29udHJvbGxlZCBpbnB1dCB0byBiZSBjb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSB1bmRlZmluZWQgdG8gJyArICdhIGRlZmluZWQgdmFsdWUsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiAhY29udHJvbGxlZCAmJiAhZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCB0byBiZSB1bmNvbnRyb2xsZWQuICcgKyAnVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IHRoZSB2YWx1ZSBjaGFuZ2luZyBmcm9tIGEgZGVmaW5lZCB0byAnICsgJ3VuZGVmaW5lZCwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ2hlY2tlZChlbGVtZW50LCBwcm9wcyk7XG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiBub2RlLnZhbHVlID09PSAnJyB8fCAvLyBXZSBleHBsaWNpdGx5IHdhbnQgdG8gY29lcmNlIHRvIG51bWJlciBoZXJlIGlmIHBvc3NpYmxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBub2RlLnZhbHVlICE9IHZhbHVlKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnZhbHVlICE9PSB0b1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpIHtcbiAgICAvLyBTdWJtaXQvcmVzZXQgaW5wdXRzIG5lZWQgdGhlIGF0dHJpYnV0ZSByZW1vdmVkIGNvbXBsZXRlbHkgdG8gYXZvaWRcbiAgICAvLyBibGFuay10ZXh0IGJ1dHRvbnMuXG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgY29tZXMgZnJvbSBhIGNhc2NhZGUgb2ZcbiAgICAvLyBwcm9wZXJ0aWVzOlxuICAgIC8vICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAzLiBPdGhlcndpc2UgdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZVxuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGl0IG9ubHkgY2hhbmdlcyB3aGVuIGl0IG5lZWRzXG4gICAgLy8gdG8gYmUgcmVtb3ZlZCwgc3VjaCBhcyB0cmFuc2l0aW9uaW5nIGZyb20gYSBjaGVja2JveCBpbnRvIGEgdGV4dCBpbnB1dFxuICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyKGVsZW1lbnQsIHByb3BzLCBpc0h5ZHJhdGluZykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7IC8vIERvIG5vdCBhc3NpZ24gdmFsdWUgaWYgaXQgaXMgYWxyZWFkeSBzZXQuIFRoaXMgcHJldmVudHMgdXNlciB0ZXh0IGlucHV0XG4gIC8vIGZyb20gYmVpbmcgbG9zdCBkdXJpbmcgU1NSIGh5ZHJhdGlvbi5cblxuICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykgfHwgcHJvcHMuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB7XG4gICAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuICAgIHZhciBpc0J1dHRvbiA9IHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCc7IC8vIEF2b2lkIHNldHRpbmcgdmFsdWUgYXR0cmlidXRlIG9uIHN1Ym1pdC9yZXNldCBpbnB1dHMgYXMgaXQgb3ZlcnJpZGVzIHRoZVxuICAgIC8vIGRlZmF1bHQgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIuIFNlZTogIzEyODcyXG5cbiAgICBpZiAoaXNCdXR0b24gJiYgKHByb3BzLnZhbHVlID09PSB1bmRlZmluZWQgfHwgcHJvcHMudmFsdWUgPT09IG51bGwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGluaXRpYWxWYWx1ZSA9IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpOyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAgIC8vIGZyb20gYmVpbmcgbG9zdCBkdXJpbmcgU1NSIGh5ZHJhdGlvbi5cblxuICAgIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAgIHtcbiAgICAgICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzaG91bGQgdXNlXG4gICAgICAgIC8vIHRoZSB3cmFwcGVyU3RhdGUuX2luaXRpYWxWYWx1ZSBwcm9wZXJ0eS4gVGhpcyB1c2VzOlxuICAgICAgICAvL1xuICAgICAgICAvLyAgIDEuIFRoZSB2YWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAyLiBUaGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDMuIEFuIGVtcHR5IHN0cmluZ1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgbm9kZS52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBzeW5jaHJvbml6ZWQgdG8gdGhlIHByb3BlcnR5LFxuICAgICAgLy8gc28gd2UgYXNzaWduIGRlZmF1bHRWYWx1ZSB0byB0aGUgc2FtZSB0aGluZyBhcyB0aGUgdmFsdWUgcHJvcGVydHlcbiAgICAgIC8vIGFzc2lnbm1lbnQgc3RlcCBhYm92ZS5cbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIH1cbiAgfSAvLyBOb3JtYWxseSwgd2UnZCBqdXN0IGRvIGBub2RlLmNoZWNrZWQgPSBub2RlLmNoZWNrZWRgIHVwb24gaW5pdGlhbCBtb3VudCwgbGVzcyB0aGlzIGJ1Z1xuICAvLyB0aGlzIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhIGNocm9tZSBidWcgd2hlcmUgc2V0dGluZyBkZWZhdWx0Q2hlY2tlZFxuICAvLyB3aWxsIHNvbWV0aW1lcyBpbmZsdWVuY2UgdGhlIHZhbHVlIG9mIGNoZWNrZWQgKGV2ZW4gYWZ0ZXIgZGV0YWNobWVudCkuXG4gIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NjA4NDE2XG4gIC8vIFdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgdW5zZXQgbmFtZSB0byBhdm9pZCBkaXNydXB0aW5nIHJhZGlvIGJ1dHRvbiBncm91cHMuXG5cblxuICB2YXIgbmFtZSA9IG5vZGUubmFtZTtcblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSAnJztcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBib3RoIHRoZSBjaGVja2VkIHByb3BlcnR5IGFuZFxuICAgIC8vIGF0dHJpYnV0ZSBhcmUgYXNzaWduZWQgYXQgdGhlIHNhbWUgdGltZSB1c2luZyBkZWZhdWx0Q2hlY2tlZC4gVGhpcyB1c2VzOlxuICAgIC8vXG4gICAgLy8gICAxLiBUaGUgY2hlY2tlZCBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAvLyAgIDIuIFRoZSBkZWZhdWx0Q2hlY2tlZCBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAvLyAgIDMuIE90aGVyd2lzZSwgZmFsc2VcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gIW5vZGUuZGVmYXVsdENoZWNrZWQ7XG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkO1xuICB9XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gbmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHVwZGF0ZVdyYXBwZXIobm9kZSwgcHJvcHMpO1xuICB1cGRhdGVOYW1lZENvdXNpbnMobm9kZSwgcHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVOYW1lZENvdXNpbnMocm9vdE5vZGUsIHByb3BzKSB7XG4gIHZhciBuYW1lID0gcHJvcHMubmFtZTtcblxuICBpZiAocHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuYW1lICE9IG51bGwpIHtcbiAgICB2YXIgcXVlcnlSb290ID0gcm9vdE5vZGU7XG5cbiAgICB3aGlsZSAocXVlcnlSb290LnBhcmVudE5vZGUpIHtcbiAgICAgIHF1ZXJ5Um9vdCA9IHF1ZXJ5Um9vdC5wYXJlbnROb2RlO1xuICAgIH0gLy8gSWYgYHJvb3ROb2RlLmZvcm1gIHdhcyBub24tbnVsbCwgdGhlbiB3ZSBjb3VsZCB0cnkgYGZvcm0uZWxlbWVudHNgLFxuICAgIC8vIGJ1dCB0aGF0IHNvbWV0aW1lcyBiZWhhdmVzIHN0cmFuZ2VseSBpbiBJRTguIFdlIGNvdWxkIGFsc28gdHJ5IHVzaW5nXG4gICAgLy8gYGZvcm0uZ2V0RWxlbWVudHNCeU5hbWVgLCBidXQgdGhhdCB3aWxsIG9ubHkgcmV0dXJuIGRpcmVjdCBjaGlsZHJlblxuICAgIC8vIGFuZCB3b24ndCBpbmNsdWRlIGlucHV0cyB0aGF0IHVzZSB0aGUgSFRNTDUgYGZvcm09YCBhdHRyaWJ1dGUuIFNpbmNlXG4gICAgLy8gdGhlIGlucHV0IG1pZ2h0IG5vdCBldmVuIGJlIGluIGEgZm9ybS4gSXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gdGhlXG4gICAgLy8gZG9jdW1lbnQuIExldCdzIGp1c3QgdXNlIHRoZSBsb2NhbCBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0XG4gICAgLy8gbWlzcyBhbnl0aGluZy5cblxuXG4gICAge1xuICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihuYW1lLCAnbmFtZScpO1xuICAgIH1cblxuICAgIHZhciBncm91cCA9IHF1ZXJ5Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPScgKyBKU09OLnN0cmluZ2lmeSgnJyArIG5hbWUpICsgJ11bdHlwZT1cInJhZGlvXCJdJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07XG5cbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cblxuXG4gICAgICB2YXIgb3RoZXJQcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUob3RoZXJOb2RlKTtcblxuICAgICAgaWYgKCFvdGhlclByb3BzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3RET01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVhY3QgcmFkaW8gaW5wdXRzIHdpdGggdGhlICcgKyAnc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH0gLy8gV2UgbmVlZCB1cGRhdGUgdGhlIHRyYWNrZWQgdmFsdWUgb24gdGhlIG5hbWVkIGNvdXNpbiBzaW5jZSB0aGUgdmFsdWVcbiAgICAgIC8vIHdhcyBjaGFuZ2VkIGJ1dCB0aGUgaW5wdXQgc2F3IG5vIGV2ZW50IG9yIHZhbHVlIHNldFxuXG5cbiAgICAgIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG90aGVyTm9kZSk7IC8vIElmIHRoaXMgaXMgYSBjb250cm9sbGVkIHJhZGlvIGJ1dHRvbiBncm91cCwgZm9yY2luZyB0aGUgaW5wdXQgdGhhdFxuICAgICAgLy8gd2FzIHByZXZpb3VzbHkgY2hlY2tlZCB0byB1cGRhdGUgd2lsbCBjYXVzZSBpdCB0byBiZSBjb21lIHJlLWNoZWNrZWRcbiAgICAgIC8vIGFzIGFwcHJvcHJpYXRlLlxuXG4gICAgICB1cGRhdGVXcmFwcGVyKG90aGVyTm9kZSwgb3RoZXJQcm9wcyk7XG4gICAgfVxuICB9XG59IC8vIEluIENocm9tZSwgYXNzaWduaW5nIGRlZmF1bHRWYWx1ZSB0byBjZXJ0YWluIGlucHV0IHR5cGVzIHRyaWdnZXJzIGlucHV0IHZhbGlkYXRpb24uXG4vLyBGb3IgbnVtYmVyIGlucHV0cywgdGhlIGRpc3BsYXkgdmFsdWUgbG9zZXMgdHJhaWxpbmcgZGVjaW1hbCBwb2ludHMuIEZvciBlbWFpbCBpbnB1dHMsXG4vLyBDaHJvbWUgcmFpc2VzIFwiVGhlIHNwZWNpZmllZCB2YWx1ZSA8eD4gaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiLlxuLy9cbi8vIEhlcmUgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZWZhdWx0VmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQsIGF2b2lkaW5nIHRoZXNlIHByb2JsZW1zXG4vLyB3aGVuIHRoZSB1c2VyIGlzIGlucHV0dGluZyB0ZXh0XG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjUzXG5cblxuZnVuY3Rpb24gc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHR5cGUsIHZhbHVlKSB7XG4gIGlmICggLy8gRm9jdXNlZCBudW1iZXIgaW5wdXRzIHN5bmNocm9uaXplIG9uIGJsdXIuIFNlZSBDaGFuZ2VFdmVudFBsdWdpbi5qc1xuICB0eXBlICE9PSAnbnVtYmVyJyB8fCBnZXRBY3RpdmVFbGVtZW50KG5vZGUub3duZXJEb2N1bWVudCkgIT09IG5vZGUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuZGVmYXVsdFZhbHVlICE9PSB0b1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSBmYWxzZTtcbnZhciBkaWRXYXJuSW52YWxpZENoaWxkID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSBmYWxzZTtcbi8qKlxuICogSW1wbGVtZW50cyBhbiA8b3B0aW9uPiBob3N0IGNvbXBvbmVudCB0aGF0IHdhcm5zIHdoZW4gYHNlbGVjdGVkYCBpcyBzZXQuXG4gKi9cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgLy8gSWYgYSB2YWx1ZSBpcyBub3QgcHJvdmlkZWQsIHRoZW4gdGhlIGNoaWxkcmVuIG11c3QgYmUgc2ltcGxlLlxuICAgIGlmIChwcm9wcy52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnb2JqZWN0JyAmJiBwcm9wcy5jaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKHByb3BzLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkQ2hpbGQpIHtcbiAgICAgICAgICAgIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignQ2Fubm90IGluZmVyIHRoZSBvcHRpb24gdmFsdWUgb2YgY29tcGxleCBjaGlsZHJlbi4gJyArICdQYXNzIGEgYHZhbHVlYCBwcm9wIG9yIHVzZSBhIHBsYWluIHN0cmluZyBhcyBjaGlsZHJlbiB0byA8b3B0aW9uPi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgICAgIGlmICghZGlkV2FybkludmFsaWRJbm5lckhUTUwpIHtcbiAgICAgICAgICBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUGFzcyBhIGB2YWx1ZWAgcHJvcCBpZiB5b3Ugc2V0IGRhbmdlcm91c2x5SW5uZXJIVE1MIHNvIFJlYWN0IGtub3dzICcgKyAnd2hpY2ggdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBUT0RPOiBSZW1vdmUgc3VwcG9ydCBmb3IgYHNlbGVjdGVkYCBpbiA8b3B0aW9uPi5cblxuXG4gICAgaWYgKHByb3BzLnNlbGVjdGVkICE9IG51bGwgJiYgIWRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uKSB7XG4gICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIG9uIDxzZWxlY3Q+IGluc3RlYWQgb2YgJyArICdzZXR0aW5nIGBzZWxlY3RlZGAgb24gPG9wdGlvbj4uJyk7XG5cbiAgICAgIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICAvLyB2YWx1ZT1cIlwiIHNob3VsZCBtYWtlIGEgdmFsdWUgYXR0cmlidXRlICgjNjIxOSlcbiAgaWYgKHByb3BzLnZhbHVlICE9IG51bGwpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKSkpO1xuICB9XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxO1xuXG57XG4gIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7XG5cbiAgaWYgKG93bmVyTmFtZSkge1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgdmFsdWVQcm9wTmFtZXMgPSBbJ3ZhbHVlJywgJ2RlZmF1bHRWYWx1ZSddO1xuLyoqXG4gKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIGZvciBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqL1xuXG5mdW5jdGlvbiBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcykge1xuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygnc2VsZWN0JywgcHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZVByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbaV07XG5cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3BOYW1lSXNBcnJheSA9IGlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFwcm9wTmFtZUlzQXJyYXkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhbiBhcnJheSBpZiAnICsgJ2BtdWx0aXBsZWAgaXMgdHJ1ZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9IGVsc2UgaWYgKCFwcm9wcy5tdWx0aXBsZSAmJiBwcm9wTmFtZUlzQXJyYXkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciAnICsgJ3ZhbHVlIGlmIGBtdWx0aXBsZWAgaXMgZmFsc2UuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVPcHRpb25zKG5vZGUsIG11bHRpcGxlLCBwcm9wVmFsdWUsIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICB2YXIgb3B0aW9ucyA9IG5vZGUub3B0aW9ucztcblxuICBpZiAobXVsdGlwbGUpIHtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZXMgPSBwcm9wVmFsdWU7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWUgPSB7fTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIFByZWZpeCB0byBhdm9pZCBjaGFvcyB3aXRoIHNwZWNpYWwga2V5cy5cbiAgICAgIHNlbGVjdGVkVmFsdWVbJyQnICsgc2VsZWN0ZWRWYWx1ZXNbaV1dID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgb3B0aW9ucy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBzZWxlY3RlZCA9IHNlbGVjdGVkVmFsdWUuaGFzT3duUHJvcGVydHkoJyQnICsgb3B0aW9uc1tfaV0udmFsdWUpO1xuXG4gICAgICBpZiAob3B0aW9uc1tfaV0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RlZCAmJiBzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRG8gbm90IHNldCBgc2VsZWN0LnZhbHVlYCBhcyBleGFjdCBiZWhhdmlvciBpc24ndCBjb25zaXN0ZW50IGFjcm9zcyBhbGxcbiAgICAvLyBicm93c2VycyBmb3IgYWxsIGNhc2VzLlxuICAgIHZhciBfc2VsZWN0ZWRWYWx1ZSA9IHRvU3RyaW5nKGdldFRvU3RyaW5nVmFsdWUocHJvcFZhbHVlKSk7XG5cbiAgICB2YXIgZGVmYXVsdFNlbGVjdGVkID0gbnVsbDtcblxuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG9wdGlvbnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgaWYgKG9wdGlvbnNbX2kyXS52YWx1ZSA9PT0gX3NlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgb3B0aW9uc1tfaTJdLnNlbGVjdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgICAgb3B0aW9uc1tfaTJdLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgPT09IG51bGwgJiYgIW9wdGlvbnNbX2kyXS5kaXNhYmxlZCkge1xuICAgICAgICBkZWZhdWx0U2VsZWN0ZWQgPSBvcHRpb25zW19pMl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRTZWxlY3RlZCAhPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdFNlbGVjdGVkLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogSW1wbGVtZW50cyBhIDxzZWxlY3Q+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIG9wdGlvbmFsbHkgc2V0dGluZyB0aGVcbiAqIHByb3BzIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLiBJZiBgbXVsdGlwbGVgIGlzIGZhbHNlLCB0aGUgcHJvcCBtdXN0IGJlIGFcbiAqIHN0cmluZ2FibGUuIElmIGBtdWx0aXBsZWAgaXMgdHJ1ZSwgdGhlIHByb3AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdhYmxlcy5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBjaGFuZ2UgdGhlXG4gKiBzZWxlY3RlZCBvcHRpb24gd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIHJlbmRlcmVkIG9wdGlvbnMuXG4gKlxuICogSWYgaXQgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgb3B0aW9ucyB3aWxsIG5vdFxuICogdXBkYXRlIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9ucy4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBvcHRpb25zIHRvIHVwZGF0ZS5cbiAqXG4gKiBJZiBgZGVmYXVsdFZhbHVlYCBpcyBwcm92aWRlZCwgYW55IG9wdGlvbnMgd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVzIHdpbGwgYmVcbiAqIHNlbGVjdGVkLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIHdhc011bHRpcGxlOiAhIXByb3BzLm11bHRpcGxlXG4gIH07XG5cbiAge1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSkge1xuICAgICAgZXJyb3IoJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgbm9kZS5tdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0VXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB3YXNNdWx0aXBsZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAod2FzTXVsdGlwbGUgIT09ICEhcHJvcHMubXVsdGlwbGUpIHtcbiAgICAvLyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlzIHRvZ2dsZWQuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldmVydCB0aGUgc2VsZWN0IGJhY2sgdG8gaXRzIGRlZmF1bHQgdW5zZWxlY3RlZCBzdGF0ZS5cbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMubXVsdGlwbGUgPyBbXSA6ICcnLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbERlZmF1bHRWYWwgPSBmYWxzZTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHRleHRhcmVhPiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIGB2YWx1ZWAsIGFuZFxuICogYGRlZmF1bHRWYWx1ZWAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB0cmFkaXRpb25hbCBET00gQVBJIGJlY2F1c2UgdmFsdWUgaXNcbiAqIHVzdWFsbHkgc2V0IGFzIFBDREFUQSBjaGlsZHJlbi5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlXG4gKiB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbFxuICogbm90IHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IHZhbHVlLCB0aGUgcHJvcFxuICogYGRlZmF1bHRWYWx1ZWAgaWYgc3BlY2lmaWVkLCBvciB0aGUgY2hpbGRyZW4gY29udGVudCAoZGVwcmVjYXRlZCkuXG4gKi9cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBkb2VzIG5vdCBtYWtlIHNlbnNlIG9uIDx0ZXh0YXJlYT4uJyk7XG4gIH0gLy8gQWx3YXlzIHNldCBjaGlsZHJlbiB0byB0aGUgc2FtZSB0aGluZy4gSW4gSUU5LCB0aGUgc2VsZWN0aW9uIHJhbmdlIHdpbGxcbiAgLy8gZ2V0IHJlc2V0IGlmIGB0ZXh0Q29udGVudGAgaXMgbXV0YXRlZC4gIFdlIGNvdWxkIGFkZCBhIGNoZWNrIGluIHNldFRleHRDb250ZW50XG4gIC8vIHRvIG9ubHkgc2V0IHRoZSB2YWx1ZSBpZi93aGVuIHRoZSB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIG5vZGUgdmFsdWUgKHdoaWNoIHdvdWxkXG4gIC8vIGNvbXBsZXRlbHkgc29sdmUgdGhpcyBJRTkgYnVnKSwgYnV0IFNlYmFzdGlhbitTb3BoaWUgc2VlbWVkIHRvIGxpa2UgdGhpc1xuICAvLyBzb2x1dGlvbi4gVGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4gb3Igb2JqZWN0IHNvIHRoYXQncyB3aHkgaXQncyBmb3JjZWRcbiAgLy8gdG8gYmUgYSBzdHJpbmcuXG5cblxuICB2YXIgaG9zdFByb3BzID0gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgY2hpbGRyZW46IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpXG4gIH0pO1xuXG4gIHJldHVybiBob3N0UHJvcHM7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCd0ZXh0YXJlYScsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsRGVmYXVsdFZhbCkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGEgdGV4dGFyZWEgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnVGV4dGFyZWEgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHRleHRhcmVhICcgKyAnYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnKTtcblxuICAgICAgZGlkV2FyblZhbERlZmF1bHRWYWwgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbml0aWFsVmFsdWUgPSBwcm9wcy52YWx1ZTsgLy8gT25seSBib3RoZXIgZmV0Y2hpbmcgZGVmYXVsdCB2YWx1ZSBpZiB3ZSdyZSBnb2luZyB0byB1c2UgaXRcblxuICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuXG4gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignPHRleHRhcmVhPiBjYW4gb25seSBoYXZlIGF0IG1vc3Qgb25lIGNoaWxkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUoaW5pdGlhbFZhbHVlKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSk7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICB2YXIgbmV3VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7IC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG5cbiAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgJiYgbm9kZS5kZWZhdWx0VmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdFxuICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cblxuICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50OyAvLyBPbmx5IHNldCBub2RlLnZhbHVlIGlmIHRleHRDb250ZW50IGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZFxuICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZVxuICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMTUyNS9cblxuICBpZiAodGV4dENvbnRlbnQgPT09IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICBpZiAodGV4dENvbnRlbnQgIT09ICcnICYmIHRleHRDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKTtcbn1cblxudmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xudmFyIE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xudmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOyAvLyBBc3N1bWVzIHRoZXJlIGlzIG5vIHBhcmVudCBuYW1lc3BhY2UuXG5cbmZ1bmN0aW9uIGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N2Zyc6XG4gICAgICByZXR1cm4gU1ZHX05BTUVTUEFDRTtcblxuICAgIGNhc2UgJ21hdGgnOlxuICAgICAgcmV0dXJuIE1BVEhfTkFNRVNQQUNFO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGROYW1lc3BhY2UocGFyZW50TmFtZXNwYWNlLCB0eXBlKSB7XG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT0gbnVsbCB8fCBwYXJlbnROYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgLy8gTm8gKG9yIGRlZmF1bHQpIHBhcmVudCBuYW1lc3BhY2U6IHBvdGVudGlhbCBlbnRyeSBwb2ludC5cbiAgICByZXR1cm4gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PT0gU1ZHX05BTUVTUEFDRSAmJiB0eXBlID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyBXZSdyZSBsZWF2aW5nIFNWRy5cbiAgICByZXR1cm4gSFRNTF9OQU1FU1BBQ0U7XG4gIH0gLy8gQnkgZGVmYXVsdCwgcGFzcyBuYW1lc3BhY2UgYmVsb3cuXG5cblxuICByZXR1cm4gcGFyZW50TmFtZXNwYWNlO1xufVxuXG4vKiBnbG9iYWxzIE1TQXBwICovXG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gd2hpY2ggaGFzICd1bnNhZmUnIHByaXZpbGVnZXMgKHJlcXVpcmVkIGJ5IHdpbmRvd3M4IGFwcHMpXG4gKi9cbnZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBNU0FwcCAhPT0gJ3VuZGVmaW5lZCcgJiYgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jO1xuICB9XG59O1xuXG52YXIgcmV1c2FibGVTVkdDb250YWluZXI7XG4vKipcbiAqIFNldCB0aGUgaW5uZXJIVE1MIHByb3BlcnR5IG9mIGEgbm9kZVxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBzZXRJbm5lckhUTUwgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBodG1sKSB7XG4gIGlmIChub2RlLm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuXG4gICAgaWYgKCEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAgICAgLy8gbmV3IG1hcmt1cCBpbiBhIHRlbXAgbm9kZSBhbmQgdGhlbiBtb3ZlIHRoZSBjaGlsZCBub2RlcyBhY3Jvc3MgaW50b1xuICAgICAgLy8gdGhlIHRhcmdldCBub2RlXG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwudmFsdWVPZigpLnRvU3RyaW5nKCkgKyAnPC9zdmc+JztcbiAgICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xufSk7XG5cbi8qKlxuICogSFRNTCBub2RlVHlwZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqL1xudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xudmFyIERPQ1VNRU5UX05PREUgPSA5O1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXJcbiAqIHRvIHNldCB0aGUgYG5vZGVWYWx1ZWAgb2YgdGhlIFRleHQgbm9kZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBgLnRleHRDb250ZW50YCB3aGljaCB3aWxsIHJlbW92ZSB0aGUgZXhpc3Rpbmcgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkge1xuICBpZiAodGV4dCkge1xuICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59O1xuXG4vLyBMaXN0IGRlcml2ZWQgZnJvbSBHZWNrbyBzb3VyY2UgY29kZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iLzRlNjM4ZWZjNzEvbGF5b3V0L3N0eWxlL3Rlc3QvcHJvcGVydHlfZGF0YWJhc2UuanNcbnZhciBzaG9ydGhhbmRUb0xvbmdoYW5kID0ge1xuICBhbmltYXRpb246IFsnYW5pbWF0aW9uRGVsYXknLCAnYW5pbWF0aW9uRGlyZWN0aW9uJywgJ2FuaW1hdGlvbkR1cmF0aW9uJywgJ2FuaW1hdGlvbkZpbGxNb2RlJywgJ2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50JywgJ2FuaW1hdGlvbk5hbWUnLCAnYW5pbWF0aW9uUGxheVN0YXRlJywgJ2FuaW1hdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIGJhY2tncm91bmQ6IFsnYmFja2dyb3VuZEF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZENsaXAnLCAnYmFja2dyb3VuZENvbG9yJywgJ2JhY2tncm91bmRJbWFnZScsICdiYWNrZ3JvdW5kT3JpZ2luJywgJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWScsICdiYWNrZ3JvdW5kUmVwZWF0JywgJ2JhY2tncm91bmRTaXplJ10sXG4gIGJhY2tncm91bmRQb3NpdGlvbjogWydiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknXSxcbiAgYm9yZGVyOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCcsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJCbG9ja0VuZDogWydib3JkZXJCbG9ja0VuZENvbG9yJywgJ2JvcmRlckJsb2NrRW5kU3R5bGUnLCAnYm9yZGVyQmxvY2tFbmRXaWR0aCddLFxuICBib3JkZXJCbG9ja1N0YXJ0OiBbJ2JvcmRlckJsb2NrU3RhcnRDb2xvcicsICdib3JkZXJCbG9ja1N0YXJ0U3R5bGUnLCAnYm9yZGVyQmxvY2tTdGFydFdpZHRoJ10sXG4gIGJvcmRlckJvdHRvbTogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCddLFxuICBib3JkZXJDb2xvcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJUb3BDb2xvciddLFxuICBib3JkZXJJbWFnZTogWydib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lRW5kOiBbJ2JvcmRlcklubGluZUVuZENvbG9yJywgJ2JvcmRlcklubGluZUVuZFN0eWxlJywgJ2JvcmRlcklubGluZUVuZFdpZHRoJ10sXG4gIGJvcmRlcklubGluZVN0YXJ0OiBbJ2JvcmRlcklubGluZVN0YXJ0Q29sb3InLCAnYm9yZGVySW5saW5lU3RhcnRTdHlsZScsICdib3JkZXJJbmxpbmVTdGFydFdpZHRoJ10sXG4gIGJvcmRlckxlZnQ6IFsnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnXSxcbiAgYm9yZGVyUmFkaXVzOiBbJ2JvcmRlckJvdHRvbUxlZnRSYWRpdXMnLCAnYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMnLCAnYm9yZGVyVG9wTGVmdFJhZGl1cycsICdib3JkZXJUb3BSaWdodFJhZGl1cyddLFxuICBib3JkZXJSaWdodDogWydib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCddLFxuICBib3JkZXJTdHlsZTogWydib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJUb3BTdHlsZSddLFxuICBib3JkZXJUb3A6IFsnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgY29sdW1uUnVsZTogWydjb2x1bW5SdWxlQ29sb3InLCAnY29sdW1uUnVsZVN0eWxlJywgJ2NvbHVtblJ1bGVXaWR0aCddLFxuICBjb2x1bW5zOiBbJ2NvbHVtbkNvdW50JywgJ2NvbHVtbldpZHRoJ10sXG4gIGZsZXg6IFsnZmxleEJhc2lzJywgJ2ZsZXhHcm93JywgJ2ZsZXhTaHJpbmsnXSxcbiAgZmxleEZsb3c6IFsnZmxleERpcmVjdGlvbicsICdmbGV4V3JhcCddLFxuICBmb250OiBbJ2ZvbnRGYW1pbHknLCAnZm9udEZlYXR1cmVTZXR0aW5ncycsICdmb250S2VybmluZycsICdmb250TGFuZ3VhZ2VPdmVycmlkZScsICdmb250U2l6ZScsICdmb250U2l6ZUFkanVzdCcsICdmb250U3RyZXRjaCcsICdmb250U3R5bGUnLCAnZm9udFZhcmlhbnQnLCAnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbicsICdmb250V2VpZ2h0JywgJ2xpbmVIZWlnaHQnXSxcbiAgZm9udFZhcmlhbnQ6IFsnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbiddLFxuICBnYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkOiBbJ2dyaWRBdXRvQ29sdW1ucycsICdncmlkQXV0b0Zsb3cnLCAnZ3JpZEF1dG9Sb3dzJywgJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBncmlkQXJlYTogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCcsICdncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkQ29sdW1uOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0J10sXG4gIGdyaWRDb2x1bW5HYXA6IFsnY29sdW1uR2FwJ10sXG4gIGdyaWRHYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkUm93OiBbJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRSb3dHYXA6IFsncm93R2FwJ10sXG4gIGdyaWRUZW1wbGF0ZTogWydncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgbGlzdFN0eWxlOiBbJ2xpc3RTdHlsZUltYWdlJywgJ2xpc3RTdHlsZVBvc2l0aW9uJywgJ2xpc3RTdHlsZVR5cGUnXSxcbiAgbWFyZ2luOiBbJ21hcmdpbkJvdHRvbScsICdtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0JywgJ21hcmdpblRvcCddLFxuICBtYXJrZXI6IFsnbWFya2VyRW5kJywgJ21hcmtlck1pZCcsICdtYXJrZXJTdGFydCddLFxuICBtYXNrOiBbJ21hc2tDbGlwJywgJ21hc2tDb21wb3NpdGUnLCAnbWFza0ltYWdlJywgJ21hc2tNb2RlJywgJ21hc2tPcmlnaW4nLCAnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJywgJ21hc2tSZXBlYXQnLCAnbWFza1NpemUnXSxcbiAgbWFza1Bvc2l0aW9uOiBbJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWSddLFxuICBvdXRsaW5lOiBbJ291dGxpbmVDb2xvcicsICdvdXRsaW5lU3R5bGUnLCAnb3V0bGluZVdpZHRoJ10sXG4gIG92ZXJmbG93OiBbJ292ZXJmbG93WCcsICdvdmVyZmxvd1knXSxcbiAgcGFkZGluZzogWydwYWRkaW5nQm90dG9tJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nVG9wJ10sXG4gIHBsYWNlQ29udGVudDogWydhbGlnbkNvbnRlbnQnLCAnanVzdGlmeUNvbnRlbnQnXSxcbiAgcGxhY2VJdGVtczogWydhbGlnbkl0ZW1zJywgJ2p1c3RpZnlJdGVtcyddLFxuICBwbGFjZVNlbGY6IFsnYWxpZ25TZWxmJywgJ2p1c3RpZnlTZWxmJ10sXG4gIHRleHREZWNvcmF0aW9uOiBbJ3RleHREZWNvcmF0aW9uQ29sb3InLCAndGV4dERlY29yYXRpb25MaW5lJywgJ3RleHREZWNvcmF0aW9uU3R5bGUnXSxcbiAgdGV4dEVtcGhhc2lzOiBbJ3RleHRFbXBoYXNpc0NvbG9yJywgJ3RleHRFbXBoYXNpc1N0eWxlJ10sXG4gIHRyYW5zaXRpb246IFsndHJhbnNpdGlvbkRlbGF5JywgJ3RyYW5zaXRpb25EdXJhdGlvbicsICd0cmFuc2l0aW9uUHJvcGVydHknLCAndHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIHdvcmRXcmFwOiBbJ292ZXJmbG93V3JhcCddXG59O1xuXG4vKipcbiAqIENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRzIG9mIFwicHhcIi5cbiAqL1xudmFyIGlzVW5pdGxlc3NOdW1iZXIgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBhc3BlY3RSYXRpbzogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgY29sdW1uczogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRBcmVhOiB0cnVlLFxuICBncmlkUm93OiB0cnVlLFxuICBncmlkUm93RW5kOiB0cnVlLFxuICBncmlkUm93U3BhbjogdHJ1ZSxcbiAgZ3JpZFJvd1N0YXJ0OiB0cnVlLFxuICBncmlkQ29sdW1uOiB0cnVlLFxuICBncmlkQ29sdW1uRW5kOiB0cnVlLFxuICBncmlkQ29sdW1uU3BhbjogdHJ1ZSxcbiAgZ3JpZENvbHVtblN0YXJ0OiB0cnVlLFxuICBmb250V2VpZ2h0OiB0cnVlLFxuICBsaW5lQ2xhbXA6IHRydWUsXG4gIGxpbmVIZWlnaHQ6IHRydWUsXG4gIG9wYWNpdHk6IHRydWUsXG4gIG9yZGVyOiB0cnVlLFxuICBvcnBoYW5zOiB0cnVlLFxuICB0YWJTaXplOiB0cnVlLFxuICB3aWRvd3M6IHRydWUsXG4gIHpJbmRleDogdHJ1ZSxcbiAgem9vbTogdHJ1ZSxcbiAgLy8gU1ZHLXJlbGF0ZWQgcHJvcGVydGllc1xuICBmaWxsT3BhY2l0eTogdHJ1ZSxcbiAgZmxvb2RPcGFjaXR5OiB0cnVlLFxuICBzdG9wT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaGFycmF5OiB0cnVlLFxuICBzdHJva2VEYXNob2Zmc2V0OiB0cnVlLFxuICBzdHJva2VNaXRlcmxpbWl0OiB0cnVlLFxuICBzdHJva2VPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VXaWR0aDogdHJ1ZVxufTtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCB2ZW5kb3Itc3BlY2lmaWMgcHJlZml4LCBlZzogV2Via2l0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHN0eWxlIG5hbWUsIGVnOiB0cmFuc2l0aW9uRHVyYXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ30gc3R5bGUgbmFtZSBwcmVmaXhlZCB3aXRoIGBwcmVmaXhgLCBwcm9wZXJseSBjYW1lbENhc2VkLCBlZzpcbiAqIFdlYmtpdFRyYW5zaXRpb25EdXJhdGlvblxuICovXG5cbmZ1bmN0aW9uIHByZWZpeEtleShwcmVmaXgsIGtleSkge1xuICByZXR1cm4gcHJlZml4ICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cmluZygxKTtcbn1cbi8qKlxuICogU3VwcG9ydCBzdHlsZSBuYW1lcyB0aGF0IG1heSBjb21lIHBhc3NlZCBpbiBwcmVmaXhlZCBieSBhZGRpbmcgcGVybXV0YXRpb25zXG4gKiBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cblxuXG52YXIgcHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdtcycsICdNb3onLCAnTyddOyAvLyBVc2luZyBPYmplY3Qua2V5cyBoZXJlLCBvciBlbHNlIHRoZSB2YW5pbGxhIGZvci1pbiBsb29wIG1ha2VzIElFOCBnbyBpbnRvIGFuXG4vLyBpbmZpbml0ZSBsb29wLCBiZWNhdXNlIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIG5ld2x5IGFkZGVkIHByb3BzIHRvby5cblxuT2JqZWN0LmtleXMoaXNVbml0bGVzc051bWJlcikuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBwcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBpc1VuaXRsZXNzTnVtYmVyW3ByZWZpeEtleShwcmVmaXgsIHByb3ApXSA9IGlzVW5pdGxlc3NOdW1iZXJbcHJvcF07XG4gIH0pO1xufSk7XG5cbi8qKlxuICogQ29udmVydCBhIHZhbHVlIGludG8gdGhlIHByb3BlciBjc3Mgd3JpdGFibGUgdmFsdWUuIFRoZSBzdHlsZSBuYW1lIGBuYW1lYFxuICogc2hvdWxkIGJlIGxvZ2ljYWwgKG5vIGh5cGhlbnMpLCBhcyBzcGVjaWZpZWRcbiAqIGluIGBDU1NQcm9wZXJ0eS5pc1VuaXRsZXNzTnVtYmVyYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDU1MgcHJvcGVydHkgbmFtZSBzdWNoIGFzIGB0b3BNYXJnaW5gLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBDU1MgcHJvcGVydHkgdmFsdWUgc3VjaCBhcyBgMTBweGAuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgc3R5bGUgdmFsdWUgd2l0aCBkaW1lbnNpb25zIGFwcGxpZWQuXG4gKi9cblxuZnVuY3Rpb24gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShuYW1lLCB2YWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVUZXh0Rm9yQnJvd3NlcigpIGNhbGxzIGhlcmUgc2luY2UgdGhlXG4gIC8vIHdob2xlIHN0cmluZyB3aWxsIGJlIGVzY2FwZWQgd2hlbiB0aGUgYXR0cmlidXRlIGlzIGluamVjdGVkIGludG9cbiAgLy8gdGhlIG1hcmt1cC4gSWYgeW91IHByb3ZpZGUgdW5zYWZlIHVzZXIgZGF0YSBoZXJlIHRoZXkgY2FuIGluamVjdFxuICAvLyBhcmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBjb3VsZG4ndCByZXBybyB0aGlzKTpcbiAgLy8gaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9YU1NfRmlsdGVyX0V2YXNpb25fQ2hlYXRfU2hlZXRcbiAgLy8gaHR0cDovL3d3dy50aGVzcGFubmVyLmNvLnVrLzIwMDcvMTEvMjYvdWx0aW1hdGUteHNzLWNzcy1pbmplY3Rpb24vXG4gIC8vIFRoaXMgaXMgbm90IGFuIFhTUyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rpb24gaXNzdWVcbiAgLy8gd2hpY2ggaGFzIGxlYWQgdG8gYSBncmVhdGVyIGRpc2N1c3Npb24gYWJvdXQgaG93IHdlJ3JlIGdvaW5nIHRvXG4gIC8vIHRydXN0IFVSTHMgbW92aW5nIGZvcndhcmQuIFNlZSAjMjExNTkwMVxuICB2YXIgaXNFbXB0eSA9IHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xuXG4gIGlmIChpc0VtcHR5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKCFpc0N1c3RvbVByb3BlcnR5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IDAgJiYgIShpc1VuaXRsZXNzTnVtYmVyLmhhc093blByb3BlcnR5KG5hbWUpICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pKSB7XG4gICAgcmV0dXJuIHZhbHVlICsgJ3B4JzsgLy8gUHJlc3VtZXMgaW1wbGljaXQgJ3B4JyBzdWZmaXggZm9yIHVuaXRsZXNzIG51bWJlcnNcbiAgfVxuXG4gIHtcbiAgICBjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuICgnJyArIHZhbHVlKS50cmltKCk7XG59XG5cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqL1xuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUobmFtZSkge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKHVwcGVyY2FzZVBhdHRlcm4sICctJDEnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkXG4gIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/OndlYmtpdHxtb3p8bylbQS1aXS87XG4gIHZhciBtc1BhdHRlcm4kMSA9IC9eLW1zLS87XG4gIHZhciBoeXBoZW5QYXR0ZXJuID0gLy0oLikvZzsgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG5cbiAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XFxzKiQvO1xuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShoeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCAvLyBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gICAgLy8gKGh0dHA6Ly93d3cuYW5kaXNtaXRoLmNvbS9ibG9nLzIwMTIvMDIvbW9kZXJuaXpyLXByZWZpeGVkLyksIGFuIGAtbXNgIHByZWZpeFxuICAgIC8vIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC5cbiAgICBjYW1lbGl6ZShuYW1lLnJlcGxhY2UobXNQYXR0ZXJuJDEsICdtcy0nKSkpO1xuICB9O1xuXG4gIHZhciB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKFwiU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uLiBcIiArICdUcnkgXCIlczogJXNcIiBpbnN0ZWFkLicsIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5ID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvckluZmluaXR5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgSW5maW5pdHlgIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSQxID0gd2FyblZhbGlkU3R5bGU7XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogVGhpcyBjcmVhdGVzIGEgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgc3R5bGVcbiAqIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgYnkgc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBJdCBieS1wYXNzZXMgd2FybmluZ3MgYW5kXG4gKiBzZWN1cml0eSBjaGVja3Mgc28gaXQncyBub3Qgc2FmZSB0byB1c2UgdGhpcyB2YWx1ZSBmb3IgYW55dGhpbmcgb3RoZXIgdGhhblxuICogY29tcGFyaXNvbi4gSXQgaXMgb25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykge1xuICB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICB2YXIgZGVsaW1pdGVyID0gJyc7XG5cbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGVsaW1pdGVyICsgKGlzQ3VzdG9tUHJvcGVydHkgPyBzdHlsZU5hbWUgOiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKSkgKyAnOic7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpO1xuICAgICAgICBkZWxpbWl0ZXIgPSAnOyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcblxuICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcblxuICAgIHtcbiAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBpc0N1c3RvbVByb3BlcnR5KTtcblxuICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICAgIHN0eWxlTmFtZSA9ICdjc3NGbG9hdCc7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xufVxuLyoqXG4gKiBHaXZlbiB7Y29sb3I6ICdyZWQnLCBvdmVyZmxvdzogJ2hpZGRlbid9IHJldHVybnMge1xuICogICBjb2xvcjogJ2NvbG9yJyxcbiAqICAgb3ZlcmZsb3dYOiAnb3ZlcmZsb3cnLFxuICogICBvdmVyZmxvd1k6ICdvdmVyZmxvdycsXG4gKiB9LiBUaGlzIGNhbiBiZSByZWFkIGFzIFwidGhlIG92ZXJmbG93WSBwcm9wZXJ0eSB3YXMgc2V0IGJ5IHRoZSBvdmVyZmxvd1xuICogc2hvcnRoYW5kXCIuIFRoYXQgaXMsIHRoZSB2YWx1ZXMgYXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGVhY2ggd2FzIGRlcml2ZWQgZnJvbS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZXMpIHtcbiAgdmFyIGV4cGFuZGVkID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgIHZhciBsb25naGFuZHMgPSBzaG9ydGhhbmRUb0xvbmdoYW5kW2tleV0gfHwgW2tleV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdoYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwYW5kZWRbbG9uZ2hhbmRzW2ldXSA9IGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4vKipcbiAqIFdoZW4gbWl4aW5nIHNob3J0aGFuZCBhbmQgbG9uZ2hhbmQgcHJvcGVydHkgbmFtZXMsIHdlIHdhcm4gZHVyaW5nIHVwZGF0ZXMgaWZcbiAqIHdlIGV4cGVjdCBhbiBpbmNvcnJlY3QgcmVzdWx0IHRvIG9jY3VyLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YXJuIGZvcjpcbiAqXG4gKiBVcGRhdGluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBvdmVyd3JpdHRlbik6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2JheicsIGZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonXG4gKiBSZW1vdmluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBsb3N0IHRvbyk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJydcbiAqIFJlbW92aW5nIGEgbG9uZ2hhbmQgcHJvcGVydHkgKHNob3VsZCByZXZlcnQgdG8gc2hvcnRoYW5kOyBkb2Vzbid0KTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnZm9vJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJ1xuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFN0eWxlcykge1xuICB7XG4gICAgaWYgKCFuZXh0U3R5bGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGV4cGFuZGVkVXBkYXRlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZVVwZGF0ZXMpO1xuICAgIHZhciBleHBhbmRlZFN0eWxlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChuZXh0U3R5bGVzKTtcbiAgICB2YXIgd2FybmVkQWJvdXQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbEtleSA9IGV4cGFuZGVkVXBkYXRlc1trZXldO1xuICAgICAgdmFyIGNvcnJlY3RPcmlnaW5hbEtleSA9IGV4cGFuZGVkU3R5bGVzW2tleV07XG5cbiAgICAgIGlmIChjb3JyZWN0T3JpZ2luYWxLZXkgJiYgb3JpZ2luYWxLZXkgIT09IGNvcnJlY3RPcmlnaW5hbEtleSkge1xuICAgICAgICB2YXIgd2FybmluZ0tleSA9IG9yaWdpbmFsS2V5ICsgJywnICsgY29ycmVjdE9yaWdpbmFsS2V5O1xuXG4gICAgICAgIGlmICh3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2FybmVkQWJvdXRbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclcyBhIHN0eWxlIHByb3BlcnR5IGR1cmluZyByZXJlbmRlciAoJXMpIHdoZW4gYSAnICsgJ2NvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gJyArIFwiYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIFwiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIGxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cbnZhciBvbWl0dGVkQ2xvc2VUYWdzID0ge1xuICBhcmVhOiB0cnVlLFxuICBiYXNlOiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgaHI6IHRydWUsXG4gIGltZzogdHJ1ZSxcbiAgaW5wdXQ6IHRydWUsXG4gIGtleWdlbjogdHJ1ZSxcbiAgbGluazogdHJ1ZSxcbiAgbWV0YTogdHJ1ZSxcbiAgcGFyYW06IHRydWUsXG4gIHNvdXJjZTogdHJ1ZSxcbiAgdHJhY2s6IHRydWUsXG4gIHdicjogdHJ1ZSAvLyBOT1RFOiBtZW51aXRlbSdzIGNsb3NlIHRhZyBzaG91bGQgYmUgb21pdHRlZCwgYnV0IHRoYXQgY2F1c2VzIHByb2JsZW1zLlxuXG59O1xuXG4vLyBgb21pdHRlZENsb3NlVGFnc2AgZXhjZXB0IHRoYXQgYG1lbnVpdGVtYCBzaG91bGQgc3RpbGwgaGF2ZSBpdHMgY2xvc2luZyB0YWcuXG5cbnZhciB2b2lkRWxlbWVudFRhZ3MgPSBhc3NpZ24oe1xuICBtZW51aXRlbTogdHJ1ZVxufSwgb21pdHRlZENsb3NlVGFncyk7XG5cbnZhciBIVE1MID0gJ19faHRtbCc7XG5cbmZ1bmN0aW9uIGFzc2VydFZhbGlkUHJvcHModGFnLCBwcm9wcykge1xuICBpZiAoIXByb3BzKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIE5vdGUgdGhlIHVzZSBvZiBgPT1gIHdoaWNoIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWQuXG5cblxuICBpZiAodm9pZEVsZW1lbnRUYWdzW3RhZ10pIHtcbiAgICBpZiAocHJvcHMuY2hpbGRyZW4gIT0gbnVsbCB8fCBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGFnICsgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciBcIiArICd1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgIGlmIChwcm9wcy5jaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHNldCBvbmUgb2YgYGNoaWxkcmVuYCBvciBgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT09ICdvYmplY3QnIHx8ICEoSFRNTCBpbiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gJyArICdQbGVhc2UgdmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rhbmdlcm91c2x5LXNldC1pbm5lci1odG1sICcgKyAnZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmICghcHJvcHMuc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nICYmIHByb3BzLmNvbnRlbnRFZGl0YWJsZSAmJiBwcm9wcy5jaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgYGNvbnRlbnRFZGl0YWJsZWAgYW5kIGNvbnRhaW5zIGBjaGlsZHJlbmAgbWFuYWdlZCBieSAnICsgJ1JlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhhdCBub25lIG9mICcgKyAndGhvc2Ugbm9kZXMgYXJlIHVuZXhwZWN0ZWRseSBtb2RpZmllZCBvciBkdXBsaWNhdGVkLiBUaGlzIGlzICcgKyAncHJvYmFibHkgbm90IGludGVudGlvbmFsLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5zdHlsZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wcy5zdHlsZSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgJyArIFwibm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArICdlbSd9fSB3aGVuIFwiICsgJ3VzaW5nIEpTWC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0N1c3RvbUNvbXBvbmVudCh0YWdOYW1lLCBwcm9wcykge1xuICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuXG4gICAgLy8gV2UgZG9uJ3QgbWluZCB0aGlzIGxpc3QgdG9vIG11Y2ggYmVjYXVzZSB3ZSBleHBlY3QgaXQgdG8gbmV2ZXIgZ3Jvdy5cbiAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gdHJhY2sgdGhlIG5hbWVzcGFjZSBpbiBhIGZldyBwbGFjZXMgd2hpY2ggaXMgY29udm9sdXRlZC5cbiAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3VzdG9tLWVsZW1lbnRzLWNvcmUtY29uY2VwdHNcbiAgICBjYXNlICdhbm5vdGF0aW9uLXhtbCc6XG4gICAgY2FzZSAnY29sb3ItcHJvZmlsZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlJzpcbiAgICBjYXNlICdmb250LWZhY2Utc3JjJzpcbiAgICBjYXNlICdmb250LWZhY2UtdXJpJzpcbiAgICBjYXNlICdmb250LWZhY2UtZm9ybWF0JzpcbiAgICBjYXNlICdmb250LWZhY2UtbmFtZSc6XG4gICAgY2FzZSAnbWlzc2luZy1nbHlwaCc6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgYWxsb3dlZCBhdHRyaWJ1dGUgbGlzdCwgYmUgc3VyZSB0b1xuLy8gYWxzbyBhZGQgdGhlbSB0byB0aGlzIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3QgbmFtZVxuLy8gd2FybmluZ3MuXG52YXIgcG9zc2libGVTdGFuZGFyZE5hbWVzID0ge1xuICAvLyBIVE1MXG4gIGFjY2VwdDogJ2FjY2VwdCcsXG4gIGFjY2VwdGNoYXJzZXQ6ICdhY2NlcHRDaGFyc2V0JyxcbiAgJ2FjY2VwdC1jaGFyc2V0JzogJ2FjY2VwdENoYXJzZXQnLFxuICBhY2Nlc3NrZXk6ICdhY2Nlc3NLZXknLFxuICBhY3Rpb246ICdhY3Rpb24nLFxuICBhbGxvd2Z1bGxzY3JlZW46ICdhbGxvd0Z1bGxTY3JlZW4nLFxuICBhbHQ6ICdhbHQnLFxuICBhczogJ2FzJyxcbiAgYXN5bmM6ICdhc3luYycsXG4gIGF1dG9jYXBpdGFsaXplOiAnYXV0b0NhcGl0YWxpemUnLFxuICBhdXRvY29tcGxldGU6ICdhdXRvQ29tcGxldGUnLFxuICBhdXRvY29ycmVjdDogJ2F1dG9Db3JyZWN0JyxcbiAgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyxcbiAgYXV0b3BsYXk6ICdhdXRvUGxheScsXG4gIGF1dG9zYXZlOiAnYXV0b1NhdmUnLFxuICBjYXB0dXJlOiAnY2FwdHVyZScsXG4gIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLFxuICBjZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJyxcbiAgY2hhbGxlbmdlOiAnY2hhbGxlbmdlJyxcbiAgY2hhcnNldDogJ2NoYXJTZXQnLFxuICBjaGVja2VkOiAnY2hlY2tlZCcsXG4gIGNoaWxkcmVuOiAnY2hpbGRyZW4nLFxuICBjaXRlOiAnY2l0ZScsXG4gIGNsYXNzOiAnY2xhc3NOYW1lJyxcbiAgY2xhc3NpZDogJ2NsYXNzSUQnLFxuICBjbGFzc25hbWU6ICdjbGFzc05hbWUnLFxuICBjb2xzOiAnY29scycsXG4gIGNvbHNwYW46ICdjb2xTcGFuJyxcbiAgY29udGVudDogJ2NvbnRlbnQnLFxuICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnLFxuICBjb250ZXh0bWVudTogJ2NvbnRleHRNZW51JyxcbiAgY29udHJvbHM6ICdjb250cm9scycsXG4gIGNvbnRyb2xzbGlzdDogJ2NvbnRyb2xzTGlzdCcsXG4gIGNvb3JkczogJ2Nvb3JkcycsXG4gIGNyb3Nzb3JpZ2luOiAnY3Jvc3NPcmlnaW4nLFxuICBkYW5nZXJvdXNseXNldGlubmVyaHRtbDogJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJyxcbiAgZGF0YTogJ2RhdGEnLFxuICBkYXRldGltZTogJ2RhdGVUaW1lJyxcbiAgZGVmYXVsdDogJ2RlZmF1bHQnLFxuICBkZWZhdWx0Y2hlY2tlZDogJ2RlZmF1bHRDaGVja2VkJyxcbiAgZGVmYXVsdHZhbHVlOiAnZGVmYXVsdFZhbHVlJyxcbiAgZGVmZXI6ICdkZWZlcicsXG4gIGRpcjogJ2RpcicsXG4gIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBkaXNhYmxlcGljdHVyZWlucGljdHVyZTogJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJyxcbiAgZGlzYWJsZXJlbW90ZXBsYXliYWNrOiAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJyxcbiAgZG93bmxvYWQ6ICdkb3dubG9hZCcsXG4gIGRyYWdnYWJsZTogJ2RyYWdnYWJsZScsXG4gIGVuY3R5cGU6ICdlbmNUeXBlJyxcbiAgZW50ZXJrZXloaW50OiAnZW50ZXJLZXlIaW50JyxcbiAgZm9yOiAnaHRtbEZvcicsXG4gIGZvcm06ICdmb3JtJyxcbiAgZm9ybW1ldGhvZDogJ2Zvcm1NZXRob2QnLFxuICBmb3JtYWN0aW9uOiAnZm9ybUFjdGlvbicsXG4gIGZvcm1lbmN0eXBlOiAnZm9ybUVuY1R5cGUnLFxuICBmb3Jtbm92YWxpZGF0ZTogJ2Zvcm1Ob1ZhbGlkYXRlJyxcbiAgZm9ybXRhcmdldDogJ2Zvcm1UYXJnZXQnLFxuICBmcmFtZWJvcmRlcjogJ2ZyYW1lQm9yZGVyJyxcbiAgaGVhZGVyczogJ2hlYWRlcnMnLFxuICBoZWlnaHQ6ICdoZWlnaHQnLFxuICBoaWRkZW46ICdoaWRkZW4nLFxuICBoaWdoOiAnaGlnaCcsXG4gIGhyZWY6ICdocmVmJyxcbiAgaHJlZmxhbmc6ICdocmVmTGFuZycsXG4gIGh0bWxmb3I6ICdodG1sRm9yJyxcbiAgaHR0cGVxdWl2OiAnaHR0cEVxdWl2JyxcbiAgJ2h0dHAtZXF1aXYnOiAnaHR0cEVxdWl2JyxcbiAgaWNvbjogJ2ljb24nLFxuICBpZDogJ2lkJyxcbiAgaW1hZ2VzaXplczogJ2ltYWdlU2l6ZXMnLFxuICBpbWFnZXNyY3NldDogJ2ltYWdlU3JjU2V0JyxcbiAgaW5uZXJodG1sOiAnaW5uZXJIVE1MJyxcbiAgaW5wdXRtb2RlOiAnaW5wdXRNb2RlJyxcbiAgaW50ZWdyaXR5OiAnaW50ZWdyaXR5JyxcbiAgaXM6ICdpcycsXG4gIGl0ZW1pZDogJ2l0ZW1JRCcsXG4gIGl0ZW1wcm9wOiAnaXRlbVByb3AnLFxuICBpdGVtcmVmOiAnaXRlbVJlZicsXG4gIGl0ZW1zY29wZTogJ2l0ZW1TY29wZScsXG4gIGl0ZW10eXBlOiAnaXRlbVR5cGUnLFxuICBrZXlwYXJhbXM6ICdrZXlQYXJhbXMnLFxuICBrZXl0eXBlOiAna2V5VHlwZScsXG4gIGtpbmQ6ICdraW5kJyxcbiAgbGFiZWw6ICdsYWJlbCcsXG4gIGxhbmc6ICdsYW5nJyxcbiAgbGlzdDogJ2xpc3QnLFxuICBsb29wOiAnbG9vcCcsXG4gIGxvdzogJ2xvdycsXG4gIG1hbmlmZXN0OiAnbWFuaWZlc3QnLFxuICBtYXJnaW53aWR0aDogJ21hcmdpbldpZHRoJyxcbiAgbWFyZ2luaGVpZ2h0OiAnbWFyZ2luSGVpZ2h0JyxcbiAgbWF4OiAnbWF4JyxcbiAgbWF4bGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgbWVkaWE6ICdtZWRpYScsXG4gIG1lZGlhZ3JvdXA6ICdtZWRpYUdyb3VwJyxcbiAgbWV0aG9kOiAnbWV0aG9kJyxcbiAgbWluOiAnbWluJyxcbiAgbWlubGVuZ3RoOiAnbWluTGVuZ3RoJyxcbiAgbXVsdGlwbGU6ICdtdWx0aXBsZScsXG4gIG11dGVkOiAnbXV0ZWQnLFxuICBuYW1lOiAnbmFtZScsXG4gIG5vbW9kdWxlOiAnbm9Nb2R1bGUnLFxuICBub25jZTogJ25vbmNlJyxcbiAgbm92YWxpZGF0ZTogJ25vVmFsaWRhdGUnLFxuICBvcGVuOiAnb3BlbicsXG4gIG9wdGltdW06ICdvcHRpbXVtJyxcbiAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICBwbGFjZWhvbGRlcjogJ3BsYWNlaG9sZGVyJyxcbiAgcGxheXNpbmxpbmU6ICdwbGF5c0lubGluZScsXG4gIHBvc3RlcjogJ3Bvc3RlcicsXG4gIHByZWxvYWQ6ICdwcmVsb2FkJyxcbiAgcHJvZmlsZTogJ3Byb2ZpbGUnLFxuICByYWRpb2dyb3VwOiAncmFkaW9Hcm91cCcsXG4gIHJlYWRvbmx5OiAncmVhZE9ubHknLFxuICByZWZlcnJlcnBvbGljeTogJ3JlZmVycmVyUG9saWN5JyxcbiAgcmVsOiAncmVsJyxcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIHJldmVyc2VkOiAncmV2ZXJzZWQnLFxuICByb2xlOiAncm9sZScsXG4gIHJvd3M6ICdyb3dzJyxcbiAgcm93c3BhbjogJ3Jvd1NwYW4nLFxuICBzYW5kYm94OiAnc2FuZGJveCcsXG4gIHNjb3BlOiAnc2NvcGUnLFxuICBzY29wZWQ6ICdzY29wZWQnLFxuICBzY3JvbGxpbmc6ICdzY3JvbGxpbmcnLFxuICBzZWFtbGVzczogJ3NlYW1sZXNzJyxcbiAgc2VsZWN0ZWQ6ICdzZWxlY3RlZCcsXG4gIHNoYXBlOiAnc2hhcGUnLFxuICBzaXplOiAnc2l6ZScsXG4gIHNpemVzOiAnc2l6ZXMnLFxuICBzcGFuOiAnc3BhbicsXG4gIHNwZWxsY2hlY2s6ICdzcGVsbENoZWNrJyxcbiAgc3JjOiAnc3JjJyxcbiAgc3JjZG9jOiAnc3JjRG9jJyxcbiAgc3JjbGFuZzogJ3NyY0xhbmcnLFxuICBzcmNzZXQ6ICdzcmNTZXQnLFxuICBzdGFydDogJ3N0YXJ0JyxcbiAgc3RlcDogJ3N0ZXAnLFxuICBzdHlsZTogJ3N0eWxlJyxcbiAgc3VtbWFyeTogJ3N1bW1hcnknLFxuICB0YWJpbmRleDogJ3RhYkluZGV4JyxcbiAgdGFyZ2V0OiAndGFyZ2V0JyxcbiAgdGl0bGU6ICd0aXRsZScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgdXNlbWFwOiAndXNlTWFwJyxcbiAgdmFsdWU6ICd2YWx1ZScsXG4gIHdpZHRoOiAnd2lkdGgnLFxuICB3bW9kZTogJ3dtb2RlJyxcbiAgd3JhcDogJ3dyYXAnLFxuICAvLyBTVkdcbiAgYWJvdXQ6ICdhYm91dCcsXG4gIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsXG4gICdhY2NlbnQtaGVpZ2h0JzogJ2FjY2VudEhlaWdodCcsXG4gIGFjY3VtdWxhdGU6ICdhY2N1bXVsYXRlJyxcbiAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsXG4gIGFsaWdubWVudGJhc2VsaW5lOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJzogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICBhbXBsaXR1ZGU6ICdhbXBsaXR1ZGUnLFxuICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsXG4gICdhcmFiaWMtZm9ybSc6ICdhcmFiaWNGb3JtJyxcbiAgYXNjZW50OiAnYXNjZW50JyxcbiAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGV0eXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9yZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAnYXppbXV0aCcsXG4gIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZWxpbmVzaGlmdDogJ2Jhc2VsaW5lU2hpZnQnLFxuICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsXG4gIGJhc2Vwcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYm94OiAnYmJveCcsXG4gIGJlZ2luOiAnYmVnaW4nLFxuICBiaWFzOiAnYmlhcycsXG4gIGJ5OiAnYnknLFxuICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwaGVpZ2h0OiAnY2FwSGVpZ2h0JyxcbiAgJ2NhcC1oZWlnaHQnOiAnY2FwSGVpZ2h0JyxcbiAgY2xpcDogJ2NsaXAnLFxuICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgJ2NsaXAtcGF0aCc6ICdjbGlwUGF0aCcsXG4gIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY2xpcHJ1bGU6ICdjbGlwUnVsZScsXG4gICdjbGlwLXJ1bGUnOiAnY2xpcFJ1bGUnLFxuICBjb2xvcjogJ2NvbG9yJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICBjb2xvcnByb2ZpbGU6ICdjb2xvclByb2ZpbGUnLFxuICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLFxuICBjb2xvcnJlbmRlcmluZzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgJ2NvbG9yLXJlbmRlcmluZyc6ICdjb2xvclJlbmRlcmluZycsXG4gIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50c3R5bGV0eXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogJ2N1cnNvcicsXG4gIGN4OiAnY3gnLFxuICBjeTogJ2N5JyxcbiAgZDogJ2QnLFxuICBkYXRhdHlwZTogJ2RhdGF0eXBlJyxcbiAgZGVjZWxlcmF0ZTogJ2RlY2VsZXJhdGUnLFxuICBkZXNjZW50OiAnZGVzY2VudCcsXG4gIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogJ2RpcmVjdGlvbicsXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcbiAgZGl2aXNvcjogJ2Rpdmlzb3InLFxuICBkb21pbmFudGJhc2VsaW5lOiAnZG9taW5hbnRCYXNlbGluZScsXG4gICdkb21pbmFudC1iYXNlbGluZSc6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgZHVyOiAnZHVyJyxcbiAgZHg6ICdkeCcsXG4gIGR5OiAnZHknLFxuICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAnZWxldmF0aW9uJyxcbiAgZW5hYmxlYmFja2dyb3VuZDogJ2VuYWJsZUJhY2tncm91bmQnLFxuICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gIGVuZDogJ2VuZCcsXG4gIGV4cG9uZW50OiAnZXhwb25lbnQnLFxuICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6ICdmaWxsJyxcbiAgZmlsbG9wYWNpdHk6ICdmaWxsT3BhY2l0eScsXG4gICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLFxuICBmaWxscnVsZTogJ2ZpbGxSdWxlJyxcbiAgJ2ZpbGwtcnVsZSc6ICdmaWxsUnVsZScsXG4gIGZpbHRlcjogJ2ZpbHRlcicsXG4gIGZpbHRlcnJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlcnVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLFxuICAnZmxvb2Qtb3BhY2l0eSc6ICdmbG9vZE9wYWNpdHknLFxuICBmbG9vZGNvbG9yOiAnZmxvb2RDb2xvcicsXG4gICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJyxcbiAgZm9jdXNhYmxlOiAnZm9jdXNhYmxlJyxcbiAgZm9udGZhbWlseTogJ2ZvbnRGYW1pbHknLFxuICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsXG4gIGZvbnRzaXplOiAnZm9udFNpemUnLFxuICAnZm9udC1zaXplJzogJ2ZvbnRTaXplJyxcbiAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsXG4gICdmb250LXNpemUtYWRqdXN0JzogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgZm9udHN0cmV0Y2g6ICdmb250U3RyZXRjaCcsXG4gICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLFxuICBmb250c3R5bGU6ICdmb250U3R5bGUnLFxuICAnZm9udC1zdHlsZSc6ICdmb250U3R5bGUnLFxuICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JyxcbiAgJ2ZvbnQtdmFyaWFudCc6ICdmb250VmFyaWFudCcsXG4gIGZvbnR3ZWlnaHQ6ICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLFxuICBmb3JtYXQ6ICdmb3JtYXQnLFxuICBmcm9tOiAnZnJvbScsXG4gIGZ4OiAnZngnLFxuICBmeTogJ2Z5JyxcbiAgZzE6ICdnMScsXG4gIGcyOiAnZzInLFxuICBnbHlwaG5hbWU6ICdnbHlwaE5hbWUnLFxuICAnZ2x5cGgtbmFtZSc6ICdnbHlwaE5hbWUnLFxuICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICBnbHlwaG9yaWVudGF0aW9udmVydGljYWw6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50dHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6ICdoYW5naW5nJyxcbiAgaG9yaXphZHZ4OiAnaG9yaXpBZHZYJyxcbiAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsXG4gIGhvcml6b3JpZ2lueDogJ2hvcml6T3JpZ2luWCcsXG4gICdob3Jpei1vcmlnaW4teCc6ICdob3Jpek9yaWdpblgnLFxuICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJyxcbiAgaW1hZ2VyZW5kZXJpbmc6ICdpbWFnZVJlbmRlcmluZycsXG4gICdpbWFnZS1yZW5kZXJpbmcnOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICBpbjI6ICdpbjInLFxuICBpbjogJ2luJyxcbiAgaW5saXN0OiAnaW5saXN0JyxcbiAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JyxcbiAgazE6ICdrMScsXG4gIGsyOiAnazInLFxuICBrMzogJ2szJyxcbiAgazQ6ICdrNCcsXG4gIGs6ICdrJyxcbiAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsdW5pdGxlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAna2VybmluZycsXG4gIGtleXBvaW50czogJ2tleVBvaW50cycsXG4gIGtleXNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlcnNwYWNpbmc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ2xldHRlci1zcGFjaW5nJzogJ2xldHRlclNwYWNpbmcnLFxuICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsXG4gICdsaWdodGluZy1jb2xvcic6ICdsaWdodGluZ0NvbG9yJyxcbiAgbGltaXRpbmdjb25lYW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAnbG9jYWwnLFxuICBtYXJrZXJlbmQ6ICdtYXJrZXJFbmQnLFxuICAnbWFya2VyLWVuZCc6ICdtYXJrZXJFbmQnLFxuICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJtaWQ6ICdtYXJrZXJNaWQnLFxuICAnbWFya2VyLW1pZCc6ICdtYXJrZXJNaWQnLFxuICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JyxcbiAgJ21hcmtlci1zdGFydCc6ICdtYXJrZXJTdGFydCcsXG4gIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogJ21hc2snLFxuICBtYXNrY29udGVudHVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2t1bml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogJ21hdGhlbWF0aWNhbCcsXG4gIG1vZGU6ICdtb2RlJyxcbiAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6ICdvZmZzZXQnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG9wZXJhdG9yOiAnb3BlcmF0b3InLFxuICBvcmRlcjogJ29yZGVyJyxcbiAgb3JpZW50OiAnb3JpZW50JyxcbiAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsXG4gIG9yaWdpbjogJ29yaWdpbicsXG4gIG92ZXJmbG93OiAnb3ZlcmZsb3cnLFxuICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gICdvdmVybGluZS1wb3NpdGlvbic6ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgb3ZlcmxpbmV0aGlja25lc3M6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICBwYWludG9yZGVyOiAncGFpbnRPcmRlcicsXG4gICdwYWludC1vcmRlcic6ICdwYWludE9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZTEnLFxuICAncGFub3NlLTEnOiAncGFub3NlMScsXG4gIHBhdGhsZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJudHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm51bml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJyxcbiAgJ3BvaW50ZXItZXZlbnRzJzogJ3BvaW50ZXJFdmVudHMnLFxuICBwb2ludHM6ICdwb2ludHMnLFxuICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNhdHk6ICdwb2ludHNBdFknLFxuICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICBwcmVmaXg6ICdwcmVmaXgnLFxuICBwcmVzZXJ2ZWFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlYXNwZWN0cmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHByb3BlcnR5OiAncHJvcGVydHknLFxuICByOiAncicsXG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIHJlZng6ICdyZWZYJyxcbiAgcmVmeTogJ3JlZlknLFxuICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICAncmVuZGVyaW5nLWludGVudCc6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRleHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXNvdXJjZTogJ3Jlc291cmNlJyxcbiAgcmVzdGFydDogJ3Jlc3RhcnQnLFxuICByZXN1bHQ6ICdyZXN1bHQnLFxuICByZXN1bHRzOiAncmVzdWx0cycsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJ4OiAncngnLFxuICByeTogJ3J5JyxcbiAgc2NhbGU6ICdzY2FsZScsXG4gIHNlY3VyaXR5OiAnc2VjdXJpdHknLFxuICBzZWVkOiAnc2VlZCcsXG4gIHNoYXBlcmVuZGVyaW5nOiAnc2hhcGVSZW5kZXJpbmcnLFxuICAnc2hhcGUtcmVuZGVyaW5nJzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgc2xvcGU6ICdzbG9wZScsXG4gIHNwYWNpbmc6ICdzcGFjaW5nJyxcbiAgc3BlY3VsYXJjb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAnc3BlZWQnLFxuICBzcHJlYWRtZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkZGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6ICdzdGVtaCcsXG4gIHN0ZW12OiAnc3RlbXYnLFxuICBzdGl0Y2h0aWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcGNvbG9yOiAnc3RvcENvbG9yJyxcbiAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJyxcbiAgc3RvcG9wYWNpdHk6ICdzdG9wT3BhY2l0eScsXG4gICdzdG9wLW9wYWNpdHknOiAnc3RvcE9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbic6ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAnc3RyaW5nJyxcbiAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgc3Ryb2tlZGFzaG9mZnNldDogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gIHN0cm9rZWxpbmVjYXA6ICdzdHJva2VMaW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lY2FwJzogJ3N0cm9rZUxpbmVjYXAnLFxuICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJyxcbiAgJ3N0cm9rZS1saW5lam9pbic6ICdzdHJva2VMaW5lam9pbicsXG4gIHN0cm9rZW1pdGVybGltaXQ6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLFxuICBzdHJva2V3aWR0aDogJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZS13aWR0aCc6ICdzdHJva2VXaWR0aCcsXG4gIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JzogJ3N0cm9rZU9wYWNpdHknLFxuICBzdXBwcmVzc2NvbnRlbnRlZGl0YWJsZXdhcm5pbmc6ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLFxuICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLFxuICBzdXJmYWNlc2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1sYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldHg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0eTogJ3RhcmdldFknLFxuICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsXG4gICd0ZXh0LWFuY2hvcic6ICd0ZXh0QW5jaG9yJyxcbiAgdGV4dGRlY29yYXRpb246ICd0ZXh0RGVjb3JhdGlvbicsXG4gICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLFxuICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRleHRyZW5kZXJpbmc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLFxuICB0bzogJ3RvJyxcbiAgdHJhbnNmb3JtOiAndHJhbnNmb3JtJyxcbiAgdHlwZW9mOiAndHlwZW9mJyxcbiAgdTE6ICd1MScsXG4gIHUyOiAndTInLFxuICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgJ3VuZGVybGluZS1wb3NpdGlvbic6ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gIHVuZGVybGluZXRoaWNrbmVzczogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gIHVuaWNvZGU6ICd1bmljb2RlJyxcbiAgdW5pY29kZWJpZGk6ICd1bmljb2RlQmlkaScsXG4gICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLFxuICB1bmljb2RlcmFuZ2U6ICd1bmljb2RlUmFuZ2UnLFxuICAndW5pY29kZS1yYW5nZSc6ICd1bmljb2RlUmFuZ2UnLFxuICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsXG4gICd1bml0cy1wZXItZW0nOiAndW5pdHNQZXJFbScsXG4gIHVuc2VsZWN0YWJsZTogJ3Vuc2VsZWN0YWJsZScsXG4gIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLFxuICAndi1hbHBoYWJldGljJzogJ3ZBbHBoYWJldGljJyxcbiAgdmFsdWVzOiAndmFsdWVzJyxcbiAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JyxcbiAgJ3ZlY3Rvci1lZmZlY3QnOiAndmVjdG9yRWZmZWN0JyxcbiAgdmVyc2lvbjogJ3ZlcnNpb24nLFxuICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJyxcbiAgJ3ZlcnQtYWR2LXknOiAndmVydEFkdlknLFxuICB2ZXJ0b3JpZ2lueDogJ3ZlcnRPcmlnaW5YJyxcbiAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLFxuICB2ZXJ0b3JpZ2lueTogJ3ZlcnRPcmlnaW5ZJyxcbiAgJ3ZlcnQtb3JpZ2luLXknOiAndmVydE9yaWdpblknLFxuICB2aGFuZ2luZzogJ3ZIYW5naW5nJyxcbiAgJ3YtaGFuZ2luZyc6ICd2SGFuZ2luZycsXG4gIHZpZGVvZ3JhcGhpYzogJ3ZJZGVvZ3JhcGhpYycsXG4gICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsXG4gIHZpZXdib3g6ICd2aWV3Qm94JyxcbiAgdmlld3RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsXG4gIHZtYXRoZW1hdGljYWw6ICd2TWF0aGVtYXRpY2FsJyxcbiAgJ3YtbWF0aGVtYXRpY2FsJzogJ3ZNYXRoZW1hdGljYWwnLFxuICB2b2NhYjogJ3ZvY2FiJyxcbiAgd2lkdGhzOiAnd2lkdGhzJyxcbiAgd29yZHNwYWNpbmc6ICd3b3JkU3BhY2luZycsXG4gICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLFxuICB3cml0aW5nbW9kZTogJ3dyaXRpbmdNb2RlJyxcbiAgJ3dyaXRpbmctbW9kZSc6ICd3cml0aW5nTW9kZScsXG4gIHgxOiAneDEnLFxuICB4MjogJ3gyJyxcbiAgeDogJ3gnLFxuICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhoZWlnaHQ6ICd4SGVpZ2h0JyxcbiAgJ3gtaGVpZ2h0JzogJ3hIZWlnaHQnLFxuICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLFxuICAneGxpbms6YWN0dWF0ZSc6ICd4bGlua0FjdHVhdGUnLFxuICB4bGlua2FyY3JvbGU6ICd4bGlua0FyY3JvbGUnLFxuICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLFxuICB4bGlua2hyZWY6ICd4bGlua0hyZWYnLFxuICAneGxpbms6aHJlZic6ICd4bGlua0hyZWYnLFxuICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLFxuICAneGxpbms6cm9sZSc6ICd4bGlua1JvbGUnLFxuICB4bGlua3Nob3c6ICd4bGlua1Nob3cnLFxuICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLFxuICB4bGlua3RpdGxlOiAneGxpbmtUaXRsZScsXG4gICd4bGluazp0aXRsZSc6ICd4bGlua1RpdGxlJyxcbiAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJyxcbiAgJ3hsaW5rOnR5cGUnOiAneGxpbmtUeXBlJyxcbiAgeG1sYmFzZTogJ3htbEJhc2UnLFxuICAneG1sOmJhc2UnOiAneG1sQmFzZScsXG4gIHhtbGxhbmc6ICd4bWxMYW5nJyxcbiAgJ3htbDpsYW5nJzogJ3htbExhbmcnLFxuICB4bWxuczogJ3htbG5zJyxcbiAgJ3htbDpzcGFjZSc6ICd4bWxTcGFjZScsXG4gIHhtbG5zeGxpbms6ICd4bWxuc1hsaW5rJyxcbiAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLFxuICB4bWxzcGFjZTogJ3htbFNwYWNlJyxcbiAgeTE6ICd5MScsXG4gIHkyOiAneTInLFxuICB5OiAneScsXG4gIHljaGFubmVsc2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogJ3onLFxuICB6b29tYW5kcGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBhcmlhUHJvcGVydGllcyA9IHtcbiAgJ2FyaWEtY3VycmVudCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWRlc2NyaXB0aW9uJzogMCxcbiAgJ2FyaWEtZGV0YWlscyc6IDAsXG4gICdhcmlhLWRpc2FibGVkJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtaGlkZGVuJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtaW52YWxpZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWtleXNob3J0Y3V0cyc6IDAsXG4gICdhcmlhLWxhYmVsJzogMCxcbiAgJ2FyaWEtcm9sZWRlc2NyaXB0aW9uJzogMCxcbiAgLy8gV2lkZ2V0IEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXV0b2NvbXBsZXRlJzogMCxcbiAgJ2FyaWEtY2hlY2tlZCc6IDAsXG4gICdhcmlhLWV4cGFuZGVkJzogMCxcbiAgJ2FyaWEtaGFzcG9wdXAnOiAwLFxuICAnYXJpYS1sZXZlbCc6IDAsXG4gICdhcmlhLW1vZGFsJzogMCxcbiAgJ2FyaWEtbXVsdGlsaW5lJzogMCxcbiAgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJzogMCxcbiAgJ2FyaWEtb3JpZW50YXRpb24nOiAwLFxuICAnYXJpYS1wbGFjZWhvbGRlcic6IDAsXG4gICdhcmlhLXByZXNzZWQnOiAwLFxuICAnYXJpYS1yZWFkb25seSc6IDAsXG4gICdhcmlhLXJlcXVpcmVkJzogMCxcbiAgJ2FyaWEtc2VsZWN0ZWQnOiAwLFxuICAnYXJpYS1zb3J0JzogMCxcbiAgJ2FyaWEtdmFsdWVtYXgnOiAwLFxuICAnYXJpYS12YWx1ZW1pbic6IDAsXG4gICdhcmlhLXZhbHVlbm93JzogMCxcbiAgJ2FyaWEtdmFsdWV0ZXh0JzogMCxcbiAgLy8gTGl2ZSBSZWdpb24gQXR0cmlidXRlc1xuICAnYXJpYS1hdG9taWMnOiAwLFxuICAnYXJpYS1idXN5JzogMCxcbiAgJ2FyaWEtbGl2ZSc6IDAsXG4gICdhcmlhLXJlbGV2YW50JzogMCxcbiAgLy8gRHJhZy1hbmQtRHJvcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWRyb3BlZmZlY3QnOiAwLFxuICAnYXJpYS1ncmFiYmVkJzogMCxcbiAgLy8gUmVsYXRpb25zaGlwIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCc6IDAsXG4gICdhcmlhLWNvbGNvdW50JzogMCxcbiAgJ2FyaWEtY29saW5kZXgnOiAwLFxuICAnYXJpYS1jb2xzcGFuJzogMCxcbiAgJ2FyaWEtY29udHJvbHMnOiAwLFxuICAnYXJpYS1kZXNjcmliZWRieSc6IDAsXG4gICdhcmlhLWVycm9ybWVzc2FnZSc6IDAsXG4gICdhcmlhLWZsb3d0byc6IDAsXG4gICdhcmlhLWxhYmVsbGVkYnknOiAwLFxuICAnYXJpYS1vd25zJzogMCxcbiAgJ2FyaWEtcG9zaW5zZXQnOiAwLFxuICAnYXJpYS1yb3djb3VudCc6IDAsXG4gICdhcmlhLXJvd2luZGV4JzogMCxcbiAgJ2FyaWEtcm93c3Bhbic6IDAsXG4gICdhcmlhLXNldHNpemUnOiAwXG59O1xuXG52YXIgd2FybmVkUHJvcGVydGllcyA9IHt9O1xudmFyIHJBUklBID0gbmV3IFJlZ0V4cCgnXihhcmlhKS1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgckFSSUFDYW1lbCA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0YWdOYW1lLCBuYW1lKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAockFSSUFDYW1lbC50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgYXJpYU5hbWUgPSAnYXJpYS0nICsgbmFtZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIGNvcnJlY3ROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoYXJpYU5hbWUpID8gYXJpYU5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKGNvcnJlY3ROYW1lID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gQVJJQSBhdHRyaWJ1dGVzIGZvbGxvdyB0aGUgcGF0dGVybiBhcmlhLSogYW5kIG11c3QgYmUgbG93ZXJjYXNlLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IGNvcnJlY3ROYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIGNvcnJlY3ROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHtcbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHZhciBpbnZhbGlkUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KHR5cGUsIGtleSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcyk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVOdWxsID0gZmFsc2U7XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgaWYgKHR5cGUgIT09ICdpbnB1dCcgJiYgdHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0eXBlICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnICYmIHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgc3RyaW5nIHRvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgJyArICdmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICB2YXIgd2FybmVkUHJvcGVydGllcyQxID0ge307XG4gIHZhciBFVkVOVF9OQU1FX1JFR0VYID0gL15vbi4vO1xuICB2YXIgSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYID0gL15vblteQS1aXS87XG4gIHZhciByQVJJQSQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKS1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG4gIHZhciByQVJJQUNhbWVsJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKHRhZ05hbWUsIG5hbWUsIHZhbHVlLCBldmVudFJlZ2lzdHJ5KSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcyQxLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNpbicgfHwgbG93ZXJDYXNlZE5hbWUgPT09ICdvbmZvY3Vzb3V0Jykge1xuICAgICAgZXJyb3IoJ1JlYWN0IHVzZXMgb25Gb2N1cyBhbmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiAnICsgJ0FsbCBSZWFjdCBldmVudHMgYXJlIG5vcm1hbGl6ZWQgdG8gYnViYmxlLCBzbyBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQgJyArICdhcmUgbm90IG5lZWRlZC9zdXBwb3J0ZWQgYnkgUmVhY3QuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFdlIGNhbid0IHJlbHkgb24gdGhlIGV2ZW50IHN5c3RlbSBiZWluZyBpbmplY3RlZCBvbiB0aGUgc2VydmVyLlxuXG5cbiAgICBpZiAoZXZlbnRSZWdpc3RyeSAhPSBudWxsKSB7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IGV2ZW50UmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyxcbiAgICAgICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gZXZlbnRSZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdIDogbnVsbDtcblxuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGVycm9yKCdVbmtub3duIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gSXQgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAvLyBJZiBubyBldmVudCBwbHVnaW5zIGhhdmUgYmVlbiBpbmplY3RlZCwgd2UgYXJlIGluIGEgc2VydmVyIGVudmlyb25tZW50LlxuICAgICAgLy8gU28gd2UgY2FuJ3QgdGVsbCBpZiB0aGUgZXZlbnQgbmFtZSBpcyBjb3JyZWN0IGZvciBzdXJlLCBidXQgd2UgY2FuIGZpbHRlclxuICAgICAgLy8gb3V0IGtub3duIGJhZCBvbmVzIGxpa2UgYG9uY2xpY2tgLiBXZSBjYW4ndCBzdWdnZXN0IGEgc3BlY2lmaWMgcmVwbGFjZW1lbnQgdGhvdWdoLlxuICAgICAgaWYgKElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gJyArICdSZWFjdCBldmVudHMgdXNlIHRoZSBjYW1lbENhc2UgbmFtaW5nIGNvbnZlbnRpb24sIGZvciBleGFtcGxlIGBvbkNsaWNrYC4nLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gTGV0IHRoZSBBUklBIGF0dHJpYnV0ZSBob29rIHZhbGlkYXRlIEFSSUEgYXR0cmlidXRlc1xuXG5cbiAgICBpZiAockFSSUEkMS50ZXN0KG5hbWUpIHx8IHJBUklBQ2FtZWwkMS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdpbm5lcmh0bWwnKSB7XG4gICAgICBlcnJvcignRGlyZWN0bHkgc2V0dGluZyBwcm9wZXJ0eSBgaW5uZXJIVE1MYCBpcyBub3QgcGVybWl0dGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBsb29rdXAgZG9jdW1lbnRhdGlvbiBvbiBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnYXJpYScpIHtcbiAgICAgIGVycm9yKCdUaGUgYGFyaWFgIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBpbiBSZWFjdC4gJyArICdQYXNzIGluZGl2aWR1YWwgYGFyaWEtYCBhdHRyaWJ1dGVzIGluc3RlYWQuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdpcycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYSBgJXNgIGZvciBhIHN0cmluZyBhdHRyaWJ1dGUgYGlzYC4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCB0eXBlb2YgdmFsdWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsdWUpKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgTmFOIGZvciB0aGUgYCVzYCBhdHRyaWJ1dGUuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgbmFtZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuICAgIHZhciBpc1Jlc2VydmVkID0gcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDsgLy8gS25vd24gYXR0cmlidXRlcyBzaG91bGQgbWF0Y2ggdGhlIGNhc2luZyBzcGVjaWZpZWQgaW4gdGhlIHByb3BlcnR5IGNvbmZpZy5cblxuICAgIGlmIChwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICB2YXIgc3RhbmRhcmROYW1lID0gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXTtcblxuICAgICAgaWYgKHN0YW5kYXJkTmFtZSAhPT0gbmFtZSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBET00gcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgc3RhbmRhcmROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1Jlc2VydmVkICYmIG5hbWUgIT09IGxvd2VyQ2FzZWROYW1lKSB7XG4gICAgICAvLyBVbmtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIGhhdmUgbG93ZXJjYXNlIGNhc2luZyBzaW5jZSB0aGF0J3MgaG93IHRoZXlcbiAgICAgIC8vIHdpbGwgYmUgY2FzZWQgYW55d2F5IHdpdGggc2VydmVyIHJlbmRlcmluZy5cbiAgICAgIGVycm9yKCdSZWFjdCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGAlc2AgcHJvcCBvbiBhIERPTSBlbGVtZW50LiBJZiB5b3UgJyArICdpbnRlbnRpb25hbGx5IHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZSBET00gYXMgYSBjdXN0b20gJyArICdhdHRyaWJ1dGUsIHNwZWxsIGl0IGFzIGxvd2VyY2FzZSBgJXNgIGluc3RlYWQuICcgKyAnSWYgeW91IGFjY2lkZW50YWxseSBwYXNzZWQgaXQgZnJvbSBhIHBhcmVudCBjb21wb25lbnQsIHJlbW92ZSAnICsgJ2l0IGZyb20gdGhlIERPTSBlbGVtZW50LicsIG5hbWUsIGxvd2VyQ2FzZWROYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBlcnJvcignUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz1cIiVzXCIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LicsIHZhbHVlLCBuYW1lLCBuYW1lLCB2YWx1ZSwgbmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz1cIiVzXCIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lLCBuYW1lLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gTm93IHRoYXQgd2UndmUgdmFsaWRhdGVkIGNhc2luZywgZG8gbm90IHZhbGlkYXRlXG4gICAgLy8gZGF0YSB0eXBlcyBmb3IgcmVzZXJ2ZWQgcHJvcHNcblxuXG4gICAgaWYgKGlzUmVzZXJ2ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2FybiB3aGVuIGEga25vd24gYXR0cmlidXRlIGlzIGEgYmFkIHR5cGVcblxuXG4gICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIFdhcm4gd2hlbiBwYXNzaW5nIHRoZSBzdHJpbmdzICdmYWxzZScgb3IgJ3RydWUnIGludG8gYSBib29sZWFuIHByb3BcblxuXG4gICAgaWYgKCh2YWx1ZSA9PT0gJ2ZhbHNlJyB8fCB2YWx1ZSA9PT0gJ3RydWUnKSAmJiBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCB0aGUgc3RyaW5nIGAlc2AgZm9yIHRoZSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiAnICsgJyVzICcgKyAnRGlkIHlvdSBtZWFuICVzPXslc30/JywgdmFsdWUsIG5hbWUsIHZhbHVlID09PSAnZmFsc2UnID8gJ1RoZSBicm93c2VyIHdpbGwgaW50ZXJwcmV0IGl0IGFzIGEgdHJ1dGh5IHZhbHVlLicgOiAnQWx0aG91Z2ggdGhpcyB3b3JrcywgaXQgd2lsbCBub3Qgd29yayBhcyBleHBlY3RlZCBpZiB5b3UgcGFzcyB0aGUgc3RyaW5nIFwiZmFsc2VcIi4nLCBuYW1lLCB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxudmFyIHdhcm5Vbmtub3duUHJvcGVydGllcyA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSkge1xuICB7XG4gICAgdmFyIHVua25vd25Qcm9wcyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkkMSh0eXBlLCBrZXksIHByb3BzW2tleV0sIGV2ZW50UmVnaXN0cnkpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgdW5rbm93blByb3BzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSB1bmtub3duUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgICB9KS5qb2luKCcsICcpO1xuXG4gICAgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBwcm9wICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIGl0IGZyb20gdGhlIGVsZW1lbnQsICcgKyAnb3IgcGFzcyBhIHN0cmluZyBvciBudW1iZXIgdmFsdWUgdG8ga2VlcCBpdCBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciAnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfSBlbHNlIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID4gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWVzIGZvciBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSB0aGVtIGZyb20gdGhlIGVsZW1lbnQsICcgKyAnb3IgcGFzcyBhIHN0cmluZyBvciBudW1iZXIgdmFsdWUgdG8ga2VlcCB0aGVtIGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuVW5rbm93blByb3BlcnRpZXModHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpO1xufVxuXG52YXIgSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgPSAxO1xudmFyIElTX05PTl9ERUxFR0FURUQgPSAxIDw8IDE7XG52YXIgSVNfQ0FQVFVSRV9QSEFTRSA9IDEgPDwgMjtcbi8vIHNldCB0byBMRUdBQ1lfRkJfU1VQUE9SVC4gTEVHQUNZX0ZCX1NVUFBPUlQgb25seSBnZXRzIHNldCB3aGVuXG4vLyB3ZSBjYWxsIHdpbGxEZWZlckxhdGVyRm9yTGVnYWN5RkJTdXBwb3J0LCB0aHVzIG5vdCBiYWlsaW5nIG91dFxuLy8gd2lsbCByZXN1bHQgaW4gZW5kbGVzcyBjeWNsZXMgbGlrZSBhbiBpbmZpbml0ZSBsb29wLlxuLy8gV2UgYWxzbyBkb24ndCB3YW50IHRvIGRlZmVyIGR1cmluZyBldmVudCByZXBsYXlpbmcuXG5cbnZhciBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUyA9IElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFIHwgSVNfTk9OX0RFTEVHQVRFRCB8IElTX0NBUFRVUkVfUEhBU0U7XG5cbi8vIFRoaXMgZXhpc3RzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBSZWFjdERPTUV2ZW50UmVwbGF5aW5nXG4vLyBhbmQgRE9NUGx1Z2luRXZlbnRTeXN0ZW0uXG52YXIgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHNldFJlcGxheWluZ0V2ZW50KGV2ZW50KSB7XG4gIHtcbiAgICBpZiAoY3VycmVudFJlcGxheWluZ0V2ZW50ICE9PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBiZSBudWxsLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gZXZlbnQ7XG59XG5mdW5jdGlvbiByZXNldFJlcGxheWluZ0V2ZW50KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gbm90IGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsO1xufVxuZnVuY3Rpb24gaXNSZXBsYXlpbmdFdmVudChldmVudCkge1xuICByZXR1cm4gZXZlbnQgPT09IGN1cnJlbnRSZXBsYXlpbmdFdmVudDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBmcm9tIGEgbmF0aXZlIGJyb3dzZXIgZXZlbnQgYnkgYWNjb3VudGluZyBmb3JcbiAqIGluY29uc2lzdGVuY2llcyBpbiBicm93c2VyIERPTSBBUElzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge0RPTUV2ZW50VGFyZ2V0fSBUYXJnZXQgbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICAvLyBGYWxsYmFjayB0byBuYXRpdmVFdmVudC5zcmNFbGVtZW50IGZvciBJRTlcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwNlxuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93OyAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzXG5cbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfSAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLlxuICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbFxuXG5cbiAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7XG59XG5cbnZhciByZXN0b3JlSW1wbCA9IG51bGw7XG52YXIgcmVzdG9yZVRhcmdldCA9IG51bGw7XG52YXIgcmVzdG9yZVF1ZXVlID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFdlIHBlcmZvcm0gdGhpcyB0cmFuc2xhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2VcbiAgLy8gYWx3YXlzIHJlY2VpdmUgdGhlIGNvcnJlY3QgZmliZXIgaGVyZVxuICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0KTtcblxuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAvLyBVbm1vdW50ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIHJlc3RvcmVJbXBsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oKSBuZWVkcyB0byBiZSBjYWxsZWQgdG8gaGFuZGxlIGEgdGFyZ2V0IGZvciBjb250cm9sbGVkICcgKyAnZXZlbnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgdmFyIHN0YXRlTm9kZSA9IGludGVybmFsSW5zdGFuY2Uuc3RhdGVOb2RlOyAvLyBHdWFyZCBhZ2FpbnN0IEZpYmVyIGJlaW5nIHVubW91bnRlZC5cblxuICBpZiAoc3RhdGVOb2RlKSB7XG4gICAgdmFyIF9wcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUoc3RhdGVOb2RlKTtcblxuICAgIHJlc3RvcmVJbXBsKGludGVybmFsSW5zdGFuY2Uuc3RhdGVOb2RlLCBpbnRlcm5hbEluc3RhbmNlLnR5cGUsIF9wcm9wcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKGltcGwpIHtcbiAgcmVzdG9yZUltcGwgPSBpbXBsO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpIHtcbiAgaWYgKHJlc3RvcmVUYXJnZXQpIHtcbiAgICBpZiAocmVzdG9yZVF1ZXVlKSB7XG4gICAgICByZXN0b3JlUXVldWUucHVzaCh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN0b3JlUXVldWUgPSBbdGFyZ2V0XTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdG9yZVRhcmdldCA9IHRhcmdldDtcbiAgfVxufVxuZnVuY3Rpb24gbmVlZHNTdGF0ZVJlc3RvcmUoKSB7XG4gIHJldHVybiByZXN0b3JlVGFyZ2V0ICE9PSBudWxsIHx8IHJlc3RvcmVRdWV1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCkge1xuICBpZiAoIXJlc3RvcmVUYXJnZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdGFyZ2V0ID0gcmVzdG9yZVRhcmdldDtcbiAgdmFyIHF1ZXVlZFRhcmdldHMgPSByZXN0b3JlUXVldWU7XG4gIHJlc3RvcmVUYXJnZXQgPSBudWxsO1xuICByZXN0b3JlUXVldWUgPSBudWxsO1xuICByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpO1xuXG4gIGlmIChxdWV1ZWRUYXJnZXRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZWRUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN0b3JlU3RhdGVPZlRhcmdldChxdWV1ZWRUYXJnZXRzW2ldKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gdGhlIHJlbmRlcmVyLiBTdWNoIGFzIHdoZW4gd2UncmUgZGlzcGF0Y2hpbmcgZXZlbnRzIG9yIGlmIHRoaXJkIHBhcnR5XG4vLyBsaWJyYXJpZXMgbmVlZCB0byBjYWxsIGJhdGNoZWRVcGRhdGVzLiBFdmVudHVhbGx5LCB0aGlzIEFQSSB3aWxsIGdvIGF3YXkgd2hlblxuLy8gZXZlcnl0aGluZyBpcyBiYXRjaGVkIGJ5IGRlZmF1bHQuIFdlJ2xsIHRoZW4gaGF2ZSBhIHNpbWlsYXIgQVBJIHRvIG9wdC1vdXQgb2Zcbi8vIHNjaGVkdWxlZCB3b3JrIGFuZCBpbnN0ZWFkIGRvIHN5bmNocm9ub3VzIHdvcmsuXG4vLyBEZWZhdWx0c1xuXG52YXIgYmF0Y2hlZFVwZGF0ZXNJbXBsID0gZnVuY3Rpb24gKGZuLCBib29ra2VlcGluZykge1xuICByZXR1cm4gZm4oYm9va2tlZXBpbmcpO1xufTtcblxudmFyIGZsdXNoU3luY0ltcGwgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZpbmlzaEV2ZW50SGFuZGxlcigpIHtcbiAgLy8gSGVyZSB3ZSB3YWl0IHVudGlsIGFsbCB1cGRhdGVzIGhhdmUgcHJvcGFnYXRlZCwgd2hpY2ggaXMgaW1wb3J0YW50XG4gIC8vIHdoZW4gdXNpbmcgY29udHJvbGxlZCBjb21wb25lbnRzIHdpdGhpbiBsYXllcnM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OFxuICAvLyBUaGVuIHdlIHJlc3RvcmUgc3RhdGUgb2YgYW55IGNvbnRyb2xsZWQgY29tcG9uZW50LlxuICB2YXIgY29udHJvbGxlZENvbXBvbmVudHNIYXZlUGVuZGluZ1VwZGF0ZXMgPSBuZWVkc1N0YXRlUmVzdG9yZSgpO1xuXG4gIGlmIChjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcykge1xuICAgIC8vIElmIGEgY29udHJvbGxlZCBldmVudCB3YXMgZmlyZWQsIHdlIG1heSBuZWVkIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mXG4gICAgLy8gdGhlIERPTSBub2RlIGJhY2sgdG8gdGhlIGNvbnRyb2xsZWQgdmFsdWUuIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gUmVhY3RcbiAgICAvLyBiYWlscyBvdXQgb2YgdGhlIHVwZGF0ZSB3aXRob3V0IHRvdWNoaW5nIHRoZSBET00uXG4gICAgLy8gVE9ETzogUmVzdG9yZSBzdGF0ZSBpbiB0aGUgbWljcm90YXNrLCBhZnRlciB0aGUgZGlzY3JldGUgdXBkYXRlcyBmbHVzaCxcbiAgICAvLyBpbnN0ZWFkIG9mIGVhcmx5IGZsdXNoaW5nIHRoZW0gaGVyZS5cbiAgICBmbHVzaFN5bmNJbXBsKCk7XG4gICAgcmVzdG9yZVN0YXRlSWZOZWVkZWQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyhmbiwgYSwgYikge1xuICBpZiAoaXNJbnNpZGVFdmVudEhhbmRsZXIpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYSwgYik7XG4gIH1cblxuICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYmF0Y2hlZFVwZGF0ZXNJbXBsKGZuLCBhLCBiKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xuICAgIGZpbmlzaEV2ZW50SGFuZGxlcigpO1xuICB9XG59IC8vIFRPRE86IFJlcGxhY2Ugd2l0aCBmbHVzaFN5bmNcbmZ1bmN0aW9uIHNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oX2JhdGNoZWRVcGRhdGVzSW1wbCwgX2Rpc2NyZXRlVXBkYXRlc0ltcGwsIF9mbHVzaFN5bmNJbXBsKSB7XG4gIGJhdGNoZWRVcGRhdGVzSW1wbCA9IF9iYXRjaGVkVXBkYXRlc0ltcGw7XG4gIGZsdXNoU3luY0ltcGwgPSBfZmx1c2hTeW5jSW1wbDtcbn1cblxuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHtcbiAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnO1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmV2ZW50TW91c2VFdmVudChuYW1lLCB0eXBlLCBwcm9wcykge1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdvbkNsaWNrJzpcbiAgICBjYXNlICdvbkNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGljayc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VEb3duJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bkNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZUNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VVcCc6XG4gICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZUVudGVyJzpcbiAgICAgIHJldHVybiAhIShwcm9wcy5kaXNhYmxlZCAmJiBpc0ludGVyYWN0aXZlKHR5cGUpKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAqIEByZXR1cm4gez9mdW5jdGlvbn0gVGhlIHN0b3JlZCBjYWxsYmFjay5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgdmFyIHN0YXRlTm9kZSA9IGluc3Quc3RhdGVOb2RlO1xuXG4gIGlmIChzdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzIChleDogb25sb2FkIGV2ZW50cyBpbiBpbmNyZW1lbnRhbCBtb2RlKS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUoc3RhdGVOb2RlKTtcblxuICBpZiAocHJvcHMgPT09IG51bGwpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gcHJvcHNbcmVnaXN0cmF0aW9uTmFtZV07XG5cbiAgaWYgKHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGluc3QudHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlzdGVuZXIgJiYgdHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgYFwiICsgcmVnaXN0cmF0aW9uTmFtZSArIFwiYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGBcIiArIHR5cGVvZiBsaXN0ZW5lciArIFwiYCB0eXBlLlwiKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxudmFyIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gZmFsc2U7IC8vIENoZWNrIGlmIGJyb3dzZXIgc3VwcG9ydCBldmVudHMgd2l0aCBwYXNzaXZlIGxpc3RlbmVyc1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXIjU2FmZWx5X2RldGVjdGluZ19vcHRpb25fc3VwcG9ydFxuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHRyeSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7fTsgLy8gJEZsb3dGaXhNZTogSWdub3JlIEZsb3cgY29tcGxhaW5pbmcgYWJvdXQgbmVlZGluZyBhIHZhbHVlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9ucywgJ3Bhc3NpdmUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZChuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBmdW5jQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG5cbiAgdHJ5IHtcbiAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICB9XG59XG5cbnZhciBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZDtcblxue1xuICAvLyBJbiBERVYgbW9kZSwgd2Ugc3dhcCBvdXQgaW52b2tlR3VhcmRlZENhbGxiYWNrIGZvciBhIHNwZWNpYWwgdmVyc2lvblxuICAvLyB0aGF0IHBsYXlzIG1vcmUgbmljZWx5IHdpdGggdGhlIGJyb3dzZXIncyBEZXZUb29scy4gVGhlIGlkZWEgaXMgdG8gcHJlc2VydmVcbiAgLy8gXCJQYXVzZSBvbiBleGNlcHRpb25zXCIgYmVoYXZpb3IuIEJlY2F1c2UgUmVhY3Qgd3JhcHMgYWxsIHVzZXItcHJvdmlkZWRcbiAgLy8gZnVuY3Rpb25zIGluIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYW5kIHRoZSBwcm9kdWN0aW9uIHZlcnNpb24gb2ZcbiAgLy8gaW52b2tlR3VhcmRlZENhbGxiYWNrIHVzZXMgYSB0cnktY2F0Y2gsIGFsbCB1c2VyIGV4Y2VwdGlvbnMgYXJlIHRyZWF0ZWRcbiAgLy8gbGlrZSBjYXVnaHQgZXhjZXB0aW9ucywgYW5kIHRoZSBEZXZUb29scyB3b24ndCBwYXVzZSB1bmxlc3MgdGhlIGRldmVsb3BlclxuICAvLyB0YWtlcyB0aGUgZXh0cmEgc3RlcCBvZiBlbmFibGluZyBwYXVzZSBvbiBjYXVnaHQgZXhjZXB0aW9ucy4gVGhpcyBpc1xuICAvLyB1bmludHVpdGl2ZSwgdGhvdWdoLCBiZWNhdXNlIGV2ZW4gdGhvdWdoIFJlYWN0IGhhcyBjYXVnaHQgdGhlIGVycm9yLCBmcm9tXG4gIC8vIHRoZSBkZXZlbG9wZXIncyBwZXJzcGVjdGl2ZSwgdGhlIGVycm9yIGlzIHVuY2F1Z2h0LlxuICAvL1xuICAvLyBUbyBwcmVzZXJ2ZSB0aGUgZXhwZWN0ZWQgXCJQYXVzZSBvbiBleGNlcHRpb25zXCIgYmVoYXZpb3IsIHdlIGRvbid0IHVzZSBhXG4gIC8vIHRyeS1jYXRjaCBpbiBERVYuIEluc3RlYWQsIHdlIHN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggYSBmYWtlIGV2ZW50IHRvIGEgZmFrZVxuICAvLyBET00gbm9kZSwgYW5kIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgZnJvbSBpbnNpZGUgYW4gZXZlbnQgaGFuZGxlclxuICAvLyBmb3IgdGhhdCBmYWtlIGV2ZW50LiBJZiB0aGUgY2FsbGJhY2sgdGhyb3dzLCB0aGUgZXJyb3IgaXMgXCJjYXB0dXJlZFwiIHVzaW5nXG4gIC8vIGEgZ2xvYmFsIGV2ZW50IGhhbmRsZXIuIEJ1dCBiZWNhdXNlIHRoZSBlcnJvciBoYXBwZW5zIGluIGEgZGlmZmVyZW50XG4gIC8vIGV2ZW50IGxvb3AgY29udGV4dCwgaXQgZG9lcyBub3QgaW50ZXJydXB0IHRoZSBub3JtYWwgcHJvZ3JhbSBmbG93LlxuICAvLyBFZmZlY3RpdmVseSwgdGhpcyBnaXZlcyB1cyB0cnktY2F0Y2ggYmVoYXZpb3Igd2l0aG91dCBhY3R1YWxseSB1c2luZ1xuICAvLyB0cnktY2F0Y2guIE5lYXQhXG4gIC8vIENoZWNrIHRoYXQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEFQSXMgd2UgbmVlZCB0byBpbXBsZW1lbnQgb3VyIHNwZWNpYWxcbiAgLy8gREVWIHZlcnNpb24gb2YgaW52b2tlR3VhcmRlZENhbGxiYWNrXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmFrZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyZWFjdCcpO1xuXG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja0RldihuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICAvLyBJZiBkb2N1bWVudCBkb2Vzbid0IGV4aXN0IHdlIGtub3cgZm9yIHN1cmUgd2Ugd2lsbCBjcmFzaCBpbiB0aGlzIG1ldGhvZFxuICAgICAgLy8gd2hlbiB3ZSBjYWxsIGRvY3VtZW50LmNyZWF0ZUV2ZW50KCkuIEhvd2V2ZXIgdGhpcyBjYW4gY2F1c2UgY29uZnVzaW5nXG4gICAgICAvLyBlcnJvcnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9jcmVhdGUtcmVhY3QtYXBwL2lzc3Vlcy8zNDgyXG4gICAgICAvLyBTbyB3ZSBwcmVlbXB0aXZlbHkgdGhyb3cgd2l0aCBhIGJldHRlciBtZXNzYWdlIGluc3RlYWQuXG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCBkb2N1bWVudCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgZG9jdW1lbnRgIGdsb2JhbCB3YXMgZGVmaW5lZCB3aGVuIFJlYWN0IHdhcyBpbml0aWFsaXplZCwgYnV0IGlzIG5vdCAnICsgJ2RlZmluZWQgYW55bW9yZS4gVGhpcyBjYW4gaGFwcGVuIGluIGEgdGVzdCBlbnZpcm9ubWVudCBpZiBhIGNvbXBvbmVudCAnICsgJ3NjaGVkdWxlcyBhbiB1cGRhdGUgZnJvbSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGJ1dCB0aGUgdGVzdCBoYXMgYWxyZWFkeSAnICsgJ2ZpbmlzaGVkIHJ1bm5pbmcuIFRvIHNvbHZlIHRoaXMsIHlvdSBjYW4gZWl0aGVyIHVubW91bnQgdGhlIGNvbXBvbmVudCBhdCAnICsgJ3RoZSBlbmQgb2YgeW91ciB0ZXN0IChhbmQgZW5zdXJlIHRoYXQgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGdldCAnICsgJ2NhbmNlbGVkIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGApLCBvciB5b3UgY2FuIGNoYW5nZSB0aGUgdGVzdCBpdHNlbGYgJyArICd0byBiZSBhc3luY2hyb25vdXMuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgIHZhciBkaWRDYWxsID0gZmFsc2U7IC8vIEtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuIFdlXG4gICAgICAvLyBzZXQgdGhpcyB0byB0cnVlIGF0IHRoZSBiZWdpbm5pbmcsIHRoZW4gc2V0IGl0IHRvIGZhbHNlIHJpZ2h0IGFmdGVyXG4gICAgICAvLyBjYWxsaW5nIHRoZSBmdW5jdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIGVycm9ycywgYGRpZEVycm9yYCB3aWxsIG5ldmVyIGJlXG4gICAgICAvLyBzZXQgdG8gZmFsc2UuIFRoaXMgc3RyYXRlZ3kgd29ya3MgZXZlbiBpZiB0aGUgYnJvd3NlciBpcyBmbGFreSBhbmRcbiAgICAgIC8vIGZhaWxzIHRvIGNhbGwgb3VyIGdsb2JhbCBlcnJvciBoYW5kbGVyLCBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVseSBvblxuICAgICAgLy8gdGhlIGVycm9yIGV2ZW50IGF0IGFsbC5cblxuICAgICAgdmFyIGRpZEVycm9yID0gdHJ1ZTsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHZhbHVlIG9mIHdpbmRvdy5ldmVudCBzbyB0aGF0IHdlIGNhbiByZXNldCBpdFxuICAgICAgLy8gZHVyaW5nIHRoZSBjYWxsYmFjayB0byBsZXQgdXNlciBjb2RlIGFjY2VzcyB3aW5kb3cuZXZlbnQgaW4gdGhlXG4gICAgICAvLyBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQuXG5cbiAgICAgIHZhciB3aW5kb3dFdmVudCA9IHdpbmRvdy5ldmVudDsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIGRlc2NyaXB0b3Igb2Ygd2luZG93LmV2ZW50IHRvIHJlc3RvcmUgaXQgYWZ0ZXIgZXZlbnRcbiAgICAgIC8vIGRpc3BhdGNoaW5nOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjg4XG5cbiAgICAgIHZhciB3aW5kb3dFdmVudERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2V2ZW50Jyk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlc3RvcmVBZnRlckRpc3BhdGNoKCkge1xuICAgICAgICAvLyBXZSBpbW1lZGlhdGVseSByZW1vdmUgdGhlIGNhbGxiYWNrIGZyb20gZXZlbnQgbGlzdGVuZXJzIHNvIHRoYXRcbiAgICAgICAgLy8gbmVzdGVkIGBpbnZva2VHdWFyZGVkQ2FsbGJhY2tgIGNhbGxzIGRvIG5vdCBjbGFzaC4gT3RoZXJ3aXNlLCBhXG4gICAgICAgIC8vIG5lc3RlZCBjYWxsIHdvdWxkIHRyaWdnZXIgdGhlIGZha2UgZXZlbnQgaGFuZGxlcnMgb2YgYW55IGNhbGwgaGlnaGVyXG4gICAgICAgIC8vIGluIHRoZSBzdGFjay5cbiAgICAgICAgZmFrZU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTsgLy8gV2UgY2hlY2sgZm9yIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSB0byBwcmV2ZW50IHRoZVxuICAgICAgICAvLyB3aW5kb3cuZXZlbnQgYXNzaWdubWVudCBpbiBib3RoIElFIDw9IDEwIGFzIHRoZXkgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgLy8gXCJNZW1iZXIgbm90IGZvdW5kXCIgaW4gc3RyaWN0IG1vZGUsIGFuZCBpbiBGaXJlZm94IHdoaWNoIGRvZXMgbm90XG4gICAgICAgIC8vIHN1cHBvcnQgd2luZG93LmV2ZW50LlxuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmV2ZW50ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykpIHtcbiAgICAgICAgICB3aW5kb3cuZXZlbnQgPSB3aW5kb3dFdmVudDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYW4gZXZlbnQgaGFuZGxlciBmb3Igb3VyIGZha2UgZXZlbnQuIFdlIHdpbGwgc3luY2hyb25vdXNseVxuICAgICAgLy8gZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQgdXNpbmcgYGRpc3BhdGNoRXZlbnRgLiBJbnNpZGUgdGhlIGhhbmRsZXIsIHdlXG4gICAgICAvLyBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrLlxuXG5cbiAgICAgIHZhciBmdW5jQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG5cbiAgICAgIGZ1bmN0aW9uIGNhbGxDYWxsYmFjaygpIHtcbiAgICAgICAgZGlkQ2FsbCA9IHRydWU7XG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICAgICAgICBkaWRFcnJvciA9IGZhbHNlO1xuICAgICAgfSAvLyBDcmVhdGUgYSBnbG9iYWwgZXJyb3IgZXZlbnQgaGFuZGxlci4gV2UgdXNlIHRoaXMgdG8gY2FwdHVyZSB0aGUgdmFsdWVcbiAgICAgIC8vIHRoYXQgd2FzIHRocm93bi4gSXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgZXJyb3IgaGFuZGxlciB3aWxsIGZpcmUgbW9yZVxuICAgICAgLy8gdGhhbiBvbmNlOyBmb3IgZXhhbXBsZSwgaWYgbm9uLVJlYWN0IGNvZGUgYWxzbyBjYWxscyBgZGlzcGF0Y2hFdmVudGBcbiAgICAgIC8vIGFuZCBhIGhhbmRsZXIgZm9yIHRoYXQgZXZlbnQgdGhyb3dzLiBXZSBzaG91bGQgYmUgcmVzaWxpZW50IHRvIG1vc3Qgb2ZcbiAgICAgIC8vIHRob3NlIGNhc2VzLiBFdmVuIGlmIG91ciBlcnJvciBldmVudCBoYW5kbGVyIGZpcmVzIG1vcmUgdGhhbiBvbmNlLCB0aGVcbiAgICAgIC8vIGxhc3QgZXJyb3IgZXZlbnQgaXMgYWx3YXlzIHVzZWQuIElmIHRoZSBjYWxsYmFjayBhY3R1YWxseSBkb2VzIGVycm9yLFxuICAgICAgLy8gd2Uga25vdyB0aGF0IHRoZSBsYXN0IGVycm9yIGV2ZW50IGlzIHRoZSBjb3JyZWN0IG9uZSwgYmVjYXVzZSBpdCdzIG5vdFxuICAgICAgLy8gcG9zc2libGUgZm9yIGFueXRoaW5nIGVsc2UgdG8gaGF2ZSBoYXBwZW5lZCBpbiBiZXR3ZWVuIG91ciBjYWxsYmFja1xuICAgICAgLy8gZXJyb3JpbmcgYW5kIHRoZSBjb2RlIHRoYXQgZm9sbG93cyB0aGUgYGRpc3BhdGNoRXZlbnRgIGNhbGwgYmVsb3cuIElmXG4gICAgICAvLyB0aGUgY2FsbGJhY2sgZG9lc24ndCBlcnJvciwgYnV0IHRoZSBlcnJvciBldmVudCB3YXMgZmlyZWQsIHdlIGtub3cgdG9cbiAgICAgIC8vIGlnbm9yZSBpdCBiZWNhdXNlIGBkaWRFcnJvcmAgd2lsbCBiZSBmYWxzZSwgYXMgZGVzY3JpYmVkIGFib3ZlLlxuXG5cbiAgICAgIHZhciBlcnJvcjsgLy8gVXNlIHRoaXMgdG8gdHJhY2sgd2hldGhlciB0aGUgZXJyb3IgZXZlbnQgaXMgZXZlciBjYWxsZWQuXG5cbiAgICAgIHZhciBkaWRTZXRFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIGlzQ3Jvc3NPcmlnaW5FcnJvciA9IGZhbHNlO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVXaW5kb3dFcnJvcihldmVudCkge1xuICAgICAgICBlcnJvciA9IGV2ZW50LmVycm9yO1xuICAgICAgICBkaWRTZXRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgaWYgKGVycm9yID09PSBudWxsICYmIGV2ZW50LmNvbG5vID09PSAwICYmIGV2ZW50LmxpbmVubyA9PT0gMCkge1xuICAgICAgICAgIGlzQ3Jvc3NPcmlnaW5FcnJvciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IgaGFuZGxlciBoYXMgcHJldmVudGVkIGRlZmF1bHQuXG4gICAgICAgICAgLy8gQnJvd3NlcnMgc2lsZW5jZSB0aGUgZXJyb3IgcmVwb3J0IGlmIHRoaXMgaGFwcGVucy5cbiAgICAgICAgICAvLyBXZSdsbCByZW1lbWJlciB0aGlzIHRvIGxhdGVyIGRlY2lkZSB3aGV0aGVyIHRvIGxvZyBpdCBvciBub3QuXG4gICAgICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChpbm5lcikgey8vIElnbm9yZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ3JlYXRlIGEgZmFrZSBldmVudCB0eXBlLlxuXG5cbiAgICAgIHZhciBldnRUeXBlID0gXCJyZWFjdC1cIiArIChuYW1lID8gbmFtZSA6ICdpbnZva2VndWFyZGVkY2FsbGJhY2snKTsgLy8gQXR0YWNoIG91ciBldmVudCBoYW5kbGVyc1xuXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoYW5kbGVXaW5kb3dFcnJvcik7XG4gICAgICBmYWtlTm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBTeW5jaHJvbm91c2x5IGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50LiBJZiB0aGUgdXNlci1wcm92aWRlZCBmdW5jdGlvblxuICAgICAgLy8gZXJyb3JzLCBpdCB3aWxsIHRyaWdnZXIgb3VyIGdsb2JhbCBlcnJvciBoYW5kbGVyLlxuXG4gICAgICBldnQuaW5pdEV2ZW50KGV2dFR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gICAgICBmYWtlTm9kZS5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cbiAgICAgIGlmICh3aW5kb3dFdmVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2V2ZW50Jywgd2luZG93RXZlbnREZXNjcmlwdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZENhbGwgJiYgZGlkRXJyb3IpIHtcbiAgICAgICAgaWYgKCFkaWRTZXRFcnJvcikge1xuICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBlcnJvcmVkLCBidXQgdGhlIGVycm9yIGV2ZW50IG5ldmVyIGZpcmVkLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0FuIGVycm9yIHdhcyB0aHJvd24gaW5zaWRlIG9uZSBvZiB5b3VyIGNvbXBvbmVudHMsIGJ1dCBSZWFjdCAnICsgXCJkb2Vzbid0IGtub3cgd2hhdCBpdCB3YXMuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBicm93c2VyIFwiICsgJ2ZsYWtpbmVzcy4gUmVhY3QgZG9lcyBpdHMgYmVzdCB0byBwcmVzZXJ2ZSB0aGUgXCJQYXVzZSBvbiAnICsgJ2V4Y2VwdGlvbnNcIiBiZWhhdmlvciBvZiB0aGUgRGV2VG9vbHMsIHdoaWNoIHJlcXVpcmVzIHNvbWUgJyArIFwiREVWLW1vZGUgb25seSB0cmlja3MuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVzZSBkb24ndCB3b3JrIGluIFwiICsgJ3lvdXIgYnJvd3Nlci4gVHJ5IHRyaWdnZXJpbmcgdGhlIGVycm9yIGluIHByb2R1Y3Rpb24gbW9kZSwgJyArICdvciBzd2l0Y2hpbmcgdG8gYSBtb2Rlcm4gYnJvd3Nlci4gSWYgeW91IHN1c3BlY3QgdGhhdCB0aGlzIGlzICcgKyAnYWN0dWFsbHkgYW4gaXNzdWUgd2l0aCBSZWFjdCwgcGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDcm9zc09yaWdpbkVycm9yKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcIkEgY3Jvc3Mtb3JpZ2luIGVycm9yIHdhcyB0aHJvd24uIFJlYWN0IGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gXCIgKyAndGhlIGFjdHVhbCBlcnJvciBvYmplY3QgaW4gZGV2ZWxvcG1lbnQuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jcm9zc29yaWdpbi1lcnJvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICB9IC8vIFJlbW92ZSBvdXIgZXZlbnQgbGlzdGVuZXJzXG5cblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuXG4gICAgICBpZiAoIWRpZENhbGwpIHtcbiAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLCBhbmQgb3VyIGV2ZW50IHdhcyBub3QgZGlzcGF0Y2hlZC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjczNFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NTg1XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgcHJvZHVjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgcmV0dXJuIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbnZhciBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsO1xuXG52YXIgaGFzRXJyb3IgPSBmYWxzZTtcbnZhciBjYXVnaHRFcnJvciA9IG51bGw7IC8vIFVzZWQgYnkgZXZlbnQgc3lzdGVtIHRvIGNhcHR1cmUvcmV0aHJvdyB0aGUgZmlyc3QgZXJyb3IuXG5cbnZhciBoYXNSZXRocm93RXJyb3IgPSBmYWxzZTtcbnZhciByZXRocm93RXJyb3IgPSBudWxsO1xudmFyIHJlcG9ydGVyID0ge1xuICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgfVxufTtcbi8qKlxuICogQ2FsbCBhIGZ1bmN0aW9uIHdoaWxlIGd1YXJkaW5nIGFnYWluc3QgZXJyb3JzIHRoYXQgaGFwcGVucyB3aXRoaW4gaXQuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIGl0IHRocm93cywgb3RoZXJ3aXNlIG51bGwuXG4gKlxuICogSW4gcHJvZHVjdGlvbiwgdGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHRyeS1jYXRjaC4gVGhlIHJlYXNvbiB3ZSBkb24ndFxuICogdXNlIGEgdHJ5LWNhdGNoIGRpcmVjdGx5IGlzIHNvIHRoYXQgd2UgY2FuIHN3YXAgb3V0IGEgZGlmZmVyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiBpbiBERVYgbW9kZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEuYXBwbHkocmVwb3J0ZXIsIGFyZ3VtZW50cyk7XG59XG4vKipcbiAqIFNhbWUgYXMgaW52b2tlR3VhcmRlZENhbGxiYWNrLCBidXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IsIGl0IHN0b3Jlc1xuICogaXQgaW4gYSBnbG9iYWwgc28gaXQgY2FuIGJlIHJldGhyb3duIGJ5IGByZXRocm93Q2F1Z2h0RXJyb3JgIGxhdGVyLlxuICogVE9ETzogU2VlIGlmIGNhdWdodEVycm9yIGFuZCByZXRocm93RXJyb3IgY2FuIGJlIHVuaWZpZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcihuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgIGlmICghaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgICBoYXNSZXRocm93RXJyb3IgPSB0cnVlO1xuICAgICAgcmV0aHJvd0Vycm9yID0gZXJyb3I7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIER1cmluZyBleGVjdXRpb24gb2YgZ3VhcmRlZCBmdW5jdGlvbnMgd2Ugd2lsbCBjYXB0dXJlIHRoZSBmaXJzdCBlcnJvciB3aGljaFxuICogd2Ugd2lsbCByZXRocm93IHRvIGJlIGhhbmRsZWQgYnkgdGhlIHRvcCBsZXZlbCBlcnJvciBoYW5kbGVyLlxuICovXG5cbmZ1bmN0aW9uIHJldGhyb3dDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc1JldGhyb3dFcnJvcikge1xuICAgIHZhciBlcnJvciA9IHJldGhyb3dFcnJvcjtcbiAgICBoYXNSZXRocm93RXJyb3IgPSBmYWxzZTtcbiAgICByZXRocm93RXJyb3IgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5mdW5jdGlvbiBoYXNDYXVnaHRFcnJvcigpIHtcbiAgcmV0dXJuIGhhc0Vycm9yO1xufVxuZnVuY3Rpb24gY2xlYXJDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2F1Z2h0RXJyb3I7XG4gICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBjYXVnaHRFcnJvciA9IG51bGw7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJDYXVnaHRFcnJvciB3YXMgY2FsbGVkIGJ1dCBubyBlcnJvciB3YXMgY2FwdHVyZWQuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIGBSZWFjdEluc3RhbmNlTWFwYCBtYWludGFpbnMgYSBtYXBwaW5nIGZyb20gYSBwdWJsaWMgZmFjaW5nIHN0YXRlZnVsXG4gKiBpbnN0YW5jZSAoa2V5KSBhbmQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uICh2YWx1ZSkuIFRoaXMgYWxsb3dzIHB1YmxpY1xuICogbWV0aG9kcyB0byBhY2NlcHQgdGhlIHVzZXIgZmFjaW5nIGluc3RhbmNlIGFzIGFuIGFyZ3VtZW50IGFuZCBtYXAgdGhlbSBiYWNrXG4gKiB0byBpbnRlcm5hbCBtZXRob2RzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBpcyBjdXJyZW50bHkgc2hhcmVkIGFuZCBhc3N1bWVkIHRvIGJlIHN0YXRlbGVzcy5cbiAqIElmIHRoaXMgYmVjb21lcyBhbiBhY3R1YWwgTWFwLCB0aGF0IHdpbGwgYnJlYWsuXG4gKi9cbmZ1bmN0aW9uIGdldChrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHM7XG59XG5mdW5jdGlvbiBoYXMoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxzICE9PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICBrZXkuX3JlYWN0SW50ZXJuYWxzID0gdmFsdWU7XG59XG5cbi8vIERvbid0IGNoYW5nZSB0aGVzZSB0d28gdmFsdWVzLiBUaGV5J3JlIHVzZWQgYnkgUmVhY3QgRGV2IFRvb2xzLlxudmFyIE5vRmxhZ3MgPVxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgUGVyZm9ybWVkV29yayA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTsgLy8gWW91IGNhbiBjaGFuZ2UgdGhlIHJlc3QgKGFuZCBhZGQgbW9yZSkuXG5cbnZhciBQbGFjZW1lbnQgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yO1xudmFyIFVwZGF0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQ7XG52YXIgQ2hpbGREZWxldGlvbiA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ29udGVudFJlc2V0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgQ2FsbGJhY2sgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgRGlkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIEZvcmNlQ2xpZW50UmVuZGVyID1cbi8qICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBSZWYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7XG52YXIgU25hcHNob3QgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBQYXNzaXZlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG4yMDQ4O1xudmFyIEh5ZHJhdGluZyA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVmlzaWJpbGl0eSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuODE5MjtcbnZhciBTdG9yZUNvbnNpc3RlbmN5ID1cbi8qICAgICAgICAgICAgICovXG4xNjM4NDtcbnZhciBMaWZlY3ljbGVFZmZlY3RNYXNrID0gUGFzc2l2ZSB8IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgU25hcHNob3QgfCBTdG9yZUNvbnNpc3RlbmN5OyAvLyBVbmlvbiBvZiBhbGwgY29tbWl0IGZsYWdzIChmbGFncyB3aXRoIHRoZSBsaWZldGltZSBvZiBhIHBhcnRpY3VsYXIgY29tbWl0KVxuXG52YXIgSG9zdEVmZmVjdE1hc2sgPVxuLyogICAgICAgICAgICAgICAqL1xuMzI3Njc7IC8vIFRoZXNlIGFyZSBub3QgcmVhbGx5IHNpZGUgZWZmZWN0cywgYnV0IHdlIHN0aWxsIHJldXNlIHRoaXMgZmllbGQuXG5cbnZhciBJbmNvbXBsZXRlID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4zMjc2ODtcbnZhciBTaG91bGRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICovXG42NTUzNjtcbnZhciBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlID1cbi8qICovXG4xMzEwNzI7XG52YXIgRm9ya2VkID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTA0ODU3NjsgLy8gU3RhdGljIHRhZ3MgZGVzY3JpYmUgYXNwZWN0cyBvZiBhIGZpYmVyIHRoYXQgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlcixcbi8vIGUuZy4gYSBmaWJlciB1c2VzIGEgcGFzc2l2ZSBlZmZlY3QgKGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHVwZGF0ZXMgb24gdGhpcyBwYXJ0aWN1bGFyIHJlbmRlcikuXG4vLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGVmZXIgbW9yZSB3b3JrIGluIHRoZSB1bm1vdW50IGNhc2UsXG4vLyBzaW5jZSB3ZSBjYW4gZGVmZXIgdHJhdmVyc2luZyB0aGUgdHJlZSBkdXJpbmcgbGF5b3V0IHRvIGxvb2sgZm9yIFBhc3NpdmUgZWZmZWN0cyxcbi8vIGFuZCBpbnN0ZWFkIHJlbHkgb24gdGhlIHN0YXRpYyBmbGFnIGFzIGEgc2lnbmFsIHRoYXQgdGhlcmUgbWF5IGJlIGNsZWFudXAgd29yay5cblxudmFyIFJlZlN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjIwOTcxNTI7XG52YXIgTGF5b3V0U3RhdGljID1cbi8qICAgICAgICAgICAgICAgICAqL1xuNDE5NDMwNDtcbnZhciBQYXNzaXZlU3RhdGljID1cbi8qICAgICAgICAgICAgICAgICovXG44Mzg4NjA4OyAvLyBUaGVzZSBmbGFncyBhbGxvdyB1cyB0byB0cmF2ZXJzZSB0byBmaWJlcnMgdGhhdCBoYXZlIGVmZmVjdHMgb24gbW91bnRcbi8vIHdpdGhvdXQgdHJhdmVyc2luZyB0aGUgZW50aXJlIHRyZWUgYWZ0ZXIgZXZlcnkgY29tbWl0IGZvclxuLy8gZG91YmxlIGludm9raW5nXG5cbnZhciBNb3VudExheW91dERldiA9XG4vKiAgICAgICAgICAgICAgICovXG4xNjc3NzIxNjtcbnZhciBNb3VudFBhc3NpdmVEZXYgPVxuLyogICAgICAgICAgICAgICovXG4zMzU1NDQzMjsgLy8gR3JvdXBzIG9mIGZsYWdzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGNvbW1pdCBwaGFzZSB0byBza2lwIG92ZXIgdHJlZXMgdGhhdFxuLy8gZG9uJ3QgY29udGFpbiBlZmZlY3RzLCBieSBjaGVja2luZyBzdWJ0cmVlRmxhZ3MuXG5cbnZhciBCZWZvcmVNdXRhdGlvbk1hc2sgPSAvLyBUT0RPOiBSZW1vdmUgVXBkYXRlIGZsYWcgZnJvbSBiZWZvcmUgbXV0YXRpb24gcGhhc2UgYnkgcmUtbGFuZGluZyBWaXNpYmlsaXR5XG4vLyBmbGFnIGxvZ2ljIChzZWUgIzIwMDQzKVxuVXBkYXRlIHwgU25hcHNob3QgfCAoIDApO1xudmFyIE11dGF0aW9uTWFzayA9IFBsYWNlbWVudCB8IFVwZGF0ZSB8IENoaWxkRGVsZXRpb24gfCBDb250ZW50UmVzZXQgfCBSZWYgfCBIeWRyYXRpbmcgfCBWaXNpYmlsaXR5O1xudmFyIExheW91dE1hc2sgPSBVcGRhdGUgfCBDYWxsYmFjayB8IFJlZiB8IFZpc2liaWxpdHk7IC8vIFRPRE86IFNwbGl0IGludG8gUGFzc2l2ZU1vdW50TWFzayBhbmQgUGFzc2l2ZVVubW91bnRNYXNrXG5cbnZhciBQYXNzaXZlTWFzayA9IFBhc3NpdmUgfCBDaGlsZERlbGV0aW9uOyAvLyBVbmlvbiBvZiB0YWdzIHRoYXQgZG9uJ3QgZ2V0IHJlc2V0IG9uIGNsb25lcy5cbi8vIFRoaXMgYWxsb3dzIGNlcnRhaW4gY29uY2VwdHMgdG8gcGVyc2lzdCB3aXRob3V0IHJlY2FsY3VsYXRpbmcgdGhlbSxcbi8vIGUuZy4gd2hldGhlciBhIHN1YnRyZWUgY29udGFpbnMgcGFzc2l2ZSBlZmZlY3RzIG9yIHBvcnRhbHMuXG5cbnZhciBTdGF0aWNNYXNrID0gTGF5b3V0U3RhdGljIHwgUGFzc2l2ZVN0YXRpYyB8IFJlZlN0YXRpYztcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG5mdW5jdGlvbiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSB7XG4gIHZhciBub2RlID0gZmliZXI7XG4gIHZhciBuZWFyZXN0TW91bnRlZCA9IGZpYmVyO1xuXG4gIGlmICghZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGlzIG1pZ2h0IGJlIGEgbmV3IHRyZWUgdGhhdCBpc24ndCBpbnNlcnRlZFxuICAgIC8vIHlldC4gSWYgaXQgaXMsIHRoZW4gaXQgd2lsbCBoYXZlIGEgcGVuZGluZyBpbnNlcnRpb24gZWZmZWN0IG9uIGl0LlxuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGU7XG5cbiAgICBkbyB7XG4gICAgICBub2RlID0gbmV4dE5vZGU7XG5cbiAgICAgIGlmICgobm9kZS5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbiBvciBpbi1wcm9ncmVzcyBoeWRyYXRpb24uIFRoZSBuZWFyZXN0IHBvc3NpYmxlXG4gICAgICAgIC8vIG1vdW50ZWQgZmliZXIgaXMgdGhlIHBhcmVudCBidXQgd2UgbmVlZCB0byBjb250aW51ZSB0byBmaWd1cmUgb3V0XG4gICAgICAgIC8vIGlmIHRoYXQgb25lIGlzIHN0aWxsIG1vdW50ZWQuXG4gICAgICAgIG5lYXJlc3RNb3VudGVkID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHROb2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobmV4dE5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChub2RlLnJldHVybikge1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIHdhcyBhIG5lc3RlZCBIb3N0Um9vdCB3aGVuIHVzZWQgd2l0aFxuICAgIC8vIHJlbmRlckNvbnRhaW5lckludG9TdWJ0cmVlLlxuICAgIHJldHVybiBuZWFyZXN0TW91bnRlZDtcbiAgfSAvLyBJZiB3ZSBkaWRuJ3QgaGl0IHRoZSByb290LCB0aGF0IG1lYW5zIHRoYXQgd2UncmUgaW4gYW4gZGlzY29ubmVjdGVkIHRyZWVcbiAgLy8gdGhhdCBoYXMgYmVlbiB1bm1vdW50ZWQuXG5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRDb250YWluZXJGcm9tRmliZXIoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QgPyBmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA6IG51bGw7XG59XG5mdW5jdGlvbiBpc0ZpYmVyTW91bnRlZChmaWJlcikge1xuICByZXR1cm4gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgPT09IGZpYmVyO1xufVxuZnVuY3Rpb24gaXNNb3VudGVkKGNvbXBvbmVudCkge1xuICB7XG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgb3duZXJGaWJlciA9IG93bmVyO1xuICAgICAgdmFyIGluc3RhbmNlID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICghaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgaXNNb3VudGVkIGluc2lkZSBpdHMgcmVuZGVyKCkgZnVuY3Rpb24uICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyRmliZXIpIHx8ICdBIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuXG4gIGlmICghZmliZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgPT09IGZpYmVyO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRJc01vdW50ZWQoZmliZXIpIHtcbiAgaWYgKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpICE9PSBmaWJlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKCFhbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoZW4gd2Ugb25seSBuZWVkIHRvIGNoZWNrIGlmIGl0IGlzIG1vdW50ZWQuXG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcik7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gZmliZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmaWJlcjtcbiAgfSAvLyBJZiB3ZSBoYXZlIHR3byBwb3NzaWJsZSBicmFuY2hlcywgd2UnbGwgd2FsayBiYWNrd2FyZHMgdXAgdG8gdGhlIHJvb3RcbiAgLy8gdG8gc2VlIHdoYXQgcGF0aCB0aGUgcm9vdCBwb2ludHMgdG8uIE9uIHRoZSB3YXkgd2UgbWF5IGhpdCBvbmUgb2YgdGhlXG4gIC8vIHNwZWNpYWwgY2FzZXMgYW5kIHdlJ2xsIGRlYWwgd2l0aCB0aGVtLlxuXG5cbiAgdmFyIGEgPSBmaWJlcjtcbiAgdmFyIGIgPSBhbHRlcm5hdGU7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcGFyZW50QSA9IGEucmV0dXJuO1xuXG4gICAgaWYgKHBhcmVudEEgPT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIGF0IHRoZSByb290LlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIHBhcmVudEIgPSBwYXJlbnRBLmFsdGVybmF0ZTtcblxuICAgIGlmIChwYXJlbnRCID09PSBudWxsKSB7XG4gICAgICAvLyBUaGVyZSBpcyBubyBhbHRlcm5hdGUuIFRoaXMgaXMgYW4gdW51c3VhbCBjYXNlLiBDdXJyZW50bHksIGl0IG9ubHlcbiAgICAgIC8vIGhhcHBlbnMgd2hlbiBhIFN1c3BlbnNlIGNvbXBvbmVudCBpcyBoaWRkZW4uIEFuIGV4dHJhIGZyYWdtZW50IGZpYmVyXG4gICAgICAvLyBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIHRoZSBTdXNwZW5zZSBmaWJlciBhbmQgaXRzIGNoaWxkcmVuLiBTa2lwXG4gICAgICAvLyBvdmVyIHRoaXMgZXh0cmEgZnJhZ21lbnQgZmliZXIgYW5kIHByb2NlZWQgdG8gdGhlIG5leHQgcGFyZW50LlxuICAgICAgdmFyIG5leHRQYXJlbnQgPSBwYXJlbnRBLnJldHVybjtcblxuICAgICAgaWYgKG5leHRQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgYSA9IGIgPSBuZXh0UGFyZW50O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gSWYgdGhlcmUncyBubyBwYXJlbnQsIHdlJ3JlIGF0IHRoZSByb290LlxuXG5cbiAgICAgIGJyZWFrO1xuICAgIH0gLy8gSWYgYm90aCBjb3BpZXMgb2YgdGhlIHBhcmVudCBmaWJlciBwb2ludCB0byB0aGUgc2FtZSBjaGlsZCwgd2UgY2FuXG4gICAgLy8gYXNzdW1lIHRoYXQgdGhlIGNoaWxkIGlzIGN1cnJlbnQuIFRoaXMgaGFwcGVucyB3aGVuIHdlIGJhaWxvdXQgb24gbG93XG4gICAgLy8gcHJpb3JpdHk6IHRoZSBiYWlsZWQgb3V0IGZpYmVyJ3MgY2hpbGQgcmV1c2VzIHRoZSBjdXJyZW50IGNoaWxkLlxuXG5cbiAgICBpZiAocGFyZW50QS5jaGlsZCA9PT0gcGFyZW50Qi5jaGlsZCkge1xuICAgICAgdmFyIGNoaWxkID0gcGFyZW50QS5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZCA9PT0gYSkge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoaWxkID09PSBiKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEIgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gYWx0ZXJuYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfSAvLyBXZSBzaG91bGQgbmV2ZXIgaGF2ZSBhbiBhbHRlcm5hdGUgZm9yIGFueSBtb3VudGluZyBub2RlLiBTbyB0aGUgb25seVxuICAgICAgLy8gd2F5IHRoaXMgY291bGQgcG9zc2libHkgaGFwcGVuIGlzIGlmIHRoaXMgd2FzIHVubW91bnRlZCwgaWYgYXQgYWxsLlxuXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIGlmIChhLnJldHVybiAhPT0gYi5yZXR1cm4pIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlciBvZiBBIGFuZCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgQiBwb2ludCB0byBkaWZmZXJlbnRcbiAgICAgIC8vIGZpYmVycy4gV2UgYXNzdW1lIHRoYXQgcmV0dXJuIHBvaW50ZXJzIG5ldmVyIGNyaXNzLWNyb3NzLCBzbyBBIG11c3RcbiAgICAgIC8vIGJlbG9uZyB0byB0aGUgY2hpbGQgc2V0IG9mIEEucmV0dXJuLCBhbmQgQiBtdXN0IGJlbG9uZyB0byB0aGUgY2hpbGRcbiAgICAgIC8vIHNldCBvZiBCLnJldHVybi5cbiAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgYiA9IHBhcmVudEI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgZmliZXIuIFdlJ2xsIGhhdmUgdG8gdXNlIHRoZVxuICAgICAgLy8gZGVmYXVsdCwgc2xvdyBwYXRoOiBzY2FuIHRoZSBjaGlsZCBzZXRzIG9mIGVhY2ggcGFyZW50IGFsdGVybmF0ZSB0byBzZWVcbiAgICAgIC8vIHdoaWNoIGNoaWxkIGJlbG9uZ3MgdG8gd2hpY2ggc2V0LlxuICAgICAgLy9cbiAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQSdzIGNoaWxkIHNldFxuICAgICAgdmFyIGRpZEZpbmRDaGlsZCA9IGZhbHNlO1xuICAgICAgdmFyIF9jaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEIncyBjaGlsZCBzZXRcbiAgICAgICAgX2NoaWxkID0gcGFyZW50Qi5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkIHdhcyBub3QgZm91bmQgaW4gZWl0aGVyIHBhcmVudCBzZXQuIFRoaXMgaW5kaWNhdGVzIGEgYnVnICcgKyAnaW4gUmVhY3QgcmVsYXRlZCB0byB0aGUgcmV0dXJuIHBvaW50ZXIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGEuYWx0ZXJuYXRlICE9PSBiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXR1cm4gZmliZXJzIHNob3VsZCBhbHdheXMgYmUgZWFjaCBvdGhlcnMnIGFsdGVybmF0ZXMuIFwiICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9IC8vIElmIHRoZSByb290IGlzIG5vdCBhIGhvc3QgY29udGFpbmVyLCB3ZSdyZSBpbiBhIGRpc2Nvbm5lY3RlZCB0cmVlLiBJLmUuXG4gIC8vIHVubW91bnRlZC5cblxuXG4gIGlmIChhLnRhZyAhPT0gSG9zdFJvb3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgfVxuXG4gIGlmIChhLnN0YXRlTm9kZS5jdXJyZW50ID09PSBhKSB7XG4gICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgIHJldHVybiBmaWJlcjtcbiAgfSAvLyBPdGhlcndpc2UgQiBoYXMgdG8gYmUgY3VycmVudCBicmFuY2guXG5cblxuICByZXR1cm4gYWx0ZXJuYXRlO1xufVxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXIocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY3VycmVudFBhcmVudCkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwobm9kZSkge1xuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHZhciBtYXRjaCA9IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjaGlsZCk7XG5cbiAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG4gIHJldHVybiBjdXJyZW50UGFyZW50ICE9PSBudWxsID8gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwobm9kZSkge1xuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIGlmIChjaGlsZC50YWcgIT09IEhvc3RQb3J0YWwpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwoY2hpbGQpO1xuXG4gICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBUaGlzIG1vZHVsZSBvbmx5IGV4aXN0cyBhcyBhbiBFU00gd3JhcHBlciBhcm91bmQgdGhlIGV4dGVybmFsIENvbW1vbkpTXG52YXIgc2NoZWR1bGVDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xudmFyIGNhbmNlbENhbGxiYWNrID0gU2NoZWR1bGVyLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xudmFyIHNob3VsZFlpZWxkID0gU2NoZWR1bGVyLnVuc3RhYmxlX3Nob3VsZFlpZWxkO1xudmFyIHJlcXVlc3RQYWludCA9IFNjaGVkdWxlci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ7XG52YXIgbm93ID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCA9IFNjaGVkdWxlci51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eTtcbnZhciBOb3JtYWxQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eTtcbnZhciBMb3dQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Mb3dQcmlvcml0eTtcbnZhciBJZGxlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5O1xuLy8gdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0IG9uIHRoZSBzY2hlZHVsZXIsIGJ1dCBpdCAqZG9lcypcbi8vIG9uIHNjaGVkdWxlci91bnN0YWJsZV9tb2NrLCB3aGljaCB3ZSdsbCBuZWVkIGZvciBpbnRlcm5hbCB0ZXN0aW5nXG52YXIgdW5zdGFibGVfeWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV95aWVsZFZhbHVlO1xudmFyIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlO1xuXG52YXIgcmVuZGVyZXJJRCA9IG51bGw7XG52YXIgaW5qZWN0ZWRIb29rID0gbnVsbDtcbnZhciBpbmplY3RlZFByb2ZpbGluZ0hvb2tzID0gbnVsbDtcbnZhciBoYXNMb2dnZWRFcnJvciA9IGZhbHNlO1xudmFyIGlzRGV2VG9vbHNQcmVzZW50ID0gdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCc7XG5mdW5jdGlvbiBpbmplY3RJbnRlcm5hbHMoaW50ZXJuYWxzKSB7XG4gIGlmICh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIE5vIERldlRvb2xzXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGhvb2sgPSBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187XG5cbiAgaWYgKGhvb2suaXNEaXNhYmxlZCkge1xuICAgIC8vIFRoaXMgaXNuJ3QgYSByZWFsIHByb3BlcnR5IG9uIHRoZSBob29rLCBidXQgaXQgY2FuIGJlIHNldCB0byBvcHQgb3V0XG4gICAgLy8gb2YgRGV2VG9vbHMgaW50ZWdyYXRpb24gYW5kIGFzc29jaWF0ZWQgd2FybmluZ3MgYW5kIGxvZ3MuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zODc3XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIWhvb2suc3VwcG9ydHNGaWJlcikge1xuICAgIHtcbiAgICAgIGVycm9yKCdUaGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgUmVhY3QgRGV2VG9vbHMgaXMgdG9vIG9sZCBhbmQgd2lsbCBub3Qgd29yayAnICsgJ3dpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBSZWFjdC4gUGxlYXNlIHVwZGF0ZSBSZWFjdCBEZXZUb29scy4gJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnKTtcbiAgICB9IC8vIERldlRvb2xzIGV4aXN0cywgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBzdXBwb3J0IEZpYmVyLlxuXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlcikge1xuICAgICAgLy8gQ29uZGl0aW9uYWxseSBpbmplY3QgdGhlc2UgaG9va3Mgb25seSBpZiBUaW1lbGluZSBwcm9maWxlciBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBidWlsZC5cbiAgICAgIC8vIFRoaXMgZ2l2ZXMgRGV2VG9vbHMgYSB3YXkgdG8gZmVhdHVyZSBkZXRlY3QgdGhhdCBpc24ndCB0aWVkIHRvIHZlcnNpb24gbnVtYmVyXG4gICAgICAvLyAoc2luY2UgcHJvZmlsaW5nIGFuZCB0aW1lbGluZSBhcmUgY29udHJvbGxlZCBieSBkaWZmZXJlbnQgZmVhdHVyZSBmbGFncykuXG4gICAgICBpbnRlcm5hbHMgPSBhc3NpZ24oe30sIGludGVybmFscywge1xuICAgICAgICBnZXRMYW5lTGFiZWxNYXA6IGdldExhbmVMYWJlbE1hcCxcbiAgICAgICAgaW5qZWN0UHJvZmlsaW5nSG9va3M6IGluamVjdFByb2ZpbGluZ0hvb2tzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJlcklEID0gaG9vay5pbmplY3QoaW50ZXJuYWxzKTsgLy8gV2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5qZWN0ZWQsIHNvIG5vdyBpdCBpcyBzYWZlIHRvIHNldCB1cCBob29rcy5cblxuICAgIGluamVjdGVkSG9vayA9IGhvb2s7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIENhdGNoIGFsbCBlcnJvcnMgYmVjYXVzZSBpdCBpcyB1bnNhZmUgdG8gdGhyb3cgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhvb2suY2hlY2tEQ0UpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSByZWFsIERldlRvb2xzLlxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgbGlrZWx5IGEgaG9vayBpbnN0YWxsZWQgYnkgRmFzdCBSZWZyZXNoIHJ1bnRpbWUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBvblNjaGVkdWxlUm9vdChyb290LCBjaGlsZHJlbikge1xuICB7XG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIGNoaWxkcmVuKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoICFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRSb290KHJvb3QsIGV2ZW50UHJpb3JpdHkpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBkaWRFcnJvciA9IChyb290LmN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gRGlkQ2FwdHVyZTtcblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgICAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgc2NoZWR1bGVyUHJpb3JpdHksIGRpZEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCB1bmRlZmluZWQsIGRpZEVycm9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Qb3N0Q29tbWl0Um9vdChyb290KSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRVbm1vdW50KGZpYmVyKSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQocmVuZGVyZXJJRCwgZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhuZXdJc1N0cmljdE1vZGUpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgdW5zdGFibGVfeWllbGRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gV2UncmUgaW4gYSB0ZXN0IGJlY2F1c2UgU2NoZWR1bGVyLnVuc3RhYmxlX3lpZWxkVmFsdWUgb25seSBleGlzdHNcbiAgICAgIC8vIGluIFNjaGVkdWxlck1vY2suIFRvIHJlZHVjZSB0aGUgbm9pc2UgaW4gc3RyaWN0IG1vZGUgdGVzdHMsXG4gICAgICAvLyBzdXBwcmVzcyB3YXJuaW5ncyBhbmQgZGlzYWJsZSBzY2hlZHVsZXIgeWllbGRpbmcgZHVyaW5nIHRoZSBkb3VibGUgcmVuZGVyXG4gICAgICB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZShuZXdJc1N0cmljdE1vZGUpO1xuICAgICAgc2V0U3VwcHJlc3NXYXJuaW5nKG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgfVxuXG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlKHJlbmRlcmVySUQsIG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBQcm9maWxlciBBUEkgaG9va3NcblxuZnVuY3Rpb24gaW5qZWN0UHJvZmlsaW5nSG9va3MocHJvZmlsaW5nSG9va3MpIHtcbiAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcyA9IHByb2ZpbGluZ0hvb2tzO1xufVxuXG5mdW5jdGlvbiBnZXRMYW5lTGFiZWxNYXAoKSB7XG4gIHtcbiAgICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICAgIHZhciBsYW5lID0gMTtcblxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBUb3RhbExhbmVzOyBpbmRleCsrKSB7XG4gICAgICB2YXIgbGFiZWwgPSBnZXRMYWJlbEZvckxhbmUobGFuZSk7XG4gICAgICBtYXAuc2V0KGxhbmUsIGxhYmVsKTtcbiAgICAgIGxhbmUgKj0gMjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tbWl0U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRFcnJvcmVkKGZpYmVyLCB0aHJvd25WYWx1ZSwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRFcnJvcmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRFcnJvcmVkKGZpYmVyLCB0aHJvd25WYWx1ZSwgbGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFN1c3BlbmRlZChmaWJlciwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50U3VzcGVuZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyWWllbGRlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJZaWVsZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJZaWVsZGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclNjaGVkdWxlZChsYW5lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgTm9Nb2RlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4wOyAvLyBUT0RPOiBSZW1vdmUgQ29uY3VycmVudE1vZGUgYnkgcmVhZGluZyBmcm9tIHRoZSByb290IHRhZyBpbnN0ZWFkXG5cbnZhciBDb25jdXJyZW50TW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgUHJvZmlsZU1vZGUgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yO1xudmFyIFN0cmljdExlZ2FjeU1vZGUgPVxuLyogICAgICAgICAgICAgICAqL1xuODtcbnZhciBTdHJpY3RFZmZlY3RzTW9kZSA9XG4vKiAgICAgICAgICAgICAgKi9cbjE2O1xuXG4vLyBUT0RPOiBUaGlzIGlzIHByZXR0eSB3ZWxsIHN1cHBvcnRlZCBieSBicm93c2Vycy4gTWF5YmUgd2UgY2FuIGRyb3AgaXQuXG52YXIgY2x6MzIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IGNsejMyRmFsbGJhY2s7IC8vIENvdW50IGxlYWRpbmcgemVyb3MuXG4vLyBCYXNlZCBvbjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvY2x6MzJcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG5mdW5jdGlvbiBjbHozMkZhbGxiYWNrKHgpIHtcbiAgdmFyIGFzVWludCA9IHggPj4+IDA7XG5cbiAgaWYgKGFzVWludCA9PT0gMCkge1xuICAgIHJldHVybiAzMjtcbiAgfVxuXG4gIHJldHVybiAzMSAtIChsb2coYXNVaW50KSAvIExOMiB8IDApIHwgMDtcbn1cblxuLy8gSWYgdGhvc2UgdmFsdWVzIGFyZSBjaGFuZ2VkIHRoYXQgcGFja2FnZSBzaG91bGQgYmUgcmVidWlsdCBhbmQgcmVkZXBsb3llZC5cblxudmFyIFRvdGFsTGFuZXMgPSAzMTtcbnZhciBOb0xhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgTm9MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBTeW5jTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xO1xudmFyIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgPVxuLyogICAgKi9cbjI7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZSA9XG4vKiAgICAgICAgICAgICAqL1xuNDtcbnZhciBEZWZhdWx0SHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICovXG44O1xudmFyIERlZmF1bHRMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjE2O1xudmFyIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgICAgICovXG4zMjtcbnZhciBUcmFuc2l0aW9uTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG40MTk0MjQwO1xudmFyIFRyYW5zaXRpb25MYW5lMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG42NDtcbnZhciBUcmFuc2l0aW9uTGFuZTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIFRyYW5zaXRpb25MYW5lMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4yNTY7XG52YXIgVHJhbnNpdGlvbkxhbmU0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUxMjtcbnZhciBUcmFuc2l0aW9uTGFuZTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBUcmFuc2l0aW9uTGFuZTYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBUcmFuc2l0aW9uTGFuZTcgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDA5NjtcbnZhciBUcmFuc2l0aW9uTGFuZTggPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuODE5MjtcbnZhciBUcmFuc2l0aW9uTGFuZTkgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTYzODQ7XG52YXIgVHJhbnNpdGlvbkxhbmUxMCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjMyNzY4O1xudmFyIFRyYW5zaXRpb25MYW5lMTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG42NTUzNjtcbnZhciBUcmFuc2l0aW9uTGFuZTEyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTMxMDcyO1xudmFyIFRyYW5zaXRpb25MYW5lMTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4yNjIxNDQ7XG52YXIgVHJhbnNpdGlvbkxhbmUxNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUyNDI4ODtcbnZhciBUcmFuc2l0aW9uTGFuZTE1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTA0ODU3NjtcbnZhciBUcmFuc2l0aW9uTGFuZTE2ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA5NzE1MjtcbnZhciBSZXRyeUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMzAwMjM0MjQ7XG52YXIgUmV0cnlMYW5lMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQxOTQzMDQ7XG52YXIgUmV0cnlMYW5lMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgzODg2MDg7XG52YXIgUmV0cnlMYW5lMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE2Nzc3MjE2O1xudmFyIFJldHJ5TGFuZTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4zMzU1NDQzMjtcbnZhciBSZXRyeUxhbmU1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjcxMDg4NjQ7XG52YXIgU29tZVJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG52YXIgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAqL1xuMTM0MjE3NzI4O1xudmFyIE5vbklkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI2ODQzNTQ1NTtcbnZhciBJZGxlSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICAgICovXG4yNjg0MzU0NTY7XG52YXIgSWRsZUxhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTM2ODcwOTEyO1xudmFyIE9mZnNjcmVlbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjEwNzM3NDE4MjQ7IC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGV4cGVyaW1lbnRhbCB0aW1lbGluZSAocmVhY3QtZGV2dG9vbHMtdGltZWxpbmUpXG4vLyBJdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIExhbmVzIHZhbHVlcyBhYm92ZS5cblxuZnVuY3Rpb24gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpIHtcbiAge1xuICAgIGlmIChsYW5lICYgU3luY0xhbmUpIHtcbiAgICAgIHJldHVybiAnU3luYyc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0lucHV0Q29udGludW91c0h5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSB7XG4gICAgICByZXR1cm4gJ0lucHV0Q29udGludW91cyc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBEZWZhdWx0SHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdEZWZhdWx0SHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIERlZmF1bHRMYW5lKSB7XG4gICAgICByZXR1cm4gJ0RlZmF1bHQnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnVHJhbnNpdGlvbkh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpIHtcbiAgICAgIHJldHVybiAnVHJhbnNpdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBSZXRyeUxhbmVzKSB7XG4gICAgICByZXR1cm4gJ1JldHJ5JztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnU2VsZWN0aXZlSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElkbGVIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0lkbGVIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSWRsZUxhbmUpIHtcbiAgICAgIHJldHVybiAnSWRsZSc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBPZmZzY3JlZW5MYW5lKSB7XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG4gICAgfVxuICB9XG59XG52YXIgTm9UaW1lc3RhbXAgPSAtMTtcbnZhciBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7XG52YXIgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gIHN3aXRjaCAoZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcykpIHtcbiAgICBjYXNlIFN5bmNMYW5lOlxuICAgICAgcmV0dXJuIFN5bmNMYW5lO1xuXG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzTGFuZTtcblxuICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgICAgcmV0dXJuIERlZmF1bHRMYW5lO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICAgIHJldHVybiBsYW5lcyAmIFRyYW5zaXRpb25MYW5lcztcblxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICByZXR1cm4gbGFuZXMgJiBSZXRyeUxhbmVzO1xuXG4gICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElkbGVIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIElkbGVIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICAgIHJldHVybiBJZGxlTGFuZTtcblxuICAgIGNhc2UgT2Zmc2NyZWVuTGFuZTpcbiAgICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBiZSByZWFjaGFibGUsIGJ1dCBhcyBhIGZhbGxiYWNrLCByZXR1cm4gdGhlIGVudGlyZSBiaXRtYXNrLlxuXG5cbiAgICAgIHJldHVybiBsYW5lcztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROZXh0TGFuZXMocm9vdCwgd2lwTGFuZXMpIHtcbiAgLy8gRWFybHkgYmFpbG91dCBpZiB0aGVyZSdzIG5vIHBlbmRpbmcgd29yayBsZWZ0LlxuICB2YXIgcGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKHBlbmRpbmdMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIHJldHVybiBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIG5leHRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7IC8vIERvIG5vdCB3b3JrIG9uIGFueSBpZGxlIHdvcmsgdW50aWwgYWxsIHRoZSBub24taWRsZSB3b3JrIGhhcyBmaW5pc2hlZCxcbiAgLy8gZXZlbiBpZiB0aGUgd29yayBpcyBzdXNwZW5kZWQuXG5cbiAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiBOb25JZGxlTGFuZXM7XG5cbiAgaWYgKG5vbklkbGVQZW5kaW5nTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICB2YXIgbm9uSWRsZVVuYmxvY2tlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgIGlmIChub25JZGxlVW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKG5vbklkbGVVbmJsb2NrZWRMYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBub25JZGxlUGluZ2VkTGFuZXMgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgcGluZ2VkTGFuZXM7XG5cbiAgICAgIGlmIChub25JZGxlUGluZ2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVBpbmdlZExhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIHdvcmsgaXMgSWRsZS5cbiAgICB2YXIgdW5ibG9ja2VkTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICBpZiAodW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHVuYmxvY2tlZExhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHBpbmdlZExhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobmV4dExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGFibGUgaWYgd2UncmUgc3VzcGVuZGVkXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgd2FybmluZyBpbiB0aGlzIHBhdGggaWYgYSBmYWxsYmFjayB0aW1lciBpcyBub3Qgc2NoZWR1bGVkLlxuICAgIHJldHVybiBOb0xhbmVzO1xuICB9IC8vIElmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiBhIHJlbmRlciwgc3dpdGNoaW5nIGxhbmVzIHdpbGwgaW50ZXJydXB0XG4gIC8vIGl0IGFuZCB3ZSdsbCBsb3NlIG91ciBwcm9ncmVzcy4gV2Ugc2hvdWxkIG9ubHkgZG8gdGhpcyBpZiB0aGUgbmV3IGxhbmVzIGFyZVxuICAvLyBoaWdoZXIgcHJpb3JpdHkuXG5cblxuICBpZiAod2lwTGFuZXMgIT09IE5vTGFuZXMgJiYgd2lwTGFuZXMgIT09IG5leHRMYW5lcyAmJiAvLyBJZiB3ZSBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHRoZW4gaW50ZXJydXB0aW5nIGlzIGZpbmUuIERvbid0XG4gIC8vIGJvdGhlciB3YWl0aW5nIHVudGlsIHRoZSByb290IGlzIGNvbXBsZXRlLlxuICAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICB2YXIgbmV4dExhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKG5leHRMYW5lcyk7XG4gICAgdmFyIHdpcExhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKHdpcExhbmVzKTtcblxuICAgIGlmICggLy8gVGVzdHMgd2hldGhlciB0aGUgbmV4dCBsYW5lIGlzIGVxdWFsIG9yIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIHdpcFxuICAgIC8vIG9uZS4gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXRzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICAgIG5leHRMYW5lID49IHdpcExhbmUgfHwgLy8gRGVmYXVsdCBwcmlvcml0eSB1cGRhdGVzIHNob3VsZCBub3QgaW50ZXJydXB0IHRyYW5zaXRpb24gdXBkYXRlcy4gVGhlXG4gICAgLy8gb25seSBkaWZmZXJlbmNlIGJldHdlZW4gZGVmYXVsdCB1cGRhdGVzIGFuZCB0cmFuc2l0aW9uIHVwZGF0ZXMgaXMgdGhhdFxuICAgIC8vIGRlZmF1bHQgdXBkYXRlcyBkbyBub3Qgc3VwcG9ydCByZWZyZXNoIHRyYW5zaXRpb25zLlxuICAgIG5leHRMYW5lID09PSBEZWZhdWx0TGFuZSAmJiAod2lwTGFuZSAmIFRyYW5zaXRpb25MYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICAgIC8vIEtlZXAgd29ya2luZyBvbiB0aGUgZXhpc3RpbmcgaW4tcHJvZ3Jlc3MgdHJlZS4gRG8gbm90IGludGVycnVwdC5cbiAgICAgIHJldHVybiB3aXBMYW5lcztcbiAgICB9XG4gIH1cblxuICBpZiAoKG5leHRMYW5lcyAmIElucHV0Q29udGludW91c0xhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgLy8gV2hlbiB1cGRhdGVzIGFyZSBzeW5jIGJ5IGRlZmF1bHQsIHdlIGVudGFuZ2xlIGNvbnRpbnVvdXMgcHJpb3JpdHkgdXBkYXRlc1xuICAgIC8vIGFuZCBkZWZhdWx0IHVwZGF0ZXMsIHNvIHRoZXkgcmVuZGVyIGluIHRoZSBzYW1lIGJhdGNoLiBUaGUgb25seSByZWFzb25cbiAgICAvLyB0aGV5IHVzZSBzZXBhcmF0ZSBsYW5lcyBpcyBiZWNhdXNlIGNvbnRpbnVvdXMgdXBkYXRlcyBzaG91bGQgaW50ZXJydXB0XG4gICAgLy8gdHJhbnNpdGlvbnMsIGJ1dCBkZWZhdWx0IHVwZGF0ZXMgc2hvdWxkIG5vdC5cbiAgICBuZXh0TGFuZXMgfD0gcGVuZGluZ0xhbmVzICYgRGVmYXVsdExhbmU7XG4gIH0gLy8gQ2hlY2sgZm9yIGVudGFuZ2xlZCBsYW5lcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGJhdGNoLlxuICAvL1xuICAvLyBBIGxhbmUgaXMgc2FpZCB0byBiZSBlbnRhbmdsZWQgd2l0aCBhbm90aGVyIHdoZW4gaXQncyBub3QgYWxsb3dlZCB0byByZW5kZXJcbiAgLy8gaW4gYSBiYXRjaCB0aGF0IGRvZXMgbm90IGFsc28gaW5jbHVkZSB0aGUgb3RoZXIgbGFuZS4gVHlwaWNhbGx5IHdlIGRvIHRoaXNcbiAgLy8gd2hlbiBtdWx0aXBsZSB1cGRhdGVzIGhhdmUgdGhlIHNhbWUgc291cmNlLCBhbmQgd2Ugb25seSB3YW50IHRvIHJlc3BvbmQgdG9cbiAgLy8gdGhlIG1vc3QgcmVjZW50IGV2ZW50IGZyb20gdGhhdCBzb3VyY2UuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBhcHBseSBlbnRhbmdsZW1lbnRzICphZnRlciogY2hlY2tpbmcgZm9yIHBhcnRpYWwgd29yayBhYm92ZS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIGEgbGFuZSBpcyBlbnRhbmdsZWQgZHVyaW5nIGFuIGludGVybGVhdmVkIGV2ZW50IHdoaWxlXG4gIC8vIGl0J3MgYWxyZWFkeSByZW5kZXJpbmcsIHdlIHdvbid0IGludGVycnVwdCBpdC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgc2luY2VcbiAgLy8gZW50YW5nbGVtZW50IGlzIHVzdWFsbHkgXCJiZXN0IGVmZm9ydFwiOiB3ZSdsbCB0cnkgb3VyIGJlc3QgdG8gcmVuZGVyIHRoZVxuICAvLyBsYW5lcyBpbiB0aGUgc2FtZSBiYXRjaCwgYnV0IGl0J3Mgbm90IHdvcnRoIHRocm93aW5nIG91dCBwYXJ0aWFsbHlcbiAgLy8gY29tcGxldGVkIHdvcmsgaW4gb3JkZXIgdG8gZG8gaXQuXG4gIC8vIFRPRE86IFJlY29uc2lkZXIgdGhpcy4gVGhlIGNvdW50ZXItYXJndW1lbnQgaXMgdGhhdCB0aGUgcGFydGlhbCB3b3JrXG4gIC8vIHJlcHJlc2VudHMgYW4gaW50ZXJtZWRpYXRlIHN0YXRlLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIHNob3cgdG8gdGhlIHVzZXIuXG4gIC8vIEFuZCBieSBzcGVuZGluZyBleHRyYSB0aW1lIGZpbmlzaGluZyBpdCwgd2UncmUgaW5jcmVhc2luZyB0aGUgYW1vdW50IG9mXG4gIC8vIHRpbWUgaXQgdGFrZXMgdG8gc2hvdyB0aGUgZmluYWwgc3RhdGUsIHdoaWNoIGlzIHdoYXQgdGhleSBhcmUgYWN0dWFsbHlcbiAgLy8gd2FpdGluZyBmb3IuXG4gIC8vXG4gIC8vIEZvciB0aG9zZSBleGNlcHRpb25zIHdoZXJlIGVudGFuZ2xlbWVudCBpcyBzZW1hbnRpY2FsbHkgaW1wb3J0YW50LCBsaWtlXG4gIC8vIHVzZU11dGFibGVTb3VyY2UsIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwYXJ0aWFsIHdvcmsgYXQgdGhlXG4gIC8vIHRpbWUgd2UgYXBwbHkgdGhlIGVudGFuZ2xlbWVudC5cblxuXG4gIHZhciBlbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXM7XG5cbiAgaWYgKGVudGFuZ2xlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gICAgdmFyIGxhbmVzID0gbmV4dExhbmVzICYgZW50YW5nbGVkTGFuZXM7XG5cbiAgICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgIG5leHRMYW5lcyB8PSBlbnRhbmdsZW1lbnRzW2luZGV4XTtcbiAgICAgIGxhbmVzICY9IH5sYW5lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0TGFuZXM7XG59XG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV2ZW50VGltZSA9IGV2ZW50VGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV2ZW50VGltZSA+IG1vc3RSZWNlbnRFdmVudFRpbWUpIHtcbiAgICAgIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBldmVudFRpbWU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cblxuICByZXR1cm4gbW9zdFJlY2VudEV2ZW50VGltZTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKSB7XG4gIHN3aXRjaCAobGFuZSkge1xuICAgIGNhc2UgU3luY0xhbmU6XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIC8vIFVzZXIgaW50ZXJhY3Rpb25zIHNob3VsZCBleHBpcmUgc2xpZ2h0bHkgbW9yZSBxdWlja2x5LlxuICAgICAgLy9cbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbnN0YW50IGFzIGluIFNjaGVkdWxlci5qcy5cbiAgICAgIC8vIFdoZW4gd2UgbWFkZSBpdCBsYXJnZXIsIGEgcHJvZHVjdCBtZXRyaWMgaW4gd3d3IHJlZ3Jlc3NlZCwgc3VnZ2VzdGluZ1xuICAgICAgLy8gdGhlcmUncyBhIHVzZXIgaW50ZXJhY3Rpb24gdGhhdCdzIGJlaW5nIHN0YXJ2ZWQgYnkgYSBzZXJpZXMgb2ZcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZXMuIElmIHRoYXQgdGhlb3J5IGlzIGNvcnJlY3QsIHRoZSBwcm9wZXIgc29sdXRpb24gaXNcbiAgICAgIC8vIHRvIGZpeCB0aGUgc3RhcnZhdGlvbi4gSG93ZXZlciwgdGhpcyBzY2VuYXJpbyBzdXBwb3J0cyB0aGUgaWRlYSB0aGF0XG4gICAgICAvLyBleHBpcmF0aW9uIHRpbWVzIGFyZSBhbiBpbXBvcnRhbnQgc2FmZWd1YXJkIHdoZW4gc3RhcnZhdGlvblxuICAgICAgLy8gZG9lcyBoYXBwZW4uXG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyAyNTA7XG5cbiAgICBjYXNlIERlZmF1bHRIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgY2FzZSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyA1MDAwO1xuXG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIC8vIFRPRE86IFJldHJpZXMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gZXhwaXJlIGlmIHRoZXkgYXJlIENQVSBib3VuZCBmb3JcbiAgICAgIC8vIHRvbyBsb25nLCBidXQgd2hlbiBJIG1hZGUgdGhpcyBjaGFuZ2UgaXQgY2F1c2VkIGEgc3Bpa2UgaW4gYnJvd3NlclxuICAgICAgLy8gY3Jhc2hlcy4gVGhlcmUgbXVzdCBiZSBzb21lIG90aGVyIHVuZGVybHlpbmcgYnVnOyBub3Qgc3VwZXIgdXJnZW50IGJ1dFxuICAgICAgLy8gaWRlYWxseSBzaG91bGQgZmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gVW5mb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlXG4gICAgICAvLyBhIHJlcHJvIGZvciB0aGUgY3Jhc2hlcywgb25seSBkZXRlY3RlZCB2aWEgcHJvZHVjdGlvbiBtZXRyaWNzLlxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuXG4gICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSWRsZUh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICBjYXNlIE9mZnNjcmVlbkxhbmU6XG4gICAgICAvLyBBbnl0aGluZyBpZGxlIHByaW9yaXR5IG9yIGxvd2VyIHNob3VsZCBuZXZlciBleHBpcmUuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBlcnJvcignU2hvdWxkIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFuZXMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB3ZSB5aWVsZC4gV2UgY2FuIG9wdGltaXplIGJ5IHN0b3JpbmdcbiAgLy8gdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZSBvbiB0aGUgcm9vdC4gVGhlbiB1c2UgdGhhdCB0byBxdWlja2x5IGJhaWwgb3V0XG4gIC8vIG9mIHRoaXMgZnVuY3Rpb24uXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBlbmRpbmcgbGFuZXMgYW5kIGNoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlaXJcbiAgLy8gZXhwaXJhdGlvbiB0aW1lLiBJZiBzbywgd2UnbGwgYXNzdW1lIHRoZSB1cGRhdGUgaXMgYmVpbmcgc3RhcnZlZCBhbmQgbWFya1xuICAvLyBpdCBhcyBleHBpcmVkIHRvIGZvcmNlIGl0IHRvIGZpbmlzaC5cblxuICB2YXIgbGFuZXMgPSBwZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV4cGlyYXRpb25UaW1lID09PSBOb1RpbWVzdGFtcCkge1xuICAgICAgLy8gRm91bmQgYSBwZW5kaW5nIGxhbmUgd2l0aCBubyBleHBpcmF0aW9uIHRpbWUuIElmIGl0J3Mgbm90IHN1c3BlbmRlZCwgb3JcbiAgICAgIC8vIGlmIGl0J3MgcGluZ2VkLCBhc3N1bWUgaXQncyBDUFUtYm91bmQuIENvbXB1dGUgYSBuZXcgZXhwaXJhdGlvbiB0aW1lXG4gICAgICAvLyB1c2luZyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgaWYgKChsYW5lICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzIHx8IChsYW5lICYgcGluZ2VkTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIC8vIEFzc3VtZXMgdGltZXN0YW1wcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGxhbmUgZXhwaXJlZFxuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufSAvLyBUaGlzIHJldHVybnMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcGVuZGluZyBsYW5lcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleVxuLy8gYXJlIHN1c3BlbmRlZC5cblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5UGVuZGluZ0xhbmVzKHJvb3QpIHtcbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHJvb3QucGVuZGluZ0xhbmVzKTtcbn1cbmZ1bmN0aW9uIGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpIHtcbiAgdmFyIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gPSByb290LnBlbmRpbmdMYW5lcyAmIH5PZmZzY3JlZW5MYW5lO1xuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW47XG4gIH1cblxuICBpZiAoZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiAmIE9mZnNjcmVlbkxhbmUpIHtcbiAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTtcbiAgfVxuXG4gIHJldHVybiBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNTeW5jTGFuZShsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgU3luY0xhbmUpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNOb25JZGxlV29yayhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgTm9uSWRsZUxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFJldHJ5TGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKGxhbmVzKSB7XG4gIHZhciBVcmdlbnRMYW5lcyA9IFN5bmNMYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRMYW5lO1xuICByZXR1cm4gKGxhbmVzICYgVXJnZW50TGFuZXMpID09PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFRyYW5zaXRpb25MYW5lcykgPT09IGxhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpIHtcblxuICB2YXIgU3luY0RlZmF1bHRMYW5lcyA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgfCBEZWZhdWx0TGFuZTtcbiAgcmV0dXJuIChsYW5lcyAmIFN5bmNEZWZhdWx0TGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykge1xuICAvLyBUaGlzIGlzIGEgc2VwYXJhdGUgY2hlY2sgZnJvbSBpbmNsdWRlc0Jsb2NraW5nTGFuZSBiZWNhdXNlIGEgbGFuZSBjYW5cbiAgLy8gZXhwaXJlIGFmdGVyIGEgcmVuZGVyIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuXG4gIHJldHVybiAobGFuZXMgJiByb290LmV4cGlyZWRMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpc1RyYW5zaXRpb25MYW5lKGxhbmUpIHtcbiAgcmV0dXJuIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCkge1xuICAvLyBDeWNsZSB0aHJvdWdoIHRoZSBsYW5lcywgYXNzaWduaW5nIGVhY2ggbmV3IHRyYW5zaXRpb24gdG8gdGhlIG5leHQgbGFuZS5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBtZWFucyBldmVyeSB0cmFuc2l0aW9uIGdldHMgaXRzIG93biBsYW5lLCB1bnRpbCB3ZVxuICAvLyBydW4gb3V0IG9mIGxhbmVzIGFuZCBjeWNsZSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuXG4gIHZhciBsYW5lID0gbmV4dFRyYW5zaXRpb25MYW5lO1xuICBuZXh0VHJhbnNpdGlvbkxhbmUgPDw9IDE7XG5cbiAgaWYgKChuZXh0VHJhbnNpdGlvbkxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgbmV4dFRyYW5zaXRpb25MYW5lID0gVHJhbnNpdGlvbkxhbmUxO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBjbGFpbU5leHRSZXRyeUxhbmUoKSB7XG4gIHZhciBsYW5lID0gbmV4dFJldHJ5TGFuZTtcbiAgbmV4dFJldHJ5TGFuZSA8PD0gMTtcblxuICBpZiAoKG5leHRSZXRyeUxhbmUgJiBSZXRyeUxhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSB7XG4gIHJldHVybiBsYW5lcyAmIC1sYW5lcztcbn1cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lKGxhbmVzKSB7XG4gIC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBnZXRzIGlubGluZWQuIE9ubHkgZXhpc3RzIHNvIHRvIGNvbW11bmljYXRlIHRoYXQgaXRcbiAgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggYml0IGlzIHNlbGVjdGVkOyB5b3UgY2FuIHBpY2sgYW55IGJpdCB3aXRob3V0XG4gIC8vIGFmZmVjdGluZyB0aGUgYWxnb3JpdGhtcyB3aGVyZSBpdHMgdXNlZC4gSGVyZSBJJ20gdXNpbmdcbiAgLy8gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBmZXdlc3Qgb3BlcmF0aW9ucy5cbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKSB7XG4gIHJldHVybiAzMSAtIGNsejMyKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbGFuZVRvSW5kZXgobGFuZSkge1xuICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lKTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNTb21lTGFuZShhLCBiKSB7XG4gIHJldHVybiAoYSAmIGIpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNTdWJzZXRPZkxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiAoc2V0ICYgc3Vic2V0KSA9PT0gc3Vic2V0O1xufVxuZnVuY3Rpb24gbWVyZ2VMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhIHwgYjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiBzZXQgJiB+c3Vic2V0O1xufVxuZnVuY3Rpb24gaW50ZXJzZWN0TGFuZXMoYSwgYikge1xuICByZXR1cm4gYSAmIGI7XG59IC8vIFNlZW1zIHJlZHVuZGFudCwgYnV0IGl0IGNoYW5nZXMgdGhlIHR5cGUgZnJvbSBhIHNpbmdsZSBsYW5lICh1c2VkIGZvclxuLy8gdXBkYXRlcykgdG8gYSBncm91cCBvZiBsYW5lcyAodXNlZCBmb3IgZmx1c2hpbmcgd29yaykuXG5cbmZ1bmN0aW9uIGxhbmVUb0xhbmVzKGxhbmUpIHtcbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBoaWdoZXJQcmlvcml0eUxhbmUoYSwgYikge1xuICAvLyBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGJpdCByYW5nZXMgZGVjcmVhc2UgaW4gcHJpb3JpdHkgYXMgeW91IGdvIGxlZnQuXG4gIHJldHVybiBhICE9PSBOb0xhbmUgJiYgYSA8IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxhbmVNYXAoaW5pdGlhbCkge1xuICAvLyBJbnRlbnRpb25hbGx5IHB1c2hpbmcgb25lIGJ5IG9uZS5cbiAgLy8gaHR0cHM6Ly92OC5kZXYvYmxvZy9lbGVtZW50cy1raW5kcyNhdm9pZC1jcmVhdGluZy1ob2xlc1xuICB2YXIgbGFuZU1hcCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVG90YWxMYW5lczsgaSsrKSB7XG4gICAgbGFuZU1hcC5wdXNoKGluaXRpYWwpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmVNYXA7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgdXBkYXRlTGFuZSwgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGVuZGluZ0xhbmVzIHw9IHVwZGF0ZUxhbmU7IC8vIElmIHRoZXJlIGFyZSBhbnkgc3VzcGVuZGVkIHRyYW5zaXRpb25zLCBpdCdzIHBvc3NpYmxlIHRoaXMgbmV3IHVwZGF0ZVxuICAvLyBjb3VsZCB1bmJsb2NrIHRoZW0uIENsZWFyIHRoZSBzdXNwZW5kZWQgbGFuZXMgc28gdGhhdCB3ZSBjYW4gdHJ5IHJlbmRlcmluZ1xuICAvLyB0aGVtIGFnYWluLlxuICAvL1xuICAvLyBUT0RPOiBXZSByZWFsbHkgb25seSBuZWVkIHRvIHVuc3VzcGVuZCBvbmx5IGxhbmVzIHRoYXQgYXJlIGluIHRoZVxuICAvLyBgc3VidHJlZUxhbmVzYCBvZiB0aGUgdXBkYXRlZCBmaWJlciwgb3IgdGhlIHVwZGF0ZSBsYW5lcyBvZiB0aGUgcmV0dXJuXG4gIC8vIHBhdGguIFRoaXMgd291bGQgZXhjbHVkZSBzdXNwZW5kZWQgdXBkYXRlcyBpbiBhbiB1bnJlbGF0ZWQgc2libGluZyB0cmVlLFxuICAvLyBzaW5jZSB0aGVyZSdzIG5vIHdheSBmb3IgdGhpcyB1cGRhdGUgdG8gdW5ibG9jayBpdC5cbiAgLy9cbiAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpZiB0aGUgaW5jb21pbmcgdXBkYXRlIGlzIGlkbGUsIGJlY2F1c2Ugd2UgbmV2ZXIgcHJvY2Vzc1xuICAvLyBpZGxlIHVwZGF0ZXMgdW50aWwgYWZ0ZXIgYWxsIHRoZSByZWd1bGFyIHVwZGF0ZXMgaGF2ZSBmaW5pc2hlZDsgdGhlcmUncyBub1xuICAvLyB3YXkgaXQgY291bGQgdW5ibG9jayBhIHRyYW5zaXRpb24uXG5cbiAgaWYgKHVwZGF0ZUxhbmUgIT09IElkbGVMYW5lKSB7XG4gICAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcm9vdC5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgodXBkYXRlTGFuZSk7IC8vIFdlIGNhbiBhbHdheXMgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRpbWVzdGFtcCBiZWNhdXNlIHdlIHByZWZlciB0aGUgbW9zdFxuICAvLyByZWNlbnQgZXZlbnQsIGFuZCB3ZSBhc3N1bWUgdGltZSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG5cbiAgZXZlbnRUaW1lc1tpbmRleF0gPSBldmVudFRpbWU7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICByb290LnN1c3BlbmRlZExhbmVzIHw9IHN1c3BlbmRlZExhbmVzO1xuICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lczsgLy8gVGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIENQVS1ib3VuZC4gQ2xlYXIgdGhlaXIgZXhwaXJhdGlvbiB0aW1lcy5cblxuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7XG4gIHZhciBsYW5lcyA9IHN1c3BlbmRlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcywgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcykge1xuICB2YXIgbm9Mb25nZXJQZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcyAmIH5yZW1haW5pbmdMYW5lcztcbiAgcm9vdC5wZW5kaW5nTGFuZXMgPSByZW1haW5pbmdMYW5lczsgLy8gTGV0J3MgdHJ5IGV2ZXJ5dGhpbmcgYWdhaW5cblxuICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHJvb3QuZXhwaXJlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290Lm11dGFibGVSZWFkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QuZW50YW5nbGVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBDbGVhciB0aGUgbGFuZXMgdGhhdCBubyBsb25nZXIgaGF2ZSBwZW5kaW5nIHdvcmtcblxuICB2YXIgbGFuZXMgPSBub0xvbmdlclBlbmRpbmdMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdID0gTm9MYW5lcztcbiAgICBldmVudFRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgZW50YW5nbGVkTGFuZXMpIHtcbiAgLy8gSW4gYWRkaXRpb24gdG8gZW50YW5nbGluZyBlYWNoIG9mIHRoZSBnaXZlbiBsYW5lcyB3aXRoIGVhY2ggb3RoZXIsIHdlIGFsc29cbiAgLy8gaGF2ZSB0byBjb25zaWRlciBfdHJhbnNpdGl2ZV8gZW50YW5nbGVtZW50cy4gRm9yIGVhY2ggbGFuZSB0aGF0IGlzIGFscmVhZHlcbiAgLy8gZW50YW5nbGVkIHdpdGggKmFueSogb2YgdGhlIGdpdmVuIGxhbmVzLCB0aGF0IGxhbmUgaXMgbm93IHRyYW5zaXRpdmVseVxuICAvLyBlbnRhbmdsZWQgd2l0aCAqYWxsKiB0aGUgZ2l2ZW4gbGFuZXMuXG4gIC8vXG4gIC8vIFRyYW5zbGF0ZWQ6IElmIEMgaXMgZW50YW5nbGVkIHdpdGggQSwgdGhlbiBlbnRhbmdsaW5nIEEgd2l0aCBCIGFsc29cbiAgLy8gZW50YW5nbGVzIEMgd2l0aCBCLlxuICAvL1xuICAvLyBJZiB0aGlzIGlzIGhhcmQgdG8gZ3Jhc3AsIGl0IG1pZ2h0IGhlbHAgdG8gaW50ZW50aW9uYWxseSBicmVhayB0aGlzXG4gIC8vIGZ1bmN0aW9uIGFuZCBsb29rIGF0IHRoZSB0ZXN0cyB0aGF0IGZhaWwgaW4gUmVhY3RUcmFuc2l0aW9uLXRlc3QuanMuIFRyeVxuICAvLyBjb21tZW50aW5nIG91dCBvbmUgb2YgdGhlIGNvbmRpdGlvbnMgYmVsb3cuXG4gIHZhciByb290RW50YW5nbGVkTGFuZXMgPSByb290LmVudGFuZ2xlZExhbmVzIHw9IGVudGFuZ2xlZExhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGxhbmVzID0gcm9vdEVudGFuZ2xlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcykge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcblxuICAgIGlmICggLy8gSXMgdGhpcyBvbmUgb2YgdGhlIG5ld2x5IGVudGFuZ2xlZCBsYW5lcz9cbiAgICBsYW5lICYgZW50YW5nbGVkTGFuZXMgfCAvLyBJcyB0aGlzIGxhbmUgdHJhbnNpdGl2ZWx5IGVudGFuZ2xlZCB3aXRoIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/XG4gICAgZW50YW5nbGVtZW50c1tpbmRleF0gJiBlbnRhbmdsZWRMYW5lcykge1xuICAgICAgZW50YW5nbGVtZW50c1tpbmRleF0gfD0gZW50YW5nbGVkTGFuZXM7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb24ocm9vdCwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHJlbmRlckxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKHJlbmRlckxhbmVzKTtcbiAgdmFyIGxhbmU7XG5cbiAgc3dpdGNoIChyZW5kZXJMYW5lKSB7XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgbGFuZSA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgICBsYW5lID0gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgbGFuZSA9IFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVMYW5lOlxuICAgICAgbGFuZSA9IElkbGVIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRXZlcnl0aGluZyBlbHNlIGlzIGFscmVhZHkgZWl0aGVyIGEgaHlkcmF0aW9uIGxhbmUsIG9yIHNob3VsZG4ndFxuICAgICAgLy8gYmUgcmV0cmllZCBhdCBhIGh5ZHJhdGlvbiBsYW5lLlxuICAgICAgbGFuZSA9IE5vTGFuZTtcbiAgICAgIGJyZWFrO1xuICB9IC8vIENoZWNrIGlmIHRoZSBsYW5lIHdlIGNob3NlIGlzIHN1c3BlbmRlZC4gSWYgc28sIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2VcbiAgLy8gYWxyZWFkeSBhdHRlbXB0ZWQgYW5kIGZhaWxlZCB0byBoeWRyYXRlIGF0IHRoYXQgbGV2ZWwuIEFsc28gY2hlY2sgaWYgd2UncmVcbiAgLy8gYWxyZWFkeSByZW5kZXJpbmcgdGhhdCBsYW5lLCB3aGljaCBpcyByYXJlIGJ1dCBjb3VsZCBoYXBwZW4uXG5cblxuICBpZiAoKGxhbmUgJiAocm9vdC5zdXNwZW5kZWRMYW5lcyB8IHJlbmRlckxhbmVzKSkgIT09IE5vTGFuZSkge1xuICAgIC8vIEdpdmUgdXAgdHJ5aW5nIHRvIGh5ZHJhdGUgYW5kIGZhbGwgYmFjayB0byBjbGllbnQgcmVuZGVyLlxuICAgIHJldHVybiBOb0xhbmU7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZXMpIHtcblxuICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXA7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07XG4gICAgdXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKSB7XG5cbiAgaWYgKCFpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwO1xuICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTtcblxuICAgIGlmICh1cGRhdGVycy5zaXplID4gMCkge1xuICAgICAgdXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICBpZiAoYWx0ZXJuYXRlID09PSBudWxsIHx8ICFtZW1vaXplZFVwZGF0ZXJzLmhhcyhhbHRlcm5hdGUpKSB7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5hZGQoZmliZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25zRm9yTGFuZXMocm9vdCwgbGFuZXMpIHtcbiAge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciBEaXNjcmV0ZUV2ZW50UHJpb3JpdHkgPSBTeW5jTGFuZTtcbnZhciBDb250aW51b3VzRXZlbnRQcmlvcml0eSA9IElucHV0Q29udGludW91c0xhbmU7XG52YXIgRGVmYXVsdEV2ZW50UHJpb3JpdHkgPSBEZWZhdWx0TGFuZTtcbnZhciBJZGxlRXZlbnRQcmlvcml0eSA9IElkbGVMYW5lO1xudmFyIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IE5vTGFuZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpIHtcbiAgcmV0dXJuIGN1cnJlbnRVcGRhdGVQcmlvcml0eTtcbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShuZXdQcmlvcml0eSkge1xuICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBuZXdQcmlvcml0eTtcbn1cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eShwcmlvcml0eSwgZm4pIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBjdXJyZW50VXBkYXRlUHJpb3JpdHk7XG5cbiAgdHJ5IHtcbiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBwcmV2aW91c1ByaW9yaXR5O1xuICB9XG59XG5mdW5jdGlvbiBoaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgIT09IDAgJiYgYSA8IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGxvd2VyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhID09PSAwIHx8IGEgPiBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBpc0hpZ2hlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYjtcbn1cbmZ1bmN0aW9uIGxhbmVzVG9FdmVudFByaW9yaXR5KGxhbmVzKSB7XG4gIHZhciBsYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcyk7XG5cbiAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5LCBsYW5lKSkge1xuICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSwgbGFuZSkpIHtcbiAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG4gIH1cblxuICBpZiAoaW5jbHVkZXNOb25JZGxlV29yayhsYW5lKSkge1xuICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTtcbn1cblxuLy8gVGhpcyBpcyBpbXBvcnRlZCBieSB0aGUgZXZlbnQgcmVwbGF5aW5nIGltcGxlbWVudGF0aW9uIGluIFJlYWN0IERPTS4gSXQnc1xuLy8gaW4gYSBzZXBhcmF0ZSBmaWxlIHRvIGJyZWFrIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSByZW5kZXJlciBhbmRcbi8vIHRoZSByZWNvbmNpbGVyLlxuZnVuY3Rpb24gaXNSb290RGVoeWRyYXRlZChyb290KSB7XG4gIHZhciBjdXJyZW50U3RhdGUgPSByb290LmN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIGN1cnJlbnRTdGF0ZS5pc0RlaHlkcmF0ZWQ7XG59XG5cbnZhciBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uO1xuXG5mdW5jdGlvbiBzZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZm4pIHtcbiAgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiA9IGZuO1xufVxuZnVuY3Rpb24gYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKSB7XG4gIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpO1xufVxudmFyIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uO1xuZnVuY3Rpb24gc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24gPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5ID0gZm47XG59XG52YXIgZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDE7XG5mdW5jdGlvbiBzZXRHZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoZm4pIHtcbiAgZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDEgPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eTtcbmZ1bmN0aW9uIHNldEF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KGZuKSB7XG4gIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5ID0gZm47XG59IC8vIFRPRE86IFVwZ3JhZGUgdGhpcyBkZWZpbml0aW9uIG9uY2Ugd2UncmUgb24gYSBuZXdlciB2ZXJzaW9uIG9mIEZsb3cgdGhhdFxuLy8gaGFzIHRoaXMgZGVmaW5pdGlvbiBidWlsdC1pbi5cblxudmFyIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTsgLy8gVGhlIHF1ZXVlIG9mIGRpc2NyZXRlIGV2ZW50cyB0byBiZSByZXBsYXllZC5cblxudmFyIHF1ZXVlZERpc2NyZXRlRXZlbnRzID0gW107IC8vIEluZGljYXRlcyBpZiBhbnkgY29udGludW91cyBldmVudCB0YXJnZXRzIGFyZSBub24tbnVsbCBmb3IgZWFybHkgYmFpbG91dC5cbi8vIGlmIHRoZSBsYXN0IHRhcmdldCB3YXMgZGVoeWRyYXRlZC5cblxudmFyIHF1ZXVlZEZvY3VzID0gbnVsbDtcbnZhciBxdWV1ZWREcmFnID0gbnVsbDtcbnZhciBxdWV1ZWRNb3VzZSA9IG51bGw7IC8vIEZvciBwb2ludGVyIGV2ZW50cyB0aGVyZSBjYW4gYmUgb25lIGxhdGVzdCBldmVudCBwZXIgcG9pbnRlcklkLlxuXG52YXIgcXVldWVkUG9pbnRlcnMgPSBuZXcgTWFwKCk7XG52YXIgcXVldWVkUG9pbnRlckNhcHR1cmVzID0gbmV3IE1hcCgpOyAvLyBXZSBjb3VsZCBjb25zaWRlciByZXBsYXlpbmcgc2VsZWN0aW9uY2hhbmdlIGFuZCB0b3VjaG1vdmVzIHRvby5cblxudmFyIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cyA9IFtdO1xudmFyIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cyA9IFsnbW91c2Vkb3duJywgJ21vdXNldXAnLCAndG91Y2hjYW5jZWwnLCAndG91Y2hlbmQnLCAndG91Y2hzdGFydCcsICdhdXhjbGljaycsICdkYmxjbGljaycsICdwb2ludGVyY2FuY2VsJywgJ3BvaW50ZXJkb3duJywgJ3BvaW50ZXJ1cCcsICdkcmFnZW5kJywgJ2RyYWdzdGFydCcsICdkcm9wJywgJ2NvbXBvc2l0aW9uZW5kJywgJ2NvbXBvc2l0aW9uc3RhcnQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdpbnB1dCcsICd0ZXh0SW5wdXQnLCAvLyBJbnRlbnRpb25hbGx5IGNhbWVsQ2FzZVxuJ2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ2NsaWNrJywgJ2NoYW5nZScsICdjb250ZXh0bWVudScsICdyZXNldCcsICdzdWJtaXQnXTtcbmZ1bmN0aW9uIGlzRGlzY3JldGVFdmVudFRoYXRSZXF1aXJlc0h5ZHJhdGlvbihldmVudFR5cGUpIHtcbiAgcmV0dXJuIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cy5pbmRleE9mKGV2ZW50VHlwZSkgPiAtMTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUXVldWVkUmVwbGF5YWJsZUV2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgYmxvY2tlZE9uOiBibG9ja2VkT24sXG4gICAgZG9tRXZlbnROYW1lOiBkb21FdmVudE5hbWUsXG4gICAgZXZlbnRTeXN0ZW1GbGFnczogZXZlbnRTeXN0ZW1GbGFncyxcbiAgICBuYXRpdmVFdmVudDogbmF0aXZlRXZlbnQsXG4gICAgdGFyZ2V0Q29udGFpbmVyczogW3RhcmdldENvbnRhaW5lcl1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgcXVldWVkRm9jdXMgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuZGVsZXRlKHBvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZGVsZXRlKF9wb2ludGVySWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KGV4aXN0aW5nUXVldWVkRXZlbnQsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChleGlzdGluZ1F1ZXVlZEV2ZW50ID09PSBudWxsIHx8IGV4aXN0aW5nUXVldWVkRXZlbnQubmF0aXZlRXZlbnQgIT09IG5hdGl2ZUV2ZW50KSB7XG4gICAgdmFyIHF1ZXVlZEV2ZW50ID0gY3JlYXRlUXVldWVkUmVwbGF5YWJsZUV2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICAgIGlmIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIHZhciBfZmliZXIyID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShibG9ja2VkT24pO1xuXG4gICAgICBpZiAoX2ZpYmVyMiAhPT0gbnVsbCkge1xuICAgICAgICAvLyBBdHRlbXB0IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGlzIHRhcmdldC5cbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXVlZEV2ZW50O1xuICB9IC8vIElmIHdlIGhhdmUgYWxyZWFkeSBxdWV1ZWQgdGhpcyBleGFjdCBldmVudCwgdGhlbiBpdCdzIGJlY2F1c2VcbiAgLy8gdGhlIGRpZmZlcmVudCBldmVudCBzeXN0ZW1zIGhhdmUgZGlmZmVyZW50IERPTSBldmVudCBsaXN0ZW5lcnMuXG4gIC8vIFdlIGNhbiBhY2N1bXVsYXRlIHRoZSBmbGFncywgYW5kIHRoZSB0YXJnZXRDb250YWluZXJzLCBhbmRcbiAgLy8gc3RvcmUgYSBzaW5nbGUgZXZlbnQgdG8gYmUgcmVwbGF5ZWQuXG5cblxuICBleGlzdGluZ1F1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MgfD0gZXZlbnRTeXN0ZW1GbGFncztcbiAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBleGlzdGluZ1F1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gbnVsbCAmJiB0YXJnZXRDb250YWluZXJzLmluZGV4T2YodGFyZ2V0Q29udGFpbmVyKSA9PT0gLTEpIHtcbiAgICB0YXJnZXRDb250YWluZXJzLnB1c2godGFyZ2V0Q29udGFpbmVyKTtcbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1F1ZXVlZEV2ZW50O1xufVxuXG5mdW5jdGlvbiBxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRoZXNlIHNldCByZWxhdGVkVGFyZ2V0IHRvIG51bGwgYmVjYXVzZSB0aGUgcmVwbGF5ZWQgZXZlbnQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIHdlXG4gIC8vIG1vdmVkIGZyb20gb3V0c2lkZSB0aGUgd2luZG93IChubyB0YXJnZXQpIG9udG8gdGhlIHRhcmdldCBvbmNlIGl0IGh5ZHJhdGVzLlxuICAvLyBJbnN0ZWFkIG9mIG11dGF0aW5nIHdlIGNvdWxkIGNsb25lIHRoZSBldmVudC5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZvY3VzRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRm9jdXMgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZEZvY3VzLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBmb2N1c0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgZHJhZ0V2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZERyYWcgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZERyYWcsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGRyYWdFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIG1vdXNlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkTW91c2UgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZE1vdXNlLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBtb3VzZUV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBwb2ludGVyRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIHBvaW50ZXJJZCA9IHBvaW50ZXJFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJzLnNldChwb2ludGVySWQsIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkUG9pbnRlcnMuZ2V0KHBvaW50ZXJJZCkgfHwgbnVsbCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcG9pbnRlckV2ZW50KSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgICAge1xuICAgICAgICB2YXIgX3BvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgX3BvaW50ZXJJZDIgPSBfcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLnNldChfcG9pbnRlcklkMiwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZ2V0KF9wb2ludGVySWQyKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBfcG9pbnRlckV2ZW50KSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBDaGVjayBpZiB0aGlzIHRhcmdldCBpcyB1bmJsb2NrZWQuIFJldHVybnMgdHJ1ZSBpZiBpdCdzIHVuYmxvY2tlZC5cblxuZnVuY3Rpb24gYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCkge1xuICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNoYXJlcyBhIGxvdCBvZiBsb2dpYyB3aXRoIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQuXG4gIC8vIFRyeSB0byB1bmlmeSB0aGVtLiBJdCdzIGEgYml0IHRyaWNreSBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIHR3byByZXR1cm5cbiAgLy8gdmFsdWVzLlxuICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHF1ZXVlZFRhcmdldC50YXJnZXQpO1xuXG4gIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXRJbnN0KTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmxvY2tlZCBvbiBoeWRyYXRpbmcgdGhpcyBib3VuZGFyeS5cbiAgICAgICAgICAvLyBJbmNyZWFzZSBpdHMgcHJpb3JpdHkuXG4gICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IGluc3RhbmNlO1xuICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KHF1ZXVlZFRhcmdldC5wcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICB2YXIgcm9vdCA9IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBnZXRDb250YWluZXJGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpOyAvLyBXZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBhIHdheSB0byBpbmNyZWFzZSB0aGUgcHJpb3JpdHkgb2ZcbiAgICAgICAgICAvLyBhIHJvb3Qgb3RoZXIgdGhhbiBzeW5jLlxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlRXhwbGljaXRIeWRyYXRpb25UYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgd2lsbCByZWFkIHRoZSBwcmlvcml0eSBpZiBpdCdzIGRpc3BhdGNoZWQgYnkgdGhlIFJlYWN0XG4gIC8vIGV2ZW50IHN5c3RlbSBidXQgbm90IG5hdGl2ZSBldmVudHMuIFNob3VsZCByZWFkIHdpbmRvdy5ldmVudC50eXBlLCBsaWtlXG4gIC8vIHdlIGRvIGZvciB1cGRhdGVzIChnZXRDdXJyZW50RXZlbnRQcmlvcml0eSkuXG4gIHZhciB1cGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxKCk7XG4gIHZhciBxdWV1ZWRUYXJnZXQgPSB7XG4gICAgYmxvY2tlZE9uOiBudWxsLFxuICAgIHRhcmdldDogdGFyZ2V0LFxuICAgIHByaW9yaXR5OiB1cGRhdGVQcmlvcml0eVxuICB9O1xuICB2YXIgaSA9IDA7XG5cbiAgZm9yICg7IGkgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBTdG9wIG9uY2Ugd2UgaGl0IHRoZSBmaXJzdCB0YXJnZXQgd2l0aCBsb3dlciBwcmlvcml0eSB0aGFuXG4gICAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkodXBkYXRlUHJpb3JpdHksIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tpXS5wcmlvcml0eSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5zcGxpY2UoaSwgMCwgcXVldWVkVGFyZ2V0KTtcblxuICBpZiAoaSA9PT0gMCkge1xuICAgIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRXZlbnQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0YXJnZXRDb250YWluZXJzID0gcXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICB3aGlsZSAodGFyZ2V0Q29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHRhcmdldENvbnRhaW5lciA9IHRhcmdldENvbnRhaW5lcnNbMF07XG4gICAgdmFyIG5leHRCbG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KHF1ZXVlZEV2ZW50LmRvbUV2ZW50TmFtZSwgcXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBxdWV1ZWRFdmVudC5uYXRpdmVFdmVudCk7XG5cbiAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB2YXIgbmF0aXZlRXZlbnQgPSBxdWV1ZWRFdmVudC5uYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIG5hdGl2ZUV2ZW50Q2xvbmUgPSBuZXcgbmF0aXZlRXZlbnQuY29uc3RydWN0b3IobmF0aXZlRXZlbnQudHlwZSwgbmF0aXZlRXZlbnQpO1xuICAgICAgICBzZXRSZXBsYXlpbmdFdmVudChuYXRpdmVFdmVudENsb25lKTtcbiAgICAgICAgbmF0aXZlRXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgIHJlc2V0UmVwbGF5aW5nRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC4gVHJ5IGFnYWluIGxhdGVyLlxuICAgICAgdmFyIF9maWJlcjMgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKG5leHRCbG9ja2VkT24pO1xuXG4gICAgICBpZiAoX2ZpYmVyMyAhPT0gbnVsbCkge1xuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIzKTtcbiAgICAgIH1cblxuICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIFRoaXMgdGFyZ2V0IGNvbnRhaW5lciB3YXMgc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQuIFRyeSB0aGUgbmV4dC5cblxuXG4gICAgdGFyZ2V0Q29udGFpbmVycy5zaGlmdCgpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcChxdWV1ZWRFdmVudCwga2V5LCBtYXApIHtcbiAgaWYgKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRXZlbnQpKSB7XG4gICAgbWFwLmRlbGV0ZShrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxheVVuYmxvY2tlZEV2ZW50cygpIHtcbiAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IGZhbHNlO1xuXG5cbiAgaWYgKHF1ZXVlZEZvY3VzICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRm9jdXMpKSB7XG4gICAgcXVldWVkRm9jdXMgPSBudWxsO1xuICB9XG5cbiAgaWYgKHF1ZXVlZERyYWcgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWREcmFnKSkge1xuICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICB9XG5cbiAgaWYgKHF1ZXVlZE1vdXNlICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkTW91c2UpKSB7XG4gICAgcXVldWVkTW91c2UgPSBudWxsO1xuICB9XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXApO1xuICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZm9yRWFjaChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXApO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCkge1xuICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuXG4gICAgaWYgKCFoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0KSB7XG4gICAgICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gdHJ1ZTsgLy8gU2NoZWR1bGUgYSBjYWxsYmFjayB0byBhdHRlbXB0IHJlcGxheWluZyBhcyBtYW55IGV2ZW50cyBhcyBhcmVcbiAgICAgIC8vIG5vdyB1bmJsb2NrZWQuIFRoaXMgZmlyc3QgbWlnaHQgbm90IGFjdHVhbGx5IGJlIHVuYmxvY2tlZCB5ZXQuXG4gICAgICAvLyBXZSBjb3VsZCBjaGVjayBpdCBlYXJseSB0byBhdm9pZCBzY2hlZHVsaW5nIGFuIHVubmVjZXNzYXJ5IGNhbGxiYWNrLlxuXG4gICAgICBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksIHJlcGxheVVuYmxvY2tlZEV2ZW50cyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJldHJ5SWZCbG9ja2VkT24odW5ibG9ja2VkKSB7XG4gIC8vIE1hcmsgYW55dGhpbmcgdGhhdCB3YXMgYmxvY2tlZCBvbiB0aGlzIGFzIG5vIGxvbmdlciBibG9ja2VkXG4gIC8vIGFuZCBlbGlnaWJsZSBmb3IgYSByZXBsYXkuXG4gIGlmIChxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERpc2NyZXRlRXZlbnRzWzBdLCB1bmJsb2NrZWQpOyAvLyBUaGlzIGlzIGEgZXhwb25lbnRpYWwgc2VhcmNoIGZvciBlYWNoIGJvdW5kYXJ5IHRoYXQgY29tbWl0cy4gSSB0aGluayBpdCdzXG4gICAgLy8gd29ydGggaXQgYmVjYXVzZSB3ZSBleHBlY3QgdmVyeSBmZXcgZGlzY3JldGUgZXZlbnRzIHRvIHF1ZXVlIHVwIGFuZCBvbmNlXG4gICAgLy8gd2UgYXJlIGFjdHVhbGx5IGZ1bGx5IHVuYmxvY2tlZCBpdCB3aWxsIGJlIGZhc3QgdG8gcmVwbGF5IHRoZW0uXG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHF1ZXVlZERpc2NyZXRlRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVldWVkRXZlbnQgPSBxdWV1ZWREaXNjcmV0ZUV2ZW50c1tpXTtcblxuICAgICAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHF1ZXVlZEZvY3VzICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEZvY3VzLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgaWYgKHF1ZXVlZERyYWcgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRHJhZywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRNb3VzZSwgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIHZhciB1bmJsb2NrID0gZnVuY3Rpb24gKHF1ZXVlZEV2ZW50KSB7XG4gICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKTtcbiAgfTtcblxuICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKHVuYmxvY2spO1xuICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZm9yRWFjaCh1bmJsb2NrKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBxdWV1ZWRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbX2ldO1xuXG4gICAgaWYgKHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIG5leHRFeHBsaWNpdFRhcmdldCA9IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1swXTtcblxuICAgIGlmIChuZXh0RXhwbGljaXRUYXJnZXQuYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBzdGlsbCBibG9ja2VkLlxuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChuZXh0RXhwbGljaXRUYXJnZXQpO1xuXG4gICAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBXZSdyZSB1bmJsb2NrZWQuXG4gICAgICAgIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZzsgLy8gVE9ETzogY2FuIHdlIHN0b3AgZXhwb3J0aW5nIHRoZXNlP1xuXG52YXIgX2VuYWJsZWQgPSB0cnVlOyAvLyBUaGlzIGlzIGV4cG9ydGVkIGluIEZCIGJ1aWxkcyBmb3IgdXNlIGJ5IGxlZ2FjeSBGQiBsYXllciBpbmZyYS5cbi8vIFdlJ2QgbGlrZSB0byByZW1vdmUgdGhpcyBidXQgaXQncyBub3QgY2xlYXIgaWYgdGhpcyBpcyBzYWZlLlxuXG5mdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgX2VuYWJsZWQgPSAhIWVuYWJsZWQ7XG59XG5mdW5jdGlvbiBpc0VuYWJsZWQoKSB7XG4gIHJldHVybiBfZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBldmVudFByaW9yaXR5ID0gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpO1xuICB2YXIgbGlzdGVuZXJXcmFwcGVyO1xuXG4gIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcldyYXBwZXIuYmluZChudWxsLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcik7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRGlzY3JldGVFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaENvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoQ29udGludW91c0V2ZW50UHJpb3JpdHkpO1xuICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIGlmICghX2VuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRXaXRoRW5hYmxlQ2FwdHVyZVBoYXNlU2VsZWN0aXZlSHlkcmF0aW9uV2l0aG91dERpc2NyZXRlRXZlbnRSZXBsYXkoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBibG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgaWYgKGJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCByZXR1cm5fdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTtcbiAgICBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSkge1xuICAgIG5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHJldHVybjtcbiAgfSAvLyBXZSBuZWVkIHRvIGNsZWFyIG9ubHkgaWYgd2UgZGlkbid0IHF1ZXVlIGJlY2F1c2VcbiAgLy8gcXVldWVpbmcgaXMgYWNjdW11bGF0aXZlLlxuXG5cbiAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UgJiYgaXNEaXNjcmV0ZUV2ZW50VGhhdFJlcXVpcmVzSHlkcmF0aW9uKGRvbUV2ZW50TmFtZSkpIHtcbiAgICB3aGlsZSAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChmaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV4dEJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICAgICAgaWYgKG5leHRCbG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHJldHVybl90YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gYmxvY2tlZE9uKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uO1xuICAgIH1cblxuICAgIGlmIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIG5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSAvLyBUaGlzIGlzIG5vdCByZXBsYXlhYmxlIHNvIHdlJ2xsIGludm9rZSBpdCBidXQgd2l0aG91dCBhIHRhcmdldCxcbiAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgc3lzdGVtIG5lZWRzIHRvIHRyYWNlIGl0LlxuXG5cbiAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIG51bGwsIHRhcmdldENvbnRhaW5lcik7XG59XG5cbnZhciByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7IC8vIFJldHVybnMgYSBTdXNwZW5zZUluc3RhbmNlIG9yIENvbnRhaW5lciBpZiBpdCdzIGJsb2NrZWQuXG4vLyBUaGUgcmV0dXJuX3RhcmdldEluc3QgZmllbGQgYWJvdmUgaXMgY29uY2VwdHVhbGx5IHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZS5cblxuZnVuY3Rpb24gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVE9ETzogV2FybiBpZiBfZW5hYmxlZCBpcyBmYWxzZS5cbiAgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsO1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7XG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXRJbnN0KTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB0cmVlIGhhcyBiZWVuIHVubW91bnRlZCBhbHJlYWR5LiBEaXNwYXRjaCB3aXRob3V0IGEgdGFyZ2V0LlxuICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7XG5cbiAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFF1ZXVlIHRoZSBldmVudCB0byBiZSByZXBsYXllZCBsYXRlci4gQWJvcnQgZGlzcGF0Y2hpbmcgc2luY2Ugd2VcbiAgICAgICAgICAvLyBkb24ndCB3YW50IHRoaXMgZXZlbnQgZGlzcGF0Y2hlZCB0d2ljZSB0aHJvdWdoIHRoZSBldmVudCBzeXN0ZW0uXG4gICAgICAgICAgLy8gVE9ETzogSWYgdGhpcyBpcyB0aGUgZmlyc3QgZGlzY3JldGUgZXZlbnQgaW4gdGhlIHF1ZXVlLiBTY2hlZHVsZSBhbiBpbmNyZWFzZWRcbiAgICAgICAgICAvLyBwcmlvcml0eSBmb3IgdGhpcyBib3VuZGFyeS5cbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH0gLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBzb21ldGhpbmcgd2VudCB3cm9uZyBidXQgdG8gYXZvaWQgYmxvY2tpbmdcbiAgICAgICAgLy8gdGhlIHdob2xlIHN5c3RlbSwgZGlzcGF0Y2ggdGhlIGV2ZW50IHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICAgIC8vIFRPRE86IFdhcm4uXG5cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICB2YXIgcm9vdCA9IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgaGFwcGVucyBkdXJpbmcgYSByZXBsYXkgc29tZXRoaW5nIHdlbnQgd3JvbmcgYW5kIGl0IG1pZ2h0IGJsb2NrXG4gICAgICAgICAgLy8gdGhlIHdob2xlIHN5c3RlbS5cbiAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gdGFyZ2V0SW5zdCkge1xuICAgICAgICAvLyBJZiB3ZSBnZXQgYW4gZXZlbnQgKGV4OiBpbWcgb25sb2FkKSBiZWZvcmUgY29tbWl0dGluZyB0aGF0XG4gICAgICAgIC8vIGNvbXBvbmVudCdzIG1vdW50LCBpZ25vcmUgaXQgZm9yIG5vdyAodGhhdCBpcywgdHJlYXQgaXQgYXMgaWYgaXQgd2FzIGFuXG4gICAgICAgIC8vIGV2ZW50IG9uIGEgbm9uLVJlYWN0IHRyZWUpLiBXZSBtaWdodCBhbHNvIGNvbnNpZGVyIHF1ZXVlaW5nIGV2ZW50cyBhbmRcbiAgICAgICAgLy8gZGlzcGF0Y2hpbmcgdGhlbSBhZnRlciB0aGUgbW91bnQuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDsgLy8gV2UncmUgbm90IGJsb2NrZWQgb24gYW55dGhpbmcuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIC8vIFVzZWQgYnkgU2ltcGxlRXZlbnRQbHVnaW46XG4gICAgY2FzZSAnY2FuY2VsJzpcbiAgICBjYXNlICdjbGljayc6XG4gICAgY2FzZSAnY2xvc2UnOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICBjYXNlICdjb3B5JzpcbiAgICBjYXNlICdjdXQnOlxuICAgIGNhc2UgJ2F1eGNsaWNrJzpcbiAgICBjYXNlICdkYmxjbGljayc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICBjYXNlICdkcm9wJzpcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ2ludmFsaWQnOlxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdtb3VzZXVwJzpcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgY2FzZSAncGF1c2UnOlxuICAgIGNhc2UgJ3BsYXknOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVydXAnOlxuICAgIGNhc2UgJ3JhdGVjaGFuZ2UnOlxuICAgIGNhc2UgJ3Jlc2V0JzpcbiAgICBjYXNlICdyZXNpemUnOlxuICAgIGNhc2UgJ3NlZWtlZCc6XG4gICAgY2FzZSAnc3VibWl0JzpcbiAgICBjYXNlICd0b3VjaGNhbmNlbCc6XG4gICAgY2FzZSAndG91Y2hlbmQnOlxuICAgIGNhc2UgJ3RvdWNoc3RhcnQnOlxuICAgIGNhc2UgJ3ZvbHVtZWNoYW5nZSc6IC8vIFVzZWQgYnkgcG9seWZpbGxzOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnY2hhbmdlJzpcbiAgICBjYXNlICdzZWxlY3Rpb25jaGFuZ2UnOlxuICAgIGNhc2UgJ3RleHRJbnB1dCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9udXBkYXRlJzogLy8gT25seSBlbmFibGVDcmVhdGVFdmVudEhhbmRsZUFQSTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6IC8vIE5vdCB1c2VkIGJ5IFJlYWN0IGJ1dCBjb3VsZCBiZSBieSB1c2VyIGNvZGU6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdiZWZvcmVpbnB1dCc6XG4gICAgY2FzZSAnYmx1cic6XG4gICAgY2FzZSAnZnVsbHNjcmVlbmNoYW5nZSc6XG4gICAgY2FzZSAnZm9jdXMnOlxuICAgIGNhc2UgJ2hhc2hjaGFuZ2UnOlxuICAgIGNhc2UgJ3BvcHN0YXRlJzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3NlbGVjdHN0YXJ0JzpcbiAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG5cbiAgICBjYXNlICdkcmFnJzpcbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdleGl0JzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJtb3ZlJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICBjYXNlICd0b2dnbGUnOlxuICAgIGNhc2UgJ3RvdWNobW92ZSc6XG4gICAgY2FzZSAnd2hlZWwnOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnbW91c2VlbnRlcic6XG4gICAgY2FzZSAnbW91c2VsZWF2ZSc6XG4gICAgY2FzZSAncG9pbnRlcmVudGVyJzpcbiAgICBjYXNlICdwb2ludGVybGVhdmUnOlxuICAgICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuXG4gICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIG1pZ2h0IGJlIGluIHRoZSBTY2hlZHVsZXIgY2FsbGJhY2suXG4gICAgICAgIC8vIEV2ZW50dWFsbHkgdGhpcyBtZWNoYW5pc20gd2lsbCBiZSByZXBsYWNlZCBieSBhIGNoZWNrXG4gICAgICAgIC8vIG9mIHRoZSBjdXJyZW50IHByaW9yaXR5IG9uIHRoZSBuYXRpdmUgc2NoZWR1bGVyLlxuICAgICAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHkgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpO1xuXG4gICAgICAgIHN3aXRjaCAoc2NoZWR1bGVyUHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgTG93U2NoZWR1bGVyUHJpb3JpdHksIHNvbWVob3cuIE1heWJlIHRoZSBzYW1lIGxhbmUgYXMgaHlkcmF0aW9uLlxuICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gSWRsZUV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBUaGVzZSB2YXJpYWJsZXMgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGV4dCBjb250ZW50IG9mIGEgdGFyZ2V0IG5vZGUsXG4gKiBhbGxvd2luZyBjb21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIElkZW50aWZ5IHRoZSBub2RlIHdoZXJlIHNlbGVjdGlvbiBjdXJyZW50bHkgYmVnaW5zLCB0aGVuIG9ic2VydmVcbiAqIGJvdGggaXRzIHRleHQgY29udGVudCBhbmQgaXRzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlXG4gKiBicm93c2VyIG1heSBuYXRpdmVseSByZXBsYWNlIHRoZSB0YXJnZXQgbm9kZSBkdXJpbmcgY29tcG9zaXRpb24sIHdlIGNhblxuICogdXNlIGl0cyBwb3NpdGlvbiB0byBmaW5kIGl0cyByZXBsYWNlbWVudC5cbiAqXG4gKlxuICovXG52YXIgcm9vdCA9IG51bGw7XG52YXIgc3RhcnRUZXh0ID0gbnVsbDtcbnZhciBmYWxsYmFja1RleHQgPSBudWxsO1xuZnVuY3Rpb24gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCkge1xuICByb290ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIHN0YXJ0VGV4dCA9IGdldFRleHQoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgcm9vdCA9IG51bGw7XG4gIHN0YXJ0VGV4dCA9IG51bGw7XG4gIGZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5mdW5jdGlvbiBnZXREYXRhKCkge1xuICBpZiAoZmFsbGJhY2tUZXh0KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgfVxuXG4gIHZhciBzdGFydDtcbiAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQ7XG4gIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICB2YXIgZW5kO1xuICB2YXIgZW5kVmFsdWUgPSBnZXRUZXh0KCk7XG4gIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG5cbiAgZm9yIChlbmQgPSAxOyBlbmQgPD0gbWluRW5kOyBlbmQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSAhPT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICBmYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTtcbiAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHQoKSB7XG4gIGlmICgndmFsdWUnIGluIHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByb290LnRleHRDb250ZW50O1xufVxuXG4vKipcbiAqIGBjaGFyQ29kZWAgcmVwcmVzZW50cyB0aGUgYWN0dWFsIFwiY2hhcmFjdGVyIGNvZGVcIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aFxuICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhhdCBjb3JyZXNwb25kIHRvIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQgYGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuXG4gKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLFxuICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXplZCBgY2hhckNvZGVgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjaGFyQ29kZTtcbiAgdmFyIGtleUNvZGUgPSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuXG4gIGlmICgnY2hhckNvZGUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgY2hhckNvZGUgPSBuYXRpdmVFdmVudC5jaGFyQ29kZTsgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLlxuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfSAvLyBJRSBhbmQgRWRnZSAob24gV2luZG93cykgYW5kIENocm9tZSAvIFNhZmFyaSAob24gV2luZG93cyBhbmQgTGludXgpXG4gIC8vIHJlcG9ydCBFbnRlciBhcyBjaGFyQ29kZSAxMCB3aGVuIGN0cmwgaXMgcHJlc3NlZC5cblxuXG4gIGlmIChjaGFyQ29kZSA9PT0gMTApIHtcbiAgICBjaGFyQ29kZSA9IDEzO1xuICB9IC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuXG5cbiAgaWYgKGNoYXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykge1xuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYSBmYWN0b3J5IHNvIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuZWQgY29uc3RydWN0b3JzLlxuLy8gSWYgd2UgaGFkIGEgc2luZ2xlIGNvbnN0cnVjdG9yLCBpdCB3b3VsZCBiZSBtZWdhbW9ycGhpYyBhbmQgZW5naW5lcyB3b3VsZCBkZW9wdC5cblxuXG5mdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHtcbiAgLyoqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgYXJlIGRpc3BhdGNoZWQgYnkgZXZlbnQgcGx1Z2lucywgdHlwaWNhbGx5IGluIHJlc3BvbnNlIHRvIGFcbiAgICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci5cbiAgICpcbiAgICogVGhlc2Ugc3lzdGVtcyBzaG91bGQgZ2VuZXJhbGx5IHVzZSBwb29saW5nIHRvIHJlZHVjZSB0aGUgZnJlcXVlbmN5IG9mIGdhcmJhZ2VcbiAgICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlXG4gICAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAgICogbmVlZCBhIHBlcnNpc3RlZCBldmVudCBzaG91bGQgaW52b2tlIGBwZXJzaXN0YC5cbiAgICpcbiAgICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICAgKiBub3JtYWxpemluZyBicm93c2VyIHF1aXJrcy4gU3ViY2xhc3NlcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBpbXBsZW1lbnQgYVxuICAgKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuXG4gICAqL1xuICBmdW5jdGlvbiBTeW50aGV0aWNCYXNlRXZlbnQocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICAgIHRoaXMudHlwZSA9IHJlYWN0RXZlbnRUeXBlO1xuICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW19wcm9wTmFtZV07XG5cbiAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2ZUV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W19wcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkIDogbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IGZhbHNlO1xuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhc3NpZ24oU3ludGhldGljQmFzZUV2ZW50LnByb3RvdHlwZSwge1xuICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcblxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyAkRmxvd0ZpeE1lIC0gZmxvdyBpcyBub3QgYXdhcmUgb2YgYHVua25vd25gIGluIElFXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5yZXR1cm5WYWx1ZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcbiAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyAkRmxvd0ZpeE1lIC0gZmxvdyBpcyBub3QgYXdhcmUgb2YgYHVua25vd25gIGluIElFXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5jYW5jZWxCdWJibGUgIT09ICd1bmtub3duJykge1xuICAgICAgICAvLyBUaGUgQ2hhbmdlRXZlbnRQbHVnaW4gcmVnaXN0ZXJzIGEgXCJwcm9wZXJ0eWNoYW5nZVwiIGV2ZW50IGZvclxuICAgICAgICAvLyBJRS4gVGhpcyBldmVudCBkb2VzIG5vdCBzdXBwb3J0IGJ1YmJsaW5nIG9yIGNhbmNlbGxpbmcsIGFuZFxuICAgICAgICAvLyBhbnkgcmVmZXJlbmNlcyB0byBjYW5jZWxCdWJibGUgdGhyb3cgXCJNZW1iZXIgbm90IGZvdW5kXCIuICBBXG4gICAgICAgIC8vIHR5cGVvZiBjaGVjayBvZiBcInVua25vd25cIiBjaXJjdW12ZW50cyB0aGlzIGlzc3VlIChhbmQgaXMgYWxzb1xuICAgICAgICAvLyBJRSBzcGVjaWZpYykuXG4gICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2UgcmVsZWFzZSBhbGwgZGlzcGF0Y2hlZCBgU3ludGhldGljRXZlbnRgcyBhZnRlciBlYWNoIGV2ZW50IGxvb3AsIGFkZGluZ1xuICAgICAqIHRoZW0gYmFjayBpbnRvIHRoZSBwb29sLiBUaGlzIGFsbG93cyBhIHdheSB0byBob2xkIG9udG8gYSByZWZlcmVuY2UgdGhhdFxuICAgICAqIHdvbid0IGJlIGFkZGVkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKi9cbiAgICBwZXJzaXN0OiBmdW5jdGlvbiAoKSB7Ly8gTW9kZXJuIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGlzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc1BlcnNpc3RlbnQ6IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlXG4gIH0pO1xuICByZXR1cm4gU3ludGhldGljQmFzZUV2ZW50O1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgZXZlbnRQaGFzZTogMCxcbiAgYnViYmxlczogMCxcbiAgY2FuY2VsYWJsZTogMCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IDAsXG4gIGlzVHJ1c3RlZDogMFxufTtcbnZhciBTeW50aGV0aWNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIFVJRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIHZpZXc6IDAsXG4gIGRldGFpbDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVUlFdmVudEludGVyZmFjZSk7XG52YXIgbGFzdE1vdmVtZW50WDtcbnZhciBsYXN0TW92ZW1lbnRZO1xudmFyIGxhc3RNb3VzZUV2ZW50O1xuXG5mdW5jdGlvbiB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZShldmVudCkge1xuICBpZiAoZXZlbnQgIT09IGxhc3RNb3VzZUV2ZW50KSB7XG4gICAgaWYgKGxhc3RNb3VzZUV2ZW50ICYmIGV2ZW50LnR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gZXZlbnQuc2NyZWVuWCAtIGxhc3RNb3VzZUV2ZW50LnNjcmVlblg7XG4gICAgICBsYXN0TW92ZW1lbnRZID0gZXZlbnQuc2NyZWVuWSAtIGxhc3RNb3VzZUV2ZW50LnNjcmVlblk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RNb3ZlbWVudFggPSAwO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IDA7XG4gICAgfVxuXG4gICAgbGFzdE1vdXNlRXZlbnQgPSBldmVudDtcbiAgfVxufVxuLyoqXG4gKiBAaW50ZXJmYWNlIE1vdXNlRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIE1vdXNlRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgc2NyZWVuWDogMCxcbiAgc2NyZWVuWTogMCxcbiAgY2xpZW50WDogMCxcbiAgY2xpZW50WTogMCxcbiAgcGFnZVg6IDAsXG4gIHBhZ2VZOiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gIGJ1dHRvbjogMCxcbiAgYnV0dG9uczogMCxcbiAgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC5zcmNFbGVtZW50ID8gZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQ7XG4gICAgcmV0dXJuIGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gIH0sXG4gIG1vdmVtZW50WDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFgnIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRYO1xuICAgIH1cblxuICAgIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKGV2ZW50KTtcbiAgICByZXR1cm4gbGFzdE1vdmVtZW50WDtcbiAgfSxcbiAgbW92ZW1lbnRZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WScgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFk7XG4gICAgfSAvLyBEb24ndCBuZWVkIHRvIGNhbGwgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoKSBoZXJlXG4gICAgLy8gYmVjYXVzZSBpdCdzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbHJlYWR5IHJ1biB3aGVuIG1vdmVtZW50WFxuICAgIC8vIHdhcyBjb3BpZWQuXG5cblxuICAgIHJldHVybiBsYXN0TW92ZW1lbnRZO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChNb3VzZUV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBEcmFnRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBEcmFnRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YVRyYW5zZmVyOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0RyYWdFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KERyYWdFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIEZvY3VzRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgcmVsYXRlZFRhcmdldDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNGb2N1c0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRm9jdXNFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1hbmltYXRpb25zLyNBbmltYXRpb25FdmVudC1pbnRlcmZhY2VcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0FuaW1hdGlvbkV2ZW50XG4gKi9cblxudmFyIEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBhbmltYXRpb25OYW1lOiAwLFxuICBlbGFwc2VkVGltZTogMCxcbiAgcHNldWRvRWxlbWVudDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNBbmltYXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jbGlwYm9hcmQtYXBpcy9cbiAqL1xuXG52YXIgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xuXG52YXIgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDVcbiAqICAgICAgLyNldmVudHMtaW5wdXRldmVudHNcbiAqL1xuLy8gSGFwcGVucyB0byBzaGFyZSB0aGUgc2FtZSBsaXN0IGZvciBub3cuXG5cbnZhciBTeW50aGV0aWNJbnB1dEV2ZW50ID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudDtcbi8qKlxuICogTm9ybWFsaXphdGlvbiBvZiBkZXByZWNhdGVkIEhUTUw1IGBrZXlgIHZhbHVlc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xuXG52YXIgbm9ybWFsaXplS2V5ID0ge1xuICBFc2M6ICdFc2NhcGUnLFxuICBTcGFjZWJhcjogJyAnLFxuICBMZWZ0OiAnQXJyb3dMZWZ0JyxcbiAgVXA6ICdBcnJvd1VwJyxcbiAgUmlnaHQ6ICdBcnJvd1JpZ2h0JyxcbiAgRG93bjogJ0Fycm93RG93bicsXG4gIERlbDogJ0RlbGV0ZScsXG4gIFdpbjogJ09TJyxcbiAgTWVudTogJ0NvbnRleHRNZW51JyxcbiAgQXBwczogJ0NvbnRleHRNZW51JyxcbiAgU2Nyb2xsOiAnU2Nyb2xsTG9jaycsXG4gIE1velByaW50YWJsZUtleTogJ1VuaWRlbnRpZmllZCdcbn07XG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbGVnYWN5IGBrZXlDb2RlYCB0byBIVE1MNSBga2V5YFxuICogT25seSBzcGVjaWFsIGtleXMgc3VwcG9ydGVkLCBhbGwgb3RoZXJzIGRlcGVuZCBvbiBrZXlib2FyZCBsYXlvdXQgb3IgYnJvd3NlclxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xuXG52YXIgdHJhbnNsYXRlVG9LZXkgPSB7XG4gICc4JzogJ0JhY2tzcGFjZScsXG4gICc5JzogJ1RhYicsXG4gICcxMic6ICdDbGVhcicsXG4gICcxMyc6ICdFbnRlcicsXG4gICcxNic6ICdTaGlmdCcsXG4gICcxNyc6ICdDb250cm9sJyxcbiAgJzE4JzogJ0FsdCcsXG4gICcxOSc6ICdQYXVzZScsXG4gICcyMCc6ICdDYXBzTG9jaycsXG4gICcyNyc6ICdFc2NhcGUnLFxuICAnMzInOiAnICcsXG4gICczMyc6ICdQYWdlVXAnLFxuICAnMzQnOiAnUGFnZURvd24nLFxuICAnMzUnOiAnRW5kJyxcbiAgJzM2JzogJ0hvbWUnLFxuICAnMzcnOiAnQXJyb3dMZWZ0JyxcbiAgJzM4JzogJ0Fycm93VXAnLFxuICAnMzknOiAnQXJyb3dSaWdodCcsXG4gICc0MCc6ICdBcnJvd0Rvd24nLFxuICAnNDUnOiAnSW5zZXJ0JyxcbiAgJzQ2JzogJ0RlbGV0ZScsXG4gICcxMTInOiAnRjEnLFxuICAnMTEzJzogJ0YyJyxcbiAgJzExNCc6ICdGMycsXG4gICcxMTUnOiAnRjQnLFxuICAnMTE2JzogJ0Y1JyxcbiAgJzExNyc6ICdGNicsXG4gICcxMTgnOiAnRjcnLFxuICAnMTE5JzogJ0Y4JyxcbiAgJzEyMCc6ICdGOScsXG4gICcxMjEnOiAnRjEwJyxcbiAgJzEyMic6ICdGMTEnLFxuICAnMTIzJzogJ0YxMicsXG4gICcxNDQnOiAnTnVtTG9jaycsXG4gICcxNDUnOiAnU2Nyb2xsTG9jaycsXG4gICcyMjQnOiAnTWV0YSdcbn07XG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBga2V5YCBwcm9wZXJ0eS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudEtleShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQua2V5KSB7XG4gICAgLy8gTm9ybWFsaXplIGluY29uc2lzdGVudCB2YWx1ZXMgcmVwb3J0ZWQgYnkgYnJvd3NlcnMgZHVlIHRvXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIG9mIGEgd29ya2luZyBkcmFmdCBzcGVjaWZpY2F0aW9uLlxuICAgIC8vIEZpcmVGb3ggaW1wbGVtZW50cyBga2V5YCBidXQgcmV0dXJucyBgTW96UHJpbnRhYmxlS2V5YCBmb3IgYWxsXG4gICAgLy8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgKG5vcm1hbGl6ZWQgdG8gYFVuaWRlbnRpZmllZGApLCBpZ25vcmUgaXQuXG4gICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleVtuYXRpdmVFdmVudC5rZXldIHx8IG5hdGl2ZUV2ZW50LmtleTtcblxuICAgIGlmIChrZXkgIT09ICdVbmlkZW50aWZpZWQnKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfSAvLyBCcm93c2VyIGRvZXMgbm90IGltcGxlbWVudCBga2V5YCwgcG9seWZpbGwgYXMgbXVjaCBvZiBpdCBhcyB3ZSBjYW4uXG5cblxuICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgIHZhciBjaGFyQ29kZSA9IGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpOyAvLyBUaGUgZW50ZXIta2V5IGlzIHRlY2huaWNhbGx5IGJvdGggcHJpbnRhYmxlIGFuZCBub24tcHJpbnRhYmxlIGFuZCBjYW5cbiAgICAvLyB0aHVzIGJlIGNhcHR1cmVkIGJ5IGBrZXlwcmVzc2AsIG5vIG90aGVyIG5vbi1wcmludGFibGUga2V5IHNob3VsZC5cblxuICAgIHJldHVybiBjaGFyQ29kZSA9PT0gMTMgPyAnRW50ZXInIDogU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gIH1cblxuICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAvLyBXaGlsZSB1c2VyIGtleWJvYXJkIGxheW91dCBkZXRlcm1pbmVzIHRoZSBhY3R1YWwgbWVhbmluZyBvZiBlYWNoXG4gICAgLy8gYGtleUNvZGVgIHZhbHVlLCBhbG1vc3QgYWxsIGZ1bmN0aW9uIGtleXMgaGF2ZSBhIHVuaXZlcnNhbCB2YWx1ZS5cbiAgICByZXR1cm4gdHJhbnNsYXRlVG9LZXlbbmF0aXZlRXZlbnQua2V5Q29kZV0gfHwgJ1VuaWRlbnRpZmllZCc7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbW9kaWZpZXIga2V5IHRvIHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IGluIHRoZSBldmVudC5cbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNrZXlzLU1vZGlmaWVyc1xuICovXG5cblxudmFyIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICBBbHQ6ICdhbHRLZXknLFxuICBDb250cm9sOiAnY3RybEtleScsXG4gIE1ldGE6ICdtZXRhS2V5JyxcbiAgU2hpZnQ6ICdzaGlmdEtleSdcbn07IC8vIE9sZGVyIGJyb3dzZXJzIChTYWZhcmkgPD0gMTAsIGlPUyBTYWZhcmkgPD0gMTAuMikgZG8gbm90IHN1cHBvcnRcbi8vIGdldE1vZGlmaWVyU3RhdGUuIElmIGdldE1vZGlmaWVyU3RhdGUgaXMgbm90IHN1cHBvcnRlZCwgd2UgbWFwIGl0IHRvIGEgc2V0IG9mXG4vLyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50LiBJbiB0aGlzIGNhc2UsIExvY2sta2V5cyBhcmUgbm90IHN1cHBvcnRlZC5cblxuZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHtcbiAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gdGhpcztcbiAgdmFyIG5hdGl2ZUV2ZW50ID0gc3ludGhldGljRXZlbnQubmF0aXZlRXZlbnQ7XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUpIHtcbiAgICByZXR1cm4gbmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShrZXlBcmcpO1xuICB9XG5cbiAgdmFyIGtleVByb3AgPSBtb2RpZmllcktleVRvUHJvcFtrZXlBcmddO1xuICByZXR1cm4ga2V5UHJvcCA/ICEhbmF0aXZlRXZlbnRba2V5UHJvcF0gOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRNb2RpZmllclN0YXRlKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBtb2RpZmllclN0YXRlR2V0dGVyO1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEtleWJvYXJkRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAga2V5OiBnZXRFdmVudEtleSxcbiAgY29kZTogMCxcbiAgbG9jYXRpb246IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIHJlcGVhdDogMCxcbiAgbG9jYWxlOiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gIC8vIExlZ2FjeSBJbnRlcmZhY2VcbiAgY2hhckNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBjaGFyQ29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleVByZXNzIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHRoZSBhY3R1YWwgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAgICAvLyBLZXlQcmVzcyBpcyBkZXByZWNhdGVkLCBidXQgaXRzIHJlcGxhY2VtZW50IGlzIG5vdCB5ZXQgZmluYWwgYW5kIG5vdFxuICAgIC8vIGltcGxlbWVudGVkIGluIGFueSBtYWpvciBicm93c2VyLiBPbmx5IEtleVByZXNzIGhhcyBjaGFyQ29kZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9LFxuICBrZXlDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBga2V5Q29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleURvd24vVXAgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gcGh5c2ljYWwga2V5Ym9hcmQga2V5LlxuICAgIC8vIFRoZSBhY3R1YWwgbWVhbmluZyBvZiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdXNlcnMnIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZC4gQXNzdW1pbmcgdGhhdCBpdCBpcyBhIFVTIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHByb3ZpZGVzIGEgc3VycHJpc2luZ2x5IGFjY3VyYXRlIG1hcHBpbmcgZm9yIFVTIGFuZCBFdXJvcGVhbiB1c2Vycy5cbiAgICAvLyBEdWUgdG8gdGhpcywgaXQgaXMgbGVmdCB0byB0aGUgdXNlciB0byBpbXBsZW1lbnQgYXQgdGhpcyB0aW1lLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIHdoaWNoOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgd2hpY2hgIGlzIGFuIGFsaWFzIGZvciBlaXRoZXIgYGtleUNvZGVgIG9yIGBjaGFyQ29kZWAgZGVwZW5kaW5nIG9uIHRoZVxuICAgIC8vIHR5cGUgb2YgdGhlIGV2ZW50LlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNLZXlib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoS2V5Ym9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgUG9pbnRlckV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3BvaW50ZXJldmVudHMvXG4gKi9cblxudmFyIFBvaW50ZXJFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBwb2ludGVySWQ6IDAsXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIHByZXNzdXJlOiAwLFxuICB0YW5nZW50aWFsUHJlc3N1cmU6IDAsXG4gIHRpbHRYOiAwLFxuICB0aWx0WTogMCxcbiAgdHdpc3Q6IDAsXG4gIHBvaW50ZXJUeXBlOiAwLFxuICBpc1ByaW1hcnk6IDBcbn0pO1xuXG52YXIgU3ludGhldGljUG9pbnRlckV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoUG9pbnRlckV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xuXG52YXIgVG91Y2hFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICB0b3VjaGVzOiAwLFxuICB0YXJnZXRUb3VjaGVzOiAwLFxuICBjaGFuZ2VkVG91Y2hlczogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlXG59KTtcblxudmFyIFN5bnRoZXRpY1RvdWNoRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUb3VjaEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtdHJhbnNpdGlvbnMtMjAwOTAzMjAvI3RyYW5zaXRpb24tZXZlbnRzLVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVHJhbnNpdGlvbkV2ZW50XG4gKi9cblxudmFyIFRyYW5zaXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgcHJvcGVydHlOYW1lOiAwLFxuICBlbGFwc2VkVGltZTogMCxcbiAgcHNldWRvRWxlbWVudDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFdoZWVsRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBXaGVlbEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRlbHRhWDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFYYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKHJpZ2h0IGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVgnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDtcbiAgfSxcbiAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFZJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhYCBmb3IgSUU8OSBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YSA6IDA7XG4gIH0sXG4gIGRlbHRhWjogMCxcbiAgLy8gQnJvd3NlcnMgd2l0aG91dCBcImRlbHRhTW9kZVwiIGlzIHJlcG9ydGluZyBpbiByYXcgd2hlZWwgZGVsdGEgd2hlcmUgb25lXG4gIC8vIG5vdGNoIG9uIHRoZSBzY3JvbGwgaXMgYWx3YXlzICsvLSAxMjAsIHJvdWdobHkgZXF1aXZhbGVudCB0byBwaXhlbHMuXG4gIC8vIEEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIERPTV9ERUxUQV9MSU5FICgxKSBpcyA1JSBvZiB2aWV3cG9ydCBzaXplIG9yXG4gIC8vIH40MCBwaXhlbHMsIGZvciBET01fREVMVEFfU0NSRUVOICgyKSBpdCBpcyA4Ny41JSBvZiB2aWV3cG9ydCBzaXplLlxuICBkZWx0YU1vZGU6IDBcbn0pO1xuXG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFdoZWVsRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxuXG52YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTtcbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG52YXIgZG9jdW1lbnRNb2RlID0gbnVsbDtcblxuaWYgKGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59IC8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG5cblxudmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID0gY2FuVXNlRE9NICYmICdUZXh0RXZlbnQnIGluIHdpbmRvdyAmJiAhZG9jdW1lbnRNb2RlOyAvLyBJbiBJRTkrLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NpdGlvbiBldmVudHMsIGJ1dCB0aGUgZGF0YSBzdXBwbGllZFxuLy8gYnkgdGhlIG5hdGl2ZSBjb21wb3NpdGlvbmVuZCBldmVudCBtYXkgYmUgaW5jb3JyZWN0LiBKYXBhbmVzZSBpZGVvZ3JhcGhpY1xuLy8gc3BhY2VzLCBmb3IgaW5zdGFuY2UgKFxcdTMwMDApIGFyZSBub3QgcmVjb3JkZWQgY29ycmVjdGx5LlxuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBjYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkJlZm9yZUlucHV0JywgWydjb21wb3NpdGlvbmVuZCcsICdrZXlwcmVzcycsICd0ZXh0SW5wdXQnLCAncGFzdGUnXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvbkVuZCcsIFsnY29tcG9zaXRpb25lbmQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblN0YXJ0JywgWydjb21wb3NpdGlvbnN0YXJ0JywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25VcGRhdGUnLCBbJ2NvbXBvc2l0aW9udXBkYXRlJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xufSAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuXG5cblxudmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTtcbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cblxuZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIChuYXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5tZXRhS2V5KSAmJiAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdyLCBhbmQgaXMgbm90IGEgY29tbWFuZC5cbiAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25TdGFydCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25FbmQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uVXBkYXRlJztcbiAgfVxufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXRcbiAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tFWUNPREU7XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgICAgLy8gRXhwZWN0IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlclxuICAgICAgLy8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuXG4gICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsXG4gKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGluIHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXNcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZlbnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluXG4gKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9zdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG5cbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBkZXRhaWwpIHtcbiAgICByZXR1cm4gZGV0YWlsLmRhdGE7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSBjb21wb3NpdGlvbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IEtvcmVhbiBJTUUuXG4gKiBPdXIgZmFsbGJhY2sgbW9kZSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBJRSdzIEtvcmVhbiBJTUUsXG4gKiBzbyBqdXN0IHVzZSBuYXRpdmUgY29tcG9zaXRpb24gZXZlbnRzIHdoZW4gS29yZWFuIElNRSBpcyB1c2VkLlxuICogQWx0aG91Z2ggQ29tcG9zaXRpb25FdmVudC5sb2NhbGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCxcbiAqIGl0IGlzIGF2YWlsYWJsZSBpbiBJRSwgd2hlcmUgb3VyIGZhbGxiYWNrIG1vZGUgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuXG5mdW5jdGlvbiBpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuYXRpdmVFdmVudC5sb2NhbGUgPT09ICdrbyc7XG59IC8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS5cblxuXG52YXIgaXNDb21wb3NpbmcgPSBmYWxzZTtcbi8qKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LlxuICovXG5cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpO1xuICB9IGVsc2UgaWYgKCFpc0NvbXBvc2luZykge1xuICAgIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25TdGFydCc7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uRW5kJztcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgY29tcG9zaXRpb24gaXMgc3RvcmVkIHN0YXRpY2FsbHkgYW5kIG11c3Qgbm90IGJlXG4gICAgLy8gb3ZlcndyaXR0ZW4gd2hpbGUgY29tcG9zaXRpb24gY29udGludWVzLlxuICAgIGlmICghaXNDb21wb3NpbmcgJiYgZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvblN0YXJ0Jykge1xuICAgICAgaXNDb21wb3NpbmcgPSBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25FbmQnKSB7XG4gICAgICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgZXZlbnRUeXBlKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljQ29tcG9zaXRpb25FdmVudChldmVudFR5cGUsIGRvbUV2ZW50TmFtZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcblxuICAgIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LlxuICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS5cbiAgICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjdXN0b21EYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChjdXN0b21EYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcblxuICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSO1xuXG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTsgLy8gSWYgaXQncyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWVcbiAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28gd2UgbmVlZCB0byBpZ25vcmUgaXQuXG5cbiAgICAgIGlmIChjaGFycyA9PT0gU1BBQ0VCQVJfQ0hBUiAmJiBoYXNTcGFjZUtleXByZXNzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hhcnM7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRm9yIG90aGVyIG5hdGl2ZSBldmVudCB0eXBlcywgZG8gbm90aGluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2UgZm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcgYSBmYWxsYmFjayB0byBkbyBzbyxcbiAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LlxuICAvLyBJZiBjb21wb3NpdGlvbiBldmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdFxuICAvLyBjb21wb3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuXG4gIGlmIChpc0NvbXBvc2luZykge1xuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICdjb21wb3NpdGlvbmVuZCcgfHwgIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiYgaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICB2YXIgY2hhcnMgPSBnZXREYXRhKCk7XG4gICAgICByZXNldCgpO1xuICAgICAgaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dFxuICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQgbm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkgZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlclxuICAgICAgICogd2lsbCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczpcbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuXG4gICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlzIG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3JcbiAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRpb24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS5cbiAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpc1xuICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm9cbiAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICovXG4gICAgICBpZiAoIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAvLyBJRSBmaXJlcyB0aGUgYGtleXByZXNzYCBldmVudCB3aGVuIGEgdXNlciB0eXBlcyBhbiBlbW9qaSB2aWFcbiAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5XG4gICAgICAgIC8vIGhvbGRzIGFuIGVtb2ppIGNoYXJhY3RlciBsaWtlIGBcXHVEODNEXFx1REUwQWAuICBCZWNhdXNlIGl0cyBsZW5ndGhcbiAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS5cbiAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UsIHdlIGRpcmVjdGx5IHJldHVybiB0aGUgYGNoYXJgIHByb3BlcnR5IGluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXNpbmcgYHdoaWNoYC5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAobmF0aXZlRXZlbnQud2hpY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRXh0cmFjdCBhIFN5bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRpdmVcbiAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLlxuICpcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gLy8gSWYgbm8gY2hhcmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZFxuICAvLyBiZSBmaXJlZC5cblxuXG4gIGlmICghY2hhcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgJ29uQmVmb3JlSW5wdXQnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljSW5wdXRFdmVudCgnb25CZWZvcmVJbnB1dCcsICdiZWZvcmVpbnB1dCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gICAgZXZlbnQuZGF0YSA9IGNoYXJzO1xuICB9XG59XG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogTk9URTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1Y2ggYXMgYGNoYW5nZWAsXG4gKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC5cbiAqXG4gKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5nLiBcImNsaWNrXCIuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuXG4gKiBAaW50ZXJuYWxcbiAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuICovXG5cbmZ1bmN0aW9uIGlzRXZlbnRTdXBwb3J0ZWQoZXZlbnROYW1lU3VmZml4KSB7XG4gIGlmICghY2FuVXNlRE9NKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudE5hbWVTdWZmaXg7XG4gIHZhciBpc1N1cHBvcnRlZCA9IChldmVudE5hbWUgaW4gZG9jdW1lbnQpO1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDEoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25DaGFuZ2UnLCBbJ2NoYW5nZScsICdjbGljaycsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2lucHV0JywgJ2tleWRvd24nLCAna2V5dXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIHRhcmdldCkge1xuICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuXG4gIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KTtcbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhpbnN0LCAnb25DaGFuZ2UnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uQ2hhbmdlJywgJ2NoYW5nZScsIG51bGwsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEZvciBJRSBzaGltc1xuICovXG5cblxudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICdmaWxlJztcbn1cblxuZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkpOyAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cblxuICBiYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsIGRpc3BhdGNoUXVldWUpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZGlzcGF0Y2hRdWV1ZSkge1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCAwKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpO1xuXG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGlucHV0YCBldmVudFxuICovXG5cblxudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIC8vIElFOSBjbGFpbXMgdG8gc3VwcG9ydCB0aGUgaW5wdXQgZXZlbnQgYnV0IGZhaWxzIHRvIHRyaWdnZXIgaXQgd2hlblxuICAvLyBkZWxldGluZyB0ZXh0LCBzbyB3ZSBpZ25vcmUgaXRzIGlucHV0IGV2ZW50cy5cbiAgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gaXNFdmVudFN1cHBvcnRlZCgnaW5wdXQnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA5KTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50bHktdHJhY2tlZCBlbGVtZW50LFxuICogaWYgYW55IGV4aXN0cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eUNoYW5nZShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICE9PSAndmFsdWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCkpIHtcbiAgICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3VzaW4nKSB7XG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn0gLy8gRm9yIElFOCBhbmQgSUU5LlxuXG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdzZWxlY3Rpb25jaGFuZ2UnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleXVwJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJykge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpO1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cblxuXG5mdW5jdGlvbiBzaG91bGRVc2VDbGlja0V2ZW50KGVsZW0pIHtcbiAgLy8gVXNlIHRoZSBgY2xpY2tgIGV2ZW50IHRvIGRldGVjdCBjaGFuZ2VzIHRvIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMuXG4gIC8vIFRoaXMgYXBwcm9hY2ggd29ya3MgYWNyb3NzIGFsbCBicm93c2Vycywgd2hlcmVhcyBgY2hhbmdlYCBkb2VzIG5vdCBmaXJlXG4gIC8vIHVudGlsIGBibHVyYCBpbiBJRTguXG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjbGljaycpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdpbnB1dCcgfHwgZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZTtcblxuICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5jb250cm9sbGVkIHx8IG5vZGUudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCAnbnVtYmVyJywgbm9kZS52YWx1ZSk7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25DaGFuZ2VgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBjaGFuZ2UgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhpcyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvXG4gKiBjaGFuZ2UgdGhlIGVsZW1lbnQncyB2YWx1ZSB3aXRob3V0IHNlZWluZyBhIGZsaWNrZXIuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gc2VsZWN0XG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICB2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsIGhhbmRsZUV2ZW50RnVuYztcblxuICBpZiAoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDtcbiAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBpZiAoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2hvdWxkVXNlQ2xpY2tFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gIH1cblxuICBpZiAoZ2V0VGFyZ2V0SW5zdEZ1bmMpIHtcbiAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAoaW5zdCkge1xuICAgICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhbmRsZUV2ZW50RnVuYykge1xuICAgIGhhbmRsZUV2ZW50RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpO1xuICB9IC8vIFdoZW4gYmx1cnJpbmcsIHNldCB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBudW1iZXIgaW5wdXRzXG5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cih0YXJnZXROb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQyKCkge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlRW50ZXInLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUxlYXZlJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckVudGVyJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJMZWF2ZScsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbn1cbi8qKlxuICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAqIHdlIGRvIG5vdCBleHRyYWN0IGR1cGxpY2F0ZSBldmVudHMuIEhvd2V2ZXIsIG1vdmluZyB0aGUgbW91c2UgaW50byB0aGVcbiAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBpc092ZXJFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3ZlcicgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInO1xuICB2YXIgaXNPdXRFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JztcblxuICBpZiAoaXNPdmVyRXZlbnQgJiYgIWlzUmVwbGF5aW5nRXZlbnQobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhbiBvdmVyIGV2ZW50IHdpdGggYSB0YXJnZXQsIHdlIG1pZ2h0IGhhdmUgYWxyZWFkeSBkaXNwYXRjaGVkXG4gICAgLy8gdGhlIGV2ZW50IGluIHRoZSBvdXQgZXZlbnQgb2YgdGhlIG90aGVyIHRhcmdldC4gSWYgdGhpcyBpcyByZXBsYXllZCxcbiAgICAvLyB0aGVuIGl0J3MgYmVjYXVzZSB3ZSBjb3VsZG4ndCBkaXNwYXRjaCBhZ2FpbnN0IHRoaXMgdGFyZ2V0IHByZXZpb3VzbHlcbiAgICAvLyBzbyB3ZSBoYXZlIHRvIGRvIGl0IG5vdyBpbnN0ZWFkLlxuICAgIHZhciByZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC5mcm9tRWxlbWVudDtcblxuICAgIGlmIChyZWxhdGVkKSB7XG4gICAgICAvLyBJZiB0aGUgcmVsYXRlZCBub2RlIGlzIG1hbmFnZWQgYnkgUmVhY3QsIHdlIGNhbiBhc3N1bWUgdGhhdCB3ZSBoYXZlXG4gICAgICAvLyBhbHJlYWR5IGRpc3BhdGNoZWQgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnRzIGR1cmluZyBpdHMgbW91c2VvdXQuXG4gICAgICBpZiAoZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVsYXRlZCkgfHwgaXNDb250YWluZXJNYXJrZWRBc1Jvb3QocmVsYXRlZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaXNPdXRFdmVudCAmJiAhaXNPdmVyRXZlbnQpIHtcbiAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIG9yIHBvaW50ZXIgaW4gb3Igb3V0IC0gaWdub3JpbmcuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHdpbjsgLy8gVE9ETzogd2h5IGlzIHRoaXMgbnVsbGFibGUgaW4gdGhlIHR5cGVzIGJ1dCB3ZSByZWFkIGZyb20gaXQ/XG5cbiAgaWYgKG5hdGl2ZUV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICAvLyBgbmF0aXZlRXZlbnRUYXJnZXRgIGlzIHByb2JhYmx5IGEgd2luZG93IG9iamVjdC5cbiAgICB3aW4gPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3duZXJEb2N1bWVudGAgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBpbiBJRTguXG4gICAgdmFyIGRvYyA9IG5hdGl2ZUV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICBpZiAoZG9jKSB7XG4gICAgICB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgd2luID0gd2luZG93O1xuICAgIH1cbiAgfVxuXG4gIHZhciBmcm9tO1xuICB2YXIgdG87XG5cbiAgaWYgKGlzT3V0RXZlbnQpIHtcbiAgICB2YXIgX3JlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnRvRWxlbWVudDtcblxuICAgIGZyb20gPSB0YXJnZXRJbnN0O1xuICAgIHRvID0gX3JlbGF0ZWQgPyBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShfcmVsYXRlZCkgOiBudWxsO1xuXG4gICAgaWYgKHRvICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRvKTtcblxuICAgICAgaWYgKHRvICE9PSBuZWFyZXN0TW91bnRlZCB8fCB0by50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgdG8udGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgICB0byA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE1vdmluZyB0byBhIG5vZGUgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cuXG4gICAgZnJvbSA9IG51bGw7XG4gICAgdG8gPSB0YXJnZXRJbnN0O1xuICB9XG5cbiAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgLy8gTm90aGluZyBwZXJ0YWlucyB0byBvdXIgbWFuYWdlZCBjb21wb25lbnRzLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICB2YXIgbGVhdmVFdmVudFR5cGUgPSAnb25Nb3VzZUxlYXZlJztcbiAgdmFyIGVudGVyRXZlbnRUeXBlID0gJ29uTW91c2VFbnRlcic7XG4gIHZhciBldmVudFR5cGVQcmVmaXggPSAnbW91c2UnO1xuXG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3ZlcicpIHtcbiAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgbGVhdmVFdmVudFR5cGUgPSAnb25Qb2ludGVyTGVhdmUnO1xuICAgIGVudGVyRXZlbnRUeXBlID0gJ29uUG9pbnRlckVudGVyJztcbiAgICBldmVudFR5cGVQcmVmaXggPSAncG9pbnRlcic7XG4gIH1cblxuICB2YXIgZnJvbU5vZGUgPSBmcm9tID09IG51bGwgPyB3aW4gOiBnZXROb2RlRnJvbUluc3RhbmNlKGZyb20pO1xuICB2YXIgdG9Ob2RlID0gdG8gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UodG8pO1xuICB2YXIgbGVhdmUgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKGxlYXZlRXZlbnRUeXBlLCBldmVudFR5cGVQcmVmaXggKyAnbGVhdmUnLCBmcm9tLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBsZWF2ZS50YXJnZXQgPSBmcm9tTm9kZTtcbiAgbGVhdmUucmVsYXRlZFRhcmdldCA9IHRvTm9kZTtcbiAgdmFyIGVudGVyID0gbnVsbDsgLy8gV2Ugc2hvdWxkIG9ubHkgcHJvY2VzcyB0aGlzIG5hdGl2ZUV2ZW50IGlmIHdlIGFyZSBwcm9jZXNzaW5nXG4gIC8vIHRoZSBmaXJzdCBhbmNlc3Rvci4gTmV4dCB0aW1lLCB3ZSB3aWxsIGlnbm9yZSB0aGUgZXZlbnQuXG5cbiAgdmFyIG5hdGl2ZVRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKG5hdGl2ZVRhcmdldEluc3QgPT09IHRhcmdldEluc3QpIHtcbiAgICB2YXIgZW50ZXJFdmVudCA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IoZW50ZXJFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdlbnRlcicsIHRvLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGVudGVyRXZlbnQudGFyZ2V0ID0gdG9Ob2RlO1xuICAgIGVudGVyRXZlbnQucmVsYXRlZFRhcmdldCA9IGZyb21Ob2RlO1xuICAgIGVudGVyID0gZW50ZXJFdmVudDtcbiAgfVxuXG4gIGFjY3VtdWxhdGVFbnRlckxlYXZlVHdvUGhhc2VMaXN0ZW5lcnMoZGlzcGF0Y2hRdWV1ZSwgbGVhdmUsIGVudGVyLCBmcm9tLCB0byk7XG59XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgcmV0dXJuIHggPT09IHkgJiYgKHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5KSB8fCB4ICE9PSB4ICYmIHkgIT09IHkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgO1xufVxuXG52YXIgb2JqZWN0SXMgPSB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaXM7XG5cbi8qKlxuICogUGVyZm9ybXMgZXF1YWxpdHkgYnkgaXRlcmF0aW5nIHRocm91Z2gga2V5cyBvbiBhbiBvYmplY3QgYW5kIHJldHVybmluZyBmYWxzZVxuICogd2hlbiBhbnkga2V5IGhhcyB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBzdHJpY3RseSBlcXVhbCBiZXR3ZWVuIHRoZSBhcmd1bWVudHMuXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgdmFsdWVzIG9mIGFsbCBrZXlzIGFyZSBzdHJpY3RseSBlcXVhbC5cbiAqL1xuXG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAob2JqZWN0SXMob2JqQSwgb2JqQikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3VycmVudEtleSA9IGtleXNBW2ldO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGN1cnJlbnRLZXkpIHx8ICFvYmplY3RJcyhvYmpBW2N1cnJlbnRLZXldLCBvYmpCW2N1cnJlbnRLZXldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFueSBub2RlIHJldHVybiB0aGUgZmlyc3QgbGVhZiBub2RlIHdpdGhvdXQgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cbmZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZVxuICogRE9NIGlmIGEgbm9kZSdzIHNpYmxpbmdzIGhhdmUgYmVlbiBleGhhdXN0ZWQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cblxuZnVuY3Rpb24gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChyb290LCBvZmZzZXQpIHtcbiAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgdmFyIG5vZGVTdGFydCA9IDA7XG4gIHZhciBub2RlRW5kID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGdldE9mZnNldHMob3V0ZXJOb2RlKSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gb3V0ZXJOb2RlLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBvd25lckRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbiAmJiB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0OyAvLyBJbiBGaXJlZm94LCBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgY2FuIGJlIFwiYW5vbnltb3VzIGRpdnNcIiwgZS5nLiB0aGVcbiAgLy8gdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPVwibnVtYmVyXCI+LiBBbm9ueW1vdXMgZGl2cyBkbyBub3Qgc2VlbSB0b1xuICAvLyBleHBvc2UgcHJvcGVydGllcywgdHJpZ2dlcmluZyBhIFwiUGVybWlzc2lvbiBkZW5pZWQgZXJyb3JcIiBpZiBhbnkgb2YgaXRzXG4gIC8vIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgb25seSBzZWVtaW5nbHkgcG9zc2libGUgd2F5IHRvIGF2b2lkIGVycm9yaW5nXG4gIC8vIGlzIHRvIGFjY2VzcyBhIHByb3BlcnR5IHRoYXQgdHlwaWNhbGx5IHdvcmtzIGZvciBub24tYW5vbnltb3VzIGRpdnMgYW5kXG4gIC8vIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZVxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDg0MjdcblxuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGFuY2hvck5vZGUubm9kZVR5cGU7XG4gICAgZm9jdXNOb2RlLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCk7XG59XG4vKipcbiAqIFJldHVybnMge3N0YXJ0LCBlbmR9IHdoZXJlIGBzdGFydGAgaXMgdGhlIGNoYXJhY3Rlci9jb2RlcG9pbnQgaW5kZXggb2ZcbiAqIChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpIHdpdGhpbiB0aGUgdGV4dENvbnRlbnQgb2YgYG91dGVyTm9kZWAsIGFuZFxuICogYGVuZGAgaXMgdGhlIGluZGV4IG9mIChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KS5cbiAqXG4gKiBSZXR1cm5zIG51bGwgaWYgeW91IHBhc3MgaW4gZ2FyYmFnZSBpbnB1dCBidXQgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgY3Jhc2guXG4gKlxuICogRXhwb3J0ZWQgb25seSBmb3IgdGVzdGluZy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIGluZGV4V2l0aGluQW5jaG9yID0gMDtcbiAgdmFyIGluZGV4V2l0aGluRm9jdXMgPSAwO1xuICB2YXIgbm9kZSA9IG91dGVyTm9kZTtcbiAgdmFyIHBhcmVudE5vZGUgPSBudWxsO1xuXG4gIG91dGVyOiB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBuZXh0ID0gbnVsbDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gYW5jaG9yTm9kZSAmJiAoYW5jaG9yT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGggKyBhbmNob3JPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmb2N1c05vZGUgJiYgKGZvY3VzT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgICAgbGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBmaXJzdCBjaGlsZCBgbmV4dGAuXG5cblxuICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICBub2RlID0gbmV4dDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG91dGVyTm9kZSkge1xuICAgICAgICAvLyBJZiBgb3V0ZXJOb2RlYCBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgYWx3YXlzIHRoZSBzZWNvbmQgdGltZSB2aXNpdGluZ1xuICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgc2VsZWN0aW9uIGlzIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBib3RoIGVxdWFsIHRvIHRoaXMgbm9kZVxuICAgICAgICAvLyBhbmQgYm90aCBvZmZzZXRzIDAsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBoYXZlIGhhbmRsZWQgYWJvdmUuXG4gICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gYW5jaG9yTm9kZSAmJiArK2luZGV4V2l0aGluQW5jaG9yID09PSBhbmNob3JPZmZzZXQpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBmb2N1c05vZGUgJiYgKytpbmRleFdpdGhpbkZvY3VzID09PSBmb2N1c09mZnNldCkge1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUubmV4dFNpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gcGFyZW50Tm9kZTtcbiAgICAgIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIG5leHQgc2libGluZyBgbmV4dGAuXG5cblxuICAgIG5vZGUgPSBuZXh0O1xuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAoV291bGQgaGFwcGVuIGlmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYXJlbid0XG4gICAgLy8gYWN0dWFsbHkgaW5zaWRlIHRoZSBwYXNzZWQtaW4gbm9kZS4pXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBlbmQ6IGVuZFxuICB9O1xufVxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cblxuZnVuY3Rpb24gc2V0T2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBkb2MgJiYgZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgLy8gRWRnZSBmYWlscyB3aXRoIFwiT2JqZWN0IGV4cGVjdGVkXCIgaW4gc29tZSBzY2VuYXJpb3MuXG4gIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsXG4gIC8vIGZhaWxzIHdoZW4gcGFzdGluZyAxMDArIGl0ZW1zKVxuXG4gIGlmICghd2luLmdldFNlbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gIHZhciBsZW5ndGggPSBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpOyAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDEgJiYgc2VsZWN0aW9uLmFuY2hvck5vZGUgPT09IHN0YXJ0TWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmFuY2hvck9mZnNldCA9PT0gc3RhcnRNYXJrZXIub2Zmc2V0ICYmIHNlbGVjdGlvbi5mb2N1c05vZGUgPT09IGVuZE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5mb2N1c09mZnNldCA9PT0gZW5kTWFya2VyLm9mZnNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RleHROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIGNvbnRhaW5zTm9kZShub2RlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luRnJhbWUoaWZyYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXNzaW5nIHRoZSBjb250ZW50RG9jdW1lbnQgb2YgYSBIVE1MSWZyYW1lRWxlbWVudCBjYW4gY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAvLyB0byB0aHJvdywgZS5nLiBpZiBpdCBoYXMgYSBjcm9zcy1vcmlnaW4gc3JjIGF0dHJpYnV0ZS5cbiAgICAvLyBTYWZhcmkgd2lsbCBzaG93IGFuIGVycm9yIGluIHRoZSBjb25zb2xlIHdoZW4gdGhlIGFjY2VzcyByZXN1bHRzIGluIFwiQmxvY2tlZCBhIGZyYW1lIHdpdGggb3JpZ2luXCIuIGUuZzpcbiAgICAvLyBpZnJhbWUuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIC8vIEEgc2FmZXR5IHdheSBpcyB0byBhY2Nlc3Mgb25lIG9mIHRoZSBjcm9zcyBvcmlnaW4gcHJvcGVydGllczogV2luZG93IG9yIExvY2F0aW9uXG4gICAgLy8gV2hpY2ggbWlnaHQgcmVzdWx0IGluIFwiU2VjdXJpdHlFcnJvclwiIERPTSBFeGNlcHRpb24gYW5kIGl0IGlzIGNvbXBhdGlibGUgdG8gU2FmYXJpLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Jyb3dzZXJzLmh0bWwjaW50ZWdyYXRpb24td2l0aC1pZGxcbiAgICByZXR1cm4gdHlwZW9mIGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWYgPT09ICdzdHJpbmcnO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudERlZXAoKSB7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuXG4gIHdoaWxlIChlbGVtZW50IGluc3RhbmNlb2Ygd2luLkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgaWYgKGlzU2FtZU9yaWdpbkZyYW1lKGVsZW1lbnQpKSB7XG4gICAgICB3aW4gPSBlbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KHdpbi5kb2N1bWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG5cbi8qKlxuICogQGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogd2UgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBzZWxlY3Rpb25cbiAqIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG8tbm90LWFwcGx5LCBsb29raW5nIGF0IGBzZWxlY3Rpb25TdGFydGBcbiAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLlxuICovXG5cblxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAndGV4dCcgfHwgZWxlbS50eXBlID09PSAnc2VhcmNoJyB8fCBlbGVtLnR5cGUgPT09ICd0ZWwnIHx8IGVsZW0udHlwZSA9PT0gJ3VybCcgfHwgZWxlbS50eXBlID09PSAncGFzc3dvcmQnKSB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKTtcbn1cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCkge1xuICB2YXIgZm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICByZXR1cm4ge1xuICAgIGZvY3VzZWRFbGVtOiBmb2N1c2VkRWxlbSxcbiAgICBzZWxlY3Rpb25SYW5nZTogaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3VzZWRFbGVtKSA/IGdldFNlbGVjdGlvbihmb2N1c2VkRWxlbSkgOiBudWxsXG4gIH07XG59XG4vKipcbiAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICogcmVzdG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBjb3VsZCByZW1vdmUgZG9tXG4gKiBub2RlcyBhbmQgcGxhY2UgdGhlbSBiYWNrIGluLCByZXN1bHRpbmcgaW4gZm9jdXMgYmVpbmcgbG9zdC5cbiAqL1xuXG5mdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG5cbiAgaWYgKGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgIGlmIChwcmlvclNlbGVjdGlvblJhbmdlICE9PSBudWxsICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgc2V0U2VsZWN0aW9uKHByaW9yRm9jdXNlZEVsZW0sIHByaW9yU2VsZWN0aW9uUmFuZ2UpO1xuICAgIH0gLy8gRm9jdXNpbmcgYSBub2RlIGNhbiBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2hpY2ggaXMgdW5kZXNpcmFibGVcblxuXG4gICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgIHZhciBhbmNlc3RvciA9IHByaW9yRm9jdXNlZEVsZW07XG5cbiAgICB3aGlsZSAoYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAoYW5jZXN0b3Iubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICBhbmNlc3RvcnMucHVzaCh7XG4gICAgICAgICAgZWxlbWVudDogYW5jZXN0b3IsXG4gICAgICAgICAgbGVmdDogYW5jZXN0b3Iuc2Nyb2xsTGVmdCxcbiAgICAgICAgICB0b3A6IGFuY2VzdG9yLnNjcm9sbFRvcFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuY2VzdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSBhbmNlc3RvcnNbaV07XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxUb3AgPSBpbmZvLnRvcDtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3VzZWQgdGV4dGFyZWEsIGlucHV0IG9yXG4gKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0XG4gKiAtQHJldHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24oaW5wdXQpIHtcbiAgdmFyIHNlbGVjdGlvbjtcblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0ge1xuICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIENvbnRlbnQgZWRpdGFibGUgb3Igb2xkIElFIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IGdldE9mZnNldHMoaW5wdXQpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGlvbiB8fCB7XG4gICAgc3RhcnQ6IDAsXG4gICAgZW5kOiAwXG4gIH07XG59XG4vKipcbiAqIEBzZXRTZWxlY3Rpb246IFNldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSB0ZXh0YXJlYSBvciBpbnB1dCBhbmQgZm9jdXNlc1xuICogdGhlIGlucHV0LlxuICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYVxuICogLUBvZmZzZXRzICAgT2JqZWN0IG9mIHNhbWUgZm9ybSB0aGF0IGlzIHJldHVybmVkIGZyb20gZ2V0KlxuICovXG5cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykge1xuICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH1cblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICB9XG59XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uU2VsZWN0JywgWydmb2N1c291dCcsICdjb250ZXh0bWVudScsICdkcmFnZW5kJywgJ2ZvY3VzaW4nLCAna2V5ZG93bicsICdrZXl1cCcsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbnZhciBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xudmFyIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xudmFyIG1vdXNlRG93biA9IGZhbHNlO1xuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKG5vZGUpIHtcbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gbm9kZSAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgd2luID0gbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5jaG9yTm9kZTogc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldDogc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgfTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0YXJnZXQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldERvY3VtZW50KGV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBldmVudFRhcmdldC53aW5kb3cgPT09IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQuZG9jdW1lbnQgOiBldmVudFRhcmdldC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IGV2ZW50VGFyZ2V0IDogZXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbn1cbi8qKlxuICogUG9sbCBzZWxlY3Rpb24gdG8gc2VlIHdoZXRoZXIgaXQncyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gKiBAcmV0dXJuIHs/U3ludGhldGljRXZlbnR9XG4gKi9cblxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCQxID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCQxICE9PSBnZXRBY3RpdmVFbGVtZW50KGRvYykpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuXG5cbiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24kMShhY3RpdmVFbGVtZW50JDEpO1xuXG4gIGlmICghbGFzdFNlbGVjdGlvbiB8fCAhc2hhbGxvd0VxdWFsKGxhc3RTZWxlY3Rpb24sIGN1cnJlbnRTZWxlY3Rpb24pKSB7XG4gICAgbGFzdFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhhY3RpdmVFbGVtZW50SW5zdCQxLCAnb25TZWxlY3QnKTtcblxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvblNlbGVjdCcsICdzZWxlY3QnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgICBldmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50JDE7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gY29udGVudEVkaXRhYmxlXG4gKlxuICogVGhpcyBkaWZmZXJzIGZyb20gbmF0aXZlIGJyb3dzZXIgaW1wbGVtZW50YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy5cbiAqIC0gRmlyZXMgZm9yIGNvbGxhcHNlZCBzZWxlY3Rpb24uXG4gKiAtIEZpcmVzIGFmdGVyIHVzZXIgaW5wdXQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgLy8gVHJhY2sgdGhlIGlucHV0IG5vZGUgdGhhdCBoYXMgZm9jdXMuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpIHx8IHRhcmdldE5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpIHtcbiAgICAgICAgYWN0aXZlRWxlbWVudCQxID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IHRhcmdldEluc3Q7XG4gICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGw7XG4gICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbiAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgLy8gRG9uJ3QgZmlyZSB0aGUgZXZlbnQgd2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcuIFRoaXMgbWF0Y2hlcyB0aGVcbiAgICAvLyBzZW1hbnRpY3Mgb2YgdGhlIG5hdGl2ZSBzZWxlY3QgZXZlbnQuXG5cbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgICAgbW91c2VEb3duID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgIGNhc2UgJ21vdXNldXAnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgICAgbW91c2VEb3duID0gZmFsc2U7XG4gICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgYnJlYWs7XG4gICAgLy8gQ2hyb21lIGFuZCBJRSBmaXJlIG5vbi1zdGFuZGFyZCBldmVudCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIChhbmRcbiAgICAvLyBzb21ldGltZXMgd2hlbiBpdCBoYXNuJ3QpLiBJRSdzIGV2ZW50IGZpcmVzIG91dCBvZiBvcmRlciB3aXRoIHJlc3BlY3RcbiAgICAvLyB0byBrZXkgYW5kIGlucHV0IGV2ZW50cyBvbiBkZWxldGlvbiwgc28gd2UgZGlzY2FyZCBpdC5cbiAgICAvL1xuICAgIC8vIEZpcmVmb3ggZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbmNoYW5nZSwgc28gY2hlY2sgc2VsZWN0aW9uIHN0YXR1c1xuICAgIC8vIGFmdGVyIGVhY2gga2V5IGVudHJ5LiBUaGUgc2VsZWN0aW9uIGNoYW5nZXMgYWZ0ZXIga2V5ZG93biBhbmQgYmVmb3JlXG4gICAgLy8ga2V5dXAsIGJ1dCB3ZSBjaGVjayBvbiBrZXlkb3duIGFzIHdlbGwgaW4gdGhlIGNhc2Ugb2YgaG9sZGluZyBkb3duIGFcbiAgICAvLyBrZXksIHdoZW4gbXVsdGlwbGUga2V5ZG93biBldmVudHMgYXJlIGZpcmVkIGJ1dCBvbmx5IG9uZSBrZXl1cCBpcy5cbiAgICAvLyBUaGlzIGlzIGFsc28gb3VyIGFwcHJvYWNoIGZvciBJRSBoYW5kbGluZywgZm9yIHRoZSByZWFzb24gYWJvdmUuXG5cbiAgICBjYXNlICdzZWxlY3Rpb25jaGFuZ2UnOlxuICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIG1hcHBpbmcgb2Ygc3RhbmRhcmQgdmVuZG9yIHByZWZpeGVzIHVzaW5nIHRoZSBkZWZpbmVkIHN0eWxlIHByb3BlcnR5IGFuZCBldmVudCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVByb3BcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gbWFrZVByZWZpeE1hcChzdHlsZVByb3AsIGV2ZW50TmFtZSkge1xuICB2YXIgcHJlZml4ZXMgPSB7fTtcbiAgcHJlZml4ZXNbc3R5bGVQcm9wLnRvTG93ZXJDYXNlKCldID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHByZWZpeGVzWydXZWJraXQnICsgc3R5bGVQcm9wXSA9ICd3ZWJraXQnICsgZXZlbnROYW1lO1xuICBwcmVmaXhlc1snTW96JyArIHN0eWxlUHJvcF0gPSAnbW96JyArIGV2ZW50TmFtZTtcbiAgcmV0dXJuIHByZWZpeGVzO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cblxuXG52YXIgdmVuZG9yUHJlZml4ZXMgPSB7XG4gIGFuaW1hdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkVuZCcpLFxuICBhbmltYXRpb25pdGVyYXRpb246IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25JdGVyYXRpb24nKSxcbiAgYW5pbWF0aW9uc3RhcnQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25TdGFydCcpLFxuICB0cmFuc2l0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdUcmFuc2l0aW9uJywgJ1RyYW5zaXRpb25FbmQnKVxufTtcbi8qKlxuICogRXZlbnQgbmFtZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBkZXRlY3RlZCBhbmQgcHJlZml4ZWQgKGlmIGFwcGxpY2FibGUpLlxuICovXG5cbnZhciBwcmVmaXhlZEV2ZW50TmFtZXMgPSB7fTtcbi8qKlxuICogRWxlbWVudCB0byBjaGVjayBmb3IgcHJlZml4ZXMgb24uXG4gKi9cblxudmFyIHN0eWxlID0ge307XG4vKipcbiAqIEJvb3RzdHJhcCBpZiBhIERPTSBleGlzdHMuXG4gKi9cblxuaWYgKGNhblVzZURPTSkge1xuICBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLnN0eWxlOyAvLyBPbiBzb21lIHBsYXRmb3JtcywgaW4gcGFydGljdWxhciBzb21lIHJlbGVhc2VzIG9mIEFuZHJvaWQgNC54LFxuICAvLyB0aGUgdW4tcHJlZml4ZWQgXCJhbmltYXRpb25cIiBhbmQgXCJ0cmFuc2l0aW9uXCIgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBvbiB0aGVcbiAgLy8gc3R5bGUgb2JqZWN0IGJ1dCB0aGUgZXZlbnRzIHRoYXQgZmlyZSB3aWxsIHN0aWxsIGJlIHByZWZpeGVkLCBzbyB3ZSBuZWVkXG4gIC8vIHRvIGNoZWNrIGlmIHRoZSB1bi1wcmVmaXhlZCBldmVudHMgYXJlIHVzYWJsZSwgYW5kIGlmIG5vdCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYXAuXG5cbiAgaWYgKCEoJ0FuaW1hdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbmVuZC5hbmltYXRpb247XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb247XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbjtcbiAgfSAvLyBTYW1lIGFzIGFib3ZlXG5cblxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxufVxuLyoqXG4gKiBBdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdmVuZG9yIHByZWZpeGVkIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICBpZiAocHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0pIHtcbiAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gIH0gZWxzZSBpZiAoIXZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV0pIHtcbiAgICByZXR1cm4gZXZlbnROYW1lO1xuICB9XG5cbiAgdmFyIHByZWZpeE1hcCA9IHZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV07XG5cbiAgZm9yICh2YXIgc3R5bGVQcm9wIGluIHByZWZpeE1hcCkge1xuICAgIGlmIChwcmVmaXhNYXAuaGFzT3duUHJvcGVydHkoc3R5bGVQcm9wKSAmJiBzdHlsZVByb3AgaW4gc3R5bGUpIHtcbiAgICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHByZWZpeE1hcFtzdHlsZVByb3BdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudE5hbWU7XG59XG5cbnZhciBBTklNQVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbmVuZCcpO1xudmFyIEFOSU1BVElPTl9JVEVSQVRJT04gPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uaXRlcmF0aW9uJyk7XG52YXIgQU5JTUFUSU9OX1NUQVJUID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbnN0YXJ0Jyk7XG52YXIgVFJBTlNJVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcpO1xuXG52YXIgdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMgPSBuZXcgTWFwKCk7IC8vIE5PVEU6IENhcGl0YWxpemF0aW9uIGlzIGltcG9ydGFudCBpbiB0aGlzIGxpc3QhXG4vL1xuLy8gRS5nLiBpdCBuZWVkcyBcInBvaW50ZXJEb3duXCIsIG5vdCBcInBvaW50ZXJkb3duXCIuXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2UgZGVyaXZlIGJvdGggUmVhY3QgbmFtZSAoXCJvblBvaW50ZXJEb3duXCIpXG4vLyBhbmQgRE9NIG5hbWUgKFwicG9pbnRlcmRvd25cIikgZnJvbSB0aGUgc2FtZSBsaXN0LlxuLy9cbi8vIEV4Y2VwdGlvbnMgdGhhdCBkb24ndCBtYXRjaCB0aGlzIGNvbnZlbnRpb24gYXJlIGxpc3RlZCBzZXBhcmF0ZWx5LlxuLy9cbi8vIHByZXR0aWVyLWlnbm9yZVxuXG52YXIgc2ltcGxlRXZlbnRQbHVnaW5FdmVudHMgPSBbJ2Fib3J0JywgJ2F1eENsaWNrJywgJ2NhbmNlbCcsICdjYW5QbGF5JywgJ2NhblBsYXlUaHJvdWdoJywgJ2NsaWNrJywgJ2Nsb3NlJywgJ2NvbnRleHRNZW51JywgJ2NvcHknLCAnY3V0JywgJ2RyYWcnLCAnZHJhZ0VuZCcsICdkcmFnRW50ZXInLCAnZHJhZ0V4aXQnLCAnZHJhZ0xlYXZlJywgJ2RyYWdPdmVyJywgJ2RyYWdTdGFydCcsICdkcm9wJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2dvdFBvaW50ZXJDYXB0dXJlJywgJ2lucHV0JywgJ2ludmFsaWQnLCAna2V5RG93bicsICdrZXlQcmVzcycsICdrZXlVcCcsICdsb2FkJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZFN0YXJ0JywgJ2xvc3RQb2ludGVyQ2FwdHVyZScsICdtb3VzZURvd24nLCAnbW91c2VNb3ZlJywgJ21vdXNlT3V0JywgJ21vdXNlT3ZlcicsICdtb3VzZVVwJywgJ3Bhc3RlJywgJ3BhdXNlJywgJ3BsYXknLCAncGxheWluZycsICdwb2ludGVyQ2FuY2VsJywgJ3BvaW50ZXJEb3duJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJPdXQnLCAncG9pbnRlck92ZXInLCAncG9pbnRlclVwJywgJ3Byb2dyZXNzJywgJ3JhdGVDaGFuZ2UnLCAncmVzZXQnLCAncmVzaXplJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VibWl0JywgJ3N1c3BlbmQnLCAndGltZVVwZGF0ZScsICd0b3VjaENhbmNlbCcsICd0b3VjaEVuZCcsICd0b3VjaFN0YXJ0JywgJ3ZvbHVtZUNoYW5nZScsICdzY3JvbGwnLCAndG9nZ2xlJywgJ3RvdWNoTW92ZScsICd3YWl0aW5nJywgJ3doZWVsJ107XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpIHtcbiAgdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuc2V0KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlYWN0TmFtZSwgW2RvbUV2ZW50TmFtZV0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZUV2ZW50cygpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaW1wbGVFdmVudFBsdWdpbkV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldmVudE5hbWUgPSBzaW1wbGVFdmVudFBsdWdpbkV2ZW50c1tpXTtcbiAgICB2YXIgZG9tRXZlbnROYW1lID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudE5hbWVbMF0udG9VcHBlckNhc2UoKSArIGV2ZW50TmFtZS5zbGljZSgxKTtcbiAgICByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgJ29uJyArIGNhcGl0YWxpemVkRXZlbnQpO1xuICB9IC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgZXZlbnQgbmFtZXMgZG9uJ3QgbWF0Y2guXG5cblxuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9FTkQsICdvbkFuaW1hdGlvbkVuZCcpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9JVEVSQVRJT04sICdvbkFuaW1hdGlvbkl0ZXJhdGlvbicpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9TVEFSVCwgJ29uQW5pbWF0aW9uU3RhcnQnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZGJsY2xpY2snLCAnb25Eb3VibGVDbGljaycpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdmb2N1c2luJywgJ29uRm9jdXMnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZm9jdXNvdXQnLCAnb25CbHVyJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9FTkQsICdvblRyYW5zaXRpb25FbmQnKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ0KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHJlYWN0TmFtZSA9IHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzLmdldChkb21FdmVudE5hbWUpO1xuXG4gIGlmIChyZWFjdE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNFdmVudDtcbiAgdmFyIHJlYWN0RXZlbnRUeXBlID0gZG9tRXZlbnROYW1lO1xuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEga2V5cHJlc3MgZXZlbnQgZm9yIGZ1bmN0aW9uIGtleXMgdG9vLiBUaGlzIHJlbW92ZXNcbiAgICAgIC8vIHRoZSB1bndhbnRlZCBrZXlwcmVzcyBldmVudHMuIEVudGVyIGlzIGhvd2V2ZXIgYm90aCBwcmludGFibGUgYW5kXG4gICAgICAvLyBub24tcHJpbnRhYmxlLiBPbmUgd291bGQgZXhwZWN0IFRhYiB0byBiZSBhcyB3ZWxsIChidXQgaXQgaXNuJ3QpLlxuICAgICAgaWYgKGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgcmVhY3RFdmVudFR5cGUgPSAnZm9jdXMnO1xuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgcmVhY3RFdmVudFR5cGUgPSAnYmx1cic7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdiZWZvcmVibHVyJzpcbiAgICBjYXNlICdhZnRlcmJsdXInOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY2xpY2snOlxuICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEgY2xpY2sgZXZlbnQgb24gcmlnaHQgbW91c2UgY2xpY2tzLiBUaGlzIHJlbW92ZXMgdGhlXG4gICAgICAvLyB1bndhbnRlZCBjbGljayBldmVudHMuXG4gICAgICBpZiAobmF0aXZlRXZlbnQuYnV0dG9uID09PSAyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ2F1eGNsaWNrJzpcbiAgICBjYXNlICdkYmxjbGljayc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgIGNhc2UgJ21vdXNldXAnOiAvLyBUT0RPOiBEaXNhYmxlZCBlbGVtZW50cyBzaG91bGQgbm90IHJlc3BvbmQgdG8gbW91c2UgZXZlbnRzXG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkcmFnJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdleGl0JzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICBjYXNlICdkcmFnc3RhcnQnOlxuICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRHJhZ0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0b3VjaGNhbmNlbCc6XG4gICAgY2FzZSAndG91Y2hlbmQnOlxuICAgIGNhc2UgJ3RvdWNobW92ZSc6XG4gICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUb3VjaEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEFOSU1BVElPTl9FTkQ6XG4gICAgY2FzZSBBTklNQVRJT05fSVRFUkFUSU9OOlxuICAgIGNhc2UgQU5JTUFUSU9OX1NUQVJUOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQW5pbWF0aW9uRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVFJBTlNJVElPTl9FTkQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3Njcm9sbCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNVSUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd3aGVlbCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNXaGVlbEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb3B5JzpcbiAgICBjYXNlICdjdXQnOlxuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICBjYXNlICdwb2ludGVyZG93bic6XG4gICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdwb2ludGVydXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgaW5DYXB0dXJlUGhhc2UgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UpICE9PSAwO1xuXG4gIHtcbiAgICAvLyBTb21lIGV2ZW50cyBkb24ndCBidWJibGUgaW4gdGhlIGJyb3dzZXIuXG4gICAgLy8gSW4gdGhlIHBhc3QsIFJlYWN0IGhhcyBhbHdheXMgYnViYmxlZCB0aGVtLCBidXQgdGhpcyBjYW4gYmUgc3VycHJpc2luZy5cbiAgICAvLyBXZSdyZSBnb2luZyB0byB0cnkgYWxpZ25pbmcgY2xvc2VyIHRvIHRoZSBicm93c2VyIGJlaGF2aW9yIGJ5IG5vdCBidWJibGluZ1xuICAgIC8vIHRoZW0gaW4gUmVhY3QgZWl0aGVyLiBXZSdsbCBzdGFydCBieSBub3QgYnViYmxpbmcgb25TY3JvbGwsIGFuZCB0aGVuIGV4cGFuZC5cbiAgICB2YXIgYWNjdW11bGF0ZVRhcmdldE9ubHkgPSAhaW5DYXB0dXJlUGhhc2UgJiYgLy8gVE9ETzogaWRlYWxseSwgd2UnZCBldmVudHVhbGx5IGFkZCBhbGwgZXZlbnRzIGZyb21cbiAgICAvLyBub25EZWxlZ2F0ZWRFdmVudHMgbGlzdCBpbiBET01QbHVnaW5FdmVudFN5c3RlbS5cbiAgICAvLyBUaGVuIHdlIGNhbiByZW1vdmUgdGhpcyBzcGVjaWFsIGxpc3QuXG4gICAgLy8gVGhpcyBpcyBhIGJyZWFraW5nIGNoYW5nZSB0aGF0IGNhbiB3YWl0IHVudGlsIFJlYWN0IDE4LlxuICAgIGRvbUV2ZW50TmFtZSA9PT0gJ3Njcm9sbCc7XG5cbiAgICB2YXIgX2xpc3RlbmVycyA9IGFjY3VtdWxhdGVTaW5nbGVQaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50LnR5cGUsIGluQ2FwdHVyZVBoYXNlLCBhY2N1bXVsYXRlVGFyZ2V0T25seSk7XG5cbiAgICBpZiAoX2xpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGNyZWF0ZSBldmVudCBsYXppbHkuXG4gICAgICB2YXIgX2V2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihyZWFjdE5hbWUsIHJlYWN0RXZlbnRUeXBlLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogX2V2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IF9saXN0ZW5lcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdG9wLWxldmVsIHNpZGUgZWZmZWN0LlxucmVnaXN0ZXJTaW1wbGVFdmVudHMoKTtcbnJlZ2lzdGVyRXZlbnRzJDIoKTtcbnJlZ2lzdGVyRXZlbnRzJDEoKTtcbnJlZ2lzdGVyRXZlbnRzJDMoKTtcbnJlZ2lzdGVyRXZlbnRzKCk7XG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkNShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIC8vIFRPRE86IHdlIHNob3VsZCByZW1vdmUgdGhlIGNvbmNlcHQgb2YgYSBcIlNpbXBsZUV2ZW50UGx1Z2luXCIuXG4gIC8vIFRoaXMgaXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGV2ZW50IHN5c3RlbS4gQWxsXG4gIC8vIHRoZSBvdGhlciBwbHVnaW5zIGFyZSBlc3NlbnRpYWxseSBwb2x5ZmlsbHMuIFNvIHRoZSBwbHVnaW5cbiAgLy8gc2hvdWxkIHByb2JhYmx5IGJlIGlubGluZWQgc29tZXdoZXJlIGFuZCBoYXZlIGl0cyBsb2dpY1xuICAvLyBiZSBjb3JlIHRoZSB0byBldmVudCBzeXN0ZW0uIFRoaXMgd291bGQgcG90ZW50aWFsbHkgYWxsb3dcbiAgLy8gdXMgdG8gc2hpcCBidWlsZHMgb2YgUmVhY3Qgd2l0aG91dCB0aGUgcG9seWZpbGxlZCBwbHVnaW5zIGJlbG93LlxuICBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICB2YXIgc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucyA9IChldmVudFN5c3RlbUZsYWdzICYgU0hPVUxEX05PVF9QUk9DRVNTX1BPTFlGSUxMX0VWRU5UX1BMVUdJTlMpID09PSAwOyAvLyBXZSBkb24ndCBwcm9jZXNzIHRoZXNlIGV2ZW50cyB1bmxlc3Mgd2UgYXJlIGluIHRoZVxuICAvLyBldmVudCdzIG5hdGl2ZSBcImJ1YmJsZVwiIHBoYXNlLCB3aGljaCBtZWFucyB0aGF0IHdlJ3JlXG4gIC8vIG5vdCBpbiB0aGUgY2FwdHVyZSBwaGFzZS4gVGhhdCdzIGJlY2F1c2Ugd2UgZW11bGF0ZVxuICAvLyB0aGUgY2FwdHVyZSBwaGFzZSBoZXJlIHN0aWxsLiBUaGlzIGlzIGEgdHJhZGUtb2ZmLFxuICAvLyBiZWNhdXNlIGluIGFuIGlkZWFsIHdvcmxkIHdlIHdvdWxkIG5vdCBlbXVsYXRlIGFuZCB1c2VcbiAgLy8gdGhlIHBoYXNlcyBwcm9wZXJseSwgbGlrZSB3ZSBkbyB3aXRoIHRoZSBTaW1wbGVFdmVudFxuICAvLyBwbHVnaW4uIEhvd2V2ZXIsIHRoZSBwbHVnaW5zIGJlbG93IGVpdGhlciBleHBlY3RcbiAgLy8gZW11bGF0aW9uIChFbnRlckxlYXZlKSBvciB1c2Ugc3RhdGUgbG9jYWxpemVkIHRvIHRoYXRcbiAgLy8gcGx1Z2luIChCZWZvcmVJbnB1dCwgQ2hhbmdlLCBTZWxlY3QpLiBUaGUgc3RhdGUgaW5cbiAgLy8gdGhlc2UgbW9kdWxlcyBjb21wbGljYXRlcyB0aGluZ3MsIGFzIHlvdSdsbCBlc3NlbnRpYWxseVxuICAvLyBnZXQgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhcHR1cmUgcGhhc2UgZXZlbnQgbWlnaHQgY2hhbmdlXG4gIC8vIHN0YXRlLCBvbmx5IGZvciB0aGUgZm9sbG93aW5nIGJ1YmJsZSBldmVudCB0byBjb21lIGluXG4gIC8vIGxhdGVyIGFuZCBub3QgdHJpZ2dlciBhbnl0aGluZyBhcyB0aGUgc3RhdGUgbm93XG4gIC8vIGludmFsaWRhdGVzIHRoZSBoZXVyaXN0aWNzIG9mIHRoZSBldmVudCBwbHVnaW4uIFdlXG4gIC8vIGNvdWxkIGFsdGVyIGFsbCB0aGVzZSBwbHVnaW5zIHRvIHdvcmsgaW4gc3VjaCB3YXlzLCBidXRcbiAgLy8gdGhhdCBtaWdodCBjYXVzZSBvdGhlciB1bmtub3duIHNpZGUtZWZmZWN0cyB0aGF0IHdlXG4gIC8vIGNhbid0IGZvcmVzZWUgcmlnaHQgbm93LlxuXG4gIGlmIChzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zKSB7XG4gICAgZXh0cmFjdEV2ZW50cyQyKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIH1cbn0gLy8gTGlzdCBvZiBldmVudHMgdGhhdCBuZWVkIHRvIGJlIGluZGl2aWR1YWxseSBhdHRhY2hlZCB0byBtZWRpYSBlbGVtZW50cy5cblxuXG52YXIgbWVkaWFFdmVudFR5cGVzID0gWydhYm9ydCcsICdjYW5wbGF5JywgJ2NhbnBsYXl0aHJvdWdoJywgJ2R1cmF0aW9uY2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2xvYWRlZGRhdGEnLCAnbG9hZGVkbWV0YWRhdGEnLCAnbG9hZHN0YXJ0JywgJ3BhdXNlJywgJ3BsYXknLCAncGxheWluZycsICdwcm9ncmVzcycsICdyYXRlY2hhbmdlJywgJ3Jlc2l6ZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAndGltZXVwZGF0ZScsICd2b2x1bWVjaGFuZ2UnLCAnd2FpdGluZyddOyAvLyBXZSBzaG91bGQgbm90IGRlbGVnYXRlIHRoZXNlIGV2ZW50cyB0byB0aGUgY29udGFpbmVyLCBidXQgcmF0aGVyXG4vLyBzZXQgdGhlbSBvbiB0aGUgYWN0dWFsIHRhcmdldCBlbGVtZW50IGl0c2VsZi4gVGhpcyBpcyBwcmltYXJpbHlcbi8vIGJlY2F1c2UgdGhlc2UgZXZlbnRzIGRvIG5vdCBjb25zaXN0ZW50bHkgYnViYmxlIGluIHRoZSBET00uXG5cbnZhciBub25EZWxlZ2F0ZWRFdmVudHMgPSBuZXcgU2V0KFsnY2FuY2VsJywgJ2Nsb3NlJywgJ2ludmFsaWQnLCAnbG9hZCcsICdzY3JvbGwnLCAndG9nZ2xlJ10uY29uY2F0KG1lZGlhRXZlbnRUeXBlcykpO1xuXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCAndW5rbm93bi1ldmVudCc7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IodHlwZSwgbGlzdGVuZXIsIHVuZGVmaW5lZCwgZXZlbnQpO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGRpc3BhdGNoTGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcHJldmlvdXNJbnN0YW5jZTtcblxuICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICBmb3IgKHZhciBpID0gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IGRpc3BhdGNoTGlzdGVuZXJzW2ldLFxuICAgICAgICAgIGluc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuaW5zdGFuY2UsXG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKGluc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRfaSA9IGRpc3BhdGNoTGlzdGVuZXJzW19pXSxcbiAgICAgICAgICBfaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuaW5zdGFuY2UsXG4gICAgICAgICAgX2N1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBfbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kubGlzdGVuZXI7XG5cbiAgICAgIGlmIChfaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgX2xpc3RlbmVyLCBfY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gX2luc3RhbmNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaFF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldLFxuICAgICAgICBldmVudCA9IF9kaXNwYXRjaFF1ZXVlJGkuZXZlbnQsXG4gICAgICAgIGxpc3RlbmVycyA9IF9kaXNwYXRjaFF1ZXVlJGkubGlzdGVuZXJzO1xuICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBsaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKTsgLy8gIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICB9IC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuXG5cbiAgcmV0aHJvd0NhdWdodEVycm9yKCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKTtcbn1cblxuZnVuY3Rpb24gbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEVsZW1lbnQpIHtcbiAge1xuICAgIGlmICghbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpKSB7XG4gICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCkgY2FsbCBmb3IgXCIlc1wiLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGRvbUV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIgPSBmYWxzZTtcbiAgdmFyIGxpc3RlbmVyU2V0ID0gZ2V0RXZlbnRMaXN0ZW5lclNldCh0YXJnZXRFbGVtZW50KTtcbiAgdmFyIGxpc3RlbmVyU2V0S2V5ID0gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcblxuICBpZiAoIWxpc3RlbmVyU2V0LmhhcyhsaXN0ZW5lclNldEtleSkpIHtcbiAgICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBkb21FdmVudE5hbWUsIElTX05PTl9ERUxFR0FURUQsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyLCB0YXJnZXQpIHtcbiAge1xuICAgIGlmIChub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkgJiYgIWlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBhIGxpc3RlblRvTmF0aXZlRXZlbnQoKSBjYWxsIGZvciBcIiVzXCIgaW4gdGhlIGJ1YmJsZSBwaGFzZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBkb21FdmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBldmVudFN5c3RlbUZsYWdzID0gMDtcblxuICBpZiAoaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgIGV2ZW50U3lzdGVtRmxhZ3MgfD0gSVNfQ0FQVFVSRV9QSEFTRTtcbiAgfVxuXG4gIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldCwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcbn0gLy8gVGhpcyBpcyBvbmx5IHVzZWQgYnkgY3JlYXRlRXZlbnRIYW5kbGUgd2hlbiB0aGVcbnZhciBsaXN0ZW5pbmdNYXJrZXIgPSAnX3JlYWN0TGlzdGVuaW5nJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgaWYgKCFyb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSA9IHRydWU7XG4gICAgYWxsTmF0aXZlRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGRvbUV2ZW50TmFtZSkge1xuICAgICAgLy8gV2UgaGFuZGxlIHNlbGVjdGlvbmNoYW5nZSBzZXBhcmF0ZWx5IGJlY2F1c2UgaXRcbiAgICAgIC8vIGRvZXNuJ3QgYnViYmxlIGFuZCBuZWVkcyB0byBiZSBvbiB0aGUgZG9jdW1lbnQuXG4gICAgICBpZiAoZG9tRXZlbnROYW1lICE9PSAnc2VsZWN0aW9uY2hhbmdlJykge1xuICAgICAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCBmYWxzZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIHRydWUsIHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckVsZW1lbnQgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKG93bmVyRG9jdW1lbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQgYWxzbyBuZWVkcyBkZWR1cGxpY2F0aW9uXG4gICAgICAvLyBidXQgaXQgaXMgYXR0YWNoZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKCFvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0pIHtcbiAgICAgICAgb3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudCgnc2VsZWN0aW9uY2hhbmdlJywgZmFsc2UsIG93bmVyRG9jdW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgaXNEZWZlcnJlZExpc3RlbmVyRm9yTGVnYWN5RkJTdXBwb3J0KSB7XG4gIHZhciBsaXN0ZW5lciA9IGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKTsgLy8gSWYgcGFzc2l2ZSBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCwgdGhlbiB0aGUgZXZlbnQgd2lsbCBiZVxuICAvLyBhY3RpdmUgYW5kIG5vdCBwYXNzaXZlLlxuXG4gIHZhciBpc1Bhc3NpdmVMaXN0ZW5lciA9IHVuZGVmaW5lZDtcblxuICBpZiAocGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQpIHtcbiAgICAvLyBCcm93c2VycyBpbnRyb2R1Y2VkIGFuIGludGVydmVudGlvbiwgbWFraW5nIHRoZXNlIGV2ZW50c1xuICAgIC8vIHBhc3NpdmUgYnkgZGVmYXVsdCBvbiBkb2N1bWVudC4gUmVhY3QgZG9lc24ndCBiaW5kIHRoZW1cbiAgICAvLyB0byBkb2N1bWVudCBhbnltb3JlLCBidXQgY2hhbmdpbmcgdGhpcyBub3cgd291bGQgdW5kb1xuICAgIC8vIHRoZSBwZXJmb3JtYW5jZSB3aW5zIGZyb20gdGhlIGNoYW5nZS4gU28gd2UgZW11bGF0ZVxuICAgIC8vIHRoZSBleGlzdGluZyBiZWhhdmlvciBtYW51YWxseSBvbiB0aGUgcm9vdHMgbm93LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTk2NTFcbiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAndG91Y2hzdGFydCcgfHwgZG9tRXZlbnROYW1lID09PSAndG91Y2htb3ZlJyB8fCBkb21FdmVudE5hbWUgPT09ICd3aGVlbCcpIHtcbiAgICAgIGlzUGFzc2l2ZUxpc3RlbmVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB0YXJnZXRDb250YWluZXIgPSAgdGFyZ2V0Q29udGFpbmVyO1xuICB2YXIgdW5zdWJzY3JpYmVMaXN0ZW5lcjsgLy8gV2hlbiBsZWdhY3lGQlN1cHBvcnQgaXMgZW5hYmxlZCwgaXQncyBmb3Igd2hlbiB3ZVxuXG5cbiAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICBpZiAoaXNQYXNzaXZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lciwgaXNQYXNzaXZlTGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lciwgaXNQYXNzaXZlTGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc01hdGNoaW5nUm9vdENvbnRhaW5lcihncmFuZENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHJldHVybiBncmFuZENvbnRhaW5lciA9PT0gdGFyZ2V0Q29udGFpbmVyIHx8IGdyYW5kQ29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgJiYgZ3JhbmRDb250YWluZXIucGFyZW50Tm9kZSA9PT0gdGFyZ2V0Q29udGFpbmVyO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBhbmNlc3Rvckluc3QgPSB0YXJnZXRJbnN0O1xuXG4gIGlmICgoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFKSA9PT0gMCAmJiAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX05PTl9ERUxFR0FURUQpID09PSAwKSB7XG4gICAgdmFyIHRhcmdldENvbnRhaW5lck5vZGUgPSB0YXJnZXRDb250YWluZXI7IC8vIElmIHdlIGFyZSB1c2luZyB0aGUgbGVnYWN5IEZCIHN1cHBvcnQgZmxhZywgd2VcblxuICAgIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgYmVsb3cgbG9naWMgYXR0ZW1wdHMgdG8gd29yayBvdXQgaWYgd2UgbmVlZCB0byBjaGFuZ2VcbiAgICAgIC8vIHRoZSB0YXJnZXQgZmliZXIgdG8gYSBkaWZmZXJlbnQgYW5jZXN0b3IuIFdlIGhhZCBzaW1pbGFyIGxvZ2ljXG4gICAgICAvLyBpbiB0aGUgbGVnYWN5IGV2ZW50IHN5c3RlbSwgZXhjZXB0IHRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuXG4gICAgICAvLyBzeXN0ZW1zIGlzIHRoYXQgdGhlIG1vZGVybiBldmVudCBzeXN0ZW0gbm93IGhhcyBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgLy8gYXR0YWNoZWQgdG8gZWFjaCBSZWFjdCBSb290IGFuZCBSZWFjdCBQb3J0YWwgUm9vdC4gVG9nZXRoZXIsXG4gICAgICAvLyB0aGUgRE9NIG5vZGVzIHJlcHJlc2VudGluZyB0aGVzZSByb290cyBhcmUgdGhlIFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gVG8gZmlndXJlIG91dCB3aGljaCBhbmNlc3RvciBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlLCB3ZSB0cmF2ZXJzZVxuICAgICAgLy8gdXAgdGhlIGZpYmVyIHRyZWUgZnJvbSB0aGUgdGFyZ2V0IGluc3RhbmNlIGFuZCBhdHRlbXB0IHRvIGZpbmRcbiAgICAgIC8vIHJvb3QgYm91bmRhcmllcyB0aGF0IG1hdGNoIHRoYXQgb2Ygb3VyIGN1cnJlbnQgXCJyb290Q29udGFpbmVyXCIuXG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoYXQgXCJyb290Q29udGFpbmVyXCIsIHdlIGZpbmQgdGhlIHBhcmVudCBmaWJlclxuICAgICAgLy8gc3ViLXRyZWUgZm9yIHRoYXQgcm9vdCBhbmQgbWFrZSB0aGF0IG91ciBhbmNlc3RvciBpbnN0YW5jZS5cbiAgICAgIHZhciBub2RlID0gdGFyZ2V0SW5zdDtcblxuICAgICAgbWFpbkxvb3A6IHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5vZGVUYWcgPSBub2RlLnRhZztcblxuICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFJvb3QgfHwgbm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgIHZhciBjb250YWluZXIgPSBub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChub2RlVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IGlzIGEgcG9ydGFsLCBidXQgaXQncyBub3QgdGhlIHJvb3RDb250YWluZXIgd2UncmUgbG9va2luZyBmb3IuXG4gICAgICAgICAgICAvLyBOb3JtYWxseSBwb3J0YWxzIGhhbmRsZSB0aGVpciBvd24gZXZlbnRzIGFsbCB0aGUgd2F5IGRvd24gdG8gdGhlIHJvb3QuXG4gICAgICAgICAgICAvLyBTbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBzdG9wIG5vdy4gSG93ZXZlciwgd2UgZG9uJ3Qga25vdyBpZiB0aGlzIHBvcnRhbFxuICAgICAgICAgICAgLy8gd2FzIHBhcnQgb2YgKm91ciogcm9vdC5cbiAgICAgICAgICAgIHZhciBncmFuZE5vZGUgPSBub2RlLnJldHVybjtcblxuICAgICAgICAgICAgd2hpbGUgKGdyYW5kTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgZ3JhbmRUYWcgPSBncmFuZE5vZGUudGFnO1xuXG4gICAgICAgICAgICAgIGlmIChncmFuZFRhZyA9PT0gSG9zdFJvb3QgfHwgZ3JhbmRUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ3JhbmRDb250YWluZXIgPSBncmFuZE5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yIGFuZCB3ZSBmb3VuZCBpdCBhc1xuICAgICAgICAgICAgICAgICAgLy8gYSBwYXJlbnQgb2YgdGhlIFBvcnRhbC4gVGhhdCBtZWFucyB3ZSBjYW4gaWdub3JlIGl0IGJlY2F1c2UgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBQb3J0YWwgd2lsbCBidWJibGUgdGhyb3VnaCB0byB1cy5cbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBncmFuZE5vZGUgPSBncmFuZE5vZGUucmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gTm93IHdlIG5lZWQgdG8gZmluZCBpdCdzIGNvcnJlc3BvbmRpbmcgaG9zdCBmaWJlciBpbiB0aGUgb3RoZXJcbiAgICAgICAgICAvLyB0cmVlLiBUbyBkbyB0aGlzIHdlIGNhbiB1c2UgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsIGJ1dCB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgZmliZXIgaXMgYSBob3N0IGluc3RhbmNlLCBvdGhlcndpc2VcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHRyYXZlcnNlIHVwIHRocm91Z2ggdGhlIERPTSB0aWxsIHdlIGZpbmQgdGhlIGNvcnJlY3RcbiAgICAgICAgICAvLyBub2RlIHRoYXQgaXMgZnJvbSB0aGUgb3RoZXIgdHJlZS5cblxuXG4gICAgICAgICAgd2hpbGUgKGNvbnRhaW5lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShjb250YWluZXIpO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnROb2RlLnRhZztcblxuICAgICAgICAgICAgaWYgKHBhcmVudFRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBwYXJlbnRUYWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgICAgICAgIG5vZGUgPSBhbmNlc3Rvckluc3QgPSBwYXJlbnROb2RlO1xuICAgICAgICAgICAgICBjb250aW51ZSBtYWluTG9vcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIGFuY2VzdG9ySW5zdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICByZXR1cm4ge1xuICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICBsaXN0ZW5lcjogbGlzdGVuZXIsXG4gICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnRUeXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHksIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjYXB0dXJlTmFtZSA9IHJlYWN0TmFtZSAhPT0gbnVsbCA/IHJlYWN0TmFtZSArICdDYXB0dXJlJyA6IG51bGw7XG4gIHZhciByZWFjdEV2ZW50TmFtZSA9IGluQ2FwdHVyZVBoYXNlID8gY2FwdHVyZU5hbWUgOiByZWFjdE5hbWU7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0RmliZXI7XG4gIHZhciBsYXN0SG9zdENvbXBvbmVudCA9IG51bGw7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC5cblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICB2YXIgX2luc3RhbmNlMiA9IGluc3RhbmNlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UyLnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlMi50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pXG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgbGFzdEhvc3RDb21wb25lbnQgPSBzdGF0ZU5vZGU7IC8vIGNyZWF0ZUV2ZW50SGFuZGxlIGxpc3RlbmVyc1xuXG5cbiAgICAgIGlmIChyZWFjdEV2ZW50TmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVhY3RFdmVudE5hbWUpO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGxhc3RIb3N0Q29tcG9uZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIElmIHdlIGFyZSBvbmx5IGFjY3VtdWxhdGluZyBldmVudHMgZm9yIHRoZSB0YXJnZXQsIHRoZW4gd2UgZG9uJ3RcbiAgICAvLyBjb250aW51ZSB0byBwcm9wYWdhdGUgdGhyb3VnaCB0aGUgUmVhY3QgZmliZXIgdHJlZSB0byBmaW5kIG90aGVyXG4gICAgLy8gbGlzdGVuZXJzLlxuXG5cbiAgICBpZiAoYWNjdW11bGF0ZVRhcmdldE9ubHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gLy8gSWYgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIG9uQmVmb3JlQmx1ciBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIHRha2VcblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVycztcbn0gLy8gV2Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gZm9yOlxuLy8gLSBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXG4vLyAtIENoYW5nZUV2ZW50UGx1Z2luXG4vLyAtIFNlbGVjdEV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoZXNlIHBsdWdpbnNcbi8vIGluIHRoZSBidWJibGUgcGhhc2UsIHNvIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSB0d29cbi8vIHBoYXNlIGV2ZW50IGxpc3RlbmVycyAodmlhIGVtdWxhdGlvbikuXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRGaWJlciwgcmVhY3ROYW1lKSB7XG4gIHZhciBjYXB0dXJlTmFtZSA9IHJlYWN0TmFtZSArICdDYXB0dXJlJztcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UzID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTMuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UzLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IHN0YXRlTm9kZTtcbiAgICAgIHZhciBjYXB0dXJlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZU5hbWUpO1xuXG4gICAgICBpZiAoY2FwdHVyZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBidWJibGVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdE5hbWUpO1xuXG4gICAgICBpZiAoYnViYmxlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVycztcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50KGluc3QpIHtcbiAgaWYgKGluc3QgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRvIHtcbiAgICBpbnN0ID0gaW5zdC5yZXR1cm47IC8vIFRPRE86IElmIHRoaXMgaXMgYSBIb3N0Um9vdCB3ZSBtaWdodCB3YW50IHRvIGJhaWwgb3V0LlxuICAgIC8vIFRoYXQgaXMgZGVwZW5kaW5nIG9uIGlmIHdlIHdhbnQgbmVzdGVkIHN1YnRyZWVzIChsYXllcnMpIHRvIGJ1YmJsZVxuICAgIC8vIGV2ZW50cyB0byB0aGVpciBwYXJlbnQuIFdlIGNvdWxkIGFsc28gZ28gdGhyb3VnaCBwYXJlbnROb2RlIG9uIHRoZVxuICAgIC8vIGhvc3Qgbm9kZSBidXQgdGhhdCB3b3VsZG4ndCB3b3JrIGZvciBSZWFjdCBOYXRpdmUgYW5kIGRvZXNuJ3QgbGV0IHVzXG4gICAgLy8gZG8gdGhlIHBvcnRhbCBmZWF0dXJlLlxuICB9IHdoaWxlIChpbnN0ICYmIGluc3QudGFnICE9PSBIb3N0Q29tcG9uZW50KTtcblxuICBpZiAoaW5zdCkge1xuICAgIHJldHVybiBpbnN0O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIFJldHVybiB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciBvZiBBIGFuZCBCLCBvciBudWxsIGlmIHRoZXkgYXJlIGluXG4gKiBkaWZmZXJlbnQgdHJlZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRMb3dlc3RDb21tb25BbmNlc3RvcihpbnN0QSwgaW5zdEIpIHtcbiAgdmFyIG5vZGVBID0gaW5zdEE7XG4gIHZhciBub2RlQiA9IGluc3RCO1xuICB2YXIgZGVwdGhBID0gMDtcblxuICBmb3IgKHZhciB0ZW1wQSA9IG5vZGVBOyB0ZW1wQTsgdGVtcEEgPSBnZXRQYXJlbnQodGVtcEEpKSB7XG4gICAgZGVwdGhBKys7XG4gIH1cblxuICB2YXIgZGVwdGhCID0gMDtcblxuICBmb3IgKHZhciB0ZW1wQiA9IG5vZGVCOyB0ZW1wQjsgdGVtcEIgPSBnZXRQYXJlbnQodGVtcEIpKSB7XG4gICAgZGVwdGhCKys7XG4gIH0gLy8gSWYgQSBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuXG5cbiAgd2hpbGUgKGRlcHRoQSAtIGRlcHRoQiA+IDApIHtcbiAgICBub2RlQSA9IGdldFBhcmVudChub2RlQSk7XG4gICAgZGVwdGhBLS07XG4gIH0gLy8gSWYgQiBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuXG5cbiAgd2hpbGUgKGRlcHRoQiAtIGRlcHRoQSA+IDApIHtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gICAgZGVwdGhCLS07XG4gIH0gLy8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG5cblxuICB2YXIgZGVwdGggPSBkZXB0aEE7XG5cbiAgd2hpbGUgKGRlcHRoLS0pIHtcbiAgICBpZiAobm9kZUEgPT09IG5vZGVCIHx8IG5vZGVCICE9PSBudWxsICYmIG5vZGVBID09PSBub2RlQi5hbHRlcm5hdGUpIHtcbiAgICAgIHJldHVybiBub2RlQTtcbiAgICB9XG5cbiAgICBub2RlQSA9IGdldFBhcmVudChub2RlQSk7XG4gICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZXZlbnQsIHRhcmdldCwgY29tbW9uLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50Ll9yZWFjdE5hbWU7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0O1xuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIGlmIChpbnN0YW5jZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgX2luc3RhbmNlNCA9IGluc3RhbmNlLFxuICAgICAgICBhbHRlcm5hdGUgPSBfaW5zdGFuY2U0LmFsdGVybmF0ZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlNC5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTQudGFnO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICBpZiAoY2FwdHVyZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaW5DYXB0dXJlUGhhc2UpIHtcbiAgICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgYnViYmxlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggIT09IDApIHtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgfVxufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEVudGVyTGVhdmVFdmVudFBsdWdpblxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIG9ubHkgcHJvY2VzcyB0aGlzIHBsdWdpblxuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzLlxuXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlVHdvUGhhc2VMaXN0ZW5lcnMoZGlzcGF0Y2hRdWV1ZSwgbGVhdmVFdmVudCwgZW50ZXJFdmVudCwgZnJvbSwgdG8pIHtcbiAgdmFyIGNvbW1vbiA9IGZyb20gJiYgdG8gPyBnZXRMb3dlc3RDb21tb25BbmNlc3Rvcihmcm9tLCB0bykgOiBudWxsO1xuXG4gIGlmIChmcm9tICE9PSBudWxsKSB7XG4gICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBmcm9tLCBjb21tb24sIGZhbHNlKTtcbiAgfVxuXG4gIGlmICh0byAhPT0gbnVsbCAmJiBlbnRlckV2ZW50ICE9PSBudWxsKSB7XG4gICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBlbnRlckV2ZW50LCB0bywgY29tbW9uLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBjYXB0dXJlKSB7XG4gIHJldHVybiBkb21FdmVudE5hbWUgKyBcIl9fXCIgKyAoY2FwdHVyZSA/ICdjYXB0dXJlJyA6ICdidWJibGUnKTtcbn1cblxudmFyIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gZmFsc2U7XG52YXIgREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwgPSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnO1xudmFyIFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyA9ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnO1xudmFyIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgQVVUT0ZPQ1VTID0gJ2F1dG9Gb2N1cyc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIFNUWUxFID0gJ3N0eWxlJztcbnZhciBIVE1MJDEgPSAnX19odG1sJztcbnZhciB3YXJuZWRVbmtub3duVGFncztcbnZhciB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50O1xudmFyIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZTtcbnZhciB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzO1xudmFyIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcjtcbnZhciBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nO1xudmFyIG5vcm1hbGl6ZUhUTUw7XG5cbntcbiAgd2FybmVkVW5rbm93blRhZ3MgPSB7XG4gICAgLy8gVGhlcmUgYXJlIHdvcmtpbmcgcG9seWZpbGxzIGZvciA8ZGlhbG9nPi4gTGV0IHBlb3BsZSB1c2UgaXQuXG4gICAgZGlhbG9nOiB0cnVlLFxuICAgIC8vIEVsZWN0cm9uIHNoaXBzIGEgY3VzdG9tIDx3ZWJ2aWV3PiB0YWcgdG8gZGlzcGxheSBleHRlcm5hbCB3ZWIgY29udGVudCBpblxuICAgIC8vIGFuIGlzb2xhdGVkIGZyYW1lIGFuZCBwcm9jZXNzLlxuICAgIC8vIFRoaXMgdGFnIGlzIG5vdCBwcmVzZW50IGluIG5vbiBFbGVjdHJvbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBKU0RvbSB3aGljaFxuICAgIC8vIGlzIG9mdGVuIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gICAgLy8gQHNlZSBodHRwczovL2VsZWN0cm9uanMub3JnL2RvY3MvYXBpL3dlYnZpZXctdGFnXG4gICAgd2VidmlldzogdHJ1ZVxuICB9O1xuXG4gIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXModHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQxKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcywge1xuICAgICAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llczogcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyxcbiAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNcbiAgICB9KTtcbiAgfTsgLy8gSUUgMTEgcGFyc2VzICYgbm9ybWFsaXplcyB0aGUgc3R5bGUgYXR0cmlidXRlIGFzIG9wcG9zZWQgdG8gb3RoZXJcbiAgLy8gYnJvd3NlcnMuIEl0IGFkZHMgc3BhY2VzIGFuZCBzb3J0cyB0aGUgcHJvcGVydGllcyBpbiBzb21lXG4gIC8vIG5vbi1hbHBoYWJldGljYWwgb3JkZXIuIEhhbmRsaW5nIHRoYXQgd291bGQgcmVxdWlyZSBzb3J0aW5nIENTU1xuICAvLyBwcm9wZXJ0aWVzIGluIHRoZSBjbGllbnQgJiBzZXJ2ZXIgdmVyc2lvbnMgb3IgYXBwbHlpbmdcbiAgLy8gYGV4cGVjdGVkU3R5bGVgIHRvIGEgdGVtcG9yYXJ5IERPTSBub2RlIHRvIHJlYWQgaXRzIGBzdHlsZWAgYXR0cmlidXRlXG4gIC8vIG5vcm1hbGl6ZWQuIFNpbmNlIGl0IG9ubHkgYWZmZWN0cyBJRSwgd2UncmUgc2tpcHBpbmcgc3R5bGUgd2FybmluZ3NcbiAgLy8gaW4gdGhhdCBicm93c2VyIGNvbXBsZXRlbHkgaW4gZmF2b3Igb2YgZG9pbmcgYWxsIHRoYXQgd29yay5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE4MDdcblxuXG4gIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcgPSBjYW5Vc2VET00gJiYgIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcblxuICB3YXJuRm9yUHJvcERpZmZlcmVuY2UgPSBmdW5jdGlvbiAocHJvcE5hbWUsIHNlcnZlclZhbHVlLCBjbGllbnRWYWx1ZSkge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBub3JtYWxpemVkQ2xpZW50VmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VmFsdWUpO1xuICAgIHZhciBub3JtYWxpemVkU2VydmVyVmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVmFsdWUpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSA9PT0gbm9ybWFsaXplZENsaWVudFZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Byb3AgYCVzYCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6ICVzIENsaWVudDogJXMnLCBwcm9wTmFtZSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZFNlcnZlclZhbHVlKSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZENsaWVudFZhbHVlKSk7XG4gIH07XG5cbiAgd2FybkZvckV4dHJhQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lcykge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICBhdHRyaWJ1dGVOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBuYW1lcy5wdXNoKG5hbWUpO1xuICAgIH0pO1xuXG4gICAgZXJyb3IoJ0V4dHJhIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2VydmVyOiAlcycsIG5hbWVzKTtcbiAgfTtcblxuICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAocmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHtcbiAgICBpZiAobGlzdGVuZXIgPT09IGZhbHNlKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBgZmFsc2VgLlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYCVzYCB0eXBlLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcik7XG4gICAgfVxuICB9OyAvLyBQYXJzZSB0aGUgSFRNTCBhbmQgcmVhZCBpdCBiYWNrIHRvIG5vcm1hbGl6ZSB0aGUgSFRNTCBzdHJpbmcgc28gdGhhdCBpdFxuICAvLyBjYW4gYmUgdXNlZCBmb3IgY29tcGFyaXNvbi5cblxuXG4gIG5vcm1hbGl6ZUhUTUwgPSBmdW5jdGlvbiAocGFyZW50LCBodG1sKSB7XG4gICAgLy8gV2UgY291bGQgaGF2ZSBjcmVhdGVkIGEgc2VwYXJhdGUgZG9jdW1lbnQgaGVyZSB0byBhdm9pZFxuICAgIC8vIHJlLWluaXRpYWxpemluZyBjdXN0b20gZWxlbWVudHMgaWYgdGhleSBleGlzdC4gQnV0IHRoaXMgYnJlYWtzXG4gICAgLy8gaG93IDxub3NjcmlwdD4gaXMgYmVpbmcgaGFuZGxlZC4gU28gd2UgdXNlIHRoZSBzYW1lIGRvY3VtZW50LlxuICAgIC8vIFNlZSB0aGUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMTE1Ny5cbiAgICB2YXIgdGVzdEVsZW1lbnQgPSBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSA/IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50LnRhZ05hbWUpIDogcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHBhcmVudC5uYW1lc3BhY2VVUkksIHBhcmVudC50YWdOYW1lKTtcbiAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0ZXN0RWxlbWVudC5pbm5lckhUTUw7XG4gIH07XG59IC8vIEhUTUwgcGFyc2luZyBub3JtYWxpemVzIENSIGFuZCBDUkxGIHRvIExGLlxuLy8gSXQgYWxzbyBjYW4gdHVybiBcXHUwMDAwIGludG8gXFx1RkZGRCBpbnNpZGUgYXR0cmlidXRlcy5cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zaW5nbGUtcGFnZS5odG1sI3ByZXByb2Nlc3NpbmctdGhlLWlucHV0LXN0cmVhbVxuLy8gSWYgd2UgaGF2ZSBhIG1pc21hdGNoLCBpdCBtaWdodCBiZSBjYXVzZWQgYnkgdGhhdC5cbi8vIFdlIHdpbGwgc3RpbGwgcGF0Y2ggdXAgaW4gdGhpcyBjYXNlIGJ1dCBub3QgZmlyZSB0aGUgd2FybmluZy5cblxuXG52YXIgTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYID0gL1xcclxcbj8vZztcbnZhciBOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVggPSAvXFx1MDAwMHxcXHVGRkZEL2c7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShtYXJrdXApIHtcbiAge1xuICAgIGNoZWNrSHRtbFN0cmluZ0NvZXJjaW9uKG1hcmt1cCk7XG4gIH1cblxuICB2YXIgbWFya3VwU3RyaW5nID0gdHlwZW9mIG1hcmt1cCA9PT0gJ3N0cmluZycgPyBtYXJrdXAgOiAnJyArIG1hcmt1cDtcbiAgcmV0dXJuIG1hcmt1cFN0cmluZy5yZXBsYWNlKE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCwgJ1xcbicpLnJlcGxhY2UoTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChzZXJ2ZXJUZXh0LCBjbGllbnRUZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgdmFyIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclRleHQpO1xuXG4gIGlmIChub3JtYWxpemVkU2VydmVyVGV4dCA9PT0gbm9ybWFsaXplZENsaWVudFRleHQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hvdWxkV2FybkRldikge1xuICAgIHtcbiAgICAgIGlmICghZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUZXh0IGNvbnRlbnQgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiBcIiVzXCIgQ2xpZW50OiBcIiVzXCInLCBub3JtYWxpemVkU2VydmVyVGV4dCwgbm9ybWFsaXplZENsaWVudFRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpc0NvbmN1cnJlbnRNb2RlICYmIGVuYWJsZUNsaWVudFJlbmRlckZhbGxiYWNrT25UZXh0TWlzbWF0Y2gpIHtcbiAgICAvLyBJbiBjb25jdXJyZW50IHJvb3RzLCB3ZSB0aHJvdyB3aGVuIHRoZXJlJ3MgYSB0ZXh0IG1pc21hdGNoIGFuZCByZXZlcnQgdG9cbiAgICAvLyBjbGllbnQgcmVuZGVyaW5nLCB1cCB0byB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RleHQgY29udGVudCBkb2VzIG5vdCBtYXRjaCBzZXJ2ZXItcmVuZGVyZWQgSFRNTC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgcmV0dXJuIHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckVsZW1lbnQgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQobm9kZSkge1xuICAvLyBNb2JpbGUgU2FmYXJpIGRvZXMgbm90IGZpcmUgcHJvcGVybHkgYnViYmxlIGNsaWNrIGV2ZW50cyBvblxuICAvLyBub24taW50ZXJhY3RpdmUgZWxlbWVudHMsIHdoaWNoIG1lYW5zIGRlbGVnYXRlZCBjbGljayBsaXN0ZW5lcnMgZG8gbm90XG4gIC8vIGZpcmUuIFRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGJ1ZyBpbnZvbHZlcyBhdHRhY2hpbmcgYW4gZW1wdHkgY2xpY2tcbiAgLy8gbGlzdGVuZXIgb24gdGhlIHRhcmdldCBub2RlLlxuICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWxcbiAgLy8gSnVzdCBzZXQgaXQgdXNpbmcgdGhlIG9uY2xpY2sgcHJvcGVydHkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIG1hbmFnZSBhbnlcbiAgLy8gYm9va2tlZXBpbmcgZm9yIGl0LiBOb3Qgc3VyZSBpZiB3ZSBuZWVkIHRvIGNsZWFyIGl0IHdoZW4gdGhlIGxpc3RlbmVyIGlzXG4gIC8vIHJlbW92ZWQuXG4gIC8vIFRPRE86IE9ubHkgZG8gdGhpcyBmb3IgdGhlIHJlbGV2YW50IFNhZmFyaXMgbWF5YmU/XG4gIG5vZGUub25jbGljayA9IG5vb3A7XG59XG5cbmZ1bmN0aW9uIHNldEluaXRpYWxET01Qcm9wZXJ0aWVzKHRhZywgZG9tRWxlbWVudCwgcm9vdENvbnRhaW5lckVsZW1lbnQsIG5leHRQcm9wcywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgZm9yICh2YXIgcHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICBpZiAoIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cblxuXG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBuZXh0UHJvcCk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgbmV4dEh0bWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEF2b2lkIHNldHRpbmcgaW5pdGlhbCB0ZXh0Q29udGVudCB3aGVuIHRoZSB0ZXh0IGlzIGVtcHR5LiBJbiBJRTExIHNldHRpbmdcbiAgICAgICAgLy8gdGV4dENvbnRlbnQgb24gYSA8dGV4dGFyZWE+IHdpbGwgY2F1c2UgdGhlIHBsYWNlaG9sZGVyIHRvIG5vdFxuICAgICAgICAvLyBzaG93IHdpdGhpbiB0aGUgPHRleHRhcmVhPiB1bnRpbCBpdCBoYXMgYmVlbiBmb2N1c2VkIGFuZCBibHVycmVkIGFnYWluLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzY3MzEjaXNzdWVjb21tZW50LTI1NDg3NDU1M1xuICAgICAgICB2YXIgY2FuU2V0VGV4dENvbnRlbnQgPSB0YWcgIT09ICd0ZXh0YXJlYScgfHwgbmV4dFByb3AgIT09ICcnO1xuXG4gICAgICAgIGlmIChjYW5TZXRUZXh0Q29udGVudCkge1xuICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IEFVVE9GT0NVUykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAvLyBUT0RPOiBIYW5kbGUgd2FzQ3VzdG9tQ29tcG9uZW50VGFnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdXBkYXRlUGF5bG9hZC5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBwcm9wS2V5ID0gdXBkYXRlUGF5bG9hZFtpXTtcbiAgICB2YXIgcHJvcFZhbHVlID0gdXBkYXRlUGF5bG9hZFtpICsgMV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBwcm9wVmFsdWUsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQsIHBhcmVudE5hbWVzcGFjZSkge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWc7IC8vIFdlIGNyZWF0ZSB0YWdzIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlaXIgcGFyZW50IGNvbnRhaW5lciwgZXhjZXB0IEhUTUxcbiAgLy8gdGFncyBnZXQgbm8gbmFtZXNwYWNlLlxuXG4gIHZhciBvd25lckRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgdmFyIGRvbUVsZW1lbnQ7XG4gIHZhciBuYW1lc3BhY2VVUkkgPSBwYXJlbnROYW1lc3BhY2U7XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICBuYW1lc3BhY2VVUkkgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIHtcbiAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpOyAvLyBTaG91bGQgdGhpcyBjaGVjayBiZSBnYXRlZCBieSBwYXJlbnQgbmFtZXNwYWNlPyBOb3Qgc3VyZSB3ZSB3YW50IHRvXG4gICAgICAvLyBhbGxvdyA8U1ZHPiBvciA8bUFUSD4uXG5cbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgdHlwZSAhPT0gdHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGVycm9yKCc8JXMgLz4gaXMgdXNpbmcgaW5jb3JyZWN0IGNhc2luZy4gJyArICdVc2UgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cywgJyArICdvciBsb3dlcmNhc2UgZm9yIEhUTUwgZWxlbWVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdzY3JpcHQnKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAvLyBzZXQgdG8gdHJ1ZSBhbmQgaXQgZG9lcyBub3QgZXhlY3V0ZVxuICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHNjcmlwdD48JyArICcvc2NyaXB0Pic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCBhIHNjcmlwdCBlbGVtZW50LlxuXG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkO1xuICAgICAgZG9tRWxlbWVudCA9IGRpdi5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50c1xuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlLCB7XG4gICAgICAgIGlzOiBwcm9wcy5pc1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjYXVzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNjg5NlxuICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MFxuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsgLy8gTm9ybWFsbHkgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgaW4gYHNldEluaXRpYWxET01Qcm9wZXJ0aWVzYCwgaG93ZXZlciB0aGUgYG11bHRpcGxlYCBhbmQgYHNpemVgXG4gICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHM6XG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBkb2VzIG5vdCBzY3JvbGwgdG8gdGhlIGNvcnJlY3Qgb3B0aW9uIGJlY2F1c2Ugc2luZ3VsYXJcbiAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyXG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBzZXQgdGhlIGZpcnN0IGl0ZW0gYXMgc2VsZWN0ZWQgZGVzcGl0ZSB0aGUgYHNpemVgIGF0dHJpYnV0ZSAjMTQyMzlcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMjIyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBkb21FbGVtZW50O1xuXG4gICAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAgIG5vZGUubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnNpemUpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGEgc2l6ZSBncmVhdGVyIHRoYW4gMSBjYXVzZXMgYSBzZWxlY3QgdG8gYmVoYXZlIGxpa2UgYG11bHRpcGxlPXRydWVgLCB3aGVyZVxuICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgbm8gb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIGEgc2VsZWN0IGluIFwic2luZ2xlIHNlbGVjdGlvbiBtb2RlXCIuXG4gICAgICAgICAgbm9kZS5zaXplID0gcHJvcHMuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0eXBlKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgaWYgKCFpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9tRWxlbWVudCkgPT09ICdbb2JqZWN0IEhUTUxVbmtub3duRWxlbWVudF0nICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFVua25vd25UYWdzLCB0eXBlKSkge1xuICAgICAgICB3YXJuZWRVbmtub3duVGFnc1t0eXBlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RoZSB0YWcgPCVzPiBpcyB1bnJlY29nbml6ZWQgaW4gdGhpcyBicm93c2VyLiAnICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBSZWFjdCBjb21wb25lbnQsIHN0YXJ0IGl0cyBuYW1lIHdpdGggJyArICdhbiB1cHBlcmNhc2UgbGV0dGVyLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkb21FbGVtZW50O1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG59XG5mdW5jdGlvbiBzZXRJbml0aWFsUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHJhd1Byb3BzLCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTtcblxuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgdmFyIHByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2NhbmNlbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2xvc2UnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdlbWJlZCc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgbG9hZCBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGVycm9yIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBlcnJvciBhbmQgbG9hZCBldmVudHMuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCBwcm9wcyk7XG4gIHNldEluaXRpYWxET01Qcm9wZXJ0aWVzKHRhZywgZG9tRWxlbWVudCwgcm9vdENvbnRhaW5lckVsZW1lbnQsIHByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCBmYWxzZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxufSAvLyBDYWxjdWxhdGUgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvIG9iamVjdHMuXG5cbmZ1bmN0aW9uIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcbiAgdmFyIGxhc3RQcm9wcztcbiAgdmFyIG5leHRQcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBsYXN0UHJvcHMgPSBsYXN0UmF3UHJvcHM7XG4gICAgICBuZXh0UHJvcHMgPSBuZXh0UmF3UHJvcHM7XG5cbiAgICAgIGlmICh0eXBlb2YgbGFzdFByb3BzLm9uQ2xpY2sgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG5leHRQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCBuZXh0UHJvcHMpO1xuICB2YXIgcHJvcEtleTtcbiAgdmFyIHN0eWxlTmFtZTtcbiAgdmFyIHN0eWxlVXBkYXRlcyA9IG51bGw7XG5cbiAgZm9yIChwcm9wS2V5IGluIGxhc3RQcm9wcykge1xuICAgIGlmIChuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgIWxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBsYXN0UHJvcHNbcHJvcEtleV0gPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB2YXIgbGFzdFN0eWxlID0gbGFzdFByb3BzW3Byb3BLZXldO1xuXG4gICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHtcbiAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MIHx8IHByb3BLZXkgPT09IENISUxEUkVOKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgIC8vIHRoYXQgdGhlIFwiY3VycmVudFwiIGZpYmVyIHBvaW50ZXIgZ2V0cyB1cGRhdGVkIHNvIHdlIG5lZWQgYSBjb21taXRcbiAgICAgIC8vIHRvIHVwZGF0ZSB0aGlzIGVsZW1lbnQuXG4gICAgICBpZiAoIXVwZGF0ZVBheWxvYWQpIHtcbiAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYWxsIG90aGVyIGRlbGV0ZWQgcHJvcGVydGllcyB3ZSBhZGQgaXQgdG8gdGhlIHF1ZXVlLiBXZSB1c2VcbiAgICAgIC8vIHRoZSBhbGxvd2VkIHByb3BlcnR5IGxpc3QgaW4gdGhlIGNvbW1pdCBwaGFzZSBpbnN0ZWFkLlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAocHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG4gICAgdmFyIGxhc3RQcm9wID0gbGFzdFByb3BzICE9IG51bGwgPyBsYXN0UHJvcHNbcHJvcEtleV0gOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBuZXh0UHJvcCA9PT0gbGFzdFByb3AgfHwgbmV4dFByb3AgPT0gbnVsbCAmJiBsYXN0UHJvcCA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0UHJvcCkge1xuICAgICAgICAvLyBVbnNldCBzdHlsZXMgb24gYGxhc3RQcm9wYCBidXQgbm90IG9uIGBuZXh0UHJvcGAuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RQcm9wKSB7XG4gICAgICAgICAgaWYgKGxhc3RQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgKCFuZXh0UHJvcCB8fCAhbmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkpIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgbGFzdFByb3BgLlxuXG5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAobmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiBsYXN0UHJvcFtzdHlsZU5hbWVdICE9PSBuZXh0UHJvcFtzdHlsZU5hbWVdKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSBuZXh0UHJvcFtzdHlsZU5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG4gICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZC5wdXNoKHByb3BLZXksIHN0eWxlVXBkYXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZVVwZGF0ZXMgPSBuZXh0UHJvcDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgbGFzdEh0bWwgPSBsYXN0UHJvcCA/IGxhc3RQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChsYXN0SHRtbCAhPT0gbmV4dEh0bWwpIHtcbiAgICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbmV4dEh0bWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgLy8gV2UgZWFnZXJseSBsaXN0ZW4gdG8gdGhpcyBldmVuIHRob3VnaCB3ZSBoYXZlbid0IGNvbW1pdHRlZCB5ZXQuXG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkICYmIGxhc3RQcm9wICE9PSBuZXh0UHJvcCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBwcm9wcyBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAgIC8vIHRvIHVwZGF0ZSB0aGlzIGVsZW1lbnQuXG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFueSBvdGhlciBwcm9wZXJ0eSB3ZSBhbHdheXMgYWRkIGl0IHRvIHRoZSBxdWV1ZSBhbmQgdGhlbiB3ZVxuICAgICAgLy8gZmlsdGVyIGl0IG91dCB1c2luZyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGR1cmluZyB0aGUgY29tbWl0LlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAge1xuICAgICAgdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFByb3BzW1NUWUxFXSk7XG4gICAgfVxuXG4gICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKFNUWUxFLCBzdHlsZVVwZGF0ZXMpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMpIHtcbiAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS5cbiAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiB1cGRhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY2hlY2tlZC5cbiAgLy8gV2hlbiBhIGNoZWNrZWQgcmFkaW8gdHJpZXMgdG8gY2hhbmdlIG5hbWUsIGJyb3dzZXIgbWFrZXMgYW5vdGhlciByYWRpbydzIGNoZWNrZWQgZmFsc2UuXG4gIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZUNoZWNrZWQoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB3YXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIGxhc3RSYXdQcm9wcyk7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYuXG5cbiAgdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wc1xuICAvLyBjaGFuZ2VkLlxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVXBkYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCBpbnB1dHMgKmFmdGVyKiB1cGRhdGluZyBwcm9wcy4gVGhpcyBoYXMgdG9cbiAgICAgIC8vIGhhcHBlbiBhZnRlciBgdXBkYXRlRE9NUHJvcGVydGllc2AuIE90aGVyd2lzZSBIVE1MNSBpbnB1dCB2YWxpZGF0aW9uc1xuICAgICAgLy8gcmFpc2Ugd2FybmluZ3MgYW5kIHByZXZlbnQgdGhlIG5ldyB2YWx1ZSBmcm9tIGJlaW5nIGFzc2lnbmVkLlxuICAgICAgdXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1cGRhdGVXcmFwcGVyJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkge1xuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICghcG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV0gfHwgbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnO1xuICB2YXIgZXh0cmFBdHRyaWJ1dGVOYW1lcztcblxuICB7XG4gICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICB9IC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG5cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdlbWJlZCc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgbG9hZCBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgYWxsIHRoZSBtZWRpYSBldmVudHMuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBlcnJvciBhbmQgbG9hZCBldmVudHMuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCd0b2dnbGUnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIGV4dHJhQXR0cmlidXRlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBkb21FbGVtZW50LmF0dHJpYnV0ZXM7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXR0cmlidXRlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlc1tfaV0ubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTA2NzYuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlc1tfaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuXG4gIGZvciAodmFyIHByb3BLZXkgaW4gcmF3UHJvcHMpIHtcbiAgICBpZiAoIXJhd1Byb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSByYXdQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXNcbiAgICAgIC8vIG1pZ2h0IG1hdGNoIGFkZGl0aW9uYWwgSFRNTCB0aGF0IGlzIGhpZGRlbiB3aGVuIHdlIHJlYWQgaXQgdXNpbmdcbiAgICAgIC8vIHRleHRDb250ZW50LiBFLmcuIFwiZm9vXCIgd2lsbCBtYXRjaCBcImY8c3Bhbj5vbzwvc3Bhbj5cIiBidXQgdGhhdCBzdGlsbFxuICAgICAgLy8gc2F0aXNmaWVzIG91ciByZXF1aXJlbWVudC4gT3VyIHJlcXVpcmVtZW50IGlzIG5vdCB0byBwcm9kdWNlIHBlcmZlY3RcbiAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQnc1xuICAgICAgLy8gb2sgbm90IHRvIGlmIHRoZSB2aXNpYmxlIGNvbnRlbnQgaXMgc3RpbGwgZW5vdWdoIHRvIGluZGljYXRlIHdoYXRcbiAgICAgIC8vIGV2ZW4gbGlzdGVuZXJzIHRoZXNlIG5vZGVzIG1pZ2h0IGJlIHdpcmVkIHVwIHRvLlxuICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC5cbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgZG9tRWxlbWVudC5maXJzdENoaWxkLm5vZGVWYWx1ZSB0byBjb21wYXJlP1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCBuZXh0UHJvcF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudC50ZXh0Q29udGVudCAhPT0gJycgKyBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChkb21FbGVtZW50LnRleHRDb250ZW50LCBuZXh0UHJvcCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgJycgKyBuZXh0UHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNob3VsZFdhcm5EZXYgJiYgdHJ1ZSAmJiAvLyBDb252aW5jZSBGbG93IHdlJ3ZlIGNhbGN1bGF0ZWQgaXQgKGl0J3MgREVWLW9ubHkgaW4gdGhpcyBtZXRob2QuKVxuICAgIHR5cGVvZiBpc0N1c3RvbUNvbXBvbmVudFRhZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBwcm9wZXJ0aWVzIGNvcnJlc3BvbmQgdG8gdGhlaXIgZXhwZWN0ZWQgdmFsdWVzLlxuICAgICAgdmFyIHNlcnZlclZhbHVlID0gdm9pZCAwO1xuICAgICAgdmFyIHByb3BlcnR5SW5mbyA9IGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgPyBudWxsIDogZ2V0UHJvcGVydHlJbmZvKHByb3BLZXkpO1xuXG4gICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddID09PSB0cnVlKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyB8fCAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgcHJvcEtleSA9PT0gJ3ZhbHVlJyB8fCBwcm9wS2V5ID09PSAnY2hlY2tlZCcgfHwgcHJvcEtleSA9PT0gJ3NlbGVjdGVkJykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgICB2YXIgc2VydmVySFRNTCA9IGRvbUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRIVE1MID0gbm9ybWFsaXplSFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRIVE1MICE9PSBzZXJ2ZXJIVE1MKSB7XG4gICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVySFRNTCwgZXhwZWN0ZWRIVE1MKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcblxuICAgICAgICBpZiAoY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZykge1xuICAgICAgICAgIHZhciBleHBlY3RlZFN0eWxlID0gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKG5leHRQcm9wKTtcbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuXG4gICAgICAgICAgaWYgKGV4cGVjdGVkU3R5bGUgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIGV4cGVjdGVkU3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiAhZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuXG4gICAgICAgIGlmIChuZXh0UHJvcCAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc2hvdWxkSWdub3JlQXR0cmlidXRlKHByb3BLZXksIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpICYmICFzaG91bGRSZW1vdmVBdHRyaWJ1dGUocHJvcEtleSwgbmV4dFByb3AsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgICAgIHZhciBpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIHByb3BlcnR5SW5mbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIG93bk5hbWVzcGFjZSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICBvd25OYW1lc3BhY2UgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodGFnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3duTmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BLZXkpO1xuXG4gICAgICAgICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBudWxsICYmIHN0YW5kYXJkTmFtZSAhPT0gcHJvcEtleSkge1xuICAgICAgICAgICAgICAvLyBJZiBhbiBTVkcgcHJvcCBpcyBzdXBwbGllZCB3aXRoIGJhZCBjYXNpbmcsIGl0IHdpbGxcbiAgICAgICAgICAgICAgLy8gYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBmcm9tIEhUTUwsIGJ1dCB3aWxsIHByb2R1Y2UgYSBtaXNtYXRjaFxuICAgICAgICAgICAgICAvLyAoYW5kIHdvdWxkIGJlIGluY29ycmVjdGx5IHJlbmRlcmVkIG9uIHRoZSBjbGllbnQpLlxuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBhbHJlYWR5IHdhcm4gYWJvdXQgYmFkIGNhc2luZyBlbHNld2hlcmUuXG4gICAgICAgICAgICAgIC8vIFNvIHdlJ2xsIHNraXAgdGhlIG1pc2xlYWRpbmcgZXh0cmEgbWlzbWF0Y2ggd2FybmluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICAgIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IHRydWU7IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShzdGFuZGFyZE5hbWUpO1xuICAgICAgICAgICAgfSAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cblxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZG9udFdhcm5DdXN0b21FbGVtZW50ID0gZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCAgO1xuXG4gICAgICAgIGlmICghZG9udFdhcm5DdXN0b21FbGVtZW50ICYmIG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSAmJiAhaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKHNob3VsZFdhcm5EZXYpIHtcbiAgICAgIGlmICggLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5zaXplID4gMCAmJiByYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzKGV4dHJhQXR0cmlidXRlTmFtZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlcihkb21FbGVtZW50LCByYXdQcm9wcywgdHJ1ZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgLy8gRm9yIGlucHV0IGFuZCB0ZXh0YXJlYSB3ZSBjdXJyZW50IGFsd2F5cyBzZXQgdGhlIHZhbHVlIHByb3BlcnR5IGF0XG4gICAgICAvLyBwb3N0IG1vdW50IHRvIGZvcmNlIGl0IHRvIGRpdmVyZ2UgZnJvbSBhdHRyaWJ1dGVzLiBIb3dldmVyLCBmb3JcbiAgICAgIC8vIG9wdGlvbiBhbmQgc2VsZWN0IHdlIGRvbid0IHF1aXRlIGRvIHRoZSBzYW1lIHRoaW5nIGFuZCBzZWxlY3RcbiAgICAgIC8vIGlzIG5vdCByZXNpbGllbnQgdG8gdGhlIERPTSBzdGF0ZSBjaGFuZ2luZyBzbyB3ZSBkb24ndCBkbyB0aGF0IGhlcmUuXG4gICAgICAvLyBUT0RPOiBDb25zaWRlciBub3QgZG9pbmcgdGhpcyBmb3IgaW5wdXQgYW5kIHRleHRhcmVhLlxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVQYXlsb2FkO1xufVxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgaXNEaWZmZXJlbnQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWUgIT09IHRleHQ7XG4gIHJldHVybiBpc0RpZmZlcmVudDtcbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgPCVzPiBpbiA8JXM+LicsIGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIHRoZSB0ZXh0IG5vZGUgXCIlc1wiIGluIDwlcz4uJywgY2hpbGQubm9kZVZhbHVlLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdGFnLCBwcm9wcykge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyA8JXM+IGluIDwlcz4uJywgdGFnLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgICAvLyBXZSBleHBlY3QgdG8gaW5zZXJ0IGVtcHR5IHRleHQgbm9kZXMgc2luY2UgdGhleSdyZSBub3QgcmVwcmVzZW50ZWQgaW5cbiAgICAgIC8vIHRoZSBIVE1MLlxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlIGlmIHdlIGNhbiBqdXN0IGF2b2lkIGluc2VydGluZyBlbXB0eVxuICAgICAgLy8gdGV4dCBub2Rlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIHRleHQgbm9kZSBmb3IgXCIlc1wiIGluIDwlcz4uJywgdGV4dCwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGRvbUVsZW1lbnQsIHRhZywgcHJvcHMpIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKCkge307XG5cbnZhciB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gVGhpcyB2YWxpZGF0aW9uIGNvZGUgd2FzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIEhUTUw1IHBhcnNpbmcgc3BlYzpcbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBjYXRjaCBhbGwgaW52YWxpZCBuZXN0aW5nLCBub3IgZG9lcyBpdCB0cnkgdG8gKGFzIGl0J3NcbiAgLy8gbm90IGNsZWFyIHdoYXQgcHJhY3RpY2FsIGJlbmVmaXQgZG9pbmcgc28gcHJvdmlkZXMpOyBpbnN0ZWFkLCB3ZSB3YXJuIG9ubHlcbiAgLy8gZm9yIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgd2lsbCBnaXZlIGEgcGFyc2UgdHJlZSBkaWZmZXJpbmcgZnJvbSB3aGF0IFJlYWN0XG4gIC8vIGludGVuZGVkLiBGb3IgZXhhbXBsZSwgPGI+PGRpdj48L2Rpdj48L2I+IGlzIGludmFsaWQgYnV0IHdlIGRvbid0IHdhcm5cbiAgLy8gYmVjYXVzZSBpdCBzdGlsbCBwYXJzZXMgY29ycmVjdGx5OyB3ZSBkbyB3YXJuIGZvciBvdGhlciBjYXNlcyBsaWtlIG5lc3RlZFxuICAvLyA8cD4gdGFncyB3aGVyZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBpbXBsaWNpdGx5IGNsb3NlcyB0aGVcbiAgLy8gZmlyc3QsIGNhdXNpbmcgYSBjb25mdXNpbmcgbWVzcy5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG5cbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJywgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludFxuICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmVcbiAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdlciB3YXJuaW5nc1xuICAnZm9yZWlnbk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLWJ1dHRvbi1zY29wZVxuXG4gIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3BlVGFncy5jb25jYXQoWydidXR0b24nXSk7IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2dlbmVyYXRlLWltcGxpZWQtZW5kLXRhZ3NcblxuICB2YXIgaW1wbGllZEVuZFRhZ3MgPSBbJ2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91cCcsICdwJywgJ3JwJywgJ3J0J107XG4gIHZhciBlbXB0eUFuY2VzdG9ySW5mbyA9IHtcbiAgICBjdXJyZW50OiBudWxsLFxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcbiAgICBsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsXG4gIH07XG5cbiAgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcpIHtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gYXNzaWduKHt9LCBvbGRJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvKTtcblxuICAgIHZhciBpbmZvID0ge1xuICAgICAgdGFnOiB0YWdcbiAgICB9O1xuXG4gICAgaWYgKGluU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChidXR0b25TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gbnVsbDtcbiAgICB9IC8vIFNlZSBydWxlcyBmb3IgJ2xpJywgJ2RkJywgJ2R0JyBzdGFydCB0YWdzIGluXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuXG5cbiAgICBpZiAoc3BlY2lhbFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSAmJiB0YWcgIT09ICdhZGRyZXNzJyAmJiB0YWcgIT09ICdkaXYnICYmIHRhZyAhPT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgIH1cblxuICAgIGFuY2VzdG9ySW5mby5jdXJyZW50ID0gaW5mbztcblxuICAgIGlmICh0YWcgPT09ICdmb3JtJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmZvcm1UYWcgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdhJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYnV0dG9uJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdub2JyJykge1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2xpJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdkZCcgfHwgdGFnID09PSAnZHQnKSB7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNlc3RvckluZm87XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgaXNUYWdWYWxpZFdpdGhQYXJlbnQgPSBmdW5jdGlvbiAodGFnLCBwYXJlbnRUYWcpIHtcbiAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgd2UncmUgaW4gYW4gdW51c3VhbCBwYXJzaW5nIG1vZGUuLi5cbiAgICBzd2l0Y2ggKHBhcmVudFRhZykge1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluc2VsZWN0XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICdvcHRncm91cCcgfHwgdGFnID09PSAnI3RleHQnO1xuXG4gICAgICBjYXNlICdvcHRncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nLCBzZWVpbmcgYW4gPG9wdGlvbj4gZG9lc24ndCBtZWFuIHdlJ3JlIGluIGEgPHNlbGVjdD5cbiAgICAgIC8vIGJ1dFxuXG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGRcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNhcHRpb25cbiAgICAgIC8vIE5vIHNwZWNpYWwgYmVoYXZpb3Igc2luY2UgdGhlc2UgcnVsZXMgZmFsbCBiYWNrIHRvIFwiaW4gYm9keVwiIG1vZGUgZm9yXG4gICAgICAvLyBhbGwgZXhjZXB0IHNwZWNpYWwgdGFibGUgbm9kZXMgd2hpY2ggY2F1c2UgYmFkIHBhcnNpbmcgYmVoYXZpb3IgYW55d2F5LlxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludHJcblxuICAgICAgY2FzZSAndHInOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndGgnIHx8IHRhZyA9PT0gJ3RkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50Ym9keVxuXG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0cicgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY29sZ3JvdXBcblxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY29sJyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50YWJsZVxuXG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjYXB0aW9uJyB8fCB0YWcgPT09ICdjb2xncm91cCcgfHwgdGFnID09PSAndGJvZHknIHx8IHRhZyA9PT0gJ3Rmb290JyB8fCB0YWcgPT09ICd0aGVhZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluaGVhZFxuXG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2Jhc2UnIHx8IHRhZyA9PT0gJ2Jhc2Vmb250JyB8fCB0YWcgPT09ICdiZ3NvdW5kJyB8fCB0YWcgPT09ICdsaW5rJyB8fCB0YWcgPT09ICdtZXRhJyB8fCB0YWcgPT09ICd0aXRsZScgfHwgdGFnID09PSAnbm9zY3JpcHQnIHx8IHRhZyA9PT0gJ25vZnJhbWVzJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3MuaHRtbCN0aGUtaHRtbC1lbGVtZW50XG5cbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaGVhZCcgfHwgdGFnID09PSAnYm9keScgfHwgdGFnID09PSAnZnJhbWVzZXQnO1xuXG4gICAgICBjYXNlICdmcmFtZXNldCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdmcmFtZSc7XG5cbiAgICAgIGNhc2UgJyNkb2N1bWVudCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdodG1sJztcbiAgICB9IC8vIFByb2JhYmx5IGluIHRoZSBcImluIGJvZHlcIiBwYXJzaW5nIG1vZGUsIHNvIHdlIG91dGxhdyBvbmx5IHRhZyBjb21ib3NcbiAgICAvLyB3aGVyZSB0aGUgcGFyc2luZyBydWxlcyBjYXVzZSBpbXBsaWNpdCBvcGVucyBvciBjbG9zZXMgdG8gYmUgYWRkZWQuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuXG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnICE9PSAnaDEnICYmIHBhcmVudFRhZyAhPT0gJ2gyJyAmJiBwYXJlbnRUYWcgIT09ICdoMycgJiYgcGFyZW50VGFnICE9PSAnaDQnICYmIHBhcmVudFRhZyAhPT0gJ2g1JyAmJiBwYXJlbnRUYWcgIT09ICdoNic7XG5cbiAgICAgIGNhc2UgJ3JwJzpcbiAgICAgIGNhc2UgJ3J0JzpcbiAgICAgICAgcmV0dXJuIGltcGxpZWRFbmRUYWdzLmluZGV4T2YocGFyZW50VGFnKSA9PT0gLTE7XG5cbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgY2FzZSAnY2FwdGlvbic6XG4gICAgICBjYXNlICdjb2wnOlxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgY2FzZSAnZnJhbWUnOlxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgIGNhc2UgJ3RoJzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgLy8gVGhlc2UgdGFncyBhcmUgb25seSB2YWxpZCB3aXRoIGEgZmV3IHBhcmVudHMgdGhhdCBoYXZlIHNwZWNpYWwgY2hpbGRcbiAgICAgICAgLy8gcGFyc2luZyBydWxlcyAtLSBpZiB3ZSdyZSBkb3duIGhlcmUsIHRoZW4gbm9uZSBvZiB0aG9zZSBtYXRjaGVkIGFuZFxuICAgICAgICAvLyBzbyB3ZSBhbGxvdyBpdCBvbmx5IGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgcGFyZW50IGlzLCBhcyBhbGwgb3RoZXJcbiAgICAgICAgLy8gY2FzZXMgYXJlIGludmFsaWQuXG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgPT0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cblxuXG4gIHZhciBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnID0gZnVuY3Rpb24gKHRhZywgYW5jZXN0b3JJbmZvKSB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2FkZHJlc3MnOlxuICAgICAgY2FzZSAnYXJ0aWNsZSc6XG4gICAgICBjYXNlICdhc2lkZSc6XG4gICAgICBjYXNlICdibG9ja3F1b3RlJzpcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBjYXNlICdkaXInOlxuICAgICAgY2FzZSAnZGl2JzpcbiAgICAgIGNhc2UgJ2RsJzpcbiAgICAgIGNhc2UgJ2ZpZWxkc2V0JzpcbiAgICAgIGNhc2UgJ2ZpZ2NhcHRpb24nOlxuICAgICAgY2FzZSAnZmlndXJlJzpcbiAgICAgIGNhc2UgJ2Zvb3Rlcic6XG4gICAgICBjYXNlICdoZWFkZXInOlxuICAgICAgY2FzZSAnaGdyb3VwJzpcbiAgICAgIGNhc2UgJ21haW4nOlxuICAgICAgY2FzZSAnbWVudSc6XG4gICAgICBjYXNlICduYXYnOlxuICAgICAgY2FzZSAnb2wnOlxuICAgICAgY2FzZSAncCc6XG4gICAgICBjYXNlICdzZWN0aW9uJzpcbiAgICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgY2FzZSAndWwnOlxuICAgICAgY2FzZSAncHJlJzpcbiAgICAgIGNhc2UgJ2xpc3RpbmcnOlxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgY2FzZSAnaHInOlxuICAgICAgY2FzZSAneG1wJzpcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZm9ybVRhZyB8fCBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2xpJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdkZCc6XG4gICAgICBjYXNlICdkdCc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIC8vIFNwZWMgc2F5cyBzb21ldGhpbmcgYWJvdXQgc3RvcmluZyBhIGxpc3Qgb2YgbWFya2VycywgYnV0IGl0IHNvdW5kc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoaXMgY2hlY2suXG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ25vYnInOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHZhciBkaWRXYXJuJDEgPSB7fTtcblxuICB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoY2hpbGRUYWcsIGNoaWxkVGV4dCwgYW5jZXN0b3JJbmZvKSB7XG4gICAgYW5jZXN0b3JJbmZvID0gYW5jZXN0b3JJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvO1xuICAgIHZhciBwYXJlbnRJbmZvID0gYW5jZXN0b3JJbmZvLmN1cnJlbnQ7XG4gICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudEluZm8gJiYgcGFyZW50SW5mby50YWc7XG5cbiAgICBpZiAoY2hpbGRUZXh0ICE9IG51bGwpIHtcbiAgICAgIGlmIChjaGlsZFRhZyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3Rpbmc6IHdoZW4gY2hpbGRUZXh0IGlzIHBhc3NlZCwgY2hpbGRUYWcgc2hvdWxkIGJlIG51bGwnKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGRUYWcgPSAnI3RleHQnO1xuICAgIH1cblxuICAgIHZhciBpbnZhbGlkUGFyZW50ID0gaXNUYWdWYWxpZFdpdGhQYXJlbnQoY2hpbGRUYWcsIHBhcmVudFRhZykgPyBudWxsIDogcGFyZW50SW5mbztcbiAgICB2YXIgaW52YWxpZEFuY2VzdG9yID0gaW52YWxpZFBhcmVudCA/IG51bGwgOiBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnKGNoaWxkVGFnLCBhbmNlc3RvckluZm8pO1xuICAgIHZhciBpbnZhbGlkUGFyZW50T3JBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgfHwgaW52YWxpZEFuY2VzdG9yO1xuXG4gICAgaWYgKCFpbnZhbGlkUGFyZW50T3JBbmNlc3Rvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBhbmNlc3RvclRhZyA9IGludmFsaWRQYXJlbnRPckFuY2VzdG9yLnRhZztcbiAgICB2YXIgd2FybktleSA9ICEhaW52YWxpZFBhcmVudCArICd8JyArIGNoaWxkVGFnICsgJ3wnICsgYW5jZXN0b3JUYWc7XG5cbiAgICBpZiAoZGlkV2FybiQxW3dhcm5LZXldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybiQxW3dhcm5LZXldID0gdHJ1ZTtcbiAgICB2YXIgdGFnRGlzcGxheU5hbWUgPSBjaGlsZFRhZztcbiAgICB2YXIgd2hpdGVzcGFjZUluZm8gPSAnJztcblxuICAgIGlmIChjaGlsZFRhZyA9PT0gJyN0ZXh0Jykge1xuICAgICAgaWYgKC9cXFMvLnRlc3QoY2hpbGRUZXh0KSkge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdUZXh0IG5vZGVzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1doaXRlc3BhY2UgdGV4dCBub2Rlcyc7XG4gICAgICAgIHdoaXRlc3BhY2VJbmZvID0gXCIgTWFrZSBzdXJlIHlvdSBkb24ndCBoYXZlIGFueSBleHRyYSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFncyBvbiBcIiArICdlYWNoIGxpbmUgb2YgeW91ciBzb3VyY2UgY29kZS4nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YWdEaXNwbGF5TmFtZSA9ICc8JyArIGNoaWxkVGFnICsgJz4nO1xuICAgIH1cblxuICAgIGlmIChpbnZhbGlkUGFyZW50KSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICBpZiAoYW5jZXN0b3JUYWcgPT09ICd0YWJsZScgJiYgY2hpbGRUYWcgPT09ICd0cicpIHtcbiAgICAgICAgaW5mbyArPSAnIEFkZCBhIDx0Ym9keT4sIDx0aGVhZD4gb3IgPHRmb290PiB0byB5b3VyIGNvZGUgdG8gbWF0Y2ggdGhlIERPTSB0cmVlIGdlbmVyYXRlZCBieSAnICsgJ3RoZSBicm93c2VyLic7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGNoaWxkIG9mIDwlcz4uJXMlcycsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZywgd2hpdGVzcGFjZUluZm8sIGluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBkZXNjZW5kYW50IG9mICcgKyAnPCVzPi4nLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcpO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDEgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBTVVNQRU5TRV9TVEFSVF9EQVRBID0gJyQnO1xudmFyIFNVU1BFTlNFX0VORF9EQVRBID0gJy8kJztcbnZhciBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgPSAnJD8nO1xudmFyIFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgPSAnJCEnO1xudmFyIFNUWUxFJDEgPSAnc3R5bGUnO1xudmFyIGV2ZW50c0VuYWJsZWQgPSBudWxsO1xudmFyIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gbnVsbDtcbmZ1bmN0aW9uIGdldFJvb3RIb3N0Q29udGV4dChyb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgdmFyIHR5cGU7XG4gIHZhciBuYW1lc3BhY2U7XG4gIHZhciBub2RlVHlwZSA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5ub2RlVHlwZTtcblxuICBzd2l0Y2ggKG5vZGVUeXBlKSB7XG4gICAgY2FzZSBET0NVTUVOVF9OT0RFOlxuICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcbiAgICAgIHtcbiAgICAgICAgdHlwZSA9IG5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gJyNkb2N1bWVudCcgOiAnI2ZyYWdtZW50JztcbiAgICAgICAgdmFyIHJvb3QgPSByb290Q29udGFpbmVySW5zdGFuY2UuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBuYW1lc3BhY2UgPSByb290ID8gcm9vdC5uYW1lc3BhY2VVUkkgOiBnZXRDaGlsZE5hbWVzcGFjZShudWxsLCAnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyByb290Q29udGFpbmVySW5zdGFuY2UucGFyZW50Tm9kZSA6IHJvb3RDb250YWluZXJJbnN0YW5jZTtcbiAgICAgICAgdmFyIG93bk5hbWVzcGFjZSA9IGNvbnRhaW5lci5uYW1lc3BhY2VVUkkgfHwgbnVsbDtcbiAgICAgICAgdHlwZSA9IGNvbnRhaW5lci50YWdOYW1lO1xuICAgICAgICBuYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShvd25OYW1lc3BhY2UsIHR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxuXG4gIHtcbiAgICB2YXIgdmFsaWRhdGVkVGFnID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBhbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKG51bGwsIHZhbGlkYXRlZFRhZyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgYW5jZXN0b3JJbmZvOiBhbmNlc3RvckluZm9cbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZEhvc3RDb250ZXh0KHBhcmVudEhvc3RDb250ZXh0LCB0eXBlLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAge1xuICAgIHZhciBwYXJlbnRIb3N0Q29udGV4dERldiA9IHBhcmVudEhvc3RDb250ZXh0O1xuICAgIHZhciBuYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnRIb3N0Q29udGV4dERldi5uYW1lc3BhY2UsIHR5cGUpO1xuICAgIHZhciBhbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKHBhcmVudEhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgYW5jZXN0b3JJbmZvOiBhbmNlc3RvckluZm9cbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBwcmVwYXJlRm9yQ29tbWl0KGNvbnRhaW5lckluZm8pIHtcbiAgZXZlbnRzRW5hYmxlZCA9IGlzRW5hYmxlZCgpO1xuICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCk7XG4gIHZhciBhY3RpdmVJbnN0YW5jZSA9IG51bGw7XG5cbiAgc2V0RW5hYmxlZChmYWxzZSk7XG4gIHJldHVybiBhY3RpdmVJbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHJlc2V0QWZ0ZXJDb21taXQoY29udGFpbmVySW5mbykge1xuICByZXN0b3JlU2VsZWN0aW9uKHNlbGVjdGlvbkluZm9ybWF0aW9uKTtcbiAgc2V0RW5hYmxlZChldmVudHNFbmFibGVkKTtcbiAgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHZhciBwYXJlbnROYW1lc3BhY2U7XG5cbiAge1xuICAgIC8vIFRPRE86IHRha2UgbmFtZXNwYWNlIGludG8gYWNjb3VudCB3aGVuIHZhbGlkYXRpbmcuXG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgdmFsaWRhdGVET01OZXN0aW5nKHR5cGUsIG51bGwsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSB7XG4gICAgICB2YXIgc3RyaW5nID0gJycgKyBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBvd25BbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pO1xuICAgIH1cblxuICAgIHBhcmVudE5hbWVzcGFjZSA9IGhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZTtcbiAgfVxuXG4gIHZhciBkb21FbGVtZW50ID0gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBwYXJlbnROYW1lc3BhY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBkb21FbGVtZW50KTtcbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBwcm9wcyk7XG4gIHJldHVybiBkb21FbGVtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbihkb21FbGVtZW50LCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICBzZXRJbml0aWFsUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdidXR0b24nOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJldHVybiAhIXByb3BzLmF1dG9Gb2N1cztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVVcGRhdGUoZG9tRWxlbWVudCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcblxuICAgIGlmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gIT09IHR5cGVvZiBvbGRQcm9wcy5jaGlsZHJlbiAmJiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgbmV3UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIHByb3BzKSB7XG4gIHJldHVybiB0eXBlID09PSAndGV4dGFyZWEnIHx8IHR5cGUgPT09ICdub3NjcmlwdCcgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInIHx8IHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT09IG51bGwgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sICE9IG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0SW5zdGFuY2UodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHRleHQsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7XG4gIH1cblxuICB2YXIgdGV4dE5vZGUgPSBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0Tm9kZSk7XG4gIHJldHVybiB0ZXh0Tm9kZTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCkge1xuICB2YXIgY3VycmVudEV2ZW50ID0gd2luZG93LmV2ZW50O1xuXG4gIGlmIChjdXJyZW50RXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIHJldHVybiBnZXRFdmVudFByaW9yaXR5KGN1cnJlbnRFdmVudC50eXBlKTtcbn1cbi8vIGlmIGEgY29tcG9uZW50IGp1c3QgaW1wb3J0cyBSZWFjdERPTSAoZS5nLiBmb3IgZmluZERPTU5vZGUpLlxuLy8gU29tZSBlbnZpcm9ubWVudHMgbWlnaHQgbm90IGhhdmUgc2V0VGltZW91dCBvciBjbGVhclRpbWVvdXQuXG5cbnZhciBzY2hlZHVsZVRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgY2FuY2VsVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgbm9UaW1lb3V0ID0gLTE7XG52YXIgbG9jYWxQcm9taXNlID0gdHlwZW9mIFByb21pc2UgPT09ICdmdW5jdGlvbicgPyBQcm9taXNlIDogdW5kZWZpbmVkOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgc2NoZWR1bGVNaWNyb3Rhc2sgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IHR5cGVvZiBsb2NhbFByb21pc2UgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiBsb2NhbFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKGNhbGxiYWNrKS5jYXRjaChoYW5kbGVFcnJvckluTmV4dFRpY2spO1xufSA6IHNjaGVkdWxlVGltZW91dDsgLy8gVE9ETzogRGV0ZXJtaW5lIHRoZSBiZXN0IGZhbGxiYWNrIGhlcmUuXG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9ySW5OZXh0VGljayhlcnJvcikge1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNvbW1pdE1vdW50KGRvbUVsZW1lbnQsIHR5cGUsIG5ld1Byb3BzLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIC8vIERlc3BpdGUgdGhlIG5hbWluZyB0aGF0IG1pZ2h0IGltcGx5IG90aGVyd2lzZSwgdGhpcyBtZXRob2Qgb25seVxuICAvLyBmaXJlcyBpZiB0aGVyZSBpcyBhbiBgVXBkYXRlYCBlZmZlY3Qgc2NoZWR1bGVkIGR1cmluZyBtb3VudGluZy5cbiAgLy8gVGhpcyBoYXBwZW5zIGlmIGBmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbmAgcmV0dXJucyBgdHJ1ZWAgKHdoaWNoIGl0XG4gIC8vIGRvZXMgdG8gaW1wbGVtZW50IHRoZSBgYXV0b0ZvY3VzYCBhdHRyaWJ1dGUgb24gdGhlIGNsaWVudCkuIEJ1dFxuICAvLyB0aGVyZSBhcmUgYWxzbyBvdGhlciBjYXNlcyB3aGVuIHRoaXMgbWlnaHQgaGFwcGVuIChzdWNoIGFzIHBhdGNoaW5nXG4gIC8vIHVwIHRleHQgY29udGVudCBkdXJpbmcgaHlkcmF0aW9uIG1pc21hdGNoKS4gU28gd2UnbGwgY2hlY2sgdGhpcyBhZ2Fpbi5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpZiAobmV3UHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgIGRvbUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKG5ld1Byb3BzLnNyYykge1xuICAgICAgICAgIGRvbUVsZW1lbnQuc3JjID0gbmV3UHJvcHMuc3JjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGUoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIC8vIEFwcGx5IHRoZSBkaWZmIHRvIHRoZSBET00gbm9kZS5cbiAgdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpOyAvLyBVcGRhdGUgdGhlIHByb3BzIGhhbmRsZSBzbyB0aGF0IHdlIGtub3cgd2hpY2ggcHJvcHMgYXJlIHRoZSBvbmVzIHdpdGhcbiAgLy8gd2l0aCBjdXJyZW50IGV2ZW50IGhhbmRsZXJzLlxuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgbmV3UHJvcHMpO1xufVxuZnVuY3Rpb24gcmVzZXRUZXh0Q29udGVudChkb21FbGVtZW50KSB7XG4gIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFRleHRVcGRhdGUodGV4dEluc3RhbmNlLCBvbGRUZXh0LCBuZXdUZXh0KSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSBuZXdUZXh0O1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkVG9Db250YWluZXIoY29udGFpbmVyLCBjaGlsZCkge1xuICB2YXIgcGFyZW50Tm9kZTtcblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBwYXJlbnROb2RlID0gY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGNvbnRhaW5lcik7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lcjtcbiAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgfSAvLyBUaGlzIGNvbnRhaW5lciBtaWdodCBiZSB1c2VkIGZvciBhIHBvcnRhbC5cbiAgLy8gSWYgc29tZXRoaW5nIGluc2lkZSBhIHBvcnRhbCBpcyBjbGlja2VkLCB0aGF0IGNsaWNrIHNob3VsZCBidWJibGVcbiAgLy8gdGhyb3VnaCB0aGUgUmVhY3QgdHJlZS4gSG93ZXZlciwgb24gTW9iaWxlIFNhZmFyaSB0aGUgY2xpY2sgd291bGRcbiAgLy8gbmV2ZXIgYnViYmxlIHRocm91Z2ggdGhlICpET00qIHRyZWUgdW5sZXNzIGFuIGFuY2VzdG9yIHdpdGggb25jbGlja1xuICAvLyBldmVudCBleGlzdHMuIFNvIHdlIHdvdWxkbid0IHNlZSBpdCBhbmQgZGlzcGF0Y2ggaXQuXG4gIC8vIFRoaXMgaXMgd2h5IHdlIGVuc3VyZSB0aGF0IG5vbiBSZWFjdCByb290IGNvbnRhaW5lcnMgaGF2ZSBpbmxpbmUgb25jbGlja1xuICAvLyBkZWZpbmVkLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExOTE4XG5cblxuICB2YXIgcmVhY3RSb290Q29udGFpbmVyID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgaWYgKChyZWFjdFJvb3RDb250YWluZXIgPT09IG51bGwgfHwgcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQpICYmIHBhcmVudE5vZGUub25jbGljayA9PT0gbnVsbCkge1xuICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQocGFyZW50Tm9kZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnRJbnN0YW5jZSwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xufVxuZnVuY3Rpb24gaW5zZXJ0SW5Db250YWluZXJCZWZvcmUoY29udGFpbmVyLCBjaGlsZCwgYmVmb3JlQ2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiByZW1vdmVDaGlsZEZyb21Db250YWluZXIoY29udGFpbmVyLCBjaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgfVxufVxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KHBhcmVudEluc3RhbmNlLCBzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZTsgLy8gRGVsZXRlIGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICBkbyB7XG4gICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChub2RlKTtcblxuICAgIGlmIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5leHROb2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChuZXh0Tm9kZSk7IC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuICAgICAgICAgIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBuZXh0Tm9kZTtcbiAgfSB3aGlsZSAobm9kZSk7IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG5cbiAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoY29udGFpbmVyLCBzdXNwZW5zZUluc3RhbmNlKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShjb250YWluZXIucGFyZW50Tm9kZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gZWxzZSBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLCBzdXNwZW5zZUluc3RhbmNlKTtcbiAgfSAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cblxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgLy8gVE9ETzogRG9lcyB0aGlzIHdvcmsgZm9yIGFsbCBlbGVtZW50IHR5cGVzPyBXaGF0IGFib3V0IE1hdGhNTD8gU2hvdWxkIHdlXG4gIC8vIHBhc3MgaG9zdCBjb250ZXh0IHRvIHRoaXMgbWV0aG9kP1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGUgPSBpbnN0YW5jZS5zdHlsZTtcblxuICBpZiAodHlwZW9mIHN0eWxlLnNldFByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnbm9uZScsICdpbXBvcnRhbnQnKTtcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG59XG5mdW5jdGlvbiBoaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gJyc7XG59XG5mdW5jdGlvbiB1bmhpZGVJbnN0YW5jZShpbnN0YW5jZSwgcHJvcHMpIHtcbiAgaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgdmFyIHN0eWxlUHJvcCA9IHByb3BzW1NUWUxFJDFdO1xuICB2YXIgZGlzcGxheSA9IHN0eWxlUHJvcCAhPT0gdW5kZWZpbmVkICYmIHN0eWxlUHJvcCAhPT0gbnVsbCAmJiBzdHlsZVByb3AuaGFzT3duUHJvcGVydHkoJ2Rpc3BsYXknKSA/IHN0eWxlUHJvcC5kaXNwbGF5IDogbnVsbDtcbiAgaW5zdGFuY2Uuc3R5bGUuZGlzcGxheSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoJ2Rpc3BsYXknLCBkaXNwbGF5KTtcbn1cbmZ1bmN0aW9uIHVuaGlkZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IHRleHQ7XG59XG5mdW5jdGlvbiBjbGVhckNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnRleHRDb250ZW50ID0gJyc7XG4gIH0gZWxzZSBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgdmFyIGJvZHkgPSBjb250YWluZXIuYm9keTtcblxuICAgIGlmIChib2R5ICE9IG51bGwpIHtcbiAgICAgIGJvZHkudGV4dENvbnRlbnQgPSAnJztcbiAgICB9XG4gIH1cbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY2FuSHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcykge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IEVMRU1FTlRfTk9ERSB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IGluc3RhbmNlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGFuIGVsZW1lbnQgbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UoaW5zdGFuY2UsIHRleHQpIHtcbiAgaWYgKHRleHQgPT09ICcnIHx8IGluc3RhbmNlLm5vZGVUeXBlICE9PSBURVhUX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHRleHQgbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKGluc3RhbmNlKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYSBzdXNwZW5zZSBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEE7XG59XG5mdW5jdGlvbiByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShpbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgaW5zdGFuY2UuX3JlYWN0UmV0cnkgPSBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGUobm9kZSkge1xuICAvLyBTa2lwIG5vbi1oeWRyYXRhYmxlIG5vZGVzLlxuICBmb3IgKDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5uZXh0U2libGluZykge1xuICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIG5vZGVEYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAobm9kZURhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShpbnN0YW5jZS5uZXh0U2libGluZyk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH0gLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpOyAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZVxuICAvLyB3aGVuIHRoZSBsZWdhY3kgcm9vdCBBUEkgaXMgcmVtb3ZlZC5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nOyAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICB9IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cblxuXG4gIHJldHVybiBudWxsO1xufSAvLyBSZXR1cm5zIHRoZSBTdXNwZW5zZUluc3RhbmNlIGlmIHRoaXMgbm9kZSBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4vLyBTdXNwZW5zZUluc3RhbmNlLiBJLmUuIGlmIGl0cyBwcmV2aW91cyBzaWJsaW5nIGlzIGEgQ29tbWVudCB3aXRoXG4vLyBTVVNQRU5TRV94X1NUQVJUX0RBVEEuIE90aGVyd2lzZSwgbnVsbC5cblxuZnVuY3Rpb24gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXRJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHRhcmdldEluc3RhbmNlLnByZXZpb3VzU2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZENvbnRhaW5lcihjb250YWluZXIpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhwYXJlbnRUeXBlKSB7XG4gIHJldHVybiBwYXJlbnRUeXBlICE9PSAnaGVhZCcgJiYgcGFyZW50VHlwZSAhPT0gJ2JvZHknO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgc2hvdWxkV2FybkRldiA9IHRydWU7XG4gIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgaWYgKHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIGluc3RhbmNlLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHRleHQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50SW5zdGFuY2UsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikge1xuICB7XG4gICAgLy8gVE9ETzogVGhpcyBnZXRzIGxvZ2dlZCBieSBvblJlY292ZXJhYmxlRXJyb3IsIHRvbywgc28gd2Ugc2hvdWxkIGJlXG4gICAgLy8gYWJsZSB0byByZW1vdmUgaXQuXG4gICAgZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24uIFRoZSBzZXJ2ZXIgSFRNTCB3YXMgcmVwbGFjZWQgd2l0aCBjbGllbnQgY29udGVudCBpbiA8JXM+LicsIHBhcmVudENvbnRhaW5lci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVBvcnRhbE1vdW50KHBvcnRhbEluc3RhbmNlKSB7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbn1cblxudmFyIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xudmFyIGludGVybmFsSW5zdGFuY2VLZXkgPSAnX19yZWFjdEZpYmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxQcm9wc0tleSA9ICdfX3JlYWN0UHJvcHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5ID0gJ19fcmVhY3RDb250YWluZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXkgPSAnX19yZWFjdEV2ZW50cyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5ID0gJ19fcmVhY3RMaXN0ZW5lcnMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleSA9ICdfX3JlYWN0SGFuZGxlcyQnICsgcmFuZG9tS2V5O1xuZnVuY3Rpb24gZGV0YWNoRGVsZXRlZEluc3RhbmNlKG5vZGUpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbiBob3N0IGNvbXBvbmVudHMuIEkgZG9uJ3QgdGhpbmsgYWxsIG9mXG4gIC8vIHRoZXNlIGZpZWxkcyBhcmUgcmVsZXZhbnQuXG4gIGRlbGV0ZSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbFByb3BzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleV07XG59XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKCdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpO1xufVxuZnVuY3Rpb24gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGaWJlclByb3BzKG5vZGUsIHByb3BzKSB7XG4gIG5vZGVbaW50ZXJuYWxQcm9wc0tleV0gPSBwcm9wcztcbn1cbmZ1bmN0aW9uIGdldEV2ZW50TGlzdGVuZXJTZXQobm9kZSkge1xuICB2YXIgZWxlbWVudExpc3RlbmVyU2V0ID0gbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldO1xuXG4gIGlmIChlbGVtZW50TGlzdGVuZXJTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XSA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50TGlzdGVuZXJTZXQ7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbHVlU3RhY2sgPSBbXTtcbnZhciBmaWJlclN0YWNrO1xuXG57XG4gIGZpYmVyU3RhY2sgPSBbXTtcbn1cblxudmFyIGluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiBkZWZhdWx0VmFsdWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gcG9wKGN1cnNvciwgZmliZXIpIHtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHBvcC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKGZpYmVyICE9PSBmaWJlclN0YWNrW2luZGV4XSkge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleF07XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gbnVsbDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBudWxsO1xuICB9XG5cbiAgaW5kZXgtLTtcbn1cblxuZnVuY3Rpb24gcHVzaChjdXJzb3IsIHZhbHVlLCBmaWJlcikge1xuICBpbmRleCsrO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IGN1cnNvci5jdXJyZW50O1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IGZpYmVyO1xuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZTtcbn1cblxudmFyIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dDtcblxue1xuICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB7fTtcbn1cblxudmFyIGVtcHR5Q29udGV4dE9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlDb250ZXh0T2JqZWN0KTtcbn0gLy8gQSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgbWVyZ2VkIGNvbnRleHQgb2JqZWN0IG9uIHRoZSBzdGFjay5cblxuXG52YXIgY29udGV4dFN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGVtcHR5Q29udGV4dE9iamVjdCk7IC8vIEEgY3Vyc29yIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cbnZhciBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGZhbHNlKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgY29udGV4dCBvYmplY3QgdGhhdCB3YXMgb24gdGhlIHN0YWNrLlxuLy8gV2UgdXNlIHRoaXMgdG8gZ2V0IGFjY2VzcyB0byB0aGUgcGFyZW50IGNvbnRleHQgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5XG4vLyBwdXNoZWQgdGhlIG5leHQgY29udGV4dCBwcm92aWRlciwgYW5kIG5vdyBuZWVkIHRvIG1lcmdlIHRoZWlyIGNvbnRleHRzLlxuXG52YXIgcHJldmlvdXNDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG5mdW5jdGlvbiBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyKSB7XG4gIHtcbiAgICBpZiAoZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyICYmIGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIC8vIElmIHRoZSBmaWJlciBpcyBhIGNvbnRleHQgcHJvdmlkZXIgaXRzZWxmLCB3aGVuIHdlIHJlYWQgaXRzIGNvbnRleHRcbiAgICAgIC8vIHdlIG1heSBoYXZlIGFscmVhZHkgcHVzaGVkIGl0cyBvd24gY2hpbGQgY29udGV4dCBvbiB0aGUgc3RhY2suIEEgY29udGV4dFxuICAgICAgLy8gcHJvdmlkZXIgc2hvdWxkIG5vdCBcInNlZVwiIGl0cyBvd24gY2hpbGQgY29udGV4dC4gVGhlcmVmb3JlIHdlIHJlYWQgdGhlXG4gICAgICAvLyBwcmV2aW91cyAocGFyZW50KSBjb250ZXh0IGluc3RlYWQgZm9yIGEgY29udGV4dCBwcm92aWRlci5cbiAgICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBtYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dCA9IG1hc2tlZENvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzO1xuXG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gICAgfSAvLyBBdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyB1bm1hc2tlZCBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuICAgIC8vIEZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBjYWxscyB0byBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLlxuICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaW5maW5pdGUgbG9vcHMgaWYgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBjYWxscyBzZXRTdGF0ZS5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPT09IHVubWFza2VkQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjb250ZXh0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dFR5cGVzKSB7XG4gICAgICBjb250ZXh0W2tleV0gPSB1bm1hc2tlZENvbnRleHRba2V5XTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNvbnRleHRUeXBlcywgY29udGV4dCwgJ2NvbnRleHQnLCBuYW1lKTtcbiAgICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgICAvLyBDb250ZXh0IGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjbGFzcyBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkIHNvIGNoZWNrIGZvciBpbnN0YW5jZS5cblxuXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzQ29udGV4dENoYW5nZWQoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHtcbiAge1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG4gICAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIGlmIChjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBjb250ZXh0LCBmaWJlcik7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCB0eXBlLCBwYXJlbnRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlczsgLy8gVE9ETyAoYnZhdWdobikgUmVwbGFjZSB0aGlzIGJlaGF2aW9yIHdpdGggYW4gaW52YXJpYW50KCkgaW4gdGhlIGZ1dHVyZS5cbiAgICAvLyBJdCBoYXMgb25seSBiZWVuIGFkZGVkIGluIEZpYmVyIHRvIG1hdGNoIHRoZSAodW5pbnRlbnRpb25hbCkgYmVoYXZpb3IgaW4gU3RhY2suXG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuICAgICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCFpc0ZpYmVyTW91bnRlZChmaWJlcikgfHwgZmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBzdWJ0cmVlIHBhcmVudCB0byBiZSBhIG1vdW50ZWQgY2xhc3MgY29tcG9uZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIGRvIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuY29udGV4dDtcblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBDb21wb25lbnQgPSBub2RlLnR5cGU7XG5cbiAgICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVuZXhwZWN0ZWQgZGV0YWNoZWQgc3VidHJlZSBwYXJlbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQ29uY3VycmVudFJvb3QgPSAxO1xuXG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSBmYWxzZTtcbnZhciBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG5mdW5jdGlvbiBzY2hlZHVsZVN5bmNDYWxsYmFjayhjYWxsYmFjaykge1xuICAvLyBQdXNoIHRoaXMgY2FsbGJhY2sgaW50byBhbiBpbnRlcm5hbCBxdWV1ZS4gV2UnbGwgZmx1c2ggdGhlc2UgZWl0aGVyIGluXG4gIC8vIHRoZSBuZXh0IHRpY2ssIG9yIGVhcmxpZXIgaWYgc29tZXRoaW5nIGNhbGxzIGBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlYC5cbiAgaWYgKHN5bmNRdWV1ZSA9PT0gbnVsbCkge1xuICAgIHN5bmNRdWV1ZSA9IFtjYWxsYmFja107XG4gIH0gZWxzZSB7XG4gICAgLy8gUHVzaCBvbnRvIGV4aXN0aW5nIHF1ZXVlLiBEb24ndCBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2sgYmVjYXVzZVxuICAgIC8vIHdlIGFscmVhZHkgc2NoZWR1bGVkIG9uZSB3aGVuIHdlIGNyZWF0ZWQgdGhlIHF1ZXVlLlxuICAgIHN5bmNRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVMZWdhY3lTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpIHtcbiAgLy8gT25seSBmbHVzaGVzIHRoZSBxdWV1ZSBpZiB0aGVyZSdzIGEgbGVnYWN5IHN5bmMgY2FsbGJhY2sgc2NoZWR1bGVkLlxuICAvLyBUT0RPOiBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgdHlwZSBvZiBjYWxsYmFjazogcGVyZm9ybVN5bmNPbldvcmtPblJvb3QuIFNvXG4gIC8vIGl0IG1pZ2h0IG1ha2UgbW9yZSBzZW5zZSBmb3IgdGhlIHF1ZXVlIHRvIGJlIGEgbGlzdCBvZiByb290cyBpbnN0ZWFkIG9mIGFcbiAgLy8gbGlzdCBvZiBnZW5lcmljIGNhbGxiYWNrcy4gVGhlbiB3ZSBjYW4gaGF2ZSB0d286IG9uZSBmb3IgbGVnYWN5IHJvb3RzLCBvbmVcbiAgLy8gZm9yIGNvbmN1cnJlbnQgcm9vdHMuIEFuZCB0aGlzIG1ldGhvZCB3b3VsZCBvbmx5IGZsdXNoIHRoZSBsZWdhY3kgb25lcy5cbiAgaWYgKGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcykge1xuICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3MoKSB7XG4gIGlmICghaXNGbHVzaGluZ1N5bmNRdWV1ZSAmJiBzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSB0cnVlO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcHJldmlvdXNVcGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc1N5bmMgPSB0cnVlO1xuICAgICAgdmFyIHF1ZXVlID0gc3luY1F1ZXVlOyAvLyBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeSBhbnltb3JlPyBUaGUgb25seSB1c2VyIGNvZGUgdGhhdCBydW5zIGluIHRoaXNcbiAgICAgIC8vIHF1ZXVlIGlzIGluIHRoZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlcy5cblxuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2soaXNTeW5jKTtcbiAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgfVxuXG4gICAgICBzeW5jUXVldWUgPSBudWxsO1xuICAgICAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgIGlmIChzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgc3luY1F1ZXVlID0gc3luY1F1ZXVlLnNsaWNlKGkgKyAxKTtcbiAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5LCBmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZVByaW9yaXR5KTtcbiAgICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBOb1RyYW5zaXRpb24gPSBudWxsO1xuZnVuY3Rpb24gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkge1xuICByZXR1cm4gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cGUgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLlxuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgZG8gYW4gaW5pdGlhbCBwYXNzIHRvIGdhdGhlciBjb21wb25lbnQgbmFtZXNcbiAgICB2YXIgY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH0gLy8gRmluYWxseSwgd2UgZmx1c2ggYWxsIHRoZSB3YXJuaW5nc1xuICAgIC8vIFVOU0FGRV8gb25lcyBiZWZvcmUgdGhlIGRlcHJlY2F0ZWQgb25lcywgc2luY2UgdGhleSdsbCBiZSAnbG91ZGVyJ1xuXG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgXCIgKyAncmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczIgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMyKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsTW91bnQgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsTW91bnQgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczQgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgXCIqIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIHJlZmFjdG9yIHlvdXIgXCIgKyAnY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczQpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXM1ID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbFVwZGF0ZSBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsVXBkYXRlIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM1KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICB2YXIgc3RyaWN0Um9vdCA9IGZpbmRTdHJpY3RSb290KGZpYmVyKTtcblxuICAgIGlmIChzdHJpY3RSb290ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIFN0cmljdE1vZGUgY29tcG9uZW50IGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG5cblxuICAgIGlmIChkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZ2V0KHN0cmljdFJvb3QpO1xuXG4gICAgaWYgKGZpYmVyLnR5cGUuY29udGV4dFR5cGVzICE9IG51bGwgfHwgZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyAhPSBudWxsIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh3YXJuaW5nc0ZvclJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3YXJuaW5nc0ZvclJvb3QgPSBbXTtcbiAgICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgICAgfVxuXG4gICAgICB3YXJuaW5nc0ZvclJvb3QucHVzaChmaWJlcik7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyQXJyYXksIHN0cmljdFJvb3QpIHtcbiAgICAgIGlmIChmaWJlckFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdEZpYmVyID0gZmliZXJBcnJheVswXTtcbiAgICAgIHZhciB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIGZpYmVyQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKHVuaXF1ZU5hbWVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpcnN0RmliZXIpO1xuXG4gICAgICAgIGVycm9yKCdMZWdhY3kgY29udGV4dCBBUEkgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aGluIGEgc3RyaWN0LW1vZGUgdHJlZS4nICsgJ1xcblxcblRoZSBvbGQgQVBJIHdpbGwgYmUgc3VwcG9ydGVkIGluIGFsbCAxNi54IHJlbGVhc2VzLCBidXQgYXBwbGljYXRpb25zICcgKyAndXNpbmcgaXQgc2hvdWxkIG1pZ3JhdGUgdG8gdGhlIG5ldyB2ZXJzaW9uLicgKyAnXFxuXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJyArICdcXG5cXG5MZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBzb3J0ZWROYW1lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIGJhc2VQcm9wcykge1xuICBpZiAoQ29tcG9uZW50ICYmIENvbXBvbmVudC5kZWZhdWx0UHJvcHMpIHtcbiAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMuIFRha2VuIGZyb20gUmVhY3RFbGVtZW50XG4gICAgdmFyIHByb3BzID0gYXNzaWduKHt9LCBiYXNlUHJvcHMpO1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSBDb21wb25lbnQuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICByZXR1cm4gYmFzZVByb3BzO1xufVxuXG52YXIgdmFsdWVDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCk7XG52YXIgcmVuZGVyZXJTaWdpbDtcblxue1xuICAvLyBVc2UgdGhpcyB0byBkZXRlY3QgbXVsdGlwbGUgcmVuZGVyZXJzIHVzaW5nIHRoZSBzYW1lIGNvbnRleHRcbiAgcmVuZGVyZXJTaWdpbCA9IHt9O1xufVxuXG52YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xudmFyIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG52YXIgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbnZhciBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG5mdW5jdGlvbiByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSBSZWFjdCB5aWVsZHMgZXhlY3V0aW9uLCB0byBlbnN1cmUgYHJlYWRDb250ZXh0YFxuICAvLyBjYW5ub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuXG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCkge1xuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBwdXNoUHJvdmlkZXIocHJvdmlkZXJGaWJlciwgY29udGV4dCwgbmV4dFZhbHVlKSB7XG4gIHtcbiAgICBwdXNoKHZhbHVlQ3Vyc29yLCBjb250ZXh0Ll9jdXJyZW50VmFsdWUsIHByb3ZpZGVyRmliZXIpO1xuICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IG5leHRWYWx1ZTtcblxuICAgIHtcbiAgICAgIGlmIChjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IG51bGwgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSByZW5kZXJlclNpZ2lsKSB7XG4gICAgICAgIGVycm9yKCdEZXRlY3RlZCBtdWx0aXBsZSByZW5kZXJlcnMgY29uY3VycmVudGx5IHJlbmRlcmluZyB0aGUgJyArICdzYW1lIGNvbnRleHQgcHJvdmlkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSByZW5kZXJlclNpZ2lsO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9wUHJvdmlkZXIoY29udGV4dCwgcHJvdmlkZXJGaWJlcikge1xuICB2YXIgY3VycmVudFZhbHVlID0gdmFsdWVDdXJzb3IuY3VycmVudDtcbiAgcG9wKHZhbHVlQ3Vyc29yLCBwcm92aWRlckZpYmVyKTtcblxuICB7XG4gICAge1xuICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgLy8gVXBkYXRlIHRoZSBjaGlsZCBsYW5lcyBvZiBhbGwgdGhlIGFuY2VzdG9ycywgaW5jbHVkaW5nIHRoZSBhbHRlcm5hdGVzLlxuICB2YXIgbm9kZSA9IHBhcmVudDtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIHZhciBhbHRlcm5hdGUgPSBub2RlLmFsdGVybmF0ZTtcblxuICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBub2RlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmICFpc1N1YnNldE9mTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChub2RlICE9PSBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcm9wYWdhdGlvbiByb290IHdoZW4gc2NoZWR1bGluZyBjb250ZXh0IHdvcmsuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcblxuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICBmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBuZXh0RmliZXIgPSB2b2lkIDA7IC8vIFZpc2l0IHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbGlzdCA9IGZpYmVyLmRlcGVuZGVuY2llcztcblxuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7XG5cbiAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZXh0IG1hdGNoZXMuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5LmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgICAgICAvLyBNYXRjaCEgU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoaXMgZmliZXIuXG4gICAgICAgICAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgZm9yY2UgdXBkYXRlIG9uIHRoZSB3b3JrLWluLXByb2dyZXNzLlxuICAgICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTsgLy8gVE9ETzogQmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgd29yay1pbi1wcm9ncmVzcywgdGhpcyB3aWxsIGFkZCB0aGVcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0byB0aGUgY3VycmVudCBmaWJlciwgdG9vLCB3aGljaCBtZWFucyBpdCB3aWxsIHBlcnNpc3QgZXZlbiBpZlxuICAgICAgICAgICAgLy8gdGhpcyByZW5kZXIgaXMgdGhyb3duIGF3YXkuIFNpbmNlIGl0J3MgYSByYWNlIGNvbmRpdGlvbiwgbm90IHN1cmUgaXQnc1xuICAgICAgICAgICAgLy8gd29ydGggZml4aW5nLlxuICAgICAgICAgICAgLy8gSW5saW5lZCBgZW5xdWV1ZVVwZGF0ZWAgdG8gcmVtb3ZlIGludGVybGVhdmVkIHVwZGF0ZSBjaGVja1xuXG4gICAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSA7IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gICAgICAgICAgICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgICAgICAgICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpOyAvLyBNYXJrIHRoZSB1cGRhdGVkIGxhbmVzIG9uIHRoZSBsaXN0LCB0b28uXG5cbiAgICAgICAgICBsaXN0LmxhbmVzID0gbWVyZ2VMYW5lcyhsaXN0LmxhbmVzLCByZW5kZXJMYW5lcyk7IC8vIFNpbmNlIHdlIGFscmVhZHkgZm91bmQgYSBtYXRjaCwgd2UgY2FuIHN0b3AgdHJhdmVyc2luZyB0aGVcbiAgICAgICAgICAvLyBkZXBlbmRlbmN5IGxpc3QuXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5Lm5leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENvbnRleHRQcm92aWRlcikge1xuICAgICAgLy8gRG9uJ3Qgc2NhbiBkZWVwZXIgaWYgdGhpcyBpcyBhIG1hdGNoaW5nIHByb3ZpZGVyXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy50eXBlID8gbnVsbCA6IGZpYmVyLmNoaWxkO1xuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBpcyBpbiB0aGlzIHN1YnRyZWUsIHdlIGRvbid0IGtub3dcbiAgICAgIC8vIGlmIGl0IHdpbGwgaGF2ZSBhbnkgY29udGV4dCBjb25zdW1lcnMgaW4gaXQuIFRoZSBiZXN0IHdlIGNhbiBkbyBpc1xuICAgICAgLy8gbWFyayBpdCBhcyBoYXZpbmcgdXBkYXRlcy5cbiAgICAgIHZhciBwYXJlbnRTdXNwZW5zZSA9IGZpYmVyLnJldHVybjtcblxuICAgICAgaWYgKHBhcmVudFN1c3BlbnNlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2UganVzdCBjYW1lIGZyb20gYSBwYXJlbnQgc28gd2UgbXVzdCBoYXZlIGhhZCBhIHBhcmVudC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50U3VzcGVuc2UubGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudFN1c3BlbnNlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX2FsdGVybmF0ZSA9IHBhcmVudFN1c3BlbnNlLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKF9hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgX2FsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoX2FsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFzc2luZyB0aGlzIGZpYmVyIGFzIHRoZSBwYXJlbnRcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byBzY2hlZHVsZSB0aGlzIGZpYmVyIGFzIGhhdmluZyB3b3JrXG4gICAgICAvLyBvbiBpdHMgY2hpbGRyZW4uIFdlJ2xsIHVzZSB0aGUgY2hpbGRMYW5lcyBvblxuICAgICAgLy8gdGhpcyBmaWJlciB0byBpbmRpY2F0ZSB0aGF0IGEgY29udGV4dCBoYXMgY2hhbmdlZC5cblxuXG4gICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudFN1c3BlbnNlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuc2libGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhdmVyc2UgZG93bi5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgIH1cblxuICAgIGlmIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgbmV4dEZpYmVyLnJldHVybiA9IGZpYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjaGlsZC4gVHJhdmVyc2UgdG8gbmV4dCBzaWJsaW5nLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXI7XG5cbiAgICAgIHdoaWxlIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5leHRGaWJlciA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAvLyBXZSdyZSBiYWNrIHRvIHRoZSByb290IG9mIHRoaXMgc3VidHJlZS4gRXhpdC5cbiAgICAgICAgICBuZXh0RmliZXIgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNpYmxpbmcgPSBuZXh0RmliZXIuc2libGluZztcblxuICAgICAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIHNpYmxpbmcgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICAgICAgc2libGluZy5yZXR1cm4gPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgICAgIG5leHRGaWJlciA9IHNpYmxpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gTm8gbW9yZSBzaWJsaW5ncy4gVHJhdmVyc2UgdXAuXG5cblxuICAgICAgICBuZXh0RmliZXIgPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gbmV4dEZpYmVyO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbiAgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbiAgdmFyIGRlcGVuZGVuY2llcyA9IHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcztcblxuICBpZiAoZGVwZW5kZW5jaWVzICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgdmFyIGZpcnN0Q29udGV4dCA9IGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQ7XG5cbiAgICAgIGlmIChmaXJzdENvbnRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoZGVwZW5kZW5jaWVzLmxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgICAvLyBDb250ZXh0IGxpc3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuIE1hcmsgdGhhdCB0aGlzIGZpYmVyIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgICAgIH0gLy8gUmVzZXQgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgbGlzdFxuXG5cbiAgICAgICAgZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZWFkQ29udGV4dChjb250ZXh0KSB7XG4gIHtcbiAgICAvLyBUaGlzIHdhcm5pbmcgd291bGQgZmlyZSBpZiB5b3UgcmVhZCBjb250ZXh0IGluc2lkZSBhIEhvb2sgbGlrZSB1c2VNZW1vLlxuICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuXG4gICAgaWYgKGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYpIHtcbiAgICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdmFsdWUgPSAgY29udGV4dC5fY3VycmVudFZhbHVlIDtcblxuICBpZiAobGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID09PSBjb250ZXh0KSA7IGVsc2Uge1xuICAgIHZhciBjb250ZXh0SXRlbSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgICBtZW1vaXplZFZhbHVlOiB2YWx1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgaWYgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gICAgICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IGRlcGVuZGVuY3kgZm9yIHRoaXMgY29tcG9uZW50LiBDcmVhdGUgYSBuZXcgbGlzdC5cblxuXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBjb250ZXh0SXRlbTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmRlcGVuZGVuY2llcyA9IHtcbiAgICAgICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGZpcnN0Q29udGV4dDogY29udGV4dEl0ZW1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCBhIG5ldyBjb250ZXh0IGl0ZW0uXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBsYXN0Q29udGV4dERlcGVuZGVuY3kubmV4dCA9IGNvbnRleHRJdGVtO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gQW4gYXJyYXkgb2YgYWxsIHVwZGF0ZSBxdWV1ZXMgdGhhdCByZWNlaXZlZCB1cGRhdGVzIGR1cmluZyB0aGUgY3VycmVudFxuLy8gcmVuZGVyLiBXaGVuIHRoaXMgcmVuZGVyIGV4aXRzLCBlaXRoZXIgYmVjYXVzZSBpdCBmaW5pc2hlcyBvciBiZWNhdXNlIGl0IGlzXG4vLyBpbnRlcnJ1cHRlZCwgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbCBiZSB0cmFuc2ZlcnJlZCBvbnRvIHRoZSBtYWluIHBhcnRcbi8vIG9mIHRoZSBxdWV1ZS5cbnZhciBpbnRlcmxlYXZlZFF1ZXVlcyA9IG51bGw7XG5mdW5jdGlvbiBwdXNoSW50ZXJsZWF2ZWRRdWV1ZShxdWV1ZSkge1xuICBpZiAoaW50ZXJsZWF2ZWRRdWV1ZXMgPT09IG51bGwpIHtcbiAgICBpbnRlcmxlYXZlZFF1ZXVlcyA9IFtxdWV1ZV07XG4gIH0gZWxzZSB7XG4gICAgaW50ZXJsZWF2ZWRRdWV1ZXMucHVzaChxdWV1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0ludGVybGVhdmVkVXBkYXRlcygpIHtcbiAgcmV0dXJuIGludGVybGVhdmVkUXVldWVzICE9PSBudWxsO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUludGVybGVhdmVkVXBkYXRlcygpIHtcbiAgLy8gVHJhbnNmZXIgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgb250byB0aGUgbWFpbiBxdWV1ZS4gRWFjaCBxdWV1ZSBoYXMgYVxuICAvLyBgcGVuZGluZ2AgZmllbGQgYW5kIGFuIGBpbnRlcmxlYXZlZGAgZmllbGQuIFdoZW4gdGhleSBhcmUgbm90IG51bGwsIHRoZXlcbiAgLy8gcG9pbnQgdG8gdGhlIGxhc3Qgbm9kZSBpbiBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LiBXZSBuZWVkIHRvIGFwcGVuZCB0aGVcbiAgLy8gaW50ZXJsZWF2ZWQgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBwZW5kaW5nIGxpc3QgYnkgam9pbmluZyB0aGVtIGludG8gYVxuICAvLyBzaW5nbGUsIGNpcmN1bGFyIGxpc3QuXG4gIGlmIChpbnRlcmxlYXZlZFF1ZXVlcyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW50ZXJsZWF2ZWRRdWV1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZSA9IGludGVybGVhdmVkUXVldWVzW2ldO1xuICAgICAgdmFyIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gICAgICBpZiAobGFzdEludGVybGVhdmVkVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLmludGVybGVhdmVkID0gbnVsbDtcbiAgICAgICAgdmFyIGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dDtcbiAgICAgICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcXVldWUucGVuZGluZztcblxuICAgICAgICBpZiAobGFzdFBlbmRpbmdVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgICAgICBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW50ZXJsZWF2ZWRRdWV1ZXMgPSBudWxsO1xuICB9XG59XG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7IC8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG5cbnZhciBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGU7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlO1xuXG57XG4gIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSBmYWxzZTtcbiAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBiYXNlU3RhdGU6IGZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIHNoYXJlZDoge1xuICAgICAgcGVuZGluZzogbnVsbCxcbiAgICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgICAgbGFuZXM6IE5vTGFuZXNcbiAgICB9LFxuICAgIGVmZmVjdHM6IG51bGxcbiAgfTtcbiAgZmliZXIudXBkYXRlUXVldWUgPSBxdWV1ZTtcbn1cbmZ1bmN0aW9uIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gQ2xvbmUgdGhlIHVwZGF0ZSBxdWV1ZSBmcm9tIGN1cnJlbnQuIFVubGVzcyBpdCdzIGFscmVhZHkgYSBjbG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgdmFyIGNsb25lID0ge1xuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgZmlyc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlLFxuICAgICAgbGFzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSxcbiAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgIGVmZmVjdHM6IGN1cnJlbnRRdWV1ZS5lZmZlY3RzXG4gICAgfTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGNsb25lO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgZXZlbnRUaW1lOiBldmVudFRpbWUsXG4gICAgbGFuZTogbGFuZSxcbiAgICB0YWc6IFVwZGF0ZVN0YXRlLFxuICAgIHBheWxvYWQ6IG51bGwsXG4gICAgY2FsbGJhY2s6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIE9ubHkgb2NjdXJzIGlmIHRoZSBmaWJlciBoYXMgYmVlbiB1bm1vdW50ZWQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIGlmIChpc0ludGVybGVhdmVkVXBkYXRlKGZpYmVyKSkge1xuICAgIHZhciBpbnRlcmxlYXZlZCA9IHNoYXJlZFF1ZXVlLmludGVybGVhdmVkO1xuXG4gICAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgICBwdXNoSW50ZXJsZWF2ZWRRdWV1ZShzaGFyZWRRdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gICAgfVxuXG4gICAgc2hhcmVkUXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICB9XG5cbiAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuICB9XG5cbiAge1xuICAgIGlmIChjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPT09IHNoYXJlZFF1ZXVlICYmICFkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlKSB7XG4gICAgICBlcnJvcignQW4gdXBkYXRlIChzZXRTdGF0ZSwgcmVwbGFjZVN0YXRlLCBvciBmb3JjZVVwZGF0ZSkgd2FzIHNjaGVkdWxlZCAnICsgJ2Zyb20gaW5zaWRlIGFuIHVwZGF0ZSBmdW5jdGlvbi4gVXBkYXRlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHVyZSwgJyArICd3aXRoIHplcm8gc2lkZS1lZmZlY3RzLiBDb25zaWRlciB1c2luZyBjb21wb25lbnREaWRVcGRhdGUgb3IgYSAnICsgJ2NhbGxiYWNrLicpO1xuXG4gICAgICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHNoYXJlZFF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5IG11c3RcbiAgICAvLyBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaCByZXByZXNlbnRzXG4gICAgLy8gYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW50YW5nbGVcbiAgICAvLyBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmIHdlICpkb24ndCpcbiAgICAvLyBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgc2hhcmVkUXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY2FwdHVyZWRVcGRhdGUpIHtcbiAgLy8gQ2FwdHVyZWQgdXBkYXRlcyBhcmUgdXBkYXRlcyB0aGF0IGFyZSB0aHJvd24gYnkgYSBjaGlsZCBkdXJpbmcgdGhlIHJlbmRlclxuICAvLyBwaGFzZS4gVGhleSBzaG91bGQgYmUgZGlzY2FyZGVkIGlmIHRoZSByZW5kZXIgaXMgYWJvcnRlZC4gVGhlcmVmb3JlLFxuICAvLyB3ZSBzaG91bGQgb25seSBwdXQgdGhlbSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSwgbm90IHRoZSBjdXJyZW50IG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7IC8vIENoZWNrIGlmIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIGEgY2xvbmUuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICAgIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlblxuICAgICAgLy8gd2UgYmFpbCBvdXQgb24gYSBwYXJlbnQgZmliZXIgdGhhdCB0aGVuIGNhcHR1cmVzIGFuIGVycm9yIHRocm93biBieVxuICAgICAgLy8gYSBjaGlsZC4gU2luY2Ugd2Ugd2FudCB0byBhcHBlbmQgdGhlIHVwZGF0ZSBvbmx5IHRvIHRoZSB3b3JrLWluXG4gICAgICAvLyAtcHJvZ3Jlc3MgcXVldWUsIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHVwZGF0ZXMuIFdlIHVzdWFsbHkgY2xvbmUgZHVyaW5nXG4gICAgICAvLyBwcm9jZXNzVXBkYXRlUXVldWUsIGJ1dCB0aGF0IGRpZG4ndCBoYXBwZW4gaW4gdGhpcyBjYXNlIGJlY2F1c2Ugd2VcbiAgICAgIC8vIHNraXBwZWQgb3ZlciB0aGUgcGFyZW50IHdoZW4gd2UgYmFpbGVkIG91dC5cbiAgICAgIHZhciBuZXdGaXJzdCA9IG51bGw7XG4gICAgICB2YXIgbmV3TGFzdCA9IG51bGw7XG4gICAgICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdXBkYXRlcyBhbmQgY2xvbmUgdGhlbS5cbiAgICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGUuZXZlbnRUaW1lLFxuICAgICAgICAgICAgbGFuZTogdXBkYXRlLmxhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgICAgICBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7IC8vIEFwcGVuZCB0aGUgY2FwdHVyZWQgdXBkYXRlIHRoZSBlbmQgb2YgdGhlIGNsb25lZCBsaXN0LlxuXG5cbiAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgICBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBubyBiYXNlIHVwZGF0ZXMuXG4gICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSA9IHtcbiAgICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IG5ld0ZpcnN0LFxuICAgICAgICBsYXN0QmFzZVVwZGF0ZTogbmV3TGFzdCxcbiAgICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cblxuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gIH1cblxuICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIHByZXZTdGF0ZSwgbmV4dFByb3BzLCBpbnN0YW5jZSkge1xuICBzd2l0Y2ggKHVwZGF0ZS50YWcpIHtcbiAgICBjYXNlIFJlcGxhY2VTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICAgICAgfSAvLyBTdGF0ZSBvYmplY3RcblxuXG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYXB0dXJlVXBkYXRlOlxuICAgICAge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgfVxuICAgIC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFVwZGF0ZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgX3BheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcbiAgICAgICAgdmFyIHBhcnRpYWxTdGF0ZTtcblxuICAgICAgICBpZiAodHlwZW9mIF9wYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yY2VVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIGhhc0ZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmV2U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgcHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7XG4gIH1cblxuICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTsgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcy4gSWYgc28sIHRyYW5zZmVyIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7IC8vIFRoZSBwZW5kaW5nIHF1ZXVlIGlzIGNpcmN1bGFyLiBEaXNjb25uZWN0IHRoZSBwb2ludGVyIGJldHdlZW4gZmlyc3RcbiAgICAvLyBhbmQgbGFzdCBzbyB0aGF0IGl0J3Mgbm9uLWNpcmN1bGFyLlxuXG4gICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsOyAvLyBBcHBlbmQgcGVuZGluZyB1cGRhdGVzIHRvIGJhc2UgcXVldWVcblxuICAgIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH1cblxuICAgIGxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7IC8vIElmIHRoZXJlJ3MgYSBjdXJyZW50IHF1ZXVlLCBhbmQgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgYmFzZSBxdWV1ZSwgdGhlblxuICAgIC8vIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlIHVwZGF0ZXMgdG8gdGhhdCBxdWV1ZSwgdG9vLiBCZWNhdXNlIHRoZSBiYXNlXG4gICAgLy8gcXVldWUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgd2l0aCBubyBjeWNsZXMsIHdlIGNhbiBhcHBlbmQgdG8gYm90aFxuICAgIC8vIGxpc3RzIGFuZCB0YWtlIGFkdmFudGFnZSBvZiBzdHJ1Y3R1cmFsIHNoYXJpbmcuXG4gICAgLy8gVE9ETzogUGFzcyBgY3VycmVudGAgYXMgYXJndW1lbnRcblxuICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgdmFyIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSAhPT0gbGFzdEJhc2VVcGRhdGUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudExhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgYXMgd2UgcHJvY2VzcyB0aGUgcXVldWUuXG5cblxuICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHVwZGF0ZXMgdG8gY29tcHV0ZSB0aGUgcmVzdWx0LlxuICAgIHZhciBuZXdTdGF0ZSA9IHF1ZXVlLmJhc2VTdGF0ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmUgcmVuZGVyTGFuZXNcbiAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuICAgIHZhciBuZXdMYW5lcyA9IE5vTGFuZXM7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0xhc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcbiAgICAgIHZhciB1cGRhdGVFdmVudFRpbWUgPSB1cGRhdGUuZXZlbnRUaW1lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG5cblxuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIG5ld1N0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBuZXdTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdXBkYXRlLmNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiAvLyBJZiB0aGUgdXBkYXRlIHdhcyBhbHJlYWR5IGNvbW1pdHRlZCwgd2Ugc2hvdWxkIG5vdCBxdWV1ZSBpdHNcbiAgICAgICAgLy8gY2FsbGJhY2sgYWdhaW4uXG4gICAgICAgIHVwZGF0ZS5sYW5lICE9PSBOb0xhbmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAgIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gICAgLy8gYXJlIHJlbWFpbmluZy5cblxuICAgIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5zaGFyZWQuaW50ZXJsZWF2ZWQ7XG5cbiAgICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCBpbnRlcmxlYXZlZC5sYW5lKTtcbiAgICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gICAgfSBlbHNlIGlmIChmaXJzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAgcXVldWUuc2hhcmVkLmxhbmVzID0gTm9MYW5lcztcbiAgICB9IC8vIFNldCB0aGUgcmVtYWluaW5nIGV4cGlyYXRpb24gdGltZSB0byBiZSB3aGF0ZXZlciBpcyByZW1haW5pbmcgaW4gdGhlIHF1ZXVlLlxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIGZpbmUgYmVjYXVzZSB0aGUgb25seSB0d28gb3RoZXIgdGhpbmdzIHRoYXQgY29udHJpYnV0ZSB0b1xuICAgIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGVcbiAgICAvLyBiZWdpbiBwaGFzZSBieSB0aGUgdGltZSB3ZSBzdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZSwgc28gd2UndmUgYWxyZWFkeVxuICAgIC8vIGRlYWx0IHdpdGggdGhlIHByb3BzLiBDb250ZXh0IGluIGNvbXBvbmVudHMgdGhhdCBzcGVjaWZ5XG4gICAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3JcbiAgICAvLyB0aGF0IHJlZ2FyZGxlc3MuXG5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkICcgKyAoXCJyZWNlaXZlZDogXCIgKyBjYWxsYmFjaykpO1xuICB9XG5cbiAgY2FsbGJhY2suY2FsbChjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKSB7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkge1xuICByZXR1cm4gaGFzRm9yY2VVcGRhdGU7XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIGZpbmlzaGVkUXVldWUsIGluc3RhbmNlKSB7XG4gIC8vIENvbW1pdCB0aGUgZWZmZWN0c1xuICB2YXIgZWZmZWN0cyA9IGZpbmlzaGVkUXVldWUuZWZmZWN0cztcbiAgZmluaXNoZWRRdWV1ZS5lZmZlY3RzID0gbnVsbDtcblxuICBpZiAoZWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVmZmVjdCA9IGVmZmVjdHNbaV07XG4gICAgICB2YXIgY2FsbGJhY2sgPSBlZmZlY3QuY2FsbGJhY2s7XG5cbiAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGZha2VJbnRlcm5hbEluc3RhbmNlID0ge307IC8vIFJlYWN0LkNvbXBvbmVudCB1c2VzIGEgc2hhcmVkIGZyb3plbiBvYmplY3QgYnkgZGVmYXVsdC5cbi8vIFdlJ2xsIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgbGVnYWN5IHJlZnMuXG5cbnZhciBlbXB0eVJlZnNPYmplY3QgPSBuZXcgUmVhY3QuQ29tcG9uZW50KCkucmVmcztcbnZhciBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uSW52YWxpZENhbGxiYWNrO1xudmFyIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzO1xudmFyIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZTtcblxue1xuICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcyA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlID0gbmV3IFNldCgpO1xuICB2YXIgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrID0gbmV3IFNldCgpO1xuXG4gIHdhcm5PbkludmFsaWRDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIGlmIChjYWxsYmFjayA9PT0gbnVsbCB8fCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gY2FsbGVyTmFtZSArICdfJyArIGNhbGxiYWNrO1xuXG4gICAgaWYgKCFkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suaGFzKGtleSkpIHtcbiAgICAgIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KTtcblxuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCk6IEEgdmFsaWQgc3RhdGUgb2JqZWN0IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiAnICsgJ1lvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFRoaXMgaXMgc28gZ3Jvc3MgYnV0IGl0J3MgYXQgbGVhc3Qgbm9uLWNyaXRpY2FsIGFuZCBjYW4gYmUgcmVtb3ZlZCBpZlxuICAvLyBpdCBjYXVzZXMgcHJvYmxlbXMuIFRoaXMgaXMgbWVhbnQgdG8gZ2l2ZSBhIG5pY2VyIGVycm9yIG1lc3NhZ2UgZm9yXG4gIC8vIFJlYWN0RE9NMTUudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocmVhY3RET00xNkNvbXBvbmVudCxcbiAgLy8gLi4uKSkgd2hpY2ggb3RoZXJ3aXNlIHRocm93cyBhIFwiX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGEgZnVuY3Rpb25cIlxuICAvLyBleGNlcHRpb24uXG5cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmFrZUludGVybmFsSW5zdGFuY2UsICdfcHJvY2Vzc0NoaWxkQ29udGV4dCcsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgJyArICdtZWFucyB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgYW5kIGFyZSBhdHRlbXB0aW5nIHRvIG5lc3QgJyArICdhIFJlYWN0IDE1IHRyZWUgaW5zaWRlIGEgUmVhY3QgMTYgdHJlZSB1c2luZyAnICsgXCJ1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciwgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkLiBUcnkgXCIgKyAndG8gbWFrZSBzdXJlIHlvdSBoYXZlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QgKGFuZCBpZGVhbGx5LCBzd2l0Y2ggJyArICd0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXh0UHJvcHMpIHtcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUoY3RvciwgcGFydGlhbFN0YXRlKTtcbiAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgdmFyIG1lbW9pemVkU3RhdGUgPSBwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQgPyBwcmV2U3RhdGUgOiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cblxudmFyIGNsYXNzQ29tcG9uZW50VXBkYXRlciA9IHtcbiAgaXNNb3VudGVkOiBpc01vdW50ZWQsXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSk7XG4gICAgdmFyIHJvb3QgPSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH0sXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gUmVwbGFjZVN0YXRlO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHZhciByb290ID0gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9LFxuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHZhciByb290ID0gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcignJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlO1xuICB9XG5cbiAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWwob2xkUHJvcHMsIG5ld1Byb3BzKSB8fCAhc2hhbGxvd0VxdWFsKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdBIHB1cmUgY29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRSZWNlaXZlUHJvcHMoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdJZiB5b3UgbWVhbnQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBpbiByZXNwb25zZSB0byBjaGFuZ2luZyBwcm9wcywgJyArICd1c2UgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpLiBJZiB5b3UgbWVhbnQgdG8gZmV0Y2ggZGF0YSBvciAnICsgJ3J1biBzaWRlLWVmZmVjdHMgb3IgbXV0YXRpb25zIGFmdGVyIFJlYWN0IGhhcyB1cGRhdGVkIHRoZSBVSSwgdXNlIGNvbXBvbmVudERpZFVwZGF0ZSgpLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzTXV0YXRlZFByb3BzID0gaW5zdGFuY2UucHJvcHMgIT09IG5ld1Byb3BzO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSB1bmRlZmluZWQgJiYgaGFzTXV0YXRlZFByb3BzKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogV2hlbiBjYWxsaW5nIHN1cGVyKCkgaW4gYCVzYCwgbWFrZSBzdXJlIHRvIHBhc3MgJyArIFwidXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHdhcyBwYXNzZWQuXCIsIG5hbWUsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGVycm9yKCdTZXR0aW5nIGRlZmF1bHRQcm9wcyBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuJyArICcgSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy4nLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgIWRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5oYXMoY3RvcikpIHtcbiAgICAgIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5hZGQoY3Rvcik7XG5cbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBzaG91bGQgYmUgdXNlZCB3aXRoIGNvbXBvbmVudERpZFVwZGF0ZSgpLiAnICsgJ1RoaXMgY29tcG9uZW50IGRlZmluZXMgZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBvbmx5LicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhbiBpbnN0YW5jZSBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIF9zdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gICAgaWYgKF9zdGF0ZSAmJiAodHlwZW9mIF9zdGF0ZSAhPT0gJ29iamVjdCcgfHwgaXNBcnJheShfc3RhdGUpKSkge1xuICAgICAgZXJyb3IoJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbCcsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjdG9yLmNoaWxkQ29udGV4dFR5cGVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgZXJyb3IoJyVzLmdldENoaWxkQ29udGV4dCgpOiBjaGlsZENvbnRleHRUeXBlcyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gJyArICd1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgbmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UudXBkYXRlciA9IGNsYXNzQ29tcG9uZW50VXBkYXRlcjtcbiAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIFRoZSBpbnN0YW5jZSBuZWVkcyBhY2Nlc3MgdG8gdGhlIGZpYmVyIHNvIHRoYXQgaXQgY2FuIHNjaGVkdWxlIHVwZGF0ZXNcblxuICBzZXQoaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzKTtcblxuICB7XG4gICAgaW5zdGFuY2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IGZha2VJbnRlcm5hbEluc3RhbmNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHByb3BzKSB7XG4gIHZhciBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGZhbHNlO1xuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcblxuICB7XG4gICAgaWYgKCdjb250ZXh0VHlwZScgaW4gY3Rvcikge1xuICAgICAgdmFyIGlzVmFsaWQgPSAvLyBBbGxvdyBudWxsIGZvciBjb25kaXRpb25hbCBkZWNsYXJhdGlvblxuICAgICAgY29udGV4dFR5cGUgPT09IG51bGwgfHwgY29udGV4dFR5cGUgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFICYmIGNvbnRleHRUeXBlLl9jb250ZXh0ID09PSB1bmRlZmluZWQ7IC8vIE5vdCBhIDxDb250ZXh0LkNvbnN1bWVyPlxuXG4gICAgICBpZiAoIWlzVmFsaWQgJiYgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmFkZChjdG9yKTtcbiAgICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG5cbiAgICAgICAgaWYgKGNvbnRleHRUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIHVuZGVmaW5lZC4gJyArICdUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiAnICsgJ1RoaXMgY2FuIGFsc28gaGFwcGVuIGR1ZSB0byBhIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvICcgKyAndHJ5IG1vdmluZyB0aGUgY3JlYXRlQ29udGV4dCgpIGNhbGwgdG8gYSBzZXBhcmF0ZSBmaWxlLic7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSAnICsgdHlwZW9mIGNvbnRleHRUeXBlICsgJy4nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuUHJvdmlkZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLl9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyA8Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Db25zdW1lciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY29udGV4dFR5cGUpLmpvaW4oJywgJykgKyAnfS4nO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJyVzIGRlZmluZXMgYW4gaW52YWxpZCBjb250ZXh0VHlwZS4gJyArICdjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lcycsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBJbnN0YW50aWF0ZSB0d2ljZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGUgIT09IG51bGwgJiYgaW5zdGFuY2Uuc3RhdGUgIT09IHVuZGVmaW5lZCA/IGluc3RhbmNlLnN0YXRlIDogbnVsbDtcbiAgYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgc3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICB2YXIgbmV3QXBpTmFtZSA9IHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKScgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmhhcyhfY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmFkZChfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgICBlcnJvcignVW5zYWZlIGxlZ2FjeSBsaWZlY3ljbGVzIHdpbGwgbm90IGJlIGNhbGxlZCBmb3IgY29tcG9uZW50cyB1c2luZyBuZXcgY29tcG9uZW50IEFQSXMuXFxuXFxuJyArICclcyB1c2VzICVzIGJ1dCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVnYWN5IGxpZmVjeWNsZXM6JXMlcyVzXFxuXFxuJyArICdUaGUgYWJvdmUgbGlmZWN5Y2xlcyBzaG91bGQgYmUgcmVtb3ZlZC4gTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTpcXG4nICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMnLCBfY29tcG9uZW50TmFtZSwgbmV3QXBpTmFtZSwgZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsTW91bnROYW1lIDogJycsIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lIDogJycsIGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxVcGRhdGVOYW1lIDogJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgLy8gUmVhY3RGaWJlckNvbnRleHQgdXN1YWxseSB1cGRhdGVzIHRoaXMgY2FjaGUgYnV0IGNhbid0IGZvciBuZXdseS1jcmVhdGVkIGluc3RhbmNlcy5cblxuXG4gIGlmIChpc0xlZ2FjeUNvbnRleHRDb25zdW1lcikge1xuICAgIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgdmFyIG9sZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmIChvbGRTdGF0ZSAhPT0gaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbE1vdW50KCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byB0aGlzLnN0YXRlIGlzICcgKyBcImRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byAnICsgXCJ0aGlzLnN0YXRlIGlzIGRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn0gLy8gSW52b2tlcyB0aGUgbW91bnQgbGlmZS1jeWNsZXMgb24gYSBwcmV2aW91c2x5IG5ldmVyIHJlbmRlcmVkIGluc3RhbmNlLlxuXG5cbmZ1bmN0aW9uIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICBpbnN0YW5jZS5yZWZzID0gZW1wdHlSZWZzT2JqZWN0O1xuICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPT09IG5ld1Byb3BzKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgIH1cblxuICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3M7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzMiA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFnczI7XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufSAvLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdW5yZXNvbHZlZE9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPyB1bnJlc29sdmVkT2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciB1bnJlc29sdmVkTmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gdW5yZXNvbHZlZE5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgPT09IHVucmVzb2x2ZWROZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSAmJiAhKGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICApKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkgfHwgLy8gVE9ETzogSW4gc29tZSBjYXNlcywgd2UnbGwgZW5kIHVwIGNoZWNraW5nIGlmIGNvbnRleHQgaGFzIGNoYW5nZWQgdHdpY2UsXG4gIC8vIGJvdGggYmVmb3JlIGFuZCBhZnRlciBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCBoYXMgYmVlbiBjYWxsZWQuIE5vdCBpZGVhbCxcbiAgLy8gYnV0IEknbSBsb2F0aCB0byByZWZhY3RvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgbWVtb2l6ZWRcbiAgLy8gY29tcG9uZW50cyBzbyBpdCdzIG5vdCB0aGF0IGNvbW1vbi5cbiAgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgIDtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBwcm9wcy9zdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbi8vIFRPRE86IFVzZSB0aGUgdW5pZmllZCBmaWJlciBzdGFjayBtb2R1bGUgaW5zdGVhZCBvZiB0aGlzIGxvY2FsIG9uZT9cbi8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGl0IHlldCB0byBkZXJpc2sgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIGJlY2F1c2Vcbi8vIHRoZSB3YXkgd2UgcHVzaC9wb3AgdGhlc2UgdmFsdWVzIGlzIGEgYml0IHVudXN1YWwuIElmIHRoZXJlJ3MgYSBtaXN0YWtlLCBJJ2Rcbi8vIHJhdGhlciB0aGUgaWRzIGJlIHdyb25nIHRoYW4gY3Jhc2ggdGhlIHdob2xlIHJlY29uY2lsZXIuXG52YXIgZm9ya1N0YWNrID0gW107XG52YXIgZm9ya1N0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVGb3JrUHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVGb3JrQ291bnQgPSAwO1xudmFyIGlkU3RhY2sgPSBbXTtcbnZhciBpZFN0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVDb250ZXh0SWQgPSAxO1xudmFyIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSAnJztcbmZ1bmN0aW9uIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JrZWQpICE9PSBOb0ZsYWdzO1xufVxuZnVuY3Rpb24gZ2V0Rm9ya3NBdExldmVsKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICByZXR1cm4gdHJlZUZvcmtDb3VudDtcbn1cbmZ1bmN0aW9uIGdldFRyZWVJZCgpIHtcbiAgdmFyIG92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgdmFyIGlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgaWQgPSBpZFdpdGhMZWFkaW5nQml0ICYgfmdldExlYWRpbmdCaXQoaWRXaXRoTGVhZGluZ0JpdCk7XG4gIHJldHVybiBpZC50b1N0cmluZygzMikgKyBvdmVyZmxvdztcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbikge1xuICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBhZnRlciB3ZSByZWNvbmNpbGUgYW4gYXJyYXkgKG9yIGl0ZXJhdG9yKSBvZiBjaGlsZFxuICAvLyBmaWJlcnMsIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdlIGtub3cgaG93IG1hbnkgY2hpbGRyZW4gaW5cbiAgLy8gdGhlIHdob2xlIHNldCB3aXRob3V0IGRvaW5nIGV4dHJhIHdvcmsgbGF0ZXIsIG9yIHN0b3JpbmcgYWRkdGlvbmFsXG4gIC8vIGluZm9ybWF0aW9uIG9uIHRoZSBmaWJlci5cbiAgLy9cbiAgLy8gVGhhdCdzIHdoeSB0aGlzIGZ1bmN0aW9uIGlzIHNlcGFyYXRlIGZyb20gcHVzaFRyZWVJZCBcdTIwMTQgaXQncyBjYWxsZWQgZHVyaW5nXG4gIC8vIHRoZSByZW5kZXIgcGhhc2Ugb2YgdGhlIGZvcmsgcGFyZW50LCBub3QgdGhlIGNoaWxkLCB3aGljaCBpcyB3aGVyZSB3ZSBwdXNoXG4gIC8vIHRoZSBvdGhlciBjb250ZXh0IHZhbHVlcy5cbiAgLy9cbiAgLy8gSW4gdGhlIEZpenogaW1wbGVtZW50YXRpb24gdGhpcyBpcyBtdWNoIHNpbXBsZXIgYmVjYXVzZSB0aGUgY2hpbGQgaXNcbiAgLy8gcmVuZGVyZWQgaW4gdGhlIHNhbWUgY2FsbHN0YWNrIGFzIHRoZSBwYXJlbnQuXG4gIC8vXG4gIC8vIEl0IG1pZ2h0IGJlIGJldHRlciB0byBqdXN0IGFkZCBhIGBmb3Jrc2AgZmllbGQgdG8gdGhlIEZpYmVyIHR5cGUuIEl0IHdvdWxkXG4gIC8vIG1ha2UgdGhpcyBtb2R1bGUgc2ltcGxlci5cbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrQ291bnQ7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrUHJvdmlkZXI7XG4gIHRyZWVGb3JrUHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdHJlZUZvcmtDb3VudCA9IHRvdGFsQ2hpbGRyZW47XG59XG5mdW5jdGlvbiBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuLCBpbmRleCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgYmFzZUlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgYmFzZU92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdzsgLy8gVGhlIGxlZnRtb3N0IDEgbWFya3MgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIG5vbi1pbmNsdXNpdmUuIEl0J3Mgbm90IHBhcnRcbiAgLy8gb2YgdGhlIGlkOyB3ZSB1c2UgaXQgdG8gYWNjb3VudCBmb3IgbGVhZGluZyAwcy5cblxuICB2YXIgYmFzZUxlbmd0aCA9IGdldEJpdExlbmd0aChiYXNlSWRXaXRoTGVhZGluZ0JpdCkgLSAxO1xuICB2YXIgYmFzZUlkID0gYmFzZUlkV2l0aExlYWRpbmdCaXQgJiB+KDEgPDwgYmFzZUxlbmd0aCk7XG4gIHZhciBzbG90ID0gaW5kZXggKyAxO1xuICB2YXIgbGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgYmFzZUxlbmd0aDsgLy8gMzAgaXMgdGhlIG1heCBsZW5ndGggd2UgY2FuIHN0b3JlIHdpdGhvdXQgb3ZlcmZsb3dpbmcsIHRha2luZyBpbnRvXG4gIC8vIGNvbnNpZGVyYXRpb24gdGhlIGxlYWRpbmcgMSB3ZSB1c2UgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cblxuICBpZiAobGVuZ3RoID4gMzApIHtcbiAgICAvLyBXZSBvdmVyZmxvd2VkIHRoZSBiaXR3aXNlLXNhZmUgcmFuZ2UuIEZhbGwgYmFjayB0byBzbG93ZXIgYWxnb3JpdGhtLlxuICAgIC8vIFRoaXMgYnJhbmNoIGFzc3VtZXMgdGhlIGxlbmd0aCBvZiB0aGUgYmFzZSBpZCBpcyBncmVhdGVyIHRoYW4gNTsgaXQgd29uJ3RcbiAgICAvLyB3b3JrIGZvciBzbWFsbGVyIGlkcywgYmVjYXVzZSB5b3UgbmVlZCA1IGJpdHMgcGVyIGNoYXJhY3Rlci5cbiAgICAvL1xuICAgIC8vIFdlIGVuY29kZSB0aGUgaWQgaW4gbXVsdGlwbGUgc3RlcHM6IGZpcnN0IHRoZSBiYXNlIGlkLCB0aGVuIHRoZVxuICAgIC8vIHJlbWFpbmluZyBkaWdpdHMuXG4gICAgLy9cbiAgICAvLyBFYWNoIDUgYml0IHNlcXVlbmNlIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGJhc2UgMzIgY2hhcmFjdGVyLiBTbyBmb3JcbiAgICAvLyBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBpZCBpcyAyMyBiaXRzIGxvbmcsIHdlIGNhbiBjb252ZXJ0IDIwIG9mIHRob3NlXG4gICAgLy8gYml0cyBpbnRvIGEgc3RyaW5nIG9mIDQgY2hhcmFjdGVycywgd2l0aCAzIGJpdHMgbGVmdCBvdmVyLlxuICAgIC8vXG4gICAgLy8gRmlyc3QgY2FsY3VsYXRlIGhvdyBtYW55IGJpdHMgaW4gdGhlIGJhc2UgaWQgcmVwcmVzZW50IGEgY29tcGxldGVcbiAgICAvLyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLlxuICAgIHZhciBudW1iZXJPZk92ZXJmbG93Qml0cyA9IGJhc2VMZW5ndGggLSBiYXNlTGVuZ3RoICUgNTsgLy8gVGhlbiBjcmVhdGUgYSBiaXRtYXNrIHRoYXQgc2VsZWN0cyBvbmx5IHRob3NlIGJpdHMuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3dCaXRzID0gKDEgPDwgbnVtYmVyT2ZPdmVyZmxvd0JpdHMpIC0gMTsgLy8gU2VsZWN0IHRoZSBiaXRzLCBhbmQgY29udmVydCB0aGVtIHRvIGEgYmFzZSAzMiBzdHJpbmcuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3cgPSAoYmFzZUlkICYgbmV3T3ZlcmZsb3dCaXRzKS50b1N0cmluZygzMik7IC8vIE5vdyB3ZSBjYW4gcmVtb3ZlIHRob3NlIGJpdHMgZnJvbSB0aGUgYmFzZSBpZC5cblxuICAgIHZhciByZXN0T2ZCYXNlSWQgPSBiYXNlSWQgPj4gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7XG4gICAgdmFyIHJlc3RPZkJhc2VMZW5ndGggPSBiYXNlTGVuZ3RoIC0gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7IC8vIEZpbmFsbHksIGVuY29kZSB0aGUgcmVzdCBvZiB0aGUgYml0cyB1c2luZyB0aGUgbm9ybWFsIGFsZ29yaXRobS4gQmVjYXVzZVxuICAgIC8vIHdlIG1hZGUgbW9yZSByb29tLCB0aGlzIHRpbWUgaXQgd29uJ3Qgb3ZlcmZsb3cuXG5cbiAgICB2YXIgcmVzdE9mTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgcmVzdE9mTmV3Qml0cyA9IHNsb3QgPDwgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgaWQgPSByZXN0T2ZOZXdCaXRzIHwgcmVzdE9mQmFzZUlkO1xuICAgIHZhciBvdmVyZmxvdyA9IG5ld092ZXJmbG93ICsgYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IHJlc3RPZkxlbmd0aCB8IGlkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgfSBlbHNlIHtcbiAgICAvLyBOb3JtYWwgcGF0aFxuICAgIHZhciBuZXdCaXRzID0gc2xvdCA8PCBiYXNlTGVuZ3RoO1xuXG4gICAgdmFyIF9pZCA9IG5ld0JpdHMgfCBiYXNlSWQ7XG5cbiAgICB2YXIgX292ZXJmbG93ID0gYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IGxlbmd0aCB8IF9pZDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gX292ZXJmbG93O1xuICB9XG59XG5mdW5jdGlvbiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpOyAvLyBUaGlzIGNvbXBvbmVudCBtYXRlcmlhbGl6ZWQgYW4gaWQuIFRoaXMgd2lsbCBhZmZlY3QgYW55IGlkcyB0aGF0IGFwcGVhclxuICAvLyBpbiBpdHMgY2hpbGRyZW4uXG5cbiAgdmFyIHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBudW1iZXJPZkZvcmtzID0gMTtcbiAgICB2YXIgc2xvdEluZGV4ID0gMDtcbiAgICBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MpO1xuICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Qml0TGVuZ3RoKG51bWJlcikge1xuICByZXR1cm4gMzIgLSBjbHozMihudW1iZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRMZWFkaW5nQml0KGlkKSB7XG4gIHJldHVybiAxIDw8IGdldEJpdExlbmd0aChpZCkgLSAxO1xufVxuXG5mdW5jdGlvbiBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZXMuXG4gIC8vIFRoaXMgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIG90aGVyIGNvbnRleHQtbGlrZSBtb2R1bGVzIGluIEZpYmVyXG4gIC8vIGJlY2F1c2UgdGhlIHNhbWUgRmliZXIgbWF5IGFwcGVhciBvbiB0aGUgc3RhY2sgbXVsdGlwbGUgdGltZXMgYW5kIGZvclxuICAvLyBkaWZmZXJlbnQgcmVhc29ucy4gV2UgaGF2ZSB0byBrZWVwIHBvcHBpbmcgdW50aWwgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaXNcbiAgLy8gbm8gbG9uZ2VyIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVGb3JrUHJvdmlkZXIpIHtcbiAgICB0cmVlRm9ya1Byb3ZpZGVyID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdO1xuICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVGb3JrQ291bnQgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gIH1cblxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVDb250ZXh0UHJvdmlkZXIpIHtcbiAgICB0cmVlQ29udGV4dFByb3ZpZGVyID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dElkID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuXG4gIGlmICh0cmVlQ29udGV4dFByb3ZpZGVyICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0cmVlQ29udGV4dElkLFxuICAgICAgb3ZlcmZsb3c6IHRyZWVDb250ZXh0T3ZlcmZsb3dcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbmRlZENvbnRleHQpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0SWQgPSBzdXNwZW5kZWRDb250ZXh0LmlkO1xuICB0cmVlQ29udGV4dE92ZXJmbG93ID0gc3VzcGVuZGVkQ29udGV4dC5vdmVyZmxvdztcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RIeWRyYXRpbmcoKSB7XG4gIHtcbiAgICBpZiAoIWdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBiZSBoeWRyYXRpbmcuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlICcgKyAnYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTsgLy8gVGhpcyBmbGFnIGFsbG93cyBmb3Igd2FybmluZyBzdXByZXNzaW9uIHdoZW4gd2UgZXhwZWN0IHRoZXJlIHRvIGJlIG1pc21hdGNoZXNcbi8vIGR1ZSB0byBlYXJsaWVyIG1pc21hdGNoZXMgb3IgYSBzdXNwZW5kZWQgZmliZXIuXG5cbnZhciBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlOyAvLyBIeWRyYXRpb24gZXJyb3JzIHRoYXQgd2VyZSB0aHJvd24gaW5zaWRlIHRoaXMgYm91bmRhcnlcblxudmFyIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5JZkh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgZXJyb3IoJ1dlIHNob3VsZCBub3QgYmUgaHlkcmF0aW5nIGhlcmUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGEgYnVnLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIGRpZFN1c3BlbmRPckVycm9yREVWID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnRlckh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlciwgc3VzcGVuc2VJbnN0YW5jZSwgdHJlZUNvbnRleHQpIHtcblxuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG5cbiAgaWYgKHRyZWVDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KGZpYmVyLCB0cmVlQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQsIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKTtcbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpIHtcbiAge1xuICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvckRFVikge1xuICAgICAgLy8gSW5zaWRlIGEgYm91bmRhcnkgdGhhdCBhbHJlYWR5IHN1c3BlbmRlZC4gV2UncmUgY3VycmVudGx5IHJlbmRlcmluZyB0aGVcbiAgICAgIC8vIHNpYmxpbmdzIG9mIGEgc3VzcGVuZGVkIG5vZGUuIFRoZSBtaXNtYXRjaCBtYXkgYmUgZHVlIHRvIHRoZSBtaXNzaW5nXG4gICAgICAvLyBkYXRhLCBzbyBpdCdzIHByb2JhYmx5IGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3R5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSwgX3Byb3BzLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdGV4dCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSByZXR1cm5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBfcGFyZW50SW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICAgICAgaWYgKF9wYXJlbnRJbnN0YW5jZSAhPT0gbnVsbCkgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIF90eXBlMiA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90eXBlMik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdGV4dDIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcbiAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIGluc3RhbmNlID0gY2FuSHlkcmF0ZUluc3RhbmNlKG5leHRJbnN0YW5jZSwgdHlwZSk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKG5leHRJbnN0YW5jZSwgdGV4dCk7XG5cbiAgICAgICAgaWYgKHRleHRJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IHRleHRJbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBUZXh0IEluc3RhbmNlcyBkb24ndCBoYXZlIGNoaWxkcmVuIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBoeWRyYXRlLlxuXG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKG5leHRJbnN0YW5jZSk7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHN1c3BlbnNlSW5zdGFuY2UsXG4gICAgICAgICAgICB0cmVlQ29udGV4dDogZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSxcbiAgICAgICAgICAgIHJldHJ5TGFuZTogT2Zmc2NyZWVuTGFuZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IHN1c3BlbnNlU3RhdGU7IC8vIFN0b3JlIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50IGFzIGEgY2hpbGQgZmliZXIuXG4gICAgICAgICAgLy8gVGhpcyBzaW1wbGlmaWVzIHRoZSBjb2RlIGZvciBnZXRIb3N0U2libGluZyBhbmQgZGVsZXRpbmcgbm9kZXMsXG4gICAgICAgICAgLy8gc2luY2UgaXQgZG9lc24ndCBoYXZlIHRvIGNvbnNpZGVyIGFsbCBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXkncmUgZGVoeWRyYXRlZCBvbmVzIG9yIG5vdC5cblxuICAgICAgICAgIHZhciBkZWh5ZHJhdGVkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgZGVoeWRyYXRlZEZyYWdtZW50LnJldHVybiA9IGZpYmVyO1xuICAgICAgICAgIGZpYmVyLmNoaWxkID0gZGVoeWRyYXRlZEZyYWdtZW50O1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFdoaWxlIGEgU3VzcGVuc2UgSW5zdGFuY2UgZG9lcyBoYXZlIGNoaWxkcmVuLCB3ZSB3b24ndCBzdGVwIGludG9cbiAgICAgICAgICAvLyBpdCBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIEluc3RlYWQsIHdlJ2xsIHJlZW50ZXIgaXQgbGF0ZXIuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikge1xuICByZXR1cm4gKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAoZmliZXIuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncztcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGZpYmVyKSB7XG4gIHRocm93IG5ldyBFcnJvcignSHlkcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBpbml0aWFsIFVJIGRvZXMgbm90IG1hdGNoIHdoYXQgd2FzICcgKyAncmVuZGVyZWQgb24gdGhlIHNlcnZlci4nKTtcbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuXG5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgIH0gLy8gSWYgd2UgY2FuJ3QgaHlkcmF0ZSB0aGlzIGluc3RhbmNlIGxldCdzIHRyeSB0aGUgbmV4dCBvbmUuXG4gICAgLy8gV2UgdXNlIHRoaXMgYXMgYSBoZXVyaXN0aWMuIEl0J3MgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBub3QgZGF0YSBzbyBpdFxuICAgIC8vIG1pZ2h0IGJlIGZsYXdlZCBvciB1bm5lY2Vzc2FyeS5cblxuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICAgIHZhciBwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmICghbmV4dEluc3RhbmNlIHx8ICF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuICAgICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBtYXRjaGVkIHRoZSBuZXh0IG9uZSwgd2UnbGwgbm93IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBvbmUgd2FzXG4gICAgLy8gc3VwZXJmbHVvdXMgYW5kIHdlJ2xsIGRlbGV0ZSBpdC4gU2luY2Ugd2UgY2FuJ3QgZWFnZXJseSBkZWxldGUgaXRcbiAgICAvLyB3ZSdsbCBoYXZlIHRvIHNjaGVkdWxlIGEgZGVsZXRpb24uIFRvIGRvIHRoYXQsIHRoaXMgbm9kZSBuZWVkcyBhIGR1bW15XG4gICAgLy8gZmliZXIgYXNzb2NpYXRlZCB3aXRoIGl0LlxuXG5cbiAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocHJldkh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG5cbiAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYgPSAhZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIHZhciB1cGRhdGVQYXlsb2FkID0gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCBmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBmaWJlciwgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICBmaWJlci51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAvLyBpcyBhIG5ldyByZWYgd2UgbWFyayB0aGlzIGFzIGFuIHVwZGF0ZS5cblxuICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciB0ZXh0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciB0ZXh0Q29udGVudCA9IGZpYmVyLm1lbW9pemVkUHJvcHM7XG4gIHZhciBzaG91bGRVcGRhdGUgPSBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIGZpYmVyKTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UgaXMgY2FsbGVkIGluIGEgY29udGV4dCB3aGVyZSB0aGVcbiAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgdmFyIHJldHVybkZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG5cbiAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdmFyIF9pc0NvbmN1cnJlbnRNb2RlMiA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFueSByZW1haW5pbmcgaHlkcmF0YWJsZSBub2Rlcywgd2UgbmVlZCB0byBkZWxldGUgdGhlbSBub3cuXG4gIC8vIFdlIG9ubHkgZG8gdGhpcyBkZWVwZXIgdGhhbiBoZWFkIGFuZCBib2R5IHNpbmNlIHRoZXkgdGVuZCB0byBoYXZlIHJhbmRvbVxuICAvLyBvdGhlciBub2RlcyBpbiB0aGVtLiBXZSBhbHNvIGlnbm9yZSBjb21wb25lbnRzIHdpdGggcHVyZSB0ZXh0IGNvbnRlbnQgaW5cbiAgLy8gc2lkZSBvZiB0aGVtLiBXZSBhbHNvIGRvbid0IGRlbGV0ZSBhbnl0aGluZyBpbnNpZGUgdGhlIHJvb3QgY29udGFpbmVyLlxuXG5cbiAgaWYgKGZpYmVyLnRhZyAhPT0gSG9zdFJvb3QgJiYgKGZpYmVyLnRhZyAhPT0gSG9zdENvbXBvbmVudCB8fCBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhmaWJlci50eXBlKSAmJiAhc2hvdWxkU2V0VGV4dENvbnRlbnQoZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcykpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICBpZiAobmV4dEluc3RhbmNlKSB7XG4gICAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcik7XG4gICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKG5leHRJbnN0YW5jZSkge1xuICAgICAgICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICAgICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpO1xuICB9IGVsc2Uge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBoeWRyYXRpb25QYXJlbnRGaWJlciA/IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhmaWJlci5zdGF0ZU5vZGUpIDogbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkge1xuICByZXR1cm4gaXNIeWRyYXRpbmcgJiYgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcikge1xuICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuXG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCkge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLiBUaGUgZXJyb3JzIHRoYXQgb2NjdXJyZWRcbiAgICAvLyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBhdHRlbXB0IGFyZSBub3cgcmVjb3ZlcmVkLiBXZSB3aWxsIGxvZyB0aGVtIGluXG4gICAgLy8gY29tbWl0IHBoYXNlLCBvbmNlIHRoZSBlbnRpcmUgdHJlZSBoYXMgZmluaXNoZWQuXG4gICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhoeWRyYXRpb25FcnJvcnMpO1xuICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNIeWRyYXRpbmcoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZztcbn1cblxuZnVuY3Rpb24gcXVldWVIeWRyYXRpb25FcnJvcihlcnJvcikge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzID09PSBudWxsKSB7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICBoeWRyYXRpb25FcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dE1hcHM7XG52YXIgZGlkV2FybkFib3V0R2VuZXJhdG9ycztcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xudmFyIG93bmVySGFzS2V5VXNlV2FybmluZztcbnZhciBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmc7XG5cbnZhciB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHt9O1xuXG57XG4gIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG4gIC8qKlxuICAgKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gICAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICAgKiB1cGRhdGVzLlxuICAgKi9cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0ge307XG5cbiAgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkLl9zdG9yZSB8fCBjaGlsZC5fc3RvcmUudmFsaWRhdGVkIHx8IGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGlsZC5fc3RvcmUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IENvbXBvbmVudCBpbiB3YXJuRm9yTWlzc2luZ0tleSBzaG91bGQgaGF2ZSBhIF9zdG9yZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAnICsgJ1wia2V5XCIgcHJvcC4gU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yICcgKyAnbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KSB7XG4gIHZhciBtaXhlZFJlZiA9IGVsZW1lbnQucmVmO1xuXG4gIGlmIChtaXhlZFJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnb2JqZWN0Jykge1xuICAgIHtcbiAgICAgIC8vIFRPRE86IENsZWFuIHRoaXMgdXAgb25jZSB3ZSB0dXJuIG9uIHRoZSBzdHJpbmcgcmVmIHdhcm5pbmcgZm9yXG4gICAgICAvLyBldmVyeW9uZSwgYmVjYXVzZSB0aGUgc3RyaWN0IG1vZGUgY2FzZSB3aWxsIG5vIGxvbmdlciBiZSByZWxldmFudFxuICAgICAgaWYgKChyZXR1cm5GaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSB8fCB3YXJuQWJvdXRTdHJpbmdSZWZzKSAmJiAvLyBXZSB3YXJuIGluIFJlYWN0RWxlbWVudC5qcyBpZiBvd25lciBhbmQgc2VsZiBhcmUgZXF1YWwgZm9yIHN0cmluZyByZWZzXG4gICAgICAvLyBiZWNhdXNlIHRoZXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvblxuICAgICAgLy8gdXNpbmcgYSBjb2RlbW9kLiBUaGVyZWZvcmUsIHdlIGRvbid0IGhhdmUgdG8gd2FybiBhYm91dCBzdHJpbmcgcmVmcyBhZ2Fpbi5cbiAgICAgICEoZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fc2VsZiAmJiBlbGVtZW50Ll9vd25lci5zdGF0ZU5vZGUgIT09IGVsZW1lbnQuX3NlbGYpKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3IoJ0Egc3RyaW5nIHJlZiwgXCIlc1wiLCBoYXMgYmVlbiBmb3VuZCB3aXRoaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1N0cmluZyByZWZzIGFyZSBhIHNvdXJjZSBvZiBwb3RlbnRpYWwgYnVncyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuICcgKyAnV2UgcmVjb21tZW5kIHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgbWl4ZWRSZWYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuX293bmVyKSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBpbnN0O1xuXG4gICAgICBpZiAob3duZXIpIHtcbiAgICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcblxuICAgICAgICBpZiAob3duZXJGaWJlci50YWcgIT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHN0cmluZyByZWZzLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5zdCA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiBcIiArIG1peGVkUmVmICsgXCIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIFwiICsgJ2J1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9IC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3Qgc28gRmxvdyBrbm93cyBpdCB3b24ndCBjaGFuZ2UgaW4gdGhlIGNsb3N1cmVcblxuXG4gICAgICB2YXIgcmVzb2x2ZWRJbnN0ID0gaW5zdDtcblxuICAgICAge1xuICAgICAgICBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbihtaXhlZFJlZiwgJ3JlZicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVmO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gcmVzb2x2ZWRJbnN0LnJlZnM7XG5cbiAgICAgICAgaWYgKHJlZnMgPT09IGVtcHR5UmVmc09iamVjdCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBsYXp5IHBvb2xlZCBmcm96ZW4gb2JqZWN0LCBzbyB3ZSBuZWVkIHRvIGluaXRpYWxpemUuXG4gICAgICAgICAgcmVmcyA9IHJlc29sdmVkSW5zdC5yZWZzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBkZWxldGUgcmVmc1tzdHJpbmdSZWZdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZnNbc3RyaW5nUmVmXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZWYuX3N0cmluZ1JlZiA9IHN0cmluZ1JlZjtcbiAgICAgIHJldHVybiByZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgbWl4ZWRSZWYgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVmIHRvIGJlIGEgZnVuY3Rpb24sIGEgc3RyaW5nLCBhbiBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlUmVmKCksIG9yIG51bGwuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudC5fb3duZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoXCIgKyBtaXhlZFJlZiArIFwiKSBidXQgbm8gb3duZXIgd2FzIHNldC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZlwiICsgJyB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGZ1bmN0aW9uIGNvbXBvbmVudFxcbicgKyBcIjIuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudCdzIHJlbmRlciBtZXRob2RcXG5cIiArICczLiBZb3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlZnMtbXVzdC1oYXZlLW93bmVyIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICB2YXIgY2hpbGRTdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3Q2hpbGQpO1xuICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMobmV3Q2hpbGQpLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZFN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xufVxuXG5mdW5jdGlvbiB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdGdW5jdGlvbnMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLiBUaGlzIG1heSBoYXBwZW4gaWYgJyArICd5b3UgcmV0dXJuIGEgQ29tcG9uZW50IGluc3RlYWQgb2YgPENvbXBvbmVudCAvPiBmcm9tIHJlbmRlci4gJyArICdPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTGF6eShsYXp5VHlwZSkge1xuICB2YXIgcGF5bG9hZCA9IGxhenlUeXBlLl9wYXlsb2FkO1xuICB2YXIgaW5pdCA9IGxhenlUeXBlLl9pbml0O1xuICByZXR1cm4gaW5pdChwYXlsb2FkKTtcbn0gLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGV4aXN0cyBiZWNhdXNlIEkgZXhwZWN0IHRvIGNsb25lIHRoZSBjb2RlIGluIGVhY2ggcGF0aFxuLy8gdG8gYmUgYWJsZSB0byBvcHRpbWl6ZSBlYWNoIHBhdGggaW5kaXZpZHVhbGx5IGJ5IGJyYW5jaGluZyBlYXJseS4gVGhpcyBuZWVkc1xuLy8gYSBjb21waWxlciBvciB3ZSBjYW4gZG8gaXQgbWFudWFsbHkuIEhlbHBlcnMgdGhhdCBkb24ndCBuZWVkIHRoaXMgYnJhbmNoaW5nXG4vLyBsaXZlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbi5cblxuXG5mdW5jdGlvbiBDaGlsZFJlY29uY2lsZXIoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICBmdW5jdGlvbiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSkge1xuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2NoaWxkVG9EZWxldGVdO1xuICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY2hpbGRUb0RlbGV0ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuXG5cbiAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGlsZHJlbiB0byBhIHRlbXBvcmFyeSBtYXAgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGVtIGJ5XG4gICAgLy8ga2V5cyBxdWlja2x5LiBJbXBsaWNpdCAobnVsbCkga2V5cyBnZXQgYWRkZWQgdG8gdGhpcyBzZXQgd2l0aCB0aGVpciBpbmRleFxuICAgIC8vIGluc3RlYWQuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdmFyIGV4aXN0aW5nQ2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChleGlzdGluZ0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBpZiAoZXhpc3RpbmdDaGlsZC5rZXkgIT09IG51bGwpIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5rZXksIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5pbmRleCwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gIH1cblxuICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgLy8gV2UgY3VycmVudGx5IHNldCBzaWJsaW5nIHRvIG51bGwgYW5kIGluZGV4IHRvIDAgaGVyZSBiZWNhdXNlIGl0IGlzIGVhc3lcbiAgICAvLyB0byBmb3JnZXQgdG8gZG8gYmVmb3JlIHJldHVybmluZyBpdC4gRS5nLiBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLlxuICAgIHZhciBjbG9uZSA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGZpYmVyLCBwZW5kaW5nUHJvcHMpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcblxuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gRHVyaW5nIGh5ZHJhdGlvbiwgdGhlIHVzZUlkIGFsZ29yaXRobSBuZWVkcyB0byBrbm93IHdoaWNoIGZpYmVycyBhcmVcbiAgICAgIC8vIHBhcnQgb2YgYSBsaXN0IG9mIGNoaWxkcmVuIChhcnJheXMsIGl0ZXJhdG9ycykuXG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBGb3JrZWQ7XG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50ID0gbmV3RmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBvbGRJbmRleCA9IGN1cnJlbnQuaW5kZXg7XG5cbiAgICAgIGlmIChvbGRJbmRleCA8IGxhc3RQbGFjZWRJbmRleCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgbW92ZS5cbiAgICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpdGVtIGNhbiBzdGF5IGluIHBsYWNlLlxuICAgICAgICByZXR1cm4gb2xkSW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uLlxuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGaWJlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50LCB0ZXh0Q29udGVudCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCwgbGFuZXMpIHtcbiAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgbGFuZXMsIGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGN1cnJlbnQsIGVsZW1lbnQpICkgfHwgLy8gTGF6eSB0eXBlcyBzaG91bGQgcmVjb25jaWxlIHRoZWlyIHJlc29sdmVkIHR5cGUuXG4gICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsXG4gICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2VcbiAgICAgIC8vIGl0IGRvZXNuJ3QgcmVzdXNwZW5kLiBTbyB3ZSBjYW4ndCBsZXQgdGhlIGNhbGwgYmVsb3cgc3VzcGVuZC5cbiAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGN1cnJlbnQudHlwZSkge1xuICAgICAgICAvLyBNb3ZlIGJhc2VkIG9uIGluZGV4XG4gICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIGVsZW1lbnQucHJvcHMpO1xuICAgICAgICBleGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICB7XG4gICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICB9XG4gICAgfSAvLyBJbnNlcnRcblxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudCwgcG9ydGFsLCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0UG9ydGFsIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gIT09IHBvcnRhbC5jb250YWluZXJJbmZvIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uICE9PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBmcmFnbWVudCwgbGFuZXMsIGtleSkge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBGcmFnbWVudCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZyYWdtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywga2V5KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBmcmFnbWVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCgnJyArIG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZDIgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICB2YXIgX2NyZWF0ZWQzID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBudWxsKTtcblxuICAgICAgICBfY3JlYXRlZDMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgIHJldHVybiBfY3JlYXRlZDM7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAvLyBVcGRhdGUgdGhlIGZpYmVyIGlmIHRoZSBrZXlzIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuXG4gICAgdmFyIGtleSA9IG9sZEZpYmVyICE9PSBudWxsID8gb2xkRmliZXIua2V5IDogbnVsbDtcblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZFxuICAgICAgLy8gd2UgY2FuIGNvbnRpbnVlIHRvIHJlcGxhY2UgaXQgd2l0aG91dCBhYm9ydGluZyBldmVuIGlmIGl0IGlzIG5vdCBhIHRleHRcbiAgICAgIC8vIG5vZGUuXG4gICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG9sZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLCBzbyB3ZSBuZWl0aGVyIGhhdmUgdG8gY2hlY2sgdGhlIG9sZCBub3JcbiAgICAgIC8vIG5ldyBub2RlIGZvciB0aGUga2V5LiBJZiBib3RoIGFyZSB0ZXh0IG5vZGVzLCB0aGV5IG1hdGNoLlxuICAgICAgdmFyIG1hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDtcbiAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgbWF0Y2hlZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMiA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjMgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMywgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBXYXJucyBpZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSBvciBtaXNzaW5nIGtleVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JyB8fCBjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ga25vd25LZXlzO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGNoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHdhcm5Gb3JNaXNzaW5nS2V5KGNoaWxkLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgdmFyIGtleSA9IGNoaWxkLmtleTtcblxuICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtub3duS2V5cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAga25vd25LZXlzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFrbm93bktleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yKCdFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksIGAlc2AuICcgKyAnS2V5cyBzaG91bGQgYmUgdW5pcXVlIHNvIHRoYXQgY29tcG9uZW50cyBtYWludGFpbiB0aGVpciBpZGVudGl0eSAnICsgJ2Fjcm9zcyB1cGRhdGVzLiBOb24tdW5pcXVlIGtleXMgbWF5IGNhdXNlIGNoaWxkcmVuIHRvIGJlICcgKyAnZHVwbGljYXRlZCBhbmQvb3Igb21pdHRlZCBcdTIwMTQgdGhlIGJlaGF2aW9yIGlzIHVuc3VwcG9ydGVkIGFuZCAnICsgJ2NvdWxkIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicsIGtleSk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGNoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gY2hpbGQuX2luaXQ7XG4gICAgICAgICAgd2Fybk9uSW52YWxpZEtleShpbml0KHBheWxvYWQpLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ga25vd25LZXlzO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuLCBsYW5lcykge1xuICAgIC8vIFRoaXMgYWxnb3JpdGhtIGNhbid0IG9wdGltaXplIGJ5IHNlYXJjaGluZyBmcm9tIGJvdGggZW5kcyBzaW5jZSB3ZVxuICAgIC8vIGRvbid0IGhhdmUgYmFja3BvaW50ZXJzIG9uIGZpYmVycy4gSSdtIHRyeWluZyB0byBzZWUgaG93IGZhciB3ZSBjYW4gZ2V0XG4gICAgLy8gd2l0aCB0aGF0IG1vZGVsLiBJZiBpdCBlbmRzIHVwIG5vdCBiZWluZyB3b3J0aCB0aGUgdHJhZGVvZmZzLCB3ZSBjYW5cbiAgICAvLyBhZGQgaXQgbGF0ZXIuXG4gICAgLy8gRXZlbiB3aXRoIGEgdHdvIGVuZGVkIG9wdGltaXphdGlvbiwgd2UnZCB3YW50IHRvIG9wdGltaXplIGZvciB0aGUgY2FzZVxuICAgIC8vIHdoZXJlIHRoZXJlIGFyZSBmZXcgY2hhbmdlcyBhbmQgYnJ1dGUgZm9yY2UgdGhlIGNvbXBhcmlzb24gaW5zdGVhZCBvZlxuICAgIC8vIGdvaW5nIGZvciB0aGUgTWFwLiBJdCdkIGxpa2UgdG8gZXhwbG9yZSBoaXR0aW5nIHRoYXQgcGF0aCBmaXJzdCBpblxuICAgIC8vIGZvcndhcmQtb25seSBtb2RlIGFuZCBvbmx5IGdvIGZvciB0aGUgTWFwIG9uY2Ugd2Ugbm90aWNlIHRoYXQgd2UgbmVlZFxuICAgIC8vIGxvdHMgb2YgbG9vayBhaGVhZC4gVGhpcyBkb2Vzbid0IGhhbmRsZSByZXZlcnNhbCBhcyB3ZWxsIGFzIHR3byBlbmRlZFxuICAgIC8vIHNlYXJjaCBidXQgdGhhdCdzIHVudXN1YWwuIEJlc2lkZXMsIGZvciB0aGUgdHdvIGVuZGVkIG9wdGltaXphdGlvbiB0b1xuICAgIC8vIHdvcmsgb24gSXRlcmFibGVzLCB3ZSdkIG5lZWQgdG8gY29weSB0aGUgd2hvbGUgc2V0LlxuICAgIC8vIEluIHRoaXMgZmlyc3QgaXRlcmF0aW9uLCB3ZSdsbCBqdXN0IGxpdmUgd2l0aCBoaXR0aW5nIHRoZSBiYWQgY2FzZVxuICAgIC8vIChhZGRpbmcgZXZlcnl0aGluZyB0byBhIE1hcCkgaW4gZm9yIGV2ZXJ5IGluc2VydC9tb3ZlLlxuICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjb2RlLCBhbHNvIHVwZGF0ZSByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKCkgd2hpY2hcbiAgICAvLyB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobS5cbiAgICB7XG4gICAgICAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5ld0NoaWxkcmVuW2ldO1xuICAgICAgICBrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzTmV3RmliZXIgPSBudWxsO1xuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuXG4gICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmIG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlcjtcbiAgICAgICAgb2xkRmliZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cblxuICAgIGlmIChuZXdJZHggPT09IG5ld0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBudW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgICB2YXIgX25ld0ZpYmVyID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgICBpZiAoX25ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfSAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cblxuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOyAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG5cbiAgICBmb3IgKDsgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgdmFyIF9uZXdGaWJlcjIgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgaWYgKF9uZXdGaWJlcjIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyMi5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXIyLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjIua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICB2YXIgX251bWJlck9mRm9ya3MyID0gbmV3SWR4O1xuICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczIpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuSXRlcmFibGUsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyByZWNvbmNpbGVDaGlsZHJlbkFycmF5KCksXG4gICAgLy8gYnV0IHVzaW5nIHRoZSBpdGVyYXRvciBpbnN0ZWFkLlxuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvYmplY3QgaXMgbm90IGFuIGl0ZXJhYmxlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gJyArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCByZW5kZXJpbmcgR2VuZXJhdG9ycyBiZWNhdXNlIGl0J3MgYSBtdXRhdGlvbi5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyOTk1XG4gICAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IHRvU3RyaW5nVGFnXG4gICAgICBuZXdDaGlsZHJlbkl0ZXJhYmxlW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdHZW5lcmF0b3InKSB7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0R2VuZXJhdG9ycykge1xuICAgICAgICAgIGVycm9yKCdVc2luZyBHZW5lcmF0b3JzIGFzIGNoaWxkcmVuIGlzIHVuc3VwcG9ydGVkIGFuZCB3aWxsIGxpa2VseSB5aWVsZCAnICsgJ3VuZXhwZWN0ZWQgcmVzdWx0cyBiZWNhdXNlIGVudW1lcmF0aW5nIGEgZ2VuZXJhdG9yIG11dGF0ZXMgaXQuICcgKyAnWW91IG1heSBjb252ZXJ0IGl0IHRvIGFuIGFycmF5IHdpdGggYEFycmF5LmZyb20oKWAgb3IgdGhlICcgKyAnYFsuLi5zcHJlYWRdYCBvcGVyYXRvciBiZWZvcmUgcmVuZGVyaW5nLiBLZWVwIGluIG1pbmQgJyArICd5b3UgbWlnaHQgbmVlZCB0byBwb2x5ZmlsbCB0aGVzZSBmZWF0dXJlcyBmb3Igb2xkZXIgYnJvd3NlcnMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gdHJ1ZTtcbiAgICAgIH0gLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG5cblxuICAgICAgaWYgKG5ld0NoaWxkcmVuSXRlcmFibGUuZW50cmllcyA9PT0gaXRlcmF0b3JGbikge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgIH0gLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICAvLyBXZSdsbCBnZXQgYSBkaWZmZXJlbnQgaXRlcmF0b3IgbGF0ZXIgZm9yIHRoZSBtYWluIHBhc3MuXG5cblxuICAgICAgdmFyIF9uZXdDaGlsZHJlbiA9IGl0ZXJhdG9yRm4uY2FsbChuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgICAgaWYgKF9uZXdDaGlsZHJlbikge1xuICAgICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgICB2YXIgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpO1xuXG4gICAgICAgIGZvciAoOyAhX3N0ZXAuZG9uZTsgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBpdGVyYWJsZSBvYmplY3QgcHJvdmlkZWQgbm8gaXRlcmF0b3IuJyk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcbiAgICB2YXIgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBudW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlcjMgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjMsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczMgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfSAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cblxuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOyAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG5cbiAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgIHZhciBfbmV3RmliZXI0ID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXI0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjQuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyNC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXI0LmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXI0LCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI0O1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgdmFyIF9udW1iZXJPZkZvcmtzNCA9IG5ld0lkeDtcbiAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3M0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7XG4gICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIGNoZWNrIGZvciBrZXlzIG9uIHRleHQgbm9kZXMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhXG4gICAgLy8gd2F5IHRvIGRlZmluZSB0aGVtLlxuICAgIGlmIChjdXJyZW50Rmlyc3RDaGlsZCAhPT0gbnVsbCAmJiBjdXJyZW50Rmlyc3RDaGlsZC50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gZXhpc3Rpbmcgbm9kZSBzbyBsZXQncyBqdXN0IHVwZGF0ZSBpdCBhbmQgZGVsZXRlXG4gICAgICAvLyB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nKTtcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9IC8vIFRoZSBleGlzdGluZyBmaXJzdCBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGUgc28gd2UgbmVlZCB0byBjcmVhdGUgb25lXG4gICAgLy8gYW5kIGRlbGV0ZSB0aGUgZXhpc3Rpbmcgb25lcy5cblxuXG4gICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IEZyYWdtZW50KSB7XG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbik7XG4gICAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOlxuICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY2hpbGQsIGVsZW1lbnQpICkgfHwgLy8gTGF6eSB0eXBlcyBzaG91bGQgcmVjb25jaWxlIHRoZWlyIHJlc29sdmVkIHR5cGUuXG4gICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBIb3QgUmVsb2FkaW5nIGNoZWNrIGFib3ZlLFxuICAgICAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZVxuICAgICAgICAgIC8vIGl0IGRvZXNuJ3QgcmVzdXNwZW5kLiBTbyB3ZSBjYW4ndCBsZXQgdGhlIGNhbGwgYmVsb3cgc3VzcGVuZC5cbiAgICAgICAgICB0eXBlb2YgZWxlbWVudFR5cGUgPT09ICdvYmplY3QnICYmIGVsZW1lbnRUeXBlICE9PSBudWxsICYmIGVsZW1lbnRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiYgcmVzb2x2ZUxhenkoZWxlbWVudFR5cGUpID09PSBjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG5cbiAgICAgICAgICAgIHZhciBfZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcyk7XG5cbiAgICAgICAgICAgIF9leGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGNoaWxkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIF9leGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9leGlzdGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRGlkbid0IG1hdGNoLlxuXG5cbiAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgIF9jcmVhdGVkNC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50KTtcbiAgICAgIF9jcmVhdGVkNC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBfY3JlYXRlZDQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgcG9ydGFsLCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBwb3J0YWwua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gSG9zdFBvcnRhbCAmJiBjaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT0gcG9ydGFsLmNvbnRhaW5lckluZm8gJiYgY2hpbGQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uID09PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9IC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cblxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVjdXJzaXZlLlxuICAgIC8vIElmIHRoZSB0b3AgbGV2ZWwgaXRlbSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgY2hpbGRyZW4sXG4gICAgLy8gbm90IGFzIGEgZnJhZ21lbnQuIE5lc3RlZCBhcnJheXMgb24gdGhlIG90aGVyIGhhbmQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgLy8gZnJhZ21lbnQgbm9kZXMuIFJlY3Vyc2lvbiBoYXBwZW5zIGF0IHRoZSBub3JtYWwgZmxvdy5cbiAgICAvLyBIYW5kbGUgdG9wIGxldmVsIHVua2V5ZWQgZnJhZ21lbnRzIGFzIGlmIHRoZXkgd2VyZSBhcnJheXMuXG4gICAgLy8gVGhpcyBsZWFkcyB0byBhbiBhbWJpZ3VpdHkgYmV0d2VlbiA8PntbLi4uXX08Lz4gYW5kIDw+Li4uPC8+LlxuICAgIC8vIFdlIHRyZWF0IHRoZSBhbWJpZ3VvdXMgY2FzZXMgYWJvdmUgdGhlIHNhbWUuXG4gICAgdmFyIGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQgPSB0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsICYmIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgJiYgbmV3Q2hpbGQua2V5ID09PSBudWxsO1xuXG4gICAgaWYgKGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW47XG4gICAgfSAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG5cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpKTtcblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDsgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBiZSBub24tcmVjdXJzaXZlLlxuXG4gICAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCAnJyArIG5ld0NoaWxkLCBsYW5lcykpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9IC8vIFJlbWFpbmluZyBjYXNlcyBhcmUgYWxsIHRyZWF0ZWQgYXMgZW1wdHkuXG5cblxuICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzO1xufVxuXG52YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIodHJ1ZSk7XG52YXIgbW91bnRDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcihmYWxzZSk7XG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50LmNoaWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXN1bWluZyB3b3JrIG5vdCB5ZXQgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHdoaWxlIChjdXJyZW50Q2hpbGQuc2libGluZyAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnRDaGlsZC5zaWJsaW5nO1xuICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQuc2libGluZyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7XG4gICAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIH1cblxuICBuZXdDaGlsZC5zaWJsaW5nID0gbnVsbDtcbn0gLy8gUmVzZXQgYSB3b3JrSW5Qcm9ncmVzcyBjaGlsZCBzZXQgdG8gcHJlcGFyZSBpdCBmb3IgYSBzZWNvbmQgcGFzcy5cblxuZnVuY3Rpb24gcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgdmFyIGNoaWxkID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgcmVzZXRXb3JrSW5Qcm9ncmVzcyhjaGlsZCwgbGFuZXMpO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG52YXIgTk9fQ09OVEVYVCA9IHt9O1xudmFyIGNvbnRleHRTdGFja0N1cnNvciQxID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xuXG5mdW5jdGlvbiByZXF1aXJlZENvbnRleHQoYykge1xuICBpZiAoYyA9PT0gTk9fQ09OVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaG9zdCBjb250ZXh0IHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7IC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG5cbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgTk9fQ09OVEVYVCwgZmliZXIpO1xuICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC5cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dFJvb3RDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250YWluZXIoZmliZXIpIHtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xuICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUpOyAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cblxuICBpZiAoY29udGV4dCA9PT0gbmV4dENvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGV4dChmaWJlcikge1xuICAvLyBEbyBub3QgcG9wIHVubGVzcyB0aGlzIEZpYmVyIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gIC8vIHB1c2hIb3N0Q29udGV4dCgpIG9ubHkgcHVzaGVzIEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBpZiAoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZmliZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbnZhciBEZWZhdWx0U3VzcGVuc2VDb250ZXh0ID0gMDsgLy8gVGhlIFN1c3BlbnNlIENvbnRleHQgaXMgc3BsaXQgaW50byB0d28gcGFydHMuIFRoZSBsb3dlciBiaXRzIGlzXG4vLyBpbmhlcml0ZWQgZGVlcGx5IGRvd24gdGhlIHN1YnRyZWUuIFRoZSB1cHBlciBiaXRzIG9ubHkgYWZmZWN0XG4vLyB0aGlzIGltbWVkaWF0ZSBzdXNwZW5zZSBib3VuZGFyeSBhbmQgZ2V0cyByZXNldCBlYWNoIG5ld1xuLy8gYm91bmRhcnkgb3Igc3VzcGVuc2UgbGlzdC5cblxudmFyIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrID0gMTsgLy8gU3VidHJlZSBGbGFnczpcbi8vIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCBpbmRpY2F0ZXMgdGhhdCBvbmUgb2Ygb3VyIHBhcmVudCBTdXNwZW5zZVxuLy8gYm91bmRhcmllcyBpcyBub3QgY3VycmVudGx5IHNob3dpbmcgdmlzaWJsZSBtYWluIGNvbnRlbnQuXG4vLyBFaXRoZXIgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBvciBpcyBub3QgbW91bnRlZCBhdCBhbGwuXG4vLyBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlc2lyYWJsZSB0byB0cmlnZ2VyIGEgZmFsbGJhY2sgYXRcbi8vIHRoZSBwYXJlbnQuIElmIG5vdCwgdGhlbiB3ZSBtaWdodCBuZWVkIHRvIHRyaWdnZXIgdW5kZXNpcmFibGUgYm91bmRhcmllc1xuLy8gYW5kL29yIHN1c3BlbmQgdGhlIGNvbW1pdCB0byBhdm9pZCBoaWRpbmcgdGhlIHBhcmVudCBjb250ZW50LlxuXG52YXIgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0ID0gMTsgLy8gU2hhbGxvdyBGbGFnczpcbi8vIEZvcmNlU3VzcGVuc2VGYWxsYmFjayBjYW4gYmUgdXNlZCBieSBTdXNwZW5zZUxpc3QgdG8gZm9yY2UgbmV3bHkgYWRkZWRcbi8vIGl0ZW1zIGludG8gdGhlaXIgZmFsbGJhY2sgc3RhdGUgZHVyaW5nIG9uZSBvZiB0aGUgcmVuZGVyIHBhc3Nlcy5cblxudmFyIEZvcmNlU3VzcGVuc2VGYWxsYmFjayA9IDI7XG52YXIgc3VzcGVuc2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihEZWZhdWx0U3VzcGVuc2VDb250ZXh0KTtcbmZ1bmN0aW9uIGhhc1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBmbGFnKSB7XG4gIHJldHVybiAocGFyZW50Q29udGV4dCAmIGZsYWcpICE9PSAwO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrO1xufVxuZnVuY3Rpb24gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzaGFsbG93Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrIHwgc2hhbGxvd0NvbnRleHQ7XG59XG5mdW5jdGlvbiBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHN1YnRyZWVDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0IHwgc3VidHJlZUNvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoU3VzcGVuc2VDb250ZXh0KGZpYmVyLCBuZXdDb250ZXh0KSB7XG4gIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgbmV3Q29udGV4dCwgZmliZXIpO1xufVxuZnVuY3Rpb24gcG9wU3VzcGVuc2VDb250ZXh0KGZpYmVyKSB7XG4gIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcywgaGFzSW52aXNpYmxlUGFyZW50KSB7XG4gIC8vIElmIGl0IHdhcyB0aGUgcHJpbWFyeSBjaGlsZHJlbiB0aGF0IGp1c3Qgc3VzcGVuZGVkLCBjYXB0dXJlIGFuZCByZW5kZXIgdGhlXG4gIC8vIGZhbGxiYWNrLiBPdGhlcndpc2UsIGRvbid0IGNhcHR1cmUgYW5kIGJ1YmJsZSB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFsd2F5cyBjYXB0dXJlcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7IC8vIFJlZ3VsYXIgYm91bmRhcmllcyBhbHdheXMgY2FwdHVyZS5cblxuICB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gSWYgaXQncyBhIGJvdW5kYXJ5IHdlIHNob3VsZCBhdm9pZCwgdGhlbiB3ZSBwcmVmZXIgdG8gYnViYmxlIHVwIHRvIHRoZVxufVxuZnVuY3Rpb24gZmluZEZpcnN0U3VzcGVuZGVkKHJvdykge1xuICB2YXIgbm9kZSA9IHJvdztcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IG5vZGUubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gbnVsbCB8fCBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGRlaHlkcmF0ZWQpIHx8IGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGRlaHlkcmF0ZWQpKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQgJiYgLy8gcmV2ZWFsT3JkZXIgdW5kZWZpbmVkIGNhbid0IGJlIHRydXN0ZWQgYmVjYXVzZSBpdCBkb24ndFxuICAgIC8vIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBpdCBzdXNwZW5kZWQgb3Igbm90LlxuICAgIG5vZGUubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZGlkU3VzcGVuZCA9IChub2RlLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgIGlmIChkaWRTdXNwZW5kKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcm93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHJvdykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBOb0ZsYWdzJDEgPVxuLyogICAqL1xuMDsgLy8gUmVwcmVzZW50cyB3aGV0aGVyIGVmZmVjdCBzaG91bGQgZmlyZS5cblxudmFyIEhhc0VmZmVjdCA9XG4vKiAqL1xuMTsgLy8gUmVwcmVzZW50cyB0aGUgcGhhc2UgaW4gd2hpY2ggdGhlIGVmZmVjdCAobm90IHRoZSBjbGVhbi11cCkgZmlyZXMuXG5cbnZhciBJbnNlcnRpb24gPVxuLyogICovXG4yO1xudmFyIExheW91dCA9XG4vKiAgICAqL1xuNDtcbnZhciBQYXNzaXZlJDEgPVxuLyogICAqL1xuODtcblxuLy8gYW5kIHNob3VsZCBiZSByZXNldCBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgcmVuZGVyLlxuLy8gVGhpcyB0cmFja3Mgd2hpY2ggbXV0YWJsZSBzb3VyY2VzIG5lZWQgdG8gYmUgcmVzZXQgYWZ0ZXIgYSByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMgPSBbXTtcbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IHdvcmtJblByb2dyZXNzU291cmNlc1tpXTtcblxuICAgIHtcbiAgICAgIG11dGFibGVTb3VyY2UuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGggPSAwO1xufVxuLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHZlcnNpb24gdXNlZCBmb3Igc2VydmVyIHJlbmRlcmluZyBtYXRjaGVzIHRoZSBvbmVcbi8vIHRoYXQgaXMgZXZlbnR1YWxseSByZWFkIGR1cmluZyBoeWRyYXRpb24uXG4vLyBJZiB0aGV5IGRvbid0IG1hdGNoIHRoZXJlJ3MgYSBwb3RlbnRpYWwgdGVhciBhbmQgYSBmdWxsIGRlb3B0IHJlbmRlciBpcyByZXF1aXJlZC5cblxuZnVuY3Rpb24gcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpIHtcbiAgdmFyIGdldFZlcnNpb24gPSBtdXRhYmxlU291cmNlLl9nZXRWZXJzaW9uO1xuICB2YXIgdmVyc2lvbiA9IGdldFZlcnNpb24obXV0YWJsZVNvdXJjZS5fc291cmNlKTsgLy8gVE9ETyBDbGVhciB0aGlzIGRhdGEgb25jZSBhbGwgcGVuZGluZyBoeWRyYXRpb24gd29yayBpcyBmaW5pc2hlZC5cbiAgLy8gUmV0YWluaW5nIGl0IGZvcmV2ZXIgbWF5IGludGVyZmVyZSB3aXRoIEdDLlxuXG4gIGlmIChyb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPT0gbnVsbCkge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IFttdXRhYmxlU291cmNlLCB2ZXJzaW9uXTtcbiAgfSBlbHNlIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChtdXRhYmxlU291cmNlLCB2ZXJzaW9uKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7XG52YXIgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90O1xuXG57XG4gIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuLy8gVGhlc2UgYXJlIHNldCByaWdodCBiZWZvcmUgY2FsbGluZyB0aGUgY29tcG9uZW50LlxudmFyIHJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIEkndmUgbmFtZWQgaXQgZGlmZmVyZW50bHkgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbVxuLy8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOyAvLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuXG52YXIgY3VycmVudEhvb2sgPSBudWxsO1xudmFyIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7IC8vIFdoZXRoZXIgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzXG4vLyBkb2VzIG5vdCBnZXQgcmVzZXQgaWYgd2UgZG8gYW5vdGhlciByZW5kZXIgcGFzczsgb25seSB3aGVuIHdlJ3JlIGNvbXBsZXRlbHlcbi8vIGZpbmlzaGVkIGV2YWx1YXRpbmcgdGhpcyBjb21wb25lbnQuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHdlIGtub3dcbi8vIHdoZXRoZXIgd2UgbmVlZCB0byBjbGVhciByZW5kZXIgcGhhc2UgdXBkYXRlcyBhZnRlciBhIHRocm93LlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBXaGVyZSBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbmx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIgcGFzcy4gVGhpc1xuLy8gZ2V0cyByZXNldCBhZnRlciBlYWNoIGF0dGVtcHQuXG4vLyBUT0RPOiBNYXliZSB0aGVyZSdzIHNvbWUgd2F5IHRvIGNvbnNvbGlkYXRlIHRoaXMgd2l0aFxuLy8gYGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVgLiBPciB3aXRoIGBudW1iZXJPZlJlUmVuZGVyc2AuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTsgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgdXNlSWQgaG9va3MgaW4gdGhpcyBjb21wb25lbnQuXG5cbnZhciBsb2NhbElkQ291bnRlciA9IDA7IC8vIFVzZWQgZm9yIGlkcyB0aGF0IGFyZSBnZW5lcmF0ZWQgY29tcGxldGVseSBjbGllbnQtc2lkZSAoaS5lLiBub3QgZHVyaW5nXG4vLyBoeWRyYXRpb24pLiBUaGlzIGNvdW50ZXIgaXMgZ2xvYmFsLCBzbyBjbGllbnQgaWRzIGFyZSBub3Qgc3RhYmxlIGFjcm9zc1xuLy8gcmVuZGVyIGF0dGVtcHRzLlxuXG52YXIgZ2xvYmFsQ2xpZW50SWRDb3VudGVyID0gMDtcbnZhciBSRV9SRU5ERVJfTElNSVQgPSAyNTsgLy8gSW4gREVWLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByaW1pdGl2ZSBob29rXG5cbnZhciBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7IC8vIEluIERFViwgdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBob29rcyBhcmUgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyIGJldHdlZW4gcmVuZGVycy5cbi8vIFRoZSBsaXN0IHN0b3JlcyB0aGUgb3JkZXIgb2YgaG9va3MgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgcmVuZGVyIChtb3VudCkuXG4vLyBTdWJzZXF1ZW50IHJlbmRlcnMgKHVwZGF0ZXMpIHJlZmVyZW5jZSB0aGlzIGxpc3QuXG5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIEluIERFViwgdGhpcyB0cmFja3Mgd2hldGhlciBjdXJyZW50bHkgcmVuZGVyaW5nIGNvbXBvbmVudCBuZWVkcyB0byBpZ25vcmVcbi8vIHRoZSBkZXBlbmRlbmNpZXMgZm9yIEhvb2tzIHRoYXQgbmVlZCB0aGVtIChlLmcuIHVzZUVmZmVjdCBvciB1c2VNZW1vKS5cbi8vIFdoZW4gdHJ1ZSwgc3VjaCBIb29rcyB3aWxsIGFsd2F5cyBiZSBcInJlbW91bnRlZFwiLiBPbmx5IHVzZWQgZHVyaW5nIGhvdCByZWxvYWQuXG5cbnZhciBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBtb3VudEhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiA9PT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzRGV2ID0gW2hvb2tOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va1R5cGVzRGV2LnB1c2goaG9va05hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2Kys7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpIHtcbiAge1xuICAgIGlmIChkZXBzICE9PSB1bmRlZmluZWQgJiYgZGVwcyAhPT0gbnVsbCAmJiAhaXNBcnJheShkZXBzKSkge1xuICAgICAgLy8gVmVyaWZ5IGRlcHMsIGJ1dCBvbmx5IG9uIG1vdW50IHRvIGF2b2lkIGV4dHJhIGNoZWNrcy5cbiAgICAgIC8vIEl0J3MgdW5saWtlbHkgdGhlaXIgdHlwZSB3b3VsZCBjaGFuZ2UgYXMgdXN1YWxseSB5b3UgZGVmaW5lIHRoZW0gaW5saW5lLlxuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuICcgKyAnc3BlY2lmaWVkLCB0aGUgZmluYWwgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheS4nLCBjdXJyZW50SG9va05hbWVJbkRldiwgdHlwZW9mIGRlcHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihjdXJyZW50SG9va05hbWUpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxKTtcblxuICAgIGlmICghZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgdGFibGUgPSAnJztcbiAgICAgICAgdmFyIHNlY29uZENvbHVtblN0YXJ0ID0gMzA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXY7IGkrKykge1xuICAgICAgICAgIHZhciBvbGRIb29rTmFtZSA9IGhvb2tUeXBlc0RldltpXTtcbiAgICAgICAgICB2YXIgbmV3SG9va05hbWUgPSBpID09PSBob29rVHlwZXNVcGRhdGVJbmRleERldiA/IGN1cnJlbnRIb29rTmFtZSA6IG9sZEhvb2tOYW1lO1xuICAgICAgICAgIHZhciByb3cgPSBpICsgMSArIFwiLiBcIiArIG9sZEhvb2tOYW1lOyAvLyBFeHRyYSBzcGFjZSBzbyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwXG4gICAgICAgICAgLy8gbG9sIEAgSUUgbm90IHN1cHBvcnRpbmcgU3RyaW5nI3JlcGVhdFxuXG4gICAgICAgICAgd2hpbGUgKHJvdy5sZW5ndGggPCBzZWNvbmRDb2x1bW5TdGFydCkge1xuICAgICAgICAgICAgcm93ICs9ICcgJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByb3cgKz0gbmV3SG9va05hbWUgKyAnXFxuJztcbiAgICAgICAgICB0YWJsZSArPSByb3c7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignUmVhY3QgaGFzIGRldGVjdGVkIGEgY2hhbmdlIGluIHRoZSBvcmRlciBvZiBIb29rcyBjYWxsZWQgYnkgJXMuICcgKyAnVGhpcyB3aWxsIGxlYWQgdG8gYnVncyBhbmQgZXJyb3JzIGlmIG5vdCBmaXhlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZCB0aGUgUnVsZXMgb2YgSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rc1xcblxcbicgKyAnICAgUHJldmlvdXMgcmVuZGVyICAgICAgICAgICAgTmV4dCByZW5kZXJcXG4nICsgJyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicgKyAnJXMnICsgJyAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxcbicsIGNvbXBvbmVudE5hbWUsIHRhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dJbnZhbGlkSG9va0Vycm9yKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3InICsgJyBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuJyArICcyLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuJyArICczLiBZb3UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QgaW4gdGhlIHNhbWUgYXBwXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS4nKTtcbn1cblxuZnVuY3Rpb24gYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykge1xuICB7XG4gICAgaWYgKGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzKSB7XG4gICAgICAvLyBPbmx5IHRydWUgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBiZWluZyBob3QgcmVsb2FkZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByZXZEZXBzID09PSBudWxsKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgbm90IGR1cmluZyAnICsgJ3RoZSBwcmV2aW91cyByZW5kZXIuIEV2ZW4gdGhvdWdoIHRoZSBmaW5hbCBhcmd1bWVudCBpcyBvcHRpb25hbCwgJyArICdpdHMgdHlwZSBjYW5ub3QgY2hhbmdlIGJldHdlZW4gcmVuZGVycy4nLCBjdXJyZW50SG9va05hbWVJbkRldik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAge1xuICAgIC8vIERvbid0IGJvdGhlciBjb21wYXJpbmcgbGVuZ3RocyBpbiBwcm9kIGJlY2F1c2UgdGhlc2UgYXJyYXlzIHNob3VsZCBiZVxuICAgIC8vIHBhc3NlZCBpbmxpbmUuXG4gICAgaWYgKG5leHREZXBzLmxlbmd0aCAhPT0gcHJldkRlcHMubGVuZ3RoKSB7XG4gICAgICBlcnJvcignVGhlIGZpbmFsIGFyZ3VtZW50IHBhc3NlZCB0byAlcyBjaGFuZ2VkIHNpemUgYmV0d2VlbiByZW5kZXJzLiBUaGUgJyArICdvcmRlciBhbmQgc2l6ZSBvZiB0aGlzIGFycmF5IG11c3QgcmVtYWluIGNvbnN0YW50LlxcblxcbicgKyAnUHJldmlvdXM6ICVzXFxuJyArICdJbmNvbWluZzogJXMnLCBjdXJyZW50SG9va05hbWVJbkRldiwgXCJbXCIgKyBwcmV2RGVwcy5qb2luKCcsICcpICsgXCJdXCIsIFwiW1wiICsgbmV4dERlcHMuam9pbignLCAnKSArIFwiXVwiKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZEZXBzLmxlbmd0aCAmJiBpIDwgbmV4dERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob2JqZWN0SXMobmV4dERlcHNbaV0sIHByZXZEZXBzW2ldKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgc2Vjb25kQXJnLCBuZXh0UmVuZGVyTGFuZXMpIHtcbiAgcmVuZGVyTGFuZXMgPSBuZXh0UmVuZGVyTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSB3b3JrSW5Qcm9ncmVzcztcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzIDogbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBVc2VkIGZvciBob3QgcmVsb2FkaW5nOlxuXG4gICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lczsgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzZXRcbiAgLy8gY3VycmVudEhvb2sgPSBudWxsO1xuICAvLyB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuICAvLyBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gIC8vIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgLy8gVE9ETyBXYXJuIGlmIG5vIGhvb2tzIGFyZSB1c2VkIGF0IGFsbCBkdXJpbmcgbW91bnQsIHRoZW4gc29tZSBhcmUgdXNlZCBkdXJpbmcgdXBkYXRlLlxuICAvLyBDdXJyZW50bHkgd2Ugd2lsbCBpZGVudGlmeSB0aGUgdXBkYXRlIHJlbmRlciBhcyBhIG1vdW50IGJlY2F1c2UgbWVtb2l6ZWRTdGF0ZSA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcbiAgLy8gVXNpbmcgbWVtb2l6ZWRTdGF0ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbW91bnQvdXBkYXRlIG9ubHkgd29ya3MgaWYgYXQgbGVhc3Qgb25lIHN0YXRlZnVsIGhvb2sgaXMgdXNlZC5cbiAgLy8gTm9uLXN0YXRlZnVsIGhvb2tzIChlLmcuIGNvbnRleHQpIGRvbid0IGdldCBhZGRlZCB0byBtZW1vaXplZFN0YXRlLFxuICAvLyBzbyBtZW1vaXplZFN0YXRlIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cblxuICB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgfSBlbHNlIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBoYW5kbGVzIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIGNvbXBvbmVudCBpcyB1cGRhdGluZyxcbiAgICAgIC8vIGJ1dCBubyBzdGF0ZWZ1bCBob29rcyBoYXZlIGJlZW4gdXNlZC5cbiAgICAgIC8vIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3Rpb24gY29kZSBiZWhhdmlvciAod2hpY2ggd2lsbCB1c2UgSG9va3NEaXNwYXRjaGVyT25Nb3VudCksXG4gICAgICAvLyBidXQgd2l0aCB0aGUgZXh0cmEgREVWIHZhbGlkYXRpb24gdG8gZW5zdXJlIGhvb2tzIG9yZGVyaW5nIGhhc24ndCBjaGFuZ2VkLlxuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGRvZXMgdGhhdC5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVjtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpOyAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlXG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcykge1xuICAgIC8vIEtlZXAgcmVuZGVyaW5nIGluIGEgbG9vcCBmb3IgYXMgbG9uZyBhcyByZW5kZXIgcGhhc2UgdXBkYXRlcyBjb250aW51ZSB0b1xuICAgIC8vIGJlIHNjaGVkdWxlZC4gVXNlIGEgY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbiAgICAgIGxvY2FsSWRDb3VudGVyID0gMDtcblxuICAgICAgaWYgKG51bWJlck9mUmVSZW5kZXJzID49IFJFX1JFTkRFUl9MSU1JVCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBtYW55IHJlLXJlbmRlcnMuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlbmRlcnMgdG8gcHJldmVudCAnICsgJ2FuIGluZmluaXRlIGxvb3AuJyk7XG4gICAgICB9XG5cbiAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gRXZlbiB3aGVuIGhvdCByZWxvYWRpbmcsIGFsbG93IGRlcGVuZGVuY2llcyB0byBzdGFiaWxpemVcbiAgICAgICAgLy8gYWZ0ZXIgZmlyc3QgcmVuZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuXG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICB9IC8vIFN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cblxuICAgICAgY3VycmVudEhvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAge1xuICAgICAgICAvLyBBbHNvIHZhbGlkYXRlIGhvb2sgb3JkZXIgZm9yIGNhc2NhZGluZyB1cGRhdGVzLlxuICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgfVxuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9ICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgO1xuICAgICAgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgfSB3aGlsZSAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKTtcbiAgfSAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jZS5cblxuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBob29rVHlwZXNEZXY7XG4gIH0gLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuXG5cbiAgdmFyIGRpZFJlbmRlclRvb0Zld0hvb2tzID0gY3VycmVudEhvb2sgIT09IG51bGwgJiYgY3VycmVudEhvb2submV4dCAhPT0gbnVsbDtcbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBDb25maXJtIHRoYXQgYSBzdGF0aWMgZmxhZyB3YXMgbm90IGFkZGVkIG9yIHJlbW92ZWQgc2luY2UgdGhlIGxhc3RcbiAgICAvLyByZW5kZXIuIElmIHRoaXMgZmlyZXMsIGl0IHN1Z2dlc3RzIHRoYXQgd2UgaW5jb3JyZWN0bHkgcmVzZXQgdGhlIHN0YXRpY1xuICAgIC8vIGZsYWdzIGluIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgY29kZWJhc2UuIFRoaXMgaGFzIGhhcHBlbmVkIGJlZm9yZSwgZm9yXG4gICAgLy8gZXhhbXBsZSwgaW4gdGhlIFN1c3BlbnNlTGlzdCBpbXBsZW1lbnRhdGlvbi5cblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaykgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIFN0YXRpY01hc2spICYmIC8vIERpc2FibGUgdGhpcyB3YXJuaW5nIGluIGxlZ2FjeSBtb2RlLCBiZWNhdXNlIGxlZ2FjeSBTdXNwZW5zZSBpcyB3ZWlyZFxuICAgIC8vIGFuZCBjcmVhdGVzIGZhbHNlIHBvc2l0aXZlcy4gVG8gbWFrZSB0aGlzIHdvcmsgaW4gbGVnYWN5IG1vZGUsIHdlJ2RcbiAgICAvLyBuZWVkIHRvIG1hcmsgZmliZXJzIHRoYXQgY29tbWl0IGluIGFuIGluY29tcGxldGUgc3RhdGUsIHNvbWVob3cuIEZvclxuICAgIC8vIG5vdyBJJ2xsIGRpc2FibGUgdGhlIHdhcm5pbmcgdGhhdCBtb3N0IG9mIHRoZSBidWdzIHRoYXQgd291bGQgdHJpZ2dlclxuICAgIC8vIGl0IGFyZSBlaXRoZXIgZXhjbHVzaXZlIHRvIGNvbmN1cnJlbnQgbW9kZSBvciBleGlzdCBpbiBib3RoLlxuICAgIChjdXJyZW50Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBFeHBlY3RlZCBzdGF0aWMgZmxhZyB3YXMgbWlzc2luZy4gUGxlYXNlICcgKyAnbm90aWZ5IHRoZSBSZWFjdCB0ZWFtLicpO1xuICAgIH1cbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gVGhpcyBpcyByZXNldCBieSBjaGVja0RpZFJlbmRlcklkSG9va1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgaWYgKGRpZFJlbmRlclRvb0Zld0hvb2tzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZW5kZXJlZCBmZXdlciBob29rcyB0aGFuIGV4cGVjdGVkLiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYW4gYWNjaWRlbnRhbCAnICsgJ2Vhcmx5IHJldHVybiBzdGF0ZW1lbnQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5mdW5jdGlvbiBjaGVja0RpZFJlbmRlcklkSG9vaygpIHtcbiAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGV2ZXJ5IHJlbmRlcldpdGhIb29rcyBjYWxsLlxuICAvLyBDb25jZXB0dWFsbHksIGl0J3MgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHJlbmRlcldpdGhIb29rczsgaXQncyBvbmx5IGFcbiAgLy8gc2VwYXJhdGUgZnVuY3Rpb24gdG8gYXZvaWQgdXNpbmcgYW4gYXJyYXkgdHVwbGUuXG4gIHZhciBkaWRSZW5kZXJJZEhvb2sgPSBsb2NhbElkQ291bnRlciAhPT0gMDtcbiAgbG9jYWxJZENvdW50ZXIgPSAwO1xuICByZXR1cm4gZGlkUmVuZGVySWRIb29rO1xufVxuZnVuY3Rpb24gYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBsYW5lcykge1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gcmVzZXQgdGhlIGZsYWdzIGhlcmUsIGJlY2F1c2UgdGhleSdyZSByZXNldCBpbiB0aGVcbiAgLy8gY29tcGxldGUgcGhhc2UgKGJ1YmJsZVByb3BlcnRpZXMpLlxuXG4gIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH4oTW91bnRQYXNzaXZlRGV2IHwgTW91bnRMYXlvdXREZXYgfCBQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICB9XG5cbiAgY3VycmVudC5sYW5lcyA9IHJlbW92ZUxhbmVzKGN1cnJlbnQubGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0SG9va3NBZnRlclRocm93KCkge1xuICAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jZS5cbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIHJlbmRlciBwaGFzZSB1cGRhdGVzLiBUaGVzZSBhcmUgb25seSB2YWxpZCBmb3IgdGhpcyByZW5kZXJcbiAgICAvLyBwaGFzZSwgd2hpY2ggd2UgYXJlIG5vdyBhYm9ydGluZy4gUmVtb3ZlIHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlcyBzb1xuICAgIC8vIHRoZXkgZG8gbm90IHBlcnNpc3QgdG8gdGhlIG5leHQgcmVuZGVyLiBEbyBub3QgcmVtb3ZlIHVwZGF0ZXMgZnJvbSBob29rc1xuICAgIC8vIHRoYXQgd2VyZW4ndCBwcm9jZXNzZWQuXG4gICAgLy9cbiAgICAvLyBPbmx5IHJlc2V0IHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlIGlmIGl0IGhhcyBhIGNsb25lLiBJZiBpdCBkb2VzXG4gICAgLy8gbm90IGhhdmUgYSBjbG9uZSwgdGhhdCBtZWFucyBpdCB3YXNuJ3QgcHJvY2Vzc2VkLCBhbmQgdGhlIHVwZGF0ZXMgd2VyZVxuICAgIC8vIHNjaGVkdWxlZCBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIHZhciBob29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuXG4gICAgd2hpbGUgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaG9vayA9IGhvb2submV4dDtcbiAgICB9XG5cbiAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gIH1cblxuICByZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsO1xuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIHZhciBob29rID0ge1xuICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgYmFzZVN0YXRlOiBudWxsLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3RcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYm90aCBmb3IgdXBkYXRlcyBhbmQgZm9yIHJlLXJlbmRlcnMgdHJpZ2dlcmVkIGJ5IGFcbiAgLy8gcmVuZGVyIHBoYXNlIHVwZGF0ZS4gSXQgYXNzdW1lcyB0aGVyZSBpcyBlaXRoZXIgYSBjdXJyZW50IGhvb2sgd2UgY2FuXG4gIC8vIGNsb25lLCBvciBhIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBmcm9tIGEgcHJldmlvdXMgcmVuZGVyIHBhc3MgdGhhdCB3ZSBjYW5cbiAgLy8gdXNlIGFzIGEgYmFzZS4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBiYXNlIGxpc3QsIHdlIG11c3Qgc3dpdGNoIHRvXG4gIC8vIHRoZSBkaXNwYXRjaGVyIHVzZWQgZm9yIG1vdW50cy5cbiAgdmFyIG5leHRDdXJyZW50SG9vaztcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuXG4gIHZhciBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuICB9IGVsc2Uge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgfVxuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xvbmUgZnJvbSB0aGUgY3VycmVudCBob29rLlxuICAgIGlmIChuZXh0Q3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgbW9yZSBob29rcyB0aGFuIGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICAgIHZhciBuZXdIb29rID0ge1xuICAgICAgbWVtb2l6ZWRTdGF0ZTogY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudEhvb2suYmFzZVN0YXRlLFxuICAgICAgYmFzZVF1ZXVlOiBjdXJyZW50SG9vay5iYXNlUXVldWUsXG4gICAgICBxdWV1ZTogY3VycmVudEhvb2sucXVldWUsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3QuXG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXdIb29rO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gbmV3SG9vaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NIb29rO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCkge1xuICByZXR1cm4ge1xuICAgIGxhc3RFZmZlY3Q6IG51bGwsXG4gICAgc3RvcmVzOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJhc2ljU3RhdGVSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgcmV0dXJuIHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicgPyBhY3Rpb24oc3RhdGUpIDogYWN0aW9uO1xufVxuXG5mdW5jdGlvbiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBpbml0aWFsU3RhdGU7XG5cbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXQoaW5pdGlhbEFyZyk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbEFyZztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSB7XG4gICAgcGVuZGluZzogbnVsbCxcbiAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICBsYW5lczogTm9MYW5lcyxcbiAgICBkaXNwYXRjaDogbnVsbCxcbiAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiByZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoUmVkdWNlckFjdGlvbi5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnQgPSBjdXJyZW50SG9vazsgLy8gVGhlIGxhc3QgcmViYXNlIHVwZGF0ZSB0aGF0IGlzIE5PVCBwYXJ0IG9mIHRoZSBiYXNlIHN0YXRlLlxuXG4gIHZhciBiYXNlUXVldWUgPSBjdXJyZW50LmJhc2VRdWV1ZTsgLy8gVGhlIGxhc3QgcGVuZGluZyB1cGRhdGUgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIG5ldyB1cGRhdGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG4gICAgLy8gV2UnbGwgYWRkIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG4gICAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gTWVyZ2UgdGhlIHBlbmRpbmcgcXVldWUgYW5kIHRoZSBiYXNlIHF1ZXVlLlxuICAgICAgdmFyIGJhc2VGaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgdmFyIHBlbmRpbmdGaXJzdCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgYmFzZVF1ZXVlLm5leHQgPSBwZW5kaW5nRmlyc3Q7XG4gICAgICBwZW5kaW5nUXVldWUubmV4dCA9IGJhc2VGaXJzdDtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3VycmVudC5iYXNlUXVldWUgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAvLyBJbnRlcm5hbCBpbnZhcmlhbnQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZmVhc2libHkgY291bGQgaW5cbiAgICAgICAgLy8gdGhlIGZ1dHVyZSBpZiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcsIG9yIHNvbWUgZm9ybSBvZiB0aGF0LlxuICAgICAgICBlcnJvcignSW50ZXJuYWwgZXJyb3I6IEV4cGVjdGVkIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgdG8gYmUgYSBjbG9uZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnQuYmFzZVF1ZXVlID0gYmFzZVF1ZXVlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgYSBxdWV1ZSB0byBwcm9jZXNzLlxuICAgIHZhciBmaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgIHZhciBuZXdTdGF0ZSA9IGN1cnJlbnQuYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVGaXJzdCA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUxhc3QgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdCYXNlUXVldWVGaXJzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuICAgICAgICAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIGFjY3VtdWxhdGUgdGhpcy4gSW5zdGVhZCwgd2UgY2FuIHJlbW92ZVxuICAgICAgICAvLyByZW5kZXJMYW5lcyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbG9uZSA9IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IF9jbG9uZTtcbiAgICAgICAgfSAvLyBQcm9jZXNzIHRoaXMgdXBkYXRlLlxuXG5cbiAgICAgICAgaWYgKHVwZGF0ZS5oYXNFYWdlclN0YXRlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyB1cGRhdGUgaXMgYSBzdGF0ZSB1cGRhdGUgKG5vdCBhIHJlZHVjZXIpIGFuZCB3YXMgcHJvY2Vzc2VkIGVhZ2VybHksXG4gICAgICAgICAgLy8gd2UgY2FuIHVzZSB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZVxuICAgICAgICAgIG5ld1N0YXRlID0gdXBkYXRlLmVhZ2VyU3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCAmJiB1cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gbmV3QmFzZVF1ZXVlRmlyc3Q7XG4gICAgfSAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgaG9vay5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAvLyBwcm9jZXNzIHRoZW0gZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgd2UgZG8gbmVlZCB0byB0cmFjayB3aGljaCBsYW5lc1xuICAvLyBhcmUgcmVtYWluaW5nLlxuXG5cbiAgdmFyIGxhc3RJbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChsYXN0SW50ZXJsZWF2ZWQgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWRMYW5lID0gaW50ZXJsZWF2ZWQubGFuZTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIGludGVybGVhdmVkTGFuZSk7XG4gICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGludGVybGVhdmVkTGFuZSk7XG4gICAgICBpbnRlcmxlYXZlZCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gIH0gZWxzZSBpZiAoYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gYHF1ZXVlLmxhbmVzYCBpcyB1c2VkIGZvciBlbnRhbmdsaW5nIHRyYW5zaXRpb25zLiBXZSBjYW4gc2V0IGl0IGJhY2sgdG9cbiAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgIHF1ZXVlLmxhbmVzID0gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7IC8vIFRoaXMgaXMgYSByZS1yZW5kZXIuIEFwcGx5IHRoZSBuZXcgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG8gdGhlIHByZXZpb3VzXG4gIC8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgdmFyIGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IHF1ZXVlLnBlbmRpbmc7XG4gIHZhciBuZXdTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobGFzdFJlbmRlclBoYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHF1ZXVlIGRvZXNuJ3QgcGVyc2lzdCBwYXN0IHRoaXMgcmVuZGVyIHBhc3MuXG4gICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgdmFyIGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIC8vIFByb2Nlc3MgdGhpcyByZW5kZXIgcGhhc2UgdXBkYXRlLiBXZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZVxuICAgICAgLy8gcHJpb3JpdHkgYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBhcyB0aGUgY3VycmVudFxuICAgICAgLy8gcmVuZGVyJ3MuXG4gICAgICB2YXIgYWN0aW9uID0gdXBkYXRlLmFjdGlvbjtcbiAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSk7IC8vIE1hcmsgdGhhdCB0aGUgZmliZXIgcGVyZm9ybWVkIHdvcmssIGJ1dCBvbmx5IGlmIHRoZSBuZXcgc3RhdGUgaXNcbiAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS5cblxuXG4gICAgaWYgKCFvYmplY3RJcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSkge1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTsgLy8gRG9uJ3QgcGVyc2lzdCB0aGUgc3RhdGUgYWNjdW11bGF0ZWQgZnJvbSB0aGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG9cbiAgICAvLyB0aGUgYmFzZSBzdGF0ZSB1bmxlc3MgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgIC8vIFRPRE86IE5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGRlc2lyZWQgc2VtYW50aWNzLCBidXQgaXQncyB3aGF0IHdlXG4gICAgLy8gZG8gZm9yIGdEU0ZQLiBJIGNhbid0IHJlbWVtYmVyIHdoeS5cblxuICAgIGlmIChob29rLmJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAgcmV0dXJuIFtuZXdTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiBtb3VudE11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dFNuYXBzaG90O1xuICB2YXIgaXNIeWRyYXRpbmcgPSBnZXRJc0h5ZHJhdGluZygpO1xuXG4gIGlmIChpc0h5ZHJhdGluZykge1xuICAgIGlmIChnZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZ2V0U2VydmVyU25hcHNob3QsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciAnICsgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBXaWxsIHJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLicpO1xuICAgIH1cblxuICAgIG5leHRTbmFwc2hvdCA9IGdldFNlcnZlclNuYXBzaG90KCk7XG5cbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICAgIGlmIChuZXh0U25hcHNob3QgIT09IGdldFNlcnZlclNuYXBzaG90KCkpIHtcbiAgICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTZXJ2ZXJTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICAgIGlmICghb2JqZWN0SXMobmV4dFNuYXBzaG90LCBjYWNoZWRTbmFwc2hvdCkpIHtcbiAgICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suXG4gICAgLy8gUmlnaHQgYmVmb3JlIGNvbW1pdHRpbmcsIHdlIHdpbGwgd2FsayB0aGUgdHJlZSBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZVxuICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuXG4gICAgLy9cbiAgICAvLyBXZSB3b24ndCBkbyB0aGlzIGlmIHdlJ3JlIGh5ZHJhdGluZyBzZXJ2ZXItcmVuZGVyZWQgY29udGVudCwgYmVjYXVzZSBpZlxuICAgIC8vIHRoZSBjb250ZW50IGlzIHN0YWxlLCBpdCdzIGFscmVhZHkgdmlzaWJsZSBhbnl3YXkuIEluc3RlYWQgd2UnbGwgcGF0Y2hcbiAgICAvLyBpdCB1cCBpbiBhIHBhc3NpdmUgZWZmZWN0LlxuXG5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmICghaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICB9XG4gIH0gLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIFRoaXMgYnJlYWtzIHRoZVxuICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90O1xuICB2YXIgaW5zdCA9IHtcbiAgICB2YWx1ZTogbmV4dFNuYXBzaG90LFxuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdFxuICB9O1xuICBob29rLnF1ZXVlID0gaW5zdDsgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmUuXG5cbiAgbW91bnRFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byB1cGRhdGUgdGhlIG11dGFibGUgaW5zdGFuY2UgZmllbGRzLiBXZSB3aWxsIHVwZGF0ZVxuICAvLyB0aGlzIHdoZW5ldmVyIHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIG9yIHZhbHVlIGNoYW5nZXMuIEJlY2F1c2UgdGhlcmUncyBub1xuICAvLyBjbGVhbi11cCBmdW5jdGlvbiwgYW5kIHdlIHRyYWNrIHRoZSBkZXBzIGNvcnJlY3RseSwgd2UgY2FuIGNhbGwgcHVzaEVmZmVjdFxuICAvLyBkaXJlY3RseSwgd2l0aG91dCBzdG9yaW5nIGFueSBhZGRpdGlvbmFsIHN0YXRlLiBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZVxuICAvLyBkb24ndCBuZWVkIHRvIHNldCBhIHN0YXRpYyBmbGFnLCBlaXRoZXIuXG4gIC8vIFRPRE86IFdlIGNhbiBtb3ZlIHRoaXMgdG8gdGhlIHBhc3NpdmUgcGhhc2Ugb25jZSB3ZSBhZGQgYSBwcmUtY29tbWl0XG4gIC8vIGNvbnNpc3RlbmN5IGNoZWNrLiBTZWUgdGhlIG5leHQgY29tbWVudC5cblxuICBmaWJlci5mbGFncyB8PSBQYXNzaXZlO1xuICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTtcbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTsgLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIFRoaXMgYnJlYWtzIHRoZVxuICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG4gIHZhciBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJldlNuYXBzaG90ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICB2YXIgc25hcHNob3RDaGFuZ2VkID0gIW9iamVjdElzKHByZXZTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcblxuICBpZiAoc25hcHNob3RDaGFuZ2VkKSB7XG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90O1xuICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gIH1cblxuICB2YXIgaW5zdCA9IGhvb2sucXVldWU7XG4gIHVwZGF0ZUVmZmVjdChzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIHN1YnNjcmliZSksIFtzdWJzY3JpYmVdKTsgLy8gV2hlbmV2ZXIgZ2V0U25hcHNob3Qgb3Igc3Vic2NyaWJlIGNoYW5nZXMsIHdlIG5lZWQgdG8gY2hlY2sgaW4gdGhlXG4gIC8vIGNvbW1pdCBwaGFzZSBpZiB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgbXV0YXRpb24uIEluIGNvbmN1cnJlbnQgbW9kZVxuICAvLyB0aGlzIGNhbiBoYXBwZW4gYWxsIHRoZSB0aW1lLCBidXQgZXZlbiBpbiBzeW5jaHJvbm91cyBtb2RlLCBhbiBlYXJsaWVyXG4gIC8vIGVmZmVjdCBtYXkgaGF2ZSBtdXRhdGVkIHRoZSBzdG9yZS5cblxuICBpZiAoaW5zdC5nZXRTbmFwc2hvdCAhPT0gZ2V0U25hcHNob3QgfHwgc25hcHNob3RDaGFuZ2VkIHx8IC8vIENoZWNrIGlmIHRoZSBzdXNiY3JpYmUgZnVuY3Rpb24gY2hhbmdlZC4gV2UgY2FuIHNhdmUgc29tZSBtZW1vcnkgYnlcbiAgLy8gY2hlY2tpbmcgd2hldGhlciB3ZSBzY2hlZHVsZWQgYSBzdWJzY3JpcHRpb24gZWZmZWN0IGFib3ZlLlxuICB3b3JrSW5Qcm9ncmVzc0hvb2sgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3NIb29rLm1lbW9pemVkU3RhdGUudGFnICYgSGFzRWZmZWN0KSB7XG4gICAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTsgLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suXG4gICAgLy8gUmlnaHQgYmVmb3JlIGNvbW1pdHRpbmcsIHdlIHdpbGwgd2FsayB0aGUgdHJlZSBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZVxuICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuXG5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmICghaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFNuYXBzaG90O1xufVxuXG5mdW5jdGlvbiBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgcmVuZGVyZWRTbmFwc2hvdCkge1xuICBmaWJlci5mbGFncyB8PSBTdG9yZUNvbnNpc3RlbmN5O1xuICB2YXIgY2hlY2sgPSB7XG4gICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90LFxuICAgIHZhbHVlOiByZW5kZXJlZFNuYXBzaG90XG4gIH07XG4gIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7XG5cbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZSA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlO1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcyA9IFtjaGVja107XG4gIH0gZWxzZSB7XG4gICAgdmFyIHN0b3JlcyA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcztcblxuICAgIGlmIChzdG9yZXMgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcyA9IFtjaGVja107XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3Jlcy5wdXNoKGNoZWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RvcmVJbnN0YW5jZShmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCkge1xuICAvLyBUaGVzZSBhcmUgdXBkYXRlZCBpbiB0aGUgcGFzc2l2ZSBwaGFzZVxuICBpbnN0LnZhbHVlID0gbmV4dFNuYXBzaG90O1xuICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7IC8vIFNvbWV0aGluZyBtYXkgaGF2ZSBiZWVuIG11dGF0ZWQgaW4gYmV0d2VlbiByZW5kZXIgYW5kIGNvbW1pdC4gVGhpcyBjb3VsZFxuICAvLyBoYXZlIGJlZW4gaW4gYW4gZXZlbnQgdGhhdCBmaXJlZCBiZWZvcmUgdGhlIHBhc3NpdmUgZWZmZWN0cywgb3IgaXQgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGEgbGF5b3V0IGVmZmVjdC4gSW4gdGhhdCBjYXNlLCB3ZSB3b3VsZCBoYXZlIHVzZWQgdGhlIG9sZFxuICAvLyBzbmFwc2hvIGFuZCBnZXRTbmFwc2hvdCB2YWx1ZXMgdG8gYmFpbCBvdXQuIFdlIG5lZWQgdG8gY2hlY2sgb25lIG1vcmUgdGltZS5cblxuICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlVG9TdG9yZShmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSB7XG4gIHZhciBoYW5kbGVTdG9yZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGUgc3RvcmUgY2hhbmdlZC4gQ2hlY2sgaWYgdGhlIHNuYXBzaG90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZVxuICAgIC8vIHJlYWQgZnJvbSB0aGUgc3RvcmUuXG4gICAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgICAgZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKTtcbiAgICB9XG4gIH07IC8vIFN1YnNjcmliZSB0byB0aGUgc3RvcmUgYW5kIHJldHVybiBhIGNsZWFuLXVwIGZ1bmN0aW9uLlxuXG5cbiAgcmV0dXJuIHN1YnNjcmliZShoYW5kbGVTdG9yZUNoYW5nZSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkge1xuICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSBpbnN0LmdldFNuYXBzaG90O1xuICB2YXIgcHJldlZhbHVlID0gaW5zdC52YWx1ZTtcblxuICB0cnkge1xuICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgIHJldHVybiAhb2JqZWN0SXMocHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcikge1xuICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlKCk7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICBob29rLnF1ZXVlID0gcXVldWU7XG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2hTZXRTdGF0ZS5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiB1cGRhdGVSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHB1c2hFZmZlY3QodGFnLCBjcmVhdGUsIGRlc3Ryb3ksIGRlcHMpIHtcbiAgdmFyIGVmZmVjdCA9IHtcbiAgICB0YWc6IHRhZyxcbiAgICBjcmVhdGU6IGNyZWF0ZSxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIGRlcHM6IGRlcHMsXG4gICAgLy8gQ2lyY3VsYXJcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7XG5cbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZSA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlO1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFzdEVmZmVjdCA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICBpZiAobGFzdEVmZmVjdCA9PT0gbnVsbCkge1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICBsYXN0RWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgICBlZmZlY3QubmV4dCA9IGZpcnN0RWZmZWN0O1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWZmZWN0O1xufVxuXG5mdW5jdGlvbiBtb3VudFJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIHtcbiAgICB2YXIgX3JlZjIgPSB7XG4gICAgICBjdXJyZW50OiBpbml0aWFsVmFsdWVcbiAgICB9O1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IF9yZWYyO1xuICAgIHJldHVybiBfcmVmMjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHJldHVybiBob29rLm1lbW9pemVkU3RhdGU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIHVuZGVmaW5lZCwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgZGVzdHJveSA9IHVuZGVmaW5lZDtcblxuICBpZiAoY3VycmVudEhvb2sgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldkVmZmVjdCA9IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gICAgZGVzdHJveSA9IHByZXZFZmZlY3QuZGVzdHJveTtcblxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldkVmZmVjdC5kZXBzO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoTW91bnRQYXNzaXZlRGV2IHwgUGFzc2l2ZSB8IFBhc3NpdmVTdGF0aWMsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChQYXNzaXZlLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVmQ2FsbGJhY2sgPSByZWY7XG5cbiAgICB2YXIgX2luc3QgPSBjcmVhdGUoKTtcblxuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuXG4gICAge1xuICAgICAgaWYgKCFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIGZpcnN0IGFyZ3VtZW50IHRvIGVpdGhlciBiZSBhICcgKyAncmVmIGNhbGxiYWNrIG9yIFJlYWN0LmNyZWF0ZVJlZigpIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgJ2FuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhyZWZPYmplY3QpLmpvaW4oJywgJykgKyAnfScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfaW5zdDIgPSBjcmVhdGUoKTtcblxuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICB7XG4gICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gIH1cblxuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gIH1cblxuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIExheW91dCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZWZmZWN0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIExheW91dCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZWZmZWN0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHsvLyBUaGlzIGhvb2sgaXMgbm9ybWFsbHkgYSBuby1vcC5cbiAgLy8gVGhlIHJlYWN0LWRlYnVnLWhvb2tzIHBhY2thZ2UgaW5qZWN0cyBpdHMgb3duIGltcGxlbWVudGF0aW9uXG4gIC8vIHNvIHRoYXQgZS5nLiBEZXZUb29scyBjYW4gZGlzcGxheSBjdXN0b20gaG9vayB2YWx1ZXMuXG59XG5cbnZhciB1cGRhdGVEZWJ1Z1ZhbHVlID0gbW91bnREZWJ1Z1ZhbHVlO1xuXG5mdW5jdGlvbiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gbW91bnRNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEFzc3VtZSB0aGVzZSBhcmUgZGVmaW5lZC4gSWYgdGhleSdyZSBub3QsIGFyZUhvb2tJbnB1dHNFcXVhbCB3aWxsIHdhcm4uXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcmVzb2x2ZWRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rO1xuICB2YXIgcHJldlZhbHVlID0gcmVzb2x2ZWRDdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmIChjdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYSBtb3VudC5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlcmVuZGVyIGR1cmluZyBhbiB1cGRhdGUuXG4gICAgdmFyIHByZXZWYWx1ZSA9IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpIHtcbiAgdmFyIHNob3VsZERlZmVyVmFsdWUgPSAhaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMocmVuZGVyTGFuZXMpO1xuXG4gIGlmIChzaG91bGREZWZlclZhbHVlKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cmdlbnQgdXBkYXRlLiBJZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQsIGtlZXAgdXNpbmcgdGhlXG4gICAgLy8gcHJldmlvdXMgdmFsdWUgYW5kIHNwYXduIGEgZGVmZXJyZWQgcmVuZGVyIHRvIHVwZGF0ZSBpdCBsYXRlci5cbiAgICBpZiAoIW9iamVjdElzKHZhbHVlLCBwcmV2VmFsdWUpKSB7XG4gICAgICAvLyBTY2hlZHVsZSBhIGRlZmVycmVkIHJlbmRlclxuICAgICAgdmFyIGRlZmVycmVkTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBkZWZlcnJlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhkZWZlcnJlZExhbmUpOyAvLyBTZXQgdGhpcyB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlbmRlcmVkIHZhbHVlIGlzIGluY29uc2lzdGVudFxuICAgICAgLy8gZnJvbSB0aGUgbGF0ZXN0IHZhbHVlLiBUaGUgbmFtZSBcImJhc2VTdGF0ZVwiIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZVxuICAgICAgLy8gdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZyBhIHN0YXRlIGhvb2sgZmllbGQgaW5zdGVhZCBvZiBjcmVhdGluZyBhXG4gICAgICAvLyBuZXcgb25lLlxuXG4gICAgICBob29rLmJhc2VTdGF0ZSA9IHRydWU7XG4gICAgfSAvLyBSZXVzZSB0aGUgcHJldmlvdXMgdmFsdWVcblxuXG4gICAgcmV0dXJuIHByZXZWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIG5vdCBhbiB1cmdlbnQgdXBkYXRlLCBzbyB3ZSBjYW4gdXNlIHRoZSBsYXRlc3QgdmFsdWUgcmVnYXJkbGVzc1xuICAgIC8vIG9mIHdoYXQgaXQgaXMuIE5vIG5lZWQgdG8gZGVmZXIgaXQuXG4gICAgLy8gSG93ZXZlciwgaWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhIHNwYXduZWQgcmVuZGVyLCB0aGVuIHdlIG5lZWQgdG8gbWFya1xuICAgIC8vIHRoaXMgYXMgYW4gdXBkYXRlIHRvIHByZXZlbnQgdGhlIGZpYmVyIGZyb20gYmFpbGluZyBvdXQuXG4gICAgLy9cbiAgICAvLyBgYmFzZVN0YXRlYCBpcyB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJlbmRlcmVkXG4gICAgLy8gdmFsdWUuIFRoZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZSB1c2UgaXQgYmVjYXVzZSB3ZSdyZSByZXVzaW5nXG4gICAgLy8gYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmIChob29rLmJhc2VTdGF0ZSkge1xuICAgICAgLy8gRmxpcCB0aGlzIGJhY2sgdG8gZmFsc2UuXG4gICAgICBob29rLmJhc2VTdGF0ZSA9IGZhbHNlO1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNldFBlbmRpbmcsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShoaWdoZXJFdmVudFByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHksIENvbnRpbnVvdXNFdmVudFByaW9yaXR5KSk7XG4gIHNldFBlbmRpbmcodHJ1ZSk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0ge307XG4gIHZhciBjdXJyZW50VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzZXRQZW5kaW5nKGZhbHNlKTtcbiAgICBjYWxsYmFjaygpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFRyYW5zaXRpb24oKSB7XG4gIHZhciBfbW91bnRTdGF0ZSA9IG1vdW50U3RhdGUoZmFsc2UpLFxuICAgICAgaXNQZW5kaW5nID0gX21vdW50U3RhdGVbMF0sXG4gICAgICBzZXRQZW5kaW5nID0gX21vdW50U3RhdGVbMV07IC8vIFRoZSBgc3RhcnRgIG1ldGhvZCBuZXZlciBjaGFuZ2VzLlxuXG5cbiAgdmFyIHN0YXJ0ID0gc3RhcnRUcmFuc2l0aW9uLmJpbmQobnVsbCwgc2V0UGVuZGluZyk7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gc3RhcnQ7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRyYW5zaXRpb24oKSB7XG4gIHZhciBfdXBkYXRlU3RhdGUgPSB1cGRhdGVTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3VwZGF0ZVN0YXRlWzBdO1xuXG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBzdGFydCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJUcmFuc2l0aW9uKCkge1xuICB2YXIgX3JlcmVuZGVyU3RhdGUgPSByZXJlbmRlclN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfcmVyZW5kZXJTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbnZhciBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudElkKCkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7IC8vIFRPRE86IEluIEZpenosIGlkIGdlbmVyYXRpb24gaXMgc3BlY2lmaWMgdG8gZWFjaCBzZXJ2ZXIgY29uZmlnLiBNYXliZSB3ZVxuICAvLyBzaG91bGQgZG8gdGhpcyBpbiBGaWJlciwgdG9vPyBEZWZlcnJpbmcgdGhpcyBkZWNpc2lvbiBmb3Igbm93IGJlY2F1c2VcbiAgLy8gdGhlcmUncyBubyBvdGhlciBwbGFjZSB0byBzdG9yZSB0aGUgcHJlZml4IGV4Y2VwdCBmb3IgYW4gaW50ZXJuYWwgZmllbGQgb25cbiAgLy8gdGhlIHB1YmxpYyBjcmVhdGVSb290IG9iamVjdCwgd2hpY2ggdGhlIGZpYmVyIHRyZWUgZG9lcyBub3QgY3VycmVudGx5IGhhdmVcbiAgLy8gYSByZWZlcmVuY2UgdG8uXG5cbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSByb290LmlkZW50aWZpZXJQcmVmaXg7XG4gIHZhciBpZDtcblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIHZhciB0cmVlSWQgPSBnZXRUcmVlSWQoKTsgLy8gVXNlIGEgY2FwdGlhbCBSIHByZWZpeCBmb3Igc2VydmVyLWdlbmVyYXRlZCBpZHMuXG5cbiAgICBpZCA9ICc6JyArIGlkZW50aWZpZXJQcmVmaXggKyAnUicgKyB0cmVlSWQ7IC8vIFVubGVzcyB0aGlzIGlzIHRoZSBmaXJzdCBpZCBhdCB0aGlzIGxldmVsLCBhcHBlbmQgYSBudW1iZXIgYXQgdGhlIGVuZFxuICAgIC8vIHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhpcyB1c2VJZCBob29rIGFtb25nIGFsbCB0aGUgdXNlSWRcbiAgICAvLyBob29rcyBmb3IgdGhpcyBmaWJlci5cblxuICAgIHZhciBsb2NhbElkID0gbG9jYWxJZENvdW50ZXIrKztcblxuICAgIGlmIChsb2NhbElkID4gMCkge1xuICAgICAgaWQgKz0gJ0gnICsgbG9jYWxJZC50b1N0cmluZygzMik7XG4gICAgfVxuXG4gICAgaWQgKz0gJzonO1xuICB9IGVsc2Uge1xuICAgIC8vIFVzZSBhIGxvd2VyY2FzZSByIHByZWZpeCBmb3IgY2xpZW50LWdlbmVyYXRlZCBpZHMuXG4gICAgdmFyIGdsb2JhbENsaWVudElkID0gZ2xvYmFsQ2xpZW50SWRDb3VudGVyKys7XG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ3InICsgZ2xvYmFsQ2xpZW50SWQudG9TdHJpbmcoMzIpICsgJzonO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaWQ7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSWQoKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBpZCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFJlZHVjZXJBY3Rpb24oZmliZXIsIHF1ZXVlLCBhY3Rpb24pIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcihcIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlIFwiICsgJ3NlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyICcgKyAncmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIHRoZSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGxhbmU6IGxhbmUsXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgaGFzRWFnZXJTdGF0ZTogZmFsc2UsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpKSB7XG4gICAgZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIGVucXVldWVVcGRhdGUkMShmaWJlciwgcXVldWUsIHVwZGF0ZSk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgcm9vdCA9IHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hTZXRTdGF0ZShmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBoYXNFYWdlclN0YXRlOiBmYWxzZSxcbiAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIHtcbiAgICBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgZW5xdWV1ZVVwZGF0ZSQxKGZpYmVyLCBxdWV1ZSwgdXBkYXRlKTtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5oYXNFYWdlclN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICB1cGRhdGUuZWFnZXJTdGF0ZSA9IGVhZ2VyU3RhdGU7XG5cbiAgICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgICAgICAgLy8gRmFzdCBwYXRoLiBXZSBjYW4gYmFpbCBvdXQgd2l0aG91dCBzY2hlZHVsaW5nIFJlYWN0IHRvIHJlLXJlbmRlci5cbiAgICAgICAgICAgIC8vIEl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlYmFzZSB0aGlzIHVwZGF0ZSBsYXRlcixcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgcmUtcmVuZGVycyBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIGFuZCBieSB0aGF0XG4gICAgICAgICAgICAvLyB0aW1lIHRoZSByZWR1Y2VyIGhhcyBjaGFuZ2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsvLyBTdXBwcmVzcyB0aGUgZXJyb3IuIEl0IHdpbGwgdGhyb3cgYWdhaW4gaW4gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIHJvb3QgPSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKTtcbiAgICB9XG4gIH1cblxuICBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgcmV0dXJuIGZpYmVyID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKSB7XG4gIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBTdGFzaCBpdCBpbiBhIGxhemlseS1jcmVhdGVkIG1hcCBvZlxuICAvLyBxdWV1ZSAtPiBsaW5rZWQgbGlzdCBvZiB1cGRhdGVzLiBBZnRlciB0aGlzIHJlbmRlciBwYXNzLCB3ZSdsbCByZXN0YXJ0XG4gIC8vIGFuZCBhcHBseSB0aGUgc3Rhc2hlZCB1cGRhdGVzIG9uIHRvcCBvZiB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLlxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gdHJ1ZTtcbiAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUkMShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICBpZiAoaXNJbnRlcmxlYXZlZFVwZGF0ZShmaWJlcikpIHtcbiAgICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICAgIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgICAgcHVzaEludGVybGVhdmVkUXVldWUocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHZhciBwZW5kaW5nID0gcXVldWUucGVuZGluZztcblxuICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgfVxuXG4gICAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpIHtcbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5XG4gICAgLy8gbXVzdCBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaFxuICAgIC8vIHJlcHJlc2VudHMgYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZVxuICAgIC8vIG1heSBlbnRhbmdsZSBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmXG4gICAgLy8gd2UgKmRvbid0KiBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgcXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUsIGFjdGlvbikge1xuXG4gIHtcbiAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICB9XG59XG5cbnZhciBDb250ZXh0T25seURpc3BhdGNoZXIgPSB7XG4gIHJlYWRDb250ZXh0OiByZWFkQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2s6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlQ29udGV4dDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJbnNlcnRpb25FZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTGF5b3V0RWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTXV0YWJsZVNvdXJjZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJZDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbn07XG5cbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICB9O1xuXG4gIHZhciB3YXJuSW52YWxpZEhvb2tBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0RvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gJyArICdZb3UgY2FuIG9ubHkgY2FsbCBIb29rcyBhdCB0aGUgdG9wIGxldmVsIG9mIHlvdXIgUmVhY3QgZnVuY3Rpb24uICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rcycpO1xuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xufVxuXG52YXIgbm93JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfbm93O1xudmFyIGNvbW1pdFRpbWUgPSAwO1xudmFyIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xO1xudmFyIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG52YXIgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xO1xuLyoqXG4gKiBUcmFja3Mgd2hldGhlciB0aGUgY3VycmVudCB1cGRhdGUgd2FzIGEgbmVzdGVkL2Nhc2NhZGluZyB1cGRhdGUgKHNjaGVkdWxlZCBmcm9tIGEgbGF5b3V0IGVmZmVjdCkuXG4gKlxuICogVGhlIG92ZXJhbGwgc2VxdWVuY2UgaXM6XG4gKiAgIDEuIHJlbmRlclxuICogICAyLiBjb21taXQgKGFuZCBjYWxsIGBvblJlbmRlcmAsIGBvbkNvbW1pdGApXG4gKiAgIDMuIGNoZWNrIGZvciBuZXN0ZWQgdXBkYXRlc1xuICogICA0LiBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgKGFuZCBjYWxsIGBvblBvc3RDb21taXRgKVxuICpcbiAqIE5lc3RlZCB1cGRhdGVzIGFyZSBpZGVudGlmaWVkIGluIHN0ZXAgMyBhYm92ZSxcbiAqIGJ1dCBzdGVwIDQgc3RpbGwgYXBwbGllcyB0byB0aGUgd29yayB0aGF0IHdhcyBqdXN0IGNvbW1pdHRlZC5cbiAqIFdlIHVzZSB0d28gZmxhZ3MgdG8gdHJhY2sgbmVzdGVkIHVwZGF0ZXMgdGhlbjpcbiAqIG9uZSB0cmFja3Mgd2hldGhlciB0aGUgdXBjb21pbmcgdXBkYXRlIGlzIGEgbmVzdGVkIHVwZGF0ZSxcbiAqIGFuZCB0aGUgb3RoZXIgdHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZCB1cGRhdGUuXG4gKiBUaGUgZmlyc3QgdmFsdWUgZ2V0cyBzeW5jZWQgdG8gdGhlIHNlY29uZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlbmRlciBwaGFzZS5cbiAqL1xuXG52YXIgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7XG52YXIgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRVcGRhdGVJc05lc3RlZDtcbn1cblxuZnVuY3Rpb24gbWFya05lc3RlZFVwZGF0ZVNjaGVkdWxlZCgpIHtcbiAge1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3luY05lc3RlZFVwZGF0ZUZsYWcoKSB7XG4gIHtcbiAgICBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQ7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q29tbWl0VGltZSgpIHtcbiAgcmV0dXJuIGNvbW1pdFRpbWU7XG59XG5cbmZ1bmN0aW9uIHJlY29yZENvbW1pdFRpbWUoKSB7XG5cbiAgY29tbWl0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0UHJvZmlsZXJUaW1lcihmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gbm93JDEoKTtcblxuICBpZiAoZmliZXIuYWN0dWFsU3RhcnRUaW1lIDwgMCkge1xuICAgIGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA9IG5vdyQxKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGZpYmVyLCBvdmVycmlkZUJhc2VUaW1lKSB7XG5cbiAgaWYgKHByb2ZpbGVyU3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gcHJvZmlsZXJTdGFydFRpbWU7XG4gICAgZmliZXIuYWN0dWFsRHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG5cbiAgICBpZiAob3ZlcnJpZGVCYXNlVGltZSkge1xuICAgICAgZmliZXIuc2VsZkJhc2VEdXJhdGlvbiA9IGVsYXBzZWRUaW1lO1xuICAgIH1cblxuICAgIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAobGF5b3V0RWZmZWN0U3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gbGF5b3V0RWZmZWN0U3RhcnRUaW1lO1xuICAgIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICByb290LmVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcGFyZW50U3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaWJlcikge1xuXG4gIGlmIChwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZTtcbiAgICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gLTE7IC8vIFN0b3JlIGR1cmF0aW9uIG9uIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3JcbiAgICAvLyBPciB0aGUgcm9vdCAoZm9yIHRoZSBEZXZUb29scyBQcm9maWxlciB0byByZWFkKVxuXG4gICAgdmFyIHBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAgd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAocGFyZW50U3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBEZXRhY2hlZCBmaWJlcnMgaGF2ZSB0aGVpciBzdGF0ZSBub2RlIGNsZWFyZWQgb3V0LlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuIHBvaW50ZXIgaXMgYWxzbyBjbGVhcmVkIG91dCxcbiAgICAgICAgICAgIC8vIHNvIHdlIHdvbid0IGJlIGFibGUgdG8gcmVwb3J0IHRoZSB0aW1lIHNwZW50IGluIHRoaXMgUHJvZmlsZXIncyBzdWJ0cmVlLlxuICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydExheW91dEVmZmVjdFRpbWVyKCkge1xuXG4gIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCkge1xuXG4gIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKGZpYmVyKSB7XG4gIC8vIFRyYW5zZmVyIHRpbWUgc3BlbnQgcmVuZGVyaW5nIHRoZXNlIGNoaWxkcmVuIHNvIHdlIGRvbid0IGxvc2UgaXRcbiAgLy8gYWZ0ZXIgd2UgcmVyZW5kZXIuIFRoaXMgaXMgdXNlZCBhcyBhIGhlbHBlciBpbiBzcGVjaWFsIGNhc2VzXG4gIC8vIHdoZXJlIHdlIHNob3VsZCBjb3VudCB0aGUgd29yayBvZiBtdWx0aXBsZSBwYXNzZXMuXG4gIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpXG4gIH07XG59XG5cbi8vIFRoaXMgbW9kdWxlIGlzIGZvcmtlZCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuLy8gQnkgZGVmYXVsdCwgcmV0dXJuIGB0cnVlYCB0byBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlLlxuLy8gRm9ya3MgY2FuIHJldHVybiBgZmFsc2VgIGlmIHRoaXMgaXNuJ3QgZGVzaXJhYmxlLlxuZnVuY3Rpb24gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxvZ0NhcHR1cmVkRXJyb3IoYm91bmRhcnksIGVycm9ySW5mbykge1xuICB0cnkge1xuICAgIHZhciBsb2dFcnJvciA9IHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKTsgLy8gQWxsb3cgaW5qZWN0ZWQgc2hvd0Vycm9yRGlhbG9nKCkgdG8gcHJldmVudCBkZWZhdWx0IGNvbnNvbGUuZXJyb3IgbG9nZ2luZy5cbiAgICAvLyBUaGlzIGVuYWJsZXMgcmVuZGVyZXJzIGxpa2UgUmVhY3ROYXRpdmUgdG8gYmV0dGVyIG1hbmFnZSByZWRib3ggYmVoYXZpb3IuXG5cbiAgICBpZiAobG9nRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgaWYgKHRydWUpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBlcnJvckluZm8uc291cmNlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnOyAvLyBCcm93c2VycyBzdXBwb3J0IHNpbGVuY2luZyB1bmNhdWdodCBlcnJvcnMgYnkgY2FsbGluZ1xuICAgICAgLy8gYHByZXZlbnREZWZhdWx0KClgIGluIHdpbmRvdyBgZXJyb3JgIGhhbmRsZXIuXG4gICAgICAvLyBXZSByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbiBhcyBhbiBleHBhbmRvIG9uIHRoZSBlcnJvci5cblxuICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICBpZiAoYm91bmRhcnkudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBpcyByZWNvdmVyYWJsZSBhbmQgd2FzIHNpbGVuY2VkLlxuICAgICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuICAgICAgICAgIC8vIFRoaXMgaXMgaGFuZHkgZm9yIHRlc3RpbmcgZXJyb3IgYm91bmRhcmllcyB3aXRob3V0IG5vaXNlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBUaGUgZXJyb3IgaXMgZmF0YWwuIFNpbmNlIHRoZSBzaWxlbmNpbmcgbWlnaHQgaGF2ZVxuICAgICAgICAvLyBiZWVuIGFjY2lkZW50YWwsIHdlJ2xsIHN1cmZhY2UgaXQgYW55d2F5LlxuICAgICAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3NlciB3b3VsZCBoYXZlIHNpbGVuY2VkIHRoZSBvcmlnaW5hbCBlcnJvclxuICAgICAgICAvLyBzbyB3ZSdsbCBwcmludCBpdCBmaXJzdCwgYW5kIHRoZW4gcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuXG5cbiAgICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgICAgICAvLyBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgYmxvY2ssIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTMzODRcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBzb3VyY2UgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHNvdXJjZSkgOiBudWxsO1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWVNZXNzYWdlID0gY29tcG9uZW50TmFtZSA/IFwiVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIHRoZSA8XCIgKyBjb21wb25lbnROYW1lICsgXCI+IGNvbXBvbmVudDpcIiA6ICdUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gb25lIG9mIHlvdXIgUmVhY3QgY29tcG9uZW50czonO1xuICAgICAgdmFyIGVycm9yQm91bmRhcnlNZXNzYWdlO1xuXG4gICAgICBpZiAoYm91bmRhcnkudGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9ICdDb25zaWRlciBhZGRpbmcgYW4gZXJyb3IgYm91bmRhcnkgdG8geW91ciB0cmVlIHRvIGN1c3RvbWl6ZSBlcnJvciBoYW5kbGluZyBiZWhhdmlvci5cXG4nICsgJ1Zpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9lcnJvci1ib3VuZGFyaWVzIHRvIGxlYXJuIG1vcmUgYWJvdXQgZXJyb3IgYm91bmRhcmllcy4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVycm9yQm91bmRhcnlOYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihib3VuZGFyeSkgfHwgJ0Fub255bW91cyc7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gXCJSZWFjdCB3aWxsIHRyeSB0byByZWNyZWF0ZSB0aGlzIGNvbXBvbmVudCB0cmVlIGZyb20gc2NyYXRjaCBcIiArIChcInVzaW5nIHRoZSBlcnJvciBib3VuZGFyeSB5b3UgcHJvdmlkZWQsIFwiICsgZXJyb3JCb3VuZGFyeU5hbWUgKyBcIi5cIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21iaW5lZE1lc3NhZ2UgPSBjb21wb25lbnROYW1lTWVzc2FnZSArIFwiXFxuXCIgKyBjb21wb25lbnRTdGFjayArIFwiXFxuXFxuXCIgKyAoXCJcIiArIGVycm9yQm91bmRhcnlNZXNzYWdlKTsgLy8gSW4gZGV2ZWxvcG1lbnQsIHdlIHByb3ZpZGUgb3VyIG93biBtZXNzYWdlIHdpdGgganVzdCB0aGUgY29tcG9uZW50IHN0YWNrLlxuICAgICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZSBhbmQgSlMgc3RhY2sgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgICAgLy8gaGFzIGFscmVhZHkgcHJpbnRlZCBpdC4gRXZlbiBpZiB0aGUgYXBwbGljYXRpb24gc3dhbGxvd3MgdGhlIGVycm9yLCBpdCBpcyBzdGlsbFxuICAgICAgLy8gZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIHRoYW5rcyB0byB0aGUgREVWLW9ubHkgZmFrZSBldmVudCB0cmljayBpbiBSZWFjdEVycm9yVXRpbHMuXG5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oY29tYmluZWRNZXNzYWdlKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIHByb2R1Y3Rpb24sIHdlIHByaW50IHRoZSBlcnJvciBkaXJlY3RseS5cbiAgICAgIC8vIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBtZXNzYWdlLCB0aGUgSlMgc3RhY2ssIGFuZCBhbnl0aGluZyB0aGUgYnJvd3NlciB3YW50cyB0byBzaG93LlxuICAgICAgLy8gV2UgcGFzcyB0aGUgZXJyb3Igb2JqZWN0IGluc3RlYWQgb2YgY3VzdG9tIG1lc3NhZ2Ugc28gdGhhdCB0aGUgYnJvd3NlciBkaXNwbGF5cyB0aGUgZXJyb3IgbmF0aXZlbHkuXG4gICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFBvc3NpYmx5V2Vha01hcCQxID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuXG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cblxuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogbnVsbFxuICB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7XG4gICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIHVwZGF0ZS5wYXlsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvciQxKTtcbiAgICB9O1xuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAge1xuICAgICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gIGlmIChpbnN0ICE9PSBudWxsICYmIHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcblxuICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhlIHByZWV4aXN0aW5nIHJldHJ5IGJlaGF2aW9yIG9mIGVycm9yIGJvdW5kYXJpZXMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb25lcyBhbHJlYWR5IGZhaWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLlxuICAgICAgICAvLyBUT0RPOiBXYXJuIGluIHN0cmljdCBtb2RlIGlmIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpc1xuICAgICAgICAvLyBub3QgZGVmaW5lZC5cbiAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB0aGlzLmNvbXBvbmVudERpZENhdGNoKGVycm9yJDEsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJ1xuICAgICAgfSk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBJZiBjb21wb25lbnREaWRDYXRjaCBpcyB0aGUgb25seSBlcnJvciBib3VuZGFyeSBtZXRob2QgZGVmaW5lZCxcbiAgICAgICAgICAvLyB0aGVuIGl0IG5lZWRzIHRvIGNhbGwgc2V0U3RhdGUgdG8gcmVjb3ZlciBmcm9tIGVycm9ycy5cbiAgICAgICAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgaXMgc2NoZWR1bGVkIHRoZW4gdGhlIGJvdW5kYXJ5IHdpbGwgc3dhbGxvdyB0aGUgZXJyb3IuXG4gICAgICAgICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGZpYmVyLmxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAgICAgICAgIGVycm9yKCclczogRXJyb3IgYm91bmRhcmllcyBzaG91bGQgaW1wbGVtZW50IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpLiAnICsgJ0luIHRoYXQgbWV0aG9kLCByZXR1cm4gYSBzdGF0ZSB1cGRhdGUgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIG9yIGZhbGxiYWNrIFVJLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gQXR0YWNoIGEgcGluZyBsaXN0ZW5lclxuICAvL1xuICAvLyBUaGUgZGF0YSBtaWdodCByZXNvbHZlIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIGNvbW1pdCB0aGUgZmFsbGJhY2suIE9yLFxuICAvLyBpbiB0aGUgY2FzZSBvZiBhIHJlZnJlc2gsIHdlJ2xsIG5ldmVyIGNvbW1pdCBhIGZhbGxiYWNrLiBTbyB3ZSBuZWVkIHRvXG4gIC8vIGF0dGFjaCBhIGxpc3RlbmVyIG5vdy4gV2hlbiBpdCByZXNvbHZlcyAoXCJwaW5nc1wiKSwgd2UgY2FuIGRlY2lkZSB3aGV0aGVyIHRvXG4gIC8vIHRyeSByZW5kZXJpbmcgdGhlIHRyZWUgYWdhaW4uXG4gIC8vXG4gIC8vIE9ubHkgYXR0YWNoIGEgbGlzdGVuZXIgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBsYW5lc1xuICAvLyB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nICh3aGljaCBhY3RzIGxpa2UgYSBcInRocmVhZCBJRFwiIGhlcmUpLlxuICAvL1xuICAvLyBXZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXNcbiAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLlxuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG4gIHZhciB0aHJlYWRJRHM7XG5cbiAgaWYgKHBpbmdDYWNoZSA9PT0gbnVsbCkge1xuICAgIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCQxKCk7XG4gICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyZWFkSURzID0gcGluZ0NhY2hlLmdldCh3YWtlYWJsZSk7XG5cbiAgICBpZiAodGhyZWFkSURzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTtcbiAgICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aHJlYWRJRHMuaGFzKGxhbmVzKSkge1xuICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIHRocmVhZCBJRCB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgdGhyZWFkSURzLmFkZChsYW5lcyk7XG4gICAgdmFyIHBpbmcgPSBwaW5nU3VzcGVuZGVkUm9vdC5iaW5kKG51bGwsIHJvb3QsIHdha2VhYmxlLCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzXG4gICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdha2VhYmxlLnRoZW4ocGluZywgcGluZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoUmV0cnlMaXN0ZW5lcihzdXNwZW5zZUJvdW5kYXJ5LCByb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gUmV0cnkgbGlzdGVuZXJcbiAgLy9cbiAgLy8gSWYgdGhlIGZhbGxiYWNrIGRvZXMgY29tbWl0LCB3ZSBuZWVkIHRvIGF0dGFjaCBhIGRpZmZlcmVudCB0eXBlIG9mXG4gIC8vIGxpc3RlbmVyLiBUaGlzIG9uZSBzY2hlZHVsZXMgYW4gdXBkYXRlIG9uIHRoZSBTdXNwZW5zZSBib3VuZGFyeSB0byB0dXJuXG4gIC8vIHRoZSBmYWxsYmFjayBzdGF0ZSBvZmYuXG4gIC8vXG4gIC8vIFN0YXNoIHRoZSB3YWtlYWJsZSBvbiB0aGUgYm91bmRhcnkgZmliZXIgc28gd2UgY2FuIGFjY2VzcyBpdCBpbiB0aGVcbiAgLy8gY29tbWl0IHBoYXNlLlxuICAvL1xuICAvLyBXaGVuIHRoZSB3YWtlYWJsZSByZXNvbHZlcywgd2UnbGwgYXR0ZW1wdCB0byByZW5kZXIgdGhlIGJvdW5kYXJ5XG4gIC8vIGFnYWluIChcInJldHJ5XCIpLlxuICB2YXIgd2FrZWFibGVzID0gc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZTtcblxuICBpZiAod2FrZWFibGVzID09PSBudWxsKSB7XG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gbmV3IFNldCgpO1xuICAgIHVwZGF0ZVF1ZXVlLmFkZCh3YWtlYWJsZSk7XG4gICAgc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICB9IGVsc2Uge1xuICAgIHdha2VhYmxlcy5hZGQod2FrZWFibGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gQSBsZWdhY3kgbW9kZSBTdXNwZW5zZSBxdWlyaywgb25seSByZWxldmFudCB0byBob29rIGNvbXBvbmVudHMuXG5cblxuICB2YXIgdGFnID0gc291cmNlRmliZXIudGFnO1xuXG4gIGlmICgoc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmICh0YWcgPT09IEZ1bmN0aW9uQ29tcG9uZW50IHx8IHRhZyA9PT0gRm9yd2FyZFJlZiB8fCB0YWcgPT09IFNpbXBsZU1lbW9Db21wb25lbnQpKSB7XG4gICAgdmFyIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudFNvdXJjZSkge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBjdXJyZW50U291cmNlLnVwZGF0ZVF1ZXVlO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gY3VycmVudFNvdXJjZS5sYW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKSB7XG4gIHZhciBub2RlID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IC8vIFRoaXMgYm91bmRhcnkgYWxyZWFkeSBjYXB0dXJlZCBkdXJpbmcgdGhpcyByZW5kZXIuIENvbnRpbnVlIHRvIHRoZSBuZXh0XG4gICAgLy8gYm91bmRhcnkuXG5cblxuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShzdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIG1hcmtzIGEgU3VzcGVuc2UgYm91bmRhcnkgc28gdGhhdCB3aGVuIHdlJ3JlIHVud2luZGluZyB0aGUgc3RhY2ssXG4gIC8vIGl0IGNhcHR1cmVzIHRoZSBzdXNwZW5kZWQgXCJleGNlcHRpb25cIiBhbmQgZG9lcyBhIHNlY29uZCAoZmFsbGJhY2spIHBhc3MuXG4gIGlmICgoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAvLyBMZWdhY3kgTW9kZSBTdXNwZW5zZVxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGJvdW5kYXJ5IGlzIGluIGxlZ2FjeSBtb2RlLCB3ZSBzaG91bGQgKm5vdCpcbiAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWRcbiAgICAvLyBudWxsIGFuZCBrZWVwIHJlbmRlcmluZy4gV2hlbiB0aGUgU3VzcGVuc2UgYm91bmRhcnkgY29tcGxldGVzLFxuICAgIC8vIHdlJ2xsIGRvIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIHRoZSBmYWxsYmFjay5cbiAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSA9PT0gcmV0dXJuRmliZXIpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBzdXNwZW5kZWQgd2hpbGUgcmVjb25jaWxpbmcgdGhlIGNoaWxkcmVuIG9mXG4gICAgICAvLyBhIFN1c3BlbnNlIGJvdW5kYXJ5J3MgaW5uZXIgT2Zmc2NyZWVuIHdyYXBwZXIgZmliZXIuIFRoaXMgaGFwcGVuc1xuICAgICAgLy8gd2hlbiBhIFJlYWN0LmxhenkgY29tcG9uZW50IGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFcbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgICAgLy9cbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJpZXMgYXJlIGltcGxlbWVudGVkIGFzIG11bHRpcGxlIGZpYmVycywgYnV0IHRoZXlcbiAgICAgIC8vIGFyZSBhIHNpbmdsZSBjb25jZXB0dWFsIHVuaXQuIFRoZSBsZWdhY3kgbW9kZSBiZWhhdmlvciB3aGVyZSB3ZVxuICAgICAgLy8gcHJldGVuZCB0aGUgc3VzcGVuZGVkIGZpYmVyIGNvbW1pdHRlZCBhcyBgbnVsbGAgd29uJ3Qgd29yayxcbiAgICAgIC8vIGJlY2F1c2UgaW4gdGhpcyBjYXNlIHRoZSBcInN1c3BlbmRlZFwiIGZpYmVyIGlzIHRoZSBpbm5lclxuICAgICAgLy8gT2Zmc2NyZWVuIHdyYXBwZXIuXG4gICAgICAvL1xuICAgICAgLy8gQmVjYXVzZSB0aGUgY29udGVudHMgb2YgdGhlIGJvdW5kYXJ5IGhhdmVuJ3Qgc3RhcnRlZCByZW5kZXJpbmdcbiAgICAgIC8vIHlldCAoaS5lLiBub3RoaW5nIGluIHRoZSB0cmVlIGhhcyBwYXJ0aWFsbHkgcmVuZGVyZWQpIHdlIGNhblxuICAgICAgLy8gc3dpdGNoIHRvIHRoZSByZWd1bGFyLCBjb25jdXJyZW50IG1vZGUgYmVoYXZpb3I6IG1hcmsgdGhlXG4gICAgICAvLyBib3VuZGFyeSB3aXRoIFNob3VsZENhcHR1cmUgYW5kIGVudGVyIHRoZSB1bndpbmQgcGhhc2UuXG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2U7IC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgIC8vIEJ1dCB3ZSBzaG91bGRuJ3QgY2FsbCBhbnkgbGlmZWN5Y2xlIG1ldGhvZHMgb3IgY2FsbGJhY2tzLiBSZW1vdmVcbiAgICAgIC8vIGFsbCBsaWZlY3ljbGUgZWZmZWN0IHRhZ3MuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzICY9IH4oTGlmZWN5Y2xlRWZmZWN0TWFzayB8IEluY29tcGxldGUpO1xuXG4gICAgICBpZiAoc291cmNlRmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICB2YXIgY3VycmVudFNvdXJjZUZpYmVyID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50LiBDaGFuZ2UgdGhlIHRhZyBzbyBpdCdzIG5vdCBtaXN0YWtlbiBmb3IgYVxuICAgICAgICAgIC8vIGNvbXBsZXRlZCBjbGFzcyBjb21wb25lbnQuIEZvciBleGFtcGxlLCB3ZSBzaG91bGQgbm90IGNhbGxcbiAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgIHNvdXJjZUZpYmVyLnRhZyA9IEluY29tcGxldGVDbGFzc0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgLy8gc2luY2UgaXQncyBrbm93biB0byBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFVzZSBhIGZvcmNlIHVwZGF0ZSB0b1xuICAgICAgICAgIC8vIHByZXZlbnQgYSBiYWlsIG91dC5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBTeW5jTGFuZSk7XG4gICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuICAgICAgICAgIGVucXVldWVVcGRhdGUoc291cmNlRmliZXIsIHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLiBNYXJrIGl0IHdpdGggU3luYyBwcmlvcml0eSB0b1xuICAgICAgLy8gaW5kaWNhdGUgdGhhdCBpdCBzdGlsbCBoYXMgcGVuZGluZyB3b3JrLlxuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xuICB9IC8vIENvbmZpcm1lZCB0aGF0IHRoZSBib3VuZGFyeSBpcyBpbiBhIGNvbmN1cnJlbnQgbW9kZSB0cmVlLiBDb250aW51ZVxuICAvLyB3aXRoIHRoZSBub3JtYWwgc3VzcGVuZCBwYXRoLlxuICAvL1xuICAvLyBBZnRlciB0aGlzIHdlJ2xsIHVzZSBhIHNldCBvZiBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXNcbiAgLy8gcmVuZGVyIHBhc3Mgd2lsbCBydW4gdG8gY29tcGxldGlvbiBvciByZXN0YXJ0IG9yIFwic3VzcGVuZFwiIHRoZSBjb21taXQuXG4gIC8vIFRoZSBhY3R1YWwgbG9naWMgZm9yIHRoaXMgaXMgc3ByZWFkIG91dCBpbiBkaWZmZXJlbnQgcGxhY2VzLlxuICAvL1xuICAvLyBUaGlzIGZpcnN0IHByaW5jaXBsZSBpcyB0aGF0IGlmIHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2hlbiB3ZSBjb21wbGV0ZVxuICAvLyBhIHJvb3QsIHRoZW4gd2Ugc2hvdWxkIGFsc28gcmVzdGFydCBpZiB3ZSBnZXQgYW4gdXBkYXRlIG9yIHBpbmcgdGhhdFxuICAvLyBtaWdodCB1bnN1c3BlbmQgaXQsIGFuZCB2aWNlIHZlcnNhLiBUaGUgb25seSByZWFzb24gdG8gc3VzcGVuZCBpc1xuICAvLyBiZWNhdXNlIHlvdSB0aGluayB5b3UgbWlnaHQgd2FudCB0byByZXN0YXJ0IGJlZm9yZSBjb21taXR0aW5nLiBIb3dldmVyLFxuICAvLyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVzdGFydCBvbmx5IHdoaWxlIGluIHRoZSBwZXJpb2Qgd2UncmUgc3VzcGVuZGVkLlxuICAvL1xuICAvLyBSZXN0YXJ0aW5nIHRvbyBhZ2dyZXNzaXZlbHkgaXMgYWxzbyBub3QgZ29vZCBiZWNhdXNlIGl0IHN0YXJ2ZXMgb3V0IGFueVxuICAvLyBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gU28gd2UgdXNlIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZW4uXG4gIC8vIFN1c3BlbnNlIEhldXJpc3RpY3NcbiAgLy9cbiAgLy8gSWYgbm90aGluZyB0aHJldyBhIFByb21pc2Ugb3IgYWxsIHRoZSBzYW1lIGZhbGxiYWNrcyBhcmUgYWxyZWFkeSBzaG93aW5nLFxuICAvLyB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBhbiBpbml0aWFsIHJlbmRlciBvZiBhIG5ldyB0cmVlIG9mIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gIC8vIHRob3NlIHRyaWdnZXIgYSBmYWxsYmFjaywgdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgY2FuIHNob3cgdGhlIGluaXRpYWwgbG9hZGluZyBzdGF0ZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLlxuICAvL1xuICAvLyBJZiB3ZSBoaXQgYSBcIkRlbGF5ZWRcIiBjYXNlLCBzdWNoIGFzIHdoZW4gd2UnZCBzd2l0Y2ggZnJvbSBjb250ZW50IGJhY2sgaW50b1xuICAvLyBhIGZhbGxiYWNrLCB0aGVuIHdlIHNob3VsZCBhbHdheXMgc3VzcGVuZC9yZXN0YXJ0LiBUcmFuc2l0aW9ucyBhcHBseVxuICAvLyB0byB0aGlzIGNhc2UuIElmIG5vbmUgaXMgZGVmaW5lZCwgSk5EIGlzIHVzZWQgaW5zdGVhZC5cbiAgLy9cbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgYW5kIGl0IGdldHMgXCJyZXRyaWVkXCIsIGFsbG93aW5nIHVzIHRvIHNob3dcbiAgLy8gYW5vdGhlciBsZXZlbCwgYnV0IHRoZXJlJ3Mgc3RpbGwgYW4gaW5uZXIgYm91bmRhcnkgdGhhdCB3b3VsZCBzaG93IGEgZmFsbGJhY2ssXG4gIC8vIHRoZW4gd2Ugc3VzcGVuZC9yZXN0YXJ0IGZvciA1MDBtcyBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNob3dlZCBhIGZhbGxiYWNrXG4gIC8vIGFueXdoZXJlIGluIHRoZSB0cmVlLiBUaGlzIGVmZmVjdGl2ZWx5IHRocm90dGxlcyBwcm9ncmVzc2l2ZSBsb2FkaW5nIGludG8gYVxuICAvLyBjb25zaXN0ZW50IHRyYWluIG9mIGNvbW1pdHMuIFRoaXMgYWxzbyBnaXZlcyB1cyBhbiBvcHBvcnR1bml0eSB0byByZXN0YXJ0IHRvXG4gIC8vIGdldCB0byB0aGUgY29tcGxldGVkIHN0YXRlIHNsaWdodGx5IGVhcmxpZXIuXG4gIC8vXG4gIC8vIElmIHRoZXJlJ3MgYW1iaWd1aXR5IGR1ZSB0byBiYXRjaGluZyBpdCdzIHJlc29sdmVkIGluIHByZWZlcmVuY2Ugb2Y6XG4gIC8vIDEpIFwiZGVsYXllZFwiLCAyKSBcImluaXRpYWwgcmVuZGVyXCIsIDMpIFwicmV0cnlcIi5cbiAgLy9cbiAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCBhIFwiYnVzeVwiIHN0YXRlIGRvZXNuJ3QgZ2V0IGZvcmNlIGNvbW1pdHRlZC4gV2Ugd2FudCB0b1xuICAvLyBlbnN1cmUgdGhhdCBuZXcgaW5pdGlhbCBsb2FkaW5nIHN0YXRlcyBjYW4gY29tbWl0IGFzIHNvb24gYXMgcG9zc2libGUuXG5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIFRPRE86IEkgdGhpbmsgd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSBub3cgdXNlIGBEaWRDYXB0dXJlYCBpblxuICAvLyB0aGUgYmVnaW4gcGhhc2UgdG8gcHJldmVudCBhbiBlYXJseSBiYWlsb3V0LlxuXG4gIHN1c3BlbnNlQm91bmRhcnkubGFuZXMgPSByb290UmVuZGVyTGFuZXM7XG4gIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xufVxuXG5mdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbihyb290LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHZhbHVlLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLlxuICBzb3VyY2VGaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuXG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCByb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVGhpcyBpcyBhIHdha2VhYmxlLiBUaGUgY29tcG9uZW50IHN1c3BlbmRlZC5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcbiAgICByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlcik7XG5cbiAgICB7XG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHZhciBzdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpO1xuXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gV2Ugb25seSBhdHRhY2ggcGluZyBsaXN0ZW5lcnMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gICAgICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG5cbiAgICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBib3VuZGFyeSB3YXMgZm91bmQuIFVubGVzcyB0aGlzIGlzIGEgc3luYyB1cGRhdGUsIHRoaXMgaXMgT0suXG4gICAgICAvLyBXZSBjYW4gc3VzcGVuZCBhbmQgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cbiAgICAgIGlmICghaW5jbHVkZXNTeW5jTGFuZShyb290UmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgc3luYyB1cGRhdGUuIFN1c3BlbmQuIFNpbmNlIHdlJ3JlIG5vdCBhY3RpdmF0aW5nIGFcbiAgICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIHRoaXMgd2lsbCB1bndpbmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgd2l0aG91dFxuICAgICAgICAvLyBwZXJmb3JtaW5nIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIGEgZmFsbGJhY2suIChUaGlzIGlzIGFyZ3VhYmx5IGhvd1xuICAgICAgICAvLyByZWZyZXNoIHRyYW5zaXRpb25zIHNob3VsZCB3b3JrLCB0b28sIHNpbmNlIHdlJ3JlIG5vdCBnb2luZyB0byBjb21taXRcbiAgICAgICAgLy8gdGhlIGZhbGxiYWNrcyBhbnl3YXkuKVxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGNhc2UgYWxzbyBhcHBsaWVzIHRvIGluaXRpYWwgaHlkcmF0aW9uLlxuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBUaGlzIGlzIGEgc3luYy9kaXNjcmV0ZSB1cGRhdGUuIFdlIHRyZWF0IHRoaXMgY2FzZSBsaWtlIGFuIGVycm9yXG4gICAgICAvLyBiZWNhdXNlIGRpc2NyZXRlIHJlbmRlcnMgYXJlIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBjb21wbGV0ZSB0cmVlXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggZXh0ZXJuYWwgc3RhdGUuXG5cblxuICAgICAgdmFyIHVuY2F1Z2h0U3VzcGVuc2VFcnJvciA9IG5ldyBFcnJvcignQSBjb21wb25lbnQgc3VzcGVuZGVkIHdoaWxlIHJlc3BvbmRpbmcgdG8gc3luY2hyb25vdXMgaW5wdXQuIFRoaXMgJyArICd3aWxsIGNhdXNlIHRoZSBVSSB0byBiZSByZXBsYWNlZCB3aXRoIGEgbG9hZGluZyBpbmRpY2F0b3IuIFRvICcgKyAnZml4LCB1cGRhdGVzIHRoYXQgc3VzcGVuZCBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ3dpdGggc3RhcnRUcmFuc2l0aW9uLicpOyAvLyBJZiB3ZSdyZSBvdXRzaWRlIGEgdHJhbnNpdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSByZWd1bGFyIGVycm9yIHBhdGguXG4gICAgICAvLyBUaGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgYnkgdGhlIG5lYXJlc3Qgc3VzcGVuc2UgYm91bmRhcnkuXG5cbiAgICAgIHZhbHVlID0gdW5jYXVnaHRTdXNwZW5zZUVycm9yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBlcnJvciwgbm90IGEgU3VzcGVuc2Ugd2FrZWFibGUuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuXG4gICAgICB2YXIgX3N1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7IC8vIElmIHRoZSBlcnJvciB3YXMgdGhyb3duIGR1cmluZyBoeWRyYXRpb24sIHdlIG1heSBiZSBhYmxlIHRvIHJlY292ZXIgYnlcbiAgICAgIC8vIGRpc2NhcmRpbmcgdGhlIGRlaHlkcmF0ZWQgY29udGVudCBhbmQgc3dpdGNoaW5nIHRvIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIC8vIEluc3RlYWQgb2Ygc3VyZmFjaW5nIHRoZSBlcnJvciwgZmluZCB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeVxuICAgICAgLy8gYW5kIHJlbmRlciBpdCBhZ2FpbiB3aXRob3V0IGh5ZHJhdGlvbi5cblxuXG4gICAgICBpZiAoX3N1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKChfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmIFNob3VsZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCB0cnkgcmVuZGVyaW5nIHRoZSBub3JtYWxcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhZ2Fpbiwgbm90IHRoZSBmYWxsYmFjay5cbiAgICAgICAgICBfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShfc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBFdmVuIHRob3VnaCB0aGUgdXNlciBtYXkgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgZXJyb3IsIHdlIHNob3VsZFxuICAgICAgICAvLyBzdGlsbCBsb2cgaXQgc28gaXQgY2FuIGJlIGZpeGVkLlxuXG4gICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IodmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFdlIGRpZG4ndCBmaW5kIGEgYm91bmRhcnkgdGhhdCBjb3VsZCBoYW5kbGUgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gU3RhcnRcbiAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uXG4gIC8vIGFzIGFuIGVycm9yLlxuXG5cbiAgcmVuZGVyRGlkRXJyb3IodmFsdWUpO1xuICB2YWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUodmFsdWUsIHNvdXJjZUZpYmVyKTtcbiAgdmFyIHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpO1xuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF9lcnJvckluZm8sIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gQ2FwdHVyZSBhbmQgcmV0cnlcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MgJiYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCBpbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG5cbiAgICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBfbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIF91cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBlcnJvckluZm8sIF9sYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkQ2FjaGUoKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgc3VzcGVuZHMuIEl0IHJldHVybnMgdGhlXG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gVGFnIHRoZSBmaWJlciB3aXRoIGFuIHVwZGF0ZSBlZmZlY3QuIFRoaXMgdHVybnMgYSBQbGFjZW1lbnQgaW50b1xuICAvLyBhIFBsYWNlbWVudEFuZFVwZGF0ZS5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmKHdvcmtJblByb2dyZXNzKSB7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICB9XG59XG5cbnZhciBhcHBlbmRBbGxDaGlsZHJlbjtcbnZhciB1cGRhdGVIb3N0Q29udGFpbmVyO1xudmFyIHVwZGF0ZUhvc3RDb21wb25lbnQ7XG52YXIgdXBkYXRlSG9zdFRleHQ7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50ID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWQgdG9cbiAgICAvLyBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIEluIG11dGF0aW9uIG1vZGUsIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYSBiYWlsb3V0IGJlY2F1c2VcbiAgICAgIC8vIHdlIHdvbid0IHRvdWNoIHRoaXMgbm9kZSBldmVuIGlmIGNoaWxkcmVuIGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBnZXQgdXBkYXRlZCBiZWNhdXNlIG9uZSBvZiBvdXIgY2hpbGRyZW4gdXBkYXRlZCwgd2UgZG9uJ3RcbiAgICAvLyBoYXZlIG5ld1Byb3BzIHNvIHdlJ2xsIGhhdmUgdG8gcmV1c2UgdGhlbS5cbiAgICAvLyBUT0RPOiBTcGxpdCB0aGUgdXBkYXRlIEFQSSBhcyBzZXBhcmF0ZSBmb3IgdGhlIHByb3BzIHZzLiBjaGlsZHJlbi5cbiAgICAvLyBFdmVuIGJldHRlciB3b3VsZCBiZSBpZiBjaGlsZHJlbiB3ZXJlbid0IHNwZWNpYWwgY2FzZWQgYXQgYWxsIHRoby5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpOyAvLyBUT0RPOiBFeHBlcmllbmNpbmcgYW4gZXJyb3Igd2hlcmUgb2xkUHJvcHMgaXMgbnVsbC4gU3VnZ2VzdHMgYSBob3N0XG4gICAgLy8gY29tcG9uZW50IGlzIGhpdHRpbmcgdGhlIHJlc3VtZSBwYXRoLiBGaWd1cmUgb3V0IHdoeS4gUG9zc2libHlcbiAgICAvLyByZWxhdGVkIHRvIGBoaWRkZW5gLlxuXG4gICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBwcmVwYXJlVXBkYXRlKGluc3RhbmNlLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAgIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaXMgZG9uZSBpbiBjb21taXRXb3JrLlxuXG4gICAgaWYgKHVwZGF0ZVBheWxvYWQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0VGV4dCA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgIC8vIElmIHRoZSB0ZXh0IGRpZmZlcnMsIG1hcmsgaXQgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaW4gZG9uZSBpbiBjb21taXRXb3JrLlxuICAgIGlmIChvbGRUZXh0ICE9PSBuZXdUZXh0KSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrKSB7XG4gIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgLy8gSWYgd2UncmUgaHlkcmF0aW5nLCB3ZSBzaG91bGQgY29uc3VtZSBhcyBtYW55IGl0ZW1zIGFzIHdlIGNhblxuICAgIC8vIHNvIHdlIGRvbid0IGxlYXZlIGFueSBiZWhpbmQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoIChyZW5kZXJTdGF0ZS50YWlsTW9kZSkge1xuICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgdGFpbE5vZGUgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICB2YXIgbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAodGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAodGFpbE5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsYXN0VGFpbE5vZGUgPSB0YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YWlsTm9kZSA9IHRhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAobGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZXRhY2ggdGhlIGluc2VydGlvbiBhZnRlciB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbnNlcnRlZC5cbiAgICAgICAgICBsYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2NvbGxhcHNlZCc6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgX3RhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIF9sYXN0VGFpbE5vZGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChfdGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoX3RhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX2xhc3RUYWlsTm9kZSA9IF90YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGFpbE5vZGUgPSBfdGFpbE5vZGUuc2libGluZztcbiAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS5cblxuXG4gICAgICAgIGlmIChfbGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICBpZiAoIWhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjayAmJiByZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXZSBzdXNwZW5kZWQgZHVyaW5nIHRoZSBoZWFkLiBXZSB3YW50IHRvIHNob3cgYXQgbGVhc3Qgb25lXG4gICAgICAgICAgICAvLyByb3cgYXQgdGhlIHRhaWwuIFNvIHdlJ2xsIGtlZXAgb24gYW5kIGN1dCBvZmYgdGhlIHJlc3QuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgX2xhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1YmJsZVByb3BlcnRpZXMoY29tcGxldGVkV29yaykge1xuICB2YXIgZGlkQmFpbG91dCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlICE9PSBudWxsICYmIGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlLmNoaWxkID09PSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuXG4gIGlmICghZGlkQmFpbG91dCkge1xuICAgIC8vIEJ1YmJsZSB1cCB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lLlxuICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgICAgLy8gcHJvZmlsZXIgZHVyYXRpb25zLlxuICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoY2hpbGQubGFuZXMsIGNoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLmZsYWdzOyAvLyBXaGVuIGEgZmliZXIgaXMgY2xvbmVkLCBpdHMgYWN0dWFsRHVyYXRpb24gaXMgcmVzZXQgdG8gMC4gVGhpcyB2YWx1ZSB3aWxsXG4gICAgICAgIC8vIG9ubHkgYmUgdXBkYXRlZCBpZiB3b3JrIGlzIGRvbmUgb24gdGhlIGZpYmVyIChpLmUuIGl0IGRvZXNuJ3QgYmFpbG91dCkuXG4gICAgICAgIC8vIFdoZW4gd29yayBpcyBkb25lLCBpdCBzaG91bGQgYnViYmxlIHRvIHRoZSBwYXJlbnQncyBhY3R1YWxEdXJhdGlvbi4gSWZcbiAgICAgICAgLy8gdGhlIGZpYmVyIGhhcyBub3QgYmVlbiBjbG9uZWQgdGhvdWdoLCAobWVhbmluZyBubyB3b3JrIHdhcyBkb25lKSwgdGhlblxuICAgICAgICAvLyB0aGlzIHZhbHVlIHdpbGwgcmVmbGVjdCB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgd29ya2luZyBvbiBhIHByZXZpb3VzXG4gICAgICAgIC8vIHJlbmRlci4gSW4gdGhhdCBjYXNlIGl0IHNob3VsZCBub3QgYnViYmxlLiBXZSBkZXRlcm1pbmUgd2hldGhlciBpdCB3YXNcbiAgICAgICAgLy8gY2xvbmVkIGJ5IGNvbXBhcmluZyB0aGUgY2hpbGQgcG9pbnRlci5cblxuICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdHJlZUJhc2VEdXJhdGlvbiArPSBjaGlsZC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IHRyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5mbGFnczsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfSBlbHNlIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBfdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBfY2hpbGQyID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDIgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQyLmxhbmVzLCBfY2hpbGQyLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLmZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24gKz0gX2NoaWxkMi50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBfY2hpbGQyID0gX2NoaWxkMi5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSBfdHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jaGlsZDMgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkMyAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZDMubGFuZXMsIF9jaGlsZDMuY2hpbGRMYW5lcykpOyAvLyBcIlN0YXRpY1wiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0byxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXJcbiAgICAgICAgLy8gZmxhZ3MgaGF2ZSBhIGxpZmV0aW1lIG9ubHkgb2YgYSBzaW5nbGUgcmVuZGVyICsgY29tbWl0LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaWdub3JlIHRoZW0uXG5cbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuZmxhZ3MgJiBTdGF0aWNNYXNrOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlXG4gICAgICAgIC8vIHNtZWxsIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGUgY29tbWl0IHBoYXNlIGlzIG5ldmVyIGNvbmN1cnJlbnQgd2l0aFxuICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC5cblxuICAgICAgICBfY2hpbGQzLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZDMgPSBfY2hpbGQzLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzO1xuICB9XG5cbiAgY29tcGxldGVkV29yay5jaGlsZExhbmVzID0gbmV3Q2hpbGRMYW5lcztcbiAgcmV0dXJuIGRpZEJhaWxvdXQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cblxuICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIEZyYWdtZW50OlxuICAgIGNhc2UgTW9kZTpcbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZpYmVyUm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuXG4gICAgICAgIGlmIChmaWJlclJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBmaWJlclJvb3QuY29udGV4dCA9IGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dDtcbiAgICAgICAgICBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5jaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCBwb3Agc28gdGhhdCB3ZSBjYW4gZGVsZXRlIGFueSByZW1haW5pbmcgY2hpbGRyZW5cbiAgICAgICAgICAvLyB0aGF0IHdlcmVuJ3QgaHlkcmF0ZWQuXG4gICAgICAgICAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKHdhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgdGhlbiB3ZSdsbCBuZWVkIHRvIHNjaGVkdWxlIGFuIHVwZGF0ZSBmb3JcbiAgICAgICAgICAgIC8vIHRoZSBjb21taXQgc2lkZS1lZmZlY3RzIG9uIHRoZSByb290LlxuICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKCAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2xpZW50IHJvb3RcbiAgICAgICAgICAgICAgIXByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQgfHwgLy8gQ2hlY2sgaWYgd2UgcmV2ZXJ0ZWQgdG8gY2xpZW50IHJlbmRlcmluZyAoZS5nLiBkdWUgdG8gYW4gZXJyb3IpXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBjbGVhciB0aGlzIGNvbnRhaW5lciBhdCB0aGUgc3RhcnQgb2YgdGhlXG4gICAgICAgICAgICAgICAgLy8gbmV4dCBjb21taXQuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBSZWFjdCByZW5kZXJpbmcgaW50byBhXG4gICAgICAgICAgICAgICAgLy8gY29udGFpbmVyIHdpdGggcHJldmlvdXMgY2hpbGRyZW4uIEl0J3MgYWxzbyBzYWZlIHRvIGRvIGZvclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgdG9vLCBiZWNhdXNlIGN1cnJlbnQuY2hpbGQgd291bGQgb25seSBiZSBudWxsIGlmIHRoZVxuICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIGNvbnRhaW5lciB3b3VsZCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgLy8gYmUgZW1wdHkpLlxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90OyAvLyBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLCB0aGVyZSBtYXkgaGF2ZSBiZWVuXG4gICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb24gYXR0ZW1wdC4gSWYgc28sIGFkZFxuICAgICAgICAgICAgICAgIC8vIHRoZW0gdG8gYSBxdWV1ZSBzbyB3ZSBjYW4gbG9nIHRoZW0gaW4gdGhlIGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgICAgIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnQucmVmICE9PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgICAgICAgIG1hcmtSZWYod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfSAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuXG5cbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3JcbiAgICAgICAgICAvLyBib3R0b20tPnVwLiBUb3AtPmRvd24gaXMgZmFzdGVyIGluIElFMTEuXG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGFuZCBjcmVhdGVJbnN0YW5jZSBzdGVwIGludG8gdGhlIGJlZ2luUGhhc2VcbiAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLlxuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KSkge1xuICAgICAgICAgICAgICAvLyBJZiBjaGFuZ2VzIHRvIHRoZSBoeWRyYXRlZCBub2RlIG5lZWQgdG8gYmUgYXBwbGllZCBhdCB0aGVcbiAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLlxuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LlxuICAgICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBzdXBwb3J0cyBhdXRvLWZvY3VzIGZvciBjZXJ0YWluIGVsZW1lbnRzKS5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzdWNoIHJlbmRlcmVycyBnZXQgc2NoZWR1bGVkIGZvciBsYXRlciB3b3JrLlxuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1RleHQgPSBuZXdQcm9wcztcblxuICAgICAgICBpZiAoY3VycmVudCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBvbGRUZXh0ID0gY3VycmVudC5tZW1vaXplZFByb3BzOyAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZFxuICAgICAgICAgIC8vIHRvIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG5cbiAgICAgICAgICB1cGRhdGVIb3N0VGV4dChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcblxuICAgICAgICAgIHZhciBfY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTtcblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQyID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZDIpIHtcbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZVRleHRJbnN0YW5jZShuZXdUZXh0LCBfcm9vdENvbnRhaW5lckluc3RhbmNlLCBfY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSAmJiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2Rlcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyIHwgSW5jb21wbGV0ZSB8IFNob3VsZENhcHR1cmU7XG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCAmJiBuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1pZ2h0IGJlIGluc2lkZSBhIGh5ZHJhdGlvbiBzdGF0ZSB0aGUgZmlyc3QgdGltZSB3ZSdyZSBwaWNraW5nIHVwIHRoaXNcbiAgICAgICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeSwgYW5kIGFsc28gYWZ0ZXIgd2UndmUgcmVlbnRlcmVkIGl0IGZvciBmdXJ0aGVyIGh5ZHJhdGlvbi5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMyA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIV93YXNIeWRyYXRlZDMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50IHdhcyBjb21wbGV0ZWQgd2l0aG91dCBhIGh5ZHJhdGVkIG5vZGUuICcgKyAnVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJlcGFyZVRvSHlkcmF0ZUhvc3RTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBXZSBtaWdodCBoYXZlIHJlZW50ZXJlZCB0aGlzIGJvdW5kYXJ5IHRvIGh5ZHJhdGUgaXQuIElmIHNvLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBoeWRyYXRpb25cbiAgICAgICAgICAgIC8vIHN0YXRlIHNpbmNlIHdlJ3JlIG5vdyBleGl0aW5nIG91dCBvZiBpdC4gcG9wSHlkcmF0aW9uU3RhdGUgZG9lc24ndCBkbyB0aGF0IGZvciB1cy5cbiAgICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcblxuICAgICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgYm91bmRhcnkgZGlkIG5vdCBzdXNwZW5kIHNvIGl0J3Mgbm93IGh5ZHJhdGVkIGFuZCB1bnN1c3BlbmRlZC5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBtYXJrIHRoaXMgYm91bmRhcnlcbiAgICAgICAgICAgIC8vIGFzIGhhdmluZyBoeWRyYXRlZCBzbyBldmVudHMga25vdyB0aGF0IHRoZXkncmUgZnJlZSB0byBiZSBpbnZva2VkLlxuICAgICAgICAgICAgLy8gSXQncyBhbHNvIGEgc2lnbmFsIHRvIHJlcGxheSBldmVudHMgYW5kIHRoZSBzdXNwZW5zZSBjYWxsYmFjay5cbiAgICAgICAgICAgIC8vIElmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggcmV0cnkgbGlzdGVuZXJzLlxuICAgICAgICAgICAgLy8gU28gd2UgbWlnaHQgYXMgd2VsbCBhbHdheXMgbWFyayB0aGlzLlxuXG5cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9pc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAoX2lzVGltZWRPdXRTdXNwZW5zZSkge1xuICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChfcHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBfcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhpcyB0cmVlLiBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLFxuICAgICAgICAvLyB0aGVyZSBtYXkgaGF2ZSBiZWVuIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uXG4gICAgICAgIC8vIGF0dGVtcHQuIElmIHNvLCBhZGQgdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGVcbiAgICAgICAgLy8gY29tbWl0IHBoYXNlLlxuXG5cbiAgICAgICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTtcblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkLiBSZS1yZW5kZXIgd2l0aCB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lczsgLy8gRG8gbm90IHJlc2V0IHRoZSBlZmZlY3QgbGlzdC5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgcHJldkRpZFRpbWVvdXQgPSBfcHJldlN0YXRlICE9PSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGEgcGFzc2l2ZSBlZmZlY3QsIHdoaWNoIGlzIHdoZW4gd2UgcHJvY2VzcyB0aGUgdHJhbnNpdGlvbnNcblxuXG4gICAgICAgIGlmIChuZXh0RGlkVGltZW91dCAhPT0gcHJldkRpZFRpbWVvdXQpIHtcbiAgICAgICAgICAvLyBhbiBlZmZlY3QgdG8gdG9nZ2xlIHRoZSBzdWJ0cmVlJ3MgdmlzaWJpbGl0eS4gV2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIGZhbGxiYWNrIC0+IHByaW1hcnksIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgc2NoZWR1bGVzIHRoaXMgZWZmZWN0XG4gICAgICAgICAgLy8gYXMgcGFydCBvZiBpdHMgbm9ybWFsIGNvbXBsZXRlIHBoYXNlLiBCdXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIHByaW1hcnkgLT4gZmFsbGJhY2ssIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgZG9lcyBub3QgaGF2ZSBhIGNvbXBsZXRlXG4gICAgICAgICAgLy8gcGhhc2UuIFNvIHdlIG5lZWQgdG8gc2NoZWR1bGUgaXRzIGVmZmVjdCBoZXJlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgYWxzbyB1c2UgdGhpcyBmbGFnIHRvIGNvbm5lY3QvZGlzY29ubmVjdCB0aGUgZWZmZWN0cywgYnV0IHRoZSBzYW1lXG4gICAgICAgICAgLy8gbG9naWMgYXBwbGllczogd2hlbiByZS1jb25uZWN0aW5nLCB0aGUgT2Zmc2NyZWVuIGZpYmVyJ3MgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZSB3aWxsIGhhbmRsZSBzY2hlZHVsaW5nIHRoZSBlZmZlY3QuIEl0J3Mgb25seSB3aGVuIHRoZSBmYWxsYmFja1xuICAgICAgICAgIC8vIGlzIGFjdGl2ZSB0aGF0IHdlIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC5cblxuXG4gICAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICB2YXIgX29mZnNjcmVlbkZpYmVyMiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgX29mZnNjcmVlbkZpYmVyMi5mbGFncyB8PSBWaXNpYmlsaXR5OyAvLyBUT0RPOiBUaGlzIHdpbGwgc3RpbGwgc3VzcGVuZCBhIHN5bmNocm9ub3VzIHRyZWUgaWYgYW55dGhpbmdcbiAgICAgICAgICAgIC8vIGluIHRoZSBjb25jdXJyZW50IHRyZWUgYWxyZWFkeSBzdXNwZW5kZWQgZHVyaW5nIHRoaXMgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cblxuICAgICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGJhY2sgdG8gdGhyb3dFeGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIHRvbyBsYXRlXG4gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBsYXJnZSB0cmVlIHdoaWNoIGlzIGNvbW1vbiBmb3IgaW5pdGlhbCBsb2Fkcy4gV2VcbiAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAgIC8vIHRoaXMgbWFya2VyLCBhbmQgdGhpcyBpcyB0b28gbGF0ZS5cbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyByZW5kZXIgYWxyZWFkeSBoYWQgYSBwaW5nIG9yIGxvd2VyIHByaSB1cGRhdGVzLFxuICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gaW1tZWRpYXRlbHkgcmVzdGFydCBmcm9tIHdpdGhpbiB0aHJvd0V4Y2VwdGlvbi5cbiAgICAgICAgICAgICAgdmFyIGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCA9IGN1cnJlbnQgPT09IG51bGwgJiYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUgfHwgIWVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2spO1xuXG4gICAgICAgICAgICAgIGlmIChoYXNJbnZpc2libGVDaGlsZENvbnRleHQgfHwgaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGluIGFuIGludmlzaWJsZSB0cmVlIG9yIGEgbmV3IHJlbmRlciwgdGhlbiBzaG93aW5nXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIGZvciBsb25nZXIgaWYgcG9zc2libGUuXG4gICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdha2VhYmxlcyA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIGEgcmV0cnkgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UuXG4gICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgaWYgKF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICBwcmVwYXJlUG9ydGFsTW91bnQod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgfVxuXG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gU2FtZSBhcyBjbGFzcyBjb21wb25lbnQgY2FzZS4gSSBwdXQgaXQgZG93biBoZXJlIHNvIHRoYXQgdGhlIHRhZ3MgYXJlXG4gICAgICAgIC8vIHNlcXVlbnRpYWwgdG8gZW5zdXJlIHRoaXMgc3dpdGNoIGlzIGNvbXBpbGVkIHRvIGEganVtcCB0YWJsZS5cbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihfQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVuYWJsZXMuIEluc3RlYWQsIHdlJ2xsIHRyYW5zZmVyIGl0cyB0aGVuYWJsZXMgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBTdXNwZW5zZUxpc3Qgc28gdGhhdCBpdCBjYW4gcmV0cnkgaWYgdGhleSByZXNvbHZlLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgb2YgdGhlc2UgaW4gdGhlIGxpc3QgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgICAgICAgICAgICAvLyBnb2luZyB0byB3YWl0IGZvciBhbGwgb2YgdGhlbSBhbnl3YXksIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlclxuICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggb25lcyBnZXRzIHRvIHBpbmcuIEluIHRoZW9yeSB3ZSBjb3VsZCBnZXQgY2xldmVyIGFuZCBrZWVwXG4gICAgICAgICAgICAgICAgICAvLyB0cmFjayBvZiBob3cgbWFueSBkZXBlbmRlbmNpZXMgcmVtYWluIGJ1dCBpdCBnZXRzIHRyaWNreSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWVhbnRpbWUsIHdlIGNhbiBhZGQvcmVtb3ZlL2NoYW5nZSBpdGVtcyBhbmQgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmFpbCBvdXQgb2YgdGhlIGxvb3AgYmVmb3JlIGZpbmRpbmcgYW55IGJ1dCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IG1hdHRlciBzaW5jZSB0aGF0IG1lYW5zIHRoYXQgdGhlIG90aGVyIGJvdW5kYXJpZXMgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd2UgZGlkIGZpbmQgYWxyZWFkeSBoYXMgdGhlaXIgbGlzdGVuZXJzIGF0dGFjaGVkLlxuXG4gICAgICAgICAgICAgICAgICB2YXIgbmV3VGhlbmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgICAgICB9IC8vIFJlcmVuZGVyIHRoZSB3aG9sZSBsaXN0LCBidXQgdGhpcyB0aW1lLCB3ZSdsbCBmb3JjZSBmYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJlZm9yZSBkb2luZyB0aGUgc2Vjb25kIHBhc3Mgc2luY2UgdGhhdCdzIG5vdyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNoaWxkIGZpYmVycyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZS5cblxuXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICAgICAgICAgICAgcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOyAvLyBTZXQgdXAgdGhlIFN1c3BlbnNlIENvbnRleHQgdG8gZm9yY2Ugc3VzcGVuc2UgYW5kIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAvLyByZXJlbmRlciB0aGUgY2hpbGRyZW4uXG5cbiAgICAgICAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spKTsgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwgJiYgbm93KCkgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGJ1dCB3ZSBzdGlsbCBoYXZlIHJvd3NcbiAgICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgdGFpbC4gV2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gcmVuZGVyXG4gICAgICAgICAgICAgIC8vIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGUgdGFpbC5cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgcmVuZGVyZWQgcm93IHRvIHRoZSBjaGlsZCBsaXN0LlxuICAgICAgICAgIGlmICghZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIHZhciBfc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJlbmRlcmVkVGFpbCk7XG5cbiAgICAgICAgICAgIGlmIChfc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTsgLy8gRW5zdXJlIHdlIHRyYW5zZmVyIHRoZSB1cGRhdGUgcXVldWUgdG8gdGhlIHBhcmVudCBzbyB0aGF0IGl0IGRvZXNuJ3RcbiAgICAgICAgICAgICAgLy8gZ2V0IGxvc3QgaWYgdGhpcyByb3cgZW5kcyB1cCBkcm9wcGVkIGR1cmluZyBhIHNlY29uZCBwYXNzLlxuXG4gICAgICAgICAgICAgIHZhciBfbmV3VGhlbmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gX25ld1RoZW5hYmxlcztcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIHRydWUpOyAvLyBUaGlzIG1pZ2h0IGhhdmUgYmVlbiBtb2RpZmllZC5cblxuICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCA9PT0gbnVsbCAmJiByZW5kZXJTdGF0ZS50YWlsTW9kZSA9PT0gJ2hpZGRlbicgJiYgIXJlbmRlcmVkVGFpbC5hbHRlcm5hdGUgJiYgIWdldElzSHlkcmF0aW5nKCkgLy8gV2UgZG9uJ3QgY3V0IGl0IGlmIHdlJ3JlIGh5ZHJhdGluZy5cbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSdyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCAvLyBUaGUgdGltZSBpdCB0b29rIHRvIHJlbmRlciBsYXN0IHJvdyBpcyBncmVhdGVyIHRoYW4gdGhlIHJlbWFpbmluZ1xuICAgICAgICAgICAgLy8gdGltZSB3ZSBoYXZlIHRvIHJlbmRlci4gU28gcmVuZGVyaW5nIG9uZSBtb3JlIHJvdyB3b3VsZCBsaWtlbHlcbiAgICAgICAgICAgIC8vIGV4Y2VlZCBpdC5cbiAgICAgICAgICAgIG5vdygpICogMiAtIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSAmJiByZW5kZXJMYW5lcyAhPT0gT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdyBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBhbmQgd2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXJcbiAgICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdG8gcmVuZGVyIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGlzIHVzdWFsbHkgZmFzdGVyLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcykge1xuICAgICAgICAgICAgLy8gVGhlIGVmZmVjdCBsaXN0IG9mIHRoZSBiYWNrd2FyZHMgdGFpbCB3aWxsIGhhdmUgYmVlbiBhZGRlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIGVuZC4gVGhpcyBicmVha3MgdGhlIGd1YXJhbnRlZSB0aGF0IGxpZmUtY3ljbGVzIGZpcmUgaW5cbiAgICAgICAgICAgIC8vIHNpYmxpbmcgb3JkZXIgYnV0IHRoYXQgaXNuJ3QgYSBzdHJvbmcgZ3VhcmFudGVlIHByb21pc2VkIGJ5IFJlYWN0LlxuICAgICAgICAgICAgLy8gRXNwZWNpYWxseSBzaW5jZSB0aGVzZSBtaWdodCBhbHNvIGp1c3QgcG9wIGluIGR1cmluZyBmdXR1cmUgY29tbWl0cy5cbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICAgICAgICAgICAgcmVuZGVyZWRUYWlsLnNpYmxpbmcgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gcmVuZGVyU3RhdGUubGFzdDtcblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpYmxpbmcuc2libGluZyA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0ID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSB0YWlsIHJvd3MgdG8gcmVuZGVyLlxuICAgICAgICAgIC8vIFBvcCBhIHJvdy5cbiAgICAgICAgICB2YXIgbmV4dCA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbmV4dDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbmV4dC5zaWJsaW5nO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgICAgIG5leHQuc2libGluZyA9IG51bGw7IC8vIFJlc3RvcmUgdGhlIGNvbnRleHQuXG4gICAgICAgICAgLy8gVE9ETzogV2UgY2FuIHByb2JhYmx5IGp1c3QgYXZvaWQgcG9wcGluZyBpdCBpbnN0ZWFkIGFuZCBvbmx5XG4gICAgICAgICAgLy8gc2V0dGluZyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBnbyBmcm9tIG5vdCBzdXNwZW5kZWQgdG8gc3VzcGVuZGVkLlxuXG4gICAgICAgICAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcblxuICAgICAgICAgIGlmIChkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gRG8gYSBwYXNzIG92ZXIgdGhlIG5leHQgcm93LlxuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBfbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX3ByZXZTdGF0ZTIgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIHByZXZJc0hpZGRlbiA9IF9wcmV2U3RhdGUyICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKHByZXZJc0hpZGRlbiAhPT0gbmV4dElzSGlkZGVuICYmICggLy8gTGVnYWN5SGlkZGVuIGRvZXNuJ3QgZG8gYW55IGhpZGluZyBcdTIwMTQgaXQgb25seSBwcmUtcmVuZGVycy5cbiAgICAgICAgICAhZW5hYmxlTGVnYWN5SGlkZGVuICkpIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXh0SXNIaWRkZW4gfHwgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGZvciBoaWRkZW4gY2hpbGRyZW4gdW5sZXNzIHdlJ3JlIHJlbmRlcmluZ1xuICAgICAgICAgIC8vIGF0IG9mZnNjcmVlbiBwcmlvcml0eS5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShzdWJ0cmVlUmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZSBpbiB0aGUgaGlkZGVuIHN1YnRyZWUuXG4gICAgICAgICAgICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIGhpZGUgdGhvc2Ugbm9kZXMgaW4gdGhlIGNvbW1pdCBwaGFzZSwgc29cbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgYSB2aXNpYmlsaXR5IGVmZmVjdC5cbiAgICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgJiAoUGxhY2VtZW50IHwgVXBkYXRlKSkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFwiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0QmFkQ2xhc3M7XG52YXIgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnM7XG52YXIgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcztcbnZhciBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcjtcbnZhciBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucztcblxue1xuICBkaWRXYXJuQWJvdXRCYWRDbGFzcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyID0ge307XG4gIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zID0ge307XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhIGZyZXNoIG5ldyBjb21wb25lbnQgdGhhdCBoYXNuJ3QgYmVlbiByZW5kZXJlZCB5ZXQsIHdlXG4gICAgLy8gd29uJ3QgdXBkYXRlIGl0cyBjaGlsZCBzZXQgYnkgYXBwbHlpbmcgbWluaW1hbCBzaWRlLWVmZmVjdHMuIEluc3RlYWQsXG4gICAgLy8gd2Ugd2lsbCBhZGQgdGhlbSBhbGwgdG8gdGhlIGNoaWxkIGJlZm9yZSBpdCBnZXRzIHJlbmRlcmVkLiBUaGF0IG1lYW5zXG4gICAgLy8gd2UgY2FuIG9wdGltaXplIHRoaXMgcmVjb25jaWxpYXRpb24gcGFzcyBieSBub3QgdHJhY2tpbmcgc2lkZS1lZmZlY3RzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hpbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHdvcmsgaW4gcHJvZ3Jlc3MsIGl0IG1lYW5zIHRoYXRcbiAgICAvLyB3ZSBoYXZlbid0IHlldCBzdGFydGVkIGFueSB3b3JrIG9uIHRoZXNlIGNoaWxkcmVuLiBUaGVyZWZvcmUsIHdlIHVzZVxuICAgIC8vIHRoZSBjbG9uZSBhbGdvcml0aG0gdG8gY3JlYXRlIGEgY29weSBvZiBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4uXG4gICAgLy8gSWYgd2UgaGFkIGFueSBwcm9ncmVzc2VkIHdvcmsgYWxyZWFkeSwgdGhhdCBpcyBpbnZhbGlkIGF0IHRoaXMgcG9pbnQgc29cbiAgICAvLyBsZXQncyB0aHJvdyBpdCBvdXQuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGZvcmsgb2YgcmVjb25jaWxlQ2hpbGRyZW4uIEl0J3MgdXNlZCBpbiBjYXNlcyB3aGVyZSB3ZVxuICAvLyB3YW50IHRvIHJlY29uY2lsZSB3aXRob3V0IG1hdGNoaW5nIGFnYWluc3QgdGhlIGV4aXN0aW5nIHNldC4gVGhpcyBoYXMgdGhlXG4gIC8vIGVmZmVjdCBvZiBhbGwgY3VycmVudCBjaGlsZHJlbiBiZWluZyB1bm1vdW50ZWQ7IGV2ZW4gaWYgdGhlIHR5cGUgYW5kIGtleVxuICAvLyBhcmUgdGhlIHNhbWUsIHRoZSBvbGQgY2hpbGQgaXMgdW5tb3VudGVkIGFuZCBhIG5ldyBjaGlsZCBpcyBjcmVhdGVkLlxuICAvL1xuICAvLyBUbyBkbyB0aGlzLCB3ZSdyZSBnb2luZyB0byBnbyB0aHJvdWdoIHRoZSByZWNvbmNpbGUgYWxnb3JpdGhtIHR3aWNlLiBJblxuICAvLyB0aGUgZmlyc3QgcGFzcywgd2Ugc2NoZWR1bGUgYSBkZWxldGlvbiBmb3IgYWxsIHRoZSBjdXJyZW50IGNoaWxkcmVuIGJ5XG4gIC8vIHBhc3NpbmcgbnVsbC5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBJbiB0aGUgc2Vjb25kIHBhc3MsIHdlIG1vdW50IHRoZSBuZXcgY2hpbGRyZW4uIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgd2VcbiAgLy8gcGFzcyBudWxsIGluIHBsYWNlIG9mIHdoZXJlIHdlIHVzdWFsbHkgcGFzcyB0aGUgY3VycmVudCBjaGlsZCBzZXQuIFRoaXMgaGFzXG4gIC8vIHRoZSBlZmZlY3Qgb2YgcmVtb3VudGluZyBhbGwgY2hpbGRyZW4gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZWlyXG4gIC8vIGlkZW50aXRpZXMgbWF0Y2guXG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZvcndhcmRSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyBhZnRlciB0aGUgZmlyc3QgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbmRlciA9IENvbXBvbmVudC5yZW5kZXI7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdmFyIHR5cGUgPSBDb21wb25lbnQudHlwZTtcblxuICAgIGlmIChpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpICYmIENvbXBvbmVudC5jb21wYXJlID09PSBudWxsICYmIC8vIFNpbXBsZU1lbW9Db21wb25lbnQgY29kZXBhdGggZG9lc24ndCByZXNvbHZlIG91dGVyIHByb3BzIGVpdGhlci5cbiAgICBDb21wb25lbnQuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXNvbHZlZFR5cGUgPSB0eXBlO1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKTtcbiAgICAgIH0gLy8gSWYgdGhpcyBpcyBhIHBsYWluIGZ1bmN0aW9uIGNvbXBvbmVudCB3aXRob3V0IGRlZmF1bHQgcHJvcHMsXG4gICAgICAvLyBhbmQgd2l0aCBvbmx5IHRoZSBkZWZhdWx0IHNoYWxsb3cgY29tcGFyaXNvbiwgd2UgdXBncmFkZSBpdFxuICAgICAgLy8gdG8gYSBTaW1wbGVNZW1vQ29tcG9uZW50IHRvIGFsbG93IGZhc3QgcGF0aCB1cGRhdGVzLlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IFNpbXBsZU1lbW9Db21wb25lbnQ7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZWRUeXBlO1xuXG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgdHlwZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZXNvbHZlZFR5cGUsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGlsZCA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyhDb21wb25lbnQudHlwZSwgbnVsbCwgbmV4dFByb3BzLCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MubW9kZSwgcmVuZGVyTGFuZXMpO1xuICAgIGNoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICBjaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHtcbiAgICB2YXIgX3R5cGUgPSBDb21wb25lbnQudHlwZTtcbiAgICB2YXIgX2lubmVyUHJvcFR5cGVzID0gX3R5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKF9pbm5lclByb3BUeXBlcykge1xuICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgIC8vIFdlIGNvdWxkIG1vdmUgaXQgdGhlcmUsIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdGhpcyBmb3IgbGF6eSBjb2RlIHBhdGguXG4gICAgICBjaGVja1Byb3BUeXBlcyhfaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFRoaXMgaXMgYWx3YXlzIGV4YWN0bHkgb25lIGNoaWxkXG5cbiAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICBpZiAoIWhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzOyAvLyBEZWZhdWx0IHRvIHNoYWxsb3cgY29tcGFyaXNvblxuXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG5cbiAgICBpZiAoY29tcGFyZShwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBuZXh0UHJvcHMpO1xuICBuZXdDaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICByZXR1cm4gbmV3Q2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBpbm5lciByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBvdXRlck1lbW9UeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG5cbiAgICAgIGlmIChvdXRlck1lbW9UeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgLy8gV2Ugd2FybiB3aGVuIHlvdSBkZWZpbmUgcHJvcFR5cGVzIG9uIGxhenkoKVxuICAgICAgICAvLyBzbyBsZXQncyBqdXN0IHNraXAgb3ZlciBpdCB0byBmaW5kIG1lbW8oKSBvdXRlciB3cmFwcGVyLlxuICAgICAgICAvLyBJbm5lciBwcm9wcyBmb3IgbWVtbyBhcmUgdmFsaWRhdGVkIGxhdGVyLlxuICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IG91dGVyTWVtb1R5cGU7XG4gICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IGluaXQocGF5bG9hZCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gbnVsbDtcbiAgICAgICAgfSAvLyBJbm5lciBwcm9wVHlwZXMgd2lsbCBiZSB2YWxpZGF0ZWQgaW4gdGhlIGZ1bmN0aW9uIGNvbXBvbmVudCBwYXRoLlxuXG5cbiAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gb3V0ZXJNZW1vVHlwZSAmJiBvdXRlck1lbW9UeXBlLnByb3BUeXBlcztcblxuICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCAoU2ltcGxlTWVtb0NvbXBvbmVudCBoYXMgbm8gZGVmYXVsdFByb3BzKVxuICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG91dGVyTWVtb1R5cGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYgJiYgKCAvLyBQcmV2ZW50IGJhaWxvdXQgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQuXG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7IC8vIFRoZSBwcm9wcyBhcmUgc2hhbGxvd2x5IGVxdWFsLiBSZXVzZSB0aGUgcHJldmlvdXMgcHJvcHMgb2JqZWN0LCBsaWtlIHdlXG4gICAgICAvLyB3b3VsZCBkdXJpbmcgYSBub3JtYWwgZmliZXIgYmFpbG91dC5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHN0cm9uZyBndWFyYW50ZWVzIHRoYXQgdGhlIHByb3BzIG9iamVjdCBpcyByZWZlcmVudGlhbGx5XG4gICAgICAvLyBlcXVhbCBkdXJpbmcgdXBkYXRlcyB3aGVyZSB3ZSBjYW4ndCBiYWlsIG91dCBhbnl3YXkgXHUyMDE0IGxpa2UgaWYgdGhlIHByb3BzXG4gICAgICAvLyBhcmUgc2hhbGxvd2x5IGVxdWFsLCBidXQgdGhlcmUncyBhIGxvY2FsIHN0YXRlIG9yIGNvbnRleHQgdXBkYXRlIGluIHRoZVxuICAgICAgLy8gc2FtZSBiYXRjaC5cbiAgICAgIC8vXG4gICAgICAvLyBIb3dldmVyLCBhcyBhIHByaW5jaXBsZSwgd2Ugc2hvdWxkIGFpbSB0byBtYWtlIHRoZSBiZWhhdmlvciBjb25zaXN0ZW50XG4gICAgICAvLyBhY3Jvc3MgZGlmZmVyZW50IHdheXMgb2YgbWVtb2l6aW5nIGEgY29tcG9uZW50LiBGb3IgZXhhbXBsZSwgUmVhY3QubWVtb1xuICAgICAgLy8gaGFzIGEgZGlmZmVyZW50IGludGVybmFsIEZpYmVyIGxheW91dCBpZiB5b3UgcGFzcyBhIG5vcm1hbCBmdW5jdGlvblxuICAgICAgLy8gY29tcG9uZW50IChTaW1wbGVNZW1vQ29tcG9uZW50KSB2ZXJzdXMgaWYgeW91IHBhc3MgYSBkaWZmZXJlbnQgdHlwZVxuICAgICAgLy8gbGlrZSBmb3J3YXJkUmVmIChNZW1vQ29tcG9uZW50KS4gQnV0IHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuICAgICAgLy8gV3JhcHBpbmcgYSBjb21wb25lbnQgaW4gZm9yd2FyZFJlZiAob3IgUmVhY3QubGF6eSwgZXRjKSBzaG91bGRuJ3RcbiAgICAgIC8vIGFmZmVjdCB3aGV0aGVyIHRoZSBwcm9wcyBvYmplY3QgaXMgcmV1c2VkIGR1cmluZyBhIGJhaWxvdXQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IG5leHRQcm9wcyA9IHByZXZQcm9wcztcblxuICAgICAgaWYgKCFjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgbGFuZXMgd2VyZSBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYmVnaW5Xb3JrLiBXZSdyZVxuICAgICAgICAvLyBhYm91dCB0byBiYWlsIG91dCwgYnV0IHRoZXJlIG1pZ2h0IGJlIG90aGVyIGxhbmVzIHRoYXQgd2VyZW4ndFxuICAgICAgICAvLyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCByZW5kZXIuIFVzdWFsbHksIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHVwZGF0ZXMgaXMgYWNjdW11bGF0ZWQgZHVyaW5nIHRoZSBldmFsdWF0aW9uIG9mIHRoZVxuICAgICAgICAvLyBjb21wb25lbnQgKGkuZS4gd2hlbiBwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUpLiBCdXQgc2luY2Ugc2luY2VcbiAgICAgICAgLy8gd2UncmUgYmFpbGluZyBvdXQgZWFybHkgKndpdGhvdXQqIGV2YWx1YXRpbmcgdGhlIGNvbXBvbmVudCwgd2UgbmVlZFxuICAgICAgICAvLyB0byBhY2NvdW50IGZvciBpdCBoZXJlLCB0b28uIFJlc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBmaWJlci5cbiAgICAgICAgLy8gTk9URTogVGhpcyBvbmx5IGFwcGxpZXMgdG8gU2ltcGxlTWVtb0NvbXBvbmVudCwgbm90IE1lbW9Db21wb25lbnQsXG4gICAgICAgIC8vIGJlY2F1c2UgYSBNZW1vQ29tcG9uZW50IGZpYmVyIGRvZXMgbm90IGhhdmUgaG9va3Mgb3IgYW4gdXBkYXRlIHF1ZXVlO1xuICAgICAgICAvLyByYXRoZXIsIGl0IHdyYXBzIGFyb3VuZCBhbiBpbm5lciBjb21wb25lbnQsIHdoaWNoIG1heSBvciBtYXkgbm90XG4gICAgICAgIC8vIGNvbnRhaW5zIGhvb2tzLlxuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoZSByZXNldCBhdCBpbiBiZWdpbldvcmsgb3V0IG9mIHRoZSBjb21tb24gcGF0aCBzbyB0aGF0XG4gICAgICAgIC8vIHRoaXMgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFN0YXRlIDogbnVsbDtcblxuICBpZiAobmV4dFByb3BzLm1vZGUgPT09ICdoaWRkZW4nIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiApIHtcbiAgICAvLyBSZW5kZXJpbmcgYSBoaWRkZW4gdHJlZS5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gbGVnYWN5IHN5bmMgbW9kZSwgZG9uJ3QgZGVmZXIgdGhlIHN1YnRyZWUuIFJlbmRlciBpdCBub3cuXG4gICAgICAvLyBUT0RPOiBDb25zaWRlciBob3cgT2Zmc2NyZWVuIHNob3VsZCB3b3JrIHdpdGggdHJhbnNpdGlvbnMgaW4gdGhlIGZ1dHVyZVxuICAgICAgdmFyIG5leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5leHRTdGF0ZTtcblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgIHZhciBzcGF3bmVkQ2FjaGVQb29sID0gbnVsbDsgLy8gV2UncmUgaGlkZGVuLCBhbmQgd2UncmUgbm90IHJlbmRlcmluZyBhdCBPZmZzY3JlZW4uIFdlIHdpbGwgYmFpbCBvdXRcbiAgICAgIC8vIGFuZCByZXN1bWUgdGhpcyB0cmVlIGxhdGVyLlxuXG4gICAgICB2YXIgbmV4dEJhc2VMYW5lcztcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgcHJldkJhc2VMYW5lcyA9IHByZXZTdGF0ZS5iYXNlTGFuZXM7XG4gICAgICAgIG5leHRCYXNlTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZCYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRCYXNlTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICAgIH0gLy8gU2NoZWR1bGUgdGhpcyBmaWJlciB0byByZS1yZW5kZXIgYXQgb2Zmc2NyZWVuIHByaW9yaXR5LiBUaGVuIGJhaWxvdXQuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gICAgICB2YXIgX25leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IHNwYXduZWRDYWNoZVBvb2wsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGU7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgICAvLyB0byBhdm9pZCBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cblxuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIG5leHRCYXNlTGFuZXMpO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHJlbmRlci4gVGhlIHN1cnJvdW5kaW5nIHZpc2libGUgY29udGVudCBoYXMgYWxyZWFkeVxuICAgICAgLy8gY29tbWl0dGVkLiBOb3cgd2UgcmVzdW1lIHJlbmRlcmluZyB0aGUgaGlkZGVuIHRyZWUuXG4gICAgICAvLyBSZW5kZXJpbmcgYXQgb2Zmc2NyZWVuLCBzbyB3ZSBjYW4gY2xlYXIgdGhlIGJhc2UgbGFuZXMuXG4gICAgICB2YXIgX25leHRTdGF0ZTIgPSB7XG4gICAgICAgIGJhc2VMYW5lczogTm9MYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBfbmV4dFN0YXRlMjsgLy8gUHVzaCB0aGUgbGFuZXMgdGhhdCB3ZXJlIHNraXBwZWQgd2hlbiB3ZSBiYWlsZWQgb3V0LlxuXG4gICAgICB2YXIgc3VidHJlZVJlbmRlckxhbmVzID0gcHJldlN0YXRlICE9PSBudWxsID8gcHJldlN0YXRlLmJhc2VMYW5lcyA6IHJlbmRlckxhbmVzO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlbmRlcmluZyBhIHZpc2libGUgdHJlZS5cbiAgICB2YXIgX3N1YnRyZWVSZW5kZXJMYW5lcztcblxuICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIGdvaW5nIGZyb20gaGlkZGVuIC0+IHZpc2libGUuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2U3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlbid0IHByZXZpb3VzbHkgaGlkZGVuLCBhbmQgd2Ugc3RpbGwgYXJlbid0LCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAgIC8vIHNwZWNpYWwgdG8gZG8uIE5lZWQgdG8gcHVzaCB0byB0aGUgc3RhY2sgcmVnYXJkbGVzcywgdGhvdWdoLCB0byBhdm9pZFxuICAgICAgLy8gYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgfVxuXG4gICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBfc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsICYmIHJlZiAhPT0gbnVsbCB8fCBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSByZWYpIHtcbiAgICAvLyBTY2hlZHVsZSBhIFJlZiBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWY7XG5cbiAgICB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgY29udGV4dDtcblxuICB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgICBjb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBlcnJvci5cbiAgICBzd2l0Y2ggKHNob3VsZEVycm9yKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUT0RPIFRoaXMgd2F5IG9mIHJlc2V0dGluZyB0aGUgZXJyb3IgYm91bmRhcnkgc3RhdGUgaXMgYSBoYWNrLlxuICAgICAgICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuXG4gICAgICAgICAgdmFyIHRlbXBJbnN0YW5jZSA9IG5ldyBjdG9yKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMsIF9pbnN0YW5jZS5jb250ZXh0KTtcbiAgICAgICAgICB2YXIgc3RhdGUgPSB0ZW1wSW5zdGFuY2Uuc3RhdGU7XG5cbiAgICAgICAgICBfaW5zdGFuY2UudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUoX2luc3RhbmNlLCBzdGF0ZSwgbnVsbCk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIHRydWU6XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG5cbiAgICAgICAgICB2YXIgZXJyb3IkMSA9IG5ldyBFcnJvcignU2ltdWxhdGVkIGVycm9yIGNvbWluZyBmcm9tIERldlRvb2xzJyk7XG4gICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlXG5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3JlYXRlQ2FwdHVyZWRWYWx1ZShlcnJvciQxLCB3b3JrSW5Qcm9ncmVzcyksIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIHNob3VsZFVwZGF0ZTtcblxuICBpZiAoaW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBjbGFzcyBjb21wb25lbnQgd2l0aG91dCBhbiBpbnN0YW5jZSBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWRcbiAgICAgIC8vIGluc2lkZSBhIG5vbi1jb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0b1xuICAgICAgLy8gdHJlYXQgaXQgbGlrZSBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5XG4gICAgICAvLyBjb21taXR0ZWQuIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgIH0gLy8gSW4gdGhlIGluaXRpYWwgcGFzcyB3ZSBtaWdodCBuZWVkIHRvIGNvbnN0cnVjdCB0aGUgaW5zdGFuY2UuXG5cblxuICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW4gYSByZXN1bWUsIHdlJ2xsIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSB3ZSBjYW4gcmV1c2UuXG4gICAgc2hvdWxkVXBkYXRlID0gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFVwZGF0ZSA9IHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgbmV4dFVuaXRPZldvcmsgPSBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgdmFyIGluc3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlICYmIGluc3QucHJvcHMgIT09IG5leHRQcm9wcykge1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgIGVycm9yKCdJdCBsb29rcyBsaWtlICVzIGlzIHJlYXNzaWduaW5nIGl0cyBvd24gYHRoaXMucHJvcHNgIHdoaWxlIHJlbmRlcmluZy4gJyArICdUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGNhbiBsZWFkIHRvIGNvbmZ1c2luZyBidWdzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZiQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIGRpZENhcHR1cmVFcnJvciA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmICghc2hvdWxkVXBkYXRlICYmICFkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBDb250ZXh0IHByb3ZpZGVycyBzaG91bGQgZGVmZXIgdG8gc0NVIGZvciByZW5kZXJpbmdcbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gUmVyZW5kZXJcblxuICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIG5leHRDaGlsZHJlbjtcblxuICBpZiAoZGlkQ2FwdHVyZUVycm9yICYmIHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYgd2UgY2FwdHVyZWQgYW4gZXJyb3IsIGJ1dCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXMgbm90IGRlZmluZWQsXG4gICAgLy8gdW5tb3VudCBhbGwgdGhlIGNoaWxkcmVuLiBjb21wb25lbnREaWRDYXRjaCB3aWxsIHNjaGVkdWxlIGFuIHVwZGF0ZSB0b1xuICAgIC8vIHJlLXJlbmRlciBhIGZhbGxiYWNrLiBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBtaWdyYXRlIGV2ZXJ5b25lIHRvXG4gICAgLy8gdGhlIG5ldyBBUEkuXG4gICAgLy8gVE9ETzogV2FybiBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgIG5leHRDaGlsZHJlbiA9IG51bGw7XG5cbiAgICB7XG4gICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGluc3RhbmNlLnJlbmRlcigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBJZiB3ZSdyZSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlY29uY2lsZSB3aXRob3V0IHJldXNpbmcgYW55IG9mXG4gICAgLy8gdGhlIGV4aXN0aW5nIGNoaWxkcmVuLiBDb25jZXB0dWFsbHksIHRoZSBub3JtYWwgY2hpbGRyZW4gYW5kIHRoZSBjaGlsZHJlblxuICAgIC8vIHRoYXQgYXJlIHNob3duIG9uIGVycm9yIGFyZSB0d28gZGlmZmVyZW50IHNldHMsIHNvIHdlIHNob3VsZG4ndCByZXVzZVxuICAgIC8vIG5vcm1hbCBjaGlsZHJlbiBldmVuIGlmIHRoZWlyIGlkZW50aXRpZXMgbWF0Y2guXG4gICAgZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IC8vIE1lbW9pemUgc3RhdGUgdXNpbmcgdGhlIHZhbHVlcyB3ZSBqdXN0IHVzZWQgdG8gcmVuZGVyLlxuICAvLyBUT0RPOiBSZXN0cnVjdHVyZSBzbyB3ZSBuZXZlciByZWFkIHZhbHVlcyBmcm9tIHRoZSBpbnN0YW5jZS5cblxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTsgLy8gVGhlIGNvbnRleHQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNvIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgaXQuXG5cbiAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmIChyb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5wZW5kaW5nQ29udGV4dCwgcm9vdC5wZW5kaW5nQ29udGV4dCAhPT0gcm9vdC5jb250ZXh0KTtcbiAgfSBlbHNlIGlmIChyb290LmNvbnRleHQpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGJlIHNldFxuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGFpbmVySW5mbyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBjdXJyZW50IGZpYmVyLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwcmV2Q2hpbGRyZW4gPSBwcmV2U3RhdGUuZWxlbWVudDtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG5cbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRTdGF0ZS5lbGVtZW50O1xuXG4gIGlmICggcHJldlN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgIC8vIFRoaXMgaXMgYSBoeWRyYXRpb24gcm9vdCB3aG9zZSBzaGVsbCBoYXMgbm90IHlldCBoeWRyYXRlZC4gV2Ugc2hvdWxkXG4gICAgLy8gYXR0ZW1wdCB0byBoeWRyYXRlLlxuICAgIC8vIEZsaXAgaXNEZWh5ZHJhdGVkIHRvIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgd2hlbiB0aGlzIHJlbmRlclxuICAgIC8vIGZpbmlzaGVzLCB0aGUgcm9vdCB3aWxsIG5vIGxvbmdlciBiZSBkZWh5ZHJhdGVkLlxuICAgIHZhciBvdmVycmlkZVN0YXRlID0ge1xuICAgICAgZWxlbWVudDogbmV4dENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBmYWxzZSxcbiAgICAgIGNhY2hlOiBuZXh0U3RhdGUuY2FjaGUsXG4gICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBuZXh0U3RhdGUucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyxcbiAgICAgIHRyYW5zaXRpb25zOiBuZXh0U3RhdGUudHJhbnNpdGlvbnNcbiAgICB9O1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBgYmFzZVN0YXRlYCBjYW4gYWx3YXlzIGJlIHRoZSBsYXN0IHN0YXRlIGJlY2F1c2UgdGhlIHJvb3QgZG9lc24ndFxuICAgIC8vIGhhdmUgcmVkdWNlciBmdW5jdGlvbnMgc28gaXQgZG9lc24ndCBuZWVkIHJlYmFzaW5nLlxuXG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgYSBwcmV2aW91cyBhdHRlbXB0IHRvIGh5ZHJhdGUgdGhlIHNoZWxsLCBzbyB3ZVxuICAgICAgLy8gZm9yY2VkIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gbmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nLiBCZWNhdXNlIHRoZSBlcnJvciBoYXBwZW5lZCBvdXRzaWRlICcgKyAnb2YgYSBTdXNwZW5zZSBib3VuZGFyeSwgdGhlIGVudGlyZSByb290IHdpbGwgc3dpdGNoIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT09IHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIF9yZWNvdmVyYWJsZUVycm9yID0gbmV3IEVycm9yKCdUaGlzIHJvb3QgcmVjZWl2ZWQgYW4gZWFybHkgdXBkYXRlLCBiZWZvcmUgYW55dGhpbmcgd2FzIGFibGUgJyArICdoeWRyYXRlLiBTd2l0Y2hlZCB0aGUgZW50aXJlIHJvb3QgdG8gY2xpZW50IHJlbmRlcmluZy4nKTtcblxuICAgICAgcmV0dXJuIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCBfcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBvdXRlcm1vc3Qgc2hlbGwgaGFzIG5vdCBoeWRyYXRlZCB5ZXQuIFN0YXJ0IGh5ZHJhdGluZy5cbiAgICAgIGVudGVySHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB2YXIgY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7XG4gICAgICB2YXIgbm9kZSA9IGNoaWxkO1xuXG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAvLyBNYXJrIGVhY2ggY2hpbGQgYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgICAgLy8gbm9kZSBoYXMgZnVsbHkgbW91bnRlZCB5ZXQsIGFuZCBmb3Igc2NoZWR1bGluZyBldmVudCByZXBsYXlpbmcuXG4gICAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgICAgLy8gbXV0YXRpb25zIGJlY2F1c2UgaXQgYWxyZWFkeSBleGlzdHMuXG4gICAgICAgIG5vZGUuZmxhZ3MgPSBub2RlLmZsYWdzICYgflBsYWNlbWVudCB8IEh5ZHJhdGluZztcbiAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUm9vdCBpcyBub3QgZGVoeWRyYXRlZC4gRWl0aGVyIHRoaXMgaXMgYSBjbGllbnQtb25seSByb290LCBvciBpdFxuICAgIC8vIGFscmVhZHkgaHlkcmF0ZWQuXG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuXG4gICAgaWYgKG5leHRDaGlsZHJlbiA9PT0gcHJldkNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIHJlY292ZXJhYmxlRXJyb3IpIHtcbiAgLy8gUmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXG4gIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0Q29tcG9uZW50JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbnVsbDtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGlzRGlyZWN0VGV4dENoaWxkID0gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgbmV4dFByb3BzKTtcblxuICBpZiAoaXNEaXJlY3RUZXh0Q2hpbGQpIHtcbiAgICAvLyBXZSBzcGVjaWFsIGNhc2UgYSBkaXJlY3QgdGV4dCBjaGlsZCBvZiBhIGhvc3Qgbm9kZS4gVGhpcyBpcyBhIGNvbW1vblxuICAgIC8vIGNhc2UuIFdlIHdvbid0IGhhbmRsZSBpdCBhcyBhIHJlaWZpZWQgY2hpbGQuIFdlIHdpbGwgaW5zdGVhZCBoYW5kbGVcbiAgICAvLyB0aGlzIGluIHRoZSBob3N0IGVudmlyb25tZW50IHRoYXQgYWxzbyBoYXMgYWNjZXNzIHRvIHRoaXMgcHJvcC4gVGhhdFxuICAgIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGFub3RoZXIgSG9zdFRleHQgZmliZXIgYW5kIHRyYXZlcnNpbmcgaXQuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChwcmV2UHJvcHMgIT09IG51bGwgJiYgc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJldlByb3BzKSkge1xuICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZyBmcm9tIGEgZGlyZWN0IHRleHQgY2hpbGQgdG8gYSBub3JtYWwgY2hpbGQsIG9yIHRvXG4gICAgLy8gZW1wdHksIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIHRleHQgY29udGVudCB0byBiZSByZXNldC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmJDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuIFRoaXMgaXMgdGVybWluYWwuIFdlJ2xsIGRvIHRoZSBjb21wbGV0aW9uIHN0ZXBcbiAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIuXG5cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXp5Q29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZWxlbWVudFR5cGUsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChfY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIEEgbGF6eSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgIF9jdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbGF6eUNvbXBvbmVudCA9IGVsZW1lbnRUeXBlO1xuICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcbiAgdmFyIENvbXBvbmVudCA9IGluaXQocGF5bG9hZCk7IC8vIFN0b3JlIHRoZSB1bndyYXBwZWQgY29tcG9uZW50IGluIHRoZSB0eXBlLlxuXG4gIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQ7XG4gIHZhciByZXNvbHZlZFRhZyA9IHdvcmtJblByb2dyZXNzLnRhZyA9IHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCk7XG4gIHZhciByZXNvbHZlZFByb3BzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHByb3BzKTtcbiAgdmFyIGNoaWxkO1xuXG4gIHN3aXRjaCAocmVzb2x2ZWRUYWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGb3J3YXJkUmVmKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIHJlc29sdmVkUHJvcHMsIC8vIFJlc29sdmVkIGZvciBvdXRlciBvbmx5XG4gICAgICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlTWVtb0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudC50eXBlLCByZXNvbHZlZFByb3BzKSwgLy8gVGhlIGlubmVyIHR5cGUgY2FuIGhhdmUgZGVmYXVsdHMgdG9vXG4gICAgICAgIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICB9XG5cbiAgdmFyIGhpbnQgPSAnJztcblxuICB7XG4gICAgaWYgKENvbXBvbmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgQ29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiBDb21wb25lbnQuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgaGludCA9ICcgRGlkIHlvdSB3cmFwIGEgY29tcG9uZW50IGluIFJlYWN0LmxhenkoKSBtb3JlIHRoYW4gb25jZT8nO1xuICAgIH1cbiAgfSAvLyBUaGlzIG1lc3NhZ2UgaW50ZW50aW9uYWxseSBkb2Vzbid0IG1lbnRpb24gRm9yd2FyZFJlZiBvciBNZW1vQ29tcG9uZW50XG4gIC8vIGJlY2F1c2UgdGhlIGZhY3QgdGhhdCBpdCdzIGEgc2VwYXJhdGUgdHlwZSBvZiB3b3JrIGlzIGFuXG4gIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbC5cblxuXG4gIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgdHlwZSBpcyBpbnZhbGlkLiBSZWNlaXZlZCBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0bzogXCIgKyBDb21wb25lbnQgKyBcIi4gXCIgKyAoXCJMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi5cIiArIGhpbnQpKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKF9jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gQW4gaW5jb21wbGV0ZSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgIF9jdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cblxuICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuICAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChfY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIEFuIGluZGV0ZXJtaW5hdGUgY29tcG9uZW50IG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZCBpbnNpZGUgYSBub24tXG4gICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgIC8vIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHkgY29tbWl0dGVkLlxuICAgIC8vIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICBfY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgaGFzSWQ7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBudWxsKTtcbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIHtcbiAgICAvLyBTdXBwb3J0IGZvciBtb2R1bGUgY29tcG9uZW50cyBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGJlaGluZCBhIGZsYWcuXG4gICAgLy8gV2hldGhlciBvciBub3QgaXQgd291bGQgY3Jhc2ggbGF0ZXIsIHdlIHdhbnQgdG8gc2hvdyBhIGdvb2QgbWVzc2FnZSBpbiBERVYgZmlyc3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICggLy8gUnVuIHRoZXNlIGNoZWNrcyBpbiBwcm9kdWN0aW9uIG9ubHkgaWYgdGhlIGZsYWcgaXMgb2ZmLlxuICAvLyBFdmVudHVhbGx5IHdlJ2xsIGRlbGV0ZSB0aGlzIGJyYW5jaCBhbHRvZ2V0aGVyLlxuICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4obnVsbCwgd29ya0luUHJvZ3Jlc3MsIHZhbHVlLCByZW5kZXJMYW5lcyk7XG5cbiAgICB7XG4gICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIHtcbiAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICBpZiAoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICB9XG5cbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8ICcnO1xuICAgICAgdmFyIGRlYnVnU291cmNlID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlO1xuXG4gICAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgICAgd2FybmluZ0tleSA9IGRlYnVnU291cmNlLmZpbGVOYW1lICsgJzonICsgZGVidWdTb3VyY2UubGluZU51bWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUzID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBjb250ZXh0VHlwZS4nLCBfY29tcG9uZW50TmFtZTQpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFNVU1BFTkRFRF9NQVJLRVIgPSB7XG4gIGRlaHlkcmF0ZWQ6IG51bGwsXG4gIHRyZWVDb250ZXh0OiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lcyxcbiAgICBjYWNoZVBvb2w6IGdldFN1c3BlbmRlZENhY2hlKCksXG4gICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjYWNoZVBvb2wgPSBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiBtZXJnZUxhbmVzKHByZXZPZmZzY3JlZW5TdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKSxcbiAgICBjYWNoZVBvb2w6IGNhY2hlUG9vbCxcbiAgICB0cmFuc2l0aW9uczogcHJldk9mZnNjcmVlblN0YXRlLnRyYW5zaXRpb25zXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgIC8vIGlzIHRydWUuIE1vcmUgcHJlY2lzZSBuYW1lIG1pZ2h0IGJlIFwiRm9yY2VSZW1haW5TdXNwZW5zZUZhbGxiYWNrXCIuXG4gICAgICAvLyBOb3RlOiBUaGlzIGlzIGEgZmFjdG9yaW5nIHNtZWxsLiBDYW4ndCByZW1haW4gb24gYSBmYWxsYmFjayBpZiB0aGVyZSdzXG4gICAgICAvLyBubyBmYWxsYmFjayB0byByZW1haW4gb24uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIE5vdCBjdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBDb25zdWx0IHRoZSBTdXNwZW5zZSBjb250ZXh0LlxuXG5cbiAgcmV0dXJuIGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IFNob3VsZCBub3QgcmVtb3ZlIHJlbmRlciBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIGR1cmluZyB0aGlzIHJlbmRlclxuICByZXR1cm4gcmVtb3ZlTGFuZXMoY3VycmVudC5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBzdXNwZW5kLlxuXG4gIHtcbiAgICBpZiAoc2hvdWxkU3VzcGVuZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3dGYWxsYmFjayA9IGZhbHNlO1xuICB2YXIgZGlkU3VzcGVuZCA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChkaWRTdXNwZW5kIHx8IHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50KSkge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGlzIGJvdW5kYXJ5J3Mgc3VidHJlZSBhbHJlYWR5IHN1c3BlbmRlZC4gU3dpdGNoIHRvXG4gICAgLy8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICBzaG93RmFsbGJhY2sgPSB0cnVlO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5EaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIC8vIEF0dGVtcHRpbmcgdGhlIG1haW4gY29udGVudFxuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudCBvciB0aGlzIGJvdW5kYXJ5IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gTWFyayB0aGlzIHN1YnRyZWUgY29udGV4dCBhcyBoYXZpbmcgYXQgbGVhc3Qgb25lIGludmlzaWJsZSBwYXJlbnQgdGhhdCBjb3VsZFxuICAgICAgLy8gaGFuZGxlIHRoZSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIEF2b2lkZWQgYm91bmRhcmllcyBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2UgdGhleSBjYW5ub3QgaGFuZGxlIHByZWZlcnJlZCBmYWxsYmFjayBzdGF0ZXMuXG4gICAgICB7XG4gICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIE9LLCB0aGUgbmV4dCBwYXJ0IGlzIGNvbmZ1c2luZy4gV2UncmUgYWJvdXQgdG8gcmVjb25jaWxlIHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSdzIGNoaWxkcmVuLiBUaGlzIGludm9sdmVzIHNvbWUgY3VzdG9tIHJlY29uY2lsaWF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGh5ZHJhdGluZywgdHJ5IHRvIGh5ZHJhdGUgdGhpcyBib3VuZGFyeS5cbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7IC8vIFRoaXMgY291bGQndmUgYmVlbiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50LlxuXG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICBpZiAoZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIGRlaHlkcmF0ZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBuZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcblxuICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgIHZhciBmYWxsYmFja0ZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50Lm1lbW9pemVkU3RhdGUgPSBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG5cbiAgICAgIHJldHVybiBmYWxsYmFja0ZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYW4gdXBkYXRlLlxuICAgIC8vIElmIHRoZSBjdXJyZW50IGZpYmVyIGhhcyBhIFN1c3BlbnNlU3RhdGUsIHRoYXQgbWVhbnMgaXQncyBhbHJlYWR5IHNob3dpbmdcbiAgICAvLyBhIGZhbGxiYWNrLlxuICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0cmVlIGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrXG4gICAgICAvLyBTcGVjaWFsIHBhdGggZm9yIGh5ZHJhdGlvblxuICAgICAgdmFyIF9kZWh5ZHJhdGVkID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChfZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoIWRpZFN1c3BlbmQpIHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfZGVoeWRyYXRlZCwgcHJldlN0YXRlLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgICAgIC8vIFNvbWV0aGluZyBlcnJvcmVkIGR1cmluZyBoeWRyYXRpb24uIFRyeSBhZ2FpbiB3aXRob3V0IGh5ZHJhdGluZy5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG4gICAgICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgbmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nIHRoaXMgU3VzcGVuc2UgYm91bmRhcnkuICcgKyAnU3dpdGNoZWQgdG8gY2xpZW50IHJlbmRlcmluZy4nKSk7XG4gICAgICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQgYW5kIHdlIHNob3VsZCBzdGlsbCBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuXG4gICAgICAgICAgLy8gTGVhdmUgdGhlIGV4aXN0aW5nIGNoaWxkIGluIHBsYWNlLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhlIGRlaHlkcmF0ZWQgY29tcGxldGlvbiBwYXNzIGV4cGVjdHMgdGhpcyBmbGFnIHRvIGJlIHRoZXJlXG4gICAgICAgICAgLy8gYnV0IHRoZSBub3JtYWwgc3VzcGVuc2UgcGFzcyBkb2Vzbid0LlxuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTdXNwZW5kZWQgYnV0IHdlIHNob3VsZCBubyBsb25nZXIgYmUgaW4gZGVoeWRyYXRlZCBtb2RlLlxuICAgICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBub3cgaGF2ZSB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgICB2YXIgX25leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tBZnRlclJldHJ5V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4sIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjIgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjIgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgICAgdmFyIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQgPSB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiwgX25leHRGYWxsYmFja0NoaWxkcmVuMiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3RhdGUgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDMubWVtb2l6ZWRTdGF0ZSA9IHByZXZPZmZzY3JlZW5TdGF0ZSA9PT0gbnVsbCA/IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykgOiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDMuY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICAgIHJldHVybiBfZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuMyA9IG5leHRQcm9wcy5jaGlsZHJlbjtcblxuICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NCA9IHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IHRyZWUgaXMgbm90IGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrLlxuICAgICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgICAvLyBUaW1lZCBvdXQuXG4gICAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4zID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW40ID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfZmFsbGJhY2tDaGlsZEZyYWdtZW50MiA9IHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW40LCBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4zLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgdmFyIF9wcmV2T2Zmc2NyZWVuU3RhdGUgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDUubWVtb2l6ZWRTdGF0ZSA9IF9wcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShfcHJldk9mZnNjcmVlblN0YXRlLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDUuY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgLy8gZmFsbGJhY2sgY2hpbGRyZW4uXG5cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgICAgcmV0dXJuIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RpbGwgaGF2ZW4ndCB0aW1lZCBvdXQuIENvbnRpbnVlIHJlbmRlcmluZyB0aGUgY2hpbGRyZW4sIGxpa2Ugd2VcbiAgICAgICAgLy8gbm9ybWFsbHkgZG8uXG4gICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjUgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDYgPSB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW41LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIHJldHVybiBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ2O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gICAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKG9mZnNjcmVlblByb3BzLCBtb2RlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbmAgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZVxuICAvLyB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKG9mZnNjcmVlblByb3BzLCBtb2RlLCBOb0xhbmVzLCBudWxsKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZVdvcmtJblByb2dyZXNzYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlIHRoaXNcbiAgLy8gd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH0pO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gbnVsbDtcblxuICBpZiAoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIC8vIERlbGV0ZSB0aGUgZmFsbGJhY2sgY2hpbGQgZnJhZ21lbnRcbiAgICB2YXIgZGVsZXRpb25zID0gd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gW2N1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnRdO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuXG4gIGlmICggLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAvLyBjb21wbGV0ZWQsIGV2ZW4gdGhvdWdoIGl0J3MgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLlxuICAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIE1ha2Ugc3VyZSB3ZSdyZSBvbiB0aGUgc2Vjb25kIHBhc3MsIGkuZS4gdGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgd2FzXG4gIC8vIGFscmVhZHkgY2xvbmVkLiBJbiBsZWdhY3kgbW9kZSwgdGhlIG9ubHkgY2FzZSB3aGVyZSB0aGlzIGlzbid0IHRydWUgaXNcbiAgLy8gd2hlbiBEZXZUb29scyBmb3JjZXMgdXMgdG8gZGlzcGxheSBhIGZhbGxiYWNrOyB3ZSBza2lwIHRoZSBmaXJzdCByZW5kZXJcbiAgLy8gcGFzcyBlbnRpcmVseSBhbmQgZ28gc3RyYWlnaHQgdG8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjay4gKEluIENvbmN1cnJlbnRcbiAgLy8gTW9kZSwgU3VzcGVuc2VMaXN0IGNhbiBhbHNvIHRyaWdnZXIgdGhpcyBzY2VuYXJpbywgYnV0IHRoaXMgaXMgYSBsZWdhY3ktXG4gIC8vIG9ubHkgY29kZXBhdGguKVxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCAhPT0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50KSB7XG4gICAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfVxuICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIHJlbWFpbiBvbiB0aGUgZmFsbGJhY2ssIHdlIG5vIGxvbmdlciB3YW50XG4gICAgLy8gdG8gZGVsZXRlIGl0LlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHByaW1hcnlDaGlsZFByb3BzKTtcbiAgICAvLyAoV2UgZG9uJ3QgZG8gdGhpcyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBpbiBsZWdhY3kgbW9kZSB3ZSBkb24ndCByZS11c2VcbiAgICAvLyB0aGUgY3VycmVudCB0cmVlOyBzZWUgcHJldmlvdXMgYnJhbmNoLilcblxuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gIH1cblxuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmIChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCwgZmFsbGJhY2tDaGlsZHJlbik7XG4gIH0gZWxzZSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBGYWxsaW5nIGJhY2sgdG8gY2xpZW50IHJlbmRlcmluZy4gQmVjYXVzZSB0aGlzIGhhcyBwZXJmb3JtYW5jZVxuICAvLyBpbXBsaWNhdGlvbnMsIGl0J3MgY29uc2lkZXJlZCBhIHJlY292ZXJhYmxlIGVycm9yLCBldmVuIHRob3VnaCB0aGUgdXNlclxuICAvLyBsaWtlbHkgd29uJ3Qgb2JzZXJ2ZSBhbnl0aGluZyB3cm9uZyB3aXRoIHRoZSBVSS5cbiAgLy9cbiAgLy8gVGhlIGVycm9yIGlzIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCB0byBlbmZvcmNlIHRoYXQgZXZlcnkgY2FsbGVyIHByb3ZpZGVcbiAgLy8gYSBjdXN0b20gbWVzc2FnZSwgb3IgZXhwbGljaXRseSBvcHQgb3V0IChjdXJyZW50bHkgdGhlIG9ubHkgcGF0aCB0aGF0IG9wdHNcbiAgLy8gb3V0IGlzIGxlZ2FjeSBtb2RlOyBldmVyeSBjb25jdXJyZW50IHBhdGggcHJvdmlkZXMgYW4gZXJyb3IpLlxuICBpZiAocmVjb3ZlcmFibGVFcnJvciAhPT0gbnVsbCkge1xuICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IocmVjb3ZlcmFibGVFcnJvcik7XG4gIH0gLy8gVGhpcyB3aWxsIGFkZCB0aGUgb2xkIGZpYmVyIHRvIHRoZSBkZWxldGlvbiBsaXN0XG5cblxuICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBXZSdyZSBub3cgbm90IHN1c3BlbmRlZCBub3IgZGVoeWRyYXRlZC5cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgLy8gbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0FmdGVyUmV0cnlXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBmaWJlck1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBmaWJlck1vZGUpO1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgZmliZXJNb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSkgYWxyZWFkeSBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAvLyBXZSB3aWxsIGhhdmUgZHJvcHBlZCB0aGUgZWZmZWN0IGxpc3Qgd2hpY2ggY29udGFpbnMgdGhlXG4gICAgLy8gZGVsZXRpb24uIFdlIG5lZWQgdG8gcmVjb25jaWxlIHRvIGRlbGV0ZSB0aGUgY3VycmVudCBjaGlsZC5cbiAgICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlSW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7XG4gIC8vIER1cmluZyB0aGUgZmlyc3QgcGFzcywgd2UnbGwgYmFpbCBvdXQgYW5kIG5vdCBkcmlsbCBpbnRvIHRoZSBjaGlsZHJlbi5cbiAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgdGhlIGNvbnRlbnQgaW4gcGxhY2UgYW5kIHRyeSB0byBoeWRyYXRlIGl0IGxhdGVyLlxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHtcbiAgICAgIGVycm9yKCdDYW5ub3QgaHlkcmF0ZSBTdXNwZW5zZSBpbiBsZWdhY3kgbW9kZS4gU3dpdGNoIGZyb20gJyArICdSZWFjdERPTS5oeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lcikgdG8gJyArICdSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pJyArICcucmVuZGVyKGVsZW1lbnQpIG9yIHJlbW92ZSB0aGUgU3VzcGVuc2UgY29tcG9uZW50cyBmcm9tICcgKyAndGhlIHNlcnZlciByZW5kZXJlZCBjb21wb25lbnRzLicpO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoU3luY0xhbmUpO1xuICB9IGVsc2UgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgLy8gVGhpcyBpcyBhIGNsaWVudC1vbmx5IGJvdW5kYXJ5LiBTaW5jZSB3ZSB3b24ndCBnZXQgYW55IGNvbnRlbnQgZnJvbSB0aGUgc2VydmVyXG4gICAgLy8gZm9yIHRoaXMsIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhhdCBhdCBhIGhpZ2hlciBwcmlvcml0eSBiYXNlZCBvbiB3aGVuIGl0IHdvdWxkXG4gICAgLy8gaGF2ZSB0aW1lZCBvdXQuIEluIHRoZW9yeSB3ZSBjb3VsZCByZW5kZXIgaXQgaW4gdGhpcyBwYXNzIGJ1dCBpdCB3b3VsZCBoYXZlIHRoZVxuICAgIC8vIHdyb25nIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBpdCBhbmQgd2lsbCBwcmV2ZW50IGh5ZHJhdGlvbiBvZiBwYXJlbnQgcGF0aC5cbiAgICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB3b3JrIGxlZnQgb24gaXQgdG8gcmVuZGVyIGl0IGluIGEgc2VwYXJhdGUgY29tbWl0LlxuICAgIC8vIFRPRE8gVGhpcyB0aW1lIHNob3VsZCBiZSB0aGUgdGltZSBhdCB3aGljaCB0aGUgc2VydmVyIHJlbmRlcmVkIHJlc3BvbnNlIHRoYXQgaXNcbiAgICAvLyBhIHBhcmVudCB0byB0aGlzIGJvdW5kYXJ5IHdhcyBkaXNwbGF5ZWQuIEhvd2V2ZXIsIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBoYXZlXG4gICAgLy8gYSBwcm90b2NvbCB0byB0cmFuc2ZlciB0aGF0IHRpbWUsIHdlJ2xsIGp1c3QgZXN0aW1hdGUgaXQgYnkgdXNpbmcgdGhlIGN1cnJlbnRcbiAgICAvLyB0aW1lLiBUaGlzIHdpbGwgbWVhbiB0aGF0IFN1c3BlbnNlIHRpbWVvdXRzIGFyZSBzbGlnaHRseSBzaGlmdGVkIHRvIGxhdGVyIHRoYW5cbiAgICAvLyB0aGV5IHNob3VsZCBiZS5cbiAgICAvLyBTY2hlZHVsZSBhIG5vcm1hbCBwcmkgdXBkYXRlIHRvIHJlbmRlciB0aGlzIGNvbnRlbnQuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhEZWZhdWx0SHlkcmF0aW9uTGFuZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UnbGwgY29udGludWUgaHlkcmF0aW5nIHRoZSByZXN0IGF0IG9mZnNjcmVlbiBwcmlvcml0eSBzaW5jZSB3ZSdsbCBhbHJlYWR5XG4gICAgLy8gYmUgc2hvd2luZyB0aGUgcmlnaHQgY29udGVudCBjb21pbmcgZnJvbSB0aGUgc2VydmVyLCBpdCBpcyBubyBydXNoLlxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLCByZW5kZXJMYW5lcykge1xuICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaHlkcmF0aW5nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgcGFzcyxcbiAgLy8gYnV0IGFmdGVyIHdlJ3ZlIGFscmVhZHkgY29tbWl0dGVkIG9uY2UuXG4gIHdhcm5JZkh5ZHJhdGluZygpO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgLy8gVE9ETzogV2hlbiB3ZSBkZWxldGUgbGVnYWN5IG1vZGUsIHdlIHNob3VsZCBtYWtlIHRoaXMgZXJyb3IgYXJndW1lbnRcbiAgICAvLyByZXF1aXJlZCBcdTIwMTQgZXZlcnkgY29uY3VycmVudCBtb2RlIHBhdGggdGhhdCBjYXVzZXMgaHlkcmF0aW9uIHRvXG4gICAgLy8gZGUtb3B0IHRvIGNsaWVudCByZW5kZXJpbmcgc2hvdWxkIGhhdmUgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICBudWxsKTtcbiAgfVxuXG4gIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgIC8vIFRoaXMgYm91bmRhcnkgaXMgaW4gYSBwZXJtYW5lbnQgZmFsbGJhY2sgc3RhdGUuIEluIHRoaXMgY2FzZSwgd2UnbGwgbmV2ZXJcbiAgICAvLyBnZXQgYW4gdXBkYXRlIGFuZCB3ZSdsbCBuZXZlciBiZSBhYmxlIHRvIGh5ZHJhdGUgdGhlIGZpbmFsIGNvbnRlbnQuIExldCdzIGp1c3QgdHJ5IHRoZVxuICAgIC8vIGNsaWVudCBzaWRlIHJlbmRlciBpbnN0ZWFkLlxuICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIC8vIFRPRE86IFRoZSBzZXJ2ZXIgc2hvdWxkIHNlcmlhbGl6ZSB0aGUgZXJyb3IgbWVzc2FnZSBzbyB3ZSBjYW4gbG9nIGl0XG4gICAgLy8gaGVyZSBvbiB0aGUgY2xpZW50LiBPciwgaW4gcHJvZHVjdGlvbiwgYSBoYXNoL2lkIHRoYXQgY29ycmVzcG9uZHMgdG9cbiAgICAvLyB0aGUgZXJyb3IuXG4gICAgbmV3IEVycm9yKCdUaGUgc2VydmVyIGNvdWxkIG5vdCBmaW5pc2ggdGhpcyBTdXNwZW5zZSBib3VuZGFyeSwgbGlrZWx5ICcgKyAnZHVlIHRvIGFuIGVycm9yIGR1cmluZyBzZXJ2ZXIgcmVuZGVyaW5nLiBTd2l0Y2hlZCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJykpO1xuICB9XG4gIC8vIGFueSBjb250ZXh0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHRyZWF0IGlzIGFzIGlmIHRoZSBpbnB1dCBtaWdodCBoYXZlIGNoYW5nZWQuXG5cblxuICB2YXIgaGFzQ29udGV4dENoYW5nZWQgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBjdXJyZW50LmNoaWxkTGFuZXMpO1xuXG4gIGlmIChkaWRSZWNlaXZlVXBkYXRlIHx8IGhhc0NvbnRleHRDaGFuZ2VkKSB7XG4gICAgLy8gVGhpcyBib3VuZGFyeSBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgZmlyc3QgcmVuZGVyLiBUaGlzIG1lYW5zIHRoYXQgd2UgYXJlIG5vdyB1bmFibGUgdG9cbiAgICAvLyBoeWRyYXRlIGl0LiBXZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIGh5ZHJhdGUgaXQgdXNpbmcgYSBoaWdoZXIgcHJpb3JpdHkgbGFuZS5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lID0gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmIChhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBOb0xhbmUgJiYgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSAhPT0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBtdXRhdGluZyBzaW5jZSB0aGlzIHJlbmRlciB3aWxsIGdldCBpbnRlcnJ1cHRlZC4gVGhpc1xuICAgICAgICAvLyBpcyBvbmUgb2YgdGhlIHZlcnkgcmFyZSB0aW1lcyB3aGVyZSB3ZSBtdXRhdGUgdGhlIGN1cnJlbnQgdHJlZVxuICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lOyAvLyBUT0RPOiBJZGVhbGx5IHRoaXMgd291bGQgaW5oZXJpdCB0aGUgZXZlbnQgdGltZSBvZiB0aGUgY3VycmVudCByZW5kZXJcblxuICAgICAgICB2YXIgZXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lLCBldmVudFRpbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgaGF2ZSBzY2hlZHVsZWQgaGlnaGVyIHByaSB3b3JrIGFib3ZlLCB0aGlzIHdpbGwgcHJvYmFibHkganVzdCBhYm9ydCB0aGUgcmVuZGVyXG4gICAgLy8gc2luY2Ugd2Ugbm93IGhhdmUgaGlnaGVyIHByaW9yaXR5IHdvcmssIGJ1dCBpbiBjYXNlIGl0IGRvZXNuJ3QsIHdlIG5lZWQgdG8gcHJlcGFyZSB0b1xuICAgIC8vIHJlbmRlciBzb21ldGhpbmcsIGlmIHdlIHRpbWUgb3V0LiBFdmVuIGlmIHRoYXQgcmVxdWlyZXMgdXMgdG8gZGVsZXRlIGV2ZXJ5dGhpbmcgYW5kXG4gICAgLy8gc2tpcCBoeWRyYXRpb24uXG4gICAgLy8gRGVsYXkgaGF2aW5nIHRvIGRvIHRoaXMgYXMgbG9uZyBhcyB0aGUgc3VzcGVuc2UgdGltZW91dCBhbGxvd3MgdXMuXG5cblxuICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBuZXcgRXJyb3IoJ1RoaXMgU3VzcGVuc2UgYm91bmRhcnkgcmVjZWl2ZWQgYW4gdXBkYXRlIGJlZm9yZSBpdCBmaW5pc2hlZCAnICsgJ2h5ZHJhdGluZy4gVGhpcyBjYXVzZWQgdGhlIGJvdW5kYXJ5IHRvIHN3aXRjaCB0byBjbGllbnQgcmVuZGVyaW5nLiAnICsgJ1RoZSB1c3VhbCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gd3JhcCB0aGUgb3JpZ2luYWwgdXBkYXRlICcgKyAnaW4gc3RhcnRUcmFuc2l0aW9uLicpKTtcbiAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgLy8gVGhpcyBjb21wb25lbnQgaXMgc3RpbGwgcGVuZGluZyBtb3JlIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBzbyB3ZSBjYW4ndCBoeWRyYXRlIGl0c1xuICAgIC8vIGNvbnRlbnQuIFdlIHRyZWF0IGl0IGFzIGlmIHRoaXMgY29tcG9uZW50IHN1c3BlbmRlZCBpdHNlbGYuIEl0IG1pZ2h0IHNlZW0gYXMgaWZcbiAgICAvLyB3ZSBjb3VsZCBqdXN0IHRyeSB0byByZW5kZXIgaXQgY2xpZW50LXNpZGUgaW5zdGVhZC4gSG93ZXZlciwgdGhpcyB3aWxsIHBlcmZvcm0gYVxuICAgIC8vIGxvdCBvZiB1bm5lY2Vzc2FyeSB3b3JrIGFuZCBpcyB1bmxpa2VseSB0byBjb21wbGV0ZSBzaW5jZSBpdCBvZnRlbiB3aWxsIHN1c3BlbmRcbiAgICAvLyBvbiBtaXNzaW5nIGRhdGEgYW55d2F5LiBBZGRpdGlvbmFsbHksIHRoZSBzZXJ2ZXIgbWlnaHQgYmUgYWJsZSB0byByZW5kZXIgbW9yZVxuICAgIC8vIHRoYW4gd2UgY2FuIG9uIHRoZSBjbGllbnQgeWV0LiBJbiB0aGF0IGNhc2Ugd2UnZCBlbmQgdXAgd2l0aCBtb3JlIGZhbGxiYWNrIHN0YXRlc1xuICAgIC8vIG9uIHRoZSBjbGllbnQgdGhhbiBpZiB3ZSBqdXN0IGxlYXZlIGl0IGFsb25lLiBJZiB0aGUgc2VydmVyIHRpbWVzIG91dCBvciBlcnJvcnNcbiAgICAvLyB0aGVzZSBzaG91bGQgdXBkYXRlIHRoaXMgYm91bmRhcnkgdG8gdGhlIHBlcm1hbmVudCBGYWxsYmFjayBzdGF0ZSBpbnN0ZWFkLlxuICAgIC8vIE1hcmsgaXQgYXMgaGF2aW5nIGNhcHR1cmVkIChpLmUuIHN1c3BlbmRlZCkuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsgLy8gTGVhdmUgdGhlIGNoaWxkIGluIHBsYWNlLiBJLmUuIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50LlxuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIHJldHJ5IHRoaXMgYm91bmRhcnkgb25jZSB0aGUgc2VydmVyIGhhcyBzZW50IHRoZSByZXN1bHQuXG5cbiAgICB2YXIgcmV0cnkgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQobnVsbCwgY3VycmVudCk7XG4gICAgcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoc3VzcGVuc2VJbnN0YW5jZSwgcmV0cnkpO1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGF0dGVtcHQuXG4gICAgcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLnRyZWVDb250ZXh0KTtcbiAgICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTWFyayB0aGUgY2hpbGRyZW4gYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gSHlkcmF0aW5nO1xuICAgIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIoZmliZXIsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCk7XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgZmlyc3RDaGlsZCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTWFyayBhbnkgU3VzcGVuc2UgYm91bmRhcmllcyB3aXRoIGZhbGxiYWNrcyBhcyBoYXZpbmcgd29yayB0byBkby5cbiAgLy8gSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgZm9yY2VkIGludG8gZmFsbGJhY2tzLCB0aGV5IG1heSBub3cgYmUgYWJsZVxuICAvLyB0byB1bmJsb2NrLlxuICB2YXIgbm9kZSA9IGZpcnN0Q2hpbGQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIobm9kZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQpIHtcbiAgICAgIC8vIElmIHRoZSB0YWlsIGlzIGhpZGRlbiB0aGVyZSBtaWdodCBub3QgYmUgYW4gU3VzcGVuc2UgYm91bmRhcmllc1xuICAgICAgLy8gdG8gc2NoZWR1bGUgd29yayBvbi4gSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgb24gdGhlXG4gICAgICAvLyBsaXN0IGl0c2VsZi5cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBsaXN0IHNpbmNlXG4gICAgICAvLyB0aGUgbGlzdCB3aWxsIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIHdoZW4gaXQgcmVyZW5kZXJzLlxuICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgLy8gVGhpcyBpcyBnb2luZyB0byBmaW5kIHRoZSBsYXN0IHJvdyBhbW9uZyB0aGVzZSBjaGlsZHJlbiB0aGF0IGlzIGFscmVhZHlcbiAgLy8gc2hvd2luZyBjb250ZW50IG9uIHRoZSBzY3JlZW4sIGFzIG9wcG9zZWQgdG8gYmVpbmcgaW4gZmFsbGJhY2sgc3RhdGUgb3JcbiAgLy8gbmV3LiBJZiBhIHJvdyBoYXMgbXVsdGlwbGUgU3VzcGVuc2UgYm91bmRhcmllcywgYW55IG9mIHRoZW0gYmVpbmcgaW4gdGhlXG4gIC8vIGZhbGxiYWNrIHN0YXRlLCBjb3VudHMgYXMgdGhlIHdob2xlIHJvdyBiZWluZyBpbiBhIGZhbGxiYWNrIHN0YXRlLlxuICAvLyBOb3RlIHRoYXQgdGhlIFwicm93c1wiIHdpbGwgYmUgd29ya0luUHJvZ3Jlc3MsIGJ1dCBhbnkgbmVzdGVkIGNoaWxkcmVuXG4gIC8vIHdpbGwgc3RpbGwgYmUgY3VycmVudCBzaW5jZSB3ZSBoYXZlbid0IHJlbmRlcmVkIHRoZW0geWV0LiBUaGUgbW91bnRlZFxuICAvLyBvcmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBuZXcgb3JkZXIuIFdlIHVzZSB0aGUgbmV3IG9yZGVyLlxuICB2YXIgcm93ID0gZmlyc3RDaGlsZDtcbiAgdmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDtcblxuICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgIGxhc3RDb250ZW50Um93ID0gcm93O1xuICAgIH1cblxuICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RDb250ZW50Um93O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAocmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCAmJiByZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICd0b2dldGhlcicgJiYgIWRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSkge1xuICAgICAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiByZXZlYWxPcmRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1VzZSBsb3dlcmNhc2UgXCIlc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZm9yd2FyZCc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1JlYWN0IHVzZXMgdGhlIC1zIHN1ZmZpeCBpbiB0aGUgc3BlbGxpbmcuIFVzZSBcIiVzc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAodGFpbE1vZGUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdKSB7XG4gICAgICBpZiAodGFpbE1vZGUgIT09ICdjb2xsYXBzZWQnICYmIHRhaWxNb2RlICE9PSAnaGlkZGVuJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciB0YWlsIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgJyArICdcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIi4gJyArICdEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkU2xvdCwgaW5kZXgpIHtcbiAge1xuICAgIHZhciBpc0FuQXJyYXkgPSBpc0FycmF5KGNoaWxkU2xvdCk7XG4gICAgdmFyIGlzSXRlcmFibGUgPSAhaXNBbkFycmF5ICYmIHR5cGVvZiBnZXRJdGVyYXRvckZuKGNoaWxkU2xvdCkgPT09ICdmdW5jdGlvbic7XG5cbiAgICBpZiAoaXNBbkFycmF5IHx8IGlzSXRlcmFibGUpIHtcbiAgICAgIHZhciB0eXBlID0gaXNBbkFycmF5ID8gJ2FycmF5JyA6ICdpdGVyYWJsZSc7XG5cbiAgICAgIGVycm9yKCdBIG5lc3RlZCAlcyB3YXMgcGFzc2VkIHRvIHJvdyAjJXMgaW4gPFN1c3BlbnNlTGlzdCAvPi4gV3JhcCBpdCBpbiAnICsgJ2FuIGFkZGl0aW9uYWwgU3VzcGVuc2VMaXN0IHRvIGNvbmZpZ3VyZSBpdHMgcmV2ZWFsT3JkZXI6ICcgKyAnPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+IC4uLiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPnslc308L1N1c3BlbnNlTGlzdD4gLi4uICcgKyAnPC9TdXNwZW5zZUxpc3Q+JywgdHlwZSwgaW5kZXgsIHR5cGUpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3VzcGVuc2VMaXN0Q2hpbGRyZW4oY2hpbGRyZW4sIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAoKHJldmVhbE9yZGVyID09PSAnZm9yd2FyZHMnIHx8IHJldmVhbE9yZGVyID09PSAnYmFja3dhcmRzJykgJiYgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbiAhPT0gbnVsbCAmJiBjaGlsZHJlbiAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkcmVuW2ldLCBpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5JdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7XG5cbiAgICAgICAgICBpZiAoY2hpbGRyZW5JdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHN0ZXAgPSBjaGlsZHJlbkl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHZhciBfaSA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKHN0ZXAudmFsdWUsIF9pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9pKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yKCdBIHNpbmdsZSByb3cgd2FzIHBhc3NlZCB0byBhIDxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9XCIlc1wiIC8+LiAnICsgJ1RoaXMgaXMgbm90IHVzZWZ1bCBzaW5jZSBpdCBuZWVkcyBtdWx0aXBsZSByb3dzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBwYXNzIG11bHRpcGxlIGNoaWxkcmVuIG9yIGFuIGFycmF5PycsIHJldmVhbE9yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGlzQmFja3dhcmRzLCB0YWlsLCBsYXN0Q29udGVudFJvdywgdGFpbE1vZGUpIHtcbiAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocmVuZGVyU3RhdGUgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0ge1xuICAgICAgaXNCYWNrd2FyZHM6IGlzQmFja3dhcmRzLFxuICAgICAgcmVuZGVyaW5nOiBudWxsLFxuICAgICAgcmVuZGVyaW5nU3RhcnRUaW1lOiAwLFxuICAgICAgbGFzdDogbGFzdENvbnRlbnRSb3csXG4gICAgICB0YWlsOiB0YWlsLFxuICAgICAgdGFpbE1vZGU6IHRhaWxNb2RlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIG9iamVjdCBmcm9tIHByZXZpb3VzIHJlbmRlcnMuXG4gICAgcmVuZGVyU3RhdGUuaXNCYWNrd2FyZHMgPSBpc0JhY2t3YXJkcztcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IDA7XG4gICAgcmVuZGVyU3RhdGUubGFzdCA9IGxhc3RDb250ZW50Um93O1xuICAgIHJlbmRlclN0YXRlLnRhaWwgPSB0YWlsO1xuICAgIHJlbmRlclN0YXRlLnRhaWxNb2RlID0gdGFpbE1vZGU7XG4gIH1cbn0gLy8gVGhpcyBjYW4gZW5kIHVwIHJlbmRlcmluZyB0aGlzIGNvbXBvbmVudCBtdWx0aXBsZSBwYXNzZXMuXG4vLyBUaGUgZmlyc3QgcGFzcyBzcGxpdHMgdGhlIGNoaWxkcmVuIGZpYmVycyBpbnRvIHR3byBzZXRzLiBBIGhlYWQgYW5kIHRhaWwuXG4vLyBXZSBmaXJzdCByZW5kZXIgdGhlIGhlYWQuIElmIGFueXRoaW5nIGlzIGluIGZhbGxiYWNrIHN0YXRlLCB3ZSBkbyBhbm90aGVyXG4vLyBwYXNzIHRocm91Z2ggYmVnaW5Xb3JrIHRvIHJlcmVuZGVyIGFsbCBjaGlsZHJlbiAoaW5jbHVkaW5nIHRoZSB0YWlsKSB3aXRoXG4vLyB0aGUgZm9yY2Ugc3VzcGVuZCBjb250ZXh0LiBJZiB0aGUgZmlyc3QgcmVuZGVyIGRpZG4ndCBoYXZlIGFueXRoaW5nIGluXG4vLyBpbiBmYWxsYmFjayBzdGF0ZS4gVGhlbiB3ZSByZW5kZXIgZWFjaCByb3cgaW4gdGhlIHRhaWwgb25lLWJ5LW9uZS5cbi8vIFRoYXQgaGFwcGVucyBpbiB0aGUgY29tcGxldGVXb3JrIHBoYXNlIHdpdGhvdXQgZ29pbmcgYmFjayB0byBiZWdpbldvcmsuXG5cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcmV2ZWFsT3JkZXIgPSBuZXh0UHJvcHMucmV2ZWFsT3JkZXI7XG4gIHZhciB0YWlsTW9kZSA9IG5leHRQcm9wcy50YWlsO1xuICB2YXIgbmV3Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlU3VzcGVuc2VMaXN0Q2hpbGRyZW4obmV3Q2hpbGRyZW4sIHJldmVhbE9yZGVyKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIHZhciBzaG91bGRGb3JjZUZhbGxiYWNrID0gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcblxuICBpZiAoc2hvdWxkRm9yY2VGYWxsYmFjaykge1xuICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSBjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgLy8gSWYgd2UgcHJldmlvdXNseSBmb3JjZWQgYSBmYWxsYmFjaywgd2UgbmVlZCB0byBzY2hlZHVsZSB3b3JrXG4gICAgICAvLyBvbiBhbnkgbmVzdGVkIGJvdW5kYXJpZXMgdG8gbGV0IHRoZW0ga25vdyB0byB0cnkgdG8gcmVuZGVyXG4gICAgICAvLyBhZ2Fpbi4gVGhpcyBpcyB0aGUgc2FtZSBhcyBjb250ZXh0IHVwZGF0aW5nLlxuICAgICAgcHJvcGFnYXRlU3VzcGVuc2VDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZCwgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIH1cblxuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIFN1c3BlbnNlTGlzdCBkb2Vzbid0IHdvcmsgc28gd2UganVzdFxuICAgIC8vIHVzZSBtYWtlIGl0IGEgbm9vcCBieSB0cmVhdGluZyBpdCBhcyB0aGUgZGVmYXVsdCByZXZlYWxPcmRlci5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHJldmVhbE9yZGVyKSB7XG4gICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGFzdENvbnRlbnRSb3cgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpO1xuICAgICAgICAgIHZhciB0YWlsO1xuXG4gICAgICAgICAgaWYgKGxhc3RDb250ZW50Um93ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgd2hvbGUgbGlzdCBpcyBwYXJ0IG9mIHRoZSB0YWlsLlxuICAgICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgZmFzdCBwYXRoIGJ5IGp1c3QgcmVuZGVyaW5nIHRoZSB0YWlsIG5vdy5cbiAgICAgICAgICAgIHRhaWwgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgdGFpbCByb3dzIGFmdGVyIHRoZSBjb250ZW50IHJvdy5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkgbGF0ZXIuXG4gICAgICAgICAgICB0YWlsID0gbGFzdENvbnRlbnRSb3cuc2libGluZztcbiAgICAgICAgICAgIGxhc3RDb250ZW50Um93LnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gZmluZCB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSdyZSBnb2luZyB0byByZXZlcnNlIHRoZSBsaXN0IG9mIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvLyB3ZSBwYXNzIGluIHRoZSBtZWFudGltZS4gVGhhdCdzIGdvaW5nIHRvIGJlIG91ciB0YWlsIGluIHJldmVyc2VcbiAgICAgICAgICAvLyBvcmRlci5cbiAgICAgICAgICB2YXIgX3RhaWwgPSBudWxsO1xuICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFpbiBjb250ZW50LlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJvdztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICByb3cuc2libGluZyA9IF90YWlsO1xuICAgICAgICAgICAgX3RhaWwgPSByb3c7XG4gICAgICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgICAgIH0gLy8gVE9ETzogSWYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgaXMgbnVsbCwgd2UgY2FuIGNvbnRpbnVlIG9uIHRoZSB0YWlsIGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIHRydWUsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgX3RhaWwsIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICB7XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBudWxsLCAvLyB0YWlsXG4gICAgICAgICAgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHVuZGVmaW5lZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHJldmVhbCBvcmRlciBpcyB0aGUgc2FtZSBhcyBub3QgaGF2aW5nXG4gICAgICAgICAgLy8gYSBib3VuZGFyeS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUG9ydGFscyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlIGRvbid0IGFwcGVuZCB0aGUgY2hpbGRyZW4gZHVyaW5nIG1vdW50XG4gICAgLy8gYnV0IGF0IGNvbW1pdC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gdHJhY2sgaW5zZXJ0aW9ucyB3aGljaCB0aGUgbm9ybWFsXG4gICAgLy8gZmxvdyBkb2Vzbid0IGRvIGR1cmluZyBtb3VudC4gVGhpcyBkb2Vzbid0IGhhcHBlbiBhdCB0aGUgcm9vdCBiZWNhdXNlXG4gICAgLy8gdGhlIHJvb3QgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgXCJjdXJyZW50XCIgd2l0aCBhIG51bGwgY2hpbGQuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgdW5pZnlpbmcgdGhpcyB3aXRoIGhvdyB0aGUgcm9vdCB3b3Jrcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBwcm92aWRlclR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyVHlwZS5fY29udGV4dDtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wcy52YWx1ZTtcblxuICB7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBuZXdQcm9wcykpIHtcbiAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIpIHtcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgYHZhbHVlYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGUgYDxDb250ZXh0LlByb3ZpZGVyPmAuIERpZCB5b3UgbWlzc3BlbGwgaXQgb3IgZm9yZ2V0IHRvIHBhc3MgaXQ/Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3ZpZGVyUHJvcFR5cGVzID0gd29ya0luUHJvZ3Jlc3MudHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAocHJvdmlkZXJQcm9wVHlwZXMpIHtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3ZpZGVyUHJvcFR5cGVzLCBuZXdQcm9wcywgJ3Byb3AnLCAnQ29udGV4dC5Qcm92aWRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgbmV3VmFsdWUpO1xuXG4gIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBvbGRWYWx1ZSA9IG9sZFByb3BzLnZhbHVlO1xuXG4gICAgICBpZiAob2JqZWN0SXMob2xkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICAvLyBObyBjaGFuZ2UuIEJhaWxvdXQgZWFybHkgaWYgY2hpbGRyZW4gYXJlIHRoZSBzYW1lLlxuICAgICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGNvbnRleHQgdmFsdWUgY2hhbmdlZC4gU2VhcmNoIGZvciBtYXRjaGluZyBjb25zdW1lcnMgYW5kIHNjaGVkdWxlXG4gICAgICAgIC8vIHRoZW0gdG8gdXBkYXRlLlxuICAgICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV3UHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dENvbnN1bWVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGU7IC8vIFRoZSBsb2dpYyBiZWxvdyBmb3IgQ29udGV4dCBkaWZmZXJzIGRlcGVuZGluZyBvbiBQUk9EIG9yIERFViBtb2RlLiBJblxuICAvLyBERVYgbW9kZSwgd2UgY3JlYXRlIGEgc2VwYXJhdGUgb2JqZWN0IGZvciBDb250ZXh0LkNvbnN1bWVyIHRoYXQgYWN0c1xuICAvLyBsaWtlIGEgcHJveHkgdG8gQ29udGV4dC4gVGhpcyBwcm94eSBvYmplY3QgYWRkcyB1bm5lY2Vzc2FyeSBjb2RlIGluIFBST0RcbiAgLy8gc28gd2UgdXNlIHRoZSBvbGQgYmVoYXZpb3VyIChDb250ZXh0LkNvbnN1bWVyIHJlZmVyZW5jZXMgQ29udGV4dCkgdG9cbiAgLy8gcmVkdWNlIHNpemUgYW5kIG92ZXJoZWFkLiBUaGUgc2VwYXJhdGUgb2JqZWN0IHJlZmVyZW5jZXMgY29udGV4dCB2aWFcbiAgLy8gYSBwcm9wZXJ0eSBjYWxsZWQgXCJfY29udGV4dFwiLCB3aGljaCBhbHNvIGdpdmVzIHVzIHRoZSBhYmlsaXR5IHRvIGNoZWNrXG4gIC8vIGluIERFViBtb2RlIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIG9yIG5vdCBhbmQgd2FybiBpZiBpdCBkb2VzIG5vdC5cblxuICB7XG4gICAgaWYgKGNvbnRleHQuX2NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBtYXkgYmUgYmVjYXVzZSBpdCdzIGEgQ29udGV4dCAocmF0aGVyIHRoYW4gYSBDb25zdW1lcikuXG4gICAgICAvLyBPciBpdCBtYXkgYmUgYmVjYXVzZSBpdCdzIG9sZGVyIFJlYWN0IHdoZXJlIHRoZXkncmUgdGhlIHNhbWUgdGhpbmcuXG4gICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gd2FybiBpZiB3ZSdyZSBzdXJlIGl0J3MgYSBuZXcgUmVhY3QuXG4gICAgICBpZiAoY29udGV4dCAhPT0gY29udGV4dC5Db25zdW1lcikge1xuICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lcikge1xuICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0PiBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0Ll9jb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJlbmRlciA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0EgY29udGV4dCBjb25zdW1lciB3YXMgcmVuZGVyZWQgd2l0aCBtdWx0aXBsZSBjaGlsZHJlbiwgb3IgYSBjaGlsZCAnICsgXCJ0aGF0IGlzbid0IGEgZnVuY3Rpb24uIEEgY29udGV4dCBjb25zdW1lciBleHBlY3RzIGEgc2luZ2xlIGNoaWxkIFwiICsgJ3RoYXQgaXMgYSBmdW5jdGlvbi4gSWYgeW91IGRpZCBwYXNzIGEgZnVuY3Rpb24sIG1ha2Ugc3VyZSB0aGVyZSAnICsgJ2lzIG5vIHRyYWlsaW5nIG9yIGxlYWRpbmcgd2hpdGVzcGFjZSBhcm91bmQgaXQuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5ld1ZhbHVlID0gcmVhZENvbnRleHQoY29udGV4dCk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCkge1xuICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBSZXVzZSBwcmV2aW91cyBkZXBlbmRlbmNpZXNcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCB1cGRhdGUgXCJiYXNlXCIgcmVuZGVyIHRpbWVzIGZvciBiYWlsb3V0cy5cbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICB9XG5cbiAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcyk7IC8vIENoZWNrIGlmIHRoZSBjaGlsZHJlbiBoYXZlIGFueSBwZW5kaW5nIHdvcmsuXG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSkge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS5cbiAgICAvLyBUT0RPOiBPbmNlIHdlIGFkZCBiYWNrIHJlc3VtaW5nLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNoaWxkcmVuIGFyZVxuICAgIC8vIGEgd29yay1pbi1wcm9ncmVzcyBzZXQuIElmIHNvLCB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZWlyIGVmZmVjdHMuXG4gICAge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgLy8gZmliZXJzIGFuZCBjb250aW51ZS5cblxuXG4gIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHJlbW91bnRGaWJlcihjdXJyZW50LCBvbGRXb3JrSW5Qcm9ncmVzcywgbmV3V29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciByZXR1cm5GaWJlciA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIGlmIChyZXR1cm5GaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcmV2aW91cyBzaWJsaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZTaWJsaW5nLnNpYmxpbmcgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IC8vIERlbGV0ZSB0aGUgb2xkIGZpYmVyIGFuZCBwbGFjZSB0aGUgbmV3IG9uZS5cbiAgICAvLyBTaW5jZSB0aGUgb2xkIGZpYmVyIGlzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBtYW51YWxseS5cblxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjdXJyZW50XTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDsgLy8gUmVzdGFydCB3b3JrIGZyb20gdGhlIG5ldyBmaWJlci5cblxuICAgIHJldHVybiBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBCZWZvcmUgcGVyZm9ybWluZyBhbiBlYXJseSBiYWlsb3V0LCB3ZSBtdXN0IGNoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nXG4gIC8vIHVwZGF0ZXMgb3IgY29udGV4dC5cbiAgdmFyIHVwZGF0ZUxhbmVzID0gY3VycmVudC5sYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZSh1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm8gcGVuZGluZyB1cGRhdGUsIGJ1dCBiZWNhdXNlIGNvbnRleHQgaXMgcHJvcGFnYXRlZCBsYXppbHksIHdlIG5lZWRcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZpYmVyIGRvZXMgbm90IGhhdmUgYW55IHBlbmRpbmcgd29yay4gQmFpbG91dCB3aXRob3V0IGVudGVyaW5nXG4gIC8vIHRoZSBiZWdpbiBwaGFzZS4gVGhlcmUncyBzdGlsbCBzb21lIGJvb2trZWVwaW5nIHdlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy52YWx1ZTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAge1xuICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgdmFyIGhhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFdlIGtub3cgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHN1c3BlbmQgYWdhaW4gYmVjYXVzZSBpZiBpdCBoYXNcbiAgICAgICAgICAgIC8vIGJlZW4gdW5zdXNwZW5kZWQgaXQgaGFzIGNvbW1pdHRlZCBhcyBhIHJlc29sdmVkIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgICAgIC8vIElmIGl0IG5lZWRzIHRvIGJlIHJldHJpZWQsIGl0IHNob3VsZCBoYXZlIHdvcmsgc2NoZWR1bGVkIG9uIGl0LlxuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBXZSBzaG91bGQgbmV2ZXIgcmVuZGVyIHRoZSBjaGlsZHJlbiBvZiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgdW50aWwgd2VcbiAgICAgICAgICAgIC8vIHVwZ3JhZGUgaXQuIFdlIHJldHVybiBudWxsIGluc3RlYWQgb2YgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yay5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSAvLyBJZiB0aGlzIGJvdW5kYXJ5IGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHdlIG5lZWQgdG8gZGVjaWRlXG4gICAgICAgICAgLy8gd2hldGhlciB0byByZXRyeSB0aGUgcHJpbWFyeSBjaGlsZHJlbiwgb3IgdG8gc2tpcCBvdmVyIGl0IGFuZFxuICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgLy8gY2hpbGQgZnJhZ21lbnQuXG5cblxuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgcHJpbWFyeUNoaWxkTGFuZXMpKSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gVXNlIHRoZSBub3JtYWwgcGF0aFxuICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAvLyBvbiBpdFxuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGRvIG5vdCBoYXZlIHBlbmRpbmcgd29yayB3aXRoIHN1ZmZpY2llbnRcbiAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbiBhbmQgd29yayBvbiB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogV2UgY2FuIHJldHVybiBgbnVsbGAgaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgY2hlY2tlZFxuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIHdlcmUgbmVzdGVkIGNvbnRleHQgY29uc3VtZXJzLCB2aWEgdGhlIGNhbGwgdG9cbiAgICAgICAgICAgICAgLy8gYGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmtgIGFib3ZlLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgdmFyIF9oYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIGluIGZhbGxiYWNrIHN0YXRlIGxhc3QgdGltZSwgYW5kIHdlIGhhdmUgYWxsIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBjaGlsZHJlbiB0aGVuIHdlJ3JlIHN0aWxsIGluIHByb2dyZXNzaXZlIGxvYWRpbmcgc3RhdGUuXG4gICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAvLyB0cmVlIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSB0YWlsLiBTbyB3ZSBuZWVkIHRvIHVzZSB0aGUgbm9ybWFsXG4gICAgICAgICAgICAvLyBwYXRoIHRvIGNvbXB1dGUgdGhlIGNvcnJlY3QgdGFpbC5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkIGJlZm9yZSBhbmQgd2UncmUgcmVuZGVyaW5nIHRoZSBzYW1lIGNoaWxkcmVuLFxuICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgLy8gaW4gdGhlIFwidG9nZXRoZXJcIiBtb2RlLCBzbyB3ZSBjYW4gY29udGludWUgZnJvbSB0aGUgc3RhdGUgd2UgaGFkLlxuXG5cbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBSZXNldCB0byB0aGUgXCJ0b2dldGhlclwiIG1vZGUgaW4gY2FzZSB3ZSd2ZSBzdGFydGVkIGEgZGlmZmVyZW50XG4gICAgICAgICAgLy8gdXBkYXRlIGluIHRoZSBwYXN0IGJ1dCBkaWRuJ3QgY29tcGxldGUgaXQuXG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG5cbiAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgdGhlIHRyZWUgc3RpbGwgbmVlZHMgdG8gYmUgZGVmZXJyZWQuIFRoaXMgaXNcbiAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAvLyBzbyB3ZSdsbCBqdXN0IGVudGVyIHRoYXQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2UnbGwgYmFpbCBvdXRcbiAgICAgICAgLy8gYXQgdGhlIG5leHQgbGV2ZWwgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYmVjYXVzZSB0aGUgY2hpbGQgcHJvcHNcbiAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIHJlZmFjdG9yIGBiZWdpbldvcmtgIHRvIHNwbGl0IHRoZSBiYWlsb3V0XG4gICAgICAgIC8vIHBhdGggZnJvbSB0aGUgbm9ybWFsIHBhdGguIEknbSB0ZW1wdGVkIHRvIGRvIGEgbGFiZWxlZCBicmVhayBoZXJlXG4gICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gYmVnaW5Xb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCAmJiBjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHdpbGwgcmVzdGFydCB0aGUgYmVnaW4gcGhhc2Ugd2l0aCBhIG5ldyBmaWJlci5cbiAgICAgIHJldHVybiByZW1vdW50RmliZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5rZXksIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgfHwgbnVsbCwgd29ya0luUHJvZ3Jlc3MubW9kZSwgd29ya0luUHJvZ3Jlc3MubGFuZXMpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IGhhc0NvbnRleHRDaGFuZ2VkKCkgfHwgKCAvLyBGb3JjZSBhIHJlLXJlbmRlciBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZDpcbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIC8vIElmIHByb3BzIG9yIGNvbnRleHQgY2hhbmdlZCwgbWFyayB0aGUgZmliZXIgYXMgaGF2aW5nIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgLy8gVGhpcyBtYXkgYmUgdW5zZXQgaWYgdGhlIHByb3BzIGFyZSBkZXRlcm1pbmVkIHRvIGJlIGVxdWFsIGxhdGVyIChtZW1vKS5cbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIHByb3BzIG5vciBsZWdhY3kgY29udGV4dCBjaGFuZ2VzLiBDaGVjayBpZiB0aGVyZSdzIGEgcGVuZGluZ1xuICAgICAgLy8gdXBkYXRlIG9yIGNvbnRleHQgY2hhbmdlLlxuICAgICAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgJiYgLy8gSWYgdGhpcyBpcyB0aGUgc2Vjb25kIHBhc3Mgb2YgYW4gZXJyb3Igb3Igc3VzcGVuc2UgYm91bmRhcnksIHRoZXJlXG4gICAgICAvLyBtYXkgbm90IGJlIHdvcmsgc2NoZWR1bGVkIG9uIGBjdXJyZW50YCwgc28gd2UgY2hlY2sgZm9yIHRoaXMgZmxhZy5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIE5vIHBlbmRpbmcgdXBkYXRlcyBvciBjb250ZXh0LiBCYWlsIG91dCBub3cuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbiB0aGlzIGZpYmVyLCBidXQgdGhlcmUgYXJlIG5vIG5ldyBwcm9wc1xuICAgICAgICAvLyBub3IgbGVnYWN5IGNvbnRleHQuIFNldCB0aGlzIHRvIGZhbHNlLiBJZiBhbiB1cGRhdGUgcXVldWUgb3IgY29udGV4dFxuICAgICAgICAvLyBjb25zdW1lciBwcm9kdWNlcyBhIGNoYW5nZWQgdmFsdWUsIGl0IHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlLFxuICAgICAgICAvLyB0aGUgY29tcG9uZW50IHdpbGwgYXNzdW1lIHRoZSBjaGlsZHJlbiBoYXZlIG5vdCBjaGFuZ2VkIGFuZCBiYWlsIG91dC5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjaGlsZCBiZWxvbmdzIHRvIGEgbGlzdCBvZiBtdWxpcGxlIGNoaWxkcmVuIGluXG4gICAgICAvLyBpdHMgcGFyZW50LlxuICAgICAgLy9cbiAgICAgIC8vIEluIGEgdHJ1ZSBtdWx0aS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbiwgd2Ugd291bGQgcmVuZGVyIGNoaWxkcmVuIG9uXG4gICAgICAvLyBwYXJhbGxlbCB0aHJlYWRzLiBUaGlzIHdvdWxkIHJlcHJlc2VudCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IHJlbmRlclxuICAgICAgLy8gdGhyZWFkIGZvciB0aGlzIHN1YnRyZWUuXG4gICAgICAvL1xuICAgICAgLy8gV2Ugb25seSB1c2UgdGhpcyBmb3IgaWQgZ2VuZXJhdGlvbiBkdXJpbmcgaHlkcmF0aW9uLCB3aGljaCBpcyB3aHkgdGhlXG4gICAgICAvLyBsb2dpYyBpcyBsb2NhdGVkIGluIHRoaXMgc3BlY2lhbCBicmFuY2guXG4gICAgICB2YXIgc2xvdEluZGV4ID0gd29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IGdldEZvcmtzQXRMZXZlbCgpO1xuICAgICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgICB9XG4gIH0gLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY2xlYXIgcGVuZGluZyB1cGRhdGUgcHJpb3JpdHkuXG4gIC8vIFRPRE86IFRoaXMgYXNzdW1lcyB0aGF0IHdlJ3JlIGFib3V0IHRvIGV2YWx1YXRlIHRoZSBjb21wb25lbnQgYW5kIHByb2Nlc3NcbiAgLy8gdGhlIHVwZGF0ZSBxdWV1ZS4gSG93ZXZlciwgdGhlcmUncyBhbiBleGNlcHRpb246IFNpbXBsZU1lbW9Db21wb25lbnRcbiAgLy8gc29tZXRpbWVzIGJhaWxzIG91dCBsYXRlciBpbiB0aGUgYmVnaW4gcGhhc2UuIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkXG4gIC8vIG1vdmUgdGhpcyBhc3NpZ25tZW50IG91dCBvZiB0aGUgY29tbW9uIHBhdGggYW5kIGludG8gZWFjaCBicmFuY2guXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gQ29tcG9uZW50ID8gdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50ID8gX3VucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCBfcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0VGV4dCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IF90eXBlMi5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZTIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMi50eXBlLCBfcmVzb2x2ZWRQcm9wczMpO1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX3R5cGUyLCBfcmVzb2x2ZWRQcm9wczMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQyID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQyLCBfdW5yZXNvbHZlZFByb3BzNCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gXCIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiB1bndpbmRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIHZhciBfZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoKF9mbGFncyAmIFNob3VsZENhcHR1cmUpICE9PSBOb0ZsYWdzICYmIChfZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgcmVuZGVyIHRoYXQgd2Fzbid0IGNhcHR1cmVkIGJ5IGEgc3VzcGVuc2VcbiAgICAgICAgICAvLyBib3VuZGFyeS4gRG8gYSBzZWNvbmQgcGFzcyBvbiB0aGUgcm9vdCB0byB1bm1vdW50IHRoZSBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH0gLy8gV2UgdW53b3VuZCB0byB0aGUgcm9vdCB3aXRob3V0IGNvbXBsZXRpbmcgaXQuIEV4aXQuXG5cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGVcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RocmV3IGluIG5ld2x5IG1vdW50ZWQgZGVoeWRyYXRlZCBjb21wb25lbnQuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZmxhZ3MyID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKF9mbGFnczIgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MyICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlOyAvLyBDYXB0dXJlZCBhIHN1c3BlbnNlIGVmZmVjdC4gUmUtcmVuZGVyIHRoZSBib3VuZGFyeS5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTsgLy8gU3VzcGVuc2VMaXN0IGRvZXNuJ3QgYWN0dWFsbHkgY2F0Y2ggYW55dGhpbmcuIEl0IHNob3VsZCd2ZSBiZWVuXG4gICAgICAgIC8vIGNhdWdodCBieSBhIG5lc3RlZCBib3VuZGFyeS4gSWYgbm90LCBpdCBzaG91bGQgYnViYmxlIHRocm91Z2guXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcblxuICBzd2l0Y2ggKGludGVycnVwdGVkV29yay50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5jaGlsZENvbnRleHRUeXBlcztcblxuICAgICAgICBpZiAoY2hpbGRDb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY2hpbGRDb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBvcENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBpbnRlcnJ1cHRlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG51bGw7XG5cbntcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBuZXcgU2V0KCk7XG59IC8vIFVzZWQgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBPZmZzY3JlZW4gY29tcG9uZW50IHN0YWNrLlxuLy8gQWxsb3dzIHVzIHRvIGF2b2lkIHRyYXZlcnNpbmcgdGhlIHJldHVybiBwYXRoIHRvIGZpbmQgdGhlIG5lYXJlc3QgT2Zmc2NyZWVuIGFuY2VzdG9yLlxuLy8gT25seSB1c2VkIHdoZW4gZW5hYmxlU3VzcGVuc2VMYXlvdXRFZmZlY3RTZW1hbnRpY3MgaXMgZW5hYmxlZC5cblxuXG52YXIgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gZmFsc2U7XG52YXIgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IGZhbHNlO1xudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcbnZhciBuZXh0RWZmZWN0ID0gbnVsbDsgLy8gVXNlZCBmb3IgUHJvZmlsaW5nIGJ1aWxkcyB0byB0cmFjayB1cGRhdGVycy5cblxudmFyIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG52YXIgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuZnVuY3Rpb24gcmVwb3J0VW5jYXVnaHRFcnJvckluREVWKGVycm9yKSB7XG4gIC8vIFdyYXBwaW5nIGVhY2ggc21hbGwgcGFydCBvZiB0aGUgY29tbWl0IHBoYXNlIGludG8gYSBndWFyZGVkXG4gIC8vIGNhbGxiYWNrIGlzIGEgYml0IHRvbyBzbG93IChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMTY2NikuXG4gIC8vIEJ1dCB3ZSByZWx5IG9uIGl0IHRvIHN1cmZhY2UgZXJyb3JzIHRvIERFViB0b29scyBsaWtlIG92ZXJsYXlzXG4gIC8vIChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIxNzEyKS5cbiAgLy8gQXMgYSBjb21wcm9taXNlLCByZXRocm93IG9ubHkgY2F1Z2h0IGVycm9ycyBpbiBhIGd1YXJkLlxuICB7XG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICAgIGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgfVxufVxuXG52YXIgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyID0gZnVuY3Rpb24gKGN1cnJlbnQsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICB9XG59OyAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQsIGN1cnJlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCB1bm1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkge1xuICB0cnkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lcihjdXJyZW50LCBpbnN0YW5jZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnREaWRNb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkge1xuICB0cnkge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUF0dGFjaFJlZihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgY29tbWl0QXR0YWNoUmVmKGN1cnJlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB2YXIgcmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcmV0VmFsO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlbmFibGVQcm9maWxlckNvbW1pdEhvb2tzICYmIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgIHJldFZhbCA9IHJlZihudWxsKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldFZhbCA9IHJlZihudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxEZXN0cm95KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpIHtcbiAgdHJ5IHtcbiAgICBkZXN0cm95KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59XG5cbnZhciBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xudmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpcnN0Q2hpbGQpIHtcbiAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gcHJlcGFyZUZvckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pO1xuICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCk7IC8vIFdlIG5vIGxvbmdlciBuZWVkIHRvIHRyYWNrIHRoZSBhY3RpdmUgaW5zdGFuY2UgZmliZXJcblxuICB2YXIgc2hvdWxkRmlyZSA9IHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1cjtcbiAgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG4gIHJldHVybiBzaG91bGRGaXJlO1xufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gVGhpcyBwaGFzZSBpcyBvbmx5IHVzZWQgZm9yIGJlZm9yZUFjdGl2ZUluc3RhbmNlQmx1ci5cblxuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBCZWZvcmVNdXRhdGlvbk1hc2spICE9PSBOb0ZsYWdzICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICB0cnkge1xuICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG5cbiAgaWYgKChmbGFncyAmIFNuYXBzaG90KSAhPT0gTm9GbGFncykge1xuICAgIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNuYXBzaG90ID0gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IHByZXZQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIHByZXZQcm9wcyksIHByZXZTdGF0ZSk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGRpZFdhcm5TZXQgPSBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3IoJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUgPSBzbmFwc2hvdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgY2xlYXJDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gZm9yIHRoZXNlIGNvbXBvbmVudCB0eXBlc1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgJyArICdsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG5cbiAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKChlZmZlY3QudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGZpbmlzaGVkV29yaywgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChmbGFncywgZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gTW91bnRcblxuXG4gICAgICAgIHZhciBjcmVhdGUgPSBlZmZlY3QuY3JlYXRlO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSBjcmVhdGUoKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuXG4gICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZGVzdHJveSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGhvb2tOYW1lID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoKGVmZmVjdC50YWcgJiBMYXlvdXQpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChlZmZlY3QudGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlRWZmZWN0JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGFkZGVuZHVtID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoZGVzdHJveSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkIG51bGwuIElmIHlvdXIgZWZmZWN0IGRvZXMgbm90IHJlcXVpcmUgY2xlYW4gJyArICd1cCwgcmV0dXJuIHVuZGVmaW5lZCAob3Igbm90aGluZykuJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlc3Ryb3kudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICdcXG5cXG5JdCBsb29rcyBsaWtlIHlvdSB3cm90ZSAnICsgaG9va05hbWUgKyAnKGFzeW5jICgpID0+IC4uLikgb3IgcmV0dXJuZWQgYSBQcm9taXNlLiAnICsgJ0luc3RlYWQsIHdyaXRlIHRoZSBhc3luYyBmdW5jdGlvbiBpbnNpZGUgeW91ciBlZmZlY3QgJyArICdhbmQgY2FsbCBpdCBpbW1lZGlhdGVseTpcXG5cXG4nICsgaG9va05hbWUgKyAnKCgpID0+IHtcXG4nICsgJyAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKCkge1xcbicgKyAnICAgIC8vIFlvdSBjYW4gYXdhaXQgaGVyZVxcbicgKyAnICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgTXlBUEkuZ2V0RGF0YShzb21lSWQpO1xcbicgKyAnICAgIC8vIC4uLlxcbicgKyAnICB9XFxuJyArICcgIGZldGNoRGF0YSgpO1xcbicgKyBcIn0sIFtzb21lSWRdKTsgLy8gT3IgW10gaWYgZWZmZWN0IGRvZXNuJ3QgbmVlZCBwcm9wcyBvciBzdGF0ZVxcblxcblwiICsgJ0xlYXJuIG1vcmUgYWJvdXQgZGF0YSBmZXRjaGluZyB3aXRoIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaG9va3MtZGF0YS1mZXRjaGluZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkOiAnICsgZGVzdHJveTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IoJyVzIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMnLCBob29rTmFtZSwgYWRkZW5kdW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKSB7XG4gIHtcbiAgICAvLyBPbmx5IFByb2ZpbGVycyB3aXRoIHdvcmsgaW4gdGhlaXIgc3VidHJlZSB3aWxsIGhhdmUgYW4gVXBkYXRlIGVmZmVjdCBzY2hlZHVsZWQuXG4gICAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgaWQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUuaWQsXG4gICAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLm9uUG9zdENvbW1pdDsgLy8gVGhpcyB2YWx1ZSB3aWxsIHN0aWxsIHJlZmxlY3QgdGhlIHByZXZpb3VzIGNvbW1pdCBwaGFzZS5cbiAgICAgICAgICAgIC8vIEl0IGRvZXMgbm90IGdldCByZXNldCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY29tbWl0IHBoYXNlLlxuXG4gICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBwaGFzZSA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgPT09IG51bGwgPyAnbW91bnQnIDogJ3VwZGF0ZSc7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblBvc3RDb21taXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0KGlkLCBwaGFzZSwgcGFzc2l2ZUVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH0gLy8gQnViYmxlIHRpbWVzIHRvIHRoZSBuZXh0IG5lYXJlc3QgYW5jZXN0b3IgUHJvZmlsZXIuXG4gICAgICAgICAgICAvLyBBZnRlciB3ZSBwcm9jZXNzIHRoYXQgUHJvZmlsZXIsIHdlJ2xsIGJ1YmJsZSBmdXJ0aGVyIHVwLlxuXG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG5cbiAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcblxuICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIoZmluaXNoZWRSb290LCBjdXJyZW50LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoICFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGxheW91dCBlZmZlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCAoZHVyaW5nIG11dGF0aW9uIHBoYXNlKS5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHNpYmxpbmcgY29tcG9uZW50IGVmZmVjdHMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIsXG4gICAgICAgICAgICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IHNob3VsZCBuZXZlciBvdmVycmlkZSBhIHJlZiBzZXRcbiAgICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZE1vdW50LiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJldlByb3BzID0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFRPRE86IEkgdGhpbmsgdGhpcyBpcyBub3cgYWx3YXlzIG5vbi1udWxsIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cblxuXG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuXG4gICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIHVwZGF0ZVF1ZXVlLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IEkgdGhpbmsgdGhpcyBpcyBub3cgYWx3YXlzIG5vbi1udWxsIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cbiAgICAgICAgICB2YXIgX3VwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKF91cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsuY2hpbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZ2V0UHVibGljSW5zdGFuY2UoZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBfdXBkYXRlUXVldWUsIF9pbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBSZW5kZXJlcnMgbWF5IHNjaGVkdWxlIHdvcmsgdG8gYmUgZG9uZSBhZnRlciBob3N0IGNvbXBvbmVudHMgYXJlIG1vdW50ZWRcbiAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIG1heSBzY2hlZHVsZSBhdXRvLWZvY3VzIGZvciBpbnB1dHMgYW5kIGZvcm0gY29udHJvbHMpLlxuICAgICAgICAgIC8vIFRoZXNlIGVmZmVjdHMgc2hvdWxkIG9ubHkgYmUgY29tbWl0dGVkIHdoZW4gY29tcG9uZW50cyBhcmUgZmlyc3QgbW91bnRlZCxcbiAgICAgICAgICAvLyBha2Egd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50L2FsdGVybmF0ZS5cblxuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsICYmIGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTtcbiAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgY29tbWl0TW91bnQoX2luc3RhbmNlMiwgdHlwZSwgcHJvcHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCB0ZXh0LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHBvcnRhbHMuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgb25Db21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uQ29tbWl0LFxuICAgICAgICAgICAgICAgIG9uUmVuZGVyID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vblJlbmRlcjtcbiAgICAgICAgICAgIHZhciBlZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBwaGFzZSA9IGN1cnJlbnQgPT09IG51bGwgPyAnbW91bnQnIDogJ3VwZGF0ZSc7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblJlbmRlcihmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGZpbmlzaGVkV29yay5hY3R1YWxEdXJhdGlvbiwgZmluaXNoZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24sIGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUsIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygb25Db21taXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBvbkNvbW1pdChmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgICAgfSAvLyBTY2hlZHVsZSBhIHBhc3NpdmUgZWZmZWN0IGZvciB0aGlzIFByb2ZpbGVyIHRvIGNhbGwgb25Qb3N0Q29tbWl0IGhvb2tzLlxuICAgICAgICAgICAgICAvLyBUaGlzIGVmZmVjdCBzaG91bGQgYmUgc2NoZWR1bGVkIGV2ZW4gaWYgdGhlcmUgaXMgbm8gb25Qb3N0Q29tbWl0IGNhbGxiYWNrIGZvciB0aGlzIFByb2ZpbGVyLFxuICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBlZmZlY3QgaXMgYWxzbyB3aGVyZSB0aW1lcyBidWJibGUgdG8gcGFyZW50IFByb2ZpbGVycy5cblxuXG4gICAgICAgICAgICAgIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpbmlzaGVkV29yayk7IC8vIFByb3BhZ2F0ZSBsYXlvdXQgZWZmZWN0IGR1cmF0aW9ucyB0byB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yLlxuICAgICAgICAgICAgICAvLyBEbyBub3QgcmVzZXQgdGhlc2UgdmFsdWVzIHVudGlsIHRoZSBuZXh0IHJlbmRlciBzbyBEZXZUb29scyBoYXMgYSBjaGFuY2UgdG8gcmVhZCB0aGVtIGZpcnN0LlxuXG4gICAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG5cbiAgICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgJyArICdsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoICFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAge1xuICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFJlZikge1xuICAgICAgICBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzT25GaWJlcihub2RlKSB7XG4gIC8vIFR1cm4gb24gbGF5b3V0IGVmZmVjdHMgaW4gYSB0cmVlIHRoYXQgcHJldmlvdXNseSBkaXNhcHBlYXJlZC5cbiAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBMYXlvdXRTdGF0aWNcbiAgc3dpdGNoIChub2RlLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBub2RlLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQobm9kZSwgbm9kZS5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNhZmVseUF0dGFjaFJlZihub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihmaW5pc2hlZFdvcmssIGlzSGlkZGVuKSB7XG4gIC8vIE9ubHkgaGlkZSBvciB1bmhpZGUgdGhlIHRvcC1tb3N0IGhvc3Qgbm9kZXMuXG4gIHZhciBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7XG4gICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmhpZGVJbnN0YW5jZShub2RlLnN0YXRlTm9kZSwgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UzID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgICBoaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdW5oaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgobm9kZS50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gTGVnYWN5SGlkZGVuQ29tcG9uZW50KSAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgbm9kZSAhPT0gZmluaXNoZWRXb3JrKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkge1xuICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG5vZGUpIHtcbiAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yaykge1xuICB2YXIgcmVmID0gZmluaXNoZWRXb3JrLnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICB2YXIgaW5zdGFuY2VUb1VzZTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGluc3RhbmNlO1xuICAgIH0gLy8gTW92ZWQgb3V0c2lkZSB0byBlbnN1cmUgRENFIHdvcmtzIHdpdGggdGhpcyBmbGFnXG5cbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIHJldFZhbCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRWYWwgPSByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXRWYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBhIGNhbGxiYWNrIHJlZiBpbiAlcy4gJyArICdBIGNhbGxiYWNrIHJlZiBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoIXJlZi5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmVmIG9iamVjdCBwcm92aWRlZCBmb3IgJXMuICcgKyAnVXNlIGVpdGhlciBhIHJlZi1zZXR0ZXIgZnVuY3Rpb24gb3IgUmVhY3QuY3JlYXRlUmVmKCkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyTXV0YXRpb24oZmliZXIpIHtcbiAgLy8gQ3V0IG9mZiB0aGUgcmV0dXJuIHBvaW50ZXIgdG8gZGlzY29ubmVjdCBpdCBmcm9tIHRoZSB0cmVlLlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGV0ZWN0IGFuZCB3YXJuIGFnYWluc3Qgc3RhdGUgdXBkYXRlcyBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlxuICAvLyBJdCBhbHNvIHByZXZlbnRzIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIGZyb20gd2l0aGluIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzLlxuICAvL1xuICAvLyBJZGVhbGx5LCB3ZSBzaG91bGQgYWxzbyBjbGVhciB0aGUgY2hpbGQgcG9pbnRlciBvZiB0aGUgcGFyZW50IGFsdGVybmF0ZSB0byBsZXQgdGhpc1xuICAvLyBnZXQgR0M6ZWQgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggZm9yIHN1cmUgd2hpY2ggcGFyZW50IGlzIHRoZSBjdXJyZW50XG4gIC8vIG9uZSBzbyB3ZSdsbCBzZXR0bGUgZm9yIEdDOmluZyB0aGUgc3VidHJlZSBvZiB0aGlzIGNoaWxkLlxuICAvLyBUaGlzIGNoaWxkIGl0c2VsZiB3aWxsIGJlIEdDOmVkIHdoZW4gdGhlIHBhcmVudCB1cGRhdGVzIHRoZSBuZXh0IHRpbWUuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjbGVhciBjaGlsZCBvciBzaWJsaW5nIHBvaW50ZXJzIHlldC5cbiAgLy8gVGhleSdyZSBuZWVkZWQgZm9yIHBhc3NpdmUgZWZmZWN0cyBhbmQgZm9yIGZpbmRET01Ob2RlLlxuICAvLyBXZSBkZWZlciB0aG9zZSBmaWVsZHMsIGFuZCBhbGwgb3RoZXIgY2xlYW51cCwgdG8gdGhlIHBhc3NpdmUgcGhhc2UgKHNlZSBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cykuXG4gIC8vXG4gIC8vIERvbid0IHJlc2V0IHRoZSBhbHRlcm5hdGUgeWV0LCBlaXRoZXIuIFdlIG5lZWQgdGhhdCBzbyB3ZSBjYW4gZGV0YWNoIHRoZVxuICAvLyBhbHRlcm5hdGUncyBmaWVsZHMgaW4gdGhlIHBhc3NpdmUgcGhhc2UuIENsZWFyaW5nIHRoZSByZXR1cm4gcG9pbnRlciBpc1xuICAvLyBzdWZmaWNpZW50IGZvciBmaW5kRE9NTm9kZSBzZW1hbnRpY3MuXG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5yZXR1cm4gPSBudWxsO1xuICB9XG5cbiAgZmliZXIucmV0dXJuID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgZmliZXIuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhhbHRlcm5hdGUpO1xuICB9IC8vIE5vdGU6IERlZmVuc2l2ZWx5IHVzaW5nIG5lZ2F0aW9uIGluc3RlYWQgb2YgPCBpbiBjYXNlXG4gIC8vIGBkZWxldGVkVHJlZUNsZWFuVXBMZXZlbGAgaXMgdW5kZWZpbmVkLlxuXG5cbiAge1xuICAgIC8vIENsZWFyIGN5Y2xpY2FsIEZpYmVyIGZpZWxkcy4gVGhpcyBsZXZlbCBhbG9uZSBpcyBkZXNpZ25lZCB0byByb3VnaGx5XG4gICAgLy8gYXBwcm94aW1hdGUgdGhlIHBsYW5uZWQgRmliZXIgcmVmYWN0b3IuIEluIHRoYXQgd29ybGQsIGBzZXRTdGF0ZWAgd2lsbCBiZVxuICAgIC8vIGJvdW5kIHRvIGEgc3BlY2lhbCBcImluc3RhbmNlXCIgb2JqZWN0IGluc3RlYWQgb2YgYSBGaWJlci4gVGhlIEluc3RhbmNlXG4gICAgLy8gb2JqZWN0IHdpbGwgbm90IGhhdmUgYW55IG9mIHRoZXNlIGZpZWxkcy4gSXQgd2lsbCBvbmx5IGJlIGNvbm5lY3RlZCB0b1xuICAgIC8vIHRoZSBmaWJlciB0cmVlIHZpYSBhIHNpbmdsZSBsaW5rIGF0IHRoZSByb290LiBTbyBpZiB0aGlzIGxldmVsIGFsb25lIGlzXG4gICAgLy8gc3VmZmljaWVudCB0byBmaXggbWVtb3J5IGlzc3VlcywgdGhhdCBib2RlcyB3ZWxsIGZvciBvdXIgcGxhbnMuXG4gICAgZmliZXIuY2hpbGQgPSBudWxsO1xuICAgIGZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgZmliZXIuc2libGluZyA9IG51bGw7IC8vIFRoZSBgc3RhdGVOb2RlYCBpcyBjeWNsaWNhbCBiZWNhdXNlIG9uIGhvc3Qgbm9kZXMgaXQgcG9pbnRzIHRvIHRoZSBob3N0XG4gICAgLy8gdHJlZSwgd2hpY2ggaGFzIGl0cyBvd24gcG9pbnRlcnMgdG8gY2hpbGRyZW4sIHBhcmVudHMsIGFuZCBzaWJsaW5ncy5cbiAgICAvLyBUaGUgb3RoZXIgaG9zdCBub2RlcyBhbHNvIHBvaW50IGJhY2sgdG8gZmliZXJzLCBzbyB3ZSBzaG91bGQgZGV0YWNoIHRoYXRcbiAgICAvLyBvbmUsIHRvby5cblxuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgZGV0YWNoRGVsZXRlZEluc3RhbmNlKGhvc3RJbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDsgLy8gSSdtIGludGVudGlvbmFsbHkgbm90IGNsZWFyaW5nIHRoZSBgcmV0dXJuYCBmaWVsZCBpbiB0aGlzIGxldmVsLiBXZVxuICAgIC8vIGFscmVhZHkgZGlzY29ubmVjdCB0aGUgYHJldHVybmAgcG9pbnRlciBhdCB0aGUgcm9vdCBvZiB0aGUgZGVsZXRlZFxuICAgIC8vIHN1YnRyZWUgKGluIGBkZXRhY2hGaWJlck11dGF0aW9uYCkuIEJlc2lkZXMsIGByZXR1cm5gIGJ5IGl0c2VsZiBpcyBub3RcbiAgICAvLyBjeWNsaWNhbCBcdTIwMTQgaXQncyBvbmx5IGN5Y2xpY2FsIHdoZW4gY29tYmluZWQgd2l0aCBgY2hpbGRgLCBgc2libGluZ2AsIGFuZFxuICAgIC8vIGBhbHRlcm5hdGVgLiBCdXQgd2UnbGwgY2xlYXIgaXQgaW4gdGhlIG5leHQgbGV2ZWwgYW55d2F5LCBqdXN0IGluIGNhc2UuXG5cbiAgICB7XG4gICAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gVGhlb3JldGljYWxseSwgbm90aGluZyBpbiBoZXJlIHNob3VsZCBiZSBuZWNlc3NhcnksIGJlY2F1c2Ugd2UgYWxyZWFkeVxuICAgICAgLy8gZGlzY29ubmVjdGVkIHRoZSBmaWJlciBmcm9tIHRoZSB0cmVlLiBTbyBldmVuIGlmIHNvbWV0aGluZyBsZWFrcyB0aGlzXG4gICAgICAvLyBwYXJ0aWN1bGFyIGZpYmVyLCBpdCB3b24ndCBsZWFrIGFueXRoaW5nIGVsc2VcbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGJyYW5jaCBpcyB0byBiZSBzdXBlciBhZ2dyZXNzaXZlIHNvIHdlIGNhbiBtZWFzdXJlXG4gICAgICAvLyBpZiB0aGVyZSdzIGFueSBkaWZmZXJlbmNlIGluIG1lbW9yeSBpbXBhY3QuIElmIHRoZXJlIGlzLCB0aGF0IGNvdWxkXG4gICAgICAvLyBpbmRpY2F0ZSBhIFJlYWN0IGxlYWsgd2UgZG9uJ3Qga25vdyBhYm91dC5cbiAgICAgIGZpYmVyLnJldHVybiA9IG51bGw7XG4gICAgICBmaWJlci5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgICBmaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IG51bGw7XG4gICAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBUT0RPOiBNb3ZlIHRvIGBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcmAgaW5zdGVhZC5cblxuICAgICAgZmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRIb3N0UGFyZW50RmliZXIoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGlzSG9zdFBhcmVudChwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgLy8gVE9ETzogRmluZCBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLlxuICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gIHNpYmxpbmdzOiB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBsZXQncyB0cnkgdGhlIG5leHQgc2libGluZy5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgaXNIb3N0UGFyZW50KG5vZGUucmV0dXJuKSkge1xuICAgICAgICAvLyBJZiB3ZSBwb3Agb3V0IG9mIHRoZSByb290IG9yIGhpdCB0aGUgcGFyZW50IHRoZSBmaWJlciB3ZSBhcmUgdGhlXG4gICAgICAgIC8vIGxhc3Qgc2libGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcblxuICAgIHdoaWxlIChub2RlLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBub2RlLnRhZyAhPT0gSG9zdFRleHQgJiYgbm9kZS50YWcgIT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgaXQgaXMgbm90IGhvc3Qgbm9kZSBhbmQsIHdlIG1pZ2h0IGhhdmUgYSBob3N0IG5vZGUgaW5zaWRlIGl0LlxuICAgICAgLy8gVHJ5IHRvIHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgb25lLlxuICAgICAgaWYgKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgIC8vIFdlIGFsc28gc2tpcCBwb3J0YWxzIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhpcyBob3N0IHRyZWUuXG5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgaWYgdGhpcyBob3N0IG5vZGUgaXMgc3RhYmxlIG9yIGFib3V0IHRvIGJlIHBsYWNlZC5cblxuXG4gICAgaWYgKCEobm9kZS5mbGFncyAmIFBsYWNlbWVudCkpIHtcbiAgICAgIC8vIEZvdW5kIGl0IVxuICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKSB7XG5cblxuICB2YXIgcGFyZW50RmliZXIgPSBnZXRIb3N0UGFyZW50RmliZXIoZmluaXNoZWRXb3JrKTsgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG5cbiAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKHBhcmVudEZpYmVyLmZsYWdzICYgQ29udGVudFJlc2V0KSB7XG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgcGFyZW50IGJlZm9yZSBkb2luZyBhbnkgaW5zZXJ0aW9uc1xuICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQocGFyZW50KTsgLy8gQ2xlYXIgQ29udGVudFJlc2V0IGZyb20gdGhlIGVmZmVjdCB0YWdcblxuICAgICAgICAgIHBhcmVudEZpYmVyLmZsYWdzICY9IH5Db250ZW50UmVzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTsgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgICAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGZpbmlzaGVkV29yaywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB2YXIgX3BhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgIHZhciBfYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGZpbmlzaGVkV29yaywgX2JlZm9yZSwgX3BhcmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBob3N0IHBhcmVudCBmaWJlci4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEluQ29udGFpbmVyQmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKHBhcmVudCwgc3RhdGVOb2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2Uge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIHZhciBpc0hvc3QgPSB0YWcgPT09IEhvc3RDb21wb25lbnQgfHwgdGFnID09PSBIb3N0VGV4dDtcblxuICBpZiAoaXNIb3N0KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgaW5zZXJ0QmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gVGhlc2UgYXJlIHRyYWNrZWQgb24gdGhlIHN0YWNrIGFzIHdlIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFcbi8vIGRlbGV0ZWQgc3VidHJlZS5cbi8vIFRPRE86IFVwZGF0ZSB0aGVzZSBkdXJpbmcgdGhlIHdob2xlIG11dGF0aW9uIHBoYXNlLCBub3QganVzdCBkdXJpbmdcbi8vIGEgZGVsZXRpb24uXG5cblxudmFyIGhvc3RQYXJlbnQgPSBudWxsO1xudmFyIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcikge1xuICB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQsIGRldGFjaCByZWZzLCBjbGVhblxuICAgIC8vIHVwIG1vdW50ZWQgbGF5b3V0IGVmZmVjdHMsIGFuZCBjYWxsIGNvbXBvbmVudFdpbGxVbm1vdW50LlxuICAgIC8vIFdlIG9ubHkgbmVlZCB0byByZW1vdmUgdGhlIHRvcG1vc3QgaG9zdCBjaGlsZCBpbiBlYWNoIGJyYW5jaC4gQnV0IHRoZW4gd2VcbiAgICAvLyBzdGlsbCBuZWVkIHRvIGtlZXAgdHJhdmVyc2luZyB0byB1bm1vdW50IGVmZmVjdHMsIHJlZnMsIGFuZCBjV1UuIFRPRE86IFdlXG4gICAgLy8gY291bGQgc3BsaXQgdGhpcyBpbnRvIHR3byBzZXBhcmF0ZSB0cmF2ZXJzYWxzIGZ1bmN0aW9ucywgd2hlcmUgdGhlIHNlY29uZFxuICAgIC8vIG9uZSBkb2Vzbid0IGluY2x1ZGUgYW55IHJlbW92ZUNoaWxkIGxvZ2ljLiBUaGlzIGlzIG1heWJlIHRoZSBzYW1lXG4gICAgLy8gZnVuY3Rpb24gYXMgXCJkaXNhcHBlYXJMYXlvdXRFZmZlY3RzXCIgKG9yIHdoYXRldmVyIHRoYXQgdHVybnMgaW50byBhZnRlclxuICAgIC8vIHRoZSBsYXlvdXQgcGhhc2UgaXMgcmVmYWN0b3JlZCB0byB1c2UgcmVjdXJzaW9uKS5cbiAgICAvLyBCZWZvcmUgc3RhcnRpbmcsIGZpbmQgdGhlIG5lYXJlc3QgaG9zdCBwYXJlbnQgb24gdGhlIHN0YWNrIHNvIHdlIGtub3dcbiAgICAvLyB3aGljaCBpbnN0YW5jZS9jb250YWluZXIgdG8gcmVtb3ZlIHRoZSBjaGlsZHJlbiBmcm9tLlxuICAgIC8vIFRPRE86IEluc3RlYWQgb2Ygc2VhcmNoaW5nIHVwIHRoZSBmaWJlciByZXR1cm4gcGF0aCBvbiBldmVyeSBkZWxldGlvbiwgd2VcbiAgICAvLyBjYW4gdHJhY2sgdGhlIG5lYXJlc3QgaG9zdCBjb21wb25lbnQgb24gdGhlIEpTIHN0YWNrIGFzIHdlIHRyYXZlcnNlIHRoZVxuICAgIC8vIHRyZWUgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFRoaXMgd291bGQgbWFrZSBpbnNlcnRpb25zIGZhc3RlciwgdG9vLlxuICAgIHZhciBwYXJlbnQgPSByZXR1cm5GaWJlcjtcblxuICAgIGZpbmRQYXJlbnQ6IHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9zdFBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSAnICsgJ2EgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKHJvb3QsIHJldHVybkZpYmVyLCBkZWxldGVkRmliZXIpO1xuICAgIGhvc3RQYXJlbnQgPSBudWxsO1xuICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuICB9XG5cbiAgZGV0YWNoRmliZXJNdXRhdGlvbihkZWxldGVkRmliZXIpO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgcGFyZW50KSB7XG4gIC8vIFRPRE86IFVzZSBhIHN0YXRpYyBmbGFnIHRvIHNraXAgdHJlZXMgdGhhdCBkb24ndCBoYXZlIHVubW91bnQgZWZmZWN0c1xuICB2YXIgY2hpbGQgPSBwYXJlbnQuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGNoaWxkKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcikge1xuICBvbkNvbW1pdFVubW91bnQoZGVsZXRlZEZpYmVyKTsgLy8gVGhlIGNhc2VzIGluIHRoaXMgb3V0ZXIgc3dpdGNoIG1vZGlmeSB0aGUgc3RhY2sgYmVmb3JlIHRoZXkgdHJhdmVyc2VcbiAgLy8gaW50byB0aGVpciBzdWJ0cmVlLiBUaGVyZSBhcmUgc2ltcGxlciBjYXNlcyBpbiB0aGUgaW5uZXIgc3dpdGNoXG4gIC8vIHRoYXQgZG9uJ3QgbW9kaWZ5IHRoZSBzdGFjay5cblxuICBzd2l0Y2ggKGRlbGV0ZWRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICB9IC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoIHRvIG5leHQgYnJhbmNoXG5cbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byByZW1vdmUgdGhlIG5lYXJlc3QgaG9zdCBjaGlsZC4gU2V0IHRoZSBob3N0IHBhcmVudFxuICAgICAgICAvLyB0byBgbnVsbGAgb24gdGhlIHN0YWNrIHRvIGluZGljYXRlIHRoYXQgbmVzdGVkIGNoaWxkcmVuIGRvbid0XG4gICAgICAgIC8vIG5lZWQgdG8gYmUgcmVtb3ZlZC5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IHByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG5cbiAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gTm93IHRoYXQgYWxsIHRoZSBjaGlsZCBlZmZlY3RzIGhhdmUgdW5tb3VudGVkLCB3ZSBjYW4gcmVtb3ZlIHRoZVxuICAgICAgICAgICAgLy8gbm9kZSBmcm9tIHRoZSB0cmVlLlxuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZChob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gRGVsZXRlIHRoZSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnQuXG5cblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGhvc3RQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIGdvIGludG8gYSBwb3J0YWwsIGl0IGJlY29tZXMgdGhlIHBhcmVudCB0byByZW1vdmUgZnJvbS5cbiAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBfcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBkZWxldGVkRmliZXIudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBfZWZmZWN0ID0gZWZmZWN0LFxuICAgICAgICAgICAgICAgICAgICBkZXN0cm95ID0gX2VmZmVjdC5kZXN0cm95LFxuICAgICAgICAgICAgICAgICAgICB0YWcgPSBfZWZmZWN0LnRhZztcblxuICAgICAgICAgICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YWcgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChkZWxldGVkRmliZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWxldGVkRmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGRlbGV0ZWRGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIG9mZnNjcmVlbiBjb21wb25lbnQgaXMgaGlkZGVuLCB3ZSBhbHJlYWR5IHVubW91bnRlZCBpdC4gQmVmb3JlXG4gICAgICAgICAgLy8gZGVsZXRpbmcgdGhlIGNoaWxkcmVuLCB0cmFjayB0aGF0IGl0J3MgYWxyZWFkeSB1bm1vdW50ZWQgc28gdGhhdCB3ZVxuICAgICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gdW5tb3VudCB0aGUgZWZmZWN0cyBhZ2Fpbi5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGUgdHJlZSBpcyBoaWRkZW4sIGluIG1vc3QgY2FzZXMgd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2tpcFxuICAgICAgICAgIC8vIG92ZXIgdGhlIG5lc3RlZCBjaGlsZHJlbiBlbnRpcmVseS4gQW4gZXhjZXB0aW9uIGlzIHdlIGhhdmVuJ3QgeWV0IGZvdW5kXG4gICAgICAgICAgLy8gdGhlIHRvcG1vc3QgaG9zdCBub2RlIHRvIGRlbGV0ZSwgd2hpY2ggd2UgYWxyZWFkeSB0cmFjayBvbiB0aGUgc3RhY2suXG4gICAgICAgICAgLy8gQnV0IHRoZSBvdGhlciBjYXNlIGlzIHBvcnRhbHMsIHdoaWNoIG5lZWQgdG8gYmUgZGV0YWNoZWQgbm8gbWF0dGVyIGhvd1xuICAgICAgICAgIC8vIGRlZXBseSB0aGV5IGFyZSBuZXN0ZWQuIFdlIHNob3VsZCB1c2UgYSBzdWJ0cmVlIGZsYWcgdG8gdHJhY2sgd2hldGhlciBhXG4gICAgICAgICAgLy8gc3VidHJlZSBpbmNsdWRlcyBhIG5lc3RlZCBwb3J0YWwuXG4gICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgZGVsZXRlZEZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKSB7XG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0byBwYXNzaXZlIHBoYXNlXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXdTdGF0ZSA9PT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgdGhlbiBpdCB3aWxsIGhhdmUgYSBzZXQgb2Ygd2FrZWFibGVzLlxuICAvLyBGb3IgZWFjaCB3YWtlYWJsZSwgYXR0YWNoIGEgbGlzdGVuZXIgc28gdGhhdCB3aGVuIGl0IHJlc29sdmVzLCBSZWFjdFxuICAvLyBhdHRlbXB0cyB0byByZS1yZW5kZXIgdGhlIGJvdW5kYXJ5IGluIHRoZSBwcmltYXJ5IChwcmUtdGltZW91dCkgc3RhdGUuXG4gIHZhciB3YWtlYWJsZXMgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgdmFyIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgaWYgKHJldHJ5Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gbmV3IFBvc3NpYmx5V2Vha1NldCgpO1xuICAgIH1cblxuICAgIHdha2VhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uICh3YWtlYWJsZSkge1xuICAgICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgYm91bmRhcnkgZmliZXIgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgICAgdmFyIHJldHJ5ID0gcmVzb2x2ZVJldHJ5V2FrZWFibGUuYmluZChudWxsLCBmaW5pc2hlZFdvcmssIHdha2VhYmxlKTtcblxuICAgICAgaWYgKCFyZXRyeUNhY2hlLmhhcyh3YWtlYWJsZSkpIHtcbiAgICAgICAgcmV0cnlDYWNoZS5hZGQod2FrZWFibGUpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgICAgIGlmIChpblByb2dyZXNzTGFuZXMgIT09IG51bGwgJiYgaW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIGFzc29jaWF0ZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnMgd2l0aCBpdC5cbiAgICAgICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhpblByb2dyZXNzUm9vdCwgaW5Qcm9ncmVzc0xhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKCdFeHBlY3RlZCBmaW5pc2hlZCByb290IGFuZCBsYW5lcyB0byBiZSBzZXQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2FrZWFibGUudGhlbihyZXRyeSwgcmV0cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIFRoaXMgZnVuY3Rpb24gZGV0ZWN0cyB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgZ29lcyBmcm9tIHZpc2libGUgdG8gaGlkZGVuLlxuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290KTtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgbGFuZXMpIHtcbiAgLy8gRGVsZXRpb25zIGVmZmVjdHMgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgZmliZXIgdHlwZS4gVGhleSBuZWVkIHRvIGhhcHBlblxuICAvLyBiZWZvcmUgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGFlIGZpcmVkLlxuICB2YXIgZGVsZXRpb25zID0gcGFyZW50RmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjaGlsZFRvRGVsZXRlLCBwYXJlbnRGaWJlciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2RGVidWdGaWJlciA9IGdldEN1cnJlbnRGaWJlcigpO1xuXG4gIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiBNdXRhdGlvbk1hc2spIHtcbiAgICB2YXIgY2hpbGQgPSBwYXJlbnRGaWJlci5jaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGNoaWxkKTtcbiAgICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoY2hpbGQsIHJvb3QpO1xuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHNldEN1cnJlbnRGaWJlcihwcmV2RGVidWdGaWJlcik7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcykge1xuICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFnczsgLy8gVGhlIGVmZmVjdCBmbGFnIHNob3VsZCBiZSBjaGVja2VkICphZnRlciogd2UgcmVmaW5lIHRoZSB0eXBlIG9mIGZpYmVyLFxuICAvLyBiZWNhdXNlIHRoZSBmaWJlciB0YWcgaXMgbW9yZSBzcGVjaWZpYy4gQW4gZXhjZXB0aW9uIGlzIGFueSBmbGFnIHJlbGF0ZWRcbiAgLy8gdG8gcmVjb25jaWxhdGlvbiwgYmVjYXVzZSB0aG9zZSBjYW4gYmUgc2V0IG9uIGFsbCBmaWJlciB0eXBlcy5cblxuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH0gLy8gTGF5b3V0IGVmZmVjdHMgYXJlIGRlc3Ryb3llZCBkdXJpbmcgdGhlIG11dGF0aW9uIHBoYXNlIHNvIHRoYXQgYWxsXG4gICAgICAgICAgLy8gZGVzdHJveSBmdW5jdGlvbnMgZm9yIGFsbCBmaWJlcnMgYXJlIGNhbGxlZCBiZWZvcmUgYW55IGNyZWF0ZSBmdW5jdGlvbnMuXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG5cblxuICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFJlZikge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETzogQ29udGVudFJlc2V0IGdldHMgY2xlYXJlZCBieSB0aGUgY2hpbGRyZW4gZHVyaW5nIHRoZSBjb21taXRcbiAgICAgICAgICAvLyBwaGFzZS4gVGhpcyBpcyBhIHJlZmFjdG9yIGhhemFyZCBiZWNhdXNlIGl0IG1lYW5zIHdlIG11c3QgcmVhZFxuICAgICAgICAgIC8vIGZsYWdzIHRoZSBmbGFncyBhZnRlciBgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzYCBoYXMgYWxyZWFkeSBydW47XG4gICAgICAgICAgLy8gdGhlIG9yZGVyIG1hdHRlcnMuIFdlIHNob3VsZCByZWZhY3RvciBzbyB0aGF0IENvbnRlbnRSZXNldCBkb2VzIG5vdFxuICAgICAgICAgIC8vIHJlbHkgb24gbXV0YXRpbmcgdGhlIGZsYWcgZHVyaW5nIGNvbW1pdC4gTGlrZSBieSBzZXR0aW5nIGEgZmxhZ1xuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlIGluc3RlYWQuXG4gICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVzZXRUZXh0Q29udGVudChpbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2U0ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKF9pbnN0YW5jZTQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBDb21taXQgdGhlIHdvcmsgcHJlcGFyZWQgZWFybGllci5cbiAgICAgICAgICAgICAgdmFyIG5ld1Byb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3UHJvcHM7XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGU7IC8vIFRPRE86IFR5cGUgdGhlIHVwZGF0ZVF1ZXVlIHRvIGJlIHNwZWNpZmljIHRvIGhvc3QgY29tcG9uZW50cy5cblxuICAgICAgICAgICAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAgICAgICAgICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRVcGRhdGUoX2luc3RhbmNlNCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgaGF2ZSBhIHRleHQgbm9kZSBpbml0aWFsaXplZC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHZhciBuZXdUZXh0ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgLy8gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2Um9vdFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmIChwcmV2Um9vdFN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRIeWRyYXRlZENvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgdmFyIG9mZnNjcmVlbkZpYmVyID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5GaWJlci5mbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgbmV3U3RhdGUgPSBvZmZzY3JlZW5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IG5ld1N0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICB2YXIgd2FzSGlkZGVuID0gb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlICE9PSBudWxsICYmIG9mZnNjcmVlbkZpYmVyLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoIXdhc0hpZGRlbikge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICAgICAgbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGZpbmlzaGVkV29yay5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBCZWZvcmUgY29tbWl0dGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIG9uIHRoZSBzdGFjayB3aGV0aGVyIHRoaXNcbiAgICAgICAgICAvLyBvZmZzY3JlZW4gc3VidHJlZSB3YXMgYWxyZWFkeSBoaWRkZW4sIHNvIHRoYXQgd2UgZG9uJ3QgdW5tb3VudCB0aGVcbiAgICAgICAgICAvLyBlZmZlY3RzIGFnYWluLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IF93YXNIaWRkZW47XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIF9uZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgdmFyIF9pc0hpZGRlbiA9IF9uZXdTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIHZhciBvZmZzY3JlZW5Cb3VuZGFyeSA9IGZpbmlzaGVkV29yaztcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgbmVlZHMgdG8gcnVuIHdoZW5ldmVyIHRoZXJlJ3MgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZVxuICAgICAgICAgICAgLy8gaW5zaWRlIGEgaGlkZGVuIE9mZnNjcmVlbiB0cmVlLlxuICAgICAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4ob2Zmc2NyZWVuQm91bmRhcnksIF9pc0hpZGRlbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKF9pc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoIV93YXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoKG9mZnNjcmVlbkJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdCA9IG9mZnNjcmVlbkJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgdmFyIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQm91bmRhcnkuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzY3JlZW5DaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4ob2Zmc2NyZWVuQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5DaGlsZCA9IG9mZnNjcmVlbkNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yaykge1xuICAvLyBQbGFjZW1lbnQgZWZmZWN0cyAoaW5zZXJ0aW9ucywgcmVvcmRlcnMpIGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IGZpYmVyXG4gIC8vIHR5cGUuIFRoZXkgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHRoZSBjaGlsZHJlbiBlZmZlY3RzIGhhdmUgZmlyZWQsIGJ1dFxuICAvLyBiZWZvcmUgdGhlIGVmZmVjdHMgb24gdGhpcyBmaWJlciBoYXZlIGZpcmVkLlxuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG5cbiAgaWYgKGZsYWdzICYgUGxhY2VtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICB9IC8vIENsZWFyIHRoZSBcInBsYWNlbWVudFwiIGZyb20gZWZmZWN0IHRhZyBzbyB0aGF0IHdlIGtub3cgdGhhdCB0aGlzIGlzXG4gICAgLy8gaW5zZXJ0ZWQsIGJlZm9yZSBhbnkgbGlmZS1jeWNsZXMgbGlrZSBjb21wb25lbnREaWRNb3VudCBnZXRzIGNhbGxlZC5cbiAgICAvLyBUT0RPOiBmaW5kRE9NTm9kZSBkb2Vzbid0IHJlbHkgb24gdGhpcyBhbnkgbW9yZSBidXQgaXNNb3VudGVkIGRvZXNcbiAgICAvLyBhbmQgaXNNb3VudGVkIGlzIGRlcHJlY2F0ZWQgYW55d2F5IHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIGtpbGwgdGhpcy5cblxuXG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5QbGFjZW1lbnQ7XG4gIH1cblxuICBpZiAoZmxhZ3MgJiBIeWRyYXRpbmcpIHtcbiAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gfkh5ZHJhdGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgbmV4dEVmZmVjdCA9IGZpbmlzaGVkV29yaztcbiAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICAvLyBTdXNwZW5zZSBsYXlvdXQgZWZmZWN0cyBzZW1hbnRpY3MgZG9uJ3QgY2hhbmdlIGZvciBsZWdhY3kgcm9vdHMuXG4gIHZhciBpc01vZGVyblJvb3QgPSAoc3VidHJlZVJvb3QubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKCBmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCAmJiBpc01vZGVyblJvb3QpIHtcbiAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgT2Zmc2NyZWVuIHN0YWNrJ3Mgc3RhdGUuXG4gICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGlzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcblxuICAgICAgaWYgKG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbikge1xuICAgICAgICAvLyBUaGUgT2Zmc2NyZWVuIHRyZWUgaXMgaGlkZGVuLiBTa2lwIG92ZXIgaXRzIGxheW91dCBlZmZlY3RzLlxuICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIEFsc28gY2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dE1hc2tcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICAgIHZhciB3YXNIaWRkZW4gPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSB3YXNIaWRkZW4gfHwgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47IC8vIFRyYXZlcnNlIHRoZSBPZmZzY3JlZW4gc3VidHJlZSB3aXRoIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBhcyB0aGUgcm9vdC5cblxuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuICYmICFwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3Qgb2YgYSByZWFwcGVhcmluZyBib3VuZGFyeS4gVHVybiBpdHMgbGF5b3V0IGVmZmVjdHNcbiAgICAgICAgICAvLyBiYWNrIG9uLlxuICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oZmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkID0gZmlyc3RDaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihjaGlsZCwgLy8gTmV3IHJvb3Q7IGJ1YmJsZSBiYWNrIHVwIHRvIGhlcmUgYW5kIHN0b3AuXG4gICAgICAgICAgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfSAvLyBSZXN0b3JlIE9mZnNjcmVlbiBzdGF0ZSBhbmQgcmVzdW1lIGluIG91ci1wcm9ncmVzcyB0cmF2ZXJzYWwuXG5cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihyb290LCBjdXJyZW50LCBmaWJlciwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiAoUmVmU3RhdGljIHwgTGF5b3V0U3RhdGljKVxuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIGZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgUmVmU3RhdGljXG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhXG4gICAgICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gTmVzdGVkIE9mZnNjcmVlbiB0cmVlIGlzIGFscmVhZHkgaGlkZGVuLiBEb24ndCBkaXNhcHBlYXJcbiAgICAgICAgICAgIC8vIGl0cyBlZmZlY3RzLlxuICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0gLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0U3RhdGljXG5cblxuICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50KSB7XG4gICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgLy8gTmVzdGVkIE9mZnNjcmVlbiB0cmVlIGlzIHN0aWxsIGhpZGRlbi4gRG9uJ3QgcmUtYXBwZWFyIGl0cyBlZmZlY3RzLlxuICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIG5vZGUgbWF5IGhhdmUgYmVlbiByZXVzZWQgZnJvbSBhIHByZXZpb3VzIHJlbmRlciwgc28gd2UgY2FuJ3RcbiAgICAgIC8vIGFzc3VtZSBpdHMgcmV0dXJuIHBvaW50ZXIgaXMgY29ycmVjdC5cbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyAmJiBmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIocm9vdCwgZmliZXIsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHMoZmlyc3RDaGlsZCkge1xuICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2JlZ2luKCk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChuZXh0RWZmZWN0LmZsYWdzICYgQ2hpbGREZWxldGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHZhciBkZWxldGlvbnMgPSBmaWJlci5kZWxldGlvbnM7XG5cbiAgICAgIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmliZXJUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXJUb0RlbGV0ZTtcbiAgICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKGZpYmVyVG9EZWxldGUsIGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBBIGZpYmVyIHdhcyBkZWxldGVkIGZyb20gdGhpcyBwYXJlbnQgZmliZXIsIGJ1dCBpdCdzIHN0aWxsIHBhcnQgb2ZcbiAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKGFsdGVybmF0ZSkgcGFyZW50IGZpYmVyJ3MgbGlzdCBvZiBjaGlsZHJlbi4gQmVjYXVzZVxuICAgICAgICAgIC8vIGNoaWxkcmVuIGFyZSBhIGxpbmtlZCBsaXN0LCBhbiBlYXJsaWVyIHNpYmxpbmcgdGhhdCdzIHN0aWxsIGFsaXZlXG4gICAgICAgICAgLy8gd2lsbCBiZSBjb25uZWN0ZWQgdG8gdGhlIGRlbGV0ZWQgZmliZXIgdmlhIGl0cyBgYWx0ZXJuYXRlYDpcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vICAgbGl2ZSBmaWJlclxuICAgICAgICAgIC8vICAgLS1hbHRlcm5hdGUtLT4gcHJldmlvdXMgbGl2ZSBmaWJlclxuICAgICAgICAgIC8vICAgLS1zaWJsaW5nLS0+IGRlbGV0ZWQgZmliZXJcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFdlIGNhbid0IGRpc2Nvbm5lY3QgYGFsdGVybmF0ZWAgb24gbm9kZXMgdGhhdCBoYXZlbid0IGJlZW4gZGVsZXRlZFxuICAgICAgICAgIC8vIHlldCwgYnV0IHdlIGNhbiBkaXNjb25uZWN0IHRoZSBgc2libGluZ2AgYW5kIGBjaGlsZGAgcG9pbnRlcnMuXG4gICAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGRldGFjaGVkQ2hpbGQgPSBwcmV2aW91c0ZpYmVyLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAoZGV0YWNoZWRDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c0ZpYmVyLmNoaWxkID0gbnVsbDtcblxuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIGRldGFjaGVkU2libGluZyA9IGRldGFjaGVkQ2hpbGQuc2libGluZztcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIGRldGFjaGVkQ2hpbGQgPSBkZXRhY2hlZFNpYmxpbmc7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaWJlcik7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihkZWxldGVkU3VidHJlZVJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBEZWxldGlvbiBlZmZlY3RzIGZpcmUgaW4gcGFyZW50IC0+IGNoaWxkIG9yZGVyXG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgZmliZXIgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnXG5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyKGZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkOyAvLyBUT0RPOiBPbmx5IHRyYXZlcnNlIHN1YnRyZWUgaWYgaXQgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnLiAoQnV0LCBpZiB3ZVxuICAgIC8vIGRvIHRoaXMsIHN0aWxsIG5lZWQgdG8gaGFuZGxlIGBkZWxldGVkVHJlZUNsZWFuVXBMZXZlbGAgY29ycmVjdGx5LilcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9jb21wbGV0ZShkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB7XG4gICAgICAvLyBSZWN1cnNpdmVseSB0cmF2ZXJzZSB0aGUgZW50aXJlIGRlbGV0ZWQgdHJlZSBhbmQgY2xlYW4gdXAgZmliZXIgZmllbGRzLlxuICAgICAgLy8gVGhpcyBpcyBtb3JlIGFnZ3Jlc3NpdmUgdGhhbiBpZGVhbCwgYW5kIHRoZSBsb25nIHRlcm0gZ29hbCBpcyB0byBvbmx5XG4gICAgICAvLyBoYXZlIHRvIGRldGFjaCB0aGUgZGVsZXRlZCB0cmVlIGF0IHRoZSByb290LlxuICAgICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZmliZXIpO1xuXG4gICAgICBpZiAoZmliZXIgPT09IGRlbGV0ZWRTdWJ0cmVlUm9vdCkge1xuICAgICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IHJldHVybkZpYmVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgc3dpdGNoIChjdXJyZW50LnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSwgY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn0gLy8gVE9ETzogUmV1c2UgcmVhcHBlYXJMYXlvdXRFZmZlY3RzIHRyYXZlcnNhbCBoZXJlP1xuXG5cbmZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VQYXNzaXZlRWZmZWN0TW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpYmVyKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGZpYmVyLCBmaWJlci5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VQYXNzaXZlRWZmZWN0VW5tb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgQ09NUE9ORU5UX1RZUEUgPSAwO1xudmFyIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IDE7XG52YXIgUk9MRV9UWVBFID0gMjtcbnZhciBURVNUX05BTUVfVFlQRSA9IDM7XG52YXIgVEVYVF9UWVBFID0gNDtcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcikge1xuICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgQ09NUE9ORU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmNvbXBvbmVudCcpO1xuICBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmhhc19wc2V1ZG9fY2xhc3MnKTtcbiAgUk9MRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5yb2xlJyk7XG4gIFRFU1RfTkFNRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci50ZXN0X2lkJyk7XG4gIFRFWFRfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGV4dCcpO1xufVxudmFyIGNvbW1pdEhvb2tzID0gW107XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3QkMSgpIHtcbiAge1xuICAgIGNvbW1pdEhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1pdEhvb2spIHtcbiAgICAgIHJldHVybiBjb21taXRIb29rKCk7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG5mdW5jdGlvbiBpc0xlZ2FjeUFjdEVudmlyb25tZW50KGZpYmVyKSB7XG4gIHtcbiAgICAvLyBMZWdhY3kgbW9kZS4gV2UgcHJlc2VydmUgdGhlIGJlaGF2aW9yIG9mIFJlYWN0IDE3J3MgYWN0LiBJdCBhc3N1bWVzIGFuXG4gICAgLy8gYWN0IGVudmlyb25tZW50IHdoZW5ldmVyIGBqZXN0YCBpcyBkZWZpbmVkLCBidXQgeW91IGNhbiBzdGlsbCB0dXJuIG9mZlxuICAgIC8vIHNwdXJpb3VzIHdhcm5pbmdzIGJ5IHNldHRpbmcgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGV4cGxpY2l0bHlcbiAgICAvLyB0byBmYWxzZS5cbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIFx1MjAxMyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7IC8vICRGbG93RXhwZWN0ZWRFcnJvciAtIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IGplc3RcblxuICAgIHZhciBqZXN0SXNEZWZpbmVkID0gdHlwZW9mIGplc3QgIT09ICd1bmRlZmluZWQnO1xuICAgIHJldHVybiAgamVzdElzRGVmaW5lZCAmJiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgIT09IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpIHtcbiAge1xuICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgXHUyMDEzIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWxcbiAgICB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UICE9PSAndW5kZWZpbmVkJyA/IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICYmIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IEluY2x1ZGUgbGluayB0byByZWxldmFudCBkb2N1bWVudGF0aW9uIHBhZ2UuXG4gICAgICBlcnJvcignVGhlIGN1cnJlbnQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBub3QgY29uZmlndXJlZCB0byBzdXBwb3J0ICcgKyAnYWN0KC4uLiknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsO1xuICB9XG59XG5cbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG52YXIgTm9Db250ZXh0ID1cbi8qICAgICAgICAgICAgICovXG4wO1xudmFyIEJhdGNoZWRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgUmVuZGVyQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBDb21taXRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICovXG40O1xudmFyIFJvb3RJblByb2dyZXNzID0gMDtcbnZhciBSb290RmF0YWxFcnJvcmVkID0gMTtcbnZhciBSb290RXJyb3JlZCA9IDI7XG52YXIgUm9vdFN1c3BlbmRlZCA9IDM7XG52YXIgUm9vdFN1c3BlbmRlZFdpdGhEZWxheSA9IDQ7XG52YXIgUm9vdENvbXBsZXRlZCA9IDU7XG52YXIgUm9vdERpZE5vdENvbXBsZXRlID0gNjsgLy8gRGVzY3JpYmVzIHdoZXJlIHdlIGFyZSBpbiB0aGUgUmVhY3QgZXhlY3V0aW9uIHN0YWNrXG5cbnZhciBleGVjdXRpb25Db250ZXh0ID0gTm9Db250ZXh0OyAvLyBUaGUgcm9vdCB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsOyAvLyBUaGUgZmliZXIgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3MgPSBudWxsOyAvLyBUaGUgbGFuZXMgd2UncmUgcmVuZGVyaW5nXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFN0YWNrIHRoYXQgYWxsb3dzIGNvbXBvbmVudHMgdG8gY2hhbmdlIHRoZSByZW5kZXIgbGFuZXMgZm9yIGl0cyBzdWJ0cmVlXG4vLyBUaGlzIGlzIGEgc3VwZXJzZXQgb2YgdGhlIGxhbmVzIHdlIHN0YXJ0ZWQgd29ya2luZyBvbiBhdCB0aGUgcm9vdC4gVGhlIG9ubHlcbi8vIGNhc2Ugd2hlcmUgaXQncyBkaWZmZXJlbnQgZnJvbSBgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXNgIGlzIHdoZW4gd2Vcbi8vIGVudGVyIGEgc3VidHJlZSB0aGF0IGlzIGhpZGRlbiBhbmQgbmVlZHMgdG8gYmUgdW5oaWRkZW46IFN1c3BlbnNlIGFuZFxuLy8gT2Zmc2NyZWVuIGNvbXBvbmVudC5cbi8vXG4vLyBNb3N0IHRoaW5ncyBpbiB0aGUgd29yayBsb29wIHNob3VsZCBkZWFsIHdpdGggd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMuXG4vLyBNb3N0IHRoaW5ncyBpbiBiZWdpbi9jb21wbGV0ZSBwaGFzZXMgc2hvdWxkIGRlYWwgd2l0aCBzdWJ0cmVlUmVuZGVyTGFuZXMuXG5cbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xudmFyIHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOb0xhbmVzKTsgLy8gV2hldGhlciB0byByb290IGNvbXBsZXRlZCwgZXJyb3JlZCwgc3VzcGVuZGVkLCBldGMuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7IC8vIEEgZmF0YWwgZXJyb3IsIGlmIG9uZSBpcyB0aHJvd25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsOyAvLyBcIkluY2x1ZGVkXCIgbGFuZXMgcmVmZXIgdG8gbGFuZXMgdGhhdCB3ZXJlIHdvcmtlZCBvbiBkdXJpbmcgdGhpcyByZW5kZXIuIEl0J3Ncbi8vIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIGByZW5kZXJMYW5lc2AgYmVjYXVzZSBgcmVuZGVyTGFuZXNgIGNhbiBjaGFuZ2UgYXMgeW91XG4vLyBlbnRlciBhbmQgZXhpdCBhbiBPZmZzY3JlZW4gdHJlZS4gVGhpcyB2YWx1ZSBpcyB0aGUgY29tYmluYXRpb24gb2YgYWxsIHJlbmRlclxuLy8gbGFuZXMgZm9yIHRoZSBlbnRpcmUgcmVuZGVyIHBoYXNlLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrIGxlZnQgb3ZlciBieSBjb21wb25lbnRzIHRoYXQgd2VyZSB2aXNpdGVkIGR1cmluZyB0aGlzIHJlbmRlci4gT25seVxuLy8gaW5jbHVkZXMgdW5wcm9jZXNzZWQgdXBkYXRlcywgbm90IHdvcmsgaW4gYmFpbGVkIG91dCBjaGlsZHJlbi5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7IC8vIExhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIChpbiBhbiBpbnRlcmxlYXZlZCBldmVudCkgZHVyaW5nIHRoaXMgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSAoKm5vdCogYW4gaW50ZXJsZWF2ZWQgZXZlbnQpLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzOyAvLyBFcnJvcnMgdGhhdCBhcmUgdGhyb3duIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7IC8vIFRoZXNlIGFyZSBlcnJvcnMgdGhhdCB3ZSByZWNvdmVyZWQgZnJvbSB3aXRob3V0IHN1cmZhY2luZyB0aGVtIHRvIHRoZSBVSS5cbi8vIFdlIHdpbGwgbG9nIHRoZW0gb25jZSB0aGUgdHJlZSBjb21taXRzLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsOyAvLyBUaGUgbW9zdCByZWNlbnQgdGltZSB3ZSBjb21taXR0ZWQgYSBmYWxsYmFjay4gVGhpcyBsZXRzIHVzIGVuc3VyZSBhIHRyYWluXG4vLyBtb2RlbCB3aGVyZSB3ZSBkb24ndCBjb21taXQgbmV3IGxvYWRpbmcgc3RhdGVzIGluIHRvbyBxdWljayBzdWNjZXNzaW9uLlxuXG52YXIgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IDA7XG52YXIgRkFMTEJBQ0tfVEhST1RUTEVfTVMgPSA1MDA7IC8vIFRoZSBhYnNvbHV0ZSB0aW1lIGZvciB3aGVuIHdlIHNob3VsZCBzdGFydCBnaXZpbmcgdXAgb24gcmVuZGVyaW5nXG4vLyBtb3JlIGFuZCBwcmVmZXIgQ1BVIHN1c3BlbnNlIGhldXJpc3RpY3MgaW5zdGVhZC5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBJbmZpbml0eTsgLy8gSG93IGxvbmcgYSByZW5kZXIgaXMgc3VwcG9zZWQgdG8gdGFrZSBiZWZvcmUgd2Ugc3RhcnQgZm9sbG93aW5nIENQVVxuLy8gc3VzcGVuc2UgaGV1cmlzdGljcyBhbmQgb3B0IG91dCBvZiByZW5kZXJpbmcgbW9yZSBjb250ZW50LlxuXG52YXIgUkVOREVSX1RJTUVPVVRfTVMgPSA1MDA7XG52YXIgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlc2V0UmVuZGVyVGltZXIoKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBub3coKSArIFJFTkRFUl9USU1FT1VUX01TO1xufVxuXG5mdW5jdGlvbiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkge1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZTtcbn1cbnZhciBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG52YXIgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbnZhciBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7IC8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVByb2ZpbGVyTmVzdGVkVXBkYXRlU2NoZWR1bGVkSG9vayBpcyB0cnVlO1xudmFyIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcbnZhciBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xudmFyIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSBudWxsOyAvLyBVc2UgdGhlc2UgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIG5lc3RlZCB1cGRhdGVzXG5cbnZhciBORVNURURfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG52YXIgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG52YXIgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7IC8vIElmIHR3byB1cGRhdGVzIGFyZSBzY2hlZHVsZWQgd2l0aGluIHRoZSBzYW1lIGV2ZW50LCB3ZSBzaG91bGQgdHJlYXQgdGhlaXJcbi8vIGV2ZW50IHRpbWVzIGFzIHNpbXVsdGFuZW91cywgZXZlbiBpZiB0aGUgYWN0dWFsIGNsb2NrIHRpbWUgaGFzIGFkdmFuY2VkXG4vLyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNhbGwuXG5cbnZhciBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG52YXIgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBOb0xhbmVzO1xudmFyIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCkge1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290O1xufVxuZnVuY3Rpb24gcmVxdWVzdEV2ZW50VGltZSgpIHtcbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIC8vIFdlJ3JlIGluc2lkZSBSZWFjdCwgc28gaXQncyBmaW5lIHRvIHJlYWQgdGhlIGFjdHVhbCB0aW1lLlxuICAgIHJldHVybiBub3coKTtcbiAgfSAvLyBXZSdyZSBub3QgaW5zaWRlIFJlYWN0LCBzbyB3ZSBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGJyb3dzZXIgZXZlbnQuXG5cblxuICBpZiAoY3VycmVudEV2ZW50VGltZSAhPT0gTm9UaW1lc3RhbXApIHtcbiAgICAvLyBVc2UgdGhlIHNhbWUgc3RhcnQgdGltZSBmb3IgYWxsIHVwZGF0ZXMgdW50aWwgd2UgZW50ZXIgUmVhY3QgYWdhaW4uXG4gICAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7XG4gIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlIHNpbmNlIFJlYWN0IHlpZWxkZWQuIENvbXB1dGUgYSBuZXcgc3RhcnQgdGltZS5cblxuXG4gIGN1cnJlbnRFdmVudFRpbWUgPSBub3coKTtcbiAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7XG59XG5mdW5jdGlvbiByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcikge1xuICAvLyBTcGVjaWFsIGNhc2VzXG4gIHZhciBtb2RlID0gZmliZXIubW9kZTtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFRoZXNlIGFyZSBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuIFRoZVxuICAgIC8vIG9sZCBiZWhhdmlvciBpcyB0byBnaXZlIHRoaXMgdGhlIHNhbWUgXCJ0aHJlYWRcIiAobGFuZXMpIGFzXG4gICAgLy8gd2hhdGV2ZXIgaXMgY3VycmVudGx5IHJlbmRlcmluZy4gU28gaWYgeW91IGNhbGwgYHNldFN0YXRlYCBvbiBhIGNvbXBvbmVudFxuICAgIC8vIHRoYXQgaGFwcGVucyBsYXRlciBpbiB0aGUgc2FtZSByZW5kZXIsIGl0IHdpbGwgZmx1c2guIElkZWFsbHksIHdlIHdhbnQgdG9cbiAgICAvLyByZW1vdmUgdGhlIHNwZWNpYWwgY2FzZSBhbmQgdHJlYXQgdGhlbSBhcyBpZiB0aGV5IGNhbWUgZnJvbSBhblxuICAgIC8vIGludGVybGVhdmVkIGV2ZW50LiBSZWdhcmRsZXNzLCB0aGlzIHBhdHRlcm4gaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLlxuICAgIC8vIFRoaXMgYmVoYXZpb3IgaXMgb25seSBhIGZhbGxiYWNrLiBUaGUgZmxhZyBvbmx5IGV4aXN0cyB1bnRpbCB3ZSBjYW4gcm9sbFxuICAgIC8vIG91dCB0aGUgc2V0U3RhdGUgd2FybmluZywgc2luY2UgZXhpc3RpbmcgY29kZSBtaWdodCBhY2NpZGVudGFsbHkgcmVseSBvblxuICAgIC8vIHRoZSBjdXJyZW50IGJlaGF2aW9yLlxuICAgIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaXNUcmFuc2l0aW9uID0gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkgIT09IE5vVHJhbnNpdGlvbjtcblxuICBpZiAoaXNUcmFuc2l0aW9uKSB7XG4gICAgaWYgKCBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gIT09IG51bGwpIHtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gICAgICBpZiAoIXRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgICAgIH1cblxuICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5hZGQoZmliZXIpO1xuICAgIH0gLy8gVGhlIGFsZ29yaXRobSBmb3IgYXNzaWduaW5nIGFuIHVwZGF0ZSB0byBhIGxhbmUgc2hvdWxkIGJlIHN0YWJsZSBmb3IgYWxsXG4gICAgLy8gdXBkYXRlcyBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoaW4gdGhlIHNhbWUgZXZlbnQuIFRvIGRvIHRoaXMsIHRoZVxuICAgIC8vIGlucHV0cyB0byB0aGUgYWxnb3JpdGhtIG11c3QgYmUgdGhlIHNhbWUuXG4gICAgLy9cbiAgICAvLyBUaGUgdHJpY2sgd2UgdXNlIGlzIHRvIGNhY2hlIHRoZSBmaXJzdCBvZiBlYWNoIG9mIHRoZXNlIGlucHV0cyB3aXRoaW4gYW5cbiAgICAvLyBldmVudC4gVGhlbiByZXNldCB0aGUgY2FjaGVkIHZhbHVlcyBvbmNlIHdlIGNhbiBiZSBzdXJlIHRoZSBldmVudCBpc1xuICAgIC8vIG92ZXIuIE91ciBoZXVyaXN0aWMgZm9yIHRoYXQgaXMgd2hlbmV2ZXIgd2UgZW50ZXIgYSBjb25jdXJyZW50IHdvcmsgbG9vcC5cblxuXG4gICAgaWYgKGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID09PSBOb0xhbmUpIHtcbiAgICAgIC8vIEFsbCB0cmFuc2l0aW9ucyB3aXRoaW4gdGhlIHNhbWUgZXZlbnQgYXJlIGFzc2lnbmVkIHRoZSBzYW1lIGxhbmUuXG4gICAgICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lO1xuICB9IC8vIFVwZGF0ZXMgb3JpZ2luYXRpbmcgaW5zaWRlIGNlcnRhaW4gUmVhY3QgbWV0aG9kcywgbGlrZSBmbHVzaFN5bmMsIGhhdmVcbiAgLy8gdGhlaXIgcHJpb3JpdHkgc2V0IGJ5IHRyYWNraW5nIGl0IHdpdGggYSBjb250ZXh0IHZhcmlhYmxlLlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciB1cGRhdGVMYW5lID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgaWYgKHVwZGF0ZUxhbmUgIT09IE5vTGFuZSkge1xuICAgIHJldHVybiB1cGRhdGVMYW5lO1xuICB9IC8vIFRoaXMgdXBkYXRlIG9yaWdpbmF0ZWQgb3V0c2lkZSBSZWFjdC4gQXNrIHRoZSBob3N0IGVudmlyb25tZW50IGZvciBhblxuICAvLyBhcHByb3ByaWF0ZSBwcmlvcml0eSwgYmFzZWQgb24gdGhlIHR5cGUgb2YgZXZlbnQuXG4gIC8vXG4gIC8vIFRoZSBvcGFxdWUgdHlwZSByZXR1cm5lZCBieSB0aGUgaG9zdCBjb25maWcgaXMgaW50ZXJuYWxseSBhIGxhbmUsIHNvIHdlIGNhblxuICAvLyB1c2UgdGhhdCBkaXJlY3RseS5cbiAgLy8gVE9ETzogTW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZXZlbnQgcHJpb3JpdHkgbW9kdWxlLlxuXG5cbiAgdmFyIGV2ZW50TGFuZSA9IGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCk7XG4gIHJldHVybiBldmVudExhbmU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RSZXRyeUxhbmUoZmliZXIpIHtcbiAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgYHJlcXVlc3RVcGRhdGVMYW5lYCBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIFN1c3BlbnNlXG4gIC8vIFwicmV0cmllc1wiIFx1MjAxNCBhIHNwZWNpYWwgdXBkYXRlIHRoYXQgYXR0ZW1wdHMgdG8gZmxpcCBhIFN1c3BlbnNlIGJvdW5kYXJ5XG4gIC8vIGZyb20gaXRzIHBsYWNlaG9sZGVyIHN0YXRlIHRvIGl0cyBwcmltYXJ5L3Jlc29sdmVkIHN0YXRlLlxuICAvLyBTcGVjaWFsIGNhc2VzXG4gIHZhciBtb2RlID0gZmliZXIubW9kZTtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfVxuXG4gIHJldHVybiBjbGFpbU5leHRSZXRyeUxhbmUoKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpIHtcbiAgY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCk7XG5cbiAge1xuICAgIGlmIChpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QpIHtcbiAgICAgIGVycm9yKCd1c2VJbnNlcnRpb25FZmZlY3QgbXVzdCBub3Qgc2NoZWR1bGUgdXBkYXRlcy4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmIChpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBNYXJrIHRoYXQgdGhlIHJvb3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuXG5cblxuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9MYW5lcyAmJiByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBUaGlzIHVwZGF0ZSB3YXMgZGlzcGF0Y2hlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpcyBpcyBhIG1pc3Rha2VcbiAgICAvLyBpZiB0aGUgdXBkYXRlIG9yaWdpbmF0ZXMgZnJvbSB1c2VyIHNwYWNlICh3aXRoIHRoZSBleGNlcHRpb24gb2YgbG9jYWxcbiAgICAvLyBob29rIHVwZGF0ZXMsIHdoaWNoIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGFuZCBkb24ndCByZWFjaCB0aGlzXG4gICAgLy8gZnVuY3Rpb24pLCBidXQgdGhlcmUgYXJlIHNvbWUgaW50ZXJuYWwgUmVhY3QgZmVhdHVyZXMgdGhhdCB1c2UgdGhpcyBhc1xuICAgIC8vIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbGlrZSBzZWxlY3RpdmUgaHlkcmF0aW9uLlxuICAgIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKTsgLy8gVHJhY2sgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgbm9ybWFsIHVwZGF0ZSwgc2NoZWR1bGVkIGZyb20gb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLiBGb3JcbiAgICAvLyBleGFtcGxlLCBkdXJpbmcgYW4gaW5wdXQgZXZlbnQuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKTtcblxuICAgIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAgIC8vIFRPRE86IENvbnNvbGlkYXRlIHdpdGggYGlzSW50ZXJsZWF2ZWRVcGRhdGVgIGNoZWNrXG4gICAgICAvLyBSZWNlaXZlZCBhbiB1cGRhdGUgdG8gYSB0cmVlIHRoYXQncyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlcmluZy4gTWFya1xuICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlXG4gICAgICAvLyBgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoYCBmbGFnIGlzIG9mZiBhbmQgdGhpcyBpcyBhIHJlbmRlclxuICAgICAgLy8gcGhhc2UgdXBkYXRlLiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHRyZWF0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGFzIGlmXG4gICAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuXG4gICAgICBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMsIGxhbmUpO1xuICAgICAgfVxuXG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgICAgICAvLyBUaGUgcm9vdCBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHdoaWNoIG1lYW5zIHRoaXMgcmVuZGVyXG4gICAgICAgIC8vIGRlZmluaXRlbHkgd29uJ3QgZmluaXNoLiBTaW5jZSB3ZSBoYXZlIGEgbmV3IHVwZGF0ZSwgbGV0J3MgbWFyayBpdCBhc1xuICAgICAgICAvLyBzdXNwZW5kZWQgbm93LCByaWdodCBiZWZvcmUgbWFya2luZyB0aGUgaW5jb21pbmcgdXBkYXRlLiBUaGlzIGhhcyB0aGVcbiAgICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCByZW5kZXIgYW5kIHN3aXRjaGluZyB0byB0aGUgdXBkYXRlLlxuICAgICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IG92ZXJyaWRlIHBpbmdzIHRoYXQgaGFwcGVuIHdoaWxlIHdlJ3ZlXG4gICAgICAgIC8vIGFscmVhZHkgc3RhcnRlZCByZW5kZXJpbmcuXG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuXG4gICAgaWYgKGxhbmUgPT09IFN5bmNMYW5lICYmIGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCAmJiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgLy8gRmx1c2ggdGhlIHN5bmNocm9ub3VzIHdvcmsgbm93LCB1bmxlc3Mgd2UncmUgYWxyZWFkeSB3b3JraW5nIG9yIGluc2lkZVxuICAgICAgLy8gYSBiYXRjaC4gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGluc2lkZSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgaW5zdGVhZCBvZlxuICAgICAgLy8gc2NoZWR1bGVDYWxsYmFja0ZvckZpYmVyIHRvIHByZXNlcnZlIHRoZSBhYmlsaXR5IHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgIC8vIHdpdGhvdXQgaW1tZWRpYXRlbHkgZmx1c2hpbmcgaXQuIFdlIG9ubHkgZG8gdGhpcyBmb3IgdXNlci1pbml0aWF0ZWRcbiAgICAgIC8vIHVwZGF0ZXMsIHRvIHByZXNlcnZlIGhpc3RvcmljYWwgYmVoYXZpb3Igb2YgbGVnYWN5IG1vZGUuXG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5mdW5jdGlvbiBzY2hlZHVsZUluaXRpYWxIeWRyYXRpb25PblJvb3Qocm9vdCwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGZvcmsgb2Ygc2NoZWR1bGVVcGRhdGVPbkZpYmVyIHRoYXQgaXMgb25seSB1c2VkIHRvXG4gIC8vIHNjaGVkdWxlIHRoZSBpbml0aWFsIGh5ZHJhdGlvbiBvZiBhIHJvb3QgdGhhdCBoYXMganVzdCBiZWVuIGNyZWF0ZWQuIE1vc3RcbiAgLy8gb2YgdGhlIHN0dWZmIGluIHNjaGVkdWxlVXBkYXRlT25GaWJlciBjYW4gYmUgc2tpcHBlZC5cbiAgLy9cbiAgLy8gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIHNlcGFyYXRlIHBhdGgsIHRob3VnaCwgaXMgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gIC8vIGluaXRpYWwgY2hpbGRyZW4gZnJvbSBzdWJzZXF1ZW50IHVwZGF0ZXMuIEluIGZ1bGx5IGNsaWVudC1yZW5kZXJlZCByb290c1xuICAvLyAoY3JlYXRlUm9vdCBpbnN0ZWFkIG9mIGh5ZHJhdGVSb290KSwgYWxsIHRvcC1sZXZlbCByZW5kZXJzIGFyZSBtb2RlbGVkIGFzXG4gIC8vIHVwZGF0ZXMsIGJ1dCBoeWRyYXRpb24gcm9vdHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdFxuICAvLyBtYXRjaCB3aGF0IHdhcyByZW5kZXJlZCBvbiB0aGUgc2VydmVyLlxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgY3VycmVudC5sYW5lcyA9IGxhbmU7XG4gIG1hcmtSb290VXBkYXRlZChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn0gLy8gVGhpcyBpcyBzcGxpdCBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gd2UgY2FuIG1hcmsgYSBmaWJlciB3aXRoIHBlbmRpbmdcbi8vIHdvcmsgd2l0aG91dCB0cmVhdGluZyBpdCBhcyBhIHR5cGljYWwgdXBkYXRlIHRoYXQgb3JpZ2luYXRlcyBmcm9tIGFuIGV2ZW50O1xuLy8gZS5nLiByZXRyeWluZyBhIFN1c3BlbnNlIGJvdW5kYXJ5IGlzbid0IGFuIHVwZGF0ZSwgYnV0IGl0IGRvZXMgc2NoZWR1bGUgd29ya1xuLy8gb24gYSBmaWJlci5cblxuZnVuY3Rpb24gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Qoc291cmNlRmliZXIsIGxhbmUpIHtcbiAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgZmliZXIncyBsYW5lc1xuICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIGxhbmUpO1xuICB2YXIgYWx0ZXJuYXRlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgbGFuZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCAmJiAoc291cmNlRmliZXIuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgIH1cbiAgfSAvLyBXYWxrIHRoZSBwYXJlbnQgcGF0aCB0byB0aGUgcm9vdCBhbmQgdXBkYXRlIHRoZSBjaGlsZCBsYW5lcy5cblxuXG4gIHZhciBub2RlID0gc291cmNlRmliZXI7XG4gIHZhciBwYXJlbnQgPSBzb3VyY2VGaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIHBhcmVudC5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhwYXJlbnQuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgYWx0ZXJuYXRlID0gcGFyZW50LmFsdGVybmF0ZTtcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKChwYXJlbnQuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICB2YXIgcm9vdCA9IG5vZGUuc3RhdGVOb2RlO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJsZWF2ZWRVcGRhdGUoZmliZXIsIGxhbmUpIHtcbiAgcmV0dXJuICgvLyBUT0RPOiBPcHRpbWl6ZSBzbGlnaHRseSBieSBjb21wYXJpbmcgdG8gcm9vdCB0aGF0IGZpYmVyIGJlbG9uZ3MgdG8uXG4gICAgLy8gUmVxdWlyZXMgc29tZSByZWZhY3RvcmluZy4gTm90IGEgYmlnIGRlYWwgdGhvdWdoIHNpbmNlIGl0J3MgcmFyZSBmb3JcbiAgICAvLyBjb25jdXJyZW50IGFwcHMgdG8gaGF2ZSBtb3JlIHRoYW4gYSBzaW5nbGUgcm9vdC5cbiAgICAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsIHx8IC8vIElmIHRoZSBpbnRlcmxlYXZlZCB1cGRhdGVzIHF1ZXVlIGhhc24ndCBiZWVuIGNsZWFyZWQgeWV0LCB0aGVuXG4gICAgLy8gd2Ugc2hvdWxkIHRyZWF0IHRoaXMgYXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlLCB0b28uIFRoaXMgaXMgYWxzbyBhXG4gICAgLy8gZGVmZW5zaXZlIGNvZGluZyBtZWFzdXJlIGluIGNhc2UgYSBuZXcgdXBkYXRlIGNvbWVzIGluIGJldHdlZW4gd2hlblxuICAgIC8vIHJlbmRlcmluZyBoYXMgZmluaXNoZWQgYW5kIHdoZW4gdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHRyYW5zZmVycmVkXG4gICAgLy8gdG8gdGhlIG1haW4gcXVldWUuXG4gICAgaGFzSW50ZXJsZWF2ZWRVcGRhdGVzKCkpICYmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUgJiYgKCAvLyBJZiB0aGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZSAoaS5lLiBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyksXG4gICAgLy8gdGhlbiBkb24ndCB0cmVhdCB0aGlzIGFzIGFuIGludGVybGVhdmVkIHVwZGF0ZS4gVGhpcyBwYXR0ZXJuIGlzXG4gICAgLy8gYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nIGJ1dCB3ZSBoYXZlbid0IGZ1bGx5IGRlcHJlY2F0ZWQgaXQgeWV0LiBXZSBjYW5cbiAgICAvLyByZW1vdmUgb25jZSB0aGUgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoIGZsYWcgaXMgZW5hYmxlZC5cbiAgICAgKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSA9PT0gTm9Db250ZXh0KVxuICApO1xufSAvLyBVc2UgdGhpcyBmdW5jdGlvbiB0byBzY2hlZHVsZSBhIHRhc2sgZm9yIGEgcm9vdC4gVGhlcmUncyBvbmx5IG9uZSB0YXNrIHBlclxuLy8gcm9vdDsgaWYgYSB0YXNrIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCwgd2UnbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwcmlvcml0eVxuLy8gb2YgdGhlIGV4aXN0aW5nIHRhc2sgaXMgdGhlIHNhbWUgYXMgdGhlIHByaW9yaXR5IG9mIHRoZSBuZXh0IGxldmVsIHRoYXQgdGhlXG4vLyByb290IGhhcyB3b3JrIG9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBldmVyeSB1cGRhdGUsIGFuZCByaWdodCBiZWZvcmVcbi8vIGV4aXRpbmcgYSB0YXNrLlxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFRoZXJlJ3Mgbm90aGluZyB0byB3b3JrIG9uLlxuICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgfVxuXG4gICAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgdXNlIHRoZSBoaWdoZXN0IHByaW9yaXR5IGxhbmUgdG8gcmVwcmVzZW50IHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuICB2YXIgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID0gcm9vdC5jYWxsYmFja1ByaW9yaXR5O1xuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPT09IG5ld0NhbGxiYWNrUHJpb3JpdHkgJiYgLy8gU3BlY2lhbCBjYXNlIHJlbGF0ZWQgdG8gYGFjdGAuIElmIHRoZSBjdXJyZW50bHkgc2NoZWR1bGVkIHRhc2sgaXMgYVxuICAvLyBTY2hlZHVsZXIgdGFzaywgcmF0aGVyIHRoYW4gYW4gYGFjdGAgdGFzaywgY2FuY2VsIGl0IGFuZCByZS1zY2hlZHVsZWRcbiAgLy8gb24gdGhlIGBhY3RgIHF1ZXVlLlxuICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IGZha2VBY3RDYWxsYmFja05vZGUpKSB7XG4gICAge1xuICAgICAgLy8gSWYgd2UncmUgZ29pbmcgdG8gcmUtdXNlIGFuIGV4aXN0aW5nIHRhc2ssIGl0IG5lZWRzIHRvIGV4aXN0LlxuICAgICAgLy8gQXNzdW1lIHRoYXQgZGlzY3JldGUgdXBkYXRlIG1pY3JvdGFza3MgYXJlIG5vbi1jYW5jZWxsYWJsZSBhbmQgbnVsbC5cbiAgICAgIC8vIFRPRE86IFRlbXBvcmFyeSB1bnRpbCB3ZSBjb25maXJtIHRoaXMgd2FybmluZyBpcyBub3QgZmlyZWQuXG4gICAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgIT09IFN5bmNMYW5lKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCBzY2hlZHVsZWQgY2FsbGJhY2sgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cblxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9IG51bGwpIHtcbiAgICAvLyBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ldyBvbmUgYmVsb3cuXG4gICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gIH0gLy8gU2NoZWR1bGUgYSBuZXcgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tOb2RlO1xuXG4gIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jTGFuZSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIGlmIChyb290LnRhZyA9PT0gTGVnYWN5Um9vdCkge1xuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kgIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBxdWV1ZSBpbiBhIG1pY3JvdGFzay5cbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEluc2lkZSBgYWN0YCwgdXNlIG91ciBpbnRlcm5hbCBgYWN0YCBxdWV1ZSBzbyB0aGF0IHRoZXNlIGdldCBmbHVzaGVkXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2NvcGUgZXZlbiB3aGVuIHVzaW5nIHRoZSBzeW5jIHZlcnNpb25cbiAgICAgICAgLy8gb2YgYGFjdGAuXG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudC5wdXNoKGZsdXNoU3luY0NhbGxiYWNrcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlZHVsZU1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gSW4gU2FmYXJpLCBhcHBlbmRpbmcgYW4gaWZyYW1lIGZvcmNlcyBtaWNyb3Rhc2tzIHRvIHJ1bi5cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIyNDU5XG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBydW5uaW5nIGNhbGxiYWNrcyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlclxuICAgICAgICAgIC8vIG9yIGNvbW1pdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhhdC5cbiAgICAgICAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgICAgICAvLyBJdCdzIG9ubHkgc2FmZSB0byBkbyB0aGlzIGNvbmRpdGlvbmFsbHkgYmVjYXVzZSB3ZSBhbHdheXNcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBwZW5kaW5nIHdvcmsgYmVmb3JlIHdlIGV4aXQgdGhlIHRhc2suXG4gICAgICAgICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNjaGVkdWxlclByaW9yaXR5TGV2ZWw7XG5cbiAgICBzd2l0Y2ggKGxhbmVzVG9FdmVudFByaW9yaXR5KG5leHRMYW5lcykpIHtcbiAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSWRsZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrJDEoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCwgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICB9XG5cbiAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gbmV3Q2FsbGJhY2tQcmlvcml0eTtcbiAgcm9vdC5jYWxsYmFja05vZGUgPSBuZXdDYWxsYmFja05vZGU7XG59IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBldmVyeSBjb25jdXJyZW50IHRhc2ssIGkuZS4gYW55dGhpbmcgdGhhdFxuLy8gZ29lcyB0aHJvdWdoIFNjaGVkdWxlci5cblxuXG5mdW5jdGlvbiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3Qocm9vdCwgZGlkVGltZW91dCkge1xuICB7XG4gICAgcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH0gLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnRcbiAgLy8gZXZlbnQgdGltZS4gVGhlIG5leHQgdXBkYXRlIHdpbGwgY29tcHV0ZSBhIG5ldyBldmVudCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLFxuICAvLyBpbiBjYXNlIHRoZXkgc2NoZWR1bGUgYWRkaXRpb25hbCB3b3JrLlxuXG5cbiAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7XG4gIHZhciBkaWRGbHVzaFBhc3NpdmVFZmZlY3RzID0gZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuXG4gIGlmIChkaWRGbHVzaFBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoZSBwYXNzaXZlIGVmZmVjdCBwaGFzZSBtYXkgaGF2ZSBjYW5jZWxlZCB0aGUgY3VycmVudCB0YXNrLlxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC5cbiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgIT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0YXNrIHdhcyBjYW5jZWxlZC4gRXhpdC4gV2UgZG9uJ3QgbmVlZCB0byBjYWxsXG4gICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0XG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IHRhc2ssIG9yIHRoYXQgdGhlcmUncyBubyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGxhbmVzIHRvIHdvcmsgb24sIHVzaW5nIHRoZSBmaWVsZHMgc3RvcmVkXG4gIC8vIG9uIHRoZSByb290LlxuXG5cbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzIDogTm9MYW5lcyk7XG5cbiAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gRGVmZW5zaXZlIGNvZGluZy4gVGhpcyBpcyBuZXZlciBleHBlY3RlZCB0byBoYXBwZW4uXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gV2UgZGlzYWJsZSB0aW1lLXNsaWNpbmcgaW4gc29tZSBjYXNlczogaWYgdGhlIHdvcmsgaGFzIGJlZW4gQ1BVLWJvdW5kXG4gIC8vIGZvciB0b28gbG9uZyAoXCJleHBpcmVkXCIgd29yaywgdG8gcHJldmVudCBzdGFydmF0aW9uKSwgb3Igd2UncmUgaW5cbiAgLy8gc3luYy11cGRhdGVzLWJ5LWRlZmF1bHQgbW9kZS5cbiAgLy8gVE9ETzogV2Ugb25seSBjaGVjayBgZGlkVGltZW91dGAgZGVmZW5zaXZlbHksIHRvIGFjY291bnQgZm9yIGEgU2NoZWR1bGVyXG4gIC8vIGJ1ZyB3ZSdyZSBzdGlsbCBpbnZlc3RpZ2F0aW5nLiBPbmNlIHRoZSBidWcgaW4gU2NoZWR1bGVyIGlzIGZpeGVkLFxuICAvLyB3ZSBjYW4gcmVtb3ZlIHRoaXMsIHNpbmNlIHdlIHRyYWNrIGV4cGlyYXRpb24gb3Vyc2VsdmVzLlxuXG5cbiAgdmFyIHNob3VsZFRpbWVTbGljZSA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykgJiYgIWluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpICYmICggIWRpZFRpbWVvdXQpO1xuICB2YXIgZXhpdFN0YXR1cyA9IHNob3VsZFRpbWVTbGljZSA/IHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSA6IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbFxuICAgICAgLy8gcmVuZGVyIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsXG4gICAgICAvLyBpbmNsdWRlcyBhbGwgcGVuZGluZyB1cGRhdGVzIGFyZSBpbmNsdWRlZC4gSWYgaXQgc3RpbGwgZmFpbHMgYWZ0ZXJcbiAgICAgIC8vIHRoZSBzZWNvbmQgYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgaWYgKGVycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdERpZE5vdENvbXBsZXRlKSB7XG4gICAgICAvLyBUaGUgcmVuZGVyIHVud291bmQgd2l0aG91dCBjb21wbGV0aW5nIHRoZSB0cmVlLiBUaGlzIGhhcHBlbnMgaW4gc3BlY2lhbFxuICAgICAgLy8gY2FzZXMgd2hlcmUgbmVlZCB0byBleGl0IHRoZSBjdXJyZW50IHJlbmRlciB3aXRob3V0IHByb2R1Y2luZyBhXG4gICAgICAvLyBjb25zaXN0ZW50IHRyZWUgb3IgY29tbWl0dGluZy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBkdXJpbmcgYSBjb25jdXJyZW50IHJlbmRlciwgbm90IGEgZGlzY3JldGUgb3JcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZS4gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIGZvciB0aGlzIHdoZW4gd2VcbiAgICAgIC8vIHVud291bmQgdGhlIHN0YWNrLlxuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgY29tcGxldGVkLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByZW5kZXIgbWF5IGhhdmUgeWllbGRlZCB0byBhIGNvbmN1cnJlbnQgZXZlbnQsIGFuZCBpZiBzbyxcbiAgICAgIC8vIGNvbmZpcm0gdGhhdCBhbnkgbmV3bHkgcmVuZGVyZWQgc3RvcmVzIGFyZSBjb25zaXN0ZW50LlxuICAgICAgLy8gVE9ETzogSXQncyBwb3NzaWJsZSB0aGF0IGV2ZW4gYSBjb25jdXJyZW50IHJlbmRlciBtYXkgbmV2ZXIgaGF2ZSB5aWVsZGVkXG4gICAgICAvLyB0byB0aGUgbWFpbiB0aHJlYWQsIGlmIGl0IHdhcyBmYXN0IGVub3VnaCwgb3IgaWYgaXQgZXhwaXJlZC4gV2UgY291bGRcbiAgICAgIC8vIHNraXAgdGhlIGNvbnNpc3RlbmN5IGNoZWNrIGluIHRoYXQgY2FzZSwgdG9vLlxuICAgICAgdmFyIHJlbmRlcldhc0NvbmN1cnJlbnQgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpO1xuICAgICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChyZW5kZXJXYXNDb25jdXJyZW50ICYmICFpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSkge1xuICAgICAgICAvLyBBIHN0b3JlIHdhcyBtdXRhdGVkIGluIGFuIGludGVybGVhdmVkIGV2ZW50LiBSZW5kZXIgYWdhaW4sXG4gICAgICAgIC8vIHN5bmNocm9ub3VzbHksIHRvIGJsb2NrIGZ1cnRoZXIgbXV0YXRpb25zLlxuICAgICAgICBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpOyAvLyBXZSBuZWVkIHRvIGNoZWNrIGFnYWluIGlmIHNvbWV0aGluZyB0aHJld1xuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICAgICAgICBpZiAoX2Vycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgbGFuZXMgPSBfZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIF9lcnJvclJldHJ5TGFuZXMpOyAvLyBXZSBhc3N1bWUgdGhlIHRyZWUgaXMgbm93IGNvbnNpc3RlbnQgYmVjYXVzZSB3ZSBkaWRuJ3QgeWllbGQgdG8gYW55XG4gICAgICAgICAgICAvLyBjb25jdXJyZW50IGV2ZW50cy5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICAgICAgICB0aHJvdyBfZmF0YWxFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gVGhlIG5leHQgc3RlcCBpcyBlaXRoZXIgdG8gY29tbWl0IGl0LFxuICAgICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC5cblxuXG4gICAgICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgICAgIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICAgICAgZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocm9vdC5jYWxsYmFja05vZGUgPT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgLy8gVGhlIHRhc2sgbm9kZSBzY2hlZHVsZWQgZm9yIHRoaXMgcm9vdCBpcyB0aGUgc2FtZSBvbmUgdGhhdCdzXG4gICAgLy8gY3VycmVudGx5IGV4ZWN1dGVkLiBOZWVkIHRvIHJldHVybiBhIGNvbnRpbnVhdGlvbi5cbiAgICByZXR1cm4gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKSB7XG4gIC8vIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24sIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsXG4gIC8vIGJhY2sgdG8gY2xpZW50IHNpZGUgcmVuZGVyLlxuICAvLyBCZWZvcmUgcmVuZGVyaW5nIGFnYWluLCBzYXZlIHRoZSBlcnJvcnMgZnJvbSB0aGUgcHJldmlvdXMgYXR0ZW1wdC5cbiAgdmFyIGVycm9yc0Zyb21GaXJzdEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzO1xuXG4gIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgLy8gVGhlIHNoZWxsIGZhaWxlZCB0byBoeWRyYXRlLiBTZXQgYSBmbGFnIHRvIGZvcmNlIGEgY2xpZW50IHJlbmRlcmluZ1xuICAgIC8vIGR1cmluZyB0aGUgbmV4dCBhdHRlbXB0LiBUbyBkbyB0aGlzLCB3ZSBjYWxsIHByZXBhcmVGcmVzaFN0YWNrIG5vd1xuICAgIC8vIHRvIGNyZWF0ZSB0aGUgcm9vdCB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBUaGlzIGlzIGEgYml0IHdlaXJkIGluIHRlcm1zXG4gICAgLy8gb2YgZmFjdG9yaW5nLCBiZWNhdXNlIGl0IHJlbGllcyBvbiByZW5kZXJSb290U3luYyBub3QgY2FsbGluZ1xuICAgIC8vIHByZXBhcmVGcmVzaFN0YWNrIGFnYWluIGluIHRoZSBjYWxsIGJlbG93LCB3aGljaCBoYXBwZW5zIGJlY2F1c2UgdGhlXG4gICAgLy8gcm9vdCBhbmQgbGFuZXMgaGF2ZW4ndCBjaGFuZ2VkLlxuICAgIC8vXG4gICAgLy8gVE9ETzogSSB0aGluayB3aGF0IHdlIHNob3VsZCBkbyBpcyBzZXQgRm9yY2VDbGllbnRSZW5kZXIgaW5zaWRlXG4gICAgLy8gdGhyb3dFeGNlcHRpb24sIGxpa2Ugd2UgZG8gZm9yIG5lc3RlZCBTdXNwZW5zZSBib3VuZGFyaWVzLiBUaGUgcmVhc29uXG4gICAgLy8gaXQncyBoZXJlIGluc3RlYWQgaXMgc28gd2UgY2FuIHN3aXRjaCB0byB0aGUgc3luY2hyb25vdXMgd29yayBsb29wLCB0b28uXG4gICAgLy8gU29tZXRoaW5nIHRvIGNvbnNpZGVyIGZvciBhIGZ1dHVyZSByZWZhY3Rvci5cbiAgICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICByb290V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICB7XG4gICAgICBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEVycm9yZWQpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgZmluaXNoZWQgcmVuZGVyaW5nIG9uIHJldHJ5XG4gICAgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBmYWlsZWQgZmlyc3QgYXR0ZW1wdCBoYXZlIGJlZW4gcmVjb3ZlcmVkLiBBZGRcbiAgICAvLyB0aGVtIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHJlY292ZXJhYmxlIGVycm9ycy4gV2UnbGwgbG9nIHRoZW0gaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlLlxuICAgIHZhciBlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdDsgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBzZWNvbmQgYXR0ZW1wdCBzaG91bGQgYmUgcXVldWVkIGFmdGVyIHRoZSBlcnJvcnNcbiAgICAvLyBmcm9tIHRoZSBmaXJzdCBhdHRlbXB0LCB0byBwcmVzZXJ2ZSB0aGUgY2F1c2FsIHNlcXVlbmNlLlxuXG4gICAgaWYgKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ICE9PSBudWxsKSB7XG4gICAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpdFN0YXR1cztcbn1cblxuZnVuY3Rpb24gcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnMpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnM7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMucHVzaC5hcHBseSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgZXJyb3JzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7XG4gIHN3aXRjaCAoZXhpdFN0YXR1cykge1xuICAgIGNhc2UgUm9vdEluUHJvZ3Jlc3M6XG4gICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICAvLyBGbG93IGtub3dzIGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zIGlmIEkgYWRkIGEgYnJlYWtcbiAgICAvLyBzdGF0ZW1lbnQsIGJ1dCBlc2xpbnQgZG9lc24ndCBrbm93IGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zXG4gICAgLy8gaWYgSSBkby4gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFJvb3RFcnJvcmVkOlxuICAgICAge1xuICAgICAgICAvLyBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGF0dGVtcHRlZCB0byByZXRyeSB0aGlzIHRyZWUuIElmIHdlIHJlYWNoZWRcbiAgICAgICAgLy8gdGhpcyBwb2ludCwgaXQgZXJyb3JlZCBhZ2Fpbi4gQ29tbWl0IGl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOyAvLyBXZSBoYXZlIGFuIGFjY2VwdGFibGUgbG9hZGluZyBzdGF0ZS4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHdlXG4gICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC5cblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZVxuICAgICAgICAhc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIHJlbmRlciBvbmx5IGluY2x1ZGVkIHJldHJpZXMsIG5vIHVwZGF0ZXMuIFRocm90dGxlIGNvbW1pdHRpbmdcbiAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS5cbiAgICAgICAgICB2YXIgbXNVbnRpbFRpbWVvdXQgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgRkFMTEJBQ0tfVEhST1RUTEVfTVMgLSBub3coKTsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cbiAgICAgICAgICBpZiAobXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICAgICAgICAgICAgaWYgKG5leHRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuXG4gICAgICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhzdXNwZW5kZWRMYW5lcywgbGFuZXMpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdFxuICAgICAgICAgICAgICAvLyBzdXNwZW5kZWQgbGV2ZWwuIFBpbmcgdGhlIGxhc3Qgc3VzcGVuZGVkIGxldmVsIHRvIHRyeVxuICAgICAgICAgICAgICAvLyByZW5kZXJpbmcgaXQgYWdhaW4uXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC5cbiAgICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgICAgbWFya1Jvb3RQaW5nZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gVGhlIHJlbmRlciBpcyBzdXNwZW5kZWQsIGl0IGhhc24ndCB0aW1lZCBvdXQsIGFuZCB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB3b3JrIHRvIGRvLiBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cblxuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKSwgbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFRoZSB3b3JrIGV4cGlyZWQuIENvbW1pdCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZFdpdGhEZWxheTpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSB0cmFuc2l0aW9uLCBzbyB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IGNvbW1pdHRpbmcgYVxuICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIGFuZCB3aXRob3V0IHNjaGVkdWxpbmcgYSB0aW1lb3V0LiBEZWxheSBpbmRlZmluaXRlbHlcbiAgICAgICAgICAvLyB1bnRpbCB3ZSByZWNlaXZlIG1vcmUgZGF0YS5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHRyYW5zaXRpb24sIGJ1dCB3ZSBkaWQgdHJpZ2dlciBhbiBhdm9pZGVkIHN0YXRlLlxuICAgICAgICAgIC8vIFNjaGVkdWxlIGEgcGxhY2Vob2xkZXIgdG8gZGlzcGxheSBhZnRlciBhIHNob3J0IGRlbGF5LCB1c2luZyB0aGUgSnVzdFxuICAgICAgICAgIC8vIE5vdGljZWFibGUgRGlmZmVyZW5jZS5cbiAgICAgICAgICAvLyBUT0RPOiBJcyB0aGUgSk5EIG9wdGltaXphdGlvbiB3b3J0aCB0aGUgYWRkZWQgY29tcGxleGl0eT8gSWYgdGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB3ZSB0cmFjayB0aGUgZXZlbnQgdGltZSwgdGhlbiBwcm9iYWJseSBub3QuXG4gICAgICAgICAgLy8gQ29uc2lkZXIgcmVtb3ZpbmcuXG4gICAgICAgICAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICB2YXIgZXZlbnRUaW1lTXMgPSBtb3N0UmVjZW50RXZlbnRUaW1lO1xuICAgICAgICAgIHZhciB0aW1lRWxhcHNlZE1zID0gbm93KCkgLSBldmVudFRpbWVNcztcblxuICAgICAgICAgIHZhciBfbXNVbnRpbFRpbWVvdXQgPSBqbmQodGltZUVsYXBzZWRNcykgLSB0aW1lRWxhcHNlZE1zOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuXG4gICAgICAgICAgaWYgKF9tc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgICAgICAgIC8vIHRvIGFycml2ZS5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBfbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RDb21wbGV0ZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRoZSB3b3JrIGNvbXBsZXRlZC4gUmVhZHkgdG8gY29tbWl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcm9vdCBleGl0IHN0YXR1cy4nKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIFNlYXJjaCB0aGUgcmVuZGVyZWQgdHJlZSBmb3IgZXh0ZXJuYWwgc3RvcmUgcmVhZHMsIGFuZCBjaGVjayB3aGV0aGVyIHRoZVxuICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkIGluIGEgY29uY3VycmVudCBldmVudC4gSW50ZW50aW9uYWxseSB1c2luZyBhbiBpdGVyYXRpdmVcbiAgLy8gbG9vcCBpbnN0ZWFkIG9mIHJlY3Vyc2lvbiBzbyB3ZSBjYW4gZXhpdCBlYXJseS5cbiAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobm9kZS5mbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kpIHtcbiAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5vZGUudXBkYXRlUXVldWU7XG5cbiAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gdXBkYXRlUXVldWUuc3RvcmVzO1xuXG4gICAgICAgIGlmIChjaGVja3MgIT09IG51bGwpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoZWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoZWNrID0gY2hlY2tzW2ldO1xuICAgICAgICAgICAgdmFyIGdldFNuYXBzaG90ID0gY2hlY2suZ2V0U25hcHNob3Q7XG4gICAgICAgICAgICB2YXIgcmVuZGVyZWRWYWx1ZSA9IGNoZWNrLnZhbHVlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIW9iamVjdElzKGdldFNuYXBzaG90KCksIHJlbmRlcmVkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm91bmQgYW4gaW5jb25zaXN0ZW50IHN0b3JlLlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYGdldFNuYXBzaG90YCB0aHJvd3MsIHJldHVybiBgZmFsc2VgLiBUaGlzIHdpbGwgc2NoZWR1bGVcbiAgICAgICAgICAgICAgLy8gYSByZS1yZW5kZXIsIGFuZCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biBkdXJpbmcgcmVuZGVyLlxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChub2RlLnN1YnRyZWVGbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9IC8vIEZsb3cgZG9lc24ndCBrbm93IHRoaXMgaXMgdW5yZWFjaGFibGUsIGJ1dCBlc2xpbnQgZG9lc1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGVcblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIC8vIFdoZW4gc3VzcGVuZGluZywgd2Ugc2hvdWxkIGFsd2F5cyBleGNsdWRlIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgb3IgKG1vcmVcbiAgLy8gcmFyZWx5LCBzaW5jZSB3ZSB0cnkgdG8gYXZvaWQgaXQpIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gIC8vIFRPRE86IExvbCBtYXliZSB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byBmYWN0b3IgdGhpcyBiZXNpZGVzIHRoaXNcbiAgLy8gb2Jub3hpb3VzbHkgbmFtZWQgZnVuY3Rpb24gOilcbiAgc3VzcGVuZGVkTGFuZXMgPSByZW1vdmVMYW5lcyhzdXNwZW5kZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMpO1xuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyk7XG4gIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgZ29cbi8vIHRocm91Z2ggU2NoZWR1bGVyXG5cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QpIHtcbiAge1xuICAgIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH1cblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShsYW5lcywgU3luY0xhbmUpKSB7XG4gICAgLy8gVGhlcmUncyBubyByZW1haW5pbmcgc3luYyB3b3JrIGxlZnQuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChyb290LnRhZyAhPT0gTGVnYWN5Um9vdCAmJiBleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbCByZW5kZXJcbiAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kXG4gICAgLy8gYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gQmVjYXVzZSB0aGlzIGlzIGEgc3luYyByZW5kZXIsIHdlXG4gIC8vIHdpbGwgY29tbWl0IGl0IGV2ZW4gaWYgc29tZXRoaW5nIHN1c3BlbmRlZC5cblxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlO1xuICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpOyAvLyBCZWZvcmUgZXhpdGluZywgbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYWxsYmFjayBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0XG4gIC8vIHBlbmRpbmcgbGV2ZWwuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUm9vdChyb290LCBsYW5lcykge1xuICBpZiAobGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBtZXJnZUxhbmVzKGxhbmVzLCBTeW5jTGFuZSkpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcblxuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIElmIHRoZXJlIHdlcmUgbGVnYWN5IHN5bmMgdXBkYXRlcywgZmx1c2ggdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSBvdXRlclxuICAgIC8vIG1vc3QgYmF0Y2hlZFVwZGF0ZXMtbGlrZSBtZXRob2QuXG5cbiAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlzY3JldGVVcGRhdGVzKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKGEsIGIsIGMsIGQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICB9XG4gIH1cbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuZnVuY3Rpb24gZmx1c2hTeW5jKGZuKSB7XG4gIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBmbHVzaCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAvLyBuZXh0IGV2ZW50LCBub3QgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgb25lLlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwgJiYgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMudGFnID09PSBMZWdhY3lSb290ICYmIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICBpZiAoZm4pIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgLy8gdGhlIHN0YWNrLlxuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpc0FscmVhZHlSZW5kZXJpbmcoKSB7XG4gIC8vIFVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIHByaW50IGEgd2FybmluZyBpZiBjZXJ0YWluIEFQSXMgYXJlIGNhbGxlZCBmcm9tXG4gIC8vIHRoZSB3cm9uZyBjb250ZXh0LlxuICByZXR1cm4gIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dDtcbn1cbmZ1bmN0aW9uIHB1c2hSZW5kZXJMYW5lcyhmaWJlciwgbGFuZXMpIHtcbiAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpO1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHN1YnRyZWVSZW5kZXJMYW5lcywgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiBwb3BSZW5kZXJMYW5lcyhmaWJlcikge1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IuY3VycmVudDtcbiAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcykge1xuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciB0aW1lb3V0SGFuZGxlID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuXG4gIGlmICh0aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXQpIHtcbiAgICAvLyBUaGUgcm9vdCBwcmV2aW91cyBzdXNwZW5kZWQgYW5kIHNjaGVkdWxlZCBhIHRpbWVvdXQgdG8gY29tbWl0IGEgZmFsbGJhY2tcbiAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC5cbiAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7IC8vICRGbG93Rml4TWUgQ29tcGxhaW5zIG5vVGltZW91dCBpcyBub3QgYSBUaW1lb3V0SUQsIGRlc3BpdGUgdGhlIGNoZWNrIGFib3ZlXG5cbiAgICBjYW5jZWxUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaW50ZXJydXB0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gY3JlYXRlV29ya0luUHJvZ3Jlc3Mocm9vdC5jdXJyZW50LCBudWxsKTtcbiAgd29ya0luUHJvZ3Jlc3MgPSByb290V29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IGxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDtcbiAgZW5xdWV1ZUludGVybGVhdmVkVXBkYXRlcygpO1xuXG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzKCk7XG4gIH1cblxuICByZXR1cm4gcm9vdFdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSkge1xuICBkbyB7XG4gICAgdmFyIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzZXQgbW9kdWxlLWxldmVsIHN0YXRlIHRoYXQgd2FzIHNldCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTtcbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7IC8vIFRPRE86IEkgZm91bmQgYW5kIGFkZGVkIHRoaXMgbWlzc2luZyBsaW5lIHdoaWxlIGludmVzdGlnYXRpbmcgYVxuICAgICAgLy8gc2VwYXJhdGUgaXNzdWUuIFdyaXRlIGEgcmVncmVzc2lvbiB0ZXN0IHVzaW5nIHN0cmluZyByZWZzLlxuXG4gICAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgICBpZiAoZXJyb3JlZFdvcmsgPT09IG51bGwgfHwgZXJyb3JlZFdvcmsucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIHRvIGJlIHdvcmtpbmcgb24gYSBub24tcm9vdCBmaWJlci4gVGhpcyBpcyBhIGZhdGFsIGVycm9yXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlcmUncyBubyBhbmNlc3RvciB0aGF0IGNhbiBoYW5kbGUgaXQ7IHRoZSByb290IGlzXG4gICAgICAgIC8vIHN1cHBvc2VkIHRvIGNhcHR1cmUgYWxsIGVycm9ycyB0aGF0IHdlcmVuJ3QgY2F1Z2h0IGJ5IGFuIGVycm9yXG4gICAgICAgIC8vIGJvdW5kYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEZhdGFsRXJyb3JlZDtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IHRocm93blZhbHVlOyAvLyBTZXQgYHdvcmtJblByb2dyZXNzYCB0byBudWxsLiBUaGlzIHJlcHJlc2VudHMgYWR2YW5jaW5nIHRvIHRoZSBuZXh0XG4gICAgICAgIC8vIHNpYmxpbmcsIG9yIHRoZSBwYXJlbnQgaWYgdGhlcmUgYXJlIG5vIHNpYmxpbmdzLiBCdXQgc2luY2UgdGhlIHJvb3RcbiAgICAgICAgLy8gaGFzIG5vIHNpYmxpbmdzIG5vciBhIHBhcmVudCwgd2Ugc2V0IGl0IHRvIG51bGwuIFVzdWFsbHkgdGhpcyBpc1xuICAgICAgICAvLyBoYW5kbGVkIGJ5IGBjb21wbGV0ZVVuaXRPZldvcmtgIG9yIGB1bndpbmRXb3JrYCwgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgIC8vIGludGVudGlvbmFsbHkgbm90IGNhbGxpbmcgdGhvc2UsIHdlIG5lZWQgc2V0IGl0IGhlcmUuXG4gICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGNhbGxpbmcgYHVud2luZFdvcmtgIHRvIHBvcCB0aGUgY29udGV4dHMuXG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVycm9yZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHRpbWUgc3BlbnQgcmVuZGVyaW5nIGJlZm9yZSBhbiBlcnJvciB3YXMgdGhyb3duLiBUaGlzXG4gICAgICAgIC8vIGF2b2lkcyBpbmFjY3VyYXRlIFByb2ZpbGVyIGR1cmF0aW9ucyBpbiB0aGUgY2FzZSBvZiBhXG4gICAgICAgIC8vIHN1c3BlbmRlZCByZW5kZXIuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZXJyb3JlZFdvcmssIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG5cbiAgICAgICAgaWYgKHRocm93blZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB0aHJvd25WYWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRocm93blZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgd2FrZWFibGUgPSB0aHJvd25WYWx1ZTtcbiAgICAgICAgICBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGVycm9yZWRXb3JrLCB3YWtlYWJsZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcmtDb21wb25lbnRFcnJvcmVkKGVycm9yZWRXb3JrLCB0aHJvd25WYWx1ZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93RXhjZXB0aW9uKHJvb3QsIGVycm9yZWRXb3JrLnJldHVybiwgZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICBjb21wbGV0ZVVuaXRPZldvcmsoZXJyb3JlZFdvcmspO1xuICAgIH0gY2F0Y2ggKHlldEFub3RoZXJUaHJvd25WYWx1ZSkge1xuICAgICAgLy8gU29tZXRoaW5nIGluIHRoZSByZXR1cm4gcGF0aCBhbHNvIHRocmV3LlxuICAgICAgdGhyb3duVmFsdWUgPSB5ZXRBbm90aGVyVGhyb3duVmFsdWU7XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gZXJyb3JlZFdvcmsgJiYgZXJyb3JlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBoYXMgYWxyZWFkeSBlcnJvcmVkLCB0aGVuIHdlIGhhZCB0cm91YmxlIHByb2Nlc3NpbmdcbiAgICAgICAgLy8gdGhlIGVycm9yLiBCdWJibGUgaXQgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gICAgICAgIGVycm9yZWRXb3JrID0gZXJyb3JlZFdvcmsucmV0dXJuO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IGVycm9yZWRXb3JrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfSAvLyBSZXR1cm4gdG8gdGhlIG5vcm1hbCB3b3JrIGxvb3AuXG5cblxuICAgIHJldHVybjtcbiAgfSB3aGlsZSAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHB1c2hEaXNwYXRjaGVyKCkge1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudDtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKHByZXZEaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgLy8gVGhlIFJlYWN0IGlzb21vcnBoaWMgcGFja2FnZSBkb2VzIG5vdCBpbmNsdWRlIGEgZGVmYXVsdCBkaXNwYXRjaGVyLlxuICAgIC8vIEluc3RlYWQgdGhlIGZpcnN0IHJlbmRlcmVyIHdpbGwgbGF6aWx5IGF0dGFjaCBvbmUsIGluIG9yZGVyIHRvIGdpdmVcbiAgICAvLyBuaWNlciBlcnJvciBtZXNzYWdlcy5cbiAgICByZXR1cm4gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcmV2RGlzcGF0Y2hlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpIHtcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IG5vdygpO1xufVxuZnVuY3Rpb24gbWFya1NraXBwZWRVcGRhdGVMYW5lcyhsYW5lKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IG1lcmdlTGFuZXMobGFuZSwgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmQoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkV2l0aERlbGF5O1xuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWRcbiAgLy8gdGhpcyByZW5kZXIuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcykpKSB7XG4gICAgLy8gTWFyayB0aGUgY3VycmVudCByZW5kZXIgYXMgc3VzcGVuZGVkIHNvIHRoYXQgd2Ugc3dpdGNoIHRvIHdvcmtpbmcgb25cbiAgICAvLyB0aGUgdXBkYXRlcyB0aGF0IHdlcmUgc2tpcHBlZC4gVXN1YWxseSB3ZSBvbmx5IHN1c3BlbmQgYXQgdGhlIGVuZCBvZlxuICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgLy8gVE9ETzogV2Ugc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBtYXJrIHRoZSByb290IGFzIHN1c3BlbmRlZCBpbW1lZGlhdGVseVxuICAgIC8vIChpbnNpZGUgdGhpcyBmdW5jdGlvbiksIHNpbmNlIGJ5IHN1c3BlbmRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgcmVuZGVyXG4gICAgLy8gcGhhc2UgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBtaXN0YWtlIHdoZXJlIHdlIHN1c3BlbmQgbGFuZXMgdGhhdCB3ZXJlXG4gICAgLy8gcGluZ2VkIG9yIHVwZGF0ZWQgd2hpbGUgd2Ugd2VyZSByZW5kZXJpbmcuXG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMSh3b3JrSW5Qcm9ncmVzc1Jvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyRGlkRXJyb3IoZXJyb3IpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgIT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEVycm9yZWQ7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn0gLy8gQ2FsbGVkIGR1cmluZyByZW5kZXIgdG8gZGV0ZXJtaW5lIGlmIGFueXRoaW5nIGhhcyBzdXNwZW5kZWQuXG4vLyBSZXR1cm5zIGZhbHNlIGlmIHdlJ3JlIG5vdCBzdXJlLlxuXG5mdW5jdGlvbiByZW5kZXJIYXNOb3RTdXNwZW5kZWRZZXQoKSB7XG4gIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIG9yIGNvbXBsZXRlZCwgd2UgY2FuJ3QgcmVhbGx5IGJlIHN1cmUsXG4gIC8vIHNvIHRob3NlIGFyZSBmYWxzZS5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcFN5bmMoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgc3luYyByZW5kZXIsIHNvIHdlIHNob3VsZCBoYXZlIGZpbmlzaGVkIHRoZSB3aG9sZSB0cmVlLlxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCBhbiBpbmNvbXBsZXRlIHJvb3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhICcgKyAnYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xufSAvLyBUaGUgd29yayBsb29wIGlzIGFuIGV4dHJlbWVseSBob3QgcGF0aC4gVGVsbCBDbG9zdXJlIG5vdCB0byBpbmxpbmUgaXQuXG5cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcFN5bmMoKSB7XG4gIC8vIEFscmVhZHkgdGltZWQgb3V0LCBzbyBwZXJmb3JtIHdvcmsgd2l0aG91dCBjaGVja2luZyBpZiB3ZSBuZWVkIHRvIHlpZWxkLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBwdXNoRGlzcGF0Y2hlcigpOyAvLyBJZiB0aGUgcm9vdCBvciBsYW5lcyBoYXZlIGNoYW5nZWQsIHRocm93IG91dCB0aGUgZXhpc3Rpbmcgc3RhY2tcbiAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykge1xuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkge1xuICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC5cbiAgICAgICAgLy8gSWYgd2UgYmFpbG91dCBvbiB0aGlzIHdvcmssIHdlJ2xsIG1vdmUgdGhlbSBiYWNrIChsaWtlIGFib3ZlKS5cbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gbW92ZSB0aGVtIG5vdyBpbiBjYXNlIHRoZSB3b3JrIHNwYXducyBtb3JlIHdvcmsgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aCBkaWZmZXJlbnQgdXBkYXRlcnMuXG4gICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuXG5cblxuICAgICAgICBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKCk7XG4gICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wQ29uY3VycmVudCgpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgLy8gU3RpbGwgd29yayByZW1haW5pbmcuXG4gICAge1xuICAgICAgbWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUm9vdEluUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29tcGxldGVkIHRoZSB0cmVlLlxuICAgIHtcbiAgICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gICAgfSAvLyBTZXQgdGhpcyB0byBudWxsIHRvIGluZGljYXRlIHRoZXJlJ3Mgbm8gaW4tcHJvZ3Jlc3MgcmVuZGVyLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gUmV0dXJuIHRoZSBmaW5hbCBleGl0IHN0YXR1cy5cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICB9XG59XG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BDb25jdXJyZW50KCkge1xuICAvLyBQZXJmb3JtIHdvcmsgdW50aWwgU2NoZWR1bGVyIGFza3MgdXMgdG8geWllbGRcbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50ID0gdW5pdE9mV29yay5hbHRlcm5hdGU7XG4gIHNldEN1cnJlbnRGaWJlcih1bml0T2ZXb3JrKTtcbiAgdmFyIG5leHQ7XG5cbiAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gIH1cblxuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaXQgb2Ygd29yaywgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0XG4gIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci5cbiAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuXG4gIGRvIHtcbiAgICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy5cblxuICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY29tcGxldGVkV29yayk7XG4gICAgICB2YXIgbmV4dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLlxuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wbGV0aW5nIHRoaXMgZmliZXIgc3Bhd25lZCBuZXcgd29yay4gV29yayBvbiB0aGF0IG5leHQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBzb21ldGhpbmcgdGhyZXcuIFBvcCB2YWx1ZXMgb2ZmXG4gICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBlbnRlcmluZyB0aGUgY29tcGxldGUgcGhhc2UuIElmIHRoaXMgaXMgYSBib3VuZGFyeSxcbiAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLlxuICAgICAgdmFyIF9uZXh0ID0gdW53aW5kV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrKTsgLy8gQmVjYXVzZSB0aGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUsIGRvbid0IHJlc2V0IGl0cyBsYW5lcy5cblxuXG4gICAgICBpZiAoX25leHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgY29tcGxldGluZyB0aGlzIHdvcmsgc3Bhd25lZCBuZXcgd29yaywgZG8gdGhhdCBuZXh0LiBXZSdsbCBjb21lXG4gICAgICAgIC8vIGJhY2sgaGVyZSBhZ2Fpbi5cbiAgICAgICAgLy8gU2luY2Ugd2UncmUgcmVzdGFydGluZywgcmVtb3ZlIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgaG9zdCBlZmZlY3RcbiAgICAgICAgLy8gZnJvbSB0aGUgZWZmZWN0IHRhZy5cbiAgICAgICAgX25leHQuZmxhZ3MgJj0gSG9zdEVmZmVjdE1hc2s7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gX25leHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSByZW5kZXIgZHVyYXRpb24gZm9yIHRoZSBmaWJlciB0aGF0IGVycm9yZWQuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpOyAvLyBJbmNsdWRlIHRoZSB0aW1lIHNwZW50IHdvcmtpbmcgb24gZmFpbGVkIGNoaWxkcmVuIGJlZm9yZSBjb250aW51aW5nLlxuXG4gICAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgcGFyZW50IGZpYmVyIGFzIGluY29tcGxldGUgYW5kIGNsZWFyIGl0cyBzdWJ0cmVlIGZsYWdzLlxuICAgICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuICAgICAgICByZXR1cm5GaWJlci5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UndmUgdW53b3VuZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3REaWROb3RDb21wbGV0ZTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHNpYmxpbmdGaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnRcblxuXG4gICAgY29tcGxldGVkV29yayA9IHJldHVybkZpYmVyOyAvLyBVcGRhdGUgdGhlIG5leHQgdGhpbmcgd2UncmUgd29ya2luZyBvbiBpbiBjYXNlIHNvbWV0aGluZyB0aHJvd3MuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMpIHtcbiAgLy8gVE9ETzogVGhpcyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlLiBXZSBhbHJlYWR5IHdyYXAgdGhlIG11dGF0aW9uIGFuZFxuICAvLyBsYXlvdXQgcGhhc2VzLiBTaG91bGQgYmUgYWJsZSB0byByZW1vdmUuXG4gIHZhciBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGNvbW1pdFJvb3RJbXBsKHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucywgcHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCByZW5kZXJQcmlvcml0eUxldmVsKSB7XG4gIGRvIHtcbiAgICAvLyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBjYWxsIGBmbHVzaFN5bmNVcGRhdGVRdWV1ZWAgYXQgdGhlIGVuZCwgd2hpY2hcbiAgICAvLyBtZWFucyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBzb21ldGltZXMgcmVzdWx0IGluIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlXG4gICAgLy8gbm8gbW9yZSBwZW5kaW5nIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgYmV0dGVyIGlmIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCBkaWQgbm90IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gd2hpbGUgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKTtcblxuICBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmZpbmlzaGVkV29yaztcbiAgdmFyIGxhbmVzID0gcm9vdC5maW5pc2hlZExhbmVzO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBpZiAoZmluaXNoZWRXb3JrID09PSBudWxsKSB7XG5cbiAgICB7XG4gICAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgICAgICBlcnJvcigncm9vdC5maW5pc2hlZExhbmVzIHNob3VsZCBub3QgYmUgZW1wdHkgZHVyaW5nIGEgY29tbWl0LiBUaGlzIGlzIGEgJyArICdidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBudWxsO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IHJvb3QuY3VycmVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9IC8vIGNvbW1pdFJvb3QgbmV2ZXIgcmV0dXJucyBhIGNvbnRpbnVhdGlvbjsgaXQgYWx3YXlzIGZpbmlzaGVzIHN5bmNocm9ub3VzbHkuXG4gIC8vIFNvIHdlIGNhbiBjbGVhciB0aGVzZSBub3cgdG8gYWxsb3cgYSBuZXcgY2FsbGJhY2sgdG8gYmUgc2NoZWR1bGVkLlxuXG5cbiAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7IC8vIFVwZGF0ZSB0aGUgZmlyc3QgYW5kIGxhc3QgcGVuZGluZyB0aW1lcyBvbiB0aGlzIHJvb3QuIFRoZSBuZXcgZmlyc3RcbiAgLy8gcGVuZGluZyB0aW1lIGlzIHdoYXRldmVyIGlzIGxlZnQgb24gdGhlIHJvb3QgZmliZXIuXG5cbiAgdmFyIHJlbWFpbmluZ0xhbmVzID0gbWVyZ2VMYW5lcyhmaW5pc2hlZFdvcmsubGFuZXMsIGZpbmlzaGVkV29yay5jaGlsZExhbmVzKTtcbiAgbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcyk7XG5cbiAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFdlIGNhbiByZXNldCB0aGVzZSBub3cgdGhhdCB0aGV5IGFyZSBmaW5pc2hlZC5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzLCBzY2hlZHVsZSBhIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlbS5cbiAgLy8gRG8gdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSwgc28gaXQgaXMgcXVldWVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXRcbiAgLy8gbWlnaHQgZ2V0IHNjaGVkdWxlZCBpbiB0aGUgY29tbWl0IHBoYXNlLiAoU2VlICMxNjcxNC4pXG4gIC8vIFRPRE86IERlbGV0ZSBhbGwgb3RoZXIgcGxhY2VzIHRoYXQgc2NoZWR1bGUgdGhlIHBhc3NpdmUgZWZmZWN0IGNhbGxiYWNrXG4gIC8vIFRoZXkncmUgcmVkdW5kYW50LlxuXG5cbiAgaWYgKChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzIHx8IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICAvLyB0byBzdG9yZSBpdCBpbiBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zIHVudGlsIHRoZXkgZ2V0IHByb2Nlc3NlZFxuICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIHRoaXMgdGhyb3VnaCBhcyBhbiBhcmd1bWVudCB0byBjb21taXRSb290XG4gICAgICAvLyBiZWNhdXNlIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgbWlnaHQgaGF2ZSBjaGFuZ2VkIGJldHdlZW5cbiAgICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIgYW5kIGNvbW1pdCBpZiB3ZSB0aHJvdHRsZSB0aGUgY29tbWl0XG4gICAgICAvLyB3aXRoIHNldFRpbWVvdXRcblxuICAgICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zO1xuICAgICAgc2NoZWR1bGVDYWxsYmFjayQxKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTsgLy8gVGhpcyByZW5kZXIgdHJpZ2dlcmVkIHBhc3NpdmUgZWZmZWN0czogcmVsZWFzZSB0aGUgcm9vdCBjYWNoZSBwb29sXG4gICAgICAgIC8vICphZnRlciogcGFzc2l2ZSBlZmZlY3RzIGZpcmUgdG8gYXZvaWQgZnJlZWluZyBhIGNhY2hlIHBvb2wgdGhhdCBtYXlcbiAgICAgICAgLy8gYmUgcmVmZXJlbmNlZCBieSBhIG5vZGUgaW4gdGhlIHRyZWUgKEhvc3RSb290LCBDYWNoZSBib3VuZGFyeSBldGMpXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBlZmZlY3RzIGluIHRoZSB3aG9sZSB0cmVlLlxuICAvLyBUT0RPOiBUaGlzIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBlZmZlY3QgbGlzdCBpbXBsZW1lbnRhdGlvbiwgd2hlcmUgd2UgaGFkXG4gIC8vIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGBmaXJzdEVmZmVjdGAgdG8gc2F0aXNmeSBGbG93LiBJIHRoaW5rIHRoZVxuICAvLyBvbmx5IG90aGVyIHJlYXNvbiB0aGlzIG9wdGltaXphdGlvbiBleGlzdHMgaXMgYmVjYXVzZSBpdCBhZmZlY3RzIHByb2ZpbGluZy5cbiAgLy8gUmVjb25zaWRlciB3aGV0aGVyIHRoaXMgaXMgbmVjZXNzYXJ5LlxuXG5cbiAgdmFyIHN1YnRyZWVIYXNFZmZlY3RzID0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAoQmVmb3JlTXV0YXRpb25NYXNrIHwgTXV0YXRpb25NYXNrIHwgTGF5b3V0TWFzayB8IFBhc3NpdmVNYXNrKSkgIT09IE5vRmxhZ3M7XG4gIHZhciByb290SGFzRWZmZWN0ID0gKGZpbmlzaGVkV29yay5mbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcblxuICBpZiAoc3VidHJlZUhhc0VmZmVjdHMgfHwgcm9vdEhhc0VmZmVjdCkge1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7IC8vIFJlc2V0IHRoaXMgdG8gbnVsbCBiZWZvcmUgY2FsbGluZyBsaWZlY3ljbGVzXG5cbiAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsOyAvLyBUaGUgY29tbWl0IHBoYXNlIGlzIGJyb2tlbiBpbnRvIHNldmVyYWwgc3ViLXBoYXNlcy4gV2UgZG8gYSBzZXBhcmF0ZSBwYXNzXG4gICAgLy8gb2YgdGhlIGVmZmVjdCBsaXN0IGZvciBlYWNoIHBoYXNlOiBhbGwgbXV0YXRpb24gZWZmZWN0cyBjb21lIGJlZm9yZSBhbGxcbiAgICAvLyBsYXlvdXQgZWZmZWN0cywgYW5kIHNvIG9uLlxuICAgIC8vIFRoZSBmaXJzdCBwaGFzZSBhIFwiYmVmb3JlIG11dGF0aW9uXCIgcGhhc2UuIFdlIHVzZSB0aGlzIHBoYXNlIHRvIHJlYWQgdGhlXG4gICAgLy8gc3RhdGUgb2YgdGhlIGhvc3QgdHJlZSByaWdodCBiZWZvcmUgd2UgbXV0YXRlIGl0LiBUaGlzIGlzIHdoZXJlXG4gICAgLy8gZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgaXMgY2FsbGVkLlxuXG4gICAgdmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuXG4gICAge1xuICAgICAgLy8gTWFyayB0aGUgY3VycmVudCBjb21taXQgdGltZSB0byBiZSBzaGFyZWQgYnkgYWxsIFByb2ZpbGVycyBpbiB0aGlzXG4gICAgICAvLyBiYXRjaC4gVGhpcyBlbmFibGVzIHRoZW0gdG8gYmUgZ3JvdXBlZCBsYXRlci5cbiAgICAgIHJlY29yZENvbW1pdFRpbWUoKTtcbiAgICB9XG5cblxuICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcblxuICAgIHJlc2V0QWZ0ZXJDb21taXQocm9vdC5jb250YWluZXJJbmZvKTsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgdHJlZSBpcyBub3cgdGhlIGN1cnJlbnQgdHJlZS4gVGhpcyBtdXN0IGNvbWUgYWZ0ZXJcbiAgICAvLyB0aGUgbXV0YXRpb24gcGhhc2UsIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRyZWUgaXMgc3RpbGwgY3VycmVudCBkdXJpbmdcbiAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCwgYnV0IGJlZm9yZSB0aGUgbGF5b3V0IHBoYXNlLCBzbyB0aGF0IHRoZSBmaW5pc2hlZFxuICAgIC8vIHdvcmsgaXMgY3VycmVudCBkdXJpbmcgY29tcG9uZW50RGlkTW91bnQvVXBkYXRlLlxuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbGF5b3V0IHBoYXNlLCB3aGVyZSB3ZSBjYWxsIGVmZmVjdHMgdGhhdCByZWFkXG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cblxuICAgIGNvbW1pdExheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gICAgLy8gb3Bwb3J0dW5pdHkgdG8gcGFpbnQuXG5cblxuICAgIHJlcXVlc3RQYWludCgpO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gUmVzZXQgdGhlIHByaW9yaXR5IHRvIHRoZSBwcmV2aW91cyBub24tc3luYyB2YWx1ZS5cblxuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBObyBlZmZlY3RzLlxuICAgIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yazsgLy8gTWVhc3VyZSB0aGVzZSBhbnl3YXkgc28gdGhlIGZsYW1lZ3JhcGggZXhwbGljaXRseSBzaG93cyB0aGF0IHRoZXJlIHdlcmVcbiAgICAvLyBubyBlZmZlY3RzLlxuICAgIC8vIFRPRE86IE1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIHJlcG9ydCB0aGlzLlxuXG4gICAge1xuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290RGlkSGF2ZVBhc3NpdmVFZmZlY3RzID0gcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHM7XG5cbiAgaWYgKHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gVGhpcyBjb21taXQgaGFzIHBhc3NpdmUgZWZmZWN0cy4gU3Rhc2ggYSByZWZlcmVuY2UgdG8gdGhlbS4gQnV0IGRvbid0XG4gICAgLy8gc2NoZWR1bGUgYSBjYWxsYmFjayB1bnRpbCBhZnRlciBmbHVzaGluZyBsYXlvdXQgd29yay5cbiAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gcm9vdDtcbiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IGxhbmVzO1xuICB9IGVsc2Uge1xuXG4gICAge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7IC8vIENoZWNrIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290XG4gIC8vIFRPRE86IFRoaXMgaXMgcGFydCBvZiB0aGUgYGNvbXBvbmVudERpZENhdGNoYCBpbXBsZW1lbnRhdGlvbi4gSXRzIHB1cnBvc2VcbiAgLy8gaXMgdG8gZGV0ZWN0IHdoZXRoZXIgc29tZXRoaW5nIG1pZ2h0IGhhdmUgY2FsbGVkIHNldFN0YXRlIGluc2lkZVxuICAvLyBgY29tcG9uZW50RGlkQ2F0Y2hgLiBUaGUgbWVjaGFuaXNtIGlzIGtub3duIHRvIGJlIGZsYXdlZCBiZWNhdXNlIGBzZXRTdGF0ZWBcbiAgLy8gaW5zaWRlIGBjb21wb25lbnREaWRDYXRjaGAgaXMgaXRzZWxmIGZsYXdlZCBcdTIwMTQgdGhhdCdzIHdoeSB3ZSByZWNvbW1lbmRcbiAgLy8gYGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcmAgaW5zdGVhZC4gSG93ZXZlciwgaXQgY291bGQgYmUgaW1wcm92ZWQgYnlcbiAgLy8gY2hlY2tpbmcgaWYgcmVtYWluaW5nTGFuZXMgaW5jbHVkZXMgU3luYyB3b3JrLCBpbnN0ZWFkIG9mIHdoZXRoZXIgdGhlcmUnc1xuICAvLyBhbnkgd29yayByZW1haW5pbmcgYXQgYWxsICh3aGljaCB3b3VsZCBhbHNvIGluY2x1ZGUgc3R1ZmYgbGlrZSBTdXNwZW5zZVxuICAvLyByZXRyaWVzIG9yIHRyYW5zaXRpb25zKS4gSXQncyBiZWVuIGxpa2UgdGhpcyBmb3IgYSB3aGlsZSwgdGhvdWdoLCBzbyBmaXhpbmdcbiAgLy8gaXQgcHJvYmFibHkgaXNuJ3QgdGhhdCB1cmdlbnQuXG5cbiAgaWYgKHJlbWFpbmluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gSWYgdGhlcmUncyBubyByZW1haW5pbmcgd29yaywgd2UgY2FuIGNsZWFyIHRoZSBzZXQgb2YgYWxyZWFkeSBmYWlsZWRcbiAgICAvLyBlcnJvciBib3VuZGFyaWVzLlxuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoIXJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkNvbW1pdFJvb3QoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSwgcmVuZGVyUHJpb3JpdHlMZXZlbCk7XG5cbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgcm9vdC5tZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG9uQ29tbWl0Um9vdCQxKCk7XG4gIH0gLy8gQWx3YXlzIGNhbGwgdGhpcyBiZWZvcmUgZXhpdGluZyBgY29tbWl0Um9vdGAsIHRvIGVuc3VyZSB0aGF0IGFueVxuICAvLyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290IGlzIHNjaGVkdWxlZC5cblxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKHJlY292ZXJhYmxlRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUgd2VyZSBlcnJvcnMgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgcmVjb3ZlcmVkIGZyb20gdGhlbSB3aXRob3V0XG4gICAgLy8gbmVlZGluZyB0byBzdXJmYWNlIGl0IHRvIHRoZSBVSS4gV2UgbG9nIHRoZW0gaGVyZS5cbiAgICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gcm9vdC5vblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY292ZXJhYmxlRXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IHJlY292ZXJhYmxlRXJyb3JzW2ldO1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xuICAgIHZhciBlcnJvciQxID0gZmlyc3RVbmNhdWdodEVycm9yO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3IkMTtcbiAgfSAvLyBJZiB0aGUgcGFzc2l2ZSBlZmZlY3RzIGFyZSB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgcmVuZGVyLCBmbHVzaCB0aGVtXG4gIC8vIHN5bmNocm9ub3VzbHkgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCB0YXNrIHNvIHRoYXQgdGhlIHJlc3VsdCBpc1xuICAvLyBpbW1lZGlhdGVseSBvYnNlcnZhYmxlLiBPdGhlcndpc2UsIHdlIGFzc3VtZSB0aGF0IHRoZXkgYXJlIG5vdFxuICAvLyBvcmRlci1kZXBlbmRlbnQgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIG9ic2VydmVkIGJ5IGV4dGVybmFsIHN5c3RlbXMsIHNvIHdlXG4gIC8vIGNhbiB3YWl0IHVudGlsIGFmdGVyIHBhaW50LlxuICAvLyBUT0RPOiBXZSBjYW4gb3B0aW1pemUgdGhpcyBieSBub3Qgc2NoZWR1bGluZyB0aGUgY2FsbGJhY2sgZWFybGllci4gU2luY2Ugd2VcbiAgLy8gY3VycmVudGx5IHNjaGVkdWxlIHRoZSBjYWxsYmFjayBpbiBtdWx0aXBsZSBwbGFjZXMsIHdpbGwgd2FpdCB1bnRpbCB0aG9zZVxuICAvLyBhcmUgY29uc29saWRhdGVkLlxuXG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMsIFN5bmNMYW5lKSAmJiByb290LnRhZyAhPT0gTGVnYWN5Um9vdCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGEgcGFzc2l2ZSBlZmZlY3QgbWlnaHQgaGF2ZSB1cGRhdGVkIGl0XG5cblxuICByZW1haW5pbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHJlbWFpbmluZ0xhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICB7XG4gICAgICBtYXJrTmVzdGVkVXBkYXRlU2NoZWR1bGVkKCk7XG4gICAgfSAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByb290IHN5bmNocm9ub3VzbHkgcmUtcmVuZGVycyB3aXRob3V0XG4gICAgLy8gZmluaXNoaW5nLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnksIGl0IGluZGljYXRlcyBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcC5cblxuXG4gICAgaWYgKHJvb3QgPT09IHJvb3RXaXRoTmVzdGVkVXBkYXRlcykge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gcm9vdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICB9IC8vIElmIGxheW91dCB3b3JrIHdhcyBzY2hlZHVsZWQsIGZsdXNoIGl0IG5vdy5cblxuXG4gIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKSB7XG4gIC8vIFJldHVybnMgd2hldGhlciBwYXNzaXZlIGVmZmVjdHMgd2VyZSBmbHVzaGVkLlxuICAvLyBUT0RPOiBDb21iaW5lIHRoaXMgY2hlY2sgd2l0aCB0aGUgb25lIGluIGZsdXNoUGFzc2l2ZUVGZmVjdHNJbXBsLiBXZSBzaG91bGRcbiAgLy8gcHJvYmFibHkganVzdCBjb21iaW5lIHRoZSB0d28gZnVuY3Rpb25zLiBJIGJlbGlldmUgdGhleSB3ZXJlIG9ubHkgc2VwYXJhdGVcbiAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlIGJlY2F1c2Ugd2UgdXNlZCB0byB3cmFwIGl0IHdpdGhcbiAgLy8gYFNjaGVkdWxlci5ydW5XaXRoUHJpb3JpdHlgLCB3aGljaCBhY2NlcHRzIGEgZnVuY3Rpb24uIEJ1dCBub3cgd2UgdHJhY2sgdGhlXG4gIC8vIHByaW9yaXR5IHdpdGhpbiBSZWFjdCBpdHNlbGYsIHNvIHdlIGNhbiBtdXRhdGUgdGhlIHZhcmlhYmxlIGRpcmVjdGx5LlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpIHtcbiAgICB2YXIgcmVuZGVyUHJpb3JpdHkgPSBsYW5lc1RvRXZlbnRQcmlvcml0eShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyk7XG4gICAgdmFyIHByaW9yaXR5ID0gbG93ZXJFdmVudFByaW9yaXR5KERlZmF1bHRFdmVudFByaW9yaXR5LCByZW5kZXJQcmlvcml0eSk7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgICB0cnkge1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgICByZXR1cm4gZmx1c2hQYXNzaXZlRWZmZWN0c0ltcGwoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247IC8vIE9uY2UgcGFzc2l2ZSBlZmZlY3RzIGhhdmUgcnVuIGZvciB0aGUgdHJlZSAtIGdpdmluZyBjb21wb25lbnRzIGFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaWJlcikge1xuICB7XG4gICAgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMucHVzaChmaWJlcik7XG5cbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpIHtcbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIENhY2hlIGFuZCBjbGVhciB0aGUgdHJhbnNpdGlvbnMgZmxhZ1xuXG5cbiAgdmFyIHRyYW5zaXRpb25zID0gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucztcbiAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7XG4gIHZhciByb290ID0gcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHM7XG4gIHZhciBsYW5lcyA9IHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzO1xuICByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7IC8vIFRPRE86IFRoaXMgaXMgc29tZXRpbWVzIG91dCBvZiBzeW5jIHdpdGggcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMuXG4gIC8vIEZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIEl0J3Mgbm90IGNhdXNpbmcgYW55IGtub3duIGlzc3VlcyAocHJvYmFibHlcbiAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdXNlZCBmb3IgcHJvZmlsaW5nKSwgYnV0IGl0J3MgYSByZWZhY3RvciBoYXphcmQuXG5cbiAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuJyk7XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0cyhyb290LmN1cnJlbnQpO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIHJvb3QuY3VycmVudCwgbGFuZXMsIHRyYW5zaXRpb25zKTsgLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzXG5cbiAge1xuICAgIHZhciBwcm9maWxlckVmZmVjdHMgPSBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cztcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9maWxlckVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfZmliZXIgPSBwcm9maWxlckVmZmVjdHNbaV07XG4gICAgICBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKHJvb3QsIF9maWJlcik7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKTtcbiAgfVxuXG4gIHtcbiAgICBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYocm9vdC5jdXJyZW50LCB0cnVlKTtcbiAgfVxuXG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIC8vIElmIGFkZGl0aW9uYWwgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgc2NoZWR1bGVkLCBpbmNyZW1lbnQgYSBjb3VudGVyLiBJZiB0aGlzXG4gICAgLy8gZXhjZWVkcyB0aGUgbGltaXQsIHdlJ2xsIGZpcmUgYSB3YXJuaW5nLlxuICAgIGlmIChkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcykge1xuICAgICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgIH1cblxuICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfSAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuXG4gIG9uUG9zdENvbW1pdFJvb3Qocm9vdCk7XG5cbiAge1xuICAgIHZhciBzdGF0ZU5vZGUgPSByb290LmN1cnJlbnQuc3RhdGVOb2RlO1xuICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkge1xuICByZXR1cm4gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgIT09IG51bGwgJiYgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuaGFzKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQoaW5zdGFuY2UpIHtcbiAgaWYgKGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID09PSBudWxsKSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFtpbnN0YW5jZV0pO1xuICB9IGVsc2Uge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmFkZChpbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvVGhyb3dVbmNhdWdodEVycm9yKGVycm9yKSB7XG4gIGlmICghaGFzVW5jYXVnaHRFcnJvcikge1xuICAgIGhhc1VuY2F1Z2h0RXJyb3IgPSB0cnVlO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59XG5cbnZhciBvblVuY2F1Z2h0RXJyb3IgPSBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3I7XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHJvb3RGaWJlciwgc291cmNlRmliZXIsIGVycm9yKSB7XG4gIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdEZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIHVwZGF0ZSk7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciByb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Qocm9vdEZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3Ioc291cmNlRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yJDEpIHtcbiAge1xuICAgIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvciQxKTtcbiAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICB9XG5cbiAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBFcnJvciB3YXMgdGhyb3duIGF0IHRoZSByb290LiBUaGVyZSBpcyBubyBwYXJlbnQsIHNvIHRoZSByb290XG4gICAgLy8gaXRzZWxmIHNob3VsZCBjYXB0dXJlIGl0LlxuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gbnVsbDtcblxuICB7XG4gICAgZmliZXIgPSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KGZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgY3RvciA9IGZpYmVyLnR5cGU7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShlcnJvciQxLCBzb3VyY2VGaWJlcik7XG4gICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIFRPRE86IFVudGlsIHdlIHJlLWxhbmQgc2tpcFVubW91bnRlZEJvdW5kYXJpZXMgKHNlZSAjMjAxNDcpLCB0aGlzIHdhcm5pbmdcbiAgICAvLyB3aWxsIGZpcmUgZm9yIGVycm9ycyB0aGF0IGFyZSB0aHJvd24gYnkgZGVzdHJveSBmdW5jdGlvbnMgaW5zaWRlIGRlbGV0ZWRcbiAgICAvLyB0cmVlcy4gV2hhdCBpdCBzaG91bGQgaW5zdGVhZCBkbyBpcyBwcm9wYWdhdGUgdGhlIGVycm9yIHRvIHRoZSBwYXJlbnQgb2ZcbiAgICAvLyB0aGUgZGVsZXRlZCB0cmVlLiBJbiB0aGUgbWVhbnRpbWUsIGRvIG5vdCBhZGQgdGhpcyB3YXJuaW5nIHRvIHRoZVxuICAgIC8vIGFsbG93bGlzdDsgdGhpcyBpcyBvbmx5IGZvciBvdXIgaW50ZXJuYWwgdXNlLlxuICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogQXR0ZW1wdGVkIHRvIGNhcHR1cmUgYSBjb21taXQgcGhhc2UgZXJyb3IgJyArICdpbnNpZGUgYSBkZXRhY2hlZCB0cmVlLiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC4gTGlrZWx5ICcgKyAnY2F1c2VzIGluY2x1ZGUgZGVsZXRpbmcgdGhlIHNhbWUgZmliZXIgbW9yZSB0aGFuIG9uY2UsIGNvbW1pdHRpbmcgYW4gJyArICdhbHJlYWR5LWZpbmlzaGVkIHRyZWUsIG9yIGFuIGluY29uc2lzdGVudCByZXR1cm4gcG9pbnRlci5cXG5cXG4nICsgJ0Vycm9yIG1lc3NhZ2U6XFxuXFxuJXMnLCBlcnJvciQxKTtcbiAgfVxufVxuZnVuY3Rpb24gcGluZ1N1c3BlbmRlZFJvb3Qocm9vdCwgd2FrZWFibGUsIHBpbmdlZExhbmVzKSB7XG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcblxuICBpZiAocGluZ0NhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHdha2VhYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcGluZ0NhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcyk7XG4gIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHtcbiAgICAvLyBSZWNlaXZlZCBhIHBpbmcgYXQgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgYXQgd2hpY2ggd2UncmUgY3VycmVudGx5XG4gICAgLy8gcmVuZGVyaW5nLiBXZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdGhpcyByZW5kZXIuIFRoaXMgc2hvdWxkIG1pcnJvclxuICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgcmVuZGVyaW5nIHN5bmMgZWl0aGVyIGR1ZSB0byBTeW5jLCBCYXRjaGVkIG9yIGV4cGlyZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIHJlc3RhcnQuXG4gICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmRcbiAgICAvLyBzbyB3ZSBjYW4gYWx3YXlzIHJlc3RhcnQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCAmJiBpbmNsdWRlc09ubHlSZXRyaWVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSAmJiBub3coKSAtIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPCBGQUxMQkFDS19USFJPVFRMRV9NUykge1xuICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LlxuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW5cbiAgICAgIC8vIG9wcG9ydHVuaXR5IGxhdGVyLiBTbyB3ZSBtYXJrIHRoaXMgcmVuZGVyIGFzIGhhdmluZyBhIHBpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMsIHBpbmdlZExhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn1cblxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpXG4gIC8vIHByZXZpb3VzbHkgd2FzIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0XG4gIC8vIHN1c3BlbmRlZCBpdCBoYXMgcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzXG4gIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGxhbmVzLlxuICBpZiAocmV0cnlMYW5lID09PSBOb0xhbmUpIHtcbiAgICAvLyBUT0RPOiBBc3NpZ24gdGhpcyB0byBgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmVgPyB0byBhdm9pZFxuICAgIC8vIHVubmVjZXNzYXJ5IGVudGFuZ2xlbWVudD9cbiAgICByZXRyeUxhbmUgPSByZXF1ZXN0UmV0cnlMYW5lKGJvdW5kYXJ5RmliZXIpO1xuICB9IC8vIFRPRE86IFNwZWNpYWwgY2FzZSBpZGxlIHByaW9yaXR5P1xuXG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHJldHJ5TGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTsgLy8gRGVmYXVsdFxuXG4gIHZhciByZXRyeUNhY2hlO1xuXG4gIHN3aXRjaCAoYm91bmRhcnlGaWJlci50YWcpIHtcbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaW5nZWQgdW5rbm93biBzdXNwZW5zZSBib3VuZGFyeSB0eXBlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICBpZiAocmV0cnlDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHJldHJ5Q2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufSAvLyBDb21wdXRlcyB0aGUgbmV4dCBKdXN0IE5vdGljZWFibGUgRGlmZmVyZW5jZSAoSk5EKSBib3VuZGFyeS5cbi8vIFRoZSB0aGVvcnkgaXMgdGhhdCBhIHBlcnNvbiBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS5cbi8vIFRoZXJlZm9yZSwgaWYgd2Ugd2FpdCBhIGJpdCBsb25nZXIgdGhhbiBuZWNlc3NhcnkgdGhhdCB3b24ndCB0cmFuc2xhdGUgdG8gYSBub3RpY2VhYmxlXG4vLyBkaWZmZXJlbmNlIGluIHRoZSBleHBlcmllbmNlLiBIb3dldmVyLCB3YWl0aW5nIGZvciBsb25nZXIgbWlnaHQgbWVhbiB0aGF0IHdlIGNhbiBhdm9pZFxuLy8gc2hvd2luZyBhbiBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gVGhlIGxvbmdlciB3ZSBoYXZlIGFscmVhZHkgd2FpdGVkLCB0aGUgaGFyZGVyIGl0XG4vLyBpcyB0byB0ZWxsIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuIFRoZXJlZm9yZSwgdGhlIGxvbmdlciB3ZSd2ZSBhbHJlYWR5IHdhaXRlZCxcbi8vIHRoZSBsb25nZXIgd2UgY2FuIHdhaXQgYWRkaXRpb25hbGx5LiBBdCBzb21lIHBvaW50IHdlIGhhdmUgdG8gZ2l2ZSB1cCB0aG91Z2guXG4vLyBXZSBwaWNrIGEgdHJhaW4gbW9kZWwgd2hlcmUgdGhlIG5leHQgYm91bmRhcnkgY29tbWl0cyBhdCBhIGNvbnNpc3RlbnQgc2NoZWR1bGUuXG4vLyBUaGVzZSBwYXJ0aWN1bGFyIG51bWJlcnMgYXJlIHZhZ3VlIGVzdGltYXRlcy4gV2UgZXhwZWN0IHRvIGFkanVzdCB0aGVtIGJhc2VkIG9uIHJlc2VhcmNoLlxuXG5mdW5jdGlvbiBqbmQodGltZUVsYXBzZWQpIHtcbiAgcmV0dXJuIHRpbWVFbGFwc2VkIDwgMTIwID8gMTIwIDogdGltZUVsYXBzZWQgPCA0ODAgPyA0ODAgOiB0aW1lRWxhcHNlZCA8IDEwODAgPyAxMDgwIDogdGltZUVsYXBzZWQgPCAxOTIwID8gMTkyMCA6IHRpbWVFbGFwc2VkIDwgMzAwMCA/IDMwMDAgOiB0aW1lRWxhcHNlZCA8IDQzMjAgPyA0MzIwIDogY2VpbCh0aW1lRWxhcHNlZCAvIDE5NjApICogMTk2MDtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCkge1xuICBpZiAobmVzdGVkVXBkYXRlQ291bnQgPiBORVNURURfVVBEQVRFX0xJTUlUKSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArICdyZXBlYXRlZGx5IGNhbGxzIHNldFN0YXRlIGluc2lkZSBjb21wb25lbnRXaWxsVXBkYXRlIG9yICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byAnICsgJ3ByZXZlbnQgaW5maW5pdGUgbG9vcHMuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAgICBlcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyBcImNhbGxzIHNldFN0YXRlIGluc2lkZSB1c2VFZmZlY3QsIGJ1dCB1c2VFZmZlY3QgZWl0aGVyIGRvZXNuJ3QgXCIgKyAnaGF2ZSBhIGRlcGVuZGVuY3kgYXJyYXksIG9yIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZXMgb24gJyArICdldmVyeSByZW5kZXIuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpIHtcbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihmaWJlciwgaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAge1xuICAgIC8vIFRPRE8gKFN0cmljdEVmZmVjdHMpIFNob3VsZCB3ZSBzZXQgYSBtYXJrZXIgb24gdGhlIHJvb3QgaWYgaXQgY29udGFpbnMgc3RyaWN0IGVmZmVjdHNcbiAgICAvLyBzbyB3ZSBkb24ndCB0cmF2ZXJzZSB1bm5lY2Vzc2FyaWx5PyBzaW1pbGFyIHRvIHN1YnRyZWVGbGFncyBidXQganVzdCBhdCB0aGUgcm9vdCBsZXZlbC5cbiAgICAvLyBNYXliZSBub3QgYSBiaWcgZGVhbCBzaW5jZSB0aGlzIGlzIERFViBvbmx5IGJlaGF2aW9yLlxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlRWZmZWN0c0luRGV2KGZpcnN0Q2hpbGQsIGZpYmVyRmxhZ3MsIGludm9rZUVmZmVjdEZuKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICB2YXIgY3VycmVudCA9IGZpcnN0Q2hpbGQ7XG4gICAgdmFyIHN1YnRyZWVSb290ID0gbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJpbWFyeVN1YnRyZWVGbGFnID0gY3VycmVudC5zdWJ0cmVlRmxhZ3MgJiBmaWJlckZsYWdzO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gc3VidHJlZVJvb3QgJiYgY3VycmVudC5jaGlsZCAhPT0gbnVsbCAmJiBwcmltYXJ5U3VidHJlZUZsYWcgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBmaWJlckZsYWdzKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIGludm9rZUVmZmVjdEZuKGN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudCA9IHN1YnRyZWVSb290ID0gY3VycmVudC5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBudWxsO1xuXG5mdW5jdGlvbiB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAvLyBXZSBsZXQgdGhlIG90aGVyIHdhcm5pbmcgYWJvdXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgZGVhbCB3aXRoIHRoaXMgb25lLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGFnID0gZmliZXIudGFnO1xuXG4gICAgaWYgKHRhZyAhPT0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCAmJiB0YWcgIT09IEhvc3RSb290ICYmIHRhZyAhPT0gQ2xhc3NDb21wb25lbnQgJiYgdGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiB0YWcgIT09IEZvcndhcmRSZWYgJiYgdGFnICE9PSBNZW1vQ29tcG9uZW50ICYmIHRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgLy8gT25seSB3YXJuIGZvciB1c2VyLWRlZmluZWQgY29tcG9uZW50cywgbm90IGludGVybmFsIG9uZXMgbGlrZSBTdXNwZW5zZS5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIHNob3cgdGhlIHdob2xlIHN0YWNrIGJ1dCBkZWR1cGUgb24gdGhlIHRvcCBjb21wb25lbnQncyBuYW1lIGJlY2F1c2VcbiAgICAvLyB0aGUgcHJvYmxlbWF0aWMgY29kZSBhbG1vc3QgYWx3YXlzIGxpZXMgaW5zaWRlIHRoYXQgY29tcG9uZW50LlxuXG5cbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdSZWFjdENvbXBvbmVudCc7XG5cbiAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFtjb21wb25lbnROYW1lXSk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIGVycm9yKFwiQ2FuJ3QgcGVyZm9ybSBhIFJlYWN0IHN0YXRlIHVwZGF0ZSBvbiBhIGNvbXBvbmVudCB0aGF0IGhhc24ndCBtb3VudGVkIHlldC4gXCIgKyAnVGhpcyBpbmRpY2F0ZXMgdGhhdCB5b3UgaGF2ZSBhIHNpZGUtZWZmZWN0IGluIHlvdXIgcmVuZGVyIGZ1bmN0aW9uIHRoYXQgJyArICdhc3luY2hyb25vdXNseSBsYXRlciBjYWxscyB0cmllcyB0byB1cGRhdGUgdGhlIGNvbXBvbmVudC4gTW92ZSB0aGlzIHdvcmsgdG8gJyArICd1c2VFZmZlY3QgaW5zdGVhZC4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBiZWdpbldvcmskMTtcblxue1xuICB2YXIgZHVtbXlGaWJlciA9IG51bGw7XG5cbiAgYmVnaW5Xb3JrJDEgPSBmdW5jdGlvbiAoY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpIHtcbiAgICAvLyBJZiBhIGNvbXBvbmVudCB0aHJvd3MgYW4gZXJyb3IsIHdlIHJlcGxheSBpdCBhZ2FpbiBpbiBhIHN5bmNocm9ub3VzbHlcbiAgICAvLyBkaXNwYXRjaGVkIGV2ZW50LCBzbyB0aGF0IHRoZSBkZWJ1Z2dlciB3aWxsIHRyZWF0IGl0IGFzIGFuIHVuY2F1Z2h0XG4gICAgLy8gZXJyb3IgU2VlIFJlYWN0RXJyb3JVdGlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjb3B5IHRoZSB3b3JrLWluLXByb2dyZXNzIG9udG8gYSBkdW1teVxuICAgIC8vIGZpYmVyLiBJZiBiZWdpbldvcmsgdGhyb3dzLCB3ZSdsbCB1c2UgdGhpcyB0byByZXNldCB0aGUgc3RhdGUuXG4gICAgdmFyIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5ID0gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYoZHVtbXlGaWJlciwgdW5pdE9mV29yayk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGJlZ2luV29yayhjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG4gICAgfSBjYXRjaCAob3JpZ2luYWxFcnJvcikge1xuICAgICAgaWYgKG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IHByb21pc2VzLiBUcmVhdCBldmVyeXRoaW5nIGVsc2UgbGlrZSBhbiBlcnJvci5cbiAgICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICAgIH0gLy8gS2VlcCB0aGlzIGNvZGUgaW4gc3luYyB3aXRoIGhhbmRsZUVycm9yOyBhbnkgY2hhbmdlcyBoZXJlIG11c3QgaGF2ZVxuICAgICAgLy8gY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRoZXJlLlxuXG5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTsgLy8gRG9uJ3QgcmVzZXQgY3VycmVudCBkZWJ1ZyBmaWJlciwgc2luY2Ugd2UncmUgYWJvdXQgdG8gd29yayBvbiB0aGVcbiAgICAgIC8vIHNhbWUgZmliZXIgYWdhaW4uXG4gICAgICAvLyBVbndpbmQgdGhlIGZhaWxlZCBzdGFjayBmcmFtZVxuXG4gICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgdW5pdE9mV29yayk7IC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGZpYmVyLlxuXG4gICAgICBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih1bml0T2ZXb3JrLCBvcmlnaW5hbFdvcmtJblByb2dyZXNzQ29weSk7XG5cbiAgICAgIGlmICggdW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHByb2ZpbGVyIHRpbWVyLlxuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgICB9IC8vIFJ1biBiZWdpbldvcmsgYWdhaW4uXG5cblxuICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGJlZ2luV29yaywgbnVsbCwgY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpO1xuXG4gICAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgICB2YXIgcmVwbGF5RXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYXlFcnJvciA9PT0gJ29iamVjdCcgJiYgcmVwbGF5RXJyb3IgIT09IG51bGwgJiYgcmVwbGF5RXJyb3IuX3N1cHByZXNzTG9nZ2luZyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgb3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiAhb3JpZ2luYWxFcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgICAgLy8gSWYgc3VwcHJlc3NlZCwgbGV0IHRoZSBmbGFnIGNhcnJ5IG92ZXIgdG8gdGhlIG9yaWdpbmFsIGVycm9yIHdoaWNoIGlzIHRoZSBvbmUgd2UnbGwgcmV0aHJvdy5cbiAgICAgICAgICBvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIGFsd2F5cyB0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3IgaW4gY2FzZSB0aGUgc2Vjb25kIHJlbmRlciBwYXNzIGlzIG5vdCBpZGVtcG90ZW50LlxuICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGEgbWVtb2l6ZWQgZnVuY3Rpb24gb3IgQ29tbW9uSlMgbW9kdWxlIGRvZXNuJ3QgdGhyb3cgYWZ0ZXIgZmlyc3QgaW52b2NhdGlvbi5cblxuXG4gICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50O1xuXG57XG4gIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ1Vua25vd24nOyAvLyBEZWR1cGUgYnkgdGhlIHJlbmRlcmluZyBjb21wb25lbnQgYmVjYXVzZSBpdCdzIHRoZSBvbmUgdGhhdCBuZWVkcyB0byBiZSBmaXhlZC5cblxuICAgICAgICAgICAgdmFyIGRlZHVwZUtleSA9IHJlbmRlcmluZ0NvbXBvbmVudE5hbWU7XG5cbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmhhcyhkZWR1cGVLZXkpKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5hZGQoZGVkdXBlS2V5KTtcbiAgICAgICAgICAgICAgdmFyIHNldFN0YXRlQ29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBhIGNvbXBvbmVudCAoYCVzYCkgd2hpbGUgcmVuZGVyaW5nIGEgJyArICdkaWZmZXJlbnQgY29tcG9uZW50IChgJXNgKS4gVG8gbG9jYXRlIHRoZSBiYWQgc2V0U3RhdGUoKSBjYWxsIGluc2lkZSBgJXNgLCAnICsgJ2ZvbGxvdyB0aGUgc3RhY2sgdHJhY2UgYXMgZGVzY3JpYmVkIGluIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zZXRzdGF0ZS1pbi1yZW5kZXInLCBzZXRTdGF0ZUNvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGR1cmluZyBhbiBleGlzdGluZyBzdGF0ZSB0cmFuc2l0aW9uIChzdWNoIGFzICcgKyAnd2l0aGluIGByZW5kZXJgKS4gUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSAnICsgJ2Z1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4nKTtcblxuICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcykge1xuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcbiAgICAgIG1lbW9pemVkVXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc2NoZWR1bGluZ0ZpYmVyKSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBzY2hlZHVsaW5nRmliZXIsIGxhbmVzKTtcbiAgICAgIH0pOyAvLyBUaGlzIGZ1bmN0aW9uIGludGVudGlvbmFsbHkgZG9lcyBub3QgY2xlYXIgbWVtb2l6ZWQgdXBkYXRlcnMuXG4gICAgICAvLyBUaG9zZSBtYXkgc3RpbGwgYmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgY29tbWl0XG4gICAgICAvLyBhbmQgYSBmdXR1cmUgb25lIChlLmcuIFN1c3BlbnNlKS5cbiAgICB9XG4gIH1cbn1cbnZhciBmYWtlQWN0Q2FsbGJhY2tOb2RlID0ge307XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2skMShwcmlvcml0eUxldmVsLCBjYWxsYmFjaykge1xuICB7XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhbiBgYWN0YCBzY29wZSwgYnlwYXNzIFNjaGVkdWxlciBhbmQgcHVzaCB0b1xuICAgIC8vIHRoZSBgYWN0YCBxdWV1ZSBpbnN0ZWFkLlxuICAgIHZhciBhY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudDtcblxuICAgIGlmIChhY3RRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgYWN0UXVldWUucHVzaChjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZmFrZUFjdENhbGxiYWNrTm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5jZWxDYWxsYmFjayQxKGNhbGxiYWNrTm9kZSkge1xuICBpZiAoIGNhbGxiYWNrTm9kZSA9PT0gZmFrZUFjdENhbGxiYWNrTm9kZSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBJbiBwcm9kdWN0aW9uLCBhbHdheXMgY2FsbCBTY2hlZHVsZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBzdHJpcHBlZCBvdXQuXG5cblxuICByZXR1cm4gY2FuY2VsQ2FsbGJhY2soY2FsbGJhY2tOb2RlKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkge1xuICAvLyBOZXZlciBmb3JjZSBmbHVzaCBpbiBwcm9kdWN0aW9uLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBnZXQgc3RyaXBwZWQgb3V0LlxuICByZXR1cm4gIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBpZiAoIWlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlZ2FjeSBtb2RlIGhhcyBhZGRpdGlvbmFsIGNhc2VzIHdoZXJlIHdlIHN1cHByZXNzIGEgd2FybmluZy5cbiAgICAgIGlmICghaXNMZWdhY3lBY3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgIC8vIE5vdCBpbiBhbiBhY3QgZW52aXJvbm1lbnQuIE5vIG5lZWQgdG8gd2Fybi5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAgIC8vIExlZ2FjeSBtb2RlIGRvZXNuJ3Qgd2FybiBpZiB0aGUgdXBkYXRlIGlzIGJhdGNoZWQsIGkuZS5cbiAgICAgICAgLy8gYmF0Y2hlZFVwZGF0ZXMgb3IgZmx1c2hTeW5jLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWJlci50YWcgIT09IEZ1bmN0aW9uQ29tcG9uZW50ICYmIGZpYmVyLnRhZyAhPT0gRm9yd2FyZFJlZiAmJiBmaWJlci50YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcHJlLWhvb2tzIGNvZGUsIGxlZ2FjeSBtb2RlIG9ubHlcbiAgICAgICAgLy8gd2FybnMgZm9yIHVwZGF0ZXMgdGhhdCBvcmlnaW5hdGUgZnJvbSBhIGhvb2suXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCkge1xuICB7XG4gICAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignQSBzdXNwZW5kZWQgcmVzb3VyY2UgZmluaXNoZWQgbG9hZGluZyBpbnNpZGUgYSB0ZXN0LCBidXQgdGhlIGV2ZW50ICcgKyAnd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgcmVzb2x2ZXMgc3VzcGVuZGVkIGRhdGEgc2hvdWxkIGJlIHdyYXBwZWQgJyArICdpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmluaXNoIGxvYWRpbmcgc3VzcGVuZGVkIGRhdGEgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGlzUnVubmluZykge1xuICB7XG4gICAgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gaXNSdW5uaW5nO1xuICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXMgKi9cbnZhciByZXNvbHZlRmFtaWx5ID0gbnVsbDsgLy8gJEZsb3dGaXhNZSBGbG93IGdldHMgY29uZnVzZWQgYnkgYSBXZWFrU2V0IGZlYXR1cmUgY2hlY2sgYmVsb3cuXG5cbnZhciBmYWlsZWRCb3VuZGFyaWVzID0gbnVsbDtcbnZhciBzZXRSZWZyZXNoSGFuZGxlciA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gIHtcbiAgICByZXNvbHZlRmFtaWx5ID0gaGFuZGxlcjtcbiAgfVxufTtcbmZ1bmN0aW9uIHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIC8vIE5vIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzLlxuICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseSh0eXBlKTtcblxuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgcmVhbCBmb3J3YXJkUmVmLiBEb24ndCB3YW50IHRvIGNyYXNoIGVhcmx5LlxuICAgICAgaWYgKHR5cGUgIT09IG51bGwgJiYgdHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGb3J3YXJkUmVmIGlzIHNwZWNpYWwgYmVjYXVzZSBpdHMgcmVzb2x2ZWQgLnR5cGUgaXMgYW4gb2JqZWN0LFxuICAgICAgICAvLyBidXQgaXQncyBwb3NzaWJsZSB0aGF0IHdlIG9ubHkgaGF2ZSBpdHMgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGluIHRoZSBtYXAuXG4gICAgICAgIC8vIElmIHRoYXQgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCwgd2UnbGwgYnVpbGQgYSBuZXcgZm9yd2FyZFJlZiB0eXBlLlxuICAgICAgICB2YXIgY3VycmVudFJlbmRlciA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlLnJlbmRlcik7XG5cbiAgICAgICAgaWYgKHR5cGUucmVuZGVyICE9PSBjdXJyZW50UmVuZGVyKSB7XG4gICAgICAgICAgdmFyIHN5bnRoZXRpY1R5cGUgPSB7XG4gICAgICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICAgICAgICAgIHJlbmRlcjogY3VycmVudFJlbmRlclxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAodHlwZS5kaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzeW50aGV0aWNUeXBlLmRpc3BsYXlOYW1lID0gdHlwZS5kaXNwbGF5TmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3ludGhldGljVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhmaWJlciwgZWxlbWVudCkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHByZXZUeXBlID0gZmliZXIuZWxlbWVudFR5cGU7XG4gICAgdmFyIG5leHRUeXBlID0gZWxlbWVudC50eXBlOyAvLyBJZiB3ZSBnb3QgaGVyZSwgd2Uga25vdyB0eXBlcyBhcmVuJ3QgPT09IGVxdWFsLlxuXG4gICAgdmFyIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gZmFsc2U7XG4gICAgdmFyICQkdHlwZW9mTmV4dFR5cGUgPSB0eXBlb2YgbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIG5leHRUeXBlICE9PSBudWxsID8gbmV4dFR5cGUuJCR0eXBlb2YgOiBudWxsO1xuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5leHRUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgaW5uZXIgdHlwZSB5ZXQuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGUgbGF6eSBpbm5lciB0eXBlIGlzIHN0YWJsZSxcbiAgICAgICAgICAgIC8vIGFuZCBzbyBpdCBpcyBzdWZmaWNpZW50IHRvIGF2b2lkIHJlY29uY2lsaW5nIGl0IGF3YXkuXG4gICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gdW53cmFwIG9yIGFjdHVhbGx5IHVzZSB0aGUgbmV3IGxhenkgdHlwZS5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgICAgICAgLy8gVE9ETzogaWYgaXQgd2FzIGJ1dCBjYW4gbm8gbG9uZ2VyIGJlIHNpbXBsZSxcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBzZXQgdGhpcy5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIENoZWNrIGlmIGJvdGggdHlwZXMgaGF2ZSBhIGZhbWlseSBhbmQgaXQncyB0aGUgc2FtZSBvbmUuXG5cblxuICAgIGlmIChuZWVkc0NvbXBhcmVGYW1pbGllcykge1xuICAgICAgLy8gTm90ZTogbWVtbygpIGFuZCBmb3J3YXJkUmVmKCkgd2UnbGwgY29tcGFyZSBvdXRlciByYXRoZXIgdGhhbiBpbm5lciB0eXBlLlxuICAgICAgLy8gVGhpcyBtZWFucyBib3RoIG9mIHRoZW0gbmVlZCB0byBiZSByZWdpc3RlcmVkIHRvIHByZXNlcnZlIHN0YXRlLlxuICAgICAgLy8gSWYgd2UgdW53cmFwcGVkIGFuZCBjb21wYXJlZCB0aGUgaW5uZXIgdHlwZXMgZm9yIHdyYXBwZXJzIGluc3RlYWQsXG4gICAgICAvLyB0aGVuIHdlIHdvdWxkIHJpc2sgZmFsc2VseSBzYXlpbmcgdHdvIHNlcGFyYXRlIG1lbW8oRm9vKVxuICAgICAgLy8gY2FsbHMgYXJlIGVxdWl2YWxlbnQgYmVjYXVzZSB0aGV5IHdyYXAgdGhlIHNhbWUgRm9vIGZ1bmN0aW9uLlxuICAgICAgdmFyIHByZXZGYW1pbHkgPSByZXNvbHZlRmFtaWx5KHByZXZUeXBlKTtcblxuICAgICAgaWYgKHByZXZGYW1pbHkgIT09IHVuZGVmaW5lZCAmJiBwcmV2RmFtaWx5ID09PSByZXNvbHZlRmFtaWx5KG5leHRUeXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIFdlYWtTZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyA9PT0gbnVsbCkge1xuICAgICAgZmFpbGVkQm91bmRhcmllcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgZmFpbGVkQm91bmRhcmllcy5hZGQoZmliZXIpO1xuICB9XG59XG52YXIgc2NoZWR1bGVSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIHVwZGF0ZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHN0YWxlRmFtaWxpZXMgPSB1cGRhdGUuc3RhbGVGYW1pbGllcyxcbiAgICAgICAgdXBkYXRlZEZhbWlsaWVzID0gdXBkYXRlLnVwZGF0ZWRGYW1pbGllcztcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkocm9vdC5jdXJyZW50LCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjaGVkdWxlUm9vdCA9IGZ1bmN0aW9uIChyb290LCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocm9vdC5jb250ZXh0ICE9PSBlbXB0eUNvbnRleHRPYmplY3QpIHtcbiAgICAgIC8vIFN1cGVyIGVkZ2UgY2FzZTogcm9vdCBoYXMgYSBsZWdhY3kgX3JlbmRlclN1YnRyZWUgY29udGV4dFxuICAgICAgLy8gYnV0IHdlIGRvbid0IGtub3cgdGhlIHBhcmVudENvbXBvbmVudCBzbyB3ZSBjYW4ndCBwYXNzIGl0LlxuICAgICAgLy8gSnVzdCBpZ25vcmUuIFdlJ2xsIGRlbGV0ZSB0aGlzIHdpdGggX3JlbmRlclN1YnRyZWUgY29kZSBwYXRoIGxhdGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGZpYmVyLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGUsXG4gICAgICAgIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzb2x2ZUZhbWlseSB0byBiZSBzZXQgZHVyaW5nIGhvdCByZWxvYWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5lZWRzUmVuZGVyID0gZmFsc2U7XG4gICAgdmFyIG5lZWRzUmVtb3VudCA9IGZhbHNlO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVR5cGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KGNhbmRpZGF0ZVR5cGUpO1xuXG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHN0YWxlRmFtaWxpZXMuaGFzKGZhbWlseSkpIHtcbiAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIGlmICh0YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZWVkc1JlbmRlciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMgIT09IG51bGwpIHtcbiAgICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzLmhhcyhmaWJlcikgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGZhaWxlZEJvdW5kYXJpZXMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVlZHNSZW1vdW50KSB7XG4gICAgICBmaWJlci5fZGVidWdOZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQgfHwgbmVlZHNSZW5kZXIpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgIW5lZWRzUmVtb3VudCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShjaGlsZCwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShzaWJsaW5nLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIGZhbWlsaWVzKSB7XG4gIHtcbiAgICB2YXIgaG9zdEluc3RhbmNlcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgdHlwZXMgPSBuZXcgU2V0KGZhbWlsaWVzLm1hcChmdW5jdGlvbiAoZmFtaWx5KSB7XG4gICAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gICAgfSkpO1xuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICByZXR1cm4gaG9zdEluc3RhbmNlcztcbiAgfVxufTtcblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KGZpYmVyLCB0eXBlcywgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGRpZE1hdGNoID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVzLmhhcyhjYW5kaWRhdGVUeXBlKSkge1xuICAgICAgICBkaWRNYXRjaCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZE1hdGNoKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guIFRoaXMgb25seSBkcmlsbHMgZG93biB0byB0aGUgY2xvc2VzdCBob3N0IGNvbXBvbmVudHMuXG4gICAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gc2VhcmNoIGRlZXBlciBiZWNhdXNlIGZvciB0aGUgcHVycG9zZSBvZiBnaXZpbmdcbiAgICAgIC8vIHZpc3VhbCBmZWVkYmFjaywgXCJmbGFzaGluZ1wiIG91dGVybW9zdCBwYXJlbnQgcmVjdGFuZ2xlcyBpcyBzdWZmaWNpZW50LlxuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsIG1heWJlIHRoZXJlIHdpbGwgYmUgb25lIGZ1cnRoZXIgZG93biBpbiB0aGUgY2hpbGQgdHJlZS5cbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoY2hpbGQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZpbmRDaGlsZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG5cbiAgICBpZiAoZm91bmRIb3N0SW5zdGFuY2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgaG9zdCBjaGlsZHJlbiwgZmFsbGJhY2sgdG8gY2xvc2VzdCBob3N0IHBhcmVudC5cblxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIHJlYWNoIHJvb3QgZmlyc3QuJyk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuICAgIHZhciBmb3VuZEhvc3RJbnN0YW5jZXMgPSBmYWxzZTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgLy8gV2UgZ290IGEgbWF0Y2guXG4gICAgICAgIGZvdW5kSG9zdEluc3RhbmNlcyA9IHRydWU7XG4gICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTsgLy8gVGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUsIHNvIGtlZXAgc2VhcmNoaW5nLlxuICAgICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmliZXIpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpYmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBoYXNCYWRNYXBQb2x5ZmlsbDtcblxue1xuICBoYXNCYWRNYXBQb2x5ZmlsbCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5vbkV4dGVuc2libGVPYmplY3QgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAqL1xuXG4gICAgbmV3IE1hcChbW25vbkV4dGVuc2libGVPYmplY3QsIG51bGxdXSk7XG4gICAgbmV3IFNldChbbm9uRXh0ZW5zaWJsZU9iamVjdF0pO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbmV3ICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGFib3V0IGJhZCBwb2x5ZmlsbHNcbiAgICBoYXNCYWRNYXBQb2x5ZmlsbCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gSW5zdGFuY2VcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmVsZW1lbnRUeXBlID0gbnVsbDtcbiAgdGhpcy50eXBlID0gbnVsbDtcbiAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlclxuXG4gIHRoaXMucmV0dXJuID0gbnVsbDtcbiAgdGhpcy5jaGlsZCA9IG51bGw7XG4gIHRoaXMuc2libGluZyA9IG51bGw7XG4gIHRoaXMuaW5kZXggPSAwO1xuICB0aGlzLnJlZiA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlOyAvLyBFZmZlY3RzXG5cbiAgdGhpcy5mbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMuc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5kZWxldGlvbnMgPSBudWxsO1xuICB0aGlzLmxhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgdG8gYXZvaWQgYSB2OCBwZXJmb3JtYW5jZSBjbGlmZi5cbiAgICAvL1xuICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aFxuICAgIC8vIGRvdWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSBGaWJlcnMgdG8gZW5kIHVwIGhhdmluZyBzZXBhcmF0ZSBzaGFwZXMuXG4gICAgLy8gVGhpcyBiZWhhdmlvci9idWcgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uKCkuXG4gICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IG1ha2VzIFJlYWN0IHVudXNhYmx5IHNsb3cgZm9yIHNvbWUgYXBwbGljYXRpb25zLlxuICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBiZWxvdyB3aXRoIGRvdWJsZXMuXG4gICAgLy9cbiAgICAvLyBMZWFybiBtb3JlIGFib3V0IHRoaXMgaGVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MzY1XG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOFxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47IC8vIEl0J3Mgb2theSB0byByZXBsYWNlIHRoZSBpbml0aWFsIGRvdWJsZXMgd2l0aCBzbWlzIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIFRoaXMgd29uJ3QgdHJpZ2dlciB0aGUgcGVyZm9ybWFuY2UgY2xpZmYgbWVudGlvbmVkIGFib3ZlLFxuICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuXG5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IHVzZWQgYnV0IGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxzOlxuICAgIHRoaXMuX2RlYnVnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2RlYnVnSG9va1R5cGVzID0gbnVsbDtcblxuICAgIGlmICghaGFzQmFkTWFwUG9seWZpbGwgJiYgdHlwZW9mIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHRoaXMpO1xuICAgIH1cbiAgfVxufSAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGEgUE9KTyBjb25zdHJ1Y3Rvciwgc3RpbGxcbi8vIHBsZWFzZSBlbnN1cmUgd2UgZG8gdGhlIGZvbGxvd2luZzpcbi8vIDEpIE5vYm9keSBzaG91bGQgYWRkIGFueSBpbnN0YW5jZSBtZXRob2RzIG9uIHRoaXMuIEluc3RhbmNlIG1ldGhvZHMgY2FuIGJlXG4vLyAgICBtb3JlIGRpZmZpY3VsdCB0byBwcmVkaWN0IHdoZW4gdGhleSBnZXQgb3B0aW1pemVkIGFuZCB0aGV5IGFyZSBhbG1vc3Rcbi8vICAgIG5ldmVyIGlubGluZWQgcHJvcGVybHkgaW4gc3RhdGljIGNvbXBpbGVycy5cbi8vIDIpIE5vYm9keSBzaG91bGQgcmVseSBvbiBgaW5zdGFuY2VvZiBGaWJlcmAgZm9yIHR5cGUgdGVzdGluZy4gV2Ugc2hvdWxkXG4vLyAgICBhbHdheXMga25vdyB3aGVuIGl0IGlzIGEgZmliZXIuXG4vLyAzKSBXZSBtaWdodCB3YW50IHRvIGV4cGVyaW1lbnQgd2l0aCB1c2luZyBudW1lcmljIGtleXMgc2luY2UgdGhleSBhcmUgZWFzaWVyXG4vLyAgICB0byBvcHRpbWl6ZSBpbiBhIG5vbi1KSVQgZW52aXJvbm1lbnQuXG4vLyA0KSBXZSBjYW4gZWFzaWx5IGdvIGZyb20gYSBjb25zdHJ1Y3RvciB0byBhIGNyZWF0ZUZpYmVyIG9iamVjdCBsaXRlcmFsIGlmIHRoYXRcbi8vICAgIGlzIGZhc3Rlci5cbi8vIDUpIEl0IHNob3VsZCBiZSBlYXN5IHRvIHBvcnQgdGhpcyB0byBhIEMgc3RydWN0IGFuZCBrZWVwIGEgQyBpbXBsZW1lbnRhdGlvblxuLy8gICAgY29tcGF0aWJsZS5cblxuXG52YXIgY3JlYXRlRmliZXIgPSBmdW5jdGlvbiAodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyAkRmxvd0ZpeE1lOiB0aGUgc2hhcGVzIGFyZSBleGFjdCBoZXJlIGJ1dCBGbG93IGRvZXNuJ3QgbGlrZSBjb25zdHJ1Y3RvcnNcbiAgcmV0dXJuIG5ldyBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmICFzaG91bGRDb25zdHJ1Y3QkMSh0eXBlKSAmJiB0eXBlLmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KSB7XG4gIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkgPyBDbGFzc0NvbXBvbmVudCA6IEZ1bmN0aW9uQ29tcG9uZW50O1xuICB9IGVsc2UgaWYgKENvbXBvbmVudCAhPT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IENvbXBvbmVudC4kJHR5cGVvZjtcblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgcmV0dXJuIEZvcndhcmRSZWY7XG4gICAgfVxuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIHJldHVybiBNZW1vQ29tcG9uZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBJbmRldGVybWluYXRlQ29tcG9uZW50O1xufSAvLyBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGFsdGVybmF0ZSBmaWJlciB0byBkbyB3b3JrIG9uLlxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBwZW5kaW5nUHJvcHMpIHtcbiAgdmFyIHdvcmtJblByb2dyZXNzID0gY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzID09PSBudWxsKSB7XG4gICAgLy8gV2UgdXNlIGEgZG91YmxlIGJ1ZmZlcmluZyBwb29saW5nIHRlY2huaXF1ZSBiZWNhdXNlIHdlIGtub3cgdGhhdCB3ZSdsbFxuICAgIC8vIG9ubHkgZXZlciBuZWVkIGF0IG1vc3QgdHdvIHZlcnNpb25zIG9mIGEgdHJlZS4gV2UgcG9vbCB0aGUgXCJvdGhlclwiIHVudXNlZFxuICAgIC8vIG5vZGUgdGhhdCB3ZSdyZSBmcmVlIHRvIHJldXNlLiBUaGlzIGlzIGxhemlseSBjcmVhdGVkIHRvIGF2b2lkIGFsbG9jYXRpbmdcbiAgICAvLyBleHRyYSBvYmplY3RzIGZvciB0aGluZ3MgdGhhdCBhcmUgbmV2ZXIgdXBkYXRlZC4gSXQgYWxzbyBhbGxvdyB1cyB0b1xuICAgIC8vIHJlY2xhaW0gdGhlIGV4dHJhIG1lbW9yeSBpZiBuZWVkZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVGaWJlcihjdXJyZW50LnRhZywgcGVuZGluZ1Byb3BzLCBjdXJyZW50LmtleSwgY3VycmVudC5tb2RlKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9IGN1cnJlbnQuZWxlbWVudFR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZTtcblxuICAgIHtcbiAgICAgIC8vIERFVi1vbmx5IGZpZWxkc1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlID0gY3VycmVudC5fZGVidWdTb3VyY2U7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gd29ya0luUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGFsdGVybmF0ZS5cbiAgICAvLyBSZXNldCB0aGUgZWZmZWN0IHRhZy5cblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gTm9GbGFnczsgLy8gVGhlIGVmZmVjdHMgYXJlIG5vIGxvbmdlciB2YWxpZC5cblxuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgcmVzZXQsIHJhdGhlciB0aGFuIGNvcHksIGFjdHVhbER1cmF0aW9uICYgYWN0dWFsU3RhcnRUaW1lLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1lIGZyb20gZW5kbGVzc2x5IGFjY3VtdWxhdGluZyBpbiBuZXcgY29tbWl0cy5cbiAgICAgIC8vIFRoaXMgaGFzIHRoZSBkb3duc2lkZSBvZiByZXNldHRpbmcgdmFsdWVzIGZvciBkaWZmZXJlbnQgcHJpb3JpdHkgcmVuZGVycyxcbiAgICAgIC8vIEJ1dCB3b3JrcyBmb3IgeWllbGRpbmcgKHRoZSBjb21tb24gY2FzZSkgYW5kIHNob3VsZCBzdXBwb3J0IHJlc3VtaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgfVxuICB9IC8vIFJlc2V0IGFsbCBlZmZlY3RzIGV4Y2VwdCBzdGF0aWMgb25lcy5cbiAgLy8gU3RhdGljIGVmZmVjdHMgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzID0gY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2s7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gIH07IC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG5cbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGN1cnJlbnQuX2RlYnVnTmVlZHNSZW1vdW50O1xuXG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn0gLy8gVXNlZCB0byByZXVzZSBhIEZpYmVyIGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZFxuICAvLyBoYXZlIHNldCB0aGUgdmFsdWVzIHRvIGJlZm9yZSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIElkZWFsbHkgdGhpcyB3b3VsZG4ndFxuICAvLyBiZSBuZWNlc3NhcnkgYnV0IHVuZm9ydHVuYXRlbHkgbWFueSBjb2RlIHBhdGhzIHJlYWRzIGZyb20gdGhlIHdvcmtJblByb2dyZXNzXG4gIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuXG4gIC8vIFdlIGFzc3VtZSBwZW5kaW5nUHJvcHMsIGluZGV4LCBrZXksIHJlZiwgcmV0dXJuIGFyZSBzdGlsbCB1bnRvdWNoZWQgdG9cbiAgLy8gYXZvaWQgZG9pbmcgYW5vdGhlciByZWNvbmNpbGlhdGlvbi5cbiAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBidXQga2VlcCBhbnkgUGxhY2VtZW50IHRhZ3MsIHNpbmNlIHRoYXQncyBzb21ldGhpbmdcbiAgLy8gdGhhdCBjaGlsZCBmaWJlciBpcyBzZXR0aW5nLCBub3QgdGhlIHJlY29uY2lsaWF0aW9uLlxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSBTdGF0aWNNYXNrIHwgUGxhY2VtZW50OyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUmVzZXQgdG8gY3JlYXRlRmliZXIncyBpbml0aWFsIHZhbHVlcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVzZXQgdG8gdGhlIGNsb25lZCB2YWx1ZXMgdGhhdCBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZCd2ZS5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gY3VycmVudC5jaGlsZExhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBDbG9uZSB0aGUgZGVwZW5kZW5jaWVzIG9iamVjdC4gVGhpcyBpcyBtdXRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLCBzb1xuICAgIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICAgIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudERlcGVuZGVuY2llcyA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgICB9O1xuXG4gICAge1xuICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlXG4gICAgICAvLyBhY3R1YWwgdGltZSBhY3Jvc3MgbXVsdGlwbGUgcmVuZGVyIHBhc3Nlcy5cbiAgICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhvc3RSb290RmliZXIodGFnLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUpIHtcbiAgdmFyIG1vZGU7XG5cbiAgaWYgKHRhZyA9PT0gQ29uY3VycmVudFJvb3QpIHtcbiAgICBtb2RlID0gQ29uY3VycmVudE1vZGU7XG5cbiAgICBpZiAoaXNTdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgIHtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RFZmZlY3RzTW9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbW9kZSA9IE5vTW9kZTtcbiAgfVxuXG4gIGlmICggaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAvLyBBbHdheXMgY29sbGVjdCBwcm9maWxlIHRpbWluZ3Mgd2hlbiBEZXZUb29scyBhcmUgcHJlc2VudC5cbiAgICAvLyBUaGlzIGVuYWJsZXMgRGV2VG9vbHMgdG8gc3RhcnQgY2FwdHVyaW5nIHRpbWluZyBhdCBhbnkgcG9pbnRcdTIwMTNcbiAgICAvLyBXaXRob3V0IHNvbWUgbm9kZXMgaW4gdGhlIHRyZWUgaGF2aW5nIGVtcHR5IGJhc2UgdGltZXMuXG4gICAgbW9kZSB8PSBQcm9maWxlTW9kZTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVGaWJlcihIb3N0Um9vdCwgbnVsbCwgbnVsbCwgbW9kZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwgLy8gUmVhY3QkRWxlbWVudFR5cGVcbmtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIGZpYmVyVGFnID0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDsgLy8gVGhlIHJlc29sdmVkIHR5cGUgaXMgc2V0IGlmIHdlIGtub3cgd2hhdCB0aGUgZmluYWwgdHlwZSB3aWxsIGJlLiBJLmUuIGl0J3Mgbm90IGxhenkuXG5cbiAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHNob3VsZENvbnN0cnVjdCQxKHR5cGUpKSB7XG4gICAgICBmaWJlclRhZyA9IENsYXNzQ29tcG9uZW50O1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBmaWJlclRhZyA9IEhvc3RDb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgZ2V0VGFnOiBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KHBlbmRpbmdQcm9wcy5jaGlsZHJlbiwgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSBNb2RlO1xuICAgICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgICAgaWYgKCAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgLy8gU3RyaWN0IGVmZmVjdHMgc2hvdWxkIG5ldmVyIHJ1biBvbiBsZWdhY3kgcm9vdHNcbiAgICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2VMaXN0KHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfT0ZGU0NSRUVOX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1NDT1BFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0NBQ0hFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRQcm92aWRlcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnN1bWVyXG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0Q29uc3VtZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEZvcndhcmRSZWY7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IE1lbW9Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTGF6eUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKSA6IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChvd25lck5hbWUpIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gJyArICdjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpICcgKyAoXCJidXQgZ290OiBcIiArICh0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUpICsgXCIuXCIgKyBpbmZvKSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBvd25lciA9IG51bGw7XG5cbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wcztcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEZyYWdtZW50LCBlbGVtZW50cywga2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgb2YgdHlwZSBgc3RyaW5nYCBhcyBhIHByb3AuIFJlY2VpdmVkIHRoZSB0eXBlIGAlc2AgaW5zdGVhZC4nLCB0eXBlb2YgcGVuZGluZ1Byb3BzLmlkKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihQcm9maWxlciwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUgfCBQcm9maWxlTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgICAgZWZmZWN0RHVyYXRpb246IDAsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlTGlzdENvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihPZmZzY3JlZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgdmFyIHByaW1hcnlDaGlsZEluc3RhbmNlID0ge307XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHByaW1hcnlDaGlsZEluc3RhbmNlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gJ0RFTEVURUQnO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoZGVoeWRyYXRlZE5vZGUpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRGVoeWRyYXRlZEZyYWdtZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5zdGF0ZU5vZGUgPSBkZWh5ZHJhdGVkTm9kZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0UG9ydGFsLCBwZW5kaW5nUHJvcHMsIHBvcnRhbC5rZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgIC8vIFVzZWQgYnkgcGVyc2lzdGVudCB1cGRhdGVzXG4gICAgaW1wbGVtZW50YXRpb246IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICB9O1xuICByZXR1cm4gZmliZXI7XG59IC8vIFVzZWQgZm9yIHN0YXNoaW5nIFdJUCBwcm9wZXJ0aWVzIHRvIHJlcGxheSBmYWlsZWQgd29yayBpbiBERVYuXG5cbmZ1bmN0aW9uIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHRhcmdldCwgc291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIEZpYmVyJ3MgaW5pdGlhbCBwcm9wZXJ0aWVzIHdpbGwgYWx3YXlzIGJlIG92ZXJ3cml0dGVuLlxuICAgIC8vIFdlIG9ubHkgdXNlIGEgRmliZXIgdG8gZW5zdXJlIHRoZSBzYW1lIGhpZGRlbiBjbGFzcyBzbyBERVYgaXNuJ3Qgc2xvdy5cbiAgICB0YXJnZXQgPSBjcmVhdGVGaWJlcihJbmRldGVybWluYXRlQ29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSB3cml0dGVuIGFzIGEgbGlzdCBvZiBhbGwgcHJvcGVydGllcy5cbiAgLy8gV2UgdHJpZWQgdG8gdXNlIE9iamVjdC5hc3NpZ24oKSBpbnN0ZWFkIGJ1dCB0aGlzIGlzIGNhbGxlZCBpblxuICAvLyB0aGUgaG90dGVzdCBwYXRoLCBhbmQgT2JqZWN0LmFzc2lnbigpIHdhcyB0b28gc2xvdzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwMlxuICAvLyBUaGlzIGNvZGUgaXMgREVWLW9ubHkgc28gc2l6ZSBpcyBub3QgYSBjb25jZXJuLlxuXG5cbiAgdGFyZ2V0LnRhZyA9IHNvdXJjZS50YWc7XG4gIHRhcmdldC5rZXkgPSBzb3VyY2Uua2V5O1xuICB0YXJnZXQuZWxlbWVudFR5cGUgPSBzb3VyY2UuZWxlbWVudFR5cGU7XG4gIHRhcmdldC50eXBlID0gc291cmNlLnR5cGU7XG4gIHRhcmdldC5zdGF0ZU5vZGUgPSBzb3VyY2Uuc3RhdGVOb2RlO1xuICB0YXJnZXQucmV0dXJuID0gc291cmNlLnJldHVybjtcbiAgdGFyZ2V0LmNoaWxkID0gc291cmNlLmNoaWxkO1xuICB0YXJnZXQuc2libGluZyA9IHNvdXJjZS5zaWJsaW5nO1xuICB0YXJnZXQuaW5kZXggPSBzb3VyY2UuaW5kZXg7XG4gIHRhcmdldC5yZWYgPSBzb3VyY2UucmVmO1xuICB0YXJnZXQucGVuZGluZ1Byb3BzID0gc291cmNlLnBlbmRpbmdQcm9wcztcbiAgdGFyZ2V0Lm1lbW9pemVkUHJvcHMgPSBzb3VyY2UubWVtb2l6ZWRQcm9wcztcbiAgdGFyZ2V0LnVwZGF0ZVF1ZXVlID0gc291cmNlLnVwZGF0ZVF1ZXVlO1xuICB0YXJnZXQubWVtb2l6ZWRTdGF0ZSA9IHNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICB0YXJnZXQuZGVwZW5kZW5jaWVzID0gc291cmNlLmRlcGVuZGVuY2llcztcbiAgdGFyZ2V0Lm1vZGUgPSBzb3VyY2UubW9kZTtcbiAgdGFyZ2V0LmZsYWdzID0gc291cmNlLmZsYWdzO1xuICB0YXJnZXQuc3VidHJlZUZsYWdzID0gc291cmNlLnN1YnRyZWVGbGFncztcbiAgdGFyZ2V0LmRlbGV0aW9ucyA9IHNvdXJjZS5kZWxldGlvbnM7XG4gIHRhcmdldC5sYW5lcyA9IHNvdXJjZS5sYW5lcztcbiAgdGFyZ2V0LmNoaWxkTGFuZXMgPSBzb3VyY2UuY2hpbGRMYW5lcztcbiAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7XG5cbiAge1xuICAgIHRhcmdldC5hY3R1YWxEdXJhdGlvbiA9IHNvdXJjZS5hY3R1YWxEdXJhdGlvbjtcbiAgICB0YXJnZXQuYWN0dWFsU3RhcnRUaW1lID0gc291cmNlLmFjdHVhbFN0YXJ0VGltZTtcbiAgICB0YXJnZXQuc2VsZkJhc2VEdXJhdGlvbiA9IHNvdXJjZS5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHRhcmdldC50cmVlQmFzZUR1cmF0aW9uID0gc291cmNlLnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gIHRoaXMucGVuZGluZ0NoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgdGhpcy5waW5nQ2FjaGUgPSBudWxsO1xuICB0aGlzLmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHRoaXMudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5pZGVudGlmaWVyUHJlZml4ID0gaWRlbnRpZmllclByZWZpeDtcbiAgdGhpcy5vblJlY292ZXJhYmxlRXJyb3IgPSBvblJlY292ZXJhYmxlRXJyb3I7XG5cbiAge1xuICAgIHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IG51bGw7XG4gIH1cblxuICB7XG4gICAgdGhpcy5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIHRoaXMubWVtb2l6ZWRVcGRhdGVycyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHRoaXMucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IFRvdGFsTGFuZXM7IF9pKyspIHtcbiAgICAgIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAucHVzaChuZXcgU2V0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZVJvb3QoKScgOiAnY3JlYXRlUm9vdCgpJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTGVnYWN5Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZSgpJyA6ICdyZW5kZXIoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCAvLyBUT0RPOiBXZSBoYXZlIHNldmVyYWwgb2YgdGhlc2UgYXJndW1lbnRzIHRoYXQgYXJlIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZVxuLy8gaG9zdCBjb25maWcsIGJ1dCBiZWNhdXNlIHRoZXkgYXJlIHBhc3NlZCBpbiBhdCBydW50aW1lLCB3ZSBoYXZlIHRvIHRocmVhZFxuLy8gdGhlbSB0aHJvdWdoIHRoZSByb290IGNvbnN0cnVjdG9yLiBQZXJoYXBzIHdlIHNob3VsZCBwdXQgdGhlbSBhbGwgaW50byBhXG4vLyBzaW5nbGUgdHlwZSwgbGlrZSBhIER5bmFtaWNIb3N0Q29uZmlnIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUgcmVuZGVyZXIuXG5pZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIC8vIHN0YXRlTm9kZSBpcyBhbnkuXG5cblxuICB2YXIgdW5pbml0aWFsaXplZEZpYmVyID0gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSk7XG4gIHJvb3QuY3VycmVudCA9IHVuaW5pdGlhbGl6ZWRGaWJlcjtcbiAgdW5pbml0aWFsaXplZEZpYmVyLnN0YXRlTm9kZSA9IHJvb3Q7XG5cbiAge1xuICAgIHZhciBfaW5pdGlhbFN0YXRlID0ge1xuICAgICAgZWxlbWVudDogaW5pdGlhbENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBoeWRyYXRlLFxuICAgICAgY2FjaGU6IG51bGwsXG4gICAgICAvLyBub3QgZW5hYmxlZCB5ZXRcbiAgICAgIHRyYW5zaXRpb25zOiBudWxsLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbnVsbFxuICAgIH07XG4gICAgdW5pbml0aWFsaXplZEZpYmVyLm1lbW9pemVkU3RhdGUgPSBfaW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG52YXIgUmVhY3RWZXJzaW9uID0gJzE4LjEuMCc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG5cbiAge1xuICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oa2V5KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnQpLmpvaW4oJywnKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgYSBSZWFjdENvbXBvbmVudC4gS2V5czogXCIgKyBrZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihob3N0RmliZXIpO1xuXG4gICAgICAgICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggaXMgaW5zaWRlIFN0cmljdE1vZGUuICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggcmVuZGVycyBTdHJpY3RNb2RlIGNoaWxkcmVuLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8gSWRlYWxseSB0aGlzIHNob3VsZCByZXNldCB0byBwcmV2aW91cyBidXQgdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGluXG4gICAgICAgICAgLy8gcmVuZGVyIGFuZCB0aGVyZSdzIGFub3RoZXIgd2FybmluZyBmb3IgdGhhdCBhbnl3YXkuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihwcmV2aW91c0ZpYmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250YWluZXIoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBoeWRyYXRlID0gZmFsc2U7XG4gIHZhciBpbml0aWFsQ2hpbGRyZW4gPSBudWxsO1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIC8vIFRPRE86IFJlbW92ZSBgY2FsbGJhY2tgIHdoZW4gd2UgZGVsZXRlIGxlZ2FjeSBtb2RlLlxuY2FsbGJhY2ssIGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IHRydWU7XG4gIHZhciByb290ID0gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTsgLy8gVE9ETzogTW92ZSB0aGlzIHRvIEZpYmVyUm9vdCBjb25zdHJ1Y3RvclxuXG4gIHJvb3QuY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKG51bGwpOyAvLyBTY2hlZHVsZSB0aGUgaW5pdGlhbCByZW5kZXIuIEluIGEgaHlkcmF0aW9uIHJvb3QsIHRoaXMgaXMgZGlmZmVyZW50IGZyb21cbiAgLy8gYSByZWd1bGFyIHVwZGF0ZSBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0IG1hdGNoIHdhcyB3YXMgcmVuZGVyZWRcbiAgLy8gb24gdGhlIHNlcnZlci5cbiAgLy8gTk9URTogVGhpcyB1cGRhdGUgaW50ZW50aW9uYWxseSBkb2Vzbid0IGhhdmUgYSBwYXlsb2FkLiBXZSdyZSBvbmx5IHVzaW5nXG4gIC8vIHRoZSB1cGRhdGUgdG8gc2NoZWR1bGUgd29yayBvbiB0aGUgcm9vdCBmaWJlciAoYW5kLCBmb3IgbGVnYWN5IHJvb3RzLCB0b1xuICAvLyBlbnF1ZXVlIHRoZSBjYWxsYmFjayBpZiBvbmUgaXMgcHJvdmlkZWQpLlxuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwgPyBjYWxsYmFjayA6IG51bGw7XG4gIGVucXVldWVVcGRhdGUoY3VycmVudCwgdXBkYXRlKTtcbiAgc2NoZWR1bGVJbml0aWFsSHlkcmF0aW9uT25Sb290KHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIGNvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaykge1xuICB7XG4gICAgb25TY2hlZHVsZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KTtcbiAgfVxuXG4gIHZhciBjdXJyZW50JDEgPSBjb250YWluZXIuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50JDEpO1xuXG4gIHtcbiAgICBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICB9XG5cbiAgdmFyIGNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpO1xuXG4gIGlmIChjb250YWluZXIuY29udGV4dCA9PT0gbnVsbCkge1xuICAgIGNvbnRhaW5lci5jb250ZXh0ID0gY29udGV4dDtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucGVuZGluZ0NvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiBjdXJyZW50ICE9PSBudWxsICYmICFkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ1JlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyAnICsgJ3RyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyIGlzIG5vdCBhbGxvd2VkLiAnICsgJ0lmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiBjb21wb25lbnREaWRVcGRhdGUuXFxuXFxuJyArICdDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpIHx8ICdVbmtub3duJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBlbGVtZW50XG4gIH07XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcblxuICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIGVucXVldWVVcGRhdGUoY3VycmVudCQxLCB1cGRhdGUpO1xuICB2YXIgcm9vdCA9IHNjaGVkdWxlVXBkYXRlT25GaWJlcihjdXJyZW50JDEsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShjb250YWluZXIpIHtcbiAgdmFyIGNvbnRhaW5lckZpYmVyID0gY29udGFpbmVyLmN1cnJlbnQ7XG5cbiAgaWYgKCFjb250YWluZXJGaWJlci5jaGlsZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChjb250YWluZXJGaWJlci5jaGlsZC50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB2YXIgcm9vdCA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgLy8gRmx1c2ggdGhlIGZpcnN0IHNjaGVkdWxlZCBcInVwZGF0ZVwiLlxuICAgICAgICB2YXIgbGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCk7XG4gICAgICAgIGZsdXNoUm9vdChyb290LCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIH0pOyAvLyBJZiB3ZSdyZSBzdGlsbCBibG9ja2VkIGFmdGVyIHRoaXMsIHdlIG5lZWQgdG8gaW5jcmVhc2VcbiAgICAgIC8vIHRoZSBwcmlvcml0eSBvZiBhbnkgcHJvbWlzZXMgcmVzb2x2aW5nIHdpdGhpbiB0aGlzXG4gICAgICAvLyBib3VuZGFyeSBzbyB0aGF0IHRoZXkgbmV4dCBhdHRlbXB0IGFsc28gaGFzIGhpZ2hlciBwcmkuXG5cbiAgICAgIHZhciByZXRyeUxhbmUgPSBTeW5jTGFuZTtcbiAgICAgIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSkge1xuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBoaWdoZXJQcmlvcml0eUxhbmUoc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUsIHJldHJ5TGFuZSk7XG4gIH1cbn0gLy8gSW5jcmVhc2VzIHRoZSBwcmlvcml0eSBvZiB0aGVuYWJsZXMgd2hlbiB0aGV5IHJlc29sdmUgd2l0aGluIHRoaXMgYm91bmRhcnkuXG5cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSkge1xuICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgbWFya1JldHJ5TGFuZUltcGwoYWx0ZXJuYXRlLCByZXRyeUxhbmUpO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBhbmQgdGhleSBzaG91bGQgbm90IHN1c3BlbmQgb24gSS9PLFxuICAgIC8vIHNpbmNlIHlvdSBoYXZlIHRvIHdyYXAgYW55dGhpbmcgdGhhdCBtaWdodCBzdXNwZW5kIGluXG4gICAgLy8gU3VzcGVuc2UuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSQxKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBvdGhlciB0aGFuIHN5bmNocm9ub3VzbHkgZmx1c2ggaXQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbnZhciBzaG91bGRFcnJvckltcGwgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRFcnJvcihmaWJlcikge1xuICByZXR1cm4gc2hvdWxkRXJyb3JJbXBsKGZpYmVyKTtcbn1cblxudmFyIHNob3VsZFN1c3BlbmRJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZFN1c3BlbmQoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZFN1c3BlbmRJbXBsKGZpYmVyKTtcbn1cbnZhciBvdmVycmlkZUhvb2tTdGF0ZSA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHMgPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IG51bGw7XG52YXIgc2NoZWR1bGVVcGRhdGUgPSBudWxsO1xudmFyIHNldEVycm9ySGFuZGxlciA9IG51bGw7XG52YXIgc2V0U3VzcGVuc2VIYW5kbGVyID0gbnVsbDtcblxue1xuICB2YXIgY29weVdpdGhEZWxldGVJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRba2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhEZWxldGUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZUltcGwgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCkge1xuICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gb2xkUGF0aC5sZW5ndGgpIHtcbiAgICAgIHZhciBuZXdLZXkgPSBuZXdQYXRoW2luZGV4XTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgICB1cGRhdGVkW25ld0tleV0gPSB1cGRhdGVkW29sZEtleV07XG5cbiAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7XG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKG9sZEtleSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtvbGRLZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICB1cGRhdGVkW29sZEtleV0gPSBjb3B5V2l0aFJlbmFtZUltcGwoIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICAgIG9ialtvbGRLZXldLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZSA9IGZ1bmN0aW9uIChvYmosIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBpZiAob2xkUGF0aC5sZW5ndGggIT09IG5ld1BhdGgubGVuZ3RoKSB7XG4gICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgb2YgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdQYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBpZiAob2xkUGF0aFtpXSAhPT0gbmV3UGF0aFtpXSkge1xuICAgICAgICAgIHdhcm4oJ2NvcHlXaXRoUmVuYW1lKCkgZXhwZWN0cyBwYXRocyB0byBiZSB0aGUgc2FtZSBleGNlcHQgZm9yIHRoZSBkZWVwZXN0IGtleScpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvcHlXaXRoUmVuYW1lSW1wbChvYmosIG9sZFBhdGgsIG5ld1BhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldEltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCwgdmFsdWUpIHtcbiAgICBpZiAoaW5kZXggPj0gcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgdXBkYXRlZFtrZXldID0gY29weVdpdGhTZXRJbXBsKG9ialtrZXldLCBwYXRoLCBpbmRleCArIDEsIHZhbHVlKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiBjb3B5V2l0aFNldEltcGwob2JqLCBwYXRoLCAwLCB2YWx1ZSk7XG4gIH07XG5cbiAgdmFyIGZpbmRIb29rID0gZnVuY3Rpb24gKGZpYmVyLCBpZCkge1xuICAgIC8vIEZvciBub3csIHRoZSBcImlkXCIgb2Ygc3RhdGVmdWwgaG9va3MgaXMganVzdCB0aGUgc3RhdGVmdWwgaG9vayBpbmRleC5cbiAgICAvLyBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB3aXRoIGUuZy4gbmVzdGVkIGhvb2tzLlxuICAgIHZhciBjdXJyZW50SG9vayA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoY3VycmVudEhvb2sgIT09IG51bGwgJiYgaWQgPiAwKSB7XG4gICAgICBjdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gICAgICBpZC0tO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50SG9vaztcbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBlZGl0YWJsZSB2YWx1ZXMgZm9yIHVzZVN0YXRlIGFuZCB1c2VSZWR1Y2VyLlxuXG5cbiAgb3ZlcnJpZGVIb29rU3RhdGUgPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoLCB2YWx1ZSkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aFNldChob29rLm1lbW9pemVkU3RhdGUsIHBhdGgsIHZhbHVlKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhSZW5hbWUoaG9vay5tZW1vaXplZFN0YXRlLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIHByb3BzIGZvciBmdW5jdGlvbiBjb21wb25lbnRzLCBmb3J3YXJkUmVmLCBtZW1vLCBob3N0IGNvbXBvbmVudHMsIGV0Yy5cblxuXG4gIG92ZXJyaWRlUHJvcHMgPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgsIHZhbHVlKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhTZXQoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCwgdmFsdWUpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aERlbGV0ZShmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhSZW5hbWUoZmliZXIubWVtb2l6ZWRQcm9wcywgb2xkUGF0aCwgbmV3UGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfTtcblxuICBzY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfTtcblxuICBzZXRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkRXJyb3JJbXBsKSB7XG4gICAgc2hvdWxkRXJyb3JJbXBsID0gbmV3U2hvdWxkRXJyb3JJbXBsO1xuICB9O1xuXG4gIHNldFN1c3BlbnNlSGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRTdXNwZW5kSW1wbCkge1xuICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50b0RldlRvb2xzKGRldlRvb2xzQ29uZmlnKSB7XG4gIHZhciBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSA9IGRldlRvb2xzQ29uZmlnLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO1xuICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoe1xuICAgIGJ1bmRsZVR5cGU6IGRldlRvb2xzQ29uZmlnLmJ1bmRsZVR5cGUsXG4gICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbixcbiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlclBhY2thZ2VOYW1lLFxuICAgIHJlbmRlcmVyQ29uZmlnOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlckNvbmZpZyxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcyxcbiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aDogb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoLFxuICAgIHNldEVycm9ySGFuZGxlcjogc2V0RXJyb3JIYW5kbGVyLFxuICAgIHNldFN1c3BlbnNlSGFuZGxlcjogc2V0U3VzcGVuc2VIYW5kbGVyLFxuICAgIHNjaGVkdWxlVXBkYXRlOiBzY2hlZHVsZVVwZGF0ZSxcbiAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjogZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIsXG4gICAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlIHx8IGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UsXG4gICAgLy8gUmVhY3QgUmVmcmVzaFxuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDogIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSZWZyZXNoOiAgc2NoZWR1bGVSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLFxuICAgIHNldFJlZnJlc2hIYW5kbGVyOiAgc2V0UmVmcmVzaEhhbmRsZXIgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gYXBwZW5kIG93bmVyIHN0YWNrcyB0byBlcnJvciBtZXNzYWdlcyBpbiBERVYgbW9kZS5cbiAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyAsXG4gICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBkZXRlY3QgcmVjb25jaWxlciB2ZXJzaW9uIHJhdGhlciB0aGFuIHJlbmRlcmVyIHZlcnNpb25cbiAgICAvLyB3aGljaCBtYXkgbm90IG1hdGNoIGZvciB0aGlyZCBwYXJ0eSByZW5kZXJlcnMuXG4gICAgcmVjb25jaWxlclZlcnNpb246IFJlYWN0VmVyc2lvblxuICB9KTtcbn1cblxuLyogZ2xvYmFsIHJlcG9ydEVycm9yICovXG5cbnZhciBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yID0gdHlwZW9mIHJlcG9ydEVycm9yID09PSAnZnVuY3Rpb24nID8gLy8gSW4gbW9kZXJuIGJyb3dzZXJzLCByZXBvcnRFcnJvciB3aWxsIGRpc3BhdGNoIGFuIGVycm9yIGV2ZW50LFxuLy8gZW11bGF0aW5nIGFuIHVuY2F1Z2h0IEphdmFTY3JpcHQgZXJyb3IuXG5yZXBvcnRFcnJvciA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAvLyBJbiBvbGRlciBicm93c2VycyBhbmQgdGVzdCBlbnZpcm9ubWVudHMsIGZhbGxiYWNrIHRvIGNvbnNvbGUuZXJyb3IuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcbiAgY29uc29sZVsnZXJyb3InXShlcnJvcik7XG59O1xuXG5mdW5jdGlvbiBSZWFjdERPTVJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBhbiB1bm1vdW50ZWQgcm9vdC4nKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkQ29udGFpbmVyKGFyZ3VtZW50c1sxXSkpIHtcbiAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgY29udGFpbmVyIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQgb2Ygcm9vdC5yZW5kZXIoLi4uKS4gJyArIFwiWW91IGRvbid0IG5lZWQgdG8gcGFzcyBpdCBhZ2FpbiBzaW5jZSB5b3UgYWxyZWFkeSBwYXNzZWQgaXQgdG8gY3JlYXRlIHRoZSByb290LlwiKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignWW91IHBhc3NlZCBhIHNlY29uZCBhcmd1bWVudCB0byByb290LnJlbmRlciguLi4pIGJ1dCBpdCBvbmx5IGFjY2VwdHMgJyArICdvbmUgYXJndW1lbnQuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKHJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhlICcgKyAncm9vdCBjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyBcInJvb3QudW5tb3VudCgpIHRvIGVtcHR5IGEgcm9vdCdzIGNvbnRhaW5lci5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIG51bGwsIG51bGwpO1xufTtcblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCd1bm1vdW50KC4uLik6IGRvZXMgbm90IHN1cHBvcnQgYSBjYWxsYmFjayBhcmd1bWVudC4gJyArICdUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgcmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIGEgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IG51bGw7XG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIHtcbiAgICAgIGlmIChpc0FscmVhZHlSZW5kZXJpbmcoKSkge1xuICAgICAgICBlcnJvcignQXR0ZW1wdGVkIHRvIHN5bmNocm9ub3VzbHkgdW5tb3VudCBhIHJvb3Qgd2hpbGUgUmVhY3Qgd2FzIGFscmVhZHkgJyArICdyZW5kZXJpbmcuIFJlYWN0IGNhbm5vdCBmaW5pc2ggdW5tb3VudGluZyB0aGUgcm9vdCB1bnRpbCB0aGUgJyArICdjdXJyZW50IHJlbmRlciBoYXMgY29tcGxldGVkLCB3aGljaCBtYXkgbGVhZCB0byBhIHJhY2UgY29uZGl0aW9uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIobnVsbCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7XG4gIHZhciBpc1N0cmljdE1vZGUgPSBmYWxzZTtcbiAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTtcbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSAnJztcbiAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3I7XG4gIHZhciB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gbnVsbDtcblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICBpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG4gICAgICAgIHdhcm4oJ2h5ZHJhdGUgdGhyb3VnaCBjcmVhdGVSb290IGlzIGRlcHJlY2F0ZWQuIFVzZSBSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pIGluc3RlYWQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucy4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBKU1ggZWxlbWVudCB0byBjcmVhdGVSb290LiBZb3UgcHJvYmFibHkgbWVhbnQgdG8gJyArICdjYWxsIHJvb3QucmVuZGVyIGluc3RlYWQuICcgKyAnRXhhbXBsZSB1c2FnZTpcXG5cXG4nICsgJyAgbGV0IHJvb3QgPSBjcmVhdGVSb290KGRvbUNvbnRhaW5lcik7XFxuJyArICcgIHJvb3QucmVuZGVyKDxBcHAgLz4pOycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgaXNTdHJpY3RNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZGVudGlmaWVyUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJhbnNpdGlvbkNhbGxiYWNrcyA9IG9wdGlvbnMudHJhbnNpdGlvbkNhbGxiYWNrcztcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXIsIENvbmN1cnJlbnRSb290LCBudWxsLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHJldHVybiBuZXcgUmVhY3RET01Sb290KHJvb3QpO1xufVxuXG5mdW5jdGlvbiBSZWFjdERPTUh5ZHJhdGlvblJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVIeWRyYXRpb24odGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCk7XG4gIH1cbn1cblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbiA9IHNjaGVkdWxlSHlkcmF0aW9uO1xuZnVuY3Rpb24gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2h5ZHJhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7XG5cbiAge1xuICAgIGlmIChpbml0aWFsQ2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IoJ011c3QgcHJvdmlkZSBpbml0aWFsIGNoaWxkcmVuIGFzIHNlY29uZCBhcmd1bWVudCB0byBoeWRyYXRlUm9vdC4gJyArICdFeGFtcGxlIHVzYWdlOiBoeWRyYXRlUm9vdChkb21Db250YWluZXIsIDxBcHAgLz4pJyk7XG4gICAgfVxuICB9IC8vIEZvciBub3cgd2UgcmV1c2UgdGhlIHdob2xlIGJhZyBvZiBvcHRpb25zIHNpbmNlIHRoZXkgY29udGFpblxuICAvLyB0aGUgaHlkcmF0aW9uIGNhbGxiYWNrcy5cblxuXG4gIHZhciBoeWRyYXRpb25DYWxsYmFja3MgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDogbnVsbDsgLy8gVE9ETzogRGVsZXRlIHRoaXMgb3B0aW9uXG5cbiAgdmFyIG11dGFibGVTb3VyY2VzID0gb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaHlkcmF0ZWRTb3VyY2VzIHx8IG51bGw7XG4gIHZhciBpc1N0cmljdE1vZGUgPSBmYWxzZTtcbiAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTtcbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSAnJztcbiAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgaXNTdHJpY3RNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZGVudGlmaWVyUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgbnVsbCwgY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpOyAvLyBUaGlzIGNhbid0IGJlIGEgY29tbWVudCBub2RlIHNpbmNlIGh5ZHJhdGlvbiBkb2Vzbid0IHdvcmsgb24gY29tbWVudCBub2RlcyBhbnl3YXkuXG5cbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoY29udGFpbmVyKTtcblxuICBpZiAobXV0YWJsZVNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dGFibGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IG11dGFibGVTb3VyY2VzW2ldO1xuICAgICAgcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhY3RET01IeWRyYXRpb25Sb290KHJvb3QpO1xufVxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8ICFkaXNhYmxlQ29tbWVudHNBc0RPTUNvbnRhaW5lcnMgICkpO1xufSAvLyBUT0RPOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiB3aGljaCBhbHNvIGluY2x1ZGVzIGNvbW1lbnQgbm9kZXMuXG4vLyBXZSBvbmx5IHVzZSBpdCBpbiBwbGFjZXMgdGhhdCBhcmUgY3VycmVudGx5IG1vcmUgcmVsYXhlZC5cblxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lckxlZ2FjeShub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKSB7XG4gIHtcbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgY29udGFpbmVyLnRhZ05hbWUgJiYgY29udGFpbmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICBlcnJvcignY3JlYXRlUm9vdCgpOiBDcmVhdGluZyByb290cyBkaXJlY3RseSB3aXRoIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSB1c2luZyBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikpIHtcbiAgICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NLnJlbmRlcigpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0ICcgKyAnaGFzIGFscmVhZHkgYmVlbiBwYXNzZWQgdG8gY3JlYXRlUm9vdCgpIGJlZm9yZS4gSW5zdGVhZCwgY2FsbCAnICsgJ3Jvb3QucmVuZGVyKCkgb24gdGhlIGV4aXN0aW5nIHJvb3QgaW5zdGVhZCBpZiB5b3Ugd2FudCB0byB1cGRhdGUgaXQuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncztcblxue1xuICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciAmJiBjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyLmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlKSB7XG4gICAgICAgIGlmIChob3N0SW5zdGFuY2UucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoaXMgJyArICdjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyAnUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSB0byBlbXB0eSBhIGNvbnRhaW5lci4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0ID0gISFjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdmFyIGhhc05vblJvb3RSZWFjdENoaWxkID0gISEocm9vdEVsICYmIGdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKSk7XG5cbiAgICBpZiAoaGFzTm9uUm9vdFJlYWN0Q2hpbGQgJiYgIWlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogUmVwbGFjaW5nIFJlYWN0LXJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBuZXcgcm9vdCAnICsgJ2NvbXBvbmVudC4gSWYgeW91IGludGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCAnICsgJ3lvdSBzaG91bGQgaW5zdGVhZCBoYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiB1cGRhdGUgdGhlaXIgc3RhdGUgJyArICdhbmQgcmVuZGVyIHRoZSBuZXcgY29tcG9uZW50cyBpbnN0ZWFkIG9mIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyLicpO1xuICAgIH1cblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBjb250YWluZXIudGFnTmFtZSAmJiBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoKTogUmVuZGVyaW5nIGNvbXBvbmVudHMgZGlyZWN0bHkgaW50byBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIHJldHVybiBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wT25SZWNvdmVyYWJsZUVycm9yKCkgey8vIFRoaXMgaXNuJ3QgcmVhY2hhYmxlIGJlY2F1c2Ugb25SZWNvdmVyYWJsZUVycm9yIGlzbid0IGNhbGxlZCBpbiB0aGVcbiAgLy8gbGVnYWN5IEFQSS5cbn1cblxuZnVuY3Rpb24gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2ssIGlzSHlkcmF0aW9uQ29udGFpbmVyKSB7XG4gIGlmIChpc0h5ZHJhdGlvbkNvbnRhaW5lcikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgY2FsbGJhY2ssIGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzXG4gICAgZmFsc2UsIC8vIGlzU3RyaWN0TW9kZVxuICAgIGZhbHNlLCAvLyBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLFxuICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4XG4gICAgbm9vcE9uUmVjb3ZlcmFibGVFcnJvcik7XG4gICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSByb290O1xuICAgIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuICAgIHZhciByb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG4gICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgIGZsdXNoU3luYygpO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIC8vIEZpcnN0IGNsZWFyIGFueSBleGlzdGluZyBjb250ZW50LlxuICAgIHZhciByb290U2libGluZztcblxuICAgIHdoaWxlIChyb290U2libGluZyA9IGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChyb290U2libGluZyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9vcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2UoX3Jvb3QpO1xuXG4gICAgICAgIF9vcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX3Jvb3QgPSBjcmVhdGVDb250YWluZXIoY29udGFpbmVyLCBMZWdhY3lSb290LCBudWxsLCAvLyBoeWRyYXRpb25DYWxsYmFja3NcbiAgICBmYWxzZSwgLy8gaXNTdHJpY3RNb2RlXG4gICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsXG4gICAgJycsIC8vIGlkZW50aWZpZXJQcmVmaXhcbiAgICBub29wT25SZWNvdmVyYWJsZUVycm9yKTtcblxuICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gX3Jvb3Q7XG4gICAgbWFya0NvbnRhaW5lckFzUm9vdChfcm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuXG4gICAgdmFyIF9yb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG5cbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhfcm9vdENvbnRhaW5lckVsZW1lbnQpOyAvLyBJbml0aWFsIG1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBfcm9vdCwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gICAgfSk7XG4gICAgcmV0dXJuIF9yb290O1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBjaGlsZHJlbiwgY29udGFpbmVyLCBmb3JjZUh5ZHJhdGUsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzKGNvbnRhaW5lcik7XG4gICAgd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaywgJ3JlbmRlcicpO1xuICB9XG5cbiAgdmFyIG1heWJlUm9vdCA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICB2YXIgcm9vdDtcblxuICBpZiAoIW1heWJlUm9vdCkge1xuICAgIC8vIEluaXRpYWwgbW91bnRcbiAgICByb290ID0gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgZm9yY2VIeWRyYXRlKTtcbiAgfSBlbHNlIHtcbiAgICByb290ID0gbWF5YmVSb290O1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfSAvLyBVcGRhdGVcblxuXG4gICAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICB7XG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIkMy5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIHdhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcjtcblxuICAgICAgaWYgKCF3YXJuZWRBYm91dFJlZnNJblJlbmRlcikge1xuICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGZpbmRET01Ob2RlIGluc2lkZSBpdHMgcmVuZGVyKCkuICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3duZXIudHlwZSkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHtcbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudE9yRWxlbWVudCwgJ2ZpbmRET01Ob2RlJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLmh5ZHJhdGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBSZWFjdCAxOC4gVXNlIGh5ZHJhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArIFwiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiBcIiArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLmh5ZHJhdGUoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk/Jyk7XG4gICAgfVxuICB9IC8vIFRPRE86IHRocm93IG9yIHdhcm4gaWYgd2UgY291bGRuJ3QgaHlkcmF0ZT9cblxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBlbGVtZW50LCBjb250YWluZXIsIHRydWUsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHJlbmRlcihlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00ucmVuZGVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBjcmVhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArIFwiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiBcIiArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlcigpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC5yZW5kZXIoZWxlbWVudCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgZmFsc2UsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcigpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgJyArICdpbiBSZWFjdCAxOC4gQ29uc2lkZXIgdXNpbmcgYSBwb3J0YWwgaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byAnICsgXCJ0aGUgY3JlYXRlUm9vdCBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzIGlmIGl0J3MgcnVubmluZyBSZWFjdCBcIiArICcxNy4gTGVhcm4gbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyTm9kZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICBpZiAocGFyZW50Q29tcG9uZW50ID09IG51bGwgfHwgIWhhcyhwYXJlbnRDb21wb25lbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwYXJlbnRDb21wb25lbnQgbXVzdCBiZSBhIHZhbGlkIFJlYWN0IENvbXBvbmVudCcpO1xuICB9XG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgZmFsc2UsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bm1vdW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIERpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QudW5tb3VudCgpPycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgIHtcbiAgICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgIHZhciByZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QgPSByb290RWwgJiYgIWdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTtcblxuICAgICAgaWYgKHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH0gLy8gVW5tb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEpO1xuc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkpO1xuXG57XG4gIGlmICh0eXBlb2YgTWFwICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgTWFwIGhhcyBubyBwcm90b3R5cGVcbiAgTWFwLnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBNYXAucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFNldCBoYXMgbm8gcHJvdG90eXBlXG4gIFNldC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5jbGVhciAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgZXJyb3IoJ1JlYWN0IGRlcGVuZHMgb24gTWFwIGFuZCBTZXQgYnVpbHQtaW4gdHlwZXMuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxscycpO1xuICB9XG59XG5cbnNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihyZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMpO1xuc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlcyQxLCBkaXNjcmV0ZVVwZGF0ZXMsIGZsdXNoU3luYyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbCQxKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfSAvLyBUT0RPOiBwYXNzIFJlYWN0RE9NIHBvcnRhbCBpbXBsZW1lbnRhdGlvbiBhcyB0aGlyZCBhcmd1bWVudFxuICAvLyAkRmxvd0ZpeE1lIFRoZSBGbG93IHR5cGUgaXMgb3BhcXVlIGJ1dCB0aGVyZSdzIG5vIHdheSB0byBhY3R1YWxseSBjcmVhdGUgaXQuXG5cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIsIG51bGwsIGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spO1xufVxuXG52YXIgSW50ZXJuYWxzID0ge1xuICB1c2luZ0NsaWVudEVudHJ5UG9pbnQ6IGZhbHNlLFxuICAvLyBLZWVwIGluIHN5bmMgd2l0aCBSZWFjdFRlc3RVdGlscy5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGJhdGNoZWRVcGRhdGVzJDFdXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290JDEoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHtcbiAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIWZhbHNlKSB7XG4gICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgY3JlYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaHlkcmF0ZVJvb3QkMShjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGh5ZHJhdGVSb290IGZyb20gXCJyZWFjdC1kb21cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpO1xufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmZ1bmN0aW9uIGZsdXNoU3luYyQxKGZuKSB7XG4gIHtcbiAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgIGVycm9yKCdmbHVzaFN5bmMgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIGxpZmVjeWNsZSBtZXRob2QuIFJlYWN0IGNhbm5vdCAnICsgJ2ZsdXNoIHdoZW4gUmVhY3QgaXMgYWxyZWFkeSByZW5kZXJpbmcuIENvbnNpZGVyIG1vdmluZyB0aGlzIGNhbGwgdG8gJyArICdhIHNjaGVkdWxlciB0YXNrIG9yIG1pY3JvIHRhc2suJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsdXNoU3luYyhmbik7XG59XG52YXIgZm91bmREZXZUb29scyA9IGluamVjdEludG9EZXZUb29scyh7XG4gIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgYnVuZGxlVHlwZTogIDEgLFxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG4gIHJlbmRlcmVyUGFja2FnZU5hbWU6ICdyZWFjdC1kb20nXG59KTtcblxue1xuICBpZiAoIWZvdW5kRGV2VG9vbHMgJiYgY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7XG4gICAgLy8gSWYgd2UncmUgaW4gQ2hyb21lIG9yIEZpcmVmb3gsIHByb3ZpZGUgYSBkb3dubG9hZCBsaW5rIGlmIG5vdCBpbnN0YWxsZWQuXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgdmFyIHByb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sOyAvLyBEb24ndCB3YXJuIGluIGV4b3RpYyBjYXNlcyBsaWtlIGNocm9tZS1leHRlbnNpb246Ly8uXG5cbiAgICAgIGlmICgvXihodHRwcz98ZmlsZSk6JC8udGVzdChwcm90b2NvbCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICAgICAgICBjb25zb2xlLmluZm8oJyVjRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyArIChwcm90b2NvbCA9PT0gJ2ZpbGU6JyA/ICdcXG5Zb3UgbWlnaHQgbmVlZCB0byB1c2UgYSBsb2NhbCBIVFRQIHNlcnZlciAoaW5zdGVhZCBvZiBmaWxlOi8vKTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMtZmFxJyA6ICcnKSwgJ2ZvbnQtd2VpZ2h0OmJvbGQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IEludGVybmFscztcbmV4cG9ydHMuY3JlYXRlUG9ydGFsID0gY3JlYXRlUG9ydGFsJDE7XG5leHBvcnRzLmNyZWF0ZVJvb3QgPSBjcmVhdGVSb290JDE7XG5leHBvcnRzLmZpbmRET01Ob2RlID0gZmluZERPTU5vZGU7XG5leHBvcnRzLmZsdXNoU3luYyA9IGZsdXNoU3luYyQxO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBoeWRyYXRlUm9vdCQxO1xuZXhwb3J0cy5yZW5kZXIgPSByZW5kZXI7XG5leHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGUgPSB1bm1vdW50Q29tcG9uZW50QXROb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyA9IGJhdGNoZWRVcGRhdGVzJDE7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gbS5jcmVhdGVSb290O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gbS5oeWRyYXRlUm9vdDtcbn0gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG4iLCAiLyohXG4gKiBkZXBkXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE4IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHJlbGF0aXZlID0gcmVxdWlyZSgncGF0aCcpLnJlbGF0aXZlXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXBkXG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIHRvIGJhc2UgZmlsZXMgb24uXG4gKi9cblxudmFyIGJhc2VQYXRoID0gcHJvY2Vzcy5jd2QoKVxuXG4vKipcbiAqIERldGVybWluZSBpZiBuYW1lc3BhY2UgaXMgY29udGFpbmVkIGluIHRoZSBzdHJpbmcuXG4gKi9cblxuZnVuY3Rpb24gY29udGFpbnNOYW1lc3BhY2UgKHN0ciwgbmFtZXNwYWNlKSB7XG4gIHZhciB2YWxzID0gc3RyLnNwbGl0KC9bICxdKy8pXG4gIHZhciBucyA9IFN0cmluZyhuYW1lc3BhY2UpLnRvTG93ZXJDYXNlKClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdmFsID0gdmFsc1tpXVxuXG4gICAgLy8gbmFtZXNwYWNlIGNvbnRhaW5lZFxuICAgIGlmICh2YWwgJiYgKHZhbCA9PT0gJyonIHx8IHZhbC50b0xvd2VyQ2FzZSgpID09PSBucykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ29udmVydCBhIGRhdGEgZGVzY3JpcHRvciB0byBhY2Nlc3NvciBkZXNjcmlwdG9yLlxuICovXG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRhRGVzY3JpcHRvclRvQWNjZXNzb3IgKG9iaiwgcHJvcCwgbWVzc2FnZSkge1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKVxuICB2YXIgdmFsdWUgPSBkZXNjcmlwdG9yLnZhbHVlXG5cbiAgZGVzY3JpcHRvci5nZXQgPSBmdW5jdGlvbiBnZXR0ZXIgKCkgeyByZXR1cm4gdmFsdWUgfVxuXG4gIGlmIChkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgZGVzY3JpcHRvci5zZXQgPSBmdW5jdGlvbiBzZXR0ZXIgKHZhbCkgeyByZXR1cm4gKHZhbHVlID0gdmFsKSB9XG4gIH1cblxuICBkZWxldGUgZGVzY3JpcHRvci52YWx1ZVxuICBkZWxldGUgZGVzY3JpcHRvci53cml0YWJsZVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2NyaXB0b3IpXG5cbiAgcmV0dXJuIGRlc2NyaXB0b3Jcbn1cblxuLyoqXG4gKiBDcmVhdGUgYXJndW1lbnRzIHN0cmluZyB0byBrZWVwIGFyaXR5LlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUFyZ3VtZW50c1N0cmluZyAoYXJpdHkpIHtcbiAgdmFyIHN0ciA9ICcnXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcml0eTsgaSsrKSB7XG4gICAgc3RyICs9ICcsIGFyZycgKyBpXG4gIH1cblxuICByZXR1cm4gc3RyLnN1YnN0cigyKVxufVxuXG4vKipcbiAqIENyZWF0ZSBzdGFjayBzdHJpbmcgZnJvbSBzdGFjay5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdGFja1N0cmluZyAoc3RhY2spIHtcbiAgdmFyIHN0ciA9IHRoaXMubmFtZSArICc6ICcgKyB0aGlzLm5hbWVzcGFjZVxuXG4gIGlmICh0aGlzLm1lc3NhZ2UpIHtcbiAgICBzdHIgKz0gJyBkZXByZWNhdGVkICcgKyB0aGlzLm1lc3NhZ2VcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICBzdHIgKz0gJ1xcbiAgICBhdCAnICsgc3RhY2tbaV0udG9TdHJpbmcoKVxuICB9XG5cbiAgcmV0dXJuIHN0clxufVxuXG4vKipcbiAqIENyZWF0ZSBkZXByZWNhdGUgZm9yIG5hbWVzcGFjZSBpbiBjYWxsZXIuXG4gKi9cblxuZnVuY3Rpb24gZGVwZCAobmFtZXNwYWNlKSB7XG4gIGlmICghbmFtZXNwYWNlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgbmFtZXNwYWNlIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIHZhciBzdGFjayA9IGdldFN0YWNrKClcbiAgdmFyIHNpdGUgPSBjYWxsU2l0ZUxvY2F0aW9uKHN0YWNrWzFdKVxuICB2YXIgZmlsZSA9IHNpdGVbMF1cblxuICBmdW5jdGlvbiBkZXByZWNhdGUgKG1lc3NhZ2UpIHtcbiAgICAvLyBjYWxsIHRvIHNlbGYgYXMgbG9nXG4gICAgbG9nLmNhbGwoZGVwcmVjYXRlLCBtZXNzYWdlKVxuICB9XG5cbiAgZGVwcmVjYXRlLl9maWxlID0gZmlsZVxuICBkZXByZWNhdGUuX2lnbm9yZWQgPSBpc2lnbm9yZWQobmFtZXNwYWNlKVxuICBkZXByZWNhdGUuX25hbWVzcGFjZSA9IG5hbWVzcGFjZVxuICBkZXByZWNhdGUuX3RyYWNlZCA9IGlzdHJhY2VkKG5hbWVzcGFjZSlcbiAgZGVwcmVjYXRlLl93YXJuZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZGVwcmVjYXRlLmZ1bmN0aW9uID0gd3JhcGZ1bmN0aW9uXG4gIGRlcHJlY2F0ZS5wcm9wZXJ0eSA9IHdyYXBwcm9wZXJ0eVxuXG4gIHJldHVybiBkZXByZWNhdGVcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgZXZlbnQgZW1pdHRlciBoYXMgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gdHlwZS5cbiAqXG4gKiBUaGUgd2F5IHRvIGRvIHRoaXMgY2hlY2sgaXMgZG9uZSB0aHJlZSBkaWZmZXJlbnQgd2F5cyBpbiBOb2RlLmpzID49IDAuOFxuICogc28gdGhpcyBjb25zb2xpZGF0ZXMgdGhlbSBpbnRvIGEgbWluaW1hbCBzZXQgdXNpbmcgaW5zdGFuY2UgbWV0aG9kcy5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlclxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBlZWhhc2xpc3RlbmVycyAoZW1pdHRlciwgdHlwZSkge1xuICB2YXIgY291bnQgPSB0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ICE9PSAnZnVuY3Rpb24nXG4gICAgPyBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGhcbiAgICA6IGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKVxuXG4gIHJldHVybiBjb3VudCA+IDBcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgbmFtZXNwYWNlIGlzIGlnbm9yZWQuXG4gKi9cblxuZnVuY3Rpb24gaXNpZ25vcmVkIChuYW1lc3BhY2UpIHtcbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbikge1xuICAgIC8vIC0tbm8tZGVwcmVjYXRpb24gc3VwcG9ydFxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICB2YXIgc3RyID0gcHJvY2Vzcy5lbnYuTk9fREVQUkVDQVRJT04gfHwgJydcblxuICAvLyBuYW1lc3BhY2UgaWdub3JlZFxuICByZXR1cm4gY29udGFpbnNOYW1lc3BhY2Uoc3RyLCBuYW1lc3BhY2UpXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIG5hbWVzcGFjZSBpcyB0cmFjZWQuXG4gKi9cblxuZnVuY3Rpb24gaXN0cmFjZWQgKG5hbWVzcGFjZSkge1xuICBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgLy8gLS10cmFjZS1kZXByZWNhdGlvbiBzdXBwb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHZhciBzdHIgPSBwcm9jZXNzLmVudi5UUkFDRV9ERVBSRUNBVElPTiB8fCAnJ1xuXG4gIC8vIG5hbWVzcGFjZSB0cmFjZWRcbiAgcmV0dXJuIGNvbnRhaW5zTmFtZXNwYWNlKHN0ciwgbmFtZXNwYWNlKVxufVxuXG4vKipcbiAqIERpc3BsYXkgZGVwcmVjYXRpb24gbWVzc2FnZS5cbiAqL1xuXG5mdW5jdGlvbiBsb2cgKG1lc3NhZ2UsIHNpdGUpIHtcbiAgdmFyIGhhc2xpc3RlbmVycyA9IGVlaGFzbGlzdGVuZXJzKHByb2Nlc3MsICdkZXByZWNhdGlvbicpXG5cbiAgLy8gYWJvcnQgZWFybHkgaWYgbm8gZGVzdGluYXRpb25cbiAgaWYgKCFoYXNsaXN0ZW5lcnMgJiYgdGhpcy5faWdub3JlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGNhbGxlclxuICB2YXIgY2FsbEZpbGVcbiAgdmFyIGNhbGxTaXRlXG4gIHZhciBkZXBTaXRlXG4gIHZhciBpID0gMFxuICB2YXIgc2VlbiA9IGZhbHNlXG4gIHZhciBzdGFjayA9IGdldFN0YWNrKClcbiAgdmFyIGZpbGUgPSB0aGlzLl9maWxlXG5cbiAgaWYgKHNpdGUpIHtcbiAgICAvLyBwcm92aWRlZCBzaXRlXG4gICAgZGVwU2l0ZSA9IHNpdGVcbiAgICBjYWxsU2l0ZSA9IGNhbGxTaXRlTG9jYXRpb24oc3RhY2tbMV0pXG4gICAgY2FsbFNpdGUubmFtZSA9IGRlcFNpdGUubmFtZVxuICAgIGZpbGUgPSBjYWxsU2l0ZVswXVxuICB9IGVsc2Uge1xuICAgIC8vIGdldCBjYWxsIHNpdGVcbiAgICBpID0gMlxuICAgIGRlcFNpdGUgPSBjYWxsU2l0ZUxvY2F0aW9uKHN0YWNrW2ldKVxuICAgIGNhbGxTaXRlID0gZGVwU2l0ZVxuICB9XG5cbiAgLy8gZ2V0IGNhbGxlciBvZiBkZXByZWNhdGVkIHRoaW5nIGluIHJlbGF0aW9uIHRvIGZpbGVcbiAgZm9yICg7IGkgPCBzdGFjay5sZW5ndGg7IGkrKykge1xuICAgIGNhbGxlciA9IGNhbGxTaXRlTG9jYXRpb24oc3RhY2tbaV0pXG4gICAgY2FsbEZpbGUgPSBjYWxsZXJbMF1cblxuICAgIGlmIChjYWxsRmlsZSA9PT0gZmlsZSkge1xuICAgICAgc2VlbiA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGNhbGxGaWxlID09PSB0aGlzLl9maWxlKSB7XG4gICAgICBmaWxlID0gdGhpcy5fZmlsZVxuICAgIH0gZWxzZSBpZiAoc2Vlbikge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICB2YXIga2V5ID0gY2FsbGVyXG4gICAgPyBkZXBTaXRlLmpvaW4oJzonKSArICdfXycgKyBjYWxsZXIuam9pbignOicpXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYga2V5IGluIHRoaXMuX3dhcm5lZCkge1xuICAgIC8vIGFscmVhZHkgd2FybmVkXG4gICAgcmV0dXJuXG4gIH1cblxuICB0aGlzLl93YXJuZWRba2V5XSA9IHRydWVcblxuICAvLyBnZW5lcmF0ZSBhdXRvbWF0aWMgbWVzc2FnZSBmcm9tIGNhbGwgc2l0ZVxuICB2YXIgbXNnID0gbWVzc2FnZVxuICBpZiAoIW1zZykge1xuICAgIG1zZyA9IGNhbGxTaXRlID09PSBkZXBTaXRlIHx8ICFjYWxsU2l0ZS5uYW1lXG4gICAgICA/IGRlZmF1bHRNZXNzYWdlKGRlcFNpdGUpXG4gICAgICA6IGRlZmF1bHRNZXNzYWdlKGNhbGxTaXRlKVxuICB9XG5cbiAgLy8gZW1pdCBkZXByZWNhdGlvbiBpZiBsaXN0ZW5lcnMgZXhpc3RcbiAgaWYgKGhhc2xpc3RlbmVycykge1xuICAgIHZhciBlcnIgPSBEZXByZWNhdGlvbkVycm9yKHRoaXMuX25hbWVzcGFjZSwgbXNnLCBzdGFjay5zbGljZShpKSlcbiAgICBwcm9jZXNzLmVtaXQoJ2RlcHJlY2F0aW9uJywgZXJyKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gZm9ybWF0IGFuZCB3cml0ZSBtZXNzYWdlXG4gIHZhciBmb3JtYXQgPSBwcm9jZXNzLnN0ZGVyci5pc1RUWVxuICAgID8gZm9ybWF0Q29sb3JcbiAgICA6IGZvcm1hdFBsYWluXG4gIHZhciBvdXRwdXQgPSBmb3JtYXQuY2FsbCh0aGlzLCBtc2csIGNhbGxlciwgc3RhY2suc2xpY2UoaSkpXG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlKG91dHB1dCArICdcXG4nLCAndXRmOCcpXG59XG5cbi8qKlxuICogR2V0IGNhbGwgc2l0ZSBsb2NhdGlvbiBhcyBhcnJheS5cbiAqL1xuXG5mdW5jdGlvbiBjYWxsU2l0ZUxvY2F0aW9uIChjYWxsU2l0ZSkge1xuICB2YXIgZmlsZSA9IGNhbGxTaXRlLmdldEZpbGVOYW1lKCkgfHwgJzxhbm9ueW1vdXM+J1xuICB2YXIgbGluZSA9IGNhbGxTaXRlLmdldExpbmVOdW1iZXIoKVxuICB2YXIgY29sbSA9IGNhbGxTaXRlLmdldENvbHVtbk51bWJlcigpXG5cbiAgaWYgKGNhbGxTaXRlLmlzRXZhbCgpKSB7XG4gICAgZmlsZSA9IGNhbGxTaXRlLmdldEV2YWxPcmlnaW4oKSArICcsICcgKyBmaWxlXG4gIH1cblxuICB2YXIgc2l0ZSA9IFtmaWxlLCBsaW5lLCBjb2xtXVxuXG4gIHNpdGUuY2FsbFNpdGUgPSBjYWxsU2l0ZVxuICBzaXRlLm5hbWUgPSBjYWxsU2l0ZS5nZXRGdW5jdGlvbk5hbWUoKVxuXG4gIHJldHVybiBzaXRlXG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBkZWZhdWx0IG1lc3NhZ2UgZnJvbSB0aGUgc2l0ZS5cbiAqL1xuXG5mdW5jdGlvbiBkZWZhdWx0TWVzc2FnZSAoc2l0ZSkge1xuICB2YXIgY2FsbFNpdGUgPSBzaXRlLmNhbGxTaXRlXG4gIHZhciBmdW5jTmFtZSA9IHNpdGUubmFtZVxuXG4gIC8vIG1ha2UgdXNlZnVsIGFub255bW91cyBuYW1lXG4gIGlmICghZnVuY05hbWUpIHtcbiAgICBmdW5jTmFtZSA9ICc8YW5vbnltb3VzQCcgKyBmb3JtYXRMb2NhdGlvbihzaXRlKSArICc+J1xuICB9XG5cbiAgdmFyIGNvbnRleHQgPSBjYWxsU2l0ZS5nZXRUaGlzKClcbiAgdmFyIHR5cGVOYW1lID0gY29udGV4dCAmJiBjYWxsU2l0ZS5nZXRUeXBlTmFtZSgpXG5cbiAgLy8gaWdub3JlIHVzZWxlc3MgdHlwZSBuYW1lXG4gIGlmICh0eXBlTmFtZSA9PT0gJ09iamVjdCcpIHtcbiAgICB0eXBlTmFtZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gbWFrZSB1c2VmdWwgdHlwZSBuYW1lXG4gIGlmICh0eXBlTmFtZSA9PT0gJ0Z1bmN0aW9uJykge1xuICAgIHR5cGVOYW1lID0gY29udGV4dC5uYW1lIHx8IHR5cGVOYW1lXG4gIH1cblxuICByZXR1cm4gdHlwZU5hbWUgJiYgY2FsbFNpdGUuZ2V0TWV0aG9kTmFtZSgpXG4gICAgPyB0eXBlTmFtZSArICcuJyArIGZ1bmNOYW1lXG4gICAgOiBmdW5jTmFtZVxufVxuXG4vKipcbiAqIEZvcm1hdCBkZXByZWNhdGlvbiBtZXNzYWdlIHdpdGhvdXQgY29sb3IuXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0UGxhaW4gKG1zZywgY2FsbGVyLCBzdGFjaykge1xuICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG5cbiAgdmFyIGZvcm1hdHRlZCA9IHRpbWVzdGFtcCArXG4gICAgJyAnICsgdGhpcy5fbmFtZXNwYWNlICtcbiAgICAnIGRlcHJlY2F0ZWQgJyArIG1zZ1xuXG4gIC8vIGFkZCBzdGFjayB0cmFjZVxuICBpZiAodGhpcy5fdHJhY2VkKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkrKykge1xuICAgICAgZm9ybWF0dGVkICs9ICdcXG4gICAgYXQgJyArIHN0YWNrW2ldLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0dGVkXG4gIH1cblxuICBpZiAoY2FsbGVyKSB7XG4gICAgZm9ybWF0dGVkICs9ICcgYXQgJyArIGZvcm1hdExvY2F0aW9uKGNhbGxlcilcbiAgfVxuXG4gIHJldHVybiBmb3JtYXR0ZWRcbn1cblxuLyoqXG4gKiBGb3JtYXQgZGVwcmVjYXRpb24gbWVzc2FnZSB3aXRoIGNvbG9yLlxuICovXG5cbmZ1bmN0aW9uIGZvcm1hdENvbG9yIChtc2csIGNhbGxlciwgc3RhY2spIHtcbiAgdmFyIGZvcm1hdHRlZCA9ICdcXHgxYlszNjsxbScgKyB0aGlzLl9uYW1lc3BhY2UgKyAnXFx4MWJbMjI7MzltJyArIC8vIGJvbGQgY3lhblxuICAgICcgXFx4MWJbMzM7MW1kZXByZWNhdGVkXFx4MWJbMjI7MzltJyArIC8vIGJvbGQgeWVsbG93XG4gICAgJyBcXHgxYlswbScgKyBtc2cgKyAnXFx4MWJbMzltJyAvLyByZXNldFxuXG4gIC8vIGFkZCBzdGFjayB0cmFjZVxuICBpZiAodGhpcy5fdHJhY2VkKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkrKykge1xuICAgICAgZm9ybWF0dGVkICs9ICdcXG4gICAgXFx4MWJbMzZtYXQgJyArIHN0YWNrW2ldLnRvU3RyaW5nKCkgKyAnXFx4MWJbMzltJyAvLyBjeWFuXG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdHRlZFxuICB9XG5cbiAgaWYgKGNhbGxlcikge1xuICAgIGZvcm1hdHRlZCArPSAnIFxceDFiWzM2bScgKyBmb3JtYXRMb2NhdGlvbihjYWxsZXIpICsgJ1xceDFiWzM5bScgLy8gY3lhblxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlZFxufVxuXG4vKipcbiAqIEZvcm1hdCBjYWxsIHNpdGUgbG9jYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0TG9jYXRpb24gKGNhbGxTaXRlKSB7XG4gIHJldHVybiByZWxhdGl2ZShiYXNlUGF0aCwgY2FsbFNpdGVbMF0pICtcbiAgICAnOicgKyBjYWxsU2l0ZVsxXSArXG4gICAgJzonICsgY2FsbFNpdGVbMl1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YWNrIGFzIGFycmF5IG9mIGNhbGwgc2l0ZXMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0U3RhY2sgKCkge1xuICB2YXIgbGltaXQgPSBFcnJvci5zdGFja1RyYWNlTGltaXRcbiAgdmFyIG9iaiA9IHt9XG4gIHZhciBwcmVwID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2VcblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXBhcmVPYmplY3RTdGFja1RyYWNlXG4gIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IE1hdGgubWF4KDEwLCBsaW1pdClcblxuICAvLyBjYXB0dXJlIHRoZSBzdGFja1xuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvYmopXG5cbiAgLy8gc2xpY2UgdGhpcyBmdW5jdGlvbiBvZmYgdGhlIHRvcFxuICB2YXIgc3RhY2sgPSBvYmouc3RhY2suc2xpY2UoMSlcblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXBcbiAgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ID0gbGltaXRcblxuICByZXR1cm4gc3RhY2tcbn1cblxuLyoqXG4gKiBDYXB0dXJlIGNhbGwgc2l0ZSBzdGFjayBmcm9tIHY4LlxuICovXG5cbmZ1bmN0aW9uIHByZXBhcmVPYmplY3RTdGFja1RyYWNlIChvYmosIHN0YWNrKSB7XG4gIHJldHVybiBzdGFja1xufVxuXG4vKipcbiAqIFJldHVybiBhIHdyYXBwZWQgZnVuY3Rpb24gaW4gYSBkZXByZWNhdGlvbiBtZXNzYWdlLlxuICovXG5cbmZ1bmN0aW9uIHdyYXBmdW5jdGlvbiAoZm4sIG1lc3NhZ2UpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IGZuIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gIH1cblxuICB2YXIgYXJncyA9IGNyZWF0ZUFyZ3VtZW50c1N0cmluZyhmbi5sZW5ndGgpXG4gIHZhciBzdGFjayA9IGdldFN0YWNrKClcbiAgdmFyIHNpdGUgPSBjYWxsU2l0ZUxvY2F0aW9uKHN0YWNrWzFdKVxuXG4gIHNpdGUubmFtZSA9IGZuLm5hbWVcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgdmFyIGRlcHJlY2F0ZWRmbiA9IG5ldyBGdW5jdGlvbignZm4nLCAnbG9nJywgJ2RlcHJlY2F0ZScsICdtZXNzYWdlJywgJ3NpdGUnLFxuICAgICdcInVzZSBzdHJpY3RcIlxcbicgK1xuICAgICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBhcmdzICsgJykgeycgK1xuICAgICdsb2cuY2FsbChkZXByZWNhdGUsIG1lc3NhZ2UsIHNpdGUpXFxuJyArXG4gICAgJ3JldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXFxuJyArXG4gICAgJ30nKShmbiwgbG9nLCB0aGlzLCBtZXNzYWdlLCBzaXRlKVxuXG4gIHJldHVybiBkZXByZWNhdGVkZm5cbn1cblxuLyoqXG4gKiBXcmFwIHByb3BlcnR5IGluIGEgZGVwcmVjYXRpb24gbWVzc2FnZS5cbiAqL1xuXG5mdW5jdGlvbiB3cmFwcHJvcGVydHkgKG9iaiwgcHJvcCwgbWVzc2FnZSkge1xuICBpZiAoIW9iaiB8fCAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBvYmogbXVzdCBiZSBvYmplY3QnKVxuICB9XG5cbiAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcClcblxuICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdXN0IGNhbGwgcHJvcGVydHkgb24gb3duZXIgb2JqZWN0JylcbiAgfVxuXG4gIGlmICghZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcm9wZXJ0eSBtdXN0IGJlIGNvbmZpZ3VyYWJsZScpXG4gIH1cblxuICB2YXIgZGVwcmVjYXRlID0gdGhpc1xuICB2YXIgc3RhY2sgPSBnZXRTdGFjaygpXG4gIHZhciBzaXRlID0gY2FsbFNpdGVMb2NhdGlvbihzdGFja1sxXSlcblxuICAvLyBzZXQgc2l0ZSBuYW1lXG4gIHNpdGUubmFtZSA9IHByb3BcblxuICAvLyBjb252ZXJ0IGRhdGEgZGVzY3JpcHRvclxuICBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgZGVzY3JpcHRvciA9IGNvbnZlcnREYXRhRGVzY3JpcHRvclRvQWNjZXNzb3Iob2JqLCBwcm9wLCBtZXNzYWdlKVxuICB9XG5cbiAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0XG4gIHZhciBzZXQgPSBkZXNjcmlwdG9yLnNldFxuXG4gIC8vIHdyYXAgZ2V0dGVyXG4gIGlmICh0eXBlb2YgZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGVzY3JpcHRvci5nZXQgPSBmdW5jdGlvbiBnZXR0ZXIgKCkge1xuICAgICAgbG9nLmNhbGwoZGVwcmVjYXRlLCBtZXNzYWdlLCBzaXRlKVxuICAgICAgcmV0dXJuIGdldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgfVxuICB9XG5cbiAgLy8gd3JhcCBzZXR0ZXJcbiAgaWYgKHR5cGVvZiBzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZXNjcmlwdG9yLnNldCA9IGZ1bmN0aW9uIHNldHRlciAoKSB7XG4gICAgICBsb2cuY2FsbChkZXByZWNhdGUsIG1lc3NhZ2UsIHNpdGUpXG4gICAgICByZXR1cm4gc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjcmlwdG9yKVxufVxuXG4vKipcbiAqIENyZWF0ZSBEZXByZWNhdGlvbkVycm9yIGZvciBkZXByZWNhdGlvblxuICovXG5cbmZ1bmN0aW9uIERlcHJlY2F0aW9uRXJyb3IgKG5hbWVzcGFjZSwgbWVzc2FnZSwgc3RhY2spIHtcbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKClcbiAgdmFyIHN0YWNrU3RyaW5nXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnY29uc3RydWN0b3InLCB7XG4gICAgdmFsdWU6IERlcHJlY2F0aW9uRXJyb3JcbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICdtZXNzYWdlJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogbWVzc2FnZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ25hbWUnLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiAnRGVwcmVjYXRpb25FcnJvcicsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICduYW1lc3BhY2UnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBuYW1lc3BhY2UsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICdzdGFjaycsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc3RhY2tTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tTdHJpbmdcbiAgICAgIH1cblxuICAgICAgLy8gcHJlcGFyZSBzdGFjayB0cmFjZVxuICAgICAgcmV0dXJuIChzdGFja1N0cmluZyA9IGNyZWF0ZVN0YWNrU3RyaW5nLmNhbGwodGhpcywgc3RhY2spKVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXR0ZXIgKHZhbCkge1xuICAgICAgc3RhY2tTdHJpbmcgPSB2YWxcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGVycm9yXG59XG4iLCAiLyohXG4gKiBieXRlc1xuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTUgSmVkIFdhdHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gYnl0ZXM7XG5tb2R1bGUuZXhwb3J0cy5mb3JtYXQgPSBmb3JtYXQ7XG5tb2R1bGUuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBmb3JtYXRUaG91c2FuZHNSZWdFeHAgPSAvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZztcblxudmFyIGZvcm1hdERlY2ltYWxzUmVnRXhwID0gLyg/OlxcLjAqfChcXC5bXjBdKykwKykkLztcblxudmFyIG1hcCA9IHtcbiAgYjogIDEsXG4gIGtiOiAxIDw8IDEwLFxuICBtYjogMSA8PCAyMCxcbiAgZ2I6IDEgPDwgMzAsXG4gIHRiOiBNYXRoLnBvdygxMDI0LCA0KSxcbiAgcGI6IE1hdGgucG93KDEwMjQsIDUpLFxufTtcblxudmFyIHBhcnNlUmVnRXhwID0gL14oKC18XFwrKT8oXFxkKyg/OlxcLlxcZCspPykpICooa2J8bWJ8Z2J8dGJ8cGIpJC9pO1xuXG4vKipcbiAqIENvbnZlcnQgdGhlIGdpdmVuIHZhbHVlIGluIGJ5dGVzIGludG8gYSBzdHJpbmcgb3IgcGFyc2UgdG8gc3RyaW5nIHRvIGFuIGludGVnZXIgaW4gYnl0ZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHt7XG4gKiAgY2FzZTogW3N0cmluZ10sXG4gKiAgZGVjaW1hbFBsYWNlczogW251bWJlcl1cbiAqICBmaXhlZERlY2ltYWxzOiBbYm9vbGVhbl1cbiAqICB0aG91c2FuZHNTZXBhcmF0b3I6IFtzdHJpbmddXG4gKiAgdW5pdFNlcGFyYXRvcjogW3N0cmluZ11cbiAqICB9fSBbb3B0aW9uc10gYnl0ZXMgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfG51bWJlcnxudWxsfVxuICovXG5cbmZ1bmN0aW9uIGJ5dGVzKHZhbHVlLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbHVlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBGb3JtYXQgdGhlIGdpdmVuIHZhbHVlIGluIGJ5dGVzIGludG8gYSBzdHJpbmcuXG4gKlxuICogSWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLCBpdCBpcyBrZXB0IGFzIHN1Y2guIElmIGl0IGlzIGEgZmxvYXQsXG4gKiBpdCBpcyByb3VuZGVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmRlY2ltYWxQbGFjZXM9Ml1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5maXhlZERlY2ltYWxzPWZhbHNlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRob3VzYW5kc1NlcGFyYXRvcj1dXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudW5pdD1dXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudW5pdFNlcGFyYXRvcj1dXG4gKlxuICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYWcgPSBNYXRoLmFicyh2YWx1ZSk7XG4gIHZhciB0aG91c2FuZHNTZXBhcmF0b3IgPSAob3B0aW9ucyAmJiBvcHRpb25zLnRob3VzYW5kc1NlcGFyYXRvcikgfHwgJyc7XG4gIHZhciB1bml0U2VwYXJhdG9yID0gKG9wdGlvbnMgJiYgb3B0aW9ucy51bml0U2VwYXJhdG9yKSB8fCAnJztcbiAgdmFyIGRlY2ltYWxQbGFjZXMgPSAob3B0aW9ucyAmJiBvcHRpb25zLmRlY2ltYWxQbGFjZXMgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmRlY2ltYWxQbGFjZXMgOiAyO1xuICB2YXIgZml4ZWREZWNpbWFscyA9IEJvb2xlYW4ob3B0aW9ucyAmJiBvcHRpb25zLmZpeGVkRGVjaW1hbHMpO1xuICB2YXIgdW5pdCA9IChvcHRpb25zICYmIG9wdGlvbnMudW5pdCkgfHwgJyc7XG5cbiAgaWYgKCF1bml0IHx8ICFtYXBbdW5pdC50b0xvd2VyQ2FzZSgpXSkge1xuICAgIGlmIChtYWcgPj0gbWFwLnBiKSB7XG4gICAgICB1bml0ID0gJ1BCJztcbiAgICB9IGVsc2UgaWYgKG1hZyA+PSBtYXAudGIpIHtcbiAgICAgIHVuaXQgPSAnVEInO1xuICAgIH0gZWxzZSBpZiAobWFnID49IG1hcC5nYikge1xuICAgICAgdW5pdCA9ICdHQic7XG4gICAgfSBlbHNlIGlmIChtYWcgPj0gbWFwLm1iKSB7XG4gICAgICB1bml0ID0gJ01CJztcbiAgICB9IGVsc2UgaWYgKG1hZyA+PSBtYXAua2IpIHtcbiAgICAgIHVuaXQgPSAnS0InO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bml0ID0gJ0InO1xuICAgIH1cbiAgfVxuXG4gIHZhciB2YWwgPSB2YWx1ZSAvIG1hcFt1bml0LnRvTG93ZXJDYXNlKCldO1xuICB2YXIgc3RyID0gdmFsLnRvRml4ZWQoZGVjaW1hbFBsYWNlcyk7XG5cbiAgaWYgKCFmaXhlZERlY2ltYWxzKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoZm9ybWF0RGVjaW1hbHNSZWdFeHAsICckMScpO1xuICB9XG5cbiAgaWYgKHRob3VzYW5kc1NlcGFyYXRvcikge1xuICAgIHN0ciA9IHN0ci5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAocywgaSkge1xuICAgICAgcmV0dXJuIGkgPT09IDBcbiAgICAgICAgPyBzLnJlcGxhY2UoZm9ybWF0VGhvdXNhbmRzUmVnRXhwLCB0aG91c2FuZHNTZXBhcmF0b3IpXG4gICAgICAgIDogc1xuICAgIH0pLmpvaW4oJy4nKTtcbiAgfVxuXG4gIHJldHVybiBzdHIgKyB1bml0U2VwYXJhdG9yICsgdW5pdDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgc3RyaW5nIHZhbHVlIGludG8gYW4gaW50ZWdlciBpbiBieXRlcy5cbiAqXG4gKiBJZiBubyB1bml0IGlzIGdpdmVuLCBpdCBpcyBhc3N1bWVkIHRoZSB2YWx1ZSBpcyBpbiBieXRlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbFxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ8bnVsbH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZSh2YWwpIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmICFpc05hTih2YWwpKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gVGVzdCBpZiB0aGUgc3RyaW5nIHBhc3NlZCBpcyB2YWxpZFxuICB2YXIgcmVzdWx0cyA9IHBhcnNlUmVnRXhwLmV4ZWModmFsKTtcbiAgdmFyIGZsb2F0VmFsdWU7XG4gIHZhciB1bml0ID0gJ2InO1xuXG4gIGlmICghcmVzdWx0cykge1xuICAgIC8vIE5vdGhpbmcgY291bGQgYmUgZXh0cmFjdGVkIGZyb20gdGhlIGdpdmVuIHN0cmluZ1xuICAgIGZsb2F0VmFsdWUgPSBwYXJzZUludCh2YWwsIDEwKTtcbiAgICB1bml0ID0gJ2InXG4gIH0gZWxzZSB7XG4gICAgLy8gUmV0cmlldmUgdGhlIHZhbHVlIGFuZCB0aGUgdW5pdFxuICAgIGZsb2F0VmFsdWUgPSBwYXJzZUZsb2F0KHJlc3VsdHNbMV0pO1xuICAgIHVuaXQgPSByZXN1bHRzWzRdLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBpZiAoaXNOYU4oZmxvYXRWYWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKG1hcFt1bml0XSAqIGZsb2F0VmFsdWUpO1xufVxuIiwgIi8qIVxuICogY29udGVudC10eXBlXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoICooIFwiO1wiIHBhcmFtZXRlciApIGluIFJGQyA3MjMxIHNlYyAzLjEuMS4xXG4gKlxuICogcGFyYW1ldGVyICAgICA9IHRva2VuIFwiPVwiICggdG9rZW4gLyBxdW90ZWQtc3RyaW5nIClcbiAqIHRva2VuICAgICAgICAgPSAxKnRjaGFyXG4gKiB0Y2hhciAgICAgICAgID0gXCIhXCIgLyBcIiNcIiAvIFwiJFwiIC8gXCIlXCIgLyBcIiZcIiAvIFwiJ1wiIC8gXCIqXCJcbiAqICAgICAgICAgICAgICAgLyBcIitcIiAvIFwiLVwiIC8gXCIuXCIgLyBcIl5cIiAvIFwiX1wiIC8gXCJgXCIgLyBcInxcIiAvIFwiflwiXG4gKiAgICAgICAgICAgICAgIC8gRElHSVQgLyBBTFBIQVxuICogICAgICAgICAgICAgICA7IGFueSBWQ0hBUiwgZXhjZXB0IGRlbGltaXRlcnNcbiAqIHF1b3RlZC1zdHJpbmcgPSBEUVVPVEUgKiggcWR0ZXh0IC8gcXVvdGVkLXBhaXIgKSBEUVVPVEVcbiAqIHFkdGV4dCAgICAgICAgPSBIVEFCIC8gU1AgLyAleDIxIC8gJXgyMy01QiAvICV4NUQtN0UgLyBvYnMtdGV4dFxuICogb2JzLXRleHQgICAgICA9ICV4ODAtRkZcbiAqIHF1b3RlZC1wYWlyICAgPSBcIlxcXCIgKCBIVEFCIC8gU1AgLyBWQ0hBUiAvIG9icy10ZXh0IClcbiAqL1xudmFyIFBBUkFNX1JFR0VYUCA9IC87ICooWyEjJCUmJyorLl5fYHx+MC05QS1aYS16LV0rKSAqPSAqKFwiKD86W1xcdTAwMGJcXHUwMDIwXFx1MDAyMVxcdTAwMjMtXFx1MDA1YlxcdTAwNWQtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl18XFxcXFtcXHUwMDBiXFx1MDAyMC1cXHUwMGZmXSkqXCJ8WyEjJCUmJyorLl5fYHx+MC05QS1aYS16LV0rKSAqL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG52YXIgVEVYVF9SRUdFWFAgPSAvXltcXHUwMDBiXFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbnZhciBUT0tFTl9SRUdFWFAgPSAvXlshIyQlJicqKy5eX2B8fjAtOUEtWmEtei1dKyQvXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHF1b3RlZC1wYWlyIGluIFJGQyA3MjMwIHNlYyAzLjIuNlxuICpcbiAqIHF1b3RlZC1wYWlyID0gXCJcXFwiICggSFRBQiAvIFNQIC8gVkNIQVIgLyBvYnMtdGV4dCApXG4gKiBvYnMtdGV4dCAgICA9ICV4ODAtRkZcbiAqL1xudmFyIFFFU0NfUkVHRVhQID0gL1xcXFwoW1xcdTAwMGJcXHUwMDIwLVxcdTAwZmZdKS9nIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBjaGFycyB0aGF0IG11c3QgYmUgcXVvdGVkLXBhaXIgaW4gUkZDIDcyMzAgc2VjIDMuMi42XG4gKi9cbnZhciBRVU9URV9SRUdFWFAgPSAvKFtcXFxcXCJdKS9nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHR5cGUgaW4gUkZDIDcyMzEgc2VjIDMuMS4xLjFcbiAqXG4gKiBtZWRpYS10eXBlID0gdHlwZSBcIi9cIiBzdWJ0eXBlXG4gKiB0eXBlICAgICAgID0gdG9rZW5cbiAqIHN1YnR5cGUgICAgPSB0b2tlblxuICovXG52YXIgVFlQRV9SRUdFWFAgPSAvXlshIyQlJicqKy5eX2B8fjAtOUEtWmEtei1dK1xcL1shIyQlJicqKy5eX2B8fjAtOUEtWmEtei1dKyQvXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxuZXhwb3J0cy5mb3JtYXQgPSBmb3JtYXRcbmV4cG9ydHMucGFyc2UgPSBwYXJzZVxuXG4vKipcbiAqIEZvcm1hdCBvYmplY3QgdG8gbWVkaWEgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0IChvYmopIHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBvYmogaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgdmFyIHBhcmFtZXRlcnMgPSBvYmoucGFyYW1ldGVyc1xuICB2YXIgdHlwZSA9IG9iai50eXBlXG5cbiAgaWYgKCF0eXBlIHx8ICFUWVBFX1JFR0VYUC50ZXN0KHR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCB0eXBlJylcbiAgfVxuXG4gIHZhciBzdHJpbmcgPSB0eXBlXG5cbiAgLy8gYXBwZW5kIHBhcmFtZXRlcnNcbiAgaWYgKHBhcmFtZXRlcnMgJiYgdHlwZW9mIHBhcmFtZXRlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHBhcmFtXG4gICAgdmFyIHBhcmFtcyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLnNvcnQoKVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhcmFtID0gcGFyYW1zW2ldXG5cbiAgICAgIGlmICghVE9LRU5fUkVHRVhQLnRlc3QocGFyYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIG5hbWUnKVxuICAgICAgfVxuXG4gICAgICBzdHJpbmcgKz0gJzsgJyArIHBhcmFtICsgJz0nICsgcXN0cmluZyhwYXJhbWV0ZXJzW3BhcmFtXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyaW5nXG59XG5cbi8qKlxuICogUGFyc2UgbWVkaWEgdHlwZSB0byBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBzdHJpbmdcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZSAoc3RyaW5nKSB7XG4gIGlmICghc3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyaW5nIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIHN1cHBvcnQgcmVxL3Jlcy1saWtlIG9iamVjdHMgYXMgYXJndW1lbnRcbiAgdmFyIGhlYWRlciA9IHR5cGVvZiBzdHJpbmcgPT09ICdvYmplY3QnXG4gICAgPyBnZXRjb250ZW50dHlwZShzdHJpbmcpXG4gICAgOiBzdHJpbmdcblxuICBpZiAodHlwZW9mIGhlYWRlciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzdHJpbmcgaXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcnKVxuICB9XG5cbiAgdmFyIGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzsnKVxuICB2YXIgdHlwZSA9IGluZGV4ICE9PSAtMVxuICAgID8gaGVhZGVyLnNsaWNlKDAsIGluZGV4KS50cmltKClcbiAgICA6IGhlYWRlci50cmltKClcblxuICBpZiAoIVRZUEVfUkVHRVhQLnRlc3QodHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIG1lZGlhIHR5cGUnKVxuICB9XG5cbiAgdmFyIG9iaiA9IG5ldyBDb250ZW50VHlwZSh0eXBlLnRvTG93ZXJDYXNlKCkpXG5cbiAgLy8gcGFyc2UgcGFyYW1ldGVyc1xuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgdmFyIGtleVxuICAgIHZhciBtYXRjaFxuICAgIHZhciB2YWx1ZVxuXG4gICAgUEFSQU1fUkVHRVhQLmxhc3RJbmRleCA9IGluZGV4XG5cbiAgICB3aGlsZSAoKG1hdGNoID0gUEFSQU1fUkVHRVhQLmV4ZWMoaGVhZGVyKSkpIHtcbiAgICAgIGlmIChtYXRjaC5pbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgZm9ybWF0JylcbiAgICAgIH1cblxuICAgICAgaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICBrZXkgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgICB2YWx1ZSA9IG1hdGNoWzJdXG5cbiAgICAgIGlmICh2YWx1ZS5jaGFyQ29kZUF0KDApID09PSAweDIyIC8qIFwiICovKSB7XG4gICAgICAgIC8vIHJlbW92ZSBxdW90ZXNcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxLCAtMSlcblxuICAgICAgICAvLyByZW1vdmUgZXNjYXBlc1xuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignXFxcXCcpICE9PSAtMSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShRRVNDX1JFR0VYUCwgJyQxJylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmoucGFyYW1ldGVyc1trZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT09IGhlYWRlci5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIGZvcm1hdCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG4vKipcbiAqIEdldCBjb250ZW50LXR5cGUgZnJvbSByZXEvcmVzIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldGNvbnRlbnR0eXBlIChvYmopIHtcbiAgdmFyIGhlYWRlclxuXG4gIGlmICh0eXBlb2Ygb2JqLmdldEhlYWRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIHJlcy1saWtlXG4gICAgaGVhZGVyID0gb2JqLmdldEhlYWRlcignY29udGVudC10eXBlJylcbiAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqLmhlYWRlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gcmVxLWxpa2VcbiAgICBoZWFkZXIgPSBvYmouaGVhZGVycyAmJiBvYmouaGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgfVxuXG4gIGlmICh0eXBlb2YgaGVhZGVyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvbnRlbnQtdHlwZSBoZWFkZXIgaXMgbWlzc2luZyBmcm9tIG9iamVjdCcpXG4gIH1cblxuICByZXR1cm4gaGVhZGVyXG59XG5cbi8qKlxuICogUXVvdGUgYSBzdHJpbmcgaWYgbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcXN0cmluZyAodmFsKSB7XG4gIHZhciBzdHIgPSBTdHJpbmcodmFsKVxuXG4gIC8vIG5vIG5lZWQgdG8gcXVvdGUgdG9rZW5zXG4gIGlmIChUT0tFTl9SRUdFWFAudGVzdChzdHIpKSB7XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgaWYgKHN0ci5sZW5ndGggPiAwICYmICFURVhUX1JFR0VYUC50ZXN0KHN0cikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHBhcmFtZXRlciB2YWx1ZScpXG4gIH1cblxuICByZXR1cm4gJ1wiJyArIHN0ci5yZXBsYWNlKFFVT1RFX1JFR0VYUCwgJ1xcXFwkMScpICsgJ1wiJ1xufVxuXG4vKipcbiAqIENsYXNzIHRvIHJlcHJlc2VudCBhIGNvbnRlbnQgdHlwZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIENvbnRlbnRUeXBlICh0eXBlKSB7XG4gIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgdGhpcy50eXBlID0gdHlwZVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuLyogZXNsaW50IG5vLXByb3RvOiAwICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSA/IHNldFByb3RvT2YgOiBtaXhpblByb3BlcnRpZXMpXG5cbmZ1bmN0aW9uIHNldFByb3RvT2YgKG9iaiwgcHJvdG8pIHtcbiAgb2JqLl9fcHJvdG9fXyA9IHByb3RvXG4gIHJldHVybiBvYmpcbn1cblxuZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzIChvYmosIHByb3RvKSB7XG4gIGZvciAodmFyIHByb3AgaW4gcHJvdG8pIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSB7XG4gICAgICBvYmpbcHJvcF0gPSBwcm90b1twcm9wXVxuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqXG59XG4iLCAiLyohXG4gKiBzdGF0dXNlc1xuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGNvZGVzID0gcmVxdWlyZSgnLi9jb2Rlcy5qc29uJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YXR1c1xuXG4vLyBzdGF0dXMgY29kZSB0byBtZXNzYWdlIG1hcFxuc3RhdHVzLm1lc3NhZ2UgPSBjb2Rlc1xuXG4vLyBzdGF0dXMgbWVzc2FnZSAobG93ZXItY2FzZSkgdG8gY29kZSBtYXBcbnN0YXR1cy5jb2RlID0gY3JlYXRlTWVzc2FnZVRvU3RhdHVzQ29kZU1hcChjb2RlcylcblxuLy8gYXJyYXkgb2Ygc3RhdHVzIGNvZGVzXG5zdGF0dXMuY29kZXMgPSBjcmVhdGVTdGF0dXNDb2RlTGlzdChjb2RlcylcblxuLy8gc3RhdHVzIGNvZGVzIGZvciByZWRpcmVjdHNcbnN0YXR1cy5yZWRpcmVjdCA9IHtcbiAgMzAwOiB0cnVlLFxuICAzMDE6IHRydWUsXG4gIDMwMjogdHJ1ZSxcbiAgMzAzOiB0cnVlLFxuICAzMDU6IHRydWUsXG4gIDMwNzogdHJ1ZSxcbiAgMzA4OiB0cnVlXG59XG5cbi8vIHN0YXR1cyBjb2RlcyBmb3IgZW1wdHkgYm9kaWVzXG5zdGF0dXMuZW1wdHkgPSB7XG4gIDIwNDogdHJ1ZSxcbiAgMjA1OiB0cnVlLFxuICAzMDQ6IHRydWVcbn1cblxuLy8gc3RhdHVzIGNvZGVzIGZvciB3aGVuIHlvdSBzaG91bGQgcmV0cnkgdGhlIHJlcXVlc3RcbnN0YXR1cy5yZXRyeSA9IHtcbiAgNTAyOiB0cnVlLFxuICA1MDM6IHRydWUsXG4gIDUwNDogdHJ1ZVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG1hcCBvZiBtZXNzYWdlIHRvIHN0YXR1cyBjb2RlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlVG9TdGF0dXNDb2RlTWFwIChjb2Rlcykge1xuICB2YXIgbWFwID0ge31cblxuICBPYmplY3Qua2V5cyhjb2RlcykuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoQ29kZSAoY29kZSkge1xuICAgIHZhciBtZXNzYWdlID0gY29kZXNbY29kZV1cbiAgICB2YXIgc3RhdHVzID0gTnVtYmVyKGNvZGUpXG5cbiAgICAvLyBwb3B1bGF0ZSBtYXBcbiAgICBtYXBbbWVzc2FnZS50b0xvd2VyQ2FzZSgpXSA9IHN0YXR1c1xuICB9KVxuXG4gIHJldHVybiBtYXBcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBsaXN0IG9mIGFsbCBzdGF0dXMgY29kZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVN0YXR1c0NvZGVMaXN0IChjb2Rlcykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29kZXMpLm1hcChmdW5jdGlvbiBtYXBDb2RlIChjb2RlKSB7XG4gICAgcmV0dXJuIE51bWJlcihjb2RlKVxuICB9KVxufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdHVzIGNvZGUgZm9yIGdpdmVuIG1lc3NhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldFN0YXR1c0NvZGUgKG1lc3NhZ2UpIHtcbiAgdmFyIG1zZyA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXR1cy5jb2RlLCBtc2cpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YXR1cyBtZXNzYWdlOiBcIicgKyBtZXNzYWdlICsgJ1wiJylcbiAgfVxuXG4gIHJldHVybiBzdGF0dXMuY29kZVttc2ddXG59XG5cbi8qKlxuICogR2V0IHRoZSBzdGF0dXMgbWVzc2FnZSBmb3IgZ2l2ZW4gY29kZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0U3RhdHVzTWVzc2FnZSAoY29kZSkge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzdGF0dXMubWVzc2FnZSwgY29kZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdHVzIGNvZGU6ICcgKyBjb2RlKVxuICB9XG5cbiAgcmV0dXJuIHN0YXR1cy5tZXNzYWdlW2NvZGVdXG59XG5cbi8qKlxuICogR2V0IHRoZSBzdGF0dXMgY29kZS5cbiAqXG4gKiBHaXZlbiBhIG51bWJlciwgdGhpcyB3aWxsIHRocm93IGlmIGl0IGlzIG5vdCBhIGtub3duIHN0YXR1c1xuICogY29kZSwgb3RoZXJ3aXNlIHRoZSBjb2RlIHdpbGwgYmUgcmV0dXJuZWQuIEdpdmVuIGEgc3RyaW5nLFxuICogdGhlIHN0cmluZyB3aWxsIGJlIHBhcnNlZCBmb3IgYSBudW1iZXIgYW5kIHJldHVybiB0aGUgY29kZVxuICogaWYgdmFsaWQsIG90aGVyd2lzZSB3aWxsIGxvb2t1cCB0aGUgY29kZSBhc3N1bWluZyB0aGlzIGlzXG4gKiB0aGUgc3RhdHVzIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBjb2RlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHN0YXR1cyAoY29kZSkge1xuICBpZiAodHlwZW9mIGNvZGUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGdldFN0YXR1c01lc3NhZ2UoY29kZSlcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29kZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb2RlIG11c3QgYmUgYSBudW1iZXIgb3Igc3RyaW5nJylcbiAgfVxuXG4gIC8vICc0MDMnXG4gIHZhciBuID0gcGFyc2VJbnQoY29kZSwgMTApXG4gIGlmICghaXNOYU4obikpIHtcbiAgICByZXR1cm4gZ2V0U3RhdHVzTWVzc2FnZShuKVxuICB9XG5cbiAgcmV0dXJuIGdldFN0YXR1c0NvZGUoY29kZSlcbn1cbiIsICJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLCAidHJ5IHtcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICh0eXBlb2YgdXRpbC5pbmhlcml0cyAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgJyc7XG4gIG1vZHVsZS5leHBvcnRzID0gdXRpbC5pbmhlcml0cztcbn0gY2F0Y2ggKGUpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2luaGVyaXRzX2Jyb3dzZXIuanMnKTtcbn1cbiIsICIvKiFcbiAqIHRvaWRlbnRpZmllclxuICogQ29weXJpZ2h0KGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdG9JZGVudGlmaWVyXG5cbi8qKlxuICogVHJhc2Zvcm0gdGhlIGdpdmVuIHN0cmluZyBpbnRvIGEgSmF2YVNjcmlwdCBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB0b0lkZW50aWZpZXIgKHN0cikge1xuICByZXR1cm4gc3RyXG4gICAgLnNwbGl0KCcgJylcbiAgICAubWFwKGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgcmV0dXJuIHRva2VuLnNsaWNlKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB0b2tlbi5zbGljZSgxKVxuICAgIH0pXG4gICAgLmpvaW4oJycpXG4gICAgLnJlcGxhY2UoL1teIF8wLTlhLXpdL2dpLCAnJylcbn1cbiIsICIvKiFcbiAqIGh0dHAtZXJyb3JzXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGVwcmVjYXRlID0gcmVxdWlyZSgnZGVwZCcpKCdodHRwLWVycm9ycycpXG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCdzZXRwcm90b3R5cGVvZicpXG52YXIgc3RhdHVzZXMgPSByZXF1aXJlKCdzdGF0dXNlcycpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgdG9JZGVudGlmaWVyID0gcmVxdWlyZSgndG9pZGVudGlmaWVyJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUVycm9yXG5tb2R1bGUuZXhwb3J0cy5IdHRwRXJyb3IgPSBjcmVhdGVIdHRwRXJyb3JDb25zdHJ1Y3RvcigpXG5tb2R1bGUuZXhwb3J0cy5pc0h0dHBFcnJvciA9IGNyZWF0ZUlzSHR0cEVycm9yRnVuY3Rpb24obW9kdWxlLmV4cG9ydHMuSHR0cEVycm9yKVxuXG4vLyBQb3B1bGF0ZSBleHBvcnRzIGZvciBhbGwgY29uc3RydWN0b3JzXG5wb3B1bGF0ZUNvbnN0cnVjdG9yRXhwb3J0cyhtb2R1bGUuZXhwb3J0cywgc3RhdHVzZXMuY29kZXMsIG1vZHVsZS5leHBvcnRzLkh0dHBFcnJvcilcblxuLyoqXG4gKiBHZXQgdGhlIGNvZGUgY2xhc3Mgb2YgYSBzdGF0dXMgY29kZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29kZUNsYXNzIChzdGF0dXMpIHtcbiAgcmV0dXJuIE51bWJlcihTdHJpbmcoc3RhdHVzKS5jaGFyQXQoMCkgKyAnMDAnKVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBIVFRQIEVycm9yLlxuICpcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFcnJvciAoKSB7XG4gIC8vIHNvIG11Y2ggYXJpdHkgZ29pbmcgb24gfl9+XG4gIHZhciBlcnJcbiAgdmFyIG1zZ1xuICB2YXIgc3RhdHVzID0gNTAwXG4gIHZhciBwcm9wcyA9IHt9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXVxuICAgIHZhciB0eXBlID0gdHlwZW9mIGFyZ1xuICAgIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiBhcmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgZXJyID0gYXJnXG4gICAgICBzdGF0dXMgPSBlcnIuc3RhdHVzIHx8IGVyci5zdGF0dXNDb2RlIHx8IHN0YXR1c1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaSA9PT0gMCkge1xuICAgICAgc3RhdHVzID0gYXJnXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgbXNnID0gYXJnXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgcHJvcHMgPSBhcmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgIycgKyAoaSArIDEpICsgJyB1bnN1cHBvcnRlZCB0eXBlICcgKyB0eXBlKVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJyAmJiAoc3RhdHVzIDwgNDAwIHx8IHN0YXR1cyA+PSA2MDApKSB7XG4gICAgZGVwcmVjYXRlKCdub24tZXJyb3Igc3RhdHVzIGNvZGU7IHVzZSBvbmx5IDR4eCBvciA1eHggc3RhdHVzIGNvZGVzJylcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RhdHVzICE9PSAnbnVtYmVyJyB8fFxuICAgICghc3RhdHVzZXMubWVzc2FnZVtzdGF0dXNdICYmIChzdGF0dXMgPCA0MDAgfHwgc3RhdHVzID49IDYwMCkpKSB7XG4gICAgc3RhdHVzID0gNTAwXG4gIH1cblxuICAvLyBjb25zdHJ1Y3RvclxuICB2YXIgSHR0cEVycm9yID0gY3JlYXRlRXJyb3Jbc3RhdHVzXSB8fCBjcmVhdGVFcnJvcltjb2RlQ2xhc3Moc3RhdHVzKV1cblxuICBpZiAoIWVycikge1xuICAgIC8vIGNyZWF0ZSBlcnJvclxuICAgIGVyciA9IEh0dHBFcnJvclxuICAgICAgPyBuZXcgSHR0cEVycm9yKG1zZylcbiAgICAgIDogbmV3IEVycm9yKG1zZyB8fCBzdGF0dXNlcy5tZXNzYWdlW3N0YXR1c10pXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyLCBjcmVhdGVFcnJvcilcbiAgfVxuXG4gIGlmICghSHR0cEVycm9yIHx8ICEoZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yKSB8fCBlcnIuc3RhdHVzICE9PSBzdGF0dXMpIHtcbiAgICAvLyBhZGQgcHJvcGVydGllcyB0byBnZW5lcmljIGVycm9yXG4gICAgZXJyLmV4cG9zZSA9IHN0YXR1cyA8IDUwMFxuICAgIGVyci5zdGF0dXMgPSBlcnIuc3RhdHVzQ29kZSA9IHN0YXR1c1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKGtleSAhPT0gJ3N0YXR1cycgJiYga2V5ICE9PSAnc3RhdHVzQ29kZScpIHtcbiAgICAgIGVycltrZXldID0gcHJvcHNba2V5XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJcbn1cblxuLyoqXG4gKiBDcmVhdGUgSFRUUCBlcnJvciBhYnN0cmFjdCBiYXNlIGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVIdHRwRXJyb3JDb25zdHJ1Y3RvciAoKSB7XG4gIGZ1bmN0aW9uIEh0dHBFcnJvciAoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IGNvbnN0cnVjdCBhYnN0cmFjdCBjbGFzcycpXG4gIH1cblxuICBpbmhlcml0cyhIdHRwRXJyb3IsIEVycm9yKVxuXG4gIHJldHVybiBIdHRwRXJyb3Jcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBjb25zdHJ1Y3RvciBmb3IgYSBjbGllbnQgZXJyb3IuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudEVycm9yQ29uc3RydWN0b3IgKEh0dHBFcnJvciwgbmFtZSwgY29kZSkge1xuICB2YXIgY2xhc3NOYW1lID0gdG9DbGFzc05hbWUobmFtZSlcblxuICBmdW5jdGlvbiBDbGllbnRFcnJvciAobWVzc2FnZSkge1xuICAgIC8vIGNyZWF0ZSB0aGUgZXJyb3Igb2JqZWN0XG4gICAgdmFyIG1zZyA9IG1lc3NhZ2UgIT0gbnVsbCA/IG1lc3NhZ2UgOiBzdGF0dXNlcy5tZXNzYWdlW2NvZGVdXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpXG5cbiAgICAvLyBjYXB0dXJlIGEgc3RhY2sgdHJhY2UgdG8gdGhlIGNvbnN0cnVjdGlvbiBwb2ludFxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgQ2xpZW50RXJyb3IpXG5cbiAgICAvLyBhZGp1c3QgdGhlIFtbUHJvdG90eXBlXV1cbiAgICBzZXRQcm90b3R5cGVPZihlcnIsIENsaWVudEVycm9yLnByb3RvdHlwZSlcblxuICAgIC8vIHJlZGVmaW5lIHRoZSBlcnJvciBtZXNzYWdlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ21lc3NhZ2UnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IG1zZyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSlcblxuICAgIC8vIHJlZGVmaW5lIHRoZSBlcnJvciBuYW1lXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ25hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBjbGFzc05hbWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pXG5cbiAgICByZXR1cm4gZXJyXG4gIH1cblxuICBpbmhlcml0cyhDbGllbnRFcnJvciwgSHR0cEVycm9yKVxuICBuYW1lRnVuYyhDbGllbnRFcnJvciwgY2xhc3NOYW1lKVxuXG4gIENsaWVudEVycm9yLnByb3RvdHlwZS5zdGF0dXMgPSBjb2RlXG4gIENsaWVudEVycm9yLnByb3RvdHlwZS5zdGF0dXNDb2RlID0gY29kZVxuICBDbGllbnRFcnJvci5wcm90b3R5cGUuZXhwb3NlID0gdHJ1ZVxuXG4gIHJldHVybiBDbGllbnRFcnJvclxufVxuXG4vKipcbiAqIENyZWF0ZSBmdW5jdGlvbiB0byB0ZXN0IGlzIGEgdmFsdWUgaXMgYSBIdHRwRXJyb3IuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUlzSHR0cEVycm9yRnVuY3Rpb24gKEh0dHBFcnJvcikge1xuICByZXR1cm4gZnVuY3Rpb24gaXNIdHRwRXJyb3IgKHZhbCkge1xuICAgIGlmICghdmFsIHx8IHR5cGVvZiB2YWwgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgSHR0cEVycm9yKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiB2YWwgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgdHlwZW9mIHZhbC5leHBvc2UgPT09ICdib29sZWFuJyAmJlxuICAgICAgdHlwZW9mIHZhbC5zdGF0dXNDb2RlID09PSAnbnVtYmVyJyAmJiB2YWwuc3RhdHVzID09PSB2YWwuc3RhdHVzQ29kZVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY29uc3RydWN0b3IgZm9yIGEgc2VydmVyIGVycm9yLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTZXJ2ZXJFcnJvckNvbnN0cnVjdG9yIChIdHRwRXJyb3IsIG5hbWUsIGNvZGUpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHRvQ2xhc3NOYW1lKG5hbWUpXG5cbiAgZnVuY3Rpb24gU2VydmVyRXJyb3IgKG1lc3NhZ2UpIHtcbiAgICAvLyBjcmVhdGUgdGhlIGVycm9yIG9iamVjdFxuICAgIHZhciBtc2cgPSBtZXNzYWdlICE9IG51bGwgPyBtZXNzYWdlIDogc3RhdHVzZXMubWVzc2FnZVtjb2RlXVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IobXNnKVxuXG4gICAgLy8gY2FwdHVyZSBhIHN0YWNrIHRyYWNlIHRvIHRoZSBjb25zdHJ1Y3Rpb24gcG9pbnRcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIFNlcnZlckVycm9yKVxuXG4gICAgLy8gYWRqdXN0IHRoZSBbW1Byb3RvdHlwZV1dXG4gICAgc2V0UHJvdG90eXBlT2YoZXJyLCBTZXJ2ZXJFcnJvci5wcm90b3R5cGUpXG5cbiAgICAvLyByZWRlZmluZSB0aGUgZXJyb3IgbWVzc2FnZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsICdtZXNzYWdlJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBtc2csXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pXG5cbiAgICAvLyByZWRlZmluZSB0aGUgZXJyb3IgbmFtZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsICduYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogY2xhc3NOYW1lLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KVxuXG4gICAgcmV0dXJuIGVyclxuICB9XG5cbiAgaW5oZXJpdHMoU2VydmVyRXJyb3IsIEh0dHBFcnJvcilcbiAgbmFtZUZ1bmMoU2VydmVyRXJyb3IsIGNsYXNzTmFtZSlcblxuICBTZXJ2ZXJFcnJvci5wcm90b3R5cGUuc3RhdHVzID0gY29kZVxuICBTZXJ2ZXJFcnJvci5wcm90b3R5cGUuc3RhdHVzQ29kZSA9IGNvZGVcbiAgU2VydmVyRXJyb3IucHJvdG90eXBlLmV4cG9zZSA9IGZhbHNlXG5cbiAgcmV0dXJuIFNlcnZlckVycm9yXG59XG5cbi8qKlxuICogU2V0IHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24sIGlmIHBvc3NpYmxlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBuYW1lRnVuYyAoZnVuYywgbmFtZSkge1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZnVuYywgJ25hbWUnKVxuXG4gIGlmIChkZXNjICYmIGRlc2MuY29uZmlndXJhYmxlKSB7XG4gICAgZGVzYy52YWx1ZSA9IG5hbWVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuYywgJ25hbWUnLCBkZXNjKVxuICB9XG59XG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGV4cG9ydHMgb2JqZWN0IHdpdGggY29uc3RydWN0b3JzIGZvciBldmVyeSBlcnJvciBjbGFzcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcG9wdWxhdGVDb25zdHJ1Y3RvckV4cG9ydHMgKGV4cG9ydHMsIGNvZGVzLCBIdHRwRXJyb3IpIHtcbiAgY29kZXMuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoQ29kZSAoY29kZSkge1xuICAgIHZhciBDb2RlRXJyb3JcbiAgICB2YXIgbmFtZSA9IHRvSWRlbnRpZmllcihzdGF0dXNlcy5tZXNzYWdlW2NvZGVdKVxuXG4gICAgc3dpdGNoIChjb2RlQ2xhc3MoY29kZSkpIHtcbiAgICAgIGNhc2UgNDAwOlxuICAgICAgICBDb2RlRXJyb3IgPSBjcmVhdGVDbGllbnRFcnJvckNvbnN0cnVjdG9yKEh0dHBFcnJvciwgbmFtZSwgY29kZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgNTAwOlxuICAgICAgICBDb2RlRXJyb3IgPSBjcmVhdGVTZXJ2ZXJFcnJvckNvbnN0cnVjdG9yKEh0dHBFcnJvciwgbmFtZSwgY29kZSlcbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoQ29kZUVycm9yKSB7XG4gICAgICAvLyBleHBvcnQgdGhlIGNvbnN0cnVjdG9yXG4gICAgICBleHBvcnRzW2NvZGVdID0gQ29kZUVycm9yXG4gICAgICBleHBvcnRzW25hbWVdID0gQ29kZUVycm9yXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIEdldCBhIGNsYXNzIG5hbWUgZnJvbSBhIG5hbWUgaWRlbnRpZmllci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdG9DbGFzc05hbWUgKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUuc3Vic3RyKC01KSAhPT0gJ0Vycm9yJ1xuICAgID8gbmFtZSArICdFcnJvcidcbiAgICA6IG5hbWVcbn1cbiIsICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oKD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICBpZiAobXMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtcyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgcmV0dXJuIHBsdXJhbChtcywgZCwgJ2RheScpIHx8XG4gICAgcGx1cmFsKG1zLCBoLCAnaG91cicpIHx8XG4gICAgcGx1cmFsKG1zLCBtLCAnbWludXRlJykgfHxcbiAgICBwbHVyYWwobXMsIHMsICdzZWNvbmQnKSB8fFxuICAgIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBuLCBuYW1lKSB7XG4gIGlmIChtcyA8IG4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1zIDwgbiAqIDEuNSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKG1zIC8gbikgKyAnICcgKyBuYW1lO1xuICB9XG4gIHJldHVybiBNYXRoLmNlaWwobXMgLyBuKSArICcgJyArIG5hbWUgKyAncyc7XG59XG4iLCAiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWdbJ2RlZmF1bHQnXSA9IGNyZWF0ZURlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG4gKi9cblxuZXhwb3J0cy5uYW1lcyA9IFtdO1xuZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cbiAqXG4gKiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzID0ge307XG5cbi8qKlxuICogUHJldmlvdXMgbG9nIHRpbWVzdGFtcC5cbiAqL1xuXG52YXIgcHJldlRpbWU7XG5cbi8qKlxuICogU2VsZWN0IGEgY29sb3IuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcbiAgdmFyIGhhc2ggPSAwLCBpO1xuXG4gIGZvciAoaSBpbiBuYW1lc3BhY2UpIHtcbiAgICBoYXNoICA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGV4cG9ydHMuY29sb3JzLmxlbmd0aF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXG4gIGZ1bmN0aW9uIGRlYnVnKCkge1xuICAgIC8vIGRpc2FibGVkP1xuICAgIGlmICghZGVidWcuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgdmFyIHNlbGYgPSBkZWJ1ZztcblxuICAgIC8vIHNldCBgZGlmZmAgdGltZXN0YW1wXG4gICAgdmFyIGN1cnIgPSArbmV3IERhdGUoKTtcbiAgICB2YXIgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuICAgIHNlbGYuZGlmZiA9IG1zO1xuICAgIHNlbGYucHJldiA9IHByZXZUaW1lO1xuICAgIHNlbGYuY3VyciA9IGN1cnI7XG4gICAgcHJldlRpbWUgPSBjdXJyO1xuXG4gICAgLy8gdHVybiB0aGUgYGFyZ3VtZW50c2AgaW50byBhIHByb3BlciBBcnJheVxuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBhcmdzWzBdID0gZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7XG5cbiAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhcmdzWzBdKSB7XG4gICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuICAgICAgYXJncy51bnNoaWZ0KCclTycpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgZnVuY3Rpb24obWF0Y2gsIGZvcm1hdCkge1xuICAgICAgLy8gaWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuICAgICAgaWYgKG1hdGNoID09PSAnJSUnKSByZXR1cm4gbWF0Y2g7XG4gICAgICBpbmRleCsrO1xuICAgICAgdmFyIGZvcm1hdHRlciA9IGV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIHZhbCA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICBtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cbiAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICAvLyBhcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuICAgIGV4cG9ydHMuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG4gICAgdmFyIGxvZ0ZuID0gZGVidWcubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgbG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cblxuICBkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIGRlYnVnLmVuYWJsZWQgPSBleHBvcnRzLmVuYWJsZWQobmFtZXNwYWNlKTtcbiAgZGVidWcudXNlQ29sb3JzID0gZXhwb3J0cy51c2VDb2xvcnMoKTtcbiAgZGVidWcuY29sb3IgPSBzZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXG4gIC8vIGVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5pbml0KSB7XG4gICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcbiAgfVxuXG4gIHJldHVybiBkZWJ1Zztcbn1cblxuLyoqXG4gKiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG4gKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuICBleHBvcnRzLm5hbWVzID0gW107XG4gIGV4cG9ydHMuc2tpcHMgPSBbXTtcblxuICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3NcbiAgICBuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcbiAgICBpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG4gICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICBleHBvcnRzLmVuYWJsZSgnJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcbiAgdmFyIGksIGxlbjtcbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcbiAgcmV0dXJuIHZhbDtcbn1cbiIsICIvKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kZWJ1ZycpO1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWVcbiAgICAgICAgICAgICAgICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWUuc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgPyBjaHJvbWUuc3RvcmFnZS5sb2NhbFxuICAgICAgICAgICAgICAgICAgOiBsb2NhbHN0b3JhZ2UoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG4gICdsaWdodHNlYWdyZWVuJyxcbiAgJ2ZvcmVzdGdyZWVuJyxcbiAgJ2dvbGRlbnJvZCcsXG4gICdkb2RnZXJibHVlJyxcbiAgJ2RhcmtvcmNoaWQnLFxuICAnY3JpbXNvbidcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuICAvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG4gIC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG4gIC8vIGV4cGxpY2l0bHlcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmIHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGlzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG4gIC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG4gIHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuICAgIC8vIGlzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuICAgIC8vIGlzIGZpcmVmb3ggPj0gdjMxP1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuICAgIC8vIGRvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uKHYpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnIubWVzc2FnZTtcbiAgfVxufTtcblxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuICB2YXIgdXNlQ29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cbiAgYXJnc1swXSA9ICh1c2VDb2xvcnMgPyAnJWMnIDogJycpXG4gICAgKyB0aGlzLm5hbWVzcGFjZVxuICAgICsgKHVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKVxuICAgICsgYXJnc1swXVxuICAgICsgKHVzZUNvbG9ycyA/ICclYyAnIDogJyAnKVxuICAgICsgJysnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG4gIGlmICghdXNlQ29sb3JzKSByZXR1cm47XG5cbiAgdmFyIGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuICBhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKVxuXG4gIC8vIHRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG4gIC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cbiAgLy8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0QyA9IDA7XG4gIGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIGlmICgnJSUnID09PSBtYXRjaCkgcmV0dXJuO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCclYycgPT09IG1hdGNoKSB7XG4gICAgICAvLyB3ZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcbiAgICAgIC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG4gICAgICBsYXN0QyA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgYXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUubG9nKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5sb2dgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgLy8gdGhpcyBoYWNrZXJ5IGlzIHJlcXVpcmVkIGZvciBJRTgvOSwgd2hlcmVcbiAgLy8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24gZG9lc24ndCBoYXZlICdhcHBseSdcbiAgcmV0dXJuICdvYmplY3QnID09PSB0eXBlb2YgY29uc29sZVxuICAgICYmIGNvbnNvbGUubG9nXG4gICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICB0cnkge1xuICAgIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UuZGVidWcgPSBuYW1lc3BhY2VzO1xuICAgIH1cbiAgfSBjYXRjaChlKSB7fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIHIgPSBleHBvcnRzLnN0b3JhZ2UuZGVidWc7XG4gIH0gY2F0Y2goZSkge31cblxuICAvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG4gIGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuICAgIHIgPSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfVxuXG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgbG9jYWxTdG9yYWdlLmRlYnVnYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG4iLCAiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciB0dHkgPSByZXF1aXJlKCd0dHknKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIC9eZGVidWdfL2kudGVzdChrZXkpO1xufSkucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAvLyBjYW1lbC1jYXNlXG4gIHZhciBwcm9wID0ga2V5XG4gICAgLnN1YnN0cmluZyg2KVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL18oW2Etel0pL2csIGZ1bmN0aW9uIChfLCBrKSB7IHJldHVybiBrLnRvVXBwZXJDYXNlKCkgfSk7XG5cbiAgLy8gY29lcmNlIHN0cmluZyB2YWx1ZSBpbnRvIEpTIHZhbHVlXG4gIHZhciB2YWwgPSBwcm9jZXNzLmVudltrZXldO1xuICBpZiAoL14oeWVzfG9ufHRydWV8ZW5hYmxlZCkkL2kudGVzdCh2YWwpKSB2YWwgPSB0cnVlO1xuICBlbHNlIGlmICgvXihub3xvZmZ8ZmFsc2V8ZGlzYWJsZWQpJC9pLnRlc3QodmFsKSkgdmFsID0gZmFsc2U7XG4gIGVsc2UgaWYgKHZhbCA9PT0gJ251bGwnKSB2YWwgPSBudWxsO1xuICBlbHNlIHZhbCA9IE51bWJlcih2YWwpO1xuXG4gIG9ialtwcm9wXSA9IHZhbDtcbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcblxuLyoqXG4gKiBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIHRoZSBgZGVidWcoKWAgY2FsbHMgdG8uXG4gKiBTZXQgdGhlIGBERUJVR19GRGAgZW52IHZhcmlhYmxlIHRvIG92ZXJyaWRlIHdpdGggYW5vdGhlciB2YWx1ZS4gaS5lLjpcbiAqXG4gKiAgICQgREVCVUdfRkQ9MyBub2RlIHNjcmlwdC5qcyAzPmRlYnVnLmxvZ1xuICovXG5cbnZhciBmZCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkRFQlVHX0ZELCAxMCkgfHwgMjtcblxuaWYgKDEgIT09IGZkICYmIDIgIT09IGZkKSB7XG4gIHV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uKCl7fSwgJ2V4Y2VwdCBmb3Igc3RkZXJyKDIpIGFuZCBzdGRvdXQoMSksIGFueSBvdGhlciB1c2FnZSBvZiBERUJVR19GRCBpcyBkZXByZWNhdGVkLiBPdmVycmlkZSBkZWJ1Zy5sb2cgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGxvZyBmdW5jdGlvbiAoaHR0cHM6Ly9naXQuaW8vZGVidWdfZmQpJykoKVxufVxuXG52YXIgc3RyZWFtID0gMSA9PT0gZmQgPyBwcm9jZXNzLnN0ZG91dCA6XG4gICAgICAgICAgICAgMiA9PT0gZmQgPyBwcm9jZXNzLnN0ZGVyciA6XG4gICAgICAgICAgICAgY3JlYXRlV3JpdGFibGVTdGRpb1N0cmVhbShmZCk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgcmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHNcbiAgICA/IEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpXG4gICAgOiB0dHkuaXNhdHR5KGZkKTtcbn1cblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsIG9uIGEgc2luZ2xlIGxpbmUuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbih2KSB7XG4gIHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG4gIHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cylcbiAgICAuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihzdHIpIHtcbiAgICAgIHJldHVybiBzdHIudHJpbSgpXG4gICAgfSkuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsb3dpbmcgbXVsdGlwbGUgbGluZXMgaWYgbmVlZGVkLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5PID0gZnVuY3Rpb24odikge1xuICB0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuICByZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLm5hbWVzcGFjZTtcbiAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG4gIGlmICh1c2VDb2xvcnMpIHtcbiAgICB2YXIgYyA9IHRoaXMuY29sb3I7XG4gICAgdmFyIHByZWZpeCA9ICcgIFxcdTAwMWJbMycgKyBjICsgJzsxbScgKyBuYW1lICsgJyAnICsgJ1xcdTAwMWJbMG0nO1xuXG4gICAgYXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuICAgIGFyZ3MucHVzaCgnXFx1MDAxYlszJyArIGMgKyAnbSsnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMWJbMG0nKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzWzBdID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG4gICAgICArICcgJyArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBgdXRpbC5mb3JtYXQoKWAgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhbmQgd3JpdGVzIHRvIGBzdHJlYW1gLlxuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgcmV0dXJuIHN0cmVhbS53cml0ZSh1dGlsLmZvcm1hdC5hcHBseSh1dGlsLCBhcmd1bWVudHMpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcbiAgaWYgKG51bGwgPT0gbmFtZXNwYWNlcykge1xuICAgIC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuICAgIC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5ERUJVRztcbn1cblxuLyoqXG4gKiBDb3BpZWQgZnJvbSBgbm9kZS9zcmMvbm9kZS5qc2AuXG4gKlxuICogWFhYOiBJdCdzIGxhbWUgdGhhdCBub2RlIGRvZXNuJ3QgZXhwb3NlIHRoaXMgQVBJIG91dC1vZi10aGUtYm94LiBJdCBhbHNvXG4gKiByZWxpZXMgb24gdGhlIHVuZG9jdW1lbnRlZCBgdHR5X3dyYXAuZ3Vlc3NIYW5kbGVUeXBlKClgIHdoaWNoIGlzIGFsc28gbGFtZS5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVXcml0YWJsZVN0ZGlvU3RyZWFtIChmZCkge1xuICB2YXIgc3RyZWFtO1xuICB2YXIgdHR5X3dyYXAgPSBwcm9jZXNzLmJpbmRpbmcoJ3R0eV93cmFwJyk7XG5cbiAgLy8gTm90ZSBzdHJlYW0uX3R5cGUgaXMgdXNlZCBmb3IgdGVzdC1tb2R1bGUtbG9hZC1saXN0LmpzXG5cbiAgc3dpdGNoICh0dHlfd3JhcC5ndWVzc0hhbmRsZVR5cGUoZmQpKSB7XG4gICAgY2FzZSAnVFRZJzpcbiAgICAgIHN0cmVhbSA9IG5ldyB0dHkuV3JpdGVTdHJlYW0oZmQpO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ3R0eSc7XG5cbiAgICAgIC8vIEhhY2sgdG8gaGF2ZSBzdHJlYW0gbm90IGtlZXAgdGhlIGV2ZW50IGxvb3AgYWxpdmUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzI2XG4gICAgICBpZiAoc3RyZWFtLl9oYW5kbGUgJiYgc3RyZWFtLl9oYW5kbGUudW5yZWYpIHtcbiAgICAgICAgc3RyZWFtLl9oYW5kbGUudW5yZWYoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnRklMRSc6XG4gICAgICB2YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuICAgICAgc3RyZWFtID0gbmV3IGZzLlN5bmNXcml0ZVN0cmVhbShmZCwgeyBhdXRvQ2xvc2U6IGZhbHNlIH0pO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ2ZzJztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnUElQRSc6XG4gICAgY2FzZSAnVENQJzpcbiAgICAgIHZhciBuZXQgPSByZXF1aXJlKCduZXQnKTtcbiAgICAgIHN0cmVhbSA9IG5ldyBuZXQuU29ja2V0KHtcbiAgICAgICAgZmQ6IGZkLFxuICAgICAgICByZWFkYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gRklYTUUgU2hvdWxkIHByb2JhYmx5IGhhdmUgYW4gb3B0aW9uIGluIG5ldC5Tb2NrZXQgdG8gY3JlYXRlIGFcbiAgICAgIC8vIHN0cmVhbSBmcm9tIGFuIGV4aXN0aW5nIGZkIHdoaWNoIGlzIHdyaXRhYmxlIG9ubHkuIEJ1dCBmb3Igbm93XG4gICAgICAvLyB3ZSdsbCBqdXN0IGFkZCB0aGlzIGhhY2sgYW5kIHNldCB0aGUgYHJlYWRhYmxlYCBtZW1iZXIgdG8gZmFsc2UuXG4gICAgICAvLyBUZXN0OiAuL25vZGUgdGVzdC9maXh0dXJlcy9lY2hvLmpzIDwgL2V0Yy9wYXNzd2RcbiAgICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlYWQgPSBudWxsO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ3BpcGUnO1xuXG4gICAgICAvLyBGSVhNRSBIYWNrIHRvIGhhdmUgc3RyZWFtIG5vdCBrZWVwIHRoZSBldmVudCBsb29wIGFsaXZlLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcyNlxuICAgICAgaWYgKHN0cmVhbS5faGFuZGxlICYmIHN0cmVhbS5faGFuZGxlLnVucmVmKSB7XG4gICAgICAgIHN0cmVhbS5faGFuZGxlLnVucmVmKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBQcm9iYWJseSBhbiBlcnJvciBvbiBpbiB1dl9ndWVzc19oYW5kbGUoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXBsZW1lbnQgbWUuIFVua25vd24gc3RyZWFtIGZpbGUgdHlwZSEnKTtcbiAgfVxuXG4gIC8vIEZvciBzdXBwb3J0aW5nIGxlZ2FjeSBBUEkgd2UgcHV0IHRoZSBGRCBoZXJlLlxuICBzdHJlYW0uZmQgPSBmZDtcblxuICBzdHJlYW0uX2lzU3RkaW8gPSB0cnVlO1xuXG4gIHJldHVybiBzdHJlYW07XG59XG5cbi8qKlxuICogSW5pdCBsb2dpYyBmb3IgYGRlYnVnYCBpbnN0YW5jZXMuXG4gKlxuICogQ3JlYXRlIGEgbmV3IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGluIGNhc2UgYHVzZUNvbG9yc2AgaXMgc2V0XG4gKiBkaWZmZXJlbnRseSBmb3IgYSBwYXJ0aWN1bGFyIGBkZWJ1Z2AgaW5zdGFuY2UuXG4gKi9cblxuZnVuY3Rpb24gaW5pdCAoZGVidWcpIHtcbiAgZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuaW5zcGVjdE9wdHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWJ1Zy5pbnNwZWN0T3B0c1trZXlzW2ldXSA9IGV4cG9ydHMuaW5zcGVjdE9wdHNba2V5c1tpXV07XG4gIH1cbn1cblxuLyoqXG4gKiBFbmFibGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gYHByb2Nlc3MuZW52LkRFQlVHYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcbiIsICIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciBwcm9jZXNzLCB3aGljaCBpcyBub2RlLCBidXQgd2Ugc2hvdWxkXG4gKiB0cmVhdCBhcyBhIGJyb3dzZXIuXG4gKi9cblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLCAiLyohXG4gKiBkZXN0cm95XG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE1LTIwMjIgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXJcbnZhciBSZWFkU3RyZWFtID0gcmVxdWlyZSgnZnMnKS5SZWFkU3RyZWFtXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbnZhciBabGliID0gcmVxdWlyZSgnemxpYicpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXN0cm95XG5cbi8qKlxuICogRGVzdHJveSB0aGUgZ2l2ZW4gc3RyZWFtLCBhbmQgb3B0aW9uYWxseSBzdXBwcmVzcyBhbnkgZnV0dXJlIGBlcnJvcmAgZXZlbnRzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VwcHJlc3NcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXN0cm95IChzdHJlYW0sIHN1cHByZXNzKSB7XG4gIGlmIChpc0ZzUmVhZFN0cmVhbShzdHJlYW0pKSB7XG4gICAgZGVzdHJveVJlYWRTdHJlYW0oc3RyZWFtKVxuICB9IGVsc2UgaWYgKGlzWmxpYlN0cmVhbShzdHJlYW0pKSB7XG4gICAgZGVzdHJveVpsaWJTdHJlYW0oc3RyZWFtKVxuICB9IGVsc2UgaWYgKGhhc0Rlc3Ryb3koc3RyZWFtKSkge1xuICAgIHN0cmVhbS5kZXN0cm95KClcbiAgfVxuXG4gIGlmIChpc0V2ZW50RW1pdHRlcihzdHJlYW0pICYmIHN1cHByZXNzKSB7XG4gICAgc3RyZWFtLnJlbW92ZUFsbExpc3RlbmVycygnZXJyb3InKVxuICAgIHN0cmVhbS5hZGRMaXN0ZW5lcignZXJyb3InLCBub29wKVxuICB9XG5cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG4vKipcbiAqIERlc3Ryb3kgYSBSZWFkU3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZGVzdHJveVJlYWRTdHJlYW0gKHN0cmVhbSkge1xuICBzdHJlYW0uZGVzdHJveSgpXG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0uY2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBub2RlLmpzIGNvcmUgYnVnIHdvcmstYXJvdW5kXG4gICAgc3RyZWFtLm9uKCdvcGVuJywgb25PcGVuQ2xvc2UpXG4gIH1cbn1cblxuLyoqXG4gKiBDbG9zZSBhIFpsaWIgc3RyZWFtLlxuICpcbiAqIFpsaWIgc3RyZWFtcyBiZWxvdyBOb2RlLmpzIDQuNS41IGhhdmUgYSBidWdneSBpbXBsZW1lbnRhdGlvblxuICogb2YgLmNsb3NlKCkgd2hlbiB6bGliIGVuY291bnRlcmVkIGFuIGVycm9yLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY2xvc2VabGliU3RyZWFtIChzdHJlYW0pIHtcbiAgaWYgKHN0cmVhbS5faGFkRXJyb3IgPT09IHRydWUpIHtcbiAgICB2YXIgcHJvcCA9IHN0cmVhbS5fYmluZGluZyA9PT0gbnVsbFxuICAgICAgPyAnX2JpbmRpbmcnXG4gICAgICA6ICdfaGFuZGxlJ1xuXG4gICAgc3RyZWFtW3Byb3BdID0ge1xuICAgICAgY2xvc2U6IGZ1bmN0aW9uICgpIHsgdGhpc1twcm9wXSA9IG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5jbG9zZSgpXG59XG5cbi8qKlxuICogRGVzdHJveSBhIFpsaWIgc3RyZWFtLlxuICpcbiAqIFpsaWIgc3RyZWFtcyBkb24ndCBoYXZlIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBOb2RlLmpzIDYuIE9uIHRvcCBvZiB0aGF0XG4gKiBzaW1wbHkgY2FsbGluZyBkZXN0cm95IG9uIGEgemxpYiBzdHJlYW0gaW4gTm9kZS5qcyA4KyB3aWxsIHJlc3VsdCBpbiBhXG4gKiBtZW1vcnkgbGVhay4gU28gdW50aWwgdGhhdCBpcyBmaXhlZCwgd2UgbmVlZCB0byBjYWxsIGJvdGggY2xvc2UgQU5EIGRlc3Ryb3kuXG4gKlxuICogUFIgdG8gZml4IG1lbW9yeSBsZWFrOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8yMzczNFxuICpcbiAqIEluIE5vZGUuanMgNis4LCBpdCdzIGltcG9ydGFudCB0aGF0IGRlc3Ryb3kgaXMgY2FsbGVkIGJlZm9yZSBjbG9zZSBhcyB0aGVcbiAqIHN0cmVhbSB3b3VsZCBvdGhlcndpc2UgZW1pdCB0aGUgZXJyb3IgJ3psaWIgYmluZGluZyBjbG9zZWQnLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZGVzdHJveVpsaWJTdHJlYW0gKHN0cmVhbSkge1xuICBpZiAodHlwZW9mIHN0cmVhbS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gbm9kZS5qcyBjb3JlIGJ1ZyB3b3JrLWFyb3VuZFxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBpZjogbm9kZS5qcyAwLjhcbiAgICBpZiAoc3RyZWFtLl9iaW5kaW5nKSB7XG4gICAgICAvLyBub2RlLmpzIDwgMC4xMC4wXG4gICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgICBpZiAoc3RyZWFtLl9wcm9jZXNzaW5nKSB7XG4gICAgICAgIHN0cmVhbS5fbmVlZERyYWluID0gdHJ1ZVxuICAgICAgICBzdHJlYW0ub25jZSgnZHJhaW4nLCBvbkRyYWluQ2xlYXJCaW5kaW5nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtLl9iaW5kaW5nLmNsZWFyKClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0cmVhbS5fZGVzdHJveSAmJiBzdHJlYW0uX2Rlc3Ryb3kgIT09IFN0cmVhbS5UcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95KSB7XG4gICAgICAvLyBub2RlLmpzID49IDEyLCBeMTEuMS4wLCBeMTAuMTUuMVxuICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgIH0gZWxzZSBpZiAoc3RyZWFtLl9kZXN0cm95ICYmIHR5cGVvZiBzdHJlYW0uY2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIG5vZGUuanMgNywgOFxuICAgICAgc3RyZWFtLmRlc3Ryb3llZCA9IHRydWVcbiAgICAgIHN0cmVhbS5jbG9zZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZhbGxiYWNrXG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyZWFtLmNsb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gbm9kZS5qcyA8IDggZmFsbGJhY2tcbiAgICBjbG9zZVpsaWJTdHJlYW0oc3RyZWFtKVxuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHN0cmVhbSBoYXMgZGVzdHJveS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaGFzRGVzdHJveSAoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0gaW5zdGFuY2VvZiBTdHJlYW0gJiZcbiAgICB0eXBlb2Ygc3RyZWFtLmRlc3Ryb3kgPT09ICdmdW5jdGlvbidcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdmFsIGlzIEV2ZW50RW1pdHRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNFdmVudEVtaXR0ZXIgKHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHN0cmVhbSBpcyBmcy5SZWFkU3RyZWFtIHN0cmVhbS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNGc1JlYWRTdHJlYW0gKHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtIGluc3RhbmNlb2YgUmVhZFN0cmVhbVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBzdHJlYW0gaXMgWmxpYiBzdHJlYW0uXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzWmxpYlN0cmVhbSAoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0gaW5zdGFuY2VvZiBabGliLkd6aXAgfHxcbiAgICBzdHJlYW0gaW5zdGFuY2VvZiBabGliLkd1bnppcCB8fFxuICAgIHN0cmVhbSBpbnN0YW5jZW9mIFpsaWIuRGVmbGF0ZSB8fFxuICAgIHN0cmVhbSBpbnN0YW5jZW9mIFpsaWIuRGVmbGF0ZVJhdyB8fFxuICAgIHN0cmVhbSBpbnN0YW5jZW9mIFpsaWIuSW5mbGF0ZSB8fFxuICAgIHN0cmVhbSBpbnN0YW5jZW9mIFpsaWIuSW5mbGF0ZVJhdyB8fFxuICAgIHN0cmVhbSBpbnN0YW5jZW9mIFpsaWIuVW56aXBcbn1cblxuLyoqXG4gKiBOby1vcCBmdW5jdGlvbi5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG4vKipcbiAqIE9uIGRyYWluIGhhbmRsZXIgdG8gY2xlYXIgYmluZGluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuLy8gaXN0YW5idWwgaWdub3JlIG5leHQ6IG5vZGUuanMgMC44XG5mdW5jdGlvbiBvbkRyYWluQ2xlYXJCaW5kaW5nICgpIHtcbiAgdGhpcy5fYmluZGluZy5jbGVhcigpXG59XG5cbi8qKlxuICogT24gb3BlbiBoYW5kbGVyIHRvIGNsb3NlIHN0cmVhbS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gb25PcGVuQ2xvc2UgKCkge1xuICBpZiAodHlwZW9mIHRoaXMuZmQgPT09ICdudW1iZXInKSB7XG4gICAgLy8gYWN0dWFsbHkgY2xvc2UgZG93biB0aGUgZmRcbiAgICB0aGlzLmNsb3NlKClcbiAgfVxufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxudmFyIHNhZmVyID0ge31cblxudmFyIGtleVxuXG5mb3IgKGtleSBpbiBidWZmZXIpIHtcbiAgaWYgKCFidWZmZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgaWYgKGtleSA9PT0gJ1Nsb3dCdWZmZXInIHx8IGtleSA9PT0gJ0J1ZmZlcicpIGNvbnRpbnVlXG4gIHNhZmVyW2tleV0gPSBidWZmZXJba2V5XVxufVxuXG52YXIgU2FmZXIgPSBzYWZlci5CdWZmZXIgPSB7fVxuZm9yIChrZXkgaW4gQnVmZmVyKSB7XG4gIGlmICghQnVmZmVyLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlXG4gIGlmIChrZXkgPT09ICdhbGxvY1Vuc2FmZScgfHwga2V5ID09PSAnYWxsb2NVbnNhZmVTbG93JykgY29udGludWVcbiAgU2FmZXJba2V5XSA9IEJ1ZmZlcltrZXldXG59XG5cbnNhZmVyLkJ1ZmZlci5wcm90b3R5cGUgPSBCdWZmZXIucHJvdG90eXBlXG5cbmlmICghU2FmZXIuZnJvbSB8fCBTYWZlci5mcm9tID09PSBVaW50OEFycmF5LmZyb20pIHtcbiAgU2FmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSlcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cbn1cblxuaWYgKCFTYWZlci5hbGxvYykge1xuICBTYWZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc2l6ZSlcbiAgICB9XG4gICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPj0gMiAqICgxIDw8IDMwKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gICAgfVxuICAgIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgICBpZiAoIWZpbGwgfHwgZmlsbC5sZW5ndGggPT09IDApIHtcbiAgICAgIGJ1Zi5maWxsKDApXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZlxuICB9XG59XG5cbmlmICghc2FmZXIua1N0cmluZ01heExlbmd0aCkge1xuICB0cnkge1xuICAgIHNhZmVyLmtTdHJpbmdNYXhMZW5ndGggPSBwcm9jZXNzLmJpbmRpbmcoJ2J1ZmZlcicpLmtTdHJpbmdNYXhMZW5ndGhcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIHdlIGNhbid0IGRldGVybWluZSBrU3RyaW5nTWF4TGVuZ3RoIGluIGVudmlyb25tZW50cyB3aGVyZSBwcm9jZXNzLmJpbmRpbmdcbiAgICAvLyBpcyB1bnN1cHBvcnRlZCwgc28gbGV0J3Mgbm90IHNldCBpdFxuICB9XG59XG5cbmlmICghc2FmZXIuY29uc3RhbnRzKSB7XG4gIHNhZmVyLmNvbnN0YW50cyA9IHtcbiAgICBNQVhfTEVOR1RIOiBzYWZlci5rTWF4TGVuZ3RoXG4gIH1cbiAgaWYgKHNhZmVyLmtTdHJpbmdNYXhMZW5ndGgpIHtcbiAgICBzYWZlci5jb25zdGFudHMuTUFYX1NUUklOR19MRU5HVEggPSBzYWZlci5rU3RyaW5nTWF4TGVuZ3RoXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlclxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgQk9NQ2hhciA9ICdcXHVGRUZGJztcblxuZXhwb3J0cy5QcmVwZW5kQk9NID0gUHJlcGVuZEJPTVdyYXBwZXJcbmZ1bmN0aW9uIFByZXBlbmRCT01XcmFwcGVyKGVuY29kZXIsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmVuY29kZXIgPSBlbmNvZGVyO1xuICAgIHRoaXMuYWRkQk9NID0gdHJ1ZTtcbn1cblxuUHJlcGVuZEJPTVdyYXBwZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgaWYgKHRoaXMuYWRkQk9NKSB7XG4gICAgICAgIHN0ciA9IEJPTUNoYXIgKyBzdHI7XG4gICAgICAgIHRoaXMuYWRkQk9NID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZW5jb2Rlci53cml0ZShzdHIpO1xufVxuXG5QcmVwZW5kQk9NV3JhcHBlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2Rlci5lbmQoKTtcbn1cblxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnRzLlN0cmlwQk9NID0gU3RyaXBCT01XcmFwcGVyO1xuZnVuY3Rpb24gU3RyaXBCT01XcmFwcGVyKGRlY29kZXIsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBkZWNvZGVyO1xuICAgIHRoaXMucGFzcyA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG59XG5cblN0cmlwQk9NV3JhcHBlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHtcbiAgICB2YXIgcmVzID0gdGhpcy5kZWNvZGVyLndyaXRlKGJ1Zik7XG4gICAgaWYgKHRoaXMucGFzcyB8fCAhcmVzKVxuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgaWYgKHJlc1swXSA9PT0gQk9NQ2hhcikge1xuICAgICAgICByZXMgPSByZXMuc2xpY2UoMSk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnN0cmlwQk9NID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0cmlwQk9NKCk7XG4gICAgfVxuXG4gICAgdGhpcy5wYXNzID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5TdHJpcEJPTVdyYXBwZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmRlY29kZXIuZW5kKCk7XG59XG5cbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBCdWZmZXIgPSByZXF1aXJlKFwic2FmZXItYnVmZmVyXCIpLkJ1ZmZlcjtcblxuLy8gRXhwb3J0IE5vZGUuanMgaW50ZXJuYWwgZW5jb2RpbmdzLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAvLyBFbmNvZGluZ3NcbiAgICB1dGY4OiAgIHsgdHlwZTogXCJfaW50ZXJuYWxcIiwgYm9tQXdhcmU6IHRydWV9LFxuICAgIGNlc3U4OiAgeyB0eXBlOiBcIl9pbnRlcm5hbFwiLCBib21Bd2FyZTogdHJ1ZX0sXG4gICAgdW5pY29kZTExdXRmODogXCJ1dGY4XCIsXG5cbiAgICB1Y3MyOiAgIHsgdHlwZTogXCJfaW50ZXJuYWxcIiwgYm9tQXdhcmU6IHRydWV9LFxuICAgIHV0ZjE2bGU6IFwidWNzMlwiLFxuXG4gICAgYmluYXJ5OiB7IHR5cGU6IFwiX2ludGVybmFsXCIgfSxcbiAgICBiYXNlNjQ6IHsgdHlwZTogXCJfaW50ZXJuYWxcIiB9LFxuICAgIGhleDogICAgeyB0eXBlOiBcIl9pbnRlcm5hbFwiIH0sXG5cbiAgICAvLyBDb2RlYy5cbiAgICBfaW50ZXJuYWw6IEludGVybmFsQ29kZWMsXG59O1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBJbnRlcm5hbENvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgICB0aGlzLmVuYyA9IGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWU7XG4gICAgdGhpcy5ib21Bd2FyZSA9IGNvZGVjT3B0aW9ucy5ib21Bd2FyZTtcblxuICAgIGlmICh0aGlzLmVuYyA9PT0gXCJiYXNlNjRcIilcbiAgICAgICAgdGhpcy5lbmNvZGVyID0gSW50ZXJuYWxFbmNvZGVyQmFzZTY0O1xuICAgIGVsc2UgaWYgKHRoaXMuZW5jID09PSBcImNlc3U4XCIpIHtcbiAgICAgICAgdGhpcy5lbmMgPSBcInV0ZjhcIjsgLy8gVXNlIHV0ZjggZm9yIGRlY29kaW5nLlxuICAgICAgICB0aGlzLmVuY29kZXIgPSBJbnRlcm5hbEVuY29kZXJDZXN1ODtcblxuICAgICAgICAvLyBBZGQgZGVjb2RlciBmb3IgdmVyc2lvbnMgb2YgTm9kZSBub3Qgc3VwcG9ydGluZyBDRVNVLThcbiAgICAgICAgaWYgKEJ1ZmZlci5mcm9tKCdlZGEwYmRlZGIyYTknLCAnaGV4JykudG9TdHJpbmcoKSAhPT0gJ1x1RDgzRFx1RENBOScpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb2RlciA9IEludGVybmFsRGVjb2RlckNlc3U4O1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBpY29udi5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkludGVybmFsQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBJbnRlcm5hbEVuY29kZXI7XG5JbnRlcm5hbENvZGVjLnByb3RvdHlwZS5kZWNvZGVyID0gSW50ZXJuYWxEZWNvZGVyO1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBXZSB1c2Ugbm9kZS5qcyBpbnRlcm5hbCBkZWNvZGVyLiBJdHMgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIG91cnMuXG52YXIgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJykuU3RyaW5nRGVjb2RlcjtcblxuaWYgKCFTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQpIC8vIE5vZGUgdjAuOCBkb2Vzbid0IGhhdmUgdGhpcyBtZXRob2QuXG4gICAgU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7fTtcblxuXG5mdW5jdGlvbiBJbnRlcm5hbERlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICBTdHJpbmdEZWNvZGVyLmNhbGwodGhpcywgY29kZWMuZW5jKTtcbn1cblxuSW50ZXJuYWxEZWNvZGVyLnByb3RvdHlwZSA9IFN0cmluZ0RlY29kZXIucHJvdG90eXBlO1xuXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNvZGVyIGlzIG1vc3RseSB0cml2aWFsXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMuZW5jID0gY29kZWMuZW5jO1xufVxuXG5JbnRlcm5hbEVuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0ciwgdGhpcy5lbmMpO1xufVxuXG5JbnRlcm5hbEVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeGNlcHQgYmFzZTY0IGVuY29kZXIsIHdoaWNoIG11c3Qga2VlcCBpdHMgc3RhdGUuXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlckJhc2U2NChvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMucHJldlN0ciA9ICcnO1xufVxuXG5JbnRlcm5hbEVuY29kZXJCYXNlNjQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgc3RyID0gdGhpcy5wcmV2U3RyICsgc3RyO1xuICAgIHZhciBjb21wbGV0ZVF1YWRzID0gc3RyLmxlbmd0aCAtIChzdHIubGVuZ3RoICUgNCk7XG4gICAgdGhpcy5wcmV2U3RyID0gc3RyLnNsaWNlKGNvbXBsZXRlUXVhZHMpO1xuICAgIHN0ciA9IHN0ci5zbGljZSgwLCBjb21wbGV0ZVF1YWRzKTtcblxuICAgIHJldHVybiBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpO1xufVxuXG5JbnRlcm5hbEVuY29kZXJCYXNlNjQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLnByZXZTdHIsIFwiYmFzZTY0XCIpO1xufVxuXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDRVNVLTggZW5jb2RlciBpcyBhbHNvIHNwZWNpYWwuXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlckNlc3U4KG9wdGlvbnMsIGNvZGVjKSB7XG59XG5cbkludGVybmFsRW5jb2RlckNlc3U4LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciBidWYgPSBCdWZmZXIuYWxsb2Moc3RyLmxlbmd0aCAqIDMpLCBidWZJZHggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAvLyBOYWl2ZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGl0IHdvcmtzIGJlY2F1c2UgQ0VTVS04IGlzIGVzcGVjaWFsbHkgZWFzeVxuICAgICAgICAvLyB0byBjb252ZXJ0IGZyb20gVVRGLTE2ICh3aGljaCBhbGwgSlMgc3RyaW5ncyBhcmUgZW5jb2RlZCBpbikuXG4gICAgICAgIGlmIChjaGFyQ29kZSA8IDB4ODApXG4gICAgICAgICAgICBidWZbYnVmSWR4KytdID0gY2hhckNvZGU7XG4gICAgICAgIGVsc2UgaWYgKGNoYXJDb2RlIDwgMHg4MDApIHtcbiAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSAweEMwICsgKGNoYXJDb2RlID4+PiA2KTtcbiAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSAweDgwICsgKGNoYXJDb2RlICYgMHgzZik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIGNoYXJDb2RlIHdpbGwgYWx3YXlzIGJlIDwgMHgxMDAwMCBpbiBqYXZhc2NyaXB0LlxuICAgICAgICAgICAgYnVmW2J1ZklkeCsrXSA9IDB4RTAgKyAoY2hhckNvZGUgPj4+IDEyKTtcbiAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSAweDgwICsgKChjaGFyQ29kZSA+Pj4gNikgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSAweDgwICsgKGNoYXJDb2RlICYgMHgzZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1Zi5zbGljZSgwLCBidWZJZHgpO1xufVxuXG5JbnRlcm5hbEVuY29kZXJDZXN1OC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG59XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDRVNVLTggZGVjb2RlciBpcyBub3QgaW1wbGVtZW50ZWQgaW4gTm9kZSB2NC4wK1xuXG5mdW5jdGlvbiBJbnRlcm5hbERlY29kZXJDZXN1OChvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMuYWNjID0gMDtcbiAgICB0aGlzLmNvbnRCeXRlcyA9IDA7XG4gICAgdGhpcy5hY2NCeXRlcyA9IDA7XG4gICAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBjb2RlYy5kZWZhdWx0Q2hhclVuaWNvZGU7XG59XG5cbkludGVybmFsRGVjb2RlckNlc3U4LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIHZhciBhY2MgPSB0aGlzLmFjYywgY29udEJ5dGVzID0gdGhpcy5jb250Qnl0ZXMsIGFjY0J5dGVzID0gdGhpcy5hY2NCeXRlcywgXG4gICAgICAgIHJlcyA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjdXJCeXRlID0gYnVmW2ldO1xuICAgICAgICBpZiAoKGN1ckJ5dGUgJiAweEMwKSAhPT0gMHg4MCkgeyAvLyBMZWFkaW5nIGJ5dGVcbiAgICAgICAgICAgIGlmIChjb250Qnl0ZXMgPiAwKSB7IC8vIFByZXZpb3VzIGNvZGUgaXMgaW52YWxpZFxuICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgICAgICAgICAgICAgICBjb250Qnl0ZXMgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VyQnl0ZSA8IDB4ODApIHsgLy8gU2luZ2xlLWJ5dGUgY29kZVxuICAgICAgICAgICAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGN1ckJ5dGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJCeXRlIDwgMHhFMCkgeyAvLyBUd28tYnl0ZSBjb2RlXG4gICAgICAgICAgICAgICAgYWNjID0gY3VyQnl0ZSAmIDB4MUY7XG4gICAgICAgICAgICAgICAgY29udEJ5dGVzID0gMTsgYWNjQnl0ZXMgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJCeXRlIDwgMHhGMCkgeyAvLyBUaHJlZS1ieXRlIGNvZGVcbiAgICAgICAgICAgICAgICBhY2MgPSBjdXJCeXRlICYgMHgwRjtcbiAgICAgICAgICAgICAgICBjb250Qnl0ZXMgPSAyOyBhY2NCeXRlcyA9IDE7XG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBGb3VyIG9yIG1vcmUgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIENFU1UtOC5cbiAgICAgICAgICAgICAgICByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7IC8vIENvbnRpbnVhdGlvbiBieXRlXG4gICAgICAgICAgICBpZiAoY29udEJ5dGVzID4gMCkgeyAvLyBXZSdyZSB3YWl0aW5nIGZvciBpdC5cbiAgICAgICAgICAgICAgICBhY2MgPSAoYWNjIDw8IDYpIHwgKGN1ckJ5dGUgJiAweDNmKTtcbiAgICAgICAgICAgICAgICBjb250Qnl0ZXMtLTsgYWNjQnl0ZXMrKztcbiAgICAgICAgICAgICAgICBpZiAoY29udEJ5dGVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVybG9uZyBlbmNvZGluZywgYnV0IHN1cHBvcnQgTW9kaWZpZWQgVVRGLTggKGVuY29kaW5nIE5VTEwgYXMgQzAgODApXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY2NCeXRlcyA9PT0gMiAmJiBhY2MgPCAweDgwICYmIGFjYyA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjY0J5dGVzID09PSAzICYmIGFjYyA8IDB4ODAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3R1YWxseSBhZGQgY2hhcmFjdGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYWNjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBVbmV4cGVjdGVkIGNvbnRpbnVhdGlvbiBieXRlXG4gICAgICAgICAgICAgICAgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWNjID0gYWNjOyB0aGlzLmNvbnRCeXRlcyA9IGNvbnRCeXRlczsgdGhpcy5hY2NCeXRlcyA9IGFjY0J5dGVzO1xuICAgIHJldHVybiByZXM7XG59XG5cbkludGVybmFsRGVjb2RlckNlc3U4LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzID0gMDtcbiAgICBpZiAodGhpcy5jb250Qnl0ZXMgPiAwKVxuICAgICAgICByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgcmV0dXJuIHJlcztcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBCdWZmZXIgPSByZXF1aXJlKFwic2FmZXItYnVmZmVyXCIpLkJ1ZmZlcjtcblxuLy8gTm90ZTogVVRGMTYtTEUgKG9yIFVDUzIpIGNvZGVjIGlzIE5vZGUuanMgbmF0aXZlLiBTZWUgZW5jb2RpbmdzL2ludGVybmFsLmpzXG5cbi8vID09IFVURjE2LUJFIGNvZGVjLiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydHMudXRmMTZiZSA9IFV0ZjE2QkVDb2RlYztcbmZ1bmN0aW9uIFV0ZjE2QkVDb2RlYygpIHtcbn1cblxuVXRmMTZCRUNvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmMTZCRUVuY29kZXI7XG5VdGYxNkJFQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBVdGYxNkJFRGVjb2RlcjtcblV0ZjE2QkVDb2RlYy5wcm90b3R5cGUuYm9tQXdhcmUgPSB0cnVlO1xuXG5cbi8vIC0tIEVuY29kaW5nXG5cbmZ1bmN0aW9uIFV0ZjE2QkVFbmNvZGVyKCkge1xufVxuXG5VdGYxNkJFRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgYnVmID0gQnVmZmVyLmZyb20oc3RyLCAndWNzMicpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHZhciB0bXAgPSBidWZbaV07IGJ1ZltpXSA9IGJ1ZltpKzFdOyBidWZbaSsxXSA9IHRtcDtcbiAgICB9XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxuVXRmMTZCRUVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbi8vIC0tIERlY29kaW5nXG5cbmZ1bmN0aW9uIFV0ZjE2QkVEZWNvZGVyKCkge1xuICAgIHRoaXMub3ZlcmZsb3dCeXRlID0gLTE7XG59XG5cblV0ZjE2QkVEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIGlmIChidWYubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiAnJztcblxuICAgIHZhciBidWYyID0gQnVmZmVyLmFsbG9jKGJ1Zi5sZW5ndGggKyAxKSxcbiAgICAgICAgaSA9IDAsIGogPSAwO1xuXG4gICAgaWYgKHRoaXMub3ZlcmZsb3dCeXRlICE9PSAtMSkge1xuICAgICAgICBidWYyWzBdID0gYnVmWzBdO1xuICAgICAgICBidWYyWzFdID0gdGhpcy5vdmVyZmxvd0J5dGU7XG4gICAgICAgIGkgPSAxOyBqID0gMjtcbiAgICB9XG5cbiAgICBmb3IgKDsgaSA8IGJ1Zi5sZW5ndGgtMTsgaSArPSAyLCBqKz0gMikge1xuICAgICAgICBidWYyW2pdID0gYnVmW2krMV07XG4gICAgICAgIGJ1ZjJbaisxXSA9IGJ1ZltpXTtcbiAgICB9XG5cbiAgICB0aGlzLm92ZXJmbG93Qnl0ZSA9IChpID09IGJ1Zi5sZW5ndGgtMSkgPyBidWZbYnVmLmxlbmd0aC0xXSA6IC0xO1xuXG4gICAgcmV0dXJuIGJ1ZjIuc2xpY2UoMCwgaikudG9TdHJpbmcoJ3VjczInKTtcbn1cblxuVXRmMTZCRURlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbi8vID09IFVURi0xNiBjb2RlYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWNvZGVyIGNob29zZXMgYXV0b21hdGljYWxseSBmcm9tIFVURi0xNkxFIGFuZCBVVEYtMTZCRSB1c2luZyBCT00gYW5kIHNwYWNlLWJhc2VkIGhldXJpc3RpYy5cbi8vIERlZmF1bHRzIHRvIFVURi0xNkxFLCBhcyBpdCdzIHByZXZhbGVudCBhbmQgZGVmYXVsdCBpbiBOb2RlLlxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYgYW5kIGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI3V0Zi0xNmxlXG4vLyBEZWNvZGVyIGRlZmF1bHQgY2FuIGJlIGNoYW5nZWQ6IGljb252LmRlY29kZShidWYsICd1dGYxNicsIHtkZWZhdWx0RW5jb2Rpbmc6ICd1dGYtMTZiZSd9KTtcblxuLy8gRW5jb2RlciB1c2VzIFVURi0xNkxFIGFuZCBwcmVwZW5kcyBCT00gKHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggYWRkQk9NOiBmYWxzZSkuXG5cbmV4cG9ydHMudXRmMTYgPSBVdGYxNkNvZGVjO1xuZnVuY3Rpb24gVXRmMTZDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gICAgdGhpcy5pY29udiA9IGljb252O1xufVxuXG5VdGYxNkNvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmMTZFbmNvZGVyO1xuVXRmMTZDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFV0ZjE2RGVjb2RlcjtcblxuXG4vLyAtLSBFbmNvZGluZyAocGFzcy10aHJvdWdoKVxuXG5mdW5jdGlvbiBVdGYxNkVuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAob3B0aW9ucy5hZGRCT00gPT09IHVuZGVmaW5lZClcbiAgICAgICAgb3B0aW9ucy5hZGRCT00gPSB0cnVlO1xuICAgIHRoaXMuZW5jb2RlciA9IGNvZGVjLmljb252LmdldEVuY29kZXIoJ3V0Zi0xNmxlJywgb3B0aW9ucyk7XG59XG5cblV0ZjE2RW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5lbmNvZGVyLndyaXRlKHN0cik7XG59XG5cblV0ZjE2RW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2Rlci5lbmQoKTtcbn1cblxuXG4vLyAtLSBEZWNvZGluZ1xuXG5mdW5jdGlvbiBVdGYxNkRlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICAgIHRoaXMuaW5pdGlhbEJ5dGVzID0gW107XG4gICAgdGhpcy5pbml0aWFsQnl0ZXNMZW4gPSAwO1xuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG59XG5cblV0ZjE2RGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHtcbiAgICBpZiAoIXRoaXMuZGVjb2Rlcikge1xuICAgICAgICAvLyBDb2RlYyBpcyBub3QgY2hvc2VuIHlldC4gQWNjdW11bGF0ZSBpbml0aWFsIGJ5dGVzLlxuICAgICAgICB0aGlzLmluaXRpYWxCeXRlcy5wdXNoKGJ1Zik7XG4gICAgICAgIHRoaXMuaW5pdGlhbEJ5dGVzTGVuICs9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5pbml0aWFsQnl0ZXNMZW4gPCAxNikgLy8gV2UgbmVlZCBtb3JlIGJ5dGVzIHRvIHVzZSBzcGFjZSBoZXVyaXN0aWMgKHNlZSBiZWxvdylcbiAgICAgICAgICAgIHJldHVybiAnJztcblxuICAgICAgICAvLyBXZSBoYXZlIGVub3VnaCBieXRlcyAtPiBkZXRlY3QgZW5kaWFubmVzcy5cbiAgICAgICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQodGhpcy5pbml0aWFsQnl0ZXMpLFxuICAgICAgICAgICAgZW5jb2RpbmcgPSBkZXRlY3RFbmNvZGluZyhidWYsIHRoaXMub3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSB0aGlzLmljb252LmdldERlY29kZXIoZW5jb2RpbmcsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuaW5pdGlhbEJ5dGVzLmxlbmd0aCA9IHRoaXMuaW5pdGlhbEJ5dGVzTGVuID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGVyLndyaXRlKGJ1Zik7XG59XG5cblV0ZjE2RGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmRlY29kZXIpIHtcbiAgICAgICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQodGhpcy5pbml0aWFsQnl0ZXMpLFxuICAgICAgICAgICAgZW5jb2RpbmcgPSBkZXRlY3RFbmNvZGluZyhidWYsIHRoaXMub3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSB0aGlzLmljb252LmdldERlY29kZXIoZW5jb2RpbmcsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuZGVjb2Rlci53cml0ZShidWYpLFxuICAgICAgICAgICAgdHJhaWwgPSB0aGlzLmRlY29kZXIuZW5kKCk7XG5cbiAgICAgICAgcmV0dXJuIHRyYWlsID8gKHJlcyArIHRyYWlsKSA6IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGVjb2Rlci5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0RW5jb2RpbmcoYnVmLCBkZWZhdWx0RW5jb2RpbmcpIHtcbiAgICB2YXIgZW5jID0gZGVmYXVsdEVuY29kaW5nIHx8ICd1dGYtMTZsZSc7XG5cbiAgICBpZiAoYnVmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIC8vIENoZWNrIEJPTS5cbiAgICAgICAgaWYgKGJ1ZlswXSA9PSAweEZFICYmIGJ1ZlsxXSA9PSAweEZGKSAvLyBVVEYtMTZCRSBCT01cbiAgICAgICAgICAgIGVuYyA9ICd1dGYtMTZiZSc7XG4gICAgICAgIGVsc2UgaWYgKGJ1ZlswXSA9PSAweEZGICYmIGJ1ZlsxXSA9PSAweEZFKSAvLyBVVEYtMTZMRSBCT01cbiAgICAgICAgICAgIGVuYyA9ICd1dGYtMTZsZSc7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gQk9NIGZvdW5kLiBUcnkgdG8gZGVkdWNlIGVuY29kaW5nIGZyb20gaW5pdGlhbCBjb250ZW50LlxuICAgICAgICAgICAgLy8gTW9zdCBvZiB0aGUgdGltZSwgdGhlIGNvbnRlbnQgaGFzIEFTQ0lJIGNoYXJzIChVKzAwKiopLCBidXQgdGhlIG9wcG9zaXRlIChVKyoqMDApIGlzIHVuY29tbW9uLlxuICAgICAgICAgICAgLy8gU28sIHdlIGNvdW50IEFTQ0lJIGFzIGlmIGl0IHdhcyBMRSBvciBCRSwgYW5kIGRlY2lkZSBmcm9tIHRoYXQuXG4gICAgICAgICAgICB2YXIgYXNjaWlDaGFyc0xFID0gMCwgYXNjaWlDaGFyc0JFID0gMCwgLy8gQ291bnRzIG9mIGNoYXJzIGluIGJvdGggcG9zaXRpb25zXG4gICAgICAgICAgICAgICAgX2xlbiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSAoYnVmLmxlbmd0aCAlIDIpLCA2NCk7IC8vIExlbiBpcyBhbHdheXMgZXZlbi5cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfbGVuOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldID09PSAwICYmIGJ1ZltpKzFdICE9PSAwKSBhc2NpaUNoYXJzQkUrKztcbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9PSAwICYmIGJ1ZltpKzFdID09PSAwKSBhc2NpaUNoYXJzTEUrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFzY2lpQ2hhcnNCRSA+IGFzY2lpQ2hhcnNMRSlcbiAgICAgICAgICAgICAgICBlbmMgPSAndXRmLTE2YmUnO1xuICAgICAgICAgICAgZWxzZSBpZiAoYXNjaWlDaGFyc0JFIDwgYXNjaWlDaGFyc0xFKVxuICAgICAgICAgICAgICAgIGVuYyA9ICd1dGYtMTZsZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5jO1xufVxuXG5cbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBCdWZmZXIgPSByZXF1aXJlKFwic2FmZXItYnVmZmVyXCIpLkJ1ZmZlcjtcblxuLy8gVVRGLTcgY29kZWMsIGFjY29yZGluZyB0byBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjE1MlxuLy8gU2VlIGFsc28gYmVsb3cgYSBVVEYtNy1JTUFQIGNvZGVjLCBhY2NvcmRpbmcgdG8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTUuMS4zXG5cbmV4cG9ydHMudXRmNyA9IFV0ZjdDb2RlYztcbmV4cG9ydHMudW5pY29kZTExdXRmNyA9ICd1dGY3JzsgLy8gQWxpYXMgVU5JQ09ERS0xLTEtVVRGLTdcbmZ1bmN0aW9uIFV0ZjdDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gICAgdGhpcy5pY29udiA9IGljb252O1xufTtcblxuVXRmN0NvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmN0VuY29kZXI7XG5VdGY3Q29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBVdGY3RGVjb2RlcjtcblV0ZjdDb2RlYy5wcm90b3R5cGUuYm9tQXdhcmUgPSB0cnVlO1xuXG5cbi8vIC0tIEVuY29kaW5nXG5cbnZhciBub25EaXJlY3RDaGFycyA9IC9bXkEtWmEtejAtOSdcXChcXCksLVxcLlxcLzpcXD8gXFxuXFxyXFx0XSsvZztcblxuZnVuY3Rpb24gVXRmN0VuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG59XG5cblV0ZjdFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIC8vIE5haXZlIGltcGxlbWVudGF0aW9uLlxuICAgIC8vIE5vbi1kaXJlY3QgY2hhcnMgYXJlIGVuY29kZWQgYXMgXCIrPGJhc2U2ND4tXCI7IHNpbmdsZSBcIitcIiBjaGFyIGlzIGVuY29kZWQgYXMgXCIrLVwiLlxuICAgIHJldHVybiBCdWZmZXIuZnJvbShzdHIucmVwbGFjZShub25EaXJlY3RDaGFycywgZnVuY3Rpb24oY2h1bmspIHtcbiAgICAgICAgcmV0dXJuIFwiK1wiICsgKGNodW5rID09PSAnKycgPyAnJyA6IFxuICAgICAgICAgICAgdGhpcy5pY29udi5lbmNvZGUoY2h1bmssICd1dGYxNi1iZScpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC89KyQvLCAnJykpIFxuICAgICAgICAgICAgKyBcIi1cIjtcbiAgICB9LmJpbmQodGhpcykpKTtcbn1cblxuVXRmN0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbi8vIC0tIERlY29kaW5nXG5cbmZ1bmN0aW9uIFV0ZjdEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgdGhpcy5pY29udiA9IGNvZGVjLmljb252O1xuICAgIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgICB0aGlzLmJhc2U2NEFjY3VtID0gJyc7XG59XG5cbnZhciBiYXNlNjRSZWdleCA9IC9bQS1aYS16MC05XFwvK10vO1xudmFyIGJhc2U2NENoYXJzID0gW107XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKVxuICAgIGJhc2U2NENoYXJzW2ldID0gYmFzZTY0UmVnZXgudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGkpKTtcblxudmFyIHBsdXNDaGFyID0gJysnLmNoYXJDb2RlQXQoMCksIFxuICAgIG1pbnVzQ2hhciA9ICctJy5jaGFyQ29kZUF0KDApLFxuICAgIGFuZENoYXIgPSAnJicuY2hhckNvZGVBdCgwKTtcblxuVXRmN0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmKSB7XG4gICAgdmFyIHJlcyA9IFwiXCIsIGxhc3RJID0gMCxcbiAgICAgICAgaW5CYXNlNjQgPSB0aGlzLmluQmFzZTY0LFxuICAgICAgICBiYXNlNjRBY2N1bSA9IHRoaXMuYmFzZTY0QWNjdW07XG5cbiAgICAvLyBUaGUgZGVjb2RlciBpcyBtb3JlIGludm9sdmVkIGFzIHdlIG11c3QgaGFuZGxlIGNodW5rcyBpbiBzdHJlYW0uXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWluQmFzZTY0KSB7IC8vIFdlJ3JlIGluIGRpcmVjdCBtb2RlLlxuICAgICAgICAgICAgLy8gV3JpdGUgZGlyZWN0IGNoYXJzIHVudGlsICcrJ1xuICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSBwbHVzQ2hhcikge1xuICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEksIGkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG4gICAgICAgICAgICAgICAgbGFzdEkgPSBpKzE7XG4gICAgICAgICAgICAgICAgaW5CYXNlNjQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgeyAvLyBXZSBkZWNvZGUgYmFzZTY0LlxuICAgICAgICAgICAgaWYgKCFiYXNlNjRDaGFyc1tidWZbaV1dKSB7IC8vIEJhc2U2NCBlbmRlZC5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBsYXN0SSAmJiBidWZbaV0gPT0gbWludXNDaGFyKSB7Ly8gXCIrLVwiIC0+IFwiK1wiXG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSBcIitcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYjY0c3RyID0gYmFzZTY0QWNjdW0gKyBidWYuc2xpY2UobGFzdEksIGkpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIuZnJvbShiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9IG1pbnVzQ2hhcikgLy8gTWludXMgaXMgYWJzb3JiZWQgYWZ0ZXIgYmFzZTY0LlxuICAgICAgICAgICAgICAgICAgICBpLS07XG5cbiAgICAgICAgICAgICAgICBsYXN0SSA9IGkrMTtcbiAgICAgICAgICAgICAgICBpbkJhc2U2NCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJhc2U2NEFjY3VtID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWluQmFzZTY0KSB7XG4gICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGI2NHN0ciA9IGJhc2U2NEFjY3VtICsgYnVmLnNsaWNlKGxhc3RJKS50b1N0cmluZygpO1xuXG4gICAgICAgIHZhciBjYW5CZURlY29kZWQgPSBiNjRzdHIubGVuZ3RoIC0gKGI2NHN0ci5sZW5ndGggJSA4KTsgLy8gTWluaW1hbCBjaHVuazogMiBxdWFkcyAtPiAyeDMgYnl0ZXMgLT4gMyBjaGFycy5cbiAgICAgICAgYmFzZTY0QWNjdW0gPSBiNjRzdHIuc2xpY2UoY2FuQmVEZWNvZGVkKTsgLy8gVGhlIHJlc3Qgd2lsbCBiZSBkZWNvZGVkIGluIGZ1dHVyZS5cbiAgICAgICAgYjY0c3RyID0gYjY0c3RyLnNsaWNlKDAsIGNhbkJlRGVjb2RlZCk7XG5cbiAgICAgICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKEJ1ZmZlci5mcm9tKGI2NHN0ciwgJ2Jhc2U2NCcpLCBcInV0ZjE2LWJlXCIpO1xuICAgIH1cblxuICAgIHRoaXMuaW5CYXNlNjQgPSBpbkJhc2U2NDtcbiAgICB0aGlzLmJhc2U2NEFjY3VtID0gYmFzZTY0QWNjdW07XG5cbiAgICByZXR1cm4gcmVzO1xufVxuXG5VdGY3RGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMuaW5CYXNlNjQgJiYgdGhpcy5iYXNlNjRBY2N1bS5sZW5ndGggPiAwKVxuICAgICAgICByZXMgPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIuZnJvbSh0aGlzLmJhc2U2NEFjY3VtLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG5cbiAgICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gICAgdGhpcy5iYXNlNjRBY2N1bSA9ICcnO1xuICAgIHJldHVybiByZXM7XG59XG5cblxuLy8gVVRGLTctSU1BUCBjb2RlYy5cbi8vIFJGQzM1MDEgU2VjLiA1LjEuMyBNb2RpZmllZCBVVEYtNyAoaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTUuMS4zKVxuLy8gRGlmZmVyZW5jZXM6XG4vLyAgKiBCYXNlNjQgcGFydCBpcyBzdGFydGVkIGJ5IFwiJlwiIGluc3RlYWQgb2YgXCIrXCJcbi8vICAqIERpcmVjdCBjaGFyYWN0ZXJzIGFyZSAweDIwLTB4N0UsIGV4Y2VwdCBcIiZcIiAoMHgyNilcbi8vICAqIEluIEJhc2U2NCwgXCIsXCIgaXMgdXNlZCBpbnN0ZWFkIG9mIFwiL1wiXG4vLyAgKiBCYXNlNjQgbXVzdCBub3QgYmUgdXNlZCB0byByZXByZXNlbnQgZGlyZWN0IGNoYXJhY3RlcnMuXG4vLyAgKiBObyBpbXBsaWNpdCBzaGlmdCBiYWNrIGZyb20gQmFzZTY0IChzaG91bGQgYWx3YXlzIGVuZCB3aXRoICctJylcbi8vICAqIFN0cmluZyBtdXN0IGVuZCBpbiBub24tc2hpZnRlZCBwb3NpdGlvbi5cbi8vICAqIFwiLSZcIiB3aGlsZSBpbiBiYXNlNjQgaXMgbm90IGFsbG93ZWQuXG5cblxuZXhwb3J0cy51dGY3aW1hcCA9IFV0ZjdJTUFQQ29kZWM7XG5mdW5jdGlvbiBVdGY3SU1BUENvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgICB0aGlzLmljb252ID0gaWNvbnY7XG59O1xuXG5VdGY3SU1BUENvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmN0lNQVBFbmNvZGVyO1xuVXRmN0lNQVBDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFV0ZjdJTUFQRGVjb2RlcjtcblV0ZjdJTUFQQ29kZWMucHJvdG90eXBlLmJvbUF3YXJlID0gdHJ1ZTtcblxuXG4vLyAtLSBFbmNvZGluZ1xuXG5mdW5jdGlvbiBVdGY3SU1BUEVuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG4gICAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICAgIHRoaXMuYmFzZTY0QWNjdW0gPSBCdWZmZXIuYWxsb2MoNik7XG4gICAgdGhpcy5iYXNlNjRBY2N1bUlkeCA9IDA7XG59XG5cblV0ZjdJTUFQRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgaW5CYXNlNjQgPSB0aGlzLmluQmFzZTY0LFxuICAgICAgICBiYXNlNjRBY2N1bSA9IHRoaXMuYmFzZTY0QWNjdW0sXG4gICAgICAgIGJhc2U2NEFjY3VtSWR4ID0gdGhpcy5iYXNlNjRBY2N1bUlkeCxcbiAgICAgICAgYnVmID0gQnVmZmVyLmFsbG9jKHN0ci5sZW5ndGgqNSArIDEwKSwgYnVmSWR4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB1Q2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoMHgyMCA8PSB1Q2hhciAmJiB1Q2hhciA8PSAweDdFKSB7IC8vIERpcmVjdCBjaGFyYWN0ZXIgb3IgJyYnLlxuICAgICAgICAgICAgaWYgKGluQmFzZTY0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGJhc2U2NEFjY3VtSWR4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZJZHggKz0gYnVmLndyaXRlKGJhc2U2NEFjY3VtLnNsaWNlKDAsIGJhc2U2NEFjY3VtSWR4KS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvXFwvL2csICcsJykucmVwbGFjZSgvPSskLywgJycpLCBidWZJZHgpO1xuICAgICAgICAgICAgICAgICAgICBiYXNlNjRBY2N1bUlkeCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnVmW2J1ZklkeCsrXSA9IG1pbnVzQ2hhcjsgLy8gV3JpdGUgJy0nLCB0aGVuIGdvIHRvIGRpcmVjdCBtb2RlLlxuICAgICAgICAgICAgICAgIGluQmFzZTY0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaW5CYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBidWZbYnVmSWR4KytdID0gdUNoYXI7IC8vIFdyaXRlIGRpcmVjdCBjaGFyYWN0ZXJcblxuICAgICAgICAgICAgICAgIGlmICh1Q2hhciA9PT0gYW5kQ2hhcikgIC8vIEFtcGVyc2FuZCAtPiAnJi0nXG4gICAgICAgICAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSBtaW51c0NoYXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHsgLy8gTm9uLWRpcmVjdCBjaGFyYWN0ZXJcbiAgICAgICAgICAgIGlmICghaW5CYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBidWZbYnVmSWR4KytdID0gYW5kQ2hhcjsgLy8gV3JpdGUgJyYnLCB0aGVuIGdvIHRvIGJhc2U2NCBtb2RlLlxuICAgICAgICAgICAgICAgIGluQmFzZTY0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbkJhc2U2NCkge1xuICAgICAgICAgICAgICAgIGJhc2U2NEFjY3VtW2Jhc2U2NEFjY3VtSWR4KytdID0gdUNoYXIgPj4gODtcbiAgICAgICAgICAgICAgICBiYXNlNjRBY2N1bVtiYXNlNjRBY2N1bUlkeCsrXSA9IHVDaGFyICYgMHhGRjtcblxuICAgICAgICAgICAgICAgIGlmIChiYXNlNjRBY2N1bUlkeCA9PSBiYXNlNjRBY2N1bS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmSWR4ICs9IGJ1Zi53cml0ZShiYXNlNjRBY2N1bS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvXFwvL2csICcsJyksIGJ1ZklkeCk7XG4gICAgICAgICAgICAgICAgICAgIGJhc2U2NEFjY3VtSWR4ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmluQmFzZTY0ID0gaW5CYXNlNjQ7XG4gICAgdGhpcy5iYXNlNjRBY2N1bUlkeCA9IGJhc2U2NEFjY3VtSWR4O1xuXG4gICAgcmV0dXJuIGJ1Zi5zbGljZSgwLCBidWZJZHgpO1xufVxuXG5VdGY3SU1BUEVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBidWYgPSBCdWZmZXIuYWxsb2MoMTApLCBidWZJZHggPSAwO1xuICAgIGlmICh0aGlzLmluQmFzZTY0KSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2U2NEFjY3VtSWR4ID4gMCkge1xuICAgICAgICAgICAgYnVmSWR4ICs9IGJ1Zi53cml0ZSh0aGlzLmJhc2U2NEFjY3VtLnNsaWNlKDAsIHRoaXMuYmFzZTY0QWNjdW1JZHgpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXC8vZywgJywnKS5yZXBsYWNlKC89KyQvLCAnJyksIGJ1ZklkeCk7XG4gICAgICAgICAgICB0aGlzLmJhc2U2NEFjY3VtSWR4ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1ZltidWZJZHgrK10gPSBtaW51c0NoYXI7IC8vIFdyaXRlICctJywgdGhlbiBnbyB0byBkaXJlY3QgbW9kZS5cbiAgICAgICAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBidWYuc2xpY2UoMCwgYnVmSWR4KTtcbn1cblxuXG4vLyAtLSBEZWNvZGluZ1xuXG5mdW5jdGlvbiBVdGY3SU1BUERlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG4gICAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICAgIHRoaXMuYmFzZTY0QWNjdW0gPSAnJztcbn1cblxudmFyIGJhc2U2NElNQVBDaGFycyA9IGJhc2U2NENoYXJzLnNsaWNlKCk7XG5iYXNlNjRJTUFQQ2hhcnNbJywnLmNoYXJDb2RlQXQoMCldID0gdHJ1ZTtcblxuVXRmN0lNQVBEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIHZhciByZXMgPSBcIlwiLCBsYXN0SSA9IDAsXG4gICAgICAgIGluQmFzZTY0ID0gdGhpcy5pbkJhc2U2NCxcbiAgICAgICAgYmFzZTY0QWNjdW0gPSB0aGlzLmJhc2U2NEFjY3VtO1xuXG4gICAgLy8gVGhlIGRlY29kZXIgaXMgbW9yZSBpbnZvbHZlZCBhcyB3ZSBtdXN0IGhhbmRsZSBjaHVua3MgaW4gc3RyZWFtLlxuICAgIC8vIEl0IGlzIGZvcmdpdmluZywgY2xvc2VyIHRvIHN0YW5kYXJkIFVURi03IChmb3IgZXhhbXBsZSwgJy0nIGlzIG9wdGlvbmFsIGF0IHRoZSBlbmQpLlxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFpbkJhc2U2NCkgeyAvLyBXZSdyZSBpbiBkaXJlY3QgbW9kZS5cbiAgICAgICAgICAgIC8vIFdyaXRlIGRpcmVjdCBjaGFycyB1bnRpbCAnJidcbiAgICAgICAgICAgIGlmIChidWZbaV0gPT0gYW5kQ2hhcikge1xuICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEksIGkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG4gICAgICAgICAgICAgICAgbGFzdEkgPSBpKzE7XG4gICAgICAgICAgICAgICAgaW5CYXNlNjQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgeyAvLyBXZSBkZWNvZGUgYmFzZTY0LlxuICAgICAgICAgICAgaWYgKCFiYXNlNjRJTUFQQ2hhcnNbYnVmW2ldXSkgeyAvLyBCYXNlNjQgZW5kZWQuXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gbGFzdEkgJiYgYnVmW2ldID09IG1pbnVzQ2hhcikgeyAvLyBcIiYtXCIgLT4gXCImXCJcbiAgICAgICAgICAgICAgICAgICAgcmVzICs9IFwiJlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiNjRzdHIgPSBiYXNlNjRBY2N1bSArIGJ1Zi5zbGljZShsYXN0SSwgaSkudG9TdHJpbmcoKS5yZXBsYWNlKC8sL2csICcvJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIuZnJvbShiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9IG1pbnVzQ2hhcikgLy8gTWludXMgbWF5IGJlIGFic29yYmVkIGFmdGVyIGJhc2U2NC5cbiAgICAgICAgICAgICAgICAgICAgaS0tO1xuXG4gICAgICAgICAgICAgICAgbGFzdEkgPSBpKzE7XG4gICAgICAgICAgICAgICAgaW5CYXNlNjQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBiYXNlNjRBY2N1bSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbkJhc2U2NCkge1xuICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoYnVmLnNsaWNlKGxhc3RJKSwgXCJhc2NpaVwiKTsgLy8gV3JpdGUgZGlyZWN0IGNoYXJzLlxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBiNjRzdHIgPSBiYXNlNjRBY2N1bSArIGJ1Zi5zbGljZShsYXN0SSkudG9TdHJpbmcoKS5yZXBsYWNlKC8sL2csICcvJyk7XG5cbiAgICAgICAgdmFyIGNhbkJlRGVjb2RlZCA9IGI2NHN0ci5sZW5ndGggLSAoYjY0c3RyLmxlbmd0aCAlIDgpOyAvLyBNaW5pbWFsIGNodW5rOiAyIHF1YWRzIC0+IDJ4MyBieXRlcyAtPiAzIGNoYXJzLlxuICAgICAgICBiYXNlNjRBY2N1bSA9IGI2NHN0ci5zbGljZShjYW5CZURlY29kZWQpOyAvLyBUaGUgcmVzdCB3aWxsIGJlIGRlY29kZWQgaW4gZnV0dXJlLlxuICAgICAgICBiNjRzdHIgPSBiNjRzdHIuc2xpY2UoMCwgY2FuQmVEZWNvZGVkKTtcblxuICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoQnVmZmVyLmZyb20oYjY0c3RyLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG4gICAgfVxuXG4gICAgdGhpcy5pbkJhc2U2NCA9IGluQmFzZTY0O1xuICAgIHRoaXMuYmFzZTY0QWNjdW0gPSBiYXNlNjRBY2N1bTtcblxuICAgIHJldHVybiByZXM7XG59XG5cblV0ZjdJTUFQRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMuaW5CYXNlNjQgJiYgdGhpcy5iYXNlNjRBY2N1bS5sZW5ndGggPiAwKVxuICAgICAgICByZXMgPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIuZnJvbSh0aGlzLmJhc2U2NEFjY3VtLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG5cbiAgICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gICAgdGhpcy5iYXNlNjRBY2N1bSA9ICcnO1xuICAgIHJldHVybiByZXM7XG59XG5cblxuIiwgIlwidXNlIHN0cmljdFwiO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoXCJzYWZlci1idWZmZXJcIikuQnVmZmVyO1xuXG4vLyBTaW5nbGUtYnl0ZSBjb2RlYy4gTmVlZHMgYSAnY2hhcnMnIHN0cmluZyBwYXJhbWV0ZXIgdGhhdCBjb250YWlucyAyNTYgb3IgMTI4IGNoYXJzIHRoYXRcbi8vIGNvcnJlc3BvbmQgdG8gZW5jb2RlZCBieXRlcyAoaWYgMTI4IC0gdGhlbiBsb3dlciBoYWxmIGlzIEFTQ0lJKS4gXG5cbmV4cG9ydHMuX3NiY3MgPSBTQkNTQ29kZWM7XG5mdW5jdGlvbiBTQkNTQ29kZWMoY29kZWNPcHRpb25zLCBpY29udikge1xuICAgIGlmICghY29kZWNPcHRpb25zKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTQkNTIGNvZGVjIGlzIGNhbGxlZCB3aXRob3V0IHRoZSBkYXRhLlwiKVxuICAgIFxuICAgIC8vIFByZXBhcmUgY2hhciBidWZmZXIgZm9yIGRlY29kaW5nLlxuICAgIGlmICghY29kZWNPcHRpb25zLmNoYXJzIHx8IChjb2RlY09wdGlvbnMuY2hhcnMubGVuZ3RoICE9PSAxMjggJiYgY29kZWNPcHRpb25zLmNoYXJzLmxlbmd0aCAhPT0gMjU2KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5jb2RpbmcgJ1wiK2NvZGVjT3B0aW9ucy50eXBlK1wiJyBoYXMgaW5jb3JyZWN0ICdjaGFycycgKG11c3QgYmUgb2YgbGVuIDEyOCBvciAyNTYpXCIpO1xuICAgIFxuICAgIGlmIChjb2RlY09wdGlvbnMuY2hhcnMubGVuZ3RoID09PSAxMjgpIHtcbiAgICAgICAgdmFyIGFzY2lpU3RyaW5nID0gXCJcIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMjg7IGkrKylcbiAgICAgICAgICAgIGFzY2lpU3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSk7XG4gICAgICAgIGNvZGVjT3B0aW9ucy5jaGFycyA9IGFzY2lpU3RyaW5nICsgY29kZWNPcHRpb25zLmNoYXJzO1xuICAgIH1cblxuICAgIHRoaXMuZGVjb2RlQnVmID0gQnVmZmVyLmZyb20oY29kZWNPcHRpb25zLmNoYXJzLCAndWNzMicpO1xuICAgIFxuICAgIC8vIEVuY29kaW5nIGJ1ZmZlci5cbiAgICB2YXIgZW5jb2RlQnVmID0gQnVmZmVyLmFsbG9jKDY1NTM2LCBpY29udi5kZWZhdWx0Q2hhclNpbmdsZUJ5dGUuY2hhckNvZGVBdCgwKSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVjT3B0aW9ucy5jaGFycy5sZW5ndGg7IGkrKylcbiAgICAgICAgZW5jb2RlQnVmW2NvZGVjT3B0aW9ucy5jaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG5cbiAgICB0aGlzLmVuY29kZUJ1ZiA9IGVuY29kZUJ1Zjtcbn1cblxuU0JDU0NvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gU0JDU0VuY29kZXI7XG5TQkNTQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBTQkNTRGVjb2RlcjtcblxuXG5mdW5jdGlvbiBTQkNTRW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMuZW5jb2RlQnVmID0gY29kZWMuZW5jb2RlQnVmO1xufVxuXG5TQkNTRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jKHN0ci5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKVxuICAgICAgICBidWZbaV0gPSB0aGlzLmVuY29kZUJ1ZltzdHIuY2hhckNvZGVBdChpKV07XG4gICAgXG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxuU0JDU0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbmZ1bmN0aW9uIFNCQ1NEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgdGhpcy5kZWNvZGVCdWYgPSBjb2RlYy5kZWNvZGVCdWY7XG59XG5cblNCQ1NEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIC8vIFN0cmluZ3MgYXJlIGltbXV0YWJsZSBpbiBKUyAtPiB3ZSB1c2UgdWNzMiBidWZmZXIgdG8gc3BlZWQgdXAgY29tcHV0YXRpb25zLlxuICAgIHZhciBkZWNvZGVCdWYgPSB0aGlzLmRlY29kZUJ1ZjtcbiAgICB2YXIgbmV3QnVmID0gQnVmZmVyLmFsbG9jKGJ1Zi5sZW5ndGgqMik7XG4gICAgdmFyIGlkeDEgPSAwLCBpZHgyID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZHgxID0gYnVmW2ldKjI7IGlkeDIgPSBpKjI7XG4gICAgICAgIG5ld0J1ZltpZHgyXSA9IGRlY29kZUJ1ZltpZHgxXTtcbiAgICAgICAgbmV3QnVmW2lkeDIrMV0gPSBkZWNvZGVCdWZbaWR4MSsxXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0J1Zi50b1N0cmluZygndWNzMicpO1xufVxuXG5TQkNTRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIE1hbnVhbGx5IGFkZGVkIGRhdGEgdG8gYmUgdXNlZCBieSBzYmNzIGNvZGVjIGluIGFkZGl0aW9uIHRvIGdlbmVyYXRlZCBvbmUuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8vIE5vdCBzdXBwb3J0ZWQgYnkgaWNvbnYsIG5vdCBzdXJlIHdoeS5cbiAgICBcIjEwMDI5XCI6IFwibWFjY2VudGV1cm9cIixcbiAgICBcIm1hY2NlbnRldXJvXCI6IHtcbiAgICAgICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICAgICAgXCJjaGFyc1wiOiBcIlx1MDBDNFx1MDEwMFx1MDEwMVx1MDBDOVx1MDEwNFx1MDBENlx1MDBEQ1x1MDBFMVx1MDEwNVx1MDEwQ1x1MDBFNFx1MDEwRFx1MDEwNlx1MDEwN1x1MDBFOVx1MDE3OVx1MDE3QVx1MDEwRVx1MDBFRFx1MDEwRlx1MDExMlx1MDExM1x1MDExNlx1MDBGM1x1MDExN1x1MDBGNFx1MDBGNlx1MDBGNVx1MDBGQVx1MDExQVx1MDExQlx1MDBGQ1x1MjAyMFx1MDBCMFx1MDExOFx1MDBBM1x1MDBBN1x1MjAyMlx1MDBCNlx1MDBERlx1MDBBRVx1MDBBOVx1MjEyMlx1MDExOVx1MDBBOFx1MjI2MFx1MDEyM1x1MDEyRVx1MDEyRlx1MDEyQVx1MjI2NFx1MjI2NVx1MDEyQlx1MDEzNlx1MjIwMlx1MjIxMVx1MDE0Mlx1MDEzQlx1MDEzQ1x1MDEzRFx1MDEzRVx1MDEzOVx1MDEzQVx1MDE0NVx1MDE0Nlx1MDE0M1x1MDBBQ1x1MjIxQVx1MDE0NFx1MDE0N1x1MjIwNlx1MDBBQlx1MDBCQlx1MjAyNlx1MDBBMFx1MDE0OFx1MDE1MFx1MDBENVx1MDE1MVx1MDE0Q1x1MjAxM1x1MjAxNFx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVx1MDBGN1x1MjVDQVx1MDE0RFx1MDE1NFx1MDE1NVx1MDE1OFx1MjAzOVx1MjAzQVx1MDE1OVx1MDE1Nlx1MDE1N1x1MDE2MFx1MjAxQVx1MjAxRVx1MDE2MVx1MDE1QVx1MDE1Qlx1MDBDMVx1MDE2NFx1MDE2NVx1MDBDRFx1MDE3RFx1MDE3RVx1MDE2QVx1MDBEM1x1MDBENFx1MDE2Qlx1MDE2RVx1MDBEQVx1MDE2Rlx1MDE3MFx1MDE3MVx1MDE3Mlx1MDE3M1x1MDBERFx1MDBGRFx1MDEzN1x1MDE3Qlx1MDE0MVx1MDE3Q1x1MDEyMlx1MDJDN1wiXG4gICAgfSxcblxuICAgIFwiODA4XCI6IFwiY3A4MDhcIixcbiAgICBcImlibTgwOFwiOiBcImNwODA4XCIsXG4gICAgXCJjcDgwOFwiOiB7XG4gICAgICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgICAgIFwiY2hhcnNcIjogXCJcdTA0MTBcdTA0MTFcdTA0MTJcdTA0MTNcdTA0MTRcdTA0MTVcdTA0MTZcdTA0MTdcdTA0MThcdTA0MTlcdTA0MUFcdTA0MUJcdTA0MUNcdTA0MURcdTA0MUVcdTA0MUZcdTA0MjBcdTA0MjFcdTA0MjJcdTA0MjNcdTA0MjRcdTA0MjVcdTA0MjZcdTA0MjdcdTA0MjhcdTA0MjlcdTA0MkFcdTA0MkJcdTA0MkNcdTA0MkRcdTA0MkVcdTA0MkZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0MzZcdTA0MzdcdTA0MzhcdTA0MzlcdTA0M0FcdTA0M0JcdTA0M0NcdTA0M0RcdTA0M0VcdTA0M0ZcdTI1OTFcdTI1OTJcdTI1OTNcdTI1MDJcdTI1MjRcdTI1NjFcdTI1NjJcdTI1NTZcdTI1NTVcdTI1NjNcdTI1NTFcdTI1NTdcdTI1NURcdTI1NUNcdTI1NUJcdTI1MTBcdTI1MTRcdTI1MzRcdTI1MkNcdTI1MUNcdTI1MDBcdTI1M0NcdTI1NUVcdTI1NUZcdTI1NUFcdTI1NTRcdTI1NjlcdTI1NjZcdTI1NjBcdTI1NTBcdTI1NkNcdTI1NjdcdTI1NjhcdTI1NjRcdTI1NjVcdTI1NTlcdTI1NThcdTI1NTJcdTI1NTNcdTI1NkJcdTI1NkFcdTI1MThcdTI1MENcdTI1ODhcdTI1ODRcdTI1OENcdTI1OTBcdTI1ODBcdTA0NDBcdTA0NDFcdTA0NDJcdTA0NDNcdTA0NDRcdTA0NDVcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NERcdTA0NEVcdTA0NEZcdTA0MDFcdTA0NTFcdTA0MDRcdTA0NTRcdTA0MDdcdTA0NTdcdTA0MEVcdTA0NUVcdTAwQjBcdTIyMTlcdTAwQjdcdTIyMUFcdTIxMTZcdTIwQUNcdTI1QTBcdTAwQTBcIlxuICAgIH0sXG5cbiAgICBcIm1pa1wiOiB7XG4gICAgICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgICAgIFwiY2hhcnNcIjogXCJcdTA0MTBcdTA0MTFcdTA0MTJcdTA0MTNcdTA0MTRcdTA0MTVcdTA0MTZcdTA0MTdcdTA0MThcdTA0MTlcdTA0MUFcdTA0MUJcdTA0MUNcdTA0MURcdTA0MUVcdTA0MUZcdTA0MjBcdTA0MjFcdTA0MjJcdTA0MjNcdTA0MjRcdTA0MjVcdTA0MjZcdTA0MjdcdTA0MjhcdTA0MjlcdTA0MkFcdTA0MkJcdTA0MkNcdTA0MkRcdTA0MkVcdTA0MkZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0MzZcdTA0MzdcdTA0MzhcdTA0MzlcdTA0M0FcdTA0M0JcdTA0M0NcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0NDFcdTA0NDJcdTA0NDNcdTA0NDRcdTA0NDVcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NERcdTA0NEVcdTA0NEZcdTI1MTRcdTI1MzRcdTI1MkNcdTI1MUNcdTI1MDBcdTI1M0NcdTI1NjNcdTI1NTFcdTI1NUFcdTI1NTRcdTI1NjlcdTI1NjZcdTI1NjBcdTI1NTBcdTI1NkNcdTI1MTBcdTI1OTFcdTI1OTJcdTI1OTNcdTI1MDJcdTI1MjRcdTIxMTZcdTAwQTdcdTI1NTdcdTI1NURcdTI1MThcdTI1MENcdTI1ODhcdTI1ODRcdTI1OENcdTI1OTBcdTI1ODBcdTAzQjFcdTAwREZcdTAzOTNcdTAzQzBcdTAzQTNcdTAzQzNcdTAwQjVcdTAzQzRcdTAzQTZcdTAzOThcdTAzQTlcdTAzQjRcdTIyMUVcdTAzQzZcdTAzQjVcdTIyMjlcdTIyNjFcdTAwQjFcdTIyNjVcdTIyNjRcdTIzMjBcdTIzMjFcdTAwRjdcdTIyNDhcdTAwQjBcdTIyMTlcdTAwQjdcdTIyMUFcdTIwN0ZcdTAwQjJcdTI1QTBcdTAwQTBcIlxuICAgIH0sXG5cbiAgICAvLyBBbGlhc2VzIG9mIGdlbmVyYXRlZCBlbmNvZGluZ3MuXG4gICAgXCJhc2NpaThiaXRcIjogXCJhc2NpaVwiLFxuICAgIFwidXNhc2NpaVwiOiBcImFzY2lpXCIsXG4gICAgXCJhbnNpeDM0XCI6IFwiYXNjaWlcIixcbiAgICBcImFuc2l4MzQxOTY4XCI6IFwiYXNjaWlcIixcbiAgICBcImFuc2l4MzQxOTg2XCI6IFwiYXNjaWlcIixcbiAgICBcImNzYXNjaWlcIjogXCJhc2NpaVwiLFxuICAgIFwiY3AzNjdcIjogXCJhc2NpaVwiLFxuICAgIFwiaWJtMzY3XCI6IFwiYXNjaWlcIixcbiAgICBcImlzb2lyNlwiOiBcImFzY2lpXCIsXG4gICAgXCJpc282NDZ1c1wiOiBcImFzY2lpXCIsXG4gICAgXCJpc282NDZpcnZcIjogXCJhc2NpaVwiLFxuICAgIFwidXNcIjogXCJhc2NpaVwiLFxuXG4gICAgXCJsYXRpbjFcIjogXCJpc284ODU5MVwiLFxuICAgIFwibGF0aW4yXCI6IFwiaXNvODg1OTJcIixcbiAgICBcImxhdGluM1wiOiBcImlzbzg4NTkzXCIsXG4gICAgXCJsYXRpbjRcIjogXCJpc284ODU5NFwiLFxuICAgIFwibGF0aW41XCI6IFwiaXNvODg1OTlcIixcbiAgICBcImxhdGluNlwiOiBcImlzbzg4NTkxMFwiLFxuICAgIFwibGF0aW43XCI6IFwiaXNvODg1OTEzXCIsXG4gICAgXCJsYXRpbjhcIjogXCJpc284ODU5MTRcIixcbiAgICBcImxhdGluOVwiOiBcImlzbzg4NTkxNVwiLFxuICAgIFwibGF0aW4xMFwiOiBcImlzbzg4NTkxNlwiLFxuXG4gICAgXCJjc2lzb2xhdGluMVwiOiBcImlzbzg4NTkxXCIsXG4gICAgXCJjc2lzb2xhdGluMlwiOiBcImlzbzg4NTkyXCIsXG4gICAgXCJjc2lzb2xhdGluM1wiOiBcImlzbzg4NTkzXCIsXG4gICAgXCJjc2lzb2xhdGluNFwiOiBcImlzbzg4NTk0XCIsXG4gICAgXCJjc2lzb2xhdGluY3lyaWxsaWNcIjogXCJpc284ODU5NVwiLFxuICAgIFwiY3Npc29sYXRpbmFyYWJpY1wiOiBcImlzbzg4NTk2XCIsXG4gICAgXCJjc2lzb2xhdGluZ3JlZWtcIiA6IFwiaXNvODg1OTdcIixcbiAgICBcImNzaXNvbGF0aW5oZWJyZXdcIjogXCJpc284ODU5OFwiLFxuICAgIFwiY3Npc29sYXRpbjVcIjogXCJpc284ODU5OVwiLFxuICAgIFwiY3Npc29sYXRpbjZcIjogXCJpc284ODU5MTBcIixcblxuICAgIFwibDFcIjogXCJpc284ODU5MVwiLFxuICAgIFwibDJcIjogXCJpc284ODU5MlwiLFxuICAgIFwibDNcIjogXCJpc284ODU5M1wiLFxuICAgIFwibDRcIjogXCJpc284ODU5NFwiLFxuICAgIFwibDVcIjogXCJpc284ODU5OVwiLFxuICAgIFwibDZcIjogXCJpc284ODU5MTBcIixcbiAgICBcImw3XCI6IFwiaXNvODg1OTEzXCIsXG4gICAgXCJsOFwiOiBcImlzbzg4NTkxNFwiLFxuICAgIFwibDlcIjogXCJpc284ODU5MTVcIixcbiAgICBcImwxMFwiOiBcImlzbzg4NTkxNlwiLFxuXG4gICAgXCJpc29pcjE0XCI6IFwiaXNvNjQ2anBcIixcbiAgICBcImlzb2lyNTdcIjogXCJpc282NDZjblwiLFxuICAgIFwiaXNvaXIxMDBcIjogXCJpc284ODU5MVwiLFxuICAgIFwiaXNvaXIxMDFcIjogXCJpc284ODU5MlwiLFxuICAgIFwiaXNvaXIxMDlcIjogXCJpc284ODU5M1wiLFxuICAgIFwiaXNvaXIxMTBcIjogXCJpc284ODU5NFwiLFxuICAgIFwiaXNvaXIxNDRcIjogXCJpc284ODU5NVwiLFxuICAgIFwiaXNvaXIxMjdcIjogXCJpc284ODU5NlwiLFxuICAgIFwiaXNvaXIxMjZcIjogXCJpc284ODU5N1wiLFxuICAgIFwiaXNvaXIxMzhcIjogXCJpc284ODU5OFwiLFxuICAgIFwiaXNvaXIxNDhcIjogXCJpc284ODU5OVwiLFxuICAgIFwiaXNvaXIxNTdcIjogXCJpc284ODU5MTBcIixcbiAgICBcImlzb2lyMTY2XCI6IFwidGlzNjIwXCIsXG4gICAgXCJpc29pcjE3OVwiOiBcImlzbzg4NTkxM1wiLFxuICAgIFwiaXNvaXIxOTlcIjogXCJpc284ODU5MTRcIixcbiAgICBcImlzb2lyMjAzXCI6IFwiaXNvODg1OTE1XCIsXG4gICAgXCJpc29pcjIyNlwiOiBcImlzbzg4NTkxNlwiLFxuXG4gICAgXCJjcDgxOVwiOiBcImlzbzg4NTkxXCIsXG4gICAgXCJpYm04MTlcIjogXCJpc284ODU5MVwiLFxuXG4gICAgXCJjeXJpbGxpY1wiOiBcImlzbzg4NTk1XCIsXG5cbiAgICBcImFyYWJpY1wiOiBcImlzbzg4NTk2XCIsXG4gICAgXCJhcmFiaWM4XCI6IFwiaXNvODg1OTZcIixcbiAgICBcImVjbWExMTRcIjogXCJpc284ODU5NlwiLFxuICAgIFwiYXNtbzcwOFwiOiBcImlzbzg4NTk2XCIsXG5cbiAgICBcImdyZWVrXCIgOiBcImlzbzg4NTk3XCIsXG4gICAgXCJncmVlazhcIiA6IFwiaXNvODg1OTdcIixcbiAgICBcImVjbWExMThcIiA6IFwiaXNvODg1OTdcIixcbiAgICBcImVsb3Q5MjhcIiA6IFwiaXNvODg1OTdcIixcblxuICAgIFwiaGVicmV3XCI6IFwiaXNvODg1OThcIixcbiAgICBcImhlYnJldzhcIjogXCJpc284ODU5OFwiLFxuXG4gICAgXCJ0dXJraXNoXCI6IFwiaXNvODg1OTlcIixcbiAgICBcInR1cmtpc2g4XCI6IFwiaXNvODg1OTlcIixcblxuICAgIFwidGhhaVwiOiBcImlzbzg4NTkxMVwiLFxuICAgIFwidGhhaThcIjogXCJpc284ODU5MTFcIixcblxuICAgIFwiY2VsdGljXCI6IFwiaXNvODg1OTE0XCIsXG4gICAgXCJjZWx0aWM4XCI6IFwiaXNvODg1OTE0XCIsXG4gICAgXCJpc29jZWx0aWNcIjogXCJpc284ODU5MTRcIixcblxuICAgIFwidGlzNjIwMFwiOiBcInRpczYyMFwiLFxuICAgIFwidGlzNjIwMjUyOTFcIjogXCJ0aXM2MjBcIixcbiAgICBcInRpczYyMDI1MzMwXCI6IFwidGlzNjIwXCIsXG5cbiAgICBcIjEwMDAwXCI6IFwibWFjcm9tYW5cIixcbiAgICBcIjEwMDA2XCI6IFwibWFjZ3JlZWtcIixcbiAgICBcIjEwMDA3XCI6IFwibWFjY3lyaWxsaWNcIixcbiAgICBcIjEwMDc5XCI6IFwibWFjaWNlbGFuZFwiLFxuICAgIFwiMTAwODFcIjogXCJtYWN0dXJraXNoXCIsXG5cbiAgICBcImNzcGM4Y29kZXBhZ2U0MzdcIjogXCJjcDQzN1wiLFxuICAgIFwiY3NwYzc3NWJhbHRpY1wiOiBcImNwNzc1XCIsXG4gICAgXCJjc3BjODUwbXVsdGlsaW5ndWFsXCI6IFwiY3A4NTBcIixcbiAgICBcImNzcGNwODUyXCI6IFwiY3A4NTJcIixcbiAgICBcImNzcGM4NjJsYXRpbmhlYnJld1wiOiBcImNwODYyXCIsXG4gICAgXCJjcGdyXCI6IFwiY3A4NjlcIixcblxuICAgIFwibXNlZVwiOiBcImNwMTI1MFwiLFxuICAgIFwibXNjeXJsXCI6IFwiY3AxMjUxXCIsXG4gICAgXCJtc2Fuc2lcIjogXCJjcDEyNTJcIixcbiAgICBcIm1zZ3JlZWtcIjogXCJjcDEyNTNcIixcbiAgICBcIm1zdHVya1wiOiBcImNwMTI1NFwiLFxuICAgIFwibXNoZWJyXCI6IFwiY3AxMjU1XCIsXG4gICAgXCJtc2FyYWJcIjogXCJjcDEyNTZcIixcbiAgICBcIndpbmJhbHRyaW1cIjogXCJjcDEyNTdcIixcblxuICAgIFwiY3AyMDg2NlwiOiBcImtvaThyXCIsXG4gICAgXCIyMDg2NlwiOiBcImtvaThyXCIsXG4gICAgXCJpYm04NzhcIjogXCJrb2k4clwiLFxuICAgIFwiY3Nrb2k4clwiOiBcImtvaThyXCIsXG5cbiAgICBcImNwMjE4NjZcIjogXCJrb2k4dVwiLFxuICAgIFwiMjE4NjZcIjogXCJrb2k4dVwiLFxuICAgIFwiaWJtMTE2OFwiOiBcImtvaTh1XCIsXG5cbiAgICBcInN0cmsxMDQ4MjAwMlwiOiBcInJrMTA0OFwiLFxuXG4gICAgXCJ0Y3ZuNTcxMlwiOiBcInRjdm5cIixcbiAgICBcInRjdm41NzEyMVwiOiBcInRjdm5cIixcblxuICAgIFwiZ2IxOTg4ODBcIjogXCJpc282NDZjblwiLFxuICAgIFwiY25cIjogXCJpc282NDZjblwiLFxuXG4gICAgXCJjc2lzbzE0amlzYzYyMjByb1wiOiBcImlzbzY0NmpwXCIsXG4gICAgXCJqaXNjNjIyMDE5Njlyb1wiOiBcImlzbzY0NmpwXCIsXG4gICAgXCJqcFwiOiBcImlzbzY0NmpwXCIsXG5cbiAgICBcImNzaHByb21hbjhcIjogXCJocHJvbWFuOFwiLFxuICAgIFwicjhcIjogXCJocHJvbWFuOFwiLFxuICAgIFwicm9tYW44XCI6IFwiaHByb21hbjhcIixcbiAgICBcInhyb21hbjhcIjogXCJocHJvbWFuOFwiLFxuICAgIFwiaWJtMTA1MVwiOiBcImhwcm9tYW44XCIsXG5cbiAgICBcIm1hY1wiOiBcIm1hY2ludG9zaFwiLFxuICAgIFwiY3NtYWNpbnRvc2hcIjogXCJtYWNpbnRvc2hcIixcbn07XG5cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLy8gR2VuZXJhdGVkIGRhdGEgZm9yIHNiY3MgY29kZWMuIERvbid0IGVkaXQgbWFudWFsbHkuIFJlZ2VuZXJhdGUgdXNpbmcgZ2VuZXJhdGlvbi9nZW4tc2Jjcy5qcyBzY3JpcHQuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCI0MzdcIjogXCJjcDQzN1wiLFxuICBcIjczN1wiOiBcImNwNzM3XCIsXG4gIFwiNzc1XCI6IFwiY3A3NzVcIixcbiAgXCI4NTBcIjogXCJjcDg1MFwiLFxuICBcIjg1MlwiOiBcImNwODUyXCIsXG4gIFwiODU1XCI6IFwiY3A4NTVcIixcbiAgXCI4NTZcIjogXCJjcDg1NlwiLFxuICBcIjg1N1wiOiBcImNwODU3XCIsXG4gIFwiODU4XCI6IFwiY3A4NThcIixcbiAgXCI4NjBcIjogXCJjcDg2MFwiLFxuICBcIjg2MVwiOiBcImNwODYxXCIsXG4gIFwiODYyXCI6IFwiY3A4NjJcIixcbiAgXCI4NjNcIjogXCJjcDg2M1wiLFxuICBcIjg2NFwiOiBcImNwODY0XCIsXG4gIFwiODY1XCI6IFwiY3A4NjVcIixcbiAgXCI4NjZcIjogXCJjcDg2NlwiLFxuICBcIjg2OVwiOiBcImNwODY5XCIsXG4gIFwiODc0XCI6IFwid2luZG93czg3NFwiLFxuICBcIjkyMlwiOiBcImNwOTIyXCIsXG4gIFwiMTA0NlwiOiBcImNwMTA0NlwiLFxuICBcIjExMjRcIjogXCJjcDExMjRcIixcbiAgXCIxMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiMTEyOVwiOiBcImNwMTEyOVwiLFxuICBcIjExMzNcIjogXCJjcDExMzNcIixcbiAgXCIxMTYxXCI6IFwiY3AxMTYxXCIsXG4gIFwiMTE2MlwiOiBcImNwMTE2MlwiLFxuICBcIjExNjNcIjogXCJjcDExNjNcIixcbiAgXCIxMjUwXCI6IFwid2luZG93czEyNTBcIixcbiAgXCIxMjUxXCI6IFwid2luZG93czEyNTFcIixcbiAgXCIxMjUyXCI6IFwid2luZG93czEyNTJcIixcbiAgXCIxMjUzXCI6IFwid2luZG93czEyNTNcIixcbiAgXCIxMjU0XCI6IFwid2luZG93czEyNTRcIixcbiAgXCIxMjU1XCI6IFwid2luZG93czEyNTVcIixcbiAgXCIxMjU2XCI6IFwid2luZG93czEyNTZcIixcbiAgXCIxMjU3XCI6IFwid2luZG93czEyNTdcIixcbiAgXCIxMjU4XCI6IFwid2luZG93czEyNThcIixcbiAgXCIyODU5MVwiOiBcImlzbzg4NTkxXCIsXG4gIFwiMjg1OTJcIjogXCJpc284ODU5MlwiLFxuICBcIjI4NTkzXCI6IFwiaXNvODg1OTNcIixcbiAgXCIyODU5NFwiOiBcImlzbzg4NTk0XCIsXG4gIFwiMjg1OTVcIjogXCJpc284ODU5NVwiLFxuICBcIjI4NTk2XCI6IFwiaXNvODg1OTZcIixcbiAgXCIyODU5N1wiOiBcImlzbzg4NTk3XCIsXG4gIFwiMjg1OThcIjogXCJpc284ODU5OFwiLFxuICBcIjI4NTk5XCI6IFwiaXNvODg1OTlcIixcbiAgXCIyODYwMFwiOiBcImlzbzg4NTkxMFwiLFxuICBcIjI4NjAxXCI6IFwiaXNvODg1OTExXCIsXG4gIFwiMjg2MDNcIjogXCJpc284ODU5MTNcIixcbiAgXCIyODYwNFwiOiBcImlzbzg4NTkxNFwiLFxuICBcIjI4NjA1XCI6IFwiaXNvODg1OTE1XCIsXG4gIFwiMjg2MDZcIjogXCJpc284ODU5MTZcIixcbiAgXCJ3aW5kb3dzODc0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTIwQUNcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTIwMjZcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTAwQTBcdTBFMDFcdTBFMDJcdTBFMDNcdTBFMDRcdTBFMDVcdTBFMDZcdTBFMDdcdTBFMDhcdTBFMDlcdTBFMEFcdTBFMEJcdTBFMENcdTBFMERcdTBFMEVcdTBFMEZcdTBFMTBcdTBFMTFcdTBFMTJcdTBFMTNcdTBFMTRcdTBFMTVcdTBFMTZcdTBFMTdcdTBFMThcdTBFMTlcdTBFMUFcdTBFMUJcdTBFMUNcdTBFMURcdTBFMUVcdTBFMUZcdTBFMjBcdTBFMjFcdTBFMjJcdTBFMjNcdTBFMjRcdTBFMjVcdTBFMjZcdTBFMjdcdTBFMjhcdTBFMjlcdTBFMkFcdTBFMkJcdTBFMkNcdTBFMkRcdTBFMkVcdTBFMkZcdTBFMzBcdTBFMzFcdTBFMzJcdTBFMzNcdTBFMzRcdTBFMzVcdTBFMzZcdTBFMzdcdTBFMzhcdTBFMzlcdTBFM0FcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTBFM0ZcdTBFNDBcdTBFNDFcdTBFNDJcdTBFNDNcdTBFNDRcdTBFNDVcdTBFNDZcdTBFNDdcdTBFNDhcdTBFNDlcdTBFNEFcdTBFNEJcdTBFNENcdTBFNERcdTBFNEVcdTBFNEZcdTBFNTBcdTBFNTFcdTBFNTJcdTBFNTNcdTBFNTRcdTBFNTVcdTBFNTZcdTBFNTdcdTBFNThcdTBFNTlcdTBFNUFcdTBFNUJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcIlxuICB9LFxuICBcIndpbjg3NFwiOiBcIndpbmRvd3M4NzRcIixcbiAgXCJjcDg3NFwiOiBcIndpbmRvd3M4NzRcIixcbiAgXCJ3aW5kb3dzMTI1MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUyMEFDXHVGRkZEXHUyMDFBXHVGRkZEXHUyMDFFXHUyMDI2XHUyMDIwXHUyMDIxXHVGRkZEXHUyMDMwXHUwMTYwXHUyMDM5XHUwMTVBXHUwMTY0XHUwMTdEXHUwMTc5XHVGRkZEXHUyMDE4XHUyMDE5XHUyMDFDXHUyMDFEXHUyMDIyXHUyMDEzXHUyMDE0XHVGRkZEXHUyMTIyXHUwMTYxXHUyMDNBXHUwMTVCXHUwMTY1XHUwMTdFXHUwMTdBXHUwMEEwXHUwMkM3XHUwMkQ4XHUwMTQxXHUwMEE0XHUwMTA0XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMTVFXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMTdCXHUwMEIwXHUwMEIxXHUwMkRCXHUwMTQyXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMTA1XHUwMTVGXHUwMEJCXHUwMTNEXHUwMkREXHUwMTNFXHUwMTdDXHUwMTU0XHUwMEMxXHUwMEMyXHUwMTAyXHUwMEM0XHUwMTM5XHUwMTA2XHUwMEM3XHUwMTBDXHUwMEM5XHUwMTE4XHUwMENCXHUwMTFBXHUwMENEXHUwMENFXHUwMTBFXHUwMTEwXHUwMTQzXHUwMTQ3XHUwMEQzXHUwMEQ0XHUwMTUwXHUwMEQ2XHUwMEQ3XHUwMTU4XHUwMTZFXHUwMERBXHUwMTcwXHUwMERDXHUwMEREXHUwMTYyXHUwMERGXHUwMTU1XHUwMEUxXHUwMEUyXHUwMTAzXHUwMEU0XHUwMTNBXHUwMTA3XHUwMEU3XHUwMTBEXHUwMEU5XHUwMTE5XHUwMEVCXHUwMTFCXHUwMEVEXHUwMEVFXHUwMTBGXHUwMTExXHUwMTQ0XHUwMTQ4XHUwMEYzXHUwMEY0XHUwMTUxXHUwMEY2XHUwMEY3XHUwMTU5XHUwMTZGXHUwMEZBXHUwMTcxXHUwMEZDXHUwMEZEXHUwMTYzXHUwMkQ5XCJcbiAgfSxcbiAgXCJ3aW4xMjUwXCI6IFwid2luZG93czEyNTBcIixcbiAgXCJjcDEyNTBcIjogXCJ3aW5kb3dzMTI1MFwiLFxuICBcIndpbmRvd3MxMjUxXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTA0MDJcdTA0MDNcdTIwMUFcdTA0NTNcdTIwMUVcdTIwMjZcdTIwMjBcdTIwMjFcdTIwQUNcdTIwMzBcdTA0MDlcdTIwMzlcdTA0MEFcdTA0MENcdTA0MEJcdTA0MEZcdTA0NTJcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdUZGRkRcdTIxMjJcdTA0NTlcdTIwM0FcdTA0NUFcdTA0NUNcdTA0NUJcdTA0NUZcdTAwQTBcdTA0MEVcdTA0NUVcdTA0MDhcdTAwQTRcdTA0OTBcdTAwQTZcdTAwQTdcdTA0MDFcdTAwQTlcdTA0MDRcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTA0MDdcdTAwQjBcdTAwQjFcdTA0MDZcdTA0NTZcdTA0OTFcdTAwQjVcdTAwQjZcdTAwQjdcdTA0NTFcdTIxMTZcdTA0NTRcdTAwQkJcdTA0NThcdTA0MDVcdTA0NTVcdTA0NTdcdTA0MTBcdTA0MTFcdTA0MTJcdTA0MTNcdTA0MTRcdTA0MTVcdTA0MTZcdTA0MTdcdTA0MThcdTA0MTlcdTA0MUFcdTA0MUJcdTA0MUNcdTA0MURcdTA0MUVcdTA0MUZcdTA0MjBcdTA0MjFcdTA0MjJcdTA0MjNcdTA0MjRcdTA0MjVcdTA0MjZcdTA0MjdcdTA0MjhcdTA0MjlcdTA0MkFcdTA0MkJcdTA0MkNcdTA0MkRcdTA0MkVcdTA0MkZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0MzZcdTA0MzdcdTA0MzhcdTA0MzlcdTA0M0FcdTA0M0JcdTA0M0NcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0NDFcdTA0NDJcdTA0NDNcdTA0NDRcdTA0NDVcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NERcdTA0NEVcdTA0NEZcIlxuICB9LFxuICBcIndpbjEyNTFcIjogXCJ3aW5kb3dzMTI1MVwiLFxuICBcImNwMTI1MVwiOiBcIndpbmRvd3MxMjUxXCIsXG4gIFwid2luZG93czEyNTJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MjBBQ1x1RkZGRFx1MjAxQVx1MDE5Mlx1MjAxRVx1MjAyNlx1MjAyMFx1MjAyMVx1MDJDNlx1MjAzMFx1MDE2MFx1MjAzOVx1MDE1Mlx1RkZGRFx1MDE3RFx1RkZGRFx1RkZGRFx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyMlx1MjAxM1x1MjAxNFx1MDJEQ1x1MjEyMlx1MDE2MVx1MjAzQVx1MDE1M1x1RkZGRFx1MDE3RVx1MDE3OFx1MDBBMFx1MDBBMVx1MDBBMlx1MDBBM1x1MDBBNFx1MDBBNVx1MDBBNlx1MDBBN1x1MDBBOFx1MDBBOVx1MDBBQVx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MDBBRlx1MDBCMFx1MDBCMVx1MDBCMlx1MDBCM1x1MDBCNFx1MDBCNVx1MDBCNlx1MDBCN1x1MDBCOFx1MDBCOVx1MDBCQVx1MDBCQlx1MDBCQ1x1MDBCRFx1MDBCRVx1MDBCRlx1MDBDMFx1MDBDMVx1MDBDMlx1MDBDM1x1MDBDNFx1MDBDNVx1MDBDNlx1MDBDN1x1MDBDOFx1MDBDOVx1MDBDQVx1MDBDQlx1MDBDQ1x1MDBDRFx1MDBDRVx1MDBDRlx1MDBEMFx1MDBEMVx1MDBEMlx1MDBEM1x1MDBENFx1MDBENVx1MDBENlx1MDBEN1x1MDBEOFx1MDBEOVx1MDBEQVx1MDBEQlx1MDBEQ1x1MDBERFx1MDBERVx1MDBERlx1MDBFMFx1MDBFMVx1MDBFMlx1MDBFM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDBFN1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQlx1MDBFQ1x1MDBFRFx1MDBFRVx1MDBFRlx1MDBGMFx1MDBGMVx1MDBGMlx1MDBGM1x1MDBGNFx1MDBGNVx1MDBGNlx1MDBGN1x1MDBGOFx1MDBGOVx1MDBGQVx1MDBGQlx1MDBGQ1x1MDBGRFx1MDBGRVx1MDBGRlwiXG4gIH0sXG4gIFwid2luMTI1MlwiOiBcIndpbmRvd3MxMjUyXCIsXG4gIFwiY3AxMjUyXCI6IFwid2luZG93czEyNTJcIixcbiAgXCJ3aW5kb3dzMTI1M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUyMEFDXHVGRkZEXHUyMDFBXHUwMTkyXHUyMDFFXHUyMDI2XHUyMDIwXHUyMDIxXHVGRkZEXHUyMDMwXHVGRkZEXHUyMDM5XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUyMDE4XHUyMDE5XHUyMDFDXHUyMDFEXHUyMDIyXHUyMDEzXHUyMDE0XHVGRkZEXHUyMTIyXHVGRkZEXHUyMDNBXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwMEEwXHUwMzg1XHUwMzg2XHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHVGRkZEXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUyMDE1XHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMzg0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMzg4XHUwMzg5XHUwMzhBXHUwMEJCXHUwMzhDXHUwMEJEXHUwMzhFXHUwMzhGXHUwMzkwXHUwMzkxXHUwMzkyXHUwMzkzXHUwMzk0XHUwMzk1XHUwMzk2XHUwMzk3XHUwMzk4XHUwMzk5XHUwMzlBXHUwMzlCXHUwMzlDXHUwMzlEXHUwMzlFXHUwMzlGXHUwM0EwXHUwM0ExXHVGRkZEXHUwM0EzXHUwM0E0XHUwM0E1XHUwM0E2XHUwM0E3XHUwM0E4XHUwM0E5XHUwM0FBXHUwM0FCXHUwM0FDXHUwM0FEXHUwM0FFXHUwM0FGXHUwM0IwXHUwM0IxXHUwM0IyXHUwM0IzXHUwM0I0XHUwM0I1XHUwM0I2XHUwM0I3XHUwM0I4XHUwM0I5XHUwM0JBXHUwM0JCXHUwM0JDXHUwM0JEXHUwM0JFXHUwM0JGXHUwM0MwXHUwM0MxXHUwM0MyXHUwM0MzXHUwM0M0XHUwM0M1XHUwM0M2XHUwM0M3XHUwM0M4XHUwM0M5XHUwM0NBXHUwM0NCXHUwM0NDXHUwM0NEXHUwM0NFXHVGRkZEXCJcbiAgfSxcbiAgXCJ3aW4xMjUzXCI6IFwid2luZG93czEyNTNcIixcbiAgXCJjcDEyNTNcIjogXCJ3aW5kb3dzMTI1M1wiLFxuICBcIndpbmRvd3MxMjU0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTIwQUNcdUZGRkRcdTIwMUFcdTAxOTJcdTIwMUVcdTIwMjZcdTIwMjBcdTIwMjFcdTAyQzZcdTIwMzBcdTAxNjBcdTIwMzlcdTAxNTJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdTAyRENcdTIxMjJcdTAxNjFcdTIwM0FcdTAxNTNcdUZGRkRcdUZGRkRcdTAxNzhcdTAwQTBcdTAwQTFcdTAwQTJcdTAwQTNcdTAwQTRcdTAwQTVcdTAwQTZcdTAwQTdcdTAwQThcdTAwQTlcdTAwQUFcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTAwQUZcdTAwQjBcdTAwQjFcdTAwQjJcdTAwQjNcdTAwQjRcdTAwQjVcdTAwQjZcdTAwQjdcdTAwQjhcdTAwQjlcdTAwQkFcdTAwQkJcdTAwQkNcdTAwQkRcdTAwQkVcdTAwQkZcdTAwQzBcdTAwQzFcdTAwQzJcdTAwQzNcdTAwQzRcdTAwQzVcdTAwQzZcdTAwQzdcdTAwQzhcdTAwQzlcdTAwQ0FcdTAwQ0JcdTAwQ0NcdTAwQ0RcdTAwQ0VcdTAwQ0ZcdTAxMUVcdTAwRDFcdTAwRDJcdTAwRDNcdTAwRDRcdTAwRDVcdTAwRDZcdTAwRDdcdTAwRDhcdTAwRDlcdTAwREFcdTAwREJcdTAwRENcdTAxMzBcdTAxNUVcdTAwREZcdTAwRTBcdTAwRTFcdTAwRTJcdTAwRTNcdTAwRTRcdTAwRTVcdTAwRTZcdTAwRTdcdTAwRThcdTAwRTlcdTAwRUFcdTAwRUJcdTAwRUNcdTAwRURcdTAwRUVcdTAwRUZcdTAxMUZcdTAwRjFcdTAwRjJcdTAwRjNcdTAwRjRcdTAwRjVcdTAwRjZcdTAwRjdcdTAwRjhcdTAwRjlcdTAwRkFcdTAwRkJcdTAwRkNcdTAxMzFcdTAxNUZcdTAwRkZcIlxuICB9LFxuICBcIndpbjEyNTRcIjogXCJ3aW5kb3dzMTI1NFwiLFxuICBcImNwMTI1NFwiOiBcIndpbmRvd3MxMjU0XCIsXG4gIFwid2luZG93czEyNTVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MjBBQ1x1RkZGRFx1MjAxQVx1MDE5Mlx1MjAxRVx1MjAyNlx1MjAyMFx1MjAyMVx1MDJDNlx1MjAzMFx1RkZGRFx1MjAzOVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyMlx1MjAxM1x1MjAxNFx1MDJEQ1x1MjEyMlx1RkZGRFx1MjAzQVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MDBBMFx1MDBBMVx1MDBBMlx1MDBBM1x1MjBBQVx1MDBBNVx1MDBBNlx1MDBBN1x1MDBBOFx1MDBBOVx1MDBEN1x1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MDBBRlx1MDBCMFx1MDBCMVx1MDBCMlx1MDBCM1x1MDBCNFx1MDBCNVx1MDBCNlx1MDBCN1x1MDBCOFx1MDBCOVx1MDBGN1x1MDBCQlx1MDBCQ1x1MDBCRFx1MDBCRVx1MDBCRlx1MDVCMFx1MDVCMVx1MDVCMlx1MDVCM1x1MDVCNFx1MDVCNVx1MDVCNlx1MDVCN1x1MDVCOFx1MDVCOVx1MDVCQVx1MDVCQlx1MDVCQ1x1MDVCRFx1MDVCRVx1MDVCRlx1MDVDMFx1MDVDMVx1MDVDMlx1MDVDM1x1MDVGMFx1MDVGMVx1MDVGMlx1MDVGM1x1MDVGNFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MDVEMFx1MDVEMVx1MDVEMlx1MDVEM1x1MDVENFx1MDVENVx1MDVENlx1MDVEN1x1MDVEOFx1MDVEOVx1MDVEQVx1MDVEQlx1MDVEQ1x1MDVERFx1MDVERVx1MDVERlx1MDVFMFx1MDVFMVx1MDVFMlx1MDVFM1x1MDVFNFx1MDVFNVx1MDVFNlx1MDVFN1x1MDVFOFx1MDVFOVx1MDVFQVx1RkZGRFx1RkZGRFx1MjAwRVx1MjAwRlx1RkZGRFwiXG4gIH0sXG4gIFwid2luMTI1NVwiOiBcIndpbmRvd3MxMjU1XCIsXG4gIFwiY3AxMjU1XCI6IFwid2luZG93czEyNTVcIixcbiAgXCJ3aW5kb3dzMTI1NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUyMEFDXHUwNjdFXHUyMDFBXHUwMTkyXHUyMDFFXHUyMDI2XHUyMDIwXHUyMDIxXHUwMkM2XHUyMDMwXHUwNjc5XHUyMDM5XHUwMTUyXHUwNjg2XHUwNjk4XHUwNjg4XHUwNkFGXHUyMDE4XHUyMDE5XHUyMDFDXHUyMDFEXHUyMDIyXHUyMDEzXHUyMDE0XHUwNkE5XHUyMTIyXHUwNjkxXHUyMDNBXHUwMTUzXHUyMDBDXHUyMDBEXHUwNkJBXHUwMEEwXHUwNjBDXHUwMEEyXHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwNkJFXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMEI5XHUwNjFCXHUwMEJCXHUwMEJDXHUwMEJEXHUwMEJFXHUwNjFGXHUwNkMxXHUwNjIxXHUwNjIyXHUwNjIzXHUwNjI0XHUwNjI1XHUwNjI2XHUwNjI3XHUwNjI4XHUwNjI5XHUwNjJBXHUwNjJCXHUwNjJDXHUwNjJEXHUwNjJFXHUwNjJGXHUwNjMwXHUwNjMxXHUwNjMyXHUwNjMzXHUwNjM0XHUwNjM1XHUwNjM2XHUwMEQ3XHUwNjM3XHUwNjM4XHUwNjM5XHUwNjNBXHUwNjQwXHUwNjQxXHUwNjQyXHUwNjQzXHUwMEUwXHUwNjQ0XHUwMEUyXHUwNjQ1XHUwNjQ2XHUwNjQ3XHUwNjQ4XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwNjQ5XHUwNjRBXHUwMEVFXHUwMEVGXHUwNjRCXHUwNjRDXHUwNjREXHUwNjRFXHUwMEY0XHUwNjRGXHUwNjUwXHUwMEY3XHUwNjUxXHUwMEY5XHUwNjUyXHUwMEZCXHUwMEZDXHUyMDBFXHUyMDBGXHUwNkQyXCJcbiAgfSxcbiAgXCJ3aW4xMjU2XCI6IFwid2luZG93czEyNTZcIixcbiAgXCJjcDEyNTZcIjogXCJ3aW5kb3dzMTI1NlwiLFxuICBcIndpbmRvd3MxMjU3XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTIwQUNcdUZGRkRcdTIwMUFcdUZGRkRcdTIwMUVcdTIwMjZcdTIwMjBcdTIwMjFcdUZGRkRcdTIwMzBcdUZGRkRcdTIwMzlcdUZGRkRcdTAwQThcdTAyQzdcdTAwQjhcdUZGRkRcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdUZGRkRcdTIxMjJcdUZGRkRcdTIwM0FcdUZGRkRcdTAwQUZcdTAyREJcdUZGRkRcdTAwQTBcdUZGRkRcdTAwQTJcdTAwQTNcdTAwQTRcdUZGRkRcdTAwQTZcdTAwQTdcdTAwRDhcdTAwQTlcdTAxNTZcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTAwQzZcdTAwQjBcdTAwQjFcdTAwQjJcdTAwQjNcdTAwQjRcdTAwQjVcdTAwQjZcdTAwQjdcdTAwRjhcdTAwQjlcdTAxNTdcdTAwQkJcdTAwQkNcdTAwQkRcdTAwQkVcdTAwRTZcdTAxMDRcdTAxMkVcdTAxMDBcdTAxMDZcdTAwQzRcdTAwQzVcdTAxMThcdTAxMTJcdTAxMENcdTAwQzlcdTAxNzlcdTAxMTZcdTAxMjJcdTAxMzZcdTAxMkFcdTAxM0JcdTAxNjBcdTAxNDNcdTAxNDVcdTAwRDNcdTAxNENcdTAwRDVcdTAwRDZcdTAwRDdcdTAxNzJcdTAxNDFcdTAxNUFcdTAxNkFcdTAwRENcdTAxN0JcdTAxN0RcdTAwREZcdTAxMDVcdTAxMkZcdTAxMDFcdTAxMDdcdTAwRTRcdTAwRTVcdTAxMTlcdTAxMTNcdTAxMERcdTAwRTlcdTAxN0FcdTAxMTdcdTAxMjNcdTAxMzdcdTAxMkJcdTAxM0NcdTAxNjFcdTAxNDRcdTAxNDZcdTAwRjNcdTAxNERcdTAwRjVcdTAwRjZcdTAwRjdcdTAxNzNcdTAxNDJcdTAxNUJcdTAxNkJcdTAwRkNcdTAxN0NcdTAxN0VcdTAyRDlcIlxuICB9LFxuICBcIndpbjEyNTdcIjogXCJ3aW5kb3dzMTI1N1wiLFxuICBcImNwMTI1N1wiOiBcIndpbmRvd3MxMjU3XCIsXG4gIFwid2luZG93czEyNThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MjBBQ1x1RkZGRFx1MjAxQVx1MDE5Mlx1MjAxRVx1MjAyNlx1MjAyMFx1MjAyMVx1MDJDNlx1MjAzMFx1RkZGRFx1MjAzOVx1MDE1Mlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyMlx1MjAxM1x1MjAxNFx1MDJEQ1x1MjEyMlx1RkZGRFx1MjAzQVx1MDE1M1x1RkZGRFx1RkZGRFx1MDE3OFx1MDBBMFx1MDBBMVx1MDBBMlx1MDBBM1x1MDBBNFx1MDBBNVx1MDBBNlx1MDBBN1x1MDBBOFx1MDBBOVx1MDBBQVx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MDBBRlx1MDBCMFx1MDBCMVx1MDBCMlx1MDBCM1x1MDBCNFx1MDBCNVx1MDBCNlx1MDBCN1x1MDBCOFx1MDBCOVx1MDBCQVx1MDBCQlx1MDBCQ1x1MDBCRFx1MDBCRVx1MDBCRlx1MDBDMFx1MDBDMVx1MDBDMlx1MDEwMlx1MDBDNFx1MDBDNVx1MDBDNlx1MDBDN1x1MDBDOFx1MDBDOVx1MDBDQVx1MDBDQlx1MDMwMFx1MDBDRFx1MDBDRVx1MDBDRlx1MDExMFx1MDBEMVx1MDMwOVx1MDBEM1x1MDBENFx1MDFBMFx1MDBENlx1MDBEN1x1MDBEOFx1MDBEOVx1MDBEQVx1MDBEQlx1MDBEQ1x1MDFBRlx1MDMwM1x1MDBERlx1MDBFMFx1MDBFMVx1MDBFMlx1MDEwM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDBFN1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQlx1MDMwMVx1MDBFRFx1MDBFRVx1MDBFRlx1MDExMVx1MDBGMVx1MDMyM1x1MDBGM1x1MDBGNFx1MDFBMVx1MDBGNlx1MDBGN1x1MDBGOFx1MDBGOVx1MDBGQVx1MDBGQlx1MDBGQ1x1MDFCMFx1MjBBQlx1MDBGRlwiXG4gIH0sXG4gIFwid2luMTI1OFwiOiBcIndpbmRvd3MxMjU4XCIsXG4gIFwiY3AxMjU4XCI6IFwid2luZG93czEyNThcIixcbiAgXCJpc284ODU5MVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMEExXHUwMEEyXHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMEFBXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMEI5XHUwMEJBXHUwMEJCXHUwMEJDXHUwMEJEXHUwMEJFXHUwMEJGXHUwMEMwXHUwMEMxXHUwMEMyXHUwMEMzXHUwMEM0XHUwMEM1XHUwMEM2XHUwMEM3XHUwMEM4XHUwMEM5XHUwMENBXHUwMENCXHUwMENDXHUwMENEXHUwMENFXHUwMENGXHUwMEQwXHUwMEQxXHUwMEQyXHUwMEQzXHUwMEQ0XHUwMEQ1XHUwMEQ2XHUwMEQ3XHUwMEQ4XHUwMEQ5XHUwMERBXHUwMERCXHUwMERDXHUwMEREXHUwMERFXHUwMERGXHUwMEUwXHUwMEUxXHUwMEUyXHUwMEUzXHUwMEU0XHUwMEU1XHUwMEU2XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwMEVDXHUwMEVEXHUwMEVFXHUwMEVGXHUwMEYwXHUwMEYxXHUwMEYyXHUwMEYzXHUwMEY0XHUwMEY1XHUwMEY2XHUwMEY3XHUwMEY4XHUwMEY5XHUwMEZBXHUwMEZCXHUwMEZDXHUwMEZEXHUwMEZFXHUwMEZGXCJcbiAgfSxcbiAgXCJjcDI4NTkxXCI6IFwiaXNvODg1OTFcIixcbiAgXCJpc284ODU5MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMTA0XHUwMkQ4XHUwMTQxXHUwMEE0XHUwMTNEXHUwMTVBXHUwMEE3XHUwMEE4XHUwMTYwXHUwMTVFXHUwMTY0XHUwMTc5XHUwMEFEXHUwMTdEXHUwMTdCXHUwMEIwXHUwMTA1XHUwMkRCXHUwMTQyXHUwMEI0XHUwMTNFXHUwMTVCXHUwMkM3XHUwMEI4XHUwMTYxXHUwMTVGXHUwMTY1XHUwMTdBXHUwMkREXHUwMTdFXHUwMTdDXHUwMTU0XHUwMEMxXHUwMEMyXHUwMTAyXHUwMEM0XHUwMTM5XHUwMTA2XHUwMEM3XHUwMTBDXHUwMEM5XHUwMTE4XHUwMENCXHUwMTFBXHUwMENEXHUwMENFXHUwMTBFXHUwMTEwXHUwMTQzXHUwMTQ3XHUwMEQzXHUwMEQ0XHUwMTUwXHUwMEQ2XHUwMEQ3XHUwMTU4XHUwMTZFXHUwMERBXHUwMTcwXHUwMERDXHUwMEREXHUwMTYyXHUwMERGXHUwMTU1XHUwMEUxXHUwMEUyXHUwMTAzXHUwMEU0XHUwMTNBXHUwMTA3XHUwMEU3XHUwMTBEXHUwMEU5XHUwMTE5XHUwMEVCXHUwMTFCXHUwMEVEXHUwMEVFXHUwMTBGXHUwMTExXHUwMTQ0XHUwMTQ4XHUwMEYzXHUwMEY0XHUwMTUxXHUwMEY2XHUwMEY3XHUwMTU5XHUwMTZGXHUwMEZBXHUwMTcxXHUwMEZDXHUwMEZEXHUwMTYzXHUwMkQ5XCJcbiAgfSxcbiAgXCJjcDI4NTkyXCI6IFwiaXNvODg1OTJcIixcbiAgXCJpc284ODU5M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMTI2XHUwMkQ4XHUwMEEzXHUwMEE0XHVGRkZEXHUwMTI0XHUwMEE3XHUwMEE4XHUwMTMwXHUwMTVFXHUwMTFFXHUwMTM0XHUwMEFEXHVGRkZEXHUwMTdCXHUwMEIwXHUwMTI3XHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMTI1XHUwMEI3XHUwMEI4XHUwMTMxXHUwMTVGXHUwMTFGXHUwMTM1XHUwMEJEXHVGRkZEXHUwMTdDXHUwMEMwXHUwMEMxXHUwMEMyXHVGRkZEXHUwMEM0XHUwMTBBXHUwMTA4XHUwMEM3XHUwMEM4XHUwMEM5XHUwMENBXHUwMENCXHUwMENDXHUwMENEXHUwMENFXHUwMENGXHVGRkZEXHUwMEQxXHUwMEQyXHUwMEQzXHUwMEQ0XHUwMTIwXHUwMEQ2XHUwMEQ3XHUwMTFDXHUwMEQ5XHUwMERBXHUwMERCXHUwMERDXHUwMTZDXHUwMTVDXHUwMERGXHUwMEUwXHUwMEUxXHUwMEUyXHVGRkZEXHUwMEU0XHUwMTBCXHUwMTA5XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwMEVDXHUwMEVEXHUwMEVFXHUwMEVGXHVGRkZEXHUwMEYxXHUwMEYyXHUwMEYzXHUwMEY0XHUwMTIxXHUwMEY2XHUwMEY3XHUwMTFEXHUwMEY5XHUwMEZBXHUwMEZCXHUwMEZDXHUwMTZEXHUwMTVEXHUwMkQ5XCJcbiAgfSxcbiAgXCJjcDI4NTkzXCI6IFwiaXNvODg1OTNcIixcbiAgXCJpc284ODU5NFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMTA0XHUwMTM4XHUwMTU2XHUwMEE0XHUwMTI4XHUwMTNCXHUwMEE3XHUwMEE4XHUwMTYwXHUwMTEyXHUwMTIyXHUwMTY2XHUwMEFEXHUwMTdEXHUwMEFGXHUwMEIwXHUwMTA1XHUwMkRCXHUwMTU3XHUwMEI0XHUwMTI5XHUwMTNDXHUwMkM3XHUwMEI4XHUwMTYxXHUwMTEzXHUwMTIzXHUwMTY3XHUwMTRBXHUwMTdFXHUwMTRCXHUwMTAwXHUwMEMxXHUwMEMyXHUwMEMzXHUwMEM0XHUwMEM1XHUwMEM2XHUwMTJFXHUwMTBDXHUwMEM5XHUwMTE4XHUwMENCXHUwMTE2XHUwMENEXHUwMENFXHUwMTJBXHUwMTEwXHUwMTQ1XHUwMTRDXHUwMTM2XHUwMEQ0XHUwMEQ1XHUwMEQ2XHUwMEQ3XHUwMEQ4XHUwMTcyXHUwMERBXHUwMERCXHUwMERDXHUwMTY4XHUwMTZBXHUwMERGXHUwMTAxXHUwMEUxXHUwMEUyXHUwMEUzXHUwMEU0XHUwMEU1XHUwMEU2XHUwMTJGXHUwMTBEXHUwMEU5XHUwMTE5XHUwMEVCXHUwMTE3XHUwMEVEXHUwMEVFXHUwMTJCXHUwMTExXHUwMTQ2XHUwMTREXHUwMTM3XHUwMEY0XHUwMEY1XHUwMEY2XHUwMEY3XHUwMEY4XHUwMTczXHUwMEZBXHUwMEZCXHUwMEZDXHUwMTY5XHUwMTZCXHUwMkQ5XCJcbiAgfSxcbiAgXCJjcDI4NTk0XCI6IFwiaXNvODg1OTRcIixcbiAgXCJpc284ODU5NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwNDAxXHUwNDAyXHUwNDAzXHUwNDA0XHUwNDA1XHUwNDA2XHUwNDA3XHUwNDA4XHUwNDA5XHUwNDBBXHUwNDBCXHUwNDBDXHUwMEFEXHUwNDBFXHUwNDBGXHUwNDEwXHUwNDExXHUwNDEyXHUwNDEzXHUwNDE0XHUwNDE1XHUwNDE2XHUwNDE3XHUwNDE4XHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDFEXHUwNDFFXHUwNDFGXHUwNDIwXHUwNDIxXHUwNDIyXHUwNDIzXHUwNDI0XHUwNDI1XHUwNDI2XHUwNDI3XHUwNDI4XHUwNDI5XHUwNDJBXHUwNDJCXHUwNDJDXHUwNDJEXHUwNDJFXHUwNDJGXHUwNDMwXHUwNDMxXHUwNDMyXHUwNDMzXHUwNDM0XHUwNDM1XHUwNDM2XHUwNDM3XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDQwXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDQ0XHUwNDQ1XHUwNDQ2XHUwNDQ3XHUwNDQ4XHUwNDQ5XHUwNDRBXHUwNDRCXHUwNDRDXHUwNDREXHUwNDRFXHUwNDRGXHUyMTE2XHUwNDUxXHUwNDUyXHUwNDUzXHUwNDU0XHUwNDU1XHUwNDU2XHUwNDU3XHUwNDU4XHUwNDU5XHUwNDVBXHUwNDVCXHUwNDVDXHUwMEE3XHUwNDVFXHUwNDVGXCJcbiAgfSxcbiAgXCJjcDI4NTk1XCI6IFwiaXNvODg1OTVcIixcbiAgXCJpc284ODU5NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHVGRkZEXHVGRkZEXHVGRkZEXHUwMEE0XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwNjBDXHUwMEFEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwNjFCXHVGRkZEXHVGRkZEXHVGRkZEXHUwNjFGXHVGRkZEXHUwNjIxXHUwNjIyXHUwNjIzXHUwNjI0XHUwNjI1XHUwNjI2XHUwNjI3XHUwNjI4XHUwNjI5XHUwNjJBXHUwNjJCXHUwNjJDXHUwNjJEXHUwNjJFXHUwNjJGXHUwNjMwXHUwNjMxXHUwNjMyXHUwNjMzXHUwNjM0XHUwNjM1XHUwNjM2XHUwNjM3XHUwNjM4XHUwNjM5XHUwNjNBXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwNjQwXHUwNjQxXHUwNjQyXHUwNjQzXHUwNjQ0XHUwNjQ1XHUwNjQ2XHUwNjQ3XHUwNjQ4XHUwNjQ5XHUwNjRBXHUwNjRCXHUwNjRDXHUwNjREXHUwNjRFXHUwNjRGXHUwNjUwXHUwNjUxXHUwNjUyXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXCJcbiAgfSxcbiAgXCJjcDI4NTk2XCI6IFwiaXNvODg1OTZcIixcbiAgXCJpc284ODU5N1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUyMDE4XHUyMDE5XHUwMEEzXHUyMEFDXHUyMEFGXHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMzdBXHUwMEFCXHUwMEFDXHUwMEFEXHVGRkZEXHUyMDE1XHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMzg0XHUwMzg1XHUwMzg2XHUwMEI3XHUwMzg4XHUwMzg5XHUwMzhBXHUwMEJCXHUwMzhDXHUwMEJEXHUwMzhFXHUwMzhGXHUwMzkwXHUwMzkxXHUwMzkyXHUwMzkzXHUwMzk0XHUwMzk1XHUwMzk2XHUwMzk3XHUwMzk4XHUwMzk5XHUwMzlBXHUwMzlCXHUwMzlDXHUwMzlEXHUwMzlFXHUwMzlGXHUwM0EwXHUwM0ExXHVGRkZEXHUwM0EzXHUwM0E0XHUwM0E1XHUwM0E2XHUwM0E3XHUwM0E4XHUwM0E5XHUwM0FBXHUwM0FCXHUwM0FDXHUwM0FEXHUwM0FFXHUwM0FGXHUwM0IwXHUwM0IxXHUwM0IyXHUwM0IzXHUwM0I0XHUwM0I1XHUwM0I2XHUwM0I3XHUwM0I4XHUwM0I5XHUwM0JBXHUwM0JCXHUwM0JDXHUwM0JEXHUwM0JFXHUwM0JGXHUwM0MwXHUwM0MxXHUwM0MyXHUwM0MzXHUwM0M0XHUwM0M1XHUwM0M2XHUwM0M3XHUwM0M4XHUwM0M5XHUwM0NBXHUwM0NCXHUwM0NDXHUwM0NEXHUwM0NFXHVGRkZEXCJcbiAgfSxcbiAgXCJjcDI4NTk3XCI6IFwiaXNvODg1OTdcIixcbiAgXCJpc284ODU5OFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHVGRkZEXHUwMEEyXHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMEQ3XHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMEI5XHUwMEY3XHUwMEJCXHUwMEJDXHUwMEJEXHUwMEJFXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUyMDE3XHUwNUQwXHUwNUQxXHUwNUQyXHUwNUQzXHUwNUQ0XHUwNUQ1XHUwNUQ2XHUwNUQ3XHUwNUQ4XHUwNUQ5XHUwNURBXHUwNURCXHUwNURDXHUwNUREXHUwNURFXHUwNURGXHUwNUUwXHUwNUUxXHUwNUUyXHUwNUUzXHUwNUU0XHUwNUU1XHUwNUU2XHUwNUU3XHUwNUU4XHUwNUU5XHUwNUVBXHVGRkZEXHVGRkZEXHUyMDBFXHUyMDBGXHVGRkZEXCJcbiAgfSxcbiAgXCJjcDI4NTk4XCI6IFwiaXNvODg1OThcIixcbiAgXCJpc284ODU5OVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMEExXHUwMEEyXHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMEFBXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMEI5XHUwMEJBXHUwMEJCXHUwMEJDXHUwMEJEXHUwMEJFXHUwMEJGXHUwMEMwXHUwMEMxXHUwMEMyXHUwMEMzXHUwMEM0XHUwMEM1XHUwMEM2XHUwMEM3XHUwMEM4XHUwMEM5XHUwMENBXHUwMENCXHUwMENDXHUwMENEXHUwMENFXHUwMENGXHUwMTFFXHUwMEQxXHUwMEQyXHUwMEQzXHUwMEQ0XHUwMEQ1XHUwMEQ2XHUwMEQ3XHUwMEQ4XHUwMEQ5XHUwMERBXHUwMERCXHUwMERDXHUwMTMwXHUwMTVFXHUwMERGXHUwMEUwXHUwMEUxXHUwMEUyXHUwMEUzXHUwMEU0XHUwMEU1XHUwMEU2XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwMEVDXHUwMEVEXHUwMEVFXHUwMEVGXHUwMTFGXHUwMEYxXHUwMEYyXHUwMEYzXHUwMEY0XHUwMEY1XHUwMEY2XHUwMEY3XHUwMEY4XHUwMEY5XHUwMEZBXHUwMEZCXHUwMEZDXHUwMTMxXHUwMTVGXHUwMEZGXCJcbiAgfSxcbiAgXCJjcDI4NTk5XCI6IFwiaXNvODg1OTlcIixcbiAgXCJpc284ODU5MTBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MDEwNFx1MDExMlx1MDEyMlx1MDEyQVx1MDEyOFx1MDEzNlx1MDBBN1x1MDEzQlx1MDExMFx1MDE2MFx1MDE2Nlx1MDE3RFx1MDBBRFx1MDE2QVx1MDE0QVx1MDBCMFx1MDEwNVx1MDExM1x1MDEyM1x1MDEyQlx1MDEyOVx1MDEzN1x1MDBCN1x1MDEzQ1x1MDExMVx1MDE2MVx1MDE2N1x1MDE3RVx1MjAxNVx1MDE2Qlx1MDE0Qlx1MDEwMFx1MDBDMVx1MDBDMlx1MDBDM1x1MDBDNFx1MDBDNVx1MDBDNlx1MDEyRVx1MDEwQ1x1MDBDOVx1MDExOFx1MDBDQlx1MDExNlx1MDBDRFx1MDBDRVx1MDBDRlx1MDBEMFx1MDE0NVx1MDE0Q1x1MDBEM1x1MDBENFx1MDBENVx1MDBENlx1MDE2OFx1MDBEOFx1MDE3Mlx1MDBEQVx1MDBEQlx1MDBEQ1x1MDBERFx1MDBERVx1MDBERlx1MDEwMVx1MDBFMVx1MDBFMlx1MDBFM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDEyRlx1MDEwRFx1MDBFOVx1MDExOVx1MDBFQlx1MDExN1x1MDBFRFx1MDBFRVx1MDBFRlx1MDBGMFx1MDE0Nlx1MDE0RFx1MDBGM1x1MDBGNFx1MDBGNVx1MDBGNlx1MDE2OVx1MDBGOFx1MDE3M1x1MDBGQVx1MDBGQlx1MDBGQ1x1MDBGRFx1MDBGRVx1MDEzOFwiXG4gIH0sXG4gIFwiY3AyODYwMFwiOiBcImlzbzg4NTkxMFwiLFxuICBcImlzbzg4NTkxMVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwRTAxXHUwRTAyXHUwRTAzXHUwRTA0XHUwRTA1XHUwRTA2XHUwRTA3XHUwRTA4XHUwRTA5XHUwRTBBXHUwRTBCXHUwRTBDXHUwRTBEXHUwRTBFXHUwRTBGXHUwRTEwXHUwRTExXHUwRTEyXHUwRTEzXHUwRTE0XHUwRTE1XHUwRTE2XHUwRTE3XHUwRTE4XHUwRTE5XHUwRTFBXHUwRTFCXHUwRTFDXHUwRTFEXHUwRTFFXHUwRTFGXHUwRTIwXHUwRTIxXHUwRTIyXHUwRTIzXHUwRTI0XHUwRTI1XHUwRTI2XHUwRTI3XHUwRTI4XHUwRTI5XHUwRTJBXHUwRTJCXHUwRTJDXHUwRTJEXHUwRTJFXHUwRTJGXHUwRTMwXHUwRTMxXHUwRTMyXHUwRTMzXHUwRTM0XHUwRTM1XHUwRTM2XHUwRTM3XHUwRTM4XHUwRTM5XHUwRTNBXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwRTNGXHUwRTQwXHUwRTQxXHUwRTQyXHUwRTQzXHUwRTQ0XHUwRTQ1XHUwRTQ2XHUwRTQ3XHUwRTQ4XHUwRTQ5XHUwRTRBXHUwRTRCXHUwRTRDXHUwRTREXHUwRTRFXHUwRTRGXHUwRTUwXHUwRTUxXHUwRTUyXHUwRTUzXHUwRTU0XHUwRTU1XHUwRTU2XHUwRTU3XHUwRTU4XHUwRTU5XHUwRTVBXHUwRTVCXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXCJcbiAgfSxcbiAgXCJjcDI4NjAxXCI6IFwiaXNvODg1OTExXCIsXG4gIFwiaXNvODg1OTEzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwODBcdTAwODFcdTAwODJcdTAwODNcdTAwODRcdTAwODVcdTAwODZcdTAwODdcdTAwODhcdTAwODlcdTAwOEFcdTAwOEJcdTAwOENcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTAwOTFcdTAwOTJcdTAwOTNcdTAwOTRcdTAwOTVcdTAwOTZcdTAwOTdcdTAwOThcdTAwOTlcdTAwOUFcdTAwOUJcdTAwOUNcdTAwOURcdTAwOUVcdTAwOUZcdTAwQTBcdTIwMURcdTAwQTJcdTAwQTNcdTAwQTRcdTIwMUVcdTAwQTZcdTAwQTdcdTAwRDhcdTAwQTlcdTAxNTZcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTAwQzZcdTAwQjBcdTAwQjFcdTAwQjJcdTAwQjNcdTIwMUNcdTAwQjVcdTAwQjZcdTAwQjdcdTAwRjhcdTAwQjlcdTAxNTdcdTAwQkJcdTAwQkNcdTAwQkRcdTAwQkVcdTAwRTZcdTAxMDRcdTAxMkVcdTAxMDBcdTAxMDZcdTAwQzRcdTAwQzVcdTAxMThcdTAxMTJcdTAxMENcdTAwQzlcdTAxNzlcdTAxMTZcdTAxMjJcdTAxMzZcdTAxMkFcdTAxM0JcdTAxNjBcdTAxNDNcdTAxNDVcdTAwRDNcdTAxNENcdTAwRDVcdTAwRDZcdTAwRDdcdTAxNzJcdTAxNDFcdTAxNUFcdTAxNkFcdTAwRENcdTAxN0JcdTAxN0RcdTAwREZcdTAxMDVcdTAxMkZcdTAxMDFcdTAxMDdcdTAwRTRcdTAwRTVcdTAxMTlcdTAxMTNcdTAxMERcdTAwRTlcdTAxN0FcdTAxMTdcdTAxMjNcdTAxMzdcdTAxMkJcdTAxM0NcdTAxNjFcdTAxNDRcdTAxNDZcdTAwRjNcdTAxNERcdTAwRjVcdTAwRjZcdTAwRjdcdTAxNzNcdTAxNDJcdTAxNUJcdTAxNkJcdTAwRkNcdTAxN0NcdTAxN0VcdTIwMTlcIlxuICB9LFxuICBcImNwMjg2MDNcIjogXCJpc284ODU5MTNcIixcbiAgXCJpc284ODU5MTRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MUUwMlx1MUUwM1x1MDBBM1x1MDEwQVx1MDEwQlx1MUUwQVx1MDBBN1x1MUU4MFx1MDBBOVx1MUU4Mlx1MUUwQlx1MUVGMlx1MDBBRFx1MDBBRVx1MDE3OFx1MUUxRVx1MUUxRlx1MDEyMFx1MDEyMVx1MUU0MFx1MUU0MVx1MDBCNlx1MUU1Nlx1MUU4MVx1MUU1N1x1MUU4M1x1MUU2MFx1MUVGM1x1MUU4NFx1MUU4NVx1MUU2MVx1MDBDMFx1MDBDMVx1MDBDMlx1MDBDM1x1MDBDNFx1MDBDNVx1MDBDNlx1MDBDN1x1MDBDOFx1MDBDOVx1MDBDQVx1MDBDQlx1MDBDQ1x1MDBDRFx1MDBDRVx1MDBDRlx1MDE3NFx1MDBEMVx1MDBEMlx1MDBEM1x1MDBENFx1MDBENVx1MDBENlx1MUU2QVx1MDBEOFx1MDBEOVx1MDBEQVx1MDBEQlx1MDBEQ1x1MDBERFx1MDE3Nlx1MDBERlx1MDBFMFx1MDBFMVx1MDBFMlx1MDBFM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDBFN1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQlx1MDBFQ1x1MDBFRFx1MDBFRVx1MDBFRlx1MDE3NVx1MDBGMVx1MDBGMlx1MDBGM1x1MDBGNFx1MDBGNVx1MDBGNlx1MUU2Qlx1MDBGOFx1MDBGOVx1MDBGQVx1MDBGQlx1MDBGQ1x1MDBGRFx1MDE3N1x1MDBGRlwiXG4gIH0sXG4gIFwiY3AyODYwNFwiOiBcImlzbzg4NTkxNFwiLFxuICBcImlzbzg4NTkxNVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMEExXHUwMEEyXHUwMEEzXHUyMEFDXHUwMEE1XHUwMTYwXHUwMEE3XHUwMTYxXHUwMEE5XHUwMEFBXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMTdEXHUwMEI1XHUwMEI2XHUwMEI3XHUwMTdFXHUwMEI5XHUwMEJBXHUwMEJCXHUwMTUyXHUwMTUzXHUwMTc4XHUwMEJGXHUwMEMwXHUwMEMxXHUwMEMyXHUwMEMzXHUwMEM0XHUwMEM1XHUwMEM2XHUwMEM3XHUwMEM4XHUwMEM5XHUwMENBXHUwMENCXHUwMENDXHUwMENEXHUwMENFXHUwMENGXHUwMEQwXHUwMEQxXHUwMEQyXHUwMEQzXHUwMEQ0XHUwMEQ1XHUwMEQ2XHUwMEQ3XHUwMEQ4XHUwMEQ5XHUwMERBXHUwMERCXHUwMERDXHUwMEREXHUwMERFXHUwMERGXHUwMEUwXHUwMEUxXHUwMEUyXHUwMEUzXHUwMEU0XHUwMEU1XHUwMEU2XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwMEVDXHUwMEVEXHUwMEVFXHUwMEVGXHUwMEYwXHUwMEYxXHUwMEYyXHUwMEYzXHUwMEY0XHUwMEY1XHUwMEY2XHUwMEY3XHUwMEY4XHUwMEY5XHUwMEZBXHUwMEZCXHUwMEZDXHUwMEZEXHUwMEZFXHUwMEZGXCJcbiAgfSxcbiAgXCJjcDI4NjA1XCI6IFwiaXNvODg1OTE1XCIsXG4gIFwiaXNvODg1OTE2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwODBcdTAwODFcdTAwODJcdTAwODNcdTAwODRcdTAwODVcdTAwODZcdTAwODdcdTAwODhcdTAwODlcdTAwOEFcdTAwOEJcdTAwOENcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTAwOTFcdTAwOTJcdTAwOTNcdTAwOTRcdTAwOTVcdTAwOTZcdTAwOTdcdTAwOThcdTAwOTlcdTAwOUFcdTAwOUJcdTAwOUNcdTAwOURcdTAwOUVcdTAwOUZcdTAwQTBcdTAxMDRcdTAxMDVcdTAxNDFcdTIwQUNcdTIwMUVcdTAxNjBcdTAwQTdcdTAxNjFcdTAwQTlcdTAyMThcdTAwQUJcdTAxNzlcdTAwQURcdTAxN0FcdTAxN0JcdTAwQjBcdTAwQjFcdTAxMENcdTAxNDJcdTAxN0RcdTIwMURcdTAwQjZcdTAwQjdcdTAxN0VcdTAxMERcdTAyMTlcdTAwQkJcdTAxNTJcdTAxNTNcdTAxNzhcdTAxN0NcdTAwQzBcdTAwQzFcdTAwQzJcdTAxMDJcdTAwQzRcdTAxMDZcdTAwQzZcdTAwQzdcdTAwQzhcdTAwQzlcdTAwQ0FcdTAwQ0JcdTAwQ0NcdTAwQ0RcdTAwQ0VcdTAwQ0ZcdTAxMTBcdTAxNDNcdTAwRDJcdTAwRDNcdTAwRDRcdTAxNTBcdTAwRDZcdTAxNUFcdTAxNzBcdTAwRDlcdTAwREFcdTAwREJcdTAwRENcdTAxMThcdTAyMUFcdTAwREZcdTAwRTBcdTAwRTFcdTAwRTJcdTAxMDNcdTAwRTRcdTAxMDdcdTAwRTZcdTAwRTdcdTAwRThcdTAwRTlcdTAwRUFcdTAwRUJcdTAwRUNcdTAwRURcdTAwRUVcdTAwRUZcdTAxMTFcdTAxNDRcdTAwRjJcdTAwRjNcdTAwRjRcdTAxNTFcdTAwRjZcdTAxNUJcdTAxNzFcdTAwRjlcdTAwRkFcdTAwRkJcdTAwRkNcdTAxMTlcdTAyMUJcdTAwRkZcIlxuICB9LFxuICBcImNwMjg2MDZcIjogXCJpc284ODU5MTZcIixcbiAgXCJjcDQzN1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMEUwXHUwMEU1XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEVGXHUwMEVFXHUwMEVDXHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMEY0XHUwMEY2XHUwMEYyXHUwMEZCXHUwMEY5XHUwMEZGXHUwMEQ2XHUwMERDXHUwMEEyXHUwMEEzXHUwMEE1XHUyMEE3XHUwMTkyXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMEFBXHUwMEJBXHUwMEJGXHUyMzEwXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0IxXHUwMERGXHUwMzkzXHUwM0MwXHUwM0EzXHUwM0MzXHUwMEI1XHUwM0M0XHUwM0E2XHUwMzk4XHUwM0E5XHUwM0I0XHUyMjFFXHUwM0M2XHUwM0I1XHUyMjI5XHUyMjYxXHUwMEIxXHUyMjY1XHUyMjY0XHUyMzIwXHUyMzIxXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm00MzdcIjogXCJjcDQzN1wiLFxuICBcImNzaWJtNDM3XCI6IFwiY3A0MzdcIixcbiAgXCJjcDczN1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMzkxXHUwMzkyXHUwMzkzXHUwMzk0XHUwMzk1XHUwMzk2XHUwMzk3XHUwMzk4XHUwMzk5XHUwMzlBXHUwMzlCXHUwMzlDXHUwMzlEXHUwMzlFXHUwMzlGXHUwM0EwXHUwM0ExXHUwM0EzXHUwM0E0XHUwM0E1XHUwM0E2XHUwM0E3XHUwM0E4XHUwM0E5XHUwM0IxXHUwM0IyXHUwM0IzXHUwM0I0XHUwM0I1XHUwM0I2XHUwM0I3XHUwM0I4XHUwM0I5XHUwM0JBXHUwM0JCXHUwM0JDXHUwM0JEXHUwM0JFXHUwM0JGXHUwM0MwXHUwM0MxXHUwM0MzXHUwM0MyXHUwM0M0XHUwM0M1XHUwM0M2XHUwM0M3XHUwM0M4XHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0M5XHUwM0FDXHUwM0FEXHUwM0FFXHUwM0NBXHUwM0FGXHUwM0NDXHUwM0NEXHUwM0NCXHUwM0NFXHUwMzg2XHUwMzg4XHUwMzg5XHUwMzhBXHUwMzhDXHUwMzhFXHUwMzhGXHUwMEIxXHUyMjY1XHUyMjY0XHUwM0FBXHUwM0FCXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm03MzdcIjogXCJjcDczN1wiLFxuICBcImNzaWJtNzM3XCI6IFwiY3A3MzdcIixcbiAgXCJjcDc3NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMTA2XHUwMEZDXHUwMEU5XHUwMTAxXHUwMEU0XHUwMTIzXHUwMEU1XHUwMTA3XHUwMTQyXHUwMTEzXHUwMTU2XHUwMTU3XHUwMTJCXHUwMTc5XHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMTREXHUwMEY2XHUwMTIyXHUwMEEyXHUwMTVBXHUwMTVCXHUwMEQ2XHUwMERDXHUwMEY4XHUwMEEzXHUwMEQ4XHUwMEQ3XHUwMEE0XHUwMTAwXHUwMTJBXHUwMEYzXHUwMTdCXHUwMTdDXHUwMTdBXHUyMDFEXHUwMEE2XHUwMEE5XHUwMEFFXHUwMEFDXHUwMEJEXHUwMEJDXHUwMTQxXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwMTA0XHUwMTBDXHUwMTE4XHUwMTE2XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMTJFXHUwMTYwXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwMTcyXHUwMTZBXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMTdEXHUwMTA1XHUwMTBEXHUwMTE5XHUwMTE3XHUwMTJGXHUwMTYxXHUwMTczXHUwMTZCXHUwMTdFXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwMEQzXHUwMERGXHUwMTRDXHUwMTQzXHUwMEY1XHUwMEQ1XHUwMEI1XHUwMTQ0XHUwMTM2XHUwMTM3XHUwMTNCXHUwMTNDXHUwMTQ2XHUwMTEyXHUwMTQ1XHUyMDE5XHUwMEFEXHUwMEIxXHUyMDFDXHUwMEJFXHUwMEI2XHUwMEE3XHUwMEY3XHUyMDFFXHUwMEIwXHUyMjE5XHUwMEI3XHUwMEI5XHUwMEIzXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm03NzVcIjogXCJjcDc3NVwiLFxuICBcImNzaWJtNzc1XCI6IFwiY3A3NzVcIixcbiAgXCJjcDg1MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMEUwXHUwMEU1XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEVGXHUwMEVFXHUwMEVDXHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMEY0XHUwMEY2XHUwMEYyXHUwMEZCXHUwMEY5XHUwMEZGXHUwMEQ2XHUwMERDXHUwMEY4XHUwMEEzXHUwMEQ4XHUwMEQ3XHUwMTkyXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMEFBXHUwMEJBXHUwMEJGXHUwMEFFXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwMEMxXHUwMEMyXHUwMEMwXHUwMEE5XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMEEyXHUwMEE1XHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwMEUzXHUwMEMzXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHUwMEYwXHUwMEQwXHUwMENBXHUwMENCXHUwMEM4XHUwMTMxXHUwMENEXHUwMENFXHUwMENGXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwMEE2XHUwMENDXHUyNTgwXHUwMEQzXHUwMERGXHUwMEQ0XHUwMEQyXHUwMEY1XHUwMEQ1XHUwMEI1XHUwMEZFXHUwMERFXHUwMERBXHUwMERCXHUwMEQ5XHUwMEZEXHUwMEREXHUwMEFGXHUwMEI0XHUwMEFEXHUwMEIxXHUyMDE3XHUwMEJFXHUwMEI2XHUwMEE3XHUwMEY3XHUwMEI4XHUwMEIwXHUwMEE4XHUwMEI3XHUwMEI5XHUwMEIzXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NTBcIjogXCJjcDg1MFwiLFxuICBcImNzaWJtODUwXCI6IFwiY3A4NTBcIixcbiAgXCJjcDg1MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMTZGXHUwMTA3XHUwMEU3XHUwMTQyXHUwMEVCXHUwMTUwXHUwMTUxXHUwMEVFXHUwMTc5XHUwMEM0XHUwMTA2XHUwMEM5XHUwMTM5XHUwMTNBXHUwMEY0XHUwMEY2XHUwMTNEXHUwMTNFXHUwMTVBXHUwMTVCXHUwMEQ2XHUwMERDXHUwMTY0XHUwMTY1XHUwMTQxXHUwMEQ3XHUwMTBEXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMTA0XHUwMTA1XHUwMTdEXHUwMTdFXHUwMTE4XHUwMTE5XHUwMEFDXHUwMTdBXHUwMTBDXHUwMTVGXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwMEMxXHUwMEMyXHUwMTFBXHUwMTVFXHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMTdCXHUwMTdDXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwMTAyXHUwMTAzXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHUwMTExXHUwMTEwXHUwMTBFXHUwMENCXHUwMTBGXHUwMTQ3XHUwMENEXHUwMENFXHUwMTFCXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwMTYyXHUwMTZFXHUyNTgwXHUwMEQzXHUwMERGXHUwMEQ0XHUwMTQzXHUwMTQ0XHUwMTQ4XHUwMTYwXHUwMTYxXHUwMTU0XHUwMERBXHUwMTU1XHUwMTcwXHUwMEZEXHUwMEREXHUwMTYzXHUwMEI0XHUwMEFEXHUwMkREXHUwMkRCXHUwMkM3XHUwMkQ4XHUwMEE3XHUwMEY3XHUwMEI4XHUwMEIwXHUwMEE4XHUwMkQ5XHUwMTcxXHUwMTU4XHUwMTU5XHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NTJcIjogXCJjcDg1MlwiLFxuICBcImNzaWJtODUyXCI6IFwiY3A4NTJcIixcbiAgXCJjcDg1NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwNDUyXHUwNDAyXHUwNDUzXHUwNDAzXHUwNDUxXHUwNDAxXHUwNDU0XHUwNDA0XHUwNDU1XHUwNDA1XHUwNDU2XHUwNDA2XHUwNDU3XHUwNDA3XHUwNDU4XHUwNDA4XHUwNDU5XHUwNDA5XHUwNDVBXHUwNDBBXHUwNDVCXHUwNDBCXHUwNDVDXHUwNDBDXHUwNDVFXHUwNDBFXHUwNDVGXHUwNDBGXHUwNDRFXHUwNDJFXHUwNDRBXHUwNDJBXHUwNDMwXHUwNDEwXHUwNDMxXHUwNDExXHUwNDQ2XHUwNDI2XHUwNDM0XHUwNDE0XHUwNDM1XHUwNDE1XHUwNDQ0XHUwNDI0XHUwNDMzXHUwNDEzXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwNDQ1XHUwNDI1XHUwNDM4XHUwNDE4XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwNDM5XHUwNDE5XHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwNDNBXHUwNDFBXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHUwNDNCXHUwNDFCXHUwNDNDXHUwNDFDXHUwNDNEXHUwNDFEXHUwNDNFXHUwNDFFXHUwNDNGXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwNDFGXHUwNDRGXHUyNTgwXHUwNDJGXHUwNDQwXHUwNDIwXHUwNDQxXHUwNDIxXHUwNDQyXHUwNDIyXHUwNDQzXHUwNDIzXHUwNDM2XHUwNDE2XHUwNDMyXHUwNDEyXHUwNDRDXHUwNDJDXHUyMTE2XHUwMEFEXHUwNDRCXHUwNDJCXHUwNDM3XHUwNDE3XHUwNDQ4XHUwNDI4XHUwNDREXHUwNDJEXHUwNDQ5XHUwNDI5XHUwNDQ3XHUwNDI3XHUwMEE3XHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NTVcIjogXCJjcDg1NVwiLFxuICBcImNzaWJtODU1XCI6IFwiY3A4NTVcIixcbiAgXCJjcDg1NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwNUQwXHUwNUQxXHUwNUQyXHUwNUQzXHUwNUQ0XHUwNUQ1XHUwNUQ2XHUwNUQ3XHUwNUQ4XHUwNUQ5XHUwNURBXHUwNURCXHUwNURDXHUwNUREXHUwNURFXHUwNURGXHUwNUUwXHUwNUUxXHUwNUUyXHUwNUUzXHUwNUU0XHUwNUU1XHUwNUU2XHUwNUU3XHUwNUU4XHUwNUU5XHUwNUVBXHVGRkZEXHUwMEEzXHVGRkZEXHUwMEQ3XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwMEFFXHUwMEFDXHUwMEJEXHUwMEJDXHVGRkZEXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHVGRkZEXHVGRkZEXHVGRkZEXHUwMEE5XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMEEyXHUwMEE1XHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHVGRkZEXHVGRkZEXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwMEE2XHVGRkZEXHUyNTgwXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwMEI1XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwMEFGXHUwMEI0XHUwMEFEXHUwMEIxXHUyMDE3XHUwMEJFXHUwMEI2XHUwMEE3XHUwMEY3XHUwMEI4XHUwMEIwXHUwMEE4XHUwMEI3XHUwMEI5XHUwMEIzXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NTZcIjogXCJjcDg1NlwiLFxuICBcImNzaWJtODU2XCI6IFwiY3A4NTZcIixcbiAgXCJjcDg1N1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMEUwXHUwMEU1XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEVGXHUwMEVFXHUwMTMxXHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMEY0XHUwMEY2XHUwMEYyXHUwMEZCXHUwMEY5XHUwMTMwXHUwMEQ2XHUwMERDXHUwMEY4XHUwMEEzXHUwMEQ4XHUwMTVFXHUwMTVGXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMTFFXHUwMTFGXHUwMEJGXHUwMEFFXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwMEMxXHUwMEMyXHUwMEMwXHUwMEE5XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMEEyXHUwMEE1XHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwMEUzXHUwMEMzXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHUwMEJBXHUwMEFBXHUwMENBXHUwMENCXHUwMEM4XHVGRkZEXHUwMENEXHUwMENFXHUwMENGXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwMEE2XHUwMENDXHUyNTgwXHUwMEQzXHUwMERGXHUwMEQ0XHUwMEQyXHUwMEY1XHUwMEQ1XHUwMEI1XHVGRkZEXHUwMEQ3XHUwMERBXHUwMERCXHUwMEQ5XHUwMEVDXHUwMEZGXHUwMEFGXHUwMEI0XHUwMEFEXHUwMEIxXHVGRkZEXHUwMEJFXHUwMEI2XHUwMEE3XHUwMEY3XHUwMEI4XHUwMEIwXHUwMEE4XHUwMEI3XHUwMEI5XHUwMEIzXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NTdcIjogXCJjcDg1N1wiLFxuICBcImNzaWJtODU3XCI6IFwiY3A4NTdcIixcbiAgXCJjcDg1OFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMEUwXHUwMEU1XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEVGXHUwMEVFXHUwMEVDXHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMEY0XHUwMEY2XHUwMEYyXHUwMEZCXHUwMEY5XHUwMEZGXHUwMEQ2XHUwMERDXHUwMEY4XHUwMEEzXHUwMEQ4XHUwMEQ3XHUwMTkyXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMEFBXHUwMEJBXHUwMEJGXHUwMEFFXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwMEMxXHUwMEMyXHUwMEMwXHUwMEE5XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMEEyXHUwMEE1XHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwMEUzXHUwMEMzXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHUwMEYwXHUwMEQwXHUwMENBXHUwMENCXHUwMEM4XHUyMEFDXHUwMENEXHUwMENFXHUwMENGXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwMEE2XHUwMENDXHUyNTgwXHUwMEQzXHUwMERGXHUwMEQ0XHUwMEQyXHUwMEY1XHUwMEQ1XHUwMEI1XHUwMEZFXHUwMERFXHUwMERBXHUwMERCXHUwMEQ5XHUwMEZEXHUwMEREXHUwMEFGXHUwMEI0XHUwMEFEXHUwMEIxXHUyMDE3XHUwMEJFXHUwMEI2XHUwMEE3XHUwMEY3XHUwMEI4XHUwMEIwXHUwMEE4XHUwMEI3XHUwMEI5XHUwMEIzXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NThcIjogXCJjcDg1OFwiLFxuICBcImNzaWJtODU4XCI6IFwiY3A4NThcIixcbiAgXCJjcDg2MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEUzXHUwMEUwXHUwMEMxXHUwMEU3XHUwMEVBXHUwMENBXHUwMEU4XHUwMENEXHUwMEQ0XHUwMEVDXHUwMEMzXHUwMEMyXHUwMEM5XHUwMEMwXHUwMEM4XHUwMEY0XHUwMEY1XHUwMEYyXHUwMERBXHUwMEY5XHUwMENDXHUwMEQ1XHUwMERDXHUwMEEyXHUwMEEzXHUwMEQ5XHUyMEE3XHUwMEQzXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMEFBXHUwMEJBXHUwMEJGXHUwMEQyXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0IxXHUwMERGXHUwMzkzXHUwM0MwXHUwM0EzXHUwM0MzXHUwMEI1XHUwM0M0XHUwM0E2XHUwMzk4XHUwM0E5XHUwM0I0XHUyMjFFXHUwM0M2XHUwM0I1XHUyMjI5XHUyMjYxXHUwMEIxXHUyMjY1XHUyMjY0XHUyMzIwXHUyMzIxXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NjBcIjogXCJjcDg2MFwiLFxuICBcImNzaWJtODYwXCI6IFwiY3A4NjBcIixcbiAgXCJjcDg2MVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMEUwXHUwMEU1XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEQwXHUwMEYwXHUwMERFXHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMEY0XHUwMEY2XHUwMEZFXHUwMEZCXHUwMEREXHUwMEZEXHUwMEQ2XHUwMERDXHUwMEY4XHUwMEEzXHUwMEQ4XHUyMEE3XHUwMTkyXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEMxXHUwMENEXHUwMEQzXHUwMERBXHUwMEJGXHUyMzEwXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0IxXHUwMERGXHUwMzkzXHUwM0MwXHUwM0EzXHUwM0MzXHUwMEI1XHUwM0M0XHUwM0E2XHUwMzk4XHUwM0E5XHUwM0I0XHUyMjFFXHUwM0M2XHUwM0I1XHUyMjI5XHUyMjYxXHUwMEIxXHUyMjY1XHUyMjY0XHUyMzIwXHUyMzIxXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NjFcIjogXCJjcDg2MVwiLFxuICBcImNzaWJtODYxXCI6IFwiY3A4NjFcIixcbiAgXCJjcDg2MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwNUQwXHUwNUQxXHUwNUQyXHUwNUQzXHUwNUQ0XHUwNUQ1XHUwNUQ2XHUwNUQ3XHUwNUQ4XHUwNUQ5XHUwNURBXHUwNURCXHUwNURDXHUwNUREXHUwNURFXHUwNURGXHUwNUUwXHUwNUUxXHUwNUUyXHUwNUUzXHUwNUU0XHUwNUU1XHUwNUU2XHUwNUU3XHUwNUU4XHUwNUU5XHUwNUVBXHUwMEEyXHUwMEEzXHUwMEE1XHUyMEE3XHUwMTkyXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMEFBXHUwMEJBXHUwMEJGXHUyMzEwXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0IxXHUwMERGXHUwMzkzXHUwM0MwXHUwM0EzXHUwM0MzXHUwMEI1XHUwM0M0XHUwM0E2XHUwMzk4XHUwM0E5XHUwM0I0XHUyMjFFXHUwM0M2XHUwM0I1XHUyMjI5XHUyMjYxXHUwMEIxXHUyMjY1XHUyMjY0XHUyMzIwXHUyMzIxXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NjJcIjogXCJjcDg2MlwiLFxuICBcImNzaWJtODYyXCI6IFwiY3A4NjJcIixcbiAgXCJjcDg2M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEMyXHUwMEUwXHUwMEI2XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEVGXHUwMEVFXHUyMDE3XHUwMEMwXHUwMEE3XHUwMEM5XHUwMEM4XHUwMENBXHUwMEY0XHUwMENCXHUwMENGXHUwMEZCXHUwMEY5XHUwMEE0XHUwMEQ0XHUwMERDXHUwMEEyXHUwMEEzXHUwMEQ5XHUwMERCXHUwMTkyXHUwMEE2XHUwMEI0XHUwMEYzXHUwMEZBXHUwMEE4XHUwMEI4XHUwMEIzXHUwMEFGXHUwMENFXHUyMzEwXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEJFXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0IxXHUwMERGXHUwMzkzXHUwM0MwXHUwM0EzXHUwM0MzXHUwMEI1XHUwM0M0XHUwM0E2XHUwMzk4XHUwM0E5XHUwM0I0XHUyMjFFXHUwM0M2XHUwM0I1XHUyMjI5XHUyMjYxXHUwMEIxXHUyMjY1XHUyMjY0XHUyMzIwXHUyMzIxXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NjNcIjogXCJjcDg2M1wiLFxuICBcImNzaWJtODYzXCI6IFwiY3A4NjNcIixcbiAgXCJjcDg2NFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyRcdTA2NkEmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9flx1MDA3Rlx1MDBCMFx1MDBCN1x1MjIxOVx1MjIxQVx1MjU5Mlx1MjUwMFx1MjUwMlx1MjUzQ1x1MjUyNFx1MjUyQ1x1MjUxQ1x1MjUzNFx1MjUxMFx1MjUwQ1x1MjUxNFx1MjUxOFx1MDNCMlx1MjIxRVx1MDNDNlx1MDBCMVx1MDBCRFx1MDBCQ1x1MjI0OFx1MDBBQlx1MDBCQlx1RkVGN1x1RkVGOFx1RkZGRFx1RkZGRFx1RkVGQlx1RkVGQ1x1RkZGRFx1MDBBMFx1MDBBRFx1RkU4Mlx1MDBBM1x1MDBBNFx1RkU4NFx1RkZGRFx1RkZGRFx1RkU4RVx1RkU4Rlx1RkU5NVx1RkU5OVx1MDYwQ1x1RkU5RFx1RkVBMVx1RkVBNVx1MDY2MFx1MDY2MVx1MDY2Mlx1MDY2M1x1MDY2NFx1MDY2NVx1MDY2Nlx1MDY2N1x1MDY2OFx1MDY2OVx1RkVEMVx1MDYxQlx1RkVCMVx1RkVCNVx1RkVCOVx1MDYxRlx1MDBBMlx1RkU4MFx1RkU4MVx1RkU4M1x1RkU4NVx1RkVDQVx1RkU4Qlx1RkU4RFx1RkU5MVx1RkU5M1x1RkU5N1x1RkU5Qlx1RkU5Rlx1RkVBM1x1RkVBN1x1RkVBOVx1RkVBQlx1RkVBRFx1RkVBRlx1RkVCM1x1RkVCN1x1RkVCQlx1RkVCRlx1RkVDMVx1RkVDNVx1RkVDQlx1RkVDRlx1MDBBNlx1MDBBQ1x1MDBGN1x1MDBEN1x1RkVDOVx1MDY0MFx1RkVEM1x1RkVEN1x1RkVEQlx1RkVERlx1RkVFM1x1RkVFN1x1RkVFQlx1RkVFRFx1RkVFRlx1RkVGM1x1RkVCRFx1RkVDQ1x1RkVDRVx1RkVDRFx1RkVFMVx1RkU3RFx1MDY1MVx1RkVFNVx1RkVFOVx1RkVFQ1x1RkVGMFx1RkVGMlx1RkVEMFx1RkVENVx1RkVGNVx1RkVGNlx1RkVERFx1RkVEOVx1RkVGMVx1MjVBMFx1RkZGRFwiXG4gIH0sXG4gIFwiaWJtODY0XCI6IFwiY3A4NjRcIixcbiAgXCJjc2libTg2NFwiOiBcImNwODY0XCIsXG4gIFwiY3A4NjVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDBDN1x1MDBGQ1x1MDBFOVx1MDBFMlx1MDBFNFx1MDBFMFx1MDBFNVx1MDBFN1x1MDBFQVx1MDBFQlx1MDBFOFx1MDBFRlx1MDBFRVx1MDBFQ1x1MDBDNFx1MDBDNVx1MDBDOVx1MDBFNlx1MDBDNlx1MDBGNFx1MDBGNlx1MDBGMlx1MDBGQlx1MDBGOVx1MDBGRlx1MDBENlx1MDBEQ1x1MDBGOFx1MDBBM1x1MDBEOFx1MjBBN1x1MDE5Mlx1MDBFMVx1MDBFRFx1MDBGM1x1MDBGQVx1MDBGMVx1MDBEMVx1MDBBQVx1MDBCQVx1MDBCRlx1MjMxMFx1MDBBQ1x1MDBCRFx1MDBCQ1x1MDBBMVx1MDBBQlx1MDBBNFx1MjU5MVx1MjU5Mlx1MjU5M1x1MjUwMlx1MjUyNFx1MjU2MVx1MjU2Mlx1MjU1Nlx1MjU1NVx1MjU2M1x1MjU1MVx1MjU1N1x1MjU1RFx1MjU1Q1x1MjU1Qlx1MjUxMFx1MjUxNFx1MjUzNFx1MjUyQ1x1MjUxQ1x1MjUwMFx1MjUzQ1x1MjU1RVx1MjU1Rlx1MjU1QVx1MjU1NFx1MjU2OVx1MjU2Nlx1MjU2MFx1MjU1MFx1MjU2Q1x1MjU2N1x1MjU2OFx1MjU2NFx1MjU2NVx1MjU1OVx1MjU1OFx1MjU1Mlx1MjU1M1x1MjU2Qlx1MjU2QVx1MjUxOFx1MjUwQ1x1MjU4OFx1MjU4NFx1MjU4Q1x1MjU5MFx1MjU4MFx1MDNCMVx1MDBERlx1MDM5M1x1MDNDMFx1MDNBM1x1MDNDM1x1MDBCNVx1MDNDNFx1MDNBNlx1MDM5OFx1MDNBOVx1MDNCNFx1MjIxRVx1MDNDNlx1MDNCNVx1MjIyOVx1MjI2MVx1MDBCMVx1MjI2NVx1MjI2NFx1MjMyMFx1MjMyMVx1MDBGN1x1MjI0OFx1MDBCMFx1MjIxOVx1MDBCN1x1MjIxQVx1MjA3Rlx1MDBCMlx1MjVBMFx1MDBBMFwiXG4gIH0sXG4gIFwiaWJtODY1XCI6IFwiY3A4NjVcIixcbiAgXCJjc2libTg2NVwiOiBcImNwODY1XCIsXG4gIFwiY3A4NjZcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDQxMFx1MDQxMVx1MDQxMlx1MDQxM1x1MDQxNFx1MDQxNVx1MDQxNlx1MDQxN1x1MDQxOFx1MDQxOVx1MDQxQVx1MDQxQlx1MDQxQ1x1MDQxRFx1MDQxRVx1MDQxRlx1MDQyMFx1MDQyMVx1MDQyMlx1MDQyM1x1MDQyNFx1MDQyNVx1MDQyNlx1MDQyN1x1MDQyOFx1MDQyOVx1MDQyQVx1MDQyQlx1MDQyQ1x1MDQyRFx1MDQyRVx1MDQyRlx1MDQzMFx1MDQzMVx1MDQzMlx1MDQzM1x1MDQzNFx1MDQzNVx1MDQzNlx1MDQzN1x1MDQzOFx1MDQzOVx1MDQzQVx1MDQzQlx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzRlx1MjU5MVx1MjU5Mlx1MjU5M1x1MjUwMlx1MjUyNFx1MjU2MVx1MjU2Mlx1MjU1Nlx1MjU1NVx1MjU2M1x1MjU1MVx1MjU1N1x1MjU1RFx1MjU1Q1x1MjU1Qlx1MjUxMFx1MjUxNFx1MjUzNFx1MjUyQ1x1MjUxQ1x1MjUwMFx1MjUzQ1x1MjU1RVx1MjU1Rlx1MjU1QVx1MjU1NFx1MjU2OVx1MjU2Nlx1MjU2MFx1MjU1MFx1MjU2Q1x1MjU2N1x1MjU2OFx1MjU2NFx1MjU2NVx1MjU1OVx1MjU1OFx1MjU1Mlx1MjU1M1x1MjU2Qlx1MjU2QVx1MjUxOFx1MjUwQ1x1MjU4OFx1MjU4NFx1MjU4Q1x1MjU5MFx1MjU4MFx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQ0NFx1MDQ0NVx1MDQ0Nlx1MDQ0N1x1MDQ0OFx1MDQ0OVx1MDQ0QVx1MDQ0Qlx1MDQ0Q1x1MDQ0RFx1MDQ0RVx1MDQ0Rlx1MDQwMVx1MDQ1MVx1MDQwNFx1MDQ1NFx1MDQwN1x1MDQ1N1x1MDQwRVx1MDQ1RVx1MDBCMFx1MjIxOVx1MDBCN1x1MjIxQVx1MjExNlx1MDBBNFx1MjVBMFx1MDBBMFwiXG4gIH0sXG4gIFwiaWJtODY2XCI6IFwiY3A4NjZcIixcbiAgXCJjc2libTg2NlwiOiBcImNwODY2XCIsXG4gIFwiY3A4NjlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MDM4Nlx1RkZGRFx1MDBCN1x1MDBBQ1x1MDBBNlx1MjAxOFx1MjAxOVx1MDM4OFx1MjAxNVx1MDM4OVx1MDM4QVx1MDNBQVx1MDM4Q1x1RkZGRFx1RkZGRFx1MDM4RVx1MDNBQlx1MDBBOVx1MDM4Rlx1MDBCMlx1MDBCM1x1MDNBQ1x1MDBBM1x1MDNBRFx1MDNBRVx1MDNBRlx1MDNDQVx1MDM5MFx1MDNDQ1x1MDNDRFx1MDM5MVx1MDM5Mlx1MDM5M1x1MDM5NFx1MDM5NVx1MDM5Nlx1MDM5N1x1MDBCRFx1MDM5OFx1MDM5OVx1MDBBQlx1MDBCQlx1MjU5MVx1MjU5Mlx1MjU5M1x1MjUwMlx1MjUyNFx1MDM5QVx1MDM5Qlx1MDM5Q1x1MDM5RFx1MjU2M1x1MjU1MVx1MjU1N1x1MjU1RFx1MDM5RVx1MDM5Rlx1MjUxMFx1MjUxNFx1MjUzNFx1MjUyQ1x1MjUxQ1x1MjUwMFx1MjUzQ1x1MDNBMFx1MDNBMVx1MjU1QVx1MjU1NFx1MjU2OVx1MjU2Nlx1MjU2MFx1MjU1MFx1MjU2Q1x1MDNBM1x1MDNBNFx1MDNBNVx1MDNBNlx1MDNBN1x1MDNBOFx1MDNBOVx1MDNCMVx1MDNCMlx1MDNCM1x1MjUxOFx1MjUwQ1x1MjU4OFx1MjU4NFx1MDNCNFx1MDNCNVx1MjU4MFx1MDNCNlx1MDNCN1x1MDNCOFx1MDNCOVx1MDNCQVx1MDNCQlx1MDNCQ1x1MDNCRFx1MDNCRVx1MDNCRlx1MDNDMFx1MDNDMVx1MDNDM1x1MDNDMlx1MDNDNFx1MDM4NFx1MDBBRFx1MDBCMVx1MDNDNVx1MDNDNlx1MDNDN1x1MDBBN1x1MDNDOFx1MDM4NVx1MDBCMFx1MDBBOFx1MDNDOVx1MDNDQlx1MDNCMFx1MDNDRVx1MjVBMFx1MDBBMFwiXG4gIH0sXG4gIFwiaWJtODY5XCI6IFwiY3A4NjlcIixcbiAgXCJjc2libTg2OVwiOiBcImNwODY5XCIsXG4gIFwiY3A5MjJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MDBBMVx1MDBBMlx1MDBBM1x1MDBBNFx1MDBBNVx1MDBBNlx1MDBBN1x1MDBBOFx1MDBBOVx1MDBBQVx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MjAzRVx1MDBCMFx1MDBCMVx1MDBCMlx1MDBCM1x1MDBCNFx1MDBCNVx1MDBCNlx1MDBCN1x1MDBCOFx1MDBCOVx1MDBCQVx1MDBCQlx1MDBCQ1x1MDBCRFx1MDBCRVx1MDBCRlx1MDBDMFx1MDBDMVx1MDBDMlx1MDBDM1x1MDBDNFx1MDBDNVx1MDBDNlx1MDBDN1x1MDBDOFx1MDBDOVx1MDBDQVx1MDBDQlx1MDBDQ1x1MDBDRFx1MDBDRVx1MDBDRlx1MDE2MFx1MDBEMVx1MDBEMlx1MDBEM1x1MDBENFx1MDBENVx1MDBENlx1MDBEN1x1MDBEOFx1MDBEOVx1MDBEQVx1MDBEQlx1MDBEQ1x1MDBERFx1MDE3RFx1MDBERlx1MDBFMFx1MDBFMVx1MDBFMlx1MDBFM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDBFN1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQlx1MDBFQ1x1MDBFRFx1MDBFRVx1MDBFRlx1MDE2MVx1MDBGMVx1MDBGMlx1MDBGM1x1MDBGNFx1MDBGNVx1MDBGNlx1MDBGN1x1MDBGOFx1MDBGOVx1MDBGQVx1MDBGQlx1MDBGQ1x1MDBGRFx1MDE3RVx1MDBGRlwiXG4gIH0sXG4gIFwiaWJtOTIyXCI6IFwiY3A5MjJcIixcbiAgXCJjc2libTkyMlwiOiBcImNwOTIyXCIsXG4gIFwiY3AxMDQ2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdUZFODhcdTAwRDdcdTAwRjdcdUY4RjZcdUY4RjVcdUY4RjRcdUY4RjdcdUZFNzFcdTAwODhcdTI1QTBcdTI1MDJcdTI1MDBcdTI1MTBcdTI1MENcdTI1MTRcdTI1MThcdUZFNzlcdUZFN0JcdUZFN0RcdUZFN0ZcdUZFNzdcdUZFOEFcdUZFRjBcdUZFRjNcdUZFRjJcdUZFQ0VcdUZFQ0ZcdUZFRDBcdUZFRjZcdUZFRjhcdUZFRkFcdUZFRkNcdTAwQTBcdUY4RkFcdUY4RjlcdUY4RjhcdTAwQTRcdUY4RkJcdUZFOEJcdUZFOTFcdUZFOTdcdUZFOUJcdUZFOUZcdUZFQTNcdTA2MENcdTAwQURcdUZFQTdcdUZFQjNcdTA2NjBcdTA2NjFcdTA2NjJcdTA2NjNcdTA2NjRcdTA2NjVcdTA2NjZcdTA2NjdcdTA2NjhcdTA2NjlcdUZFQjdcdTA2MUJcdUZFQkJcdUZFQkZcdUZFQ0FcdTA2MUZcdUZFQ0JcdTA2MjFcdTA2MjJcdTA2MjNcdTA2MjRcdTA2MjVcdTA2MjZcdTA2MjdcdTA2MjhcdTA2MjlcdTA2MkFcdTA2MkJcdTA2MkNcdTA2MkRcdTA2MkVcdTA2MkZcdTA2MzBcdTA2MzFcdTA2MzJcdTA2MzNcdTA2MzRcdTA2MzVcdTA2MzZcdTA2MzdcdUZFQzdcdTA2MzlcdTA2M0FcdUZFQ0NcdUZFODJcdUZFODRcdUZFOEVcdUZFRDNcdTA2NDBcdTA2NDFcdTA2NDJcdTA2NDNcdTA2NDRcdTA2NDVcdTA2NDZcdTA2NDdcdTA2NDhcdTA2NDlcdTA2NEFcdTA2NEJcdTA2NENcdTA2NERcdTA2NEVcdTA2NEZcdTA2NTBcdTA2NTFcdTA2NTJcdUZFRDdcdUZFREJcdUZFREZcdUY4RkNcdUZFRjVcdUZFRjdcdUZFRjlcdUZFRkJcdUZFRTNcdUZFRTdcdUZFRUNcdUZFRTlcdUZGRkRcIlxuICB9LFxuICBcImlibTEwNDZcIjogXCJjcDEwNDZcIixcbiAgXCJjc2libTEwNDZcIjogXCJjcDEwNDZcIixcbiAgXCJjcDExMjRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MDQwMVx1MDQwMlx1MDQ5MFx1MDQwNFx1MDQwNVx1MDQwNlx1MDQwN1x1MDQwOFx1MDQwOVx1MDQwQVx1MDQwQlx1MDQwQ1x1MDBBRFx1MDQwRVx1MDQwRlx1MDQxMFx1MDQxMVx1MDQxMlx1MDQxM1x1MDQxNFx1MDQxNVx1MDQxNlx1MDQxN1x1MDQxOFx1MDQxOVx1MDQxQVx1MDQxQlx1MDQxQ1x1MDQxRFx1MDQxRVx1MDQxRlx1MDQyMFx1MDQyMVx1MDQyMlx1MDQyM1x1MDQyNFx1MDQyNVx1MDQyNlx1MDQyN1x1MDQyOFx1MDQyOVx1MDQyQVx1MDQyQlx1MDQyQ1x1MDQyRFx1MDQyRVx1MDQyRlx1MDQzMFx1MDQzMVx1MDQzMlx1MDQzM1x1MDQzNFx1MDQzNVx1MDQzNlx1MDQzN1x1MDQzOFx1MDQzOVx1MDQzQVx1MDQzQlx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQ0NFx1MDQ0NVx1MDQ0Nlx1MDQ0N1x1MDQ0OFx1MDQ0OVx1MDQ0QVx1MDQ0Qlx1MDQ0Q1x1MDQ0RFx1MDQ0RVx1MDQ0Rlx1MjExNlx1MDQ1MVx1MDQ1Mlx1MDQ5MVx1MDQ1NFx1MDQ1NVx1MDQ1Nlx1MDQ1N1x1MDQ1OFx1MDQ1OVx1MDQ1QVx1MDQ1Qlx1MDQ1Q1x1MDBBN1x1MDQ1RVx1MDQ1RlwiXG4gIH0sXG4gIFwiaWJtMTEyNFwiOiBcImNwMTEyNFwiLFxuICBcImNzaWJtMTEyNFwiOiBcImNwMTEyNFwiLFxuICBcImNwMTEyNVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwNDEwXHUwNDExXHUwNDEyXHUwNDEzXHUwNDE0XHUwNDE1XHUwNDE2XHUwNDE3XHUwNDE4XHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDFEXHUwNDFFXHUwNDFGXHUwNDIwXHUwNDIxXHUwNDIyXHUwNDIzXHUwNDI0XHUwNDI1XHUwNDI2XHUwNDI3XHUwNDI4XHUwNDI5XHUwNDJBXHUwNDJCXHUwNDJDXHUwNDJEXHUwNDJFXHUwNDJGXHUwNDMwXHUwNDMxXHUwNDMyXHUwNDMzXHUwNDM0XHUwNDM1XHUwNDM2XHUwNDM3XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDNGXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwNDQwXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDQ0XHUwNDQ1XHUwNDQ2XHUwNDQ3XHUwNDQ4XHUwNDQ5XHUwNDRBXHUwNDRCXHUwNDRDXHUwNDREXHUwNDRFXHUwNDRGXHUwNDAxXHUwNDUxXHUwNDkwXHUwNDkxXHUwNDA0XHUwNDU0XHUwNDA2XHUwNDU2XHUwNDA3XHUwNDU3XHUwMEI3XHUyMjFBXHUyMTE2XHUwMEE0XHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm0xMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiY3NpYm0xMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiY3AxMTI5XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwODBcdTAwODFcdTAwODJcdTAwODNcdTAwODRcdTAwODVcdTAwODZcdTAwODdcdTAwODhcdTAwODlcdTAwOEFcdTAwOEJcdTAwOENcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTAwOTFcdTAwOTJcdTAwOTNcdTAwOTRcdTAwOTVcdTAwOTZcdTAwOTdcdTAwOThcdTAwOTlcdTAwOUFcdTAwOUJcdTAwOUNcdTAwOURcdTAwOUVcdTAwOUZcdTAwQTBcdTAwQTFcdTAwQTJcdTAwQTNcdTAwQTRcdTAwQTVcdTAwQTZcdTAwQTdcdTAxNTNcdTAwQTlcdTAwQUFcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTAwQUZcdTAwQjBcdTAwQjFcdTAwQjJcdTAwQjNcdTAxNzhcdTAwQjVcdTAwQjZcdTAwQjdcdTAxNTJcdTAwQjlcdTAwQkFcdTAwQkJcdTAwQkNcdTAwQkRcdTAwQkVcdTAwQkZcdTAwQzBcdTAwQzFcdTAwQzJcdTAxMDJcdTAwQzRcdTAwQzVcdTAwQzZcdTAwQzdcdTAwQzhcdTAwQzlcdTAwQ0FcdTAwQ0JcdTAzMDBcdTAwQ0RcdTAwQ0VcdTAwQ0ZcdTAxMTBcdTAwRDFcdTAzMDlcdTAwRDNcdTAwRDRcdTAxQTBcdTAwRDZcdTAwRDdcdTAwRDhcdTAwRDlcdTAwREFcdTAwREJcdTAwRENcdTAxQUZcdTAzMDNcdTAwREZcdTAwRTBcdTAwRTFcdTAwRTJcdTAxMDNcdTAwRTRcdTAwRTVcdTAwRTZcdTAwRTdcdTAwRThcdTAwRTlcdTAwRUFcdTAwRUJcdTAzMDFcdTAwRURcdTAwRUVcdTAwRUZcdTAxMTFcdTAwRjFcdTAzMjNcdTAwRjNcdTAwRjRcdTAxQTFcdTAwRjZcdTAwRjdcdTAwRjhcdTAwRjlcdTAwRkFcdTAwRkJcdTAwRkNcdTAxQjBcdTIwQUJcdTAwRkZcIlxuICB9LFxuICBcImlibTExMjlcIjogXCJjcDExMjlcIixcbiAgXCJjc2libTExMjlcIjogXCJjcDExMjlcIixcbiAgXCJjcDExMzNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4N1x1MEU4OFx1MEVBQVx1MEU4QVx1MEU4RFx1MEU5NFx1MEU5NVx1MEU5Nlx1MEU5N1x1MEU5OVx1MEU5QVx1MEU5Qlx1MEU5Q1x1MEU5RFx1MEU5RVx1MEU5Rlx1MEVBMVx1MEVBMlx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQlx1MEVBRFx1MEVBRVx1RkZGRFx1RkZGRFx1RkZGRFx1MEVBRlx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCNFx1MEVCNVx1MEVCNlx1MEVCN1x1MEVCOFx1MEVCOVx1MEVCQ1x1MEVCMVx1MEVCQlx1MEVCRFx1RkZGRFx1RkZGRFx1RkZGRFx1MEVDMFx1MEVDMVx1MEVDMlx1MEVDM1x1MEVDNFx1MEVDOFx1MEVDOVx1MEVDQVx1MEVDQlx1MEVDQ1x1MEVDRFx1MEVDNlx1RkZGRFx1MEVEQ1x1MEVERFx1MjBBRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MEVEMFx1MEVEMVx1MEVEMlx1MEVEM1x1MEVENFx1MEVENVx1MEVENlx1MEVEN1x1MEVEOFx1MEVEOVx1RkZGRFx1RkZGRFx1MDBBMlx1MDBBQ1x1MDBBNlx1RkZGRFwiXG4gIH0sXG4gIFwiaWJtMTEzM1wiOiBcImNwMTEzM1wiLFxuICBcImNzaWJtMTEzM1wiOiBcImNwMTEzM1wiLFxuICBcImNwMTE2MVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwRTQ4XHUwRTAxXHUwRTAyXHUwRTAzXHUwRTA0XHUwRTA1XHUwRTA2XHUwRTA3XHUwRTA4XHUwRTA5XHUwRTBBXHUwRTBCXHUwRTBDXHUwRTBEXHUwRTBFXHUwRTBGXHUwRTEwXHUwRTExXHUwRTEyXHUwRTEzXHUwRTE0XHUwRTE1XHUwRTE2XHUwRTE3XHUwRTE4XHUwRTE5XHUwRTFBXHUwRTFCXHUwRTFDXHUwRTFEXHUwRTFFXHUwRTFGXHUwRTIwXHUwRTIxXHUwRTIyXHUwRTIzXHUwRTI0XHUwRTI1XHUwRTI2XHUwRTI3XHUwRTI4XHUwRTI5XHUwRTJBXHUwRTJCXHUwRTJDXHUwRTJEXHUwRTJFXHUwRTJGXHUwRTMwXHUwRTMxXHUwRTMyXHUwRTMzXHUwRTM0XHUwRTM1XHUwRTM2XHUwRTM3XHUwRTM4XHUwRTM5XHUwRTNBXHUwRTQ5XHUwRTRBXHUwRTRCXHUyMEFDXHUwRTNGXHUwRTQwXHUwRTQxXHUwRTQyXHUwRTQzXHUwRTQ0XHUwRTQ1XHUwRTQ2XHUwRTQ3XHUwRTQ4XHUwRTQ5XHUwRTRBXHUwRTRCXHUwRTRDXHUwRTREXHUwRTRFXHUwRTRGXHUwRTUwXHUwRTUxXHUwRTUyXHUwRTUzXHUwRTU0XHUwRTU1XHUwRTU2XHUwRTU3XHUwRTU4XHUwRTU5XHUwRTVBXHUwRTVCXHUwMEEyXHUwMEFDXHUwMEE2XHUwMEEwXCJcbiAgfSxcbiAgXCJpYm0xMTYxXCI6IFwiY3AxMTYxXCIsXG4gIFwiY3NpYm0xMTYxXCI6IFwiY3AxMTYxXCIsXG4gIFwiY3AxMTYyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTIwQUNcdTAwODFcdTAwODJcdTAwODNcdTAwODRcdTIwMjZcdTAwODZcdTAwODdcdTAwODhcdTAwODlcdTAwOEFcdTAwOEJcdTAwOENcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdTAwOThcdTAwOTlcdTAwOUFcdTAwOUJcdTAwOUNcdTAwOURcdTAwOUVcdTAwOUZcdTAwQTBcdTBFMDFcdTBFMDJcdTBFMDNcdTBFMDRcdTBFMDVcdTBFMDZcdTBFMDdcdTBFMDhcdTBFMDlcdTBFMEFcdTBFMEJcdTBFMENcdTBFMERcdTBFMEVcdTBFMEZcdTBFMTBcdTBFMTFcdTBFMTJcdTBFMTNcdTBFMTRcdTBFMTVcdTBFMTZcdTBFMTdcdTBFMThcdTBFMTlcdTBFMUFcdTBFMUJcdTBFMUNcdTBFMURcdTBFMUVcdTBFMUZcdTBFMjBcdTBFMjFcdTBFMjJcdTBFMjNcdTBFMjRcdTBFMjVcdTBFMjZcdTBFMjdcdTBFMjhcdTBFMjlcdTBFMkFcdTBFMkJcdTBFMkNcdTBFMkRcdTBFMkVcdTBFMkZcdTBFMzBcdTBFMzFcdTBFMzJcdTBFMzNcdTBFMzRcdTBFMzVcdTBFMzZcdTBFMzdcdTBFMzhcdTBFMzlcdTBFM0FcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTBFM0ZcdTBFNDBcdTBFNDFcdTBFNDJcdTBFNDNcdTBFNDRcdTBFNDVcdTBFNDZcdTBFNDdcdTBFNDhcdTBFNDlcdTBFNEFcdTBFNEJcdTBFNENcdTBFNERcdTBFNEVcdTBFNEZcdTBFNTBcdTBFNTFcdTBFNTJcdTBFNTNcdTBFNTRcdTBFNTVcdTBFNTZcdTBFNTdcdTBFNThcdTBFNTlcdTBFNUFcdTBFNUJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcIlxuICB9LFxuICBcImlibTExNjJcIjogXCJjcDExNjJcIixcbiAgXCJjc2libTExNjJcIjogXCJjcDExNjJcIixcbiAgXCJjcDExNjNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MDBBMVx1MDBBMlx1MDBBM1x1MjBBQ1x1MDBBNVx1MDBBNlx1MDBBN1x1MDE1M1x1MDBBOVx1MDBBQVx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MDBBRlx1MDBCMFx1MDBCMVx1MDBCMlx1MDBCM1x1MDE3OFx1MDBCNVx1MDBCNlx1MDBCN1x1MDE1Mlx1MDBCOVx1MDBCQVx1MDBCQlx1MDBCQ1x1MDBCRFx1MDBCRVx1MDBCRlx1MDBDMFx1MDBDMVx1MDBDMlx1MDEwMlx1MDBDNFx1MDBDNVx1MDBDNlx1MDBDN1x1MDBDOFx1MDBDOVx1MDBDQVx1MDBDQlx1MDMwMFx1MDBDRFx1MDBDRVx1MDBDRlx1MDExMFx1MDBEMVx1MDMwOVx1MDBEM1x1MDBENFx1MDFBMFx1MDBENlx1MDBEN1x1MDBEOFx1MDBEOVx1MDBEQVx1MDBEQlx1MDBEQ1x1MDFBRlx1MDMwM1x1MDBERlx1MDBFMFx1MDBFMVx1MDBFMlx1MDEwM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDBFN1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQlx1MDMwMVx1MDBFRFx1MDBFRVx1MDBFRlx1MDExMVx1MDBGMVx1MDMyM1x1MDBGM1x1MDBGNFx1MDFBMVx1MDBGNlx1MDBGN1x1MDBGOFx1MDBGOVx1MDBGQVx1MDBGQlx1MDBGQ1x1MDFCMFx1MjBBQlx1MDBGRlwiXG4gIH0sXG4gIFwiaWJtMTE2M1wiOiBcImNwMTE2M1wiLFxuICBcImNzaWJtMTE2M1wiOiBcImNwMTE2M1wiLFxuICBcIm1hY2Nyb2F0aWFuXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwQzRcdTAwQzVcdTAwQzdcdTAwQzlcdTAwRDFcdTAwRDZcdTAwRENcdTAwRTFcdTAwRTBcdTAwRTJcdTAwRTRcdTAwRTNcdTAwRTVcdTAwRTdcdTAwRTlcdTAwRThcdTAwRUFcdTAwRUJcdTAwRURcdTAwRUNcdTAwRUVcdTAwRUZcdTAwRjFcdTAwRjNcdTAwRjJcdTAwRjRcdTAwRjZcdTAwRjVcdTAwRkFcdTAwRjlcdTAwRkJcdTAwRkNcdTIwMjBcdTAwQjBcdTAwQTJcdTAwQTNcdTAwQTdcdTIwMjJcdTAwQjZcdTAwREZcdTAwQUVcdTAxNjBcdTIxMjJcdTAwQjRcdTAwQThcdTIyNjBcdTAxN0RcdTAwRDhcdTIyMUVcdTAwQjFcdTIyNjRcdTIyNjVcdTIyMDZcdTAwQjVcdTIyMDJcdTIyMTFcdTIyMEZcdTAxNjFcdTIyMkJcdTAwQUFcdTAwQkFcdTIxMjZcdTAxN0VcdTAwRjhcdTAwQkZcdTAwQTFcdTAwQUNcdTIyMUFcdTAxOTJcdTIyNDhcdTAxMDZcdTAwQUJcdTAxMENcdTIwMjZcdTAwQTBcdTAwQzBcdTAwQzNcdTAwRDVcdTAxNTJcdTAxNTNcdTAxMTBcdTIwMTRcdTIwMUNcdTIwMURcdTIwMThcdTIwMTlcdTAwRjdcdTI1Q0FcdUZGRkRcdTAwQTlcdTIwNDRcdTAwQTRcdTIwMzlcdTIwM0FcdTAwQzZcdTAwQkJcdTIwMTNcdTAwQjdcdTIwMUFcdTIwMUVcdTIwMzBcdTAwQzJcdTAxMDdcdTAwQzFcdTAxMERcdTAwQzhcdTAwQ0RcdTAwQ0VcdTAwQ0ZcdTAwQ0NcdTAwRDNcdTAwRDRcdTAxMTFcdTAwRDJcdTAwREFcdTAwREJcdTAwRDlcdTAxMzFcdTAyQzZcdTAyRENcdTAwQUZcdTAzQzBcdTAwQ0JcdTAyREFcdTAwQjhcdTAwQ0FcdTAwRTZcdTAyQzdcIlxuICB9LFxuICBcIm1hY2N5cmlsbGljXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTA0MTBcdTA0MTFcdTA0MTJcdTA0MTNcdTA0MTRcdTA0MTVcdTA0MTZcdTA0MTdcdTA0MThcdTA0MTlcdTA0MUFcdTA0MUJcdTA0MUNcdTA0MURcdTA0MUVcdTA0MUZcdTA0MjBcdTA0MjFcdTA0MjJcdTA0MjNcdTA0MjRcdTA0MjVcdTA0MjZcdTA0MjdcdTA0MjhcdTA0MjlcdTA0MkFcdTA0MkJcdTA0MkNcdTA0MkRcdTA0MkVcdTA0MkZcdTIwMjBcdTAwQjBcdTAwQTJcdTAwQTNcdTAwQTdcdTIwMjJcdTAwQjZcdTA0MDZcdTAwQUVcdTAwQTlcdTIxMjJcdTA0MDJcdTA0NTJcdTIyNjBcdTA0MDNcdTA0NTNcdTIyMUVcdTAwQjFcdTIyNjRcdTIyNjVcdTA0NTZcdTAwQjVcdTIyMDJcdTA0MDhcdTA0MDRcdTA0NTRcdTA0MDdcdTA0NTdcdTA0MDlcdTA0NTlcdTA0MEFcdTA0NUFcdTA0NThcdTA0MDVcdTAwQUNcdTIyMUFcdTAxOTJcdTIyNDhcdTIyMDZcdTAwQUJcdTAwQkJcdTIwMjZcdTAwQTBcdTA0MEJcdTA0NUJcdTA0MENcdTA0NUNcdTA0NTVcdTIwMTNcdTIwMTRcdTIwMUNcdTIwMURcdTIwMThcdTIwMTlcdTAwRjdcdTIwMUVcdTA0MEVcdTA0NUVcdTA0MEZcdTA0NUZcdTIxMTZcdTA0MDFcdTA0NTFcdTA0NEZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0MzZcdTA0MzdcdTA0MzhcdTA0MzlcdTA0M0FcdTA0M0JcdTA0M0NcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0NDFcdTA0NDJcdTA0NDNcdTA0NDRcdTA0NDVcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NERcdTA0NEVcdTAwQTRcIlxuICB9LFxuICBcIm1hY2dyZWVrXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwQzRcdTAwQjlcdTAwQjJcdTAwQzlcdTAwQjNcdTAwRDZcdTAwRENcdTAzODVcdTAwRTBcdTAwRTJcdTAwRTRcdTAzODRcdTAwQThcdTAwRTdcdTAwRTlcdTAwRThcdTAwRUFcdTAwRUJcdTAwQTNcdTIxMjJcdTAwRUVcdTAwRUZcdTIwMjJcdTAwQkRcdTIwMzBcdTAwRjRcdTAwRjZcdTAwQTZcdTAwQURcdTAwRjlcdTAwRkJcdTAwRkNcdTIwMjBcdTAzOTNcdTAzOTRcdTAzOThcdTAzOUJcdTAzOUVcdTAzQTBcdTAwREZcdTAwQUVcdTAwQTlcdTAzQTNcdTAzQUFcdTAwQTdcdTIyNjBcdTAwQjBcdTAzODdcdTAzOTFcdTAwQjFcdTIyNjRcdTIyNjVcdTAwQTVcdTAzOTJcdTAzOTVcdTAzOTZcdTAzOTdcdTAzOTlcdTAzOUFcdTAzOUNcdTAzQTZcdTAzQUJcdTAzQThcdTAzQTlcdTAzQUNcdTAzOURcdTAwQUNcdTAzOUZcdTAzQTFcdTIyNDhcdTAzQTRcdTAwQUJcdTAwQkJcdTIwMjZcdTAwQTBcdTAzQTVcdTAzQTdcdTAzODZcdTAzODhcdTAxNTNcdTIwMTNcdTIwMTVcdTIwMUNcdTIwMURcdTIwMThcdTIwMTlcdTAwRjdcdTAzODlcdTAzOEFcdTAzOENcdTAzOEVcdTAzQURcdTAzQUVcdTAzQUZcdTAzQ0NcdTAzOEZcdTAzQ0RcdTAzQjFcdTAzQjJcdTAzQzhcdTAzQjRcdTAzQjVcdTAzQzZcdTAzQjNcdTAzQjdcdTAzQjlcdTAzQkVcdTAzQkFcdTAzQkJcdTAzQkNcdTAzQkRcdTAzQkZcdTAzQzBcdTAzQ0VcdTAzQzFcdTAzQzNcdTAzQzRcdTAzQjhcdTAzQzlcdTAzQzJcdTAzQzdcdTAzQzVcdTAzQjZcdTAzQ0FcdTAzQ0JcdTAzOTBcdTAzQjBcdUZGRkRcIlxuICB9LFxuICBcIm1hY2ljZWxhbmRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDBDNFx1MDBDNVx1MDBDN1x1MDBDOVx1MDBEMVx1MDBENlx1MDBEQ1x1MDBFMVx1MDBFMFx1MDBFMlx1MDBFNFx1MDBFM1x1MDBFNVx1MDBFN1x1MDBFOVx1MDBFOFx1MDBFQVx1MDBFQlx1MDBFRFx1MDBFQ1x1MDBFRVx1MDBFRlx1MDBGMVx1MDBGM1x1MDBGMlx1MDBGNFx1MDBGNlx1MDBGNVx1MDBGQVx1MDBGOVx1MDBGQlx1MDBGQ1x1MDBERFx1MDBCMFx1MDBBMlx1MDBBM1x1MDBBN1x1MjAyMlx1MDBCNlx1MDBERlx1MDBBRVx1MDBBOVx1MjEyMlx1MDBCNFx1MDBBOFx1MjI2MFx1MDBDNlx1MDBEOFx1MjIxRVx1MDBCMVx1MjI2NFx1MjI2NVx1MDBBNVx1MDBCNVx1MjIwMlx1MjIxMVx1MjIwRlx1MDNDMFx1MjIyQlx1MDBBQVx1MDBCQVx1MjEyNlx1MDBFNlx1MDBGOFx1MDBCRlx1MDBBMVx1MDBBQ1x1MjIxQVx1MDE5Mlx1MjI0OFx1MjIwNlx1MDBBQlx1MDBCQlx1MjAyNlx1MDBBMFx1MDBDMFx1MDBDM1x1MDBENVx1MDE1Mlx1MDE1M1x1MjAxM1x1MjAxNFx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVx1MDBGN1x1MjVDQVx1MDBGRlx1MDE3OFx1MjA0NFx1MDBBNFx1MDBEMFx1MDBGMFx1MDBERVx1MDBGRVx1MDBGRFx1MDBCN1x1MjAxQVx1MjAxRVx1MjAzMFx1MDBDMlx1MDBDQVx1MDBDMVx1MDBDQlx1MDBDOFx1MDBDRFx1MDBDRVx1MDBDRlx1MDBDQ1x1MDBEM1x1MDBENFx1RkZGRFx1MDBEMlx1MDBEQVx1MDBEQlx1MDBEOVx1MDEzMVx1MDJDNlx1MDJEQ1x1MDBBRlx1MDJEOFx1MDJEOVx1MDJEQVx1MDBCOFx1MDJERFx1MDJEQlx1MDJDN1wiXG4gIH0sXG4gIFwibWFjcm9tYW5cIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDBDNFx1MDBDNVx1MDBDN1x1MDBDOVx1MDBEMVx1MDBENlx1MDBEQ1x1MDBFMVx1MDBFMFx1MDBFMlx1MDBFNFx1MDBFM1x1MDBFNVx1MDBFN1x1MDBFOVx1MDBFOFx1MDBFQVx1MDBFQlx1MDBFRFx1MDBFQ1x1MDBFRVx1MDBFRlx1MDBGMVx1MDBGM1x1MDBGMlx1MDBGNFx1MDBGNlx1MDBGNVx1MDBGQVx1MDBGOVx1MDBGQlx1MDBGQ1x1MjAyMFx1MDBCMFx1MDBBMlx1MDBBM1x1MDBBN1x1MjAyMlx1MDBCNlx1MDBERlx1MDBBRVx1MDBBOVx1MjEyMlx1MDBCNFx1MDBBOFx1MjI2MFx1MDBDNlx1MDBEOFx1MjIxRVx1MDBCMVx1MjI2NFx1MjI2NVx1MDBBNVx1MDBCNVx1MjIwMlx1MjIxMVx1MjIwRlx1MDNDMFx1MjIyQlx1MDBBQVx1MDBCQVx1MjEyNlx1MDBFNlx1MDBGOFx1MDBCRlx1MDBBMVx1MDBBQ1x1MjIxQVx1MDE5Mlx1MjI0OFx1MjIwNlx1MDBBQlx1MDBCQlx1MjAyNlx1MDBBMFx1MDBDMFx1MDBDM1x1MDBENVx1MDE1Mlx1MDE1M1x1MjAxM1x1MjAxNFx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVx1MDBGN1x1MjVDQVx1MDBGRlx1MDE3OFx1MjA0NFx1MDBBNFx1MjAzOVx1MjAzQVx1RkIwMVx1RkIwMlx1MjAyMVx1MDBCN1x1MjAxQVx1MjAxRVx1MjAzMFx1MDBDMlx1MDBDQVx1MDBDMVx1MDBDQlx1MDBDOFx1MDBDRFx1MDBDRVx1MDBDRlx1MDBDQ1x1MDBEM1x1MDBENFx1RkZGRFx1MDBEMlx1MDBEQVx1MDBEQlx1MDBEOVx1MDEzMVx1MDJDNlx1MDJEQ1x1MDBBRlx1MDJEOFx1MDJEOVx1MDJEQVx1MDBCOFx1MDJERFx1MDJEQlx1MDJDN1wiXG4gIH0sXG4gIFwibWFjcm9tYW5pYVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM0XHUwMEM1XHUwMEM3XHUwMEM5XHUwMEQxXHUwMEQ2XHUwMERDXHUwMEUxXHUwMEUwXHUwMEUyXHUwMEU0XHUwMEUzXHUwMEU1XHUwMEU3XHUwMEU5XHUwMEU4XHUwMEVBXHUwMEVCXHUwMEVEXHUwMEVDXHUwMEVFXHUwMEVGXHUwMEYxXHUwMEYzXHUwMEYyXHUwMEY0XHUwMEY2XHUwMEY1XHUwMEZBXHUwMEY5XHUwMEZCXHUwMEZDXHUyMDIwXHUwMEIwXHUwMEEyXHUwMEEzXHUwMEE3XHUyMDIyXHUwMEI2XHUwMERGXHUwMEFFXHUwMEE5XHUyMTIyXHUwMEI0XHUwMEE4XHUyMjYwXHUwMTAyXHUwMTVFXHUyMjFFXHUwMEIxXHUyMjY0XHUyMjY1XHUwMEE1XHUwMEI1XHUyMjAyXHUyMjExXHUyMjBGXHUwM0MwXHUyMjJCXHUwMEFBXHUwMEJBXHUyMTI2XHUwMTAzXHUwMTVGXHUwMEJGXHUwMEExXHUwMEFDXHUyMjFBXHUwMTkyXHUyMjQ4XHUyMjA2XHUwMEFCXHUwMEJCXHUyMDI2XHUwMEEwXHUwMEMwXHUwMEMzXHUwMEQ1XHUwMTUyXHUwMTUzXHUyMDEzXHUyMDE0XHUyMDFDXHUyMDFEXHUyMDE4XHUyMDE5XHUwMEY3XHUyNUNBXHUwMEZGXHUwMTc4XHUyMDQ0XHUwMEE0XHUyMDM5XHUyMDNBXHUwMTYyXHUwMTYzXHUyMDIxXHUwMEI3XHUyMDFBXHUyMDFFXHUyMDMwXHUwMEMyXHUwMENBXHUwMEMxXHUwMENCXHUwMEM4XHUwMENEXHUwMENFXHUwMENGXHUwMENDXHUwMEQzXHUwMEQ0XHVGRkZEXHUwMEQyXHUwMERBXHUwMERCXHUwMEQ5XHUwMTMxXHUwMkM2XHUwMkRDXHUwMEFGXHUwMkQ4XHUwMkQ5XHUwMkRBXHUwMEI4XHUwMkREXHUwMkRCXHUwMkM3XCJcbiAgfSxcbiAgXCJtYWN0aGFpXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwQUJcdTAwQkJcdTIwMjZcdUY4OENcdUY4OEZcdUY4OTJcdUY4OTVcdUY4OThcdUY4OEJcdUY4OEVcdUY4OTFcdUY4OTRcdUY4OTdcdTIwMUNcdTIwMURcdUY4OTlcdUZGRkRcdTIwMjJcdUY4ODRcdUY4ODlcdUY4ODVcdUY4ODZcdUY4ODdcdUY4ODhcdUY4OEFcdUY4OERcdUY4OTBcdUY4OTNcdUY4OTZcdTIwMThcdTIwMTlcdUZGRkRcdTAwQTBcdTBFMDFcdTBFMDJcdTBFMDNcdTBFMDRcdTBFMDVcdTBFMDZcdTBFMDdcdTBFMDhcdTBFMDlcdTBFMEFcdTBFMEJcdTBFMENcdTBFMERcdTBFMEVcdTBFMEZcdTBFMTBcdTBFMTFcdTBFMTJcdTBFMTNcdTBFMTRcdTBFMTVcdTBFMTZcdTBFMTdcdTBFMThcdTBFMTlcdTBFMUFcdTBFMUJcdTBFMUNcdTBFMURcdTBFMUVcdTBFMUZcdTBFMjBcdTBFMjFcdTBFMjJcdTBFMjNcdTBFMjRcdTBFMjVcdTBFMjZcdTBFMjdcdTBFMjhcdTBFMjlcdTBFMkFcdTBFMkJcdTBFMkNcdTBFMkRcdTBFMkVcdTBFMkZcdTBFMzBcdTBFMzFcdTBFMzJcdTBFMzNcdTBFMzRcdTBFMzVcdTBFMzZcdTBFMzdcdTBFMzhcdTBFMzlcdTBFM0FcdUZFRkZcdTIwMEJcdTIwMTNcdTIwMTRcdTBFM0ZcdTBFNDBcdTBFNDFcdTBFNDJcdTBFNDNcdTBFNDRcdTBFNDVcdTBFNDZcdTBFNDdcdTBFNDhcdTBFNDlcdTBFNEFcdTBFNEJcdTBFNENcdTBFNERcdTIxMjJcdTBFNEZcdTBFNTBcdTBFNTFcdTBFNTJcdTBFNTNcdTBFNTRcdTBFNTVcdTBFNTZcdTBFNTdcdTBFNThcdTBFNTlcdTAwQUVcdTAwQTlcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcIlxuICB9LFxuICBcIm1hY3R1cmtpc2hcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDBDNFx1MDBDNVx1MDBDN1x1MDBDOVx1MDBEMVx1MDBENlx1MDBEQ1x1MDBFMVx1MDBFMFx1MDBFMlx1MDBFNFx1MDBFM1x1MDBFNVx1MDBFN1x1MDBFOVx1MDBFOFx1MDBFQVx1MDBFQlx1MDBFRFx1MDBFQ1x1MDBFRVx1MDBFRlx1MDBGMVx1MDBGM1x1MDBGMlx1MDBGNFx1MDBGNlx1MDBGNVx1MDBGQVx1MDBGOVx1MDBGQlx1MDBGQ1x1MjAyMFx1MDBCMFx1MDBBMlx1MDBBM1x1MDBBN1x1MjAyMlx1MDBCNlx1MDBERlx1MDBBRVx1MDBBOVx1MjEyMlx1MDBCNFx1MDBBOFx1MjI2MFx1MDBDNlx1MDBEOFx1MjIxRVx1MDBCMVx1MjI2NFx1MjI2NVx1MDBBNVx1MDBCNVx1MjIwMlx1MjIxMVx1MjIwRlx1MDNDMFx1MjIyQlx1MDBBQVx1MDBCQVx1MjEyNlx1MDBFNlx1MDBGOFx1MDBCRlx1MDBBMVx1MDBBQ1x1MjIxQVx1MDE5Mlx1MjI0OFx1MjIwNlx1MDBBQlx1MDBCQlx1MjAyNlx1MDBBMFx1MDBDMFx1MDBDM1x1MDBENVx1MDE1Mlx1MDE1M1x1MjAxM1x1MjAxNFx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVx1MDBGN1x1MjVDQVx1MDBGRlx1MDE3OFx1MDExRVx1MDExRlx1MDEzMFx1MDEzMVx1MDE1RVx1MDE1Rlx1MjAyMVx1MDBCN1x1MjAxQVx1MjAxRVx1MjAzMFx1MDBDMlx1MDBDQVx1MDBDMVx1MDBDQlx1MDBDOFx1MDBDRFx1MDBDRVx1MDBDRlx1MDBDQ1x1MDBEM1x1MDBENFx1RkZGRFx1MDBEMlx1MDBEQVx1MDBEQlx1MDBEOVx1RkZGRFx1MDJDNlx1MDJEQ1x1MDBBRlx1MDJEOFx1MDJEOVx1MDJEQVx1MDBCOFx1MDJERFx1MDJEQlx1MDJDN1wiXG4gIH0sXG4gIFwibWFjdWtyYWluZVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwNDEwXHUwNDExXHUwNDEyXHUwNDEzXHUwNDE0XHUwNDE1XHUwNDE2XHUwNDE3XHUwNDE4XHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDFEXHUwNDFFXHUwNDFGXHUwNDIwXHUwNDIxXHUwNDIyXHUwNDIzXHUwNDI0XHUwNDI1XHUwNDI2XHUwNDI3XHUwNDI4XHUwNDI5XHUwNDJBXHUwNDJCXHUwNDJDXHUwNDJEXHUwNDJFXHUwNDJGXHUyMDIwXHUwMEIwXHUwNDkwXHUwMEEzXHUwMEE3XHUyMDIyXHUwMEI2XHUwNDA2XHUwMEFFXHUwMEE5XHUyMTIyXHUwNDAyXHUwNDUyXHUyMjYwXHUwNDAzXHUwNDUzXHUyMjFFXHUwMEIxXHUyMjY0XHUyMjY1XHUwNDU2XHUwMEI1XHUwNDkxXHUwNDA4XHUwNDA0XHUwNDU0XHUwNDA3XHUwNDU3XHUwNDA5XHUwNDU5XHUwNDBBXHUwNDVBXHUwNDU4XHUwNDA1XHUwMEFDXHUyMjFBXHUwMTkyXHUyMjQ4XHUyMjA2XHUwMEFCXHUwMEJCXHUyMDI2XHUwMEEwXHUwNDBCXHUwNDVCXHUwNDBDXHUwNDVDXHUwNDU1XHUyMDEzXHUyMDE0XHUyMDFDXHUyMDFEXHUyMDE4XHUyMDE5XHUwMEY3XHUyMDFFXHUwNDBFXHUwNDVFXHUwNDBGXHUwNDVGXHUyMTE2XHUwNDAxXHUwNDUxXHUwNDRGXHUwNDMwXHUwNDMxXHUwNDMyXHUwNDMzXHUwNDM0XHUwNDM1XHUwNDM2XHUwNDM3XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDQwXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDQ0XHUwNDQ1XHUwNDQ2XHUwNDQ3XHUwNDQ4XHUwNDQ5XHUwNDRBXHUwNDRCXHUwNDRDXHUwNDREXHUwNDRFXHUwMEE0XCJcbiAgfSxcbiAgXCJrb2k4clwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUyNTAwXHUyNTAyXHUyNTBDXHUyNTEwXHUyNTE0XHUyNTE4XHUyNTFDXHUyNTI0XHUyNTJDXHUyNTM0XHUyNTNDXHUyNTgwXHUyNTg0XHUyNTg4XHUyNThDXHUyNTkwXHUyNTkxXHUyNTkyXHUyNTkzXHUyMzIwXHUyNUEwXHUyMjE5XHUyMjFBXHUyMjQ4XHUyMjY0XHUyMjY1XHUwMEEwXHUyMzIxXHUwMEIwXHUwMEIyXHUwMEI3XHUwMEY3XHUyNTUwXHUyNTUxXHUyNTUyXHUwNDUxXHUyNTUzXHUyNTU0XHUyNTU1XHUyNTU2XHUyNTU3XHUyNTU4XHUyNTU5XHUyNTVBXHUyNTVCXHUyNTVDXHUyNTVEXHUyNTVFXHUyNTVGXHUyNTYwXHUyNTYxXHUwNDAxXHUyNTYyXHUyNTYzXHUyNTY0XHUyNTY1XHUyNTY2XHUyNTY3XHUyNTY4XHUyNTY5XHUyNTZBXHUyNTZCXHUyNTZDXHUwMEE5XHUwNDRFXHUwNDMwXHUwNDMxXHUwNDQ2XHUwNDM0XHUwNDM1XHUwNDQ0XHUwNDMzXHUwNDQ1XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDRGXHUwNDQwXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDM2XHUwNDMyXHUwNDRDXHUwNDRCXHUwNDM3XHUwNDQ4XHUwNDREXHUwNDQ5XHUwNDQ3XHUwNDRBXHUwNDJFXHUwNDEwXHUwNDExXHUwNDI2XHUwNDE0XHUwNDE1XHUwNDI0XHUwNDEzXHUwNDI1XHUwNDE4XHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDFEXHUwNDFFXHUwNDFGXHUwNDJGXHUwNDIwXHUwNDIxXHUwNDIyXHUwNDIzXHUwNDE2XHUwNDEyXHUwNDJDXHUwNDJCXHUwNDE3XHUwNDI4XHUwNDJEXHUwNDI5XHUwNDI3XHUwNDJBXCJcbiAgfSxcbiAgXCJrb2k4dVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUyNTAwXHUyNTAyXHUyNTBDXHUyNTEwXHUyNTE0XHUyNTE4XHUyNTFDXHUyNTI0XHUyNTJDXHUyNTM0XHUyNTNDXHUyNTgwXHUyNTg0XHUyNTg4XHUyNThDXHUyNTkwXHUyNTkxXHUyNTkyXHUyNTkzXHUyMzIwXHUyNUEwXHUyMjE5XHUyMjFBXHUyMjQ4XHUyMjY0XHUyMjY1XHUwMEEwXHUyMzIxXHUwMEIwXHUwMEIyXHUwMEI3XHUwMEY3XHUyNTUwXHUyNTUxXHUyNTUyXHUwNDUxXHUwNDU0XHUyNTU0XHUwNDU2XHUwNDU3XHUyNTU3XHUyNTU4XHUyNTU5XHUyNTVBXHUyNTVCXHUwNDkxXHUyNTVEXHUyNTVFXHUyNTVGXHUyNTYwXHUyNTYxXHUwNDAxXHUwNDA0XHUyNTYzXHUwNDA2XHUwNDA3XHUyNTY2XHUyNTY3XHUyNTY4XHUyNTY5XHUyNTZBXHUwNDkwXHUyNTZDXHUwMEE5XHUwNDRFXHUwNDMwXHUwNDMxXHUwNDQ2XHUwNDM0XHUwNDM1XHUwNDQ0XHUwNDMzXHUwNDQ1XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDRGXHUwNDQwXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDM2XHUwNDMyXHUwNDRDXHUwNDRCXHUwNDM3XHUwNDQ4XHUwNDREXHUwNDQ5XHUwNDQ3XHUwNDRBXHUwNDJFXHUwNDEwXHUwNDExXHUwNDI2XHUwNDE0XHUwNDE1XHUwNDI0XHUwNDEzXHUwNDI1XHUwNDE4XHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDFEXHUwNDFFXHUwNDFGXHUwNDJGXHUwNDIwXHUwNDIxXHUwNDIyXHUwNDIzXHUwNDE2XHUwNDEyXHUwNDJDXHUwNDJCXHUwNDE3XHUwNDI4XHUwNDJEXHUwNDI5XHUwNDI3XHUwNDJBXCJcbiAgfSxcbiAgXCJrb2k4cnVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MjUwMFx1MjUwMlx1MjUwQ1x1MjUxMFx1MjUxNFx1MjUxOFx1MjUxQ1x1MjUyNFx1MjUyQ1x1MjUzNFx1MjUzQ1x1MjU4MFx1MjU4NFx1MjU4OFx1MjU4Q1x1MjU5MFx1MjU5MVx1MjU5Mlx1MjU5M1x1MjMyMFx1MjVBMFx1MjIxOVx1MjIxQVx1MjI0OFx1MjI2NFx1MjI2NVx1MDBBMFx1MjMyMVx1MDBCMFx1MDBCMlx1MDBCN1x1MDBGN1x1MjU1MFx1MjU1MVx1MjU1Mlx1MDQ1MVx1MDQ1NFx1MjU1NFx1MDQ1Nlx1MDQ1N1x1MjU1N1x1MjU1OFx1MjU1OVx1MjU1QVx1MjU1Qlx1MDQ5MVx1MDQ1RVx1MjU1RVx1MjU1Rlx1MjU2MFx1MjU2MVx1MDQwMVx1MDQwNFx1MjU2M1x1MDQwNlx1MDQwN1x1MjU2Nlx1MjU2N1x1MjU2OFx1MjU2OVx1MjU2QVx1MDQ5MFx1MDQwRVx1MDBBOVx1MDQ0RVx1MDQzMFx1MDQzMVx1MDQ0Nlx1MDQzNFx1MDQzNVx1MDQ0NFx1MDQzM1x1MDQ0NVx1MDQzOFx1MDQzOVx1MDQzQVx1MDQzQlx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzRlx1MDQ0Rlx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzNlx1MDQzMlx1MDQ0Q1x1MDQ0Qlx1MDQzN1x1MDQ0OFx1MDQ0RFx1MDQ0OVx1MDQ0N1x1MDQ0QVx1MDQyRVx1MDQxMFx1MDQxMVx1MDQyNlx1MDQxNFx1MDQxNVx1MDQyNFx1MDQxM1x1MDQyNVx1MDQxOFx1MDQxOVx1MDQxQVx1MDQxQlx1MDQxQ1x1MDQxRFx1MDQxRVx1MDQxRlx1MDQyRlx1MDQyMFx1MDQyMVx1MDQyMlx1MDQyM1x1MDQxNlx1MDQxMlx1MDQyQ1x1MDQyQlx1MDQxN1x1MDQyOFx1MDQyRFx1MDQyOVx1MDQyN1x1MDQyQVwiXG4gIH0sXG4gIFwia29pOHRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDQ5Qlx1MDQ5M1x1MjAxQVx1MDQ5Mlx1MjAxRVx1MjAyNlx1MjAyMFx1MjAyMVx1RkZGRFx1MjAzMFx1MDRCM1x1MjAzOVx1MDRCMlx1MDRCN1x1MDRCNlx1RkZGRFx1MDQ5QVx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyMlx1MjAxM1x1MjAxNFx1RkZGRFx1MjEyMlx1RkZGRFx1MjAzQVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MDRFRlx1MDRFRVx1MDQ1MVx1MDBBNFx1MDRFM1x1MDBBNlx1MDBBN1x1RkZGRFx1RkZGRFx1RkZGRFx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1RkZGRFx1MDBCMFx1MDBCMVx1MDBCMlx1MDQwMVx1RkZGRFx1MDRFMlx1MDBCNlx1MDBCN1x1RkZGRFx1MjExNlx1RkZGRFx1MDBCQlx1RkZGRFx1RkZGRFx1RkZGRFx1MDBBOVx1MDQ0RVx1MDQzMFx1MDQzMVx1MDQ0Nlx1MDQzNFx1MDQzNVx1MDQ0NFx1MDQzM1x1MDQ0NVx1MDQzOFx1MDQzOVx1MDQzQVx1MDQzQlx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzRlx1MDQ0Rlx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzNlx1MDQzMlx1MDQ0Q1x1MDQ0Qlx1MDQzN1x1MDQ0OFx1MDQ0RFx1MDQ0OVx1MDQ0N1x1MDQ0QVx1MDQyRVx1MDQxMFx1MDQxMVx1MDQyNlx1MDQxNFx1MDQxNVx1MDQyNFx1MDQxM1x1MDQyNVx1MDQxOFx1MDQxOVx1MDQxQVx1MDQxQlx1MDQxQ1x1MDQxRFx1MDQxRVx1MDQxRlx1MDQyRlx1MDQyMFx1MDQyMVx1MDQyMlx1MDQyM1x1MDQxNlx1MDQxMlx1MDQyQ1x1MDQyQlx1MDQxN1x1MDQyOFx1MDQyRFx1MDQyOVx1MDQyN1x1MDQyQVwiXG4gIH0sXG4gIFwiYXJtc2NpaThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1RkZGRFx1MDU4N1x1MDU4OSkoXHUwMEJCXHUwMEFCXHUyMDE0Llx1MDU1RCwtXHUwNThBXHUyMDI2XHUwNTVDXHUwNTVCXHUwNTVFXHUwNTMxXHUwNTYxXHUwNTMyXHUwNTYyXHUwNTMzXHUwNTYzXHUwNTM0XHUwNTY0XHUwNTM1XHUwNTY1XHUwNTM2XHUwNTY2XHUwNTM3XHUwNTY3XHUwNTM4XHUwNTY4XHUwNTM5XHUwNTY5XHUwNTNBXHUwNTZBXHUwNTNCXHUwNTZCXHUwNTNDXHUwNTZDXHUwNTNEXHUwNTZEXHUwNTNFXHUwNTZFXHUwNTNGXHUwNTZGXHUwNTQwXHUwNTcwXHUwNTQxXHUwNTcxXHUwNTQyXHUwNTcyXHUwNTQzXHUwNTczXHUwNTQ0XHUwNTc0XHUwNTQ1XHUwNTc1XHUwNTQ2XHUwNTc2XHUwNTQ3XHUwNTc3XHUwNTQ4XHUwNTc4XHUwNTQ5XHUwNTc5XHUwNTRBXHUwNTdBXHUwNTRCXHUwNTdCXHUwNTRDXHUwNTdDXHUwNTREXHUwNTdEXHUwNTRFXHUwNTdFXHUwNTRGXHUwNTdGXHUwNTUwXHUwNTgwXHUwNTUxXHUwNTgxXHUwNTUyXHUwNTgyXHUwNTUzXHUwNTgzXHUwNTU0XHUwNTg0XHUwNTU1XHUwNTg1XHUwNTU2XHUwNTg2XHUwNTVBXHVGRkZEXCJcbiAgfSxcbiAgXCJyazEwNDhcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDQwMlx1MDQwM1x1MjAxQVx1MDQ1M1x1MjAxRVx1MjAyNlx1MjAyMFx1MjAyMVx1MjBBQ1x1MjAzMFx1MDQwOVx1MjAzOVx1MDQwQVx1MDQ5QVx1MDRCQVx1MDQwRlx1MDQ1Mlx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyMlx1MjAxM1x1MjAxNFx1RkZGRFx1MjEyMlx1MDQ1OVx1MjAzQVx1MDQ1QVx1MDQ5Qlx1MDRCQlx1MDQ1Rlx1MDBBMFx1MDRCMFx1MDRCMVx1MDREOFx1MDBBNFx1MDRFOFx1MDBBNlx1MDBBN1x1MDQwMVx1MDBBOVx1MDQ5Mlx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MDRBRVx1MDBCMFx1MDBCMVx1MDQwNlx1MDQ1Nlx1MDRFOVx1MDBCNVx1MDBCNlx1MDBCN1x1MDQ1MVx1MjExNlx1MDQ5M1x1MDBCQlx1MDREOVx1MDRBMlx1MDRBM1x1MDRBRlx1MDQxMFx1MDQxMVx1MDQxMlx1MDQxM1x1MDQxNFx1MDQxNVx1MDQxNlx1MDQxN1x1MDQxOFx1MDQxOVx1MDQxQVx1MDQxQlx1MDQxQ1x1MDQxRFx1MDQxRVx1MDQxRlx1MDQyMFx1MDQyMVx1MDQyMlx1MDQyM1x1MDQyNFx1MDQyNVx1MDQyNlx1MDQyN1x1MDQyOFx1MDQyOVx1MDQyQVx1MDQyQlx1MDQyQ1x1MDQyRFx1MDQyRVx1MDQyRlx1MDQzMFx1MDQzMVx1MDQzMlx1MDQzM1x1MDQzNFx1MDQzNVx1MDQzNlx1MDQzN1x1MDQzOFx1MDQzOVx1MDQzQVx1MDQzQlx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQ0NFx1MDQ0NVx1MDQ0Nlx1MDQ0N1x1MDQ0OFx1MDQ0OVx1MDQ0QVx1MDQ0Qlx1MDQ0Q1x1MDQ0RFx1MDQ0RVx1MDQ0RlwiXG4gIH0sXG4gIFwidGN2blwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFx1MDAwMFx1MDBEQVx1MUVFNFxcdTAwMDNcdTFFRUFcdTFFRUNcdTFFRUVcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFx1MUVFOFx1MUVGMFx1MUVGMlx1MUVGNlx1MUVGOFx1MDBERFx1MUVGNFxcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cdTAwN0ZcdTAwQzBcdTFFQTJcdTAwQzNcdTAwQzFcdTFFQTBcdTFFQjZcdTFFQUNcdTAwQzhcdTFFQkFcdTFFQkNcdTAwQzlcdTFFQjhcdTFFQzZcdTAwQ0NcdTFFQzhcdTAxMjhcdTAwQ0RcdTFFQ0FcdTAwRDJcdTFFQ0VcdTAwRDVcdTAwRDNcdTFFQ0NcdTFFRDhcdTFFRENcdTFFREVcdTFFRTBcdTFFREFcdTFFRTJcdTAwRDlcdTFFRTZcdTAxNjhcdTAwQTBcdTAxMDJcdTAwQzJcdTAwQ0FcdTAwRDRcdTAxQTBcdTAxQUZcdTAxMTBcdTAxMDNcdTAwRTJcdTAwRUFcdTAwRjRcdTAxQTFcdTAxQjBcdTAxMTFcdTFFQjBcdTAzMDBcdTAzMDlcdTAzMDNcdTAzMDFcdTAzMjNcdTAwRTBcdTFFQTNcdTAwRTNcdTAwRTFcdTFFQTFcdTFFQjJcdTFFQjFcdTFFQjNcdTFFQjVcdTFFQUZcdTFFQjRcdTFFQUVcdTFFQTZcdTFFQThcdTFFQUFcdTFFQTRcdTFFQzBcdTFFQjdcdTFFQTdcdTFFQTlcdTFFQUJcdTFFQTVcdTFFQURcdTAwRThcdTFFQzJcdTFFQkJcdTFFQkRcdTAwRTlcdTFFQjlcdTFFQzFcdTFFQzNcdTFFQzVcdTFFQkZcdTFFQzdcdTAwRUNcdTFFQzlcdTFFQzRcdTFFQkVcdTFFRDJcdTAxMjlcdTAwRURcdTFFQ0JcdTAwRjJcdTFFRDRcdTFFQ0ZcdTAwRjVcdTAwRjNcdTFFQ0RcdTFFRDNcdTFFRDVcdTFFRDdcdTFFRDFcdTFFRDlcdTFFRERcdTFFREZcdTFFRTFcdTFFREJcdTFFRTNcdTAwRjlcdTFFRDZcdTFFRTdcdTAxNjlcdTAwRkFcdTFFRTVcdTFFRUJcdTFFRURcdTFFRUZcdTFFRTlcdTFFRjFcdTFFRjNcdTFFRjdcdTFFRjlcdTAwRkRcdTFFRjVcdTFFRDBcIlxuICB9LFxuICBcImdlb3JnaWFuYWNhZGVteVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUyMDFBXHUwMTkyXHUyMDFFXHUyMDI2XHUyMDIwXHUyMDIxXHUwMkM2XHUyMDMwXHUwMTYwXHUyMDM5XHUwMTUyXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUyMDE4XHUyMDE5XHUyMDFDXHUyMDFEXHUyMDIyXHUyMDEzXHUyMDE0XHUwMkRDXHUyMTIyXHUwMTYxXHUyMDNBXHUwMTUzXHUwMDlEXHUwMDlFXHUwMTc4XHUwMEEwXHUwMEExXHUwMEEyXHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMEFBXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMEI5XHUwMEJBXHUwMEJCXHUwMEJDXHUwMEJEXHUwMEJFXHUwMEJGXHUxMEQwXHUxMEQxXHUxMEQyXHUxMEQzXHUxMEQ0XHUxMEQ1XHUxMEQ2XHUxMEQ3XHUxMEQ4XHUxMEQ5XHUxMERBXHUxMERCXHUxMERDXHUxMEREXHUxMERFXHUxMERGXHUxMEUwXHUxMEUxXHUxMEUyXHUxMEUzXHUxMEU0XHUxMEU1XHUxMEU2XHUxMEU3XHUxMEU4XHUxMEU5XHUxMEVBXHUxMEVCXHUxMEVDXHUxMEVEXHUxMEVFXHUxMEVGXHUxMEYwXHUxMEYxXHUxMEYyXHUxMEYzXHUxMEY0XHUxMEY1XHUxMEY2XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwMEVDXHUwMEVEXHUwMEVFXHUwMEVGXHUwMEYwXHUwMEYxXHUwMEYyXHUwMEYzXHUwMEY0XHUwMEY1XHUwMEY2XHUwMEY3XHUwMEY4XHUwMEY5XHUwMEZBXHUwMEZCXHUwMEZDXHUwMEZEXHUwMEZFXHUwMEZGXCJcbiAgfSxcbiAgXCJnZW9yZ2lhbnBzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwODBcdTAwODFcdTIwMUFcdTAxOTJcdTIwMUVcdTIwMjZcdTIwMjBcdTIwMjFcdTAyQzZcdTIwMzBcdTAxNjBcdTIwMzlcdTAxNTJcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdTAyRENcdTIxMjJcdTAxNjFcdTIwM0FcdTAxNTNcdTAwOURcdTAwOUVcdTAxNzhcdTAwQTBcdTAwQTFcdTAwQTJcdTAwQTNcdTAwQTRcdTAwQTVcdTAwQTZcdTAwQTdcdTAwQThcdTAwQTlcdTAwQUFcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTAwQUZcdTAwQjBcdTAwQjFcdTAwQjJcdTAwQjNcdTAwQjRcdTAwQjVcdTAwQjZcdTAwQjdcdTAwQjhcdTAwQjlcdTAwQkFcdTAwQkJcdTAwQkNcdTAwQkRcdTAwQkVcdTAwQkZcdTEwRDBcdTEwRDFcdTEwRDJcdTEwRDNcdTEwRDRcdTEwRDVcdTEwRDZcdTEwRjFcdTEwRDdcdTEwRDhcdTEwRDlcdTEwREFcdTEwREJcdTEwRENcdTEwRjJcdTEwRERcdTEwREVcdTEwREZcdTEwRTBcdTEwRTFcdTEwRTJcdTEwRjNcdTEwRTNcdTEwRTRcdTEwRTVcdTEwRTZcdTEwRTdcdTEwRThcdTEwRTlcdTEwRUFcdTEwRUJcdTEwRUNcdTEwRURcdTEwRUVcdTEwRjRcdTEwRUZcdTEwRjBcdTEwRjVcdTAwRTZcdTAwRTdcdTAwRThcdTAwRTlcdTAwRUFcdTAwRUJcdTAwRUNcdTAwRURcdTAwRUVcdTAwRUZcdTAwRjBcdTAwRjFcdTAwRjJcdTAwRjNcdTAwRjRcdTAwRjVcdTAwRjZcdTAwRjdcdTAwRjhcdTAwRjlcdTAwRkFcdTAwRkJcdTAwRkNcdTAwRkRcdTAwRkVcdTAwRkZcIlxuICB9LFxuICBcInB0MTU0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTA0OTZcdTA0OTJcdTA0RUVcdTA0OTNcdTIwMUVcdTIwMjZcdTA0QjZcdTA0QUVcdTA0QjJcdTA0QUZcdTA0QTBcdTA0RTJcdTA0QTJcdTA0OUFcdTA0QkFcdTA0QjhcdTA0OTdcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdTA0QjNcdTA0QjdcdTA0QTFcdTA0RTNcdTA0QTNcdTA0OUJcdTA0QkJcdTA0QjlcdTAwQTBcdTA0MEVcdTA0NUVcdTA0MDhcdTA0RThcdTA0OThcdTA0QjBcdTAwQTdcdTA0MDFcdTAwQTlcdTA0RDhcdTAwQUJcdTAwQUNcdTA0RUZcdTAwQUVcdTA0OUNcdTAwQjBcdTA0QjFcdTA0MDZcdTA0NTZcdTA0OTlcdTA0RTlcdTAwQjZcdTAwQjdcdTA0NTFcdTIxMTZcdTA0RDlcdTAwQkJcdTA0NThcdTA0QUFcdTA0QUJcdTA0OURcdTA0MTBcdTA0MTFcdTA0MTJcdTA0MTNcdTA0MTRcdTA0MTVcdTA0MTZcdTA0MTdcdTA0MThcdTA0MTlcdTA0MUFcdTA0MUJcdTA0MUNcdTA0MURcdTA0MUVcdTA0MUZcdTA0MjBcdTA0MjFcdTA0MjJcdTA0MjNcdTA0MjRcdTA0MjVcdTA0MjZcdTA0MjdcdTA0MjhcdTA0MjlcdTA0MkFcdTA0MkJcdTA0MkNcdTA0MkRcdTA0MkVcdTA0MkZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0MzZcdTA0MzdcdTA0MzhcdTA0MzlcdTA0M0FcdTA0M0JcdTA0M0NcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0NDFcdTA0NDJcdTA0NDNcdTA0NDRcdTA0NDVcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NERcdTA0NEVcdTA0NEZcIlxuICB9LFxuICBcInZpc2NpaVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFx1MDAwMFxcdTAwMDFcdTFFQjJcXHUwMDAzXFx1MDAwNFx1MUVCNFx1MUVBQVxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXHUxRUY2XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFx1MUVGOFxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcdTFFRjRcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cdTAwN0ZcdTFFQTBcdTFFQUVcdTFFQjBcdTFFQjZcdTFFQTRcdTFFQTZcdTFFQThcdTFFQUNcdTFFQkNcdTFFQjhcdTFFQkVcdTFFQzBcdTFFQzJcdTFFQzRcdTFFQzZcdTFFRDBcdTFFRDJcdTFFRDRcdTFFRDZcdTFFRDhcdTFFRTJcdTFFREFcdTFFRENcdTFFREVcdTFFQ0FcdTFFQ0VcdTFFQ0NcdTFFQzhcdTFFRTZcdTAxNjhcdTFFRTRcdTFFRjJcdTAwRDVcdTFFQUZcdTFFQjFcdTFFQjdcdTFFQTVcdTFFQTdcdTFFQTlcdTFFQURcdTFFQkRcdTFFQjlcdTFFQkZcdTFFQzFcdTFFQzNcdTFFQzVcdTFFQzdcdTFFRDFcdTFFRDNcdTFFRDVcdTFFRDdcdTFFRTBcdTAxQTBcdTFFRDlcdTFFRERcdTFFREZcdTFFQ0JcdTFFRjBcdTFFRThcdTFFRUFcdTFFRUNcdTAxQTFcdTFFREJcdTAxQUZcdTAwQzBcdTAwQzFcdTAwQzJcdTAwQzNcdTFFQTJcdTAxMDJcdTFFQjNcdTFFQjVcdTAwQzhcdTAwQzlcdTAwQ0FcdTFFQkFcdTAwQ0NcdTAwQ0RcdTAxMjhcdTFFRjNcdTAxMTBcdTFFRTlcdTAwRDJcdTAwRDNcdTAwRDRcdTFFQTFcdTFFRjdcdTFFRUJcdTFFRURcdTAwRDlcdTAwREFcdTFFRjlcdTFFRjVcdTAwRERcdTFFRTFcdTAxQjBcdTAwRTBcdTAwRTFcdTAwRTJcdTAwRTNcdTFFQTNcdTAxMDNcdTFFRUZcdTFFQUJcdTAwRThcdTAwRTlcdTAwRUFcdTFFQkJcdTAwRUNcdTAwRURcdTAxMjlcdTFFQzlcdTAxMTFcdTFFRjFcdTAwRjJcdTAwRjNcdTAwRjRcdTAwRjVcdTFFQ0ZcdTFFQ0RcdTFFRTVcdTAwRjlcdTAwRkFcdTAxNjlcdTFFRTdcdTAwRkRcdTFFRTNcdTFFRUVcIlxuICB9LFxuICBcImlzbzY0NmNuXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjXHUwMEE1JSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1cdTIwM0VcdTAwN0ZcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcIlxuICB9LFxuICBcImlzbzY0NmpwXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcdTAwQTVdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1cdTIwM0VcdTAwN0ZcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcIlxuICB9LFxuICBcImhwcm9tYW44XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwODBcdTAwODFcdTAwODJcdTAwODNcdTAwODRcdTAwODVcdTAwODZcdTAwODdcdTAwODhcdTAwODlcdTAwOEFcdTAwOEJcdTAwOENcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTAwOTFcdTAwOTJcdTAwOTNcdTAwOTRcdTAwOTVcdTAwOTZcdTAwOTdcdTAwOThcdTAwOTlcdTAwOUFcdTAwOUJcdTAwOUNcdTAwOURcdTAwOUVcdTAwOUZcdTAwQTBcdTAwQzBcdTAwQzJcdTAwQzhcdTAwQ0FcdTAwQ0JcdTAwQ0VcdTAwQ0ZcdTAwQjRcdTAyQ0JcdTAyQzZcdTAwQThcdTAyRENcdTAwRDlcdTAwREJcdTIwQTRcdTAwQUZcdTAwRERcdTAwRkRcdTAwQjBcdTAwQzdcdTAwRTdcdTAwRDFcdTAwRjFcdTAwQTFcdTAwQkZcdTAwQTRcdTAwQTNcdTAwQTVcdTAwQTdcdTAxOTJcdTAwQTJcdTAwRTJcdTAwRUFcdTAwRjRcdTAwRkJcdTAwRTFcdTAwRTlcdTAwRjNcdTAwRkFcdTAwRTBcdTAwRThcdTAwRjJcdTAwRjlcdTAwRTRcdTAwRUJcdTAwRjZcdTAwRkNcdTAwQzVcdTAwRUVcdTAwRDhcdTAwQzZcdTAwRTVcdTAwRURcdTAwRjhcdTAwRTZcdTAwQzRcdTAwRUNcdTAwRDZcdTAwRENcdTAwQzlcdTAwRUZcdTAwREZcdTAwRDRcdTAwQzFcdTAwQzNcdTAwRTNcdTAwRDBcdTAwRjBcdTAwQ0RcdTAwQ0NcdTAwRDNcdTAwRDJcdTAwRDVcdTAwRjVcdTAxNjBcdTAxNjFcdTAwREFcdTAxNzhcdTAwRkZcdTAwREVcdTAwRkVcdTAwQjdcdTAwQjVcdTAwQjZcdTAwQkVcdTIwMTRcdTAwQkNcdTAwQkRcdTAwQUFcdTAwQkFcdTAwQUJcdTI1QTBcdTAwQkJcdTAwQjFcdUZGRkRcIlxuICB9LFxuICBcIm1hY2ludG9zaFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM0XHUwMEM1XHUwMEM3XHUwMEM5XHUwMEQxXHUwMEQ2XHUwMERDXHUwMEUxXHUwMEUwXHUwMEUyXHUwMEU0XHUwMEUzXHUwMEU1XHUwMEU3XHUwMEU5XHUwMEU4XHUwMEVBXHUwMEVCXHUwMEVEXHUwMEVDXHUwMEVFXHUwMEVGXHUwMEYxXHUwMEYzXHUwMEYyXHUwMEY0XHUwMEY2XHUwMEY1XHUwMEZBXHUwMEY5XHUwMEZCXHUwMEZDXHUyMDIwXHUwMEIwXHUwMEEyXHUwMEEzXHUwMEE3XHUyMDIyXHUwMEI2XHUwMERGXHUwMEFFXHUwMEE5XHUyMTIyXHUwMEI0XHUwMEE4XHUyMjYwXHUwMEM2XHUwMEQ4XHUyMjFFXHUwMEIxXHUyMjY0XHUyMjY1XHUwMEE1XHUwMEI1XHUyMjAyXHUyMjExXHUyMjBGXHUwM0MwXHUyMjJCXHUwMEFBXHUwMEJBXHUyMTI2XHUwMEU2XHUwMEY4XHUwMEJGXHUwMEExXHUwMEFDXHUyMjFBXHUwMTkyXHUyMjQ4XHUyMjA2XHUwMEFCXHUwMEJCXHUyMDI2XHUwMEEwXHUwMEMwXHUwMEMzXHUwMEQ1XHUwMTUyXHUwMTUzXHUyMDEzXHUyMDE0XHUyMDFDXHUyMDFEXHUyMDE4XHUyMDE5XHUwMEY3XHUyNUNBXHUwMEZGXHUwMTc4XHUyMDQ0XHUwMEE0XHUyMDM5XHUyMDNBXHVGQjAxXHVGQjAyXHUyMDIxXHUwMEI3XHUyMDFBXHUyMDFFXHUyMDMwXHUwMEMyXHUwMENBXHUwMEMxXHUwMENCXHUwMEM4XHUwMENEXHUwMENFXHUwMENGXHUwMENDXHUwMEQzXHUwMEQ0XHVGRkZEXHUwMEQyXHUwMERBXHUwMERCXHUwMEQ5XHUwMTMxXHUwMkM2XHUwMkRDXHUwMEFGXHUwMkQ4XHUwMkQ5XHUwMkRBXHUwMEI4XHUwMkREXHUwMkRCXHUwMkM3XCJcbiAgfSxcbiAgXCJhc2NpaVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXCJcbiAgfSxcbiAgXCJ0aXM2MjBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MEUwMVx1MEUwMlx1MEUwM1x1MEUwNFx1MEUwNVx1MEUwNlx1MEUwN1x1MEUwOFx1MEUwOVx1MEUwQVx1MEUwQlx1MEUwQ1x1MEUwRFx1MEUwRVx1MEUwRlx1MEUxMFx1MEUxMVx1MEUxMlx1MEUxM1x1MEUxNFx1MEUxNVx1MEUxNlx1MEUxN1x1MEUxOFx1MEUxOVx1MEUxQVx1MEUxQlx1MEUxQ1x1MEUxRFx1MEUxRVx1MEUxRlx1MEUyMFx1MEUyMVx1MEUyMlx1MEUyM1x1MEUyNFx1MEUyNVx1MEUyNlx1MEUyN1x1MEUyOFx1MEUyOVx1MEUyQVx1MEUyQlx1MEUyQ1x1MEUyRFx1MEUyRVx1MEUyRlx1MEUzMFx1MEUzMVx1MEUzMlx1MEUzM1x1MEUzNFx1MEUzNVx1MEUzNlx1MEUzN1x1MEUzOFx1MEUzOVx1MEUzQVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MEUzRlx1MEU0MFx1MEU0MVx1MEU0Mlx1MEU0M1x1MEU0NFx1MEU0NVx1MEU0Nlx1MEU0N1x1MEU0OFx1MEU0OVx1MEU0QVx1MEU0Qlx1MEU0Q1x1MEU0RFx1MEU0RVx1MEU0Rlx1MEU1MFx1MEU1MVx1MEU1Mlx1MEU1M1x1MEU1NFx1MEU1NVx1MEU1Nlx1MEU1N1x1MEU1OFx1MEU1OVx1MEU1QVx1MEU1Qlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFwiXG4gIH1cbn0iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQnVmZmVyID0gcmVxdWlyZShcInNhZmVyLWJ1ZmZlclwiKS5CdWZmZXI7XG5cbi8vIE11bHRpYnl0ZSBjb2RlYy4gSW4gdGhpcyBzY2hlbWUsIGEgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIGJ5IDEgb3IgbW9yZSBieXRlcy5cbi8vIE91ciBjb2RlYyBzdXBwb3J0cyBVVEYtMTYgc3Vycm9nYXRlcywgZXh0ZW5zaW9ucyBmb3IgR0IxODAzMCBhbmQgdW5pY29kZSBzZXF1ZW5jZXMuXG4vLyBUbyBzYXZlIG1lbW9yeSBhbmQgbG9hZGluZyB0aW1lLCB3ZSByZWFkIHRhYmxlIGZpbGVzIG9ubHkgd2hlbiByZXF1ZXN0ZWQuXG5cbmV4cG9ydHMuX2RiY3MgPSBEQkNTQ29kZWM7XG5cbnZhciBVTkFTU0lHTkVEID0gLTEsXG4gICAgR0IxODAzMF9DT0RFID0gLTIsXG4gICAgU0VRX1NUQVJUICA9IC0xMCxcbiAgICBOT0RFX1NUQVJUID0gLTEwMDAsXG4gICAgVU5BU1NJR05FRF9OT0RFID0gbmV3IEFycmF5KDB4MTAwKSxcbiAgICBERUZfQ0hBUiA9IC0xO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IDB4MTAwOyBpKyspXG4gICAgVU5BU1NJR05FRF9OT0RFW2ldID0gVU5BU1NJR05FRDtcblxuXG4vLyBDbGFzcyBEQkNTQ29kZWMgcmVhZHMgYW5kIGluaXRpYWxpemVzIG1hcHBpbmcgdGFibGVzLlxuZnVuY3Rpb24gREJDU0NvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgICB0aGlzLmVuY29kaW5nTmFtZSA9IGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWU7XG4gICAgaWYgKCFjb2RlY09wdGlvbnMpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRCQ1MgY29kZWMgaXMgY2FsbGVkIHdpdGhvdXQgdGhlIGRhdGEuXCIpXG4gICAgaWYgKCFjb2RlY09wdGlvbnMudGFibGUpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY29kaW5nICdcIiArIHRoaXMuZW5jb2RpbmdOYW1lICsgXCInIGhhcyBubyBkYXRhLlwiKTtcblxuICAgIC8vIExvYWQgdGFibGVzLlxuICAgIHZhciBtYXBwaW5nVGFibGUgPSBjb2RlY09wdGlvbnMudGFibGUoKTtcblxuXG4gICAgLy8gRGVjb2RlIHRhYmxlczogTUJDUyAtPiBVbmljb2RlLlxuXG4gICAgLy8gZGVjb2RlVGFibGVzIGlzIGEgdHJpZSwgZW5jb2RlZCBhcyBhbiBhcnJheSBvZiBhcnJheXMgb2YgaW50ZWdlcnMuIEludGVybmFsIGFycmF5cyBhcmUgdHJpZSBub2RlcyBhbmQgYWxsIGhhdmUgbGVuID0gMjU2LlxuICAgIC8vIFRyaWUgcm9vdCBpcyBkZWNvZGVUYWJsZXNbMF0uXG4gICAgLy8gVmFsdWVzOiA+PSAgMCAtPiB1bmljb2RlIGNoYXJhY3RlciBjb2RlLiBjYW4gYmUgPiAweEZGRkZcbiAgICAvLyAgICAgICAgID09IFVOQVNTSUdORUQgLT4gdW5rbm93bi91bmFzc2lnbmVkIHNlcXVlbmNlLlxuICAgIC8vICAgICAgICAgPT0gR0IxODAzMF9DT0RFIC0+IHRoaXMgaXMgdGhlIGVuZCBvZiBhIEdCMTgwMzAgNC1ieXRlIHNlcXVlbmNlLlxuICAgIC8vICAgICAgICAgPD0gTk9ERV9TVEFSVCAtPiBpbmRleCBvZiB0aGUgbmV4dCBub2RlIGluIG91ciB0cmllIHRvIHByb2Nlc3MgbmV4dCBieXRlLlxuICAgIC8vICAgICAgICAgPD0gU0VRX1NUQVJUICAtPiBpbmRleCBvZiB0aGUgc3RhcnQgb2YgYSBjaGFyYWN0ZXIgY29kZSBzZXF1ZW5jZSwgaW4gZGVjb2RlVGFibGVTZXEuXG4gICAgdGhpcy5kZWNvZGVUYWJsZXMgPSBbXTtcbiAgICB0aGlzLmRlY29kZVRhYmxlc1swXSA9IFVOQVNTSUdORURfTk9ERS5zbGljZSgwKTsgLy8gQ3JlYXRlIHJvb3Qgbm9kZS5cblxuICAgIC8vIFNvbWV0aW1lcyBhIE1CQ1MgY2hhciBjb3JyZXNwb25kcyB0byBhIHNlcXVlbmNlIG9mIHVuaWNvZGUgY2hhcnMuIFdlIHN0b3JlIHRoZW0gYXMgYXJyYXlzIG9mIGludGVnZXJzIGhlcmUuIFxuICAgIHRoaXMuZGVjb2RlVGFibGVTZXEgPSBbXTtcblxuICAgIC8vIEFjdHVhbCBtYXBwaW5nIHRhYmxlcyBjb25zaXN0IG9mIGNodW5rcy4gVXNlIHRoZW0gdG8gZmlsbCB1cCBkZWNvZGUgdGFibGVzLlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwcGluZ1RhYmxlLmxlbmd0aDsgaSsrKVxuICAgICAgICB0aGlzLl9hZGREZWNvZGVDaHVuayhtYXBwaW5nVGFibGVbaV0pO1xuXG4gICAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBpY29udi5kZWZhdWx0Q2hhclVuaWNvZGU7XG5cbiAgICBcbiAgICAvLyBFbmNvZGUgdGFibGVzOiBVbmljb2RlIC0+IERCQ1MuXG5cbiAgICAvLyBgZW5jb2RlVGFibGVgIGlzIGFycmF5IG1hcHBpbmcgZnJvbSB1bmljb2RlIGNoYXIgdG8gZW5jb2RlZCBjaGFyLiBBbGwgaXRzIHZhbHVlcyBhcmUgaW50ZWdlcnMgZm9yIHBlcmZvcm1hbmNlLlxuICAgIC8vIEJlY2F1c2UgaXQgY2FuIGJlIHNwYXJzZSwgaXQgaXMgcmVwcmVzZW50ZWQgYXMgYXJyYXkgb2YgYnVja2V0cyBieSAyNTYgY2hhcnMgZWFjaC4gQnVja2V0IGNhbiBiZSBudWxsLlxuICAgIC8vIFZhbHVlczogPj0gIDAgLT4gaXQgaXMgYSBub3JtYWwgY2hhci4gV3JpdGUgdGhlIHZhbHVlIChpZiA8PTI1NiB0aGVuIDEgYnl0ZSwgaWYgPD02NTUzNiB0aGVuIDIgYnl0ZXMsIGV0Yy4pLlxuICAgIC8vICAgICAgICAgPT0gVU5BU1NJR05FRCAtPiBubyBjb252ZXJzaW9uIGZvdW5kLiBPdXRwdXQgYSBkZWZhdWx0IGNoYXIuXG4gICAgLy8gICAgICAgICA8PSBTRVFfU1RBUlQgIC0+IGl0J3MgYW4gaW5kZXggaW4gZW5jb2RlVGFibGVTZXEsIHNlZSBiZWxvdy4gVGhlIGNoYXJhY3RlciBzdGFydHMgYSBzZXF1ZW5jZS5cbiAgICB0aGlzLmVuY29kZVRhYmxlID0gW107XG4gICAgXG4gICAgLy8gYGVuY29kZVRhYmxlU2VxYCBpcyB1c2VkIHdoZW4gYSBzZXF1ZW5jZSBvZiB1bmljb2RlIGNoYXJhY3RlcnMgaXMgZW5jb2RlZCBhcyBhIHNpbmdsZSBjb2RlLiBXZSB1c2UgYSB0cmVlIG9mXG4gICAgLy8gb2JqZWN0cyB3aGVyZSBrZXlzIGNvcnJlc3BvbmQgdG8gY2hhcmFjdGVycyBpbiBzZXF1ZW5jZSBhbmQgbGVhZnMgYXJlIHRoZSBlbmNvZGVkIGRiY3MgdmFsdWVzLiBBIHNwZWNpYWwgREVGX0NIQVIga2V5XG4gICAgLy8gbWVhbnMgZW5kIG9mIHNlcXVlbmNlIChuZWVkZWQgd2hlbiBvbmUgc2VxdWVuY2UgaXMgYSBzdHJpY3Qgc3Vic2VxdWVuY2Ugb2YgYW5vdGhlcikuXG4gICAgLy8gT2JqZWN0cyBhcmUga2VwdCBzZXBhcmF0ZWx5IGZyb20gZW5jb2RlVGFibGUgdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2UuXG4gICAgdGhpcy5lbmNvZGVUYWJsZVNlcSA9IFtdO1xuXG4gICAgLy8gU29tZSBjaGFycyBjYW4gYmUgZGVjb2RlZCwgYnV0IG5lZWQgbm90IGJlIGVuY29kZWQuXG4gICAgdmFyIHNraXBFbmNvZGVDaGFycyA9IHt9O1xuICAgIGlmIChjb2RlY09wdGlvbnMuZW5jb2RlU2tpcFZhbHMpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZWNPcHRpb25zLmVuY29kZVNraXBWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gY29kZWNPcHRpb25zLmVuY29kZVNraXBWYWxzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHNraXBFbmNvZGVDaGFyc1t2YWxdID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gdmFsLmZyb207IGogPD0gdmFsLnRvOyBqKyspXG4gICAgICAgICAgICAgICAgICAgIHNraXBFbmNvZGVDaGFyc1tqXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgLy8gVXNlIGRlY29kZSB0cmllIHRvIHJlY3Vyc2l2ZWx5IGZpbGwgb3V0IGVuY29kZSB0YWJsZXMuXG4gICAgdGhpcy5fZmlsbEVuY29kZVRhYmxlKDAsIDAsIHNraXBFbmNvZGVDaGFycyk7XG5cbiAgICAvLyBBZGQgbW9yZSBlbmNvZGluZyBwYWlycyB3aGVuIG5lZWRlZC5cbiAgICBpZiAoY29kZWNPcHRpb25zLmVuY29kZUFkZCkge1xuICAgICAgICBmb3IgKHZhciB1Q2hhciBpbiBjb2RlY09wdGlvbnMuZW5jb2RlQWRkKVxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb2RlY09wdGlvbnMuZW5jb2RlQWRkLCB1Q2hhcikpXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RW5jb2RlQ2hhcih1Q2hhci5jaGFyQ29kZUF0KDApLCBjb2RlY09wdGlvbnMuZW5jb2RlQWRkW3VDaGFyXSk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWZDaGFyU0IgID0gdGhpcy5lbmNvZGVUYWJsZVswXVtpY29udi5kZWZhdWx0Q2hhclNpbmdsZUJ5dGUuY2hhckNvZGVBdCgwKV07XG4gICAgaWYgKHRoaXMuZGVmQ2hhclNCID09PSBVTkFTU0lHTkVEKSB0aGlzLmRlZkNoYXJTQiA9IHRoaXMuZW5jb2RlVGFibGVbMF1bJz8nXTtcbiAgICBpZiAodGhpcy5kZWZDaGFyU0IgPT09IFVOQVNTSUdORUQpIHRoaXMuZGVmQ2hhclNCID0gXCI/XCIuY2hhckNvZGVBdCgwKTtcblxuXG4gICAgLy8gTG9hZCAmIGNyZWF0ZSBHQjE4MDMwIHRhYmxlcyB3aGVuIG5lZWRlZC5cbiAgICBpZiAodHlwZW9mIGNvZGVjT3B0aW9ucy5nYjE4MDMwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuZ2IxODAzMCA9IGNvZGVjT3B0aW9ucy5nYjE4MDMwKCk7IC8vIExvYWQgR0IxODAzMCByYW5nZXMuXG5cbiAgICAgICAgLy8gQWRkIEdCMTgwMzAgZGVjb2RlIHRhYmxlcy5cbiAgICAgICAgdmFyIHRoaXJkQnl0ZU5vZGVJZHggPSB0aGlzLmRlY29kZVRhYmxlcy5sZW5ndGg7XG4gICAgICAgIHZhciB0aGlyZEJ5dGVOb2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbdGhpcmRCeXRlTm9kZUlkeF0gPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCk7XG5cbiAgICAgICAgdmFyIGZvdXJ0aEJ5dGVOb2RlSWR4ID0gdGhpcy5kZWNvZGVUYWJsZXMubGVuZ3RoO1xuICAgICAgICB2YXIgZm91cnRoQnl0ZU5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tmb3VydGhCeXRlTm9kZUlkeF0gPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDB4ODE7IGkgPD0gMHhGRTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc2Vjb25kQnl0ZU5vZGVJZHggPSBOT0RFX1NUQVJUIC0gdGhpcy5kZWNvZGVUYWJsZXNbMF1baV07XG4gICAgICAgICAgICB2YXIgc2Vjb25kQnl0ZU5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tzZWNvbmRCeXRlTm9kZUlkeF07XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMHgzMDsgaiA8PSAweDM5OyBqKyspXG4gICAgICAgICAgICAgICAgc2Vjb25kQnl0ZU5vZGVbal0gPSBOT0RFX1NUQVJUIC0gdGhpcmRCeXRlTm9kZUlkeDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMHg4MTsgaSA8PSAweEZFOyBpKyspXG4gICAgICAgICAgICB0aGlyZEJ5dGVOb2RlW2ldID0gTk9ERV9TVEFSVCAtIGZvdXJ0aEJ5dGVOb2RlSWR4O1xuICAgICAgICBmb3IgKHZhciBpID0gMHgzMDsgaSA8PSAweDM5OyBpKyspXG4gICAgICAgICAgICBmb3VydGhCeXRlTm9kZVtpXSA9IEdCMTgwMzBfQ09ERVxuICAgIH0gICAgICAgIFxufVxuXG5EQkNTQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBEQkNTRW5jb2RlcjtcbkRCQ1NDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IERCQ1NEZWNvZGVyO1xuXG4vLyBEZWNvZGVyIGhlbHBlcnNcbkRCQ1NDb2RlYy5wcm90b3R5cGUuX2dldERlY29kZVRyaWVOb2RlID0gZnVuY3Rpb24oYWRkcikge1xuICAgIHZhciBieXRlcyA9IFtdO1xuICAgIGZvciAoOyBhZGRyID4gMDsgYWRkciA+Pj0gOClcbiAgICAgICAgYnl0ZXMucHVzaChhZGRyICYgMHhGRik7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICBieXRlcy5wdXNoKDApO1xuXG4gICAgdmFyIG5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1swXTtcbiAgICBmb3IgKHZhciBpID0gYnl0ZXMubGVuZ3RoLTE7IGkgPiAwOyBpLS0pIHsgLy8gVHJhdmVyc2Ugbm9kZXMgZGVlcGVyIGludG8gdGhlIHRyaWUuXG4gICAgICAgIHZhciB2YWwgPSBub2RlW2J5dGVzW2ldXTtcblxuICAgICAgICBpZiAodmFsID09IFVOQVNTSUdORUQpIHsgLy8gQ3JlYXRlIG5ldyBub2RlLlxuICAgICAgICAgICAgbm9kZVtieXRlc1tpXV0gPSBOT0RFX1NUQVJUIC0gdGhpcy5kZWNvZGVUYWJsZXMubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5kZWNvZGVUYWJsZXMucHVzaChub2RlID0gVU5BU1NJR05FRF9OT0RFLnNsaWNlKDApKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWwgPD0gTk9ERV9TVEFSVCkgeyAvLyBFeGlzdGluZyBub2RlLlxuICAgICAgICAgICAgbm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzW05PREVfU1RBUlQgLSB2YWxdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk92ZXJ3cml0ZSBieXRlIGluIFwiICsgdGhpcy5lbmNvZGluZ05hbWUgKyBcIiwgYWRkcjogXCIgKyBhZGRyLnRvU3RyaW5nKDE2KSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xufVxuXG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX2FkZERlY29kZUNodW5rID0gZnVuY3Rpb24oY2h1bmspIHtcbiAgICAvLyBGaXJzdCBlbGVtZW50IG9mIGNodW5rIGlzIHRoZSBoZXggbWJjcyBjb2RlIHdoZXJlIHdlIHN0YXJ0LlxuICAgIHZhciBjdXJBZGRyID0gcGFyc2VJbnQoY2h1bmtbMF0sIDE2KTtcblxuICAgIC8vIENob29zZSB0aGUgZGVjb2Rpbmcgbm9kZSB3aGVyZSB3ZSdsbCB3cml0ZSBvdXIgY2hhcnMuXG4gICAgdmFyIHdyaXRlVGFibGUgPSB0aGlzLl9nZXREZWNvZGVUcmllTm9kZShjdXJBZGRyKTtcbiAgICBjdXJBZGRyID0gY3VyQWRkciAmIDB4RkY7XG5cbiAgICAvLyBXcml0ZSBhbGwgb3RoZXIgZWxlbWVudHMgb2YgdGhlIGNodW5rIHRvIHRoZSB0YWJsZS5cbiAgICBmb3IgKHZhciBrID0gMTsgayA8IGNodW5rLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gY2h1bmtba107XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikgeyAvLyBTdHJpbmcsIHdyaXRlIGFzLWlzLlxuICAgICAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBwYXJ0Lmxlbmd0aDspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZSA9IHBhcnQuY2hhckNvZGVBdChsKyspO1xuICAgICAgICAgICAgICAgIGlmICgweEQ4MDAgPD0gY29kZSAmJiBjb2RlIDwgMHhEQzAwKSB7IC8vIERlY29kZSBzdXJyb2dhdGVcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGVUcmFpbCA9IHBhcnQuY2hhckNvZGVBdChsKyspO1xuICAgICAgICAgICAgICAgICAgICBpZiAoMHhEQzAwIDw9IGNvZGVUcmFpbCAmJiBjb2RlVHJhaWwgPCAweEUwMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVRhYmxlW2N1ckFkZHIrK10gPSAweDEwMDAwICsgKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyAoY29kZVRyYWlsIC0gMHhEQzAwKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5jb3JyZWN0IHN1cnJvZ2F0ZSBwYWlyIGluIFwiICArIHRoaXMuZW5jb2RpbmdOYW1lICsgXCIgYXQgY2h1bmsgXCIgKyBjaHVua1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKDB4MEZGMCA8IGNvZGUgJiYgY29kZSA8PSAweDBGRkYpIHsgLy8gQ2hhcmFjdGVyIHNlcXVlbmNlIChvdXIgb3duIGVuY29kaW5nIHVzZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSAweEZGRiAtIGNvZGUgKyAyO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VxID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG0gPSAwOyBtIDwgbGVuOyBtKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEucHVzaChwYXJ0LmNoYXJDb2RlQXQobCsrKSk7IC8vIFNpbXBsZSB2YXJpYXRpb246IGRvbid0IHN1cHBvcnQgc3Vycm9nYXRlcyBvciBzdWJzZXF1ZW5jZXMgaW4gc2VxLlxuXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlVGFibGVbY3VyQWRkcisrXSA9IFNFUV9TVEFSVCAtIHRoaXMuZGVjb2RlVGFibGVTZXEubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY29kZVRhYmxlU2VxLnB1c2goc2VxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB3cml0ZVRhYmxlW2N1ckFkZHIrK10gPSBjb2RlOyAvLyBCYXNpYyBjaGFyXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwYXJ0ID09PSBcIm51bWJlclwiKSB7IC8vIEludGVnZXIsIG1lYW5pbmcgaW5jcmVhc2luZyBzZXF1ZW5jZSBzdGFydGluZyB3aXRoIHByZXYgY2hhcmFjdGVyLlxuICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gd3JpdGVUYWJsZVtjdXJBZGRyIC0gMV0gKyAxO1xuICAgICAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBwYXJ0OyBsKyspXG4gICAgICAgICAgICAgICAgd3JpdGVUYWJsZVtjdXJBZGRyKytdID0gY2hhckNvZGUrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNvcnJlY3QgdHlwZSAnXCIgKyB0eXBlb2YgcGFydCArIFwiJyBnaXZlbiBpbiBcIiAgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiIGF0IGNodW5rIFwiICsgY2h1bmtbMF0pO1xuICAgIH1cbiAgICBpZiAoY3VyQWRkciA+IDB4RkYpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY29ycmVjdCBjaHVuayBpbiBcIiAgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiIGF0IGFkZHIgXCIgKyBjaHVua1swXSArIFwiOiB0b28gbG9uZ1wiICsgY3VyQWRkcik7XG59XG5cbi8vIEVuY29kZXIgaGVscGVyc1xuREJDU0NvZGVjLnByb3RvdHlwZS5fZ2V0RW5jb2RlQnVja2V0ID0gZnVuY3Rpb24odUNvZGUpIHtcbiAgICB2YXIgaGlnaCA9IHVDb2RlID4+IDg7IC8vIFRoaXMgY291bGQgYmUgPiAweEZGIGJlY2F1c2Ugb2YgYXN0cmFsIGNoYXJhY3RlcnMuXG4gICAgaWYgKHRoaXMuZW5jb2RlVGFibGVbaGlnaF0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhpcy5lbmNvZGVUYWJsZVtoaWdoXSA9IFVOQVNTSUdORURfTk9ERS5zbGljZSgwKTsgLy8gQ3JlYXRlIGJ1Y2tldCBvbiBkZW1hbmQuXG4gICAgcmV0dXJuIHRoaXMuZW5jb2RlVGFibGVbaGlnaF07XG59XG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX3NldEVuY29kZUNoYXIgPSBmdW5jdGlvbih1Q29kZSwgZGJjc0NvZGUpIHtcbiAgICB2YXIgYnVja2V0ID0gdGhpcy5fZ2V0RW5jb2RlQnVja2V0KHVDb2RlKTtcbiAgICB2YXIgbG93ID0gdUNvZGUgJiAweEZGO1xuICAgIGlmIChidWNrZXRbbG93XSA8PSBTRVFfU1RBUlQpXG4gICAgICAgIHRoaXMuZW5jb2RlVGFibGVTZXFbU0VRX1NUQVJULWJ1Y2tldFtsb3ddXVtERUZfQ0hBUl0gPSBkYmNzQ29kZTsgLy8gVGhlcmUncyBhbHJlYWR5IGEgc2VxdWVuY2UsIHNldCBhIHNpbmdsZS1jaGFyIHN1YnNlcXVlbmNlIG9mIGl0LlxuICAgIGVsc2UgaWYgKGJ1Y2tldFtsb3ddID09IFVOQVNTSUdORUQpXG4gICAgICAgIGJ1Y2tldFtsb3ddID0gZGJjc0NvZGU7XG59XG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX3NldEVuY29kZVNlcXVlbmNlID0gZnVuY3Rpb24oc2VxLCBkYmNzQ29kZSkge1xuICAgIFxuICAgIC8vIEdldCB0aGUgcm9vdCBvZiBjaGFyYWN0ZXIgdHJlZSBhY2NvcmRpbmcgdG8gZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzZXF1ZW5jZS5cbiAgICB2YXIgdUNvZGUgPSBzZXFbMF07XG4gICAgdmFyIGJ1Y2tldCA9IHRoaXMuX2dldEVuY29kZUJ1Y2tldCh1Q29kZSk7XG4gICAgdmFyIGxvdyA9IHVDb2RlICYgMHhGRjtcblxuICAgIHZhciBub2RlO1xuICAgIGlmIChidWNrZXRbbG93XSA8PSBTRVFfU1RBUlQpIHtcbiAgICAgICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgc2VxdWVuY2Ugd2l0aCAgLSB1c2UgaXQuXG4gICAgICAgIG5vZGUgPSB0aGlzLmVuY29kZVRhYmxlU2VxW1NFUV9TVEFSVC1idWNrZXRbbG93XV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBUaGVyZSB3YXMgbm8gc2VxdWVuY2Ugb2JqZWN0IC0gYWxsb2NhdGUgYSBuZXcgb25lLlxuICAgICAgICBub2RlID0ge307XG4gICAgICAgIGlmIChidWNrZXRbbG93XSAhPT0gVU5BU1NJR05FRCkgbm9kZVtERUZfQ0hBUl0gPSBidWNrZXRbbG93XTsgLy8gSWYgYSBjaGFyIHdhcyBzZXQgYmVmb3JlIC0gbWFrZSBpdCBhIHNpbmdsZS1jaGFyIHN1YnNlcXVlbmNlLlxuICAgICAgICBidWNrZXRbbG93XSA9IFNFUV9TVEFSVCAtIHRoaXMuZW5jb2RlVGFibGVTZXEubGVuZ3RoO1xuICAgICAgICB0aGlzLmVuY29kZVRhYmxlU2VxLnB1c2gobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gVHJhdmVyc2UgdGhlIGNoYXJhY3RlciB0cmVlLCBhbGxvY2F0aW5nIG5ldyBub2RlcyBhcyBuZWVkZWQuXG4gICAgZm9yICh2YXIgaiA9IDE7IGogPCBzZXEubGVuZ3RoLTE7IGorKykge1xuICAgICAgICB2YXIgb2xkVmFsID0gbm9kZVt1Q29kZV07XG4gICAgICAgIGlmICh0eXBlb2Ygb2xkVmFsID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgIG5vZGUgPSBvbGRWYWw7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGVbdUNvZGVdID0ge31cbiAgICAgICAgICAgIGlmIChvbGRWYWwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBub2RlW0RFRl9DSEFSXSA9IG9sZFZhbFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBsZWFmIHRvIGdpdmVuIGRiY3NDb2RlLlxuICAgIHVDb2RlID0gc2VxW3NlcS5sZW5ndGgtMV07XG4gICAgbm9kZVt1Q29kZV0gPSBkYmNzQ29kZTtcbn1cblxuREJDU0NvZGVjLnByb3RvdHlwZS5fZmlsbEVuY29kZVRhYmxlID0gZnVuY3Rpb24obm9kZUlkeCwgcHJlZml4LCBza2lwRW5jb2RlQ2hhcnMpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzW25vZGVJZHhdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMHgxMDA7IGkrKykge1xuICAgICAgICB2YXIgdUNvZGUgPSBub2RlW2ldO1xuICAgICAgICB2YXIgbWJDb2RlID0gcHJlZml4ICsgaTtcbiAgICAgICAgaWYgKHNraXBFbmNvZGVDaGFyc1ttYkNvZGVdKVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgaWYgKHVDb2RlID49IDApXG4gICAgICAgICAgICB0aGlzLl9zZXRFbmNvZGVDaGFyKHVDb2RlLCBtYkNvZGUpO1xuICAgICAgICBlbHNlIGlmICh1Q29kZSA8PSBOT0RFX1NUQVJUKVxuICAgICAgICAgICAgdGhpcy5fZmlsbEVuY29kZVRhYmxlKE5PREVfU1RBUlQgLSB1Q29kZSwgbWJDb2RlIDw8IDgsIHNraXBFbmNvZGVDaGFycyk7XG4gICAgICAgIGVsc2UgaWYgKHVDb2RlIDw9IFNFUV9TVEFSVClcbiAgICAgICAgICAgIHRoaXMuX3NldEVuY29kZVNlcXVlbmNlKHRoaXMuZGVjb2RlVGFibGVTZXFbU0VRX1NUQVJUIC0gdUNvZGVdLCBtYkNvZGUpO1xuICAgIH1cbn1cblxuXG5cbi8vID09IEVuY29kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIERCQ1NFbmNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgLy8gRW5jb2RlciBzdGF0ZVxuICAgIHRoaXMubGVhZFN1cnJvZ2F0ZSA9IC0xO1xuICAgIHRoaXMuc2VxT2JqID0gdW5kZWZpbmVkO1xuICAgIFxuICAgIC8vIFN0YXRpYyBkYXRhXG4gICAgdGhpcy5lbmNvZGVUYWJsZSA9IGNvZGVjLmVuY29kZVRhYmxlO1xuICAgIHRoaXMuZW5jb2RlVGFibGVTZXEgPSBjb2RlYy5lbmNvZGVUYWJsZVNlcTtcbiAgICB0aGlzLmRlZmF1bHRDaGFyU2luZ2xlQnl0ZSA9IGNvZGVjLmRlZkNoYXJTQjtcbiAgICB0aGlzLmdiMTgwMzAgPSBjb2RlYy5nYjE4MDMwO1xufVxuXG5EQkNTRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgbmV3QnVmID0gQnVmZmVyLmFsbG9jKHN0ci5sZW5ndGggKiAodGhpcy5nYjE4MDMwID8gNCA6IDMpKSxcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IHRoaXMubGVhZFN1cnJvZ2F0ZSxcbiAgICAgICAgc2VxT2JqID0gdGhpcy5zZXFPYmosIG5leHRDaGFyID0gLTEsXG4gICAgICAgIGkgPSAwLCBqID0gMDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIC8vIDAuIEdldCBuZXh0IGNoYXJhY3Rlci5cbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAtMSkge1xuICAgICAgICAgICAgaWYgKGkgPT0gc3RyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgICAgICB2YXIgdUNvZGUgPSBzdHIuY2hhckNvZGVBdChpKyspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHVDb2RlID0gbmV4dENoYXI7XG4gICAgICAgICAgICBuZXh0Q2hhciA9IC0xOyAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIEhhbmRsZSBzdXJyb2dhdGVzLlxuICAgICAgICBpZiAoMHhEODAwIDw9IHVDb2RlICYmIHVDb2RlIDwgMHhFMDAwKSB7IC8vIENoYXIgaXMgb25lIG9mIHN1cnJvZ2F0ZXMuXG4gICAgICAgICAgICBpZiAodUNvZGUgPCAweERDMDApIHsgLy8gV2UndmUgZ290IGxlYWQgc3Vycm9nYXRlLlxuICAgICAgICAgICAgICAgIGlmIChsZWFkU3Vycm9nYXRlID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gdUNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSB1Q29kZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG91YmxlIGxlYWQgc3Vycm9nYXRlIGZvdW5kLlxuICAgICAgICAgICAgICAgICAgICB1Q29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gV2UndmUgZ290IHRyYWlsIHN1cnJvZ2F0ZS5cbiAgICAgICAgICAgICAgICBpZiAobGVhZFN1cnJvZ2F0ZSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdUNvZGUgPSAweDEwMDAwICsgKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDApICogMHg0MDAgKyAodUNvZGUgLSAweERDMDApO1xuICAgICAgICAgICAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gLTE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBzdXJyb2dhdGUgcGFpciAtIG9ubHkgdHJhaWwgc3Vycm9nYXRlIGZvdW5kLlxuICAgICAgICAgICAgICAgICAgICB1Q29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBJbmNvbXBsZXRlIHN1cnJvZ2F0ZSBwYWlyIC0gb25seSBsZWFkIHN1cnJvZ2F0ZSBmb3VuZC5cbiAgICAgICAgICAgIG5leHRDaGFyID0gdUNvZGU7IHVDb2RlID0gVU5BU1NJR05FRDsgLy8gV3JpdGUgYW4gZXJyb3IsIHRoZW4gY3VycmVudCBjaGFyLlxuICAgICAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gQ29udmVydCB1Q29kZSBjaGFyYWN0ZXIuXG4gICAgICAgIHZhciBkYmNzQ29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgIGlmIChzZXFPYmogIT09IHVuZGVmaW5lZCAmJiB1Q29kZSAhPSBVTkFTU0lHTkVEKSB7IC8vIFdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzZXF1ZW5jZVxuICAgICAgICAgICAgdmFyIHJlc0NvZGUgPSBzZXFPYmpbdUNvZGVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNDb2RlID09PSAnb2JqZWN0JykgeyAvLyBTZXF1ZW5jZSBjb250aW51ZXMuXG4gICAgICAgICAgICAgICAgc2VxT2JqID0gcmVzQ29kZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzQ29kZSA9PSAnbnVtYmVyJykgeyAvLyBTZXF1ZW5jZSBmaW5pc2hlZC4gV3JpdGUgaXQuXG4gICAgICAgICAgICAgICAgZGJjc0NvZGUgPSByZXNDb2RlO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc0NvZGUgPT0gdW5kZWZpbmVkKSB7IC8vIEN1cnJlbnQgY2hhcmFjdGVyIGlzIG5vdCBwYXJ0IG9mIHRoZSBzZXF1ZW5jZS5cblxuICAgICAgICAgICAgICAgIC8vIFRyeSBkZWZhdWx0IGNoYXJhY3RlciBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgIHJlc0NvZGUgPSBzZXFPYmpbREVGX0NIQVJdO1xuICAgICAgICAgICAgICAgIGlmIChyZXNDb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGJjc0NvZGUgPSByZXNDb2RlOyAvLyBGb3VuZC4gV3JpdGUgaXQuXG4gICAgICAgICAgICAgICAgICAgIG5leHRDaGFyID0gdUNvZGU7IC8vIEN1cnJlbnQgY2hhcmFjdGVyIHdpbGwgYmUgd3JpdHRlbiB0b28gaW4gdGhlIG5leHQgaXRlcmF0aW9uLlxuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogV2hhdCBpZiB3ZSBoYXZlIG5vIGRlZmF1bHQ/IChyZXNDb2RlID09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlbiwgd2Ugc2hvdWxkIHdyaXRlIGZpcnN0IGNoYXIgb2YgdGhlIHNlcXVlbmNlIGFzLWlzIGFuZCB0cnkgdGhlIHJlc3QgcmVjdXJzaXZlbHkuXG4gICAgICAgICAgICAgICAgICAgIC8vIERpZG4ndCBkbyBpdCBmb3Igbm93IGJlY2F1c2Ugbm8gZW5jb2RpbmcgaGFzIHRoaXMgc2l0dWF0aW9uIHlldC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5LCBqdXN0IHNraXAgdGhlIHNlcXVlbmNlIGFuZCB3cml0ZSBjdXJyZW50IGNoYXIuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VxT2JqID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVDb2RlID49IDApIHsgIC8vIFJlZ3VsYXIgY2hhcmFjdGVyXG4gICAgICAgICAgICB2YXIgc3VidGFibGUgPSB0aGlzLmVuY29kZVRhYmxlW3VDb2RlID4+IDhdO1xuICAgICAgICAgICAgaWYgKHN1YnRhYmxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgZGJjc0NvZGUgPSBzdWJ0YWJsZVt1Q29kZSAmIDB4RkZdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZGJjc0NvZGUgPD0gU0VRX1NUQVJUKSB7IC8vIFNlcXVlbmNlIHN0YXJ0XG4gICAgICAgICAgICAgICAgc2VxT2JqID0gdGhpcy5lbmNvZGVUYWJsZVNlcVtTRVFfU1RBUlQtZGJjc0NvZGVdO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGJjc0NvZGUgPT0gVU5BU1NJR05FRCAmJiB0aGlzLmdiMTgwMzApIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgR0IxODAzMCBhbGdvcml0aG0gdG8gZmluZCBjaGFyYWN0ZXIocykgdG8gd3JpdGUuXG4gICAgICAgICAgICAgICAgdmFyIGlkeCA9IGZpbmRJZHgodGhpcy5nYjE4MDMwLnVDaGFycywgdUNvZGUpO1xuICAgICAgICAgICAgICAgIGlmIChpZHggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRiY3NDb2RlID0gdGhpcy5nYjE4MDMwLmdiQ2hhcnNbaWR4XSArICh1Q29kZSAtIHRoaXMuZ2IxODAzMC51Q2hhcnNbaWR4XSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0J1ZltqKytdID0gMHg4MSArIE1hdGguZmxvb3IoZGJjc0NvZGUgLyAxMjYwMCk7IGRiY3NDb2RlID0gZGJjc0NvZGUgJSAxMjYwMDtcbiAgICAgICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSAweDMwICsgTWF0aC5mbG9vcihkYmNzQ29kZSAvIDEyNjApOyBkYmNzQ29kZSA9IGRiY3NDb2RlICUgMTI2MDtcbiAgICAgICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSAweDgxICsgTWF0aC5mbG9vcihkYmNzQ29kZSAvIDEwKTsgZGJjc0NvZGUgPSBkYmNzQ29kZSAlIDEwO1xuICAgICAgICAgICAgICAgICAgICBuZXdCdWZbaisrXSA9IDB4MzAgKyBkYmNzQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gV3JpdGUgZGJjc0NvZGUgY2hhcmFjdGVyLlxuICAgICAgICBpZiAoZGJjc0NvZGUgPT09IFVOQVNTSUdORUQpXG4gICAgICAgICAgICBkYmNzQ29kZSA9IHRoaXMuZGVmYXVsdENoYXJTaW5nbGVCeXRlO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRiY3NDb2RlIDwgMHgxMDApIHtcbiAgICAgICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGJjc0NvZGUgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlID4+IDg7ICAgLy8gaGlnaCBieXRlXG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlICYgMHhGRjsgLy8gbG93IGJ5dGVcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgPj4gMTY7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IChkYmNzQ29kZSA+PiA4KSAmIDB4RkY7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlICYgMHhGRjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VxT2JqID0gc2VxT2JqO1xuICAgIHRoaXMubGVhZFN1cnJvZ2F0ZSA9IGxlYWRTdXJyb2dhdGU7XG4gICAgcmV0dXJuIG5ld0J1Zi5zbGljZSgwLCBqKTtcbn1cblxuREJDU0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmxlYWRTdXJyb2dhdGUgPT09IC0xICYmIHRoaXMuc2VxT2JqID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybjsgLy8gQWxsIGNsZWFuLiBNb3N0IG9mdGVuIGNhc2UuXG5cbiAgICB2YXIgbmV3QnVmID0gQnVmZmVyLmFsbG9jKDEwKSwgaiA9IDA7XG5cbiAgICBpZiAodGhpcy5zZXFPYmopIHsgLy8gV2UncmUgaW4gdGhlIHNlcXVlbmNlLlxuICAgICAgICB2YXIgZGJjc0NvZGUgPSB0aGlzLnNlcU9ialtERUZfQ0hBUl07XG4gICAgICAgIGlmIChkYmNzQ29kZSAhPT0gdW5kZWZpbmVkKSB7IC8vIFdyaXRlIGJlZ2lubmluZyBvZiB0aGUgc2VxdWVuY2UuXG4gICAgICAgICAgICBpZiAoZGJjc0NvZGUgPCAweDEwMCkge1xuICAgICAgICAgICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlID4+IDg7ICAgLy8gaGlnaCBieXRlXG4gICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZSAmIDB4RkY7IC8vIGxvdyBieXRlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZWUgdG9kbyBhYm92ZS5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlcU9iaiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkU3Vycm9nYXRlICE9PSAtMSkge1xuICAgICAgICAvLyBJbmNvbXBsZXRlIHN1cnJvZ2F0ZSBwYWlyIC0gb25seSBsZWFkIHN1cnJvZ2F0ZSBmb3VuZC5cbiAgICAgICAgbmV3QnVmW2orK10gPSB0aGlzLmRlZmF1bHRDaGFyU2luZ2xlQnl0ZTtcbiAgICAgICAgdGhpcy5sZWFkU3Vycm9nYXRlID0gLTE7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBuZXdCdWYuc2xpY2UoMCwgaik7XG59XG5cbi8vIEV4cG9ydCBmb3IgdGVzdGluZ1xuREJDU0VuY29kZXIucHJvdG90eXBlLmZpbmRJZHggPSBmaW5kSWR4O1xuXG5cbi8vID09IERlY29kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIERCQ1NEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgLy8gRGVjb2RlciBzdGF0ZVxuICAgIHRoaXMubm9kZUlkeCA9IDA7XG4gICAgdGhpcy5wcmV2QnVmID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gICAgLy8gU3RhdGljIGRhdGFcbiAgICB0aGlzLmRlY29kZVRhYmxlcyA9IGNvZGVjLmRlY29kZVRhYmxlcztcbiAgICB0aGlzLmRlY29kZVRhYmxlU2VxID0gY29kZWMuZGVjb2RlVGFibGVTZXE7XG4gICAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBjb2RlYy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgdGhpcy5nYjE4MDMwID0gY29kZWMuZ2IxODAzMDtcbn1cblxuREJDU0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmKSB7XG4gICAgdmFyIG5ld0J1ZiA9IEJ1ZmZlci5hbGxvYyhidWYubGVuZ3RoKjIpLFxuICAgICAgICBub2RlSWR4ID0gdGhpcy5ub2RlSWR4LCBcbiAgICAgICAgcHJldkJ1ZiA9IHRoaXMucHJldkJ1ZiwgcHJldkJ1Zk9mZnNldCA9IHRoaXMucHJldkJ1Zi5sZW5ndGgsXG4gICAgICAgIHNlcVN0YXJ0ID0gLXRoaXMucHJldkJ1Zi5sZW5ndGgsIC8vIGlkeCBvZiB0aGUgc3RhcnQgb2YgY3VycmVudCBwYXJzZWQgc2VxdWVuY2UuXG4gICAgICAgIHVDb2RlO1xuXG4gICAgaWYgKHByZXZCdWZPZmZzZXQgPiAwKSAvLyBNYWtlIHByZXYgYnVmIG92ZXJsYXAgYSBsaXR0bGUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gc2xpY2UgbGF0ZXIuXG4gICAgICAgIHByZXZCdWYgPSBCdWZmZXIuY29uY2F0KFtwcmV2QnVmLCBidWYuc2xpY2UoMCwgMTApXSk7XG4gICAgXG4gICAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjdXJCeXRlID0gKGkgPj0gMCkgPyBidWZbaV0gOiBwcmV2QnVmW2kgKyBwcmV2QnVmT2Zmc2V0XTtcblxuICAgICAgICAvLyBMb29rdXAgaW4gY3VycmVudCB0cmllIG5vZGUuXG4gICAgICAgIHZhciB1Q29kZSA9IHRoaXMuZGVjb2RlVGFibGVzW25vZGVJZHhdW2N1ckJ5dGVdO1xuXG4gICAgICAgIGlmICh1Q29kZSA+PSAwKSB7IFxuICAgICAgICAgICAgLy8gTm9ybWFsIGNoYXJhY3RlciwganVzdCB1c2UgaXQuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodUNvZGUgPT09IFVOQVNTSUdORUQpIHsgLy8gVW5rbm93biBjaGFyLlxuICAgICAgICAgICAgLy8gVE9ETzogQ2FsbGJhY2sgd2l0aCBzZXEuXG4gICAgICAgICAgICAvL3ZhciBjdXJTZXEgPSAoc2VxU3RhcnQgPj0gMCkgPyBidWYuc2xpY2Uoc2VxU3RhcnQsIGkrMSkgOiBwcmV2QnVmLnNsaWNlKHNlcVN0YXJ0ICsgcHJldkJ1Zk9mZnNldCwgaSsxICsgcHJldkJ1Zk9mZnNldCk7XG4gICAgICAgICAgICBpID0gc2VxU3RhcnQ7IC8vIFRyeSB0byBwYXJzZSBhZ2FpbiwgYWZ0ZXIgc2tpcHBpbmcgZmlyc3QgYnl0ZSBvZiB0aGUgc2VxdWVuY2UgKCdpJyB3aWxsIGJlIGluY3JlbWVudGVkIGJ5ICdmb3InIGN5Y2xlKS5cbiAgICAgICAgICAgIHVDb2RlID0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1Q29kZSA9PT0gR0IxODAzMF9DT0RFKSB7XG4gICAgICAgICAgICB2YXIgY3VyU2VxID0gKHNlcVN0YXJ0ID49IDApID8gYnVmLnNsaWNlKHNlcVN0YXJ0LCBpKzEpIDogcHJldkJ1Zi5zbGljZShzZXFTdGFydCArIHByZXZCdWZPZmZzZXQsIGkrMSArIHByZXZCdWZPZmZzZXQpO1xuICAgICAgICAgICAgdmFyIHB0ciA9IChjdXJTZXFbMF0tMHg4MSkqMTI2MDAgKyAoY3VyU2VxWzFdLTB4MzApKjEyNjAgKyAoY3VyU2VxWzJdLTB4ODEpKjEwICsgKGN1clNlcVszXS0weDMwKTtcbiAgICAgICAgICAgIHZhciBpZHggPSBmaW5kSWR4KHRoaXMuZ2IxODAzMC5nYkNoYXJzLCBwdHIpO1xuICAgICAgICAgICAgdUNvZGUgPSB0aGlzLmdiMTgwMzAudUNoYXJzW2lkeF0gKyBwdHIgLSB0aGlzLmdiMTgwMzAuZ2JDaGFyc1tpZHhdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVDb2RlIDw9IE5PREVfU1RBUlQpIHsgLy8gR28gdG8gbmV4dCB0cmllIG5vZGUuXG4gICAgICAgICAgICBub2RlSWR4ID0gTk9ERV9TVEFSVCAtIHVDb2RlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodUNvZGUgPD0gU0VRX1NUQVJUKSB7IC8vIE91dHB1dCBhIHNlcXVlbmNlIG9mIGNoYXJzLlxuICAgICAgICAgICAgdmFyIHNlcSA9IHRoaXMuZGVjb2RlVGFibGVTZXFbU0VRX1NUQVJUIC0gdUNvZGVdO1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZXEubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAgICAgICAgICAgdUNvZGUgPSBzZXFba107XG4gICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSA+PiA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdUNvZGUgPSBzZXFbc2VxLmxlbmd0aC0xXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpY29udi1saXRlIGludGVybmFsIGVycm9yOiBpbnZhbGlkIGRlY29kaW5nIHRhYmxlIHZhbHVlIFwiICsgdUNvZGUgKyBcIiBhdCBcIiArIG5vZGVJZHggKyBcIi9cIiArIGN1ckJ5dGUpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgdG8gYnVmZmVyLCBoYW5kbGluZyBoaWdoZXIgcGxhbmVzIHVzaW5nIHN1cnJvZ2F0ZSBwYWlyLlxuICAgICAgICBpZiAodUNvZGUgPiAweEZGRkYpIHsgXG4gICAgICAgICAgICB1Q29kZSAtPSAweDEwMDAwO1xuICAgICAgICAgICAgdmFyIHVDb2RlTGVhZCA9IDB4RDgwMCArIE1hdGguZmxvb3IodUNvZGUgLyAweDQwMCk7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IHVDb2RlTGVhZCAmIDB4RkY7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IHVDb2RlTGVhZCA+PiA4O1xuXG4gICAgICAgICAgICB1Q29kZSA9IDB4REMwMCArIHVDb2RlICUgMHg0MDA7XG4gICAgICAgIH1cbiAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSAmIDB4RkY7XG4gICAgICAgIG5ld0J1ZltqKytdID0gdUNvZGUgPj4gODtcblxuICAgICAgICAvLyBSZXNldCB0cmllIG5vZGUuXG4gICAgICAgIG5vZGVJZHggPSAwOyBzZXFTdGFydCA9IGkrMTtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVJZHggPSBub2RlSWR4O1xuICAgIHRoaXMucHJldkJ1ZiA9IChzZXFTdGFydCA+PSAwKSA/IGJ1Zi5zbGljZShzZXFTdGFydCkgOiBwcmV2QnVmLnNsaWNlKHNlcVN0YXJ0ICsgcHJldkJ1Zk9mZnNldCk7XG4gICAgcmV0dXJuIG5ld0J1Zi5zbGljZSgwLCBqKS50b1N0cmluZygndWNzMicpO1xufVxuXG5EQkNTRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJldCA9ICcnO1xuXG4gICAgLy8gVHJ5IHRvIHBhcnNlIGFsbCByZW1haW5pbmcgY2hhcnMuXG4gICAgd2hpbGUgKHRoaXMucHJldkJ1Zi5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNraXAgMSBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlci5cbiAgICAgICAgcmV0ICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgICB2YXIgYnVmID0gdGhpcy5wcmV2QnVmLnNsaWNlKDEpO1xuXG4gICAgICAgIC8vIFBhcnNlIHJlbWFpbmluZyBhcyB1c3VhbC5cbiAgICAgICAgdGhpcy5wcmV2QnVmID0gQnVmZmVyLmFsbG9jKDApO1xuICAgICAgICB0aGlzLm5vZGVJZHggPSAwO1xuICAgICAgICBpZiAoYnVmLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXQgKz0gdGhpcy53cml0ZShidWYpO1xuICAgIH1cblxuICAgIHRoaXMubm9kZUlkeCA9IDA7XG4gICAgcmV0dXJuIHJldDtcbn1cblxuLy8gQmluYXJ5IHNlYXJjaCBmb3IgR0IxODAzMC4gUmV0dXJucyBsYXJnZXN0IGkgc3VjaCB0aGF0IHRhYmxlW2ldIDw9IHZhbC5cbmZ1bmN0aW9uIGZpbmRJZHgodGFibGUsIHZhbCkge1xuICAgIGlmICh0YWJsZVswXSA+IHZhbClcbiAgICAgICAgcmV0dXJuIC0xO1xuXG4gICAgdmFyIGwgPSAwLCByID0gdGFibGUubGVuZ3RoO1xuICAgIHdoaWxlIChsIDwgci0xKSB7IC8vIGFsd2F5cyB0YWJsZVtsXSA8PSB2YWwgPCB0YWJsZVtyXVxuICAgICAgICB2YXIgbWlkID0gbCArIE1hdGguZmxvb3IoKHItbCsxKS8yKTtcbiAgICAgICAgaWYgKHRhYmxlW21pZF0gPD0gdmFsKVxuICAgICAgICAgICAgbCA9IG1pZDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgciA9IG1pZDtcbiAgICB9XG4gICAgcmV0dXJuIGw7XG59XG5cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLy8gRGVzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIGRvdWJsZSBieXRlIGVuY29kaW5ncyBhbmQgYWxpYXNlcy5cbi8vIFRhYmxlcyBhcmUgbm90IHJlcXVpcmUoKS1kIHVudGlsIHRoZXkgYXJlIG5lZWRlZCB0byBzcGVlZCB1cCBsaWJyYXJ5IGxvYWQuXG4vLyByZXF1aXJlKCktcyBhcmUgZGlyZWN0IHRvIHN1cHBvcnQgQnJvd3NlcmlmeS5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgXG4gICAgLy8gPT0gSmFwYW5lc2UvU2hpZnRKSVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEFsbCBqYXBhbmVzZSBlbmNvZGluZ3MgYXJlIGJhc2VkIG9uIEpJUyBYIHNldCBvZiBzdGFuZGFyZHM6XG4gICAgLy8gSklTIFggMDIwMSAtIFNpbmdsZS1ieXRlIGVuY29kaW5nIG9mIEFTQ0lJICsgXHUwMEE1ICsgS2FuYSBjaGFycyBhdCAweEExLTB4REYuXG4gICAgLy8gSklTIFggMDIwOCAtIE1haW4gc2V0IG9mIDY4NzkgY2hhcmFjdGVycywgcGxhY2VkIGluIDk0eDk0IHBsYW5lLCB0byBiZSBlbmNvZGVkIGJ5IDIgYnl0ZXMuIFxuICAgIC8vICAgICAgICAgICAgICBIYXMgc2V2ZXJhbCB2YXJpYXRpb25zIGluIDE5NzgsIDE5ODMsIDE5OTAgYW5kIDE5OTcuXG4gICAgLy8gSklTIFggMDIxMiAtIFN1cHBsZW1lbnRhcnkgcGxhbmUgb2YgNjA2NyBjaGFycyBpbiA5NHg5NCBwbGFuZS4gMTk5MC4gRWZmZWN0aXZlbHkgZGVhZC5cbiAgICAvLyBKSVMgWCAwMjEzIC0gRXh0ZW5zaW9uIGFuZCBtb2Rlcm4gcmVwbGFjZW1lbnQgb2YgMDIwOCBhbmQgMDIxMi4gVG90YWwgY2hhcnM6IDExMjMzLlxuICAgIC8vICAgICAgICAgICAgICAyIHBsYW5lcywgZmlyc3QgaXMgc3VwZXJzZXQgb2YgMDIwOCwgc2Vjb25kIC0gcmV2aXNlZCAwMjEyLlxuICAgIC8vICAgICAgICAgICAgICBJbnRyb2R1Y2VkIGluIDIwMDAsIHJldmlzZWQgMjAwNC4gU29tZSBjaGFyYWN0ZXJzIGFyZSBpbiBVbmljb2RlIFBsYW5lIDIgKDB4Mnh4eHgpXG5cbiAgICAvLyBCeXRlIGVuY29kaW5ncyBhcmU6XG4gICAgLy8gICogU2hpZnRfSklTOiBDb21wYXRpYmxlIHdpdGggMDIwMSwgdXNlcyBub3QgZGVmaW5lZCBjaGFycyBpbiB0b3AgaGFsZiBhcyBsZWFkIGJ5dGVzIGZvciBkb3VibGUtYnl0ZVxuICAgIC8vICAgICAgICAgICAgICAgZW5jb2Rpbmcgb2YgMDIwOC4gTGVhZCBieXRlIHJhbmdlczogMHg4MS0weDlGLCAweEUwLTB4RUY7IFRyYWlsIGJ5dGUgcmFuZ2VzOiAweDQwLTB4N0UsIDB4ODAtMHg5RSwgMHg5Ri0weEZDLlxuICAgIC8vICAgICAgICAgICAgICAgV2luZG93cyBDUDkzMiBpcyBhIHN1cGVyc2V0IG9mIFNoaWZ0X0pJUy4gU29tZSBjb21wYW5pZXMgYWRkZWQgbW9yZSBjaGFycywgbm90YWJseSBLRERJLlxuICAgIC8vICAqIEVVQy1KUDogICAgVXAgdG8gMyBieXRlcyBwZXIgY2hhcmFjdGVyLiBVc2VkIG1vc3RseSBvbiAqbml4ZXMuXG4gICAgLy8gICAgICAgICAgICAgICAweDAwLTB4N0YgICAgICAgLSBsb3dlciBwYXJ0IG9mIDAyMDFcbiAgICAvLyAgICAgICAgICAgICAgIDB4OEUsIDB4QTEtMHhERiAtIHVwcGVyIHBhcnQgb2YgMDIwMVxuICAgIC8vICAgICAgICAgICAgICAgKDB4QTEtMHhGRSl4MiAgIC0gMDIwOCBwbGFuZSAoOTR4OTQpLlxuICAgIC8vICAgICAgICAgICAgICAgMHg4RiwgKDB4QTEtMHhGRSl4MiAtIDAyMTIgcGxhbmUgKDk0eDk0KS5cbiAgICAvLyAgKiBKSVMgWCAyMDg6IDctYml0LCBkaXJlY3QgZW5jb2Rpbmcgb2YgMDIwOC4gQnl0ZSByYW5nZXM6IDB4MjEtMHg3RSAoOTQgdmFsdWVzKS4gVW5jb21tb24uXG4gICAgLy8gICAgICAgICAgICAgICBVc2VkIGFzLWlzIGluIElTTzIwMjIgZmFtaWx5LlxuICAgIC8vICAqIElTTzIwMjItSlA6IFN0YXRlZnVsIGVuY29kaW5nLCB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgdG8gc3dpdGNoIGJldHdlZW4gQVNDSUksIFxuICAgIC8vICAgICAgICAgICAgICAgIDAyMDEtMTk3NiBSb21hbiwgMDIwOC0xOTc4LCAwMjA4LTE5ODMuXG4gICAgLy8gICogSVNPMjAyMi1KUC0xOiBBZGRzIGVzYyBzZXEgZm9yIDAyMTItMTk5MC5cbiAgICAvLyAgKiBJU08yMDIyLUpQLTI6IEFkZHMgZXNjIHNlcSBmb3IgR0IyMzEzLTE5ODAsIEtTWDEwMDEtMTk5MiwgSVNPODg1OS0xLCBJU084ODU5LTcuXG4gICAgLy8gICogSVNPMjAyMi1KUC0zOiBBZGRzIGVzYyBzZXEgZm9yIDAyMDEtMTk3NiBLYW5hIHNldCwgMDIxMy0yMDAwIFBsYW5lcyAxLCAyLlxuICAgIC8vICAqIElTTzIwMjItSlAtMjAwNDogQWRkcyAwMjEzLTIwMDQgUGxhbmUgMS5cbiAgICAvL1xuICAgIC8vIEFmdGVyIEpJUyBYIDAyMTMgYXBwZWFyZWQsIFNoaWZ0X0pJUy0yMDA0LCBFVUMtSklTWDAyMTMgYW5kIElTTzIwMjItSlAtMjAwNCBmb2xsb3dlZCwgd2l0aCBqdXN0IGNoYW5naW5nIHRoZSBwbGFuZXMuXG4gICAgLy9cbiAgICAvLyBPdmVyYWxsLCBpdCBzZWVtcyB0aGF0IGl0J3MgYSBtZXNzIDooIGh0dHA6Ly93d3c4LnBsYWxhLm9yLmpwL3RrdWJvdGExL3VuaWNvZGUtc3ltYm9scy1tYXAyLmh0bWxcblxuICAgICdzaGlmdGppcyc6IHtcbiAgICAgICAgdHlwZTogJ19kYmNzJyxcbiAgICAgICAgdGFibGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVxdWlyZSgnLi90YWJsZXMvc2hpZnRqaXMuanNvbicpIH0sXG4gICAgICAgIGVuY29kZUFkZDogeydcXHUwMGE1JzogMHg1QywgJ1xcdTIwM0UnOiAweDdFfSxcbiAgICAgICAgZW5jb2RlU2tpcFZhbHM6IFt7ZnJvbTogMHhFRDQwLCB0bzogMHhGOTQwfV0sXG4gICAgfSxcbiAgICAnY3NzaGlmdGppcyc6ICdzaGlmdGppcycsXG4gICAgJ21za2FuamknOiAnc2hpZnRqaXMnLFxuICAgICdzamlzJzogJ3NoaWZ0amlzJyxcbiAgICAnd2luZG93czMxaic6ICdzaGlmdGppcycsXG4gICAgJ21zMzFqJzogJ3NoaWZ0amlzJyxcbiAgICAneHNqaXMnOiAnc2hpZnRqaXMnLFxuICAgICd3aW5kb3dzOTMyJzogJ3NoaWZ0amlzJyxcbiAgICAnbXM5MzInOiAnc2hpZnRqaXMnLFxuICAgICc5MzInOiAnc2hpZnRqaXMnLFxuICAgICdjcDkzMic6ICdzaGlmdGppcycsXG5cbiAgICAnZXVjanAnOiB7XG4gICAgICAgIHR5cGU6ICdfZGJjcycsXG4gICAgICAgIHRhYmxlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL2V1Y2pwLmpzb24nKSB9LFxuICAgICAgICBlbmNvZGVBZGQ6IHsnXFx1MDBhNSc6IDB4NUMsICdcXHUyMDNFJzogMHg3RX0sXG4gICAgfSxcblxuICAgIC8vIFRPRE86IEtEREkgZXh0ZW5zaW9uIHRvIFNoaWZ0X0pJU1xuICAgIC8vIFRPRE86IElCTSBDQ1NJRCA5NDIgPSBDUDkzMiwgYnV0IEYwLUY5IGN1c3RvbSBjaGFycyBhbmQgb3RoZXIgY2hhciBjaGFuZ2VzLlxuICAgIC8vIFRPRE86IElCTSBDQ1NJRCA5NDMgPSBTaGlmdF9KSVMgPSBDUDkzMiB3aXRoIG9yaWdpbmFsIFNoaWZ0X0pJUyBsb3dlciAxMjggY2hhcnMuXG5cblxuICAgIC8vID09IENoaW5lc2UvR0JLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dCS1xuICAgIC8vIFdlIG1vc3RseSBpbXBsZW1lbnQgVzNDIHJlY29tbWVuZGF0aW9uOiBodHRwczovL3d3dy53My5vcmcvVFIvZW5jb2RpbmcvI2diay1lbmNvZGVyXG5cbiAgICAvLyBPbGRlc3QgR0IyMzEyICgxOTgxLCB+NzYwMCBjaGFycykgaXMgYSBzdWJzZXQgb2YgQ1A5MzZcbiAgICAnZ2IyMzEyJzogJ2NwOTM2JyxcbiAgICAnZ2IyMzEyODAnOiAnY3A5MzYnLFxuICAgICdnYjIzMTIxOTgwJzogJ2NwOTM2JyxcbiAgICAnY3NnYjIzMTInOiAnY3A5MzYnLFxuICAgICdjc2lzbzU4Z2IyMzEyODAnOiAnY3A5MzYnLFxuICAgICdldWNjbic6ICdjcDkzNicsXG5cbiAgICAvLyBNaWNyb3NvZnQncyBDUDkzNiBpcyBhIHN1YnNldCBhbmQgYXBwcm94aW1hdGlvbiBvZiBHQksuXG4gICAgJ3dpbmRvd3M5MzYnOiAnY3A5MzYnLFxuICAgICdtczkzNic6ICdjcDkzNicsXG4gICAgJzkzNic6ICdjcDkzNicsXG4gICAgJ2NwOTM2Jzoge1xuICAgICAgICB0eXBlOiAnX2RiY3MnLFxuICAgICAgICB0YWJsZTogZnVuY3Rpb24oKSB7IHJldHVybiByZXF1aXJlKCcuL3RhYmxlcy9jcDkzNi5qc29uJykgfSxcbiAgICB9LFxuXG4gICAgLy8gR0JLICh+MjIwMDAgY2hhcnMpIGlzIGFuIGV4dGVuc2lvbiBvZiBDUDkzNiB0aGF0IGFkZGVkIHVzZXItbWFwcGVkIGNoYXJzIGFuZCBzb21lIG90aGVyLlxuICAgICdnYmsnOiB7XG4gICAgICAgIHR5cGU6ICdfZGJjcycsXG4gICAgICAgIHRhYmxlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL2NwOTM2Lmpzb24nKS5jb25jYXQocmVxdWlyZSgnLi90YWJsZXMvZ2JrLWFkZGVkLmpzb24nKSkgfSxcbiAgICB9LFxuICAgICd4Z2JrJzogJ2diaycsXG4gICAgJ2lzb2lyNTgnOiAnZ2JrJyxcblxuICAgIC8vIEdCMTgwMzAgaXMgYW4gYWxnb3JpdGhtaWMgZXh0ZW5zaW9uIG9mIEdCSy5cbiAgICAvLyBNYWluIHNvdXJjZTogaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY29kaW5nLyNnYmstZW5jb2RlclxuICAgIC8vIGh0dHA6Ly9pY3UtcHJvamVjdC5vcmcvZG9jcy9wYXBlcnMvZ2IxODAzMC5odG1sXG4gICAgLy8gaHR0cDovL3NvdXJjZS5pY3UtcHJvamVjdC5vcmcvcmVwb3MvaWN1L2RhdGEvdHJ1bmsvY2hhcnNldC9kYXRhL3htbC9nYi0xODAzMC0yMDAwLnhtbFxuICAgIC8vIGh0dHA6Ly93d3cua2huZ2FpLmNvbS9jaGluZXNlL2NoYXJtYXAvdGJsZ2JrLnBocD9wYWdlPTBcbiAgICAnZ2IxODAzMCc6IHtcbiAgICAgICAgdHlwZTogJ19kYmNzJyxcbiAgICAgICAgdGFibGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVxdWlyZSgnLi90YWJsZXMvY3A5MzYuanNvbicpLmNvbmNhdChyZXF1aXJlKCcuL3RhYmxlcy9nYmstYWRkZWQuanNvbicpKSB9LFxuICAgICAgICBnYjE4MDMwOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL2diMTgwMzAtcmFuZ2VzLmpzb24nKSB9LFxuICAgICAgICBlbmNvZGVTa2lwVmFsczogWzB4ODBdLFxuICAgICAgICBlbmNvZGVBZGQ6IHsnXHUyMEFDJzogMHhBMkUzfSxcbiAgICB9LFxuXG4gICAgJ2NoaW5lc2UnOiAnZ2IxODAzMCcsXG5cblxuICAgIC8vID09IEtvcmVhbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBFVUMtS1IsIEtTX0NfNTYwMSBhbmQgS1MgWCAxMDAxIGFyZSBleGFjdGx5IHRoZSBzYW1lLlxuICAgICd3aW5kb3dzOTQ5JzogJ2NwOTQ5JyxcbiAgICAnbXM5NDknOiAnY3A5NDknLFxuICAgICc5NDknOiAnY3A5NDknLFxuICAgICdjcDk0OSc6IHtcbiAgICAgICAgdHlwZTogJ19kYmNzJyxcbiAgICAgICAgdGFibGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVxdWlyZSgnLi90YWJsZXMvY3A5NDkuanNvbicpIH0sXG4gICAgfSxcblxuICAgICdjc2V1Y2tyJzogJ2NwOTQ5JyxcbiAgICAnY3Nrc2M1NjAxMTk4Nyc6ICdjcDk0OScsXG4gICAgJ2V1Y2tyJzogJ2NwOTQ5JyxcbiAgICAnaXNvaXIxNDknOiAnY3A5NDknLFxuICAgICdrb3JlYW4nOiAnY3A5NDknLFxuICAgICdrc2M1NjAxMTk4Nyc6ICdjcDk0OScsXG4gICAgJ2tzYzU2MDExOTg5JzogJ2NwOTQ5JyxcbiAgICAna3NjNTYwMSc6ICdjcDk0OScsXG5cblxuICAgIC8vID09IEJpZzUvVGFpd2FuL0hvbmcgS29uZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBUaGVyZSBhcmUgbG90cyBvZiB0YWJsZXMgZm9yIEJpZzUgYW5kIGNwOTUwLiBQbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgbGlua3MgZm9yIGhpc3Rvcnk6XG4gICAgLy8gaHR0cDovL21venR3Lm9yZy9kb2NzL2JpZzUvICBodHRwOi8vd3d3LmhhaWJsZS5kZS9icnVuby9jaGFyc2V0cy9jb252ZXJzaW9uLXRhYmxlcy9CaWc1Lmh0bWxcbiAgICAvLyBWYXJpYXRpb25zLCBpbiByb3VnaGx5IG51bWJlciBvZiBkZWZpbmVkIGNoYXJzOlxuICAgIC8vICAqIFdpbmRvd3MgQ1AgOTUwOiBNaWNyb3NvZnQgdmFyaWFudCBvZiBCaWc1LiBDYW5vbmljYWw6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5NTAuVFhUXG4gICAgLy8gICogV2luZG93cyBDUCA5NTE6IE1pY3Jvc29mdCB2YXJpYW50IG9mIEJpZzUtSEtTQ1MtMjAwMS4gU2VlbXMgdG8gYmUgbmV2ZXIgcHVibGljLiBodHRwOi8vbWUuYWJlbGNoZXVuZy5vcmcvYXJ0aWNsZXMvcmVzZWFyY2gvd2hhdC1pcy1jcDk1MS9cbiAgICAvLyAgKiBCaWc1LTIwMDMgKFRhaXdhbiBzdGFuZGFyZCkgYWxtb3N0IHN1cGVyc2V0IG9mIGNwOTUwLlxuICAgIC8vICAqIFVuaWNvZGUtYXQtb24gKFVBTykgLyBNb3ppbGxhIDEuOC4gRmFsbGluZyBvdXQgb2YgdXNlIG9uIHRoZSBXZWIuIE5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgYnJvd3NlcnMuXG4gICAgLy8gICogQmlnNS1IS1NDUyAoLTIwMDEsIC0yMDA0LCAtMjAwOCkuIEhvbmcgS29uZyBzdGFuZGFyZC4gXG4gICAgLy8gICAgbWFueSB1bmljb2RlIGNvZGUgcG9pbnRzIG1vdmVkIGZyb20gUFVBIHRvIFN1cHBsZW1lbnRhcnkgcGxhbmUgKFUrMlhYWFgpIG92ZXIgdGhlIHllYXJzLlxuICAgIC8vICAgIFBsdXMsIGl0IGhhcyA0IGNvbWJpbmluZyBzZXF1ZW5jZXMuXG4gICAgLy8gICAgU2VlbXMgdGhhdCBNb3ppbGxhIHJlZnVzZWQgdG8gc3VwcG9ydCBpdCBmb3IgMTAgeXJzLiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjI0MzEgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzEwMjk5XG4gICAgLy8gICAgYmVjYXVzZSBiaWc1LWhrc2NzIGlzIHRoZSBvbmx5IGVuY29kaW5nIHRvIGluY2x1ZGUgYXN0cmFsIGNoYXJhY3RlcnMgaW4gbm9uLWFsZ29yaXRobWljIHdheS5cbiAgICAvLyAgICBJbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCBjb25zaXN0ZW50IHdpdGhpbiBicm93c2Vyczsgc29tZXRpbWVzIGxhYmVsZWQgYXMganVzdCBiaWc1LlxuICAgIC8vICAgIE1TIEludGVybmV0IEV4cGxvcmVyIHN3aXRjaGVzIGZyb20gYmlnNSB0byBiaWc1LWhrc2NzIHdoZW4gYSBwYXRjaCBhcHBsaWVkLlxuICAgIC8vICAgIEdyZWF0IGRpc2N1c3Npb24gJiByZWNhcCBvZiB3aGF0J3MgZ29pbmcgb24gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTEyNDcwI2MzMVxuICAgIC8vICAgIEluIHRoZSBlbmNvZGVyLCBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIHN1cHBvcnQgZW5jb2Rpbmcgb2xkIFBVQSBtYXBwaW5ncyB0byBCaWc1IGJ5dGVzIHNlcS1zLlxuICAgIC8vICAgIE9mZmljaWFsIHNwZWM6IGh0dHA6Ly93d3cub2djaW8uZ292LmhrL2VuL2J1c2luZXNzL3RlY2hfcHJvbW90aW9uL2NjbGkvdGVybXMvZG9jLzIwMDNjbXBfMjAwOC50eHRcbiAgICAvLyAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lm9nY2lvLmdvdi5oay90Yy9idXNpbmVzcy90ZWNoX3Byb21vdGlvbi9jY2xpL3Rlcm1zL2RvYy9oa3Njcy0yMDA4LWJpZzUtaXNvLnR4dFxuICAgIC8vIFxuICAgIC8vIEN1cnJlbnQgdW5kZXJzdGFuZGluZyBvZiBob3cgdG8gZGVhbCB3aXRoIEJpZzUoLUhLU0NTKSBpcyBpbiB0aGUgRW5jb2RpbmcgU3RhbmRhcmQsIGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2JpZzUtZW5jb2RlclxuICAgIC8vIFVuaWNvZGUgbWFwcGluZyAoaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvT0JTT0xFVEUvRUFTVEFTSUEvT1RIRVIvQklHNS5UWFQpIGlzIHNhaWQgdG8gYmUgd3JvbmcuXG5cbiAgICAnd2luZG93czk1MCc6ICdjcDk1MCcsXG4gICAgJ21zOTUwJzogJ2NwOTUwJyxcbiAgICAnOTUwJzogJ2NwOTUwJyxcbiAgICAnY3A5NTAnOiB7XG4gICAgICAgIHR5cGU6ICdfZGJjcycsXG4gICAgICAgIHRhYmxlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL2NwOTUwLmpzb24nKSB9LFxuICAgIH0sXG5cbiAgICAvLyBCaWc1IGhhcyBtYW55IHZhcmlhdGlvbnMgYW5kIGlzIGFuIGV4dGVuc2lvbiBvZiBjcDk1MC4gV2UgdXNlIEVuY29kaW5nIFN0YW5kYXJkJ3MgYXMgYSBjb25zZW5zdXMuXG4gICAgJ2JpZzUnOiAnYmlnNWhrc2NzJyxcbiAgICAnYmlnNWhrc2NzJzoge1xuICAgICAgICB0eXBlOiAnX2RiY3MnLFxuICAgICAgICB0YWJsZTogZnVuY3Rpb24oKSB7IHJldHVybiByZXF1aXJlKCcuL3RhYmxlcy9jcDk1MC5qc29uJykuY29uY2F0KHJlcXVpcmUoJy4vdGFibGVzL2JpZzUtYWRkZWQuanNvbicpKSB9LFxuICAgICAgICBlbmNvZGVTa2lwVmFsczogWzB4YTJjY10sXG4gICAgfSxcblxuICAgICdjbmJpZzUnOiAnYmlnNWhrc2NzJyxcbiAgICAnY3NiaWc1JzogJ2JpZzVoa3NjcycsXG4gICAgJ3h4YmlnNSc6ICdiaWc1aGtzY3MnLFxufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLy8gVXBkYXRlIHRoaXMgYXJyYXkgaWYgeW91IGFkZC9yZW5hbWUvcmVtb3ZlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5LlxuLy8gV2Ugc3VwcG9ydCBCcm93c2VyaWZ5IGJ5IHNraXBwaW5nIGF1dG9tYXRpYyBtb2R1bGUgZGlzY292ZXJ5IGFuZCByZXF1aXJpbmcgbW9kdWxlcyBkaXJlY3RseS5cbnZhciBtb2R1bGVzID0gW1xuICAgIHJlcXVpcmUoXCIuL2ludGVybmFsXCIpLFxuICAgIHJlcXVpcmUoXCIuL3V0ZjE2XCIpLFxuICAgIHJlcXVpcmUoXCIuL3V0ZjdcIiksXG4gICAgcmVxdWlyZShcIi4vc2Jjcy1jb2RlY1wiKSxcbiAgICByZXF1aXJlKFwiLi9zYmNzLWRhdGFcIiksXG4gICAgcmVxdWlyZShcIi4vc2Jjcy1kYXRhLWdlbmVyYXRlZFwiKSxcbiAgICByZXF1aXJlKFwiLi9kYmNzLWNvZGVjXCIpLFxuICAgIHJlcXVpcmUoXCIuL2RiY3MtZGF0YVwiKSxcbl07XG5cbi8vIFB1dCBhbGwgZW5jb2RpbmcvYWxpYXMvY29kZWMgZGVmaW5pdGlvbnMgdG8gc2luZ2xlIG9iamVjdCBhbmQgZXhwb3J0IGl0LiBcbmZvciAodmFyIGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtb2R1bGUgPSBtb2R1bGVzW2ldO1xuICAgIGZvciAodmFyIGVuYyBpbiBtb2R1bGUpXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kdWxlLCBlbmMpKVxuICAgICAgICAgICAgZXhwb3J0c1tlbmNdID0gbW9kdWxlW2VuY107XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKFwiYnVmZmVyXCIpLkJ1ZmZlcixcbiAgICBUcmFuc2Zvcm0gPSByZXF1aXJlKFwic3RyZWFtXCIpLlRyYW5zZm9ybTtcblxuXG4vLyA9PSBFeHBvcnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpY29udikge1xuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgUHVibGljIEFQSS5cbiAgICBpY29udi5lbmNvZGVTdHJlYW0gPSBmdW5jdGlvbiBlbmNvZGVTdHJlYW0oZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJY29udkxpdGVFbmNvZGVyU3RyZWFtKGljb252LmdldEVuY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpY29udi5kZWNvZGVTdHJlYW0gPSBmdW5jdGlvbiBkZWNvZGVTdHJlYW0oZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJY29udkxpdGVEZWNvZGVyU3RyZWFtKGljb252LmdldERlY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpY29udi5zdXBwb3J0c1N0cmVhbXMgPSB0cnVlO1xuXG5cbiAgICAvLyBOb3QgcHVibGlzaGVkIHlldC5cbiAgICBpY29udi5JY29udkxpdGVFbmNvZGVyU3RyZWFtID0gSWNvbnZMaXRlRW5jb2RlclN0cmVhbTtcbiAgICBpY29udi5JY29udkxpdGVEZWNvZGVyU3RyZWFtID0gSWNvbnZMaXRlRGVjb2RlclN0cmVhbTtcbiAgICBpY29udi5fY29sbGVjdCA9IEljb252TGl0ZURlY29kZXJTdHJlYW0ucHJvdG90eXBlLmNvbGxlY3Q7XG59O1xuXG5cbi8vID09IEVuY29kZXIgc3RyZWFtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIEljb252TGl0ZUVuY29kZXJTdHJlYW0oY29udiwgb3B0aW9ucykge1xuICAgIHRoaXMuY29udiA9IGNvbnY7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gZmFsc2U7IC8vIFdlIGFjY2VwdCBvbmx5IHN0cmluZ3MsIHNvIHdlIGRvbid0IG5lZWQgdG8gZGVjb2RlIHRoZW0uXG4gICAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cbkljb252TGl0ZUVuY29kZXJTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShUcmFuc2Zvcm0ucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHsgdmFsdWU6IEljb252TGl0ZUVuY29kZXJTdHJlYW0gfVxufSk7XG5cbkljb252TGl0ZUVuY29kZXJTdHJlYW0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGRvbmUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rICE9ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gZG9uZShuZXcgRXJyb3IoXCJJY29udiBlbmNvZGluZyBzdHJlYW0gbmVlZHMgc3RyaW5ncyBhcyBpdHMgaW5wdXQuXCIpKTtcbiAgICB0cnkge1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5jb252LndyaXRlKGNodW5rKTtcbiAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoKSB0aGlzLnB1c2gocmVzKTtcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBkb25lKGUpO1xuICAgIH1cbn1cblxuSWNvbnZMaXRlRW5jb2RlclN0cmVhbS5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24oZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmNvbnYuZW5kKCk7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCkgdGhpcy5wdXNoKHJlcyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZG9uZShlKTtcbiAgICB9XG59XG5cbkljb252TGl0ZUVuY29kZXJTdHJlYW0ucHJvdG90eXBlLmNvbGxlY3QgPSBmdW5jdGlvbihjYikge1xuICAgIHZhciBjaHVua3MgPSBbXTtcbiAgICB0aGlzLm9uKCdlcnJvcicsIGNiKTtcbiAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24oY2h1bmspIHsgY2h1bmtzLnB1c2goY2h1bmspOyB9KTtcbiAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY2IobnVsbCwgQnVmZmVyLmNvbmNhdChjaHVua3MpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vLyA9PSBEZWNvZGVyIHN0cmVhbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5mdW5jdGlvbiBJY29udkxpdGVEZWNvZGVyU3RyZWFtKGNvbnYsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmNvbnYgPSBjb252O1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuZW5jb2RpbmcgPSB0aGlzLmVuY29kaW5nID0gJ3V0ZjgnOyAvLyBXZSBvdXRwdXQgc3RyaW5ncy5cbiAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybS5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogSWNvbnZMaXRlRGVjb2RlclN0cmVhbSB9XG59KTtcblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgZG9uZSkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSlcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEVycm9yKFwiSWNvbnYgZGVjb2Rpbmcgc3RyZWFtIG5lZWRzIGJ1ZmZlcnMgYXMgaXRzIGlucHV0LlwiKSk7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuY29udi53cml0ZShjaHVuayk7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCkgdGhpcy5wdXNoKHJlcywgdGhpcy5lbmNvZGluZyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZG9uZShlKTtcbiAgICB9XG59XG5cbkljb252TGl0ZURlY29kZXJTdHJlYW0ucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5jb252LmVuZCgpO1xuICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGgpIHRoaXMucHVzaChyZXMsIHRoaXMuZW5jb2RpbmcpOyAgICAgICAgICAgICAgICBcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBkb25lKGUpO1xuICAgIH1cbn1cblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUuY29sbGVjdCA9IGZ1bmN0aW9uKGNiKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHRoaXMub24oJ2Vycm9yJywgY2IpO1xuICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykgeyByZXMgKz0gY2h1bms7IH0pO1xuICAgIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBjYihudWxsLCByZXMpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQnVmZmVyID0gcmVxdWlyZShcImJ1ZmZlclwiKS5CdWZmZXI7XG4vLyBOb3RlOiBub3QgcG9seWZpbGxlZCB3aXRoIHNhZmVyLWJ1ZmZlciBvbiBhIHB1cnBvc2UsIGFzIG92ZXJyaWRlcyBCdWZmZXJcblxuLy8gPT0gRXh0ZW5kIE5vZGUgcHJpbWl0aXZlcyB0byB1c2UgaWNvbnYtbGl0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaWNvbnYpIHtcbiAgICB2YXIgb3JpZ2luYWwgPSB1bmRlZmluZWQ7IC8vIFBsYWNlIHRvIGtlZXAgb3JpZ2luYWwgbWV0aG9kcy5cblxuICAgIC8vIE5vZGUgYXV0aG9ycyByZXdyb3RlIEJ1ZmZlciBpbnRlcm5hbHMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGhcbiAgICAvLyBVaW50OEFycmF5IGFuZCB3ZSBjYW5ub3QgcGF0Y2gga2V5IGZ1bmN0aW9ucyBzaW5jZSB0aGVuLlxuICAgIC8vIE5vdGU6IHRoaXMgZG9lcyB1c2Ugb2xkZXIgQnVmZmVyIEFQSSBvbiBhIHB1cnBvc2VcbiAgICBpY29udi5zdXBwb3J0c05vZGVFbmNvZGluZ3NFeHRlbnNpb24gPSAhKEJ1ZmZlci5mcm9tIHx8IG5ldyBCdWZmZXIoMCkgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcblxuICAgIGljb252LmV4dGVuZE5vZGVFbmNvZGluZ3MgPSBmdW5jdGlvbiBleHRlbmROb2RlRW5jb2RpbmdzKCkge1xuICAgICAgICBpZiAob3JpZ2luYWwpIHJldHVybjtcbiAgICAgICAgb3JpZ2luYWwgPSB7fTtcblxuICAgICAgICBpZiAoIWljb252LnN1cHBvcnRzTm9kZUVuY29kaW5nc0V4dGVuc2lvbikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkFDVElPTiBORUVERUQ6IHJlcXVpcmUoJ2ljb252LWxpdGUnKS5leHRlbmROb2RlRW5jb2RpbmdzKCkgaXMgbm90IHN1cHBvcnRlZCBpbiB5b3VyIHZlcnNpb24gb2YgTm9kZVwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTZWUgbW9yZSBpbmZvIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hc2h0dWNoa2luL2ljb252LWxpdGUvd2lraS9Ob2RlLXY0LWNvbXBhdGliaWxpdHlcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9kZU5hdGl2ZUVuY29kaW5ncyA9IHtcbiAgICAgICAgICAgICdoZXgnOiB0cnVlLCAndXRmOCc6IHRydWUsICd1dGYtOCc6IHRydWUsICdhc2NpaSc6IHRydWUsICdiaW5hcnknOiB0cnVlLCBcbiAgICAgICAgICAgICdiYXNlNjQnOiB0cnVlLCAndWNzMic6IHRydWUsICd1Y3MtMic6IHRydWUsICd1dGYxNmxlJzogdHJ1ZSwgJ3V0Zi0xNmxlJzogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICBCdWZmZXIuaXNOYXRpdmVFbmNvZGluZyA9IGZ1bmN0aW9uKGVuYykge1xuICAgICAgICAgICAgcmV0dXJuIGVuYyAmJiBub2RlTmF0aXZlRW5jb2RpbmdzW2VuYy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tIFNsb3dCdWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdmFyIFNsb3dCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5TbG93QnVmZmVyO1xuXG4gICAgICAgIG9yaWdpbmFsLlNsb3dCdWZmZXJUb1N0cmluZyA9IFNsb3dCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgICAgICBTbG93QnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG4gICAgICAgICAgICBpZiAoQnVmZmVyLmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5TbG93QnVmZmVyVG9TdHJpbmcuY2FsbCh0aGlzLCBlbmNvZGluZywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdXNlIG91ciBkZWNvZGluZyBtZXRob2QuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0YXJ0ID09ICd1bmRlZmluZWQnKSBzdGFydCA9IDA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVuZCA9PSAndW5kZWZpbmVkJykgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gaWNvbnYuZGVjb2RlKHRoaXMuc2xpY2Uoc3RhcnQsIGVuZCksIGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9yaWdpbmFsLlNsb3dCdWZmZXJXcml0ZSA9IFNsb3dCdWZmZXIucHJvdG90eXBlLndyaXRlO1xuICAgICAgICBTbG93QnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gICAgICAgICAgICAvLyBTdXBwb3J0IGJvdGggKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKVxuICAgICAgICAgICAgLy8gYW5kIHRoZSBsZWdhY3kgKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKVxuICAgICAgICAgICAgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBsZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgeyAgLy8gbGVnYWN5XG4gICAgICAgICAgICAgICAgdmFyIHN3YXAgPSBlbmNvZGluZztcbiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBsZW5ndGg7XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gc3dhcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2Zmc2V0ID0gK29mZnNldCB8fCAwO1xuICAgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9ICtsZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAvLyBVc2UgbmF0aXZlIGNvbnZlcnNpb24gd2hlbiBwb3NzaWJsZVxuICAgICAgICAgICAgaWYgKEJ1ZmZlci5pc05hdGl2ZUVuY29kaW5nKGVuY29kaW5nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuU2xvd0J1ZmZlcldyaXRlLmNhbGwodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpO1xuXG4gICAgICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2F0dGVtcHQgdG8gd3JpdGUgYmV5b25kIGJ1ZmZlciBib3VuZHMnKTtcblxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB1c2Ugb3VyIGVuY29kaW5nIG1ldGhvZC5cbiAgICAgICAgICAgIHZhciBidWYgPSBpY29udi5lbmNvZGUoc3RyaW5nLCBlbmNvZGluZyk7XG4gICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCA8IGxlbmd0aCkgbGVuZ3RoID0gYnVmLmxlbmd0aDtcbiAgICAgICAgICAgIGJ1Zi5jb3B5KHRoaXMsIG9mZnNldCwgMCwgbGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLSBCdWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgb3JpZ2luYWwuQnVmZmVySXNFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nO1xuICAgICAgICBCdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpIHx8IGljb252LmVuY29kaW5nRXhpc3RzKGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9yaWdpbmFsLkJ1ZmZlckJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgQnVmZmVyLmJ5dGVMZW5ndGggPSBTbG93QnVmZmVyLmJ5dGVMZW5ndGggPSBmdW5jdGlvbihzdHIsIGVuY29kaW5nKSB7XG4gICAgICAgICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG4gICAgICAgICAgICBpZiAoQnVmZmVyLmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5CdWZmZXJCeXRlTGVuZ3RoLmNhbGwodGhpcywgc3RyLCBlbmNvZGluZyk7XG5cbiAgICAgICAgICAgIC8vIFNsb3csIEkga25vdywgYnV0IHdlIGRvbid0IGhhdmUgYSBiZXR0ZXIgd2F5IHlldC5cbiAgICAgICAgICAgIHJldHVybiBpY29udi5lbmNvZGUoc3RyLCBlbmNvZGluZykubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgb3JpZ2luYWwuQnVmZmVyVG9TdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgICAgICBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcbiAgICAgICAgICAgIGlmIChCdWZmZXIuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLkJ1ZmZlclRvU3RyaW5nLmNhbGwodGhpcywgZW5jb2RpbmcsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSBvdXIgZGVjb2RpbmcgbWV0aG9kLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdGFydCA9PSAndW5kZWZpbmVkJykgc3RhcnQgPSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmQgPT0gJ3VuZGVmaW5lZCcpIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIGljb252LmRlY29kZSh0aGlzLnNsaWNlKHN0YXJ0LCBlbmQpLCBlbmNvZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBvcmlnaW5hbC5CdWZmZXJXcml0ZSA9IEJ1ZmZlci5wcm90b3R5cGUud3JpdGU7XG4gICAgICAgIEJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAgICAgICAgICAgdmFyIF9vZmZzZXQgPSBvZmZzZXQsIF9sZW5ndGggPSBsZW5ndGgsIF9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgICAgICAgLy8gU3VwcG9ydCBib3RoIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZylcbiAgICAgICAgICAgIC8vIGFuZCB0aGUgbGVnYWN5IChzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aClcbiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgIC8vIGxlZ2FjeVxuICAgICAgICAgICAgICAgIHZhciBzd2FwID0gZW5jb2Rpbmc7XG4gICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN3YXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcbiAgICAgICAgICAgIGlmIChCdWZmZXIuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLkJ1ZmZlcldyaXRlLmNhbGwodGhpcywgc3RyaW5nLCBfb2Zmc2V0LCBfbGVuZ3RoLCBfZW5jb2RpbmcpO1xuXG4gICAgICAgICAgICBvZmZzZXQgPSArb2Zmc2V0IHx8IDA7XG4gICAgICAgICAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gK2xlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXR0ZW1wdCB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGJvdW5kcycpO1xuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSBvdXIgZW5jb2RpbmcgbWV0aG9kLlxuICAgICAgICAgICAgdmFyIGJ1ZiA9IGljb252LmVuY29kZShzdHJpbmcsIGVuY29kaW5nKTtcbiAgICAgICAgICAgIGlmIChidWYubGVuZ3RoIDwgbGVuZ3RoKSBsZW5ndGggPSBidWYubGVuZ3RoO1xuICAgICAgICAgICAgYnVmLmNvcHkodGhpcywgb2Zmc2V0LCAwLCBsZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDtcblxuICAgICAgICAgICAgLy8gVE9ETzogU2V0IF9jaGFyc1dyaXR0ZW4uXG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIC0tIFJlYWRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgaWYgKGljb252LnN1cHBvcnRzU3RyZWFtcykge1xuICAgICAgICAgICAgdmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnc3RyZWFtJykuUmVhZGFibGU7XG5cbiAgICAgICAgICAgIG9yaWdpbmFsLlJlYWRhYmxlU2V0RW5jb2RpbmcgPSBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc7XG4gICAgICAgICAgICBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXRFbmNvZGluZyhlbmMsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2Ugb3VyIG93biBkZWNvZGVyLCBpdCBoYXMgdGhlIHNhbWUgaW50ZXJmYWNlLlxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCB1c2Ugb3JpZ2luYWwgZnVuY3Rpb24gYXMgaXQgZG9lc24ndCBoYW5kbGUgQk9NLXMuXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gaWNvbnYuZ2V0RGVjb2RlcihlbmMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFJlYWRhYmxlLnByb3RvdHlwZS5jb2xsZWN0ID0gaWNvbnYuX2NvbGxlY3Q7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgaWNvbnYtbGl0ZSBOb2RlIHByaW1pdGl2ZSBleHRlbnNpb25zLlxuICAgIGljb252LnVuZG9FeHRlbmROb2RlRW5jb2RpbmdzID0gZnVuY3Rpb24gdW5kb0V4dGVuZE5vZGVFbmNvZGluZ3MoKSB7XG4gICAgICAgIGlmICghaWNvbnYuc3VwcG9ydHNOb2RlRW5jb2RpbmdzRXh0ZW5zaW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoIW9yaWdpbmFsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVxdWlyZSgnaWNvbnYtbGl0ZScpLnVuZG9FeHRlbmROb2RlRW5jb2RpbmdzKCk6IE5vdGhpbmcgdG8gdW5kbzsgZXh0ZW5kTm9kZUVuY29kaW5ncygpIGlzIG5vdCBjYWxsZWQuXCIpXG5cbiAgICAgICAgZGVsZXRlIEJ1ZmZlci5pc05hdGl2ZUVuY29kaW5nO1xuXG4gICAgICAgIHZhciBTbG93QnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuU2xvd0J1ZmZlcjtcblxuICAgICAgICBTbG93QnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IG9yaWdpbmFsLlNsb3dCdWZmZXJUb1N0cmluZztcbiAgICAgICAgU2xvd0J1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBvcmlnaW5hbC5TbG93QnVmZmVyV3JpdGU7XG5cbiAgICAgICAgQnVmZmVyLmlzRW5jb2RpbmcgPSBvcmlnaW5hbC5CdWZmZXJJc0VuY29kaW5nO1xuICAgICAgICBCdWZmZXIuYnl0ZUxlbmd0aCA9IG9yaWdpbmFsLkJ1ZmZlckJ5dGVMZW5ndGg7XG4gICAgICAgIEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBvcmlnaW5hbC5CdWZmZXJUb1N0cmluZztcbiAgICAgICAgQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IG9yaWdpbmFsLkJ1ZmZlcldyaXRlO1xuXG4gICAgICAgIGlmIChpY29udi5zdXBwb3J0c1N0cmVhbXMpIHtcbiAgICAgICAgICAgIHZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJ3N0cmVhbScpLlJlYWRhYmxlO1xuXG4gICAgICAgICAgICBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBvcmlnaW5hbC5SZWFkYWJsZVNldEVuY29kaW5nO1xuICAgICAgICAgICAgZGVsZXRlIFJlYWRhYmxlLnByb3RvdHlwZS5jb2xsZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgb3JpZ2luYWwgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vLyBTb21lIGVudmlyb25tZW50cyBkb24ndCBoYXZlIGdsb2JhbCBCdWZmZXIgKGUuZy4gUmVhY3QgTmF0aXZlKS5cbi8vIFNvbHV0aW9uIHdvdWxkIGJlIGluc3RhbGxpbmcgbnBtIG1vZHVsZXMgXCJidWZmZXJcIiBhbmQgXCJzdHJlYW1cIiBleHBsaWNpdGx5LlxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoXCJzYWZlci1idWZmZXJcIikuQnVmZmVyO1xuXG52YXIgYm9tSGFuZGxpbmcgPSByZXF1aXJlKFwiLi9ib20taGFuZGxpbmdcIiksXG4gICAgaWNvbnYgPSBtb2R1bGUuZXhwb3J0cztcblxuLy8gQWxsIGNvZGVjcyBhbmQgYWxpYXNlcyBhcmUga2VwdCBoZXJlLCBrZXllZCBieSBlbmNvZGluZyBuYW1lL2FsaWFzLlxuLy8gVGhleSBhcmUgbGF6eSBsb2FkZWQgaW4gYGljb252LmdldENvZGVjYCBmcm9tIGBlbmNvZGluZ3MvaW5kZXguanNgLlxuaWNvbnYuZW5jb2RpbmdzID0gbnVsbDtcblxuLy8gQ2hhcmFjdGVycyBlbWl0dGVkIGluIGNhc2Ugb2YgZXJyb3IuXG5pY29udi5kZWZhdWx0Q2hhclVuaWNvZGUgPSAnXHVGRkZEJztcbmljb252LmRlZmF1bHRDaGFyU2luZ2xlQnl0ZSA9ICc/JztcblxuLy8gUHVibGljIEFQSS5cbmljb252LmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIsIGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgc3RyID0gXCJcIiArIChzdHIgfHwgXCJcIik7IC8vIEVuc3VyZSBzdHJpbmcuXG5cbiAgICB2YXIgZW5jb2RlciA9IGljb252LmdldEVuY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpO1xuXG4gICAgdmFyIHJlcyA9IGVuY29kZXIud3JpdGUoc3RyKTtcbiAgICB2YXIgdHJhaWwgPSBlbmNvZGVyLmVuZCgpO1xuICAgIFxuICAgIHJldHVybiAodHJhaWwgJiYgdHJhaWwubGVuZ3RoID4gMCkgPyBCdWZmZXIuY29uY2F0KFtyZXMsIHRyYWlsXSkgOiByZXM7XG59XG5cbmljb252LmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShidWYsIGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBidWYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghaWNvbnYuc2tpcERlY29kZVdhcm5pbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ljb252LWxpdGUgd2FybmluZzogZGVjb2RlKCktaW5nIHN0cmluZ3MgaXMgZGVwcmVjYXRlZC4gUmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL2FzaHR1Y2hraW4vaWNvbnYtbGl0ZS93aWtpL1VzZS1CdWZmZXJzLXdoZW4tZGVjb2RpbmcnKTtcbiAgICAgICAgICAgIGljb252LnNraXBEZWNvZGVXYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKFwiXCIgKyAoYnVmIHx8IFwiXCIpLCBcImJpbmFyeVwiKTsgLy8gRW5zdXJlIGJ1ZmZlci5cbiAgICB9XG5cbiAgICB2YXIgZGVjb2RlciA9IGljb252LmdldERlY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpO1xuXG4gICAgdmFyIHJlcyA9IGRlY29kZXIud3JpdGUoYnVmKTtcbiAgICB2YXIgdHJhaWwgPSBkZWNvZGVyLmVuZCgpO1xuXG4gICAgcmV0dXJuIHRyYWlsID8gKHJlcyArIHRyYWlsKSA6IHJlcztcbn1cblxuaWNvbnYuZW5jb2RpbmdFeGlzdHMgPSBmdW5jdGlvbiBlbmNvZGluZ0V4aXN0cyhlbmMpIHtcbiAgICB0cnkge1xuICAgICAgICBpY29udi5nZXRDb2RlYyhlbmMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIExlZ2FjeSBhbGlhc2VzIHRvIGNvbnZlcnQgZnVuY3Rpb25zXG5pY29udi50b0VuY29kaW5nID0gaWNvbnYuZW5jb2RlO1xuaWNvbnYuZnJvbUVuY29kaW5nID0gaWNvbnYuZGVjb2RlO1xuXG4vLyBTZWFyY2ggZm9yIGEgY29kZWMgaW4gaWNvbnYuZW5jb2RpbmdzLiBDYWNoZSBjb2RlYyBkYXRhIGluIGljb252Ll9jb2RlY0RhdGFDYWNoZS5cbmljb252Ll9jb2RlY0RhdGFDYWNoZSA9IHt9O1xuaWNvbnYuZ2V0Q29kZWMgPSBmdW5jdGlvbiBnZXRDb2RlYyhlbmNvZGluZykge1xuICAgIGlmICghaWNvbnYuZW5jb2RpbmdzKVxuICAgICAgICBpY29udi5lbmNvZGluZ3MgPSByZXF1aXJlKFwiLi4vZW5jb2RpbmdzXCIpOyAvLyBMYXp5IGxvYWQgYWxsIGVuY29kaW5nIGRlZmluaXRpb25zLlxuICAgIFxuICAgIC8vIENhbm9uaWNhbGl6ZSBlbmNvZGluZyBuYW1lOiBzdHJpcCBhbGwgbm9uLWFscGhhbnVtZXJpYyBjaGFycyBhbmQgYXBwZW5kZWQgeWVhci5cbiAgICB2YXIgZW5jID0gaWNvbnYuX2Nhbm9uaWNhbGl6ZUVuY29kaW5nKGVuY29kaW5nKTtcblxuICAgIC8vIFRyYXZlcnNlIGljb252LmVuY29kaW5ncyB0byBmaW5kIGFjdHVhbCBjb2RlYy5cbiAgICB2YXIgY29kZWNPcHRpb25zID0ge307XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGNvZGVjID0gaWNvbnYuX2NvZGVjRGF0YUNhY2hlW2VuY107XG4gICAgICAgIGlmIChjb2RlYylcbiAgICAgICAgICAgIHJldHVybiBjb2RlYztcblxuICAgICAgICB2YXIgY29kZWNEZWYgPSBpY29udi5lbmNvZGluZ3NbZW5jXTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBjb2RlY0RlZikge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOiAvLyBEaXJlY3QgYWxpYXMgdG8gb3RoZXIgZW5jb2RpbmcuXG4gICAgICAgICAgICAgICAgZW5jID0gY29kZWNEZWY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjogLy8gQWxpYXMgd2l0aCBvcHRpb25zLiBDYW4gYmUgbGF5ZXJlZC5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29kZWNEZWYpXG4gICAgICAgICAgICAgICAgICAgIGNvZGVjT3B0aW9uc1trZXldID0gY29kZWNEZWZba2V5XTtcblxuICAgICAgICAgICAgICAgIGlmICghY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSA9IGVuYztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBlbmMgPSBjb2RlY0RlZi50eXBlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjogLy8gQ29kZWMgaXRzZWxmLlxuICAgICAgICAgICAgICAgIGlmICghY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSA9IGVuYztcblxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb2RlYyBmdW5jdGlvbiBtdXN0IGxvYWQgYWxsIHRhYmxlcyBhbmQgcmV0dXJuIG9iamVjdCB3aXRoIC5lbmNvZGVyIGFuZCAuZGVjb2RlciBtZXRob2RzLlxuICAgICAgICAgICAgICAgIC8vIEl0J2xsIGJlIGNhbGxlZCBvbmx5IG9uY2UgKGZvciBlYWNoIGRpZmZlcmVudCBvcHRpb25zIG9iamVjdCkuXG4gICAgICAgICAgICAgICAgY29kZWMgPSBuZXcgY29kZWNEZWYoY29kZWNPcHRpb25zLCBpY29udik7XG5cbiAgICAgICAgICAgICAgICBpY29udi5fY29kZWNEYXRhQ2FjaGVbY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZV0gPSBjb2RlYzsgLy8gU2F2ZSBpdCB0byBiZSByZXVzZWQgbGF0ZXIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVjO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY29kaW5nIG5vdCByZWNvZ25pemVkOiAnXCIgKyBlbmNvZGluZyArIFwiJyAoc2VhcmNoZWQgYXM6ICdcIitlbmMrXCInKVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuaWNvbnYuX2Nhbm9uaWNhbGl6ZUVuY29kaW5nID0gZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgICAvLyBDYW5vbmljYWxpemUgZW5jb2RpbmcgbmFtZTogc3RyaXAgYWxsIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMgYW5kIGFwcGVuZGVkIHllYXIuXG4gICAgcmV0dXJuICgnJytlbmNvZGluZykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC86XFxkezR9JHxbXjAtOWEtel0vZywgXCJcIik7XG59XG5cbmljb252LmdldEVuY29kZXIgPSBmdW5jdGlvbiBnZXRFbmNvZGVyKGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgdmFyIGNvZGVjID0gaWNvbnYuZ2V0Q29kZWMoZW5jb2RpbmcpLFxuICAgICAgICBlbmNvZGVyID0gbmV3IGNvZGVjLmVuY29kZXIob3B0aW9ucywgY29kZWMpO1xuXG4gICAgaWYgKGNvZGVjLmJvbUF3YXJlICYmIG9wdGlvbnMgJiYgb3B0aW9ucy5hZGRCT00pXG4gICAgICAgIGVuY29kZXIgPSBuZXcgYm9tSGFuZGxpbmcuUHJlcGVuZEJPTShlbmNvZGVyLCBvcHRpb25zKTtcblxuICAgIHJldHVybiBlbmNvZGVyO1xufVxuXG5pY29udi5nZXREZWNvZGVyID0gZnVuY3Rpb24gZ2V0RGVjb2RlcihlbmNvZGluZywgb3B0aW9ucykge1xuICAgIHZhciBjb2RlYyA9IGljb252LmdldENvZGVjKGVuY29kaW5nKSxcbiAgICAgICAgZGVjb2RlciA9IG5ldyBjb2RlYy5kZWNvZGVyKG9wdGlvbnMsIGNvZGVjKTtcblxuICAgIGlmIChjb2RlYy5ib21Bd2FyZSAmJiAhKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpcEJPTSA9PT0gZmFsc2UpKVxuICAgICAgICBkZWNvZGVyID0gbmV3IGJvbUhhbmRsaW5nLlN0cmlwQk9NKGRlY29kZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGRlY29kZXI7XG59XG5cblxuLy8gTG9hZCBleHRlbnNpb25zIGluIE5vZGUuIEFsbCBvZiB0aGVtIGFyZSBvbWl0dGVkIGluIEJyb3dzZXJpZnkgYnVpbGQgdmlhICdicm93c2VyJyBmaWVsZCBpbiBwYWNrYWdlLmpzb24uXG52YXIgbm9kZVZlciA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZTtcbmlmIChub2RlVmVyKSB7XG5cbiAgICAvLyBMb2FkIHN0cmVhbWluZyBzdXBwb3J0IGluIE5vZGUgdjAuMTArXG4gICAgdmFyIG5vZGVWZXJBcnIgPSBub2RlVmVyLnNwbGl0KFwiLlwiKS5tYXAoTnVtYmVyKTtcbiAgICBpZiAobm9kZVZlckFyclswXSA+IDAgfHwgbm9kZVZlckFyclsxXSA+PSAxMCkge1xuICAgICAgICByZXF1aXJlKFwiLi9zdHJlYW1zXCIpKGljb252KTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIE5vZGUgcHJpbWl0aXZlIGV4dGVuc2lvbnMuXG4gICAgcmVxdWlyZShcIi4vZXh0ZW5kLW5vZGVcIikoaWNvbnYpO1xufVxuXG5pZiAoXCJcdTAxMDBcIiAhPSBcIlxcdTAxMDBcIikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJpY29udi1saXRlIHdhcm5pbmc6IGphdmFzY3JpcHQgZmlsZXMgdXNlIGVuY29kaW5nIGRpZmZlcmVudCBmcm9tIHV0Zi04LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FzaHR1Y2hraW4vaWNvbnYtbGl0ZS93aWtpL0phdmFzY3JpcHQtc291cmNlLWZpbGUtZW5jb2RpbmdzIGZvciBtb3JlIGluZm8uXCIpO1xufVxuIiwgIi8qIVxuICogdW5waXBlXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB1bnBpcGVcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlcmUgYXJlIE5vZGUuanMgcGlwZS1saWtlIGRhdGEgbGlzdGVuZXJzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBoYXNQaXBlRGF0YUxpc3RlbmVycyhzdHJlYW0pIHtcbiAgdmFyIGxpc3RlbmVycyA9IHN0cmVhbS5saXN0ZW5lcnMoJ2RhdGEnKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGxpc3RlbmVyc1tpXS5uYW1lID09PSAnb25kYXRhJykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBVbnBpcGUgYSBzdHJlYW0gZnJvbSBhbGwgZGVzdGluYXRpb25zLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB1bnBpcGUoc3RyZWFtKSB7XG4gIGlmICghc3RyZWFtKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyZWFtIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtLnVucGlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIG5ldy1zdHlsZVxuICAgIHN0cmVhbS51bnBpcGUoKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gTm9kZS5qcyAwLjggaGFja1xuICBpZiAoIWhhc1BpcGVEYXRhTGlzdGVuZXJzKHN0cmVhbSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBsaXN0ZW5lclxuICB2YXIgbGlzdGVuZXJzID0gc3RyZWFtLmxpc3RlbmVycygnY2xvc2UnKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV1cblxuICAgIGlmIChsaXN0ZW5lci5uYW1lICE9PSAnY2xlYW51cCcgJiYgbGlzdGVuZXIubmFtZSAhPT0gJ29uY2xvc2UnKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIGludm9rZSB0aGUgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci5jYWxsKHN0cmVhbSlcbiAgfVxufVxuIiwgIi8qIVxuICogcmF3LWJvZHlcbiAqIENvcHlyaWdodChjKSAyMDEzLTIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDIyIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgYXN5bmNIb29rcyA9IHRyeVJlcXVpcmVBc3luY0hvb2tzKClcbnZhciBieXRlcyA9IHJlcXVpcmUoJ2J5dGVzJylcbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJ2h0dHAtZXJyb3JzJylcbnZhciBpY29udiA9IHJlcXVpcmUoJ2ljb252LWxpdGUnKVxudmFyIHVucGlwZSA9IHJlcXVpcmUoJ3VucGlwZScpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRSYXdCb2R5XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIElDT05WX0VOQ09ESU5HX01FU1NBR0VfUkVHRVhQID0gL15FbmNvZGluZyBub3QgcmVjb2duaXplZDogL1xuXG4vKipcbiAqIEdldCB0aGUgZGVjb2RlciBmb3IgYSBnaXZlbiBlbmNvZGluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RGVjb2RlciAoZW5jb2RpbmcpIHtcbiAgaWYgKCFlbmNvZGluZykgcmV0dXJuIG51bGxcblxuICB0cnkge1xuICAgIHJldHVybiBpY29udi5nZXREZWNvZGVyKGVuY29kaW5nKVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZXJyb3IgZ2V0dGluZyBkZWNvZGVyXG4gICAgaWYgKCFJQ09OVl9FTkNPRElOR19NRVNTQUdFX1JFR0VYUC50ZXN0KGUubWVzc2FnZSkpIHRocm93IGVcblxuICAgIC8vIHRoZSBlbmNvZGluZyB3YXMgbm90IGZvdW5kXG4gICAgdGhyb3cgY3JlYXRlRXJyb3IoNDE1LCAnc3BlY2lmaWVkIGVuY29kaW5nIHVuc3VwcG9ydGVkJywge1xuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgdHlwZTogJ2VuY29kaW5nLnVuc3VwcG9ydGVkJ1xuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHJhdyBib2R5IG9mIGEgc3RyZWFtICh0eXBpY2FsbHkgSFRUUCkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHN0cmVhbVxuICogQHBhcmFtIHtvYmplY3R8c3RyaW5nfGZ1bmN0aW9ufSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja11cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBnZXRSYXdCb2R5IChzdHJlYW0sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBkb25lID0gY2FsbGJhY2tcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKG9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gc2hvcnQgY3V0IGZvciBlbmNvZGluZ1xuICAgIG9wdHMgPSB7XG4gICAgICBlbmNvZGluZzogb3B0aW9uc1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBvcHRpb25zXG4gICAgb3B0cyA9IHt9XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBjYWxsYmFjayBpcyBhIGZ1bmN0aW9uLCBpZiBwcm92aWRlZFxuICBpZiAoZG9uZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkb25lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgfVxuXG4gIC8vIHJlcXVpcmUgdGhlIGNhbGxiYWNrIHdpdGhvdXQgcHJvbWlzZXNcbiAgaWYgKCFkb25lICYmICFnbG9iYWwuUHJvbWlzZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IGNhbGxiYWNrIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIGdldCBlbmNvZGluZ1xuICB2YXIgZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nICE9PSB0cnVlXG4gICAgPyBvcHRzLmVuY29kaW5nXG4gICAgOiAndXRmLTgnXG5cbiAgLy8gY29udmVydCB0aGUgbGltaXQgdG8gYW4gaW50ZWdlclxuICB2YXIgbGltaXQgPSBieXRlcy5wYXJzZShvcHRzLmxpbWl0KVxuXG4gIC8vIGNvbnZlcnQgdGhlIGV4cGVjdGVkIGxlbmd0aCB0byBhbiBpbnRlZ2VyXG4gIHZhciBsZW5ndGggPSBvcHRzLmxlbmd0aCAhPSBudWxsICYmICFpc05hTihvcHRzLmxlbmd0aClcbiAgICA/IHBhcnNlSW50KG9wdHMubGVuZ3RoLCAxMClcbiAgICA6IG51bGxcblxuICBpZiAoZG9uZSkge1xuICAgIC8vIGNsYXNzaWMgY2FsbGJhY2sgc3R5bGVcbiAgICByZXR1cm4gcmVhZFN0cmVhbShzdHJlYW0sIGVuY29kaW5nLCBsZW5ndGgsIGxpbWl0LCB3cmFwKGRvbmUpKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGV4ZWN1dG9yIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWFkU3RyZWFtKHN0cmVhbSwgZW5jb2RpbmcsIGxlbmd0aCwgbGltaXQsIGZ1bmN0aW9uIG9uUmVhZCAoZXJyLCBidWYpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZShidWYpXG4gICAgfSlcbiAgfSlcbn1cblxuLyoqXG4gKiBIYWx0IGEgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaGFsdCAoc3RyZWFtKSB7XG4gIC8vIHVucGlwZSBldmVyeXRoaW5nIGZyb20gdGhlIHN0cmVhbVxuICB1bnBpcGUoc3RyZWFtKVxuXG4gIC8vIHBhdXNlIHN0cmVhbVxuICBpZiAodHlwZW9mIHN0cmVhbS5wYXVzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0cmVhbS5wYXVzZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBkYXRhIGZyb20gdGhlIHN0cmVhbS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gc3RyZWFtXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdFxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiByZWFkU3RyZWFtIChzdHJlYW0sIGVuY29kaW5nLCBsZW5ndGgsIGxpbWl0LCBjYWxsYmFjaykge1xuICB2YXIgY29tcGxldGUgPSBmYWxzZVxuICB2YXIgc3luYyA9IHRydWVcblxuICAvLyBjaGVjayB0aGUgbGVuZ3RoIGFuZCBsaW1pdCBvcHRpb25zLlxuICAvLyBub3RlOiB3ZSBpbnRlbnRpb25hbGx5IGxlYXZlIHRoZSBzdHJlYW0gcGF1c2VkLFxuICAvLyBzbyB1c2VycyBzaG91bGQgaGFuZGxlIHRoZSBzdHJlYW0gdGhlbXNlbHZlcy5cbiAgaWYgKGxpbWl0ICE9PSBudWxsICYmIGxlbmd0aCAhPT0gbnVsbCAmJiBsZW5ndGggPiBsaW1pdCkge1xuICAgIHJldHVybiBkb25lKGNyZWF0ZUVycm9yKDQxMywgJ3JlcXVlc3QgZW50aXR5IHRvbyBsYXJnZScsIHtcbiAgICAgIGV4cGVjdGVkOiBsZW5ndGgsXG4gICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgIHR5cGU6ICdlbnRpdHkudG9vLmxhcmdlJ1xuICAgIH0pKVxuICB9XG5cbiAgLy8gc3RyZWFtczE6IGFzc2VydCByZXF1ZXN0IGVuY29kaW5nIGlzIGJ1ZmZlci5cbiAgLy8gc3RyZWFtczIrOiBhc3NlcnQgdGhlIHN0cmVhbSBlbmNvZGluZyBpcyBidWZmZXIuXG4gIC8vICAgc3RyZWFtLl9kZWNvZGVyOiBzdHJlYW1zMVxuICAvLyAgIHN0YXRlLmVuY29kaW5nOiBzdHJlYW1zMlxuICAvLyAgIHN0YXRlLmRlY29kZXI6IHN0cmVhbXMyLCBzcGVjaWZpY2FsbHkgPCAwLjEwLjZcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGlmIChzdHJlYW0uX2RlY29kZXIgfHwgKHN0YXRlICYmIChzdGF0ZS5lbmNvZGluZyB8fCBzdGF0ZS5kZWNvZGVyKSkpIHtcbiAgICAvLyBkZXZlbG9wZXIgZXJyb3JcbiAgICByZXR1cm4gZG9uZShjcmVhdGVFcnJvcig1MDAsICdzdHJlYW0gZW5jb2Rpbmcgc2hvdWxkIG5vdCBiZSBzZXQnLCB7XG4gICAgICB0eXBlOiAnc3RyZWFtLmVuY29kaW5nLnNldCdcbiAgICB9KSlcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtLnJlYWRhYmxlICE9PSAndW5kZWZpbmVkJyAmJiAhc3RyZWFtLnJlYWRhYmxlKSB7XG4gICAgcmV0dXJuIGRvbmUoY3JlYXRlRXJyb3IoNTAwLCAnc3RyZWFtIGlzIG5vdCByZWFkYWJsZScsIHtcbiAgICAgIHR5cGU6ICdzdHJlYW0ubm90LnJlYWRhYmxlJ1xuICAgIH0pKVxuICB9XG5cbiAgdmFyIHJlY2VpdmVkID0gMFxuICB2YXIgZGVjb2RlclxuXG4gIHRyeSB7XG4gICAgZGVjb2RlciA9IGdldERlY29kZXIoZW5jb2RpbmcpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBkb25lKGVycilcbiAgfVxuXG4gIHZhciBidWZmZXIgPSBkZWNvZGVyXG4gICAgPyAnJ1xuICAgIDogW11cblxuICAvLyBhdHRhY2ggbGlzdGVuZXJzXG4gIHN0cmVhbS5vbignYWJvcnRlZCcsIG9uQWJvcnRlZClcbiAgc3RyZWFtLm9uKCdjbG9zZScsIGNsZWFudXApXG4gIHN0cmVhbS5vbignZGF0YScsIG9uRGF0YSlcbiAgc3RyZWFtLm9uKCdlbmQnLCBvbkVuZClcbiAgc3RyZWFtLm9uKCdlcnJvcicsIG9uRW5kKVxuXG4gIC8vIG1hcmsgc3luYyBzZWN0aW9uIGNvbXBsZXRlXG4gIHN5bmMgPSBmYWxzZVxuXG4gIGZ1bmN0aW9uIGRvbmUgKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG5cbiAgICAvLyBjb3B5IGFyZ3VtZW50c1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgIH1cblxuICAgIC8vIG1hcmsgY29tcGxldGVcbiAgICBjb21wbGV0ZSA9IHRydWVcblxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGludm9rZUNhbGxiYWNrKVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnZva2VDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2sgKCkge1xuICAgICAgY2xlYW51cCgpXG5cbiAgICAgIGlmIChhcmdzWzBdKSB7XG4gICAgICAgIC8vIGhhbHQgdGhlIHN0cmVhbSBvbiBlcnJvclxuICAgICAgICBoYWx0KHN0cmVhbSlcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJncylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkFib3J0ZWQgKCkge1xuICAgIGlmIChjb21wbGV0ZSkgcmV0dXJuXG5cbiAgICBkb25lKGNyZWF0ZUVycm9yKDQwMCwgJ3JlcXVlc3QgYWJvcnRlZCcsIHtcbiAgICAgIGNvZGU6ICdFQ09OTkFCT1JURUQnLFxuICAgICAgZXhwZWN0ZWQ6IGxlbmd0aCxcbiAgICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgICAgcmVjZWl2ZWQ6IHJlY2VpdmVkLFxuICAgICAgdHlwZTogJ3JlcXVlc3QuYWJvcnRlZCdcbiAgICB9KSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRGF0YSAoY2h1bmspIHtcbiAgICBpZiAoY29tcGxldGUpIHJldHVyblxuXG4gICAgcmVjZWl2ZWQgKz0gY2h1bmsubGVuZ3RoXG5cbiAgICBpZiAobGltaXQgIT09IG51bGwgJiYgcmVjZWl2ZWQgPiBsaW1pdCkge1xuICAgICAgZG9uZShjcmVhdGVFcnJvcig0MTMsICdyZXF1ZXN0IGVudGl0eSB0b28gbGFyZ2UnLCB7XG4gICAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgICAgcmVjZWl2ZWQ6IHJlY2VpdmVkLFxuICAgICAgICB0eXBlOiAnZW50aXR5LnRvby5sYXJnZSdcbiAgICAgIH0pKVxuICAgIH0gZWxzZSBpZiAoZGVjb2Rlcikge1xuICAgICAgYnVmZmVyICs9IGRlY29kZXIud3JpdGUoY2h1bmspXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlci5wdXNoKGNodW5rKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRW5kIChlcnIpIHtcbiAgICBpZiAoY29tcGxldGUpIHJldHVyblxuICAgIGlmIChlcnIpIHJldHVybiBkb25lKGVycilcblxuICAgIGlmIChsZW5ndGggIT09IG51bGwgJiYgcmVjZWl2ZWQgIT09IGxlbmd0aCkge1xuICAgICAgZG9uZShjcmVhdGVFcnJvcig0MDAsICdyZXF1ZXN0IHNpemUgZGlkIG5vdCBtYXRjaCBjb250ZW50IGxlbmd0aCcsIHtcbiAgICAgICAgZXhwZWN0ZWQ6IGxlbmd0aCxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgICAgIHJlY2VpdmVkOiByZWNlaXZlZCxcbiAgICAgICAgdHlwZTogJ3JlcXVlc3Quc2l6ZS5pbnZhbGlkJ1xuICAgICAgfSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdHJpbmcgPSBkZWNvZGVyXG4gICAgICAgID8gYnVmZmVyICsgKGRlY29kZXIuZW5kKCkgfHwgJycpXG4gICAgICAgIDogQnVmZmVyLmNvbmNhdChidWZmZXIpXG4gICAgICBkb25lKG51bGwsIHN0cmluZylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwICgpIHtcbiAgICBidWZmZXIgPSBudWxsXG5cbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0ZWQnLCBvbkFib3J0ZWQpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25EYXRhKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25FbmQpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRW5kKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKVxuICB9XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlcXVpcmUgYXN5bmNfaG9va3NcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdHJ5UmVxdWlyZUFzeW5jSG9va3MgKCkge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdhc3luY19ob29rcycpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4ge31cbiAgfVxufVxuXG4vKipcbiAqIFdyYXAgZnVuY3Rpb24gd2l0aCBhc3luYyByZXNvdXJjZSwgaWYgcG9zc2libGUuXG4gKiBBc3luY1Jlc291cmNlLmJpbmQgc3RhdGljIG1ldGhvZCBiYWNrcG9ydGVkLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB3cmFwIChmbikge1xuICB2YXIgcmVzXG5cbiAgLy8gY3JlYXRlIGFub255bW91cyByZXNvdXJjZVxuICBpZiAoYXN5bmNIb29rcy5Bc3luY1Jlc291cmNlKSB7XG4gICAgcmVzID0gbmV3IGFzeW5jSG9va3MuQXN5bmNSZXNvdXJjZShmbi5uYW1lIHx8ICdib3VuZC1hbm9ueW1vdXMtZm4nKVxuICB9XG5cbiAgLy8gaW5jb21wYXRpYmxlIG5vZGUuanNcbiAgaWYgKCFyZXMgfHwgIXJlcy5ydW5JbkFzeW5jU2NvcGUpIHtcbiAgICByZXR1cm4gZm5cbiAgfVxuXG4gIC8vIHJldHVybiBib3VuZCBmdW5jdGlvblxuICByZXR1cm4gcmVzLnJ1bkluQXN5bmNTY29wZS5iaW5kKHJlcywgZm4sIG51bGwpXG59XG4iLCAiLyohXG4gKiBlZS1maXJzdFxuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpcnN0XG5cbi8qKlxuICogR2V0IHRoZSBmaXJzdCBldmVudCBpbiBhIHNldCBvZiBldmVudCBlbWl0dGVycyBhbmQgZXZlbnQgcGFpcnMuXG4gKlxuICogQHBhcmFtIHthcnJheX0gc3R1ZmZcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRvbmVcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmaXJzdChzdHVmZiwgZG9uZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3R1ZmYpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZyBtdXN0IGJlIGFuIGFycmF5IG9mIFtlZSwgZXZlbnRzLi4uXSBhcnJheXMnKVxuXG4gIHZhciBjbGVhbnVwcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHVmZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhcnIgPSBzdHVmZltpXVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikgfHwgYXJyLmxlbmd0aCA8IDIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlYWNoIGFycmF5IG1lbWJlciBtdXN0IGJlIFtlZSwgZXZlbnRzLi4uXScpXG5cbiAgICB2YXIgZWUgPSBhcnJbMF1cblxuICAgIGZvciAodmFyIGogPSAxOyBqIDwgYXJyLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZXZlbnQgPSBhcnJbal1cbiAgICAgIHZhciBmbiA9IGxpc3RlbmVyKGV2ZW50LCBjYWxsYmFjaylcblxuICAgICAgLy8gbGlzdGVuIHRvIHRoZSBldmVudFxuICAgICAgZWUub24oZXZlbnQsIGZuKVxuICAgICAgLy8gcHVzaCB0aGlzIGxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIGNsZWFudXBzXG4gICAgICBjbGVhbnVwcy5wdXNoKHtcbiAgICAgICAgZWU6IGVlLFxuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGZuOiBmbixcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgY2xlYW51cCgpXG4gICAgZG9uZS5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHZhciB4XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGVhbnVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgeCA9IGNsZWFudXBzW2ldXG4gICAgICB4LmVlLnJlbW92ZUxpc3RlbmVyKHguZXZlbnQsIHguZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdGh1bmsoZm4pIHtcbiAgICBkb25lID0gZm5cbiAgfVxuXG4gIHRodW5rLmNhbmNlbCA9IGNsZWFudXBcblxuICByZXR1cm4gdGh1bmtcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsaXN0ZW5lcihldmVudCwgZG9uZSkge1xuICByZXR1cm4gZnVuY3Rpb24gb25ldmVudChhcmcxKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICB2YXIgZWUgPSB0aGlzXG4gICAgdmFyIGVyciA9IGV2ZW50ID09PSAnZXJyb3InXG4gICAgICA/IGFyZzFcbiAgICAgIDogbnVsbFxuXG4gICAgLy8gY29weSBhcmdzIHRvIHByZXZlbnQgYXJndW1lbnRzIGVzY2FwaW5nIHNjb3BlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuXG4gICAgZG9uZShlcnIsIGVlLCBldmVudCwgYXJncylcbiAgfVxufVxuIiwgIi8qIVxuICogb24tZmluaXNoZWRcbiAqIENvcHlyaWdodChjKSAyMDEzIEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTQgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gb25GaW5pc2hlZFxubW9kdWxlLmV4cG9ydHMuaXNGaW5pc2hlZCA9IGlzRmluaXNoZWRcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgYXN5bmNIb29rcyA9IHRyeVJlcXVpcmVBc3luY0hvb2tzKClcbnZhciBmaXJzdCA9IHJlcXVpcmUoJ2VlLWZpcnN0JylcblxuLyoqXG4gKiBWYXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgZGVmZXIgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nXG4gID8gc2V0SW1tZWRpYXRlXG4gIDogZnVuY3Rpb24gKGZuKSB7IHByb2Nlc3MubmV4dFRpY2soZm4uYmluZC5hcHBseShmbiwgYXJndW1lbnRzKSkgfVxuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aGVuIHRoZSByZXNwb25zZSBoYXMgZmluaXNoZWQsIHVzZWZ1bCBmb3JcbiAqIGNsZWFuaW5nIHVwIHJlc291cmNlcyBhZnRlcndhcmRzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtc2dcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gb25GaW5pc2hlZCAobXNnLCBsaXN0ZW5lcikge1xuICBpZiAoaXNGaW5pc2hlZChtc2cpICE9PSBmYWxzZSkge1xuICAgIGRlZmVyKGxpc3RlbmVyLCBudWxsLCBtc2cpXG4gICAgcmV0dXJuIG1zZ1xuICB9XG5cbiAgLy8gYXR0YWNoIHRoZSBsaXN0ZW5lciB0byB0aGUgbWVzc2FnZVxuICBhdHRhY2hMaXN0ZW5lcihtc2csIHdyYXAobGlzdGVuZXIpKVxuXG4gIHJldHVybiBtc2dcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgbWVzc2FnZSBpcyBhbHJlYWR5IGZpbmlzaGVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtc2dcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gaXNGaW5pc2hlZCAobXNnKSB7XG4gIHZhciBzb2NrZXQgPSBtc2cuc29ja2V0XG5cbiAgaWYgKHR5cGVvZiBtc2cuZmluaXNoZWQgPT09ICdib29sZWFuJykge1xuICAgIC8vIE91dGdvaW5nTWVzc2FnZVxuICAgIHJldHVybiBCb29sZWFuKG1zZy5maW5pc2hlZCB8fCAoc29ja2V0ICYmICFzb2NrZXQud3JpdGFibGUpKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBtc2cuY29tcGxldGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEluY29taW5nTWVzc2FnZVxuICAgIHJldHVybiBCb29sZWFuKG1zZy51cGdyYWRlIHx8ICFzb2NrZXQgfHwgIXNvY2tldC5yZWFkYWJsZSB8fCAobXNnLmNvbXBsZXRlICYmICFtc2cucmVhZGFibGUpKVxuICB9XG5cbiAgLy8gZG9uJ3Qga25vd1xuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQXR0YWNoIGEgZmluaXNoZWQgbGlzdGVuZXIgdG8gdGhlIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1zZ1xuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gYXR0YWNoRmluaXNoZWRMaXN0ZW5lciAobXNnLCBjYWxsYmFjaykge1xuICB2YXIgZWVNc2dcbiAgdmFyIGVlU29ja2V0XG4gIHZhciBmaW5pc2hlZCA9IGZhbHNlXG5cbiAgZnVuY3Rpb24gb25GaW5pc2ggKGVycm9yKSB7XG4gICAgZWVNc2cuY2FuY2VsKClcbiAgICBlZVNvY2tldC5jYW5jZWwoKVxuXG4gICAgZmluaXNoZWQgPSB0cnVlXG4gICAgY2FsbGJhY2soZXJyb3IpXG4gIH1cblxuICAvLyBmaW5pc2hlZCBvbiBmaXJzdCBtZXNzYWdlIGV2ZW50XG4gIGVlTXNnID0gZWVTb2NrZXQgPSBmaXJzdChbW21zZywgJ2VuZCcsICdmaW5pc2gnXV0sIG9uRmluaXNoKVxuXG4gIGZ1bmN0aW9uIG9uU29ja2V0IChzb2NrZXQpIHtcbiAgICAvLyByZW1vdmUgbGlzdGVuZXJcbiAgICBtc2cucmVtb3ZlTGlzdGVuZXIoJ3NvY2tldCcsIG9uU29ja2V0KVxuXG4gICAgaWYgKGZpbmlzaGVkKSByZXR1cm5cbiAgICBpZiAoZWVNc2cgIT09IGVlU29ja2V0KSByZXR1cm5cblxuICAgIC8vIGZpbmlzaGVkIG9uIGZpcnN0IHNvY2tldCBldmVudFxuICAgIGVlU29ja2V0ID0gZmlyc3QoW1tzb2NrZXQsICdlcnJvcicsICdjbG9zZSddXSwgb25GaW5pc2gpXG4gIH1cblxuICBpZiAobXNnLnNvY2tldCkge1xuICAgIC8vIHNvY2tldCBhbHJlYWR5IGFzc2lnbmVkXG4gICAgb25Tb2NrZXQobXNnLnNvY2tldClcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIHdhaXQgZm9yIHNvY2tldCB0byBiZSBhc3NpZ25lZFxuICBtc2cub24oJ3NvY2tldCcsIG9uU29ja2V0KVxuXG4gIGlmIChtc2cuc29ja2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogbm9kZS5qcyAwLjggcGF0Y2hcbiAgICBwYXRjaEFzc2lnblNvY2tldChtc2csIG9uU29ja2V0KVxuICB9XG59XG5cbi8qKlxuICogQXR0YWNoIHRoZSBsaXN0ZW5lciB0byB0aGUgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbXNnXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gYXR0YWNoTGlzdGVuZXIgKG1zZywgbGlzdGVuZXIpIHtcbiAgdmFyIGF0dGFjaGVkID0gbXNnLl9fb25GaW5pc2hlZFxuXG4gIC8vIGNyZWF0ZSBhIHByaXZhdGUgc2luZ2xlIGxpc3RlbmVyIHdpdGggcXVldWVcbiAgaWYgKCFhdHRhY2hlZCB8fCAhYXR0YWNoZWQucXVldWUpIHtcbiAgICBhdHRhY2hlZCA9IG1zZy5fX29uRmluaXNoZWQgPSBjcmVhdGVMaXN0ZW5lcihtc2cpXG4gICAgYXR0YWNoRmluaXNoZWRMaXN0ZW5lcihtc2csIGF0dGFjaGVkKVxuICB9XG5cbiAgYXR0YWNoZWQucXVldWUucHVzaChsaXN0ZW5lcilcbn1cblxuLyoqXG4gKiBDcmVhdGUgbGlzdGVuZXIgb24gbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbXNnXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlTGlzdGVuZXIgKG1zZykge1xuICBmdW5jdGlvbiBsaXN0ZW5lciAoZXJyKSB7XG4gICAgaWYgKG1zZy5fX29uRmluaXNoZWQgPT09IGxpc3RlbmVyKSBtc2cuX19vbkZpbmlzaGVkID0gbnVsbFxuICAgIGlmICghbGlzdGVuZXIucXVldWUpIHJldHVyblxuXG4gICAgdmFyIHF1ZXVlID0gbGlzdGVuZXIucXVldWVcbiAgICBsaXN0ZW5lci5xdWV1ZSA9IG51bGxcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlW2ldKGVyciwgbXNnKVxuICAgIH1cbiAgfVxuXG4gIGxpc3RlbmVyLnF1ZXVlID0gW11cblxuICByZXR1cm4gbGlzdGVuZXJcbn1cblxuLyoqXG4gKiBQYXRjaCBTZXJ2ZXJSZXNwb25zZS5wcm90b3R5cGUuYXNzaWduU29ja2V0IGZvciBub2RlLmpzIDAuOC5cbiAqXG4gKiBAcGFyYW0ge1NlcnZlclJlc3BvbnNlfSByZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBub2RlLmpzIDAuOCBwYXRjaFxuZnVuY3Rpb24gcGF0Y2hBc3NpZ25Tb2NrZXQgKHJlcywgY2FsbGJhY2spIHtcbiAgdmFyIGFzc2lnblNvY2tldCA9IHJlcy5hc3NpZ25Tb2NrZXRcblxuICBpZiAodHlwZW9mIGFzc2lnblNvY2tldCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuXG5cbiAgLy8gcmVzLm9uKCdzb2NrZXQnLCBjYWxsYmFjaykgaXMgYnJva2VuIGluIDAuOFxuICByZXMuYXNzaWduU29ja2V0ID0gZnVuY3Rpb24gX2Fzc2lnblNvY2tldCAoc29ja2V0KSB7XG4gICAgYXNzaWduU29ja2V0LmNhbGwodGhpcywgc29ja2V0KVxuICAgIGNhbGxiYWNrKHNvY2tldClcbiAgfVxufVxuXG4vKipcbiAqIFRyeSB0byByZXF1aXJlIGFzeW5jX2hvb2tzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRyeVJlcXVpcmVBc3luY0hvb2tzICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZSgnYXN5bmNfaG9va3MnKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwIGZ1bmN0aW9uIHdpdGggYXN5bmMgcmVzb3VyY2UsIGlmIHBvc3NpYmxlLlxuICogQXN5bmNSZXNvdXJjZS5iaW5kIHN0YXRpYyBtZXRob2QgYmFja3BvcnRlZC5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gd3JhcCAoZm4pIHtcbiAgdmFyIHJlc1xuXG4gIC8vIGNyZWF0ZSBhbm9ueW1vdXMgcmVzb3VyY2VcbiAgaWYgKGFzeW5jSG9va3MuQXN5bmNSZXNvdXJjZSkge1xuICAgIHJlcyA9IG5ldyBhc3luY0hvb2tzLkFzeW5jUmVzb3VyY2UoZm4ubmFtZSB8fCAnYm91bmQtYW5vbnltb3VzLWZuJylcbiAgfVxuXG4gIC8vIGluY29tcGF0aWJsZSBub2RlLmpzXG4gIGlmICghcmVzIHx8ICFyZXMucnVuSW5Bc3luY1Njb3BlKSB7XG4gICAgcmV0dXJuIGZuXG4gIH1cblxuICAvLyByZXR1cm4gYm91bmQgZnVuY3Rpb25cbiAgcmV0dXJuIHJlcy5ydW5JbkFzeW5jU2NvcGUuYmluZChyZXMsIGZuLCBudWxsKVxufVxuIiwgIi8qIVxuICogYm9keS1wYXJzZXJcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJ2h0dHAtZXJyb3JzJylcbnZhciBkZXN0cm95ID0gcmVxdWlyZSgnZGVzdHJveScpXG52YXIgZ2V0Qm9keSA9IHJlcXVpcmUoJ3Jhdy1ib2R5JylcbnZhciBpY29udiA9IHJlcXVpcmUoJ2ljb252LWxpdGUnKVxudmFyIG9uRmluaXNoZWQgPSByZXF1aXJlKCdvbi1maW5pc2hlZCcpXG52YXIgdW5waXBlID0gcmVxdWlyZSgndW5waXBlJylcbnZhciB6bGliID0gcmVxdWlyZSgnemxpYicpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZWFkXG5cbi8qKlxuICogUmVhZCBhIHJlcXVlc3QgaW50byBhIGJ1ZmZlciBhbmQgcGFyc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlcVxuICogQHBhcmFtIHtvYmplY3R9IHJlc1xuICogQHBhcmFtIHtmdW5jdGlvbn0gbmV4dFxuICogQHBhcmFtIHtmdW5jdGlvbn0gcGFyc2VcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRlYnVnXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiByZWFkIChyZXEsIHJlcywgbmV4dCwgcGFyc2UsIGRlYnVnLCBvcHRpb25zKSB7XG4gIHZhciBsZW5ndGhcbiAgdmFyIG9wdHMgPSBvcHRpb25zXG4gIHZhciBzdHJlYW1cblxuICAvLyBmbGFnIGFzIHBhcnNlZFxuICByZXEuX2JvZHkgPSB0cnVlXG5cbiAgLy8gcmVhZCBvcHRpb25zXG4gIHZhciBlbmNvZGluZyA9IG9wdHMuZW5jb2RpbmcgIT09IG51bGxcbiAgICA/IG9wdHMuZW5jb2RpbmdcbiAgICA6IG51bGxcbiAgdmFyIHZlcmlmeSA9IG9wdHMudmVyaWZ5XG5cbiAgdHJ5IHtcbiAgICAvLyBnZXQgdGhlIGNvbnRlbnQgc3RyZWFtXG4gICAgc3RyZWFtID0gY29udGVudHN0cmVhbShyZXEsIGRlYnVnLCBvcHRzLmluZmxhdGUpXG4gICAgbGVuZ3RoID0gc3RyZWFtLmxlbmd0aFxuICAgIHN0cmVhbS5sZW5ndGggPSB1bmRlZmluZWRcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIG5leHQoZXJyKVxuICB9XG5cbiAgLy8gc2V0IHJhdy1ib2R5IG9wdGlvbnNcbiAgb3B0cy5sZW5ndGggPSBsZW5ndGhcbiAgb3B0cy5lbmNvZGluZyA9IHZlcmlmeVxuICAgID8gbnVsbFxuICAgIDogZW5jb2RpbmdcblxuICAvLyBhc3NlcnQgY2hhcnNldCBpcyBzdXBwb3J0ZWRcbiAgaWYgKG9wdHMuZW5jb2RpbmcgPT09IG51bGwgJiYgZW5jb2RpbmcgIT09IG51bGwgJiYgIWljb252LmVuY29kaW5nRXhpc3RzKGVuY29kaW5nKSkge1xuICAgIHJldHVybiBuZXh0KGNyZWF0ZUVycm9yKDQxNSwgJ3Vuc3VwcG9ydGVkIGNoYXJzZXQgXCInICsgZW5jb2RpbmcudG9VcHBlckNhc2UoKSArICdcIicsIHtcbiAgICAgIGNoYXJzZXQ6IGVuY29kaW5nLnRvTG93ZXJDYXNlKCksXG4gICAgICB0eXBlOiAnY2hhcnNldC51bnN1cHBvcnRlZCdcbiAgICB9KSlcbiAgfVxuXG4gIC8vIHJlYWQgYm9keVxuICBkZWJ1ZygncmVhZCBib2R5JylcbiAgZ2V0Qm9keShzdHJlYW0sIG9wdHMsIGZ1bmN0aW9uIChlcnJvciwgYm9keSkge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgdmFyIF9lcnJvclxuXG4gICAgICBpZiAoZXJyb3IudHlwZSA9PT0gJ2VuY29kaW5nLnVuc3VwcG9ydGVkJykge1xuICAgICAgICAvLyBlY2hvIGJhY2sgY2hhcnNldFxuICAgICAgICBfZXJyb3IgPSBjcmVhdGVFcnJvcig0MTUsICd1bnN1cHBvcnRlZCBjaGFyc2V0IFwiJyArIGVuY29kaW5nLnRvVXBwZXJDYXNlKCkgKyAnXCInLCB7XG4gICAgICAgICAgY2hhcnNldDogZW5jb2RpbmcudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICB0eXBlOiAnY2hhcnNldC51bnN1cHBvcnRlZCdcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNldCBzdGF0dXMgY29kZSBvbiBlcnJvclxuICAgICAgICBfZXJyb3IgPSBjcmVhdGVFcnJvcig0MDAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICAvLyB1bnBpcGUgZnJvbSBzdHJlYW0gYW5kIGRlc3Ryb3lcbiAgICAgIGlmIChzdHJlYW0gIT09IHJlcSkge1xuICAgICAgICB1bnBpcGUocmVxKVxuICAgICAgICBkZXN0cm95KHN0cmVhbSwgdHJ1ZSlcbiAgICAgIH1cblxuICAgICAgLy8gcmVhZCBvZmYgZW50aXJlIHJlcXVlc3RcbiAgICAgIGR1bXAocmVxLCBmdW5jdGlvbiBvbmZpbmlzaGVkICgpIHtcbiAgICAgICAgbmV4dChjcmVhdGVFcnJvcig0MDAsIF9lcnJvcikpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5XG4gICAgaWYgKHZlcmlmeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVidWcoJ3ZlcmlmeSBib2R5JylcbiAgICAgICAgdmVyaWZ5KHJlcSwgcmVzLCBib2R5LCBlbmNvZGluZylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBuZXh0KGNyZWF0ZUVycm9yKDQwMywgZXJyLCB7XG4gICAgICAgICAgYm9keTogYm9keSxcbiAgICAgICAgICB0eXBlOiBlcnIudHlwZSB8fCAnZW50aXR5LnZlcmlmeS5mYWlsZWQnXG4gICAgICAgIH0pKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwYXJzZVxuICAgIHZhciBzdHIgPSBib2R5XG4gICAgdHJ5IHtcbiAgICAgIGRlYnVnKCdwYXJzZSBib2R5JylcbiAgICAgIHN0ciA9IHR5cGVvZiBib2R5ICE9PSAnc3RyaW5nJyAmJiBlbmNvZGluZyAhPT0gbnVsbFxuICAgICAgICA/IGljb252LmRlY29kZShib2R5LCBlbmNvZGluZylcbiAgICAgICAgOiBib2R5XG4gICAgICByZXEuYm9keSA9IHBhcnNlKHN0cilcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIG5leHQoY3JlYXRlRXJyb3IoNDAwLCBlcnIsIHtcbiAgICAgICAgYm9keTogc3RyLFxuICAgICAgICB0eXBlOiBlcnIudHlwZSB8fCAnZW50aXR5LnBhcnNlLmZhaWxlZCdcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbmV4dCgpXG4gIH0pXG59XG5cbi8qKlxuICogR2V0IHRoZSBjb250ZW50IHN0cmVhbSBvZiB0aGUgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBkZWJ1Z1xuICogQHBhcmFtIHtib29sZWFufSBbaW5mbGF0ZT10cnVlXVxuICogQHJldHVybiB7b2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29udGVudHN0cmVhbSAocmVxLCBkZWJ1ZywgaW5mbGF0ZSkge1xuICB2YXIgZW5jb2RpbmcgPSAocmVxLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSB8fCAnaWRlbnRpdHknKS50b0xvd2VyQ2FzZSgpXG4gIHZhciBsZW5ndGggPSByZXEuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXVxuICB2YXIgc3RyZWFtXG5cbiAgZGVidWcoJ2NvbnRlbnQtZW5jb2RpbmcgXCIlc1wiJywgZW5jb2RpbmcpXG5cbiAgaWYgKGluZmxhdGUgPT09IGZhbHNlICYmIGVuY29kaW5nICE9PSAnaWRlbnRpdHknKSB7XG4gICAgdGhyb3cgY3JlYXRlRXJyb3IoNDE1LCAnY29udGVudCBlbmNvZGluZyB1bnN1cHBvcnRlZCcsIHtcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZyxcbiAgICAgIHR5cGU6ICdlbmNvZGluZy51bnN1cHBvcnRlZCdcbiAgICB9KVxuICB9XG5cbiAgc3dpdGNoIChlbmNvZGluZykge1xuICAgIGNhc2UgJ2RlZmxhdGUnOlxuICAgICAgc3RyZWFtID0gemxpYi5jcmVhdGVJbmZsYXRlKClcbiAgICAgIGRlYnVnKCdpbmZsYXRlIGJvZHknKVxuICAgICAgcmVxLnBpcGUoc3RyZWFtKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdnemlwJzpcbiAgICAgIHN0cmVhbSA9IHpsaWIuY3JlYXRlR3VuemlwKClcbiAgICAgIGRlYnVnKCdndW56aXAgYm9keScpXG4gICAgICByZXEucGlwZShzdHJlYW0pXG4gICAgICBicmVha1xuICAgIGNhc2UgJ2lkZW50aXR5JzpcbiAgICAgIHN0cmVhbSA9IHJlcVxuICAgICAgc3RyZWFtLmxlbmd0aCA9IGxlbmd0aFxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgY3JlYXRlRXJyb3IoNDE1LCAndW5zdXBwb3J0ZWQgY29udGVudCBlbmNvZGluZyBcIicgKyBlbmNvZGluZyArICdcIicsIHtcbiAgICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgICB0eXBlOiAnZW5jb2RpbmcudW5zdXBwb3J0ZWQnXG4gICAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG4vKipcbiAqIER1bXAgdGhlIGNvbnRlbnRzIG9mIGEgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZHVtcCAocmVxLCBjYWxsYmFjaykge1xuICBpZiAob25GaW5pc2hlZC5pc0ZpbmlzaGVkKHJlcSkpIHtcbiAgICBjYWxsYmFjayhudWxsKVxuICB9IGVsc2Uge1xuICAgIG9uRmluaXNoZWQocmVxLCBjYWxsYmFjaylcbiAgICByZXEucmVzdW1lKClcbiAgfVxufVxuIiwgIi8qIVxuICogbWVkaWEtdHlwZXJcbiAqIENvcHlyaWdodChjKSAyMDE0IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCAqKCBcIjtcIiBwYXJhbWV0ZXIgKSBpbiBSRkMgMjYxNiBzZWMgMy43XG4gKlxuICogcGFyYW1ldGVyICAgICA9IHRva2VuIFwiPVwiICggdG9rZW4gfCBxdW90ZWQtc3RyaW5nIClcbiAqIHRva2VuICAgICAgICAgPSAxKjxhbnkgQ0hBUiBleGNlcHQgQ1RMcyBvciBzZXBhcmF0b3JzPlxuICogc2VwYXJhdG9ycyAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAqICAgICAgICAgICAgICAgfCBcIixcIiB8IFwiO1wiIHwgXCI6XCIgfCBcIlxcXCIgfCA8XCI+XG4gKiAgICAgICAgICAgICAgIHwgXCIvXCIgfCBcIltcIiB8IFwiXVwiIHwgXCI/XCIgfCBcIj1cIlxuICogICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKiBxdW90ZWQtc3RyaW5nID0gKCA8XCI+ICoocWR0ZXh0IHwgcXVvdGVkLXBhaXIgKSA8XCI+IClcbiAqIHFkdGV4dCAgICAgICAgPSA8YW55IFRFWFQgZXhjZXB0IDxcIj4+XG4gKiBxdW90ZWQtcGFpciAgID0gXCJcXFwiIENIQVJcbiAqIENIQVIgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuICogVEVYVCAgICAgICAgICA9IDxhbnkgT0NURVQgZXhjZXB0IENUTHMsIGJ1dCBpbmNsdWRpbmcgTFdTPlxuICogTFdTICAgICAgICAgICA9IFtDUkxGXSAxKiggU1AgfCBIVCApXG4gKiBDUkxGICAgICAgICAgID0gQ1IgTEZcbiAqIENSICAgICAgICAgICAgPSA8VVMtQVNDSUkgQ1IsIGNhcnJpYWdlIHJldHVybiAoMTMpPlxuICogTEYgICAgICAgICAgICA9IDxVUy1BU0NJSSBMRiwgbGluZWZlZWQgKDEwKT5cbiAqIFNQICAgICAgICAgICAgPSA8VVMtQVNDSUkgU1AsIHNwYWNlICgzMik+XG4gKiBTSFQgICAgICAgICAgID0gPFVTLUFTQ0lJIEhULCBob3Jpem9udGFsLXRhYiAoOSk+XG4gKiBDVEwgICAgICAgICAgID0gPGFueSBVUy1BU0NJSSBjb250cm9sIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAzMSkgYW5kIERFTCAoMTI3KT5cbiAqIE9DVEVUICAgICAgICAgPSA8YW55IDgtYml0IHNlcXVlbmNlIG9mIGRhdGE+XG4gKi9cbnZhciBwYXJhbVJlZ0V4cCA9IC87ICooWyEjJCUmJ1xcKlxcK1xcLVxcLjAtOUEtWlxcXl9gYS16XFx8fl0rKSAqPSAqKFwiKD86WyAhXFx1MDAyMy1cXHUwMDViXFx1MDA1ZC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXXxcXFxcW1xcdTAwMjAtXFx1MDA3ZV0pKlwifFshIyQlJidcXCpcXCtcXC1cXC4wLTlBLVpcXF5fYGEtelxcfH5dKykgKi9nO1xudmFyIHRleHRSZWdFeHAgPSAvXltcXHUwMDIwLVxcdTAwN2VcXHUwMDgwLVxcdTAwZmZdKyQvXG52YXIgdG9rZW5SZWdFeHAgPSAvXlshIyQlJidcXCpcXCtcXC1cXC4wLTlBLVpcXF5fYGEtelxcfH5dKyQvXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHF1b3RlZC1wYWlyIGluIFJGQyAyNjE2XG4gKlxuICogcXVvdGVkLXBhaXIgPSBcIlxcXCIgQ0hBUlxuICogQ0hBUiAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuICovXG52YXIgcWVzY1JlZ0V4cCA9IC9cXFxcKFtcXHUwMDAwLVxcdTAwN2ZdKS9nO1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBjaGFycyB0aGF0IG11c3QgYmUgcXVvdGVkLXBhaXIgaW4gUkZDIDI2MTZcbiAqL1xudmFyIHF1b3RlUmVnRXhwID0gLyhbXFxcXFwiXSkvZztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggdHlwZSBpbiBSRkMgNjgzOFxuICpcbiAqIHR5cGUtbmFtZSA9IHJlc3RyaWN0ZWQtbmFtZVxuICogc3VidHlwZS1uYW1lID0gcmVzdHJpY3RlZC1uYW1lXG4gKiByZXN0cmljdGVkLW5hbWUgPSByZXN0cmljdGVkLW5hbWUtZmlyc3QgKjEyNnJlc3RyaWN0ZWQtbmFtZS1jaGFyc1xuICogcmVzdHJpY3RlZC1uYW1lLWZpcnN0ICA9IEFMUEhBIC8gRElHSVRcbiAqIHJlc3RyaWN0ZWQtbmFtZS1jaGFycyAgPSBBTFBIQSAvIERJR0lUIC8gXCIhXCIgLyBcIiNcIiAvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgXCIkXCIgLyBcIiZcIiAvIFwiLVwiIC8gXCJeXCIgLyBcIl9cIlxuICogcmVzdHJpY3RlZC1uYW1lLWNoYXJzID0vIFwiLlwiIDsgQ2hhcmFjdGVycyBiZWZvcmUgZmlyc3QgZG90IGFsd2F5c1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNwZWNpZnkgYSBmYWNldCBuYW1lXG4gKiByZXN0cmljdGVkLW5hbWUtY2hhcnMgPS8gXCIrXCIgOyBDaGFyYWN0ZXJzIGFmdGVyIGxhc3QgcGx1cyBhbHdheXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzcGVjaWZ5IGEgc3RydWN0dXJlZCBzeW50YXggc3VmZml4XG4gKiBBTFBIQSA9ICAleDQxLTVBIC8gJXg2MS03QSAgIDsgQS1aIC8gYS16XG4gKiBESUdJVCA9ICAleDMwLTM5ICAgICAgICAgICAgIDsgMC05XG4gKi9cbnZhciBzdWJ0eXBlTmFtZVJlZ0V4cCA9IC9eW0EtWmEtejAtOV1bQS1aYS16MC05ISMkJl5fLi1dezAsMTI2fSQvXG52YXIgdHlwZU5hbWVSZWdFeHAgPSAvXltBLVphLXowLTldW0EtWmEtejAtOSEjJCZeXy1dezAsMTI2fSQvXG52YXIgdHlwZVJlZ0V4cCA9IC9eICooW0EtWmEtejAtOV1bQS1aYS16MC05ISMkJl5fLV17MCwxMjZ9KVxcLyhbQS1aYS16MC05XVtBLVphLXowLTkhIyQmXl8uKy1dezAsMTI2fSkgKiQvO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0ID0gZm9ybWF0XG5leHBvcnRzLnBhcnNlID0gcGFyc2VcblxuLyoqXG4gKiBGb3JtYXQgb2JqZWN0IHRvIG1lZGlhIHR5cGUuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHJldHVybiB7c3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXQob2JqKSB7XG4gIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgb2JqIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIHZhciBwYXJhbWV0ZXJzID0gb2JqLnBhcmFtZXRlcnNcbiAgdmFyIHN1YnR5cGUgPSBvYmouc3VidHlwZVxuICB2YXIgc3VmZml4ID0gb2JqLnN1ZmZpeFxuICB2YXIgdHlwZSA9IG9iai50eXBlXG5cbiAgaWYgKCF0eXBlIHx8ICF0eXBlTmFtZVJlZ0V4cC50ZXN0KHR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCB0eXBlJylcbiAgfVxuXG4gIGlmICghc3VidHlwZSB8fCAhc3VidHlwZU5hbWVSZWdFeHAudGVzdChzdWJ0eXBlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VidHlwZScpXG4gIH1cblxuICAvLyBmb3JtYXQgYXMgdHlwZS9zdWJ0eXBlXG4gIHZhciBzdHJpbmcgPSB0eXBlICsgJy8nICsgc3VidHlwZVxuXG4gIC8vIGFwcGVuZCArc3VmZml4XG4gIGlmIChzdWZmaXgpIHtcbiAgICBpZiAoIXR5cGVOYW1lUmVnRXhwLnRlc3Qoc3VmZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzdWZmaXgnKVxuICAgIH1cblxuICAgIHN0cmluZyArPSAnKycgKyBzdWZmaXhcbiAgfVxuXG4gIC8vIGFwcGVuZCBwYXJhbWV0ZXJzXG4gIGlmIChwYXJhbWV0ZXJzICYmIHR5cGVvZiBwYXJhbWV0ZXJzID09PSAnb2JqZWN0Jykge1xuICAgIHZhciBwYXJhbVxuICAgIHZhciBwYXJhbXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5zb3J0KClcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYXJhbSA9IHBhcmFtc1tpXVxuXG4gICAgICBpZiAoIXRva2VuUmVnRXhwLnRlc3QocGFyYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIG5hbWUnKVxuICAgICAgfVxuXG4gICAgICBzdHJpbmcgKz0gJzsgJyArIHBhcmFtICsgJz0nICsgcXN0cmluZyhwYXJhbWV0ZXJzW3BhcmFtXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyaW5nXG59XG5cbi8qKlxuICogUGFyc2UgbWVkaWEgdHlwZSB0byBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBzdHJpbmdcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyaW5nKSB7XG4gIGlmICghc3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyaW5nIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIHN1cHBvcnQgcmVxL3Jlcy1saWtlIG9iamVjdHMgYXMgYXJndW1lbnRcbiAgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICdvYmplY3QnKSB7XG4gICAgc3RyaW5nID0gZ2V0Y29udGVudHR5cGUoc3RyaW5nKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyaW5nIGlzIHJlcXVpcmVkIHRvIGJlIGEgc3RyaW5nJylcbiAgfVxuXG4gIHZhciBpbmRleCA9IHN0cmluZy5pbmRleE9mKCc7JylcbiAgdmFyIHR5cGUgPSBpbmRleCAhPT0gLTFcbiAgICA/IHN0cmluZy5zdWJzdHIoMCwgaW5kZXgpXG4gICAgOiBzdHJpbmdcblxuICB2YXIga2V5XG4gIHZhciBtYXRjaFxuICB2YXIgb2JqID0gc3BsaXRUeXBlKHR5cGUpXG4gIHZhciBwYXJhbXMgPSB7fVxuICB2YXIgdmFsdWVcblxuICBwYXJhbVJlZ0V4cC5sYXN0SW5kZXggPSBpbmRleFxuXG4gIHdoaWxlIChtYXRjaCA9IHBhcmFtUmVnRXhwLmV4ZWMoc3RyaW5nKSkge1xuICAgIGlmIChtYXRjaC5pbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIGZvcm1hdCcpXG4gICAgfVxuXG4gICAgaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAga2V5ID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIHZhbHVlID0gbWF0Y2hbMl1cblxuICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgLy8gcmVtb3ZlIHF1b3RlcyBhbmQgZXNjYXBlc1xuICAgICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgICAuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpXG4gICAgICAgIC5yZXBsYWNlKHFlc2NSZWdFeHAsICckMScpXG4gICAgfVxuXG4gICAgcGFyYW1zW2tleV0gPSB2YWx1ZVxuICB9XG5cbiAgaWYgKGluZGV4ICE9PSAtMSAmJiBpbmRleCAhPT0gc3RyaW5nLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIGZvcm1hdCcpXG4gIH1cblxuICBvYmoucGFyYW1ldGVycyA9IHBhcmFtc1xuXG4gIHJldHVybiBvYmpcbn1cblxuLyoqXG4gKiBHZXQgY29udGVudC10eXBlIGZyb20gcmVxL3JlcyBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fVxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0Y29udGVudHR5cGUob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqLmdldEhlYWRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIHJlcy1saWtlXG4gICAgcmV0dXJuIG9iai5nZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScpXG4gIH1cblxuICBpZiAodHlwZW9mIG9iai5oZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgIC8vIHJlcS1saWtlXG4gICAgcmV0dXJuIG9iai5oZWFkZXJzICYmIG9iai5oZWFkZXJzWydjb250ZW50LXR5cGUnXVxuICB9XG59XG5cbi8qKlxuICogUXVvdGUgYSBzdHJpbmcgaWYgbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHFzdHJpbmcodmFsKSB7XG4gIHZhciBzdHIgPSBTdHJpbmcodmFsKVxuXG4gIC8vIG5vIG5lZWQgdG8gcXVvdGUgdG9rZW5zXG4gIGlmICh0b2tlblJlZ0V4cC50ZXN0KHN0cikpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBpZiAoc3RyLmxlbmd0aCA+IDAgJiYgIXRleHRSZWdFeHAudGVzdChzdHIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgdmFsdWUnKVxuICB9XG5cbiAgcmV0dXJuICdcIicgKyBzdHIucmVwbGFjZShxdW90ZVJlZ0V4cCwgJ1xcXFwkMScpICsgJ1wiJ1xufVxuXG4vKipcbiAqIFNpbXBseSBcInR5cGUvc3VidHlwZStzaWZmeFwiIGludG8gcGFydHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRUeXBlKHN0cmluZykge1xuICB2YXIgbWF0Y2ggPSB0eXBlUmVnRXhwLmV4ZWMoc3RyaW5nLnRvTG93ZXJDYXNlKCkpXG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgbWVkaWEgdHlwZScpXG4gIH1cblxuICB2YXIgdHlwZSA9IG1hdGNoWzFdXG4gIHZhciBzdWJ0eXBlID0gbWF0Y2hbMl1cbiAgdmFyIHN1ZmZpeFxuXG4gIC8vIHN1ZmZpeCBhZnRlciBsYXN0ICtcbiAgdmFyIGluZGV4ID0gc3VidHlwZS5sYXN0SW5kZXhPZignKycpXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBzdWZmaXggPSBzdWJ0eXBlLnN1YnN0cihpbmRleCArIDEpXG4gICAgc3VidHlwZSA9IHN1YnR5cGUuc3Vic3RyKDAsIGluZGV4KVxuICB9XG5cbiAgdmFyIG9iaiA9IHtcbiAgICB0eXBlOiB0eXBlLFxuICAgIHN1YnR5cGU6IHN1YnR5cGUsXG4gICAgc3VmZml4OiBzdWZmaXhcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cbiIsICIvKiFcbiAqIG1pbWUtZGJcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTUtMjAyMiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGIuanNvbicpXG4iLCAiLyohXG4gKiBtaW1lLXR5cGVzXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGIgPSByZXF1aXJlKCdtaW1lLWRiJylcbnZhciBleHRuYW1lID0gcmVxdWlyZSgncGF0aCcpLmV4dG5hbWVcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRVhUUkFDVF9UWVBFX1JFR0VYUCA9IC9eXFxzKihbXjtcXHNdKikoPzo7fFxcc3wkKS9cbnZhciBURVhUX1RZUEVfUkVHRVhQID0gL150ZXh0XFwvL2lcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmNoYXJzZXQgPSBjaGFyc2V0XG5leHBvcnRzLmNoYXJzZXRzID0geyBsb29rdXA6IGNoYXJzZXQgfVxuZXhwb3J0cy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlXG5leHBvcnRzLmV4dGVuc2lvbiA9IGV4dGVuc2lvblxuZXhwb3J0cy5leHRlbnNpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuZXhwb3J0cy5sb29rdXAgPSBsb29rdXBcbmV4cG9ydHMudHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbi8vIFBvcHVsYXRlIHRoZSBleHRlbnNpb25zL3R5cGVzIG1hcHNcbnBvcHVsYXRlTWFwcyhleHBvcnRzLmV4dGVuc2lvbnMsIGV4cG9ydHMudHlwZXMpXG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGNoYXJzZXQgZm9yIGEgTUlNRSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufHN0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBjaGFyc2V0ICh0eXBlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBtZWRpYS10eXBlclxuICB2YXIgbWF0Y2ggPSBFWFRSQUNUX1RZUEVfUkVHRVhQLmV4ZWModHlwZSlcbiAgdmFyIG1pbWUgPSBtYXRjaCAmJiBkYlttYXRjaFsxXS50b0xvd2VyQ2FzZSgpXVxuXG4gIGlmIChtaW1lICYmIG1pbWUuY2hhcnNldCkge1xuICAgIHJldHVybiBtaW1lLmNoYXJzZXRcbiAgfVxuXG4gIC8vIGRlZmF1bHQgdGV4dC8qIHRvIHV0Zi04XG4gIGlmIChtYXRjaCAmJiBURVhUX1RZUEVfUkVHRVhQLnRlc3QobWF0Y2hbMV0pKSB7XG4gICAgcmV0dXJuICdVVEYtOCdcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bGwgQ29udGVudC1UeXBlIGhlYWRlciBnaXZlbiBhIE1JTUUgdHlwZSBvciBleHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7Ym9vbGVhbnxzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gY29udGVudFR5cGUgKHN0cikge1xuICAvLyBUT0RPOiBzaG91bGQgdGhpcyBldmVuIGJlIGluIHRoaXMgbW9kdWxlP1xuICBpZiAoIXN0ciB8fCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdmFyIG1pbWUgPSBzdHIuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gZXhwb3J0cy5sb29rdXAoc3RyKVxuICAgIDogc3RyXG5cbiAgaWYgKCFtaW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgY29udGVudC10eXBlIG9yIG90aGVyIG1vZHVsZVxuICBpZiAobWltZS5pbmRleE9mKCdjaGFyc2V0JykgPT09IC0xKSB7XG4gICAgdmFyIGNoYXJzZXQgPSBleHBvcnRzLmNoYXJzZXQobWltZSlcbiAgICBpZiAoY2hhcnNldCkgbWltZSArPSAnOyBjaGFyc2V0PScgKyBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIHJldHVybiBtaW1lXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgYSBNSU1FIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGV4dGVuc2lvbiAodHlwZSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgbWVkaWEtdHlwZXJcbiAgdmFyIG1hdGNoID0gRVhUUkFDVF9UWVBFX1JFR0VYUC5leGVjKHR5cGUpXG5cbiAgLy8gZ2V0IGV4dGVuc2lvbnNcbiAgdmFyIGV4dHMgPSBtYXRjaCAmJiBleHBvcnRzLmV4dGVuc2lvbnNbbWF0Y2hbMV0udG9Mb3dlckNhc2UoKV1cblxuICBpZiAoIWV4dHMgfHwgIWV4dHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXh0c1swXVxufVxuXG4vKipcbiAqIExvb2t1cCB0aGUgTUlNRSB0eXBlIGZvciBhIGZpbGUgcGF0aC9leHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGxvb2t1cCAocGF0aCkge1xuICBpZiAoIXBhdGggfHwgdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBnZXQgdGhlIGV4dGVuc2lvbiAoXCJleHRcIiBvciBcIi5leHRcIiBvciBmdWxsIHBhdGgpXG4gIHZhciBleHRlbnNpb24gPSBleHRuYW1lKCd4LicgKyBwYXRoKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnN1YnN0cigxKVxuXG4gIGlmICghZXh0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy50eXBlc1tleHRlbnNpb25dIHx8IGZhbHNlXG59XG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGV4dGVuc2lvbnMgYW5kIHR5cGVzIG1hcHMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBvcHVsYXRlTWFwcyAoZXh0ZW5zaW9ucywgdHlwZXMpIHtcbiAgLy8gc291cmNlIHByZWZlcmVuY2UgKGxlYXN0IC0+IG1vc3QpXG4gIHZhciBwcmVmZXJlbmNlID0gWyduZ2lueCcsICdhcGFjaGUnLCB1bmRlZmluZWQsICdpYW5hJ11cblxuICBPYmplY3Qua2V5cyhkYikuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoTWltZVR5cGUgKHR5cGUpIHtcbiAgICB2YXIgbWltZSA9IGRiW3R5cGVdXG4gICAgdmFyIGV4dHMgPSBtaW1lLmV4dGVuc2lvbnNcblxuICAgIGlmICghZXh0cyB8fCAhZXh0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIG1pbWUgLT4gZXh0ZW5zaW9uc1xuICAgIGV4dGVuc2lvbnNbdHlwZV0gPSBleHRzXG5cbiAgICAvLyBleHRlbnNpb24gLT4gbWltZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV4dGVuc2lvbiA9IGV4dHNbaV1cblxuICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0pIHtcbiAgICAgICAgdmFyIGZyb20gPSBwcmVmZXJlbmNlLmluZGV4T2YoZGJbdHlwZXNbZXh0ZW5zaW9uXV0uc291cmNlKVxuICAgICAgICB2YXIgdG8gPSBwcmVmZXJlbmNlLmluZGV4T2YobWltZS5zb3VyY2UpXG5cbiAgICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0gIT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nICYmXG4gICAgICAgICAgKGZyb20gPiB0byB8fCAoZnJvbSA9PT0gdG8gJiYgdHlwZXNbZXh0ZW5zaW9uXS5zdWJzdHIoMCwgMTIpID09PSAnYXBwbGljYXRpb24vJykpKSB7XG4gICAgICAgICAgLy8gc2tpcCB0aGUgcmVtYXBwaW5nXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIGV4dGVuc2lvbiAtPiBtaW1lXG4gICAgICB0eXBlc1tleHRlbnNpb25dID0gdHlwZVxuICAgIH1cbiAgfSlcbn1cbiIsICIvKiFcbiAqIHR5cGUtaXNcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHR5cGVyID0gcmVxdWlyZSgnbWVkaWEtdHlwZXInKVxudmFyIG1pbWUgPSByZXF1aXJlKCdtaW1lLXR5cGVzJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZnJlcXVlc3Rcbm1vZHVsZS5leHBvcnRzLmlzID0gdHlwZWlzXG5tb2R1bGUuZXhwb3J0cy5oYXNCb2R5ID0gaGFzYm9keVxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplXG5tb2R1bGUuZXhwb3J0cy5tYXRjaCA9IG1pbWVNYXRjaFxuXG4vKipcbiAqIENvbXBhcmUgYSBgdmFsdWVgIGNvbnRlbnQtdHlwZSB3aXRoIGB0eXBlc2AuXG4gKiBFYWNoIGB0eXBlYCBjYW4gYmUgYW4gZXh0ZW5zaW9uIGxpa2UgYGh0bWxgLFxuICogYSBzcGVjaWFsIHNob3J0Y3V0IGxpa2UgYG11bHRpcGFydGAgb3IgYHVybGVuY29kZWRgLFxuICogb3IgYSBtaW1lIHR5cGUuXG4gKlxuICogSWYgbm8gdHlwZXMgbWF0Y2gsIGBmYWxzZWAgaXMgcmV0dXJuZWQuXG4gKiBPdGhlcndpc2UsIHRoZSBmaXJzdCBgdHlwZWAgdGhhdCBtYXRjaGVzIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtBcnJheX0gdHlwZXNcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB0eXBlaXMgKHZhbHVlLCB0eXBlc18pIHtcbiAgdmFyIGlcbiAgdmFyIHR5cGVzID0gdHlwZXNfXG5cbiAgLy8gcmVtb3ZlIHBhcmFtZXRlcnMgYW5kIG5vcm1hbGl6ZVxuICB2YXIgdmFsID0gdHJ5Tm9ybWFsaXplVHlwZSh2YWx1ZSlcblxuICAvLyBubyB0eXBlIG9yIGludmFsaWRcbiAgaWYgKCF2YWwpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAodHlwZXMgJiYgIUFycmF5LmlzQXJyYXkodHlwZXMpKSB7XG4gICAgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpXG4gICAgZm9yIChpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpICsgMV1cbiAgICB9XG4gIH1cblxuICAvLyBubyB0eXBlcywgcmV0dXJuIHRoZSBjb250ZW50IHR5cGVcbiAgaWYgKCF0eXBlcyB8fCAhdHlwZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgdmFyIHR5cGVcbiAgZm9yIChpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG1pbWVNYXRjaChub3JtYWxpemUodHlwZSA9IHR5cGVzW2ldKSwgdmFsKSkge1xuICAgICAgcmV0dXJuIHR5cGVbMF0gPT09ICcrJyB8fCB0eXBlLmluZGV4T2YoJyonKSAhPT0gLTFcbiAgICAgICAgPyB2YWxcbiAgICAgICAgOiB0eXBlXG4gICAgfVxuICB9XG5cbiAgLy8gbm8gbWF0Y2hlc1xuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHJlcXVlc3QgaGFzIGEgcmVxdWVzdCBib2R5LlxuICogQSByZXF1ZXN0IHdpdGggYSBib2R5IF9fbXVzdF9fIGVpdGhlciBoYXZlIGB0cmFuc2Zlci1lbmNvZGluZ2BcbiAqIG9yIGBjb250ZW50LWxlbmd0aGAgaGVhZGVycyBzZXQuXG4gKiBodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzQuaHRtbCNzZWM0LjNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBoYXNib2R5IChyZXEpIHtcbiAgcmV0dXJuIHJlcS5oZWFkZXJzWyd0cmFuc2Zlci1lbmNvZGluZyddICE9PSB1bmRlZmluZWQgfHxcbiAgICAhaXNOYU4ocmVxLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGluY29taW5nIHJlcXVlc3QgY29udGFpbnMgdGhlIFwiQ29udGVudC1UeXBlXCJcbiAqIGhlYWRlciBmaWVsZCwgYW5kIGl0IGNvbnRhaW5zIGFueSBvZiB0aGUgZ2l2ZSBtaW1lIGB0eXBlYHMuXG4gKiBJZiB0aGVyZSBpcyBubyByZXF1ZXN0IGJvZHksIGBudWxsYCBpcyByZXR1cm5lZC5cbiAqIElmIHRoZXJlIGlzIG5vIGNvbnRlbnQgdHlwZSwgYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAqIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgZmlyc3QgYHR5cGVgIHRoYXQgbWF0Y2hlcy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgLy8gV2l0aCBDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOFxuICogICAgIHRoaXMuaXMoJ2h0bWwnKTsgLy8gPT4gJ2h0bWwnXG4gKiAgICAgdGhpcy5pcygndGV4dC9odG1sJyk7IC8vID0+ICd0ZXh0L2h0bWwnXG4gKiAgICAgdGhpcy5pcygndGV4dC8qJywgJ2FwcGxpY2F0aW9uL2pzb24nKTsgLy8gPT4gJ3RleHQvaHRtbCdcbiAqXG4gKiAgICAgLy8gV2hlbiBDb250ZW50LVR5cGUgaXMgYXBwbGljYXRpb24vanNvblxuICogICAgIHRoaXMuaXMoJ2pzb24nLCAndXJsZW5jb2RlZCcpOyAvLyA9PiAnanNvbidcbiAqICAgICB0aGlzLmlzKCdhcHBsaWNhdGlvbi9qc29uJyk7IC8vID0+ICdhcHBsaWNhdGlvbi9qc29uJ1xuICogICAgIHRoaXMuaXMoJ2h0bWwnLCAnYXBwbGljYXRpb24vKicpOyAvLyA9PiAnYXBwbGljYXRpb24vanNvbidcbiAqXG4gKiAgICAgdGhpcy5pcygnaHRtbCcpOyAvLyA9PiBmYWxzZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSB0eXBlcy4uLlxuICogQHJldHVybiB7U3RyaW5nfGZhbHNlfG51bGx9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gdHlwZW9mcmVxdWVzdCAocmVxLCB0eXBlc18pIHtcbiAgdmFyIHR5cGVzID0gdHlwZXNfXG5cbiAgLy8gbm8gYm9keVxuICBpZiAoIWhhc2JvZHkocmVxKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBzdXBwb3J0IGZsYXR0ZW5lZCBhcmd1bWVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdHlwZXNbaV0gPSBhcmd1bWVudHNbaSArIDFdXG4gICAgfVxuICB9XG5cbiAgLy8gcmVxdWVzdCBjb250ZW50IHR5cGVcbiAgdmFyIHZhbHVlID0gcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddXG5cbiAgcmV0dXJuIHR5cGVpcyh2YWx1ZSwgdHlwZXMpXG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgbWltZSB0eXBlLlxuICogSWYgaXQncyBhIHNob3J0aGFuZCwgZXhwYW5kIGl0IHRvIGEgdmFsaWQgbWltZSB0eXBlLlxuICpcbiAqIEluIGdlbmVyYWwsIHlvdSBwcm9iYWJseSB3YW50OlxuICpcbiAqICAgdmFyIHR5cGUgPSBpcyhyZXEsIFsndXJsZW5jb2RlZCcsICdqc29uJywgJ211bHRpcGFydCddKTtcbiAqXG4gKiBUaGVuIHVzZSB0aGUgYXBwcm9wcmlhdGUgYm9keSBwYXJzZXJzLlxuICogVGhlc2UgdGhyZWUgYXJlIHRoZSBtb3N0IGNvbW1vbiByZXF1ZXN0IGJvZHkgdHlwZXNcbiAqIGFuZCBhcmUgdGh1cyBlbnN1cmVkIHRvIHdvcmsuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplICh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBpbnZhbGlkIHR5cGVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3VybGVuY29kZWQnOlxuICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgY2FzZSAnbXVsdGlwYXJ0JzpcbiAgICAgIHJldHVybiAnbXVsdGlwYXJ0LyonXG4gIH1cblxuICBpZiAodHlwZVswXSA9PT0gJysnKSB7XG4gICAgLy8gXCIranNvblwiIC0+IFwiKi8qK2pzb25cIiBleHBhbmRvXG4gICAgcmV0dXJuICcqLyonICsgdHlwZVxuICB9XG5cbiAgcmV0dXJuIHR5cGUuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gbWltZS5sb29rdXAodHlwZSlcbiAgICA6IHR5cGVcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgZXhwZWN0ZWRgIG1pbWUgdHlwZVxuICogbWF0Y2hlcyBgYWN0dWFsYCBtaW1lIHR5cGUgd2l0aFxuICogd2lsZGNhcmQgYW5kICtzdWZmaXggc3VwcG9ydC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXhwZWN0ZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3R1YWxcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1pbWVNYXRjaCAoZXhwZWN0ZWQsIGFjdHVhbCkge1xuICAvLyBpbnZhbGlkIHR5cGVcbiAgaWYgKGV4cGVjdGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gc3BsaXQgdHlwZXNcbiAgdmFyIGFjdHVhbFBhcnRzID0gYWN0dWFsLnNwbGl0KCcvJylcbiAgdmFyIGV4cGVjdGVkUGFydHMgPSBleHBlY3RlZC5zcGxpdCgnLycpXG5cbiAgLy8gaW52YWxpZCBmb3JtYXRcbiAgaWYgKGFjdHVhbFBhcnRzLmxlbmd0aCAhPT0gMiB8fCBleHBlY3RlZFBhcnRzLmxlbmd0aCAhPT0gMikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gdmFsaWRhdGUgdHlwZVxuICBpZiAoZXhwZWN0ZWRQYXJ0c1swXSAhPT0gJyonICYmIGV4cGVjdGVkUGFydHNbMF0gIT09IGFjdHVhbFBhcnRzWzBdKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyB2YWxpZGF0ZSBzdWZmaXggd2lsZGNhcmRcbiAgaWYgKGV4cGVjdGVkUGFydHNbMV0uc3Vic3RyKDAsIDIpID09PSAnKisnKSB7XG4gICAgcmV0dXJuIGV4cGVjdGVkUGFydHNbMV0ubGVuZ3RoIDw9IGFjdHVhbFBhcnRzWzFdLmxlbmd0aCArIDEgJiZcbiAgICAgIGV4cGVjdGVkUGFydHNbMV0uc3Vic3RyKDEpID09PSBhY3R1YWxQYXJ0c1sxXS5zdWJzdHIoMSAtIGV4cGVjdGVkUGFydHNbMV0ubGVuZ3RoKVxuICB9XG5cbiAgLy8gdmFsaWRhdGUgc3VidHlwZVxuICBpZiAoZXhwZWN0ZWRQYXJ0c1sxXSAhPT0gJyonICYmIGV4cGVjdGVkUGFydHNbMV0gIT09IGFjdHVhbFBhcnRzWzFdKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHR5cGUgYW5kIHJlbW92ZSBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVUeXBlICh2YWx1ZSkge1xuICAvLyBwYXJzZSB0aGUgdHlwZVxuICB2YXIgdHlwZSA9IHR5cGVyLnBhcnNlKHZhbHVlKVxuXG4gIC8vIHJlbW92ZSB0aGUgcGFyYW1ldGVyc1xuICB0eXBlLnBhcmFtZXRlcnMgPSB1bmRlZmluZWRcblxuICAvLyByZWZvcm1hdCBpdFxuICByZXR1cm4gdHlwZXIuZm9ybWF0KHR5cGUpXG59XG5cbi8qKlxuICogVHJ5IHRvIG5vcm1hbGl6ZSBhIHR5cGUgYW5kIHJlbW92ZSBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0cnlOb3JtYWxpemVUeXBlICh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVR5cGUodmFsdWUpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbiIsICIvKiFcbiAqIGJvZHktcGFyc2VyXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBieXRlcyA9IHJlcXVpcmUoJ2J5dGVzJylcbnZhciBjb250ZW50VHlwZSA9IHJlcXVpcmUoJ2NvbnRlbnQtdHlwZScpXG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCdodHRwLWVycm9ycycpXG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdib2R5LXBhcnNlcjpqc29uJylcbnZhciByZWFkID0gcmVxdWlyZSgnLi4vcmVhZCcpXG52YXIgdHlwZWlzID0gcmVxdWlyZSgndHlwZS1pcycpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBqc29uXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHRoZSBmaXJzdCBub24tc3BhY2UgaW4gYSBzdHJpbmcuXG4gKlxuICogQWxsb3dlZCB3aGl0ZXNwYWNlIGlzIGRlZmluZWQgaW4gUkZDIDcxNTk6XG4gKlxuICogICAgd3MgPSAqKFxuICogICAgICAgICAgICAleDIwIC8gICAgICAgICAgICAgIDsgU3BhY2VcbiAqICAgICAgICAgICAgJXgwOSAvICAgICAgICAgICAgICA7IEhvcml6b250YWwgdGFiXG4gKiAgICAgICAgICAgICV4MEEgLyAgICAgICAgICAgICAgOyBMaW5lIGZlZWQgb3IgTmV3IGxpbmVcbiAqICAgICAgICAgICAgJXgwRCApICAgICAgICAgICAgICA7IENhcnJpYWdlIHJldHVyblxuICovXG5cbnZhciBGSVJTVF9DSEFSX1JFR0VYUCA9IC9eW1xceDIwXFx4MDlcXHgwYVxceDBkXSooW15cXHgyMFxceDA5XFx4MGFcXHgwZF0pLyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIEpTT04gYm9kaWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGpzb24gKG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9XG5cbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgIT09ICdudW1iZXInXG4gICAgPyBieXRlcy5wYXJzZShvcHRzLmxpbWl0IHx8ICcxMDBrYicpXG4gICAgOiBvcHRzLmxpbWl0XG4gIHZhciBpbmZsYXRlID0gb3B0cy5pbmZsYXRlICE9PSBmYWxzZVxuICB2YXIgcmV2aXZlciA9IG9wdHMucmV2aXZlclxuICB2YXIgc3RyaWN0ID0gb3B0cy5zdHJpY3QgIT09IGZhbHNlXG4gIHZhciB0eXBlID0gb3B0cy50eXBlIHx8ICdhcHBsaWNhdGlvbi9qc29uJ1xuICB2YXIgdmVyaWZ5ID0gb3B0cy52ZXJpZnkgfHwgZmFsc2VcblxuICBpZiAodmVyaWZ5ICE9PSBmYWxzZSAmJiB0eXBlb2YgdmVyaWZ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHZlcmlmeSBtdXN0IGJlIGZ1bmN0aW9uJylcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBjaGVja2luZyBmdW5jdGlvblxuICB2YXIgc2hvdWxkUGFyc2UgPSB0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJ1xuICAgID8gdHlwZUNoZWNrZXIodHlwZSlcbiAgICA6IHR5cGVcblxuICBmdW5jdGlvbiBwYXJzZSAoYm9keSkge1xuICAgIGlmIChib2R5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gc3BlY2lhbC1jYXNlIGVtcHR5IGpzb24gYm9keSwgYXMgaXQncyBhIGNvbW1vbiBjbGllbnQtc2lkZSBtaXN0YWtlXG4gICAgICAvLyBUT0RPOiBtYXliZSBtYWtlIHRoaXMgY29uZmlndXJhYmxlIG9yIHBhcnQgb2YgXCJzdHJpY3RcIiBvcHRpb25cbiAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIGlmIChzdHJpY3QpIHtcbiAgICAgIHZhciBmaXJzdCA9IGZpcnN0Y2hhcihib2R5KVxuXG4gICAgICBpZiAoZmlyc3QgIT09ICd7JyAmJiBmaXJzdCAhPT0gJ1snKSB7XG4gICAgICAgIGRlYnVnKCdzdHJpY3QgdmlvbGF0aW9uJylcbiAgICAgICAgdGhyb3cgY3JlYXRlU3RyaWN0U3ludGF4RXJyb3IoYm9keSwgZmlyc3QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGRlYnVnKCdwYXJzZSBqc29uJylcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGJvZHksIHJldml2ZXIpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbm9ybWFsaXplSnNvblN5bnRheEVycm9yKGUsIHtcbiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICBzdGFjazogZS5zdGFja1xuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24ganNvblBhcnNlciAocmVxLCByZXMsIG5leHQpIHtcbiAgICBpZiAocmVxLl9ib2R5KSB7XG4gICAgICBkZWJ1ZygnYm9keSBhbHJlYWR5IHBhcnNlZCcpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcS5ib2R5ID0gcmVxLmJvZHkgfHwge31cblxuICAgIC8vIHNraXAgcmVxdWVzdHMgd2l0aG91dCBib2RpZXNcbiAgICBpZiAoIXR5cGVpcy5oYXNCb2R5KHJlcSkpIHtcbiAgICAgIGRlYnVnKCdza2lwIGVtcHR5IGJvZHknKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkZWJ1ZygnY29udGVudC10eXBlICVqJywgcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKVxuXG4gICAgLy8gZGV0ZXJtaW5lIGlmIHJlcXVlc3Qgc2hvdWxkIGJlIHBhcnNlZFxuICAgIGlmICghc2hvdWxkUGFyc2UocmVxKSkge1xuICAgICAgZGVidWcoJ3NraXAgcGFyc2luZycpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGFzc2VydCBjaGFyc2V0IHBlciBSRkMgNzE1OSBzZWMgOC4xXG4gICAgdmFyIGNoYXJzZXQgPSBnZXRDaGFyc2V0KHJlcSkgfHwgJ3V0Zi04J1xuICAgIGlmIChjaGFyc2V0LnNsaWNlKDAsIDQpICE9PSAndXRmLScpIHtcbiAgICAgIGRlYnVnKCdpbnZhbGlkIGNoYXJzZXQnKVxuICAgICAgbmV4dChjcmVhdGVFcnJvcig0MTUsICd1bnN1cHBvcnRlZCBjaGFyc2V0IFwiJyArIGNoYXJzZXQudG9VcHBlckNhc2UoKSArICdcIicsIHtcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgdHlwZTogJ2NoYXJzZXQudW5zdXBwb3J0ZWQnXG4gICAgICB9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHJlYWRcbiAgICByZWFkKHJlcSwgcmVzLCBuZXh0LCBwYXJzZSwgZGVidWcsIHtcbiAgICAgIGVuY29kaW5nOiBjaGFyc2V0LFxuICAgICAgaW5mbGF0ZTogaW5mbGF0ZSxcbiAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgIHZlcmlmeTogdmVyaWZ5XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBzdHJpY3QgdmlvbGF0aW9uIHN5bnRheCBlcnJvciBtYXRjaGluZyBuYXRpdmUgZXJyb3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJcbiAqIEByZXR1cm4ge0Vycm9yfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdHJpY3RTeW50YXhFcnJvciAoc3RyLCBjaGFyKSB7XG4gIHZhciBpbmRleCA9IHN0ci5pbmRleE9mKGNoYXIpXG4gIHZhciBwYXJ0aWFsID0gaW5kZXggIT09IC0xXG4gICAgPyBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSArICcjJ1xuICAgIDogJydcblxuICB0cnkge1xuICAgIEpTT04ucGFyc2UocGFydGlhbCk7IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHRocm93IG5ldyBTeW50YXhFcnJvcignc3RyaWN0IHZpb2xhdGlvbicpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplSnNvblN5bnRheEVycm9yKGUsIHtcbiAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZS5yZXBsYWNlKCcjJywgY2hhciksXG4gICAgICBzdGFjazogZS5zdGFja1xuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZmlyc3RjaGFyIChzdHIpIHtcbiAgdmFyIG1hdGNoID0gRklSU1RfQ0hBUl9SRUdFWFAuZXhlYyhzdHIpXG5cbiAgcmV0dXJuIG1hdGNoXG4gICAgPyBtYXRjaFsxXVxuICAgIDogdW5kZWZpbmVkXG59XG5cbi8qKlxuICogR2V0IHRoZSBjaGFyc2V0IG9mIGEgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRDaGFyc2V0IChyZXEpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGNvbnRlbnRUeXBlLnBhcnNlKHJlcSkucGFyYW1ldGVycy5jaGFyc2V0IHx8ICcnKS50b0xvd2VyQ2FzZSgpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYSBTeW50YXhFcnJvciBmb3IgSlNPTi5wYXJzZS5cbiAqXG4gKiBAcGFyYW0ge1N5bnRheEVycm9yfSBlcnJvclxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHJldHVybiB7U3ludGF4RXJyb3J9XG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplSnNvblN5bnRheEVycm9yIChlcnJvciwgb2JqKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXJyb3IpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV1cbiAgICBpZiAoa2V5ICE9PSAnc3RhY2snICYmIGtleSAhPT0gJ21lc3NhZ2UnKSB7XG4gICAgICBkZWxldGUgZXJyb3Jba2V5XVxuICAgIH1cbiAgfVxuXG4gIC8vIHJlcGxhY2Ugc3RhY2sgYmVmb3JlIG1lc3NhZ2UgZm9yIE5vZGUuanMgMC4xMCBhbmQgYmVsb3dcbiAgZXJyb3Iuc3RhY2sgPSBvYmouc3RhY2sucmVwbGFjZShlcnJvci5tZXNzYWdlLCBvYmoubWVzc2FnZSlcbiAgZXJyb3IubWVzc2FnZSA9IG9iai5tZXNzYWdlXG5cbiAgcmV0dXJuIGVycm9yXG59XG5cbi8qKlxuICogR2V0IHRoZSBzaW1wbGUgdHlwZSBjaGVja2VyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqL1xuXG5mdW5jdGlvbiB0eXBlQ2hlY2tlciAodHlwZSkge1xuICByZXR1cm4gZnVuY3Rpb24gY2hlY2tUeXBlIChyZXEpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0eXBlaXMocmVxLCB0eXBlKSlcbiAgfVxufVxuIiwgIi8qIVxuICogYm9keS1wYXJzZXJcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGJ5dGVzID0gcmVxdWlyZSgnYnl0ZXMnKVxudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYm9keS1wYXJzZXI6cmF3JylcbnZhciByZWFkID0gcmVxdWlyZSgnLi4vcmVhZCcpXG52YXIgdHlwZWlzID0gcmVxdWlyZSgndHlwZS1pcycpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByYXdcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIHJhdyBib2RpZXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJhdyAob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge31cblxuICB2YXIgaW5mbGF0ZSA9IG9wdHMuaW5mbGF0ZSAhPT0gZmFsc2VcbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgIT09ICdudW1iZXInXG4gICAgPyBieXRlcy5wYXJzZShvcHRzLmxpbWl0IHx8ICcxMDBrYicpXG4gICAgOiBvcHRzLmxpbWl0XG4gIHZhciB0eXBlID0gb3B0cy50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gIHZhciB2ZXJpZnkgPSBvcHRzLnZlcmlmeSB8fCBmYWxzZVxuXG4gIGlmICh2ZXJpZnkgIT09IGZhbHNlICYmIHR5cGVvZiB2ZXJpZnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gdmVyaWZ5IG11c3QgYmUgZnVuY3Rpb24nKVxuICB9XG5cbiAgLy8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9uXG4gIHZhciBzaG91bGRQYXJzZSA9IHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nXG4gICAgPyB0eXBlQ2hlY2tlcih0eXBlKVxuICAgIDogdHlwZVxuXG4gIGZ1bmN0aW9uIHBhcnNlIChidWYpIHtcbiAgICByZXR1cm4gYnVmXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcmF3UGFyc2VyIChyZXEsIHJlcywgbmV4dCkge1xuICAgIGlmIChyZXEuX2JvZHkpIHtcbiAgICAgIGRlYnVnKCdib2R5IGFscmVhZHkgcGFyc2VkJylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVxLmJvZHkgPSByZXEuYm9keSB8fCB7fVxuXG4gICAgLy8gc2tpcCByZXF1ZXN0cyB3aXRob3V0IGJvZGllc1xuICAgIGlmICghdHlwZWlzLmhhc0JvZHkocmVxKSkge1xuICAgICAgZGVidWcoJ3NraXAgZW1wdHkgYm9keScpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGRlYnVnKCdjb250ZW50LXR5cGUgJWonLCByZXEuaGVhZGVyc1snY29udGVudC10eXBlJ10pXG5cbiAgICAvLyBkZXRlcm1pbmUgaWYgcmVxdWVzdCBzaG91bGQgYmUgcGFyc2VkXG4gICAgaWYgKCFzaG91bGRQYXJzZShyZXEpKSB7XG4gICAgICBkZWJ1Zygnc2tpcCBwYXJzaW5nJylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gcmVhZFxuICAgIHJlYWQocmVxLCByZXMsIG5leHQsIHBhcnNlLCBkZWJ1Zywge1xuICAgICAgZW5jb2Rpbmc6IG51bGwsXG4gICAgICBpbmZsYXRlOiBpbmZsYXRlLFxuICAgICAgbGltaXQ6IGxpbWl0LFxuICAgICAgdmVyaWZ5OiB2ZXJpZnlcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzaW1wbGUgdHlwZSBjaGVja2VyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqL1xuXG5mdW5jdGlvbiB0eXBlQ2hlY2tlciAodHlwZSkge1xuICByZXR1cm4gZnVuY3Rpb24gY2hlY2tUeXBlIChyZXEpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0eXBlaXMocmVxLCB0eXBlKSlcbiAgfVxufVxuIiwgIi8qIVxuICogYm9keS1wYXJzZXJcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGJ5dGVzID0gcmVxdWlyZSgnYnl0ZXMnKVxudmFyIGNvbnRlbnRUeXBlID0gcmVxdWlyZSgnY29udGVudC10eXBlJylcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2JvZHktcGFyc2VyOnRleHQnKVxudmFyIHJlYWQgPSByZXF1aXJlKCcuLi9yZWFkJylcbnZhciB0eXBlaXMgPSByZXF1aXJlKCd0eXBlLWlzJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRleHRcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIHRleHQgYm9kaWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB0ZXh0IChvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fVxuXG4gIHZhciBkZWZhdWx0Q2hhcnNldCA9IG9wdHMuZGVmYXVsdENoYXJzZXQgfHwgJ3V0Zi04J1xuICB2YXIgaW5mbGF0ZSA9IG9wdHMuaW5mbGF0ZSAhPT0gZmFsc2VcbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgIT09ICdudW1iZXInXG4gICAgPyBieXRlcy5wYXJzZShvcHRzLmxpbWl0IHx8ICcxMDBrYicpXG4gICAgOiBvcHRzLmxpbWl0XG4gIHZhciB0eXBlID0gb3B0cy50eXBlIHx8ICd0ZXh0L3BsYWluJ1xuICB2YXIgdmVyaWZ5ID0gb3B0cy52ZXJpZnkgfHwgZmFsc2VcblxuICBpZiAodmVyaWZ5ICE9PSBmYWxzZSAmJiB0eXBlb2YgdmVyaWZ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHZlcmlmeSBtdXN0IGJlIGZ1bmN0aW9uJylcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBjaGVja2luZyBmdW5jdGlvblxuICB2YXIgc2hvdWxkUGFyc2UgPSB0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJ1xuICAgID8gdHlwZUNoZWNrZXIodHlwZSlcbiAgICA6IHR5cGVcblxuICBmdW5jdGlvbiBwYXJzZSAoYnVmKSB7XG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHRleHRQYXJzZXIgKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgaWYgKHJlcS5fYm9keSkge1xuICAgICAgZGVidWcoJ2JvZHkgYWxyZWFkeSBwYXJzZWQnKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXEuYm9keSA9IHJlcS5ib2R5IHx8IHt9XG5cbiAgICAvLyBza2lwIHJlcXVlc3RzIHdpdGhvdXQgYm9kaWVzXG4gICAgaWYgKCF0eXBlaXMuaGFzQm9keShyZXEpKSB7XG4gICAgICBkZWJ1Zygnc2tpcCBlbXB0eSBib2R5JylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbnRlbnQtdHlwZSAlaicsIHJlcS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSlcblxuICAgIC8vIGRldGVybWluZSBpZiByZXF1ZXN0IHNob3VsZCBiZSBwYXJzZWRcbiAgICBpZiAoIXNob3VsZFBhcnNlKHJlcSkpIHtcbiAgICAgIGRlYnVnKCdza2lwIHBhcnNpbmcnKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgY2hhcnNldFxuICAgIHZhciBjaGFyc2V0ID0gZ2V0Q2hhcnNldChyZXEpIHx8IGRlZmF1bHRDaGFyc2V0XG5cbiAgICAvLyByZWFkXG4gICAgcmVhZChyZXEsIHJlcywgbmV4dCwgcGFyc2UsIGRlYnVnLCB7XG4gICAgICBlbmNvZGluZzogY2hhcnNldCxcbiAgICAgIGluZmxhdGU6IGluZmxhdGUsXG4gICAgICBsaW1pdDogbGltaXQsXG4gICAgICB2ZXJpZnk6IHZlcmlmeVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNoYXJzZXQgb2YgYSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldENoYXJzZXQgKHJlcSkge1xuICB0cnkge1xuICAgIHJldHVybiAoY29udGVudFR5cGUucGFyc2UocmVxKS5wYXJhbWV0ZXJzLmNoYXJzZXQgfHwgJycpLnRvTG93ZXJDYXNlKClcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgc2ltcGxlIHR5cGUgY2hlY2tlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKi9cblxuZnVuY3Rpb24gdHlwZUNoZWNrZXIgKHR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNoZWNrVHlwZSAocmVxKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odHlwZWlzKHJlcSwgdHlwZSkpXG4gIH1cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0dmFyIG9iaiA9IHt9O1xuXHR2YXIgc3ltID0gU3ltYm9sKCd0ZXN0Jyk7XG5cdHZhciBzeW1PYmogPSBPYmplY3Qoc3ltKTtcblx0aWYgKHR5cGVvZiBzeW0gPT09ICdzdHJpbmcnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9vYmplY3QuYXNzaWduL2lzc3Vlcy8xN1xuXHQvLyBpZiAoc3ltIGluc3RhbmNlb2YgU3ltYm9sKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMvaXNzdWVzLzRcblx0Ly8gaWYgKCEoc3ltT2JqIGluc3RhbmNlb2YgU3ltYm9sKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBpZiAodHlwZW9mIFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIGlmIChTdHJpbmcoc3ltKSAhPT0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bVZhbCA9IDQyO1xuXHRvYmpbc3ltXSA9IHN5bVZhbDtcblx0Zm9yIChzeW0gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby11bnJlYWNoYWJsZS1sb29wXG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKTtcblx0XHRpZiAoZGVzY3JpcHRvci52YWx1ZSAhPT0gc3ltVmFsIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSAhPT0gdHJ1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBvcmlnU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sO1xudmFyIGhhc1N5bWJvbFNoYW0gPSByZXF1aXJlKCcuL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sKCdmb28nKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sKCdiYXInKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0cmV0dXJuIGhhc1N5bWJvbFNoYW0oKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdGVzdCA9IHtcblx0Zm9vOiB7fVxufTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzUHJvdG8oKSB7XG5cdHJldHVybiB7IF9fcHJvdG9fXzogdGVzdCB9LmZvbyA9PT0gdGVzdC5mb28gJiYgISh7IF9fcHJvdG9fXzogbnVsbCB9IGluc3RhbmNlb2YgJE9iamVjdCk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBNYXRoLm1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzLnB1c2goJyQnICsgaSk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGJvdW5kQXJncy5qb2luKCcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBpbXBsZW1lbnRhdGlvbjtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkU3ludGF4RXJyb3IgPSBTeW50YXhFcnJvcjtcbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRCh7fSwgJycpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0JGdPUEQgPSBudWxsOyAvLyB0aGlzIGlzIElFIDgsIHdoaWNoIGhhcyBhIGJyb2tlbiBnT1BEXG5cdH1cbn1cblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xudmFyIGhhc1Byb3RvID0gcmVxdWlyZSgnaGFzLXByb3RvJykoKTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IChcblx0aGFzUHJvdG9cblx0XHQ/IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4Ll9fcHJvdG9fXzsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cdFx0OiBudWxsXG4pO1xuXG52YXIgbmVlZHNFdmFsID0ge307XG5cbnZhciBUeXBlZEFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKFVpbnQ4QXJyYXkpO1xuXG52YXIgSU5UUklOU0lDUyA9IHtcblx0JyVBZ2dyZWdhdGVFcnJvciUnOiB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQWdncmVnYXRlRXJyb3IsXG5cdCclQXJyYXklJzogQXJyYXksXG5cdCclQXJyYXlCdWZmZXIlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFycmF5QnVmZmVyLFxuXHQnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Z1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiBuZWVkc0V2YWwsXG5cdCclQXRvbWljcyUnOiB0eXBlb2YgQXRvbWljcyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBdG9taWNzLFxuXHQnJUJpZ0ludCUnOiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludCxcblx0JyVCaWdJbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdJbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludDY0QXJyYXksXG5cdCclQmlnVWludDY0QXJyYXklJzogdHlwZW9mIEJpZ1VpbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ1VpbnQ2NEFycmF5LFxuXHQnJUJvb2xlYW4lJzogQm9vbGVhbixcblx0JyVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcsXG5cdCclRGF0ZSUnOiBEYXRlLFxuXHQnJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG5cdCclZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuXHQnJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG5cdCclRXJyb3IlJzogRXJyb3IsXG5cdCclZXZhbCUnOiBldmFsLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcblx0JyVFdmFsRXJyb3IlJzogRXZhbEVycm9yLFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclTWF0aCUnOiBNYXRoLFxuXHQnJU51bWJlciUnOiBOdW1iZXIsXG5cdCclT2JqZWN0JSc6IE9iamVjdCxcblx0JyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyVSYW5nZUVycm9yJSc6IFJhbmdlRXJyb3IsXG5cdCclUmVmZXJlbmNlRXJyb3IlJzogUmVmZXJlbmNlRXJyb3IsXG5cdCclUmVmbGVjdCUnOiB0eXBlb2YgUmVmbGVjdCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBSZWZsZWN0LFxuXHQnJVJlZ0V4cCUnOiBSZWdFeHAsXG5cdCclU2V0JSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2V0LFxuXHQnJVNldEl0ZXJhdG9yUHJvdG90eXBlJSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNTeW1ib2xzIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlcixcblx0JyVTdHJpbmclJzogU3RyaW5nLFxuXHQnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90bygnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJVN5bWJvbCUnOiBoYXNTeW1ib2xzID8gU3ltYm9sIDogdW5kZWZpbmVkLFxuXHQnJVN5bnRheEVycm9yJSc6ICRTeW50YXhFcnJvcixcblx0JyVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcblx0JyVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG5cdCclVHlwZUVycm9yJSc6ICRUeXBlRXJyb3IsXG5cdCclVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheSxcblx0JyVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXksXG5cdCclVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LFxuXHQnJVVSSUVycm9yJSc6IFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdCclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvdHlwZSUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG9fZW50cmllcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdlbnRyaWVzJ10sXG5cdCclQXJyYXlQcm90b19mb3JFYWNoJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2ZvckVhY2gnXSxcblx0JyVBcnJheVByb3RvX2tleXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAna2V5cyddLFxuXHQnJUFycmF5UHJvdG9fdmFsdWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ3ZhbHVlcyddLFxuXHQnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogWydBc3luY0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUJvb2xlYW5Qcm90b3R5cGUlJzogWydCb29sZWFuJywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGFWaWV3UHJvdG90eXBlJSc6IFsnRGF0YVZpZXcnLCAncHJvdG90eXBlJ10sXG5cdCclRGF0ZVByb3RvdHlwZSUnOiBbJ0RhdGUnLCAncHJvdG90eXBlJ10sXG5cdCclRXJyb3JQcm90b3R5cGUlJzogWydFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVFdmFsRXJyb3JQcm90b3R5cGUlJzogWydFdmFsRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0NjRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvciUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogWydJbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ0ludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ0ludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSlNPTlBhcnNlJSc6IFsnSlNPTicsICdwYXJzZSddLFxuXHQnJUpTT05TdHJpbmdpZnklJzogWydKU09OJywgJ3N0cmluZ2lmeSddLFxuXHQnJU1hcFByb3RvdHlwZSUnOiBbJ01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVOdW1iZXJQcm90b3R5cGUlJzogWydOdW1iZXInLCAncHJvdG90eXBlJ10sXG5cdCclT2JqZWN0UHJvdG90eXBlJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZSddLFxuXHQnJU9ialByb3RvX3RvU3RyaW5nJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd0b1N0cmluZyddLFxuXHQnJU9ialByb3RvX3ZhbHVlT2YlJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3ZhbHVlT2YnXSxcblx0JyVQcm9taXNlUHJvdG90eXBlJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnXSxcblx0JyVQcm9taXNlUHJvdG9fdGhlbiUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJywgJ3RoZW4nXSxcblx0JyVQcm9taXNlX2FsbCUnOiBbJ1Byb21pc2UnLCAnYWxsJ10sXG5cdCclUHJvbWlzZV9yZWplY3QlJzogWydQcm9taXNlJywgJ3JlamVjdCddLFxuXHQnJVByb21pc2VfcmVzb2x2ZSUnOiBbJ1Byb21pc2UnLCAncmVzb2x2ZSddLFxuXHQnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogWydSYW5nZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFsnUmVmZXJlbmNlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVnRXhwUHJvdG90eXBlJSc6IFsnUmVnRXhwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVNldFByb3RvdHlwZSUnOiBbJ1NldCcsICdwcm90b3R5cGUnXSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ1NoYXJlZEFycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN0cmluZ1Byb3RvdHlwZSUnOiBbJ1N0cmluZycsICdwcm90b3R5cGUnXSxcblx0JyVTeW1ib2xQcm90b3R5cGUlJzogWydTeW1ib2wnLCAncHJvdG90eXBlJ10sXG5cdCclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogWydTeW50YXhFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVHlwZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlRXJyb3JQcm90b3R5cGUlJzogWydUeXBlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJzogWydVaW50OENsYW1wZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnVWludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVVJJRXJyb3JQcm90b3R5cGUlJzogWydVUklFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrTWFwUHJvdG90eXBlJSc6IFsnV2Vha01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrU2V0UHJvdG90eXBlJSc6IFsnV2Vha1NldCcsICdwcm90b3R5cGUnXVxufTtcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgJGNvbmNhdCA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciAkc3BsaWNlQXBwbHkgPSBiaW5kLmNhbGwoRnVuY3Rpb24uYXBwbHksIEFycmF5LnByb3RvdHlwZS5zcGxpY2UpO1xudmFyICRyZXBsYWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG52YXIgJHN0clNsaWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xudmFyICRleGVjID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyk7XG5cbi8qIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iLzQuMTcuMTUvZGlzdC9sb2Rhc2guanMjTDY3MzUtTDY3NDQgKi9cbnZhciByZVByb3BOYW1lID0gL1teJS5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwlJCkpL2c7XG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7IC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IGZ1bmN0aW9uIHN0cmluZ1RvUGF0aChzdHJpbmcpIHtcblx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHN0cmluZywgMCwgMSk7XG5cdHZhciBsYXN0ID0gJHN0clNsaWNlKHN0cmluZywgLTEpO1xuXHRpZiAoZmlyc3QgPT09ICclJyAmJiBsYXN0ICE9PSAnJScpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIGNsb3NpbmcgYCVgJyk7XG5cdH0gZWxzZSBpZiAobGFzdCA9PT0gJyUnICYmIGZpcnN0ICE9PSAnJScpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIG9wZW5pbmcgYCVgJyk7XG5cdH1cblx0dmFyIHJlc3VsdCA9IFtdO1xuXHQkcmVwbGFjZShzdHJpbmcsIHJlUHJvcE5hbWUsIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG5cdFx0cmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gcXVvdGUgPyAkcmVwbGFjZShzdWJTdHJpbmcsIHJlRXNjYXBlQ2hhciwgJyQxJykgOiBudW1iZXIgfHwgbWF0Y2g7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcbi8qIGVuZCBhZGFwdGF0aW9uICovXG5cbnZhciBnZXRCYXNlSW50cmluc2ljID0gZnVuY3Rpb24gZ2V0QmFzZUludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0dmFyIGludHJpbnNpY05hbWUgPSBuYW1lO1xuXHR2YXIgYWxpYXM7XG5cdGlmIChoYXNPd24oTEVHQUNZX0FMSUFTRVMsIGludHJpbnNpY05hbWUpKSB7XG5cdFx0YWxpYXMgPSBMRUdBQ1lfQUxJQVNFU1tpbnRyaW5zaWNOYW1lXTtcblx0XHRpbnRyaW5zaWNOYW1lID0gJyUnICsgYWxpYXNbMF0gKyAnJSc7XG5cdH1cblxuXHRpZiAoaGFzT3duKElOVFJJTlNJQ1MsIGludHJpbnNpY05hbWUpKSB7XG5cdFx0dmFyIHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNOYW1lXTtcblx0XHRpZiAodmFsdWUgPT09IG5lZWRzRXZhbCkge1xuXHRcdFx0dmFsdWUgPSBkb0V2YWwoaW50cmluc2ljTmFtZSk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnICYmICFhbGxvd01pc3NpbmcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRhbGlhczogYWxpYXMsXG5cdFx0XHRuYW1lOiBpbnRyaW5zaWNOYW1lLFxuXHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0fTtcblx0fVxuXG5cdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QhJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEdldEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0aWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgYWxsb3dNaXNzaW5nICE9PSAnYm9vbGVhbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignXCJhbGxvd01pc3NpbmdcIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuXHR9XG5cblx0aWYgKCRleGVjKC9eJT9bXiVdKiU/JC8sIG5hbWUpID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignYCVgIG1heSBub3QgYmUgcHJlc2VudCBhbnl3aGVyZSBidXQgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBpbnRyaW5zaWMgbmFtZScpO1xuXHR9XG5cdHZhciBwYXJ0cyA9IHN0cmluZ1RvUGF0aChuYW1lKTtcblx0dmFyIGludHJpbnNpY0Jhc2VOYW1lID0gcGFydHMubGVuZ3RoID4gMCA/IHBhcnRzWzBdIDogJyc7XG5cblx0dmFyIGludHJpbnNpYyA9IGdldEJhc2VJbnRyaW5zaWMoJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJScsIGFsbG93TWlzc2luZyk7XG5cdHZhciBpbnRyaW5zaWNSZWFsTmFtZSA9IGludHJpbnNpYy5uYW1lO1xuXHR2YXIgdmFsdWUgPSBpbnRyaW5zaWMudmFsdWU7XG5cdHZhciBza2lwRnVydGhlckNhY2hpbmcgPSBmYWxzZTtcblxuXHR2YXIgYWxpYXMgPSBpbnRyaW5zaWMuYWxpYXM7XG5cdGlmIChhbGlhcykge1xuXHRcdGludHJpbnNpY0Jhc2VOYW1lID0gYWxpYXNbMF07XG5cdFx0JHNwbGljZUFwcGx5KHBhcnRzLCAkY29uY2F0KFswLCAxXSwgYWxpYXMpKTtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAxLCBpc093biA9IHRydWU7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHZhciBwYXJ0ID0gcGFydHNbaV07XG5cdFx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHBhcnQsIDAsIDEpO1xuXHRcdHZhciBsYXN0ID0gJHN0clNsaWNlKHBhcnQsIC0xKTtcblx0XHRpZiAoXG5cdFx0XHQoXG5cdFx0XHRcdChmaXJzdCA9PT0gJ1wiJyB8fCBmaXJzdCA9PT0gXCInXCIgfHwgZmlyc3QgPT09ICdgJylcblx0XHRcdFx0fHwgKGxhc3QgPT09ICdcIicgfHwgbGFzdCA9PT0gXCInXCIgfHwgbGFzdCA9PT0gJ2AnKVxuXHRcdFx0KVxuXHRcdFx0JiYgZmlyc3QgIT09IGxhc3Rcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3Byb3BlcnR5IG5hbWVzIHdpdGggcXVvdGVzIG11c3QgaGF2ZSBtYXRjaGluZyBxdW90ZXMnKTtcblx0XHR9XG5cdFx0aWYgKHBhcnQgPT09ICdjb25zdHJ1Y3RvcicgfHwgIWlzT3duKSB7XG5cdFx0XHRza2lwRnVydGhlckNhY2hpbmcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGludHJpbnNpY0Jhc2VOYW1lICs9ICcuJyArIHBhcnQ7XG5cdFx0aW50cmluc2ljUmVhbE5hbWUgPSAnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJztcblxuXHRcdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljUmVhbE5hbWUpKSB7XG5cdFx0XHR2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0aWYgKCEocGFydCBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0aWYgKCFhbGxvd01pc3NpbmcpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYmFzZSBpbnRyaW5zaWMgZm9yICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGdPUEQgJiYgKGkgKyAxKSA+PSBwYXJ0cy5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGRlc2MgPSAkZ09QRCh2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdGlzT3duID0gISFkZXNjO1xuXG5cdFx0XHRcdC8vIEJ5IGNvbnZlbnRpb24sIHdoZW4gYSBkYXRhIHByb3BlcnR5IGlzIGNvbnZlcnRlZCB0byBhbiBhY2Nlc3NvclxuXHRcdFx0XHQvLyBwcm9wZXJ0eSB0byBlbXVsYXRlIGEgZGF0YSBwcm9wZXJ0eSB0aGF0IGRvZXMgbm90IHN1ZmZlciBmcm9tXG5cdFx0XHRcdC8vIHRoZSBvdmVycmlkZSBtaXN0YWtlLCB0aGF0IGFjY2Vzc29yJ3MgZ2V0dGVyIGlzIG1hcmtlZCB3aXRoXG5cdFx0XHRcdC8vIGFuIGBvcmlnaW5hbFZhbHVlYCBwcm9wZXJ0eS4gSGVyZSwgd2hlbiB3ZSBkZXRlY3QgdGhpcywgd2Vcblx0XHRcdFx0Ly8gdXBob2xkIHRoZSBpbGx1c2lvbiBieSBwcmV0ZW5kaW5nIHRvIHNlZSB0aGF0IG9yaWdpbmFsIGRhdGFcblx0XHRcdFx0Ly8gcHJvcGVydHksIGkuZS4sIHJldHVybmluZyB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGdldHRlclxuXHRcdFx0XHQvLyBpdHNlbGYuXG5cdFx0XHRcdGlmIChpc093biAmJiAnZ2V0JyBpbiBkZXNjICYmICEoJ29yaWdpbmFsVmFsdWUnIGluIGRlc2MuZ2V0KSkge1xuXHRcdFx0XHRcdHZhbHVlID0gZGVzYy5nZXQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXNPd24gPSBoYXNPd24odmFsdWUsIHBhcnQpO1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPd24gJiYgIXNraXBGdXJ0aGVyQ2FjaGluZykge1xuXHRcdFx0XHRJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgJGFwcGx5ID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5JScpO1xudmFyICRjYWxsID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwlJyk7XG52YXIgJHJlZmxlY3RBcHBseSA9IEdldEludHJpbnNpYygnJVJlZmxlY3QuYXBwbHklJywgdHJ1ZSkgfHwgYmluZC5jYWxsKCRjYWxsLCAkYXBwbHkpO1xuXG52YXIgJGdPUEQgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJScsIHRydWUpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IEdldEludHJpbnNpYygnJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUnLCB0cnVlKTtcbnZhciAkbWF4ID0gR2V0SW50cmluc2ljKCclTWF0aC5tYXglJyk7XG5cbmlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0dHJ5IHtcblx0XHQkZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyB2YWx1ZTogMSB9KTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIElFIDggaGFzIGEgYnJva2VuIGRlZmluZVByb3BlcnR5XG5cdFx0JGRlZmluZVByb3BlcnR5ID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCaW5kKG9yaWdpbmFsRnVuY3Rpb24pIHtcblx0dmFyIGZ1bmMgPSAkcmVmbGVjdEFwcGx5KGJpbmQsICRjYWxsLCBhcmd1bWVudHMpO1xuXHRpZiAoJGdPUEQgJiYgJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0dmFyIGRlc2MgPSAkZ09QRChmdW5jLCAnbGVuZ3RoJyk7XG5cdFx0aWYgKGRlc2MuY29uZmlndXJhYmxlKSB7XG5cdFx0XHQvLyBvcmlnaW5hbCBsZW5ndGgsIHBsdXMgdGhlIHJlY2VpdmVyLCBtaW51cyBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgKGFmdGVyIHRoZSByZWNlaXZlcilcblx0XHRcdCRkZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0ZnVuYyxcblx0XHRcdFx0J2xlbmd0aCcsXG5cdFx0XHRcdHsgdmFsdWU6IDEgKyAkbWF4KDAsIG9yaWdpbmFsRnVuY3Rpb24ubGVuZ3RoIC0gKGFyZ3VtZW50cy5sZW5ndGggLSAxKSkgfVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZ1bmM7XG59O1xuXG52YXIgYXBwbHlCaW5kID0gZnVuY3Rpb24gYXBwbHlCaW5kKCkge1xuXHRyZXR1cm4gJHJlZmxlY3RBcHBseShiaW5kLCAkYXBwbHksIGFyZ3VtZW50cyk7XG59O1xuXG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdCRkZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ2FwcGx5JywgeyB2YWx1ZTogYXBwbHlCaW5kIH0pO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMuYXBwbHkgPSBhcHBseUJpbmQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCd1dGlsJykuaW5zcGVjdDtcbiIsICJ2YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBNYXAucHJvdG90eXBlO1xudmFyIG1hcFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNNYXAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIG1hcFNpemUgPSBoYXNNYXAgJiYgbWFwU2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIG1hcFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG1hcFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgbWFwRm9yRWFjaCA9IGhhc01hcCAmJiBNYXAucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBTZXQucHJvdG90eXBlO1xudmFyIHNldFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNTZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNldC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIHNldFNpemUgPSBoYXNTZXQgJiYgc2V0U2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIHNldFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgc2V0Rm9yRWFjaCA9IGhhc1NldCAmJiBTZXQucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIFdlYWtNYXAucHJvdG90eXBlO1xudmFyIHdlYWtNYXBIYXMgPSBoYXNXZWFrTWFwID8gV2Vha01hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciBoYXNXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgJiYgV2Vha1NldC5wcm90b3R5cGU7XG52YXIgd2Vha1NldEhhcyA9IGhhc1dlYWtTZXQgPyBXZWFrU2V0LnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtSZWYgPSB0eXBlb2YgV2Vha1JlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrUmVmLnByb3RvdHlwZTtcbnZhciB3ZWFrUmVmRGVyZWYgPSBoYXNXZWFrUmVmID8gV2Vha1JlZi5wcm90b3R5cGUuZGVyZWYgOiBudWxsO1xudmFyIGJvb2xlYW5WYWx1ZU9mID0gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZjtcbnZhciBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciAkbWF0Y2ggPSBTdHJpbmcucHJvdG90eXBlLm1hdGNoO1xudmFyICRzbGljZSA9IFN0cmluZy5wcm90b3R5cGUuc2xpY2U7XG52YXIgJHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgJHRvVXBwZXJDYXNlID0gU3RyaW5nLnByb3RvdHlwZS50b1VwcGVyQ2FzZTtcbnZhciAkdG9Mb3dlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlO1xudmFyICR0ZXN0ID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0O1xudmFyICRjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyICRqb2luID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG52YXIgJGFyclNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyICRmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgYmlnSW50VmFsdWVPZiA9IHR5cGVvZiBCaWdJbnQgPT09ICdmdW5jdGlvbicgPyBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YgOiBudWxsO1xudmFyIGdPUFMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIHN5bVRvU3RyaW5nID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJyA/IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgOiBudWxsO1xudmFyIGhhc1NoYW1tZWRTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnb2JqZWN0Jztcbi8vIGllLCBgaGFzLXRvc3RyaW5ndGFnL3NoYW1zXG52YXIgdG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiAodHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gaGFzU2hhbW1lZFN5bWJvbHMgPyAnb2JqZWN0JyA6ICdzeW1ib2wnKVxuICAgID8gU3ltYm9sLnRvU3RyaW5nVGFnXG4gICAgOiBudWxsO1xudmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbnZhciBnUE8gPSAodHlwZW9mIFJlZmxlY3QgPT09ICdmdW5jdGlvbicgPyBSZWZsZWN0LmdldFByb3RvdHlwZU9mIDogT2JqZWN0LmdldFByb3RvdHlwZU9mKSB8fCAoXG4gICAgW10uX19wcm90b19fID09PSBBcnJheS5wcm90b3R5cGUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICA/IGZ1bmN0aW9uIChPKSB7XG4gICAgICAgICAgICByZXR1cm4gTy5fX3Byb3RvX187IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cbiAgICAgICAgfVxuICAgICAgICA6IG51bGxcbik7XG5cbmZ1bmN0aW9uIGFkZE51bWVyaWNTZXBhcmF0b3IobnVtLCBzdHIpIHtcbiAgICBpZiAoXG4gICAgICAgIG51bSA9PT0gSW5maW5pdHlcbiAgICAgICAgfHwgbnVtID09PSAtSW5maW5pdHlcbiAgICAgICAgfHwgbnVtICE9PSBudW1cbiAgICAgICAgfHwgKG51bSAmJiBudW0gPiAtMTAwMCAmJiBudW0gPCAxMDAwKVxuICAgICAgICB8fCAkdGVzdC5jYWxsKC9lLywgc3RyKVxuICAgICkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICB2YXIgc2VwUmVnZXggPSAvWzAtOV0oPz0oPzpbMC05XXszfSkrKD8hWzAtOV0pKS9nO1xuICAgIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgaW50ID0gbnVtIDwgMCA/IC0kZmxvb3IoLW51bSkgOiAkZmxvb3IobnVtKTsgLy8gdHJ1bmMobnVtKVxuICAgICAgICBpZiAoaW50ICE9PSBudW0pIHtcbiAgICAgICAgICAgIHZhciBpbnRTdHIgPSBTdHJpbmcoaW50KTtcbiAgICAgICAgICAgIHZhciBkZWMgPSAkc2xpY2UuY2FsbChzdHIsIGludFN0ci5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKGludFN0ciwgc2VwUmVnZXgsICckJl8nKSArICcuJyArICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChkZWMsIC8oWzAtOV17M30pL2csICckJl8nKSwgL18kLywgJycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKHN0ciwgc2VwUmVnZXgsICckJl8nKTtcbn1cblxudmFyIHV0aWxJbnNwZWN0ID0gcmVxdWlyZSgnLi91dGlsLmluc3BlY3QnKTtcbnZhciBpbnNwZWN0Q3VzdG9tID0gdXRpbEluc3BlY3QuY3VzdG9tO1xudmFyIGluc3BlY3RTeW1ib2wgPSBpc1N5bWJvbChpbnNwZWN0Q3VzdG9tKSA/IGluc3BlY3RDdXN0b20gOiBudWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluc3BlY3RfKG9iaiwgb3B0aW9ucywgZGVwdGgsIHNlZW4pIHtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykgJiYgKG9wdHMucXVvdGVTdHlsZSAhPT0gJ3NpbmdsZScgJiYgb3B0cy5xdW90ZVN0eWxlICE9PSAnZG91YmxlJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwicXVvdGVTdHlsZVwiIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcImRvdWJsZVwiJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdtYXhTdHJpbmdMZW5ndGgnKSAmJiAodHlwZW9mIG9wdHMubWF4U3RyaW5nTGVuZ3RoID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBvcHRzLm1heFN0cmluZ0xlbmd0aCA8IDAgJiYgb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IEluZmluaXR5XG4gICAgICAgICAgICA6IG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBudWxsXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibWF4U3RyaW5nTGVuZ3RoXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tSW5zcGVjdCA9IGhhcyhvcHRzLCAnY3VzdG9tSW5zcGVjdCcpID8gb3B0cy5jdXN0b21JbnNwZWN0IDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbUluc3BlY3QgIT09ICdib29sZWFuJyAmJiBjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYFxcJ3N5bWJvbFxcJ2AnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnaW5kZW50JylcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09IG51bGxcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09ICdcXHQnXG4gICAgICAgICYmICEocGFyc2VJbnQob3B0cy5pbmRlbnQsIDEwKSA9PT0gb3B0cy5pbmRlbnQgJiYgb3B0cy5pbmRlbnQgPiAwKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJpbmRlbnRcIiBtdXN0IGJlIFwiXFxcXHRcIiwgYW4gaW50ZWdlciA+IDAsIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICBpZiAoaGFzKG9wdHMsICdudW1lcmljU2VwYXJhdG9yJykgJiYgdHlwZW9mIG9wdHMubnVtZXJpY1NlcGFyYXRvciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm51bWVyaWNTZXBhcmF0b3JcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgIG9yIGBmYWxzZWAnKTtcbiAgICB9XG4gICAgdmFyIG51bWVyaWNTZXBhcmF0b3IgPSBvcHRzLm51bWVyaWNTZXBhcmF0b3I7XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIG9iaiA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKG9iaiwgb3B0cyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAob2JqID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gSW5maW5pdHkgLyBvYmogPiAwID8gJzAnIDogJy0wJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gU3RyaW5nKG9iaik7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIHN0cikgOiBzdHI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50Jykge1xuICAgICAgICB2YXIgYmlnSW50U3RyID0gU3RyaW5nKG9iaikgKyAnbic7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIGJpZ0ludFN0cikgOiBiaWdJbnRTdHI7XG4gICAgfVxuXG4gICAgdmFyIG1heERlcHRoID0gdHlwZW9mIG9wdHMuZGVwdGggPT09ICd1bmRlZmluZWQnID8gNSA6IG9wdHMuZGVwdGg7XG4gICAgaWYgKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcpIHsgZGVwdGggPSAwOyB9XG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoICYmIG1heERlcHRoID4gMCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheShvYmopID8gJ1tBcnJheV0nIDogJ1tPYmplY3RdJztcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKTtcblxuICAgIGlmICh0eXBlb2Ygc2VlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VlbiA9IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5kZXhPZihzZWVuLCBvYmopID49IDApIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBmcm9tLCBub0luZGVudCkge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgc2VlbiA9ICRhcnJTbGljZS5jYWxsKHNlZW4pO1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub0luZGVudCkge1xuICAgICAgICAgICAgdmFyIG5ld09wdHMgPSB7XG4gICAgICAgICAgICAgICAgZGVwdGg6IG9wdHMuZGVwdGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykpIHtcbiAgICAgICAgICAgICAgICBuZXdPcHRzLnF1b3RlU3R5bGUgPSBvcHRzLnF1b3RlU3R5bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG5ld09wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBvcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nICYmICFpc1JlZ0V4cChvYmopKSB7IC8vIGluIG9sZGVyIGVuZ2luZXMsIHJlZ2V4ZXMgYXJlIGNhbGxhYmxlXG4gICAgICAgIHZhciBuYW1lID0gbmFtZU9mKG9iaik7XG4gICAgICAgIHZhciBrZXlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICByZXR1cm4gJ1tGdW5jdGlvbicgKyAobmFtZSA/ICc6ICcgKyBuYW1lIDogJyAoYW5vbnltb3VzKScpICsgJ10nICsgKGtleXMubGVuZ3RoID4gMCA/ICcgeyAnICsgJGpvaW4uY2FsbChrZXlzLCAnLCAnKSArICcgfScgOiAnJyk7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChvYmopKSB7XG4gICAgICAgIHZhciBzeW1TdHJpbmcgPSBoYXNTaGFtbWVkU3ltYm9scyA/ICRyZXBsYWNlLmNhbGwoU3RyaW5nKG9iaiksIC9eKFN5bWJvbFxcKC4qXFwpKV9bXildKiQvLCAnJDEnKSA6IHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFoYXNTaGFtbWVkU3ltYm9scyA/IG1hcmtCb3hlZChzeW1TdHJpbmcpIDogc3ltU3RyaW5nO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KG9iaikpIHtcbiAgICAgICAgdmFyIHMgPSAnPCcgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSk7XG4gICAgICAgIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzICs9ICcgJyArIGF0dHJzW2ldLm5hbWUgKyAnPScgKyB3cmFwUXVvdGVzKHF1b3RlKGF0dHJzW2ldLnZhbHVlKSwgJ2RvdWJsZScsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gJz4nO1xuICAgICAgICBpZiAob2JqLmNoaWxkTm9kZXMgJiYgb2JqLmNoaWxkTm9kZXMubGVuZ3RoKSB7IHMgKz0gJy4uLic7IH1cbiAgICAgICAgcyArPSAnPC8nICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpICsgJz4nO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1tdJzsgfVxuICAgICAgICB2YXIgeHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmIChpbmRlbnQgJiYgIXNpbmdsZUxpbmVWYWx1ZXMoeHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1snICsgaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpICsgJ10nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnWyAnICsgJGpvaW4uY2FsbCh4cywgJywgJykgKyAnIF0nO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcihvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKCEoJ2NhdXNlJyBpbiBFcnJvci5wcm90b3R5cGUpICYmICdjYXVzZScgaW4gb2JqICYmICFpc0VudW1lcmFibGUuY2FsbChvYmosICdjYXVzZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbCgnW2NhdXNlXTogJyArIGluc3BlY3Qob2JqLmNhdXNlKSwgcGFydHMpLCAnLCAnKSArICcgfSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1snICsgU3RyaW5nKG9iaikgKyAnXSc7IH1cbiAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbChwYXJ0cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgY3VzdG9tSW5zcGVjdCkge1xuICAgICAgICBpZiAoaW5zcGVjdFN5bWJvbCAmJiB0eXBlb2Ygb2JqW2luc3BlY3RTeW1ib2xdID09PSAnZnVuY3Rpb24nICYmIHV0aWxJbnNwZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbEluc3BlY3Qob2JqLCB7IGRlcHRoOiBtYXhEZXB0aCAtIGRlcHRoIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnICYmIHR5cGVvZiBvYmouaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5pbnNwZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFwKG9iaikpIHtcbiAgICAgICAgdmFyIG1hcFBhcnRzID0gW107XG4gICAgICAgIGlmIChtYXBGb3JFYWNoKSB7XG4gICAgICAgICAgICBtYXBGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgIG1hcFBhcnRzLnB1c2goaW5zcGVjdChrZXksIG9iaiwgdHJ1ZSkgKyAnID0+ICcgKyBpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ01hcCcsIG1hcFNpemUuY2FsbChvYmopLCBtYXBQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzU2V0KG9iaikpIHtcbiAgICAgICAgdmFyIHNldFBhcnRzID0gW107XG4gICAgICAgIGlmIChzZXRGb3JFYWNoKSB7XG4gICAgICAgICAgICBzZXRGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZXRQYXJ0cy5wdXNoKGluc3BlY3QodmFsdWUsIG9iaikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZignU2V0Jywgc2V0U2l6ZS5jYWxsKG9iaiksIHNldFBhcnRzLCBpbmRlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrTWFwKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtNYXAnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1NldChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrU2V0Jyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtSZWYob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1JlZicpO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXIob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoTnVtYmVyKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQmlnSW50KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KGJpZ0ludFZhbHVlT2YuY2FsbChvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0Jvb2xlYW4ob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGJvb2xlYW5WYWx1ZU9mLmNhbGwob2JqKSk7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChTdHJpbmcob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoIWlzRGF0ZShvYmopICYmICFpc1JlZ0V4cChvYmopKSB7XG4gICAgICAgIHZhciB5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgdmFyIGlzUGxhaW5PYmplY3QgPSBnUE8gPyBnUE8ob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZSA6IG9iaiBpbnN0YW5jZW9mIE9iamVjdCB8fCBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICAgICAgdmFyIHByb3RvVGFnID0gb2JqIGluc3RhbmNlb2YgT2JqZWN0ID8gJycgOiAnbnVsbCBwcm90b3R5cGUnO1xuICAgICAgICB2YXIgc3RyaW5nVGFnID0gIWlzUGxhaW5PYmplY3QgJiYgdG9TdHJpbmdUYWcgJiYgT2JqZWN0KG9iaikgPT09IG9iaiAmJiB0b1N0cmluZ1RhZyBpbiBvYmogPyAkc2xpY2UuY2FsbCh0b1N0cihvYmopLCA4LCAtMSkgOiBwcm90b1RhZyA/ICdPYmplY3QnIDogJyc7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvclRhZyA9IGlzUGxhaW5PYmplY3QgfHwgdHlwZW9mIG9iai5jb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJyA/ICcnIDogb2JqLmNvbnN0cnVjdG9yLm5hbWUgPyBvYmouY29uc3RydWN0b3IubmFtZSArICcgJyA6ICcnO1xuICAgICAgICB2YXIgdGFnID0gY29uc3RydWN0b3JUYWcgKyAoc3RyaW5nVGFnIHx8IHByb3RvVGFnID8gJ1snICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoW10sIHN0cmluZ1RhZyB8fCBbXSwgcHJvdG9UYWcgfHwgW10pLCAnOiAnKSArICddICcgOiAnJyk7XG4gICAgICAgIGlmICh5cy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHRhZyArICd7fSc7IH1cbiAgICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhZyArICd7JyArIGluZGVudGVkSm9pbih5cywgaW5kZW50KSArICd9JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnICsgJ3sgJyArICRqb2luLmNhbGwoeXMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhvYmopO1xufTtcblxuZnVuY3Rpb24gd3JhcFF1b3RlcyhzLCBkZWZhdWx0U3R5bGUsIG9wdHMpIHtcbiAgICB2YXIgcXVvdGVDaGFyID0gKG9wdHMucXVvdGVTdHlsZSB8fCBkZWZhdWx0U3R5bGUpID09PSAnZG91YmxlJyA/ICdcIicgOiBcIidcIjtcbiAgICByZXR1cm4gcXVvdGVDaGFyICsgcyArIHF1b3RlQ2hhcjtcbn1cblxuZnVuY3Rpb24gcXVvdGUocykge1xuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKFN0cmluZyhzKSwgL1wiL2csICcmcXVvdDsnKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0RhdGUob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBEYXRlXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc1JlZ0V4cChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNFcnJvcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEVycm9yXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc1N0cmluZyhvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEJvb2xlYW5dJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cblxuLy8gU3ltYm9sIGFuZCBCaWdJbnQgZG8gaGF2ZSBTeW1ib2wudG9TdHJpbmdUYWcgYnkgc3BlYywgc28gdGhhdCBjYW4ndCBiZSB1c2VkIHRvIGVsaW1pbmF0ZSBmYWxzZSBwb3NpdGl2ZXNcbmZ1bmN0aW9uIGlzU3ltYm9sKG9iaikge1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiBpbnN0YW5jZW9mIFN5bWJvbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhc3ltVG9TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0JpZ0ludChvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhYmlnSW50VmFsdWVPZikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGJpZ0ludFZhbHVlT2YuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgfHwgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5IGluIHRoaXM7IH07XG5mdW5jdGlvbiBoYXMob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBrZXkpO1xufVxuXG5mdW5jdGlvbiB0b1N0cihvYmopIHtcbiAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiBuYW1lT2YoZikge1xuICAgIGlmIChmLm5hbWUpIHsgcmV0dXJuIGYubmFtZTsgfVxuICAgIHZhciBtID0gJG1hdGNoLmNhbGwoZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGYpLCAvXmZ1bmN0aW9uXFxzKihbXFx3JF0rKS8pO1xuICAgIGlmIChtKSB7IHJldHVybiBtWzFdOyB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgICBpZiAoeHMuaW5kZXhPZikgeyByZXR1cm4geHMuaW5kZXhPZih4KTsgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh4c1tpXSA9PT0geCkgeyByZXR1cm4gaTsgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzTWFwKHgpIHtcbiAgICBpZiAoIW1hcFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha01hcCh4KSB7XG4gICAgaWYgKCF3ZWFrTWFwSGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrUmVmKHgpIHtcbiAgICBpZiAoIXdlYWtSZWZEZXJlZiB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrUmVmRGVyZWYuY2FsbCh4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2V0KHgpIHtcbiAgICBpZiAoIXNldFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFNldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG4gICAgaWYgKCF3ZWFrU2V0SGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB4Lm5vZGVOYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgeC5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyLCBvcHRzKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPiBvcHRzLm1heFN0cmluZ0xlbmd0aCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gc3RyLmxlbmd0aCAtIG9wdHMubWF4U3RyaW5nTGVuZ3RoO1xuICAgICAgICB2YXIgdHJhaWxlciA9ICcuLi4gJyArIHJlbWFpbmluZyArICcgbW9yZSBjaGFyYWN0ZXInICsgKHJlbWFpbmluZyA+IDEgPyAncycgOiAnJyk7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKCRzbGljZS5jYWxsKHN0ciwgMCwgb3B0cy5tYXhTdHJpbmdMZW5ndGgpLCBvcHRzKSArIHRyYWlsZXI7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgdmFyIHMgPSAkcmVwbGFjZS5jYWxsKCRyZXBsYWNlLmNhbGwoc3RyLCAvKFsnXFxcXF0pL2csICdcXFxcJDEnKSwgL1tcXHgwMC1cXHgxZl0vZywgbG93Ynl0ZSk7XG4gICAgcmV0dXJuIHdyYXBRdW90ZXMocywgJ3NpbmdsZScsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBsb3dieXRlKGMpIHtcbiAgICB2YXIgbiA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgeCA9IHtcbiAgICAgICAgODogJ2InLFxuICAgICAgICA5OiAndCcsXG4gICAgICAgIDEwOiAnbicsXG4gICAgICAgIDEyOiAnZicsXG4gICAgICAgIDEzOiAncidcbiAgICB9W25dO1xuICAgIGlmICh4KSB7IHJldHVybiAnXFxcXCcgKyB4OyB9XG4gICAgcmV0dXJuICdcXFxceCcgKyAobiA8IDB4MTAgPyAnMCcgOiAnJykgKyAkdG9VcHBlckNhc2UuY2FsbChuLnRvU3RyaW5nKDE2KSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtCb3hlZChzdHIpIHtcbiAgICByZXR1cm4gJ09iamVjdCgnICsgc3RyICsgJyknO1xufVxuXG5mdW5jdGlvbiB3ZWFrQ29sbGVjdGlvbk9mKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSArICcgeyA/IH0nO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0aW9uT2YodHlwZSwgc2l6ZSwgZW50cmllcywgaW5kZW50KSB7XG4gICAgdmFyIGpvaW5lZEVudHJpZXMgPSBpbmRlbnQgPyBpbmRlbnRlZEpvaW4oZW50cmllcywgaW5kZW50KSA6ICRqb2luLmNhbGwoZW50cmllcywgJywgJyk7XG4gICAgcmV0dXJuIHR5cGUgKyAnICgnICsgc2l6ZSArICcpIHsnICsgam9pbmVkRW50cmllcyArICd9Jztcbn1cblxuZnVuY3Rpb24gc2luZ2xlTGluZVZhbHVlcyh4cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGluZGV4T2YoeHNbaV0sICdcXG4nKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEluZGVudChvcHRzLCBkZXB0aCkge1xuICAgIHZhciBiYXNlSW5kZW50O1xuICAgIGlmIChvcHRzLmluZGVudCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICdcXHQnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdHMuaW5kZW50ID09PSAnbnVtYmVyJyAmJiBvcHRzLmluZGVudCA+IDApIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICRqb2luLmNhbGwoQXJyYXkob3B0cy5pbmRlbnQgKyAxKSwgJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZTogYmFzZUluZGVudCxcbiAgICAgICAgcHJldjogJGpvaW4uY2FsbChBcnJheShkZXB0aCArIDEpLCBiYXNlSW5kZW50KVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGluZGVudGVkSm9pbih4cywgaW5kZW50KSB7XG4gICAgaWYgKHhzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cbiAgICB2YXIgbGluZUpvaW5lciA9ICdcXG4nICsgaW5kZW50LnByZXYgKyBpbmRlbnQuYmFzZTtcbiAgICByZXR1cm4gbGluZUpvaW5lciArICRqb2luLmNhbGwoeHMsICcsJyArIGxpbmVKb2luZXIpICsgJ1xcbicgKyBpbmRlbnQucHJldjtcbn1cblxuZnVuY3Rpb24gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iaik7XG4gICAgdmFyIHhzID0gW107XG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHhzLmxlbmd0aCA9IG9iai5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB4c1tpXSA9IGhhcyhvYmosIGkpID8gaW5zcGVjdChvYmpbaV0sIG9iaikgOiAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgc3ltcyA9IHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nID8gZ09QUyhvYmopIDogW107XG4gICAgdmFyIHN5bU1hcDtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgc3ltTWFwID0ge307XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc3ltcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgc3ltTWFwWyckJyArIHN5bXNba11dID0gc3ltc1trXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBpZiAoIWhhcyhvYmosIGtleSkpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGlzQXJyICYmIFN0cmluZyhOdW1iZXIoa2V5KSkgPT09IGtleSAmJiBrZXkgPCBvYmoubGVuZ3RoKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scyAmJiBzeW1NYXBbJyQnICsga2V5XSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBwcmV2ZW50IHNoYW1tZWQgU3ltYm9scywgd2hpY2ggYXJlIHN0b3JlZCBhcyBzdHJpbmdzLCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcga2V5IHNlY3Rpb25cbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKCR0ZXN0LmNhbGwoL1teXFx3JF0vLCBrZXkpKSB7XG4gICAgICAgICAgICB4cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmopICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHMucHVzaChrZXkgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ltcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltc1tqXSkpIHtcbiAgICAgICAgICAgICAgICB4cy5wdXNoKCdbJyArIGluc3BlY3Qoc3ltc1tqXSkgKyAnXTogJyArIGluc3BlY3Qob2JqW3N5bXNbal1dLCBvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geHM7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnb2JqZWN0LWluc3BlY3QnKTtcblxudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG52YXIgJFdlYWtNYXAgPSBHZXRJbnRyaW5zaWMoJyVXZWFrTWFwJScsIHRydWUpO1xudmFyICRNYXAgPSBHZXRJbnRyaW5zaWMoJyVNYXAlJywgdHJ1ZSk7XG5cbnZhciAkd2Vha01hcEdldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG52YXIgJHdlYWtNYXBTZXQgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLnNldCcsIHRydWUpO1xudmFyICR3ZWFrTWFwSGFzID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcbnZhciAkbWFwR2V0ID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmdldCcsIHRydWUpO1xudmFyICRtYXBTZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuc2V0JywgdHJ1ZSk7XG52YXIgJG1hcEhhcyA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcblxuLypcbiAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBsaXN0IHJldHVybmluZyB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZVxuICogZ2l2ZW4ga2V5LlxuICpcbiAqIFRoYXQgbm9kZSBpcyBhbHNvIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyB0aGF0IGlmIGl0J3MgYWNjZXNzZWRcbiAqIGFnYWluIHdlIGRvbid0IG5lZWQgdG8gdHJhdmVyc2UgdGhlIHdob2xlIGxpc3QuIEJ5IGRvaW5nIHNvLCBhbGwgdGhlIHJlY2VudGx5XG4gKiB1c2VkIG5vZGVzIGNhbiBiZSBhY2Nlc3NlZCByZWxhdGl2ZWx5IHF1aWNrbHkuXG4gKi9cbnZhciBsaXN0R2V0Tm9kZSA9IGZ1bmN0aW9uIChsaXN0LCBrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHRmb3IgKHZhciBwcmV2ID0gbGlzdCwgY3VycjsgKGN1cnIgPSBwcmV2Lm5leHQpICE9PSBudWxsOyBwcmV2ID0gY3Vycikge1xuXHRcdGlmIChjdXJyLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRwcmV2Lm5leHQgPSBjdXJyLm5leHQ7XG5cdFx0XHRjdXJyLm5leHQgPSBsaXN0Lm5leHQ7XG5cdFx0XHRsaXN0Lm5leHQgPSBjdXJyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cdFx0XHRyZXR1cm4gY3Vycjtcblx0XHR9XG5cdH1cbn07XG5cbnZhciBsaXN0R2V0ID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSkge1xuXHR2YXIgbm9kZSA9IGxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG5cdHJldHVybiBub2RlICYmIG5vZGUudmFsdWU7XG59O1xudmFyIGxpc3RTZXQgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5LCB2YWx1ZSkge1xuXHR2YXIgbm9kZSA9IGxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG5cdGlmIChub2RlKSB7XG5cdFx0bm9kZS52YWx1ZSA9IHZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFByZXBlbmQgdGhlIG5ldyBub2RlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3Rcblx0XHRvYmplY3RzLm5leHQgPSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0XHRcdGtleToga2V5LFxuXHRcdFx0bmV4dDogb2JqZWN0cy5uZXh0LFxuXHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0fTtcblx0fVxufTtcbnZhciBsaXN0SGFzID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSkge1xuXHRyZXR1cm4gISFsaXN0R2V0Tm9kZShvYmplY3RzLCBrZXkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRTaWRlQ2hhbm5lbCgpIHtcblx0dmFyICR3bTtcblx0dmFyICRtO1xuXHR2YXIgJG87XG5cdHZhciBjaGFubmVsID0ge1xuXHRcdGFzc2VydDogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0aWYgKCFjaGFubmVsLmhhcyhrZXkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdTaWRlIGNoYW5uZWwgZG9lcyBub3QgY29udGFpbiAnICsgaW5zcGVjdChrZXkpKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGdldDogZnVuY3Rpb24gKGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoJHdtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICR3ZWFrTWFwR2V0KCR3bSwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICgkTWFwKSB7XG5cdFx0XHRcdGlmICgkbSkge1xuXHRcdFx0XHRcdHJldHVybiAkbWFwR2V0KCRtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoJG8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sb25lbHktaWZcblx0XHRcdFx0XHRyZXR1cm4gbGlzdEdldCgkbywga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aGFzOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoJHdtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICR3ZWFrTWFwSGFzKCR3bSwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICgkTWFwKSB7XG5cdFx0XHRcdGlmICgkbSkge1xuXHRcdFx0XHRcdHJldHVybiAkbWFwSGFzKCRtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoJG8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sb25lbHktaWZcblx0XHRcdFx0XHRyZXR1cm4gbGlzdEhhcygkbywga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCRXZWFrTWFwICYmIGtleSAmJiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0aWYgKCEkd20pIHtcblx0XHRcdFx0XHQkd20gPSBuZXcgJFdlYWtNYXAoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkd2Vha01hcFNldCgkd20sIGtleSwgdmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmICgkTWFwKSB7XG5cdFx0XHRcdGlmICghJG0pIHtcblx0XHRcdFx0XHQkbSA9IG5ldyAkTWFwKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0JG1hcFNldCgkbSwga2V5LCB2YWx1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoISRvKSB7XG5cdFx0XHRcdFx0Lypcblx0XHRcdFx0XHQgKiBJbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdCBhcyBhbiBlbXB0eSBub2RlLCBzbyB0aGF0IHdlIGRvbid0IGhhdmVcblx0XHRcdFx0XHQgKiB0byBzcGVjaWFsLWNhc2UgaGFuZGxpbmcgb2YgdGhlIGZpcnN0IG5vZGU6IHdlIGNhbiBhbHdheXMgcmVmZXIgdG9cblx0XHRcdFx0XHQgKiBpdCBhcyAocHJldmlvdXMgbm9kZSkubmV4dCwgaW5zdGVhZCBvZiBzb21ldGhpbmcgbGlrZSAobGlzdCkuaGVhZFxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdCRvID0geyBrZXk6IHt9LCBuZXh0OiBudWxsIH07XG5cdFx0XHRcdH1cblx0XHRcdFx0bGlzdFNldCgkbywga2V5LCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gY2hhbm5lbDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbnZhciBGb3JtYXQgPSB7XG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ2RlZmF1bHQnOiBGb3JtYXQuUkZDMzk4NixcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSRkMxNzM4OiBGb3JtYXQuUkZDMTczOCxcbiAgICBSRkMzOTg2OiBGb3JtYXQuUkZDMzk4NlxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgaGV4VGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgYXJyYXkucHVzaCgnJScgKyAoKGkgPCAxNiA/ICcwJyA6ICcnKSArIGkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59KCkpO1xuXG52YXIgY29tcGFjdFF1ZXVlID0gZnVuY3Rpb24gY29tcGFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgdmFyIGNvbXBhY3RlZCA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iai5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW2pdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wYWN0ZWQucHVzaChvYmpbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlbS5vYmpbaXRlbS5wcm9wXSA9IGNvbXBhY3RlZDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBhcnJheVRvT2JqZWN0ID0gZnVuY3Rpb24gYXJyYXlUb09iamVjdChzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0gb3B0aW9ucyAmJiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9ialtpXSA9IHNvdXJjZVtpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgbWVyZ2UgPSBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIC8qIGVzbGludCBuby1wYXJhbS1yZWFzc2lnbjogMCAqL1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiYgKG9wdGlvbnMucGxhaW5PYmplY3RzIHx8IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSkgfHwgIWhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbc291cmNlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3RhcmdldCwgc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXQgfHwgdHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFt0YXJnZXRdLmNvbmNhdChzb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciBtZXJnZVRhcmdldCA9IHRhcmdldDtcbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmICFpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgbWVyZ2VUYXJnZXQgPSBhcnJheVRvT2JqZWN0KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkodGFyZ2V0KSAmJiBpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgc291cmNlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICAgICAgICAgIGlmIChoYXMuY2FsbCh0YXJnZXQsIGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEl0ZW0gPSB0YXJnZXRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldEl0ZW0gJiYgdHlwZW9mIHRhcmdldEl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IG1lcmdlKHRhcmdldEl0ZW0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgICBpZiAoaGFzLmNhbGwoYWNjLCBrZXkpKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IG1lcmdlKGFjY1trZXldLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbWVyZ2VUYXJnZXQpO1xufTtcblxudmFyIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnblNpbmdsZVNvdXJjZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0YXJnZXQpO1xufTtcblxudmFyIGRlY29kZSA9IGZ1bmN0aW9uIChzdHIsIGRlY29kZXIsIGNoYXJzZXQpIHtcbiAgICB2YXIgc3RyV2l0aG91dFBsdXMgPSBzdHIucmVwbGFjZSgvXFwrL2csICcgJyk7XG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAvLyB1bmVzY2FwZSBuZXZlciB0aHJvd3MsIG5vIHRyeS4uLmNhdGNoIG5lZWRlZDpcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzLnJlcGxhY2UoLyVbMC05YS1mXXsyfS9naSwgdW5lc2NhcGUpO1xuICAgIH1cbiAgICAvLyB1dGYtOFxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyV2l0aG91dFBsdXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzO1xuICAgIH1cbn07XG5cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyLCBkZWZhdWx0RW5jb2RlciwgY2hhcnNldCwga2luZCwgZm9ybWF0KSB7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQnJpYW4gV2hpdGUgKG1zY2RleCkgZm9yIHRoZSBpby5qcyBjb3JlIHF1ZXJ5c3RyaW5nIGxpYnJhcnkuXG4gICAgLy8gSXQgaGFzIGJlZW4gYWRhcHRlZCBoZXJlIGZvciBzdHJpY3RlciBhZGhlcmVuY2UgdG8gUkZDIDM5ODZcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHZhciBzdHJpbmcgPSBzdHI7XG4gICAgaWYgKHR5cGVvZiBzdHIgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHN0cmluZyA9IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzdHIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyaW5nID0gU3RyaW5nKHN0cik7XG4gICAgfVxuXG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICByZXR1cm4gZXNjYXBlKHN0cmluZykucmVwbGFjZSgvJXVbMC05YS1mXXs0fS9naSwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyUyNiUyMycgKyBwYXJzZUludCgkMC5zbGljZSgyKSwgMTYpICsgJyUzQic7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBvdXQgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGMgPT09IDB4MkQgLy8gLVxuICAgICAgICAgICAgfHwgYyA9PT0gMHgyRSAvLyAuXG4gICAgICAgICAgICB8fCBjID09PSAweDVGIC8vIF9cbiAgICAgICAgICAgIHx8IGMgPT09IDB4N0UgLy8gflxuICAgICAgICAgICAgfHwgKGMgPj0gMHgzMCAmJiBjIDw9IDB4MzkpIC8vIDAtOVxuICAgICAgICAgICAgfHwgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NUEpIC8vIGEtelxuICAgICAgICAgICAgfHwgKGMgPj0gMHg2MSAmJiBjIDw9IDB4N0EpIC8vIEEtWlxuICAgICAgICAgICAgfHwgKGZvcm1hdCA9PT0gZm9ybWF0cy5SRkMxNzM4ICYmIChjID09PSAweDI4IHx8IGMgPT09IDB4MjkpKSAvLyAoIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBvdXQgKz0gc3RyaW5nLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IChzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG4gICAgICAgIC8qIGVzbGludCBvcGVyYXRvci1saW5lYnJlYWs6IFsyLCBcImJlZm9yZVwiXSAqL1xuICAgICAgICBvdXQgKz0gaGV4VGFibGVbMHhGMCB8IChjID4+IDE4KV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbnZhciBjb21wYWN0ID0gZnVuY3Rpb24gY29tcGFjdCh2YWx1ZSkge1xuICAgIHZhciBxdWV1ZSA9IFt7IG9iajogeyBvOiB2YWx1ZSB9LCBwcm9wOiAnbycgfV07XG4gICAgdmFyIHJlZnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZVtpXTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2pdO1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiByZWZzLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqOiBvYmosIHByb3A6IGtleSB9KTtcbiAgICAgICAgICAgICAgICByZWZzLnB1c2godmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBhY3RRdWV1ZShxdWV1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgaXNSZWdFeHAgPSBmdW5jdGlvbiBpc1JlZ0V4cChvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufTtcblxudmFyIGlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhIShvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopKTtcbn07XG5cbnZhciBjb21iaW5lID0gZnVuY3Rpb24gY29tYmluZShhLCBiKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChhLCBiKTtcbn07XG5cbnZhciBtYXliZU1hcCA9IGZ1bmN0aW9uIG1heWJlTWFwKHZhbCwgZm4pIHtcbiAgICBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIG1hcHBlZC5wdXNoKGZuKHZhbFtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxuICAgIHJldHVybiBmbih2YWwpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgYXJyYXlUb09iamVjdDogYXJyYXlUb09iamVjdCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBjb21iaW5lOiBjb21iaW5lLFxuICAgIGNvbXBhY3Q6IGNvbXBhY3QsXG4gICAgZGVjb2RlOiBkZWNvZGUsXG4gICAgZW5jb2RlOiBlbmNvZGUsXG4gICAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICAgIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgICBtYXliZU1hcDogbWF5YmVNYXAsXG4gICAgbWVyZ2U6IG1lcmdlXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGdldFNpZGVDaGFubmVsID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBhcnJheVByZWZpeEdlbmVyYXRvcnMgPSB7XG4gICAgYnJhY2tldHM6IGZ1bmN0aW9uIGJyYWNrZXRzKHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1tdJztcbiAgICB9LFxuICAgIGNvbW1hOiAnY29tbWEnLFxuICAgIGluZGljZXM6IGZ1bmN0aW9uIGluZGljZXMocHJlZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbJyArIGtleSArICddJztcbiAgICB9LFxuICAgIHJlcGVhdDogZnVuY3Rpb24gcmVwZWF0KHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciBzcGxpdCA9IFN0cmluZy5wcm90b3R5cGUuc3BsaXQ7XG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xudmFyIHB1c2hUb0FycmF5ID0gZnVuY3Rpb24gKGFyciwgdmFsdWVPckFycmF5KSB7XG4gICAgcHVzaC5hcHBseShhcnIsIGlzQXJyYXkodmFsdWVPckFycmF5KSA/IHZhbHVlT3JBcnJheSA6IFt2YWx1ZU9yQXJyYXldKTtcbn07XG5cbnZhciB0b0lTTyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgZGVmYXVsdEZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhZGRRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgZm9ybWF0dGVyOiBmb3JtYXRzLmZvcm1hdHRlcnNbZGVmYXVsdEZvcm1hdF0sXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGluZGljZXM6IGZhbHNlLFxuICAgIHNlcmlhbGl6ZURhdGU6IGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSkge1xuICAgICAgICByZXR1cm4gdG9JU08uY2FsbChkYXRlKTtcbiAgICB9LFxuICAgIHNraXBOdWxsczogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSA9IGZ1bmN0aW9uIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ251bWJlcidcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ3N5bWJvbCdcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdiaWdpbnQnO1xufTtcblxudmFyIHNlbnRpbmVsID0ge307XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIGNvbW1hUm91bmRUcmlwLFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXQsXG4gICAgZm9ybWF0dGVyLFxuICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgY2hhcnNldCxcbiAgICBzaWRlQ2hhbm5lbFxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcblxuICAgIHZhciB0bXBTYyA9IHNpZGVDaGFubmVsO1xuICAgIHZhciBzdGVwID0gMDtcbiAgICB2YXIgZmluZEZsYWcgPSBmYWxzZTtcbiAgICB3aGlsZSAoKHRtcFNjID0gdG1wU2MuZ2V0KHNlbnRpbmVsKSkgIT09IHZvaWQgdW5kZWZpbmVkICYmICFmaW5kRmxhZykge1xuICAgICAgICAvLyBXaGVyZSBvYmplY3QgbGFzdCBhcHBlYXJlZCBpbiB0aGUgcmVmIHRyZWVcbiAgICAgICAgdmFyIHBvcyA9IHRtcFNjLmdldChvYmplY3QpO1xuICAgICAgICBzdGVwICs9IDE7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDeWNsaWMgb2JqZWN0IHZhbHVlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmRGbGFnID0gdHJ1ZTsgLy8gQnJlYWsgd2hpbGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRtcFNjLmdldChzZW50aW5lbCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzdGVwID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1heWJlTWFwKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZURhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpY3ROdWxsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVyICYmICFlbmNvZGVWYWx1ZXNPbmx5ID8gZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICdrZXknLCBmb3JtYXQpIDogcHJlZml4O1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKGlzTm9uTnVsbGlzaFByaW1pdGl2ZShvYmopIHx8IHV0aWxzLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGVuY29kZVZhbHVlc09ubHkgPyBwcmVmaXggOiBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ2tleScsIGZvcm1hdCk7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBlbmNvZGVWYWx1ZXNPbmx5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlc0FycmF5ID0gc3BsaXQuY2FsbChTdHJpbmcob2JqKSwgJywnKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVzSm9pbmVkID0gJyc7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXNBcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXNKb2luZWQgKz0gKGkgPT09IDAgPyAnJyA6ICcsJykgKyBmb3JtYXR0ZXIoZW5jb2Rlcih2YWx1ZXNBcnJheVtpXSwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ3ZhbHVlJywgZm9ybWF0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArIChjb21tYVJvdW5kVHJpcCAmJiBpc0FycmF5KG9iaikgJiYgdmFsdWVzQXJyYXkubGVuZ3RoID09PSAxID8gJ1tdJyA6ICcnKSArICc9JyArIHZhbHVlc0pvaW5lZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihrZXlWYWx1ZSkgKyAnPScgKyBmb3JtYXR0ZXIoZW5jb2RlcihvYmosIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICd2YWx1ZScsIGZvcm1hdCkpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gam9pbiBlbGVtZW50cyBpblxuICAgICAgICBvYmpLZXlzID0gW3sgdmFsdWU6IG9iai5sZW5ndGggPiAwID8gb2JqLmpvaW4oJywnKSB8fCBudWxsIDogdm9pZCB1bmRlZmluZWQgfV07XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgb2JqS2V5cyA9IGZpbHRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIG9iaktleXMgPSBzb3J0ID8ga2V5cy5zb3J0KHNvcnQpIDoga2V5cztcbiAgICB9XG5cbiAgICB2YXIgYWRqdXN0ZWRQcmVmaXggPSBjb21tYVJvdW5kVHJpcCAmJiBpc0FycmF5KG9iaikgJiYgb2JqLmxlbmd0aCA9PT0gMSA/IHByZWZpeCArICdbXScgOiBwcmVmaXg7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iaktleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbal07XG4gICAgICAgIHZhciB2YWx1ZSA9IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkudmFsdWUgIT09ICd1bmRlZmluZWQnID8ga2V5LnZhbHVlIDogb2JqW2tleV07XG5cbiAgICAgICAgaWYgKHNraXBOdWxscyAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIga2V5UHJlZml4ID0gaXNBcnJheShvYmopXG4gICAgICAgICAgICA/IHR5cGVvZiBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnZnVuY3Rpb24nID8gZ2VuZXJhdGVBcnJheVByZWZpeChhZGp1c3RlZFByZWZpeCwga2V5KSA6IGFkanVzdGVkUHJlZml4XG4gICAgICAgICAgICA6IGFkanVzdGVkUHJlZml4ICsgKGFsbG93RG90cyA/ICcuJyArIGtleSA6ICdbJyArIGtleSArICddJyk7XG5cbiAgICAgICAgc2lkZUNoYW5uZWwuc2V0KG9iamVjdCwgc3RlcCk7XG4gICAgICAgIHZhciB2YWx1ZVNpZGVDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWwoKTtcbiAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbC5zZXQoc2VudGluZWwsIHNpZGVDaGFubmVsKTtcbiAgICAgICAgcHVzaFRvQXJyYXkodmFsdWVzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGtleVByZWZpeCxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBjb21tYVJvdW5kVHJpcCxcbiAgICAgICAgICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgIGVuY29kZXIsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBjaGFyc2V0LFxuICAgICAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxudmFyIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmVuY29kZXIgIT09IG51bGwgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBjaGFyc2V0ID0gb3B0cy5jaGFyc2V0IHx8IGRlZmF1bHRzLmNoYXJzZXQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZvcm1hdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKCFoYXMuY2FsbChmb3JtYXRzLmZvcm1hdHRlcnMsIG9wdHMuZm9ybWF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1hdCA9IG9wdHMuZm9ybWF0O1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cbiAgICB2YXIgZmlsdGVyID0gZGVmYXVsdHMuZmlsdGVyO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdmdW5jdGlvbicgfHwgaXNBcnJheShvcHRzLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0cy5maWx0ZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkUXVlcnlQcmVmaXg6IHR5cGVvZiBvcHRzLmFkZFF1ZXJ5UHJlZml4ID09PSAnYm9vbGVhbicgPyBvcHRzLmFkZFF1ZXJ5UHJlZml4IDogZGVmYXVsdHMuYWRkUXVlcnlQcmVmaXgsXG4gICAgICAgIGFsbG93RG90czogdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHMsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZGVsaW1pdGVyIDogb3B0cy5kZWxpbWl0ZXIsXG4gICAgICAgIGVuY29kZTogdHlwZW9mIG9wdHMuZW5jb2RlID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZSA6IGRlZmF1bHRzLmVuY29kZSxcbiAgICAgICAgZW5jb2RlcjogdHlwZW9mIG9wdHMuZW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZW5jb2RlciA6IGRlZmF1bHRzLmVuY29kZXIsXG4gICAgICAgIGVuY29kZVZhbHVlc09ubHk6IHR5cGVvZiBvcHRzLmVuY29kZVZhbHVlc09ubHkgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlVmFsdWVzT25seSA6IGRlZmF1bHRzLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsXG4gICAgICAgIHNlcmlhbGl6ZURhdGU6IHR5cGVvZiBvcHRzLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlLFxuICAgICAgICBza2lwTnVsbHM6IHR5cGVvZiBvcHRzLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHMsXG4gICAgICAgIHNvcnQ6IHR5cGVvZiBvcHRzLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNvcnQgOiBudWxsLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRzKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cyk7XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0cyAmJiBvcHRzLmFycmF5Rm9ybWF0IGluIGFycmF5UHJlZml4R2VuZXJhdG9ycykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuYXJyYXlGb3JtYXQ7XG4gICAgfSBlbHNlIGlmIChvcHRzICYmICdpbmRpY2VzJyBpbiBvcHRzKSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gb3B0cy5pbmRpY2VzID8gJ2luZGljZXMnIDogJ3JlcGVhdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSAnaW5kaWNlcyc7XG4gICAgfVxuXG4gICAgdmFyIGdlbmVyYXRlQXJyYXlQcmVmaXggPSBhcnJheVByZWZpeEdlbmVyYXRvcnNbYXJyYXlGb3JtYXRdO1xuICAgIGlmIChvcHRzICYmICdjb21tYVJvdW5kVHJpcCcgaW4gb3B0cyAmJiB0eXBlb2Ygb3B0cy5jb21tYVJvdW5kVHJpcCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bjb21tYVJvdW5kVHJpcGAgbXVzdCBiZSBhIGJvb2xlYW4sIG9yIGFic2VudCcpO1xuICAgIH1cbiAgICB2YXIgY29tbWFSb3VuZFRyaXAgPSBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIG9wdHMgJiYgb3B0cy5jb21tYVJvdW5kVHJpcDtcblxuICAgIGlmICghb2JqS2V5cykge1xuICAgICAgICBvYmpLZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgICAgIG9iaktleXMuc29ydChvcHRpb25zLnNvcnQpO1xuICAgIH1cblxuICAgIHZhciBzaWRlQ2hhbm5lbCA9IGdldFNpZGVDaGFubmVsKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2ldO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNraXBOdWxscyAmJiBvYmpba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaFRvQXJyYXkoa2V5cywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgb2JqW2tleV0sXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgY29tbWFSb3VuZFRyaXAsXG4gICAgICAgICAgICBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2tpcE51bGxzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGUgPyBvcHRpb25zLmVuY29kZXIgOiBudWxsLFxuICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLnNvcnQsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RG90cyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0LFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJzZXQsXG4gICAgICAgICAgICBzaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKG9wdGlvbnMuZGVsaW1pdGVyKTtcbiAgICB2YXIgcHJlZml4ID0gb3B0aW9ucy5hZGRRdWVyeVByZWZpeCA9PT0gdHJ1ZSA/ICc/JyA6ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpLCB0aGUgXCJudW1lcmljIGVudGl0eVwiIHJlcHJlc2VudGF0aW9uIG9mIGEgY2hlY2ttYXJrXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0ImJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgnXHUyNzEzJylcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lRTIlOUMlOTMmJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93UHJvdG90eXBlczogZmFsc2UsXG4gICAgYWxsb3dTcGFyc2U6IGZhbHNlLFxuICAgIGFycmF5TGltaXQ6IDIwLFxuICAgIGNoYXJzZXQ6ICd1dGYtOCcsXG4gICAgY2hhcnNldFNlbnRpbmVsOiBmYWxzZSxcbiAgICBjb21tYTogZmFsc2UsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiBmYWxzZSxcbiAgICBpbnRlcnByZXROdW1lcmljRW50aXRpZXM6IGZhbHNlLFxuICAgIHBhcmFtZXRlckxpbWl0OiAxMDAwLFxuICAgIHBhcnNlQXJyYXlzOiB0cnVlLFxuICAgIHBsYWluT2JqZWN0czogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGludGVycHJldE51bWVyaWNFbnRpdGllcyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYjKFxcZCspOy9nLCBmdW5jdGlvbiAoJDAsIG51bWJlclN0cikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChudW1iZXJTdHIsIDEwKSk7XG4gICAgfSk7XG59O1xuXG52YXIgcGFyc2VBcnJheVZhbHVlID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5jb21tYSAmJiB2YWwuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBUaGlzIGlzIHdoYXQgYnJvd3NlcnMgd2lsbCBzdWJtaXQgd2hlbiB0aGUgXHUyNzEzIGNoYXJhY3RlciBvY2N1cnMgaW4gYW5cbi8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBib2R5IGFuZCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZ1xuLy8gdGhlIGZvcm0gaXMgaXNvLTg4NTktMSwgb3Igd2hlbiB0aGUgc3VibWl0dGVkIGZvcm0gaGFzIGFuIGFjY2VwdC1jaGFyc2V0XG4vLyBhdHRyaWJ1dGUgb2YgaXNvLTg4NTktMS4gUHJlc3VtYWJseSBhbHNvIHdpdGggb3RoZXIgY2hhcnNldHMgdGhhdCBkbyBub3QgY29udGFpblxuLy8gdGhlIFx1MjcxMyBjaGFyYWN0ZXIsIHN1Y2ggYXMgdXMtYXNjaWkuXG52YXIgaXNvU2VudGluZWwgPSAndXRmOD0lMjYlMjMxMDAwMyUzQic7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKVxuXG4vLyBUaGVzZSBhcmUgdGhlIHBlcmNlbnQtZW5jb2RlZCB1dGYtOCBvY3RldHMgcmVwcmVzZW50aW5nIGEgY2hlY2ttYXJrLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgYWN0dWFsbHkgaXMgdXRmLTggZW5jb2RlZC5cbnZhciBjaGFyc2V0U2VudGluZWwgPSAndXRmOD0lRTIlOUMlOTMnOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJ1x1MjcxMycpXG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIHZhciBjbGVhblN0ciA9IG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPyBzdHIucmVwbGFjZSgvXlxcPy8sICcnKSA6IHN0cjtcbiAgICB2YXIgbGltaXQgPSBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSBJbmZpbml0eSA/IHVuZGVmaW5lZCA6IG9wdGlvbnMucGFyYW1ldGVyTGltaXQ7XG4gICAgdmFyIHBhcnRzID0gY2xlYW5TdHIuc3BsaXQob3B0aW9ucy5kZWxpbWl0ZXIsIGxpbWl0KTtcbiAgICB2YXIgc2tpcEluZGV4ID0gLTE7IC8vIEtlZXAgdHJhY2sgb2Ygd2hlcmUgdGhlIHV0Zjggc2VudGluZWwgd2FzIGZvdW5kXG4gICAgdmFyIGk7XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdGlvbnMuY2hhcnNldDtcbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocGFydHNbaV0uaW5kZXhPZigndXRmOD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0c1tpXSA9PT0gY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAndXRmLTgnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydHNbaV0gPT09IGlzb1NlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAnaXNvLTg4NTktMSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXBJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgaSA9IHBhcnRzLmxlbmd0aDsgLy8gVGhlIGVzbGludCBzZXR0aW5ncyBkbyBub3QgYWxsb3cgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGkgPT09IHNraXBJbmRleCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcblxuICAgICAgICB2YXIgYnJhY2tldEVxdWFsc1BvcyA9IHBhcnQuaW5kZXhPZignXT0nKTtcbiAgICAgICAgdmFyIHBvcyA9IGJyYWNrZXRFcXVhbHNQb3MgPT09IC0xID8gcGFydC5pbmRleE9mKCc9JykgOiBicmFja2V0RXF1YWxzUG9zICsgMTtcblxuICAgICAgICB2YXIga2V5LCB2YWw7XG4gICAgICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydCwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCwgJ2tleScpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPyBudWxsIDogJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZSgwLCBwb3MpLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAna2V5Jyk7XG4gICAgICAgICAgICB2YWwgPSB1dGlscy5tYXliZU1hcChcbiAgICAgICAgICAgICAgICBwYXJzZUFycmF5VmFsdWUocGFydC5zbGljZShwb3MgKyAxKSwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVuY29kZWRWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZGVjb2RlcihlbmNvZGVkVmFsLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAndmFsdWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCAmJiBvcHRpb25zLmludGVycHJldE51bWVyaWNFbnRpdGllcyAmJiBjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIHZhbCA9IGludGVycHJldE51bWVyaWNFbnRpdGllcyh2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnQuaW5kZXhPZignW109JykgPiAtMSkge1xuICAgICAgICAgICAgdmFsID0gaXNBcnJheSh2YWwpID8gW3ZhbF0gOiB2YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzLmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmNvbWJpbmUob2JqW2tleV0sIHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgcGFyc2VPYmplY3QgPSBmdW5jdGlvbiAoY2hhaW4sIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKSB7XG4gICAgdmFyIGxlYWYgPSB2YWx1ZXNQYXJzZWQgPyB2YWwgOiBwYXJzZUFycmF5VmFsdWUodmFsLCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IFtdLmNvbmNhdChsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQoY2xlYW5Sb290LCAxMCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyc2VBcnJheXMgJiYgY2xlYW5Sb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgU3RyaW5nKGluZGV4KSA9PT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbGVhblJvb3QgIT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgb2JqW2NsZWFuUm9vdF0gPSBsZWFmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGVhZiA9IG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVhZjtcbn07XG5cbnZhciBwYXJzZUtleXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nS2V5cyhnaXZlbktleSwgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpIHtcbiAgICBpZiAoIWdpdmVuS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2Zvcm0gZG90IG5vdGF0aW9uIHRvIGJyYWNrZXQgbm90YXRpb25cbiAgICB2YXIga2V5ID0gb3B0aW9ucy5hbGxvd0RvdHMgPyBnaXZlbktleS5yZXBsYWNlKC9cXC4oW14uW10rKS9nLCAnWyQxXScpIDogZ2l2ZW5LZXk7XG5cbiAgICAvLyBUaGUgcmVnZXggY2h1bmtzXG5cbiAgICB2YXIgYnJhY2tldHMgPSAvKFxcW1teW1xcXV0qXSkvO1xuICAgIHZhciBjaGlsZCA9IC8oXFxbW15bXFxdXSpdKS9nO1xuXG4gICAgLy8gR2V0IHRoZSBwYXJlbnRcblxuICAgIHZhciBzZWdtZW50ID0gb3B0aW9ucy5kZXB0aCA+IDAgJiYgYnJhY2tldHMuZXhlYyhrZXkpO1xuICAgIHZhciBwYXJlbnQgPSBzZWdtZW50ID8ga2V5LnNsaWNlKDAsIHNlZ21lbnQuaW5kZXgpIDoga2V5O1xuXG4gICAgLy8gU3Rhc2ggdGhlIHBhcmVudCBpZiBpdCBleGlzdHNcblxuICAgIHZhciBrZXlzID0gW107XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICAvLyBJZiB3ZSBhcmVuJ3QgdXNpbmcgcGxhaW4gb2JqZWN0cywgb3B0aW9uYWxseSBwcmVmaXgga2V5cyB0aGF0IHdvdWxkIG92ZXJ3cml0ZSBvYmplY3QgcHJvdG90eXBlIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBwYXJlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAga2V5cy5wdXNoKHBhcmVudCk7XG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGNoaWxkcmVuIGFwcGVuZGluZyB0byB0aGUgYXJyYXkgdW50aWwgd2UgaGl0IGRlcHRoXG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKG9wdGlvbnMuZGVwdGggPiAwICYmIChzZWdtZW50ID0gY2hpbGQuZXhlYyhrZXkpKSAhPT0gbnVsbCAmJiBpIDwgb3B0aW9ucy5kZXB0aCkge1xuICAgICAgICBpICs9IDE7XG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc2VnbWVudFsxXS5zbGljZSgxLCAtMSkpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleXMucHVzaChzZWdtZW50WzFdKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSdzIGEgcmVtYWluZGVyLCBqdXN0IGFkZCB3aGF0ZXZlciBpcyBsZWZ0XG5cbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBrZXlzLnB1c2goJ1snICsga2V5LnNsaWNlKHNlZ21lbnQuaW5kZXgpICsgJ10nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VPYmplY3Qoa2V5cywgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpO1xufTtcblxudmFyIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWNvZGVyICE9PSBudWxsICYmIG9wdHMuZGVjb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHZhciBjaGFyc2V0ID0gdHlwZW9mIG9wdHMuY2hhcnNldCA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5jaGFyc2V0IDogb3B0cy5jaGFyc2V0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dEb3RzOiB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cyxcbiAgICAgICAgYWxsb3dQcm90b3R5cGVzOiB0eXBlb2Ygb3B0cy5hbGxvd1Byb3RvdHlwZXMgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dQcm90b3R5cGVzIDogZGVmYXVsdHMuYWxsb3dQcm90b3R5cGVzLFxuICAgICAgICBhbGxvd1NwYXJzZTogdHlwZW9mIG9wdHMuYWxsb3dTcGFyc2UgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dTcGFyc2UgOiBkZWZhdWx0cy5hbGxvd1NwYXJzZSxcbiAgICAgICAgYXJyYXlMaW1pdDogdHlwZW9mIG9wdHMuYXJyYXlMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLmFycmF5TGltaXQgOiBkZWZhdWx0cy5hcnJheUxpbWl0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hOiB0eXBlb2Ygb3B0cy5jb21tYSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jb21tYSA6IGRlZmF1bHRzLmNvbW1hLFxuICAgICAgICBkZWNvZGVyOiB0eXBlb2Ygb3B0cy5kZWNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5kZWNvZGVyIDogZGVmYXVsdHMuZGVjb2RlcixcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICdzdHJpbmcnIHx8IHV0aWxzLmlzUmVnRXhwKG9wdHMuZGVsaW1pdGVyKSA/IG9wdHMuZGVsaW1pdGVyIDogZGVmYXVsdHMuZGVsaW1pdGVyLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb24sIG5vLWV4dHJhLXBhcmVuc1xuICAgICAgICBkZXB0aDogKHR5cGVvZiBvcHRzLmRlcHRoID09PSAnbnVtYmVyJyB8fCBvcHRzLmRlcHRoID09PSBmYWxzZSkgPyArb3B0cy5kZXB0aCA6IGRlZmF1bHRzLmRlcHRoLFxuICAgICAgICBpZ25vcmVRdWVyeVByZWZpeDogb3B0cy5pZ25vcmVRdWVyeVByZWZpeCA9PT0gdHJ1ZSxcbiAgICAgICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiB0eXBlb2Ygb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgPT09ICdib29sZWFuJyA/IG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzIDogZGVmYXVsdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzLFxuICAgICAgICBwYXJhbWV0ZXJMaW1pdDogdHlwZW9mIG9wdHMucGFyYW1ldGVyTGltaXQgPT09ICdudW1iZXInID8gb3B0cy5wYXJhbWV0ZXJMaW1pdCA6IGRlZmF1bHRzLnBhcmFtZXRlckxpbWl0LFxuICAgICAgICBwYXJzZUFycmF5czogb3B0cy5wYXJzZUFycmF5cyAhPT0gZmFsc2UsXG4gICAgICAgIHBsYWluT2JqZWN0czogdHlwZW9mIG9wdHMucGxhaW5PYmplY3RzID09PSAnYm9vbGVhbicgPyBvcHRzLnBsYWluT2JqZWN0cyA6IGRlZmF1bHRzLnBsYWluT2JqZWN0cyxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucywgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycpO1xuICAgICAgICBvYmogPSB1dGlscy5tZXJnZShvYmosIG5ld09iaiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dTcGFyc2UgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xudmFyIHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0czogZm9ybWF0cyxcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcbn07XG4iLCAiLyohXG4gKiBib2R5LXBhcnNlclxuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgYnl0ZXMgPSByZXF1aXJlKCdieXRlcycpXG52YXIgY29udGVudFR5cGUgPSByZXF1aXJlKCdjb250ZW50LXR5cGUnKVxudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnaHR0cC1lcnJvcnMnKVxudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYm9keS1wYXJzZXI6dXJsZW5jb2RlZCcpXG52YXIgZGVwcmVjYXRlID0gcmVxdWlyZSgnZGVwZCcpKCdib2R5LXBhcnNlcicpXG52YXIgcmVhZCA9IHJlcXVpcmUoJy4uL3JlYWQnKVxudmFyIHR5cGVpcyA9IHJlcXVpcmUoJ3R5cGUtaXMnKVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdXJsZW5jb2RlZFxuXG4vKipcbiAqIENhY2hlIG9mIHBhcnNlciBtb2R1bGVzLlxuICovXG5cbnZhciBwYXJzZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4vKipcbiAqIENyZWF0ZSBhIG1pZGRsZXdhcmUgdG8gcGFyc2UgdXJsZW5jb2RlZCBib2RpZXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gdXJsZW5jb2RlZCAob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge31cblxuICAvLyBub3RpY2UgYmVjYXVzZSBvcHRpb24gZGVmYXVsdCB3aWxsIGZsaXAgaW4gbmV4dCBtYWpvclxuICBpZiAob3B0cy5leHRlbmRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZGVwcmVjYXRlKCd1bmRlZmluZWQgZXh0ZW5kZWQ6IHByb3ZpZGUgZXh0ZW5kZWQgb3B0aW9uJylcbiAgfVxuXG4gIHZhciBleHRlbmRlZCA9IG9wdHMuZXh0ZW5kZWQgIT09IGZhbHNlXG4gIHZhciBpbmZsYXRlID0gb3B0cy5pbmZsYXRlICE9PSBmYWxzZVxuICB2YXIgbGltaXQgPSB0eXBlb2Ygb3B0cy5saW1pdCAhPT0gJ251bWJlcidcbiAgICA/IGJ5dGVzLnBhcnNlKG9wdHMubGltaXQgfHwgJzEwMGtiJylcbiAgICA6IG9wdHMubGltaXRcbiAgdmFyIHR5cGUgPSBvcHRzLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgdmFyIHZlcmlmeSA9IG9wdHMudmVyaWZ5IHx8IGZhbHNlXG5cbiAgaWYgKHZlcmlmeSAhPT0gZmFsc2UgJiYgdHlwZW9mIHZlcmlmeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiB2ZXJpZnkgbXVzdCBiZSBmdW5jdGlvbicpXG4gIH1cblxuICAvLyBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIHF1ZXJ5IHBhcnNlclxuICB2YXIgcXVlcnlwYXJzZSA9IGV4dGVuZGVkXG4gICAgPyBleHRlbmRlZHBhcnNlcihvcHRzKVxuICAgIDogc2ltcGxlcGFyc2VyKG9wdHMpXG5cbiAgLy8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9uXG4gIHZhciBzaG91bGRQYXJzZSA9IHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nXG4gICAgPyB0eXBlQ2hlY2tlcih0eXBlKVxuICAgIDogdHlwZVxuXG4gIGZ1bmN0aW9uIHBhcnNlIChib2R5KSB7XG4gICAgcmV0dXJuIGJvZHkubGVuZ3RoXG4gICAgICA/IHF1ZXJ5cGFyc2UoYm9keSlcbiAgICAgIDoge31cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiB1cmxlbmNvZGVkUGFyc2VyIChyZXEsIHJlcywgbmV4dCkge1xuICAgIGlmIChyZXEuX2JvZHkpIHtcbiAgICAgIGRlYnVnKCdib2R5IGFscmVhZHkgcGFyc2VkJylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVxLmJvZHkgPSByZXEuYm9keSB8fCB7fVxuXG4gICAgLy8gc2tpcCByZXF1ZXN0cyB3aXRob3V0IGJvZGllc1xuICAgIGlmICghdHlwZWlzLmhhc0JvZHkocmVxKSkge1xuICAgICAgZGVidWcoJ3NraXAgZW1wdHkgYm9keScpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGRlYnVnKCdjb250ZW50LXR5cGUgJWonLCByZXEuaGVhZGVyc1snY29udGVudC10eXBlJ10pXG5cbiAgICAvLyBkZXRlcm1pbmUgaWYgcmVxdWVzdCBzaG91bGQgYmUgcGFyc2VkXG4gICAgaWYgKCFzaG91bGRQYXJzZShyZXEpKSB7XG4gICAgICBkZWJ1Zygnc2tpcCBwYXJzaW5nJylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gYXNzZXJ0IGNoYXJzZXRcbiAgICB2YXIgY2hhcnNldCA9IGdldENoYXJzZXQocmVxKSB8fCAndXRmLTgnXG4gICAgaWYgKGNoYXJzZXQgIT09ICd1dGYtOCcpIHtcbiAgICAgIGRlYnVnKCdpbnZhbGlkIGNoYXJzZXQnKVxuICAgICAgbmV4dChjcmVhdGVFcnJvcig0MTUsICd1bnN1cHBvcnRlZCBjaGFyc2V0IFwiJyArIGNoYXJzZXQudG9VcHBlckNhc2UoKSArICdcIicsIHtcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgdHlwZTogJ2NoYXJzZXQudW5zdXBwb3J0ZWQnXG4gICAgICB9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHJlYWRcbiAgICByZWFkKHJlcSwgcmVzLCBuZXh0LCBwYXJzZSwgZGVidWcsIHtcbiAgICAgIGRlYnVnOiBkZWJ1ZyxcbiAgICAgIGVuY29kaW5nOiBjaGFyc2V0LFxuICAgICAgaW5mbGF0ZTogaW5mbGF0ZSxcbiAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgIHZlcmlmeTogdmVyaWZ5XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgZXh0ZW5kZWQgcXVlcnkgcGFyc2VyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKi9cblxuZnVuY3Rpb24gZXh0ZW5kZWRwYXJzZXIgKG9wdGlvbnMpIHtcbiAgdmFyIHBhcmFtZXRlckxpbWl0ID0gb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCAhPT0gdW5kZWZpbmVkXG4gICAgPyBvcHRpb25zLnBhcmFtZXRlckxpbWl0XG4gICAgOiAxMDAwXG4gIHZhciBwYXJzZSA9IHBhcnNlcigncXMnKVxuXG4gIGlmIChpc05hTihwYXJhbWV0ZXJMaW1pdCkgfHwgcGFyYW1ldGVyTGltaXQgPCAxKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHBhcmFtZXRlckxpbWl0IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICB9XG5cbiAgaWYgKGlzRmluaXRlKHBhcmFtZXRlckxpbWl0KSkge1xuICAgIHBhcmFtZXRlckxpbWl0ID0gcGFyYW1ldGVyTGltaXQgfCAwXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcXVlcnlwYXJzZSAoYm9keSkge1xuICAgIHZhciBwYXJhbUNvdW50ID0gcGFyYW1ldGVyQ291bnQoYm9keSwgcGFyYW1ldGVyTGltaXQpXG5cbiAgICBpZiAocGFyYW1Db3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWJ1ZygndG9vIG1hbnkgcGFyYW1ldGVycycpXG4gICAgICB0aHJvdyBjcmVhdGVFcnJvcig0MTMsICd0b28gbWFueSBwYXJhbWV0ZXJzJywge1xuICAgICAgICB0eXBlOiAncGFyYW1ldGVycy50b28ubWFueSdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdmFyIGFycmF5TGltaXQgPSBNYXRoLm1heCgxMDAsIHBhcmFtQ291bnQpXG5cbiAgICBkZWJ1ZygncGFyc2UgZXh0ZW5kZWQgdXJsZW5jb2RpbmcnKVxuICAgIHJldHVybiBwYXJzZShib2R5LCB7XG4gICAgICBhbGxvd1Byb3RvdHlwZXM6IHRydWUsXG4gICAgICBhcnJheUxpbWl0OiBhcnJheUxpbWl0LFxuICAgICAgZGVwdGg6IEluZmluaXR5LFxuICAgICAgcGFyYW1ldGVyTGltaXQ6IHBhcmFtZXRlckxpbWl0XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgY2hhcnNldCBvZiBhIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlcVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0Q2hhcnNldCAocmVxKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChjb250ZW50VHlwZS5wYXJzZShyZXEpLnBhcmFtZXRlcnMuY2hhcnNldCB8fCAnJykudG9Mb3dlckNhc2UoKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzLCBzdG9wcGluZyBvbmNlIGxpbWl0IHJlYWNoZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9keVxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJhbWV0ZXJDb3VudCAoYm9keSwgbGltaXQpIHtcbiAgdmFyIGNvdW50ID0gMFxuICB2YXIgaW5kZXggPSAwXG5cbiAgd2hpbGUgKChpbmRleCA9IGJvZHkuaW5kZXhPZignJicsIGluZGV4KSkgIT09IC0xKSB7XG4gICAgY291bnQrK1xuICAgIGluZGV4KytcblxuICAgIGlmIChjb3VudCA9PT0gbGltaXQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY291bnRcbn1cblxuLyoqXG4gKiBHZXQgcGFyc2VyIGZvciBtb2R1bGUgbmFtZSBkeW5hbWljYWxseS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZXIgKG5hbWUpIHtcbiAgdmFyIG1vZCA9IHBhcnNlcnNbbmFtZV1cblxuICBpZiAobW9kICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbW9kLnBhcnNlXG4gIH1cblxuICAvLyB0aGlzIHVzZXMgYSBzd2l0Y2ggZm9yIHN0YXRpYyByZXF1aXJlIGFuYWx5c2lzXG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ3FzJzpcbiAgICAgIG1vZCA9IHJlcXVpcmUoJ3FzJylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAncXVlcnlzdHJpbmcnOlxuICAgICAgbW9kID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKVxuICAgICAgYnJlYWtcbiAgfVxuXG4gIC8vIHN0b3JlIHRvIHByZXZlbnQgaW52b2tpbmcgcmVxdWlyZSgpXG4gIHBhcnNlcnNbbmFtZV0gPSBtb2RcblxuICByZXR1cm4gbW9kLnBhcnNlXG59XG5cbi8qKlxuICogR2V0IHRoZSBzaW1wbGUgcXVlcnkgcGFyc2VyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKi9cblxuZnVuY3Rpb24gc2ltcGxlcGFyc2VyIChvcHRpb25zKSB7XG4gIHZhciBwYXJhbWV0ZXJMaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdFxuICAgIDogMTAwMFxuICB2YXIgcGFyc2UgPSBwYXJzZXIoJ3F1ZXJ5c3RyaW5nJylcblxuICBpZiAoaXNOYU4ocGFyYW1ldGVyTGltaXQpIHx8IHBhcmFtZXRlckxpbWl0IDwgMSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBwYXJhbWV0ZXJMaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgfVxuXG4gIGlmIChpc0Zpbml0ZShwYXJhbWV0ZXJMaW1pdCkpIHtcbiAgICBwYXJhbWV0ZXJMaW1pdCA9IHBhcmFtZXRlckxpbWl0IHwgMFxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHF1ZXJ5cGFyc2UgKGJvZHkpIHtcbiAgICB2YXIgcGFyYW1Db3VudCA9IHBhcmFtZXRlckNvdW50KGJvZHksIHBhcmFtZXRlckxpbWl0KVxuXG4gICAgaWYgKHBhcmFtQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVidWcoJ3RvbyBtYW55IHBhcmFtZXRlcnMnKVxuICAgICAgdGhyb3cgY3JlYXRlRXJyb3IoNDEzLCAndG9vIG1hbnkgcGFyYW1ldGVycycsIHtcbiAgICAgICAgdHlwZTogJ3BhcmFtZXRlcnMudG9vLm1hbnknXG4gICAgICB9KVxuICAgIH1cblxuICAgIGRlYnVnKCdwYXJzZSB1cmxlbmNvZGluZycpXG4gICAgcmV0dXJuIHBhcnNlKGJvZHksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7IG1heEtleXM6IHBhcmFtZXRlckxpbWl0IH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNpbXBsZSB0eXBlIGNoZWNrZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICovXG5cbmZ1bmN0aW9uIHR5cGVDaGVja2VyICh0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjaGVja1R5cGUgKHJlcSkge1xuICAgIHJldHVybiBCb29sZWFuKHR5cGVpcyhyZXEsIHR5cGUpKVxuICB9XG59XG4iLCAiLyohXG4gKiBib2R5LXBhcnNlclxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnYm9keS1wYXJzZXInKVxuXG4vKipcbiAqIENhY2hlIG9mIGxvYWRlZCBwYXJzZXJzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgcGFyc2VycyA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuLyoqXG4gKiBAdHlwZWRlZiBQYXJzZXJzXG4gKiBAdHlwZSB7ZnVuY3Rpb259XG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBqc29uXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByYXdcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHRleHRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHVybGVuY29kZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHR5cGUge1BhcnNlcnN9XG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGJvZHlQYXJzZXIsXG4gICdib2R5UGFyc2VyOiB1c2UgaW5kaXZpZHVhbCBqc29uL3VybGVuY29kZWQgbWlkZGxld2FyZXMnKVxuXG4vKipcbiAqIEpTT04gcGFyc2VyLlxuICogQHB1YmxpY1xuICovXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnanNvbicsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGNyZWF0ZVBhcnNlckdldHRlcignanNvbicpXG59KVxuXG4vKipcbiAqIFJhdyBwYXJzZXIuXG4gKiBAcHVibGljXG4gKi9cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdyYXcnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBjcmVhdGVQYXJzZXJHZXR0ZXIoJ3JhdycpXG59KVxuXG4vKipcbiAqIFRleHQgcGFyc2VyLlxuICogQHB1YmxpY1xuICovXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAndGV4dCcsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGNyZWF0ZVBhcnNlckdldHRlcigndGV4dCcpXG59KVxuXG4vKipcbiAqIFVSTC1lbmNvZGVkIHBhcnNlci5cbiAqIEBwdWJsaWNcbiAqL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ3VybGVuY29kZWQnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBjcmVhdGVQYXJzZXJHZXR0ZXIoJ3VybGVuY29kZWQnKVxufSlcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIGpzb24gYW5kIHVybGVuY29kZWQgYm9kaWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQGRlcHJlY2F0ZWRcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBib2R5UGFyc2VyIChvcHRpb25zKSB7XG4gIC8vIHVzZSBkZWZhdWx0IHR5cGUgZm9yIHBhcnNlcnNcbiAgdmFyIG9wdHMgPSBPYmplY3QuY3JlYXRlKG9wdGlvbnMgfHwgbnVsbCwge1xuICAgIHR5cGU6IHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9XG4gIH0pXG5cbiAgdmFyIF91cmxlbmNvZGVkID0gZXhwb3J0cy51cmxlbmNvZGVkKG9wdHMpXG4gIHZhciBfanNvbiA9IGV4cG9ydHMuanNvbihvcHRzKVxuXG4gIHJldHVybiBmdW5jdGlvbiBib2R5UGFyc2VyIChyZXEsIHJlcywgbmV4dCkge1xuICAgIF9qc29uKHJlcSwgcmVzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICBfdXJsZW5jb2RlZChyZXEsIHJlcywgbmV4dClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZ2V0dGVyIGZvciBsb2FkaW5nIGEgcGFyc2VyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVQYXJzZXJHZXR0ZXIgKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldCAoKSB7XG4gICAgcmV0dXJuIGxvYWRQYXJzZXIobmFtZSlcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYSBwYXJzZXIgbW9kdWxlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkUGFyc2VyIChwYXJzZXJOYW1lKSB7XG4gIHZhciBwYXJzZXIgPSBwYXJzZXJzW3BhcnNlck5hbWVdXG5cbiAgaWYgKHBhcnNlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgLy8gdGhpcyB1c2VzIGEgc3dpdGNoIGZvciBzdGF0aWMgcmVxdWlyZSBhbmFseXNpc1xuICBzd2l0Y2ggKHBhcnNlck5hbWUpIHtcbiAgICBjYXNlICdqc29uJzpcbiAgICAgIHBhcnNlciA9IHJlcXVpcmUoJy4vbGliL3R5cGVzL2pzb24nKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdyYXcnOlxuICAgICAgcGFyc2VyID0gcmVxdWlyZSgnLi9saWIvdHlwZXMvcmF3JylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAndGV4dCc6XG4gICAgICBwYXJzZXIgPSByZXF1aXJlKCcuL2xpYi90eXBlcy90ZXh0JylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAndXJsZW5jb2RlZCc6XG4gICAgICBwYXJzZXIgPSByZXF1aXJlKCcuL2xpYi90eXBlcy91cmxlbmNvZGVkJylcbiAgICAgIGJyZWFrXG4gIH1cblxuICAvLyBzdG9yZSB0byBwcmV2ZW50IGludm9raW5nIHJlcXVpcmUoKVxuICByZXR1cm4gKHBhcnNlcnNbcGFyc2VyTmFtZV0gPSBwYXJzZXIpXG59XG4iLCAiLyohXG4gKiBtZXJnZS1kZXNjcmlwdG9yc1xuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZVxuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuLyoqXG4gKiBNZXJnZSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgb2YgYHNyY2AgaW50byBgZGVzdGBcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGVzdCBPYmplY3QgdG8gYWRkIGRlc2NyaXB0b3JzIHRvXG4gKiBAcGFyYW0ge29iamVjdH0gc3JjIE9iamVjdCB0byBjbG9uZSBkZXNjcmlwdG9ycyBmcm9tXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWRlZmluZT10cnVlXSBSZWRlZmluZSBgZGVzdGAgcHJvcGVydGllcyB3aXRoIGBzcmNgIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIHtvYmplY3R9IFJlZmVyZW5jZSB0byBkZXN0XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gbWVyZ2UoZGVzdCwgc3JjLCByZWRlZmluZSkge1xuICBpZiAoIWRlc3QpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBkZXN0IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIGlmICghc3JjKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3JjIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIGlmIChyZWRlZmluZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gRGVmYXVsdCB0byB0cnVlXG4gICAgcmVkZWZpbmUgPSB0cnVlXG4gIH1cblxuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzcmMpLmZvckVhY2goZnVuY3Rpb24gZm9yRWFjaE93blByb3BlcnR5TmFtZShuYW1lKSB7XG4gICAgaWYgKCFyZWRlZmluZSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc3QsIG5hbWUpKSB7XG4gICAgICAvLyBTa2lwIGRlc3JpcHRvclxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ29weSBkZXNjcmlwdG9yXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNyYywgbmFtZSlcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVzdCwgbmFtZSwgZGVzY3JpcHRvcilcbiAgfSlcblxuICByZXR1cm4gZGVzdFxufVxuIiwgIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbCkgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigoPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIGlmIChtcyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtcyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICByZXR1cm4gcGx1cmFsKG1zLCBkLCAnZGF5JykgfHxcbiAgICBwbHVyYWwobXMsIGgsICdob3VyJykgfHxcbiAgICBwbHVyYWwobXMsIG0sICdtaW51dGUnKSB8fFxuICAgIHBsdXJhbChtcywgcywgJ3NlY29uZCcpIHx8XG4gICAgbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG4sIG5hbWUpIHtcbiAgaWYgKG1zIDwgbikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobXMgPCBuICogMS41KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IobXMgLyBuKSArICcgJyArIG5hbWU7XG4gIH1cbiAgcmV0dXJuIE1hdGguY2VpbChtcyAvIG4pICsgJyAnICsgbmFtZSArICdzJztcbn1cbiIsICJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gY3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Z1snZGVmYXVsdCddID0gY3JlYXRlRGVidWc7XG5leHBvcnRzLmNvZXJjZSA9IGNvZXJjZTtcbmV4cG9ydHMuZGlzYWJsZSA9IGRpc2FibGU7XG5leHBvcnRzLmVuYWJsZSA9IGVuYWJsZTtcbmV4cG9ydHMuZW5hYmxlZCA9IGVuYWJsZWQ7XG5leHBvcnRzLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblxuLyoqXG4gKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cbiAqL1xuXG5leHBvcnRzLm5hbWVzID0gW107XG5leHBvcnRzLnNraXBzID0gW107XG5cbi8qKlxuICogTWFwIG9mIHNwZWNpYWwgXCIlblwiIGhhbmRsaW5nIGZ1bmN0aW9ucywgZm9yIHRoZSBkZWJ1ZyBcImZvcm1hdFwiIGFyZ3VtZW50LlxuICpcbiAqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMgPSB7fTtcblxuLyoqXG4gKiBQcmV2aW91cyBsb2cgdGltZXN0YW1wLlxuICovXG5cbnZhciBwcmV2VGltZTtcblxuLyoqXG4gKiBTZWxlY3QgYSBjb2xvci5cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuICB2YXIgaGFzaCA9IDAsIGk7XG5cbiAgZm9yIChpIGluIG5hbWVzcGFjZSkge1xuICAgIGhhc2ggID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG5cbiAgcmV0dXJuIGV4cG9ydHMuY29sb3JzW01hdGguYWJzKGhhc2gpICUgZXhwb3J0cy5jb2xvcnMubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cbiAgZnVuY3Rpb24gZGVidWcoKSB7XG4gICAgLy8gZGlzYWJsZWQ/XG4gICAgaWYgKCFkZWJ1Zy5lbmFibGVkKSByZXR1cm47XG5cbiAgICB2YXIgc2VsZiA9IGRlYnVnO1xuXG4gICAgLy8gc2V0IGBkaWZmYCB0aW1lc3RhbXBcbiAgICB2YXIgY3VyciA9ICtuZXcgRGF0ZSgpO1xuICAgIHZhciBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG4gICAgc2VsZi5kaWZmID0gbXM7XG4gICAgc2VsZi5wcmV2ID0gcHJldlRpbWU7XG4gICAgc2VsZi5jdXJyID0gY3VycjtcbiAgICBwcmV2VGltZSA9IGN1cnI7XG5cbiAgICAvLyB0dXJuIHRoZSBgYXJndW1lbnRzYCBpbnRvIGEgcHJvcGVyIEFycmF5XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cblxuICAgIGFyZ3NbMF0gPSBleHBvcnRzLmNvZXJjZShhcmdzWzBdKTtcblxuICAgIGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGFyZ3NbMF0pIHtcbiAgICAgIC8vIGFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG4gICAgICBhcmdzLnVuc2hpZnQoJyVPJyk7XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCBmdW5jdGlvbihtYXRjaCwgZm9ybWF0KSB7XG4gICAgICAvLyBpZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG4gICAgICBpZiAobWF0Y2ggPT09ICclJScpIHJldHVybiBtYXRjaDtcbiAgICAgIGluZGV4Kys7XG4gICAgICB2YXIgZm9ybWF0dGVyID0gZXhwb3J0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG4gICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZvcm1hdHRlcikge1xuICAgICAgICB2YXIgdmFsID0gYXJnc1tpbmRleF07XG4gICAgICAgIG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuICAgICAgICAvLyBub3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG4gICAgICAgIGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcblxuICAgIC8vIGFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG4gICAgZXhwb3J0cy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cbiAgICB2YXIgbG9nRm4gPSBkZWJ1Zy5sb2cgfHwgZXhwb3J0cy5sb2cgfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTtcbiAgICBsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgfVxuXG4gIGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgZGVidWcuZW5hYmxlZCA9IGV4cG9ydHMuZW5hYmxlZChuYW1lc3BhY2UpO1xuICBkZWJ1Zy51c2VDb2xvcnMgPSBleHBvcnRzLnVzZUNvbG9ycygpO1xuICBkZWJ1Zy5jb2xvciA9IHNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cbiAgLy8gZW52LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciBkZWJ1ZyBpbnN0YW5jZXNcbiAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBleHBvcnRzLmluaXQpIHtcbiAgICBleHBvcnRzLmluaXQoZGVidWcpO1xuICB9XG5cbiAgcmV0dXJuIGRlYnVnO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcbiAqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcbiAgZXhwb3J0cy5zYXZlKG5hbWVzcGFjZXMpO1xuXG4gIGV4cG9ydHMubmFtZXMgPSBbXTtcbiAgZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4gIHZhciBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG4gIHZhciBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGlmICghc3BsaXRbaV0pIGNvbnRpbnVlOyAvLyBpZ25vcmUgZW1wdHkgc3RyaW5nc1xuICAgIG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuICAgIGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcbiAgICAgIGV4cG9ydHMuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMuc3Vic3RyKDEpICsgJyQnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gIGV4cG9ydHMuZW5hYmxlKCcnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuICB2YXIgaSwgbGVuO1xuICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGV4cG9ydHMuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGV4cG9ydHMubmFtZXNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYHZhbGAuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsXG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuICByZXR1cm4gdmFsO1xufVxuIiwgIi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZVxuICAgICAgICAgICAgICAgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZS5zdG9yYWdlXG4gICAgICAgICAgICAgICAgICA/IGNocm9tZS5zdG9yYWdlLmxvY2FsXG4gICAgICAgICAgICAgICAgICA6IGxvY2Fsc3RvcmFnZSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcbiAgJ2xpZ2h0c2VhZ3JlZW4nLFxuICAnZm9yZXN0Z3JlZW4nLFxuICAnZ29sZGVucm9kJyxcbiAgJ2RvZGdlcmJsdWUnLFxuICAnZGFya29yY2hpZCcsXG4gICdjcmltc29uJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG4gIC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcbiAgLy8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2VcbiAgLy8gZXhwbGljaXRseVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgd2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gaXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcbiAgLy8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcbiAgcmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG4gICAgLy8gaXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG4gICAgLy8gaXMgZmlyZWZveCA+PSB2MzE/XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG4gICAgLy8gZG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24odikge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVyci5tZXNzYWdlO1xuICB9XG59O1xuXG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG4gIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuICBhcmdzWzBdID0gKHVzZUNvbG9ycyA/ICclYycgOiAnJylcbiAgICArIHRoaXMubmFtZXNwYWNlXG4gICAgKyAodXNlQ29sb3JzID8gJyAlYycgOiAnICcpXG4gICAgKyBhcmdzWzBdXG4gICAgKyAodXNlQ29sb3JzID8gJyVjICcgOiAnICcpXG4gICAgKyAnKycgKyBleHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHJldHVybjtcblxuICB2YXIgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG4gIGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpXG5cbiAgLy8gdGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcbiAgLy8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuICAvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxhc3RDID0gMDtcbiAgYXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgaWYgKCclJScgPT09IG1hdGNoKSByZXR1cm47XG4gICAgaW5kZXgrKztcbiAgICBpZiAoJyVjJyA9PT0gbWF0Y2gpIHtcbiAgICAgIC8vIHdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuICAgICAgLy8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcbiAgICAgIGxhc3RDID0gaW5kZXg7XG4gICAgfVxuICB9KTtcblxuICBhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5sb2coKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmxvZ2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gbG9nKCkge1xuICAvLyB0aGlzIGhhY2tlcnkgaXMgcmVxdWlyZWQgZm9yIElFOC85LCB3aGVyZVxuICAvLyB0aGUgYGNvbnNvbGUubG9nYCBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgJ2FwcGx5J1xuICByZXR1cm4gJ29iamVjdCcgPT09IHR5cGVvZiBjb25zb2xlXG4gICAgJiYgY29uc29sZS5sb2dcbiAgICAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmxvZywgY29uc29sZSwgYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG4gIHRyeSB7XG4gICAgaWYgKG51bGwgPT0gbmFtZXNwYWNlcykge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZyA9IG5hbWVzcGFjZXM7XG4gICAgfVxuICB9IGNhdGNoKGUpIHt9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcbiAgdmFyIHI7XG4gIHRyeSB7XG4gICAgciA9IGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZztcbiAgfSBjYXRjaChlKSB7fVxuXG4gIC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcbiAgaWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG4gICAgciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuICB9XG5cbiAgcmV0dXJuIHI7XG59XG5cbi8qKlxuICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBsb2NhbFN0b3JhZ2UuZGVidWdgIGluaXRpYWxseS5cbiAqL1xuXG5leHBvcnRzLmVuYWJsZShsb2FkKCkpO1xuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgfSBjYXRjaCAoZSkge31cbn1cbiIsICIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHR0eSA9IHJlcXVpcmUoJ3R0eScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGVidWcnKTtcbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFs2LCAyLCAzLCA0LCA1LCAxXTtcblxuLyoqXG4gKiBCdWlsZCB1cCB0aGUgZGVmYXVsdCBgaW5zcGVjdE9wdHNgIG9iamVjdCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogICAkIERFQlVHX0NPTE9SUz1ubyBERUJVR19ERVBUSD0xMCBERUJVR19TSE9XX0hJRERFTj1lbmFibGVkIG5vZGUgc2NyaXB0LmpzXG4gKi9cblxuZXhwb3J0cy5pbnNwZWN0T3B0cyA9IE9iamVjdC5rZXlzKHByb2Nlc3MuZW52KS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gL15kZWJ1Z18vaS50ZXN0KGtleSk7XG59KS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwga2V5KSB7XG4gIC8vIGNhbWVsLWNhc2VcbiAgdmFyIHByb3AgPSBrZXlcbiAgICAuc3Vic3RyaW5nKDYpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXyhbYS16XSkvZywgZnVuY3Rpb24gKF8sIGspIHsgcmV0dXJuIGsudG9VcHBlckNhc2UoKSB9KTtcblxuICAvLyBjb2VyY2Ugc3RyaW5nIHZhbHVlIGludG8gSlMgdmFsdWVcbiAgdmFyIHZhbCA9IHByb2Nlc3MuZW52W2tleV07XG4gIGlmICgvXih5ZXN8b258dHJ1ZXxlbmFibGVkKSQvaS50ZXN0KHZhbCkpIHZhbCA9IHRydWU7XG4gIGVsc2UgaWYgKC9eKG5vfG9mZnxmYWxzZXxkaXNhYmxlZCkkL2kudGVzdCh2YWwpKSB2YWwgPSBmYWxzZTtcbiAgZWxzZSBpZiAodmFsID09PSAnbnVsbCcpIHZhbCA9IG51bGw7XG4gIGVsc2UgdmFsID0gTnVtYmVyKHZhbCk7XG5cbiAgb2JqW3Byb3BdID0gdmFsO1xuICByZXR1cm4gb2JqO1xufSwge30pO1xuXG4vKipcbiAqIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgdGhlIGBkZWJ1ZygpYCBjYWxscyB0by5cbiAqIFNldCB0aGUgYERFQlVHX0ZEYCBlbnYgdmFyaWFibGUgdG8gb3ZlcnJpZGUgd2l0aCBhbm90aGVyIHZhbHVlLiBpLmUuOlxuICpcbiAqICAgJCBERUJVR19GRD0zIG5vZGUgc2NyaXB0LmpzIDM+ZGVidWcubG9nXG4gKi9cblxudmFyIGZkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuREVCVUdfRkQsIDEwKSB8fCAyO1xuXG5pZiAoMSAhPT0gZmQgJiYgMiAhPT0gZmQpIHtcbiAgdXRpbC5kZXByZWNhdGUoZnVuY3Rpb24oKXt9LCAnZXhjZXB0IGZvciBzdGRlcnIoMikgYW5kIHN0ZG91dCgxKSwgYW55IG90aGVyIHVzYWdlIG9mIERFQlVHX0ZEIGlzIGRlcHJlY2F0ZWQuIE92ZXJyaWRlIGRlYnVnLmxvZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbG9nIGZ1bmN0aW9uIChodHRwczovL2dpdC5pby9kZWJ1Z19mZCknKSgpXG59XG5cbnZhciBzdHJlYW0gPSAxID09PSBmZCA/IHByb2Nlc3Muc3Rkb3V0IDpcbiAgICAgICAgICAgICAyID09PSBmZCA/IHByb2Nlc3Muc3RkZXJyIDpcbiAgICAgICAgICAgICBjcmVhdGVXcml0YWJsZVN0ZGlvU3RyZWFtKGZkKTtcblxuLyoqXG4gKiBJcyBzdGRvdXQgYSBUVFk/IENvbG9yZWQgb3V0cHV0IGlzIGVuYWJsZWQgd2hlbiBgdHJ1ZWAuXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuICByZXR1cm4gJ2NvbG9ycycgaW4gZXhwb3J0cy5pbnNwZWN0T3B0c1xuICAgID8gQm9vbGVhbihleHBvcnRzLmluc3BlY3RPcHRzLmNvbG9ycylcbiAgICA6IHR0eS5pc2F0dHkoZmQpO1xufVxuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGwgb24gYSBzaW5nbGUgbGluZS5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMubyA9IGZ1bmN0aW9uKHYpIHtcbiAgdGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcbiAgcmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKVxuICAgIC5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci50cmltKClcbiAgICB9KS5qb2luKCcgJyk7XG59O1xuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGxvd2luZyBtdWx0aXBsZSBsaW5lcyBpZiBuZWVkZWQuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLk8gPSBmdW5jdGlvbih2KSB7XG4gIHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG4gIHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cyk7XG59O1xuXG4vKipcbiAqIEFkZHMgQU5TSSBjb2xvciBlc2NhcGUgY29kZXMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuICB2YXIgbmFtZSA9IHRoaXMubmFtZXNwYWNlO1xuICB2YXIgdXNlQ29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cbiAgaWYgKHVzZUNvbG9ycykge1xuICAgIHZhciBjID0gdGhpcy5jb2xvcjtcbiAgICB2YXIgcHJlZml4ID0gJyAgXFx1MDAxYlszJyArIGMgKyAnOzFtJyArIG5hbWUgKyAnICcgKyAnXFx1MDAxYlswbSc7XG5cbiAgICBhcmdzWzBdID0gcHJlZml4ICsgYXJnc1swXS5zcGxpdCgnXFxuJykuam9pbignXFxuJyArIHByZWZpeCk7XG4gICAgYXJncy5wdXNoKCdcXHUwMDFiWzMnICsgYyArICdtKycgKyBleHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZikgKyAnXFx1MDAxYlswbScpO1xuICB9IGVsc2Uge1xuICAgIGFyZ3NbMF0gPSBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKClcbiAgICAgICsgJyAnICsgbmFtZSArICcgJyArIGFyZ3NbMF07XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2VzIGB1dGlsLmZvcm1hdCgpYCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCB3cml0ZXMgdG8gYHN0cmVhbWAuXG4gKi9cblxuZnVuY3Rpb24gbG9nKCkge1xuICByZXR1cm4gc3RyZWFtLndyaXRlKHV0aWwuZm9ybWF0LmFwcGx5KHV0aWwsIGFyZ3VtZW50cykgKyAnXFxuJyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICBpZiAobnVsbCA9PSBuYW1lc3BhY2VzKSB7XG4gICAgLy8gSWYgeW91IHNldCBhIHByb2Nlc3MuZW52IGZpZWxkIHRvIG51bGwgb3IgdW5kZWZpbmVkLCBpdCBnZXRzIGNhc3QgdG8gdGhlXG4gICAgLy8gc3RyaW5nICdudWxsJyBvciAndW5kZWZpbmVkJy4gSnVzdCBkZWxldGUgaW5zdGVhZC5cbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuREVCVUc7XG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5lbnYuREVCVUcgPSBuYW1lc3BhY2VzO1xuICB9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkRFQlVHO1xufVxuXG4vKipcbiAqIENvcGllZCBmcm9tIGBub2RlL3NyYy9ub2RlLmpzYC5cbiAqXG4gKiBYWFg6IEl0J3MgbGFtZSB0aGF0IG5vZGUgZG9lc24ndCBleHBvc2UgdGhpcyBBUEkgb3V0LW9mLXRoZS1ib3guIEl0IGFsc29cbiAqIHJlbGllcyBvbiB0aGUgdW5kb2N1bWVudGVkIGB0dHlfd3JhcC5ndWVzc0hhbmRsZVR5cGUoKWAgd2hpY2ggaXMgYWxzbyBsYW1lLlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVdyaXRhYmxlU3RkaW9TdHJlYW0gKGZkKSB7XG4gIHZhciBzdHJlYW07XG4gIHZhciB0dHlfd3JhcCA9IHByb2Nlc3MuYmluZGluZygndHR5X3dyYXAnKTtcblxuICAvLyBOb3RlIHN0cmVhbS5fdHlwZSBpcyB1c2VkIGZvciB0ZXN0LW1vZHVsZS1sb2FkLWxpc3QuanNcblxuICBzd2l0Y2ggKHR0eV93cmFwLmd1ZXNzSGFuZGxlVHlwZShmZCkpIHtcbiAgICBjYXNlICdUVFknOlxuICAgICAgc3RyZWFtID0gbmV3IHR0eS5Xcml0ZVN0cmVhbShmZCk7XG4gICAgICBzdHJlYW0uX3R5cGUgPSAndHR5JztcblxuICAgICAgLy8gSGFjayB0byBoYXZlIHN0cmVhbSBub3Qga2VlcCB0aGUgZXZlbnQgbG9vcCBhbGl2ZS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzE3MjZcbiAgICAgIGlmIChzdHJlYW0uX2hhbmRsZSAmJiBzdHJlYW0uX2hhbmRsZS51bnJlZikge1xuICAgICAgICBzdHJlYW0uX2hhbmRsZS51bnJlZigpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdGSUxFJzpcbiAgICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gICAgICBzdHJlYW0gPSBuZXcgZnMuU3luY1dyaXRlU3RyZWFtKGZkLCB7IGF1dG9DbG9zZTogZmFsc2UgfSk7XG4gICAgICBzdHJlYW0uX3R5cGUgPSAnZnMnO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdQSVBFJzpcbiAgICBjYXNlICdUQ1AnOlxuICAgICAgdmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpO1xuICAgICAgc3RyZWFtID0gbmV3IG5ldC5Tb2NrZXQoe1xuICAgICAgICBmZDogZmQsXG4gICAgICAgIHJlYWRhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBGSVhNRSBTaG91bGQgcHJvYmFibHkgaGF2ZSBhbiBvcHRpb24gaW4gbmV0LlNvY2tldCB0byBjcmVhdGUgYVxuICAgICAgLy8gc3RyZWFtIGZyb20gYW4gZXhpc3RpbmcgZmQgd2hpY2ggaXMgd3JpdGFibGUgb25seS4gQnV0IGZvciBub3dcbiAgICAgIC8vIHdlJ2xsIGp1c3QgYWRkIHRoaXMgaGFjayBhbmQgc2V0IHRoZSBgcmVhZGFibGVgIG1lbWJlciB0byBmYWxzZS5cbiAgICAgIC8vIFRlc3Q6IC4vbm9kZSB0ZXN0L2ZpeHR1cmVzL2VjaG8uanMgPCAvZXRjL3Bhc3N3ZFxuICAgICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVhZCA9IG51bGw7XG4gICAgICBzdHJlYW0uX3R5cGUgPSAncGlwZSc7XG5cbiAgICAgIC8vIEZJWE1FIEhhY2sgdG8gaGF2ZSBzdHJlYW0gbm90IGtlZXAgdGhlIGV2ZW50IGxvb3AgYWxpdmUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzI2XG4gICAgICBpZiAoc3RyZWFtLl9oYW5kbGUgJiYgc3RyZWFtLl9oYW5kbGUudW5yZWYpIHtcbiAgICAgICAgc3RyZWFtLl9oYW5kbGUudW5yZWYoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFByb2JhYmx5IGFuIGVycm9yIG9uIGluIHV2X2d1ZXNzX2hhbmRsZSgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltcGxlbWVudCBtZS4gVW5rbm93biBzdHJlYW0gZmlsZSB0eXBlIScpO1xuICB9XG5cbiAgLy8gRm9yIHN1cHBvcnRpbmcgbGVnYWN5IEFQSSB3ZSBwdXQgdGhlIEZEIGhlcmUuXG4gIHN0cmVhbS5mZCA9IGZkO1xuXG4gIHN0cmVhbS5faXNTdGRpbyA9IHRydWU7XG5cbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuLyoqXG4gKiBJbml0IGxvZ2ljIGZvciBgZGVidWdgIGluc3RhbmNlcy5cbiAqXG4gKiBDcmVhdGUgYSBuZXcgYGluc3BlY3RPcHRzYCBvYmplY3QgaW4gY2FzZSBgdXNlQ29sb3JzYCBpcyBzZXRcbiAqIGRpZmZlcmVudGx5IGZvciBhIHBhcnRpY3VsYXIgYGRlYnVnYCBpbnN0YW5jZS5cbiAqL1xuXG5mdW5jdGlvbiBpbml0IChkZWJ1Zykge1xuICBkZWJ1Zy5pbnNwZWN0T3B0cyA9IHt9O1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXhwb3J0cy5pbnNwZWN0T3B0cyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGRlYnVnLmluc3BlY3RPcHRzW2tleXNbaV1dID0gZXhwb3J0cy5pbnNwZWN0T3B0c1trZXlzW2ldXTtcbiAgfVxufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgcHJvY2Vzcy5lbnYuREVCVUdgIGluaXRpYWxseS5cbiAqL1xuXG5leHBvcnRzLmVuYWJsZShsb2FkKCkpO1xuIiwgIi8qKlxuICogRGV0ZWN0IEVsZWN0cm9uIHJlbmRlcmVyIHByb2Nlc3MsIHdoaWNoIGlzIG5vZGUsIGJ1dCB3ZSBzaG91bGRcbiAqIHRyZWF0IGFzIGEgYnJvd3Nlci5cbiAqL1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYnJvd3Nlci5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUuanMnKTtcbn1cbiIsICIvKiFcbiAqIGVuY29kZXVybFxuICogQ29weXJpZ2h0KGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZW5jb2RlVXJsXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIG5vbi1VUkwgY29kZSBwb2ludHMsICphZnRlciogZW5jb2RpbmcgKGkuZS4gbm90IGluY2x1ZGluZyBcIiVcIilcbiAqIGFuZCBpbmNsdWRpbmcgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2VzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRU5DT0RFX0NIQVJTX1JFR0VYUCA9IC8oPzpbXlxceDIxXFx4MjVcXHgyNi1cXHgzQlxceDNEXFx4M0YtXFx4NUJcXHg1RFxceDVGXFx4NjEtXFx4N0FcXHg3RV18JSg/OlteMC05QS1GYS1mXXxbMC05QS1GYS1mXVteMC05QS1GYS1mXXwkKSkrL2dcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggdW5tYXRjaGVkIHN1cnJvZ2F0ZSBwYWlyLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgVU5NQVRDSEVEX1NVUlJPR0FURV9QQUlSX1JFR0VYUCA9IC8oXnxbXlxcdUQ4MDAtXFx1REJGRl0pW1xcdURDMDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oW15cXHVEQzAwLVxcdURGRkZdfCQpL2dcblxuLyoqXG4gKiBTdHJpbmcgdG8gcmVwbGFjZSB1bm1hdGNoZWQgc3Vycm9nYXRlIHBhaXIgd2l0aC5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFVOTUFUQ0hFRF9TVVJST0dBVEVfUEFJUl9SRVBMQUNFID0gJyQxXFx1RkZGRCQyJ1xuXG4vKipcbiAqIEVuY29kZSBhIFVSTCB0byBhIHBlcmNlbnQtZW5jb2RlZCBmb3JtLCBleGNsdWRpbmcgYWxyZWFkeS1lbmNvZGVkIHNlcXVlbmNlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSBhbiBhbHJlYWR5LWVuY29kZWQgVVJMIGFuZCBlbmNvZGUgYWxsIHRoZSBub24tVVJMXG4gKiBjb2RlIHBvaW50cy4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBlbmNvZGUgdGhlIFwiJVwiIGNoYXJhY3RlciB1bmxlc3MgaXQgaXNcbiAqIG5vdCBwYXJ0IG9mIGEgdmFsaWQgc2VxdWVuY2UgKGAlMjBgIHdpbGwgYmUgbGVmdCBhcy1pcywgYnV0IGAlZm9vYCB3aWxsXG4gKiBiZSBlbmNvZGVkIGFzIGAlMjVmb29gKS5cbiAqXG4gKiBUaGlzIGVuY29kZSBpcyBtZWFudCB0byBiZSBcInNhZmVcIiBhbmQgZG9lcyBub3QgdGhyb3cgZXJyb3JzLiBJdCB3aWxsIHRyeSBhc1xuICogaGFyZCBhcyBpdCBjYW4gdG8gcHJvcGVybHkgZW5jb2RlIHRoZSBnaXZlbiBVUkwsIGluY2x1ZGluZyByZXBsYWNpbmcgYW55IHJhdyxcbiAqIHVucGFpcmVkIHN1cnJvZ2F0ZSBwYWlycyB3aXRoIHRoZSBVbmljb2RlIHJlcGxhY2VtZW50IGNoYXJhY3RlciBwcmlvciB0b1xuICogZW5jb2RpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuY29kZVVybCAodXJsKSB7XG4gIHJldHVybiBTdHJpbmcodXJsKVxuICAgIC5yZXBsYWNlKFVOTUFUQ0hFRF9TVVJST0dBVEVfUEFJUl9SRUdFWFAsIFVOTUFUQ0hFRF9TVVJST0dBVEVfUEFJUl9SRVBMQUNFKVxuICAgIC5yZXBsYWNlKEVOQ09ERV9DSEFSU19SRUdFWFAsIGVuY29kZVVSSSlcbn1cbiIsICIvKiFcbiAqIGVzY2FwZS1odG1sXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBBbmRyZWFzIEx1YmJlXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBUaWFuY2hlbmcgXCJUaW1vdGh5XCIgR3VcbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgbWF0Y2hIdG1sUmVnRXhwID0gL1tcIicmPD5dLztcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVzY2FwZUh0bWw7XG5cbi8qKlxuICogRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGh0bWwuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUgZm9yIGluc2VydGluZyBpbnRvIEhUTUxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHN0cmluZykge1xuICB2YXIgc3RyID0gJycgKyBzdHJpbmc7XG4gIHZhciBtYXRjaCA9IG1hdGNoSHRtbFJlZ0V4cC5leGVjKHN0cik7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICB2YXIgZXNjYXBlO1xuICB2YXIgaHRtbCA9ICcnO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEluZGV4ID0gMDtcblxuICBmb3IgKGluZGV4ID0gbWF0Y2guaW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaW5kZXgpKSB7XG4gICAgICBjYXNlIDM0OiAvLyBcIlxuICAgICAgICBlc2NhcGUgPSAnJnF1b3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OiAvLyAmXG4gICAgICAgIGVzY2FwZSA9ICcmYW1wOyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOTogLy8gJ1xuICAgICAgICBlc2NhcGUgPSAnJiMzOTsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjA6IC8vIDxcbiAgICAgICAgZXNjYXBlID0gJyZsdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6IC8vID5cbiAgICAgICAgZXNjYXBlID0gJyZndDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChsYXN0SW5kZXggIT09IGluZGV4KSB7XG4gICAgICBodG1sICs9IHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCk7XG4gICAgfVxuXG4gICAgbGFzdEluZGV4ID0gaW5kZXggKyAxO1xuICAgIGh0bWwgKz0gZXNjYXBlO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gaW5kZXhcbiAgICA/IGh0bWwgKyBzdHIuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXgpXG4gICAgOiBodG1sO1xufVxuIiwgIi8qIVxuICogcGFyc2V1cmxcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG52YXIgcGFyc2UgPSB1cmwucGFyc2VcbnZhciBVcmwgPSB1cmwuVXJsXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZXVybFxubW9kdWxlLmV4cG9ydHMub3JpZ2luYWwgPSBvcmlnaW5hbHVybFxuXG4vKipcbiAqIFBhcnNlIHRoZSBgcmVxYCB1cmwgd2l0aCBtZW1vaXphdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1NlcnZlclJlcXVlc3R9IHJlcVxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHBhcnNldXJsIChyZXEpIHtcbiAgdmFyIHVybCA9IHJlcS51cmxcblxuICBpZiAodXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBVUkwgaXMgdW5kZWZpbmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgdmFyIHBhcnNlZCA9IHJlcS5fcGFyc2VkVXJsXG5cbiAgaWYgKGZyZXNoKHVybCwgcGFyc2VkKSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgVVJMIHBhcnNlXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9XG5cbiAgLy8gUGFyc2UgdGhlIFVSTFxuICBwYXJzZWQgPSBmYXN0cGFyc2UodXJsKVxuICBwYXJzZWQuX3JhdyA9IHVybFxuXG4gIHJldHVybiAocmVxLl9wYXJzZWRVcmwgPSBwYXJzZWQpXG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBgcmVxYCBvcmlnaW5hbCB1cmwgd2l0aCBmYWxsYmFjayBhbmQgbWVtb2l6YXRpb24uXG4gKlxuICogQHBhcmFtIHtTZXJ2ZXJSZXF1ZXN0fSByZXFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBvcmlnaW5hbHVybCAocmVxKSB7XG4gIHZhciB1cmwgPSByZXEub3JpZ2luYWxVcmxcblxuICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBGYWxsYmFja1xuICAgIHJldHVybiBwYXJzZXVybChyZXEpXG4gIH1cblxuICB2YXIgcGFyc2VkID0gcmVxLl9wYXJzZWRPcmlnaW5hbFVybFxuXG4gIGlmIChmcmVzaCh1cmwsIHBhcnNlZCkpIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIFVSTCBwYXJzZVxuICAgIHJldHVybiBwYXJzZWRcbiAgfVxuXG4gIC8vIFBhcnNlIHRoZSBVUkxcbiAgcGFyc2VkID0gZmFzdHBhcnNlKHVybClcbiAgcGFyc2VkLl9yYXcgPSB1cmxcblxuICByZXR1cm4gKHJlcS5fcGFyc2VkT3JpZ2luYWxVcmwgPSBwYXJzZWQpXG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBgc3RyYCB1cmwgd2l0aCBmYXN0LXBhdGggc2hvcnQtY3V0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZmFzdHBhcnNlIChzdHIpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnIHx8IHN0ci5jaGFyQ29kZUF0KDApICE9PSAweDJmIC8qIC8gKi8pIHtcbiAgICByZXR1cm4gcGFyc2Uoc3RyKVxuICB9XG5cbiAgdmFyIHBhdGhuYW1lID0gc3RyXG4gIHZhciBxdWVyeSA9IG51bGxcbiAgdmFyIHNlYXJjaCA9IG51bGxcblxuICAvLyBUaGlzIHRha2VzIHRoZSByZWdleHAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvcHVsbC83ODc4XG4gIC8vIFdoaWNoIGlzIC9eKFxcL1tePyNcXHNdKikoXFw/W14jXFxzXSopPyQvXG4gIC8vIEFuZCB1bnJvbGxzIGl0IGludG8gYSBmb3IgbG9vcFxuICBmb3IgKHZhciBpID0gMTsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaSkpIHtcbiAgICAgIGNhc2UgMHgzZjogLyogPyAgKi9cbiAgICAgICAgaWYgKHNlYXJjaCA9PT0gbnVsbCkge1xuICAgICAgICAgIHBhdGhuYW1lID0gc3RyLnN1YnN0cmluZygwLCBpKVxuICAgICAgICAgIHF1ZXJ5ID0gc3RyLnN1YnN0cmluZyhpICsgMSlcbiAgICAgICAgICBzZWFyY2ggPSBzdHIuc3Vic3RyaW5nKGkpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMHgwOTogLyogXFx0ICovXG4gICAgICBjYXNlIDB4MGE6IC8qIFxcbiAqL1xuICAgICAgY2FzZSAweDBjOiAvKiBcXGYgKi9cbiAgICAgIGNhc2UgMHgwZDogLyogXFxyICovXG4gICAgICBjYXNlIDB4MjA6IC8qICAgICovXG4gICAgICBjYXNlIDB4MjM6IC8qICMgICovXG4gICAgICBjYXNlIDB4YTA6XG4gICAgICBjYXNlIDB4ZmVmZjpcbiAgICAgICAgcmV0dXJuIHBhcnNlKHN0cilcbiAgICB9XG4gIH1cblxuICB2YXIgdXJsID0gVXJsICE9PSB1bmRlZmluZWRcbiAgICA/IG5ldyBVcmwoKVxuICAgIDoge31cblxuICB1cmwucGF0aCA9IHN0clxuICB1cmwuaHJlZiA9IHN0clxuICB1cmwucGF0aG5hbWUgPSBwYXRobmFtZVxuXG4gIGlmIChzZWFyY2ggIT09IG51bGwpIHtcbiAgICB1cmwucXVlcnkgPSBxdWVyeVxuICAgIHVybC5zZWFyY2ggPSBzZWFyY2hcbiAgfVxuXG4gIHJldHVybiB1cmxcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgcGFyc2VkIGlzIHN0aWxsIGZyZXNoIGZvciB1cmwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICogQHBhcmFtIHtvYmplY3R9IHBhcnNlZFVybFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZnJlc2ggKHVybCwgcGFyc2VkVXJsKSB7XG4gIHJldHVybiB0eXBlb2YgcGFyc2VkVXJsID09PSAnb2JqZWN0JyAmJlxuICAgIHBhcnNlZFVybCAhPT0gbnVsbCAmJlxuICAgIChVcmwgPT09IHVuZGVmaW5lZCB8fCBwYXJzZWRVcmwgaW5zdGFuY2VvZiBVcmwpICYmXG4gICAgcGFyc2VkVXJsLl9yYXcgPT09IHVybFxufVxuIiwgIi8qIVxuICogZmluYWxoYW5kbGVyXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDIyIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdmaW5hbGhhbmRsZXInKVxudmFyIGVuY29kZVVybCA9IHJlcXVpcmUoJ2VuY29kZXVybCcpXG52YXIgZXNjYXBlSHRtbCA9IHJlcXVpcmUoJ2VzY2FwZS1odG1sJylcbnZhciBvbkZpbmlzaGVkID0gcmVxdWlyZSgnb24tZmluaXNoZWQnKVxudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgncGFyc2V1cmwnKVxudmFyIHN0YXR1c2VzID0gcmVxdWlyZSgnc3RhdHVzZXMnKVxudmFyIHVucGlwZSA9IHJlcXVpcmUoJ3VucGlwZScpXG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIERPVUJMRV9TUEFDRV9SRUdFWFAgPSAvXFx4MjB7Mn0vZ1xudmFyIE5FV0xJTkVfUkVHRVhQID0gL1xcbi9nXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgZGVmZXIgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nXG4gID8gc2V0SW1tZWRpYXRlXG4gIDogZnVuY3Rpb24gKGZuKSB7IHByb2Nlc3MubmV4dFRpY2soZm4uYmluZC5hcHBseShmbiwgYXJndW1lbnRzKSkgfVxudmFyIGlzRmluaXNoZWQgPSBvbkZpbmlzaGVkLmlzRmluaXNoZWRcblxuLyoqXG4gKiBDcmVhdGUgYSBtaW5pbWFsIEhUTUwgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlSHRtbERvY3VtZW50IChtZXNzYWdlKSB7XG4gIHZhciBib2R5ID0gZXNjYXBlSHRtbChtZXNzYWdlKVxuICAgIC5yZXBsYWNlKE5FV0xJTkVfUkVHRVhQLCAnPGJyPicpXG4gICAgLnJlcGxhY2UoRE9VQkxFX1NQQUNFX1JFR0VYUCwgJyAmbmJzcDsnKVxuXG4gIHJldHVybiAnPCFET0NUWVBFIGh0bWw+XFxuJyArXG4gICAgJzxodG1sIGxhbmc9XCJlblwiPlxcbicgK1xuICAgICc8aGVhZD5cXG4nICtcbiAgICAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XFxuJyArXG4gICAgJzx0aXRsZT5FcnJvcjwvdGl0bGU+XFxuJyArXG4gICAgJzwvaGVhZD5cXG4nICtcbiAgICAnPGJvZHk+XFxuJyArXG4gICAgJzxwcmU+JyArIGJvZHkgKyAnPC9wcmU+XFxuJyArXG4gICAgJzwvYm9keT5cXG4nICtcbiAgICAnPC9odG1sPlxcbidcbn1cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmFsaGFuZGxlclxuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgZmluYWwgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtSZXF1ZXN0fSByZXFcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZmluYWxoYW5kbGVyIChyZXEsIHJlcywgb3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge31cblxuICAvLyBnZXQgZW52aXJvbm1lbnRcbiAgdmFyIGVudiA9IG9wdHMuZW52IHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcblxuICAvLyBnZXQgZXJyb3IgY2FsbGJhY2tcbiAgdmFyIG9uZXJyb3IgPSBvcHRzLm9uZXJyb3JcblxuICByZXR1cm4gZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBoZWFkZXJzXG4gICAgdmFyIG1zZ1xuICAgIHZhciBzdGF0dXNcblxuICAgIC8vIGlnbm9yZSA0MDQgb24gaW4tZmxpZ2h0IHJlc3BvbnNlXG4gICAgaWYgKCFlcnIgJiYgaGVhZGVyc1NlbnQocmVzKSkge1xuICAgICAgZGVidWcoJ2Nhbm5vdCA0MDQgYWZ0ZXIgaGVhZGVycyBzZW50JylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHVuaGFuZGxlZCBlcnJvclxuICAgIGlmIChlcnIpIHtcbiAgICAgIC8vIHJlc3BlY3Qgc3RhdHVzIGNvZGUgZnJvbSBlcnJvclxuICAgICAgc3RhdHVzID0gZ2V0RXJyb3JTdGF0dXNDb2RlKGVycilcblxuICAgICAgaWYgKHN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIHRvIHN0YXR1cyBjb2RlIG9uIHJlc3BvbnNlXG4gICAgICAgIHN0YXR1cyA9IGdldFJlc3BvbnNlU3RhdHVzQ29kZShyZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZXNwZWN0IGhlYWRlcnMgZnJvbSBlcnJvclxuICAgICAgICBoZWFkZXJzID0gZ2V0RXJyb3JIZWFkZXJzKGVycilcbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IGVycm9yIG1lc3NhZ2VcbiAgICAgIG1zZyA9IGdldEVycm9yTWVzc2FnZShlcnIsIHN0YXR1cywgZW52KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub3QgZm91bmRcbiAgICAgIHN0YXR1cyA9IDQwNFxuICAgICAgbXNnID0gJ0Nhbm5vdCAnICsgcmVxLm1ldGhvZCArICcgJyArIGVuY29kZVVybChnZXRSZXNvdXJjZU5hbWUocmVxKSlcbiAgICB9XG5cbiAgICBkZWJ1ZygnZGVmYXVsdCAlcycsIHN0YXR1cylcblxuICAgIC8vIHNjaGVkdWxlIG9uZXJyb3IgY2FsbGJhY2tcbiAgICBpZiAoZXJyICYmIG9uZXJyb3IpIHtcbiAgICAgIGRlZmVyKG9uZXJyb3IsIGVyciwgcmVxLCByZXMpXG4gICAgfVxuXG4gICAgLy8gY2Fubm90IGFjdHVhbGx5IHJlc3BvbmRcbiAgICBpZiAoaGVhZGVyc1NlbnQocmVzKSkge1xuICAgICAgZGVidWcoJ2Nhbm5vdCAlZCBhZnRlciBoZWFkZXJzIHNlbnQnLCBzdGF0dXMpXG4gICAgICByZXEuc29ja2V0LmRlc3Ryb3koKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gc2VuZCByZXNwb25zZVxuICAgIHNlbmQocmVxLCByZXMsIHN0YXR1cywgaGVhZGVycywgbXNnKVxuICB9XG59XG5cbi8qKlxuICogR2V0IGhlYWRlcnMgZnJvbSBFcnJvciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEVycm9ySGVhZGVycyAoZXJyKSB7XG4gIGlmICghZXJyLmhlYWRlcnMgfHwgdHlwZW9mIGVyci5oZWFkZXJzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHZhciBoZWFkZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGVyci5oZWFkZXJzKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldXG4gICAgaGVhZGVyc1trZXldID0gZXJyLmhlYWRlcnNba2V5XVxuICB9XG5cbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuLyoqXG4gKiBHZXQgbWVzc2FnZSBmcm9tIEVycm9yIG9iamVjdCwgZmFsbGJhY2sgdG8gc3RhdHVzIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gKiBAcGFyYW0ge3N0cmluZ30gZW52XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZSAoZXJyLCBzdGF0dXMsIGVudikge1xuICB2YXIgbXNnXG5cbiAgaWYgKGVudiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gdXNlIGVyci5zdGFjaywgd2hpY2ggdHlwaWNhbGx5IGluY2x1ZGVzIGVyci5tZXNzYWdlXG4gICAgbXNnID0gZXJyLnN0YWNrXG5cbiAgICAvLyBmYWxsYmFjayB0byBlcnIudG9TdHJpbmcoKSB3aGVuIHBvc3NpYmxlXG4gICAgaWYgKCFtc2cgJiYgdHlwZW9mIGVyci50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbXNnID0gZXJyLnRvU3RyaW5nKClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbXNnIHx8IHN0YXR1c2VzLm1lc3NhZ2Vbc3RhdHVzXVxufVxuXG4vKipcbiAqIEdldCBzdGF0dXMgY29kZSBmcm9tIEVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXJyb3JTdGF0dXNDb2RlIChlcnIpIHtcbiAgLy8gY2hlY2sgZXJyLnN0YXR1c1xuICBpZiAodHlwZW9mIGVyci5zdGF0dXMgPT09ICdudW1iZXInICYmIGVyci5zdGF0dXMgPj0gNDAwICYmIGVyci5zdGF0dXMgPCA2MDApIHtcbiAgICByZXR1cm4gZXJyLnN0YXR1c1xuICB9XG5cbiAgLy8gY2hlY2sgZXJyLnN0YXR1c0NvZGVcbiAgaWYgKHR5cGVvZiBlcnIuc3RhdHVzQ29kZSA9PT0gJ251bWJlcicgJiYgZXJyLnN0YXR1c0NvZGUgPj0gNDAwICYmIGVyci5zdGF0dXNDb2RlIDwgNjAwKSB7XG4gICAgcmV0dXJuIGVyci5zdGF0dXNDb2RlXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogR2V0IHJlc291cmNlIG5hbWUgZm9yIHRoZSByZXF1ZXN0LlxuICpcbiAqIFRoaXMgaXMgdHlwaWNhbGx5IGp1c3QgdGhlIG9yaWdpbmFsIHBhdGhuYW1lIG9mIHRoZSByZXF1ZXN0XG4gKiBidXQgd2lsbCBmYWxsYmFjayB0byBcInJlc291cmNlXCIgaXMgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqXG4gKiBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gcmVxXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldFJlc291cmNlTmFtZSAocmVxKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlVXJsLm9yaWdpbmFsKHJlcSkucGF0aG5hbWVcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiAncmVzb3VyY2UnXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgc3RhdHVzIGNvZGUgZnJvbSByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge091dGdvaW5nTWVzc2FnZX0gcmVzXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldFJlc3BvbnNlU3RhdHVzQ29kZSAocmVzKSB7XG4gIHZhciBzdGF0dXMgPSByZXMuc3RhdHVzQ29kZVxuXG4gIC8vIGRlZmF1bHQgc3RhdHVzIGNvZGUgdG8gNTAwIGlmIG91dHNpZGUgdmFsaWQgcmFuZ2VcbiAgaWYgKHR5cGVvZiBzdGF0dXMgIT09ICdudW1iZXInIHx8IHN0YXR1cyA8IDQwMCB8fCBzdGF0dXMgPiA1OTkpIHtcbiAgICBzdGF0dXMgPSA1MDBcbiAgfVxuXG4gIHJldHVybiBzdGF0dXNcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHJlc3BvbnNlIGhlYWRlcnMgaGF2ZSBiZWVuIHNlbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGhlYWRlcnNTZW50IChyZXMpIHtcbiAgcmV0dXJuIHR5cGVvZiByZXMuaGVhZGVyc1NlbnQgIT09ICdib29sZWFuJ1xuICAgID8gQm9vbGVhbihyZXMuX2hlYWRlcilcbiAgICA6IHJlcy5oZWFkZXJzU2VudFxufVxuXG4vKipcbiAqIFNlbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IHJlcVxuICogQHBhcmFtIHtPdXRnb2luZ01lc3NhZ2V9IHJlc1xuICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICogQHBhcmFtIHtvYmplY3R9IGhlYWRlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNlbmQgKHJlcSwgcmVzLCBzdGF0dXMsIGhlYWRlcnMsIG1lc3NhZ2UpIHtcbiAgZnVuY3Rpb24gd3JpdGUgKCkge1xuICAgIC8vIHJlc3BvbnNlIGJvZHlcbiAgICB2YXIgYm9keSA9IGNyZWF0ZUh0bWxEb2N1bWVudChtZXNzYWdlKVxuXG4gICAgLy8gcmVzcG9uc2Ugc3RhdHVzXG4gICAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNcbiAgICByZXMuc3RhdHVzTWVzc2FnZSA9IHN0YXR1c2VzLm1lc3NhZ2Vbc3RhdHVzXVxuXG4gICAgLy8gcmVtb3ZlIGFueSBjb250ZW50IGhlYWRlcnNcbiAgICByZXMucmVtb3ZlSGVhZGVyKCdDb250ZW50LUVuY29kaW5nJylcbiAgICByZXMucmVtb3ZlSGVhZGVyKCdDb250ZW50LUxhbmd1YWdlJylcbiAgICByZXMucmVtb3ZlSGVhZGVyKCdDb250ZW50LVJhbmdlJylcblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnNcbiAgICBzZXRIZWFkZXJzKHJlcywgaGVhZGVycylcblxuICAgIC8vIHNlY3VyaXR5IGhlYWRlcnNcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsIFwiZGVmYXVsdC1zcmMgJ25vbmUnXCIpXG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJylcblxuICAgIC8vIHN0YW5kYXJkIGhlYWRlcnNcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JylcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHksICd1dGY4JykpXG5cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICByZXMuZW5kKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcy5lbmQoYm9keSwgJ3V0ZjgnKVxuICB9XG5cbiAgaWYgKGlzRmluaXNoZWQocmVxKSkge1xuICAgIHdyaXRlKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIHVucGlwZSBldmVyeXRoaW5nIGZyb20gdGhlIHJlcXVlc3RcbiAgdW5waXBlKHJlcSlcblxuICAvLyBmbHVzaCB0aGUgcmVxdWVzdFxuICBvbkZpbmlzaGVkKHJlcSwgd3JpdGUpXG4gIHJlcS5yZXN1bWUoKVxufVxuXG4vKipcbiAqIFNldCByZXNwb25zZSBoZWFkZXJzIGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T3V0Z29pbmdNZXNzYWdlfSByZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNldEhlYWRlcnMgKHJlcywgaGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycylcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV1cbiAgICByZXMuc2V0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKVxuICB9XG59XG4iLCAiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKCg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgaWYgKG1zID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtcyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHJldHVybiBwbHVyYWwobXMsIGQsICdkYXknKSB8fFxuICAgIHBsdXJhbChtcywgaCwgJ2hvdXInKSB8fFxuICAgIHBsdXJhbChtcywgbSwgJ21pbnV0ZScpIHx8XG4gICAgcGx1cmFsKG1zLCBzLCAnc2Vjb25kJykgfHxcbiAgICBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbiwgbmFtZSkge1xuICBpZiAobXMgPCBuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChtcyA8IG4gKiAxLjUpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihtcyAvIG4pICsgJyAnICsgbmFtZTtcbiAgfVxuICByZXR1cm4gTWF0aC5jZWlsKG1zIC8gbikgKyAnICcgKyBuYW1lICsgJ3MnO1xufVxuIiwgIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnWydkZWZhdWx0J10gPSBjcmVhdGVEZWJ1ZztcbmV4cG9ydHMuY29lcmNlID0gY29lcmNlO1xuZXhwb3J0cy5kaXNhYmxlID0gZGlzYWJsZTtcbmV4cG9ydHMuZW5hYmxlID0gZW5hYmxlO1xuZXhwb3J0cy5lbmFibGVkID0gZW5hYmxlZDtcbmV4cG9ydHMuaHVtYW5pemUgPSByZXF1aXJlKCdtcycpO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuICovXG5cbmV4cG9ydHMubmFtZXMgPSBbXTtcbmV4cG9ydHMuc2tpcHMgPSBbXTtcblxuLyoqXG4gKiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG4gKlxuICogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycyA9IHt9O1xuXG4vKipcbiAqIFByZXZpb3VzIGxvZyB0aW1lc3RhbXAuXG4gKi9cblxudmFyIHByZXZUaW1lO1xuXG4vKipcbiAqIFNlbGVjdCBhIGNvbG9yLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG4gIHZhciBoYXNoID0gMCwgaTtcblxuICBmb3IgKGkgaW4gbmFtZXNwYWNlKSB7XG4gICAgaGFzaCAgPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBleHBvcnRzLmNvbG9ycy5sZW5ndGhdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblxuICBmdW5jdGlvbiBkZWJ1ZygpIHtcbiAgICAvLyBkaXNhYmxlZD9cbiAgICBpZiAoIWRlYnVnLmVuYWJsZWQpIHJldHVybjtcblxuICAgIHZhciBzZWxmID0gZGVidWc7XG5cbiAgICAvLyBzZXQgYGRpZmZgIHRpbWVzdGFtcFxuICAgIHZhciBjdXJyID0gK25ldyBEYXRlKCk7XG4gICAgdmFyIG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcbiAgICBzZWxmLmRpZmYgPSBtcztcbiAgICBzZWxmLnByZXYgPSBwcmV2VGltZTtcbiAgICBzZWxmLmN1cnIgPSBjdXJyO1xuICAgIHByZXZUaW1lID0gY3VycjtcblxuICAgIC8vIHR1cm4gdGhlIGBhcmd1bWVudHNgIGludG8gYSBwcm9wZXIgQXJyYXlcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgYXJnc1swXSA9IGV4cG9ydHMuY29lcmNlKGFyZ3NbMF0pO1xuXG4gICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgYXJnc1swXSkge1xuICAgICAgLy8gYW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cbiAgICAgIGFyZ3MudW5zaGlmdCgnJU8nKTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgYXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIGZ1bmN0aW9uKG1hdGNoLCBmb3JtYXQpIHtcbiAgICAgIC8vIGlmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcbiAgICAgIGlmIChtYXRjaCA9PT0gJyUlJykgcmV0dXJuIG1hdGNoO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHZhciBmb3JtYXR0ZXIgPSBleHBvcnRzLmZvcm1hdHRlcnNbZm9ybWF0XTtcbiAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZm9ybWF0dGVyKSB7XG4gICAgICAgIHZhciB2YWwgPSBhcmdzW2luZGV4XTtcbiAgICAgICAgbWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG4gICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcbiAgICAgICAgYXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpbmRleC0tO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuXG4gICAgLy8gYXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcbiAgICBleHBvcnRzLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuICAgIHZhciBsb2dGbiA9IGRlYnVnLmxvZyB8fCBleHBvcnRzLmxvZyB8fCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuICAgIGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICB9XG5cbiAgZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICBkZWJ1Zy5lbmFibGVkID0gZXhwb3J0cy5lbmFibGVkKG5hbWVzcGFjZSk7XG4gIGRlYnVnLnVzZUNvbG9ycyA9IGV4cG9ydHMudXNlQ29sb3JzKCk7XG4gIGRlYnVnLmNvbG9yID0gc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblxuICAvLyBlbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGV4cG9ydHMuaW5pdCkge1xuICAgIGV4cG9ydHMuaW5pdChkZWJ1Zyk7XG4gIH1cblxuICByZXR1cm4gZGVidWc7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuICogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuICBleHBvcnRzLnNhdmUobmFtZXNwYWNlcyk7XG5cbiAgZXhwb3J0cy5uYW1lcyA9IFtdO1xuICBleHBvcnRzLnNraXBzID0gW107XG5cbiAgdmFyIHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcbiAgdmFyIGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKCFzcGxpdFtpXSkgY29udGludWU7IC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG4gICAgbmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG4gICAgaWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuICAgICAgZXhwb3J0cy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0cy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgZXhwb3J0cy5lbmFibGUoJycpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG4gIHZhciBpLCBsZW47XG4gIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZXhwb3J0cy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZXhwb3J0cy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvZXJjZSBgdmFsYC5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWxcbiAqIEByZXR1cm4ge01peGVkfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG4gIHJldHVybiB2YWw7XG59XG4iLCAiLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGVidWcnKTtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lXG4gICAgICAgICAgICAgICAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lLnN0b3JhZ2VcbiAgICAgICAgICAgICAgICAgID8gY2hyb21lLnN0b3JhZ2UubG9jYWxcbiAgICAgICAgICAgICAgICAgIDogbG9jYWxzdG9yYWdlKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuICAnbGlnaHRzZWFncmVlbicsXG4gICdmb3Jlc3RncmVlbicsXG4gICdnb2xkZW5yb2QnLFxuICAnZG9kZ2VyYmx1ZScsXG4gICdkYXJrb3JjaGlkJyxcbiAgJ2NyaW1zb24nXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgLy8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuICAvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuICAvLyBleHBsaWNpdGx5XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBpcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuICAvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuICByZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcbiAgICAvLyBpcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG4gICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcbiAgICAvLyBpcyBmaXJlZm94ID49IHYzMT9cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcbiAgICAvLyBkb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbih2KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyLm1lc3NhZ2U7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcbiAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG4gIGFyZ3NbMF0gPSAodXNlQ29sb3JzID8gJyVjJyA6ICcnKVxuICAgICsgdGhpcy5uYW1lc3BhY2VcbiAgICArICh1c2VDb2xvcnMgPyAnICVjJyA6ICcgJylcbiAgICArIGFyZ3NbMF1cbiAgICArICh1c2VDb2xvcnMgPyAnJWMgJyA6ICcgJylcbiAgICArICcrJyArIGV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuICBpZiAoIXVzZUNvbG9ycykgcmV0dXJuO1xuXG4gIHZhciBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcbiAgYXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0JylcblxuICAvLyB0aGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuICAvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG4gIC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEMgPSAwO1xuICBhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICBpZiAoJyUlJyA9PT0gbWF0Y2gpIHJldHVybjtcbiAgICBpbmRleCsrO1xuICAgIGlmICgnJWMnID09PSBtYXRjaCkge1xuICAgICAgLy8gd2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG4gICAgICAvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuICAgICAgbGFzdEMgPSBpbmRleDtcbiAgICB9XG4gIH0pO1xuXG4gIGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmxvZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUubG9nYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBsb2coKSB7XG4gIC8vIHRoaXMgaGFja2VyeSBpcyByZXF1aXJlZCBmb3IgSUU4LzksIHdoZXJlXG4gIC8vIHRoZSBgY29uc29sZS5sb2dgIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSAnYXBwbHknXG4gIHJldHVybiAnb2JqZWN0JyA9PT0gdHlwZW9mIGNvbnNvbGVcbiAgICAmJiBjb25zb2xlLmxvZ1xuICAgICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGUubG9nLCBjb25zb2xlLCBhcmd1bWVudHMpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcbiAgdHJ5IHtcbiAgICBpZiAobnVsbCA9PSBuYW1lc3BhY2VzKSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLmRlYnVnID0gbmFtZXNwYWNlcztcbiAgICB9XG4gIH0gY2F0Y2goZSkge31cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuICB2YXIgcjtcbiAgdHJ5IHtcbiAgICByID0gZXhwb3J0cy5zdG9yYWdlLmRlYnVnO1xuICB9IGNhdGNoKGUpIHt9XG5cbiAgLy8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuICBpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcbiAgICByID0gcHJvY2Vzcy5lbnYuREVCVUc7XG4gIH1cblxuICByZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBFbmFibGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gYGxvY2FsU3RvcmFnZS5kZWJ1Z2AgaW5pdGlhbGx5LlxuICovXG5cbmV4cG9ydHMuZW5hYmxlKGxvYWQoKSk7XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICB9IGNhdGNoIChlKSB7fVxufVxuIiwgIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kZWJ1ZycpO1xuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gWzYsIDIsIDMsIDQsIDUsIDFdO1xuXG4vKipcbiAqIEJ1aWxkIHVwIHRoZSBkZWZhdWx0IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiAgICQgREVCVUdfQ09MT1JTPW5vIERFQlVHX0RFUFRIPTEwIERFQlVHX1NIT1dfSElEREVOPWVuYWJsZWQgbm9kZSBzY3JpcHQuanNcbiAqL1xuXG5leHBvcnRzLmluc3BlY3RPcHRzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAvXmRlYnVnXy9pLnRlc3Qoa2V5KTtcbn0pLnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgLy8gY2FtZWwtY2FzZVxuICB2YXIgcHJvcCA9IGtleVxuICAgIC5zdWJzdHJpbmcoNilcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9fKFthLXpdKS9nLCBmdW5jdGlvbiAoXywgaykgeyByZXR1cm4gay50b1VwcGVyQ2FzZSgpIH0pO1xuXG4gIC8vIGNvZXJjZSBzdHJpbmcgdmFsdWUgaW50byBKUyB2YWx1ZVxuICB2YXIgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcbiAgaWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkgdmFsID0gdHJ1ZTtcbiAgZWxzZSBpZiAoL14obm98b2ZmfGZhbHNlfGRpc2FibGVkKSQvaS50ZXN0KHZhbCkpIHZhbCA9IGZhbHNlO1xuICBlbHNlIGlmICh2YWwgPT09ICdudWxsJykgdmFsID0gbnVsbDtcbiAgZWxzZSB2YWwgPSBOdW1iZXIodmFsKTtcblxuICBvYmpbcHJvcF0gPSB2YWw7XG4gIHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8qKlxuICogVGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSB0aGUgYGRlYnVnKClgIGNhbGxzIHRvLlxuICogU2V0IHRoZSBgREVCVUdfRkRgIGVudiB2YXJpYWJsZSB0byBvdmVycmlkZSB3aXRoIGFub3RoZXIgdmFsdWUuIGkuZS46XG4gKlxuICogICAkIERFQlVHX0ZEPTMgbm9kZSBzY3JpcHQuanMgMz5kZWJ1Zy5sb2dcbiAqL1xuXG52YXIgZmQgPSBwYXJzZUludChwcm9jZXNzLmVudi5ERUJVR19GRCwgMTApIHx8IDI7XG5cbmlmICgxICE9PSBmZCAmJiAyICE9PSBmZCkge1xuICB1dGlsLmRlcHJlY2F0ZShmdW5jdGlvbigpe30sICdleGNlcHQgZm9yIHN0ZGVycigyKSBhbmQgc3Rkb3V0KDEpLCBhbnkgb3RoZXIgdXNhZ2Ugb2YgREVCVUdfRkQgaXMgZGVwcmVjYXRlZC4gT3ZlcnJpZGUgZGVidWcubG9nIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBsb2cgZnVuY3Rpb24gKGh0dHBzOi8vZ2l0LmlvL2RlYnVnX2ZkKScpKClcbn1cblxudmFyIHN0cmVhbSA9IDEgPT09IGZkID8gcHJvY2Vzcy5zdGRvdXQgOlxuICAgICAgICAgICAgIDIgPT09IGZkID8gcHJvY2Vzcy5zdGRlcnIgOlxuICAgICAgICAgICAgIGNyZWF0ZVdyaXRhYmxlU3RkaW9TdHJlYW0oZmQpO1xuXG4vKipcbiAqIElzIHN0ZG91dCBhIFRUWT8gQ29sb3JlZCBvdXRwdXQgaXMgZW5hYmxlZCB3aGVuIGB0cnVlYC5cbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG4gIHJldHVybiAnY29sb3JzJyBpbiBleHBvcnRzLmluc3BlY3RPcHRzXG4gICAgPyBCb29sZWFuKGV4cG9ydHMuaW5zcGVjdE9wdHMuY29sb3JzKVxuICAgIDogdHR5LmlzYXR0eShmZCk7XG59XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbCBvbiBhIHNpbmdsZSBsaW5lLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5vID0gZnVuY3Rpb24odikge1xuICB0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuICByZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG4gICAgLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24oc3RyKSB7XG4gICAgICByZXR1cm4gc3RyLnRyaW0oKVxuICAgIH0pLmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuTyA9IGZ1bmN0aW9uKHYpIHtcbiAgdGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcbiAgcmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKTtcbn07XG5cbi8qKlxuICogQWRkcyBBTlNJIGNvbG9yIGVzY2FwZSBjb2RlcyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG4gIHZhciBuYW1lID0gdGhpcy5uYW1lc3BhY2U7XG4gIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuICBpZiAodXNlQ29sb3JzKSB7XG4gICAgdmFyIGMgPSB0aGlzLmNvbG9yO1xuICAgIHZhciBwcmVmaXggPSAnICBcXHUwMDFiWzMnICsgYyArICc7MW0nICsgbmFtZSArICcgJyArICdcXHUwMDFiWzBtJztcblxuICAgIGFyZ3NbMF0gPSBwcmVmaXggKyBhcmdzWzBdLnNwbGl0KCdcXG4nKS5qb2luKCdcXG4nICsgcHJlZml4KTtcbiAgICBhcmdzLnB1c2goJ1xcdTAwMWJbMycgKyBjICsgJ20rJyArIGV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSArICdcXHUwMDFiWzBtJyk7XG4gIH0gZWxzZSB7XG4gICAgYXJnc1swXSA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxuICAgICAgKyAnICcgKyBuYW1lICsgJyAnICsgYXJnc1swXTtcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgYHV0aWwuZm9ybWF0KClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBgc3RyZWFtYC5cbiAqL1xuXG5mdW5jdGlvbiBsb2coKSB7XG4gIHJldHVybiBzdHJlYW0ud3JpdGUodXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG4gIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAvLyBJZiB5b3Ugc2V0IGEgcHJvY2Vzcy5lbnYgZmllbGQgdG8gbnVsbCBvciB1bmRlZmluZWQsIGl0IGdldHMgY2FzdCB0byB0aGVcbiAgICAvLyBzdHJpbmcgJ251bGwnIG9yICd1bmRlZmluZWQnLiBKdXN0IGRlbGV0ZSBpbnN0ZWFkLlxuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmVudi5ERUJVRyA9IG5hbWVzcGFjZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuREVCVUc7XG59XG5cbi8qKlxuICogQ29waWVkIGZyb20gYG5vZGUvc3JjL25vZGUuanNgLlxuICpcbiAqIFhYWDogSXQncyBsYW1lIHRoYXQgbm9kZSBkb2Vzbid0IGV4cG9zZSB0aGlzIEFQSSBvdXQtb2YtdGhlLWJveC4gSXQgYWxzb1xuICogcmVsaWVzIG9uIHRoZSB1bmRvY3VtZW50ZWQgYHR0eV93cmFwLmd1ZXNzSGFuZGxlVHlwZSgpYCB3aGljaCBpcyBhbHNvIGxhbWUuXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlV3JpdGFibGVTdGRpb1N0cmVhbSAoZmQpIHtcbiAgdmFyIHN0cmVhbTtcbiAgdmFyIHR0eV93cmFwID0gcHJvY2Vzcy5iaW5kaW5nKCd0dHlfd3JhcCcpO1xuXG4gIC8vIE5vdGUgc3RyZWFtLl90eXBlIGlzIHVzZWQgZm9yIHRlc3QtbW9kdWxlLWxvYWQtbGlzdC5qc1xuXG4gIHN3aXRjaCAodHR5X3dyYXAuZ3Vlc3NIYW5kbGVUeXBlKGZkKSkge1xuICAgIGNhc2UgJ1RUWSc6XG4gICAgICBzdHJlYW0gPSBuZXcgdHR5LldyaXRlU3RyZWFtKGZkKTtcbiAgICAgIHN0cmVhbS5fdHlwZSA9ICd0dHknO1xuXG4gICAgICAvLyBIYWNrIHRvIGhhdmUgc3RyZWFtIG5vdCBrZWVwIHRoZSBldmVudCBsb29wIGFsaXZlLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcyNlxuICAgICAgaWYgKHN0cmVhbS5faGFuZGxlICYmIHN0cmVhbS5faGFuZGxlLnVucmVmKSB7XG4gICAgICAgIHN0cmVhbS5faGFuZGxlLnVucmVmKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ0ZJTEUnOlxuICAgICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgICAgIHN0cmVhbSA9IG5ldyBmcy5TeW5jV3JpdGVTdHJlYW0oZmQsIHsgYXV0b0Nsb3NlOiBmYWxzZSB9KTtcbiAgICAgIHN0cmVhbS5fdHlwZSA9ICdmcyc7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ1BJUEUnOlxuICAgIGNhc2UgJ1RDUCc6XG4gICAgICB2YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG4gICAgICBzdHJlYW0gPSBuZXcgbmV0LlNvY2tldCh7XG4gICAgICAgIGZkOiBmZCxcbiAgICAgICAgcmVhZGFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZJWE1FIFNob3VsZCBwcm9iYWJseSBoYXZlIGFuIG9wdGlvbiBpbiBuZXQuU29ja2V0IHRvIGNyZWF0ZSBhXG4gICAgICAvLyBzdHJlYW0gZnJvbSBhbiBleGlzdGluZyBmZCB3aGljaCBpcyB3cml0YWJsZSBvbmx5LiBCdXQgZm9yIG5vd1xuICAgICAgLy8gd2UnbGwganVzdCBhZGQgdGhpcyBoYWNrIGFuZCBzZXQgdGhlIGByZWFkYWJsZWAgbWVtYmVyIHRvIGZhbHNlLlxuICAgICAgLy8gVGVzdDogLi9ub2RlIHRlc3QvZml4dHVyZXMvZWNoby5qcyA8IC9ldGMvcGFzc3dkXG4gICAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZWFkID0gbnVsbDtcbiAgICAgIHN0cmVhbS5fdHlwZSA9ICdwaXBlJztcblxuICAgICAgLy8gRklYTUUgSGFjayB0byBoYXZlIHN0cmVhbSBub3Qga2VlcCB0aGUgZXZlbnQgbG9vcCBhbGl2ZS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzE3MjZcbiAgICAgIGlmIChzdHJlYW0uX2hhbmRsZSAmJiBzdHJlYW0uX2hhbmRsZS51bnJlZikge1xuICAgICAgICBzdHJlYW0uX2hhbmRsZS51bnJlZigpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gUHJvYmFibHkgYW4gZXJyb3Igb24gaW4gdXZfZ3Vlc3NfaGFuZGxlKClcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW1wbGVtZW50IG1lLiBVbmtub3duIHN0cmVhbSBmaWxlIHR5cGUhJyk7XG4gIH1cblxuICAvLyBGb3Igc3VwcG9ydGluZyBsZWdhY3kgQVBJIHdlIHB1dCB0aGUgRkQgaGVyZS5cbiAgc3RyZWFtLmZkID0gZmQ7XG5cbiAgc3RyZWFtLl9pc1N0ZGlvID0gdHJ1ZTtcblxuICByZXR1cm4gc3RyZWFtO1xufVxuXG4vKipcbiAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICpcbiAqIENyZWF0ZSBhIG5ldyBgaW5zcGVjdE9wdHNgIG9iamVjdCBpbiBjYXNlIGB1c2VDb2xvcnNgIGlzIHNldFxuICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGluaXQgKGRlYnVnKSB7XG4gIGRlYnVnLmluc3BlY3RPcHRzID0ge307XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhleHBvcnRzLmluc3BlY3RPcHRzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVidWcuaW5zcGVjdE9wdHNba2V5c1tpXV0gPSBleHBvcnRzLmluc3BlY3RPcHRzW2tleXNbaV1dO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBwcm9jZXNzLmVudi5ERUJVR2AgaW5pdGlhbGx5LlxuICovXG5cbmV4cG9ydHMuZW5hYmxlKGxvYWQoKSk7XG4iLCAiLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9icm93c2VyLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbm9kZS5qcycpO1xufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEV4cG9zZSBgYXJyYXlGbGF0dGVuYC5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBhcnJheUZsYXR0ZW5cblxuLyoqXG4gKiBSZWN1cnNpdmUgZmxhdHRlbiBmdW5jdGlvbiB3aXRoIGRlcHRoLlxuICpcbiAqIEBwYXJhbSAge0FycmF5fSAgYXJyYXlcbiAqIEBwYXJhbSAge0FycmF5fSAgcmVzdWx0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGRlcHRoXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbldpdGhEZXB0aCAoYXJyYXksIHJlc3VsdCwgZGVwdGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2ldXG5cbiAgICBpZiAoZGVwdGggPiAwICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmbGF0dGVuV2l0aERlcHRoKHZhbHVlLCByZXN1bHQsIGRlcHRoIC0gMSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZSBmbGF0dGVuIGZ1bmN0aW9uLiBPbWl0dGluZyBkZXB0aCBpcyBzbGlnaHRseSBmYXN0ZXIuXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IGFycmF5XG4gKiBAcGFyYW0gIHtBcnJheX0gcmVzdWx0XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkZvcmV2ZXIgKGFycmF5LCByZXN1bHQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2ldXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZsYXR0ZW5Gb3JldmVyKHZhbHVlLCByZXN1bHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGFuIGFycmF5LCB3aXRoIHRoZSBhYmlsaXR5IHRvIGRlZmluZSBhIGRlcHRoLlxuICpcbiAqIEBwYXJhbSAge0FycmF5fSAgYXJyYXlcbiAqIEBwYXJhbSAge051bWJlcn0gZGVwdGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBhcnJheUZsYXR0ZW4gKGFycmF5LCBkZXB0aCkge1xuICBpZiAoZGVwdGggPT0gbnVsbCkge1xuICAgIHJldHVybiBmbGF0dGVuRm9yZXZlcihhcnJheSwgW10pXG4gIH1cblxuICByZXR1cm4gZmxhdHRlbldpdGhEZXB0aChhcnJheSwgW10sIGRlcHRoKVxufVxuIiwgIi8qKlxuICogRXhwb3NlIGBwYXRodG9SZWdleHBgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aHRvUmVnZXhwO1xuXG4vKipcbiAqIE1hdGNoIG1hdGNoaW5nIGdyb3VwcyBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqL1xudmFyIE1BVENISU5HX0dST1VQX1JFR0VYUCA9IC9cXCgoPyFcXD8pL2c7XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSBnaXZlbiBwYXRoIHN0cmluZyxcbiAqIHJldHVybmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBBbiBlbXB0eSBhcnJheSBzaG91bGQgYmUgcGFzc2VkLFxuICogd2hpY2ggd2lsbCBjb250YWluIHRoZSBwbGFjZWhvbGRlclxuICoga2V5IG5hbWVzLiBGb3IgZXhhbXBsZSBcIi91c2VyLzppZFwiIHdpbGxcbiAqIHRoZW4gY29udGFpbiBbXCJpZFwiXS5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd8UmVnRXhwfEFycmF5fSBwYXRoXG4gKiBAcGFyYW0gIHtBcnJheX0ga2V5c1xuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXRodG9SZWdleHAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAga2V5cyA9IGtleXMgfHwgW107XG4gIHZhciBzdHJpY3QgPSBvcHRpb25zLnN0cmljdDtcbiAgdmFyIGVuZCA9IG9wdGlvbnMuZW5kICE9PSBmYWxzZTtcbiAgdmFyIGZsYWdzID0gb3B0aW9ucy5zZW5zaXRpdmUgPyAnJyA6ICdpJztcbiAgdmFyIGV4dHJhT2Zmc2V0ID0gMDtcbiAgdmFyIGtleXNPZmZzZXQgPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbmFtZSA9IDA7XG4gIHZhciBtO1xuXG4gIGlmIChwYXRoIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgd2hpbGUgKG0gPSBNQVRDSElOR19HUk9VUF9SRUdFWFAuZXhlYyhwYXRoLnNvdXJjZSkpIHtcbiAgICAgIGtleXMucHVzaCh7XG4gICAgICAgIG5hbWU6IG5hbWUrKyxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICBvZmZzZXQ6IG0uaW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAvLyBNYXAgYXJyYXkgcGFydHMgaW50byByZWdleHBzIGFuZCByZXR1cm4gdGhlaXIgc291cmNlLiBXZSBhbHNvIHBhc3NcbiAgICAvLyB0aGUgc2FtZSBrZXlzIGFuZCBvcHRpb25zIGluc3RhbmNlIGludG8gZXZlcnkgZ2VuZXJhdGlvbiB0byBnZXRcbiAgICAvLyBjb25zaXN0ZW50IG1hdGNoaW5nIGdyb3VwcyBiZWZvcmUgd2Ugam9pbiB0aGUgc291cmNlcyB0b2dldGhlci5cbiAgICBwYXRoID0gcGF0aC5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gcGF0aHRvUmVnZXhwKHZhbHVlLCBrZXlzLCBvcHRpb25zKS5zb3VyY2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFJlZ0V4cCgnKD86JyArIHBhdGguam9pbignfCcpICsgJyknLCBmbGFncyk7XG4gIH1cblxuICBwYXRoID0gKCdeJyArIHBhdGggKyAoc3RyaWN0ID8gJycgOiBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPT09ICcvJyA/ICc/JyA6ICcvPycpKVxuICAgIC5yZXBsYWNlKC9cXC9cXCgvZywgJy8oPzonKVxuICAgIC5yZXBsYWNlKC8oW1xcL1xcLl0pL2csICdcXFxcJDEnKVxuICAgIC5yZXBsYWNlKC8oXFxcXFxcLyk/KFxcXFxcXC4pPzooXFx3KykoXFwoLio/XFwpKT8oXFwqKT8oXFw/KT8vZywgZnVuY3Rpb24gKG1hdGNoLCBzbGFzaCwgZm9ybWF0LCBrZXksIGNhcHR1cmUsIHN0YXIsIG9wdGlvbmFsLCBvZmZzZXQpIHtcbiAgICAgIHNsYXNoID0gc2xhc2ggfHwgJyc7XG4gICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICBjYXB0dXJlID0gY2FwdHVyZSB8fCAnKFteXFxcXC8nICsgZm9ybWF0ICsgJ10rPyknO1xuICAgICAgb3B0aW9uYWwgPSBvcHRpb25hbCB8fCAnJztcblxuICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgbmFtZToga2V5LFxuICAgICAgICBvcHRpb25hbDogISFvcHRpb25hbCxcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXQgKyBleHRyYU9mZnNldFxuICAgICAgfSk7XG5cbiAgICAgIHZhciByZXN1bHQgPSAnJ1xuICAgICAgICArIChvcHRpb25hbCA/ICcnIDogc2xhc2gpXG4gICAgICAgICsgJyg/OidcbiAgICAgICAgKyBmb3JtYXQgKyAob3B0aW9uYWwgPyBzbGFzaCA6ICcnKSArIGNhcHR1cmVcbiAgICAgICAgKyAoc3RhciA/ICcoKD86W1xcXFwvJyArIGZvcm1hdCArICddLis/KT8pJyA6ICcnKVxuICAgICAgICArICcpJ1xuICAgICAgICArIG9wdGlvbmFsO1xuXG4gICAgICBleHRyYU9mZnNldCArPSByZXN1bHQubGVuZ3RoIC0gbWF0Y2gubGVuZ3RoO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pXG4gICAgLnJlcGxhY2UoL1xcKi9nLCBmdW5jdGlvbiAoc3RhciwgaW5kZXgpIHtcbiAgICAgIHZhciBsZW4gPSBrZXlzLmxlbmd0aFxuXG4gICAgICB3aGlsZSAobGVuLS0gPiBrZXlzT2Zmc2V0ICYmIGtleXNbbGVuXS5vZmZzZXQgPiBpbmRleCkge1xuICAgICAgICBrZXlzW2xlbl0ub2Zmc2V0ICs9IDM7IC8vIFJlcGxhY2VtZW50IGxlbmd0aCBtaW51cyBhc3RlcmlzayBsZW5ndGguXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnKC4qKSc7XG4gICAgfSk7XG5cbiAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGhhbmRsaW5nIHVubmFtZWQgbWF0Y2hpbmcgZ3JvdXBzLlxuICB3aGlsZSAobSA9IE1BVENISU5HX0dST1VQX1JFR0VYUC5leGVjKHBhdGgpKSB7XG4gICAgdmFyIGVzY2FwZUNvdW50ID0gMDtcbiAgICB2YXIgaW5kZXggPSBtLmluZGV4O1xuXG4gICAgd2hpbGUgKHBhdGguY2hhckF0KC0taW5kZXgpID09PSAnXFxcXCcpIHtcbiAgICAgIGVzY2FwZUNvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0byBlc2NhcGUgdGhlIGJyYWNrZXQuXG4gICAgaWYgKGVzY2FwZUNvdW50ICUgMiA9PT0gMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGtleXNPZmZzZXQgKyBpID09PSBrZXlzLmxlbmd0aCB8fCBrZXlzW2tleXNPZmZzZXQgKyBpXS5vZmZzZXQgPiBtLmluZGV4KSB7XG4gICAgICBrZXlzLnNwbGljZShrZXlzT2Zmc2V0ICsgaSwgMCwge1xuICAgICAgICBuYW1lOiBuYW1lKyssIC8vIFVubmFtZWQgbWF0Y2hpbmcgZ3JvdXBzIG11c3QgYmUgY29uc2lzdGVudGx5IGxpbmVhci5cbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICBvZmZzZXQ6IG0uaW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIC8vIElmIHRoZSBwYXRoIGlzIG5vbi1lbmRpbmcsIG1hdGNoIHVudGlsIHRoZSBlbmQgb3IgYSBzbGFzaC5cbiAgcGF0aCArPSAoZW5kID8gJyQnIDogKHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gJy8nID8gJycgOiAnKD89XFxcXC98JCknKSk7XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAocGF0aCwgZmxhZ3MpO1xufTtcbiIsICIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHBhdGhSZWdleHAgPSByZXF1aXJlKCdwYXRoLXRvLXJlZ2V4cCcpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZXhwcmVzczpyb3V0ZXI6bGF5ZXInKTtcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gTGF5ZXI7XG5cbmZ1bmN0aW9uIExheWVyKHBhdGgsIG9wdGlvbnMsIGZuKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBMYXllcikpIHtcbiAgICByZXR1cm4gbmV3IExheWVyKHBhdGgsIG9wdGlvbnMsIGZuKTtcbiAgfVxuXG4gIGRlYnVnKCduZXcgJW8nLCBwYXRoKVxuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgdGhpcy5oYW5kbGUgPSBmbjtcbiAgdGhpcy5uYW1lID0gZm4ubmFtZSB8fCAnPGFub255bW91cz4nO1xuICB0aGlzLnBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5wYXRoID0gdW5kZWZpbmVkO1xuICB0aGlzLnJlZ2V4cCA9IHBhdGhSZWdleHAocGF0aCwgdGhpcy5rZXlzID0gW10sIG9wdHMpO1xuXG4gIC8vIHNldCBmYXN0IHBhdGggZmxhZ3NcbiAgdGhpcy5yZWdleHAuZmFzdF9zdGFyID0gcGF0aCA9PT0gJyonXG4gIHRoaXMucmVnZXhwLmZhc3Rfc2xhc2ggPSBwYXRoID09PSAnLycgJiYgb3B0cy5lbmQgPT09IGZhbHNlXG59XG5cbi8qKlxuICogSGFuZGxlIHRoZSBlcnJvciBmb3IgdGhlIGxheWVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAcGFyYW0ge1JlcXVlc3R9IHJlcVxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5MYXllci5wcm90b3R5cGUuaGFuZGxlX2Vycm9yID0gZnVuY3Rpb24gaGFuZGxlX2Vycm9yKGVycm9yLCByZXEsIHJlcywgbmV4dCkge1xuICB2YXIgZm4gPSB0aGlzLmhhbmRsZTtcblxuICBpZiAoZm4ubGVuZ3RoICE9PSA0KSB7XG4gICAgLy8gbm90IGEgc3RhbmRhcmQgZXJyb3IgaGFuZGxlclxuICAgIHJldHVybiBuZXh0KGVycm9yKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgZm4oZXJyb3IsIHJlcSwgcmVzLCBuZXh0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbmV4dChlcnIpO1xuICB9XG59O1xuXG4vKipcbiAqIEhhbmRsZSB0aGUgcmVxdWVzdCBmb3IgdGhlIGxheWVyLlxuICpcbiAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG5leHRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkxheWVyLnByb3RvdHlwZS5oYW5kbGVfcmVxdWVzdCA9IGZ1bmN0aW9uIGhhbmRsZShyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgZm4gPSB0aGlzLmhhbmRsZTtcblxuICBpZiAoZm4ubGVuZ3RoID4gMykge1xuICAgIC8vIG5vdCBhIHN0YW5kYXJkIHJlcXVlc3QgaGFuZGxlclxuICAgIHJldHVybiBuZXh0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIGZuKHJlcSwgcmVzLCBuZXh0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbmV4dChlcnIpO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgcm91dGUgbWF0Y2hlcyBgcGF0aGAsIGlmIHNvXG4gKiBwb3B1bGF0ZSBgLnBhcmFtc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5MYXllci5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbiBtYXRjaChwYXRoKSB7XG4gIHZhciBtYXRjaFxuXG4gIGlmIChwYXRoICE9IG51bGwpIHtcbiAgICAvLyBmYXN0IHBhdGggbm9uLWVuZGluZyBtYXRjaCBmb3IgLyAoYW55IHBhdGggbWF0Y2hlcylcbiAgICBpZiAodGhpcy5yZWdleHAuZmFzdF9zbGFzaCkge1xuICAgICAgdGhpcy5wYXJhbXMgPSB7fVxuICAgICAgdGhpcy5wYXRoID0gJydcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gZmFzdCBwYXRoIGZvciAqIChldmVyeXRoaW5nIG1hdGNoZWQgaW4gYSBwYXJhbSlcbiAgICBpZiAodGhpcy5yZWdleHAuZmFzdF9zdGFyKSB7XG4gICAgICB0aGlzLnBhcmFtcyA9IHsnMCc6IGRlY29kZV9wYXJhbShwYXRoKX1cbiAgICAgIHRoaXMucGF0aCA9IHBhdGhcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gbWF0Y2ggdGhlIHBhdGhcbiAgICBtYXRjaCA9IHRoaXMucmVnZXhwLmV4ZWMocGF0aClcbiAgfVxuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhdGggPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gc3RvcmUgdmFsdWVzXG4gIHRoaXMucGFyYW1zID0ge307XG4gIHRoaXMucGF0aCA9IG1hdGNoWzBdXG5cbiAgdmFyIGtleXMgPSB0aGlzLmtleXM7XG4gIHZhciBwYXJhbXMgPSB0aGlzLnBhcmFtcztcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IG1hdGNoLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaSAtIDFdO1xuICAgIHZhciBwcm9wID0ga2V5Lm5hbWU7XG4gICAgdmFyIHZhbCA9IGRlY29kZV9wYXJhbShtYXRjaFtpXSlcblxuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCB8fCAhKGhhc093blByb3BlcnR5LmNhbGwocGFyYW1zLCBwcm9wKSkpIHtcbiAgICAgIHBhcmFtc1twcm9wXSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogRGVjb2RlIHBhcmFtIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZGVjb2RlX3BhcmFtKHZhbCkge1xuICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycgfHwgdmFsLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFVSSUVycm9yKSB7XG4gICAgICBlcnIubWVzc2FnZSA9ICdGYWlsZWQgdG8gZGVjb2RlIHBhcmFtIFxcJycgKyB2YWwgKyAnXFwnJztcbiAgICAgIGVyci5zdGF0dXMgPSBlcnIuc3RhdHVzQ29kZSA9IDQwMDtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cbiIsICIvKiFcbiAqIG1ldGhvZHNcbiAqIENvcHlyaWdodChjKSAyMDEzLTIwMTQgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDE1LTIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEN1cnJlbnROb2RlTWV0aG9kcygpIHx8IGdldEJhc2ljTm9kZU1ldGhvZHMoKTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgTm9kZS5qcyBtZXRob2RzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Tm9kZU1ldGhvZHMoKSB7XG4gIHJldHVybiBodHRwLk1FVEhPRFMgJiYgaHR0cC5NRVRIT0RTLm1hcChmdW5jdGlvbiBsb3dlckNhc2VNZXRob2QobWV0aG9kKSB7XG4gICAgcmV0dXJuIG1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIFwiYmFzaWNcIiBOb2RlLmpzIG1ldGhvZHMsIGEgc25hcHNob3QgZnJvbSBOb2RlLmpzIDAuMTAuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEJhc2ljTm9kZU1ldGhvZHMoKSB7XG4gIHJldHVybiBbXG4gICAgJ2dldCcsXG4gICAgJ3Bvc3QnLFxuICAgICdwdXQnLFxuICAgICdoZWFkJyxcbiAgICAnZGVsZXRlJyxcbiAgICAnb3B0aW9ucycsXG4gICAgJ3RyYWNlJyxcbiAgICAnY29weScsXG4gICAgJ2xvY2snLFxuICAgICdta2NvbCcsXG4gICAgJ21vdmUnLFxuICAgICdwdXJnZScsXG4gICAgJ3Byb3BmaW5kJyxcbiAgICAncHJvcHBhdGNoJyxcbiAgICAndW5sb2NrJyxcbiAgICAncmVwb3J0JyxcbiAgICAnbWthY3Rpdml0eScsXG4gICAgJ2NoZWNrb3V0JyxcbiAgICAnbWVyZ2UnLFxuICAgICdtLXNlYXJjaCcsXG4gICAgJ25vdGlmeScsXG4gICAgJ3N1YnNjcmliZScsXG4gICAgJ3Vuc3Vic2NyaWJlJyxcbiAgICAncGF0Y2gnLFxuICAgICdzZWFyY2gnLFxuICAgICdjb25uZWN0J1xuICBdO1xufVxuIiwgIi8qIVxuICogZXhwcmVzc1xuICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMyBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTMgUm9tYW4gU2h0eWxtYW5cbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdleHByZXNzOnJvdXRlcjpyb3V0ZScpO1xudmFyIGZsYXR0ZW4gPSByZXF1aXJlKCdhcnJheS1mbGF0dGVuJyk7XG52YXIgTGF5ZXIgPSByZXF1aXJlKCcuL2xheWVyJyk7XG52YXIgbWV0aG9kcyA9IHJlcXVpcmUoJ21ldGhvZHMnKTtcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gUm91dGU7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBgUm91dGVgIHdpdGggdGhlIGdpdmVuIGBwYXRoYCxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFJvdXRlKHBhdGgpIHtcbiAgdGhpcy5wYXRoID0gcGF0aDtcbiAgdGhpcy5zdGFjayA9IFtdO1xuXG4gIGRlYnVnKCduZXcgJW8nLCBwYXRoKVxuXG4gIC8vIHJvdXRlIGhhbmRsZXJzIGZvciB2YXJpb3VzIGh0dHAgbWV0aG9kc1xuICB0aGlzLm1ldGhvZHMgPSB7fTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHJvdXRlIGhhbmRsZXMgYSBnaXZlbiBtZXRob2QuXG4gKiBAcHJpdmF0ZVxuICovXG5cblJvdXRlLnByb3RvdHlwZS5faGFuZGxlc19tZXRob2QgPSBmdW5jdGlvbiBfaGFuZGxlc19tZXRob2QobWV0aG9kKSB7XG4gIGlmICh0aGlzLm1ldGhvZHMuX2FsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIG5hbWUgPSBtZXRob2QudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobmFtZSA9PT0gJ2hlYWQnICYmICF0aGlzLm1ldGhvZHNbJ2hlYWQnXSkge1xuICAgIG5hbWUgPSAnZ2V0JztcbiAgfVxuXG4gIHJldHVybiBCb29sZWFuKHRoaXMubWV0aG9kc1tuYW1lXSk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge0FycmF5fSBzdXBwb3J0ZWQgSFRUUCBtZXRob2RzXG4gKiBAcHJpdmF0ZVxuICovXG5cblJvdXRlLnByb3RvdHlwZS5fb3B0aW9ucyA9IGZ1bmN0aW9uIF9vcHRpb25zKCkge1xuICB2YXIgbWV0aG9kcyA9IE9iamVjdC5rZXlzKHRoaXMubWV0aG9kcyk7XG5cbiAgLy8gYXBwZW5kIGF1dG9tYXRpYyBoZWFkXG4gIGlmICh0aGlzLm1ldGhvZHMuZ2V0ICYmICF0aGlzLm1ldGhvZHMuaGVhZCkge1xuICAgIG1ldGhvZHMucHVzaCgnaGVhZCcpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gbWFrZSB1cHBlciBjYXNlXG4gICAgbWV0aG9kc1tpXSA9IG1ldGhvZHNbaV0udG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIHJldHVybiBtZXRob2RzO1xufTtcblxuLyoqXG4gKiBkaXNwYXRjaCByZXEsIHJlcyBpbnRvIHRoaXMgcm91dGVcbiAqIEBwcml2YXRlXG4gKi9cblxuUm91dGUucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2gocmVxLCByZXMsIGRvbmUpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBzdGFjayA9IHRoaXMuc3RhY2s7XG4gIHZhciBzeW5jID0gMFxuXG4gIGlmIChzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZG9uZSgpO1xuICB9XG5cbiAgdmFyIG1ldGhvZCA9IHJlcS5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgaWYgKG1ldGhvZCA9PT0gJ2hlYWQnICYmICF0aGlzLm1ldGhvZHNbJ2hlYWQnXSkge1xuICAgIG1ldGhvZCA9ICdnZXQnO1xuICB9XG5cbiAgcmVxLnJvdXRlID0gdGhpcztcblxuICBuZXh0KCk7XG5cbiAgZnVuY3Rpb24gbmV4dChlcnIpIHtcbiAgICAvLyBzaWduYWwgdG8gZXhpdCByb3V0ZVxuICAgIGlmIChlcnIgJiYgZXJyID09PSAncm91dGUnKSB7XG4gICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH1cblxuICAgIC8vIHNpZ25hbCB0byBleGl0IHJvdXRlclxuICAgIGlmIChlcnIgJiYgZXJyID09PSAncm91dGVyJykge1xuICAgICAgcmV0dXJuIGRvbmUoZXJyKVxuICAgIH1cblxuICAgIC8vIG1heCBzeW5jIHN0YWNrXG4gICAgaWYgKCsrc3luYyA+IDEwMCkge1xuICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShuZXh0LCBlcnIpXG4gICAgfVxuXG4gICAgdmFyIGxheWVyID0gc3RhY2tbaWR4KytdXG5cbiAgICAvLyBlbmQgb2YgbGF5ZXJzXG4gICAgaWYgKCFsYXllcikge1xuICAgICAgcmV0dXJuIGRvbmUoZXJyKVxuICAgIH1cblxuICAgIGlmIChsYXllci5tZXRob2QgJiYgbGF5ZXIubWV0aG9kICE9PSBtZXRob2QpIHtcbiAgICAgIG5leHQoZXJyKVxuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICBsYXllci5oYW5kbGVfZXJyb3IoZXJyLCByZXEsIHJlcywgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLmhhbmRsZV9yZXF1ZXN0KHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9XG5cbiAgICBzeW5jID0gMFxuICB9XG59O1xuXG4vKipcbiAqIEFkZCBhIGhhbmRsZXIgZm9yIGFsbCBIVFRQIHZlcmJzIHRvIHRoaXMgcm91dGUuXG4gKlxuICogQmVoYXZlcyBqdXN0IGxpa2UgbWlkZGxld2FyZSBhbmQgY2FuIHJlc3BvbmQgb3IgY2FsbCBgbmV4dGBcbiAqIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuXG4gKlxuICogWW91IGNhbiB1c2UgbXVsdGlwbGUgYC5hbGxgIGNhbGwgdG8gYWRkIG11bHRpcGxlIGhhbmRsZXJzLlxuICpcbiAqICAgZnVuY3Rpb24gY2hlY2tfc29tZXRoaW5nKHJlcSwgcmVzLCBuZXh0KXtcbiAqICAgICBuZXh0KCk7XG4gKiAgIH07XG4gKlxuICogICBmdW5jdGlvbiB2YWxpZGF0ZV91c2VyKHJlcSwgcmVzLCBuZXh0KXtcbiAqICAgICBuZXh0KCk7XG4gKiAgIH07XG4gKlxuICogICByb3V0ZVxuICogICAuYWxsKHZhbGlkYXRlX3VzZXIpXG4gKiAgIC5hbGwoY2hlY2tfc29tZXRoaW5nKVxuICogICAuZ2V0KGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KXtcbiAqICAgICByZXMuc2VuZCgnaGVsbG8gd29ybGQnKTtcbiAqICAgfSk7XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlclxuICogQHJldHVybiB7Um91dGV9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Sb3V0ZS5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb24gYWxsKCkge1xuICB2YXIgaGFuZGxlcyA9IGZsYXR0ZW4oc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaGFuZGxlID0gaGFuZGxlc1tpXTtcblxuICAgIGlmICh0eXBlb2YgaGFuZGxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwoaGFuZGxlKTtcbiAgICAgIHZhciBtc2cgPSAnUm91dGUuYWxsKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBmdW5jdGlvbiBidXQgZ290IGEgJyArIHR5cGVcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobXNnKTtcbiAgICB9XG5cbiAgICB2YXIgbGF5ZXIgPSBMYXllcignLycsIHt9LCBoYW5kbGUpO1xuICAgIGxheWVyLm1ldGhvZCA9IHVuZGVmaW5lZDtcblxuICAgIHRoaXMubWV0aG9kcy5fYWxsID0gdHJ1ZTtcbiAgICB0aGlzLnN0YWNrLnB1c2gobGF5ZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKXtcbiAgUm91dGUucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbigpe1xuICAgIHZhciBoYW5kbGVzID0gZmxhdHRlbihzbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGFuZGxlID0gaGFuZGxlc1tpXTtcblxuICAgICAgaWYgKHR5cGVvZiBoYW5kbGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0b1N0cmluZy5jYWxsKGhhbmRsZSk7XG4gICAgICAgIHZhciBtc2cgPSAnUm91dGUuJyArIG1ldGhvZCArICcoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGJ1dCBnb3QgYSAnICsgdHlwZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cblxuICAgICAgZGVidWcoJyVzICVvJywgbWV0aG9kLCB0aGlzLnBhdGgpXG5cbiAgICAgIHZhciBsYXllciA9IExheWVyKCcvJywge30sIGhhbmRsZSk7XG4gICAgICBsYXllci5tZXRob2QgPSBtZXRob2Q7XG5cbiAgICAgIHRoaXMubWV0aG9kc1ttZXRob2RdID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3RhY2sucHVzaChsYXllcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KTtcbiIsICIvKipcbiAqIE1lcmdlIG9iamVjdCBiIHdpdGggb2JqZWN0IGEuXG4gKlxuICogICAgIHZhciBhID0geyBmb286ICdiYXInIH1cbiAqICAgICAgICwgYiA9IHsgYmFyOiAnYmF6JyB9O1xuICpcbiAqICAgICBtZXJnZShhLCBiKTtcbiAqICAgICAvLyA9PiB7IGZvbzogJ2JhcicsIGJhcjogJ2JheicgfVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhXG4gKiBAcGFyYW0ge09iamVjdH0gYlxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhLCBiKXtcbiAgaWYgKGEgJiYgYikge1xuICAgIGZvciAodmFyIGtleSBpbiBiKSB7XG4gICAgICBhW2tleV0gPSBiW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBhO1xufTtcbiIsICIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZScpO1xudmFyIExheWVyID0gcmVxdWlyZSgnLi9sYXllcicpO1xudmFyIG1ldGhvZHMgPSByZXF1aXJlKCdtZXRob2RzJyk7XG52YXIgbWl4aW4gPSByZXF1aXJlKCd1dGlscy1tZXJnZScpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZXhwcmVzczpyb3V0ZXInKTtcbnZhciBkZXByZWNhdGUgPSByZXF1aXJlKCdkZXBkJykoJ2V4cHJlc3MnKTtcbnZhciBmbGF0dGVuID0gcmVxdWlyZSgnYXJyYXktZmxhdHRlbicpO1xudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgncGFyc2V1cmwnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJ3NldHByb3RvdHlwZW9mJylcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgb2JqZWN0UmVnRXhwID0gL15cXFtvYmplY3QgKFxcUyspXFxdJC87XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJvdXRlcmAgd2l0aCB0aGUgZ2l2ZW4gYG9wdGlvbnNgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge1JvdXRlcn0gd2hpY2ggaXMgYW4gY2FsbGFibGUgZnVuY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuXG52YXIgcHJvdG8gPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGZ1bmN0aW9uIHJvdXRlcihyZXEsIHJlcywgbmV4dCkge1xuICAgIHJvdXRlci5oYW5kbGUocmVxLCByZXMsIG5leHQpO1xuICB9XG5cbiAgLy8gbWl4aW4gUm91dGVyIGNsYXNzIGZ1bmN0aW9uc1xuICBzZXRQcm90b3R5cGVPZihyb3V0ZXIsIHByb3RvKVxuXG4gIHJvdXRlci5wYXJhbXMgPSB7fTtcbiAgcm91dGVyLl9wYXJhbXMgPSBbXTtcbiAgcm91dGVyLmNhc2VTZW5zaXRpdmUgPSBvcHRzLmNhc2VTZW5zaXRpdmU7XG4gIHJvdXRlci5tZXJnZVBhcmFtcyA9IG9wdHMubWVyZ2VQYXJhbXM7XG4gIHJvdXRlci5zdHJpY3QgPSBvcHRzLnN0cmljdDtcbiAgcm91dGVyLnN0YWNrID0gW107XG5cbiAgcmV0dXJuIHJvdXRlcjtcbn07XG5cbi8qKlxuICogTWFwIHRoZSBnaXZlbiBwYXJhbSBwbGFjZWhvbGRlciBgbmFtZWAocykgdG8gdGhlIGdpdmVuIGNhbGxiYWNrLlxuICpcbiAqIFBhcmFtZXRlciBtYXBwaW5nIGlzIHVzZWQgdG8gcHJvdmlkZSBwcmUtY29uZGl0aW9ucyB0byByb3V0ZXNcbiAqIHdoaWNoIHVzZSBub3JtYWxpemVkIHBsYWNlaG9sZGVycy4gRm9yIGV4YW1wbGUgYSBfOnVzZXJfaWRfIHBhcmFtZXRlclxuICogY291bGQgYXV0b21hdGljYWxseSBsb2FkIGEgdXNlcidzIGluZm9ybWF0aW9uIGZyb20gdGhlIGRhdGFiYXNlIHdpdGhvdXRcbiAqIGFueSBhZGRpdGlvbmFsIGNvZGUsXG4gKlxuICogVGhlIGNhbGxiYWNrIHVzZXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIG1pZGRsZXdhcmUsIHRoZSBvbmx5IGRpZmZlcmVuY2VcbiAqIGJlaW5nIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBwbGFjZWhvbGRlciBpcyBwYXNzZWQsIGluIHRoaXMgY2FzZSB0aGUgX2lkX1xuICogb2YgdGhlIHVzZXIuIE9uY2UgdGhlIGBuZXh0KClgIGZ1bmN0aW9uIGlzIGludm9rZWQsIGp1c3QgbGlrZSBtaWRkbGV3YXJlXG4gKiBpdCB3aWxsIGNvbnRpbnVlIG9uIHRvIGV4ZWN1dGUgdGhlIHJvdXRlLCBvciBzdWJzZXF1ZW50IHBhcmFtZXRlciBmdW5jdGlvbnMuXG4gKlxuICogSnVzdCBsaWtlIGluIG1pZGRsZXdhcmUsIHlvdSBtdXN0IGVpdGhlciByZXNwb25kIHRvIHRoZSByZXF1ZXN0IG9yIGNhbGwgbmV4dFxuICogdG8gYXZvaWQgc3RhbGxpbmcgdGhlIHJlcXVlc3QuXG4gKlxuICogIGFwcC5wYXJhbSgndXNlcl9pZCcsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0LCBpZCl7XG4gKiAgICBVc2VyLmZpbmQoaWQsIGZ1bmN0aW9uKGVyciwgdXNlcil7XG4gKiAgICAgIGlmIChlcnIpIHtcbiAqICAgICAgICByZXR1cm4gbmV4dChlcnIpO1xuICogICAgICB9IGVsc2UgaWYgKCF1c2VyKSB7XG4gKiAgICAgICAgcmV0dXJuIG5leHQobmV3IEVycm9yKCdmYWlsZWQgdG8gbG9hZCB1c2VyJykpO1xuICogICAgICB9XG4gKiAgICAgIHJlcS51c2VyID0gdXNlcjtcbiAqICAgICAgbmV4dCgpO1xuICogICAgfSk7XG4gKiAgfSk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbnByb3RvLnBhcmFtID0gZnVuY3Rpb24gcGFyYW0obmFtZSwgZm4pIHtcbiAgLy8gcGFyYW0gbG9naWNcbiAgaWYgKHR5cGVvZiBuYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGVwcmVjYXRlKCdyb3V0ZXIucGFyYW0oZm4pOiBSZWZhY3RvciB0byB1c2UgcGF0aCBwYXJhbXMnKTtcbiAgICB0aGlzLl9wYXJhbXMucHVzaChuYW1lKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBhcHBseSBwYXJhbSBmdW5jdGlvbnNcbiAgdmFyIHBhcmFtcyA9IHRoaXMuX3BhcmFtcztcbiAgdmFyIGxlbiA9IHBhcmFtcy5sZW5ndGg7XG4gIHZhciByZXQ7XG5cbiAgaWYgKG5hbWVbMF0gPT09ICc6Jykge1xuICAgIGRlcHJlY2F0ZSgncm91dGVyLnBhcmFtKCcgKyBKU09OLnN0cmluZ2lmeShuYW1lKSArICcsIGZuKTogVXNlIHJvdXRlci5wYXJhbSgnICsgSlNPTi5zdHJpbmdpZnkobmFtZS5zbGljZSgxKSkgKyAnLCBmbikgaW5zdGVhZCcpXG4gICAgbmFtZSA9IG5hbWUuc2xpY2UoMSlcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAocmV0ID0gcGFyYW1zW2ldKG5hbWUsIGZuKSkge1xuICAgICAgZm4gPSByZXQ7XG4gICAgfVxuICB9XG5cbiAgLy8gZW5zdXJlIHdlIGVuZCB1cCB3aXRoIGFcbiAgLy8gbWlkZGxld2FyZSBmdW5jdGlvblxuICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGZuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBhcmFtKCkgY2FsbCBmb3IgJyArIG5hbWUgKyAnLCBnb3QgJyArIGZuKTtcbiAgfVxuXG4gICh0aGlzLnBhcmFtc1tuYW1lXSA9IHRoaXMucGFyYW1zW25hbWVdIHx8IFtdKS5wdXNoKGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxLCByZXMgaW50byB0aGUgcm91dGVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5wcm90by5oYW5kbGUgPSBmdW5jdGlvbiBoYW5kbGUocmVxLCByZXMsIG91dCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgZGVidWcoJ2Rpc3BhdGNoaW5nICVzICVzJywgcmVxLm1ldGhvZCwgcmVxLnVybCk7XG5cbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBwcm90b2hvc3QgPSBnZXRQcm90b2hvc3QocmVxLnVybCkgfHwgJydcbiAgdmFyIHJlbW92ZWQgPSAnJztcbiAgdmFyIHNsYXNoQWRkZWQgPSBmYWxzZTtcbiAgdmFyIHN5bmMgPSAwXG4gIHZhciBwYXJhbWNhbGxlZCA9IHt9O1xuXG4gIC8vIHN0b3JlIG9wdGlvbnMgZm9yIE9QVElPTlMgcmVxdWVzdFxuICAvLyBvbmx5IHVzZWQgaWYgT1BUSU9OUyByZXF1ZXN0XG4gIHZhciBvcHRpb25zID0gW107XG5cbiAgLy8gbWlkZGxld2FyZSBhbmQgcm91dGVzXG4gIHZhciBzdGFjayA9IHNlbGYuc3RhY2s7XG5cbiAgLy8gbWFuYWdlIGludGVyLXJvdXRlciB2YXJpYWJsZXNcbiAgdmFyIHBhcmVudFBhcmFtcyA9IHJlcS5wYXJhbXM7XG4gIHZhciBwYXJlbnRVcmwgPSByZXEuYmFzZVVybCB8fCAnJztcbiAgdmFyIGRvbmUgPSByZXN0b3JlKG91dCwgcmVxLCAnYmFzZVVybCcsICduZXh0JywgJ3BhcmFtcycpO1xuXG4gIC8vIHNldHVwIG5leHQgbGF5ZXJcbiAgcmVxLm5leHQgPSBuZXh0O1xuXG4gIC8vIGZvciBvcHRpb25zIHJlcXVlc3RzLCByZXNwb25kIHdpdGggYSBkZWZhdWx0IGlmIG5vdGhpbmcgZWxzZSByZXNwb25kc1xuICBpZiAocmVxLm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgZG9uZSA9IHdyYXAoZG9uZSwgZnVuY3Rpb24ob2xkLCBlcnIpIHtcbiAgICAgIGlmIChlcnIgfHwgb3B0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiBvbGQoZXJyKTtcbiAgICAgIHNlbmRPcHRpb25zUmVzcG9uc2UocmVzLCBvcHRpb25zLCBvbGQpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gc2V0dXAgYmFzaWMgcmVxIHZhbHVlc1xuICByZXEuYmFzZVVybCA9IHBhcmVudFVybDtcbiAgcmVxLm9yaWdpbmFsVXJsID0gcmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmw7XG5cbiAgbmV4dCgpO1xuXG4gIGZ1bmN0aW9uIG5leHQoZXJyKSB7XG4gICAgdmFyIGxheWVyRXJyb3IgPSBlcnIgPT09ICdyb3V0ZSdcbiAgICAgID8gbnVsbFxuICAgICAgOiBlcnI7XG5cbiAgICAvLyByZW1vdmUgYWRkZWQgc2xhc2hcbiAgICBpZiAoc2xhc2hBZGRlZCkge1xuICAgICAgcmVxLnVybCA9IHJlcS51cmwuc2xpY2UoMSlcbiAgICAgIHNsYXNoQWRkZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyByZXN0b3JlIGFsdGVyZWQgcmVxLnVybFxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmVxLmJhc2VVcmwgPSBwYXJlbnRVcmw7XG4gICAgICByZXEudXJsID0gcHJvdG9ob3N0ICsgcmVtb3ZlZCArIHJlcS51cmwuc2xpY2UocHJvdG9ob3N0Lmxlbmd0aClcbiAgICAgIHJlbW92ZWQgPSAnJztcbiAgICB9XG5cbiAgICAvLyBzaWduYWwgdG8gZXhpdCByb3V0ZXJcbiAgICBpZiAobGF5ZXJFcnJvciA9PT0gJ3JvdXRlcicpIHtcbiAgICAgIHNldEltbWVkaWF0ZShkb25lLCBudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gbm8gbW9yZSBtYXRjaGluZyBsYXllcnNcbiAgICBpZiAoaWR4ID49IHN0YWNrLmxlbmd0aCkge1xuICAgICAgc2V0SW1tZWRpYXRlKGRvbmUsIGxheWVyRXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG1heCBzeW5jIHN0YWNrXG4gICAgaWYgKCsrc3luYyA+IDEwMCkge1xuICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShuZXh0LCBlcnIpXG4gICAgfVxuXG4gICAgLy8gZ2V0IHBhdGhuYW1lIG9mIHJlcXVlc3RcbiAgICB2YXIgcGF0aCA9IGdldFBhdGhuYW1lKHJlcSk7XG5cbiAgICBpZiAocGF0aCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZG9uZShsYXllckVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIG5leHQgbWF0Y2hpbmcgbGF5ZXJcbiAgICB2YXIgbGF5ZXI7XG4gICAgdmFyIG1hdGNoO1xuICAgIHZhciByb3V0ZTtcblxuICAgIHdoaWxlIChtYXRjaCAhPT0gdHJ1ZSAmJiBpZHggPCBzdGFjay5sZW5ndGgpIHtcbiAgICAgIGxheWVyID0gc3RhY2tbaWR4KytdO1xuICAgICAgbWF0Y2ggPSBtYXRjaExheWVyKGxheWVyLCBwYXRoKTtcbiAgICAgIHJvdXRlID0gbGF5ZXIucm91dGU7XG5cbiAgICAgIGlmICh0eXBlb2YgbWF0Y2ggIT09ICdib29sZWFuJykge1xuICAgICAgICAvLyBob2xkIG9uIHRvIGxheWVyRXJyb3JcbiAgICAgICAgbGF5ZXJFcnJvciA9IGxheWVyRXJyb3IgfHwgbWF0Y2g7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaCAhPT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyb3V0ZSkge1xuICAgICAgICAvLyBwcm9jZXNzIG5vbi1yb3V0ZSBoYW5kbGVycyBub3JtYWxseVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxheWVyRXJyb3IpIHtcbiAgICAgICAgLy8gcm91dGVzIGRvIG5vdCBtYXRjaCB3aXRoIGEgcGVuZGluZyBlcnJvclxuICAgICAgICBtYXRjaCA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1ldGhvZCA9IHJlcS5tZXRob2Q7XG4gICAgICB2YXIgaGFzX21ldGhvZCA9IHJvdXRlLl9oYW5kbGVzX21ldGhvZChtZXRob2QpO1xuXG4gICAgICAvLyBidWlsZCB1cCBhdXRvbWF0aWMgb3B0aW9ucyByZXNwb25zZVxuICAgICAgaWYgKCFoYXNfbWV0aG9kICYmIG1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgICAgIGFwcGVuZE1ldGhvZHMob3B0aW9ucywgcm91dGUuX29wdGlvbnMoKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRvbid0IGV2ZW4gYm90aGVyIG1hdGNoaW5nIHJvdXRlXG4gICAgICBpZiAoIWhhc19tZXRob2QgJiYgbWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBubyBtYXRjaFxuICAgIGlmIChtYXRjaCAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGRvbmUobGF5ZXJFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gc3RvcmUgcm91dGUgZm9yIGRpc3BhdGNoIG9uIGNoYW5nZVxuICAgIGlmIChyb3V0ZSkge1xuICAgICAgcmVxLnJvdXRlID0gcm91dGU7XG4gICAgfVxuXG4gICAgLy8gQ2FwdHVyZSBvbmUtdGltZSBsYXllciB2YWx1ZXNcbiAgICByZXEucGFyYW1zID0gc2VsZi5tZXJnZVBhcmFtc1xuICAgICAgPyBtZXJnZVBhcmFtcyhsYXllci5wYXJhbXMsIHBhcmVudFBhcmFtcylcbiAgICAgIDogbGF5ZXIucGFyYW1zO1xuICAgIHZhciBsYXllclBhdGggPSBsYXllci5wYXRoO1xuXG4gICAgLy8gdGhpcyBzaG91bGQgYmUgZG9uZSBmb3IgdGhlIGxheWVyXG4gICAgc2VsZi5wcm9jZXNzX3BhcmFtcyhsYXllciwgcGFyYW1jYWxsZWQsIHJlcSwgcmVzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIG5leHQobGF5ZXJFcnJvciB8fCBlcnIpXG4gICAgICB9IGVsc2UgaWYgKHJvdXRlKSB7XG4gICAgICAgIGxheWVyLmhhbmRsZV9yZXF1ZXN0KHJlcSwgcmVzLCBuZXh0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpbV9wcmVmaXgobGF5ZXIsIGxheWVyRXJyb3IsIGxheWVyUGF0aCwgcGF0aClcbiAgICAgIH1cblxuICAgICAgc3luYyA9IDBcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaW1fcHJlZml4KGxheWVyLCBsYXllckVycm9yLCBsYXllclBhdGgsIHBhdGgpIHtcbiAgICBpZiAobGF5ZXJQYXRoLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gVmFsaWRhdGUgcGF0aCBpcyBhIHByZWZpeCBtYXRjaFxuICAgICAgaWYgKGxheWVyUGF0aCAhPT0gcGF0aC5zbGljZSgwLCBsYXllclBhdGgubGVuZ3RoKSkge1xuICAgICAgICBuZXh0KGxheWVyRXJyb3IpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBwYXRoIGJyZWFrcyBvbiBhIHBhdGggc2VwYXJhdG9yXG4gICAgICB2YXIgYyA9IHBhdGhbbGF5ZXJQYXRoLmxlbmd0aF1cbiAgICAgIGlmIChjICYmIGMgIT09ICcvJyAmJiBjICE9PSAnLicpIHJldHVybiBuZXh0KGxheWVyRXJyb3IpXG5cbiAgICAgIC8vIFRyaW0gb2ZmIHRoZSBwYXJ0IG9mIHRoZSB1cmwgdGhhdCBtYXRjaGVzIHRoZSByb3V0ZVxuICAgICAgLy8gbWlkZGxld2FyZSAoLnVzZSBzdHVmZikgbmVlZHMgdG8gaGF2ZSB0aGUgcGF0aCBzdHJpcHBlZFxuICAgICAgZGVidWcoJ3RyaW0gcHJlZml4ICglcykgZnJvbSB1cmwgJXMnLCBsYXllclBhdGgsIHJlcS51cmwpO1xuICAgICAgcmVtb3ZlZCA9IGxheWVyUGF0aDtcbiAgICAgIHJlcS51cmwgPSBwcm90b2hvc3QgKyByZXEudXJsLnNsaWNlKHByb3RvaG9zdC5sZW5ndGggKyByZW1vdmVkLmxlbmd0aClcblxuICAgICAgLy8gRW5zdXJlIGxlYWRpbmcgc2xhc2hcbiAgICAgIGlmICghcHJvdG9ob3N0ICYmIHJlcS51cmxbMF0gIT09ICcvJykge1xuICAgICAgICByZXEudXJsID0gJy8nICsgcmVxLnVybDtcbiAgICAgICAgc2xhc2hBZGRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIGJhc2UgVVJMIChubyB0cmFpbGluZyBzbGFzaClcbiAgICAgIHJlcS5iYXNlVXJsID0gcGFyZW50VXJsICsgKHJlbW92ZWRbcmVtb3ZlZC5sZW5ndGggLSAxXSA9PT0gJy8nXG4gICAgICAgID8gcmVtb3ZlZC5zdWJzdHJpbmcoMCwgcmVtb3ZlZC5sZW5ndGggLSAxKVxuICAgICAgICA6IHJlbW92ZWQpO1xuICAgIH1cblxuICAgIGRlYnVnKCclcyAlcyA6ICVzJywgbGF5ZXIubmFtZSwgbGF5ZXJQYXRoLCByZXEub3JpZ2luYWxVcmwpO1xuXG4gICAgaWYgKGxheWVyRXJyb3IpIHtcbiAgICAgIGxheWVyLmhhbmRsZV9lcnJvcihsYXllckVycm9yLCByZXEsIHJlcywgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLmhhbmRsZV9yZXF1ZXN0KHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUHJvY2VzcyBhbnkgcGFyYW1ldGVycyBmb3IgdGhlIGxheWVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5wcm90by5wcm9jZXNzX3BhcmFtcyA9IGZ1bmN0aW9uIHByb2Nlc3NfcGFyYW1zKGxheWVyLCBjYWxsZWQsIHJlcSwgcmVzLCBkb25lKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLnBhcmFtcztcblxuICAvLyBjYXB0dXJlZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGxheWVyLCBrZXlzIGFuZCB2YWx1ZXNcbiAgdmFyIGtleXMgPSBsYXllci5rZXlzO1xuXG4gIC8vIGZhc3QgdHJhY2tcbiAgaWYgKCFrZXlzIHx8IGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGRvbmUoKTtcbiAgfVxuXG4gIHZhciBpID0gMDtcbiAgdmFyIG5hbWU7XG4gIHZhciBwYXJhbUluZGV4ID0gMDtcbiAgdmFyIGtleTtcbiAgdmFyIHBhcmFtVmFsO1xuICB2YXIgcGFyYW1DYWxsYmFja3M7XG4gIHZhciBwYXJhbUNhbGxlZDtcblxuICAvLyBwcm9jZXNzIHBhcmFtcyBpbiBvcmRlclxuICAvLyBwYXJhbSBjYWxsYmFja3MgY2FuIGJlIGFzeW5jXG4gIGZ1bmN0aW9uIHBhcmFtKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBkb25lKGVycik7XG4gICAgfVxuXG4gICAgaWYgKGkgPj0ga2V5cy5sZW5ndGggKSB7XG4gICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH1cblxuICAgIHBhcmFtSW5kZXggPSAwO1xuICAgIGtleSA9IGtleXNbaSsrXTtcbiAgICBuYW1lID0ga2V5Lm5hbWU7XG4gICAgcGFyYW1WYWwgPSByZXEucGFyYW1zW25hbWVdO1xuICAgIHBhcmFtQ2FsbGJhY2tzID0gcGFyYW1zW25hbWVdO1xuICAgIHBhcmFtQ2FsbGVkID0gY2FsbGVkW25hbWVdO1xuXG4gICAgaWYgKHBhcmFtVmFsID09PSB1bmRlZmluZWQgfHwgIXBhcmFtQ2FsbGJhY2tzKSB7XG4gICAgICByZXR1cm4gcGFyYW0oKTtcbiAgICB9XG5cbiAgICAvLyBwYXJhbSBwcmV2aW91c2x5IGNhbGxlZCB3aXRoIHNhbWUgdmFsdWUgb3IgZXJyb3Igb2NjdXJyZWRcbiAgICBpZiAocGFyYW1DYWxsZWQgJiYgKHBhcmFtQ2FsbGVkLm1hdGNoID09PSBwYXJhbVZhbFxuICAgICAgfHwgKHBhcmFtQ2FsbGVkLmVycm9yICYmIHBhcmFtQ2FsbGVkLmVycm9yICE9PSAncm91dGUnKSkpIHtcbiAgICAgIC8vIHJlc3RvcmUgdmFsdWVcbiAgICAgIHJlcS5wYXJhbXNbbmFtZV0gPSBwYXJhbUNhbGxlZC52YWx1ZTtcblxuICAgICAgLy8gbmV4dCBwYXJhbVxuICAgICAgcmV0dXJuIHBhcmFtKHBhcmFtQ2FsbGVkLmVycm9yKTtcbiAgICB9XG5cbiAgICBjYWxsZWRbbmFtZV0gPSBwYXJhbUNhbGxlZCA9IHtcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgbWF0Y2g6IHBhcmFtVmFsLFxuICAgICAgdmFsdWU6IHBhcmFtVmFsXG4gICAgfTtcblxuICAgIHBhcmFtQ2FsbGJhY2soKTtcbiAgfVxuXG4gIC8vIHNpbmdsZSBwYXJhbSBjYWxsYmFja3NcbiAgZnVuY3Rpb24gcGFyYW1DYWxsYmFjayhlcnIpIHtcbiAgICB2YXIgZm4gPSBwYXJhbUNhbGxiYWNrc1twYXJhbUluZGV4KytdO1xuXG4gICAgLy8gc3RvcmUgdXBkYXRlZCB2YWx1ZVxuICAgIHBhcmFtQ2FsbGVkLnZhbHVlID0gcmVxLnBhcmFtc1trZXkubmFtZV07XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICAvLyBzdG9yZSBlcnJvclxuICAgICAgcGFyYW1DYWxsZWQuZXJyb3IgPSBlcnI7XG4gICAgICBwYXJhbShlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZm4pIHJldHVybiBwYXJhbSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZuKHJlcSwgcmVzLCBwYXJhbUNhbGxiYWNrLCBwYXJhbVZhbCwga2V5Lm5hbWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHBhcmFtQ2FsbGJhY2soZSk7XG4gICAgfVxuICB9XG5cbiAgcGFyYW0oKTtcbn07XG5cbi8qKlxuICogVXNlIHRoZSBnaXZlbiBtaWRkbGV3YXJlIGZ1bmN0aW9uLCB3aXRoIG9wdGlvbmFsIHBhdGgsIGRlZmF1bHRpbmcgdG8gXCIvXCIuXG4gKlxuICogVXNlIChsaWtlIGAuYWxsYCkgd2lsbCBydW4gZm9yIGFueSBodHRwIE1FVEhPRCwgYnV0IGl0IHdpbGwgbm90IGFkZFxuICogaGFuZGxlcnMgZm9yIHRob3NlIG1ldGhvZHMgc28gT1BUSU9OUyByZXF1ZXN0cyB3aWxsIG5vdCBjb25zaWRlciBgLnVzZWBcbiAqIGZ1bmN0aW9ucyBldmVuIGlmIHRoZXkgY291bGQgcmVzcG9uZC5cbiAqXG4gKiBUaGUgb3RoZXIgZGlmZmVyZW5jZSBpcyB0aGF0IF9yb3V0ZV8gcGF0aCBpcyBzdHJpcHBlZCBhbmQgbm90IHZpc2libGVcbiAqIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uLiBUaGUgbWFpbiBlZmZlY3Qgb2YgdGhpcyBmZWF0dXJlIGlzIHRoYXQgbW91bnRlZFxuICogaGFuZGxlcnMgY2FuIG9wZXJhdGUgd2l0aG91dCBhbnkgY29kZSBjaGFuZ2VzIHJlZ2FyZGxlc3Mgb2YgdGhlIFwicHJlZml4XCJcbiAqIHBhdGhuYW1lLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5wcm90by51c2UgPSBmdW5jdGlvbiB1c2UoZm4pIHtcbiAgdmFyIG9mZnNldCA9IDA7XG4gIHZhciBwYXRoID0gJy8nO1xuXG4gIC8vIGRlZmF1bHQgcGF0aCB0byAnLydcbiAgLy8gZGlzYW1iaWd1YXRlIHJvdXRlci51c2UoW2ZuXSlcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBhcmcgPSBmbjtcblxuICAgIHdoaWxlIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnLmxlbmd0aCAhPT0gMCkge1xuICAgICAgYXJnID0gYXJnWzBdO1xuICAgIH1cblxuICAgIC8vIGZpcnN0IGFyZyBpcyB0aGUgcGF0aFxuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvZmZzZXQgPSAxO1xuICAgICAgcGF0aCA9IGZuO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjYWxsYmFja3MgPSBmbGF0dGVuKHNsaWNlLmNhbGwoYXJndW1lbnRzLCBvZmZzZXQpKTtcblxuICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JvdXRlci51c2UoKSByZXF1aXJlcyBhIG1pZGRsZXdhcmUgZnVuY3Rpb24nKVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZm4gPSBjYWxsYmFja3NbaV07XG5cbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSb3V0ZXIudXNlKCkgcmVxdWlyZXMgYSBtaWRkbGV3YXJlIGZ1bmN0aW9uIGJ1dCBnb3QgYSAnICsgZ2V0dHlwZShmbikpXG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBtaWRkbGV3YXJlXG4gICAgZGVidWcoJ3VzZSAlbyAlcycsIHBhdGgsIGZuLm5hbWUgfHwgJzxhbm9ueW1vdXM+JylcblxuICAgIHZhciBsYXllciA9IG5ldyBMYXllcihwYXRoLCB7XG4gICAgICBzZW5zaXRpdmU6IHRoaXMuY2FzZVNlbnNpdGl2ZSxcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICBlbmQ6IGZhbHNlXG4gICAgfSwgZm4pO1xuXG4gICAgbGF5ZXIucm91dGUgPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnN0YWNrLnB1c2gobGF5ZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBSb3V0ZSBmb3IgdGhlIGdpdmVuIHBhdGguXG4gKlxuICogRWFjaCByb3V0ZSBjb250YWlucyBhIHNlcGFyYXRlIG1pZGRsZXdhcmUgc3RhY2sgYW5kIFZFUkIgaGFuZGxlcnMuXG4gKlxuICogU2VlIHRoZSBSb3V0ZSBhcGkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiBhZGRpbmcgaGFuZGxlcnNcbiAqIGFuZCBtaWRkbGV3YXJlIHRvIHJvdXRlcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHJldHVybiB7Um91dGV9XG4gKiBAcHVibGljXG4gKi9cblxucHJvdG8ucm91dGUgPSBmdW5jdGlvbiByb3V0ZShwYXRoKSB7XG4gIHZhciByb3V0ZSA9IG5ldyBSb3V0ZShwYXRoKTtcblxuICB2YXIgbGF5ZXIgPSBuZXcgTGF5ZXIocGF0aCwge1xuICAgIHNlbnNpdGl2ZTogdGhpcy5jYXNlU2Vuc2l0aXZlLFxuICAgIHN0cmljdDogdGhpcy5zdHJpY3QsXG4gICAgZW5kOiB0cnVlXG4gIH0sIHJvdXRlLmRpc3BhdGNoLmJpbmQocm91dGUpKTtcblxuICBsYXllci5yb3V0ZSA9IHJvdXRlO1xuXG4gIHRoaXMuc3RhY2sucHVzaChsYXllcik7XG4gIHJldHVybiByb3V0ZTtcbn07XG5cbi8vIGNyZWF0ZSBSb3V0ZXIjVkVSQiBmdW5jdGlvbnNcbm1ldGhvZHMuY29uY2F0KCdhbGwnKS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCl7XG4gIHByb3RvW21ldGhvZF0gPSBmdW5jdGlvbihwYXRoKXtcbiAgICB2YXIgcm91dGUgPSB0aGlzLnJvdXRlKHBhdGgpXG4gICAgcm91dGVbbWV0aG9kXS5hcHBseShyb3V0ZSwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn0pO1xuXG4vLyBhcHBlbmQgbWV0aG9kcyB0byBhIGxpc3Qgb2YgbWV0aG9kc1xuZnVuY3Rpb24gYXBwZW5kTWV0aG9kcyhsaXN0LCBhZGRpdGlvbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFkZGl0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG1ldGhvZCA9IGFkZGl0aW9uW2ldO1xuICAgIGlmIChsaXN0LmluZGV4T2YobWV0aG9kKSA9PT0gLTEpIHtcbiAgICAgIGxpc3QucHVzaChtZXRob2QpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBnZXQgcGF0aG5hbWUgb2YgcmVxdWVzdFxuZnVuY3Rpb24gZ2V0UGF0aG5hbWUocmVxKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlVXJsKHJlcSkucGF0aG5hbWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLy8gR2V0IGdldCBwcm90b2NvbCArIGhvc3QgZm9yIGEgVVJMXG5mdW5jdGlvbiBnZXRQcm90b2hvc3QodXJsKSB7XG4gIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyB8fCB1cmwubGVuZ3RoID09PSAwIHx8IHVybFswXSA9PT0gJy8nKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgdmFyIHNlYXJjaEluZGV4ID0gdXJsLmluZGV4T2YoJz8nKVxuICB2YXIgcGF0aExlbmd0aCA9IHNlYXJjaEluZGV4ICE9PSAtMVxuICAgID8gc2VhcmNoSW5kZXhcbiAgICA6IHVybC5sZW5ndGhcbiAgdmFyIGZxZG5JbmRleCA9IHVybC5zbGljZSgwLCBwYXRoTGVuZ3RoKS5pbmRleE9mKCc6Ly8nKVxuXG4gIHJldHVybiBmcWRuSW5kZXggIT09IC0xXG4gICAgPyB1cmwuc3Vic3RyaW5nKDAsIHVybC5pbmRleE9mKCcvJywgMyArIGZxZG5JbmRleCkpXG4gICAgOiB1bmRlZmluZWRcbn1cblxuLy8gZ2V0IHR5cGUgZm9yIGVycm9yIG1lc3NhZ2VcbmZ1bmN0aW9uIGdldHR5cGUob2JqKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIG9iajtcblxuICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIC8vIGluc3BlY3QgW1tDbGFzc11dIGZvciBvYmplY3RzXG4gIHJldHVybiB0b1N0cmluZy5jYWxsKG9iailcbiAgICAucmVwbGFjZShvYmplY3RSZWdFeHAsICckMScpO1xufVxuXG4vKipcbiAqIE1hdGNoIHBhdGggdG8gYSBsYXllci5cbiAqXG4gKiBAcGFyYW0ge0xheWVyfSBsYXllclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWF0Y2hMYXllcihsYXllciwgcGF0aCkge1xuICB0cnkge1xuICAgIHJldHVybiBsYXllci5tYXRjaChwYXRoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxufVxuXG4vLyBtZXJnZSBwYXJhbXMgd2l0aCBwYXJlbnQgcGFyYW1zXG5mdW5jdGlvbiBtZXJnZVBhcmFtcyhwYXJhbXMsIHBhcmVudCkge1xuICBpZiAodHlwZW9mIHBhcmVudCAhPT0gJ29iamVjdCcgfHwgIXBhcmVudCkge1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvLyBtYWtlIGNvcHkgb2YgcGFyZW50IGZvciBiYXNlXG4gIHZhciBvYmogPSBtaXhpbih7fSwgcGFyZW50KTtcblxuICAvLyBzaW1wbGUgbm9uLW51bWVyaWMgbWVyZ2luZ1xuICBpZiAoISgwIGluIHBhcmFtcykgfHwgISgwIGluIHBhcmVudCkpIHtcbiAgICByZXR1cm4gbWl4aW4ob2JqLCBwYXJhbXMpO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICB2YXIgbyA9IDA7XG5cbiAgLy8gZGV0ZXJtaW5lIG51bWVyaWMgZ2Fwc1xuICB3aGlsZSAoaSBpbiBwYXJhbXMpIHtcbiAgICBpKys7XG4gIH1cblxuICB3aGlsZSAobyBpbiBwYXJlbnQpIHtcbiAgICBvKys7XG4gIH1cblxuICAvLyBvZmZzZXQgbnVtZXJpYyBpbmRpY2VzIGluIHBhcmFtcyBiZWZvcmUgbWVyZ2VcbiAgZm9yIChpLS07IGkgPj0gMDsgaS0tKSB7XG4gICAgcGFyYW1zW2kgKyBvXSA9IHBhcmFtc1tpXTtcblxuICAgIC8vIGNyZWF0ZSBob2xlcyBmb3IgdGhlIG1lcmdlIHdoZW4gbmVjZXNzYXJ5XG4gICAgaWYgKGkgPCBvKSB7XG4gICAgICBkZWxldGUgcGFyYW1zW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhpbihvYmosIHBhcmFtcyk7XG59XG5cbi8vIHJlc3RvcmUgb2JqIHByb3BzIGFmdGVyIGZ1bmN0aW9uXG5mdW5jdGlvbiByZXN0b3JlKGZuLCBvYmopIHtcbiAgdmFyIHByb3BzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAyKTtcbiAgdmFyIHZhbHMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDIpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICBwcm9wc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgdmFsc1tpXSA9IG9ialtwcm9wc1tpXV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIC8vIHJlc3RvcmUgdmFsc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9ialtwcm9wc1tpXV0gPSB2YWxzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG4vLyBzZW5kIGFuIE9QVElPTlMgcmVzcG9uc2VcbmZ1bmN0aW9uIHNlbmRPcHRpb25zUmVzcG9uc2UocmVzLCBvcHRpb25zLCBuZXh0KSB7XG4gIHRyeSB7XG4gICAgdmFyIGJvZHkgPSBvcHRpb25zLmpvaW4oJywnKTtcbiAgICByZXMuc2V0KCdBbGxvdycsIGJvZHkpO1xuICAgIHJlcy5zZW5kKGJvZHkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBuZXh0KGVycik7XG4gIH1cbn1cblxuLy8gd3JhcCBhIGZ1bmN0aW9uXG5mdW5jdGlvbiB3cmFwKG9sZCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByb3h5KCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggKyAxKTtcblxuICAgIGFyZ3NbMF0gPSBvbGQ7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJnc1tpICsgMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgZm4uYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG59XG4iLCAiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJ3NldHByb3RvdHlwZW9mJylcblxuLyoqXG4gKiBJbml0aWFsaXphdGlvbiBtaWRkbGV3YXJlLCBleHBvc2luZyB0aGVcbiAqIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRvIGVhY2ggb3RoZXIsIGFzIHdlbGxcbiAqIGFzIGRlZmF1bHRpbmcgdGhlIFgtUG93ZXJlZC1CeSBoZWFkZXIgZmllbGQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXBwXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuaW5pdCA9IGZ1bmN0aW9uKGFwcCl7XG4gIHJldHVybiBmdW5jdGlvbiBleHByZXNzSW5pdChyZXEsIHJlcywgbmV4dCl7XG4gICAgaWYgKGFwcC5lbmFibGVkKCd4LXBvd2VyZWQtYnknKSkgcmVzLnNldEhlYWRlcignWC1Qb3dlcmVkLUJ5JywgJ0V4cHJlc3MnKTtcbiAgICByZXEucmVzID0gcmVzO1xuICAgIHJlcy5yZXEgPSByZXE7XG4gICAgcmVxLm5leHQgPSBuZXh0O1xuXG4gICAgc2V0UHJvdG90eXBlT2YocmVxLCBhcHAucmVxdWVzdClcbiAgICBzZXRQcm90b3R5cGVPZihyZXMsIGFwcC5yZXNwb25zZSlcblxuICAgIHJlcy5sb2NhbHMgPSByZXMubG9jYWxzIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBuZXh0KCk7XG4gIH07XG59O1xuXG4iLCAiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIG1lcmdlID0gcmVxdWlyZSgndXRpbHMtbWVyZ2UnKVxudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgncGFyc2V1cmwnKTtcbnZhciBxcyA9IHJlcXVpcmUoJ3FzJyk7XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHF1ZXJ5KG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBtZXJnZSh7fSwgb3B0aW9ucylcbiAgdmFyIHF1ZXJ5cGFyc2UgPSBxcy5wYXJzZTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBxdWVyeXBhcnNlID0gb3B0aW9ucztcbiAgICBvcHRzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKG9wdHMgIT09IHVuZGVmaW5lZCAmJiBvcHRzLmFsbG93UHJvdG90eXBlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gYmFjay1jb21wYXQgZm9yIHFzIG1vZHVsZVxuICAgIG9wdHMuYWxsb3dQcm90b3R5cGVzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBxdWVyeShyZXEsIHJlcywgbmV4dCl7XG4gICAgaWYgKCFyZXEucXVlcnkpIHtcbiAgICAgIHZhciB2YWwgPSBwYXJzZVVybChyZXEpLnF1ZXJ5O1xuICAgICAgcmVxLnF1ZXJ5ID0gcXVlcnlwYXJzZSh2YWwsIG9wdHMpO1xuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfTtcbn07XG4iLCAiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2V4cHJlc3M6dmlldycpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkaXJuYW1lID0gcGF0aC5kaXJuYW1lO1xudmFyIGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZTtcbnZhciBleHRuYW1lID0gcGF0aC5leHRuYW1lO1xudmFyIGpvaW4gPSBwYXRoLmpvaW47XG52YXIgcmVzb2x2ZSA9IHBhdGgucmVzb2x2ZTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpZXc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgVmlld2Agd2l0aCB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogICAtIGBkZWZhdWx0RW5naW5lYCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBlbmdpbmUgbmFtZVxuICogICAtIGBlbmdpbmVzYCB0ZW1wbGF0ZSBlbmdpbmUgcmVxdWlyZSgpIGNhY2hlXG4gKiAgIC0gYHJvb3RgIHJvb3QgcGF0aCBmb3IgdmlldyBsb29rdXBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBWaWV3KG5hbWUsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHRoaXMuZGVmYXVsdEVuZ2luZSA9IG9wdHMuZGVmYXVsdEVuZ2luZTtcbiAgdGhpcy5leHQgPSBleHRuYW1lKG5hbWUpO1xuICB0aGlzLm5hbWUgPSBuYW1lO1xuICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG5cbiAgaWYgKCF0aGlzLmV4dCAmJiAhdGhpcy5kZWZhdWx0RW5naW5lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBkZWZhdWx0IGVuZ2luZSB3YXMgc3BlY2lmaWVkIGFuZCBubyBleHRlbnNpb24gd2FzIHByb3ZpZGVkLicpO1xuICB9XG5cbiAgdmFyIGZpbGVOYW1lID0gbmFtZTtcblxuICBpZiAoIXRoaXMuZXh0KSB7XG4gICAgLy8gZ2V0IGV4dGVuc2lvbiBmcm9tIGRlZmF1bHQgZW5naW5lIG5hbWVcbiAgICB0aGlzLmV4dCA9IHRoaXMuZGVmYXVsdEVuZ2luZVswXSAhPT0gJy4nXG4gICAgICA/ICcuJyArIHRoaXMuZGVmYXVsdEVuZ2luZVxuICAgICAgOiB0aGlzLmRlZmF1bHRFbmdpbmU7XG5cbiAgICBmaWxlTmFtZSArPSB0aGlzLmV4dDtcbiAgfVxuXG4gIGlmICghb3B0cy5lbmdpbmVzW3RoaXMuZXh0XSkge1xuICAgIC8vIGxvYWQgZW5naW5lXG4gICAgdmFyIG1vZCA9IHRoaXMuZXh0LnNsaWNlKDEpXG4gICAgZGVidWcoJ3JlcXVpcmUgXCIlc1wiJywgbW9kKVxuXG4gICAgLy8gZGVmYXVsdCBlbmdpbmUgZXhwb3J0XG4gICAgdmFyIGZuID0gcmVxdWlyZShtb2QpLl9fZXhwcmVzc1xuXG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2R1bGUgXCInICsgbW9kICsgJ1wiIGRvZXMgbm90IHByb3ZpZGUgYSB2aWV3IGVuZ2luZS4nKVxuICAgIH1cblxuICAgIG9wdHMuZW5naW5lc1t0aGlzLmV4dF0gPSBmblxuICB9XG5cbiAgLy8gc3RvcmUgbG9hZGVkIGVuZ2luZVxuICB0aGlzLmVuZ2luZSA9IG9wdHMuZW5naW5lc1t0aGlzLmV4dF07XG5cbiAgLy8gbG9va3VwIHBhdGhcbiAgdGhpcy5wYXRoID0gdGhpcy5sb29rdXAoZmlsZU5hbWUpO1xufVxuXG4vKipcbiAqIExvb2t1cCB2aWV3IGJ5IHRoZSBnaXZlbiBgbmFtZWBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHByaXZhdGVcbiAqL1xuXG5WaWV3LnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbiBsb29rdXAobmFtZSkge1xuICB2YXIgcGF0aDtcbiAgdmFyIHJvb3RzID0gW10uY29uY2F0KHRoaXMucm9vdCk7XG5cbiAgZGVidWcoJ2xvb2t1cCBcIiVzXCInLCBuYW1lKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aCAmJiAhcGF0aDsgaSsrKSB7XG4gICAgdmFyIHJvb3QgPSByb290c1tpXTtcblxuICAgIC8vIHJlc29sdmUgdGhlIHBhdGhcbiAgICB2YXIgbG9jID0gcmVzb2x2ZShyb290LCBuYW1lKTtcbiAgICB2YXIgZGlyID0gZGlybmFtZShsb2MpO1xuICAgIHZhciBmaWxlID0gYmFzZW5hbWUobG9jKTtcblxuICAgIC8vIHJlc29sdmUgdGhlIGZpbGVcbiAgICBwYXRoID0gdGhpcy5yZXNvbHZlKGRpciwgZmlsZSk7XG4gIH1cblxuICByZXR1cm4gcGF0aDtcbn07XG5cbi8qKlxuICogUmVuZGVyIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5cblZpZXcucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcihvcHRpb25zLCBjYWxsYmFjaykge1xuICBkZWJ1ZygncmVuZGVyIFwiJXNcIicsIHRoaXMucGF0aCk7XG4gIHRoaXMuZW5naW5lKHRoaXMucGF0aCwgb3B0aW9ucywgY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBmaWxlIHdpdGhpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlXG4gKiBAcHJpdmF0ZVxuICovXG5cblZpZXcucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKGRpciwgZmlsZSkge1xuICB2YXIgZXh0ID0gdGhpcy5leHQ7XG5cbiAgLy8gPHBhdGg+LjxleHQ+XG4gIHZhciBwYXRoID0gam9pbihkaXIsIGZpbGUpO1xuICB2YXIgc3RhdCA9IHRyeVN0YXQocGF0aCk7XG5cbiAgaWYgKHN0YXQgJiYgc3RhdC5pc0ZpbGUoKSkge1xuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgLy8gPHBhdGg+L2luZGV4LjxleHQ+XG4gIHBhdGggPSBqb2luKGRpciwgYmFzZW5hbWUoZmlsZSwgZXh0KSwgJ2luZGV4JyArIGV4dCk7XG4gIHN0YXQgPSB0cnlTdGF0KHBhdGgpO1xuXG4gIGlmIChzdGF0ICYmIHN0YXQuaXNGaWxlKCkpIHtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm4gYSBzdGF0LCBtYXliZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHJldHVybiB7ZnMuU3RhdHN9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRyeVN0YXQocGF0aCkge1xuICBkZWJ1Zygnc3RhdCBcIiVzXCInLCBwYXRoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBmcy5zdGF0U3luYyhwYXRoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsICIvKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEJ1ZmZlci5wcm90b3R5cGUpXG5cbi8vIENvcHkgc3RhdGljIG1ldGhvZHMgZnJvbSBCdWZmZXJcbmNvcHlQcm9wcyhCdWZmZXIsIFNhZmVCdWZmZXIpXG5cblNhZmVCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBidWYuZmlsbCgwKVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKHNpemUpXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKVxufVxuIiwgIi8qIVxuICogY29udGVudC1kaXNwb3NpdGlvblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50RGlzcG9zaXRpb25cbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcGFyc2VcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgYmFzZW5hbWUgPSByZXF1aXJlKCdwYXRoJykuYmFzZW5hbWVcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBub24gYXR0ci1jaGFyLCAqYWZ0ZXIqIGVuY29kZVVSSUNvbXBvbmVudCAoaS5lLiBub3QgaW5jbHVkaW5nIFwiJVwiKVxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRU5DT0RFX1VSTF9BVFRSX0NIQVJfUkVHRVhQID0gL1tcXHgwMC1cXHgyMFwiJygpKiwvOjs8PT4/QFtcXFxcXFxde31cXHg3Zl0vZyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggcGVyY2VudCBlbmNvZGluZyBlc2NhcGUuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBIRVhfRVNDQVBFX1JFR0VYUCA9IC8lWzAtOUEtRmEtZl17Mn0vXG52YXIgSEVYX0VTQ0FQRV9SRVBMQUNFX1JFR0VYUCA9IC8lKFswLTlBLUZhLWZdezJ9KS9nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIG5vbi1sYXRpbjEgY2hhcmFjdGVycy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIE5PTl9MQVRJTjFfUkVHRVhQID0gL1teXFx4MjAtXFx4N2VcXHhhMC1cXHhmZl0vZ1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBxdW90ZWQtcGFpciBpbiBSRkMgMjYxNlxuICpcbiAqIHF1b3RlZC1wYWlyID0gXCJcXFwiIENIQVJcbiAqIENIQVIgICAgICAgID0gPGFueSBVUy1BU0NJSSBjaGFyYWN0ZXIgKG9jdGV0cyAwIC0gMTI3KT5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFFFU0NfUkVHRVhQID0gL1xcXFwoW1xcdTAwMDAtXFx1MDA3Zl0pL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNoYXJzIHRoYXQgbXVzdCBiZSBxdW90ZWQtcGFpciBpbiBSRkMgMjYxNlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgUVVPVEVfUkVHRVhQID0gLyhbXFxcXFwiXSkvZ1xuXG4vKipcbiAqIFJlZ0V4cCBmb3IgdmFyaW91cyBSRkMgMjYxNiBncmFtbWFyXG4gKlxuICogcGFyYW1ldGVyICAgICA9IHRva2VuIFwiPVwiICggdG9rZW4gfCBxdW90ZWQtc3RyaW5nIClcbiAqIHRva2VuICAgICAgICAgPSAxKjxhbnkgQ0hBUiBleGNlcHQgQ1RMcyBvciBzZXBhcmF0b3JzPlxuICogc2VwYXJhdG9ycyAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAqICAgICAgICAgICAgICAgfCBcIixcIiB8IFwiO1wiIHwgXCI6XCIgfCBcIlxcXCIgfCA8XCI+XG4gKiAgICAgICAgICAgICAgIHwgXCIvXCIgfCBcIltcIiB8IFwiXVwiIHwgXCI/XCIgfCBcIj1cIlxuICogICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKiBxdW90ZWQtc3RyaW5nID0gKCA8XCI+ICoocWR0ZXh0IHwgcXVvdGVkLXBhaXIgKSA8XCI+IClcbiAqIHFkdGV4dCAgICAgICAgPSA8YW55IFRFWFQgZXhjZXB0IDxcIj4+XG4gKiBxdW90ZWQtcGFpciAgID0gXCJcXFwiIENIQVJcbiAqIENIQVIgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuICogVEVYVCAgICAgICAgICA9IDxhbnkgT0NURVQgZXhjZXB0IENUTHMsIGJ1dCBpbmNsdWRpbmcgTFdTPlxuICogTFdTICAgICAgICAgICA9IFtDUkxGXSAxKiggU1AgfCBIVCApXG4gKiBDUkxGICAgICAgICAgID0gQ1IgTEZcbiAqIENSICAgICAgICAgICAgPSA8VVMtQVNDSUkgQ1IsIGNhcnJpYWdlIHJldHVybiAoMTMpPlxuICogTEYgICAgICAgICAgICA9IDxVUy1BU0NJSSBMRiwgbGluZWZlZWQgKDEwKT5cbiAqIFNQICAgICAgICAgICAgPSA8VVMtQVNDSUkgU1AsIHNwYWNlICgzMik+XG4gKiBIVCAgICAgICAgICAgID0gPFVTLUFTQ0lJIEhULCBob3Jpem9udGFsLXRhYiAoOSk+XG4gKiBDVEwgICAgICAgICAgID0gPGFueSBVUy1BU0NJSSBjb250cm9sIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAzMSkgYW5kIERFTCAoMTI3KT5cbiAqIE9DVEVUICAgICAgICAgPSA8YW55IDgtYml0IHNlcXVlbmNlIG9mIGRhdGE+XG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBQQVJBTV9SRUdFWFAgPSAvO1tcXHgwOVxceDIwXSooWyEjJCUmJyorLjAtOUEtWl5fYGEtenx+LV0rKVtcXHgwOVxceDIwXSo9W1xceDA5XFx4MjBdKihcIig/OltcXHgyMCFcXHgyMy1cXHg1YlxceDVkLVxceDdlXFx4ODAtXFx4ZmZdfFxcXFxbXFx4MjAtXFx4N2VdKSpcInxbISMkJSYnKisuMC05QS1aXl9gYS16fH4tXSspW1xceDA5XFx4MjBdKi9nIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxudmFyIFRFWFRfUkVHRVhQID0gL15bXFx4MjAtXFx4N2VcXHg4MC1cXHhmZl0rJC9cbnZhciBUT0tFTl9SRUdFWFAgPSAvXlshIyQlJicqKy4wLTlBLVpeX2BhLXp8fi1dKyQvXG5cbi8qKlxuICogUmVnRXhwIGZvciB2YXJpb3VzIFJGQyA1OTg3IGdyYW1tYXJcbiAqXG4gKiBleHQtdmFsdWUgICAgID0gY2hhcnNldCAgXCInXCIgWyBsYW5ndWFnZSBdIFwiJ1wiIHZhbHVlLWNoYXJzXG4gKiBjaGFyc2V0ICAgICAgID0gXCJVVEYtOFwiIC8gXCJJU08tODg1OS0xXCIgLyBtaW1lLWNoYXJzZXRcbiAqIG1pbWUtY2hhcnNldCAgPSAxKm1pbWUtY2hhcnNldGNcbiAqIG1pbWUtY2hhcnNldGMgPSBBTFBIQSAvIERJR0lUXG4gKiAgICAgICAgICAgICAgIC8gXCIhXCIgLyBcIiNcIiAvIFwiJFwiIC8gXCIlXCIgLyBcIiZcIlxuICogICAgICAgICAgICAgICAvIFwiK1wiIC8gXCItXCIgLyBcIl5cIiAvIFwiX1wiIC8gXCJgXCJcbiAqICAgICAgICAgICAgICAgLyBcIntcIiAvIFwifVwiIC8gXCJ+XCJcbiAqIGxhbmd1YWdlICAgICAgPSAoIDIqM0FMUEhBIFsgZXh0bGFuZyBdIClcbiAqICAgICAgICAgICAgICAgLyA0QUxQSEFcbiAqICAgICAgICAgICAgICAgLyA1KjhBTFBIQVxuICogZXh0bGFuZyAgICAgICA9ICozKCBcIi1cIiAzQUxQSEEgKVxuICogdmFsdWUtY2hhcnMgICA9ICooIHBjdC1lbmNvZGVkIC8gYXR0ci1jaGFyIClcbiAqIHBjdC1lbmNvZGVkICAgPSBcIiVcIiBIRVhESUcgSEVYRElHXG4gKiBhdHRyLWNoYXIgICAgID0gQUxQSEEgLyBESUdJVFxuICogICAgICAgICAgICAgICAvIFwiIVwiIC8gXCIjXCIgLyBcIiRcIiAvIFwiJlwiIC8gXCIrXCIgLyBcIi1cIiAvIFwiLlwiXG4gKiAgICAgICAgICAgICAgIC8gXCJeXCIgLyBcIl9cIiAvIFwiYFwiIC8gXCJ8XCIgLyBcIn5cIlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRVhUX1ZBTFVFX1JFR0VYUCA9IC9eKFtBLVphLXowLTkhIyQlJitcXC1eX2B7fX5dKyknKD86W0EtWmEtel17MiwzfSg/Oi1bQS1aYS16XXszfSl7MCwzfXxbQS1aYS16XXs0LDh9fCknKCg/OiVbMC05QS1GYS1mXXsyfXxbQS1aYS16MC05ISMkJisuXl9gfH4tXSkrKSQvXG5cbi8qKlxuICogUmVnRXhwIGZvciB2YXJpb3VzIFJGQyA2MjY2IGdyYW1tYXJcbiAqXG4gKiBkaXNwb3NpdGlvbi10eXBlID0gXCJpbmxpbmVcIiB8IFwiYXR0YWNobWVudFwiIHwgZGlzcC1leHQtdHlwZVxuICogZGlzcC1leHQtdHlwZSAgICA9IHRva2VuXG4gKiBkaXNwb3NpdGlvbi1wYXJtID0gZmlsZW5hbWUtcGFybSB8IGRpc3AtZXh0LXBhcm1cbiAqIGZpbGVuYW1lLXBhcm0gICAgPSBcImZpbGVuYW1lXCIgXCI9XCIgdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgfCBcImZpbGVuYW1lKlwiIFwiPVwiIGV4dC12YWx1ZVxuICogZGlzcC1leHQtcGFybSAgICA9IHRva2VuIFwiPVwiIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgIHwgZXh0LXRva2VuIFwiPVwiIGV4dC12YWx1ZVxuICogZXh0LXRva2VuICAgICAgICA9IDx0aGUgY2hhcmFjdGVycyBpbiB0b2tlbiwgZm9sbG93ZWQgYnkgXCIqXCI+XG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBESVNQT1NJVElPTl9UWVBFX1JFR0VYUCA9IC9eKFshIyQlJicqKy4wLTlBLVpeX2BhLXp8fi1dKylbXFx4MDlcXHgyMF0qKD86JHw7KS8gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG5cbi8qKlxuICogQ3JlYXRlIGFuIGF0dGFjaG1lbnQgQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtmaWxlbmFtZV1cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy50eXBlPWF0dGFjaG1lbnRdXG4gKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSBbb3B0aW9ucy5mYWxsYmFjaz10cnVlXVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNvbnRlbnREaXNwb3NpdGlvbiAoZmlsZW5hbWUsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9XG5cbiAgLy8gZ2V0IHR5cGVcbiAgdmFyIHR5cGUgPSBvcHRzLnR5cGUgfHwgJ2F0dGFjaG1lbnQnXG5cbiAgLy8gZ2V0IHBhcmFtZXRlcnNcbiAgdmFyIHBhcmFtcyA9IGNyZWF0ZXBhcmFtcyhmaWxlbmFtZSwgb3B0cy5mYWxsYmFjaylcblxuICAvLyBmb3JtYXQgaW50byBzdHJpbmdcbiAgcmV0dXJuIGZvcm1hdChuZXcgQ29udGVudERpc3Bvc2l0aW9uKHR5cGUsIHBhcmFtcykpXG59XG5cbi8qKlxuICogQ3JlYXRlIHBhcmFtZXRlcnMgb2JqZWN0IGZyb20gZmlsZW5hbWUgYW5kIGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmlsZW5hbWVdXG4gKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSBbZmFsbGJhY2s9dHJ1ZV1cbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlcGFyYW1zIChmaWxlbmFtZSwgZmFsbGJhY2spIHtcbiAgaWYgKGZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBwYXJhbXMgPSB7fVxuXG4gIGlmICh0eXBlb2YgZmlsZW5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZW5hbWUgbXVzdCBiZSBhIHN0cmluZycpXG4gIH1cblxuICAvLyBmYWxsYmFjayBkZWZhdWx0cyB0byB0cnVlXG4gIGlmIChmYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZmFsbGJhY2sgPSB0cnVlXG4gIH1cblxuICBpZiAodHlwZW9mIGZhbGxiYWNrICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgZmFsbGJhY2sgIT09ICdib29sZWFuJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZhbGxiYWNrIG11c3QgYmUgYSBzdHJpbmcgb3IgYm9vbGVhbicpXG4gIH1cblxuICBpZiAodHlwZW9mIGZhbGxiYWNrID09PSAnc3RyaW5nJyAmJiBOT05fTEFUSU4xX1JFR0VYUC50ZXN0KGZhbGxiYWNrKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZhbGxiYWNrIG11c3QgYmUgSVNPLTg4NTktMSBzdHJpbmcnKVxuICB9XG5cbiAgLy8gcmVzdHJpY3QgdG8gZmlsZSBiYXNlIG5hbWVcbiAgdmFyIG5hbWUgPSBiYXNlbmFtZShmaWxlbmFtZSlcblxuICAvLyBkZXRlcm1pbmUgaWYgbmFtZSBpcyBzdWl0YWJsZSBmb3IgcXVvdGVkIHN0cmluZ1xuICB2YXIgaXNRdW90ZWRTdHJpbmcgPSBURVhUX1JFR0VYUC50ZXN0KG5hbWUpXG5cbiAgLy8gZ2VuZXJhdGUgZmFsbGJhY2sgbmFtZVxuICB2YXIgZmFsbGJhY2tOYW1lID0gdHlwZW9mIGZhbGxiYWNrICE9PSAnc3RyaW5nJ1xuICAgID8gZmFsbGJhY2sgJiYgZ2V0bGF0aW4xKG5hbWUpXG4gICAgOiBiYXNlbmFtZShmYWxsYmFjaylcbiAgdmFyIGhhc0ZhbGxiYWNrID0gdHlwZW9mIGZhbGxiYWNrTmFtZSA9PT0gJ3N0cmluZycgJiYgZmFsbGJhY2tOYW1lICE9PSBuYW1lXG5cbiAgLy8gc2V0IGV4dGVuZGVkIGZpbGVuYW1lIHBhcmFtZXRlclxuICBpZiAoaGFzRmFsbGJhY2sgfHwgIWlzUXVvdGVkU3RyaW5nIHx8IEhFWF9FU0NBUEVfUkVHRVhQLnRlc3QobmFtZSkpIHtcbiAgICBwYXJhbXNbJ2ZpbGVuYW1lKiddID0gbmFtZVxuICB9XG5cbiAgLy8gc2V0IGZpbGVuYW1lIHBhcmFtZXRlclxuICBpZiAoaXNRdW90ZWRTdHJpbmcgfHwgaGFzRmFsbGJhY2spIHtcbiAgICBwYXJhbXMuZmlsZW5hbWUgPSBoYXNGYWxsYmFja1xuICAgICAgPyBmYWxsYmFja05hbWVcbiAgICAgIDogbmFtZVxuICB9XG5cbiAgcmV0dXJuIHBhcmFtc1xufVxuXG4vKipcbiAqIEZvcm1hdCBvYmplY3QgdG8gQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHBhcmFtIHtzdHJpbmd9IG9iai50eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gW29iai5wYXJhbWV0ZXJzXVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXQgKG9iaikge1xuICB2YXIgcGFyYW1ldGVycyA9IG9iai5wYXJhbWV0ZXJzXG4gIHZhciB0eXBlID0gb2JqLnR5cGVcblxuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnIHx8ICFUT0tFTl9SRUdFWFAudGVzdCh0eXBlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgdHlwZScpXG4gIH1cblxuICAvLyBzdGFydCB3aXRoIG5vcm1hbGl6ZWQgdHlwZVxuICB2YXIgc3RyaW5nID0gU3RyaW5nKHR5cGUpLnRvTG93ZXJDYXNlKClcblxuICAvLyBhcHBlbmQgcGFyYW1ldGVyc1xuICBpZiAocGFyYW1ldGVycyAmJiB0eXBlb2YgcGFyYW1ldGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgcGFyYW1cbiAgICB2YXIgcGFyYW1zID0gT2JqZWN0LmtleXMocGFyYW1ldGVycykuc29ydCgpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFyYW0gPSBwYXJhbXNbaV1cblxuICAgICAgdmFyIHZhbCA9IHBhcmFtLnN1YnN0cigtMSkgPT09ICcqJ1xuICAgICAgICA/IHVzdHJpbmcocGFyYW1ldGVyc1twYXJhbV0pXG4gICAgICAgIDogcXN0cmluZyhwYXJhbWV0ZXJzW3BhcmFtXSlcblxuICAgICAgc3RyaW5nICs9ICc7ICcgKyBwYXJhbSArICc9JyArIHZhbFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHJpbmdcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBSRkMgNTk4NyBmaWVsZCB2YWx1ZSAoZ3JhY2VmdWxseSkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBkZWNvZGVmaWVsZCAoc3RyKSB7XG4gIHZhciBtYXRjaCA9IEVYVF9WQUxVRV9SRUdFWFAuZXhlYyhzdHIpXG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgZXh0ZW5kZWQgZmllbGQgdmFsdWUnKVxuICB9XG5cbiAgdmFyIGNoYXJzZXQgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gIHZhciBlbmNvZGVkID0gbWF0Y2hbMl1cbiAgdmFyIHZhbHVlXG5cbiAgLy8gdG8gYmluYXJ5IHN0cmluZ1xuICB2YXIgYmluYXJ5ID0gZW5jb2RlZC5yZXBsYWNlKEhFWF9FU0NBUEVfUkVQTEFDRV9SRUdFWFAsIHBkZWNvZGUpXG5cbiAgc3dpdGNoIChjaGFyc2V0KSB7XG4gICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgICB2YWx1ZSA9IGdldGxhdGluMShiaW5hcnkpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIHZhbHVlID0gQnVmZmVyLmZyb20oYmluYXJ5LCAnYmluYXJ5JykudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5zdXBwb3J0ZWQgY2hhcnNldCBpbiBleHRlbmRlZCBmaWVsZCcpXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBHZXQgSVNPLTg4NTktMSB2ZXJzaW9uIG9mIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldGxhdGluMSAodmFsKSB7XG4gIC8vIHNpbXBsZSBVbmljb2RlIC0+IElTTy04ODU5LTEgdHJhbnNmb3JtYXRpb25cbiAgcmV0dXJuIFN0cmluZyh2YWwpLnJlcGxhY2UoTk9OX0xBVElOMV9SRUdFWFAsICc/Jylcbn1cblxuLyoqXG4gKiBQYXJzZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7b2JqZWN0fVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHBhcnNlIChzdHJpbmcpIHtcbiAgaWYgKCFzdHJpbmcgfHwgdHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzdHJpbmcgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgdmFyIG1hdGNoID0gRElTUE9TSVRJT05fVFlQRV9SRUdFWFAuZXhlYyhzdHJpbmcpXG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgdHlwZSBmb3JtYXQnKVxuICB9XG5cbiAgLy8gbm9ybWFsaXplIHR5cGVcbiAgdmFyIGluZGV4ID0gbWF0Y2hbMF0ubGVuZ3RoXG4gIHZhciB0eXBlID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuXG4gIHZhciBrZXlcbiAgdmFyIG5hbWVzID0gW11cbiAgdmFyIHBhcmFtcyA9IHt9XG4gIHZhciB2YWx1ZVxuXG4gIC8vIGNhbGN1bGF0ZSBpbmRleCB0byBzdGFydCBhdFxuICBpbmRleCA9IFBBUkFNX1JFR0VYUC5sYXN0SW5kZXggPSBtYXRjaFswXS5zdWJzdHIoLTEpID09PSAnOydcbiAgICA/IGluZGV4IC0gMVxuICAgIDogaW5kZXhcblxuICAvLyBtYXRjaCBwYXJhbWV0ZXJzXG4gIHdoaWxlICgobWF0Y2ggPSBQQVJBTV9SRUdFWFAuZXhlYyhzdHJpbmcpKSkge1xuICAgIGlmIChtYXRjaC5pbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIGZvcm1hdCcpXG4gICAgfVxuXG4gICAgaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAga2V5ID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIHZhbHVlID0gbWF0Y2hbMl1cblxuICAgIGlmIChuYW1lcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGR1cGxpY2F0ZSBwYXJhbWV0ZXInKVxuICAgIH1cblxuICAgIG5hbWVzLnB1c2goa2V5KVxuXG4gICAgaWYgKGtleS5pbmRleE9mKCcqJykgKyAxID09PSBrZXkubGVuZ3RoKSB7XG4gICAgICAvLyBkZWNvZGUgZXh0ZW5kZWQgdmFsdWVcbiAgICAgIGtleSA9IGtleS5zbGljZSgwLCAtMSlcbiAgICAgIHZhbHVlID0gZGVjb2RlZmllbGQodmFsdWUpXG5cbiAgICAgIC8vIG92ZXJ3cml0ZSBleGlzdGluZyB2YWx1ZVxuICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtc1trZXldID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAodmFsdWVbMF0gPT09ICdcIicpIHtcbiAgICAgIC8vIHJlbW92ZSBxdW90ZXMgYW5kIGVzY2FwZXNcbiAgICAgIHZhbHVlID0gdmFsdWVcbiAgICAgICAgLnN1YnN0cigxLCB2YWx1ZS5sZW5ndGggLSAyKVxuICAgICAgICAucmVwbGFjZShRRVNDX1JFR0VYUCwgJyQxJylcbiAgICB9XG5cbiAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gIH1cblxuICBpZiAoaW5kZXggIT09IC0xICYmIGluZGV4ICE9PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgZm9ybWF0JylcbiAgfVxuXG4gIHJldHVybiBuZXcgQ29udGVudERpc3Bvc2l0aW9uKHR5cGUsIHBhcmFtcylcbn1cblxuLyoqXG4gKiBQZXJjZW50IGRlY29kZSBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtzdHJpbmd9IGhleFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwZGVjb2RlIChzdHIsIGhleCkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSlcbn1cblxuLyoqXG4gKiBQZXJjZW50IGVuY29kZSBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGVuY29kZSAoY2hhcikge1xuICByZXR1cm4gJyUnICsgU3RyaW5nKGNoYXIpXG4gICAgLmNoYXJDb2RlQXQoMClcbiAgICAudG9TdHJpbmcoMTYpXG4gICAgLnRvVXBwZXJDYXNlKClcbn1cblxuLyoqXG4gKiBRdW90ZSBhIHN0cmluZyBmb3IgSFRUUC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHFzdHJpbmcgKHZhbCkge1xuICB2YXIgc3RyID0gU3RyaW5nKHZhbClcblxuICByZXR1cm4gJ1wiJyArIHN0ci5yZXBsYWNlKFFVT1RFX1JFR0VYUCwgJ1xcXFwkMScpICsgJ1wiJ1xufVxuXG4vKipcbiAqIEVuY29kZSBhIFVuaWNvZGUgc3RyaW5nIGZvciBIVFRQIChSRkMgNTk4NykuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB1c3RyaW5nICh2YWwpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyh2YWwpXG5cbiAgLy8gcGVyY2VudCBlbmNvZGUgYXMgVVRGLThcbiAgdmFyIGVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyKVxuICAgIC5yZXBsYWNlKEVOQ09ERV9VUkxfQVRUUl9DSEFSX1JFR0VYUCwgcGVuY29kZSlcblxuICByZXR1cm4gJ1VURi04XFwnXFwnJyArIGVuY29kZWRcbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgcGFyc2VkIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyIGZvciB2OCBvcHRpbWl6YXRpb25cbiAqXG4gKiBAcHVibGljXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHBhcmFtZXRlcnNcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIENvbnRlbnREaXNwb3NpdGlvbiAodHlwZSwgcGFyYW1ldGVycykge1xuICB0aGlzLnR5cGUgPSB0eXBlXG4gIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnNcbn1cbiIsICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oKD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICBpZiAobXMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtcyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgcmV0dXJuIHBsdXJhbChtcywgZCwgJ2RheScpIHx8XG4gICAgcGx1cmFsKG1zLCBoLCAnaG91cicpIHx8XG4gICAgcGx1cmFsKG1zLCBtLCAnbWludXRlJykgfHxcbiAgICBwbHVyYWwobXMsIHMsICdzZWNvbmQnKSB8fFxuICAgIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBuLCBuYW1lKSB7XG4gIGlmIChtcyA8IG4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1zIDwgbiAqIDEuNSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKG1zIC8gbikgKyAnICcgKyBuYW1lO1xuICB9XG4gIHJldHVybiBNYXRoLmNlaWwobXMgLyBuKSArICcgJyArIG5hbWUgKyAncyc7XG59XG4iLCAiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWdbJ2RlZmF1bHQnXSA9IGNyZWF0ZURlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG4gKi9cblxuZXhwb3J0cy5uYW1lcyA9IFtdO1xuZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cbiAqXG4gKiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzID0ge307XG5cbi8qKlxuICogUHJldmlvdXMgbG9nIHRpbWVzdGFtcC5cbiAqL1xuXG52YXIgcHJldlRpbWU7XG5cbi8qKlxuICogU2VsZWN0IGEgY29sb3IuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcbiAgdmFyIGhhc2ggPSAwLCBpO1xuXG4gIGZvciAoaSBpbiBuYW1lc3BhY2UpIHtcbiAgICBoYXNoICA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGV4cG9ydHMuY29sb3JzLmxlbmd0aF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXG4gIGZ1bmN0aW9uIGRlYnVnKCkge1xuICAgIC8vIGRpc2FibGVkP1xuICAgIGlmICghZGVidWcuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgdmFyIHNlbGYgPSBkZWJ1ZztcblxuICAgIC8vIHNldCBgZGlmZmAgdGltZXN0YW1wXG4gICAgdmFyIGN1cnIgPSArbmV3IERhdGUoKTtcbiAgICB2YXIgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuICAgIHNlbGYuZGlmZiA9IG1zO1xuICAgIHNlbGYucHJldiA9IHByZXZUaW1lO1xuICAgIHNlbGYuY3VyciA9IGN1cnI7XG4gICAgcHJldlRpbWUgPSBjdXJyO1xuXG4gICAgLy8gdHVybiB0aGUgYGFyZ3VtZW50c2AgaW50byBhIHByb3BlciBBcnJheVxuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBhcmdzWzBdID0gZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7XG5cbiAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhcmdzWzBdKSB7XG4gICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuICAgICAgYXJncy51bnNoaWZ0KCclTycpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgZnVuY3Rpb24obWF0Y2gsIGZvcm1hdCkge1xuICAgICAgLy8gaWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuICAgICAgaWYgKG1hdGNoID09PSAnJSUnKSByZXR1cm4gbWF0Y2g7XG4gICAgICBpbmRleCsrO1xuICAgICAgdmFyIGZvcm1hdHRlciA9IGV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIHZhbCA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICBtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cbiAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICAvLyBhcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuICAgIGV4cG9ydHMuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG4gICAgdmFyIGxvZ0ZuID0gZGVidWcubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgbG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cblxuICBkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIGRlYnVnLmVuYWJsZWQgPSBleHBvcnRzLmVuYWJsZWQobmFtZXNwYWNlKTtcbiAgZGVidWcudXNlQ29sb3JzID0gZXhwb3J0cy51c2VDb2xvcnMoKTtcbiAgZGVidWcuY29sb3IgPSBzZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXG4gIC8vIGVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5pbml0KSB7XG4gICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcbiAgfVxuXG4gIHJldHVybiBkZWJ1Zztcbn1cblxuLyoqXG4gKiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG4gKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuICBleHBvcnRzLm5hbWVzID0gW107XG4gIGV4cG9ydHMuc2tpcHMgPSBbXTtcblxuICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3NcbiAgICBuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcbiAgICBpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG4gICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICBleHBvcnRzLmVuYWJsZSgnJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcbiAgdmFyIGksIGxlbjtcbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcbiAgcmV0dXJuIHZhbDtcbn1cbiIsICIvKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kZWJ1ZycpO1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWVcbiAgICAgICAgICAgICAgICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWUuc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgPyBjaHJvbWUuc3RvcmFnZS5sb2NhbFxuICAgICAgICAgICAgICAgICAgOiBsb2NhbHN0b3JhZ2UoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG4gICdsaWdodHNlYWdyZWVuJyxcbiAgJ2ZvcmVzdGdyZWVuJyxcbiAgJ2dvbGRlbnJvZCcsXG4gICdkb2RnZXJibHVlJyxcbiAgJ2RhcmtvcmNoaWQnLFxuICAnY3JpbXNvbidcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuICAvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG4gIC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG4gIC8vIGV4cGxpY2l0bHlcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmIHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGlzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG4gIC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG4gIHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuICAgIC8vIGlzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuICAgIC8vIGlzIGZpcmVmb3ggPj0gdjMxP1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuICAgIC8vIGRvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uKHYpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnIubWVzc2FnZTtcbiAgfVxufTtcblxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuICB2YXIgdXNlQ29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cbiAgYXJnc1swXSA9ICh1c2VDb2xvcnMgPyAnJWMnIDogJycpXG4gICAgKyB0aGlzLm5hbWVzcGFjZVxuICAgICsgKHVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKVxuICAgICsgYXJnc1swXVxuICAgICsgKHVzZUNvbG9ycyA/ICclYyAnIDogJyAnKVxuICAgICsgJysnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG4gIGlmICghdXNlQ29sb3JzKSByZXR1cm47XG5cbiAgdmFyIGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuICBhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKVxuXG4gIC8vIHRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG4gIC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cbiAgLy8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0QyA9IDA7XG4gIGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIGlmICgnJSUnID09PSBtYXRjaCkgcmV0dXJuO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCclYycgPT09IG1hdGNoKSB7XG4gICAgICAvLyB3ZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcbiAgICAgIC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG4gICAgICBsYXN0QyA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgYXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUubG9nKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5sb2dgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgLy8gdGhpcyBoYWNrZXJ5IGlzIHJlcXVpcmVkIGZvciBJRTgvOSwgd2hlcmVcbiAgLy8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24gZG9lc24ndCBoYXZlICdhcHBseSdcbiAgcmV0dXJuICdvYmplY3QnID09PSB0eXBlb2YgY29uc29sZVxuICAgICYmIGNvbnNvbGUubG9nXG4gICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICB0cnkge1xuICAgIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UuZGVidWcgPSBuYW1lc3BhY2VzO1xuICAgIH1cbiAgfSBjYXRjaChlKSB7fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIHIgPSBleHBvcnRzLnN0b3JhZ2UuZGVidWc7XG4gIH0gY2F0Y2goZSkge31cblxuICAvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG4gIGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuICAgIHIgPSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfVxuXG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgbG9jYWxTdG9yYWdlLmRlYnVnYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG4iLCAiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciB0dHkgPSByZXF1aXJlKCd0dHknKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIC9eZGVidWdfL2kudGVzdChrZXkpO1xufSkucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAvLyBjYW1lbC1jYXNlXG4gIHZhciBwcm9wID0ga2V5XG4gICAgLnN1YnN0cmluZyg2KVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL18oW2Etel0pL2csIGZ1bmN0aW9uIChfLCBrKSB7IHJldHVybiBrLnRvVXBwZXJDYXNlKCkgfSk7XG5cbiAgLy8gY29lcmNlIHN0cmluZyB2YWx1ZSBpbnRvIEpTIHZhbHVlXG4gIHZhciB2YWwgPSBwcm9jZXNzLmVudltrZXldO1xuICBpZiAoL14oeWVzfG9ufHRydWV8ZW5hYmxlZCkkL2kudGVzdCh2YWwpKSB2YWwgPSB0cnVlO1xuICBlbHNlIGlmICgvXihub3xvZmZ8ZmFsc2V8ZGlzYWJsZWQpJC9pLnRlc3QodmFsKSkgdmFsID0gZmFsc2U7XG4gIGVsc2UgaWYgKHZhbCA9PT0gJ251bGwnKSB2YWwgPSBudWxsO1xuICBlbHNlIHZhbCA9IE51bWJlcih2YWwpO1xuXG4gIG9ialtwcm9wXSA9IHZhbDtcbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcblxuLyoqXG4gKiBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIHRoZSBgZGVidWcoKWAgY2FsbHMgdG8uXG4gKiBTZXQgdGhlIGBERUJVR19GRGAgZW52IHZhcmlhYmxlIHRvIG92ZXJyaWRlIHdpdGggYW5vdGhlciB2YWx1ZS4gaS5lLjpcbiAqXG4gKiAgICQgREVCVUdfRkQ9MyBub2RlIHNjcmlwdC5qcyAzPmRlYnVnLmxvZ1xuICovXG5cbnZhciBmZCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkRFQlVHX0ZELCAxMCkgfHwgMjtcblxuaWYgKDEgIT09IGZkICYmIDIgIT09IGZkKSB7XG4gIHV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uKCl7fSwgJ2V4Y2VwdCBmb3Igc3RkZXJyKDIpIGFuZCBzdGRvdXQoMSksIGFueSBvdGhlciB1c2FnZSBvZiBERUJVR19GRCBpcyBkZXByZWNhdGVkLiBPdmVycmlkZSBkZWJ1Zy5sb2cgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGxvZyBmdW5jdGlvbiAoaHR0cHM6Ly9naXQuaW8vZGVidWdfZmQpJykoKVxufVxuXG52YXIgc3RyZWFtID0gMSA9PT0gZmQgPyBwcm9jZXNzLnN0ZG91dCA6XG4gICAgICAgICAgICAgMiA9PT0gZmQgPyBwcm9jZXNzLnN0ZGVyciA6XG4gICAgICAgICAgICAgY3JlYXRlV3JpdGFibGVTdGRpb1N0cmVhbShmZCk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgcmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHNcbiAgICA/IEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpXG4gICAgOiB0dHkuaXNhdHR5KGZkKTtcbn1cblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsIG9uIGEgc2luZ2xlIGxpbmUuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbih2KSB7XG4gIHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG4gIHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cylcbiAgICAuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihzdHIpIHtcbiAgICAgIHJldHVybiBzdHIudHJpbSgpXG4gICAgfSkuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsb3dpbmcgbXVsdGlwbGUgbGluZXMgaWYgbmVlZGVkLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5PID0gZnVuY3Rpb24odikge1xuICB0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuICByZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLm5hbWVzcGFjZTtcbiAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG4gIGlmICh1c2VDb2xvcnMpIHtcbiAgICB2YXIgYyA9IHRoaXMuY29sb3I7XG4gICAgdmFyIHByZWZpeCA9ICcgIFxcdTAwMWJbMycgKyBjICsgJzsxbScgKyBuYW1lICsgJyAnICsgJ1xcdTAwMWJbMG0nO1xuXG4gICAgYXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuICAgIGFyZ3MucHVzaCgnXFx1MDAxYlszJyArIGMgKyAnbSsnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMWJbMG0nKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzWzBdID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG4gICAgICArICcgJyArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBgdXRpbC5mb3JtYXQoKWAgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhbmQgd3JpdGVzIHRvIGBzdHJlYW1gLlxuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgcmV0dXJuIHN0cmVhbS53cml0ZSh1dGlsLmZvcm1hdC5hcHBseSh1dGlsLCBhcmd1bWVudHMpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcbiAgaWYgKG51bGwgPT0gbmFtZXNwYWNlcykge1xuICAgIC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuICAgIC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5ERUJVRztcbn1cblxuLyoqXG4gKiBDb3BpZWQgZnJvbSBgbm9kZS9zcmMvbm9kZS5qc2AuXG4gKlxuICogWFhYOiBJdCdzIGxhbWUgdGhhdCBub2RlIGRvZXNuJ3QgZXhwb3NlIHRoaXMgQVBJIG91dC1vZi10aGUtYm94LiBJdCBhbHNvXG4gKiByZWxpZXMgb24gdGhlIHVuZG9jdW1lbnRlZCBgdHR5X3dyYXAuZ3Vlc3NIYW5kbGVUeXBlKClgIHdoaWNoIGlzIGFsc28gbGFtZS5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVXcml0YWJsZVN0ZGlvU3RyZWFtIChmZCkge1xuICB2YXIgc3RyZWFtO1xuICB2YXIgdHR5X3dyYXAgPSBwcm9jZXNzLmJpbmRpbmcoJ3R0eV93cmFwJyk7XG5cbiAgLy8gTm90ZSBzdHJlYW0uX3R5cGUgaXMgdXNlZCBmb3IgdGVzdC1tb2R1bGUtbG9hZC1saXN0LmpzXG5cbiAgc3dpdGNoICh0dHlfd3JhcC5ndWVzc0hhbmRsZVR5cGUoZmQpKSB7XG4gICAgY2FzZSAnVFRZJzpcbiAgICAgIHN0cmVhbSA9IG5ldyB0dHkuV3JpdGVTdHJlYW0oZmQpO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ3R0eSc7XG5cbiAgICAgIC8vIEhhY2sgdG8gaGF2ZSBzdHJlYW0gbm90IGtlZXAgdGhlIGV2ZW50IGxvb3AgYWxpdmUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzI2XG4gICAgICBpZiAoc3RyZWFtLl9oYW5kbGUgJiYgc3RyZWFtLl9oYW5kbGUudW5yZWYpIHtcbiAgICAgICAgc3RyZWFtLl9oYW5kbGUudW5yZWYoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnRklMRSc6XG4gICAgICB2YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuICAgICAgc3RyZWFtID0gbmV3IGZzLlN5bmNXcml0ZVN0cmVhbShmZCwgeyBhdXRvQ2xvc2U6IGZhbHNlIH0pO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ2ZzJztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnUElQRSc6XG4gICAgY2FzZSAnVENQJzpcbiAgICAgIHZhciBuZXQgPSByZXF1aXJlKCduZXQnKTtcbiAgICAgIHN0cmVhbSA9IG5ldyBuZXQuU29ja2V0KHtcbiAgICAgICAgZmQ6IGZkLFxuICAgICAgICByZWFkYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gRklYTUUgU2hvdWxkIHByb2JhYmx5IGhhdmUgYW4gb3B0aW9uIGluIG5ldC5Tb2NrZXQgdG8gY3JlYXRlIGFcbiAgICAgIC8vIHN0cmVhbSBmcm9tIGFuIGV4aXN0aW5nIGZkIHdoaWNoIGlzIHdyaXRhYmxlIG9ubHkuIEJ1dCBmb3Igbm93XG4gICAgICAvLyB3ZSdsbCBqdXN0IGFkZCB0aGlzIGhhY2sgYW5kIHNldCB0aGUgYHJlYWRhYmxlYCBtZW1iZXIgdG8gZmFsc2UuXG4gICAgICAvLyBUZXN0OiAuL25vZGUgdGVzdC9maXh0dXJlcy9lY2hvLmpzIDwgL2V0Yy9wYXNzd2RcbiAgICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlYWQgPSBudWxsO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ3BpcGUnO1xuXG4gICAgICAvLyBGSVhNRSBIYWNrIHRvIGhhdmUgc3RyZWFtIG5vdCBrZWVwIHRoZSBldmVudCBsb29wIGFsaXZlLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcyNlxuICAgICAgaWYgKHN0cmVhbS5faGFuZGxlICYmIHN0cmVhbS5faGFuZGxlLnVucmVmKSB7XG4gICAgICAgIHN0cmVhbS5faGFuZGxlLnVucmVmKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBQcm9iYWJseSBhbiBlcnJvciBvbiBpbiB1dl9ndWVzc19oYW5kbGUoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXBsZW1lbnQgbWUuIFVua25vd24gc3RyZWFtIGZpbGUgdHlwZSEnKTtcbiAgfVxuXG4gIC8vIEZvciBzdXBwb3J0aW5nIGxlZ2FjeSBBUEkgd2UgcHV0IHRoZSBGRCBoZXJlLlxuICBzdHJlYW0uZmQgPSBmZDtcblxuICBzdHJlYW0uX2lzU3RkaW8gPSB0cnVlO1xuXG4gIHJldHVybiBzdHJlYW07XG59XG5cbi8qKlxuICogSW5pdCBsb2dpYyBmb3IgYGRlYnVnYCBpbnN0YW5jZXMuXG4gKlxuICogQ3JlYXRlIGEgbmV3IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGluIGNhc2UgYHVzZUNvbG9yc2AgaXMgc2V0XG4gKiBkaWZmZXJlbnRseSBmb3IgYSBwYXJ0aWN1bGFyIGBkZWJ1Z2AgaW5zdGFuY2UuXG4gKi9cblxuZnVuY3Rpb24gaW5pdCAoZGVidWcpIHtcbiAgZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuaW5zcGVjdE9wdHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWJ1Zy5pbnNwZWN0T3B0c1trZXlzW2ldXSA9IGV4cG9ydHMuaW5zcGVjdE9wdHNba2V5c1tpXV07XG4gIH1cbn1cblxuLyoqXG4gKiBFbmFibGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gYHByb2Nlc3MuZW52LkRFQlVHYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcbiIsICIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciBwcm9jZXNzLCB3aGljaCBpcyBub2RlLCBidXQgd2Ugc2hvdWxkXG4gKiB0cmVhdCBhcyBhIGJyb3dzZXIuXG4gKi9cblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLCAiLyohXG4gKiBldGFnXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV0YWdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbnZhciBTdGF0cyA9IHJlcXVpcmUoJ2ZzJykuU3RhdHNcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbi8qKlxuICogR2VuZXJhdGUgYW4gZW50aXR5IHRhZy5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcnxzdHJpbmd9IGVudGl0eVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBlbnRpdHl0YWcgKGVudGl0eSkge1xuICBpZiAoZW50aXR5Lmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGZhc3QtcGF0aCBlbXB0eVxuICAgIHJldHVybiAnXCIwLTJqbWo3bDVyU3cweVZiL3ZsV0FZa0svWUJ3a1wiJ1xuICB9XG5cbiAgLy8gY29tcHV0ZSBoYXNoIG9mIGVudGl0eVxuICB2YXIgaGFzaCA9IGNyeXB0b1xuICAgIC5jcmVhdGVIYXNoKCdzaGExJylcbiAgICAudXBkYXRlKGVudGl0eSwgJ3V0ZjgnKVxuICAgIC5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgLnN1YnN0cmluZygwLCAyNylcblxuICAvLyBjb21wdXRlIGxlbmd0aCBvZiBlbnRpdHlcbiAgdmFyIGxlbiA9IHR5cGVvZiBlbnRpdHkgPT09ICdzdHJpbmcnXG4gICAgPyBCdWZmZXIuYnl0ZUxlbmd0aChlbnRpdHksICd1dGY4JylcbiAgICA6IGVudGl0eS5sZW5ndGhcblxuICByZXR1cm4gJ1wiJyArIGxlbi50b1N0cmluZygxNikgKyAnLScgKyBoYXNoICsgJ1wiJ1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHNpbXBsZSBFVGFnLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEJ1ZmZlcnxTdGF0c30gZW50aXR5XG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLndlYWtdXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZXRhZyAoZW50aXR5LCBvcHRpb25zKSB7XG4gIGlmIChlbnRpdHkgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IGVudGl0eSBpcyByZXF1aXJlZCcpXG4gIH1cblxuICAvLyBzdXBwb3J0IGZzLlN0YXRzIG9iamVjdFxuICB2YXIgaXNTdGF0cyA9IGlzc3RhdHMoZW50aXR5KVxuICB2YXIgd2VhayA9IG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMud2VhayA9PT0gJ2Jvb2xlYW4nXG4gICAgPyBvcHRpb25zLndlYWtcbiAgICA6IGlzU3RhdHNcblxuICAvLyB2YWxpZGF0ZSBhcmd1bWVudFxuICBpZiAoIWlzU3RhdHMgJiYgdHlwZW9mIGVudGl0eSAhPT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0J1ZmZlcihlbnRpdHkpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgZW50aXR5IG11c3QgYmUgc3RyaW5nLCBCdWZmZXIsIG9yIGZzLlN0YXRzJylcbiAgfVxuXG4gIC8vIGdlbmVyYXRlIGVudGl0eSB0YWdcbiAgdmFyIHRhZyA9IGlzU3RhdHNcbiAgICA/IHN0YXR0YWcoZW50aXR5KVxuICAgIDogZW50aXR5dGFnKGVudGl0eSlcblxuICByZXR1cm4gd2Vha1xuICAgID8gJ1cvJyArIHRhZ1xuICAgIDogdGFnXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIG9iamVjdCBpcyBhIFN0YXRzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNzdGF0cyAob2JqKSB7XG4gIC8vIGdlbnVpbmUgZnMuU3RhdHNcbiAgaWYgKHR5cGVvZiBTdGF0cyA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmogaW5zdGFuY2VvZiBTdGF0cykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBxdWFjayBxdWFja1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmXG4gICAgJ2N0aW1lJyBpbiBvYmogJiYgdG9TdHJpbmcuY2FsbChvYmouY3RpbWUpID09PSAnW29iamVjdCBEYXRlXScgJiZcbiAgICAnbXRpbWUnIGluIG9iaiAmJiB0b1N0cmluZy5jYWxsKG9iai5tdGltZSkgPT09ICdbb2JqZWN0IERhdGVdJyAmJlxuICAgICdpbm8nIGluIG9iaiAmJiB0eXBlb2Ygb2JqLmlubyA9PT0gJ251bWJlcicgJiZcbiAgICAnc2l6ZScgaW4gb2JqICYmIHR5cGVvZiBvYmouc2l6ZSA9PT0gJ251bWJlcidcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHRhZyBmb3IgYSBzdGF0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0YXR0YWcgKHN0YXQpIHtcbiAgdmFyIG10aW1lID0gc3RhdC5tdGltZS5nZXRUaW1lKCkudG9TdHJpbmcoMTYpXG4gIHZhciBzaXplID0gc3RhdC5zaXplLnRvU3RyaW5nKDE2KVxuXG4gIHJldHVybiAnXCInICsgc2l6ZSArICctJyArIG10aW1lICsgJ1wiJ1xufVxuIiwgIi8qIVxuICogZnJlc2hcbiAqIENvcHlyaWdodChjKSAyMDEyIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNi0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBSZWdFeHAgdG8gY2hlY2sgZm9yIG5vLWNhY2hlIHRva2VuIGluIENhY2hlLUNvbnRyb2wuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBDQUNIRV9DT05UUk9MX05PX0NBQ0hFX1JFR0VYUCA9IC8oPzpefCwpXFxzKj9uby1jYWNoZVxccyo/KD86LHwkKS9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZXNoXG5cbi8qKlxuICogQ2hlY2sgZnJlc2huZXNzIG9mIHRoZSByZXNwb25zZSB1c2luZyByZXF1ZXN0IGFuZCByZXNwb25zZSBoZWFkZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXFIZWFkZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzSGVhZGVyc1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmcmVzaCAocmVxSGVhZGVycywgcmVzSGVhZGVycykge1xuICAvLyBmaWVsZHNcbiAgdmFyIG1vZGlmaWVkU2luY2UgPSByZXFIZWFkZXJzWydpZi1tb2RpZmllZC1zaW5jZSddXG4gIHZhciBub25lTWF0Y2ggPSByZXFIZWFkZXJzWydpZi1ub25lLW1hdGNoJ11cblxuICAvLyB1bmNvbmRpdGlvbmFsIHJlcXVlc3RcbiAgaWYgKCFtb2RpZmllZFNpbmNlICYmICFub25lTWF0Y2gpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEFsd2F5cyByZXR1cm4gc3RhbGUgd2hlbiBDYWNoZS1Db250cm9sOiBuby1jYWNoZVxuICAvLyB0byBzdXBwb3J0IGVuZC10by1lbmQgcmVsb2FkIHJlcXVlc3RzXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNjE2I3NlY3Rpb24tMTQuOS40XG4gIHZhciBjYWNoZUNvbnRyb2wgPSByZXFIZWFkZXJzWydjYWNoZS1jb250cm9sJ11cbiAgaWYgKGNhY2hlQ29udHJvbCAmJiBDQUNIRV9DT05UUk9MX05PX0NBQ0hFX1JFR0VYUC50ZXN0KGNhY2hlQ29udHJvbCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIGlmLW5vbmUtbWF0Y2hcbiAgaWYgKG5vbmVNYXRjaCAmJiBub25lTWF0Y2ggIT09ICcqJykge1xuICAgIHZhciBldGFnID0gcmVzSGVhZGVyc1snZXRhZyddXG5cbiAgICBpZiAoIWV0YWcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHZhciBldGFnU3RhbGUgPSB0cnVlXG4gICAgdmFyIG1hdGNoZXMgPSBwYXJzZVRva2VuTGlzdChub25lTWF0Y2gpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBtYXRjaGVzW2ldXG4gICAgICBpZiAobWF0Y2ggPT09IGV0YWcgfHwgbWF0Y2ggPT09ICdXLycgKyBldGFnIHx8ICdXLycgKyBtYXRjaCA9PT0gZXRhZykge1xuICAgICAgICBldGFnU3RhbGUgPSBmYWxzZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChldGFnU3RhbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmLW1vZGlmaWVkLXNpbmNlXG4gIGlmIChtb2RpZmllZFNpbmNlKSB7XG4gICAgdmFyIGxhc3RNb2RpZmllZCA9IHJlc0hlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXVxuICAgIHZhciBtb2RpZmllZFN0YWxlID0gIWxhc3RNb2RpZmllZCB8fCAhKHBhcnNlSHR0cERhdGUobGFzdE1vZGlmaWVkKSA8PSBwYXJzZUh0dHBEYXRlKG1vZGlmaWVkU2luY2UpKVxuXG4gICAgaWYgKG1vZGlmaWVkU3RhbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogUGFyc2UgYW4gSFRUUCBEYXRlIGludG8gYSBudW1iZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGVcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VIdHRwRGF0ZSAoZGF0ZSkge1xuICB2YXIgdGltZXN0YW1wID0gZGF0ZSAmJiBEYXRlLnBhcnNlKGRhdGUpXG5cbiAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQ6IGd1YXJkIGFnYWluc3QgZGF0ZS5qcyBEYXRlLnBhcnNlIHBhdGNoaW5nXG4gIHJldHVybiB0eXBlb2YgdGltZXN0YW1wID09PSAnbnVtYmVyJ1xuICAgID8gdGltZXN0YW1wXG4gICAgOiBOYU5cbn1cblxuLyoqXG4gKiBQYXJzZSBhIEhUVFAgdG9rZW4gbGlzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlVG9rZW5MaXN0IChzdHIpIHtcbiAgdmFyIGVuZCA9IDBcbiAgdmFyIGxpc3QgPSBbXVxuICB2YXIgc3RhcnQgPSAwXG5cbiAgLy8gZ2F0aGVyIHRva2Vuc1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc3dpdGNoIChzdHIuY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSAweDIwOiAvKiAgICovXG4gICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgICAgICAgc3RhcnQgPSBlbmQgPSBpICsgMVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDB4MmM6IC8qICwgKi9cbiAgICAgICAgbGlzdC5wdXNoKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG4gICAgICAgIHN0YXJ0ID0gZW5kID0gaSArIDFcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGVuZCA9IGkgKyAxXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgLy8gZmluYWwgdG9rZW5cbiAgbGlzdC5wdXNoKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG5cbiAgcmV0dXJuIGxpc3Rcbn1cbiIsICJ2YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmZ1bmN0aW9uIE1pbWUoKSB7XG4gIC8vIE1hcCBvZiBleHRlbnNpb24gLT4gbWltZSB0eXBlXG4gIHRoaXMudHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vIE1hcCBvZiBtaW1lIHR5cGUgLT4gZXh0ZW5zaW9uXG4gIHRoaXMuZXh0ZW5zaW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbi8qKlxuICogRGVmaW5lIG1pbWV0eXBlIC0+IGV4dGVuc2lvbiBtYXBwaW5ncy4gIEVhY2gga2V5IGlzIGEgbWltZS10eXBlIHRoYXQgbWFwc1xuICogdG8gYW4gYXJyYXkgb2YgZXh0ZW5zaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUuICBUaGUgZmlyc3QgZXh0ZW5zaW9uIGlzXG4gKiB1c2VkIGFzIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgdGhlIHR5cGUuXG4gKlxuICogZS5nLiBtaW1lLmRlZmluZSh7J2F1ZGlvL29nZycsIFsnb2dhJywgJ29nZycsICdzcHgnXX0pO1xuICpcbiAqIEBwYXJhbSBtYXAgKE9iamVjdCkgdHlwZSBkZWZpbml0aW9uc1xuICovXG5NaW1lLnByb3RvdHlwZS5kZWZpbmUgPSBmdW5jdGlvbiAobWFwKSB7XG4gIGZvciAodmFyIHR5cGUgaW4gbWFwKSB7XG4gICAgdmFyIGV4dHMgPSBtYXBbdHlwZV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuREVCVUdfTUlNRSAmJiB0aGlzLnR5cGVzW2V4dHNbaV1dKSB7XG4gICAgICAgIGNvbnNvbGUud2FybigodGhpcy5fbG9hZGluZyB8fCBcImRlZmluZSgpXCIpLnJlcGxhY2UoLy4qXFwvLywgJycpLCAnY2hhbmdlcyBcIicgKyBleHRzW2ldICsgJ1wiIGV4dGVuc2lvbiB0eXBlIGZyb20gJyArXG4gICAgICAgICAgdGhpcy50eXBlc1tleHRzW2ldXSArICcgdG8gJyArIHR5cGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnR5cGVzW2V4dHNbaV1dID0gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGV4dGVuc2lvbiBpcyB0aGUgZmlyc3Qgb25lIHdlIGVuY291bnRlclxuICAgIGlmICghdGhpcy5leHRlbnNpb25zW3R5cGVdKSB7XG4gICAgICB0aGlzLmV4dGVuc2lvbnNbdHlwZV0gPSBleHRzWzBdO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMb2FkIGFuIEFwYWNoZTItc3R5bGUgXCIudHlwZXNcIiBmaWxlXG4gKlxuICogVGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIChpdCdzIGV4cGVjdGVkKS4gIFdoZXJlIGZpbGVzIGRlY2xhcmVcbiAqIG92ZXJsYXBwaW5nIHR5cGVzL2V4dGVuc2lvbnMsIHRoZSBsYXN0IGZpbGUgd2lucy5cbiAqXG4gKiBAcGFyYW0gZmlsZSAoU3RyaW5nKSBwYXRoIG9mIGZpbGUgdG8gbG9hZC5cbiAqL1xuTWltZS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKGZpbGUpIHtcbiAgdGhpcy5fbG9hZGluZyA9IGZpbGU7XG4gIC8vIFJlYWQgZmlsZSBhbmQgc3BsaXQgaW50byBsaW5lc1xuICB2YXIgbWFwID0ge30sXG4gICAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICdhc2NpaScpLFxuICAgICAgbGluZXMgPSBjb250ZW50LnNwbGl0KC9bXFxyXFxuXSsvKTtcblxuICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAvLyBDbGVhbiB1cCB3aGl0ZXNwYWNlL2NvbW1lbnRzLCBhbmQgc3BsaXQgaW50byBmaWVsZHNcbiAgICB2YXIgZmllbGRzID0gbGluZS5yZXBsYWNlKC9cXHMqIy4qfF5cXHMqfFxccyokL2csICcnKS5zcGxpdCgvXFxzKy8pO1xuICAgIG1hcFtmaWVsZHMuc2hpZnQoKV0gPSBmaWVsZHM7XG4gIH0pO1xuXG4gIHRoaXMuZGVmaW5lKG1hcCk7XG5cbiAgdGhpcy5fbG9hZGluZyA9IG51bGw7XG59O1xuXG4vKipcbiAqIExvb2t1cCBhIG1pbWUgdHlwZSBiYXNlZCBvbiBleHRlbnNpb25cbiAqL1xuTWltZS5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24ocGF0aCwgZmFsbGJhY2spIHtcbiAgdmFyIGV4dCA9IHBhdGgucmVwbGFjZSgvXi4qW1xcLlxcL1xcXFxdLywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIHRoaXMudHlwZXNbZXh0XSB8fCBmYWxsYmFjayB8fCB0aGlzLmRlZmF1bHRfdHlwZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGZpbGUgZXh0ZW5zaW9uIGFzc29jaWF0ZWQgd2l0aCBhIG1pbWUgdHlwZVxuICovXG5NaW1lLnByb3RvdHlwZS5leHRlbnNpb24gPSBmdW5jdGlvbihtaW1lVHlwZSkge1xuICB2YXIgdHlwZSA9IG1pbWVUeXBlLm1hdGNoKC9eXFxzKihbXjtcXHNdKikoPzo7fFxcc3wkKS8pWzFdLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiB0aGlzLmV4dGVuc2lvbnNbdHlwZV07XG59O1xuXG4vLyBEZWZhdWx0IGluc3RhbmNlXG52YXIgbWltZSA9IG5ldyBNaW1lKCk7XG5cbi8vIERlZmluZSBidWlsdC1pbiB0eXBlc1xubWltZS5kZWZpbmUocmVxdWlyZSgnLi90eXBlcy5qc29uJykpO1xuXG4vLyBEZWZhdWx0IHR5cGVcbm1pbWUuZGVmYXVsdF90eXBlID0gbWltZS5sb29rdXAoJ2JpbicpO1xuXG4vL1xuLy8gQWRkaXRpb25hbCBBUEkgc3BlY2lmaWMgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2Vcbi8vXG5cbm1pbWUuTWltZSA9IE1pbWU7XG5cbi8qKlxuICogTG9va3VwIGEgY2hhcnNldCBiYXNlZCBvbiBtaW1lIHR5cGUuXG4gKi9cbm1pbWUuY2hhcnNldHMgPSB7XG4gIGxvb2t1cDogZnVuY3Rpb24obWltZVR5cGUsIGZhbGxiYWNrKSB7XG4gICAgLy8gQXNzdW1lIHRleHQgdHlwZXMgYXJlIHV0ZjhcbiAgICByZXR1cm4gKC9edGV4dFxcL3xeYXBwbGljYXRpb25cXC8oamF2YXNjcmlwdHxqc29uKS8pLnRlc3QobWltZVR5cGUpID8gJ1VURi04JyA6IGZhbGxiYWNrO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbWU7XG4iLCAiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIi8qIVxuICogcmFuZ2UtcGFyc2VyXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNS0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbmdlUGFyc2VyXG5cbi8qKlxuICogUGFyc2UgXCJSYW5nZVwiIGhlYWRlciBgc3RyYCByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gZmlsZSBgc2l6ZWAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHNpemVcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJhbmdlUGFyc2VyIChzaXplLCBzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyIG11c3QgYmUgYSBzdHJpbmcnKVxuICB9XG5cbiAgdmFyIGluZGV4ID0gc3RyLmluZGV4T2YoJz0nKVxuXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gLTJcbiAgfVxuXG4gIC8vIHNwbGl0IHRoZSByYW5nZSBzdHJpbmdcbiAgdmFyIGFyciA9IHN0ci5zbGljZShpbmRleCArIDEpLnNwbGl0KCcsJylcbiAgdmFyIHJhbmdlcyA9IFtdXG5cbiAgLy8gYWRkIHJhbmdlcyB0eXBlXG4gIHJhbmdlcy50eXBlID0gc3RyLnNsaWNlKDAsIGluZGV4KVxuXG4gIC8vIHBhcnNlIGFsbCByYW5nZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmFuZ2UgPSBhcnJbaV0uc3BsaXQoJy0nKVxuICAgIHZhciBzdGFydCA9IHBhcnNlSW50KHJhbmdlWzBdLCAxMClcbiAgICB2YXIgZW5kID0gcGFyc2VJbnQocmFuZ2VbMV0sIDEwKVxuXG4gICAgLy8gLW5ublxuICAgIGlmIChpc05hTihzdGFydCkpIHtcbiAgICAgIHN0YXJ0ID0gc2l6ZSAtIGVuZFxuICAgICAgZW5kID0gc2l6ZSAtIDFcbiAgICAvLyBubm4tXG4gICAgfSBlbHNlIGlmIChpc05hTihlbmQpKSB7XG4gICAgICBlbmQgPSBzaXplIC0gMVxuICAgIH1cblxuICAgIC8vIGxpbWl0IGxhc3QtYnl0ZS1wb3MgdG8gY3VycmVudCBsZW5ndGhcbiAgICBpZiAoZW5kID4gc2l6ZSAtIDEpIHtcbiAgICAgIGVuZCA9IHNpemUgLSAxXG4gICAgfVxuXG4gICAgLy8gaW52YWxpZCBvciB1bnNhdGlzaWZpYWJsZVxuICAgIGlmIChpc05hTihzdGFydCkgfHwgaXNOYU4oZW5kKSB8fCBzdGFydCA+IGVuZCB8fCBzdGFydCA8IDApIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gYWRkIHJhbmdlXG4gICAgcmFuZ2VzLnB1c2goe1xuICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgZW5kOiBlbmRcbiAgICB9KVxuICB9XG5cbiAgaWYgKHJhbmdlcy5sZW5ndGggPCAxKSB7XG4gICAgLy8gdW5zYXRpc2lmaWFibGVcbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuY29tYmluZVxuICAgID8gY29tYmluZVJhbmdlcyhyYW5nZXMpXG4gICAgOiByYW5nZXNcbn1cblxuLyoqXG4gKiBDb21iaW5lIG92ZXJsYXBwaW5nICYgYWRqYWNlbnQgcmFuZ2VzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb21iaW5lUmFuZ2VzIChyYW5nZXMpIHtcbiAgdmFyIG9yZGVyZWQgPSByYW5nZXMubWFwKG1hcFdpdGhJbmRleCkuc29ydChzb3J0QnlSYW5nZVN0YXJ0KVxuXG4gIGZvciAodmFyIGogPSAwLCBpID0gMTsgaSA8IG9yZGVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmFuZ2UgPSBvcmRlcmVkW2ldXG4gICAgdmFyIGN1cnJlbnQgPSBvcmRlcmVkW2pdXG5cbiAgICBpZiAocmFuZ2Uuc3RhcnQgPiBjdXJyZW50LmVuZCArIDEpIHtcbiAgICAgIC8vIG5leHQgcmFuZ2VcbiAgICAgIG9yZGVyZWRbKytqXSA9IHJhbmdlXG4gICAgfSBlbHNlIGlmIChyYW5nZS5lbmQgPiBjdXJyZW50LmVuZCkge1xuICAgICAgLy8gZXh0ZW5kIHJhbmdlXG4gICAgICBjdXJyZW50LmVuZCA9IHJhbmdlLmVuZFxuICAgICAgY3VycmVudC5pbmRleCA9IE1hdGgubWluKGN1cnJlbnQuaW5kZXgsIHJhbmdlLmluZGV4KVxuICAgIH1cbiAgfVxuXG4gIC8vIHRyaW0gb3JkZXJlZCBhcnJheVxuICBvcmRlcmVkLmxlbmd0aCA9IGogKyAxXG5cbiAgLy8gZ2VuZXJhdGUgY29tYmluZWQgcmFuZ2VcbiAgdmFyIGNvbWJpbmVkID0gb3JkZXJlZC5zb3J0KHNvcnRCeVJhbmdlSW5kZXgpLm1hcChtYXBXaXRob3V0SW5kZXgpXG5cbiAgLy8gY29weSByYW5nZXMgdHlwZVxuICBjb21iaW5lZC50eXBlID0gcmFuZ2VzLnR5cGVcblxuICByZXR1cm4gY29tYmluZWRcbn1cblxuLyoqXG4gKiBNYXAgZnVuY3Rpb24gdG8gYWRkIGluZGV4IHZhbHVlIHRvIHJhbmdlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWFwV2l0aEluZGV4IChyYW5nZSwgaW5kZXgpIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogcmFuZ2Uuc3RhcnQsXG4gICAgZW5kOiByYW5nZS5lbmQsXG4gICAgaW5kZXg6IGluZGV4XG4gIH1cbn1cblxuLyoqXG4gKiBNYXAgZnVuY3Rpb24gdG8gcmVtb3ZlIGluZGV4IHZhbHVlIGZyb20gcmFuZ2VzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBtYXBXaXRob3V0SW5kZXggKHJhbmdlKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHJhbmdlLnN0YXJ0LFxuICAgIGVuZDogcmFuZ2UuZW5kXG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IGZ1bmN0aW9uIHRvIHNvcnQgcmFuZ2VzIGJ5IGluZGV4LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzb3J0QnlSYW5nZUluZGV4IChhLCBiKSB7XG4gIHJldHVybiBhLmluZGV4IC0gYi5pbmRleFxufVxuXG4vKipcbiAqIFNvcnQgZnVuY3Rpb24gdG8gc29ydCByYW5nZXMgYnkgc3RhcnQgcG9zaXRpb24uXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNvcnRCeVJhbmdlU3RhcnQgKGEsIGIpIHtcbiAgcmV0dXJuIGEuc3RhcnQgLSBiLnN0YXJ0XG59XG4iLCAiLyohXG4gKiBzZW5kXG4gKiBDb3B5cmlnaHQoYykgMjAxMiBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAyMiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnaHR0cC1lcnJvcnMnKVxudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnc2VuZCcpXG52YXIgZGVwcmVjYXRlID0gcmVxdWlyZSgnZGVwZCcpKCdzZW5kJylcbnZhciBkZXN0cm95ID0gcmVxdWlyZSgnZGVzdHJveScpXG52YXIgZW5jb2RlVXJsID0gcmVxdWlyZSgnZW5jb2RldXJsJylcbnZhciBlc2NhcGVIdG1sID0gcmVxdWlyZSgnZXNjYXBlLWh0bWwnKVxudmFyIGV0YWcgPSByZXF1aXJlKCdldGFnJylcbnZhciBmcmVzaCA9IHJlcXVpcmUoJ2ZyZXNoJylcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBtaW1lID0gcmVxdWlyZSgnbWltZScpXG52YXIgbXMgPSByZXF1aXJlKCdtcycpXG52YXIgb25GaW5pc2hlZCA9IHJlcXVpcmUoJ29uLWZpbmlzaGVkJylcbnZhciBwYXJzZVJhbmdlID0gcmVxdWlyZSgncmFuZ2UtcGFyc2VyJylcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG52YXIgc3RhdHVzZXMgPSByZXF1aXJlKCdzdGF0dXNlcycpXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG5cbi8qKlxuICogUGF0aCBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZXh0bmFtZSA9IHBhdGguZXh0bmFtZVxudmFyIGpvaW4gPSBwYXRoLmpvaW5cbnZhciBub3JtYWxpemUgPSBwYXRoLm5vcm1hbGl6ZVxudmFyIHJlc29sdmUgPSBwYXRoLnJlc29sdmVcbnZhciBzZXAgPSBwYXRoLnNlcFxuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgaWRlbnRpZnlpbmcgYSBieXRlcyBSYW5nZSBoZWFkZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBCWVRFU19SQU5HRV9SRUdFWFAgPSAvXiAqYnl0ZXM9L1xuXG4vKipcbiAqIE1heGltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIG1heCBhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBNQVhfTUFYQUdFID0gNjAgKiA2MCAqIDI0ICogMzY1ICogMTAwMCAvLyAxIHllYXJcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYSBwYXRoIHdpdGggYSBkaXJlY3RvcnkgdXAgY29tcG9uZW50LlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgVVBfUEFUSF9SRUdFWFAgPSAvKD86XnxbXFxcXC9dKVxcLlxcLig/OltcXFxcL118JCkvXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBzZW5kXG5tb2R1bGUuZXhwb3J0cy5taW1lID0gbWltZVxuXG4vKipcbiAqIFJldHVybiBhIGBTZW5kU3RyZWFtYCBmb3IgYHJlcWAgYW5kIGBwYXRoYC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7U2VuZFN0cmVhbX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzZW5kIChyZXEsIHBhdGgsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBTZW5kU3RyZWFtKHJlcSwgcGF0aCwgb3B0aW9ucylcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgYFNlbmRTdHJlYW1gIHdpdGggdGhlIGdpdmVuIGBwYXRoYC5cbiAqXG4gKiBAcGFyYW0ge1JlcXVlc3R9IHJlcVxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gU2VuZFN0cmVhbSAocmVxLCBwYXRoLCBvcHRpb25zKSB7XG4gIFN0cmVhbS5jYWxsKHRoaXMpXG5cbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9XG5cbiAgdGhpcy5vcHRpb25zID0gb3B0c1xuICB0aGlzLnBhdGggPSBwYXRoXG4gIHRoaXMucmVxID0gcmVxXG5cbiAgdGhpcy5fYWNjZXB0UmFuZ2VzID0gb3B0cy5hY2NlcHRSYW5nZXMgIT09IHVuZGVmaW5lZFxuICAgID8gQm9vbGVhbihvcHRzLmFjY2VwdFJhbmdlcylcbiAgICA6IHRydWVcblxuICB0aGlzLl9jYWNoZUNvbnRyb2wgPSBvcHRzLmNhY2hlQ29udHJvbCAhPT0gdW5kZWZpbmVkXG4gICAgPyBCb29sZWFuKG9wdHMuY2FjaGVDb250cm9sKVxuICAgIDogdHJ1ZVxuXG4gIHRoaXMuX2V0YWcgPSBvcHRzLmV0YWcgIT09IHVuZGVmaW5lZFxuICAgID8gQm9vbGVhbihvcHRzLmV0YWcpXG4gICAgOiB0cnVlXG5cbiAgdGhpcy5fZG90ZmlsZXMgPSBvcHRzLmRvdGZpbGVzICE9PSB1bmRlZmluZWRcbiAgICA/IG9wdHMuZG90ZmlsZXNcbiAgICA6ICdpZ25vcmUnXG5cbiAgaWYgKHRoaXMuX2RvdGZpbGVzICE9PSAnaWdub3JlJyAmJiB0aGlzLl9kb3RmaWxlcyAhPT0gJ2FsbG93JyAmJiB0aGlzLl9kb3RmaWxlcyAhPT0gJ2RlbnknKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZG90ZmlsZXMgb3B0aW9uIG11c3QgYmUgXCJhbGxvd1wiLCBcImRlbnlcIiwgb3IgXCJpZ25vcmVcIicpXG4gIH1cblxuICB0aGlzLl9oaWRkZW4gPSBCb29sZWFuKG9wdHMuaGlkZGVuKVxuXG4gIGlmIChvcHRzLmhpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVwcmVjYXRlKCdoaWRkZW46IHVzZSBkb3RmaWxlczogXFwnJyArICh0aGlzLl9oaWRkZW4gPyAnYWxsb3cnIDogJ2lnbm9yZScpICsgJ1xcJyBpbnN0ZWFkJylcbiAgfVxuXG4gIC8vIGxlZ2FjeSBzdXBwb3J0XG4gIGlmIChvcHRzLmRvdGZpbGVzID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9kb3RmaWxlcyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgdGhpcy5fZXh0ZW5zaW9ucyA9IG9wdHMuZXh0ZW5zaW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgPyBub3JtYWxpemVMaXN0KG9wdHMuZXh0ZW5zaW9ucywgJ2V4dGVuc2lvbnMgb3B0aW9uJylcbiAgICA6IFtdXG5cbiAgdGhpcy5faW1tdXRhYmxlID0gb3B0cy5pbW11dGFibGUgIT09IHVuZGVmaW5lZFxuICAgID8gQm9vbGVhbihvcHRzLmltbXV0YWJsZSlcbiAgICA6IGZhbHNlXG5cbiAgdGhpcy5faW5kZXggPSBvcHRzLmluZGV4ICE9PSB1bmRlZmluZWRcbiAgICA/IG5vcm1hbGl6ZUxpc3Qob3B0cy5pbmRleCwgJ2luZGV4IG9wdGlvbicpXG4gICAgOiBbJ2luZGV4Lmh0bWwnXVxuXG4gIHRoaXMuX2xhc3RNb2RpZmllZCA9IG9wdHMubGFzdE1vZGlmaWVkICE9PSB1bmRlZmluZWRcbiAgICA/IEJvb2xlYW4ob3B0cy5sYXN0TW9kaWZpZWQpXG4gICAgOiB0cnVlXG5cbiAgdGhpcy5fbWF4YWdlID0gb3B0cy5tYXhBZ2UgfHwgb3B0cy5tYXhhZ2VcbiAgdGhpcy5fbWF4YWdlID0gdHlwZW9mIHRoaXMuX21heGFnZSA9PT0gJ3N0cmluZydcbiAgICA/IG1zKHRoaXMuX21heGFnZSlcbiAgICA6IE51bWJlcih0aGlzLl9tYXhhZ2UpXG4gIHRoaXMuX21heGFnZSA9ICFpc05hTih0aGlzLl9tYXhhZ2UpXG4gICAgPyBNYXRoLm1pbihNYXRoLm1heCgwLCB0aGlzLl9tYXhhZ2UpLCBNQVhfTUFYQUdFKVxuICAgIDogMFxuXG4gIHRoaXMuX3Jvb3QgPSBvcHRzLnJvb3RcbiAgICA/IHJlc29sdmUob3B0cy5yb290KVxuICAgIDogbnVsbFxuXG4gIGlmICghdGhpcy5fcm9vdCAmJiBvcHRzLmZyb20pIHtcbiAgICB0aGlzLmZyb20ob3B0cy5mcm9tKVxuICB9XG59XG5cbi8qKlxuICogSW5oZXJpdHMgZnJvbSBgU3RyZWFtYC5cbiAqL1xuXG51dGlsLmluaGVyaXRzKFNlbmRTdHJlYW0sIFN0cmVhbSlcblxuLyoqXG4gKiBFbmFibGUgb3IgZGlzYWJsZSBldGFnIGdlbmVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSB2YWxcbiAqIEByZXR1cm4ge1NlbmRTdHJlYW19XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmV0YWcgPSBkZXByZWNhdGUuZnVuY3Rpb24oZnVuY3Rpb24gZXRhZyAodmFsKSB7XG4gIHRoaXMuX2V0YWcgPSBCb29sZWFuKHZhbClcbiAgZGVidWcoJ2V0YWcgJXMnLCB0aGlzLl9ldGFnKVxuICByZXR1cm4gdGhpc1xufSwgJ3NlbmQuZXRhZzogcGFzcyBldGFnIGFzIG9wdGlvbicpXG5cbi8qKlxuICogRW5hYmxlIG9yIGRpc2FibGUgXCJoaWRkZW5cIiAoZG90KSBmaWxlcy5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHBhdGhcbiAqIEByZXR1cm4ge1NlbmRTdHJlYW19XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmhpZGRlbiA9IGRlcHJlY2F0ZS5mdW5jdGlvbihmdW5jdGlvbiBoaWRkZW4gKHZhbCkge1xuICB0aGlzLl9oaWRkZW4gPSBCb29sZWFuKHZhbClcbiAgdGhpcy5fZG90ZmlsZXMgPSB1bmRlZmluZWRcbiAgZGVidWcoJ2hpZGRlbiAlcycsIHRoaXMuX2hpZGRlbilcbiAgcmV0dXJuIHRoaXNcbn0sICdzZW5kLmhpZGRlbjogdXNlIGRvdGZpbGVzIG9wdGlvbicpXG5cbi8qKlxuICogU2V0IGluZGV4IGBwYXRoc2AsIHNldCB0byBhIGZhbHN5XG4gKiB2YWx1ZSB0byBkaXNhYmxlIGluZGV4IHN1cHBvcnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8Qm9vbGVhbnxBcnJheX0gcGF0aHNcbiAqIEByZXR1cm4ge1NlbmRTdHJlYW19XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmluZGV4ID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGZ1bmN0aW9uIGluZGV4IChwYXRocykge1xuICB2YXIgaW5kZXggPSAhcGF0aHMgPyBbXSA6IG5vcm1hbGl6ZUxpc3QocGF0aHMsICdwYXRocyBhcmd1bWVudCcpXG4gIGRlYnVnKCdpbmRleCAlbycsIHBhdGhzKVxuICB0aGlzLl9pbmRleCA9IGluZGV4XG4gIHJldHVybiB0aGlzXG59LCAnc2VuZC5pbmRleDogcGFzcyBpbmRleCBhcyBvcHRpb24nKVxuXG4vKipcbiAqIFNldCByb290IGBwYXRoYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHJldHVybiB7U2VuZFN0cmVhbX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUucm9vdCA9IGZ1bmN0aW9uIHJvb3QgKHBhdGgpIHtcbiAgdGhpcy5fcm9vdCA9IHJlc29sdmUoU3RyaW5nKHBhdGgpKVxuICBkZWJ1Zygncm9vdCAlcycsIHRoaXMuX3Jvb3QpXG4gIHJldHVybiB0aGlzXG59XG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmZyb20gPSBkZXByZWNhdGUuZnVuY3Rpb24oU2VuZFN0cmVhbS5wcm90b3R5cGUucm9vdCxcbiAgJ3NlbmQuZnJvbTogcGFzcyByb290IGFzIG9wdGlvbicpXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnJvb3QgPSBkZXByZWNhdGUuZnVuY3Rpb24oU2VuZFN0cmVhbS5wcm90b3R5cGUucm9vdCxcbiAgJ3NlbmQucm9vdDogcGFzcyByb290IGFzIG9wdGlvbicpXG5cbi8qKlxuICogU2V0IG1heC1hZ2UgdG8gYG1heEFnZWAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1heEFnZVxuICogQHJldHVybiB7U2VuZFN0cmVhbX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUubWF4YWdlID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGZ1bmN0aW9uIG1heGFnZSAobWF4QWdlKSB7XG4gIHRoaXMuX21heGFnZSA9IHR5cGVvZiBtYXhBZ2UgPT09ICdzdHJpbmcnXG4gICAgPyBtcyhtYXhBZ2UpXG4gICAgOiBOdW1iZXIobWF4QWdlKVxuICB0aGlzLl9tYXhhZ2UgPSAhaXNOYU4odGhpcy5fbWF4YWdlKVxuICAgID8gTWF0aC5taW4oTWF0aC5tYXgoMCwgdGhpcy5fbWF4YWdlKSwgTUFYX01BWEFHRSlcbiAgICA6IDBcbiAgZGVidWcoJ21heC1hZ2UgJWQnLCB0aGlzLl9tYXhhZ2UpXG4gIHJldHVybiB0aGlzXG59LCAnc2VuZC5tYXhhZ2U6IHBhc3MgbWF4QWdlIGFzIG9wdGlvbicpXG5cbi8qKlxuICogRW1pdCBlcnJvciB3aXRoIGBzdGF0dXNgLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAqIEBwYXJhbSB7RXJyb3J9IFtlcnJdXG4gKiBAcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gZXJyb3IgKHN0YXR1cywgZXJyKSB7XG4gIC8vIGVtaXQgaWYgbGlzdGVuZXJzIGluc3RlYWQgb2YgcmVzcG9uZGluZ1xuICBpZiAoaGFzTGlzdGVuZXJzKHRoaXMsICdlcnJvcicpKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBjcmVhdGVIdHRwRXJyb3Ioc3RhdHVzLCBlcnIpKVxuICB9XG5cbiAgdmFyIHJlcyA9IHRoaXMucmVzXG4gIHZhciBtc2cgPSBzdGF0dXNlcy5tZXNzYWdlW3N0YXR1c10gfHwgU3RyaW5nKHN0YXR1cylcbiAgdmFyIGRvYyA9IGNyZWF0ZUh0bWxEb2N1bWVudCgnRXJyb3InLCBlc2NhcGVIdG1sKG1zZykpXG5cbiAgLy8gY2xlYXIgZXhpc3RpbmcgaGVhZGVyc1xuICBjbGVhckhlYWRlcnMocmVzKVxuXG4gIC8vIGFkZCBlcnJvciBoZWFkZXJzXG4gIGlmIChlcnIgJiYgZXJyLmhlYWRlcnMpIHtcbiAgICBzZXRIZWFkZXJzKHJlcywgZXJyLmhlYWRlcnMpXG4gIH1cblxuICAvLyBzZW5kIGJhc2ljIHJlc3BvbnNlXG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzXG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnKVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIEJ1ZmZlci5ieXRlTGVuZ3RoKGRvYykpXG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtU2VjdXJpdHktUG9saWN5JywgXCJkZWZhdWx0LXNyYyAnbm9uZSdcIilcbiAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJylcbiAgcmVzLmVuZChkb2MpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHBhdGhuYW1lIGVuZHMgd2l0aCBcIi9cIi5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5oYXNUcmFpbGluZ1NsYXNoID0gZnVuY3Rpb24gaGFzVHJhaWxpbmdTbGFzaCAoKSB7XG4gIHJldHVybiB0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdID09PSAnLydcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGlzIGEgY29uZGl0aW9uYWwgR0VUIHJlcXVlc3QuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmlzQ29uZGl0aW9uYWxHRVQgPSBmdW5jdGlvbiBpc0NvbmRpdGlvbmFsR0VUICgpIHtcbiAgcmV0dXJuIHRoaXMucmVxLmhlYWRlcnNbJ2lmLW1hdGNoJ10gfHxcbiAgICB0aGlzLnJlcS5oZWFkZXJzWydpZi11bm1vZGlmaWVkLXNpbmNlJ10gfHxcbiAgICB0aGlzLnJlcS5oZWFkZXJzWydpZi1ub25lLW1hdGNoJ10gfHxcbiAgICB0aGlzLnJlcS5oZWFkZXJzWydpZi1tb2RpZmllZC1zaW5jZSddXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgcHJlY29uZGl0aW9ucyBmYWlsZWQuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUuaXNQcmVjb25kaXRpb25GYWlsdXJlID0gZnVuY3Rpb24gaXNQcmVjb25kaXRpb25GYWlsdXJlICgpIHtcbiAgdmFyIHJlcSA9IHRoaXMucmVxXG4gIHZhciByZXMgPSB0aGlzLnJlc1xuXG4gIC8vIGlmLW1hdGNoXG4gIHZhciBtYXRjaCA9IHJlcS5oZWFkZXJzWydpZi1tYXRjaCddXG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBldGFnID0gcmVzLmdldEhlYWRlcignRVRhZycpXG4gICAgcmV0dXJuICFldGFnIHx8IChtYXRjaCAhPT0gJyonICYmIHBhcnNlVG9rZW5MaXN0KG1hdGNoKS5ldmVyeShmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaCAhPT0gZXRhZyAmJiBtYXRjaCAhPT0gJ1cvJyArIGV0YWcgJiYgJ1cvJyArIG1hdGNoICE9PSBldGFnXG4gICAgfSkpXG4gIH1cblxuICAvLyBpZi11bm1vZGlmaWVkLXNpbmNlXG4gIHZhciB1bm1vZGlmaWVkU2luY2UgPSBwYXJzZUh0dHBEYXRlKHJlcS5oZWFkZXJzWydpZi11bm1vZGlmaWVkLXNpbmNlJ10pXG4gIGlmICghaXNOYU4odW5tb2RpZmllZFNpbmNlKSkge1xuICAgIHZhciBsYXN0TW9kaWZpZWQgPSBwYXJzZUh0dHBEYXRlKHJlcy5nZXRIZWFkZXIoJ0xhc3QtTW9kaWZpZWQnKSlcbiAgICByZXR1cm4gaXNOYU4obGFzdE1vZGlmaWVkKSB8fCBsYXN0TW9kaWZpZWQgPiB1bm1vZGlmaWVkU2luY2VcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIFN0cmlwIHZhcmlvdXMgY29udGVudCBoZWFkZXIgZmllbGRzIGZvciBhIGNoYW5nZSBpbiBlbnRpdHkuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVDb250ZW50SGVhZGVyRmllbGRzID0gZnVuY3Rpb24gcmVtb3ZlQ29udGVudEhlYWRlckZpZWxkcyAoKSB7XG4gIHZhciByZXMgPSB0aGlzLnJlc1xuXG4gIHJlcy5yZW1vdmVIZWFkZXIoJ0NvbnRlbnQtRW5jb2RpbmcnKVxuICByZXMucmVtb3ZlSGVhZGVyKCdDb250ZW50LUxhbmd1YWdlJylcbiAgcmVzLnJlbW92ZUhlYWRlcignQ29udGVudC1MZW5ndGgnKVxuICByZXMucmVtb3ZlSGVhZGVyKCdDb250ZW50LVJhbmdlJylcbiAgcmVzLnJlbW92ZUhlYWRlcignQ29udGVudC1UeXBlJylcbn1cblxuLyoqXG4gKiBSZXNwb25kIHdpdGggMzA0IG5vdCBtb2RpZmllZC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5ub3RNb2RpZmllZCA9IGZ1bmN0aW9uIG5vdE1vZGlmaWVkICgpIHtcbiAgdmFyIHJlcyA9IHRoaXMucmVzXG4gIGRlYnVnKCdub3QgbW9kaWZpZWQnKVxuICB0aGlzLnJlbW92ZUNvbnRlbnRIZWFkZXJGaWVsZHMoKVxuICByZXMuc3RhdHVzQ29kZSA9IDMwNFxuICByZXMuZW5kKClcbn1cblxuLyoqXG4gKiBSYWlzZSBlcnJvciB0aGF0IGhlYWRlcnMgYWxyZWFkeSBzZW50LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmhlYWRlcnNBbHJlYWR5U2VudCA9IGZ1bmN0aW9uIGhlYWRlcnNBbHJlYWR5U2VudCAoKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0NhblxcJ3Qgc2V0IGhlYWRlcnMgYWZ0ZXIgdGhleSBhcmUgc2VudC4nKVxuICBkZWJ1ZygnaGVhZGVycyBhbHJlYWR5IHNlbnQnKVxuICB0aGlzLmVycm9yKDUwMCwgZXJyKVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIGNhY2hlYWJsZSwgYWthXG4gKiByZXNwb25kZWQgd2l0aCAyeHggb3IgMzA0IChzZWUgUkZDIDI2MTYgc2VjdGlvbiAxNC4yezUsNn0pLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5pc0NhY2hhYmxlID0gZnVuY3Rpb24gaXNDYWNoYWJsZSAoKSB7XG4gIHZhciBzdGF0dXNDb2RlID0gdGhpcy5yZXMuc3RhdHVzQ29kZVxuICByZXR1cm4gKHN0YXR1c0NvZGUgPj0gMjAwICYmIHN0YXR1c0NvZGUgPCAzMDApIHx8XG4gICAgc3RhdHVzQ29kZSA9PT0gMzA0XG59XG5cbi8qKlxuICogSGFuZGxlIHN0YXQoKSBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5vblN0YXRFcnJvciA9IGZ1bmN0aW9uIG9uU3RhdEVycm9yIChlcnJvcikge1xuICBzd2l0Y2ggKGVycm9yLmNvZGUpIHtcbiAgICBjYXNlICdFTkFNRVRPT0xPTkcnOlxuICAgIGNhc2UgJ0VOT0VOVCc6XG4gICAgY2FzZSAnRU5PVERJUic6XG4gICAgICB0aGlzLmVycm9yKDQwNCwgZXJyb3IpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLmVycm9yKDUwMCwgZXJyb3IpXG4gICAgICBicmVha1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGNhY2hlIGlzIGZyZXNoLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5pc0ZyZXNoID0gZnVuY3Rpb24gaXNGcmVzaCAoKSB7XG4gIHJldHVybiBmcmVzaCh0aGlzLnJlcS5oZWFkZXJzLCB7XG4gICAgZXRhZzogdGhpcy5yZXMuZ2V0SGVhZGVyKCdFVGFnJyksXG4gICAgJ2xhc3QtbW9kaWZpZWQnOiB0aGlzLnJlcy5nZXRIZWFkZXIoJ0xhc3QtTW9kaWZpZWQnKVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByYW5nZSBpcyBmcmVzaC5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUuaXNSYW5nZUZyZXNoID0gZnVuY3Rpb24gaXNSYW5nZUZyZXNoICgpIHtcbiAgdmFyIGlmUmFuZ2UgPSB0aGlzLnJlcS5oZWFkZXJzWydpZi1yYW5nZSddXG5cbiAgaWYgKCFpZlJhbmdlKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIGlmLXJhbmdlIGFzIGV0YWdcbiAgaWYgKGlmUmFuZ2UuaW5kZXhPZignXCInKSAhPT0gLTEpIHtcbiAgICB2YXIgZXRhZyA9IHRoaXMucmVzLmdldEhlYWRlcignRVRhZycpXG4gICAgcmV0dXJuIEJvb2xlYW4oZXRhZyAmJiBpZlJhbmdlLmluZGV4T2YoZXRhZykgIT09IC0xKVxuICB9XG5cbiAgLy8gaWYtcmFuZ2UgYXMgbW9kaWZpZWQgZGF0ZVxuICB2YXIgbGFzdE1vZGlmaWVkID0gdGhpcy5yZXMuZ2V0SGVhZGVyKCdMYXN0LU1vZGlmaWVkJylcbiAgcmV0dXJuIHBhcnNlSHR0cERhdGUobGFzdE1vZGlmaWVkKSA8PSBwYXJzZUh0dHBEYXRlKGlmUmFuZ2UpXG59XG5cbi8qKlxuICogUmVkaXJlY3QgdG8gcGF0aC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5yZWRpcmVjdCA9IGZ1bmN0aW9uIHJlZGlyZWN0IChwYXRoKSB7XG4gIHZhciByZXMgPSB0aGlzLnJlc1xuXG4gIGlmIChoYXNMaXN0ZW5lcnModGhpcywgJ2RpcmVjdG9yeScpKSB7XG4gICAgdGhpcy5lbWl0KCdkaXJlY3RvcnknLCByZXMsIHBhdGgpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGhpcy5oYXNUcmFpbGluZ1NsYXNoKCkpIHtcbiAgICB0aGlzLmVycm9yKDQwMylcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBsb2MgPSBlbmNvZGVVcmwoY29sbGFwc2VMZWFkaW5nU2xhc2hlcyh0aGlzLnBhdGggKyAnLycpKVxuICB2YXIgZG9jID0gY3JlYXRlSHRtbERvY3VtZW50KCdSZWRpcmVjdGluZycsICdSZWRpcmVjdGluZyB0byA8YSBocmVmPVwiJyArIGVzY2FwZUh0bWwobG9jKSArICdcIj4nICtcbiAgICBlc2NhcGVIdG1sKGxvYykgKyAnPC9hPicpXG5cbiAgLy8gcmVkaXJlY3RcbiAgcmVzLnN0YXR1c0NvZGUgPSAzMDFcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcpXG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgQnVmZmVyLmJ5dGVMZW5ndGgoZG9jKSlcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBcImRlZmF1bHQtc3JjICdub25lJ1wiKVxuICByZXMuc2V0SGVhZGVyKCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKVxuICByZXMuc2V0SGVhZGVyKCdMb2NhdGlvbicsIGxvYylcbiAgcmVzLmVuZChkb2MpXG59XG5cbi8qKlxuICogUGlwZSB0byBgcmVzLlxuICpcbiAqIEBwYXJhbSB7U3RyZWFtfSByZXNcbiAqIEByZXR1cm4ge1N0cmVhbX0gcmVzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiBwaXBlIChyZXMpIHtcbiAgLy8gcm9vdCBwYXRoXG4gIHZhciByb290ID0gdGhpcy5fcm9vdFxuXG4gIC8vIHJlZmVyZW5jZXNcbiAgdGhpcy5yZXMgPSByZXNcblxuICAvLyBkZWNvZGUgdGhlIHBhdGhcbiAgdmFyIHBhdGggPSBkZWNvZGUodGhpcy5wYXRoKVxuICBpZiAocGF0aCA9PT0gLTEpIHtcbiAgICB0aGlzLmVycm9yKDQwMClcbiAgICByZXR1cm4gcmVzXG4gIH1cblxuICAvLyBudWxsIGJ5dGUocylcbiAgaWYgKH5wYXRoLmluZGV4T2YoJ1xcMCcpKSB7XG4gICAgdGhpcy5lcnJvcig0MDApXG4gICAgcmV0dXJuIHJlc1xuICB9XG5cbiAgdmFyIHBhcnRzXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgLy8gbm9ybWFsaXplXG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHBhdGggPSBub3JtYWxpemUoJy4nICsgc2VwICsgcGF0aClcbiAgICB9XG5cbiAgICAvLyBtYWxpY2lvdXMgcGF0aFxuICAgIGlmIChVUF9QQVRIX1JFR0VYUC50ZXN0KHBhdGgpKSB7XG4gICAgICBkZWJ1ZygnbWFsaWNpb3VzIHBhdGggXCIlc1wiJywgcGF0aClcbiAgICAgIHRoaXMuZXJyb3IoNDAzKVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cblxuICAgIC8vIGV4cGxvZGUgcGF0aCBwYXJ0c1xuICAgIHBhcnRzID0gcGF0aC5zcGxpdChzZXApXG5cbiAgICAvLyBqb2luIC8gbm9ybWFsaXplIGZyb20gb3B0aW9uYWwgcm9vdCBkaXJcbiAgICBwYXRoID0gbm9ybWFsaXplKGpvaW4ocm9vdCwgcGF0aCkpXG4gIH0gZWxzZSB7XG4gICAgLy8gXCIuLlwiIGlzIG1hbGljaW91cyB3aXRob3V0IFwicm9vdFwiXG4gICAgaWYgKFVQX1BBVEhfUkVHRVhQLnRlc3QocGF0aCkpIHtcbiAgICAgIGRlYnVnKCdtYWxpY2lvdXMgcGF0aCBcIiVzXCInLCBwYXRoKVxuICAgICAgdGhpcy5lcnJvcig0MDMpXG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgLy8gZXhwbG9kZSBwYXRoIHBhcnRzXG4gICAgcGFydHMgPSBub3JtYWxpemUocGF0aCkuc3BsaXQoc2VwKVxuXG4gICAgLy8gcmVzb2x2ZSB0aGUgcGF0aFxuICAgIHBhdGggPSByZXNvbHZlKHBhdGgpXG4gIH1cblxuICAvLyBkb3RmaWxlIGhhbmRsaW5nXG4gIGlmIChjb250YWluc0RvdEZpbGUocGFydHMpKSB7XG4gICAgdmFyIGFjY2VzcyA9IHRoaXMuX2RvdGZpbGVzXG5cbiAgICAvLyBsZWdhY3kgc3VwcG9ydFxuICAgIGlmIChhY2Nlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWNjZXNzID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1bMF0gPT09ICcuJ1xuICAgICAgICA/ICh0aGlzLl9oaWRkZW4gPyAnYWxsb3cnIDogJ2lnbm9yZScpXG4gICAgICAgIDogJ2FsbG93J1xuICAgIH1cblxuICAgIGRlYnVnKCclcyBkb3RmaWxlIFwiJXNcIicsIGFjY2VzcywgcGF0aClcbiAgICBzd2l0Y2ggKGFjY2Vzcykge1xuICAgICAgY2FzZSAnYWxsb3cnOlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnZGVueSc6XG4gICAgICAgIHRoaXMuZXJyb3IoNDAzKVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICBjYXNlICdpZ25vcmUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5lcnJvcig0MDQpXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG4gIH1cblxuICAvLyBpbmRleCBmaWxlIHN1cHBvcnRcbiAgaWYgKHRoaXMuX2luZGV4Lmxlbmd0aCAmJiB0aGlzLmhhc1RyYWlsaW5nU2xhc2goKSkge1xuICAgIHRoaXMuc2VuZEluZGV4KHBhdGgpXG4gICAgcmV0dXJuIHJlc1xuICB9XG5cbiAgdGhpcy5zZW5kRmlsZShwYXRoKVxuICByZXR1cm4gcmVzXG59XG5cbi8qKlxuICogVHJhbnNmZXIgYHBhdGhgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiBzZW5kIChwYXRoLCBzdGF0KSB7XG4gIHZhciBsZW4gPSBzdGF0LnNpemVcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcbiAgdmFyIG9wdHMgPSB7fVxuICB2YXIgcmVzID0gdGhpcy5yZXNcbiAgdmFyIHJlcSA9IHRoaXMucmVxXG4gIHZhciByYW5nZXMgPSByZXEuaGVhZGVycy5yYW5nZVxuICB2YXIgb2Zmc2V0ID0gb3B0aW9ucy5zdGFydCB8fCAwXG5cbiAgaWYgKGhlYWRlcnNTZW50KHJlcykpIHtcbiAgICAvLyBpbXBvc3NpYmxlIHRvIHNlbmQgbm93XG4gICAgdGhpcy5oZWFkZXJzQWxyZWFkeVNlbnQoKVxuICAgIHJldHVyblxuICB9XG5cbiAgZGVidWcoJ3BpcGUgXCIlc1wiJywgcGF0aClcblxuICAvLyBzZXQgaGVhZGVyIGZpZWxkc1xuICB0aGlzLnNldEhlYWRlcihwYXRoLCBzdGF0KVxuXG4gIC8vIHNldCBjb250ZW50LXR5cGVcbiAgdGhpcy50eXBlKHBhdGgpXG5cbiAgLy8gY29uZGl0aW9uYWwgR0VUIHN1cHBvcnRcbiAgaWYgKHRoaXMuaXNDb25kaXRpb25hbEdFVCgpKSB7XG4gICAgaWYgKHRoaXMuaXNQcmVjb25kaXRpb25GYWlsdXJlKCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoNDEyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDYWNoYWJsZSgpICYmIHRoaXMuaXNGcmVzaCgpKSB7XG4gICAgICB0aGlzLm5vdE1vZGlmaWVkKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8vIGFkanVzdCBsZW4gdG8gc3RhcnQvZW5kIG9wdGlvbnNcbiAgbGVuID0gTWF0aC5tYXgoMCwgbGVuIC0gb2Zmc2V0KVxuICBpZiAob3B0aW9ucy5lbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBieXRlcyA9IG9wdGlvbnMuZW5kIC0gb2Zmc2V0ICsgMVxuICAgIGlmIChsZW4gPiBieXRlcykgbGVuID0gYnl0ZXNcbiAgfVxuXG4gIC8vIFJhbmdlIHN1cHBvcnRcbiAgaWYgKHRoaXMuX2FjY2VwdFJhbmdlcyAmJiBCWVRFU19SQU5HRV9SRUdFWFAudGVzdChyYW5nZXMpKSB7XG4gICAgLy8gcGFyc2VcbiAgICByYW5nZXMgPSBwYXJzZVJhbmdlKGxlbiwgcmFuZ2VzLCB7XG4gICAgICBjb21iaW5lOiB0cnVlXG4gICAgfSlcblxuICAgIC8vIElmLVJhbmdlIHN1cHBvcnRcbiAgICBpZiAoIXRoaXMuaXNSYW5nZUZyZXNoKCkpIHtcbiAgICAgIGRlYnVnKCdyYW5nZSBzdGFsZScpXG4gICAgICByYW5nZXMgPSAtMlxuICAgIH1cblxuICAgIC8vIHVuc2F0aXNmaWFibGVcbiAgICBpZiAocmFuZ2VzID09PSAtMSkge1xuICAgICAgZGVidWcoJ3JhbmdlIHVuc2F0aXNmaWFibGUnKVxuXG4gICAgICAvLyBDb250ZW50LVJhbmdlXG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVJhbmdlJywgY29udGVudFJhbmdlKCdieXRlcycsIGxlbikpXG5cbiAgICAgIC8vIDQxNiBSZXF1ZXN0ZWQgUmFuZ2UgTm90IFNhdGlzZmlhYmxlXG4gICAgICByZXR1cm4gdGhpcy5lcnJvcig0MTYsIHtcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1SYW5nZSc6IHJlcy5nZXRIZWFkZXIoJ0NvbnRlbnQtUmFuZ2UnKSB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIHZhbGlkIChzeW50YWN0aWNhbGx5IGludmFsaWQvbXVsdGlwbGUgcmFuZ2VzIGFyZSB0cmVhdGVkIGFzIGEgcmVndWxhciByZXNwb25zZSlcbiAgICBpZiAocmFuZ2VzICE9PSAtMiAmJiByYW5nZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBkZWJ1ZygncmFuZ2UgJWonLCByYW5nZXMpXG5cbiAgICAgIC8vIENvbnRlbnQtUmFuZ2VcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gMjA2XG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVJhbmdlJywgY29udGVudFJhbmdlKCdieXRlcycsIGxlbiwgcmFuZ2VzWzBdKSlcblxuICAgICAgLy8gYWRqdXN0IGZvciByZXF1ZXN0ZWQgcmFuZ2VcbiAgICAgIG9mZnNldCArPSByYW5nZXNbMF0uc3RhcnRcbiAgICAgIGxlbiA9IHJhbmdlc1swXS5lbmQgLSByYW5nZXNbMF0uc3RhcnQgKyAxXG4gICAgfVxuICB9XG5cbiAgLy8gY2xvbmUgb3B0aW9uc1xuICBmb3IgKHZhciBwcm9wIGluIG9wdGlvbnMpIHtcbiAgICBvcHRzW3Byb3BdID0gb3B0aW9uc1twcm9wXVxuICB9XG5cbiAgLy8gc2V0IHJlYWQgb3B0aW9uc1xuICBvcHRzLnN0YXJ0ID0gb2Zmc2V0XG4gIG9wdHMuZW5kID0gTWF0aC5tYXgob2Zmc2V0LCBvZmZzZXQgKyBsZW4gLSAxKVxuXG4gIC8vIGNvbnRlbnQtbGVuZ3RoXG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgbGVuKVxuXG4gIC8vIEhFQUQgc3VwcG9ydFxuICBpZiAocmVxLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgcmVzLmVuZCgpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0aGlzLnN0cmVhbShwYXRoLCBvcHRzKVxufVxuXG4vKipcbiAqIFRyYW5zZmVyIGZpbGUgZm9yIGBwYXRoYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQGFwaSBwcml2YXRlXG4gKi9cblNlbmRTdHJlYW0ucHJvdG90eXBlLnNlbmRGaWxlID0gZnVuY3Rpb24gc2VuZEZpbGUgKHBhdGgpIHtcbiAgdmFyIGkgPSAwXG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGRlYnVnKCdzdGF0IFwiJXNcIicsIHBhdGgpXG4gIGZzLnN0YXQocGF0aCwgZnVuY3Rpb24gb25zdGF0IChlcnIsIHN0YXQpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRU5PRU5UJyAmJiAhZXh0bmFtZShwYXRoKSAmJiBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gIT09IHNlcCkge1xuICAgICAgLy8gbm90IGZvdW5kLCBjaGVjayBleHRlbnNpb25zXG4gICAgICByZXR1cm4gbmV4dChlcnIpXG4gICAgfVxuICAgIGlmIChlcnIpIHJldHVybiBzZWxmLm9uU3RhdEVycm9yKGVycilcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gc2VsZi5yZWRpcmVjdChwYXRoKVxuICAgIHNlbGYuZW1pdCgnZmlsZScsIHBhdGgsIHN0YXQpXG4gICAgc2VsZi5zZW5kKHBhdGgsIHN0YXQpXG4gIH0pXG5cbiAgZnVuY3Rpb24gbmV4dCAoZXJyKSB7XG4gICAgaWYgKHNlbGYuX2V4dGVuc2lvbnMubGVuZ3RoIDw9IGkpIHtcbiAgICAgIHJldHVybiBlcnJcbiAgICAgICAgPyBzZWxmLm9uU3RhdEVycm9yKGVycilcbiAgICAgICAgOiBzZWxmLmVycm9yKDQwNClcbiAgICB9XG5cbiAgICB2YXIgcCA9IHBhdGggKyAnLicgKyBzZWxmLl9leHRlbnNpb25zW2krK11cblxuICAgIGRlYnVnKCdzdGF0IFwiJXNcIicsIHApXG4gICAgZnMuc3RhdChwLCBmdW5jdGlvbiAoZXJyLCBzdGF0KSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gbmV4dCgpXG4gICAgICBzZWxmLmVtaXQoJ2ZpbGUnLCBwLCBzdGF0KVxuICAgICAgc2VsZi5zZW5kKHAsIHN0YXQpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFRyYW5zZmVyIGluZGV4IGZvciBgcGF0aGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5zZW5kSW5kZXggPSBmdW5jdGlvbiBzZW5kSW5kZXggKHBhdGgpIHtcbiAgdmFyIGkgPSAtMVxuICB2YXIgc2VsZiA9IHRoaXNcblxuICBmdW5jdGlvbiBuZXh0IChlcnIpIHtcbiAgICBpZiAoKytpID49IHNlbGYuX2luZGV4Lmxlbmd0aCkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHNlbGYub25TdGF0RXJyb3IoZXJyKVxuICAgICAgcmV0dXJuIHNlbGYuZXJyb3IoNDA0KVxuICAgIH1cblxuICAgIHZhciBwID0gam9pbihwYXRoLCBzZWxmLl9pbmRleFtpXSlcblxuICAgIGRlYnVnKCdzdGF0IFwiJXNcIicsIHApXG4gICAgZnMuc3RhdChwLCBmdW5jdGlvbiAoZXJyLCBzdGF0KSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gbmV4dCgpXG4gICAgICBzZWxmLmVtaXQoJ2ZpbGUnLCBwLCBzdGF0KVxuICAgICAgc2VsZi5zZW5kKHAsIHN0YXQpXG4gICAgfSlcbiAgfVxuXG4gIG5leHQoKVxufVxuXG4vKipcbiAqIFN0cmVhbSBgcGF0aGAgdG8gdGhlIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUuc3RyZWFtID0gZnVuY3Rpb24gc3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgcmVzID0gdGhpcy5yZXNcblxuICAvLyBwaXBlXG4gIHZhciBzdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgsIG9wdGlvbnMpXG4gIHRoaXMuZW1pdCgnc3RyZWFtJywgc3RyZWFtKVxuICBzdHJlYW0ucGlwZShyZXMpXG5cbiAgLy8gY2xlYW51cFxuICBmdW5jdGlvbiBjbGVhbnVwICgpIHtcbiAgICBkZXN0cm95KHN0cmVhbSwgdHJ1ZSlcbiAgfVxuXG4gIC8vIHJlc3BvbnNlIGZpbmlzaGVkLCBjbGVhbnVwXG4gIG9uRmluaXNoZWQocmVzLCBjbGVhbnVwKVxuXG4gIC8vIGVycm9yIGhhbmRsaW5nXG4gIHN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiBvbmVycm9yIChlcnIpIHtcbiAgICAvLyBjbGVhbiB1cCBzdHJlYW0gZWFybHlcbiAgICBjbGVhbnVwKClcblxuICAgIC8vIGVycm9yXG4gICAgc2VsZi5vblN0YXRFcnJvcihlcnIpXG4gIH0pXG5cbiAgLy8gZW5kXG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gb25lbmQgKCkge1xuICAgIHNlbGYuZW1pdCgnZW5kJylcbiAgfSlcbn1cblxuLyoqXG4gKiBTZXQgY29udGVudC10eXBlIGJhc2VkIG9uIGBwYXRoYFxuICogaWYgaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiB0eXBlIChwYXRoKSB7XG4gIHZhciByZXMgPSB0aGlzLnJlc1xuXG4gIGlmIChyZXMuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSkgcmV0dXJuXG5cbiAgdmFyIHR5cGUgPSBtaW1lLmxvb2t1cChwYXRoKVxuXG4gIGlmICghdHlwZSkge1xuICAgIGRlYnVnKCdubyBjb250ZW50LXR5cGUnKVxuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGNoYXJzZXQgPSBtaW1lLmNoYXJzZXRzLmxvb2t1cCh0eXBlKVxuXG4gIGRlYnVnKCdjb250ZW50LXR5cGUgJXMnLCB0eXBlKVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCB0eXBlICsgKGNoYXJzZXQgPyAnOyBjaGFyc2V0PScgKyBjaGFyc2V0IDogJycpKVxufVxuXG4vKipcbiAqIFNldCByZXNwb25zZSBoZWFkZXIgZmllbGRzLCBtb3N0XG4gKiBmaWVsZHMgbWF5IGJlIHByZS1kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUuc2V0SGVhZGVyID0gZnVuY3Rpb24gc2V0SGVhZGVyIChwYXRoLCBzdGF0KSB7XG4gIHZhciByZXMgPSB0aGlzLnJlc1xuXG4gIHRoaXMuZW1pdCgnaGVhZGVycycsIHJlcywgcGF0aCwgc3RhdClcblxuICBpZiAodGhpcy5fYWNjZXB0UmFuZ2VzICYmICFyZXMuZ2V0SGVhZGVyKCdBY2NlcHQtUmFuZ2VzJykpIHtcbiAgICBkZWJ1ZygnYWNjZXB0IHJhbmdlcycpXG4gICAgcmVzLnNldEhlYWRlcignQWNjZXB0LVJhbmdlcycsICdieXRlcycpXG4gIH1cblxuICBpZiAodGhpcy5fY2FjaGVDb250cm9sICYmICFyZXMuZ2V0SGVhZGVyKCdDYWNoZS1Db250cm9sJykpIHtcbiAgICB2YXIgY2FjaGVDb250cm9sID0gJ3B1YmxpYywgbWF4LWFnZT0nICsgTWF0aC5mbG9vcih0aGlzLl9tYXhhZ2UgLyAxMDAwKVxuXG4gICAgaWYgKHRoaXMuX2ltbXV0YWJsZSkge1xuICAgICAgY2FjaGVDb250cm9sICs9ICcsIGltbXV0YWJsZSdcbiAgICB9XG5cbiAgICBkZWJ1ZygnY2FjaGUtY29udHJvbCAlcycsIGNhY2hlQ29udHJvbClcbiAgICByZXMuc2V0SGVhZGVyKCdDYWNoZS1Db250cm9sJywgY2FjaGVDb250cm9sKVxuICB9XG5cbiAgaWYgKHRoaXMuX2xhc3RNb2RpZmllZCAmJiAhcmVzLmdldEhlYWRlcignTGFzdC1Nb2RpZmllZCcpKSB7XG4gICAgdmFyIG1vZGlmaWVkID0gc3RhdC5tdGltZS50b1VUQ1N0cmluZygpXG4gICAgZGVidWcoJ21vZGlmaWVkICVzJywgbW9kaWZpZWQpXG4gICAgcmVzLnNldEhlYWRlcignTGFzdC1Nb2RpZmllZCcsIG1vZGlmaWVkKVxuICB9XG5cbiAgaWYgKHRoaXMuX2V0YWcgJiYgIXJlcy5nZXRIZWFkZXIoJ0VUYWcnKSkge1xuICAgIHZhciB2YWwgPSBldGFnKHN0YXQpXG4gICAgZGVidWcoJ2V0YWcgJXMnLCB2YWwpXG4gICAgcmVzLnNldEhlYWRlcignRVRhZycsIHZhbClcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIGFsbCBoZWFkZXJzIGZyb20gYSByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNsZWFySGVhZGVycyAocmVzKSB7XG4gIHZhciBoZWFkZXJzID0gZ2V0SGVhZGVyTmFtZXMocmVzKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy5yZW1vdmVIZWFkZXIoaGVhZGVyc1tpXSlcbiAgfVxufVxuXG4vKipcbiAqIENvbGxhcHNlIGFsbCBsZWFkaW5nIHNsYXNoZXMgaW50byBhIHNpbmdsZSBzbGFzaFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbGxhcHNlTGVhZGluZ1NsYXNoZXMgKHN0cikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHJbaV0gIT09ICcvJykge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaSA+IDFcbiAgICA/ICcvJyArIHN0ci5zdWJzdHIoaSlcbiAgICA6IHN0clxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBwYXRoIHBhcnRzIGNvbnRhaW4gYSBkb3RmaWxlLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbnRhaW5zRG90RmlsZSAocGFydHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJ0ID0gcGFydHNbaV1cbiAgICBpZiAocGFydC5sZW5ndGggPiAxICYmIHBhcnRbMF0gPT09ICcuJykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBDb250ZW50LVJhbmdlIGhlYWRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEBwYXJhbSB7YXJyYXl9IFtyYW5nZV1cbiAqL1xuXG5mdW5jdGlvbiBjb250ZW50UmFuZ2UgKHR5cGUsIHNpemUsIHJhbmdlKSB7XG4gIHJldHVybiB0eXBlICsgJyAnICsgKHJhbmdlID8gcmFuZ2Uuc3RhcnQgKyAnLScgKyByYW5nZS5lbmQgOiAnKicpICsgJy8nICsgc2l6ZVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG1pbmltYWwgSFRNTCBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBib2R5XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUh0bWxEb2N1bWVudCAodGl0bGUsIGJvZHkpIHtcbiAgcmV0dXJuICc8IURPQ1RZUEUgaHRtbD5cXG4nICtcbiAgICAnPGh0bWwgbGFuZz1cImVuXCI+XFxuJyArXG4gICAgJzxoZWFkPlxcbicgK1xuICAgICc8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cXG4nICtcbiAgICAnPHRpdGxlPicgKyB0aXRsZSArICc8L3RpdGxlPlxcbicgK1xuICAgICc8L2hlYWQ+XFxuJyArXG4gICAgJzxib2R5PlxcbicgK1xuICAgICc8cHJlPicgKyBib2R5ICsgJzwvcHJlPlxcbicgK1xuICAgICc8L2JvZHk+XFxuJyArXG4gICAgJzwvaHRtbD5cXG4nXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgSHR0cEVycm9yIG9iamVjdCBmcm9tIHNpbXBsZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICogQHBhcmFtIHtFcnJvcnxvYmplY3R9IGVyclxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVIdHRwRXJyb3IgKHN0YXR1cywgZXJyKSB7XG4gIGlmICghZXJyKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVycm9yKHN0YXR1cylcbiAgfVxuXG4gIHJldHVybiBlcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgID8gY3JlYXRlRXJyb3Ioc3RhdHVzLCBlcnIsIHsgZXhwb3NlOiBmYWxzZSB9KVxuICAgIDogY3JlYXRlRXJyb3Ioc3RhdHVzLCBlcnIpXG59XG5cbi8qKlxuICogZGVjb2RlVVJJQ29tcG9uZW50LlxuICpcbiAqIEFsbG93cyBWOCB0byBvbmx5IGRlb3B0aW1pemUgdGhpcyBmbiBpbnN0ZWFkIG9mIGFsbFxuICogb2Ygc2VuZCgpLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBkZWNvZGUgKHBhdGgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAtMVxuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBoZWFkZXIgbmFtZXMgb24gYSByZXNwbnNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNcbiAqIEByZXR1cm5zIHthcnJheVtzdHJpbmddfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRIZWFkZXJOYW1lcyAocmVzKSB7XG4gIHJldHVybiB0eXBlb2YgcmVzLmdldEhlYWRlck5hbWVzICE9PSAnZnVuY3Rpb24nXG4gICAgPyBPYmplY3Qua2V5cyhyZXMuX2hlYWRlcnMgfHwge30pXG4gICAgOiByZXMuZ2V0SGVhZGVyTmFtZXMoKVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBlbWl0dGVyIGhhcyBsaXN0ZW5lcnMgb2YgYSBnaXZlbiB0eXBlLlxuICpcbiAqIFRoZSB3YXkgdG8gZG8gdGhpcyBjaGVjayBpcyBkb25lIHRocmVlIGRpZmZlcmVudCB3YXlzIGluIE5vZGUuanMgPj0gMC44XG4gKiBzbyB0aGlzIGNvbnNvbGlkYXRlcyB0aGVtIGludG8gYSBtaW5pbWFsIHNldCB1c2luZyBpbnN0YW5jZSBtZXRob2RzLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGhhc0xpc3RlbmVycyAoZW1pdHRlciwgdHlwZSkge1xuICB2YXIgY291bnQgPSB0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ICE9PSAnZnVuY3Rpb24nXG4gICAgPyBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGhcbiAgICA6IGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKVxuXG4gIHJldHVybiBjb3VudCA+IDBcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHJlc3BvbnNlIGhlYWRlcnMgaGF2ZSBiZWVuIHNlbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGhlYWRlcnNTZW50IChyZXMpIHtcbiAgcmV0dXJuIHR5cGVvZiByZXMuaGVhZGVyc1NlbnQgIT09ICdib29sZWFuJ1xuICAgID8gQm9vbGVhbihyZXMuX2hlYWRlcilcbiAgICA6IHJlcy5oZWFkZXJzU2VudFxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgaW5kZXggb3B0aW9uIGludG8gYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtIHtib29sZWFufHN0cmluZ3xhcnJheX0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVMaXN0ICh2YWwsIG5hbWUpIHtcbiAgdmFyIGxpc3QgPSBbXS5jb25jYXQodmFsIHx8IFtdKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0eXBlb2YgbGlzdFtpXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobmFtZSArICcgbXVzdCBiZSBhcnJheSBvZiBzdHJpbmdzIG9yIGZhbHNlJylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGlzdFxufVxuXG4vKipcbiAqIFBhcnNlIGFuIEhUVFAgRGF0ZSBpbnRvIGEgbnVtYmVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSHR0cERhdGUgKGRhdGUpIHtcbiAgdmFyIHRpbWVzdGFtcCA9IGRhdGUgJiYgRGF0ZS5wYXJzZShkYXRlKVxuXG4gIHJldHVybiB0eXBlb2YgdGltZXN0YW1wID09PSAnbnVtYmVyJ1xuICAgID8gdGltZXN0YW1wXG4gICAgOiBOYU5cbn1cblxuLyoqXG4gKiBQYXJzZSBhIEhUVFAgdG9rZW4gbGlzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlVG9rZW5MaXN0IChzdHIpIHtcbiAgdmFyIGVuZCA9IDBcbiAgdmFyIGxpc3QgPSBbXVxuICB2YXIgc3RhcnQgPSAwXG5cbiAgLy8gZ2F0aGVyIHRva2Vuc1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc3dpdGNoIChzdHIuY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSAweDIwOiAvKiAgICovXG4gICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgICAgICAgc3RhcnQgPSBlbmQgPSBpICsgMVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDB4MmM6IC8qICwgKi9cbiAgICAgICAgaWYgKHN0YXJ0ICE9PSBlbmQpIHtcbiAgICAgICAgICBsaXN0LnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgZW5kKSlcbiAgICAgICAgfVxuICAgICAgICBzdGFydCA9IGVuZCA9IGkgKyAxXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbmQgPSBpICsgMVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmFsIHRva2VuXG4gIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgbGlzdC5wdXNoKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG4gIH1cblxuICByZXR1cm4gbGlzdFxufVxuXG4vKipcbiAqIFNldCBhbiBvYmplY3Qgb2YgaGVhZGVycyBvbiBhIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNldEhlYWRlcnMgKHJlcywgaGVhZGVycykge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV1cbiAgICByZXMuc2V0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKVxuICB9XG59XG4iLCAiLyohXG4gKiBmb3J3YXJkZWRcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTcgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZm9yd2FyZGVkXG5cbi8qKlxuICogR2V0IGFsbCBhZGRyZXNzZXMgaW4gdGhlIHJlcXVlc3QsIHVzaW5nIHRoZSBgWC1Gb3J3YXJkZWQtRm9yYCBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlcVxuICogQHJldHVybiB7YXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9yd2FyZGVkIChyZXEpIHtcbiAgaWYgKCFyZXEpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCByZXEgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgLy8gc2ltcGxlIGhlYWRlciBwYXJzaW5nXG4gIHZhciBwcm94eUFkZHJzID0gcGFyc2UocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddIHx8ICcnKVxuICB2YXIgc29ja2V0QWRkciA9IGdldFNvY2tldEFkZHIocmVxKVxuICB2YXIgYWRkcnMgPSBbc29ja2V0QWRkcl0uY29uY2F0KHByb3h5QWRkcnMpXG5cbiAgLy8gcmV0dXJuIGFsbCBhZGRyZXNzZXNcbiAgcmV0dXJuIGFkZHJzXG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2NrZXQgYWRkcmVzcyBmb3IgYSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0U29ja2V0QWRkciAocmVxKSB7XG4gIHJldHVybiByZXEuc29ja2V0XG4gICAgPyByZXEuc29ja2V0LnJlbW90ZUFkZHJlc3NcbiAgICA6IHJlcS5jb25uZWN0aW9uLnJlbW90ZUFkZHJlc3Ncbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgWC1Gb3J3YXJkZWQtRm9yIGhlYWRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlIChoZWFkZXIpIHtcbiAgdmFyIGVuZCA9IGhlYWRlci5sZW5ndGhcbiAgdmFyIGxpc3QgPSBbXVxuICB2YXIgc3RhcnQgPSBoZWFkZXIubGVuZ3RoXG5cbiAgLy8gZ2F0aGVyIGFkZHJlc3NlcywgYmFja3dhcmRzXG4gIGZvciAodmFyIGkgPSBoZWFkZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBzd2l0Y2ggKGhlYWRlci5jaGFyQ29kZUF0KGkpKSB7XG4gICAgICBjYXNlIDB4MjA6IC8qICAgKi9cbiAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICAgICAgICBzdGFydCA9IGVuZCA9IGlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAweDJjOiAvKiAsICovXG4gICAgICAgIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgICAgICAgbGlzdC5wdXNoKGhlYWRlci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgPSBlbmQgPSBpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdGFydCA9IGlcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyBmaW5hbCBhZGRyZXNzXG4gIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgbGlzdC5wdXNoKGhlYWRlci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG4gIH1cblxuICByZXR1cm4gbGlzdFxufVxuIiwgIihmdW5jdGlvbigpIHtcbiAgdmFyIGV4cGFuZElQdjYsIGlwYWRkciwgaXB2NFBhcnQsIGlwdjRSZWdleGVzLCBpcHY2UGFydCwgaXB2NlJlZ2V4ZXMsIG1hdGNoQ0lEUiwgcm9vdCwgem9uZUluZGV4O1xuXG4gIGlwYWRkciA9IHt9O1xuXG4gIHJvb3QgPSB0aGlzO1xuXG4gIGlmICgodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUgIT09IG51bGwpICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBpcGFkZHI7XG4gIH0gZWxzZSB7XG4gICAgcm9vdFsnaXBhZGRyJ10gPSBpcGFkZHI7XG4gIH1cblxuICBtYXRjaENJRFIgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCBwYXJ0U2l6ZSwgY2lkckJpdHMpIHtcbiAgICB2YXIgcGFydCwgc2hpZnQ7XG4gICAgaWYgKGZpcnN0Lmxlbmd0aCAhPT0gc2Vjb25kLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiBjYW5ub3QgbWF0Y2ggQ0lEUiBmb3Igb2JqZWN0cyB3aXRoIGRpZmZlcmVudCBsZW5ndGhzXCIpO1xuICAgIH1cbiAgICBwYXJ0ID0gMDtcbiAgICB3aGlsZSAoY2lkckJpdHMgPiAwKSB7XG4gICAgICBzaGlmdCA9IHBhcnRTaXplIC0gY2lkckJpdHM7XG4gICAgICBpZiAoc2hpZnQgPCAwKSB7XG4gICAgICAgIHNoaWZ0ID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChmaXJzdFtwYXJ0XSA+PiBzaGlmdCAhPT0gc2Vjb25kW3BhcnRdID4+IHNoaWZ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNpZHJCaXRzIC09IHBhcnRTaXplO1xuICAgICAgcGFydCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBpcGFkZHIuc3VibmV0TWF0Y2ggPSBmdW5jdGlvbihhZGRyZXNzLCByYW5nZUxpc3QsIGRlZmF1bHROYW1lKSB7XG4gICAgdmFyIGssIGxlbiwgcmFuZ2VOYW1lLCByYW5nZVN1Ym5ldHMsIHN1Ym5ldDtcbiAgICBpZiAoZGVmYXVsdE5hbWUgPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdE5hbWUgPSAndW5pY2FzdCc7XG4gICAgfVxuICAgIGZvciAocmFuZ2VOYW1lIGluIHJhbmdlTGlzdCkge1xuICAgICAgcmFuZ2VTdWJuZXRzID0gcmFuZ2VMaXN0W3JhbmdlTmFtZV07XG4gICAgICBpZiAocmFuZ2VTdWJuZXRzWzBdICYmICEocmFuZ2VTdWJuZXRzWzBdIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgIHJhbmdlU3VibmV0cyA9IFtyYW5nZVN1Ym5ldHNdO1xuICAgICAgfVxuICAgICAgZm9yIChrID0gMCwgbGVuID0gcmFuZ2VTdWJuZXRzLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7XG4gICAgICAgIHN1Ym5ldCA9IHJhbmdlU3VibmV0c1trXTtcbiAgICAgICAgaWYgKGFkZHJlc3Mua2luZCgpID09PSBzdWJuZXRbMF0ua2luZCgpKSB7XG4gICAgICAgICAgaWYgKGFkZHJlc3MubWF0Y2guYXBwbHkoYWRkcmVzcywgc3VibmV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJhbmdlTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHROYW1lO1xuICB9O1xuXG4gIGlwYWRkci5JUHY0ID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIElQdjQob2N0ZXRzKSB7XG4gICAgICB2YXIgaywgbGVuLCBvY3RldDtcbiAgICAgIGlmIChvY3RldHMubGVuZ3RoICE9PSA0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogaXB2NCBvY3RldCBjb3VudCBzaG91bGQgYmUgNFwiKTtcbiAgICAgIH1cbiAgICAgIGZvciAoayA9IDAsIGxlbiA9IG9jdGV0cy5sZW5ndGg7IGsgPCBsZW47IGsrKykge1xuICAgICAgICBvY3RldCA9IG9jdGV0c1trXTtcbiAgICAgICAgaWYgKCEoKDAgPD0gb2N0ZXQgJiYgb2N0ZXQgPD0gMjU1KSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IGlwdjQgb2N0ZXQgc2hvdWxkIGZpdCBpbiA4IGJpdHNcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMub2N0ZXRzID0gb2N0ZXRzO1xuICAgIH1cblxuICAgIElQdjQucHJvdG90eXBlLmtpbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAnaXB2NCc7XG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5vY3RldHMuam9pbihcIi5cIik7XG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnRvTm9ybWFsaXplZFN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUudG9CeXRlQXJyYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm9jdGV0cy5zbGljZSgwKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbihvdGhlciwgY2lkclJhbmdlKSB7XG4gICAgICB2YXIgcmVmO1xuICAgICAgaWYgKGNpZHJSYW5nZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJlZiA9IG90aGVyLCBvdGhlciA9IHJlZlswXSwgY2lkclJhbmdlID0gcmVmWzFdO1xuICAgICAgfVxuICAgICAgaWYgKG90aGVyLmtpbmQoKSAhPT0gJ2lwdjQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogY2Fubm90IG1hdGNoIGlwdjQgYWRkcmVzcyB3aXRoIG5vbi1pcHY0IG9uZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaENJRFIodGhpcy5vY3RldHMsIG90aGVyLm9jdGV0cywgOCwgY2lkclJhbmdlKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUuU3BlY2lhbFJhbmdlcyA9IHtcbiAgICAgIHVuc3BlY2lmaWVkOiBbW25ldyBJUHY0KFswLCAwLCAwLCAwXSksIDhdXSxcbiAgICAgIGJyb2FkY2FzdDogW1tuZXcgSVB2NChbMjU1LCAyNTUsIDI1NSwgMjU1XSksIDMyXV0sXG4gICAgICBtdWx0aWNhc3Q6IFtbbmV3IElQdjQoWzIyNCwgMCwgMCwgMF0pLCA0XV0sXG4gICAgICBsaW5rTG9jYWw6IFtbbmV3IElQdjQoWzE2OSwgMjU0LCAwLCAwXSksIDE2XV0sXG4gICAgICBsb29wYmFjazogW1tuZXcgSVB2NChbMTI3LCAwLCAwLCAwXSksIDhdXSxcbiAgICAgIGNhcnJpZXJHcmFkZU5hdDogW1tuZXcgSVB2NChbMTAwLCA2NCwgMCwgMF0pLCAxMF1dLFxuICAgICAgXCJwcml2YXRlXCI6IFtbbmV3IElQdjQoWzEwLCAwLCAwLCAwXSksIDhdLCBbbmV3IElQdjQoWzE3MiwgMTYsIDAsIDBdKSwgMTJdLCBbbmV3IElQdjQoWzE5MiwgMTY4LCAwLCAwXSksIDE2XV0sXG4gICAgICByZXNlcnZlZDogW1tuZXcgSVB2NChbMTkyLCAwLCAwLCAwXSksIDI0XSwgW25ldyBJUHY0KFsxOTIsIDAsIDIsIDBdKSwgMjRdLCBbbmV3IElQdjQoWzE5MiwgODgsIDk5LCAwXSksIDI0XSwgW25ldyBJUHY0KFsxOTgsIDUxLCAxMDAsIDBdKSwgMjRdLCBbbmV3IElQdjQoWzIwMywgMCwgMTEzLCAwXSksIDI0XSwgW25ldyBJUHY0KFsyNDAsIDAsIDAsIDBdKSwgNF1dXG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnJhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXBhZGRyLnN1Ym5ldE1hdGNoKHRoaXMsIHRoaXMuU3BlY2lhbFJhbmdlcyk7XG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnRvSVB2NE1hcHBlZEFkZHJlc3MgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpcGFkZHIuSVB2Ni5wYXJzZShcIjo6ZmZmZjpcIiArICh0aGlzLnRvU3RyaW5nKCkpKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUucHJlZml4TGVuZ3RoRnJvbVN1Ym5ldE1hc2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjaWRyLCBpLCBrLCBvY3RldCwgc3RvcCwgemVyb3MsIHplcm90YWJsZTtcbiAgICAgIHplcm90YWJsZSA9IHtcbiAgICAgICAgMDogOCxcbiAgICAgICAgMTI4OiA3LFxuICAgICAgICAxOTI6IDYsXG4gICAgICAgIDIyNDogNSxcbiAgICAgICAgMjQwOiA0LFxuICAgICAgICAyNDg6IDMsXG4gICAgICAgIDI1MjogMixcbiAgICAgICAgMjU0OiAxLFxuICAgICAgICAyNTU6IDBcbiAgICAgIH07XG4gICAgICBjaWRyID0gMDtcbiAgICAgIHN0b3AgPSBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGsgPSAzOyBrID49IDA7IGkgPSBrICs9IC0xKSB7XG4gICAgICAgIG9jdGV0ID0gdGhpcy5vY3RldHNbaV07XG4gICAgICAgIGlmIChvY3RldCBpbiB6ZXJvdGFibGUpIHtcbiAgICAgICAgICB6ZXJvcyA9IHplcm90YWJsZVtvY3RldF07XG4gICAgICAgICAgaWYgKHN0b3AgJiYgemVyb3MgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoemVyb3MgIT09IDgpIHtcbiAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaWRyICs9IHplcm9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMzIgLSBjaWRyO1xuICAgIH07XG5cbiAgICByZXR1cm4gSVB2NDtcblxuICB9KSgpO1xuXG4gIGlwdjRQYXJ0ID0gXCIoMD9cXFxcZCt8MHhbYS1mMC05XSspXCI7XG5cbiAgaXB2NFJlZ2V4ZXMgPSB7XG4gICAgZm91ck9jdGV0OiBuZXcgUmVnRXhwKFwiXlwiICsgaXB2NFBhcnQgKyBcIlxcXFwuXCIgKyBpcHY0UGFydCArIFwiXFxcXC5cIiArIGlwdjRQYXJ0ICsgXCJcXFxcLlwiICsgaXB2NFBhcnQgKyBcIiRcIiwgJ2knKSxcbiAgICBsb25nVmFsdWU6IG5ldyBSZWdFeHAoXCJeXCIgKyBpcHY0UGFydCArIFwiJFwiLCAnaScpXG4gIH07XG5cbiAgaXBhZGRyLklQdjQucGFyc2VyID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIG1hdGNoLCBwYXJzZUludEF1dG8sIHBhcnQsIHNoaWZ0LCB2YWx1ZTtcbiAgICBwYXJzZUludEF1dG8gPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIGlmIChzdHJpbmdbMF0gPT09IFwiMFwiICYmIHN0cmluZ1sxXSAhPT0gXCJ4XCIpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHN0cmluZywgOCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoc3RyaW5nKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChpcHY0UmVnZXhlcy5mb3VyT2N0ZXQpKSB7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaywgbGVuLCByZWYsIHJlc3VsdHM7XG4gICAgICAgIHJlZiA9IG1hdGNoLnNsaWNlKDEsIDYpO1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoayA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGsgPCBsZW47IGsrKykge1xuICAgICAgICAgIHBhcnQgPSByZWZba107XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSW50QXV0byhwYXJ0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goaXB2NFJlZ2V4ZXMubG9uZ1ZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBwYXJzZUludEF1dG8obWF0Y2hbMV0pO1xuICAgICAgaWYgKHZhbHVlID4gMHhmZmZmZmZmZiB8fCB2YWx1ZSA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiBhZGRyZXNzIG91dHNpZGUgZGVmaW5lZCByYW5nZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaywgcmVzdWx0cztcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKHNoaWZ0ID0gayA9IDA7IGsgPD0gMjQ7IHNoaWZ0ID0gayArPSA4KSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKCh2YWx1ZSA+PiBzaGlmdCkgJiAweGZmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCkpLnJldmVyc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5JUHY2ID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIElQdjYocGFydHMsIHpvbmVJZCkge1xuICAgICAgdmFyIGksIGssIGwsIGxlbiwgcGFydCwgcmVmO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMTYpIHtcbiAgICAgICAgdGhpcy5wYXJ0cyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSBrID0gMDsgayA8PSAxNDsgaSA9IGsgKz0gMikge1xuICAgICAgICAgIHRoaXMucGFydHMucHVzaCgocGFydHNbaV0gPDwgOCkgfCBwYXJ0c1tpICsgMV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnRzLmxlbmd0aCA9PT0gOCkge1xuICAgICAgICB0aGlzLnBhcnRzID0gcGFydHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IGlwdjYgcGFydCBjb3VudCBzaG91bGQgYmUgOCBvciAxNlwiKTtcbiAgICAgIH1cbiAgICAgIHJlZiA9IHRoaXMucGFydHM7XG4gICAgICBmb3IgKGwgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBsIDwgbGVuOyBsKyspIHtcbiAgICAgICAgcGFydCA9IHJlZltsXTtcbiAgICAgICAgaWYgKCEoKDAgPD0gcGFydCAmJiBwYXJ0IDw9IDB4ZmZmZikpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiBpcHY2IHBhcnQgc2hvdWxkIGZpdCBpbiAxNiBiaXRzXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoem9uZUlkKSB7XG4gICAgICAgIHRoaXMuem9uZUlkID0gem9uZUlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIElQdjYucHJvdG90eXBlLmtpbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAnaXB2Nic7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50b05vcm1hbGl6ZWRTdHJpbmcoKS5yZXBsYWNlKC8oKF58OikoMCg6fCQpKSspLywgJzo6Jyk7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnRvUkZDNTk1MlN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJlc3RNYXRjaEluZGV4LCBiZXN0TWF0Y2hMZW5ndGgsIG1hdGNoLCByZWdleCwgc3RyaW5nO1xuICAgICAgcmVnZXggPSAvKChefDopKDAoOnwkKSl7Mix9KS9nO1xuICAgICAgc3RyaW5nID0gdGhpcy50b05vcm1hbGl6ZWRTdHJpbmcoKTtcbiAgICAgIGJlc3RNYXRjaEluZGV4ID0gMDtcbiAgICAgIGJlc3RNYXRjaExlbmd0aCA9IC0xO1xuICAgICAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKSkpIHtcbiAgICAgICAgaWYgKG1hdGNoWzBdLmxlbmd0aCA+IGJlc3RNYXRjaExlbmd0aCkge1xuICAgICAgICAgIGJlc3RNYXRjaEluZGV4ID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgYmVzdE1hdGNoTGVuZ3RoID0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYmVzdE1hdGNoTGVuZ3RoIDwgMCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgYmVzdE1hdGNoSW5kZXgpICsgJzo6JyArIHN0cmluZy5zdWJzdHJpbmcoYmVzdE1hdGNoSW5kZXggKyBiZXN0TWF0Y2hMZW5ndGgpO1xuICAgIH07XG5cbiAgICBJUHY2LnByb3RvdHlwZS50b0J5dGVBcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJ5dGVzLCBrLCBsZW4sIHBhcnQsIHJlZjtcbiAgICAgIGJ5dGVzID0gW107XG4gICAgICByZWYgPSB0aGlzLnBhcnRzO1xuICAgICAgZm9yIChrID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7XG4gICAgICAgIHBhcnQgPSByZWZba107XG4gICAgICAgIGJ5dGVzLnB1c2gocGFydCA+PiA4KTtcbiAgICAgICAgYnl0ZXMucHVzaChwYXJ0ICYgMHhmZik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnRvTm9ybWFsaXplZFN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGFkZHIsIHBhcnQsIHN1ZmZpeDtcbiAgICAgIGFkZHIgPSAoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaywgbGVuLCByZWYsIHJlc3VsdHM7XG4gICAgICAgIHJlZiA9IHRoaXMucGFydHM7XG4gICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgZm9yIChrID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7XG4gICAgICAgICAgcGFydCA9IHJlZltrXTtcbiAgICAgICAgICByZXN1bHRzLnB1c2gocGFydC50b1N0cmluZygxNikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfSkuY2FsbCh0aGlzKSkuam9pbihcIjpcIik7XG4gICAgICBzdWZmaXggPSAnJztcbiAgICAgIGlmICh0aGlzLnpvbmVJZCkge1xuICAgICAgICBzdWZmaXggPSAnJScgKyB0aGlzLnpvbmVJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhZGRyICsgc3VmZml4O1xuICAgIH07XG5cbiAgICBJUHY2LnByb3RvdHlwZS50b0ZpeGVkTGVuZ3RoU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYWRkciwgcGFydCwgc3VmZml4O1xuICAgICAgYWRkciA9ICgoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBrLCBsZW4sIHJlZiwgcmVzdWx0cztcbiAgICAgICAgcmVmID0gdGhpcy5wYXJ0cztcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGsgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgICBwYXJ0ID0gcmVmW2tdO1xuICAgICAgICAgIHJlc3VsdHMucHVzaChwYXJ0LnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCAnMCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pLmNhbGwodGhpcykpLmpvaW4oXCI6XCIpO1xuICAgICAgc3VmZml4ID0gJyc7XG4gICAgICBpZiAodGhpcy56b25lSWQpIHtcbiAgICAgICAgc3VmZml4ID0gJyUnICsgdGhpcy56b25lSWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWRkciArIHN1ZmZpeDtcbiAgICB9O1xuXG4gICAgSVB2Ni5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbihvdGhlciwgY2lkclJhbmdlKSB7XG4gICAgICB2YXIgcmVmO1xuICAgICAgaWYgKGNpZHJSYW5nZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJlZiA9IG90aGVyLCBvdGhlciA9IHJlZlswXSwgY2lkclJhbmdlID0gcmVmWzFdO1xuICAgICAgfVxuICAgICAgaWYgKG90aGVyLmtpbmQoKSAhPT0gJ2lwdjYnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogY2Fubm90IG1hdGNoIGlwdjYgYWRkcmVzcyB3aXRoIG5vbi1pcHY2IG9uZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaENJRFIodGhpcy5wYXJ0cywgb3RoZXIucGFydHMsIDE2LCBjaWRyUmFuZ2UpO1xuICAgIH07XG5cbiAgICBJUHY2LnByb3RvdHlwZS5TcGVjaWFsUmFuZ2VzID0ge1xuICAgICAgdW5zcGVjaWZpZWQ6IFtuZXcgSVB2NihbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pLCAxMjhdLFxuICAgICAgbGlua0xvY2FsOiBbbmV3IElQdjYoWzB4ZmU4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pLCAxMF0sXG4gICAgICBtdWx0aWNhc3Q6IFtuZXcgSVB2NihbMHhmZjAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSksIDhdLFxuICAgICAgbG9vcGJhY2s6IFtuZXcgSVB2NihbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMV0pLCAxMjhdLFxuICAgICAgdW5pcXVlTG9jYWw6IFtuZXcgSVB2NihbMHhmYzAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSksIDddLFxuICAgICAgaXB2NE1hcHBlZDogW25ldyBJUHY2KFswLCAwLCAwLCAwLCAwLCAweGZmZmYsIDAsIDBdKSwgOTZdLFxuICAgICAgcmZjNjE0NTogW25ldyBJUHY2KFswLCAwLCAwLCAwLCAweGZmZmYsIDAsIDAsIDBdKSwgOTZdLFxuICAgICAgcmZjNjA1MjogW25ldyBJUHY2KFsweDY0LCAweGZmOWIsIDAsIDAsIDAsIDAsIDAsIDBdKSwgOTZdLFxuICAgICAgJzZ0bzQnOiBbbmV3IElQdjYoWzB4MjAwMiwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pLCAxNl0sXG4gICAgICB0ZXJlZG86IFtuZXcgSVB2NihbMHgyMDAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSksIDMyXSxcbiAgICAgIHJlc2VydmVkOiBbW25ldyBJUHY2KFsweDIwMDEsIDB4ZGI4LCAwLCAwLCAwLCAwLCAwLCAwXSksIDMyXV1cbiAgICB9O1xuXG4gICAgSVB2Ni5wcm90b3R5cGUucmFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpcGFkZHIuc3VibmV0TWF0Y2godGhpcywgdGhpcy5TcGVjaWFsUmFuZ2VzKTtcbiAgICB9O1xuXG4gICAgSVB2Ni5wcm90b3R5cGUuaXNJUHY0TWFwcGVkQWRkcmVzcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMucmFuZ2UoKSA9PT0gJ2lwdjRNYXBwZWQnO1xuICAgIH07XG5cbiAgICBJUHY2LnByb3RvdHlwZS50b0lQdjRBZGRyZXNzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaGlnaCwgbG93LCByZWY7XG4gICAgICBpZiAoIXRoaXMuaXNJUHY0TWFwcGVkQWRkcmVzcygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogdHJ5aW5nIHRvIGNvbnZlcnQgYSBnZW5lcmljIGlwdjYgYWRkcmVzcyB0byBpcHY0XCIpO1xuICAgICAgfVxuICAgICAgcmVmID0gdGhpcy5wYXJ0cy5zbGljZSgtMiksIGhpZ2ggPSByZWZbMF0sIGxvdyA9IHJlZlsxXTtcbiAgICAgIHJldHVybiBuZXcgaXBhZGRyLklQdjQoW2hpZ2ggPj4gOCwgaGlnaCAmIDB4ZmYsIGxvdyA+PiA4LCBsb3cgJiAweGZmXSk7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnByZWZpeExlbmd0aEZyb21TdWJuZXRNYXNrID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY2lkciwgaSwgaywgcGFydCwgc3RvcCwgemVyb3MsIHplcm90YWJsZTtcbiAgICAgIHplcm90YWJsZSA9IHtcbiAgICAgICAgMDogMTYsXG4gICAgICAgIDMyNzY4OiAxNSxcbiAgICAgICAgNDkxNTI6IDE0LFxuICAgICAgICA1NzM0NDogMTMsXG4gICAgICAgIDYxNDQwOiAxMixcbiAgICAgICAgNjM0ODg6IDExLFxuICAgICAgICA2NDUxMjogMTAsXG4gICAgICAgIDY1MDI0OiA5LFxuICAgICAgICA2NTI4MDogOCxcbiAgICAgICAgNjU0MDg6IDcsXG4gICAgICAgIDY1NDcyOiA2LFxuICAgICAgICA2NTUwNDogNSxcbiAgICAgICAgNjU1MjA6IDQsXG4gICAgICAgIDY1NTI4OiAzLFxuICAgICAgICA2NTUzMjogMixcbiAgICAgICAgNjU1MzQ6IDEsXG4gICAgICAgIDY1NTM1OiAwXG4gICAgICB9O1xuICAgICAgY2lkciA9IDA7XG4gICAgICBzdG9wID0gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBrID0gNzsgayA+PSAwOyBpID0gayArPSAtMSkge1xuICAgICAgICBwYXJ0ID0gdGhpcy5wYXJ0c1tpXTtcbiAgICAgICAgaWYgKHBhcnQgaW4gemVyb3RhYmxlKSB7XG4gICAgICAgICAgemVyb3MgPSB6ZXJvdGFibGVbcGFydF07XG4gICAgICAgICAgaWYgKHN0b3AgJiYgemVyb3MgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoemVyb3MgIT09IDE2KSB7XG4gICAgICAgICAgICBzdG9wID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2lkciArPSB6ZXJvcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDEyOCAtIGNpZHI7XG4gICAgfTtcblxuICAgIHJldHVybiBJUHY2O1xuXG4gIH0pKCk7XG5cbiAgaXB2NlBhcnQgPSBcIig/OlswLTlhLWZdKzo6PykrXCI7XG5cbiAgem9uZUluZGV4ID0gXCIlWzAtOWEtel17MSx9XCI7XG5cbiAgaXB2NlJlZ2V4ZXMgPSB7XG4gICAgem9uZUluZGV4OiBuZXcgUmVnRXhwKHpvbmVJbmRleCwgJ2knKSxcbiAgICBcIm5hdGl2ZVwiOiBuZXcgUmVnRXhwKFwiXig6Oik/KFwiICsgaXB2NlBhcnQgKyBcIik/KFswLTlhLWZdKyk/KDo6KT8oXCIgKyB6b25lSW5kZXggKyBcIik/JFwiLCAnaScpLFxuICAgIHRyYW5zaXRpb25hbDogbmV3IFJlZ0V4cCgoXCJeKCg/OlwiICsgaXB2NlBhcnQgKyBcIil8KD86OjopKD86XCIgKyBpcHY2UGFydCArIFwiKT8pXCIpICsgKGlwdjRQYXJ0ICsgXCJcXFxcLlwiICsgaXB2NFBhcnQgKyBcIlxcXFwuXCIgKyBpcHY0UGFydCArIFwiXFxcXC5cIiArIGlwdjRQYXJ0KSArIChcIihcIiArIHpvbmVJbmRleCArIFwiKT8kXCIpLCAnaScpXG4gIH07XG5cbiAgZXhwYW5kSVB2NiA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHtcbiAgICB2YXIgY29sb25Db3VudCwgbGFzdENvbG9uLCBwYXJ0LCByZXBsYWNlbWVudCwgcmVwbGFjZW1lbnRDb3VudCwgem9uZUlkO1xuICAgIGlmIChzdHJpbmcuaW5kZXhPZignOjonKSAhPT0gc3RyaW5nLmxhc3RJbmRleE9mKCc6OicpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgem9uZUlkID0gKHN0cmluZy5tYXRjaChpcHY2UmVnZXhlc1snem9uZUluZGV4J10pIHx8IFtdKVswXTtcbiAgICBpZiAoem9uZUlkKSB7XG4gICAgICB6b25lSWQgPSB6b25lSWQuc3Vic3RyaW5nKDEpO1xuICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoLyUuKyQvLCAnJyk7XG4gICAgfVxuICAgIGNvbG9uQ291bnQgPSAwO1xuICAgIGxhc3RDb2xvbiA9IC0xO1xuICAgIHdoaWxlICgobGFzdENvbG9uID0gc3RyaW5nLmluZGV4T2YoJzonLCBsYXN0Q29sb24gKyAxKSkgPj0gMCkge1xuICAgICAgY29sb25Db3VudCsrO1xuICAgIH1cbiAgICBpZiAoc3RyaW5nLnN1YnN0cigwLCAyKSA9PT0gJzo6Jykge1xuICAgICAgY29sb25Db3VudC0tO1xuICAgIH1cbiAgICBpZiAoc3RyaW5nLnN1YnN0cigtMiwgMikgPT09ICc6OicpIHtcbiAgICAgIGNvbG9uQ291bnQtLTtcbiAgICB9XG4gICAgaWYgKGNvbG9uQ291bnQgPiBwYXJ0cykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJlcGxhY2VtZW50Q291bnQgPSBwYXJ0cyAtIGNvbG9uQ291bnQ7XG4gICAgcmVwbGFjZW1lbnQgPSAnOic7XG4gICAgd2hpbGUgKHJlcGxhY2VtZW50Q291bnQtLSkge1xuICAgICAgcmVwbGFjZW1lbnQgKz0gJzA6JztcbiAgICB9XG4gICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoJzo6JywgcmVwbGFjZW1lbnQpO1xuICAgIGlmIChzdHJpbmdbMF0gPT09ICc6Jykge1xuICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKDEpO1xuICAgIH1cbiAgICBpZiAoc3RyaW5nW3N0cmluZy5sZW5ndGggLSAxXSA9PT0gJzonKSB7XG4gICAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2UoMCwgLTEpO1xuICAgIH1cbiAgICBwYXJ0cyA9IChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBrLCBsZW4sIHJlZiwgcmVzdWx0cztcbiAgICAgIHJlZiA9IHN0cmluZy5zcGxpdChcIjpcIik7XG4gICAgICByZXN1bHRzID0gW107XG4gICAgICBmb3IgKGsgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgcGFydCA9IHJlZltrXTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSW50KHBhcnQsIDE2KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9KSgpO1xuICAgIHJldHVybiB7XG4gICAgICBwYXJ0czogcGFydHMsXG4gICAgICB6b25lSWQ6IHpvbmVJZFxuICAgIH07XG4gIH07XG5cbiAgaXBhZGRyLklQdjYucGFyc2VyID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGFkZHIsIGssIGxlbiwgbWF0Y2gsIG9jdGV0LCBvY3RldHMsIHpvbmVJZDtcbiAgICBpZiAoaXB2NlJlZ2V4ZXNbJ25hdGl2ZSddLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIGV4cGFuZElQdjYoc3RyaW5nLCA4KTtcbiAgICB9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGlwdjZSZWdleGVzWyd0cmFuc2l0aW9uYWwnXSkpIHtcbiAgICAgIHpvbmVJZCA9IG1hdGNoWzZdIHx8ICcnO1xuICAgICAgYWRkciA9IGV4cGFuZElQdjYobWF0Y2hbMV0uc2xpY2UoMCwgLTEpICsgem9uZUlkLCA2KTtcbiAgICAgIGlmIChhZGRyLnBhcnRzKSB7XG4gICAgICAgIG9jdGV0cyA9IFtwYXJzZUludChtYXRjaFsyXSksIHBhcnNlSW50KG1hdGNoWzNdKSwgcGFyc2VJbnQobWF0Y2hbNF0pLCBwYXJzZUludChtYXRjaFs1XSldO1xuICAgICAgICBmb3IgKGsgPSAwLCBsZW4gPSBvY3RldHMubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgICBvY3RldCA9IG9jdGV0c1trXTtcbiAgICAgICAgICBpZiAoISgoMCA8PSBvY3RldCAmJiBvY3RldCA8PSAyNTUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFkZHIucGFydHMucHVzaChvY3RldHNbMF0gPDwgOCB8IG9jdGV0c1sxXSk7XG4gICAgICAgIGFkZHIucGFydHMucHVzaChvY3RldHNbMl0gPDwgOCB8IG9jdGV0c1szXSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGFydHM6IGFkZHIucGFydHMsXG4gICAgICAgICAgem9uZUlkOiBhZGRyLnpvbmVJZFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBpcGFkZHIuSVB2NC5pc0lQdjQgPSBpcGFkZHIuSVB2Ni5pc0lQdjYgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIoc3RyaW5nKSAhPT0gbnVsbDtcbiAgfTtcblxuICBpcGFkZHIuSVB2NC5pc1ZhbGlkID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGU7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyB0aGlzKHRoaXMucGFyc2VyKHN0cmluZykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICBlID0gZXJyb3IxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBpcGFkZHIuSVB2NC5pc1ZhbGlkRm91clBhcnREZWNpbWFsID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgaWYgKGlwYWRkci5JUHY0LmlzVmFsaWQoc3RyaW5nKSAmJiBzdHJpbmcubWF0Y2goL14oMHxbMS05XVxcZCopKFxcLigwfFsxLTldXFxkKikpezN9JC8pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBpcGFkZHIuSVB2Ni5pc1ZhbGlkID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGFkZHIsIGU7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgPT09IFwic3RyaW5nXCIgJiYgc3RyaW5nLmluZGV4T2YoXCI6XCIpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYWRkciA9IHRoaXMucGFyc2VyKHN0cmluZyk7XG4gICAgICBuZXcgdGhpcyhhZGRyLnBhcnRzLCBhZGRyLnpvbmVJZCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgIGUgPSBlcnJvcjE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5JUHY0LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIHBhcnRzO1xuICAgIHBhcnRzID0gdGhpcy5wYXJzZXIoc3RyaW5nKTtcbiAgICBpZiAocGFydHMgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogc3RyaW5nIGlzIG5vdCBmb3JtYXR0ZWQgbGlrZSBpcCBhZGRyZXNzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMocGFydHMpO1xuICB9O1xuXG4gIGlwYWRkci5JUHY2LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGFkZHI7XG4gICAgYWRkciA9IHRoaXMucGFyc2VyKHN0cmluZyk7XG4gICAgaWYgKGFkZHIucGFydHMgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogc3RyaW5nIGlzIG5vdCBmb3JtYXR0ZWQgbGlrZSBpcCBhZGRyZXNzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMoYWRkci5wYXJ0cywgYWRkci56b25lSWQpO1xuICB9O1xuXG4gIGlwYWRkci5JUHY0LnBhcnNlQ0lEUiA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBtYXNrTGVuZ3RoLCBtYXRjaCwgcGFyc2VkO1xuICAgIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaCgvXiguKylcXC8oXFxkKykkLykpIHtcbiAgICAgIG1hc2tMZW5ndGggPSBwYXJzZUludChtYXRjaFsyXSk7XG4gICAgICBpZiAobWFza0xlbmd0aCA+PSAwICYmIG1hc2tMZW5ndGggPD0gMzIpIHtcbiAgICAgICAgcGFyc2VkID0gW3RoaXMucGFyc2UobWF0Y2hbMV0pLCBtYXNrTGVuZ3RoXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcnNlZCwgJ3RvU3RyaW5nJywge1xuICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmpvaW4oJy8nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHN0cmluZyBpcyBub3QgZm9ybWF0dGVkIGxpa2UgYW4gSVB2NCBDSURSIHJhbmdlXCIpO1xuICB9O1xuXG4gIGlwYWRkci5JUHY0LnN1Ym5ldE1hc2tGcm9tUHJlZml4TGVuZ3RoID0gZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIGZpbGxlZE9jdGV0Q291bnQsIGosIG9jdGV0cztcbiAgICBwcmVmaXggPSBwYXJzZUludChwcmVmaXgpO1xuICAgIGlmIChwcmVmaXggPCAwIHx8IHByZWZpeCA+IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lwYWRkcjogaW52YWxpZCBJUHY0IHByZWZpeCBsZW5ndGgnKTtcbiAgICB9XG4gICAgb2N0ZXRzID0gWzAsIDAsIDAsIDBdO1xuICAgIGogPSAwO1xuICAgIGZpbGxlZE9jdGV0Q291bnQgPSBNYXRoLmZsb29yKHByZWZpeCAvIDgpO1xuICAgIHdoaWxlIChqIDwgZmlsbGVkT2N0ZXRDb3VudCkge1xuICAgICAgb2N0ZXRzW2pdID0gMjU1O1xuICAgICAgaisrO1xuICAgIH1cbiAgICBpZiAoZmlsbGVkT2N0ZXRDb3VudCA8IDQpIHtcbiAgICAgIG9jdGV0c1tmaWxsZWRPY3RldENvdW50XSA9IE1hdGgucG93KDIsIHByZWZpeCAlIDgpIC0gMSA8PCA4IC0gKHByZWZpeCAlIDgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMob2N0ZXRzKTtcbiAgfTtcblxuICBpcGFkZHIuSVB2NC5icm9hZGNhc3RBZGRyZXNzRnJvbUNJRFIgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICB2YXIgY2lkciwgZXJyb3IsIGksIGlwSW50ZXJmYWNlT2N0ZXRzLCBvY3RldHMsIHN1Ym5ldE1hc2tPY3RldHM7XG4gICAgdHJ5IHtcbiAgICAgIGNpZHIgPSB0aGlzLnBhcnNlQ0lEUihzdHJpbmcpO1xuICAgICAgaXBJbnRlcmZhY2VPY3RldHMgPSBjaWRyWzBdLnRvQnl0ZUFycmF5KCk7XG4gICAgICBzdWJuZXRNYXNrT2N0ZXRzID0gdGhpcy5zdWJuZXRNYXNrRnJvbVByZWZpeExlbmd0aChjaWRyWzFdKS50b0J5dGVBcnJheSgpO1xuICAgICAgb2N0ZXRzID0gW107XG4gICAgICBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgNCkge1xuICAgICAgICBvY3RldHMucHVzaChwYXJzZUludChpcEludGVyZmFjZU9jdGV0c1tpXSwgMTApIHwgcGFyc2VJbnQoc3VibmV0TWFza09jdGV0c1tpXSwgMTApIF4gMjU1KTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyB0aGlzKG9jdGV0cyk7XG4gICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaXBhZGRyOiB0aGUgYWRkcmVzcyBkb2VzIG5vdCBoYXZlIElQdjQgQ0lEUiBmb3JtYXQnKTtcbiAgICB9XG4gIH07XG5cbiAgaXBhZGRyLklQdjQubmV0d29ya0FkZHJlc3NGcm9tQ0lEUiA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBjaWRyLCBlcnJvciwgaSwgaXBJbnRlcmZhY2VPY3RldHMsIG9jdGV0cywgc3VibmV0TWFza09jdGV0cztcbiAgICB0cnkge1xuICAgICAgY2lkciA9IHRoaXMucGFyc2VDSURSKHN0cmluZyk7XG4gICAgICBpcEludGVyZmFjZU9jdGV0cyA9IGNpZHJbMF0udG9CeXRlQXJyYXkoKTtcbiAgICAgIHN1Ym5ldE1hc2tPY3RldHMgPSB0aGlzLnN1Ym5ldE1hc2tGcm9tUHJlZml4TGVuZ3RoKGNpZHJbMV0pLnRvQnl0ZUFycmF5KCk7XG4gICAgICBvY3RldHMgPSBbXTtcbiAgICAgIGkgPSAwO1xuICAgICAgd2hpbGUgKGkgPCA0KSB7XG4gICAgICAgIG9jdGV0cy5wdXNoKHBhcnNlSW50KGlwSW50ZXJmYWNlT2N0ZXRzW2ldLCAxMCkgJiBwYXJzZUludChzdWJuZXRNYXNrT2N0ZXRzW2ldLCAxMCkpO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IHRoaXMob2N0ZXRzKTtcbiAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpcGFkZHI6IHRoZSBhZGRyZXNzIGRvZXMgbm90IGhhdmUgSVB2NCBDSURSIGZvcm1hdCcpO1xuICAgIH1cbiAgfTtcblxuICBpcGFkZHIuSVB2Ni5wYXJzZUNJRFIgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICB2YXIgbWFza0xlbmd0aCwgbWF0Y2gsIHBhcnNlZDtcbiAgICBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goL14oLispXFwvKFxcZCspJC8pKSB7XG4gICAgICBtYXNrTGVuZ3RoID0gcGFyc2VJbnQobWF0Y2hbMl0pO1xuICAgICAgaWYgKG1hc2tMZW5ndGggPj0gMCAmJiBtYXNrTGVuZ3RoIDw9IDEyOCkge1xuICAgICAgICBwYXJzZWQgPSBbdGhpcy5wYXJzZShtYXRjaFsxXSksIG1hc2tMZW5ndGhdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyc2VkLCAndG9TdHJpbmcnLCB7XG4gICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuam9pbignLycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogc3RyaW5nIGlzIG5vdCBmb3JtYXR0ZWQgbGlrZSBhbiBJUHY2IENJRFIgcmFuZ2VcIik7XG4gIH07XG5cbiAgaXBhZGRyLmlzVmFsaWQgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gaXBhZGRyLklQdjYuaXNWYWxpZChzdHJpbmcpIHx8IGlwYWRkci5JUHY0LmlzVmFsaWQoc3RyaW5nKTtcbiAgfTtcblxuICBpcGFkZHIucGFyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICBpZiAoaXBhZGRyLklQdjYuaXNWYWxpZChzdHJpbmcpKSB7XG4gICAgICByZXR1cm4gaXBhZGRyLklQdjYucGFyc2Uoc3RyaW5nKTtcbiAgICB9IGVsc2UgaWYgKGlwYWRkci5JUHY0LmlzVmFsaWQoc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIGlwYWRkci5JUHY0LnBhcnNlKHN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogdGhlIGFkZHJlc3MgaGFzIG5laXRoZXIgSVB2NiBub3IgSVB2NCBmb3JtYXRcIik7XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5wYXJzZUNJRFIgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICB2YXIgZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGlwYWRkci5JUHY2LnBhcnNlQ0lEUihzdHJpbmcpO1xuICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgZSA9IGVycm9yMTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBpcGFkZHIuSVB2NC5wYXJzZUNJRFIoc3RyaW5nKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICBlID0gZXJyb3IxO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHRoZSBhZGRyZXNzIGhhcyBuZWl0aGVyIElQdjYgbm9yIElQdjQgQ0lEUiBmb3JtYXRcIik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5mcm9tQnl0ZUFycmF5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICB2YXIgbGVuZ3RoO1xuICAgIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID09PSA0KSB7XG4gICAgICByZXR1cm4gbmV3IGlwYWRkci5JUHY0KGJ5dGVzKTtcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMTYpIHtcbiAgICAgIHJldHVybiBuZXcgaXBhZGRyLklQdjYoYnl0ZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHRoZSBiaW5hcnkgaW5wdXQgaXMgbmVpdGhlciBhbiBJUHY2IG5vciBJUHY0IGFkZHJlc3NcIik7XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5wcm9jZXNzID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGFkZHI7XG4gICAgYWRkciA9IHRoaXMucGFyc2Uoc3RyaW5nKTtcbiAgICBpZiAoYWRkci5raW5kKCkgPT09ICdpcHY2JyAmJiBhZGRyLmlzSVB2NE1hcHBlZEFkZHJlc3MoKSkge1xuICAgICAgcmV0dXJuIGFkZHIudG9JUHY0QWRkcmVzcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYWRkcjtcbiAgICB9XG4gIH07XG5cbn0pLmNhbGwodGhpcyk7XG4iLCAiLyohXG4gKiBwcm94eS1hZGRyXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByb3h5YWRkclxubW9kdWxlLmV4cG9ydHMuYWxsID0gYWxsYWRkcnNcbm1vZHVsZS5leHBvcnRzLmNvbXBpbGUgPSBjb21waWxlXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGZvcndhcmRlZCA9IHJlcXVpcmUoJ2ZvcndhcmRlZCcpXG52YXIgaXBhZGRyID0gcmVxdWlyZSgnaXBhZGRyLmpzJylcblxuLyoqXG4gKiBWYXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBESUdJVF9SRUdFWFAgPSAvXlswLTldKyQvXG52YXIgaXNpcCA9IGlwYWRkci5pc1ZhbGlkXG52YXIgcGFyc2VpcCA9IGlwYWRkci5wYXJzZVxuXG4vKipcbiAqIFByZS1kZWZpbmVkIElQIHJhbmdlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIElQX1JBTkdFUyA9IHtcbiAgbGlua2xvY2FsOiBbJzE2OS4yNTQuMC4wLzE2JywgJ2ZlODA6Oi8xMCddLFxuICBsb29wYmFjazogWycxMjcuMC4wLjEvOCcsICc6OjEvMTI4J10sXG4gIHVuaXF1ZWxvY2FsOiBbJzEwLjAuMC4wLzgnLCAnMTcyLjE2LjAuMC8xMicsICcxOTIuMTY4LjAuMC8xNicsICdmYzAwOjovNyddXG59XG5cbi8qKlxuICogR2V0IGFsbCBhZGRyZXNzZXMgaW4gdGhlIHJlcXVlc3QsIG9wdGlvbmFsbHkgc3RvcHBpbmdcbiAqIGF0IHRoZSBmaXJzdCB1bnRydXN0ZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlcXVlc3RcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl8U3RyaW5nfSBbdHJ1c3RdXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gYWxsYWRkcnMgKHJlcSwgdHJ1c3QpIHtcbiAgLy8gZ2V0IGFkZHJlc3Nlc1xuICB2YXIgYWRkcnMgPSBmb3J3YXJkZWQocmVxKVxuXG4gIGlmICghdHJ1c3QpIHtcbiAgICAvLyBSZXR1cm4gYWxsIGFkZHJlc3Nlc1xuICAgIHJldHVybiBhZGRyc1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0cnVzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRydXN0ID0gY29tcGlsZSh0cnVzdClcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWRkcnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgaWYgKHRydXN0KGFkZHJzW2ldLCBpKSkgY29udGludWVcblxuICAgIGFkZHJzLmxlbmd0aCA9IGkgKyAxXG4gIH1cblxuICByZXR1cm4gYWRkcnNcbn1cblxuLyoqXG4gKiBDb21waWxlIGFyZ3VtZW50IGludG8gdHJ1c3QgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IHZhbFxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb21waWxlICh2YWwpIHtcbiAgaWYgKCF2YWwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBpcyByZXF1aXJlZCcpXG4gIH1cblxuICB2YXIgdHJ1c3RcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnVzdCA9IFt2YWxdXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgdHJ1c3QgPSB2YWwuc2xpY2UoKVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Vuc3VwcG9ydGVkIHRydXN0IGFyZ3VtZW50JylcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJ1c3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YWwgPSB0cnVzdFtpXVxuXG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoSVBfUkFOR0VTLCB2YWwpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIFNwbGljZSBpbiBwcmUtZGVmaW5lZCByYW5nZVxuICAgIHZhbCA9IElQX1JBTkdFU1t2YWxdXG4gICAgdHJ1c3Quc3BsaWNlLmFwcGx5KHRydXN0LCBbaSwgMV0uY29uY2F0KHZhbCkpXG4gICAgaSArPSB2YWwubGVuZ3RoIC0gMVxuICB9XG5cbiAgcmV0dXJuIGNvbXBpbGVUcnVzdChjb21waWxlUmFuZ2VTdWJuZXRzKHRydXN0KSlcbn1cblxuLyoqXG4gKiBDb21waWxlIGBhcnJgIGVsZW1lbnRzIGludG8gcmFuZ2Ugc3VibmV0cy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29tcGlsZVJhbmdlU3VibmV0cyAoYXJyKSB7XG4gIHZhciByYW5nZVN1Ym5ldHMgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHJhbmdlU3VibmV0c1tpXSA9IHBhcnNlaXBOb3RhdGlvbihhcnJbaV0pXG4gIH1cblxuICByZXR1cm4gcmFuZ2VTdWJuZXRzXG59XG5cbi8qKlxuICogQ29tcGlsZSByYW5nZSBzdWJuZXQgYXJyYXkgaW50byB0cnVzdCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSByYW5nZVN1Ym5ldHNcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29tcGlsZVRydXN0IChyYW5nZVN1Ym5ldHMpIHtcbiAgLy8gUmV0dXJuIG9wdGltaXplZCBmdW5jdGlvbiBiYXNlZCBvbiBsZW5ndGhcbiAgdmFyIGxlbiA9IHJhbmdlU3VibmV0cy5sZW5ndGhcbiAgcmV0dXJuIGxlbiA9PT0gMFxuICAgID8gdHJ1c3ROb25lXG4gICAgOiBsZW4gPT09IDFcbiAgICAgID8gdHJ1c3RTaW5nbGUocmFuZ2VTdWJuZXRzWzBdKVxuICAgICAgOiB0cnVzdE11bHRpKHJhbmdlU3VibmV0cylcbn1cblxuLyoqXG4gKiBQYXJzZSBJUCBub3RhdGlvbiBzdHJpbmcgaW50byByYW5nZSBzdWJuZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5vdGVcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VpcE5vdGF0aW9uIChub3RlKSB7XG4gIHZhciBwb3MgPSBub3RlLmxhc3RJbmRleE9mKCcvJylcbiAgdmFyIHN0ciA9IHBvcyAhPT0gLTFcbiAgICA/IG5vdGUuc3Vic3RyaW5nKDAsIHBvcylcbiAgICA6IG5vdGVcblxuICBpZiAoIWlzaXAoc3RyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgSVAgYWRkcmVzczogJyArIHN0cilcbiAgfVxuXG4gIHZhciBpcCA9IHBhcnNlaXAoc3RyKVxuXG4gIGlmIChwb3MgPT09IC0xICYmIGlwLmtpbmQoKSA9PT0gJ2lwdjYnICYmIGlwLmlzSVB2NE1hcHBlZEFkZHJlc3MoKSkge1xuICAgIC8vIFN0b3JlIGFzIElQdjRcbiAgICBpcCA9IGlwLnRvSVB2NEFkZHJlc3MoKVxuICB9XG5cbiAgdmFyIG1heCA9IGlwLmtpbmQoKSA9PT0gJ2lwdjYnXG4gICAgPyAxMjhcbiAgICA6IDMyXG5cbiAgdmFyIHJhbmdlID0gcG9zICE9PSAtMVxuICAgID8gbm90ZS5zdWJzdHJpbmcocG9zICsgMSwgbm90ZS5sZW5ndGgpXG4gICAgOiBudWxsXG5cbiAgaWYgKHJhbmdlID09PSBudWxsKSB7XG4gICAgcmFuZ2UgPSBtYXhcbiAgfSBlbHNlIGlmIChESUdJVF9SRUdFWFAudGVzdChyYW5nZSkpIHtcbiAgICByYW5nZSA9IHBhcnNlSW50KHJhbmdlLCAxMClcbiAgfSBlbHNlIGlmIChpcC5raW5kKCkgPT09ICdpcHY0JyAmJiBpc2lwKHJhbmdlKSkge1xuICAgIHJhbmdlID0gcGFyc2VOZXRtYXNrKHJhbmdlKVxuICB9IGVsc2Uge1xuICAgIHJhbmdlID0gbnVsbFxuICB9XG5cbiAgaWYgKHJhbmdlIDw9IDAgfHwgcmFuZ2UgPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHJhbmdlIG9uIGFkZHJlc3M6ICcgKyBub3RlKVxuICB9XG5cbiAgcmV0dXJuIFtpcCwgcmFuZ2VdXG59XG5cbi8qKlxuICogUGFyc2UgbmV0bWFzayBzdHJpbmcgaW50byBDSURSIHJhbmdlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuZXRtYXNrXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlTmV0bWFzayAobmV0bWFzaykge1xuICB2YXIgaXAgPSBwYXJzZWlwKG5ldG1hc2spXG4gIHZhciBraW5kID0gaXAua2luZCgpXG5cbiAgcmV0dXJuIGtpbmQgPT09ICdpcHY0J1xuICAgID8gaXAucHJlZml4TGVuZ3RoRnJvbVN1Ym5ldE1hc2soKVxuICAgIDogbnVsbFxufVxuXG4vKipcbiAqIERldGVybWluZSBhZGRyZXNzIG9mIHByb3hpZWQgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdFxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheXxTdHJpbmd9IHRydXN0XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcHJveHlhZGRyIChyZXEsIHRydXN0KSB7XG4gIGlmICghcmVxKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVxIGFyZ3VtZW50IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIGlmICghdHJ1c3QpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0cnVzdCBhcmd1bWVudCBpcyByZXF1aXJlZCcpXG4gIH1cblxuICB2YXIgYWRkcnMgPSBhbGxhZGRycyhyZXEsIHRydXN0KVxuICB2YXIgYWRkciA9IGFkZHJzW2FkZHJzLmxlbmd0aCAtIDFdXG5cbiAgcmV0dXJuIGFkZHJcbn1cblxuLyoqXG4gKiBTdGF0aWMgdHJ1c3QgZnVuY3Rpb24gdG8gdHJ1c3Qgbm90aGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRydXN0Tm9uZSAoKSB7XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENvbXBpbGUgdHJ1c3QgZnVuY3Rpb24gZm9yIG11bHRpcGxlIHN1Ym5ldHMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc3VibmV0c1xuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0cnVzdE11bHRpIChzdWJuZXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cnVzdCAoYWRkcikge1xuICAgIGlmICghaXNpcChhZGRyKSkgcmV0dXJuIGZhbHNlXG5cbiAgICB2YXIgaXAgPSBwYXJzZWlwKGFkZHIpXG4gICAgdmFyIGlwY29udlxuICAgIHZhciBraW5kID0gaXAua2luZCgpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1Ym5ldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdWJuZXQgPSBzdWJuZXRzW2ldXG4gICAgICB2YXIgc3VibmV0aXAgPSBzdWJuZXRbMF1cbiAgICAgIHZhciBzdWJuZXRraW5kID0gc3VibmV0aXAua2luZCgpXG4gICAgICB2YXIgc3VibmV0cmFuZ2UgPSBzdWJuZXRbMV1cbiAgICAgIHZhciB0cnVzdGVkID0gaXBcblxuICAgICAgaWYgKGtpbmQgIT09IHN1Ym5ldGtpbmQpIHtcbiAgICAgICAgaWYgKHN1Ym5ldGtpbmQgPT09ICdpcHY0JyAmJiAhaXAuaXNJUHY0TWFwcGVkQWRkcmVzcygpKSB7XG4gICAgICAgICAgLy8gSW5jb21wYXRpYmxlIElQIGFkZHJlc3Nlc1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlwY29udikge1xuICAgICAgICAgIC8vIENvbnZlcnQgSVAgdG8gbWF0Y2ggc3VibmV0IElQIGtpbmRcbiAgICAgICAgICBpcGNvbnYgPSBzdWJuZXRraW5kID09PSAnaXB2NCdcbiAgICAgICAgICAgID8gaXAudG9JUHY0QWRkcmVzcygpXG4gICAgICAgICAgICA6IGlwLnRvSVB2NE1hcHBlZEFkZHJlc3MoKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ1c3RlZCA9IGlwY29udlxuICAgICAgfVxuXG4gICAgICBpZiAodHJ1c3RlZC5tYXRjaChzdWJuZXRpcCwgc3VibmV0cmFuZ2UpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBDb21waWxlIHRydXN0IGZ1bmN0aW9uIGZvciBzaW5nbGUgc3VibmV0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdWJuZXRcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdHJ1c3RTaW5nbGUgKHN1Ym5ldCkge1xuICB2YXIgc3VibmV0aXAgPSBzdWJuZXRbMF1cbiAgdmFyIHN1Ym5ldGtpbmQgPSBzdWJuZXRpcC5raW5kKClcbiAgdmFyIHN1Ym5ldGlzaXB2NCA9IHN1Ym5ldGtpbmQgPT09ICdpcHY0J1xuICB2YXIgc3VibmV0cmFuZ2UgPSBzdWJuZXRbMV1cblxuICByZXR1cm4gZnVuY3Rpb24gdHJ1c3QgKGFkZHIpIHtcbiAgICBpZiAoIWlzaXAoYWRkcikpIHJldHVybiBmYWxzZVxuXG4gICAgdmFyIGlwID0gcGFyc2VpcChhZGRyKVxuICAgIHZhciBraW5kID0gaXAua2luZCgpXG5cbiAgICBpZiAoa2luZCAhPT0gc3VibmV0a2luZCkge1xuICAgICAgaWYgKHN1Ym5ldGlzaXB2NCAmJiAhaXAuaXNJUHY0TWFwcGVkQWRkcmVzcygpKSB7XG4gICAgICAgIC8vIEluY29tcGF0aWJsZSBJUCBhZGRyZXNzZXNcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgSVAgdG8gbWF0Y2ggc3VibmV0IElQIGtpbmRcbiAgICAgIGlwID0gc3VibmV0aXNpcHY0XG4gICAgICAgID8gaXAudG9JUHY0QWRkcmVzcygpXG4gICAgICAgIDogaXAudG9JUHY0TWFwcGVkQWRkcmVzcygpXG4gICAgfVxuXG4gICAgcmV0dXJuIGlwLm1hdGNoKHN1Ym5ldGlwLCBzdWJuZXRyYW5nZSlcbiAgfVxufVxuIiwgIi8qIVxuICogZXhwcmVzc1xuICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMyBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbnZhciBjb250ZW50RGlzcG9zaXRpb24gPSByZXF1aXJlKCdjb250ZW50LWRpc3Bvc2l0aW9uJyk7XG52YXIgY29udGVudFR5cGUgPSByZXF1aXJlKCdjb250ZW50LXR5cGUnKTtcbnZhciBkZXByZWNhdGUgPSByZXF1aXJlKCdkZXBkJykoJ2V4cHJlc3MnKTtcbnZhciBmbGF0dGVuID0gcmVxdWlyZSgnYXJyYXktZmxhdHRlbicpO1xudmFyIG1pbWUgPSByZXF1aXJlKCdzZW5kJykubWltZTtcbnZhciBldGFnID0gcmVxdWlyZSgnZXRhZycpO1xudmFyIHByb3h5YWRkciA9IHJlcXVpcmUoJ3Byb3h5LWFkZHInKTtcbnZhciBxcyA9IHJlcXVpcmUoJ3FzJyk7XG52YXIgcXVlcnlzdHJpbmcgPSByZXF1aXJlKCdxdWVyeXN0cmluZycpO1xuXG4vKipcbiAqIFJldHVybiBzdHJvbmcgRVRhZyBmb3IgYGJvZHlgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEJ1ZmZlcn0gYm9keVxuICogQHBhcmFtIHtTdHJpbmd9IFtlbmNvZGluZ11cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuZXRhZyA9IGNyZWF0ZUVUYWdHZW5lcmF0b3IoeyB3ZWFrOiBmYWxzZSB9KVxuXG4vKipcbiAqIFJldHVybiB3ZWFrIEVUYWcgZm9yIGBib2R5YC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xCdWZmZXJ9IGJvZHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZW5jb2RpbmddXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLndldGFnID0gY3JlYXRlRVRhZ0dlbmVyYXRvcih7IHdlYWs6IHRydWUgfSlcblxuLyoqXG4gKiBDaGVjayBpZiBgcGF0aGAgbG9va3MgYWJzb2x1dGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKXtcbiAgaWYgKCcvJyA9PT0gcGF0aFswXSkgcmV0dXJuIHRydWU7XG4gIGlmICgnOicgPT09IHBhdGhbMV0gJiYgKCdcXFxcJyA9PT0gcGF0aFsyXSB8fCAnLycgPT09IHBhdGhbMl0pKSByZXR1cm4gdHJ1ZTsgLy8gV2luZG93cyBkZXZpY2UgcGF0aFxuICBpZiAoJ1xcXFxcXFxcJyA9PT0gcGF0aC5zdWJzdHJpbmcoMCwgMikpIHJldHVybiB0cnVlOyAvLyBNaWNyb3NvZnQgQXp1cmUgYWJzb2x1dGUgcGF0aFxufTtcblxuLyoqXG4gKiBGbGF0dGVuIHRoZSBnaXZlbiBgYXJyYC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5mbGF0dGVuID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGZsYXR0ZW4sXG4gICd1dGlscy5mbGF0dGVuOiB1c2UgYXJyYXktZmxhdHRlbiBucG0gbW9kdWxlIGluc3RlYWQnKTtcblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGdpdmVuIGB0eXBlYCwgZm9yIGV4YW1wbGUgXCJodG1sXCIgYmVjb21lcyBcInRleHQvaHRtbFwiLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLm5vcm1hbGl6ZVR5cGUgPSBmdW5jdGlvbih0eXBlKXtcbiAgcmV0dXJuIH50eXBlLmluZGV4T2YoJy8nKVxuICAgID8gYWNjZXB0UGFyYW1zKHR5cGUpXG4gICAgOiB7IHZhbHVlOiBtaW1lLmxvb2t1cCh0eXBlKSwgcGFyYW1zOiB7fSB9O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYHR5cGVzYCwgZm9yIGV4YW1wbGUgXCJodG1sXCIgYmVjb21lcyBcInRleHQvaHRtbFwiLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHR5cGVzXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMubm9ybWFsaXplVHlwZXMgPSBmdW5jdGlvbih0eXBlcyl7XG4gIHZhciByZXQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgKytpKSB7XG4gICAgcmV0LnB1c2goZXhwb3J0cy5ub3JtYWxpemVUeXBlKHR5cGVzW2ldKSk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciBhcHByb3ByaWF0ZSBmb3IgdGhlIGZpbGVuYW1lLlxuICogbm9uLWFzY2lpIGZpbGVuYW1lcyBhcmUgdXJsZW5jb2RlZCBhbmQgYSBmaWxlbmFtZSogcGFyYW1ldGVyIGlzIGFkZGVkXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmNvbnRlbnREaXNwb3NpdGlvbiA9IGRlcHJlY2F0ZS5mdW5jdGlvbihjb250ZW50RGlzcG9zaXRpb24sXG4gICd1dGlscy5jb250ZW50RGlzcG9zaXRpb246IHVzZSBjb250ZW50LWRpc3Bvc2l0aW9uIG5wbSBtb2R1bGUgaW5zdGVhZCcpO1xuXG4vKipcbiAqIFBhcnNlIGFjY2VwdCBwYXJhbXMgYHN0cmAgcmV0dXJuaW5nIGFuXG4gKiBvYmplY3Qgd2l0aCBgLnZhbHVlYCwgYC5xdWFsaXR5YCBhbmQgYC5wYXJhbXNgLlxuICogYWxzbyBpbmNsdWRlcyBgLm9yaWdpbmFsSW5kZXhgIGZvciBzdGFibGUgc29ydGluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gYWNjZXB0UGFyYW1zKHN0ciwgaW5kZXgpIHtcbiAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KC8gKjsgKi8pO1xuICB2YXIgcmV0ID0geyB2YWx1ZTogcGFydHNbMF0sIHF1YWxpdHk6IDEsIHBhcmFtczoge30sIG9yaWdpbmFsSW5kZXg6IGluZGV4IH07XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBwbXMgPSBwYXJ0c1tpXS5zcGxpdCgvICo9ICovKTtcbiAgICBpZiAoJ3EnID09PSBwbXNbMF0pIHtcbiAgICAgIHJldC5xdWFsaXR5ID0gcGFyc2VGbG9hdChwbXNbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucGFyYW1zW3Btc1swXV0gPSBwbXNbMV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBDb21waWxlIFwiZXRhZ1wiIHZhbHVlIHRvIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSAge0Jvb2xlYW58U3RyaW5nfEZ1bmN0aW9ufSB2YWxcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5jb21waWxlRVRhZyA9IGZ1bmN0aW9uKHZhbCkge1xuICB2YXIgZm47XG5cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgc3dpdGNoICh2YWwpIHtcbiAgICBjYXNlIHRydWU6XG4gICAgY2FzZSAnd2Vhayc6XG4gICAgICBmbiA9IGV4cG9ydHMud2V0YWc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGZhbHNlOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc3Ryb25nJzpcbiAgICAgIGZuID0gZXhwb3J0cy5ldGFnO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Vua25vd24gdmFsdWUgZm9yIGV0YWcgZnVuY3Rpb246ICcgKyB2YWwpO1xuICB9XG5cbiAgcmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIENvbXBpbGUgXCJxdWVyeSBwYXJzZXJcIiB2YWx1ZSB0byBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd8RnVuY3Rpb259IHZhbFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmNvbXBpbGVRdWVyeVBhcnNlciA9IGZ1bmN0aW9uIGNvbXBpbGVRdWVyeVBhcnNlcih2YWwpIHtcbiAgdmFyIGZuO1xuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIHN3aXRjaCAodmFsKSB7XG4gICAgY2FzZSB0cnVlOlxuICAgIGNhc2UgJ3NpbXBsZSc6XG4gICAgICBmbiA9IHF1ZXJ5c3RyaW5nLnBhcnNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBmYWxzZTpcbiAgICAgIGZuID0gbmV3T2JqZWN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZXh0ZW5kZWQnOlxuICAgICAgZm4gPSBwYXJzZUV4dGVuZGVkUXVlcnlTdHJpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5rbm93biB2YWx1ZSBmb3IgcXVlcnkgcGFyc2VyIGZ1bmN0aW9uOiAnICsgdmFsKTtcbiAgfVxuXG4gIHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBDb21waWxlIFwicHJveHkgdHJ1c3RcIiB2YWx1ZSB0byBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gIHtCb29sZWFufFN0cmluZ3xOdW1iZXJ8QXJyYXl8RnVuY3Rpb259IHZhbFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmNvbXBpbGVUcnVzdCA9IGZ1bmN0aW9uKHZhbCkge1xuICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbDtcblxuICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgLy8gU3VwcG9ydCBwbGFpbiB0cnVlL2ZhbHNlXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCl7IHJldHVybiB0cnVlIH07XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAvLyBTdXBwb3J0IHRydXN0aW5nIGhvcCBjb3VudFxuICAgIHJldHVybiBmdW5jdGlvbihhLCBpKXsgcmV0dXJuIGkgPCB2YWwgfTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIC8vIFN1cHBvcnQgY29tbWEtc2VwYXJhdGVkIHZhbHVlc1xuICAgIHZhbCA9IHZhbC5zcGxpdCgnLCcpXG4gICAgICAubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2LnRyaW0oKSB9KVxuICB9XG5cbiAgcmV0dXJuIHByb3h5YWRkci5jb21waWxlKHZhbCB8fCBbXSk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBjaGFyc2V0IGluIGEgZ2l2ZW4gQ29udGVudC1UeXBlIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtTdHJpbmd9IGNoYXJzZXRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuc2V0Q2hhcnNldCA9IGZ1bmN0aW9uIHNldENoYXJzZXQodHlwZSwgY2hhcnNldCkge1xuICBpZiAoIXR5cGUgfHwgIWNoYXJzZXQpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIC8vIHBhcnNlIHR5cGVcbiAgdmFyIHBhcnNlZCA9IGNvbnRlbnRUeXBlLnBhcnNlKHR5cGUpO1xuXG4gIC8vIHNldCBjaGFyc2V0XG4gIHBhcnNlZC5wYXJhbWV0ZXJzLmNoYXJzZXQgPSBjaGFyc2V0O1xuXG4gIC8vIGZvcm1hdCB0eXBlXG4gIHJldHVybiBjb250ZW50VHlwZS5mb3JtYXQocGFyc2VkKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVUYWcgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBnZW5lcmF0aW5nIEVUYWdzIHdpdGhcbiAqIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRVRhZ0dlbmVyYXRvciAob3B0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGVFVGFnIChib2R5LCBlbmNvZGluZykge1xuICAgIHZhciBidWYgPSAhQnVmZmVyLmlzQnVmZmVyKGJvZHkpXG4gICAgICA/IEJ1ZmZlci5mcm9tKGJvZHksIGVuY29kaW5nKVxuICAgICAgOiBib2R5XG5cbiAgICByZXR1cm4gZXRhZyhidWYsIG9wdGlvbnMpXG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBleHRlbmRlZCBxdWVyeSBzdHJpbmcgd2l0aCBxcy5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlRXh0ZW5kZWRRdWVyeVN0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHFzLnBhcnNlKHN0ciwge1xuICAgIGFsbG93UHJvdG90eXBlczogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gbmV3IGVtcHR5IG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBuZXdPYmplY3QoKSB7XG4gIHJldHVybiB7fTtcbn1cbiIsICIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGZpbmFsaGFuZGxlciA9IHJlcXVpcmUoJ2ZpbmFsaGFuZGxlcicpO1xudmFyIFJvdXRlciA9IHJlcXVpcmUoJy4vcm91dGVyJyk7XG52YXIgbWV0aG9kcyA9IHJlcXVpcmUoJ21ldGhvZHMnKTtcbnZhciBtaWRkbGV3YXJlID0gcmVxdWlyZSgnLi9taWRkbGV3YXJlL2luaXQnKTtcbnZhciBxdWVyeSA9IHJlcXVpcmUoJy4vbWlkZGxld2FyZS9xdWVyeScpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZXhwcmVzczphcHBsaWNhdGlvbicpO1xudmFyIFZpZXcgPSByZXF1aXJlKCcuL3ZpZXcnKTtcbnZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xudmFyIGNvbXBpbGVFVGFnID0gcmVxdWlyZSgnLi91dGlscycpLmNvbXBpbGVFVGFnO1xudmFyIGNvbXBpbGVRdWVyeVBhcnNlciA9IHJlcXVpcmUoJy4vdXRpbHMnKS5jb21waWxlUXVlcnlQYXJzZXI7XG52YXIgY29tcGlsZVRydXN0ID0gcmVxdWlyZSgnLi91dGlscycpLmNvbXBpbGVUcnVzdDtcbnZhciBkZXByZWNhdGUgPSByZXF1aXJlKCdkZXBkJykoJ2V4cHJlc3MnKTtcbnZhciBmbGF0dGVuID0gcmVxdWlyZSgnYXJyYXktZmxhdHRlbicpO1xudmFyIG1lcmdlID0gcmVxdWlyZSgndXRpbHMtbWVyZ2UnKTtcbnZhciByZXNvbHZlID0gcmVxdWlyZSgncGF0aCcpLnJlc29sdmU7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCdzZXRwcm90b3R5cGVvZicpXG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG4vKipcbiAqIEFwcGxpY2F0aW9uIHByb3RvdHlwZS5cbiAqL1xuXG52YXIgYXBwID0gZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8qKlxuICogVmFyaWFibGUgZm9yIHRydXN0IHByb3h5IGluaGVyaXRhbmNlIGJhY2stY29tcGF0XG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciB0cnVzdFByb3h5RGVmYXVsdFN5bWJvbCA9ICdAQHN5bWJvbDp0cnVzdF9wcm94eV9kZWZhdWx0JztcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBzZXJ2ZXIuXG4gKlxuICogICAtIHNldHVwIGRlZmF1bHQgY29uZmlndXJhdGlvblxuICogICAtIHNldHVwIGRlZmF1bHQgbWlkZGxld2FyZVxuICogICAtIHNldHVwIHJvdXRlIHJlZmxlY3Rpb24gbWV0aG9kc1xuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuYXBwLmluaXQgPSBmdW5jdGlvbiBpbml0KCkge1xuICB0aGlzLmNhY2hlID0ge307XG4gIHRoaXMuZW5naW5lcyA9IHt9O1xuICB0aGlzLnNldHRpbmdzID0ge307XG5cbiAgdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbigpO1xufTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJpdmF0ZVxuICovXG5cbmFwcC5kZWZhdWx0Q29uZmlndXJhdGlvbiA9IGZ1bmN0aW9uIGRlZmF1bHRDb25maWd1cmF0aW9uKCkge1xuICB2YXIgZW52ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JztcblxuICAvLyBkZWZhdWx0IHNldHRpbmdzXG4gIHRoaXMuZW5hYmxlKCd4LXBvd2VyZWQtYnknKTtcbiAgdGhpcy5zZXQoJ2V0YWcnLCAnd2VhaycpO1xuICB0aGlzLnNldCgnZW52JywgZW52KTtcbiAgdGhpcy5zZXQoJ3F1ZXJ5IHBhcnNlcicsICdleHRlbmRlZCcpO1xuICB0aGlzLnNldCgnc3ViZG9tYWluIG9mZnNldCcsIDIpO1xuICB0aGlzLnNldCgndHJ1c3QgcHJveHknLCBmYWxzZSk7XG5cbiAgLy8gdHJ1c3QgcHJveHkgaW5oZXJpdCBiYWNrLWNvbXBhdFxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5zZXR0aW5ncywgdHJ1c3RQcm94eURlZmF1bHRTeW1ib2wsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG5cbiAgZGVidWcoJ2Jvb3RpbmcgaW4gJXMgbW9kZScsIGVudik7XG5cbiAgdGhpcy5vbignbW91bnQnLCBmdW5jdGlvbiBvbm1vdW50KHBhcmVudCkge1xuICAgIC8vIGluaGVyaXQgdHJ1c3QgcHJveHlcbiAgICBpZiAodGhpcy5zZXR0aW5nc1t0cnVzdFByb3h5RGVmYXVsdFN5bWJvbF0gPT09IHRydWVcbiAgICAgICYmIHR5cGVvZiBwYXJlbnQuc2V0dGluZ3NbJ3RydXN0IHByb3h5IGZuJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnNldHRpbmdzWyd0cnVzdCBwcm94eSddO1xuICAgICAgZGVsZXRlIHRoaXMuc2V0dGluZ3NbJ3RydXN0IHByb3h5IGZuJ107XG4gICAgfVxuXG4gICAgLy8gaW5oZXJpdCBwcm90b3NcbiAgICBzZXRQcm90b3R5cGVPZih0aGlzLnJlcXVlc3QsIHBhcmVudC5yZXF1ZXN0KVxuICAgIHNldFByb3RvdHlwZU9mKHRoaXMucmVzcG9uc2UsIHBhcmVudC5yZXNwb25zZSlcbiAgICBzZXRQcm90b3R5cGVPZih0aGlzLmVuZ2luZXMsIHBhcmVudC5lbmdpbmVzKVxuICAgIHNldFByb3RvdHlwZU9mKHRoaXMuc2V0dGluZ3MsIHBhcmVudC5zZXR0aW5ncylcbiAgfSk7XG5cbiAgLy8gc2V0dXAgbG9jYWxzXG4gIHRoaXMubG9jYWxzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvLyB0b3AtbW9zdCBhcHAgaXMgbW91bnRlZCBhdCAvXG4gIHRoaXMubW91bnRwYXRoID0gJy8nO1xuXG4gIC8vIGRlZmF1bHQgbG9jYWxzXG4gIHRoaXMubG9jYWxzLnNldHRpbmdzID0gdGhpcy5zZXR0aW5ncztcblxuICAvLyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgdGhpcy5zZXQoJ3ZpZXcnLCBWaWV3KTtcbiAgdGhpcy5zZXQoJ3ZpZXdzJywgcmVzb2x2ZSgndmlld3MnKSk7XG4gIHRoaXMuc2V0KCdqc29ucCBjYWxsYmFjayBuYW1lJywgJ2NhbGxiYWNrJyk7XG5cbiAgaWYgKGVudiA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdGhpcy5lbmFibGUoJ3ZpZXcgY2FjaGUnKTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncm91dGVyJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1xcJ2FwcC5yb3V0ZXJcXCcgaXMgZGVwcmVjYXRlZCFcXG5QbGVhc2Ugc2VlIHRoZSAzLnggdG8gNC54IG1pZ3JhdGlvbiBndWlkZSBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXBkYXRlIHlvdXIgYXBwLicpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIGxhemlseSBhZGRzIHRoZSBiYXNlIHJvdXRlciBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGFkZGVkLlxuICpcbiAqIFdlIGNhbm5vdCBhZGQgdGhlIGJhc2Ugcm91dGVyIGluIHRoZSBkZWZhdWx0Q29uZmlndXJhdGlvbiBiZWNhdXNlXG4gKiBpdCByZWFkcyBhcHAgc2V0dGluZ3Mgd2hpY2ggbWlnaHQgYmUgc2V0IGFmdGVyIHRoYXQgaGFzIHJ1bi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5hcHAubGF6eXJvdXRlciA9IGZ1bmN0aW9uIGxhenlyb3V0ZXIoKSB7XG4gIGlmICghdGhpcy5fcm91dGVyKSB7XG4gICAgdGhpcy5fcm91dGVyID0gbmV3IFJvdXRlcih7XG4gICAgICBjYXNlU2Vuc2l0aXZlOiB0aGlzLmVuYWJsZWQoJ2Nhc2Ugc2Vuc2l0aXZlIHJvdXRpbmcnKSxcbiAgICAgIHN0cmljdDogdGhpcy5lbmFibGVkKCdzdHJpY3Qgcm91dGluZycpXG4gICAgfSk7XG5cbiAgICB0aGlzLl9yb3V0ZXIudXNlKHF1ZXJ5KHRoaXMuZ2V0KCdxdWVyeSBwYXJzZXIgZm4nKSkpO1xuICAgIHRoaXMuX3JvdXRlci51c2UobWlkZGxld2FyZS5pbml0KHRoaXMpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcSwgcmVzIHBhaXIgaW50byB0aGUgYXBwbGljYXRpb24uIFN0YXJ0cyBwaXBlbGluZSBwcm9jZXNzaW5nLlxuICpcbiAqIElmIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCB0aGVuIGRlZmF1bHQgZXJyb3IgaGFuZGxlcnMgd2lsbCByZXNwb25kXG4gKiBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IgYnViYmxpbmcgdGhyb3VnaCB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5hcHAuaGFuZGxlID0gZnVuY3Rpb24gaGFuZGxlKHJlcSwgcmVzLCBjYWxsYmFjaykge1xuICB2YXIgcm91dGVyID0gdGhpcy5fcm91dGVyO1xuXG4gIC8vIGZpbmFsIGhhbmRsZXJcbiAgdmFyIGRvbmUgPSBjYWxsYmFjayB8fCBmaW5hbGhhbmRsZXIocmVxLCByZXMsIHtcbiAgICBlbnY6IHRoaXMuZ2V0KCdlbnYnKSxcbiAgICBvbmVycm9yOiBsb2dlcnJvci5iaW5kKHRoaXMpXG4gIH0pO1xuXG4gIC8vIG5vIHJvdXRlc1xuICBpZiAoIXJvdXRlcikge1xuICAgIGRlYnVnKCdubyByb3V0ZXMgZGVmaW5lZCBvbiBhcHAnKTtcbiAgICBkb25lKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcm91dGVyLmhhbmRsZShyZXEsIHJlcywgZG9uZSk7XG59O1xuXG4vKipcbiAqIFByb3h5IGBSb3V0ZXIjdXNlKClgIHRvIGFkZCBtaWRkbGV3YXJlIHRvIHRoZSBhcHAgcm91dGVyLlxuICogU2VlIFJvdXRlciN1c2UoKSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLlxuICpcbiAqIElmIHRoZSBfZm5fIHBhcmFtZXRlciBpcyBhbiBleHByZXNzIGFwcCwgdGhlbiBpdCB3aWxsIGJlXG4gKiBtb3VudGVkIGF0IHRoZSBfcm91dGVfIHNwZWNpZmllZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cblxuYXBwLnVzZSA9IGZ1bmN0aW9uIHVzZShmbikge1xuICB2YXIgb2Zmc2V0ID0gMDtcbiAgdmFyIHBhdGggPSAnLyc7XG5cbiAgLy8gZGVmYXVsdCBwYXRoIHRvICcvJ1xuICAvLyBkaXNhbWJpZ3VhdGUgYXBwLnVzZShbZm5dKVxuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGFyZyA9IGZuO1xuXG4gICAgd2hpbGUgKEFycmF5LmlzQXJyYXkoYXJnKSAmJiBhcmcubGVuZ3RoICE9PSAwKSB7XG4gICAgICBhcmcgPSBhcmdbMF07XG4gICAgfVxuXG4gICAgLy8gZmlyc3QgYXJnIGlzIHRoZSBwYXRoXG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9mZnNldCA9IDE7XG4gICAgICBwYXRoID0gZm47XG4gICAgfVxuICB9XG5cbiAgdmFyIGZucyA9IGZsYXR0ZW4oc2xpY2UuY2FsbChhcmd1bWVudHMsIG9mZnNldCkpO1xuXG4gIGlmIChmbnMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXBwLnVzZSgpIHJlcXVpcmVzIGEgbWlkZGxld2FyZSBmdW5jdGlvbicpXG4gIH1cblxuICAvLyBzZXR1cCByb3V0ZXJcbiAgdGhpcy5sYXp5cm91dGVyKCk7XG4gIHZhciByb3V0ZXIgPSB0aGlzLl9yb3V0ZXI7XG5cbiAgZm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgLy8gbm9uLWV4cHJlc3MgYXBwXG4gICAgaWYgKCFmbiB8fCAhZm4uaGFuZGxlIHx8ICFmbi5zZXQpIHtcbiAgICAgIHJldHVybiByb3V0ZXIudXNlKHBhdGgsIGZuKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnLnVzZSBhcHAgdW5kZXIgJXMnLCBwYXRoKTtcbiAgICBmbi5tb3VudHBhdGggPSBwYXRoO1xuICAgIGZuLnBhcmVudCA9IHRoaXM7XG5cbiAgICAvLyByZXN0b3JlIC5hcHAgcHJvcGVydHkgb24gcmVxIGFuZCByZXNcbiAgICByb3V0ZXIudXNlKHBhdGgsIGZ1bmN0aW9uIG1vdW50ZWRfYXBwKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgICB2YXIgb3JpZyA9IHJlcS5hcHA7XG4gICAgICBmbi5oYW5kbGUocmVxLCByZXMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgc2V0UHJvdG90eXBlT2YocmVxLCBvcmlnLnJlcXVlc3QpXG4gICAgICAgIHNldFByb3RvdHlwZU9mKHJlcywgb3JpZy5yZXNwb25zZSlcbiAgICAgICAgbmV4dChlcnIpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBtb3VudGVkIGFuIGFwcFxuICAgIGZuLmVtaXQoJ21vdW50JywgdGhpcyk7XG4gIH0sIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQcm94eSB0byB0aGUgYXBwIGBSb3V0ZXIjcm91dGUoKWBcbiAqIFJldHVybnMgYSBuZXcgYFJvdXRlYCBpbnN0YW5jZSBmb3IgdGhlIF9wYXRoXy5cbiAqXG4gKiBSb3V0ZXMgYXJlIGlzb2xhdGVkIG1pZGRsZXdhcmUgc3RhY2tzIGZvciBzcGVjaWZpYyBwYXRocy5cbiAqIFNlZSB0aGUgUm91dGUgYXBpIGRvY3MgZm9yIGRldGFpbHMuXG4gKlxuICogQHB1YmxpY1xuICovXG5cbmFwcC5yb3V0ZSA9IGZ1bmN0aW9uIHJvdXRlKHBhdGgpIHtcbiAgdGhpcy5sYXp5cm91dGVyKCk7XG4gIHJldHVybiB0aGlzLl9yb3V0ZXIucm91dGUocGF0aCk7XG59O1xuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBnaXZlbiB0ZW1wbGF0ZSBlbmdpbmUgY2FsbGJhY2sgYGZuYFxuICogYXMgYGV4dGAuXG4gKlxuICogQnkgZGVmYXVsdCB3aWxsIGByZXF1aXJlKClgIHRoZSBlbmdpbmUgYmFzZWQgb24gdGhlXG4gKiBmaWxlIGV4dGVuc2lvbi4gRm9yIGV4YW1wbGUgaWYgeW91IHRyeSB0byByZW5kZXJcbiAqIGEgXCJmb28uZWpzXCIgZmlsZSBFeHByZXNzIHdpbGwgaW52b2tlIHRoZSBmb2xsb3dpbmcgaW50ZXJuYWxseTpcbiAqXG4gKiAgICAgYXBwLmVuZ2luZSgnZWpzJywgcmVxdWlyZSgnZWpzJykuX19leHByZXNzKTtcbiAqXG4gKiBGb3IgZW5naW5lcyB0aGF0IGRvIG5vdCBwcm92aWRlIGAuX19leHByZXNzYCBvdXQgb2YgdGhlIGJveCxcbiAqIG9yIGlmIHlvdSB3aXNoIHRvIFwibWFwXCIgYSBkaWZmZXJlbnQgZXh0ZW5zaW9uIHRvIHRoZSB0ZW1wbGF0ZSBlbmdpbmVcbiAqIHlvdSBtYXkgdXNlIHRoaXMgbWV0aG9kLiBGb3IgZXhhbXBsZSBtYXBwaW5nIHRoZSBFSlMgdGVtcGxhdGUgZW5naW5lIHRvXG4gKiBcIi5odG1sXCIgZmlsZXM6XG4gKlxuICogICAgIGFwcC5lbmdpbmUoJ2h0bWwnLCByZXF1aXJlKCdlanMnKS5yZW5kZXJGaWxlKTtcbiAqXG4gKiBJbiB0aGlzIGNhc2UgRUpTIHByb3ZpZGVzIGEgYC5yZW5kZXJGaWxlKClgIG1ldGhvZCB3aXRoXG4gKiB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBFeHByZXNzIGV4cGVjdHM6IGAocGF0aCwgb3B0aW9ucywgY2FsbGJhY2spYCxcbiAqIHRob3VnaCBub3RlIHRoYXQgaXQgYWxpYXNlcyB0aGlzIG1ldGhvZCBhcyBgZWpzLl9fZXhwcmVzc2AgaW50ZXJuYWxseVxuICogc28gaWYgeW91J3JlIHVzaW5nIFwiLmVqc1wiIGV4dGVuc2lvbnMgeW91IGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuXG4gKlxuICogU29tZSB0ZW1wbGF0ZSBlbmdpbmVzIGRvIG5vdCBmb2xsb3cgdGhpcyBjb252ZW50aW9uLCB0aGVcbiAqIFtDb25zb2xpZGF0ZS5qc10oaHR0cHM6Ly9naXRodWIuY29tL3RqL2NvbnNvbGlkYXRlLmpzKVxuICogbGlicmFyeSB3YXMgY3JlYXRlZCB0byBtYXAgYWxsIG9mIG5vZGUncyBwb3B1bGFyIHRlbXBsYXRlXG4gKiBlbmdpbmVzIHRvIGZvbGxvdyB0aGlzIGNvbnZlbnRpb24sIHRodXMgYWxsb3dpbmcgdGhlbSB0b1xuICogd29yayBzZWFtbGVzc2x5IHdpdGhpbiBFeHByZXNzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBleHRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5lbmdpbmUgPSBmdW5jdGlvbiBlbmdpbmUoZXh0LCBmbikge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsYmFjayBmdW5jdGlvbiByZXF1aXJlZCcpO1xuICB9XG5cbiAgLy8gZ2V0IGZpbGUgZXh0ZW5zaW9uXG4gIHZhciBleHRlbnNpb24gPSBleHRbMF0gIT09ICcuJ1xuICAgID8gJy4nICsgZXh0XG4gICAgOiBleHQ7XG5cbiAgLy8gc3RvcmUgZW5naW5lXG4gIHRoaXMuZW5naW5lc1tleHRlbnNpb25dID0gZm47XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFByb3h5IHRvIGBSb3V0ZXIjcGFyYW0oKWAgd2l0aCBvbmUgYWRkZWQgYXBpIGZlYXR1cmUuIFRoZSBfbmFtZV8gcGFyYW1ldGVyXG4gKiBjYW4gYmUgYW4gYXJyYXkgb2YgbmFtZXMuXG4gKlxuICogU2VlIHRoZSBSb3V0ZXIjcGFyYW0oKSBkb2NzIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5wYXJhbSA9IGZ1bmN0aW9uIHBhcmFtKG5hbWUsIGZuKSB7XG4gIHRoaXMubGF6eXJvdXRlcigpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhcmFtKG5hbWVbaV0sIGZuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX3JvdXRlci5wYXJhbShuYW1lLCBmbik7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFzc2lnbiBgc2V0dGluZ2AgdG8gYHZhbGAsIG9yIHJldHVybiBgc2V0dGluZ2AncyB2YWx1ZS5cbiAqXG4gKiAgICBhcHAuc2V0KCdmb28nLCAnYmFyJyk7XG4gKiAgICBhcHAuc2V0KCdmb28nKTtcbiAqICAgIC8vID0+IFwiYmFyXCJcbiAqXG4gKiBNb3VudGVkIHNlcnZlcnMgaW5oZXJpdCB0aGVpciBwYXJlbnQgc2VydmVyJ3Mgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNldHRpbmdcbiAqIEBwYXJhbSB7Kn0gW3ZhbF1cbiAqIEByZXR1cm4ge1NlcnZlcn0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxuYXBwLnNldCA9IGZ1bmN0aW9uIHNldChzZXR0aW5nLCB2YWwpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBhcHAuZ2V0KHNldHRpbmcpXG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc1xuXG4gICAgd2hpbGUgKHNldHRpbmdzICYmIHNldHRpbmdzICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgc2V0dGluZykpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzW3NldHRpbmddXG4gICAgICB9XG5cbiAgICAgIHNldHRpbmdzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHNldHRpbmdzKVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGRlYnVnKCdzZXQgXCIlc1wiIHRvICVvJywgc2V0dGluZywgdmFsKTtcblxuICAvLyBzZXQgdmFsdWVcbiAgdGhpcy5zZXR0aW5nc1tzZXR0aW5nXSA9IHZhbDtcblxuICAvLyB0cmlnZ2VyIG1hdGNoZWQgc2V0dGluZ3NcbiAgc3dpdGNoIChzZXR0aW5nKSB7XG4gICAgY2FzZSAnZXRhZyc6XG4gICAgICB0aGlzLnNldCgnZXRhZyBmbicsIGNvbXBpbGVFVGFnKHZhbCkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncXVlcnkgcGFyc2VyJzpcbiAgICAgIHRoaXMuc2V0KCdxdWVyeSBwYXJzZXIgZm4nLCBjb21waWxlUXVlcnlQYXJzZXIodmFsKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0cnVzdCBwcm94eSc6XG4gICAgICB0aGlzLnNldCgndHJ1c3QgcHJveHkgZm4nLCBjb21waWxlVHJ1c3QodmFsKSk7XG5cbiAgICAgIC8vIHRydXN0IHByb3h5IGluaGVyaXQgYmFjay1jb21wYXRcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnNldHRpbmdzLCB0cnVzdFByb3h5RGVmYXVsdFN5bWJvbCwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgYXBwJ3MgYWJzb2x1dGUgcGF0aG5hbWVcbiAqIGJhc2VkIG9uIHRoZSBwYXJlbnQocykgdGhhdCBoYXZlXG4gKiBtb3VudGVkIGl0LlxuICpcbiAqIEZvciBleGFtcGxlIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXNcbiAqIG1vdW50ZWQgYXMgXCIvYWRtaW5cIiwgd2hpY2ggaXRzZWxmXG4gKiB3YXMgbW91bnRlZCBhcyBcIi9ibG9nXCIgdGhlbiB0aGVcbiAqIHJldHVybiB2YWx1ZSB3b3VsZCBiZSBcIi9ibG9nL2FkbWluXCIuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5hcHAucGF0aCA9IGZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudFxuICAgID8gdGhpcy5wYXJlbnQucGF0aCgpICsgdGhpcy5tb3VudHBhdGhcbiAgICA6ICcnO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBgc2V0dGluZ2AgaXMgZW5hYmxlZCAodHJ1dGh5KS5cbiAqXG4gKiAgICBhcHAuZW5hYmxlZCgnZm9vJylcbiAqICAgIC8vID0+IGZhbHNlXG4gKlxuICogICAgYXBwLmVuYWJsZSgnZm9vJylcbiAqICAgIGFwcC5lbmFibGVkKCdmb28nKVxuICogICAgLy8gPT4gdHJ1ZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5nXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmFwcC5lbmFibGVkID0gZnVuY3Rpb24gZW5hYmxlZChzZXR0aW5nKSB7XG4gIHJldHVybiBCb29sZWFuKHRoaXMuc2V0KHNldHRpbmcpKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYHNldHRpbmdgIGlzIGRpc2FibGVkLlxuICpcbiAqICAgIGFwcC5kaXNhYmxlZCgnZm9vJylcbiAqICAgIC8vID0+IHRydWVcbiAqXG4gKiAgICBhcHAuZW5hYmxlKCdmb28nKVxuICogICAgYXBwLmRpc2FibGVkKCdmb28nKVxuICogICAgLy8gPT4gZmFsc2VcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2V0dGluZ1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5hcHAuZGlzYWJsZWQgPSBmdW5jdGlvbiBkaXNhYmxlZChzZXR0aW5nKSB7XG4gIHJldHVybiAhdGhpcy5zZXQoc2V0dGluZyk7XG59O1xuXG4vKipcbiAqIEVuYWJsZSBgc2V0dGluZ2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNldHRpbmdcbiAqIEByZXR1cm4ge2FwcH0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxuYXBwLmVuYWJsZSA9IGZ1bmN0aW9uIGVuYWJsZShzZXR0aW5nKSB7XG4gIHJldHVybiB0aGlzLnNldChzZXR0aW5nLCB0cnVlKTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSBgc2V0dGluZ2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNldHRpbmdcbiAqIEByZXR1cm4ge2FwcH0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxuYXBwLmRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKHNldHRpbmcpIHtcbiAgcmV0dXJuIHRoaXMuc2V0KHNldHRpbmcsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogRGVsZWdhdGUgYC5WRVJCKC4uLilgIGNhbGxzIHRvIGByb3V0ZXIuVkVSQiguLi4pYC5cbiAqL1xuXG5tZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKXtcbiAgYXBwW21ldGhvZF0gPSBmdW5jdGlvbihwYXRoKXtcbiAgICBpZiAobWV0aG9kID09PSAnZ2V0JyAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBhcHAuZ2V0KHNldHRpbmcpXG4gICAgICByZXR1cm4gdGhpcy5zZXQocGF0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXp5cm91dGVyKCk7XG5cbiAgICB2YXIgcm91dGUgPSB0aGlzLl9yb3V0ZXIucm91dGUocGF0aCk7XG4gICAgcm91dGVbbWV0aG9kXS5hcHBseShyb3V0ZSwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn0pO1xuXG4vKipcbiAqIFNwZWNpYWwtY2FzZWQgXCJhbGxcIiBtZXRob2QsIGFwcGx5aW5nIHRoZSBnaXZlbiByb3V0ZSBgcGF0aGAsXG4gKiBtaWRkbGV3YXJlLCBhbmQgY2FsbGJhY2sgdG8gX2V2ZXJ5XyBIVFRQIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtGdW5jdGlvbn0gLi4uXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5hbGwgPSBmdW5jdGlvbiBhbGwocGF0aCkge1xuICB0aGlzLmxhenlyb3V0ZXIoKTtcblxuICB2YXIgcm91dGUgPSB0aGlzLl9yb3V0ZXIucm91dGUocGF0aCk7XG4gIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgIHJvdXRlW21ldGhvZHNbaV1dLmFwcGx5KHJvdXRlLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZGVsIC0+IGRlbGV0ZSBhbGlhc1xuXG5hcHAuZGVsID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGFwcC5kZWxldGUsICdhcHAuZGVsOiBVc2UgYXBwLmRlbGV0ZSBpbnN0ZWFkJyk7XG5cbi8qKlxuICogUmVuZGVyIHRoZSBnaXZlbiB2aWV3IGBuYW1lYCBuYW1lIHdpdGggYG9wdGlvbnNgXG4gKiBhbmQgYSBjYWxsYmFjayBhY2NlcHRpbmcgYW4gZXJyb3IgYW5kIHRoZVxuICogcmVuZGVyZWQgdGVtcGxhdGUgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgYXBwLnJlbmRlcignZW1haWwnLCB7IG5hbWU6ICdUb2JpJyB9LCBmdW5jdGlvbihlcnIsIGh0bWwpe1xuICogICAgICAvLyAuLi5cbiAqICAgIH0pXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBvcHRpb25zIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIobmFtZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcbiAgdmFyIGRvbmUgPSBjYWxsYmFjaztcbiAgdmFyIGVuZ2luZXMgPSB0aGlzLmVuZ2luZXM7XG4gIHZhciBvcHRzID0gb3B0aW9ucztcbiAgdmFyIHJlbmRlck9wdGlvbnMgPSB7fTtcbiAgdmFyIHZpZXc7XG5cbiAgLy8gc3VwcG9ydCBjYWxsYmFjayBmdW5jdGlvbiBhcyBzZWNvbmQgYXJnXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBvcHRpb25zO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIC8vIG1lcmdlIGFwcC5sb2NhbHNcbiAgbWVyZ2UocmVuZGVyT3B0aW9ucywgdGhpcy5sb2NhbHMpO1xuXG4gIC8vIG1lcmdlIG9wdGlvbnMuX2xvY2Fsc1xuICBpZiAob3B0cy5fbG9jYWxzKSB7XG4gICAgbWVyZ2UocmVuZGVyT3B0aW9ucywgb3B0cy5fbG9jYWxzKTtcbiAgfVxuXG4gIC8vIG1lcmdlIG9wdGlvbnNcbiAgbWVyZ2UocmVuZGVyT3B0aW9ucywgb3B0cyk7XG5cbiAgLy8gc2V0IC5jYWNoZSB1bmxlc3MgZXhwbGljaXRseSBwcm92aWRlZFxuICBpZiAocmVuZGVyT3B0aW9ucy5jYWNoZSA9PSBudWxsKSB7XG4gICAgcmVuZGVyT3B0aW9ucy5jYWNoZSA9IHRoaXMuZW5hYmxlZCgndmlldyBjYWNoZScpO1xuICB9XG5cbiAgLy8gcHJpbWVkIGNhY2hlXG4gIGlmIChyZW5kZXJPcHRpb25zLmNhY2hlKSB7XG4gICAgdmlldyA9IGNhY2hlW25hbWVdO1xuICB9XG5cbiAgLy8gdmlld1xuICBpZiAoIXZpZXcpIHtcbiAgICB2YXIgVmlldyA9IHRoaXMuZ2V0KCd2aWV3Jyk7XG5cbiAgICB2aWV3ID0gbmV3IFZpZXcobmFtZSwge1xuICAgICAgZGVmYXVsdEVuZ2luZTogdGhpcy5nZXQoJ3ZpZXcgZW5naW5lJyksXG4gICAgICByb290OiB0aGlzLmdldCgndmlld3MnKSxcbiAgICAgIGVuZ2luZXM6IGVuZ2luZXNcbiAgICB9KTtcblxuICAgIGlmICghdmlldy5wYXRoKSB7XG4gICAgICB2YXIgZGlycyA9IEFycmF5LmlzQXJyYXkodmlldy5yb290KSAmJiB2aWV3LnJvb3QubGVuZ3RoID4gMVxuICAgICAgICA/ICdkaXJlY3RvcmllcyBcIicgKyB2aWV3LnJvb3Quc2xpY2UoMCwgLTEpLmpvaW4oJ1wiLCBcIicpICsgJ1wiIG9yIFwiJyArIHZpZXcucm9vdFt2aWV3LnJvb3QubGVuZ3RoIC0gMV0gKyAnXCInXG4gICAgICAgIDogJ2RpcmVjdG9yeSBcIicgKyB2aWV3LnJvb3QgKyAnXCInXG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9va3VwIHZpZXcgXCInICsgbmFtZSArICdcIiBpbiB2aWV3cyAnICsgZGlycyk7XG4gICAgICBlcnIudmlldyA9IHZpZXc7XG4gICAgICByZXR1cm4gZG9uZShlcnIpO1xuICAgIH1cblxuICAgIC8vIHByaW1lIHRoZSBjYWNoZVxuICAgIGlmIChyZW5kZXJPcHRpb25zLmNhY2hlKSB7XG4gICAgICBjYWNoZVtuYW1lXSA9IHZpZXc7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVuZGVyXG4gIHRyeVJlbmRlcih2aWV3LCByZW5kZXJPcHRpb25zLCBkb25lKTtcbn07XG5cbi8qKlxuICogTGlzdGVuIGZvciBjb25uZWN0aW9ucy5cbiAqXG4gKiBBIG5vZGUgYGh0dHAuU2VydmVyYCBpcyByZXR1cm5lZCwgd2l0aCB0aGlzXG4gKiBhcHBsaWNhdGlvbiAod2hpY2ggaXMgYSBgRnVuY3Rpb25gKSBhcyBpdHNcbiAqIGNhbGxiYWNrLiBJZiB5b3Ugd2lzaCB0byBjcmVhdGUgYm90aCBhbiBIVFRQXG4gKiBhbmQgSFRUUFMgc2VydmVyIHlvdSBtYXkgZG8gc28gd2l0aCB0aGUgXCJodHRwXCJcbiAqIGFuZCBcImh0dHBzXCIgbW9kdWxlcyBhcyBzaG93biBoZXJlOlxuICpcbiAqICAgIHZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpXG4gKiAgICAgICwgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpXG4gKiAgICAgICwgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKVxuICogICAgICAsIGFwcCA9IGV4cHJlc3MoKTtcbiAqXG4gKiAgICBodHRwLmNyZWF0ZVNlcnZlcihhcHApLmxpc3Rlbig4MCk7XG4gKiAgICBodHRwcy5jcmVhdGVTZXJ2ZXIoeyAuLi4gfSwgYXBwKS5saXN0ZW4oNDQzKTtcbiAqXG4gKiBAcmV0dXJuIHtodHRwLlNlcnZlcn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5hcHAubGlzdGVuID0gZnVuY3Rpb24gbGlzdGVuKCkge1xuICB2YXIgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIodGhpcyk7XG4gIHJldHVybiBzZXJ2ZXIubGlzdGVuLmFwcGx5KHNlcnZlciwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogTG9nIGVycm9yIHVzaW5nIGNvbnNvbGUuZXJyb3IuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvZ2Vycm9yKGVycikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodGhpcy5nZXQoJ2VudicpICE9PSAndGVzdCcpIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrIHx8IGVyci50b1N0cmluZygpKTtcbn1cblxuLyoqXG4gKiBUcnkgcmVuZGVyaW5nIGEgdmlldy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdHJ5UmVuZGVyKHZpZXcsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHRyeSB7XG4gICAgdmlldy5yZW5kZXIob3B0aW9ucywgY2FsbGJhY2spO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBuZWdvdGlhdG9yXG4gKiBDb3B5cmlnaHQoYykgMjAxMiBJc2FhYyBaLiBTY2hsdWV0ZXJcbiAqIENvcHlyaWdodChjKSAyMDE0IEZlZGVyaWNvIFJvbWVyb1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcHJlZmVycmVkQ2hhcnNldHM7XG5tb2R1bGUuZXhwb3J0cy5wcmVmZXJyZWRDaGFyc2V0cyA9IHByZWZlcnJlZENoYXJzZXRzO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBzaW1wbGVDaGFyc2V0UmVnRXhwID0gL15cXHMqKFteXFxzO10rKVxccyooPzo7KC4qKSk/JC87XG5cbi8qKlxuICogUGFyc2UgdGhlIEFjY2VwdC1DaGFyc2V0IGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VBY2NlcHRDaGFyc2V0KGFjY2VwdCkge1xuICB2YXIgYWNjZXB0cyA9IGFjY2VwdC5zcGxpdCgnLCcpO1xuXG4gIGZvciAodmFyIGkgPSAwLCBqID0gMDsgaSA8IGFjY2VwdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hhcnNldCA9IHBhcnNlQ2hhcnNldChhY2NlcHRzW2ldLnRyaW0oKSwgaSk7XG5cbiAgICBpZiAoY2hhcnNldCkge1xuICAgICAgYWNjZXB0c1tqKytdID0gY2hhcnNldDtcbiAgICB9XG4gIH1cblxuICAvLyB0cmltIGFjY2VwdHNcbiAgYWNjZXB0cy5sZW5ndGggPSBqO1xuXG4gIHJldHVybiBhY2NlcHRzO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgY2hhcnNldCBmcm9tIHRoZSBBY2NlcHQtQ2hhcnNldCBoZWFkZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlQ2hhcnNldChzdHIsIGkpIHtcbiAgdmFyIG1hdGNoID0gc2ltcGxlQ2hhcnNldFJlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBjaGFyc2V0ID0gbWF0Y2hbMV07XG4gIHZhciBxID0gMTtcbiAgaWYgKG1hdGNoWzJdKSB7XG4gICAgdmFyIHBhcmFtcyA9IG1hdGNoWzJdLnNwbGl0KCc7JylcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHAgPSBwYXJhbXNbal0udHJpbSgpLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAocFswXSA9PT0gJ3EnKSB7XG4gICAgICAgIHEgPSBwYXJzZUZsb2F0KHBbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgcTogcSxcbiAgICBpOiBpXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcmlvcml0eSBvZiBhIGNoYXJzZXQuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldENoYXJzZXRQcmlvcml0eShjaGFyc2V0LCBhY2NlcHRlZCwgaW5kZXgpIHtcbiAgdmFyIHByaW9yaXR5ID0ge286IC0xLCBxOiAwLCBzOiAwfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFjY2VwdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwZWMgPSBzcGVjaWZ5KGNoYXJzZXQsIGFjY2VwdGVkW2ldLCBpbmRleCk7XG5cbiAgICBpZiAoc3BlYyAmJiAocHJpb3JpdHkucyAtIHNwZWMucyB8fCBwcmlvcml0eS5xIC0gc3BlYy5xIHx8IHByaW9yaXR5Lm8gLSBzcGVjLm8pIDwgMCkge1xuICAgICAgcHJpb3JpdHkgPSBzcGVjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmlvcml0eTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNwZWNpZmljaXR5IG9mIHRoZSBjaGFyc2V0LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzcGVjaWZ5KGNoYXJzZXQsIHNwZWMsIGluZGV4KSB7XG4gIHZhciBzID0gMDtcbiAgaWYoc3BlYy5jaGFyc2V0LnRvTG93ZXJDYXNlKCkgPT09IGNoYXJzZXQudG9Mb3dlckNhc2UoKSl7XG4gICAgcyB8PSAxO1xuICB9IGVsc2UgaWYgKHNwZWMuY2hhcnNldCAhPT0gJyonICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGk6IGluZGV4LFxuICAgIG86IHNwZWMuaSxcbiAgICBxOiBzcGVjLnEsXG4gICAgczogc1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcmVmZXJyZWQgY2hhcnNldHMgZnJvbSBhbiBBY2NlcHQtQ2hhcnNldCBoZWFkZXIuXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcHJlZmVycmVkQ2hhcnNldHMoYWNjZXB0LCBwcm92aWRlZCkge1xuICAvLyBSRkMgMjYxNiBzZWMgMTQuMjogbm8gaGVhZGVyID0gKlxuICB2YXIgYWNjZXB0cyA9IHBhcnNlQWNjZXB0Q2hhcnNldChhY2NlcHQgPT09IHVuZGVmaW5lZCA/ICcqJyA6IGFjY2VwdCB8fCAnJyk7XG5cbiAgaWYgKCFwcm92aWRlZCkge1xuICAgIC8vIHNvcnRlZCBsaXN0IG9mIGFsbCBjaGFyc2V0c1xuICAgIHJldHVybiBhY2NlcHRzXG4gICAgICAuZmlsdGVyKGlzUXVhbGl0eSlcbiAgICAgIC5zb3J0KGNvbXBhcmVTcGVjcylcbiAgICAgIC5tYXAoZ2V0RnVsbENoYXJzZXQpO1xuICB9XG5cbiAgdmFyIHByaW9yaXRpZXMgPSBwcm92aWRlZC5tYXAoZnVuY3Rpb24gZ2V0UHJpb3JpdHkodHlwZSwgaW5kZXgpIHtcbiAgICByZXR1cm4gZ2V0Q2hhcnNldFByaW9yaXR5KHR5cGUsIGFjY2VwdHMsIGluZGV4KTtcbiAgfSk7XG5cbiAgLy8gc29ydGVkIGxpc3Qgb2YgYWNjZXB0ZWQgY2hhcnNldHNcbiAgcmV0dXJuIHByaW9yaXRpZXMuZmlsdGVyKGlzUXVhbGl0eSkuc29ydChjb21wYXJlU3BlY3MpLm1hcChmdW5jdGlvbiBnZXRDaGFyc2V0KHByaW9yaXR5KSB7XG4gICAgcmV0dXJuIHByb3ZpZGVkW3ByaW9yaXRpZXMuaW5kZXhPZihwcmlvcml0eSldO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb21wYXJlIHR3byBzcGVjcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29tcGFyZVNwZWNzKGEsIGIpIHtcbiAgcmV0dXJuIChiLnEgLSBhLnEpIHx8IChiLnMgLSBhLnMpIHx8IChhLm8gLSBiLm8pIHx8IChhLmkgLSBiLmkpIHx8IDA7XG59XG5cbi8qKlxuICogR2V0IGZ1bGwgY2hhcnNldCBzdHJpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEZ1bGxDaGFyc2V0KHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMuY2hhcnNldDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHNwZWMgaGFzIGFueSBxdWFsaXR5LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc1F1YWxpdHkoc3BlYykge1xuICByZXR1cm4gc3BlYy5xID4gMDtcbn1cbiIsICIvKipcbiAqIG5lZ290aWF0b3JcbiAqIENvcHlyaWdodChjKSAyMDEyIElzYWFjIFouIFNjaGx1ZXRlclxuICogQ29weXJpZ2h0KGMpIDIwMTQgRmVkZXJpY28gUm9tZXJvXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwcmVmZXJyZWRFbmNvZGluZ3M7XG5tb2R1bGUuZXhwb3J0cy5wcmVmZXJyZWRFbmNvZGluZ3MgPSBwcmVmZXJyZWRFbmNvZGluZ3M7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHNpbXBsZUVuY29kaW5nUmVnRXhwID0gL15cXHMqKFteXFxzO10rKVxccyooPzo7KC4qKSk/JC87XG5cbi8qKlxuICogUGFyc2UgdGhlIEFjY2VwdC1FbmNvZGluZyBoZWFkZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlQWNjZXB0RW5jb2RpbmcoYWNjZXB0KSB7XG4gIHZhciBhY2NlcHRzID0gYWNjZXB0LnNwbGl0KCcsJyk7XG4gIHZhciBoYXNJZGVudGl0eSA9IGZhbHNlO1xuICB2YXIgbWluUXVhbGl0eSA9IDE7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgYWNjZXB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbmNvZGluZyA9IHBhcnNlRW5jb2RpbmcoYWNjZXB0c1tpXS50cmltKCksIGkpO1xuXG4gICAgaWYgKGVuY29kaW5nKSB7XG4gICAgICBhY2NlcHRzW2orK10gPSBlbmNvZGluZztcbiAgICAgIGhhc0lkZW50aXR5ID0gaGFzSWRlbnRpdHkgfHwgc3BlY2lmeSgnaWRlbnRpdHknLCBlbmNvZGluZyk7XG4gICAgICBtaW5RdWFsaXR5ID0gTWF0aC5taW4obWluUXVhbGl0eSwgZW5jb2RpbmcucSB8fCAxKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWhhc0lkZW50aXR5KSB7XG4gICAgLypcbiAgICAgKiBJZiBpZGVudGl0eSBkb2Vzbid0IGV4cGxpY2l0bHkgYXBwZWFyIGluIHRoZSBhY2NlcHQtZW5jb2RpbmcgaGVhZGVyLFxuICAgICAqIGl0J3MgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgYWNjZXB0YWJsZSBlbmNvZGluZyB3aXRoIHRoZSBsb3dlc3QgcVxuICAgICAqL1xuICAgIGFjY2VwdHNbaisrXSA9IHtcbiAgICAgIGVuY29kaW5nOiAnaWRlbnRpdHknLFxuICAgICAgcTogbWluUXVhbGl0eSxcbiAgICAgIGk6IGlcbiAgICB9O1xuICB9XG5cbiAgLy8gdHJpbSBhY2NlcHRzXG4gIGFjY2VwdHMubGVuZ3RoID0gajtcblxuICByZXR1cm4gYWNjZXB0cztcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBlbmNvZGluZyBmcm9tIHRoZSBBY2NlcHQtRW5jb2RpbmcgaGVhZGVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUVuY29kaW5nKHN0ciwgaSkge1xuICB2YXIgbWF0Y2ggPSBzaW1wbGVFbmNvZGluZ1JlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBlbmNvZGluZyA9IG1hdGNoWzFdO1xuICB2YXIgcSA9IDE7XG4gIGlmIChtYXRjaFsyXSkge1xuICAgIHZhciBwYXJhbXMgPSBtYXRjaFsyXS5zcGxpdCgnOycpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcCA9IHBhcmFtc1tqXS50cmltKCkuc3BsaXQoJz0nKTtcbiAgICAgIGlmIChwWzBdID09PSAncScpIHtcbiAgICAgICAgcSA9IHBhcnNlRmxvYXQocFsxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgIHE6IHEsXG4gICAgaTogaVxuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJpb3JpdHkgb2YgYW4gZW5jb2RpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEVuY29kaW5nUHJpb3JpdHkoZW5jb2RpbmcsIGFjY2VwdGVkLCBpbmRleCkge1xuICB2YXIgcHJpb3JpdHkgPSB7bzogLTEsIHE6IDAsIHM6IDB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjZXB0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc3BlYyA9IHNwZWNpZnkoZW5jb2RpbmcsIGFjY2VwdGVkW2ldLCBpbmRleCk7XG5cbiAgICBpZiAoc3BlYyAmJiAocHJpb3JpdHkucyAtIHNwZWMucyB8fCBwcmlvcml0eS5xIC0gc3BlYy5xIHx8IHByaW9yaXR5Lm8gLSBzcGVjLm8pIDwgMCkge1xuICAgICAgcHJpb3JpdHkgPSBzcGVjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmlvcml0eTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNwZWNpZmljaXR5IG9mIHRoZSBlbmNvZGluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BlY2lmeShlbmNvZGluZywgc3BlYywgaW5kZXgpIHtcbiAgdmFyIHMgPSAwO1xuICBpZihzcGVjLmVuY29kaW5nLnRvTG93ZXJDYXNlKCkgPT09IGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpe1xuICAgIHMgfD0gMTtcbiAgfSBlbHNlIGlmIChzcGVjLmVuY29kaW5nICE9PSAnKicgKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaTogaW5kZXgsXG4gICAgbzogc3BlYy5pLFxuICAgIHE6IHNwZWMucSxcbiAgICBzOiBzXG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBwcmVmZXJyZWQgZW5jb2RpbmdzIGZyb20gYW4gQWNjZXB0LUVuY29kaW5nIGhlYWRlci5cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwcmVmZXJyZWRFbmNvZGluZ3MoYWNjZXB0LCBwcm92aWRlZCkge1xuICB2YXIgYWNjZXB0cyA9IHBhcnNlQWNjZXB0RW5jb2RpbmcoYWNjZXB0IHx8ICcnKTtcblxuICBpZiAoIXByb3ZpZGVkKSB7XG4gICAgLy8gc29ydGVkIGxpc3Qgb2YgYWxsIGVuY29kaW5nc1xuICAgIHJldHVybiBhY2NlcHRzXG4gICAgICAuZmlsdGVyKGlzUXVhbGl0eSlcbiAgICAgIC5zb3J0KGNvbXBhcmVTcGVjcylcbiAgICAgIC5tYXAoZ2V0RnVsbEVuY29kaW5nKTtcbiAgfVxuXG4gIHZhciBwcmlvcml0aWVzID0gcHJvdmlkZWQubWFwKGZ1bmN0aW9uIGdldFByaW9yaXR5KHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGdldEVuY29kaW5nUHJpb3JpdHkodHlwZSwgYWNjZXB0cywgaW5kZXgpO1xuICB9KTtcblxuICAvLyBzb3J0ZWQgbGlzdCBvZiBhY2NlcHRlZCBlbmNvZGluZ3NcbiAgcmV0dXJuIHByaW9yaXRpZXMuZmlsdGVyKGlzUXVhbGl0eSkuc29ydChjb21wYXJlU3BlY3MpLm1hcChmdW5jdGlvbiBnZXRFbmNvZGluZyhwcmlvcml0eSkge1xuICAgIHJldHVybiBwcm92aWRlZFtwcmlvcml0aWVzLmluZGV4T2YocHJpb3JpdHkpXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28gc3BlY3MuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbXBhcmVTcGVjcyhhLCBiKSB7XG4gIHJldHVybiAoYi5xIC0gYS5xKSB8fCAoYi5zIC0gYS5zKSB8fCAoYS5vIC0gYi5vKSB8fCAoYS5pIC0gYi5pKSB8fCAwO1xufVxuXG4vKipcbiAqIEdldCBmdWxsIGVuY29kaW5nIHN0cmluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RnVsbEVuY29kaW5nKHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMuZW5jb2Rpbmc7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzcGVjIGhhcyBhbnkgcXVhbGl0eS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNRdWFsaXR5KHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMucSA+IDA7XG59XG4iLCAiLyoqXG4gKiBuZWdvdGlhdG9yXG4gKiBDb3B5cmlnaHQoYykgMjAxMiBJc2FhYyBaLiBTY2hsdWV0ZXJcbiAqIENvcHlyaWdodChjKSAyMDE0IEZlZGVyaWNvIFJvbWVyb1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcHJlZmVycmVkTGFuZ3VhZ2VzO1xubW9kdWxlLmV4cG9ydHMucHJlZmVycmVkTGFuZ3VhZ2VzID0gcHJlZmVycmVkTGFuZ3VhZ2VzO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBzaW1wbGVMYW5ndWFnZVJlZ0V4cCA9IC9eXFxzKihbXlxcc1xcLTtdKykoPzotKFteXFxzO10rKSk/XFxzKig/OjsoLiopKT8kLztcblxuLyoqXG4gKiBQYXJzZSB0aGUgQWNjZXB0LUxhbmd1YWdlIGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VBY2NlcHRMYW5ndWFnZShhY2NlcHQpIHtcbiAgdmFyIGFjY2VwdHMgPSBhY2NlcHQuc3BsaXQoJywnKTtcblxuICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxhbmd1YWdlID0gcGFyc2VMYW5ndWFnZShhY2NlcHRzW2ldLnRyaW0oKSwgaSk7XG5cbiAgICBpZiAobGFuZ3VhZ2UpIHtcbiAgICAgIGFjY2VwdHNbaisrXSA9IGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRyaW0gYWNjZXB0c1xuICBhY2NlcHRzLmxlbmd0aCA9IGo7XG5cbiAgcmV0dXJuIGFjY2VwdHM7XG59XG5cbi8qKlxuICogUGFyc2UgYSBsYW5ndWFnZSBmcm9tIHRoZSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUxhbmd1YWdlKHN0ciwgaSkge1xuICB2YXIgbWF0Y2ggPSBzaW1wbGVMYW5ndWFnZVJlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBwcmVmaXggPSBtYXRjaFsxXVxuICB2YXIgc3VmZml4ID0gbWF0Y2hbMl1cbiAgdmFyIGZ1bGwgPSBwcmVmaXhcblxuICBpZiAoc3VmZml4KSBmdWxsICs9IFwiLVwiICsgc3VmZml4O1xuXG4gIHZhciBxID0gMTtcbiAgaWYgKG1hdGNoWzNdKSB7XG4gICAgdmFyIHBhcmFtcyA9IG1hdGNoWzNdLnNwbGl0KCc7JylcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHAgPSBwYXJhbXNbal0uc3BsaXQoJz0nKTtcbiAgICAgIGlmIChwWzBdID09PSAncScpIHEgPSBwYXJzZUZsb2F0KHBbMV0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcHJlZml4OiBwcmVmaXgsXG4gICAgc3VmZml4OiBzdWZmaXgsXG4gICAgcTogcSxcbiAgICBpOiBpLFxuICAgIGZ1bGw6IGZ1bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByaW9yaXR5IG9mIGEgbGFuZ3VhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldExhbmd1YWdlUHJpb3JpdHkobGFuZ3VhZ2UsIGFjY2VwdGVkLCBpbmRleCkge1xuICB2YXIgcHJpb3JpdHkgPSB7bzogLTEsIHE6IDAsIHM6IDB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjZXB0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc3BlYyA9IHNwZWNpZnkobGFuZ3VhZ2UsIGFjY2VwdGVkW2ldLCBpbmRleCk7XG5cbiAgICBpZiAoc3BlYyAmJiAocHJpb3JpdHkucyAtIHNwZWMucyB8fCBwcmlvcml0eS5xIC0gc3BlYy5xIHx8IHByaW9yaXR5Lm8gLSBzcGVjLm8pIDwgMCkge1xuICAgICAgcHJpb3JpdHkgPSBzcGVjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmlvcml0eTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNwZWNpZmljaXR5IG9mIHRoZSBsYW5ndWFnZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BlY2lmeShsYW5ndWFnZSwgc3BlYywgaW5kZXgpIHtcbiAgdmFyIHAgPSBwYXJzZUxhbmd1YWdlKGxhbmd1YWdlKVxuICBpZiAoIXApIHJldHVybiBudWxsO1xuICB2YXIgcyA9IDA7XG4gIGlmKHNwZWMuZnVsbC50b0xvd2VyQ2FzZSgpID09PSBwLmZ1bGwudG9Mb3dlckNhc2UoKSl7XG4gICAgcyB8PSA0O1xuICB9IGVsc2UgaWYgKHNwZWMucHJlZml4LnRvTG93ZXJDYXNlKCkgPT09IHAuZnVsbC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcyB8PSAyO1xuICB9IGVsc2UgaWYgKHNwZWMuZnVsbC50b0xvd2VyQ2FzZSgpID09PSBwLnByZWZpeC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcyB8PSAxO1xuICB9IGVsc2UgaWYgKHNwZWMuZnVsbCAhPT0gJyonICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGk6IGluZGV4LFxuICAgIG86IHNwZWMuaSxcbiAgICBxOiBzcGVjLnEsXG4gICAgczogc1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcHJlZmVycmVkIGxhbmd1YWdlcyBmcm9tIGFuIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIuXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcHJlZmVycmVkTGFuZ3VhZ2VzKGFjY2VwdCwgcHJvdmlkZWQpIHtcbiAgLy8gUkZDIDI2MTYgc2VjIDE0LjQ6IG5vIGhlYWRlciA9ICpcbiAgdmFyIGFjY2VwdHMgPSBwYXJzZUFjY2VwdExhbmd1YWdlKGFjY2VwdCA9PT0gdW5kZWZpbmVkID8gJyonIDogYWNjZXB0IHx8ICcnKTtcblxuICBpZiAoIXByb3ZpZGVkKSB7XG4gICAgLy8gc29ydGVkIGxpc3Qgb2YgYWxsIGxhbmd1YWdlc1xuICAgIHJldHVybiBhY2NlcHRzXG4gICAgICAuZmlsdGVyKGlzUXVhbGl0eSlcbiAgICAgIC5zb3J0KGNvbXBhcmVTcGVjcylcbiAgICAgIC5tYXAoZ2V0RnVsbExhbmd1YWdlKTtcbiAgfVxuXG4gIHZhciBwcmlvcml0aWVzID0gcHJvdmlkZWQubWFwKGZ1bmN0aW9uIGdldFByaW9yaXR5KHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGdldExhbmd1YWdlUHJpb3JpdHkodHlwZSwgYWNjZXB0cywgaW5kZXgpO1xuICB9KTtcblxuICAvLyBzb3J0ZWQgbGlzdCBvZiBhY2NlcHRlZCBsYW5ndWFnZXNcbiAgcmV0dXJuIHByaW9yaXRpZXMuZmlsdGVyKGlzUXVhbGl0eSkuc29ydChjb21wYXJlU3BlY3MpLm1hcChmdW5jdGlvbiBnZXRMYW5ndWFnZShwcmlvcml0eSkge1xuICAgIHJldHVybiBwcm92aWRlZFtwcmlvcml0aWVzLmluZGV4T2YocHJpb3JpdHkpXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28gc3BlY3MuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbXBhcmVTcGVjcyhhLCBiKSB7XG4gIHJldHVybiAoYi5xIC0gYS5xKSB8fCAoYi5zIC0gYS5zKSB8fCAoYS5vIC0gYi5vKSB8fCAoYS5pIC0gYi5pKSB8fCAwO1xufVxuXG4vKipcbiAqIEdldCBmdWxsIGxhbmd1YWdlIHN0cmluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RnVsbExhbmd1YWdlKHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMuZnVsbDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHNwZWMgaGFzIGFueSBxdWFsaXR5LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc1F1YWxpdHkoc3BlYykge1xuICByZXR1cm4gc3BlYy5xID4gMDtcbn1cbiIsICIvKipcbiAqIG5lZ290aWF0b3JcbiAqIENvcHlyaWdodChjKSAyMDEyIElzYWFjIFouIFNjaGx1ZXRlclxuICogQ29weXJpZ2h0KGMpIDIwMTQgRmVkZXJpY28gUm9tZXJvXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwcmVmZXJyZWRNZWRpYVR5cGVzO1xubW9kdWxlLmV4cG9ydHMucHJlZmVycmVkTWVkaWFUeXBlcyA9IHByZWZlcnJlZE1lZGlhVHlwZXM7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHNpbXBsZU1lZGlhVHlwZVJlZ0V4cCA9IC9eXFxzKihbXlxcc1xcLztdKylcXC8oW147XFxzXSspXFxzKig/OjsoLiopKT8kLztcblxuLyoqXG4gKiBQYXJzZSB0aGUgQWNjZXB0IGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VBY2NlcHQoYWNjZXB0KSB7XG4gIHZhciBhY2NlcHRzID0gc3BsaXRNZWRpYVR5cGVzKGFjY2VwdCk7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgYWNjZXB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtZWRpYVR5cGUgPSBwYXJzZU1lZGlhVHlwZShhY2NlcHRzW2ldLnRyaW0oKSwgaSk7XG5cbiAgICBpZiAobWVkaWFUeXBlKSB7XG4gICAgICBhY2NlcHRzW2orK10gPSBtZWRpYVR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gdHJpbSBhY2NlcHRzXG4gIGFjY2VwdHMubGVuZ3RoID0gajtcblxuICByZXR1cm4gYWNjZXB0cztcbn1cblxuLyoqXG4gKiBQYXJzZSBhIG1lZGlhIHR5cGUgZnJvbSB0aGUgQWNjZXB0IGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VNZWRpYVR5cGUoc3RyLCBpKSB7XG4gIHZhciBtYXRjaCA9IHNpbXBsZU1lZGlhVHlwZVJlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2YXIgcSA9IDE7XG4gIHZhciBzdWJ0eXBlID0gbWF0Y2hbMl07XG4gIHZhciB0eXBlID0gbWF0Y2hbMV07XG5cbiAgaWYgKG1hdGNoWzNdKSB7XG4gICAgdmFyIGt2cHMgPSBzcGxpdFBhcmFtZXRlcnMobWF0Y2hbM10pLm1hcChzcGxpdEtleVZhbHVlUGFpcik7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGt2cHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBwYWlyID0ga3Zwc1tqXTtcbiAgICAgIHZhciBrZXkgPSBwYWlyWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgdmFsID0gcGFpclsxXTtcblxuICAgICAgLy8gZ2V0IHRoZSB2YWx1ZSwgdW53cmFwcGluZyBxdW90ZXNcbiAgICAgIHZhciB2YWx1ZSA9IHZhbCAmJiB2YWxbMF0gPT09ICdcIicgJiYgdmFsW3ZhbC5sZW5ndGggLSAxXSA9PT0gJ1wiJ1xuICAgICAgICA/IHZhbC5zdWJzdHIoMSwgdmFsLmxlbmd0aCAtIDIpXG4gICAgICAgIDogdmFsO1xuXG4gICAgICBpZiAoa2V5ID09PSAncScpIHtcbiAgICAgICAgcSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gc3RvcmUgcGFyYW1ldGVyXG4gICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBzdWJ0eXBlOiBzdWJ0eXBlLFxuICAgIHBhcmFtczogcGFyYW1zLFxuICAgIHE6IHEsXG4gICAgaTogaVxuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJpb3JpdHkgb2YgYSBtZWRpYSB0eXBlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRNZWRpYVR5cGVQcmlvcml0eSh0eXBlLCBhY2NlcHRlZCwgaW5kZXgpIHtcbiAgdmFyIHByaW9yaXR5ID0ge286IC0xLCBxOiAwLCBzOiAwfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFjY2VwdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwZWMgPSBzcGVjaWZ5KHR5cGUsIGFjY2VwdGVkW2ldLCBpbmRleCk7XG5cbiAgICBpZiAoc3BlYyAmJiAocHJpb3JpdHkucyAtIHNwZWMucyB8fCBwcmlvcml0eS5xIC0gc3BlYy5xIHx8IHByaW9yaXR5Lm8gLSBzcGVjLm8pIDwgMCkge1xuICAgICAgcHJpb3JpdHkgPSBzcGVjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmlvcml0eTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNwZWNpZmljaXR5IG9mIHRoZSBtZWRpYSB0eXBlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzcGVjaWZ5KHR5cGUsIHNwZWMsIGluZGV4KSB7XG4gIHZhciBwID0gcGFyc2VNZWRpYVR5cGUodHlwZSk7XG4gIHZhciBzID0gMDtcblxuICBpZiAoIXApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmKHNwZWMudHlwZS50b0xvd2VyQ2FzZSgpID09IHAudHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcyB8PSA0XG4gIH0gZWxzZSBpZihzcGVjLnR5cGUgIT0gJyonKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZihzcGVjLnN1YnR5cGUudG9Mb3dlckNhc2UoKSA9PSBwLnN1YnR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgIHMgfD0gMlxuICB9IGVsc2UgaWYoc3BlYy5zdWJ0eXBlICE9ICcqJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzcGVjLnBhcmFtcyk7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoa2V5cy5ldmVyeShmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIHNwZWMucGFyYW1zW2tdID09ICcqJyB8fCAoc3BlYy5wYXJhbXNba10gfHwgJycpLnRvTG93ZXJDYXNlKCkgPT0gKHAucGFyYW1zW2tdIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIH0pKSB7XG4gICAgICBzIHw9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGk6IGluZGV4LFxuICAgIG86IHNwZWMuaSxcbiAgICBxOiBzcGVjLnEsXG4gICAgczogcyxcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgcHJlZmVycmVkIG1lZGlhIHR5cGVzIGZyb20gYW4gQWNjZXB0IGhlYWRlci5cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwcmVmZXJyZWRNZWRpYVR5cGVzKGFjY2VwdCwgcHJvdmlkZWQpIHtcbiAgLy8gUkZDIDI2MTYgc2VjIDE0LjI6IG5vIGhlYWRlciA9ICovKlxuICB2YXIgYWNjZXB0cyA9IHBhcnNlQWNjZXB0KGFjY2VwdCA9PT0gdW5kZWZpbmVkID8gJyovKicgOiBhY2NlcHQgfHwgJycpO1xuXG4gIGlmICghcHJvdmlkZWQpIHtcbiAgICAvLyBzb3J0ZWQgbGlzdCBvZiBhbGwgdHlwZXNcbiAgICByZXR1cm4gYWNjZXB0c1xuICAgICAgLmZpbHRlcihpc1F1YWxpdHkpXG4gICAgICAuc29ydChjb21wYXJlU3BlY3MpXG4gICAgICAubWFwKGdldEZ1bGxUeXBlKTtcbiAgfVxuXG4gIHZhciBwcmlvcml0aWVzID0gcHJvdmlkZWQubWFwKGZ1bmN0aW9uIGdldFByaW9yaXR5KHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGdldE1lZGlhVHlwZVByaW9yaXR5KHR5cGUsIGFjY2VwdHMsIGluZGV4KTtcbiAgfSk7XG5cbiAgLy8gc29ydGVkIGxpc3Qgb2YgYWNjZXB0ZWQgdHlwZXNcbiAgcmV0dXJuIHByaW9yaXRpZXMuZmlsdGVyKGlzUXVhbGl0eSkuc29ydChjb21wYXJlU3BlY3MpLm1hcChmdW5jdGlvbiBnZXRUeXBlKHByaW9yaXR5KSB7XG4gICAgcmV0dXJuIHByb3ZpZGVkW3ByaW9yaXRpZXMuaW5kZXhPZihwcmlvcml0eSldO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb21wYXJlIHR3byBzcGVjcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29tcGFyZVNwZWNzKGEsIGIpIHtcbiAgcmV0dXJuIChiLnEgLSBhLnEpIHx8IChiLnMgLSBhLnMpIHx8IChhLm8gLSBiLm8pIHx8IChhLmkgLSBiLmkpIHx8IDA7XG59XG5cbi8qKlxuICogR2V0IGZ1bGwgdHlwZSBzdHJpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEZ1bGxUeXBlKHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMudHlwZSArICcvJyArIHNwZWMuc3VidHlwZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHNwZWMgaGFzIGFueSBxdWFsaXR5LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc1F1YWxpdHkoc3BlYykge1xuICByZXR1cm4gc3BlYy5xID4gMDtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgbnVtYmVyIG9mIHF1b3RlcyBpbiBhIHN0cmluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcXVvdGVDb3VudChzdHJpbmcpIHtcbiAgdmFyIGNvdW50ID0gMDtcbiAgdmFyIGluZGV4ID0gMDtcblxuICB3aGlsZSAoKGluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1wiJywgaW5kZXgpKSAhPT0gLTEpIHtcbiAgICBjb3VudCsrO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICByZXR1cm4gY291bnQ7XG59XG5cbi8qKlxuICogU3BsaXQgYSBrZXkgdmFsdWUgcGFpci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRLZXlWYWx1ZVBhaXIoc3RyKSB7XG4gIHZhciBpbmRleCA9IHN0ci5pbmRleE9mKCc9Jyk7XG4gIHZhciBrZXk7XG4gIHZhciB2YWw7XG5cbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIGtleSA9IHN0cjtcbiAgfSBlbHNlIHtcbiAgICBrZXkgPSBzdHIuc3Vic3RyKDAsIGluZGV4KTtcbiAgICB2YWwgPSBzdHIuc3Vic3RyKGluZGV4ICsgMSk7XG4gIH1cblxuICByZXR1cm4gW2tleSwgdmFsXTtcbn1cblxuLyoqXG4gKiBTcGxpdCBhbiBBY2NlcHQgaGVhZGVyIGludG8gbWVkaWEgdHlwZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNwbGl0TWVkaWFUeXBlcyhhY2NlcHQpIHtcbiAgdmFyIGFjY2VwdHMgPSBhY2NlcHQuc3BsaXQoJywnKTtcblxuICBmb3IgKHZhciBpID0gMSwgaiA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHF1b3RlQ291bnQoYWNjZXB0c1tqXSkgJSAyID09IDApIHtcbiAgICAgIGFjY2VwdHNbKytqXSA9IGFjY2VwdHNbaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjY2VwdHNbal0gKz0gJywnICsgYWNjZXB0c1tpXTtcbiAgICB9XG4gIH1cblxuICAvLyB0cmltIGFjY2VwdHNcbiAgYWNjZXB0cy5sZW5ndGggPSBqICsgMTtcblxuICByZXR1cm4gYWNjZXB0cztcbn1cblxuLyoqXG4gKiBTcGxpdCBhIHN0cmluZyBvZiBwYXJhbWV0ZXJzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzcGxpdFBhcmFtZXRlcnMoc3RyKSB7XG4gIHZhciBwYXJhbWV0ZXJzID0gc3RyLnNwbGl0KCc7Jyk7XG5cbiAgZm9yICh2YXIgaSA9IDEsIGogPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChxdW90ZUNvdW50KHBhcmFtZXRlcnNbal0pICUgMiA9PSAwKSB7XG4gICAgICBwYXJhbWV0ZXJzWysral0gPSBwYXJhbWV0ZXJzW2ldO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbWV0ZXJzW2pdICs9ICc7JyArIHBhcmFtZXRlcnNbaV07XG4gICAgfVxuICB9XG5cbiAgLy8gdHJpbSBwYXJhbWV0ZXJzXG4gIHBhcmFtZXRlcnMubGVuZ3RoID0gaiArIDE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGFyYW1ldGVyc1tpXSA9IHBhcmFtZXRlcnNbaV0udHJpbSgpO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtZXRlcnM7XG59XG4iLCAiLyohXG4gKiBuZWdvdGlhdG9yXG4gKiBDb3B5cmlnaHQoYykgMjAxMiBGZWRlcmljbyBSb21lcm9cbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSXNhYWMgWi4gU2NobHVldGVyXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJlZmVycmVkQ2hhcnNldHMgPSByZXF1aXJlKCcuL2xpYi9jaGFyc2V0JylcbnZhciBwcmVmZXJyZWRFbmNvZGluZ3MgPSByZXF1aXJlKCcuL2xpYi9lbmNvZGluZycpXG52YXIgcHJlZmVycmVkTGFuZ3VhZ2VzID0gcmVxdWlyZSgnLi9saWIvbGFuZ3VhZ2UnKVxudmFyIHByZWZlcnJlZE1lZGlhVHlwZXMgPSByZXF1aXJlKCcuL2xpYi9tZWRpYVR5cGUnKVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gTmVnb3RpYXRvcjtcbm1vZHVsZS5leHBvcnRzLk5lZ290aWF0b3IgPSBOZWdvdGlhdG9yO1xuXG4vKipcbiAqIENyZWF0ZSBhIE5lZ290aWF0b3IgaW5zdGFuY2UgZnJvbSBhIHJlcXVlc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxdWVzdFxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIE5lZ290aWF0b3IocmVxdWVzdCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTmVnb3RpYXRvcikpIHtcbiAgICByZXR1cm4gbmV3IE5lZ290aWF0b3IocmVxdWVzdCk7XG4gIH1cblxuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xufVxuXG5OZWdvdGlhdG9yLnByb3RvdHlwZS5jaGFyc2V0ID0gZnVuY3Rpb24gY2hhcnNldChhdmFpbGFibGUpIHtcbiAgdmFyIHNldCA9IHRoaXMuY2hhcnNldHMoYXZhaWxhYmxlKTtcbiAgcmV0dXJuIHNldCAmJiBzZXRbMF07XG59O1xuXG5OZWdvdGlhdG9yLnByb3RvdHlwZS5jaGFyc2V0cyA9IGZ1bmN0aW9uIGNoYXJzZXRzKGF2YWlsYWJsZSkge1xuICByZXR1cm4gcHJlZmVycmVkQ2hhcnNldHModGhpcy5yZXF1ZXN0LmhlYWRlcnNbJ2FjY2VwdC1jaGFyc2V0J10sIGF2YWlsYWJsZSk7XG59O1xuXG5OZWdvdGlhdG9yLnByb3RvdHlwZS5lbmNvZGluZyA9IGZ1bmN0aW9uIGVuY29kaW5nKGF2YWlsYWJsZSkge1xuICB2YXIgc2V0ID0gdGhpcy5lbmNvZGluZ3MoYXZhaWxhYmxlKTtcbiAgcmV0dXJuIHNldCAmJiBzZXRbMF07XG59O1xuXG5OZWdvdGlhdG9yLnByb3RvdHlwZS5lbmNvZGluZ3MgPSBmdW5jdGlvbiBlbmNvZGluZ3MoYXZhaWxhYmxlKSB7XG4gIHJldHVybiBwcmVmZXJyZWRFbmNvZGluZ3ModGhpcy5yZXF1ZXN0LmhlYWRlcnNbJ2FjY2VwdC1lbmNvZGluZyddLCBhdmFpbGFibGUpO1xufTtcblxuTmVnb3RpYXRvci5wcm90b3R5cGUubGFuZ3VhZ2UgPSBmdW5jdGlvbiBsYW5ndWFnZShhdmFpbGFibGUpIHtcbiAgdmFyIHNldCA9IHRoaXMubGFuZ3VhZ2VzKGF2YWlsYWJsZSk7XG4gIHJldHVybiBzZXQgJiYgc2V0WzBdO1xufTtcblxuTmVnb3RpYXRvci5wcm90b3R5cGUubGFuZ3VhZ2VzID0gZnVuY3Rpb24gbGFuZ3VhZ2VzKGF2YWlsYWJsZSkge1xuICByZXR1cm4gcHJlZmVycmVkTGFuZ3VhZ2VzKHRoaXMucmVxdWVzdC5oZWFkZXJzWydhY2NlcHQtbGFuZ3VhZ2UnXSwgYXZhaWxhYmxlKTtcbn07XG5cbk5lZ290aWF0b3IucHJvdG90eXBlLm1lZGlhVHlwZSA9IGZ1bmN0aW9uIG1lZGlhVHlwZShhdmFpbGFibGUpIHtcbiAgdmFyIHNldCA9IHRoaXMubWVkaWFUeXBlcyhhdmFpbGFibGUpO1xuICByZXR1cm4gc2V0ICYmIHNldFswXTtcbn07XG5cbk5lZ290aWF0b3IucHJvdG90eXBlLm1lZGlhVHlwZXMgPSBmdW5jdGlvbiBtZWRpYVR5cGVzKGF2YWlsYWJsZSkge1xuICByZXR1cm4gcHJlZmVycmVkTWVkaWFUeXBlcyh0aGlzLnJlcXVlc3QuaGVhZGVycy5hY2NlcHQsIGF2YWlsYWJsZSk7XG59O1xuXG4vLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuTmVnb3RpYXRvci5wcm90b3R5cGUucHJlZmVycmVkQ2hhcnNldCA9IE5lZ290aWF0b3IucHJvdG90eXBlLmNoYXJzZXQ7XG5OZWdvdGlhdG9yLnByb3RvdHlwZS5wcmVmZXJyZWRDaGFyc2V0cyA9IE5lZ290aWF0b3IucHJvdG90eXBlLmNoYXJzZXRzO1xuTmVnb3RpYXRvci5wcm90b3R5cGUucHJlZmVycmVkRW5jb2RpbmcgPSBOZWdvdGlhdG9yLnByb3RvdHlwZS5lbmNvZGluZztcbk5lZ290aWF0b3IucHJvdG90eXBlLnByZWZlcnJlZEVuY29kaW5ncyA9IE5lZ290aWF0b3IucHJvdG90eXBlLmVuY29kaW5ncztcbk5lZ290aWF0b3IucHJvdG90eXBlLnByZWZlcnJlZExhbmd1YWdlID0gTmVnb3RpYXRvci5wcm90b3R5cGUubGFuZ3VhZ2U7XG5OZWdvdGlhdG9yLnByb3RvdHlwZS5wcmVmZXJyZWRMYW5ndWFnZXMgPSBOZWdvdGlhdG9yLnByb3RvdHlwZS5sYW5ndWFnZXM7XG5OZWdvdGlhdG9yLnByb3RvdHlwZS5wcmVmZXJyZWRNZWRpYVR5cGUgPSBOZWdvdGlhdG9yLnByb3RvdHlwZS5tZWRpYVR5cGU7XG5OZWdvdGlhdG9yLnByb3RvdHlwZS5wcmVmZXJyZWRNZWRpYVR5cGVzID0gTmVnb3RpYXRvci5wcm90b3R5cGUubWVkaWFUeXBlcztcbiIsICIvKiFcbiAqIGFjY2VwdHNcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBOZWdvdGlhdG9yID0gcmVxdWlyZSgnbmVnb3RpYXRvcicpXG52YXIgbWltZSA9IHJlcXVpcmUoJ21pbWUtdHlwZXMnKVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gQWNjZXB0c1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBBY2NlcHRzIG9iamVjdCBmb3IgdGhlIGdpdmVuIHJlcS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gQWNjZXB0cyAocmVxKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBY2NlcHRzKSkge1xuICAgIHJldHVybiBuZXcgQWNjZXB0cyhyZXEpXG4gIH1cblxuICB0aGlzLmhlYWRlcnMgPSByZXEuaGVhZGVyc1xuICB0aGlzLm5lZ290aWF0b3IgPSBuZXcgTmVnb3RpYXRvcihyZXEpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIGB0eXBlKHMpYCBpcyBhY2NlcHRhYmxlLCByZXR1cm5pbmdcbiAqIHRoZSBiZXN0IG1hdGNoIHdoZW4gdHJ1ZSwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLCBpbiB3aGljaFxuICogY2FzZSB5b3Ugc2hvdWxkIHJlc3BvbmQgd2l0aCA0MDYgXCJOb3QgQWNjZXB0YWJsZVwiLlxuICpcbiAqIFRoZSBgdHlwZWAgdmFsdWUgbWF5IGJlIGEgc2luZ2xlIG1pbWUgdHlwZSBzdHJpbmdcbiAqIHN1Y2ggYXMgXCJhcHBsaWNhdGlvbi9qc29uXCIsIHRoZSBleHRlbnNpb24gbmFtZVxuICogc3VjaCBhcyBcImpzb25cIiBvciBhbiBhcnJheSBgW1wianNvblwiLCBcImh0bWxcIiwgXCJ0ZXh0L3BsYWluXCJdYC4gV2hlbiBhIGxpc3RcbiAqIG9yIGFycmF5IGlzIGdpdmVuIHRoZSBfYmVzdF8gbWF0Y2gsIGlmIGFueSBpcyByZXR1cm5lZC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0L2h0bWxcbiAqICAgICB0aGlzLnR5cGVzKCdodG1sJyk7XG4gKiAgICAgLy8gPT4gXCJodG1sXCJcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0LyosIGFwcGxpY2F0aW9uL2pzb25cbiAqICAgICB0aGlzLnR5cGVzKCdodG1sJyk7XG4gKiAgICAgLy8gPT4gXCJodG1sXCJcbiAqICAgICB0aGlzLnR5cGVzKCd0ZXh0L2h0bWwnKTtcbiAqICAgICAvLyA9PiBcInRleHQvaHRtbFwiXG4gKiAgICAgdGhpcy50eXBlcygnanNvbicsICd0ZXh0Jyk7XG4gKiAgICAgLy8gPT4gXCJqc29uXCJcbiAqICAgICB0aGlzLnR5cGVzKCdhcHBsaWNhdGlvbi9qc29uJyk7XG4gKiAgICAgLy8gPT4gXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0LyosIGFwcGxpY2F0aW9uL2pzb25cbiAqICAgICB0aGlzLnR5cGVzKCdpbWFnZS9wbmcnKTtcbiAqICAgICB0aGlzLnR5cGVzKCdwbmcnKTtcbiAqICAgICAvLyA9PiB1bmRlZmluZWRcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0Lyo7cT0uNSwgYXBwbGljYXRpb24vanNvblxuICogICAgIHRoaXMudHlwZXMoWydodG1sJywgJ2pzb24nXSk7XG4gKiAgICAgdGhpcy50eXBlcygnaHRtbCcsICdqc29uJyk7XG4gKiAgICAgLy8gPT4gXCJqc29uXCJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gdHlwZXMuLi5cbiAqIEByZXR1cm4ge1N0cmluZ3xBcnJheXxCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbkFjY2VwdHMucHJvdG90eXBlLnR5cGUgPVxuQWNjZXB0cy5wcm90b3R5cGUudHlwZXMgPSBmdW5jdGlvbiAodHlwZXNfKSB7XG4gIHZhciB0eXBlcyA9IHR5cGVzX1xuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAodHlwZXMgJiYgIUFycmF5LmlzQXJyYXkodHlwZXMpKSB7XG4gICAgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vIHR5cGVzLCByZXR1cm4gYWxsIHJlcXVlc3RlZCB0eXBlc1xuICBpZiAoIXR5cGVzIHx8IHR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0aGlzLm5lZ290aWF0b3IubWVkaWFUeXBlcygpXG4gIH1cblxuICAvLyBubyBhY2NlcHQgaGVhZGVyLCByZXR1cm4gZmlyc3QgZ2l2ZW4gdHlwZVxuICBpZiAoIXRoaXMuaGVhZGVycy5hY2NlcHQpIHtcbiAgICByZXR1cm4gdHlwZXNbMF1cbiAgfVxuXG4gIHZhciBtaW1lcyA9IHR5cGVzLm1hcChleHRUb01pbWUpXG4gIHZhciBhY2NlcHRzID0gdGhpcy5uZWdvdGlhdG9yLm1lZGlhVHlwZXMobWltZXMuZmlsdGVyKHZhbGlkTWltZSkpXG4gIHZhciBmaXJzdCA9IGFjY2VwdHNbMF1cblxuICByZXR1cm4gZmlyc3RcbiAgICA/IHR5cGVzW21pbWVzLmluZGV4T2YoZmlyc3QpXVxuICAgIDogZmFsc2Vcbn1cblxuLyoqXG4gKiBSZXR1cm4gYWNjZXB0ZWQgZW5jb2RpbmdzIG9yIGJlc3QgZml0IGJhc2VkIG9uIGBlbmNvZGluZ3NgLlxuICpcbiAqIEdpdmVuIGBBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGVgXG4gKiBhbiBhcnJheSBzb3J0ZWQgYnkgcXVhbGl0eSBpcyByZXR1cm5lZDpcbiAqXG4gKiAgICAgWydnemlwJywgJ2RlZmxhdGUnXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBlbmNvZGluZ3MuLi5cbiAqIEByZXR1cm4ge1N0cmluZ3xBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5BY2NlcHRzLnByb3RvdHlwZS5lbmNvZGluZyA9XG5BY2NlcHRzLnByb3RvdHlwZS5lbmNvZGluZ3MgPSBmdW5jdGlvbiAoZW5jb2RpbmdzXykge1xuICB2YXIgZW5jb2RpbmdzID0gZW5jb2RpbmdzX1xuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAoZW5jb2RpbmdzICYmICFBcnJheS5pc0FycmF5KGVuY29kaW5ncykpIHtcbiAgICBlbmNvZGluZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuY29kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgZW5jb2RpbmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuICB9XG5cbiAgLy8gbm8gZW5jb2RpbmdzLCByZXR1cm4gYWxsIHJlcXVlc3RlZCBlbmNvZGluZ3NcbiAgaWYgKCFlbmNvZGluZ3MgfHwgZW5jb2RpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0aGlzLm5lZ290aWF0b3IuZW5jb2RpbmdzKClcbiAgfVxuXG4gIHJldHVybiB0aGlzLm5lZ290aWF0b3IuZW5jb2RpbmdzKGVuY29kaW5ncylbMF0gfHwgZmFsc2Vcbn1cblxuLyoqXG4gKiBSZXR1cm4gYWNjZXB0ZWQgY2hhcnNldHMgb3IgYmVzdCBmaXQgYmFzZWQgb24gYGNoYXJzZXRzYC5cbiAqXG4gKiBHaXZlbiBgQWNjZXB0LUNoYXJzZXQ6IHV0Zi04LCBpc28tODg1OS0xO3E9MC4yLCB1dGYtNztxPTAuNWBcbiAqIGFuIGFycmF5IHNvcnRlZCBieSBxdWFsaXR5IGlzIHJldHVybmVkOlxuICpcbiAqICAgICBbJ3V0Zi04JywgJ3V0Zi03JywgJ2lzby04ODU5LTEnXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjaGFyc2V0cy4uLlxuICogQHJldHVybiB7U3RyaW5nfEFycmF5fVxuICogQHB1YmxpY1xuICovXG5cbkFjY2VwdHMucHJvdG90eXBlLmNoYXJzZXQgPVxuQWNjZXB0cy5wcm90b3R5cGUuY2hhcnNldHMgPSBmdW5jdGlvbiAoY2hhcnNldHNfKSB7XG4gIHZhciBjaGFyc2V0cyA9IGNoYXJzZXRzX1xuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAoY2hhcnNldHMgJiYgIUFycmF5LmlzQXJyYXkoY2hhcnNldHMpKSB7XG4gICAgY2hhcnNldHMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGFyc2V0c1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vIGNoYXJzZXRzLCByZXR1cm4gYWxsIHJlcXVlc3RlZCBjaGFyc2V0c1xuICBpZiAoIWNoYXJzZXRzIHx8IGNoYXJzZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0aGlzLm5lZ290aWF0b3IuY2hhcnNldHMoKVxuICB9XG5cbiAgcmV0dXJuIHRoaXMubmVnb3RpYXRvci5jaGFyc2V0cyhjaGFyc2V0cylbMF0gfHwgZmFsc2Vcbn1cblxuLyoqXG4gKiBSZXR1cm4gYWNjZXB0ZWQgbGFuZ3VhZ2VzIG9yIGJlc3QgZml0IGJhc2VkIG9uIGBsYW5nc2AuXG4gKlxuICogR2l2ZW4gYEFjY2VwdC1MYW5ndWFnZTogZW47cT0wLjgsIGVzLCBwdGBcbiAqIGFuIGFycmF5IHNvcnRlZCBieSBxdWFsaXR5IGlzIHJldHVybmVkOlxuICpcbiAqICAgICBbJ2VzJywgJ3B0JywgJ2VuJ11cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gbGFuZ3MuLi5cbiAqIEByZXR1cm4ge0FycmF5fFN0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5BY2NlcHRzLnByb3RvdHlwZS5sYW5nID1cbkFjY2VwdHMucHJvdG90eXBlLmxhbmdzID1cbkFjY2VwdHMucHJvdG90eXBlLmxhbmd1YWdlID1cbkFjY2VwdHMucHJvdG90eXBlLmxhbmd1YWdlcyA9IGZ1bmN0aW9uIChsYW5ndWFnZXNfKSB7XG4gIHZhciBsYW5ndWFnZXMgPSBsYW5ndWFnZXNfXG5cbiAgLy8gc3VwcG9ydCBmbGF0dGVuZWQgYXJndW1lbnRzXG4gIGlmIChsYW5ndWFnZXMgJiYgIUFycmF5LmlzQXJyYXkobGFuZ3VhZ2VzKSkge1xuICAgIGxhbmd1YWdlcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsYW5ndWFnZXNbaV0gPSBhcmd1bWVudHNbaV1cbiAgICB9XG4gIH1cblxuICAvLyBubyBsYW5ndWFnZXMsIHJldHVybiBhbGwgcmVxdWVzdGVkIGxhbmd1YWdlc1xuICBpZiAoIWxhbmd1YWdlcyB8fCBsYW5ndWFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRoaXMubmVnb3RpYXRvci5sYW5ndWFnZXMoKVxuICB9XG5cbiAgcmV0dXJuIHRoaXMubmVnb3RpYXRvci5sYW5ndWFnZXMobGFuZ3VhZ2VzKVswXSB8fCBmYWxzZVxufVxuXG4vKipcbiAqIENvbnZlcnQgZXh0bmFtZXMgdG8gbWltZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBleHRUb01pbWUgKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gbWltZS5sb29rdXAodHlwZSlcbiAgICA6IHR5cGVcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBtaW1lIGlzIHZhbGlkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHZhbGlkTWltZSAodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnXG59XG4iLCAiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBhY2NlcHRzID0gcmVxdWlyZSgnYWNjZXB0cycpO1xudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnZXhwcmVzcycpO1xudmFyIGlzSVAgPSByZXF1aXJlKCduZXQnKS5pc0lQO1xudmFyIHR5cGVpcyA9IHJlcXVpcmUoJ3R5cGUtaXMnKTtcbnZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xudmFyIGZyZXNoID0gcmVxdWlyZSgnZnJlc2gnKTtcbnZhciBwYXJzZVJhbmdlID0gcmVxdWlyZSgncmFuZ2UtcGFyc2VyJyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCdwYXJzZXVybCcpO1xudmFyIHByb3h5YWRkciA9IHJlcXVpcmUoJ3Byb3h5LWFkZHInKTtcblxuLyoqXG4gKiBSZXF1ZXN0IHByb3RvdHlwZS5cbiAqIEBwdWJsaWNcbiAqL1xuXG52YXIgcmVxID0gT2JqZWN0LmNyZWF0ZShodHRwLkluY29taW5nTWVzc2FnZS5wcm90b3R5cGUpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXFcblxuLyoqXG4gKiBSZXR1cm4gcmVxdWVzdCBoZWFkZXIuXG4gKlxuICogVGhlIGBSZWZlcnJlcmAgaGVhZGVyIGZpZWxkIGlzIHNwZWNpYWwtY2FzZWQsXG4gKiBib3RoIGBSZWZlcnJlcmAgYW5kIGBSZWZlcmVyYCBhcmUgaW50ZXJjaGFuZ2VhYmxlLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICByZXEuZ2V0KCdDb250ZW50LVR5cGUnKTtcbiAqICAgICAvLyA9PiBcInRleHQvcGxhaW5cIlxuICpcbiAqICAgICByZXEuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAqICAgICAvLyA9PiBcInRleHQvcGxhaW5cIlxuICpcbiAqICAgICByZXEuZ2V0KCdTb21ldGhpbmcnKTtcbiAqICAgICAvLyA9PiB1bmRlZmluZWRcbiAqXG4gKiBBbGlhc2VkIGFzIGByZXEuaGVhZGVyKClgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmdldCA9XG5yZXEuaGVhZGVyID0gZnVuY3Rpb24gaGVhZGVyKG5hbWUpIHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbmFtZSBhcmd1bWVudCBpcyByZXF1aXJlZCB0byByZXEuZ2V0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbmFtZSBtdXN0IGJlIGEgc3RyaW5nIHRvIHJlcS5nZXQnKTtcbiAgfVxuXG4gIHZhciBsYyA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICBzd2l0Y2ggKGxjKSB7XG4gICAgY2FzZSAncmVmZXJlcic6XG4gICAgY2FzZSAncmVmZXJyZXInOlxuICAgICAgcmV0dXJuIHRoaXMuaGVhZGVycy5yZWZlcnJlclxuICAgICAgICB8fCB0aGlzLmhlYWRlcnMucmVmZXJlcjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyc1tsY107XG4gIH1cbn07XG5cbi8qKlxuICogVG8gZG86IHVwZGF0ZSBkb2NzLlxuICpcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBgdHlwZShzKWAgaXMgYWNjZXB0YWJsZSwgcmV0dXJuaW5nXG4gKiB0aGUgYmVzdCBtYXRjaCB3aGVuIHRydWUsIG90aGVyd2lzZSBgdW5kZWZpbmVkYCwgaW4gd2hpY2hcbiAqIGNhc2UgeW91IHNob3VsZCByZXNwb25kIHdpdGggNDA2IFwiTm90IEFjY2VwdGFibGVcIi5cbiAqXG4gKiBUaGUgYHR5cGVgIHZhbHVlIG1heSBiZSBhIHNpbmdsZSBNSU1FIHR5cGUgc3RyaW5nXG4gKiBzdWNoIGFzIFwiYXBwbGljYXRpb24vanNvblwiLCBhbiBleHRlbnNpb24gbmFtZVxuICogc3VjaCBhcyBcImpzb25cIiwgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBzdWNoIGFzIFwianNvbiwgaHRtbCwgdGV4dC9wbGFpblwiLFxuICogYW4gYXJndW1lbnQgbGlzdCBzdWNoIGFzIGBcImpzb25cIiwgXCJodG1sXCIsIFwidGV4dC9wbGFpblwiYCxcbiAqIG9yIGFuIGFycmF5IGBbXCJqc29uXCIsIFwiaHRtbFwiLCBcInRleHQvcGxhaW5cIl1gLiBXaGVuIGEgbGlzdFxuICogb3IgYXJyYXkgaXMgZ2l2ZW4sIHRoZSBfYmVzdF8gbWF0Y2gsIGlmIGFueSBpcyByZXR1cm5lZC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0L2h0bWxcbiAqICAgICByZXEuYWNjZXB0cygnaHRtbCcpO1xuICogICAgIC8vID0+IFwiaHRtbFwiXG4gKlxuICogICAgIC8vIEFjY2VwdDogdGV4dC8qLCBhcHBsaWNhdGlvbi9qc29uXG4gKiAgICAgcmVxLmFjY2VwdHMoJ2h0bWwnKTtcbiAqICAgICAvLyA9PiBcImh0bWxcIlxuICogICAgIHJlcS5hY2NlcHRzKCd0ZXh0L2h0bWwnKTtcbiAqICAgICAvLyA9PiBcInRleHQvaHRtbFwiXG4gKiAgICAgcmVxLmFjY2VwdHMoJ2pzb24sIHRleHQnKTtcbiAqICAgICAvLyA9PiBcImpzb25cIlxuICogICAgIHJlcS5hY2NlcHRzKCdhcHBsaWNhdGlvbi9qc29uJyk7XG4gKiAgICAgLy8gPT4gXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0LyosIGFwcGxpY2F0aW9uL2pzb25cbiAqICAgICByZXEuYWNjZXB0cygnaW1hZ2UvcG5nJyk7XG4gKiAgICAgcmVxLmFjY2VwdHMoJ3BuZycpO1xuICogICAgIC8vID0+IHVuZGVmaW5lZFxuICpcbiAqICAgICAvLyBBY2NlcHQ6IHRleHQvKjtxPS41LCBhcHBsaWNhdGlvbi9qc29uXG4gKiAgICAgcmVxLmFjY2VwdHMoWydodG1sJywgJ2pzb24nXSk7XG4gKiAgICAgcmVxLmFjY2VwdHMoJ2h0bWwnLCAnanNvbicpO1xuICogICAgIHJlcS5hY2NlcHRzKCdodG1sLCBqc29uJyk7XG4gKiAgICAgLy8gPT4gXCJqc29uXCJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gdHlwZShzKVxuICogQHJldHVybiB7U3RyaW5nfEFycmF5fEJvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmFjY2VwdHMgPSBmdW5jdGlvbigpe1xuICB2YXIgYWNjZXB0ID0gYWNjZXB0cyh0aGlzKTtcbiAgcmV0dXJuIGFjY2VwdC50eXBlcy5hcHBseShhY2NlcHQsIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBgZW5jb2RpbmdgcyBhcmUgYWNjZXB0ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IC4uLmVuY29kaW5nXG4gKiBAcmV0dXJuIHtTdHJpbmd8QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmFjY2VwdHNFbmNvZGluZ3MgPSBmdW5jdGlvbigpe1xuICB2YXIgYWNjZXB0ID0gYWNjZXB0cyh0aGlzKTtcbiAgcmV0dXJuIGFjY2VwdC5lbmNvZGluZ3MuYXBwbHkoYWNjZXB0LCBhcmd1bWVudHMpO1xufTtcblxucmVxLmFjY2VwdHNFbmNvZGluZyA9IGRlcHJlY2F0ZS5mdW5jdGlvbihyZXEuYWNjZXB0c0VuY29kaW5ncyxcbiAgJ3JlcS5hY2NlcHRzRW5jb2Rpbmc6IFVzZSBhY2NlcHRzRW5jb2RpbmdzIGluc3RlYWQnKTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gYGNoYXJzZXRgcyBhcmUgYWNjZXB0YWJsZSxcbiAqIG90aGVyd2lzZSB5b3Ugc2hvdWxkIHJlc3BvbmQgd2l0aCA0MDYgXCJOb3QgQWNjZXB0YWJsZVwiLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSAuLi5jaGFyc2V0XG4gKiBAcmV0dXJuIHtTdHJpbmd8QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmFjY2VwdHNDaGFyc2V0cyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBhY2NlcHQgPSBhY2NlcHRzKHRoaXMpO1xuICByZXR1cm4gYWNjZXB0LmNoYXJzZXRzLmFwcGx5KGFjY2VwdCwgYXJndW1lbnRzKTtcbn07XG5cbnJlcS5hY2NlcHRzQ2hhcnNldCA9IGRlcHJlY2F0ZS5mdW5jdGlvbihyZXEuYWNjZXB0c0NoYXJzZXRzLFxuICAncmVxLmFjY2VwdHNDaGFyc2V0OiBVc2UgYWNjZXB0c0NoYXJzZXRzIGluc3RlYWQnKTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gYGxhbmdgcyBhcmUgYWNjZXB0YWJsZSxcbiAqIG90aGVyd2lzZSB5b3Ugc2hvdWxkIHJlc3BvbmQgd2l0aCA0MDYgXCJOb3QgQWNjZXB0YWJsZVwiLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSAuLi5sYW5nXG4gKiBAcmV0dXJuIHtTdHJpbmd8QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmFjY2VwdHNMYW5ndWFnZXMgPSBmdW5jdGlvbigpe1xuICB2YXIgYWNjZXB0ID0gYWNjZXB0cyh0aGlzKTtcbiAgcmV0dXJuIGFjY2VwdC5sYW5ndWFnZXMuYXBwbHkoYWNjZXB0LCBhcmd1bWVudHMpO1xufTtcblxucmVxLmFjY2VwdHNMYW5ndWFnZSA9IGRlcHJlY2F0ZS5mdW5jdGlvbihyZXEuYWNjZXB0c0xhbmd1YWdlcyxcbiAgJ3JlcS5hY2NlcHRzTGFuZ3VhZ2U6IFVzZSBhY2NlcHRzTGFuZ3VhZ2VzIGluc3RlYWQnKTtcblxuLyoqXG4gKiBQYXJzZSBSYW5nZSBoZWFkZXIgZmllbGQsIGNhcHBpbmcgdG8gdGhlIGdpdmVuIGBzaXplYC5cbiAqXG4gKiBVbnNwZWNpZmllZCByYW5nZXMgc3VjaCBhcyBcIjAtXCIgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgeW91ciByZXNvdXJjZSBsZW5ndGguIEluXG4gKiB0aGUgY2FzZSBvZiBhIGJ5dGUgcmFuZ2UgdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcy4gSWYgdGhlXG4gKiBSYW5nZSBoZWFkZXIgZmllbGQgaXMgbm90IGdpdmVuIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLCBgLTFgIHdoZW4gdW5zYXRpc2ZpYWJsZSxcbiAqIGFuZCBgLTJgIHdoZW4gc3ludGFjdGljYWxseSBpbnZhbGlkLlxuICpcbiAqIFdoZW4gcmFuZ2VzIGFyZSByZXR1cm5lZCwgdGhlIGFycmF5IGhhcyBhIFwidHlwZVwiIHByb3BlcnR5IHdoaWNoIGlzIHRoZSB0eXBlIG9mXG4gKiByYW5nZSB0aGF0IGlzIHJlcXVpcmVkIChtb3N0IGNvbW1vbmx5LCBcImJ5dGVzXCIpLiBFYWNoIGFycmF5IGVsZW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIGEgXCJzdGFydFwiIGFuZCBcImVuZFwiIHByb3BlcnR5IGZvciB0aGUgcG9ydGlvbiBvZiB0aGUgcmFuZ2UuXG4gKlxuICogVGhlIFwiY29tYmluZVwiIG9wdGlvbiBjYW4gYmUgc2V0IHRvIGB0cnVlYCBhbmQgb3ZlcmxhcHBpbmcgJiBhZGphY2VudCByYW5nZXNcbiAqIHdpbGwgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSByYW5nZS5cbiAqXG4gKiBOT1RFOiByZW1lbWJlciB0aGF0IHJhbmdlcyBhcmUgaW5jbHVzaXZlLCBzbyBmb3IgZXhhbXBsZSBcIlJhbmdlOiB1c2Vycz0wLTNcIlxuICogc2hvdWxkIHJlc3BvbmQgd2l0aCA0IHVzZXJzIHdoZW4gYXZhaWxhYmxlLCBub3QgMy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jb21iaW5lPWZhbHNlXVxuICogQHJldHVybiB7bnVtYmVyfGFycmF5fVxuICogQHB1YmxpY1xuICovXG5cbnJlcS5yYW5nZSA9IGZ1bmN0aW9uIHJhbmdlKHNpemUsIG9wdGlvbnMpIHtcbiAgdmFyIHJhbmdlID0gdGhpcy5nZXQoJ1JhbmdlJyk7XG4gIGlmICghcmFuZ2UpIHJldHVybjtcbiAgcmV0dXJuIHBhcnNlUmFuZ2Uoc2l6ZSwgcmFuZ2UsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHBhcmFtIGBuYW1lYCB3aGVuIHByZXNlbnQgb3IgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogIC0gQ2hlY2tzIHJvdXRlIHBsYWNlaG9sZGVycywgZXg6IF8vdXNlci86aWRfXG4gKiAgLSBDaGVja3MgYm9keSBwYXJhbXMsIGV4OiBpZD0xMiwge1wiaWRcIjoxMn1cbiAqICAtIENoZWNrcyBxdWVyeSBzdHJpbmcgcGFyYW1zLCBleDogP2lkPTEyXG4gKlxuICogVG8gdXRpbGl6ZSByZXF1ZXN0IGJvZGllcywgYHJlcS5ib2R5YFxuICogc2hvdWxkIGJlIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgZG9uZSBieSB1c2luZ1xuICogdGhlIGBib2R5UGFyc2VyKClgIG1pZGRsZXdhcmUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7TWl4ZWR9IFtkZWZhdWx0VmFsdWVdXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLnBhcmFtID0gZnVuY3Rpb24gcGFyYW0obmFtZSwgZGVmYXVsdFZhbHVlKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLnBhcmFtcyB8fCB7fTtcbiAgdmFyIGJvZHkgPSB0aGlzLmJvZHkgfHwge307XG4gIHZhciBxdWVyeSA9IHRoaXMucXVlcnkgfHwge307XG5cbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyAnbmFtZSdcbiAgICA6ICduYW1lLCBkZWZhdWx0JztcbiAgZGVwcmVjYXRlKCdyZXEucGFyYW0oJyArIGFyZ3MgKyAnKTogVXNlIHJlcS5wYXJhbXMsIHJlcS5ib2R5LCBvciByZXEucXVlcnkgaW5zdGVhZCcpO1xuXG4gIGlmIChudWxsICE9IHBhcmFtc1tuYW1lXSAmJiBwYXJhbXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHJldHVybiBwYXJhbXNbbmFtZV07XG4gIGlmIChudWxsICE9IGJvZHlbbmFtZV0pIHJldHVybiBib2R5W25hbWVdO1xuICBpZiAobnVsbCAhPSBxdWVyeVtuYW1lXSkgcmV0dXJuIHF1ZXJ5W25hbWVdO1xuXG4gIHJldHVybiBkZWZhdWx0VmFsdWU7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbmNvbWluZyByZXF1ZXN0IGNvbnRhaW5zIHRoZSBcIkNvbnRlbnQtVHlwZVwiXG4gKiBoZWFkZXIgZmllbGQsIGFuZCBpdCBjb250YWlucyB0aGUgZ2l2ZW4gbWltZSBgdHlwZWAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICAvLyBXaXRoIENvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XG4gKiAgICAgIHJlcS5pcygnaHRtbCcpO1xuICogICAgICByZXEuaXMoJ3RleHQvaHRtbCcpO1xuICogICAgICByZXEuaXMoJ3RleHQvKicpO1xuICogICAgICAvLyA9PiB0cnVlXG4gKlxuICogICAgICAvLyBXaGVuIENvbnRlbnQtVHlwZSBpcyBhcHBsaWNhdGlvbi9qc29uXG4gKiAgICAgIHJlcS5pcygnanNvbicpO1xuICogICAgICByZXEuaXMoJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAqICAgICAgcmVxLmlzKCdhcHBsaWNhdGlvbi8qJyk7XG4gKiAgICAgIC8vID0+IHRydWVcbiAqXG4gKiAgICAgIHJlcS5pcygnaHRtbCcpO1xuICogICAgICAvLyA9PiBmYWxzZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSB0eXBlcy4uLlxuICogQHJldHVybiB7U3RyaW5nfGZhbHNlfG51bGx9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmlzID0gZnVuY3Rpb24gaXModHlwZXMpIHtcbiAgdmFyIGFyciA9IHR5cGVzO1xuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAoIUFycmF5LmlzQXJyYXkodHlwZXMpKSB7XG4gICAgYXJyID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHR5cGVpcyh0aGlzLCBhcnIpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByb3RvY29sIHN0cmluZyBcImh0dHBcIiBvciBcImh0dHBzXCJcbiAqIHdoZW4gcmVxdWVzdGVkIHdpdGggVExTLiBXaGVuIHRoZSBcInRydXN0IHByb3h5XCJcbiAqIHNldHRpbmcgdHJ1c3RzIHRoZSBzb2NrZXQgYWRkcmVzcywgdGhlXG4gKiBcIlgtRm9yd2FyZGVkLVByb3RvXCIgaGVhZGVyIGZpZWxkIHdpbGwgYmUgdHJ1c3RlZFxuICogYW5kIHVzZWQgaWYgcHJlc2VudC5cbiAqXG4gKiBJZiB5b3UncmUgcnVubmluZyBiZWhpbmQgYSByZXZlcnNlIHByb3h5IHRoYXRcbiAqIHN1cHBsaWVzIGh0dHBzIGZvciB5b3UgdGhpcyBtYXkgYmUgZW5hYmxlZC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ3Byb3RvY29sJywgZnVuY3Rpb24gcHJvdG9jb2woKXtcbiAgdmFyIHByb3RvID0gdGhpcy5jb25uZWN0aW9uLmVuY3J5cHRlZFxuICAgID8gJ2h0dHBzJ1xuICAgIDogJ2h0dHAnO1xuICB2YXIgdHJ1c3QgPSB0aGlzLmFwcC5nZXQoJ3RydXN0IHByb3h5IGZuJyk7XG5cbiAgaWYgKCF0cnVzdCh0aGlzLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcywgMCkpIHtcbiAgICByZXR1cm4gcHJvdG87XG4gIH1cblxuICAvLyBOb3RlOiBYLUZvcndhcmRlZC1Qcm90byBpcyBub3JtYWxseSBvbmx5IGV2ZXIgYVxuICAvLyAgICAgICBzaW5nbGUgdmFsdWUsIGJ1dCB0aGlzIGlzIHRvIGJlIHNhZmUuXG4gIHZhciBoZWFkZXIgPSB0aGlzLmdldCgnWC1Gb3J3YXJkZWQtUHJvdG8nKSB8fCBwcm90b1xuICB2YXIgaW5kZXggPSBoZWFkZXIuaW5kZXhPZignLCcpXG5cbiAgcmV0dXJuIGluZGV4ICE9PSAtMVxuICAgID8gaGVhZGVyLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpXG4gICAgOiBoZWFkZXIudHJpbSgpXG59KTtcblxuLyoqXG4gKiBTaG9ydC1oYW5kIGZvcjpcbiAqXG4gKiAgICByZXEucHJvdG9jb2wgPT09ICdodHRwcydcbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmRlZmluZUdldHRlcihyZXEsICdzZWN1cmUnLCBmdW5jdGlvbiBzZWN1cmUoKXtcbiAgcmV0dXJuIHRoaXMucHJvdG9jb2wgPT09ICdodHRwcyc7XG59KTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHJlbW90ZSBhZGRyZXNzIGZyb20gdGhlIHRydXN0ZWQgcHJveHkuXG4gKlxuICogVGhlIGlzIHRoZSByZW1vdGUgYWRkcmVzcyBvbiB0aGUgc29ja2V0IHVubGVzc1xuICogXCJ0cnVzdCBwcm94eVwiIGlzIHNldC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ2lwJywgZnVuY3Rpb24gaXAoKXtcbiAgdmFyIHRydXN0ID0gdGhpcy5hcHAuZ2V0KCd0cnVzdCBwcm94eSBmbicpO1xuICByZXR1cm4gcHJveHlhZGRyKHRoaXMsIHRydXN0KTtcbn0pO1xuXG4vKipcbiAqIFdoZW4gXCJ0cnVzdCBwcm94eVwiIGlzIHNldCwgdHJ1c3RlZCBwcm94eSBhZGRyZXNzZXMgKyBjbGllbnQuXG4gKlxuICogRm9yIGV4YW1wbGUgaWYgdGhlIHZhbHVlIHdlcmUgXCJjbGllbnQsIHByb3h5MSwgcHJveHkyXCJcbiAqIHlvdSB3b3VsZCByZWNlaXZlIHRoZSBhcnJheSBgW1wiY2xpZW50XCIsIFwicHJveHkxXCIsIFwicHJveHkyXCJdYFxuICogd2hlcmUgXCJwcm94eTJcIiBpcyB0aGUgZnVydGhlc3QgZG93bi1zdHJlYW0gYW5kIFwicHJveHkxXCIgYW5kXG4gKiBcInByb3h5MlwiIHdlcmUgdHJ1c3RlZC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5kZWZpbmVHZXR0ZXIocmVxLCAnaXBzJywgZnVuY3Rpb24gaXBzKCkge1xuICB2YXIgdHJ1c3QgPSB0aGlzLmFwcC5nZXQoJ3RydXN0IHByb3h5IGZuJyk7XG4gIHZhciBhZGRycyA9IHByb3h5YWRkci5hbGwodGhpcywgdHJ1c3QpO1xuXG4gIC8vIHJldmVyc2UgdGhlIG9yZGVyICh0byBmYXJ0aGVzdCAtPiBjbG9zZXN0KVxuICAvLyBhbmQgcmVtb3ZlIHNvY2tldCBhZGRyZXNzXG4gIGFkZHJzLnJldmVyc2UoKS5wb3AoKVxuXG4gIHJldHVybiBhZGRyc1xufSk7XG5cbi8qKlxuICogUmV0dXJuIHN1YmRvbWFpbnMgYXMgYW4gYXJyYXkuXG4gKlxuICogU3ViZG9tYWlucyBhcmUgdGhlIGRvdC1zZXBhcmF0ZWQgcGFydHMgb2YgdGhlIGhvc3QgYmVmb3JlIHRoZSBtYWluIGRvbWFpbiBvZlxuICogdGhlIGFwcC4gQnkgZGVmYXVsdCwgdGhlIGRvbWFpbiBvZiB0aGUgYXBwIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGxhc3QgdHdvXG4gKiBwYXJ0cyBvZiB0aGUgaG9zdC4gVGhpcyBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nIFwic3ViZG9tYWluIG9mZnNldFwiLlxuICpcbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgZG9tYWluIGlzIFwidG9iaS5mZXJyZXRzLmV4YW1wbGUuY29tXCI6XG4gKiBJZiBcInN1YmRvbWFpbiBvZmZzZXRcIiBpcyBub3Qgc2V0LCByZXEuc3ViZG9tYWlucyBpcyBgW1wiZmVycmV0c1wiLCBcInRvYmlcIl1gLlxuICogSWYgXCJzdWJkb21haW4gb2Zmc2V0XCIgaXMgMywgcmVxLnN1YmRvbWFpbnMgaXMgYFtcInRvYmlcIl1gLlxuICpcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5cbmRlZmluZUdldHRlcihyZXEsICdzdWJkb21haW5zJywgZnVuY3Rpb24gc3ViZG9tYWlucygpIHtcbiAgdmFyIGhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZTtcblxuICBpZiAoIWhvc3RuYW1lKSByZXR1cm4gW107XG5cbiAgdmFyIG9mZnNldCA9IHRoaXMuYXBwLmdldCgnc3ViZG9tYWluIG9mZnNldCcpO1xuICB2YXIgc3ViZG9tYWlucyA9ICFpc0lQKGhvc3RuYW1lKVxuICAgID8gaG9zdG5hbWUuc3BsaXQoJy4nKS5yZXZlcnNlKClcbiAgICA6IFtob3N0bmFtZV07XG5cbiAgcmV0dXJuIHN1YmRvbWFpbnMuc2xpY2Uob2Zmc2V0KTtcbn0pO1xuXG4vKipcbiAqIFNob3J0LWhhbmQgZm9yIGB1cmwucGFyc2UocmVxLnVybCkucGF0aG5hbWVgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5kZWZpbmVHZXR0ZXIocmVxLCAncGF0aCcsIGZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiBwYXJzZSh0aGlzKS5wYXRobmFtZTtcbn0pO1xuXG4vKipcbiAqIFBhcnNlIHRoZSBcIkhvc3RcIiBoZWFkZXIgZmllbGQgdG8gYSBob3N0bmFtZS5cbiAqXG4gKiBXaGVuIHRoZSBcInRydXN0IHByb3h5XCIgc2V0dGluZyB0cnVzdHMgdGhlIHNvY2tldFxuICogYWRkcmVzcywgdGhlIFwiWC1Gb3J3YXJkZWQtSG9zdFwiIGhlYWRlciBmaWVsZCB3aWxsXG4gKiBiZSB0cnVzdGVkLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5kZWZpbmVHZXR0ZXIocmVxLCAnaG9zdG5hbWUnLCBmdW5jdGlvbiBob3N0bmFtZSgpe1xuICB2YXIgdHJ1c3QgPSB0aGlzLmFwcC5nZXQoJ3RydXN0IHByb3h5IGZuJyk7XG4gIHZhciBob3N0ID0gdGhpcy5nZXQoJ1gtRm9yd2FyZGVkLUhvc3QnKTtcblxuICBpZiAoIWhvc3QgfHwgIXRydXN0KHRoaXMuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzLCAwKSkge1xuICAgIGhvc3QgPSB0aGlzLmdldCgnSG9zdCcpO1xuICB9IGVsc2UgaWYgKGhvc3QuaW5kZXhPZignLCcpICE9PSAtMSkge1xuICAgIC8vIE5vdGU6IFgtRm9yd2FyZGVkLUhvc3QgaXMgbm9ybWFsbHkgb25seSBldmVyIGFcbiAgICAvLyAgICAgICBzaW5nbGUgdmFsdWUsIGJ1dCB0aGlzIGlzIHRvIGJlIHNhZmUuXG4gICAgaG9zdCA9IGhvc3Quc3Vic3RyaW5nKDAsIGhvc3QuaW5kZXhPZignLCcpKS50cmltUmlnaHQoKVxuICB9XG5cbiAgaWYgKCFob3N0KSByZXR1cm47XG5cbiAgLy8gSVB2NiBsaXRlcmFsIHN1cHBvcnRcbiAgdmFyIG9mZnNldCA9IGhvc3RbMF0gPT09ICdbJ1xuICAgID8gaG9zdC5pbmRleE9mKCddJykgKyAxXG4gICAgOiAwO1xuICB2YXIgaW5kZXggPSBob3N0LmluZGV4T2YoJzonLCBvZmZzZXQpO1xuXG4gIHJldHVybiBpbmRleCAhPT0gLTFcbiAgICA/IGhvc3Quc3Vic3RyaW5nKDAsIGluZGV4KVxuICAgIDogaG9zdDtcbn0pO1xuXG4vLyBUT0RPOiBjaGFuZ2UgcmVxLmhvc3QgdG8gcmV0dXJuIGhvc3QgaW4gbmV4dCBtYWpvclxuXG5kZWZpbmVHZXR0ZXIocmVxLCAnaG9zdCcsIGRlcHJlY2F0ZS5mdW5jdGlvbihmdW5jdGlvbiBob3N0KCl7XG4gIHJldHVybiB0aGlzLmhvc3RuYW1lO1xufSwgJ3JlcS5ob3N0OiBVc2UgcmVxLmhvc3RuYW1lIGluc3RlYWQnKSk7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgZnJlc2gsIGFrYVxuICogTGFzdC1Nb2RpZmllZCBhbmQvb3IgdGhlIEVUYWdcbiAqIHN0aWxsIG1hdGNoLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ2ZyZXNoJywgZnVuY3Rpb24oKXtcbiAgdmFyIG1ldGhvZCA9IHRoaXMubWV0aG9kO1xuICB2YXIgcmVzID0gdGhpcy5yZXNcbiAgdmFyIHN0YXR1cyA9IHJlcy5zdGF0dXNDb2RlXG5cbiAgLy8gR0VUIG9yIEhFQUQgZm9yIHdlYWsgZnJlc2huZXNzIHZhbGlkYXRpb24gb25seVxuICBpZiAoJ0dFVCcgIT09IG1ldGhvZCAmJiAnSEVBRCcgIT09IG1ldGhvZCkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIDJ4eCBvciAzMDQgYXMgcGVyIHJmYzI2MTYgMTQuMjZcbiAgaWYgKChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCkgfHwgMzA0ID09PSBzdGF0dXMpIHtcbiAgICByZXR1cm4gZnJlc2godGhpcy5oZWFkZXJzLCB7XG4gICAgICAnZXRhZyc6IHJlcy5nZXQoJ0VUYWcnKSxcbiAgICAgICdsYXN0LW1vZGlmaWVkJzogcmVzLmdldCgnTGFzdC1Nb2RpZmllZCcpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0pO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIHN0YWxlLCBha2FcbiAqIFwiTGFzdC1Nb2RpZmllZFwiIGFuZCAvIG9yIHRoZSBcIkVUYWdcIiBmb3IgdGhlXG4gKiByZXNvdXJjZSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmRlZmluZUdldHRlcihyZXEsICdzdGFsZScsIGZ1bmN0aW9uIHN0YWxlKCl7XG4gIHJldHVybiAhdGhpcy5mcmVzaDtcbn0pO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IHdhcyBhbiBfWE1MSHR0cFJlcXVlc3RfLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ3hocicsIGZ1bmN0aW9uIHhocigpe1xuICB2YXIgdmFsID0gdGhpcy5nZXQoJ1gtUmVxdWVzdGVkLVdpdGgnKSB8fCAnJztcbiAgcmV0dXJuIHZhbC50b0xvd2VyQ2FzZSgpID09PSAneG1saHR0cHJlcXVlc3QnO1xufSk7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIGdldHRlciBvbiBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRlclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lR2V0dGVyKG9iaiwgbmFtZSwgZ2V0dGVyKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGdldHRlclxuICB9KTtcbn1cbiIsICIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG4vKipcbiAqIFNpZ24gdGhlIGdpdmVuIGB2YWxgIHdpdGggYHNlY3JldGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHBhcmFtIHtTdHJpbmd9IHNlY3JldFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5zaWduID0gZnVuY3Rpb24odmFsLCBzZWNyZXQpe1xuICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHZhbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNvb2tpZSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIGFzIGEgc3RyaW5nLlwiKTtcbiAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiBzZWNyZXQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZWNyZXQgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXCIpO1xuICByZXR1cm4gdmFsICsgJy4nICsgY3J5cHRvXG4gICAgLmNyZWF0ZUhtYWMoJ3NoYTI1NicsIHNlY3JldClcbiAgICAudXBkYXRlKHZhbClcbiAgICAuZGlnZXN0KCdiYXNlNjQnKVxuICAgIC5yZXBsYWNlKC9cXD0rJC8sICcnKTtcbn07XG5cbi8qKlxuICogVW5zaWduIGFuZCBkZWNvZGUgdGhlIGdpdmVuIGB2YWxgIHdpdGggYHNlY3JldGAsXG4gKiByZXR1cm5pbmcgYGZhbHNlYCBpZiB0aGUgc2lnbmF0dXJlIGlzIGludmFsaWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHBhcmFtIHtTdHJpbmd9IHNlY3JldFxuICogQHJldHVybiB7U3RyaW5nfEJvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnVuc2lnbiA9IGZ1bmN0aW9uKHZhbCwgc2VjcmV0KXtcbiAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiB2YWwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTaWduZWQgY29va2llIHN0cmluZyBtdXN0IGJlIHByb3ZpZGVkLlwiKTtcbiAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiBzZWNyZXQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZWNyZXQgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXCIpO1xuICB2YXIgc3RyID0gdmFsLnNsaWNlKDAsIHZhbC5sYXN0SW5kZXhPZignLicpKVxuICAgICwgbWFjID0gZXhwb3J0cy5zaWduKHN0ciwgc2VjcmV0KTtcbiAgXG4gIHJldHVybiBzaGExKG1hYykgPT0gc2hhMSh2YWwpID8gc3RyIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzaGExKHN0cil7XG4gIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpLnVwZGF0ZShzdHIpLmRpZ2VzdCgnaGV4Jyk7XG59XG4iLCAiLyohXG4gKiBjb29raWVcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgUm9tYW4gU2h0eWxtYW5cbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIF9fdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGZpZWxkLWNvbnRlbnQgaW4gUkZDIDcyMzAgc2VjIDMuMlxuICpcbiAqIGZpZWxkLWNvbnRlbnQgPSBmaWVsZC12Y2hhciBbIDEqKCBTUCAvIEhUQUIgKSBmaWVsZC12Y2hhciBdXG4gKiBmaWVsZC12Y2hhciAgID0gVkNIQVIgLyBvYnMtdGV4dFxuICogb2JzLXRleHQgICAgICA9ICV4ODAtRkZcbiAqL1xuXG52YXIgZmllbGRDb250ZW50UmVnRXhwID0gL15bXFx1MDAwOVxcdTAwMjAtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl0rJC87XG5cbi8qKlxuICogUGFyc2UgYSBjb29raWUgaGVhZGVyLlxuICpcbiAqIFBhcnNlIHRoZSBnaXZlbiBjb29raWUgaGVhZGVyIHN0cmluZyBpbnRvIGFuIG9iamVjdFxuICogVGhlIG9iamVjdCBoYXMgdGhlIHZhcmlvdXMgY29va2llcyBhcyBrZXlzKG5hbWVzKSA9PiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHN0ciBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICB2YXIgb2JqID0ge31cbiAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG4gIHZhciBkZWMgPSBvcHQuZGVjb2RlIHx8IGRlY29kZTtcblxuICB2YXIgaW5kZXggPSAwXG4gIHdoaWxlIChpbmRleCA8IHN0ci5sZW5ndGgpIHtcbiAgICB2YXIgZXFJZHggPSBzdHIuaW5kZXhPZignPScsIGluZGV4KVxuXG4gICAgLy8gbm8gbW9yZSBjb29raWUgcGFpcnNcbiAgICBpZiAoZXFJZHggPT09IC0xKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIHZhciBlbmRJZHggPSBzdHIuaW5kZXhPZignOycsIGluZGV4KVxuXG4gICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgIGVuZElkeCA9IHN0ci5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKGVuZElkeCA8IGVxSWR4KSB7XG4gICAgICAvLyBiYWNrdHJhY2sgb24gcHJpb3Igc2VtaWNvbG9uXG4gICAgICBpbmRleCA9IHN0ci5sYXN0SW5kZXhPZignOycsIGVxSWR4IC0gMSkgKyAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhciBrZXkgPSBzdHIuc2xpY2UoaW5kZXgsIGVxSWR4KS50cmltKClcblxuICAgIC8vIG9ubHkgYXNzaWduIG9uY2VcbiAgICBpZiAodW5kZWZpbmVkID09PSBvYmpba2V5XSkge1xuICAgICAgdmFyIHZhbCA9IHN0ci5zbGljZShlcUlkeCArIDEsIGVuZElkeCkudHJpbSgpXG5cbiAgICAgIC8vIHF1b3RlZCB2YWx1ZXNcbiAgICAgIGlmICh2YWwuY2hhckNvZGVBdCgwKSA9PT0gMHgyMikge1xuICAgICAgICB2YWwgPSB2YWwuc2xpY2UoMSwgLTEpXG4gICAgICB9XG5cbiAgICAgIG9ialtrZXldID0gdHJ5RGVjb2RlKHZhbCwgZGVjKTtcbiAgICB9XG5cbiAgICBpbmRleCA9IGVuZElkeCArIDFcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGRhdGEgaW50byBhIGNvb2tpZSBoZWFkZXIuXG4gKlxuICogU2VyaWFsaXplIHRoZSBhIG5hbWUgdmFsdWUgcGFpciBpbnRvIGEgY29va2llIHN0cmluZyBzdWl0YWJsZSBmb3JcbiAqIGh0dHAgaGVhZGVycy4gQW4gb3B0aW9uYWwgb3B0aW9ucyBvYmplY3Qgc3BlY2lmaWVkIGNvb2tpZSBwYXJhbWV0ZXJzLlxuICpcbiAqIHNlcmlhbGl6ZSgnZm9vJywgJ2JhcicsIHsgaHR0cE9ubHk6IHRydWUgfSlcbiAqICAgPT4gXCJmb289YmFyOyBodHRwT25seVwiXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzZXJpYWxpemUobmFtZSwgdmFsLCBvcHRpb25zKSB7XG4gIHZhciBvcHQgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZW5jID0gb3B0LmVuY29kZSB8fCBlbmNvZGU7XG5cbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZW5jb2RlIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3QobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBuYW1lIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHZhciB2YWx1ZSA9IGVuYyh2YWwpO1xuXG4gIGlmICh2YWx1ZSAmJiAhZmllbGRDb250ZW50UmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgdmFsIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHZhciBzdHIgPSBuYW1lICsgJz0nICsgdmFsdWU7XG5cbiAgaWYgKG51bGwgIT0gb3B0Lm1heEFnZSkge1xuICAgIHZhciBtYXhBZ2UgPSBvcHQubWF4QWdlIC0gMDtcblxuICAgIGlmIChpc05hTihtYXhBZ2UpIHx8ICFpc0Zpbml0ZShtYXhBZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gbWF4QWdlIGlzIGludmFsaWQnKVxuICAgIH1cblxuICAgIHN0ciArPSAnOyBNYXgtQWdlPScgKyBNYXRoLmZsb29yKG1heEFnZSk7XG4gIH1cblxuICBpZiAob3B0LmRvbWFpbikge1xuICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LmRvbWFpbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBkb21haW4gaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBEb21haW49JyArIG9wdC5kb21haW47XG4gIH1cblxuICBpZiAob3B0LnBhdGgpIHtcbiAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG9wdC5wYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHBhdGggaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBQYXRoPScgKyBvcHQucGF0aDtcbiAgfVxuXG4gIGlmIChvcHQuZXhwaXJlcykge1xuICAgIHZhciBleHBpcmVzID0gb3B0LmV4cGlyZXNcblxuICAgIGlmICghaXNEYXRlKGV4cGlyZXMpIHx8IGlzTmFOKGV4cGlyZXMudmFsdWVPZigpKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIGV4cGlyZXMgaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBFeHBpcmVzPScgKyBleHBpcmVzLnRvVVRDU3RyaW5nKClcbiAgfVxuXG4gIGlmIChvcHQuaHR0cE9ubHkpIHtcbiAgICBzdHIgKz0gJzsgSHR0cE9ubHknO1xuICB9XG5cbiAgaWYgKG9wdC5zZWN1cmUpIHtcbiAgICBzdHIgKz0gJzsgU2VjdXJlJztcbiAgfVxuXG4gIGlmIChvcHQucHJpb3JpdHkpIHtcbiAgICB2YXIgcHJpb3JpdHkgPSB0eXBlb2Ygb3B0LnByaW9yaXR5ID09PSAnc3RyaW5nJ1xuICAgICAgPyBvcHQucHJpb3JpdHkudG9Mb3dlckNhc2UoKVxuICAgICAgOiBvcHQucHJpb3JpdHlcblxuICAgIHN3aXRjaCAocHJpb3JpdHkpIHtcbiAgICAgIGNhc2UgJ2xvdyc6XG4gICAgICAgIHN0ciArPSAnOyBQcmlvcml0eT1Mb3cnXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdtZWRpdW0nOlxuICAgICAgICBzdHIgKz0gJzsgUHJpb3JpdHk9TWVkaXVtJ1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnaGlnaCc6XG4gICAgICAgIHN0ciArPSAnOyBQcmlvcml0eT1IaWdoJ1xuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHByaW9yaXR5IGlzIGludmFsaWQnKVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHQuc2FtZVNpdGUpIHtcbiAgICB2YXIgc2FtZVNpdGUgPSB0eXBlb2Ygb3B0LnNhbWVTaXRlID09PSAnc3RyaW5nJ1xuICAgICAgPyBvcHQuc2FtZVNpdGUudG9Mb3dlckNhc2UoKSA6IG9wdC5zYW1lU2l0ZTtcblxuICAgIHN3aXRjaCAoc2FtZVNpdGUpIHtcbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGF4JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPUxheCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RyaWN0JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1Ob25lJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogVVJMLWRlY29kZSBzdHJpbmcgdmFsdWUuIE9wdGltaXplZCB0byBza2lwIG5hdGl2ZSBjYWxsIHdoZW4gbm8gJS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGRlY29kZSAoc3RyKSB7XG4gIHJldHVybiBzdHIuaW5kZXhPZignJScpICE9PSAtMVxuICAgID8gZGVjb2RlVVJJQ29tcG9uZW50KHN0cilcbiAgICA6IHN0clxufVxuXG4vKipcbiAqIFVSTC1lbmNvZGUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBlbmNvZGUgKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbClcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdmFsdWUgaXMgYSBEYXRlLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzRGF0ZSAodmFsKSB7XG4gIHJldHVybiBfX3RvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nIHx8XG4gICAgdmFsIGluc3RhbmNlb2YgRGF0ZVxufVxuXG4vKipcbiAqIFRyeSBkZWNvZGluZyBhIHN0cmluZyB1c2luZyBhIGRlY29kaW5nIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRlY29kZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0cnlEZWNvZGUoc3RyLCBkZWNvZGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlKHN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG4iLCAiLyohXG4gKiB2YXJ5XG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZhcnlcbm1vZHVsZS5leHBvcnRzLmFwcGVuZCA9IGFwcGVuZFxuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBmaWVsZC1uYW1lIGluIFJGQyA3MjMwIHNlYyAzLjJcbiAqXG4gKiBmaWVsZC1uYW1lICAgID0gdG9rZW5cbiAqIHRva2VuICAgICAgICAgPSAxKnRjaGFyXG4gKiB0Y2hhciAgICAgICAgID0gXCIhXCIgLyBcIiNcIiAvIFwiJFwiIC8gXCIlXCIgLyBcIiZcIiAvIFwiJ1wiIC8gXCIqXCJcbiAqICAgICAgICAgICAgICAgLyBcIitcIiAvIFwiLVwiIC8gXCIuXCIgLyBcIl5cIiAvIFwiX1wiIC8gXCJgXCIgLyBcInxcIiAvIFwiflwiXG4gKiAgICAgICAgICAgICAgIC8gRElHSVQgLyBBTFBIQVxuICogICAgICAgICAgICAgICA7IGFueSBWQ0hBUiwgZXhjZXB0IGRlbGltaXRlcnNcbiAqL1xuXG52YXIgRklFTERfTkFNRV9SRUdFWFAgPSAvXlshIyQlJicqK1xcLS5eX2B8fjAtOUEtWmEtel0rJC9cblxuLyoqXG4gKiBBcHBlbmQgYSBmaWVsZCB0byBhIHZhcnkgaGVhZGVyLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGFwcGVuZCAoaGVhZGVyLCBmaWVsZCkge1xuICBpZiAodHlwZW9mIGhlYWRlciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdoZWFkZXIgYXJndW1lbnQgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKCFmaWVsZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpZWxkIGFyZ3VtZW50IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIGdldCBmaWVsZHMgYXJyYXlcbiAgdmFyIGZpZWxkcyA9ICFBcnJheS5pc0FycmF5KGZpZWxkKVxuICAgID8gcGFyc2UoU3RyaW5nKGZpZWxkKSlcbiAgICA6IGZpZWxkXG5cbiAgLy8gYXNzZXJ0IG9uIGludmFsaWQgZmllbGQgbmFtZXNcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBmaWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICBpZiAoIUZJRUxEX05BTUVfUkVHRVhQLnRlc3QoZmllbGRzW2pdKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmllbGQgYXJndW1lbnQgY29udGFpbnMgYW4gaW52YWxpZCBoZWFkZXIgbmFtZScpXG4gICAgfVxuICB9XG5cbiAgLy8gZXhpc3RpbmcsIHVuc3BlY2lmaWVkIHZhcnlcbiAgaWYgKGhlYWRlciA9PT0gJyonKSB7XG4gICAgcmV0dXJuIGhlYWRlclxuICB9XG5cbiAgLy8gZW51bWVyYXRlIGN1cnJlbnQgdmFsdWVzXG4gIHZhciB2YWwgPSBoZWFkZXJcbiAgdmFyIHZhbHMgPSBwYXJzZShoZWFkZXIudG9Mb3dlckNhc2UoKSlcblxuICAvLyB1bnNwZWNpZmllZCB2YXJ5XG4gIGlmIChmaWVsZHMuaW5kZXhPZignKicpICE9PSAtMSB8fCB2YWxzLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gJyonXG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBmbGQgPSBmaWVsZHNbaV0udG9Mb3dlckNhc2UoKVxuXG4gICAgLy8gYXBwZW5kIHZhbHVlIChjYXNlLXByZXNlcnZpbmcpXG4gICAgaWYgKHZhbHMuaW5kZXhPZihmbGQpID09PSAtMSkge1xuICAgICAgdmFscy5wdXNoKGZsZClcbiAgICAgIHZhbCA9IHZhbFxuICAgICAgICA/IHZhbCArICcsICcgKyBmaWVsZHNbaV1cbiAgICAgICAgOiBmaWVsZHNbaV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbi8qKlxuICogUGFyc2UgYSB2YXJ5IGhlYWRlciBpbnRvIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZSAoaGVhZGVyKSB7XG4gIHZhciBlbmQgPSAwXG4gIHZhciBsaXN0ID0gW11cbiAgdmFyIHN0YXJ0ID0gMFxuXG4gIC8vIGdhdGhlciB0b2tlbnNcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhlYWRlci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHN3aXRjaCAoaGVhZGVyLmNoYXJDb2RlQXQoaSkpIHtcbiAgICAgIGNhc2UgMHgyMDogLyogICAqL1xuICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgICAgICAgIHN0YXJ0ID0gZW5kID0gaSArIDFcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAweDJjOiAvKiAsICovXG4gICAgICAgIGxpc3QucHVzaChoZWFkZXIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKVxuICAgICAgICBzdGFydCA9IGVuZCA9IGkgKyAxXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbmQgPSBpICsgMVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmFsIHRva2VuXG4gIGxpc3QucHVzaChoZWFkZXIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKVxuXG4gIHJldHVybiBsaXN0XG59XG5cbi8qKlxuICogTWFyayB0aGF0IGEgcmVxdWVzdCBpcyB2YXJpZWQgb24gYSBoZWFkZXIgZmllbGQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlc1xuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGZpZWxkXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gdmFyeSAocmVzLCBmaWVsZCkge1xuICBpZiAoIXJlcyB8fCAhcmVzLmdldEhlYWRlciB8fCAhcmVzLnNldEhlYWRlcikge1xuICAgIC8vIHF1YWNrIHF1YWNrXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVzIGFyZ3VtZW50IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIGdldCBleGlzdGluZyBoZWFkZXJcbiAgdmFyIHZhbCA9IHJlcy5nZXRIZWFkZXIoJ1ZhcnknKSB8fCAnJ1xuICB2YXIgaGVhZGVyID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgPyB2YWwuam9pbignLCAnKVxuICAgIDogU3RyaW5nKHZhbClcblxuICAvLyBzZXQgbmV3IGhlYWRlclxuICBpZiAoKHZhbCA9IGFwcGVuZChoZWFkZXIsIGZpZWxkKSkpIHtcbiAgICByZXMuc2V0SGVhZGVyKCdWYXJ5JywgdmFsKVxuICB9XG59XG4iLCAiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG52YXIgY29udGVudERpc3Bvc2l0aW9uID0gcmVxdWlyZSgnY29udGVudC1kaXNwb3NpdGlvbicpO1xudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnaHR0cC1lcnJvcnMnKVxudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnZXhwcmVzcycpO1xudmFyIGVuY29kZVVybCA9IHJlcXVpcmUoJ2VuY29kZXVybCcpO1xudmFyIGVzY2FwZUh0bWwgPSByZXF1aXJlKCdlc2NhcGUtaHRtbCcpO1xudmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG52YXIgaXNBYnNvbHV0ZSA9IHJlcXVpcmUoJy4vdXRpbHMnKS5pc0Fic29sdXRlO1xudmFyIG9uRmluaXNoZWQgPSByZXF1aXJlKCdvbi1maW5pc2hlZCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgc3RhdHVzZXMgPSByZXF1aXJlKCdzdGF0dXNlcycpXG52YXIgbWVyZ2UgPSByZXF1aXJlKCd1dGlscy1tZXJnZScpO1xudmFyIHNpZ24gPSByZXF1aXJlKCdjb29raWUtc2lnbmF0dXJlJykuc2lnbjtcbnZhciBub3JtYWxpemVUeXBlID0gcmVxdWlyZSgnLi91dGlscycpLm5vcm1hbGl6ZVR5cGU7XG52YXIgbm9ybWFsaXplVHlwZXMgPSByZXF1aXJlKCcuL3V0aWxzJykubm9ybWFsaXplVHlwZXM7XG52YXIgc2V0Q2hhcnNldCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5zZXRDaGFyc2V0O1xudmFyIGNvb2tpZSA9IHJlcXVpcmUoJ2Nvb2tpZScpO1xudmFyIHNlbmQgPSByZXF1aXJlKCdzZW5kJyk7XG52YXIgZXh0bmFtZSA9IHBhdGguZXh0bmFtZTtcbnZhciBtaW1lID0gc2VuZC5taW1lO1xudmFyIHJlc29sdmUgPSBwYXRoLnJlc29sdmU7XG52YXIgdmFyeSA9IHJlcXVpcmUoJ3ZhcnknKTtcblxuLyoqXG4gKiBSZXNwb25zZSBwcm90b3R5cGUuXG4gKiBAcHVibGljXG4gKi9cblxudmFyIHJlcyA9IE9iamVjdC5jcmVhdGUoaHR0cC5TZXJ2ZXJSZXNwb25zZS5wcm90b3R5cGUpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXNcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgY2hhcnNldFJlZ0V4cCA9IC87XFxzKmNoYXJzZXRcXHMqPS87XG5cbi8qKlxuICogU2V0IHN0YXR1cyBgY29kZWAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfVxuICogQHB1YmxpY1xuICovXG5cbnJlcy5zdGF0dXMgPSBmdW5jdGlvbiBzdGF0dXMoY29kZSkge1xuICBpZiAoKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyB8fCBNYXRoLmZsb29yKGNvZGUpICE9PSBjb2RlKSAmJiBjb2RlID4gOTkgJiYgY29kZSA8IDEwMDApIHtcbiAgICBkZXByZWNhdGUoJ3Jlcy5zdGF0dXMoJyArIEpTT04uc3RyaW5naWZ5KGNvZGUpICsgJyk6IHVzZSByZXMuc3RhdHVzKCcgKyBNYXRoLmZsb29yKGNvZGUpICsgJykgaW5zdGVhZCcpXG4gIH1cbiAgdGhpcy5zdGF0dXNDb2RlID0gY29kZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBMaW5rIGhlYWRlciBmaWVsZCB3aXRoIHRoZSBnaXZlbiBgbGlua3NgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgIHJlcy5saW5rcyh7XG4gKiAgICAgIG5leHQ6ICdodHRwOi8vYXBpLmV4YW1wbGUuY29tL3VzZXJzP3BhZ2U9MicsXG4gKiAgICAgIGxhc3Q6ICdodHRwOi8vYXBpLmV4YW1wbGUuY29tL3VzZXJzP3BhZ2U9NSdcbiAqICAgIH0pO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBsaW5rc1xuICogQHJldHVybiB7U2VydmVyUmVzcG9uc2V9XG4gKiBAcHVibGljXG4gKi9cblxucmVzLmxpbmtzID0gZnVuY3Rpb24obGlua3Mpe1xuICB2YXIgbGluayA9IHRoaXMuZ2V0KCdMaW5rJykgfHwgJyc7XG4gIGlmIChsaW5rKSBsaW5rICs9ICcsICc7XG4gIHJldHVybiB0aGlzLnNldCgnTGluaycsIGxpbmsgKyBPYmplY3Qua2V5cyhsaW5rcykubWFwKGZ1bmN0aW9uKHJlbCl7XG4gICAgcmV0dXJuICc8JyArIGxpbmtzW3JlbF0gKyAnPjsgcmVsPVwiJyArIHJlbCArICdcIic7XG4gIH0pLmpvaW4oJywgJykpO1xufTtcblxuLyoqXG4gKiBTZW5kIGEgcmVzcG9uc2UuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgIHJlcy5zZW5kKEJ1ZmZlci5mcm9tKCd3YWhvbycpKTtcbiAqICAgICByZXMuc2VuZCh7IHNvbWU6ICdqc29uJyB9KTtcbiAqICAgICByZXMuc2VuZCgnPHA+c29tZSBodG1sPC9wPicpO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxib29sZWFufG9iamVjdHxCdWZmZXJ9IGJvZHlcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuc2VuZCA9IGZ1bmN0aW9uIHNlbmQoYm9keSkge1xuICB2YXIgY2h1bmsgPSBib2R5O1xuICB2YXIgZW5jb2Rpbmc7XG4gIHZhciByZXEgPSB0aGlzLnJlcTtcbiAgdmFyIHR5cGU7XG5cbiAgLy8gc2V0dGluZ3NcbiAgdmFyIGFwcCA9IHRoaXMuYXBwO1xuXG4gIC8vIGFsbG93IHN0YXR1cyAvIGJvZHlcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAvLyByZXMuc2VuZChib2R5LCBzdGF0dXMpIGJhY2t3YXJkcyBjb21wYXRcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGRlcHJlY2F0ZSgncmVzLnNlbmQoYm9keSwgc3RhdHVzKTogVXNlIHJlcy5zdGF0dXMoc3RhdHVzKS5zZW5kKGJvZHkpIGluc3RlYWQnKTtcbiAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IGFyZ3VtZW50c1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVwcmVjYXRlKCdyZXMuc2VuZChzdGF0dXMsIGJvZHkpOiBVc2UgcmVzLnN0YXR1cyhzdGF0dXMpLnNlbmQoYm9keSkgaW5zdGVhZCcpO1xuICAgICAgdGhpcy5zdGF0dXNDb2RlID0gYXJndW1lbnRzWzBdO1xuICAgICAgY2h1bmsgPSBhcmd1bWVudHNbMV07XG4gICAgfVxuICB9XG5cbiAgLy8gZGlzYW1iaWd1YXRlIHJlcy5zZW5kKHN0YXR1cykgYW5kIHJlcy5zZW5kKHN0YXR1cywgbnVtKVxuICBpZiAodHlwZW9mIGNodW5rID09PSAnbnVtYmVyJyAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gcmVzLnNlbmQoc3RhdHVzKSB3aWxsIHNldCBzdGF0dXMgbWVzc2FnZSBhcyB0ZXh0IHN0cmluZ1xuICAgIGlmICghdGhpcy5nZXQoJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgICB0aGlzLnR5cGUoJ3R4dCcpO1xuICAgIH1cblxuICAgIGRlcHJlY2F0ZSgncmVzLnNlbmQoc3RhdHVzKTogVXNlIHJlcy5zZW5kU3RhdHVzKHN0YXR1cykgaW5zdGVhZCcpO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IGNodW5rO1xuICAgIGNodW5rID0gc3RhdHVzZXMubWVzc2FnZVtjaHVua11cbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIGNodW5rKSB7XG4gICAgLy8gc3RyaW5nIGRlZmF1bHRpbmcgdG8gaHRtbFxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBpZiAoIXRoaXMuZ2V0KCdDb250ZW50LVR5cGUnKSkge1xuICAgICAgICB0aGlzLnR5cGUoJ2h0bWwnKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgICBjaHVuayA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgICAgIGlmICghdGhpcy5nZXQoJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgICAgICAgdGhpcy50eXBlKCdiaW4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanNvbihjaHVuayk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIC8vIHdyaXRlIHN0cmluZ3MgaW4gdXRmLThcbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgICB0eXBlID0gdGhpcy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuXG4gICAgLy8gcmVmbGVjdCB0aGlzIGluIGNvbnRlbnQtdHlwZVxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuc2V0KCdDb250ZW50LVR5cGUnLCBzZXRDaGFyc2V0KHR5cGUsICd1dGYtOCcpKTtcbiAgICB9XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgaWYgRVRhZyBzaG91bGQgYmUgZ2VuZXJhdGVkXG4gIHZhciBldGFnRm4gPSBhcHAuZ2V0KCdldGFnIGZuJylcbiAgdmFyIGdlbmVyYXRlRVRhZyA9ICF0aGlzLmdldCgnRVRhZycpICYmIHR5cGVvZiBldGFnRm4gPT09ICdmdW5jdGlvbidcblxuICAvLyBwb3B1bGF0ZSBDb250ZW50LUxlbmd0aFxuICB2YXIgbGVuXG4gIGlmIChjaHVuayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICAgIC8vIGdldCBsZW5ndGggb2YgQnVmZmVyXG4gICAgICBsZW4gPSBjaHVuay5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKCFnZW5lcmF0ZUVUYWcgJiYgY2h1bmsubGVuZ3RoIDwgMTAwMCkge1xuICAgICAgLy8ganVzdCBjYWxjdWxhdGUgbGVuZ3RoIHdoZW4gbm8gRVRhZyArIHNtYWxsIGNodW5rXG4gICAgICBsZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aChjaHVuaywgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnZlcnQgY2h1bmsgdG8gQnVmZmVyIGFuZCBjYWxjdWxhdGVcbiAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKVxuICAgICAgZW5jb2RpbmcgPSB1bmRlZmluZWQ7XG4gICAgICBsZW4gPSBjaHVuay5sZW5ndGhcbiAgICB9XG5cbiAgICB0aGlzLnNldCgnQ29udGVudC1MZW5ndGgnLCBsZW4pO1xuICB9XG5cbiAgLy8gcG9wdWxhdGUgRVRhZ1xuICB2YXIgZXRhZztcbiAgaWYgKGdlbmVyYXRlRVRhZyAmJiBsZW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICgoZXRhZyA9IGV0YWdGbihjaHVuaywgZW5jb2RpbmcpKSkge1xuICAgICAgdGhpcy5zZXQoJ0VUYWcnLCBldGFnKTtcbiAgICB9XG4gIH1cblxuICAvLyBmcmVzaG5lc3NcbiAgaWYgKHJlcS5mcmVzaCkgdGhpcy5zdGF0dXNDb2RlID0gMzA0O1xuXG4gIC8vIHN0cmlwIGlycmVsZXZhbnQgaGVhZGVyc1xuICBpZiAoMjA0ID09PSB0aGlzLnN0YXR1c0NvZGUgfHwgMzA0ID09PSB0aGlzLnN0YXR1c0NvZGUpIHtcbiAgICB0aGlzLnJlbW92ZUhlYWRlcignQ29udGVudC1UeXBlJyk7XG4gICAgdGhpcy5yZW1vdmVIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJyk7XG4gICAgdGhpcy5yZW1vdmVIZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJyk7XG4gICAgY2h1bmsgPSAnJztcbiAgfVxuXG4gIC8vIGFsdGVyIGhlYWRlcnMgZm9yIDIwNVxuICBpZiAodGhpcy5zdGF0dXNDb2RlID09PSAyMDUpIHtcbiAgICB0aGlzLnNldCgnQ29udGVudC1MZW5ndGgnLCAnMCcpXG4gICAgdGhpcy5yZW1vdmVIZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJylcbiAgICBjaHVuayA9ICcnXG4gIH1cblxuICBpZiAocmVxLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgLy8gc2tpcCBib2R5IGZvciBIRUFEXG4gICAgdGhpcy5lbmQoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXNwb25kXG4gICAgdGhpcy5lbmQoY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZW5kIEpTT04gcmVzcG9uc2UuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgIHJlcy5qc29uKG51bGwpO1xuICogICAgIHJlcy5qc29uKHsgdXNlcjogJ3RqJyB9KTtcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8Ym9vbGVhbnxvYmplY3R9IG9ialxuICogQHB1YmxpY1xuICovXG5cbnJlcy5qc29uID0gZnVuY3Rpb24ganNvbihvYmopIHtcbiAgdmFyIHZhbCA9IG9iajtcblxuICAvLyBhbGxvdyBzdGF0dXMgLyBib2R5XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgLy8gcmVzLmpzb24oYm9keSwgc3RhdHVzKSBiYWNrd2FyZHMgY29tcGF0XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdudW1iZXInKSB7XG4gICAgICBkZXByZWNhdGUoJ3Jlcy5qc29uKG9iaiwgc3RhdHVzKTogVXNlIHJlcy5zdGF0dXMoc3RhdHVzKS5qc29uKG9iaikgaW5zdGVhZCcpO1xuICAgICAgdGhpcy5zdGF0dXNDb2RlID0gYXJndW1lbnRzWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXByZWNhdGUoJ3Jlcy5qc29uKHN0YXR1cywgb2JqKTogVXNlIHJlcy5zdGF0dXMoc3RhdHVzKS5qc29uKG9iaikgaW5zdGVhZCcpO1xuICAgICAgdGhpcy5zdGF0dXNDb2RlID0gYXJndW1lbnRzWzBdO1xuICAgICAgdmFsID0gYXJndW1lbnRzWzFdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNldHRpbmdzXG4gIHZhciBhcHAgPSB0aGlzLmFwcDtcbiAgdmFyIGVzY2FwZSA9IGFwcC5nZXQoJ2pzb24gZXNjYXBlJylcbiAgdmFyIHJlcGxhY2VyID0gYXBwLmdldCgnanNvbiByZXBsYWNlcicpO1xuICB2YXIgc3BhY2VzID0gYXBwLmdldCgnanNvbiBzcGFjZXMnKTtcbiAgdmFyIGJvZHkgPSBzdHJpbmdpZnkodmFsLCByZXBsYWNlciwgc3BhY2VzLCBlc2NhcGUpXG5cbiAgLy8gY29udGVudC10eXBlXG4gIGlmICghdGhpcy5nZXQoJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgdGhpcy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5zZW5kKGJvZHkpO1xufTtcblxuLyoqXG4gKiBTZW5kIEpTT04gcmVzcG9uc2Ugd2l0aCBKU09OUCBjYWxsYmFjayBzdXBwb3J0LlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICByZXMuanNvbnAobnVsbCk7XG4gKiAgICAgcmVzLmpzb25wKHsgdXNlcjogJ3RqJyB9KTtcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8Ym9vbGVhbnxvYmplY3R9IG9ialxuICogQHB1YmxpY1xuICovXG5cbnJlcy5qc29ucCA9IGZ1bmN0aW9uIGpzb25wKG9iaikge1xuICB2YXIgdmFsID0gb2JqO1xuXG4gIC8vIGFsbG93IHN0YXR1cyAvIGJvZHlcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAvLyByZXMuanNvbnAoYm9keSwgc3RhdHVzKSBiYWNrd2FyZHMgY29tcGF0XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdudW1iZXInKSB7XG4gICAgICBkZXByZWNhdGUoJ3Jlcy5qc29ucChvYmosIHN0YXR1cyk6IFVzZSByZXMuc3RhdHVzKHN0YXR1cykuanNvbnAob2JqKSBpbnN0ZWFkJyk7XG4gICAgICB0aGlzLnN0YXR1c0NvZGUgPSBhcmd1bWVudHNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlcHJlY2F0ZSgncmVzLmpzb25wKHN0YXR1cywgb2JqKTogVXNlIHJlcy5zdGF0dXMoc3RhdHVzKS5qc29ucChvYmopIGluc3RlYWQnKTtcbiAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhbCA9IGFyZ3VtZW50c1sxXTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXR0aW5nc1xuICB2YXIgYXBwID0gdGhpcy5hcHA7XG4gIHZhciBlc2NhcGUgPSBhcHAuZ2V0KCdqc29uIGVzY2FwZScpXG4gIHZhciByZXBsYWNlciA9IGFwcC5nZXQoJ2pzb24gcmVwbGFjZXInKTtcbiAgdmFyIHNwYWNlcyA9IGFwcC5nZXQoJ2pzb24gc3BhY2VzJyk7XG4gIHZhciBib2R5ID0gc3RyaW5naWZ5KHZhbCwgcmVwbGFjZXIsIHNwYWNlcywgZXNjYXBlKVxuICB2YXIgY2FsbGJhY2sgPSB0aGlzLnJlcS5xdWVyeVthcHAuZ2V0KCdqc29ucCBjYWxsYmFjayBuYW1lJyldO1xuXG4gIC8vIGNvbnRlbnQtdHlwZVxuICBpZiAoIXRoaXMuZ2V0KCdDb250ZW50LVR5cGUnKSkge1xuICAgIHRoaXMuc2V0KCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKTtcbiAgICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgfVxuXG4gIC8vIGZpeHVwIGNhbGxiYWNrXG4gIGlmIChBcnJheS5pc0FycmF5KGNhbGxiYWNrKSkge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2tbMF07XG4gIH1cblxuICAvLyBqc29ucFxuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnc3RyaW5nJyAmJiBjYWxsYmFjay5sZW5ndGggIT09IDApIHtcbiAgICB0aGlzLnNldCgnWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG4gICAgdGhpcy5zZXQoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcblxuICAgIC8vIHJlc3RyaWN0IGNhbGxiYWNrIGNoYXJzZXRcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrLnJlcGxhY2UoL1teXFxbXFxdXFx3JC5dL2csICcnKTtcblxuICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGVtcHR5IGFyZ3VtZW50XG4gICAgICBib2R5ID0gJydcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gcmVwbGFjZSBjaGFycyBub3QgYWxsb3dlZCBpbiBKYXZhU2NyaXB0IHRoYXQgYXJlIGluIEpTT05cbiAgICAgIGJvZHkgPSBib2R5XG4gICAgICAgIC5yZXBsYWNlKC9cXHUyMDI4L2csICdcXFxcdTIwMjgnKVxuICAgICAgICAucmVwbGFjZSgvXFx1MjAyOS9nLCAnXFxcXHUyMDI5JylcbiAgICB9XG5cbiAgICAvLyB0aGUgLyoqLyBpcyBhIHNwZWNpZmljIHNlY3VyaXR5IG1pdGlnYXRpb24gZm9yIFwiUm9zZXR0YSBGbGFzaCBKU09OUCBhYnVzZVwiXG4gICAgLy8gdGhlIHR5cGVvZiBjaGVjayBpcyBqdXN0IHRvIHJlZHVjZSBjbGllbnQgZXJyb3Igbm9pc2VcbiAgICBib2R5ID0gJy8qKi8gdHlwZW9mICcgKyBjYWxsYmFjayArICcgPT09IFxcJ2Z1bmN0aW9uXFwnICYmICcgKyBjYWxsYmFjayArICcoJyArIGJvZHkgKyAnKTsnO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuc2VuZChib2R5KTtcbn07XG5cbi8qKlxuICogU2VuZCBnaXZlbiBIVFRQIHN0YXR1cyBjb2RlLlxuICpcbiAqIFNldHMgdGhlIHJlc3BvbnNlIHN0YXR1cyB0byBgc3RhdHVzQ29kZWAgYW5kIHRoZSBib2R5IG9mIHRoZVxuICogcmVzcG9uc2UgdG8gdGhlIHN0YW5kYXJkIGRlc2NyaXB0aW9uIGZyb20gbm9kZSdzIGh0dHAuU1RBVFVTX0NPREVTXG4gKiBvciB0aGUgc3RhdHVzQ29kZSBudW1iZXIgaWYgbm8gZGVzY3JpcHRpb24uXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgIHJlcy5zZW5kU3RhdHVzKDIwMCk7XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c0NvZGVcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuc2VuZFN0YXR1cyA9IGZ1bmN0aW9uIHNlbmRTdGF0dXMoc3RhdHVzQ29kZSkge1xuICB2YXIgYm9keSA9IHN0YXR1c2VzLm1lc3NhZ2Vbc3RhdHVzQ29kZV0gfHwgU3RyaW5nKHN0YXR1c0NvZGUpXG5cbiAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgdGhpcy50eXBlKCd0eHQnKTtcblxuICByZXR1cm4gdGhpcy5zZW5kKGJvZHkpO1xufTtcblxuLyoqXG4gKiBUcmFuc2ZlciB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gYHBhdGhgLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgX0NvbnRlbnQtVHlwZV8gcmVzcG9uc2UgaGVhZGVyIGZpZWxkLlxuICogVGhlIGNhbGxiYWNrIGBjYWxsYmFjayhlcnIpYCBpcyBpbnZva2VkIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlXG4gKiBvciB3aGVuIGFuIGVycm9yIG9jY3Vycy4gQmUgc3VyZSB0byBjaGVjayBgcmVzLmhlYWRlcnNTZW50YFxuICogaWYgeW91IHdpc2ggdG8gYXR0ZW1wdCByZXNwb25kaW5nLCBhcyB0aGUgaGVhZGVyIGFuZCBzb21lIGRhdGFcbiAqIG1heSBoYXZlIGFscmVhZHkgYmVlbiB0cmFuc2ZlcnJlZC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAgLSBgbWF4QWdlYCAgIGRlZmF1bHRpbmcgdG8gMCAoY2FuIGJlIHN0cmluZyBjb252ZXJ0ZWQgYnkgYG1zYClcbiAqICAgLSBgcm9vdGAgICAgIHJvb3QgZGlyZWN0b3J5IGZvciByZWxhdGl2ZSBmaWxlbmFtZXNcbiAqICAgLSBgaGVhZGVyc2AgIG9iamVjdCBvZiBoZWFkZXJzIHRvIHNlcnZlIHdpdGggZmlsZVxuICogICAtIGBkb3RmaWxlc2Agc2VydmUgZG90ZmlsZXMsIGRlZmF1bHRpbmcgdG8gZmFsc2U7IGNhbiBiZSBgXCJhbGxvd1wiYCB0byBzZW5kIHRoZW1cbiAqXG4gKiBPdGhlciBvcHRpb25zIGFyZSBwYXNzZWQgYWxvbmcgdG8gYHNlbmRgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IGByZXMuc2VuZEZpbGUoKWAgbWF5XG4gKiAgYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBmb3IgdGhlIGBzdGF0aWMoKWAgbWlkZGxld2FyZSBmb3JcbiAqICBkeW5hbWljIHNpdHVhdGlvbnMuIFRoZSBjb2RlIGJhY2tpbmcgYHJlcy5zZW5kRmlsZSgpYCBpcyBhY3R1YWxseVxuICogIHRoZSBzYW1lIGNvZGUsIHNvIEhUVFAgY2FjaGUgc3VwcG9ydCBldGMgaXMgaWRlbnRpY2FsLlxuICpcbiAqICAgICBhcHAuZ2V0KCcvdXNlci86dWlkL3Bob3Rvcy86ZmlsZScsIGZ1bmN0aW9uKHJlcSwgcmVzKXtcbiAqICAgICAgIHZhciB1aWQgPSByZXEucGFyYW1zLnVpZFxuICogICAgICAgICAsIGZpbGUgPSByZXEucGFyYW1zLmZpbGU7XG4gKlxuICogICAgICAgcmVxLnVzZXIubWF5Vmlld0ZpbGVzRnJvbSh1aWQsIGZ1bmN0aW9uKHllcyl7XG4gKiAgICAgICAgIGlmICh5ZXMpIHtcbiAqICAgICAgICAgICByZXMuc2VuZEZpbGUoJy91cGxvYWRzLycgKyB1aWQgKyAnLycgKyBmaWxlKTtcbiAqICAgICAgICAgfSBlbHNlIHtcbiAqICAgICAgICAgICByZXMuc2VuZCg0MDMsICdTb3JyeSEgeW91IGNhbnQgc2VlIHRoYXQuJyk7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH0pO1xuICogICAgIH0pO1xuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuc2VuZEZpbGUgPSBmdW5jdGlvbiBzZW5kRmlsZShwYXRoLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZG9uZSA9IGNhbGxiYWNrO1xuICB2YXIgcmVxID0gdGhpcy5yZXE7XG4gIHZhciByZXMgPSB0aGlzO1xuICB2YXIgbmV4dCA9IHJlcS5uZXh0O1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKCFwYXRoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGF0aCBhcmd1bWVudCBpcyByZXF1aXJlZCB0byByZXMuc2VuZEZpbGUnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXRoIG11c3QgYmUgYSBzdHJpbmcgdG8gcmVzLnNlbmRGaWxlJylcbiAgfVxuXG4gIC8vIHN1cHBvcnQgZnVuY3Rpb24gYXMgc2Vjb25kIGFyZ1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkb25lID0gb3B0aW9ucztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICBpZiAoIW9wdHMucm9vdCAmJiAhaXNBYnNvbHV0ZShwYXRoKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhdGggbXVzdCBiZSBhYnNvbHV0ZSBvciBzcGVjaWZ5IHJvb3QgdG8gcmVzLnNlbmRGaWxlJyk7XG4gIH1cblxuICAvLyBjcmVhdGUgZmlsZSBzdHJlYW1cbiAgdmFyIHBhdGhuYW1lID0gZW5jb2RlVVJJKHBhdGgpO1xuICB2YXIgZmlsZSA9IHNlbmQocmVxLCBwYXRobmFtZSwgb3B0cyk7XG5cbiAgLy8gdHJhbnNmZXJcbiAgc2VuZGZpbGUocmVzLCBmaWxlLCBvcHRzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybiBkb25lKGVycik7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ0VJU0RJUicpIHJldHVybiBuZXh0KCk7XG5cbiAgICAvLyBuZXh0KCkgYWxsIGJ1dCB3cml0ZSBlcnJvcnNcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlICE9PSAnRUNPTk5BQk9SVEVEJyAmJiBlcnIuc3lzY2FsbCAhPT0gJ3dyaXRlJykge1xuICAgICAgbmV4dChlcnIpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIFRyYW5zZmVyIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBgcGF0aGAuXG4gKlxuICogQXV0b21hdGljYWxseSBzZXRzIHRoZSBfQ29udGVudC1UeXBlXyByZXNwb25zZSBoZWFkZXIgZmllbGQuXG4gKiBUaGUgY2FsbGJhY2sgYGNhbGxiYWNrKGVycilgIGlzIGludm9rZWQgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGVcbiAqIG9yIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiBCZSBzdXJlIHRvIGNoZWNrIGByZXMuaGVhZGVyc1NlbnRgXG4gKiBpZiB5b3Ugd2lzaCB0byBhdHRlbXB0IHJlc3BvbmRpbmcsIGFzIHRoZSBoZWFkZXIgYW5kIHNvbWUgZGF0YVxuICogbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHRyYW5zZmVycmVkLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogICAtIGBtYXhBZ2VgICAgZGVmYXVsdGluZyB0byAwIChjYW4gYmUgc3RyaW5nIGNvbnZlcnRlZCBieSBgbXNgKVxuICogICAtIGByb290YCAgICAgcm9vdCBkaXJlY3RvcnkgZm9yIHJlbGF0aXZlIGZpbGVuYW1lc1xuICogICAtIGBoZWFkZXJzYCAgb2JqZWN0IG9mIGhlYWRlcnMgdG8gc2VydmUgd2l0aCBmaWxlXG4gKiAgIC0gYGRvdGZpbGVzYCBzZXJ2ZSBkb3RmaWxlcywgZGVmYXVsdGluZyB0byBmYWxzZTsgY2FuIGJlIGBcImFsbG93XCJgIHRvIHNlbmQgdGhlbVxuICpcbiAqIE90aGVyIG9wdGlvbnMgYXJlIHBhc3NlZCBhbG9uZyB0byBgc2VuZGAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgYHJlcy5zZW5kZmlsZSgpYCBtYXlcbiAqICBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZvciB0aGUgYHN0YXRpYygpYCBtaWRkbGV3YXJlIGZvclxuICogIGR5bmFtaWMgc2l0dWF0aW9ucy4gVGhlIGNvZGUgYmFja2luZyBgcmVzLnNlbmRmaWxlKClgIGlzIGFjdHVhbGx5XG4gKiAgdGhlIHNhbWUgY29kZSwgc28gSFRUUCBjYWNoZSBzdXBwb3J0IGV0YyBpcyBpZGVudGljYWwuXG4gKlxuICogICAgIGFwcC5nZXQoJy91c2VyLzp1aWQvcGhvdG9zLzpmaWxlJywgZnVuY3Rpb24ocmVxLCByZXMpe1xuICogICAgICAgdmFyIHVpZCA9IHJlcS5wYXJhbXMudWlkXG4gKiAgICAgICAgICwgZmlsZSA9IHJlcS5wYXJhbXMuZmlsZTtcbiAqXG4gKiAgICAgICByZXEudXNlci5tYXlWaWV3RmlsZXNGcm9tKHVpZCwgZnVuY3Rpb24oeWVzKXtcbiAqICAgICAgICAgaWYgKHllcykge1xuICogICAgICAgICAgIHJlcy5zZW5kZmlsZSgnL3VwbG9hZHMvJyArIHVpZCArICcvJyArIGZpbGUpO1xuICogICAgICAgICB9IGVsc2Uge1xuICogICAgICAgICAgIHJlcy5zZW5kKDQwMywgJ1NvcnJ5ISB5b3UgY2FudCBzZWUgdGhhdC4nKTtcbiAqICAgICAgICAgfVxuICogICAgICAgfSk7XG4gKiAgICAgfSk7XG4gKlxuICogQHB1YmxpY1xuICovXG5cbnJlcy5zZW5kZmlsZSA9IGZ1bmN0aW9uIChwYXRoLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZG9uZSA9IGNhbGxiYWNrO1xuICB2YXIgcmVxID0gdGhpcy5yZXE7XG4gIHZhciByZXMgPSB0aGlzO1xuICB2YXIgbmV4dCA9IHJlcS5uZXh0O1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc3VwcG9ydCBmdW5jdGlvbiBhcyBzZWNvbmQgYXJnXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBvcHRpb25zO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBmaWxlIHN0cmVhbVxuICB2YXIgZmlsZSA9IHNlbmQocmVxLCBwYXRoLCBvcHRzKTtcblxuICAvLyB0cmFuc2ZlclxuICBzZW5kZmlsZShyZXMsIGZpbGUsIG9wdHMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuIGRvbmUoZXJyKTtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRUlTRElSJykgcmV0dXJuIG5leHQoKTtcblxuICAgIC8vIG5leHQoKSBhbGwgYnV0IHdyaXRlIGVycm9yc1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgIT09ICdFQ09OTkFCT1JURUQnICYmIGVyci5zeXNjYWxsICE9PSAnd3JpdGUnKSB7XG4gICAgICBuZXh0KGVycik7XG4gICAgfVxuICB9KTtcbn07XG5cbnJlcy5zZW5kZmlsZSA9IGRlcHJlY2F0ZS5mdW5jdGlvbihyZXMuc2VuZGZpbGUsXG4gICdyZXMuc2VuZGZpbGU6IFVzZSByZXMuc2VuZEZpbGUgaW5zdGVhZCcpO1xuXG4vKipcbiAqIFRyYW5zZmVyIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBgcGF0aGAgYXMgYW4gYXR0YWNobWVudC5cbiAqXG4gKiBPcHRpb25hbGx5IHByb3ZpZGluZyBhbiBhbHRlcm5hdGUgYXR0YWNobWVudCBgZmlsZW5hbWVgLFxuICogYW5kIG9wdGlvbmFsIGNhbGxiYWNrIGBjYWxsYmFjayhlcnIpYC4gVGhlIGNhbGxiYWNrIGlzIGludm9rZWRcbiAqIHdoZW4gdGhlIGRhdGEgdHJhbnNmZXIgaXMgY29tcGxldGUsIG9yIHdoZW4gYW4gZXJyb3IgaGFzXG4gKiBvY2N1cnJlZC4gQmUgc3VyZSB0byBjaGVjayBgcmVzLmhlYWRlcnNTZW50YCBpZiB5b3UgcGxhbiB0byByZXNwb25kLlxuICpcbiAqIE9wdGlvbmFsbHkgcHJvdmlkaW5nIGFuIGBvcHRpb25zYCBvYmplY3QgdG8gdXNlIHdpdGggYHJlcy5zZW5kRmlsZSgpYC5cbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIGBDb250ZW50LURpc3Bvc2l0aW9uYCBoZWFkZXIsIG92ZXJyaWRpbmdcbiAqIGFueSBgQ29udGVudC1EaXNwb3NpdGlvbmAgaGVhZGVyIHBhc3NlZCBhcyBoZWFkZXIgb3B0aW9ucyBpbiBvcmRlclxuICogdG8gc2V0IHRoZSBhdHRhY2htZW50IGFuZCBmaWxlbmFtZS5cbiAqXG4gKiBUaGlzIG1ldGhvZCB1c2VzIGByZXMuc2VuZEZpbGUoKWAuXG4gKlxuICogQHB1YmxpY1xuICovXG5cbnJlcy5kb3dubG9hZCA9IGZ1bmN0aW9uIGRvd25sb2FkIChwYXRoLCBmaWxlbmFtZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGRvbmUgPSBjYWxsYmFjaztcbiAgdmFyIG5hbWUgPSBmaWxlbmFtZTtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IG51bGxcblxuICAvLyBzdXBwb3J0IGZ1bmN0aW9uIGFzIHNlY29uZCBvciB0aGlyZCBhcmdcbiAgaWYgKHR5cGVvZiBmaWxlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBmaWxlbmFtZTtcbiAgICBuYW1lID0gbnVsbDtcbiAgICBvcHRzID0gbnVsbFxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZG9uZSA9IG9wdGlvbnNcbiAgICBvcHRzID0gbnVsbFxuICB9XG5cbiAgLy8gc3VwcG9ydCBvcHRpb25hbCBmaWxlbmFtZSwgd2hlcmUgb3B0aW9ucyBtYXkgYmUgaW4gaXQncyBwbGFjZVxuICBpZiAodHlwZW9mIGZpbGVuYW1lID09PSAnb2JqZWN0JyAmJlxuICAgICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyB8fCBvcHRpb25zID09PSB1bmRlZmluZWQpKSB7XG4gICAgbmFtZSA9IG51bGxcbiAgICBvcHRzID0gZmlsZW5hbWVcbiAgfVxuXG4gIC8vIHNldCBDb250ZW50LURpc3Bvc2l0aW9uIHdoZW4gZmlsZSBpcyBzZW50XG4gIHZhciBoZWFkZXJzID0ge1xuICAgICdDb250ZW50LURpc3Bvc2l0aW9uJzogY29udGVudERpc3Bvc2l0aW9uKG5hbWUgfHwgcGF0aClcbiAgfTtcblxuICAvLyBtZXJnZSB1c2VyLXByb3ZpZGVkIGhlYWRlcnNcbiAgaWYgKG9wdHMgJiYgb3B0cy5oZWFkZXJzKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRzLmhlYWRlcnMpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXVxuICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpICE9PSAnY29udGVudC1kaXNwb3NpdGlvbicpIHtcbiAgICAgICAgaGVhZGVyc1trZXldID0gb3B0cy5oZWFkZXJzW2tleV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBtZXJnZSB1c2VyLXByb3ZpZGVkIG9wdGlvbnNcbiAgb3B0cyA9IE9iamVjdC5jcmVhdGUob3B0cylcbiAgb3B0cy5oZWFkZXJzID0gaGVhZGVyc1xuXG4gIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCBmb3Igc2VuZEZpbGVcbiAgdmFyIGZ1bGxQYXRoID0gIW9wdHMucm9vdFxuICAgID8gcmVzb2x2ZShwYXRoKVxuICAgIDogcGF0aFxuXG4gIC8vIHNlbmQgZmlsZVxuICByZXR1cm4gdGhpcy5zZW5kRmlsZShmdWxsUGF0aCwgb3B0cywgZG9uZSlcbn07XG5cbi8qKlxuICogU2V0IF9Db250ZW50LVR5cGVfIHJlc3BvbnNlIGhlYWRlciB3aXRoIGB0eXBlYCB0aHJvdWdoIGBtaW1lLmxvb2t1cCgpYFxuICogd2hlbiBpdCBkb2VzIG5vdCBjb250YWluIFwiL1wiLCBvciBzZXQgdGhlIENvbnRlbnQtVHlwZSB0byBgdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICByZXMudHlwZSgnLmh0bWwnKTtcbiAqICAgICByZXMudHlwZSgnaHRtbCcpO1xuICogICAgIHJlcy50eXBlKCdqc29uJyk7XG4gKiAgICAgcmVzLnR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAqICAgICByZXMudHlwZSgncG5nJyk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuY29udGVudFR5cGUgPVxucmVzLnR5cGUgPSBmdW5jdGlvbiBjb250ZW50VHlwZSh0eXBlKSB7XG4gIHZhciBjdCA9IHR5cGUuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gbWltZS5sb29rdXAodHlwZSlcbiAgICA6IHR5cGU7XG5cbiAgcmV0dXJuIHRoaXMuc2V0KCdDb250ZW50LVR5cGUnLCBjdCk7XG59O1xuXG4vKipcbiAqIFJlc3BvbmQgdG8gdGhlIEFjY2VwdGFibGUgZm9ybWF0cyB1c2luZyBhbiBgb2JqYFxuICogb2YgbWltZS10eXBlIGNhbGxiYWNrcy5cbiAqXG4gKiBUaGlzIG1ldGhvZCB1c2VzIGByZXEuYWNjZXB0ZWRgLCBhbiBhcnJheSBvZlxuICogYWNjZXB0YWJsZSB0eXBlcyBvcmRlcmVkIGJ5IHRoZWlyIHF1YWxpdHkgdmFsdWVzLlxuICogV2hlbiBcIkFjY2VwdFwiIGlzIG5vdCBwcmVzZW50IHRoZSBfZmlyc3RfIGNhbGxiYWNrXG4gKiBpcyBpbnZva2VkLCBvdGhlcndpc2UgdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQuIFdoZW5cbiAqIG5vIG1hdGNoIGlzIHBlcmZvcm1lZCB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGhcbiAqIDQwNiBcIk5vdCBBY2NlcHRhYmxlXCIuXG4gKlxuICogQ29udGVudC1UeXBlIGlzIHNldCBmb3IgeW91LCBob3dldmVyIGlmIHlvdSBjaG9vc2VcbiAqIHlvdSBtYXkgYWx0ZXIgdGhpcyB3aXRoaW4gdGhlIGNhbGxiYWNrIHVzaW5nIGByZXMudHlwZSgpYFxuICogb3IgYHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIC4uLilgLlxuICpcbiAqICAgIHJlcy5mb3JtYXQoe1xuICogICAgICAndGV4dC9wbGFpbic6IGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgcmVzLnNlbmQoJ2hleScpO1xuICogICAgICB9LFxuICpcbiAqICAgICAgJ3RleHQvaHRtbCc6IGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgcmVzLnNlbmQoJzxwPmhleTwvcD4nKTtcbiAqICAgICAgfSxcbiAqXG4gKiAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogZnVuY3Rpb24gKCkge1xuICogICAgICAgIHJlcy5zZW5kKHsgbWVzc2FnZTogJ2hleScgfSk7XG4gKiAgICAgIH1cbiAqICAgIH0pO1xuICpcbiAqIEluIGFkZGl0aW9uIHRvIGNhbm9uaWNhbGl6ZWQgTUlNRSB0eXBlcyB5b3UgbWF5XG4gKiBhbHNvIHVzZSBleHRuYW1lcyBtYXBwZWQgdG8gdGhlc2UgdHlwZXM6XG4gKlxuICogICAgcmVzLmZvcm1hdCh7XG4gKiAgICAgIHRleHQ6IGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgcmVzLnNlbmQoJ2hleScpO1xuICogICAgICB9LFxuICpcbiAqICAgICAgaHRtbDogZnVuY3Rpb24oKXtcbiAqICAgICAgICByZXMuc2VuZCgnPHA+aGV5PC9wPicpO1xuICogICAgICB9LFxuICpcbiAqICAgICAganNvbjogZnVuY3Rpb24oKXtcbiAqICAgICAgICByZXMuc2VuZCh7IG1lc3NhZ2U6ICdoZXknIH0pO1xuICogICAgICB9XG4gKiAgICB9KTtcbiAqXG4gKiBCeSBkZWZhdWx0IEV4cHJlc3MgcGFzc2VzIGFuIGBFcnJvcmBcbiAqIHdpdGggYSBgLnN0YXR1c2Agb2YgNDA2IHRvIGBuZXh0KGVycilgXG4gKiBpZiBhIG1hdGNoIGlzIG5vdCBtYWRlLiBJZiB5b3UgcHJvdmlkZVxuICogYSBgLmRlZmF1bHRgIGNhbGxiYWNrIGl0IHdpbGwgYmUgaW52b2tlZFxuICogaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtTZXJ2ZXJSZXNwb25zZX0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxucmVzLmZvcm1hdCA9IGZ1bmN0aW9uKG9iail7XG4gIHZhciByZXEgPSB0aGlzLnJlcTtcbiAgdmFyIG5leHQgPSByZXEubmV4dDtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iailcbiAgICAuZmlsdGVyKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ICE9PSAnZGVmYXVsdCcgfSlcblxuICB2YXIga2V5ID0ga2V5cy5sZW5ndGggPiAwXG4gICAgPyByZXEuYWNjZXB0cyhrZXlzKVxuICAgIDogZmFsc2U7XG5cbiAgdGhpcy52YXJ5KFwiQWNjZXB0XCIpO1xuXG4gIGlmIChrZXkpIHtcbiAgICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgbm9ybWFsaXplVHlwZShrZXkpLnZhbHVlKTtcbiAgICBvYmpba2V5XShyZXEsIHRoaXMsIG5leHQpO1xuICB9IGVsc2UgaWYgKG9iai5kZWZhdWx0KSB7XG4gICAgb2JqLmRlZmF1bHQocmVxLCB0aGlzLCBuZXh0KVxuICB9IGVsc2Uge1xuICAgIG5leHQoY3JlYXRlRXJyb3IoNDA2LCB7XG4gICAgICB0eXBlczogbm9ybWFsaXplVHlwZXMoa2V5cykubWFwKGZ1bmN0aW9uIChvKSB7IHJldHVybiBvLnZhbHVlIH0pXG4gICAgfSkpXG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IF9Db250ZW50LURpc3Bvc2l0aW9uXyBoZWFkZXIgdG8gX2F0dGFjaG1lbnRfIHdpdGggb3B0aW9uYWwgYGZpbGVuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWVcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfVxuICogQHB1YmxpY1xuICovXG5cbnJlcy5hdHRhY2htZW50ID0gZnVuY3Rpb24gYXR0YWNobWVudChmaWxlbmFtZSkge1xuICBpZiAoZmlsZW5hbWUpIHtcbiAgICB0aGlzLnR5cGUoZXh0bmFtZShmaWxlbmFtZSkpO1xuICB9XG5cbiAgdGhpcy5zZXQoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCBjb250ZW50RGlzcG9zaXRpb24oZmlsZW5hbWUpKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQXBwZW5kIGFkZGl0aW9uYWwgaGVhZGVyIGBmaWVsZGAgd2l0aCB2YWx1ZSBgdmFsYC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgIHJlcy5hcHBlbmQoJ0xpbmsnLCBbJzxodHRwOi8vbG9jYWxob3N0Lz4nLCAnPGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC8+J10pO1xuICogICAgcmVzLmFwcGVuZCgnU2V0LUNvb2tpZScsICdmb289YmFyOyBQYXRoPS87IEh0dHBPbmx5Jyk7XG4gKiAgICByZXMuYXBwZW5kKCdXYXJuaW5nJywgJzE5OSBNaXNjZWxsYW5lb3VzIHdhcm5pbmcnKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSB2YWxcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKGZpZWxkLCB2YWwpIHtcbiAgdmFyIHByZXYgPSB0aGlzLmdldChmaWVsZCk7XG4gIHZhciB2YWx1ZSA9IHZhbDtcblxuICBpZiAocHJldikge1xuICAgIC8vIGNvbmNhdCB0aGUgbmV3IGFuZCBwcmV2IHZhbHNcbiAgICB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocHJldikgPyBwcmV2LmNvbmNhdCh2YWwpXG4gICAgICA6IEFycmF5LmlzQXJyYXkodmFsKSA/IFtwcmV2XS5jb25jYXQodmFsKVxuICAgICAgICA6IFtwcmV2LCB2YWxdXG4gIH1cblxuICByZXR1cm4gdGhpcy5zZXQoZmllbGQsIHZhbHVlKTtcbn07XG5cbi8qKlxuICogU2V0IGhlYWRlciBgZmllbGRgIHRvIGB2YWxgLCBvciBwYXNzXG4gKiBhbiBvYmplY3Qgb2YgaGVhZGVyIGZpZWxkcy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICByZXMuc2V0KCdGb28nLCBbJ2JhcicsICdiYXonXSk7XG4gKiAgICByZXMuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICogICAgcmVzLnNldCh7IEFjY2VwdDogJ3RleHQvcGxhaW4nLCAnWC1BUEktS2V5JzogJ3RvYmknIH0pO1xuICpcbiAqIEFsaWFzZWQgYXMgYHJlcy5oZWFkZXIoKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBmaWVsZFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHZhbFxuICogQHJldHVybiB7U2VydmVyUmVzcG9uc2V9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbnJlcy5zZXQgPVxucmVzLmhlYWRlciA9IGZ1bmN0aW9uIGhlYWRlcihmaWVsZCwgdmFsKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgdmFyIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICA/IHZhbC5tYXAoU3RyaW5nKVxuICAgICAgOiBTdHJpbmcodmFsKTtcblxuICAgIC8vIGFkZCBjaGFyc2V0IHRvIGNvbnRlbnQtdHlwZVxuICAgIGlmIChmaWVsZC50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbnRlbnQtVHlwZSBjYW5ub3QgYmUgc2V0IHRvIGFuIEFycmF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNoYXJzZXRSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIGNoYXJzZXQgPSBtaW1lLmNoYXJzZXRzLmxvb2t1cCh2YWx1ZS5zcGxpdCgnOycpWzBdKTtcbiAgICAgICAgaWYgKGNoYXJzZXQpIHZhbHVlICs9ICc7IGNoYXJzZXQ9JyArIGNoYXJzZXQudG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldEhlYWRlcihmaWVsZCwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGtleSBpbiBmaWVsZCkge1xuICAgICAgdGhpcy5zZXQoa2V5LCBmaWVsZFtrZXldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEdldCB2YWx1ZSBmb3IgaGVhZGVyIGBmaWVsZGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxucmVzLmdldCA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgcmV0dXJuIHRoaXMuZ2V0SGVhZGVyKGZpZWxkKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgY29va2llIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7U2VydmVyUmVzcG9uc2V9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbnJlcy5jbGVhckNvb2tpZSA9IGZ1bmN0aW9uIGNsZWFyQ29va2llKG5hbWUsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBtZXJnZSh7IGV4cGlyZXM6IG5ldyBEYXRlKDEpLCBwYXRoOiAnLycgfSwgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHRoaXMuY29va2llKG5hbWUsICcnLCBvcHRzKTtcbn07XG5cbi8qKlxuICogU2V0IGNvb2tpZSBgbmFtZWAgdG8gYHZhbHVlYCwgd2l0aCB0aGUgZ2l2ZW4gYG9wdGlvbnNgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogICAgLSBgbWF4QWdlYCAgIG1heC1hZ2UgaW4gbWlsbGlzZWNvbmRzLCBjb252ZXJ0ZWQgdG8gYGV4cGlyZXNgXG4gKiAgICAtIGBzaWduZWRgICAgc2lnbiB0aGUgY29va2llXG4gKiAgICAtIGBwYXRoYCAgICAgZGVmYXVsdHMgdG8gXCIvXCJcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAvLyBcIlJlbWVtYmVyIE1lXCIgZm9yIDE1IG1pbnV0ZXNcbiAqICAgIHJlcy5jb29raWUoJ3JlbWVtYmVybWUnLCAnMScsIHsgZXhwaXJlczogbmV3IERhdGUoRGF0ZS5ub3coKSArIDkwMDAwMCksIGh0dHBPbmx5OiB0cnVlIH0pO1xuICpcbiAqICAgIC8vIHNhbWUgYXMgYWJvdmVcbiAqICAgIHJlcy5jb29raWUoJ3JlbWVtYmVybWUnLCAnMScsIHsgbWF4QWdlOiA5MDAwMDAsIGh0dHBPbmx5OiB0cnVlIH0pXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuY29va2llID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gbWVyZ2Uoe30sIG9wdGlvbnMpO1xuICB2YXIgc2VjcmV0ID0gdGhpcy5yZXEuc2VjcmV0O1xuICB2YXIgc2lnbmVkID0gb3B0cy5zaWduZWQ7XG5cbiAgaWYgKHNpZ25lZCAmJiAhc2VjcmV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb29raWVQYXJzZXIoXCJzZWNyZXRcIikgcmVxdWlyZWQgZm9yIHNpZ25lZCBjb29raWVzJyk7XG4gIH1cblxuICB2YXIgdmFsID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgID8gJ2o6JyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIDogU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoc2lnbmVkKSB7XG4gICAgdmFsID0gJ3M6JyArIHNpZ24odmFsLCBzZWNyZXQpO1xuICB9XG5cbiAgaWYgKG9wdHMubWF4QWdlICE9IG51bGwpIHtcbiAgICB2YXIgbWF4QWdlID0gb3B0cy5tYXhBZ2UgLSAwXG5cbiAgICBpZiAoIWlzTmFOKG1heEFnZSkpIHtcbiAgICAgIG9wdHMuZXhwaXJlcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBtYXhBZ2UpXG4gICAgICBvcHRzLm1heEFnZSA9IE1hdGguZmxvb3IobWF4QWdlIC8gMTAwMClcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5wYXRoID09IG51bGwpIHtcbiAgICBvcHRzLnBhdGggPSAnLyc7XG4gIH1cblxuICB0aGlzLmFwcGVuZCgnU2V0LUNvb2tpZScsIGNvb2tpZS5zZXJpYWxpemUobmFtZSwgU3RyaW5nKHZhbCksIG9wdHMpKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBsb2NhdGlvbiBoZWFkZXIgdG8gYHVybGAuXG4gKlxuICogVGhlIGdpdmVuIGB1cmxgIGNhbiBhbHNvIGJlIFwiYmFja1wiLCB3aGljaCByZWRpcmVjdHNcbiAqIHRvIHRoZSBfUmVmZXJyZXJfIG9yIF9SZWZlcmVyXyBoZWFkZXJzIG9yIFwiL1wiLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgIHJlcy5sb2NhdGlvbignL2Zvby9iYXInKS47XG4gKiAgICByZXMubG9jYXRpb24oJ2h0dHA6Ly9leGFtcGxlLmNvbScpO1xuICogICAgcmVzLmxvY2F0aW9uKCcuLi9sb2dpbicpO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMubG9jYXRpb24gPSBmdW5jdGlvbiBsb2NhdGlvbih1cmwpIHtcbiAgdmFyIGxvYyA9IHVybDtcblxuICAvLyBcImJhY2tcIiBpcyBhbiBhbGlhcyBmb3IgdGhlIHJlZmVycmVyXG4gIGlmICh1cmwgPT09ICdiYWNrJykge1xuICAgIGxvYyA9IHRoaXMucmVxLmdldCgnUmVmZXJyZXInKSB8fCAnLyc7XG4gIH1cblxuICAvLyBzZXQgbG9jYXRpb25cbiAgcmV0dXJuIHRoaXMuc2V0KCdMb2NhdGlvbicsIGVuY29kZVVybChsb2MpKTtcbn07XG5cbi8qKlxuICogUmVkaXJlY3QgdG8gdGhlIGdpdmVuIGB1cmxgIHdpdGggb3B0aW9uYWwgcmVzcG9uc2UgYHN0YXR1c2BcbiAqIGRlZmF1bHRpbmcgdG8gMzAyLlxuICpcbiAqIFRoZSByZXN1bHRpbmcgYHVybGAgaXMgZGV0ZXJtaW5lZCBieSBgcmVzLmxvY2F0aW9uKClgLCBzb1xuICogaXQgd2lsbCBwbGF5IG5pY2VseSB3aXRoIG1vdW50ZWQgYXBwcywgcmVsYXRpdmUgcGF0aHMsXG4gKiBgXCJiYWNrXCJgIGV0Yy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICByZXMucmVkaXJlY3QoJy9mb28vYmFyJyk7XG4gKiAgICByZXMucmVkaXJlY3QoJ2h0dHA6Ly9leGFtcGxlLmNvbScpO1xuICogICAgcmVzLnJlZGlyZWN0KDMwMSwgJ2h0dHA6Ly9leGFtcGxlLmNvbScpO1xuICogICAgcmVzLnJlZGlyZWN0KCcuLi9sb2dpbicpOyAvLyAvYmxvZy9wb3N0LzEgLT4gL2Jsb2cvbG9naW5cbiAqXG4gKiBAcHVibGljXG4gKi9cblxucmVzLnJlZGlyZWN0ID0gZnVuY3Rpb24gcmVkaXJlY3QodXJsKSB7XG4gIHZhciBhZGRyZXNzID0gdXJsO1xuICB2YXIgYm9keTtcbiAgdmFyIHN0YXR1cyA9IDMwMjtcblxuICAvLyBhbGxvdyBzdGF0dXMgLyB1cmxcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHN0YXR1cyA9IGFyZ3VtZW50c1swXTtcbiAgICAgIGFkZHJlc3MgPSBhcmd1bWVudHNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlcHJlY2F0ZSgncmVzLnJlZGlyZWN0KHVybCwgc3RhdHVzKTogVXNlIHJlcy5yZWRpcmVjdChzdGF0dXMsIHVybCkgaW5zdGVhZCcpO1xuICAgICAgc3RhdHVzID0gYXJndW1lbnRzWzFdO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldCBsb2NhdGlvbiBoZWFkZXJcbiAgYWRkcmVzcyA9IHRoaXMubG9jYXRpb24oYWRkcmVzcykuZ2V0KCdMb2NhdGlvbicpO1xuXG4gIC8vIFN1cHBvcnQgdGV4dC97cGxhaW4saHRtbH0gYnkgZGVmYXVsdFxuICB0aGlzLmZvcm1hdCh7XG4gICAgdGV4dDogZnVuY3Rpb24oKXtcbiAgICAgIGJvZHkgPSBzdGF0dXNlcy5tZXNzYWdlW3N0YXR1c10gKyAnLiBSZWRpcmVjdGluZyB0byAnICsgYWRkcmVzc1xuICAgIH0sXG5cbiAgICBodG1sOiBmdW5jdGlvbigpe1xuICAgICAgdmFyIHUgPSBlc2NhcGVIdG1sKGFkZHJlc3MpO1xuICAgICAgYm9keSA9ICc8cD4nICsgc3RhdHVzZXMubWVzc2FnZVtzdGF0dXNdICsgJy4gUmVkaXJlY3RpbmcgdG8gPGEgaHJlZj1cIicgKyB1ICsgJ1wiPicgKyB1ICsgJzwvYT48L3A+J1xuICAgIH0sXG5cbiAgICBkZWZhdWx0OiBmdW5jdGlvbigpe1xuICAgICAgYm9keSA9ICcnO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUmVzcG9uZFxuICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHRoaXMuc2V0KCdDb250ZW50LUxlbmd0aCcsIEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHkpKTtcblxuICBpZiAodGhpcy5yZXEubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICB0aGlzLmVuZCgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZW5kKGJvZHkpO1xuICB9XG59O1xuXG4vKipcbiAqIEFkZCBgZmllbGRgIHRvIFZhcnkuIElmIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgVmFyeSBzZXQsIHRoZW5cbiAqIHRoaXMgY2FsbCBpcyBzaW1wbHkgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gZmllbGRcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMudmFyeSA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgLy8gY2hlY2tzIGZvciBiYWNrLWNvbXBhdFxuICBpZiAoIWZpZWxkIHx8IChBcnJheS5pc0FycmF5KGZpZWxkKSAmJiAhZmllbGQubGVuZ3RoKSkge1xuICAgIGRlcHJlY2F0ZSgncmVzLnZhcnkoKTogUHJvdmlkZSBhIGZpZWxkIG5hbWUnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhcnkodGhpcywgZmllbGQpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW5kZXIgYHZpZXdgIHdpdGggdGhlIGdpdmVuIGBvcHRpb25zYCBhbmQgb3B0aW9uYWwgY2FsbGJhY2sgYGZuYC5cbiAqIFdoZW4gYSBjYWxsYmFjayBmdW5jdGlvbiBpcyBnaXZlbiBhIHJlc3BvbnNlIHdpbGwgX25vdF8gYmUgbWFkZVxuICogYXV0b21hdGljYWxseSwgb3RoZXJ3aXNlIGEgcmVzcG9uc2Ugb2YgXzIwMF8gYW5kIF90ZXh0L2h0bWxfIGlzIGdpdmVuLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGNhY2hlYCAgICAgYm9vbGVhbiBoaW50aW5nIHRvIHRoZSBlbmdpbmUgaXQgc2hvdWxkIGNhY2hlXG4gKiAgLSBgZmlsZW5hbWVgICBmaWxlbmFtZSBvZiB0aGUgdmlldyBiZWluZyByZW5kZXJlZFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKHZpZXcsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBhcHAgPSB0aGlzLnJlcS5hcHA7XG4gIHZhciBkb25lID0gY2FsbGJhY2s7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJlcSA9IHRoaXMucmVxO1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gc3VwcG9ydCBjYWxsYmFjayBmdW5jdGlvbiBhcyBzZWNvbmQgYXJnXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBvcHRpb25zO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIC8vIG1lcmdlIHJlcy5sb2NhbHNcbiAgb3B0cy5fbG9jYWxzID0gc2VsZi5sb2NhbHM7XG5cbiAgLy8gZGVmYXVsdCBjYWxsYmFjayB0byByZXNwb25kXG4gIGRvbmUgPSBkb25lIHx8IGZ1bmN0aW9uIChlcnIsIHN0cikge1xuICAgIGlmIChlcnIpIHJldHVybiByZXEubmV4dChlcnIpO1xuICAgIHNlbGYuc2VuZChzdHIpO1xuICB9O1xuXG4gIC8vIHJlbmRlclxuICBhcHAucmVuZGVyKHZpZXcsIG9wdHMsIGRvbmUpO1xufTtcblxuLy8gcGlwZSB0aGUgc2VuZCBmaWxlIHN0cmVhbVxuZnVuY3Rpb24gc2VuZGZpbGUocmVzLCBmaWxlLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZG9uZSA9IGZhbHNlO1xuICB2YXIgc3RyZWFtaW5nO1xuXG4gIC8vIHJlcXVlc3QgYWJvcnRlZFxuICBmdW5jdGlvbiBvbmFib3J0ZWQoKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcblxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcpO1xuICAgIGVyci5jb2RlID0gJ0VDT05OQUJPUlRFRCc7XG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxuXG4gIC8vIGRpcmVjdG9yeVxuICBmdW5jdGlvbiBvbmRpcmVjdG9yeSgpIHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgIGRvbmUgPSB0cnVlO1xuXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignRUlTRElSLCByZWFkJyk7XG4gICAgZXJyLmNvZGUgPSAnRUlTRElSJztcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgLy8gZXJyb3JzXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXJyKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgLy8gZW5kZWRcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgLy8gZmlsZVxuICBmdW5jdGlvbiBvbmZpbGUoKSB7XG4gICAgc3RyZWFtaW5nID0gZmFsc2U7XG4gIH1cblxuICAvLyBmaW5pc2hlZFxuICBmdW5jdGlvbiBvbmZpbmlzaChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRUNPTk5SRVNFVCcpIHJldHVybiBvbmFib3J0ZWQoKTtcbiAgICBpZiAoZXJyKSByZXR1cm4gb25lcnJvcihlcnIpO1xuICAgIGlmIChkb25lKSByZXR1cm47XG5cbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHN0cmVhbWluZyAhPT0gZmFsc2UgJiYgIWRvbmUpIHtcbiAgICAgICAgb25hYm9ydGVkKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHN0cmVhbWluZ1xuICBmdW5jdGlvbiBvbnN0cmVhbSgpIHtcbiAgICBzdHJlYW1pbmcgPSB0cnVlO1xuICB9XG5cbiAgZmlsZS5vbignZGlyZWN0b3J5Jywgb25kaXJlY3RvcnkpO1xuICBmaWxlLm9uKCdlbmQnLCBvbmVuZCk7XG4gIGZpbGUub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGZpbGUub24oJ2ZpbGUnLCBvbmZpbGUpO1xuICBmaWxlLm9uKCdzdHJlYW0nLCBvbnN0cmVhbSk7XG4gIG9uRmluaXNoZWQocmVzLCBvbmZpbmlzaCk7XG5cbiAgaWYgKG9wdGlvbnMuaGVhZGVycykge1xuICAgIC8vIHNldCBoZWFkZXJzIG9uIHN1Y2Nlc3NmdWwgdHJhbnNmZXJcbiAgICBmaWxlLm9uKCdoZWFkZXJzJywgZnVuY3Rpb24gaGVhZGVycyhyZXMpIHtcbiAgICAgIHZhciBvYmogPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgayA9IGtleXNbaV07XG4gICAgICAgIHJlcy5zZXRIZWFkZXIoaywgb2JqW2tdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIHBpcGVcbiAgZmlsZS5waXBlKHJlcyk7XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IEpTT04sIGxpa2UgSlNPTi5zdHJpbmdpZnksIGJ1dCB2OCBvcHRpbWl6ZWQsIHdpdGggdGhlXG4gKiBhYmlsaXR5IHRvIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgY2FuIHRyaWdnZXIgSFRNTCBzbmlmZmluZy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSByZXBsYWNlclxuICogQHBhcmFtIHtudW1iZXJ9IHNwYWNlc1xuICogQHBhcmFtIHtib29sZWFufSBlc2NhcGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0cmluZ2lmeSAodmFsdWUsIHJlcGxhY2VyLCBzcGFjZXMsIGVzY2FwZSkge1xuICAvLyB2OCBjaGVja3MgYXJndW1lbnRzLmxlbmd0aCBmb3Igb3B0aW1pemluZyBzaW1wbGUgY2FsbFxuICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00NzMwXG4gIHZhciBqc29uID0gcmVwbGFjZXIgfHwgc3BhY2VzXG4gICAgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIsIHNwYWNlcylcbiAgICA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICBpZiAoZXNjYXBlICYmIHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGpzb24gPSBqc29uLnJlcGxhY2UoL1s8PiZdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICBzd2l0Y2ggKGMuY2hhckNvZGVBdCgwKSkge1xuICAgICAgICBjYXNlIDB4M2M6XG4gICAgICAgICAgcmV0dXJuICdcXFxcdTAwM2MnXG4gICAgICAgIGNhc2UgMHgzZTpcbiAgICAgICAgICByZXR1cm4gJ1xcXFx1MDAzZSdcbiAgICAgICAgY2FzZSAweDI2OlxuICAgICAgICAgIHJldHVybiAnXFxcXHUwMDI2J1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogdW5yZWFjaGFibGUgZGVmYXVsdCAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBjXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBqc29uXG59XG4iLCAiLyohXG4gKiBzZXJ2ZS1zdGF0aWNcbiAqIENvcHlyaWdodChjKSAyMDEwIFNlbmNoYSBJbmMuXG4gKiBDb3B5cmlnaHQoYykgMjAxMSBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGVuY29kZVVybCA9IHJlcXVpcmUoJ2VuY29kZXVybCcpXG52YXIgZXNjYXBlSHRtbCA9IHJlcXVpcmUoJ2VzY2FwZS1odG1sJylcbnZhciBwYXJzZVVybCA9IHJlcXVpcmUoJ3BhcnNldXJsJylcbnZhciByZXNvbHZlID0gcmVxdWlyZSgncGF0aCcpLnJlc29sdmVcbnZhciBzZW5kID0gcmVxdWlyZSgnc2VuZCcpXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlcnZlU3RhdGljXG5tb2R1bGUuZXhwb3J0cy5taW1lID0gc2VuZC5taW1lXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHNlcnZlU3RhdGljIChyb290LCBvcHRpb25zKSB7XG4gIGlmICghcm9vdCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Jvb3QgcGF0aCByZXF1aXJlZCcpXG4gIH1cblxuICBpZiAodHlwZW9mIHJvb3QgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9vdCBwYXRoIG11c3QgYmUgYSBzdHJpbmcnKVxuICB9XG5cbiAgLy8gY29weSBvcHRpb25zIG9iamVjdFxuICB2YXIgb3B0cyA9IE9iamVjdC5jcmVhdGUob3B0aW9ucyB8fCBudWxsKVxuXG4gIC8vIGZhbGwtdGhvdWdoXG4gIHZhciBmYWxsdGhyb3VnaCA9IG9wdHMuZmFsbHRocm91Z2ggIT09IGZhbHNlXG5cbiAgLy8gZGVmYXVsdCByZWRpcmVjdFxuICB2YXIgcmVkaXJlY3QgPSBvcHRzLnJlZGlyZWN0ICE9PSBmYWxzZVxuXG4gIC8vIGhlYWRlcnMgbGlzdGVuZXJcbiAgdmFyIHNldEhlYWRlcnMgPSBvcHRzLnNldEhlYWRlcnNcblxuICBpZiAoc2V0SGVhZGVycyAmJiB0eXBlb2Ygc2V0SGVhZGVycyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBzZXRIZWFkZXJzIG11c3QgYmUgZnVuY3Rpb24nKVxuICB9XG5cbiAgLy8gc2V0dXAgb3B0aW9ucyBmb3Igc2VuZFxuICBvcHRzLm1heGFnZSA9IG9wdHMubWF4YWdlIHx8IG9wdHMubWF4QWdlIHx8IDBcbiAgb3B0cy5yb290ID0gcmVzb2x2ZShyb290KVxuXG4gIC8vIGNvbnN0cnVjdCBkaXJlY3RvcnkgbGlzdGVuZXJcbiAgdmFyIG9uRGlyZWN0b3J5ID0gcmVkaXJlY3RcbiAgICA/IGNyZWF0ZVJlZGlyZWN0RGlyZWN0b3J5TGlzdGVuZXIoKVxuICAgIDogY3JlYXRlTm90Rm91bmREaXJlY3RvcnlMaXN0ZW5lcigpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHNlcnZlU3RhdGljIChyZXEsIHJlcywgbmV4dCkge1xuICAgIGlmIChyZXEubWV0aG9kICE9PSAnR0VUJyAmJiByZXEubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgIGlmIChmYWxsdGhyb3VnaCkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIC8vIG1ldGhvZCBub3QgYWxsb3dlZFxuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDVcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0FsbG93JywgJ0dFVCwgSEVBRCcpXG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsICcwJylcbiAgICAgIHJlcy5lbmQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGZvcndhcmRFcnJvciA9ICFmYWxsdGhyb3VnaFxuICAgIHZhciBvcmlnaW5hbFVybCA9IHBhcnNlVXJsLm9yaWdpbmFsKHJlcSlcbiAgICB2YXIgcGF0aCA9IHBhcnNlVXJsKHJlcSkucGF0aG5hbWVcblxuICAgIC8vIG1ha2Ugc3VyZSByZWRpcmVjdCBvY2N1cnMgYXQgbW91bnRcbiAgICBpZiAocGF0aCA9PT0gJy8nICYmIG9yaWdpbmFsVXJsLnBhdGhuYW1lLnN1YnN0cigtMSkgIT09ICcvJykge1xuICAgICAgcGF0aCA9ICcnXG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIHNlbmQgc3RyZWFtXG4gICAgdmFyIHN0cmVhbSA9IHNlbmQocmVxLCBwYXRoLCBvcHRzKVxuXG4gICAgLy8gYWRkIGRpcmVjdG9yeSBoYW5kbGVyXG4gICAgc3RyZWFtLm9uKCdkaXJlY3RvcnknLCBvbkRpcmVjdG9yeSlcblxuICAgIC8vIGFkZCBoZWFkZXJzIGxpc3RlbmVyXG4gICAgaWYgKHNldEhlYWRlcnMpIHtcbiAgICAgIHN0cmVhbS5vbignaGVhZGVycycsIHNldEhlYWRlcnMpXG4gICAgfVxuXG4gICAgLy8gYWRkIGZpbGUgbGlzdGVuZXIgZm9yIGZhbGx0aHJvdWdoXG4gICAgaWYgKGZhbGx0aHJvdWdoKSB7XG4gICAgICBzdHJlYW0ub24oJ2ZpbGUnLCBmdW5jdGlvbiBvbkZpbGUgKCkge1xuICAgICAgICAvLyBvbmNlIGZpbGUgaXMgZGV0ZXJtaW5lZCwgYWx3YXlzIGZvcndhcmQgZXJyb3JcbiAgICAgICAgZm9yd2FyZEVycm9yID0gdHJ1ZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBmb3J3YXJkIGVycm9yc1xuICAgIHN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiBlcnJvciAoZXJyKSB7XG4gICAgICBpZiAoZm9yd2FyZEVycm9yIHx8ICEoZXJyLnN0YXR1c0NvZGUgPCA1MDApKSB7XG4gICAgICAgIG5leHQoZXJyKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbmV4dCgpXG4gICAgfSlcblxuICAgIC8vIHBpcGVcbiAgICBzdHJlYW0ucGlwZShyZXMpXG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsYXBzZSBhbGwgbGVhZGluZyBzbGFzaGVzIGludG8gYSBzaW5nbGUgc2xhc2hcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbGxhcHNlTGVhZGluZ1NsYXNoZXMgKHN0cikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSAhPT0gMHgyZiAvKiAvICovKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpID4gMVxuICAgID8gJy8nICsgc3RyLnN1YnN0cihpKVxuICAgIDogc3RyXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbWluaW1hbCBIVE1MIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGJvZHlcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlSHRtbERvY3VtZW50ICh0aXRsZSwgYm9keSkge1xuICByZXR1cm4gJzwhRE9DVFlQRSBodG1sPlxcbicgK1xuICAgICc8aHRtbCBsYW5nPVwiZW5cIj5cXG4nICtcbiAgICAnPGhlYWQ+XFxuJyArXG4gICAgJzxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxcbicgK1xuICAgICc8dGl0bGU+JyArIHRpdGxlICsgJzwvdGl0bGU+XFxuJyArXG4gICAgJzwvaGVhZD5cXG4nICtcbiAgICAnPGJvZHk+XFxuJyArXG4gICAgJzxwcmU+JyArIGJvZHkgKyAnPC9wcmU+XFxuJyArXG4gICAgJzwvYm9keT5cXG4nICtcbiAgICAnPC9odG1sPlxcbidcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkaXJlY3RvcnkgbGlzdGVuZXIgdGhhdCBqdXN0IDQwNHMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZU5vdEZvdW5kRGlyZWN0b3J5TGlzdGVuZXIgKCkge1xuICByZXR1cm4gZnVuY3Rpb24gbm90Rm91bmQgKCkge1xuICAgIHRoaXMuZXJyb3IoNDA0KVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGlyZWN0b3J5IGxpc3RlbmVyIHRoYXQgcGVyZm9ybXMgYSByZWRpcmVjdC5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlUmVkaXJlY3REaXJlY3RvcnlMaXN0ZW5lciAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiByZWRpcmVjdCAocmVzKSB7XG4gICAgaWYgKHRoaXMuaGFzVHJhaWxpbmdTbGFzaCgpKSB7XG4gICAgICB0aGlzLmVycm9yKDQwNClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBvcmlnaW5hbCBVUkxcbiAgICB2YXIgb3JpZ2luYWxVcmwgPSBwYXJzZVVybC5vcmlnaW5hbCh0aGlzLnJlcSlcblxuICAgIC8vIGFwcGVuZCB0cmFpbGluZyBzbGFzaFxuICAgIG9yaWdpbmFsVXJsLnBhdGggPSBudWxsXG4gICAgb3JpZ2luYWxVcmwucGF0aG5hbWUgPSBjb2xsYXBzZUxlYWRpbmdTbGFzaGVzKG9yaWdpbmFsVXJsLnBhdGhuYW1lICsgJy8nKVxuXG4gICAgLy8gcmVmb3JtYXQgdGhlIFVSTFxuICAgIHZhciBsb2MgPSBlbmNvZGVVcmwodXJsLmZvcm1hdChvcmlnaW5hbFVybCkpXG4gICAgdmFyIGRvYyA9IGNyZWF0ZUh0bWxEb2N1bWVudCgnUmVkaXJlY3RpbmcnLCAnUmVkaXJlY3RpbmcgdG8gPGEgaHJlZj1cIicgKyBlc2NhcGVIdG1sKGxvYykgKyAnXCI+JyArXG4gICAgICBlc2NhcGVIdG1sKGxvYykgKyAnPC9hPicpXG5cbiAgICAvLyBzZW5kIHJlZGlyZWN0IHJlc3BvbnNlXG4gICAgcmVzLnN0YXR1c0NvZGUgPSAzMDFcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sOyBjaGFyc2V0PVVURi04JylcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIEJ1ZmZlci5ieXRlTGVuZ3RoKGRvYykpXG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBcImRlZmF1bHQtc3JjICdub25lJ1wiKVxuICAgIHJlcy5zZXRIZWFkZXIoJ1gtQ29udGVudC1UeXBlLU9wdGlvbnMnLCAnbm9zbmlmZicpXG4gICAgcmVzLnNldEhlYWRlcignTG9jYXRpb24nLCBsb2MpXG4gICAgcmVzLmVuZChkb2MpXG4gIH1cbn1cbiIsICIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgYm9keVBhcnNlciA9IHJlcXVpcmUoJ2JvZHktcGFyc2VyJylcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgbWl4aW4gPSByZXF1aXJlKCdtZXJnZS1kZXNjcmlwdG9ycycpO1xudmFyIHByb3RvID0gcmVxdWlyZSgnLi9hcHBsaWNhdGlvbicpO1xudmFyIFJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZXIvcm91dGUnKTtcbnZhciBSb3V0ZXIgPSByZXF1aXJlKCcuL3JvdXRlcicpO1xudmFyIHJlcSA9IHJlcXVpcmUoJy4vcmVxdWVzdCcpO1xudmFyIHJlcyA9IHJlcXVpcmUoJy4vcmVzcG9uc2UnKTtcblxuLyoqXG4gKiBFeHBvc2UgYGNyZWF0ZUFwcGxpY2F0aW9uKClgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUFwcGxpY2F0aW9uO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBleHByZXNzIGFwcGxpY2F0aW9uLlxuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVBcHBsaWNhdGlvbigpIHtcbiAgdmFyIGFwcCA9IGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgYXBwLmhhbmRsZShyZXEsIHJlcywgbmV4dCk7XG4gIH07XG5cbiAgbWl4aW4oYXBwLCBFdmVudEVtaXR0ZXIucHJvdG90eXBlLCBmYWxzZSk7XG4gIG1peGluKGFwcCwgcHJvdG8sIGZhbHNlKTtcblxuICAvLyBleHBvc2UgdGhlIHByb3RvdHlwZSB0aGF0IHdpbGwgZ2V0IHNldCBvbiByZXF1ZXN0c1xuICBhcHAucmVxdWVzdCA9IE9iamVjdC5jcmVhdGUocmVxLCB7XG4gICAgYXBwOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBhcHAgfVxuICB9KVxuXG4gIC8vIGV4cG9zZSB0aGUgcHJvdG90eXBlIHRoYXQgd2lsbCBnZXQgc2V0IG9uIHJlc3BvbnNlc1xuICBhcHAucmVzcG9uc2UgPSBPYmplY3QuY3JlYXRlKHJlcywge1xuICAgIGFwcDogeyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogYXBwIH1cbiAgfSlcblxuICBhcHAuaW5pdCgpO1xuICByZXR1cm4gYXBwO1xufVxuXG4vKipcbiAqIEV4cG9zZSB0aGUgcHJvdG90eXBlcy5cbiAqL1xuXG5leHBvcnRzLmFwcGxpY2F0aW9uID0gcHJvdG87XG5leHBvcnRzLnJlcXVlc3QgPSByZXE7XG5leHBvcnRzLnJlc3BvbnNlID0gcmVzO1xuXG4vKipcbiAqIEV4cG9zZSBjb25zdHJ1Y3RvcnMuXG4gKi9cblxuZXhwb3J0cy5Sb3V0ZSA9IFJvdXRlO1xuZXhwb3J0cy5Sb3V0ZXIgPSBSb3V0ZXI7XG5cbi8qKlxuICogRXhwb3NlIG1pZGRsZXdhcmVcbiAqL1xuXG5leHBvcnRzLmpzb24gPSBib2R5UGFyc2VyLmpzb25cbmV4cG9ydHMucXVlcnkgPSByZXF1aXJlKCcuL21pZGRsZXdhcmUvcXVlcnknKTtcbmV4cG9ydHMucmF3ID0gYm9keVBhcnNlci5yYXdcbmV4cG9ydHMuc3RhdGljID0gcmVxdWlyZSgnc2VydmUtc3RhdGljJyk7XG5leHBvcnRzLnRleHQgPSBib2R5UGFyc2VyLnRleHRcbmV4cG9ydHMudXJsZW5jb2RlZCA9IGJvZHlQYXJzZXIudXJsZW5jb2RlZFxuXG4vKipcbiAqIFJlcGxhY2UgcmVtb3ZlZCBtaWRkbGV3YXJlIHdpdGggYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuXG52YXIgcmVtb3ZlZE1pZGRsZXdhcmVzID0gW1xuICAnYm9keVBhcnNlcicsXG4gICdjb21wcmVzcycsXG4gICdjb29raWVTZXNzaW9uJyxcbiAgJ3Nlc3Npb24nLFxuICAnbG9nZ2VyJyxcbiAgJ2Nvb2tpZVBhcnNlcicsXG4gICdmYXZpY29uJyxcbiAgJ3Jlc3BvbnNlVGltZScsXG4gICdlcnJvckhhbmRsZXInLFxuICAndGltZW91dCcsXG4gICdtZXRob2RPdmVycmlkZScsXG4gICd2aG9zdCcsXG4gICdjc3JmJyxcbiAgJ2RpcmVjdG9yeScsXG4gICdsaW1pdCcsXG4gICdtdWx0aXBhcnQnLFxuICAnc3RhdGljQ2FjaGUnXG5dXG5cbnJlbW92ZWRNaWRkbGV3YXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vc3QgbWlkZGxld2FyZSAobGlrZSAnICsgbmFtZSArICcpIGlzIG5vIGxvbmdlciBidW5kbGVkIHdpdGggRXhwcmVzcyBhbmQgbXVzdCBiZSBpbnN0YWxsZWQgc2VwYXJhdGVseS4gUGxlYXNlIHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2VuY2hhbGFicy9jb25uZWN0I21pZGRsZXdhcmUuJyk7XG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59KTtcbiIsICIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvZXhwcmVzcycpO1xuIiwgIlx1RkVGRm1vZHVsZS5leHBvcnRzID0gKGNvbnRlbnQpID0+IHtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnRlbnQubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgLy8gSWYgPyBpcyBlbmNvdW50ZXJlZCBpdCdzIGRlZmluaXRlbHkgbm90IHV0ZjghXG4gICAgICAgIGlmIChjb250ZW50W2JdID09PSBcIlx1RkZGRFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59IiwgIlx1RkVGRmNvbnN0IGZsYWcgPSBcImdpXCI7XG5cbmNvbnN0IHNoYXJlZFJlZ2V4ID0ge1xuICAgIGN6ZWNoOiBuZXcgUmVnRXhwKC9qc2VtfGpzaS8sIGZsYWcpLFxuICAgIGh1bmdhcmlhbjogbmV3IFJlZ0V4cCgvXFxzbmVtXFxzLywgZmxhZyksXG4gICAgc2xvdmFrOiBuZXcgUmVnRXhwKC9wb3JpYWRrdXxteXNsXHUwMEVEbXxcXHNzbWVcXHMvLCBmbGFnKSxcbiAgICBzbG92ZW5pYW46IG5ldyBSZWdFeHAoL1xcc2thalxcc3xsYWhrb3x6ZGFqLywgZmxhZyksXG4gICAgYWxiYW5pYW46IG5ldyBSZWdFeHAoL251ay8sIGZsYWcpLFxuICAgIGVuZ2xpc2g6IG5ldyBSZWdFeHAoLyB0aGUgLywgZmxhZyksXG4gICAgZnJlbmNoOiBuZXcgUmVnRXhwKC9jJ2VzdC8sIGZsYWcpLFxuICAgIHBvcnR1Z3Vlc2U6IG5ldyBSZWdFeHAoLyBuXHUwMEUzbyAvLCBmbGFnKSxcbiAgICBzcGFuaXNoOiBuZXcgUmVnRXhwKC9lc3RhYmF8XFxzbXV5XFxzfHNpZW1wcmV8YWhvcmEvLCBmbGFnKSxcbiAgICBnZXJtYW46IG5ldyBSZWdFeHAoL1xcc2Rhc1xccy8sIGZsYWcpLFxuICAgIGl0YWxpYW46IG5ldyBSZWdFeHAoL1xcc2NoZVxccy8sIGZsYWcpLFxuICAgIGRhbmlzaDogbmV3IFJlZ0V4cCgvaHZhZHxub2dldC8sIGZsYWcpLFxuICAgIG5vcndlZ2lhbjogbmV3IFJlZ0V4cCgvZGVnLywgZmxhZyksXG4gICAgc3dlZGlzaDogbmV3IFJlZ0V4cCgvIGphZyAvLCBmbGFnKSxcbiAgICBkdXRjaDogbmV3IFJlZ0V4cCgvIGhldCAvLCBmbGFnKSxcbiAgICBmaW5uaXNoOiBuZXcgUmVnRXhwKC9oXHUwMEU0bi8sIGZsYWcpLFxuICAgIFwic2VyYm8tY3JvYXRpYW5cIjogbmV3IFJlZ0V4cCgvIHNhbSB8IGtha28gLywgZmxhZyksXG4gICAgZXN0b25pYW46IG5ldyBSZWdFeHAoL1xcc3NlZGFcXHN8XFxzcG9sZVxcc3xtaWRhZ2kvLCBmbGFnKSxcbiAgICBpY2VsYW5kaWM6IG5ldyBSZWdFeHAoL1x1MDBERWFcdTAwRjAvLCBmbGFnKSxcbiAgICBcIm1hbGF5LWluZG9uZXNpYW5cIjogbmV3IFJlZ0V4cCgvdGlkYWsvLCBmbGFnKSxcbiAgICB0dXJraXNoOiBuZXcgUmVnRXhwKC8gYmlyIC8sIGZsYWcpLFxuICAgIGxpdGh1YW5pYW46IG5ldyBSZWdFeHAoL3RhaXB8XFxzdGFpXFxzLywgZmxhZyksXG4gICAgYmVuZ2FsaTogbmV3IFJlZ0V4cCgvXHUwOThGXHUwOTlGXHUwOUJFLywgZmxhZyksXG4gICAgaGluZGk6IG5ldyBSZWdFeHAoL1x1MDkzOVx1MDk0OFx1MDkwMi8sIGZsYWcpLFxuICAgIHVyZHU6IG5ldyBSZWdFeHAoL1x1MDYyN1x1MDZDQ1x1MDZBOS8sIGZsYWcpLFxuICAgIHZpZXRuYW1lc2U6IG5ldyBSZWdFeHAoLyBraFx1MDBGNG5nIC8sIGZsYWcpXG59O1xuXG5jb25zdCBzaGFyZWRGcmVxdWVuY3kgPSB7XG4gICAgcG9saXNoOiB7IGxvdzogMC4wMDQzNTUsIGhpZ2g6IDAuMDA1MTAyIH0sXG4gICAgY3plY2g6IHsgbG93OiAwLjAwNDQzMywgaGlnaDogMC4wMDczMjQgfSxcbiAgICBodW5nYXJpYW46IHsgbG93OiAwLjAwNDk5NCwgaGlnaDogMC4wMDUxODMgfSxcbiAgICByb21hbmlhbjogeyBsb3c6IDAuMDAzMzE5LCBoaWdoOiAwLjAwNDE5MCB9LFxuICAgIHNsb3ZhazogeyBsb3c6IDAuMDAxNzM2LCBoaWdoOiAwLjAwMjU1NyB9LFxuICAgIHNsb3ZlbmlhbjogeyBsb3c6IDAuMDA0MTExLCBoaWdoOiAwLjAwNDk1OSB9LFxuICAgIGFsYmFuaWFuOiB7IGxvdzogMC4wMDM3NzMsIGhpZ2g6IDAuMDA3MzEzIH0sXG4gICAgdWtyYWluaWFuOiB7IGxvdzogMC4wMDI5MzMsIGhpZ2g6IDAuMDA1Mzg5IH0sXG4gICAgZW5nbGlzaDogeyBsb3c6IDAuMDA0Njc5LCBoaWdoOiAwLjAwNzU4MCB9LFxuICAgIGZyZW5jaDogeyBsb3c6IDAuMDAzMDE2LCBoaWdoOiAwLjAwNDgyNSB9LFxuICAgIHBvcnR1Z3Vlc2U6IHsgbG93OiAwLjAwMzQwNiwgaGlnaDogMC4wMDUwMzIgfSxcbiAgICBzcGFuaXNoOiB7IGxvdzogMC4wMDIzNDgsIGhpZ2g6IDAuMDAyODgxIH0sXG4gICAgZ2VybWFuOiB7IGxvdzogMC4wMDQwNDQsIGhpZ2g6IDAuMDA0MzkxIH0sXG4gICAgaXRhbGlhbjogeyBsb3c6IDAuMDAzODg5LCBoaWdoOiAwLjAwNTE3NSB9LFxuICAgIGRhbmlzaDogeyBsb3c6IDAuMDAzNjMwLCBoaWdoOiAwLjAwNDE4OSB9LFxuICAgIG5vcndlZ2lhbjogeyBsb3c6IDAuMDAyNDEwLCBoaWdoOiAwLjAwMzkxOCB9LFxuICAgIHN3ZWRpc2g6IHsgbG93OiAwLjAwNDkxNiwgaGlnaDogMC4wMDcyMjEgfSxcbiAgICBkdXRjaDogeyBsb3c6IDAuMDAzNTAxLCBoaWdoOiAwLjAwNDE1MCB9LFxuICAgIGZpbm5pc2g6IHsgbG93OiAwLjAwMzMwOCwgaGlnaDogMC4wMDUxMzUgfSxcbiAgICBcInNlcmJvLWNyb2F0aWFuXCI6IHsgbG93OiAwLjAwMjU2OCwgaGlnaDogMC4wMDUxODIgfSxcbiAgICBlc3RvbmlhbjogeyBsb3c6IDAuMDAyODkyLCBoaWdoOiAwLjAwMzk2MyB9LFxuICAgIGljZWxhbmRpYzogeyBsb3c6IDAuMDA0MzY2LCBoaWdoOiAwLjAwNDM2NiB9LFxuICAgIFwibWFsYXktaW5kb25lc2lhblwiOiB7IGxvdzogMC4wMDI4MjUsIGhpZ2g6IDAuMDAzOTMyIH0sXG4gICAgZ3JlZWs6IHsgbG93OiAwLjAwMzQ0MCwgaGlnaDogMC4wMDQ4NjIgfSxcbiAgICB0dXJraXNoOiB7IGxvdzogMC4wMDI5MTUsIGhpZ2g6IDAuMDA0NTg4IH0sXG4gICAgaGVicmV3OiB7IGxvdzogMC4wMDM2NjMsIGhpZ2g6IDAuMDA0NjY2IH0sXG4gICAgbGl0aHVhbmlhbjogeyBsb3c6IDAuMDAzMjc3LCBoaWdoOiAwLjAwMzc2OCB9LFxuICAgIGJlbmdhbGk6IHsgbG93OiAwLjAwMzE1NSwgaGlnaDogMC4wMDUyMzYgfSxcbiAgICBoaW5kaTogeyBsb3c6IDAuMDA0MTU5LCBoaWdoOiAwLjAwNjQ3OCB9LFxuICAgIHVyZHU6IHsgbG93OiAwLjAwNDExOCwgaGlnaDogMC4wMDU4NTEgfSxcbiAgICB2aWV0bmFtZXNlOiB7IGxvdzogMC4wMDMzODcsIGhpZ2g6IDAuMDA1MTkxIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gW1xuICAgIHtcbiAgICAgICAgbmFtZTogXCJwb2xpc2hcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9zaVx1MDExOS8sIGZsYWcpLFxuICAgICAgICBpc29SZWdleDogbmV3IFJlZ0V4cCgvc2lcdTAwRUEvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjUwXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LnBvbGlzaCxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kucG9saXNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiY3plY2hcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBzaGFyZWRSZWdleC5jemVjaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LmN6ZWNoLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTBcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuY3plY2gsXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmN6ZWNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaHVuZ2FyaWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguaHVuZ2FyaWFuLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXguaHVuZ2FyaWFuLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTBcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaHVuZ2FyaWFuLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5odW5nYXJpYW5cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJyb21hbmlhblwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IG5ldyBSZWdFeHAoL3N1bnR8ZVx1MDE1RnRpLywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9zdW50fGVcdTAwQkF0aS8sIGZsYWcpLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTBcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kucm9tYW5pYW4sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LnJvbWFuaWFuXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwic2xvdmFrXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguc2xvdmFrLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXguc2xvdmFrLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTBcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuc2xvdmFrLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5zbG92YWtcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJzbG92ZW5pYW5cIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBzaGFyZWRSZWdleC5zbG92ZW5pYW4sXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5zbG92ZW5pYW4sXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MFwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5zbG92ZW5pYW4sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LnNsb3ZlbmlhblxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImFsYmFuaWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguYWxiYW5pYW4sXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5hbGJhbmlhbixcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjUwXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmFsYmFuaWFuLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5hbGJhbmlhblxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcInJ1c3NpYW5cIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9cdTA0NDdcdTA0NDJcdTA0M0UvLCBmbGFnKSxcbiAgICAgICAgaXNvUmVnZXg6IG5ldyBSZWdFeHAoL1x1MDBGN1x1MDBGMlx1MDBFRS8sIGZsYWcpLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTFcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiB7IGxvdzogMC4wMDQ5NjUsIGhpZ2g6IDAuMDA1MzQxIH0sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogeyBsb3c6IDAuMDAzODg0LCBoaWdoOiAwLjAwMzk4NiB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwidWtyYWluaWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogbmV3IFJlZ0V4cCgvXHUwNDMyXHUwNDU2XHUwNDNEfFx1MDQzMFx1MDQzQlx1MDQzNS8sIGZsYWcpLFxuICAgICAgICBpc29SZWdleDogbmV3IFJlZ0V4cCgvXHUwMEUyXHUwMEIzXHUwMEVEfFx1MDBFMFx1MDBFQlx1MDBFNS8sIGZsYWcpLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTFcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kudWtyYWluaWFuLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS51a3JhaW5pYW5cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJidWxnYXJpYW5cIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9cdTA0NDJcdTA0M0VcdTA0MzJcdTA0MzB8XHUwNDNBXHUwNDMwXHUwNDNBXHUwNDMyXHUwNDNFLywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9cdTAwRjJcdTAwRUVcdTAwRTJcdTAwRTB8XHUwMEU0XHUwMEVFXHUwMEUxXHUwMEYwXHUwMEU1fFx1MDBFQWFcdTAwRUFcdTAwRTJvLywgZmxhZyksXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MVwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHsgbG93OiAwLjAwNTIyNSwgaGlnaDogMC4wMDU2MjggfSxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiB7IGxvdzogMC4wMDI3NjcsIGhpZ2g6IDAuMDA0OTUxIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJlbmdsaXNoXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguZW5nbGlzaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LmVuZ2xpc2gsXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MlwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5lbmdsaXNoLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5lbmdsaXNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiZnJlbmNoXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguZnJlbmNoLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXguZnJlbmNoLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZnJlbmNoLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5mcmVuY2hcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJwb3J0dWd1ZXNlXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXgucG9ydHVndWVzZSxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LnBvcnR1Z3Vlc2UsXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MlwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5wb3J0dWd1ZXNlLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5wb3J0dWd1ZXNlXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwic3BhbmlzaFwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LnNwYW5pc2gsXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5zcGFuaXNoLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuc3BhbmlzaCxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuc3BhbmlzaFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImdlcm1hblwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4Lmdlcm1hbixcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4Lmdlcm1hbixcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjUyXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5Lmdlcm1hbixcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZ2VybWFuXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaXRhbGlhblwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4Lml0YWxpYW4sXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5pdGFsaWFuLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaXRhbGlhbixcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaXRhbGlhblxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImRhbmlzaFwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LmRhbmlzaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LmRhbmlzaCxcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjUyXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmRhbmlzaCxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZGFuaXNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwibm9yd2VnaWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXgubm9yd2VnaWFuLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXgubm9yd2VnaWFuLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kubm9yd2VnaWFuLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5ub3J3ZWdpYW5cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJzd2VkaXNoXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguc3dlZGlzaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LnN3ZWRpc2gsXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MlwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5zd2VkaXNoLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5zd2VkaXNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiZHV0Y2hcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBzaGFyZWRSZWdleC5kdXRjaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LmR1dGNoLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZHV0Y2gsXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmR1dGNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiZmlubmlzaFwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LmZpbm5pc2gsXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5maW5uaXNoLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZmlubmlzaCxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZmlubmlzaFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcInNlcmJvLWNyb2F0aWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXhbXCJzZXJiby1jcm9hdGlhblwiXSxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4W1wic2VyYm8tY3JvYXRpYW5cIl0sXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MlwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeVtcInNlcmJvLWNyb2F0aWFuXCJdLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeVtcInNlcmJvLWNyb2F0aWFuXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiZXN0b25pYW5cIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBzaGFyZWRSZWdleC5lc3RvbmlhbixcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LmVzdG9uaWFuLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZXN0b25pYW4sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmVzdG9uaWFuXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaWNlbGFuZGljXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguaWNlbGFuZGljLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXguaWNlbGFuZGljLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaWNlbGFuZGljLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5pY2VsYW5kaWNcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJtYWxheS1pbmRvbmVzaWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXhbXCJtYWxheS1pbmRvbmVzaWFuXCJdLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXhbXCJtYWxheS1pbmRvbmVzaWFuXCJdLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3lbXCJtYWxheS1pbmRvbmVzaWFuXCJdLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeVtcIm1hbGF5LWluZG9uZXNpYW5cIl1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJncmVla1wiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IG5ldyBSZWdFeHAoL1x1MDNCNVx1MDNBRlx1MDNCRFx1MDNCMVx1MDNCOS8sIGZsYWcpLFxuICAgICAgICBpc29SZWdleDogbmV3IFJlZ0V4cCgvXHUwMEU1XHUwMERGXHUwMEVEXHUwMEUxXHUwMEU5LywgZmxhZyksXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1M1wiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5ncmVlayxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZ3JlZWtcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJ0dXJraXNoXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXgudHVya2lzaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LnR1cmtpc2gsXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1NFwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS50dXJraXNoLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS50dXJraXNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaGVicmV3XCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogbmV3IFJlZ0V4cCgvXHUwNUQwXHUwNUVBXHUwNUQ0LywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9cdTAwRTBcdTAwRkFcdTAwRTQvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjU1XCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmhlYnJldyxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaGVicmV3XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiYXJhYmljXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogbmV3IFJlZ0V4cCgvXHUwNjQ3XHUwNjMwXHUwNjI3LywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9cdTAwRTVcdTAwRjBcdTAwRTcvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjU2XCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogeyBsb3c6IDAuMDAzNTIyLCBoaWdoOiAwLjAwNDM0OCB9LFxuICAgICAgICBpc29GcmVxdWVuY3k6IHsgbG93OiAwLjAwMzc3MywgaGlnaDogMC4wMDU1NTkgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImZhcnNpLXBlcnNpYW5cIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9cdTA2MjdcdTA2NDhcdTA2NDYvLCBmbGFnKSxcbiAgICAgICAgaXNvUmVnZXg6IG5ldyBSZWdFeHAoL1x1MDBFN1x1MDBFRFx1MDBFNC8sIGZsYWcpLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTZcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiB7IGxvdzogMC4wMDI3NjEsIGhpZ2g6IDAuMDA0ODU2IH0sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogeyBsb3c6IDAuMDAzMDEwLCBoaWdoOiAwLjAwNjY0NiB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwibGl0aHVhbmlhblwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LmxpdGh1YW5pYW4sXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5saXRodWFuaWFuLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTdcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kubGl0aHVhbmlhbixcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kubGl0aHVhbmlhblxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImNoaW5lc2Utc2ltcGxpZmllZFwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IG5ldyBSZWdFeHAoL1x1NEU0OC8sIGZsYWcpLFxuICAgICAgICBpc29SZWdleDogbmV3IFJlZ0V4cCgvXHUwMEI0XHUwMEYzfFx1MDBCNlx1MDBBRnxcdTAwQzVcdTAwQUUvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiR0IxODAzMFwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHsgbG93OiAwLjAwOTU2NywgaGlnaDogMC4wMTE1MDIgfSxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiB7IGxvdzogMC4wMDMxMzcsIGhpZ2g6IDAuMDA1MDA5IH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJjaGluZXNlLXRyYWRpdGlvbmFsXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogbmV3IFJlZ0V4cCgvXHU1MDExLywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9cdTAwQTZiLywgZmxhZyksXG4gICAgICAgIGVuY29kaW5nOiBcIkJJRzVcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiB7IGxvdzogMC4wMTI0ODQsIGhpZ2g6IDAuMDE0OTY0IH0sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogeyBsb3c6IDAuMDA1MDYzLCBoaWdoOiAwLjAwNTgyMiB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiamFwYW5lc2VcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9cdTMwNjkvLCBmbGFnKSxcbiAgICAgICAgaXNvUmVnZXg6IG5ldyBSZWdFeHAoL1x1MjAxQVx1MDBCQnxcdTAwODJcdTAwQzFcdTAwODJcdTAwQzQvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiU2hpZnQtSklTXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogeyBsb3c6IDAuMDA0MjU3LCBoaWdoOiAwLjAwNjU4NSB9LFxuICAgICAgICBpc29GcmVxdWVuY3k6IHsgbG93OiAwLjAwNDI4NiwgaGlnaDogMC4wMDQ2NTMgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImtvcmVhblwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IG5ldyBSZWdFeHAoL1x1QjNDNC8sIGZsYWcpLFxuICAgICAgICBpc29SZWdleDogbmV3IFJlZ0V4cCgvXHUwMEUwXHUwMEY2XHUwMEJFXHUwMEVFfFx1MDBFNVx1MDBCRVx1MDBERnxcdTAwQTFcdTAwQkNcdTAwQUQvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiRVVDLUtSXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogeyBsb3c6IDAuMDEwOTEwLCBoaWdoOiAwLjAxMzY3MCB9LFxuICAgICAgICBpc29GcmVxdWVuY3k6IHsgbG93OiAwLjAwNDExOCwgaGlnaDogMC4wMDQ5NjEgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcInRoYWlcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9cdTBFNDFcdTBFMkVcdTBFMjNcdTBFNENcdTBFMjNcdTBFMzVcdTBFNDh8XHUwRTFFXHUwRTJEXHUwRTE1XHUwRTQwXHUwRTE1XHUwRTJEXHUwRTIzXHUwRTRDLywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9cdTAwRTFcdTAwRUVcdTAwRTNcdTAwRUNcdTAwRTNcdTAwRjVcdTAwRTh8XHUwMEJFXHUwMEVEXHUwMEI1XHUwMEUwXHUwMEI1XHUwMEVEXHUwMEUzXHUwMEVDXHUwMEFELywgZmxhZyksXG4gICAgICAgIGVuY29kaW5nOiBcIlRJUy02MjBcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiB7IGxvdzogMC4wMDMxOTQsIGhpZ2g6IDAuMDAzNDY4IH0sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogeyBsb3c6IDAuMDAyMDkxLCBoaWdoOiAwLjAwMjMwMyB9XG4gICAgfSxcbiAgICAvLyBUaGUgZm9sbG93aW5nIGxhbmd1YWdlcyBkb24ndCBzZWVtIHRvIGhhdmUgdGhlaXIgb3duIGVuY29kaW5nXG4gICAgLy8gU3VidGl0bGUgZmlsZXMgaW4gdGhlc2UgbGFuZ3VhZ2VzIHNlZW0gdG8gYWxtb3N0IGV4Y2x1c2l2ZWx5IHVzZSBVVEYgZW5jb2RpbmcuXG4gICAge1xuICAgICAgICBuYW1lOiBcImJlbmdhbGlcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBzaGFyZWRSZWdleC5iZW5nYWxpLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXguYmVuZ2FsaSxcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuYmVuZ2FsaSxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuYmVuZ2FsaVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImhpbmRpXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguaGluZGksXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5oaW5kaSxcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaGluZGksXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmhpbmRpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwidXJkdVwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LnVyZHUsXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC51cmR1LFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS51cmR1LFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS51cmR1XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwidmlldG5hbWVzZVwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LnZpZXRuYW1lc2UsXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC52aWV0bmFtZXNlLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS52aWV0bmFtZXNlLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS52aWV0bmFtZXNlXG4gICAgfSxcbl07IiwgImNvbnN0IGxhbmd1YWdlQXJyID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy9sYW5ndWFnZU9iamVjdC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoZGF0YSwgZW5jb2RpbmcpID0+IHtcbiAgY29uc3QgbmV3TGFuZ3VhZ2VBcnIgPSBbXTtcblxuICAvLyBDbG9uaW5nIHRoZSBsYW5ndWFnZSBhcnJheSBhbmQgbWFraW5nIHN1cmUgdGhhdCBcImNvdW50XCIgaGFzIG5vIHJlZmVyZW5jZSB0byBcImxhbmd1YWdlQXJyXCIhXG4gIGxhbmd1YWdlQXJyLmZvckVhY2goKG9iaikgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRMYW5nT2JqID0ge307XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgIT09IFwiY291bnRcIikge1xuICAgICAgICB1cGRhdGVkTGFuZ09ialtrZXldID0gb2JqW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGVkTGFuZ09iai5jb3VudCA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmV3TGFuZ3VhZ2VBcnIucHVzaCh1cGRhdGVkTGFuZ09iaik7XG4gIH0pO1xuXG4gIGNvbnN0IHJlZ2V4ID0gZW5jb2RpbmcgPyBcInV0ZlJlZ2V4XCIgOiBcImlzb1JlZ2V4XCI7XG5cbiAgLy8gUG9wdWxhdGluZyB0aGUgY291bnQgcHJvcGVydHkgb2YgdGhlIGxhbmd1YWdlIGFycmF5XG4gIG5ld0xhbmd1YWdlQXJyLmZvckVhY2goKGxhbmcpID0+IHtcbiAgICBpZiAobGFuZ1tyZWdleF0pIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBkYXRhLmNvbnRlbnQubWF0Y2gobGFuZ1tyZWdleF0pO1xuXG4gICAgICBpZiAobWF0Y2hlcykgbGFuZy5jb3VudCA9IG1hdGNoZXMubGVuZ3RoO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5ld0xhbmd1YWdlQXJyO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IChkYXRhLCBmaWxlSW5mbykgPT4ge1xuICBjb25zdCBjaGFyUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIC9cXGR8XFxufFxcc3xcXC18XFwufFxcLHxcXDp8XFw7fFxcP3xcXCF8XFw8fFxcPnxcXFt8XFxdfFxce3xcXH18XFwmfFxcPXxcXHwvLFxuICAgIFwiZ1wiXG4gICk7XG4gIGNvbnN0IHRvdGFsQ2hhcmFjdGVycyA9IGRhdGEuY29udGVudC5yZXBsYWNlKGNoYXJSZWdleCwgXCJcIikubGVuZ3RoO1xuICBjb25zdCBsYW5nQXJyID0gZGF0YS5sYW5ndWFnZUFycjtcbiAgY29uc3QgcG9zID0gZGF0YS5wb3M7XG5cbiAgY29uc3Qgc2Vjb25kTGFuZ3VhZ2UgPSBsYW5nQXJyLnJlZHVjZSgoYWNjLCB2YWwpID0+IHtcbiAgICBpZiAoYWNjLm5hbWUgPT09IGZpbGVJbmZvLmxhbmd1YWdlKSByZXR1cm4gdmFsO1xuICAgIGlmICh2YWwubmFtZSA9PT0gZmlsZUluZm8ubGFuZ3VhZ2UpIHJldHVybiBhY2M7XG5cbiAgICByZXR1cm4gYWNjLmNvdW50ID49IHZhbC5jb3VudCA/IGFjYyA6IHZhbDtcbiAgfSk7XG5cbiAgY29uc3QgbGFuZ3VhZ2VSYXRpbyA9XG4gICAgbGFuZ0Fycltwb3NdLmNvdW50IC8gKHNlY29uZExhbmd1YWdlLmNvdW50ICsgbGFuZ0Fycltwb3NdLmNvdW50KTtcbiAgY29uc3QgY2hhcmFjdGVyV29yZFJhdGlvID0gbGFuZ0Fycltwb3NdLmNvdW50IC8gdG90YWxDaGFyYWN0ZXJzO1xuXG4gIGxldCBsb3dlckxpbWl0ID0gbnVsbDtcbiAgbGV0IHVwcGVyTGltaXQgPSBudWxsO1xuICBjb25zdCBtdWx0aXBsaWVyID0gMC44O1xuXG4gIGlmIChmaWxlSW5mby5lbmNvZGluZyA9PT0gXCJVVEYtOFwiIHx8IGZpbGVJbmZvLmVuY29kaW5nID09PSBcIlVURi0xNkxFXCIpIHtcbiAgICBsb3dlckxpbWl0ID0gbGFuZ0Fycltwb3NdLnV0ZkZyZXF1ZW5jeVxuICAgICAgPyBsYW5nQXJyW3Bvc10udXRmRnJlcXVlbmN5LmxvdyAqIG11bHRpcGxpZXJcbiAgICAgIDogbnVsbDtcbiAgICB1cHBlckxpbWl0ID0gbGFuZ0Fycltwb3NdLnV0ZkZyZXF1ZW5jeVxuICAgICAgPyAobGFuZ0Fycltwb3NdLnV0ZkZyZXF1ZW5jeS5sb3cgKyBsYW5nQXJyW3Bvc10udXRmRnJlcXVlbmN5LmhpZ2gpIC8gMlxuICAgICAgOiBudWxsO1xuICB9IGVsc2Uge1xuICAgIGxvd2VyTGltaXQgPSBsYW5nQXJyW3Bvc10uaXNvRnJlcXVlbmN5XG4gICAgICA/IGxhbmdBcnJbcG9zXS5pc29GcmVxdWVuY3kubG93ICogbXVsdGlwbGllclxuICAgICAgOiBudWxsO1xuICAgIHVwcGVyTGltaXQgPSBsYW5nQXJyW3Bvc10uaXNvRnJlcXVlbmN5XG4gICAgICA/IChsYW5nQXJyW3Bvc10uaXNvRnJlcXVlbmN5LmxvdyArIGxhbmdBcnJbcG9zXS5pc29GcmVxdWVuY3kuaGlnaCkgLyAyXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBsZXQgY29uZmlkZW5jZVNjb3JlO1xuXG4gIGlmICghbG93ZXJMaW1pdCB8fCAhdXBwZXJMaW1pdCkge1xuICAgIGNvbmZpZGVuY2VTY29yZSA9IG51bGw7XG4gIH0gZWxzZSBpZiAoY2hhcmFjdGVyV29yZFJhdGlvID49IHVwcGVyTGltaXQpIHtcbiAgICBjb25maWRlbmNlU2NvcmUgPSAxO1xuICB9IGVsc2UgaWYgKGNoYXJhY3RlcldvcmRSYXRpbyA+IGxvd2VyTGltaXQpIHtcbiAgICBjb25zdCByYW5nZSA9IHVwcGVyTGltaXQgLSBsb3dlckxpbWl0O1xuICAgIGNvbnN0IHN1cnBsdXMgPSBjaGFyYWN0ZXJXb3JkUmF0aW8gLSBsb3dlckxpbWl0O1xuICAgIGNvbnN0IGNvbmZpZGVuY2VSYWlzZVBlcmNlbnRhZ2UgPSBzdXJwbHVzIC8gcmFuZ2U7XG4gICAgY29uc3QgY29uZmlkZW5jZVJhaXNlID0gKDEgLSBsYW5ndWFnZVJhdGlvKSAqIGNvbmZpZGVuY2VSYWlzZVBlcmNlbnRhZ2U7XG4gICAgY29uZmlkZW5jZVNjb3JlID0gTnVtYmVyKChsYW5ndWFnZVJhdGlvICsgY29uZmlkZW5jZVJhaXNlKS50b0ZpeGVkKDIpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWRlbmNlU2NvcmUgPSBOdW1iZXIoXG4gICAgICAobGFuZ3VhZ2VSYXRpbyAqIChjaGFyYWN0ZXJXb3JkUmF0aW8gLyBsb3dlckxpbWl0KSkudG9GaXhlZCgyKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29uZmlkZW5jZVNjb3JlO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IFtcbiAge1xuICAgIGVuY29kaW5nOiBcIlVURi1FQkNESUNcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjIyMSAxMTUgMTAyIDExNVwiKSxcbiAgfSxcbiAge1xuICAgIGVuY29kaW5nOiBcIkdCLTE4MDMwXCIsXG4gICAgcmVnZXg6IG5ldyBSZWdFeHAoXCIxMzIgNDkgMTQ5IDUxXCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiVVRGLTMyTEVcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjI1NSAyNTQgMCAwXCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiVVRGLTMyQkVcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjAgMCAyNTQgMjU1XCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiVVRGLThcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjIzOSAxODcgMTkxXCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiVVRGLTdcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjQzIDQ3IDExOFwiKSxcbiAgfSxcbiAge1xuICAgIGVuY29kaW5nOiBcIlVURi0xXCIsXG4gICAgcmVnZXg6IG5ldyBSZWdFeHAoXCIyNDcgMTAwIDc2XCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiU0NTVVwiLFxuICAgIHJlZ2V4OiBuZXcgUmVnRXhwKFwiMTQgMjU0IDI1NVwiKSxcbiAgfSxcbiAge1xuICAgIGVuY29kaW5nOiBcIkJPQ1UtMVwiLFxuICAgIHJlZ2V4OiBuZXcgUmVnRXhwKFwiMjUxIDIzOCA0MFwiKSxcbiAgfSxcbiAge1xuICAgIGVuY29kaW5nOiBcIlVURi0xNkJFXCIsXG4gICAgcmVnZXg6IG5ldyBSZWdFeHAoXCIyNTQgMjU1XCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiVVRGLTE2TEVcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjI1NSAyNTRcIiksXG4gIH0sXG5dO1xuIiwgImNvbnN0IGNvdW50QWxsTWF0Y2hlcyA9IHJlcXVpcmUoXCIuL3Byb2Nlc3NpbmctY29udGVudC9jb3VudEFsbE1hdGNoZXMuanNcIik7XG5jb25zdCBjYWxjdWxhdGVDb25maWRlbmNlU2NvcmUgPSByZXF1aXJlKFwiLi9wcm9jZXNzaW5nLWNvbnRlbnQvY2FsY3VsYXRlQ29uZmlkZW5jZVNjb3JlLmpzXCIpO1xuY29uc3QgYnl0ZU9yZGVyTWFya09iamVjdCA9IHJlcXVpcmUoXCIuLi9jb25maWcvYnl0ZU9yZGVyTWFya09iamVjdC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoZGF0YSwgZmlsZUluZm8pID0+IHtcbiAgZGF0YS5sYW5ndWFnZUFyciA9IGNvdW50QWxsTWF0Y2hlcyhkYXRhLCBmaWxlSW5mby5lbmNvZGluZyk7XG5cbiAgZmlsZUluZm8ubGFuZ3VhZ2UgPSBkYXRhLmxhbmd1YWdlQXJyLnJlZHVjZSgoYWNjLCB2YWwpID0+XG4gICAgYWNjLmNvdW50ID4gdmFsLmNvdW50ID8gYWNjIDogdmFsXG4gICkubmFtZTtcblxuICAvLyBcInBvc1wiIGdpdmVzIHVzIHRoZSBwb3NpdGlvbiBpbiB0aGUgbGFuZ3VhZ2UgYXJyYXkgdGhhdCBoYXMgdGhlIG1vc3QgbWF0Y2hlc1xuICBkYXRhLnBvcyA9IGRhdGEubGFuZ3VhZ2VBcnIuZmluZEluZGV4KFxuICAgIChlbGVtKSA9PiBlbGVtLm5hbWUgPT09IGZpbGVJbmZvLmxhbmd1YWdlXG4gICk7XG5cbiAgLy8gRGV0ZXJtaW5lIHRoZSBlbmNvZGluZ1xuICBpZiAoIWZpbGVJbmZvLmVuY29kaW5nKSB7XG4gICAgZmlsZUluZm8uZW5jb2RpbmcgPSBkYXRhLmxhbmd1YWdlQXJyW2RhdGEucG9zXS5lbmNvZGluZztcbiAgfVxuXG4gIGNvbnN0IGNhbGN1bGF0aW9ucyA9IGNhbGN1bGF0ZUNvbmZpZGVuY2VTY29yZShkYXRhLCBmaWxlSW5mbyk7XG5cbiAgaWYgKGZpbGVJbmZvLmNvbmZpZGVuY2UuZW5jb2RpbmcpIHtcbiAgICBmaWxlSW5mby5jb25maWRlbmNlLmxhbmd1YWdlID0gY2FsY3VsYXRpb25zO1xuICB9IGVsc2Uge1xuICAgIGZpbGVJbmZvLmNvbmZpZGVuY2UuZW5jb2RpbmcgPSBjYWxjdWxhdGlvbnM7XG4gICAgZmlsZUluZm8uY29uZmlkZW5jZS5sYW5ndWFnZSA9IGNhbGN1bGF0aW9ucztcbiAgfVxuXG4gIC8vIEVkZ2UgY2FzZSwgd2hlbiBubyBtYXRjaGVzIHdlcmUgZm91bmRcbiAgaWYgKCFkYXRhLmxhbmd1YWdlQXJyW2RhdGEucG9zXS5jb3VudCkge1xuICAgIGZpbGVJbmZvLmxhbmd1YWdlID0gbnVsbDtcbiAgICBmaWxlSW5mby5jb25maWRlbmNlLmxhbmd1YWdlID0gbnVsbDtcblxuICAgIGlmICghYnl0ZU9yZGVyTWFya09iamVjdC5zb21lKG9iaiA9PiBvYmouZW5jb2RpbmcgPT09IGZpbGVJbmZvLmVuY29kaW5nKSkge1xuICAgICAgZmlsZUluZm8uZW5jb2RpbmcgPSBudWxsO1xuICAgICAgZmlsZUluZm8uY29uZmlkZW5jZS5lbmNvZGluZyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbGVJbmZvO1xufTtcbiIsICJjb25zdCBieXRlT3JkZXJNYXJrcyA9IHJlcXVpcmUoXCIuLi9jb25maWcvYnl0ZU9yZGVyTWFya09iamVjdC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAodUludDhTdGFydCkgPT4ge1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYnl0ZU9yZGVyTWFya3MpIHtcbiAgICBpZiAoZWxlbWVudC5yZWdleC50ZXN0KHVJbnQ4U3RhcnQpKSByZXR1cm4gZWxlbWVudC5lbmNvZGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcbiIsICJjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IGNoZWNrVVRGID0gcmVxdWlyZShcIi4vY29tcG9uZW50cy9jaGVja1VURi5qc1wiKTtcbmNvbnN0IHByb2Nlc3NDb250ZW50ID0gcmVxdWlyZShcIi4vY29tcG9uZW50cy9wcm9jZXNzQ29udGVudC5qc1wiKTtcbmNvbnN0IGNoZWNrQnl0ZU9yZGVyTWFyayA9IHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvY2hlY2tCeXRlT3JkZXJNYXJrLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmaWxlUGF0aCkgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBpc0VtcHR5ID0gdHJ1ZTtcbiAgICBjb25zdCBmaWxlSW5mbyA9IHtcbiAgICAgIGVuY29kaW5nOiBudWxsLFxuICAgICAgbGFuZ3VhZ2U6IG51bGwsXG4gICAgICBjb25maWRlbmNlOiB7XG4gICAgICAgIGVuY29kaW5nOiBudWxsLFxuICAgICAgICBsYW5ndWFnZTogbnVsbCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBkYXRhID0ge307XG5cbiAgICAvLyBSZWFkaW5nIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIGFuZCBjaGVja2luZyBpZiB0aGV5IGNvaW5jaWRlIHdpdGggb25lIG9mIHRoZSBwcmVkZWZpbmVkIGJ5dGUgb3JkZXIgbWFya3MuXG4gICAgY29uc3QgcmVhZFN0cmVhbSA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZmlsZVBhdGgsIHsgc3RhcnQ6IDAsIGVuZDogMyB9KTtcblxuICAgIHJlYWRTdHJlYW0ub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAgIGlzRW1wdHkgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHVJbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgY29uc3QgdUludDhTdHJpbmcgPSB1SW50OEFycmF5LmpvaW4oXCIgXCIpO1xuICAgICAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IGNoZWNrQnl0ZU9yZGVyTWFyayh1SW50OFN0cmluZyk7XG5cbiAgICAgIGlmIChieXRlT3JkZXJNYXJrKSB7XG4gICAgICAgIGZpbGVJbmZvLmVuY29kaW5nID0gYnl0ZU9yZGVyTWFyaztcbiAgICAgICAgZmlsZUluZm8uY29uZmlkZW5jZS5lbmNvZGluZyA9IDE7XG5cbiAgICAgICAgLy8gTm9kZS5qcyBvbmx5IHN1cHBvcnRzIFVURi04IGFuZCBVVEYtMTZMRS4gSWYgb25lIG9mIHRoZW0gaGFzIGJlZW4gZGV0ZWN0ZWQsIHdlIGtub3cgaG93IHRvIHJlYWQgdGhlIGNvbnRlbnRcbiAgICAgICAgaWYgKGZpbGVJbmZvLmVuY29kaW5nID09PSBcIlVURi04XCIgfHwgZmlsZUluZm8uZW5jb2RpbmcgPT09IFwiVVRGLTE2TEVcIikge1xuICAgICAgICAgIGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBmaWxlSW5mby5lbmNvZGluZywgKGVyciwgdXRmQ29udGVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikgcmVqZWN0KGVycik7XG4gICAgICAgICAgICBkYXRhLmNvbnRlbnQgPSB1dGZDb250ZW50O1xuICAgICAgICAgICAgcmVzb2x2ZShwcm9jZXNzQ29udGVudChkYXRhLCBmaWxlSW5mbykpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gSWYgdGhlIGVuY29kaW5nIGluIHRoZSBieXRlT3JkZXJNYXJrT2JqZWN0IGlzIG5vdCBVVEYtOCBvciBVVEYtMTZMRSB3ZSByZXR1cm4gdGhlIGVuY29kaW5nIHdpdGhvdXQgdGhlIGxhbmd1YWdlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGZpbGVJbmZvLmVuY29kaW5nID09PSBcIkdCLTE4MDMwXCIpIHtcbiAgICAgICAgICAgIGZpbGVJbmZvLmxhbmd1YWdlID0gXCJjaGluZXNlLXNpbXBsaWZpZWRcIjtcbiAgICAgICAgICAgIGZpbGVJbmZvLmNvbmZpZGVuY2UubGFuZ3VhZ2UgPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGZpbGVJbmZvKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnMucmVhZEZpbGUoZmlsZVBhdGgsIFwiVVRGLThcIiwgKGVyciwgdXRmQ29udGVudCkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpO1xuXG4gICAgICAgICAgY29uc3QgdXRmOCA9IGNoZWNrVVRGKHV0ZkNvbnRlbnQpO1xuXG4gICAgICAgICAgaWYgKHV0ZjgpIHtcbiAgICAgICAgICAgIGZpbGVJbmZvLmVuY29kaW5nID0gXCJVVEYtOFwiO1xuICAgICAgICAgICAgZmlsZUluZm8uY29uZmlkZW5jZS5lbmNvZGluZyA9IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHV0ZjgpIHtcbiAgICAgICAgICAgIGRhdGEuY29udGVudCA9IHV0ZkNvbnRlbnQ7XG4gICAgICAgICAgICByZXNvbHZlKHByb2Nlc3NDb250ZW50KGRhdGEsIGZpbGVJbmZvKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcImxhdGluMVwiLCAoZXJyLCBpc29Db250ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpO1xuXG4gICAgICAgICAgICAgIGRhdGEuY29udGVudCA9IGlzb0NvbnRlbnQ7XG4gICAgICAgICAgICAgIHJlc29sdmUocHJvY2Vzc0NvbnRlbnQoZGF0YSwgZmlsZUluZm8pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVhZFN0cmVhbS5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZihpc0VtcHR5KSByZXNvbHZlKGZpbGVJbmZvKVxuICAgIH0pXG4gICAgLy8gVGhpcyBjYXRjaGVzIGFueSBlcnJvcnMgdGhhdCBoYXBwZW4gd2hpbGUgY3JlYXRpbmcgdGhlIHJlYWRhYmxlIHN0cmVhbSAodXN1YWxseSBpbnZhbGlkIG5hbWVzKVxuICAgIHJlYWRTdHJlYW0ub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgaWYgd2UncmUgcmVxdWlyZWQgdG8gYWRkIGEgcG9ydCBudW1iZXIuXG4gKlxuICogQHNlZSBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RlZmF1bHQtcG9ydFxuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBwb3J0IFBvcnQgbnVtYmVyIHdlIG5lZWQgdG8gY2hlY2tcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm90b2NvbCBQcm90b2NvbCB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gSXMgaXQgYSBkZWZhdWx0IHBvcnQgZm9yIHRoZSBnaXZlbiBwcm90b2NvbFxuICogQGFwaSBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVxdWlyZWQocG9ydCwgcHJvdG9jb2wpIHtcbiAgcHJvdG9jb2wgPSBwcm90b2NvbC5zcGxpdCgnOicpWzBdO1xuICBwb3J0ID0gK3BvcnQ7XG5cbiAgaWYgKCFwb3J0KSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChwcm90b2NvbCkge1xuICAgIGNhc2UgJ2h0dHAnOlxuICAgIGNhc2UgJ3dzJzpcbiAgICByZXR1cm4gcG9ydCAhPT0gODA7XG5cbiAgICBjYXNlICdodHRwcyc6XG4gICAgY2FzZSAnd3NzJzpcbiAgICByZXR1cm4gcG9ydCAhPT0gNDQzO1xuXG4gICAgY2FzZSAnZnRwJzpcbiAgICByZXR1cm4gcG9ydCAhPT0gMjE7XG5cbiAgICBjYXNlICdnb3BoZXInOlxuICAgIHJldHVybiBwb3J0ICE9PSA3MDtcblxuICAgIGNhc2UgJ2ZpbGUnOlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBwb3J0ICE9PSAwO1xufTtcbiIsICJ2YXIgY29tbW9uICAgPSBleHBvcnRzLFxuICAgIHVybCAgICAgID0gcmVxdWlyZSgndXJsJyksXG4gICAgZXh0ZW5kICAgPSByZXF1aXJlKCd1dGlsJykuX2V4dGVuZCxcbiAgICByZXF1aXJlZCA9IHJlcXVpcmUoJ3JlcXVpcmVzLXBvcnQnKTtcblxudmFyIHVwZ3JhZGVIZWFkZXIgPSAvKF58LClcXHMqdXBncmFkZVxccyooJHwsKS9pLFxuICAgIGlzU1NMID0gL15odHRwc3x3c3MvO1xuXG4vKipcbiAqIFNpbXBsZSBSZWdleCBmb3IgdGVzdGluZyBpZiBwcm90b2NvbCBpcyBodHRwc1xuICovXG5jb21tb24uaXNTU0wgPSBpc1NTTDtcbi8qKlxuICogQ29waWVzIHRoZSByaWdodCBoZWFkZXJzIGZyb20gYG9wdGlvbnNgIGFuZCBgcmVxYCB0b1xuICogYG91dGdvaW5nYCB3aGljaCBpcyB0aGVuIHVzZWQgdG8gZmlyZSB0aGUgcHJveGllZFxuICogcmVxdWVzdC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICBjb21tb24uc2V0dXBPdXRnb2luZyhvdXRnb2luZywgb3B0aW9ucywgcmVxKVxuICogICAgLy8gPT4geyBob3N0OiAuLi4sIGhvc3RuYW1lOiAuLi59XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IE91dGdvaW5nIEJhc2Ugb2JqZWN0IHRvIGJlIGZpbGxlZCB3aXRoIHJlcXVpcmVkIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIENvbmZpZyBvYmplY3QgcGFzc2VkIHRvIHRoZSBwcm94eVxuICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBPYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBGb3J3YXJkIFN0cmluZyB0byBzZWxlY3QgZm9yd2FyZCBvciB0YXJnZXRcbiAqXHUwMEEwXG4gKiBAcmV0dXJuIHtPYmplY3R9IE91dGdvaW5nIE9iamVjdCB3aXRoIGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIHNldFxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmNvbW1vbi5zZXR1cE91dGdvaW5nID0gZnVuY3Rpb24ob3V0Z29pbmcsIG9wdGlvbnMsIHJlcSwgZm9yd2FyZCkge1xuICBvdXRnb2luZy5wb3J0ID0gb3B0aW9uc1tmb3J3YXJkIHx8ICd0YXJnZXQnXS5wb3J0IHx8XG4gICAgICAgICAgICAgICAgICAoaXNTU0wudGVzdChvcHRpb25zW2ZvcndhcmQgfHwgJ3RhcmdldCddLnByb3RvY29sKSA/IDQ0MyA6IDgwKTtcblxuICBbJ2hvc3QnLCAnaG9zdG5hbWUnLCAnc29ja2V0UGF0aCcsICdwZngnLCAna2V5JyxcbiAgICAncGFzc3BocmFzZScsICdjZXJ0JywgJ2NhJywgJ2NpcGhlcnMnLCAnc2VjdXJlUHJvdG9jb2wnXS5mb3JFYWNoKFxuICAgIGZ1bmN0aW9uKGUpIHsgb3V0Z29pbmdbZV0gPSBvcHRpb25zW2ZvcndhcmQgfHwgJ3RhcmdldCddW2VdOyB9XG4gICk7XG5cbiAgb3V0Z29pbmcubWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgcmVxLm1ldGhvZDtcbiAgb3V0Z29pbmcuaGVhZGVycyA9IGV4dGVuZCh7fSwgcmVxLmhlYWRlcnMpO1xuXG4gIGlmIChvcHRpb25zLmhlYWRlcnMpe1xuICAgIGV4dGVuZChvdXRnb2luZy5oZWFkZXJzLCBvcHRpb25zLmhlYWRlcnMpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgIG91dGdvaW5nLmF1dGggPSBvcHRpb25zLmF1dGg7XG4gIH1cbiAgXG4gIGlmIChvcHRpb25zLmNhKSB7XG4gICAgICBvdXRnb2luZy5jYSA9IG9wdGlvbnMuY2E7XG4gIH1cblxuICBpZiAoaXNTU0wudGVzdChvcHRpb25zW2ZvcndhcmQgfHwgJ3RhcmdldCddLnByb3RvY29sKSkge1xuICAgIG91dGdvaW5nLnJlamVjdFVuYXV0aG9yaXplZCA9ICh0eXBlb2Ygb3B0aW9ucy5zZWN1cmUgPT09IFwidW5kZWZpbmVkXCIpID8gdHJ1ZSA6IG9wdGlvbnMuc2VjdXJlO1xuICB9XG5cblxuICBvdXRnb2luZy5hZ2VudCA9IG9wdGlvbnMuYWdlbnQgfHwgZmFsc2U7XG4gIG91dGdvaW5nLmxvY2FsQWRkcmVzcyA9IG9wdGlvbnMubG9jYWxBZGRyZXNzO1xuXG4gIC8vXG4gIC8vIFJlbWFyazogSWYgd2UgYXJlIGZhbHNlIGFuZCBub3QgdXBncmFkaW5nLCBzZXQgdGhlIGNvbm5lY3Rpb246IGNsb3NlLiBUaGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkb1xuICAvLyBhcyBub2RlIGNvcmUgZG9lc24ndCBoYW5kbGUgdGhpcyBDT01QTEVURUxZIHByb3Blcmx5IHlldC5cbiAgLy9cbiAgaWYgKCFvdXRnb2luZy5hZ2VudCkge1xuICAgIG91dGdvaW5nLmhlYWRlcnMgPSBvdXRnb2luZy5oZWFkZXJzIHx8IHt9O1xuICAgIGlmICh0eXBlb2Ygb3V0Z29pbmcuaGVhZGVycy5jb25uZWN0aW9uICE9PSAnc3RyaW5nJ1xuICAgICAgICB8fCAhdXBncmFkZUhlYWRlci50ZXN0KG91dGdvaW5nLmhlYWRlcnMuY29ubmVjdGlvbilcbiAgICAgICApIHsgb3V0Z29pbmcuaGVhZGVycy5jb25uZWN0aW9uID0gJ2Nsb3NlJzsgfVxuICB9XG5cblxuICAvLyB0aGUgZmluYWwgcGF0aCBpcyB0YXJnZXQgcGF0aCArIHJlbGF0aXZlIHBhdGggcmVxdWVzdGVkIGJ5IHVzZXI6XG4gIHZhciB0YXJnZXQgPSBvcHRpb25zW2ZvcndhcmQgfHwgJ3RhcmdldCddO1xuICB2YXIgdGFyZ2V0UGF0aCA9IHRhcmdldCAmJiBvcHRpb25zLnByZXBlbmRQYXRoICE9PSBmYWxzZVxuICAgID8gKHRhcmdldC5wYXRoIHx8ICcnKVxuICAgIDogJyc7XG5cbiAgLy9cbiAgLy8gUmVtYXJrOiBDYW4gd2Ugc29tZWhvdyBub3QgdXNlIHVybC5wYXJzZSBhcyBhIHBlcmYgb3B0aW1pemF0aW9uP1xuICAvL1xuICB2YXIgb3V0Z29pbmdQYXRoID0gIW9wdGlvbnMudG9Qcm94eVxuICAgID8gKHVybC5wYXJzZShyZXEudXJsKS5wYXRoIHx8ICcnKVxuICAgIDogcmVxLnVybDtcblxuICAvL1xuICAvLyBSZW1hcms6IGlnbm9yZVBhdGggd2lsbCBqdXN0IHN0cmFpZ2h0IHVwIGlnbm9yZSB3aGF0ZXZlciB0aGUgcmVxdWVzdCdzXG4gIC8vIHBhdGggaXMuIFRoaXMgY2FuIGJlIGxhYmVsZWQgYXMgRk9PVC1HVU4gbWF0ZXJpYWwgaWYgeW91IGRvIG5vdCBrbm93IHdoYXRcbiAgLy8geW91IGFyZSBkb2luZyBhbmQgYXJlIHVzaW5nIGNvbmZsaWN0aW5nIG9wdGlvbnMuXG4gIC8vXG4gIG91dGdvaW5nUGF0aCA9ICFvcHRpb25zLmlnbm9yZVBhdGggPyBvdXRnb2luZ1BhdGggOiAnJztcblxuICBvdXRnb2luZy5wYXRoID0gY29tbW9uLnVybEpvaW4odGFyZ2V0UGF0aCwgb3V0Z29pbmdQYXRoKTtcblxuICBpZiAob3B0aW9ucy5jaGFuZ2VPcmlnaW4pIHtcbiAgICBvdXRnb2luZy5oZWFkZXJzLmhvc3QgPVxuICAgICAgcmVxdWlyZWQob3V0Z29pbmcucG9ydCwgb3B0aW9uc1tmb3J3YXJkIHx8ICd0YXJnZXQnXS5wcm90b2NvbCkgJiYgIWhhc1BvcnQob3V0Z29pbmcuaG9zdClcbiAgICAgICAgPyBvdXRnb2luZy5ob3N0ICsgJzonICsgb3V0Z29pbmcucG9ydFxuICAgICAgICA6IG91dGdvaW5nLmhvc3Q7XG4gIH1cbiAgcmV0dXJuIG91dGdvaW5nO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHByb3BlciBjb25maWd1cmF0aW9uIGZvciBzb2NrZXRzLFxuICogc2V0IG5vIGRlbGF5IGFuZCBzZXQga2VlcCBhbGl2ZSwgYWxzbyBzZXRcbiAqIHRoZSB0aW1lb3V0IHRvIDAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgY29tbW9uLnNldHVwU29ja2V0KHNvY2tldClcbiAqICAgIC8vID0+IFNvY2tldFxuICpcbiAqIEBwYXJhbSB7U29ja2V0fSBTb2NrZXQgaW5zdGFuY2UgdG8gc2V0dXBcbiAqXHUwMEEwXG4gKiBAcmV0dXJuIHtTb2NrZXR9IFJldHVybiB0aGUgY29uZmlndXJlZCBzb2NrZXQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuY29tbW9uLnNldHVwU29ja2V0ID0gZnVuY3Rpb24oc29ja2V0KSB7XG4gIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICBzb2NrZXQuc2V0Tm9EZWxheSh0cnVlKTtcblxuICBzb2NrZXQuc2V0S2VlcEFsaXZlKHRydWUsIDApO1xuXG4gIHJldHVybiBzb2NrZXQ7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcG9ydCBudW1iZXIgZnJvbSB0aGUgaG9zdC4gT3IgZ3Vlc3MgaXQgYmFzZWQgb24gdGhlIGNvbm5lY3Rpb24gdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlcXVlc3R9IHJlcSBJbmNvbWluZyBIVFRQIHJlcXVlc3QuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSBUaGUgcG9ydCBudW1iZXIuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cbmNvbW1vbi5nZXRQb3J0ID0gZnVuY3Rpb24ocmVxKSB7XG4gIHZhciByZXMgPSByZXEuaGVhZGVycy5ob3N0ID8gcmVxLmhlYWRlcnMuaG9zdC5tYXRjaCgvOihcXGQrKS8pIDogJyc7XG5cbiAgcmV0dXJuIHJlcyA/XG4gICAgcmVzWzFdIDpcbiAgICBjb21tb24uaGFzRW5jcnlwdGVkQ29ubmVjdGlvbihyZXEpID8gJzQ0MycgOiAnODAnO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBoYXMgYW4gZW5jcnlwdGVkIGNvbm5lY3Rpb24uXG4gKlxuICogQHBhcmFtIHtSZXF1ZXN0fSByZXEgSW5jb21pbmcgSFRUUCByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgZW5jcnlwdGVkIG9yIG5vdC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuY29tbW9uLmhhc0VuY3J5cHRlZENvbm5lY3Rpb24gPSBmdW5jdGlvbihyZXEpIHtcbiAgcmV0dXJuIEJvb2xlYW4ocmVxLmNvbm5lY3Rpb24uZW5jcnlwdGVkIHx8IHJlcS5jb25uZWN0aW9uLnBhaXIpO1xufTtcblxuLyoqXG4gKiBPUy1hZ25vc3RpYyBqb2luIChkb2Vzbid0IGJyZWFrIG9uIFVSTHMgbGlrZSBwYXRoLmpvaW4gZG9lcyBvbiBXaW5kb3dzKT5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBnZW5lcmF0ZWQgcGF0aC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5jb21tb24udXJsSm9pbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vXG4gICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gbWVzcyB3aXRoIHRoZSBxdWVyeSBzdHJpbmcuIEFsbCB3ZSB3YW50IHRvIHRvdWNoIGlzIHRoZSBwYXRoLlxuICAgIC8vXG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxcbiAgICAgIGxhc3RJbmRleCA9IGFyZ3MubGVuZ3RoIC0gMSxcbiAgICAgIGxhc3QgPSBhcmdzW2xhc3RJbmRleF0sXG4gICAgICBsYXN0U2VncyA9IGxhc3Quc3BsaXQoJz8nKSxcbiAgICAgIHJldFNlZ3M7XG5cbiAgYXJnc1tsYXN0SW5kZXhdID0gbGFzdFNlZ3Muc2hpZnQoKTtcblxuICAvL1xuICAvLyBKb2luIGFsbCBzdHJpbmdzLCBidXQgcmVtb3ZlIGVtcHR5IHN0cmluZ3Mgc28gd2UgZG9uJ3QgZ2V0IGV4dHJhIHNsYXNoZXMgZnJvbVxuICAvLyBqb2luaW5nIGUuZy4gWycnLCAnYW0nXVxuICAvL1xuICByZXRTZWdzID0gW1xuICAgIGFyZ3MuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy8nKVxuICAgICAgICAucmVwbGFjZSgvXFwvKy9nLCAnLycpXG4gICAgICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJylcbiAgXTtcblxuICAvLyBPbmx5IGpvaW4gdGhlIHF1ZXJ5IHN0cmluZyBpZiBpdCBleGlzdHMgc28gd2UgZG9uJ3QgaGF2ZSB0cmFpbGluZyBhICc/J1xuICAvLyBvbiBldmVyeSByZXF1ZXN0XG5cbiAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgPyBpbiB0aGUgVVJMLlxuICByZXRTZWdzLnB1c2guYXBwbHkocmV0U2VncywgbGFzdFNlZ3MpO1xuXG4gIHJldHVybiByZXRTZWdzLmpvaW4oJz8nKVxufTtcblxuLyoqXG4gKiBSZXdyaXRlcyBvciByZW1vdmVzIHRoZSBkb21haW4gb2YgYSBjb29raWUgaGVhZGVyXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IEhlYWRlclxuICogQHBhcmFtIHtPYmplY3R9IENvbmZpZywgbWFwcGluZyBvZiBkb21haW4gdG8gcmV3cml0dGVuIGRvbWFpbi5cbiAqICAgICAgICAgICAgICAgICAnKicga2V5IHRvIG1hdGNoIGFueSBkb21haW4sIG51bGwgdmFsdWUgdG8gcmVtb3ZlIHRoZSBkb21haW4uXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cbmNvbW1vbi5yZXdyaXRlQ29va2llUHJvcGVydHkgPSBmdW5jdGlvbiByZXdyaXRlQ29va2llUHJvcGVydHkoaGVhZGVyLCBjb25maWcsIHByb3BlcnR5KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcikpIHtcbiAgICByZXR1cm4gaGVhZGVyLm1hcChmdW5jdGlvbiAoaGVhZGVyRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHJld3JpdGVDb29raWVQcm9wZXJ0eShoZWFkZXJFbGVtZW50LCBjb25maWcsIHByb3BlcnR5KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaGVhZGVyLnJlcGxhY2UobmV3IFJlZ0V4cChcIig7XFxcXHMqXCIgKyBwcm9wZXJ0eSArIFwiPSkoW147XSspXCIsICdpJyksIGZ1bmN0aW9uKG1hdGNoLCBwcmVmaXgsIHByZXZpb3VzVmFsdWUpIHtcbiAgICB2YXIgbmV3VmFsdWU7XG4gICAgaWYgKHByZXZpb3VzVmFsdWUgaW4gY29uZmlnKSB7XG4gICAgICBuZXdWYWx1ZSA9IGNvbmZpZ1twcmV2aW91c1ZhbHVlXTtcbiAgICB9IGVsc2UgaWYgKCcqJyBpbiBjb25maWcpIHtcbiAgICAgIG5ld1ZhbHVlID0gY29uZmlnWycqJ107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vbm8gbWF0Y2gsIHJldHVybiBwcmV2aW91cyB2YWx1ZVxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgIC8vcmVwbGFjZSB2YWx1ZVxuICAgICAgcmV0dXJuIHByZWZpeCArIG5ld1ZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL3JlbW92ZSB2YWx1ZVxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBob3N0IGFuZCBzZWUgaWYgaXQgcG90ZW50aWFsbHkgaGFzIGEgcG9ydCBpbiBpdCAoa2VlcCBpdCBzaW1wbGUpXG4gKlxuICogQHJldHVybnMge0Jvb2xlYW59IFdoZXRoZXIgd2UgaGF2ZSBvbmUgb3Igbm90XG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGhhc1BvcnQoaG9zdCkge1xuICByZXR1cm4gISF+aG9zdC5pbmRleE9mKCc6Jyk7XG59O1xuIiwgInZhciB1cmwgICAgPSByZXF1aXJlKCd1cmwnKSxcbiAgICBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcblxuXG52YXIgcmVkaXJlY3RSZWdleCA9IC9eMjAxfDMwKDF8Mnw3fDgpJC87XG5cbi8qIVxuICogQXJyYXkgb2YgcGFzc2VzLlxuICpcbiAqIEEgYHBhc3NgIGlzIGp1c3QgYSBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIG9uIGByZXEsIHJlcywgb3B0aW9uc2BcbiAqIHNvIHRoYXQgeW91IGNhbiBlYXNpbHkgYWRkIG5ldyBjaGVja3Mgd2hpbGUgc3RpbGwga2VlcGluZyB0aGUgYmFzZVxuICogZmxleGlibGUuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7IC8vIDwtLVxuXG4gIC8qKlxuICAgKiBJZiBpcyBhIEhUVFAgMS4wIHJlcXVlc3QsIHJlbW92ZSBjaHVuayBoZWFkZXJzXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtwcm94eVJlc3BvbnNlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0IGZyb20gdGhlIHByb3h5IHJlcXVlc3RcbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuICByZW1vdmVDaHVua2VkOiBmdW5jdGlvbiByZW1vdmVDaHVua2VkKHJlcSwgcmVzLCBwcm94eVJlcykge1xuICAgIGlmIChyZXEuaHR0cFZlcnNpb24gPT09ICcxLjAnKSB7XG4gICAgICBkZWxldGUgcHJveHlSZXMuaGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIElmIGlzIGEgSFRUUCAxLjAgcmVxdWVzdCwgc2V0IHRoZSBjb3JyZWN0IGNvbm5lY3Rpb24gaGVhZGVyXG4gICAqIG9yIGlmIGNvbm5lY3Rpb24gaGVhZGVyIG5vdCBwcmVzZW50LCB0aGVuIHVzZSBga2VlcC1hbGl2ZWBcbiAgICpcbiAgICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBvYmplY3RcbiAgICpcdTAwQTBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gUmVzIFJlc3BvbnNlIG9iamVjdFxuICAgKiBAcGFyYW0ge3Byb3h5UmVzcG9uc2V9IFJlcyBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcHJveHkgcmVxdWVzdFxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIHNldENvbm5lY3Rpb246IGZ1bmN0aW9uIHNldENvbm5lY3Rpb24ocmVxLCByZXMsIHByb3h5UmVzKSB7XG4gICAgaWYgKHJlcS5odHRwVmVyc2lvbiA9PT0gJzEuMCcpIHtcbiAgICAgIHByb3h5UmVzLmhlYWRlcnMuY29ubmVjdGlvbiA9IHJlcS5oZWFkZXJzLmNvbm5lY3Rpb24gfHwgJ2Nsb3NlJztcbiAgICB9IGVsc2UgaWYgKHJlcS5odHRwVmVyc2lvbiAhPT0gJzIuMCcgJiYgIXByb3h5UmVzLmhlYWRlcnMuY29ubmVjdGlvbikge1xuICAgICAgcHJveHlSZXMuaGVhZGVycy5jb25uZWN0aW9uID0gcmVxLmhlYWRlcnMuY29ubmVjdGlvbiB8fCAna2VlcC1hbGl2ZSc7XG4gICAgfVxuICB9LFxuXG4gIHNldFJlZGlyZWN0SG9zdFJld3JpdGU6IGZ1bmN0aW9uIHNldFJlZGlyZWN0SG9zdFJld3JpdGUocmVxLCByZXMsIHByb3h5UmVzLCBvcHRpb25zKSB7XG4gICAgaWYgKChvcHRpb25zLmhvc3RSZXdyaXRlIHx8IG9wdGlvbnMuYXV0b1Jld3JpdGUgfHwgb3B0aW9ucy5wcm90b2NvbFJld3JpdGUpXG4gICAgICAgICYmIHByb3h5UmVzLmhlYWRlcnNbJ2xvY2F0aW9uJ11cbiAgICAgICAgJiYgcmVkaXJlY3RSZWdleC50ZXN0KHByb3h5UmVzLnN0YXR1c0NvZGUpKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gdXJsLnBhcnNlKG9wdGlvbnMudGFyZ2V0KTtcbiAgICAgIHZhciB1ID0gdXJsLnBhcnNlKHByb3h5UmVzLmhlYWRlcnNbJ2xvY2F0aW9uJ10pO1xuXG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIHJlZGlyZWN0ZWQgaG9zdCBtYXRjaGVzIHRoZSB0YXJnZXQgaG9zdCBiZWZvcmUgcmV3cml0aW5nXG4gICAgICBpZiAodGFyZ2V0Lmhvc3QgIT0gdS5ob3N0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuaG9zdFJld3JpdGUpIHtcbiAgICAgICAgdS5ob3N0ID0gb3B0aW9ucy5ob3N0UmV3cml0ZTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5hdXRvUmV3cml0ZSkge1xuICAgICAgICB1Lmhvc3QgPSByZXEuaGVhZGVyc1snaG9zdCddO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMucHJvdG9jb2xSZXdyaXRlKSB7XG4gICAgICAgIHUucHJvdG9jb2wgPSBvcHRpb25zLnByb3RvY29sUmV3cml0ZTtcbiAgICAgIH1cblxuICAgICAgcHJveHlSZXMuaGVhZGVyc1snbG9jYXRpb24nXSA9IHUuZm9ybWF0KCk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogQ29weSBoZWFkZXJzIGZyb20gcHJveHlSZXNwb25zZSB0byByZXNwb25zZVxuICAgKiBzZXQgZWFjaCBoZWFkZXIgaW4gcmVzcG9uc2Ugb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7SW5jb21pbmdNZXNzYWdlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7cHJveHlSZXNwb25zZX0gUmVzIFJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSBwcm94eSByZXF1ZXN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIG9wdGlvbnMuY29va2llRG9tYWluUmV3cml0ZTogQ29uZmlnIHRvIHJld3JpdGUgY29va2llIGRvbWFpblxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIHdyaXRlSGVhZGVyczogZnVuY3Rpb24gd3JpdGVIZWFkZXJzKHJlcSwgcmVzLCBwcm94eVJlcywgb3B0aW9ucykge1xuICAgIHZhciByZXdyaXRlQ29va2llRG9tYWluQ29uZmlnID0gb3B0aW9ucy5jb29raWVEb21haW5SZXdyaXRlLFxuICAgICAgICByZXdyaXRlQ29va2llUGF0aENvbmZpZyA9IG9wdGlvbnMuY29va2llUGF0aFJld3JpdGUsXG4gICAgICAgIHByZXNlcnZlSGVhZGVyS2V5Q2FzZSA9IG9wdGlvbnMucHJlc2VydmVIZWFkZXJLZXlDYXNlLFxuICAgICAgICByYXdIZWFkZXJLZXlNYXAsXG4gICAgICAgIHNldEhlYWRlciA9IGZ1bmN0aW9uKGtleSwgaGVhZGVyKSB7XG4gICAgICAgICAgaWYgKGhlYWRlciA9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICBpZiAocmV3cml0ZUNvb2tpZURvbWFpbkNvbmZpZyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICAgICAgICBoZWFkZXIgPSBjb21tb24ucmV3cml0ZUNvb2tpZVByb3BlcnR5KGhlYWRlciwgcmV3cml0ZUNvb2tpZURvbWFpbkNvbmZpZywgJ2RvbWFpbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV3cml0ZUNvb2tpZVBhdGhDb25maWcgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICAgICAgaGVhZGVyID0gY29tbW9uLnJld3JpdGVDb29raWVQcm9wZXJ0eShoZWFkZXIsIHJld3JpdGVDb29raWVQYXRoQ29uZmlnLCAncGF0aCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMuc2V0SGVhZGVyKFN0cmluZyhrZXkpLnRyaW0oKSwgaGVhZGVyKTtcbiAgICAgICAgfTtcblxuICAgIGlmICh0eXBlb2YgcmV3cml0ZUNvb2tpZURvbWFpbkNvbmZpZyA9PT0gJ3N0cmluZycpIHsgLy9hbHNvIHRlc3QgZm9yICcnXG4gICAgICByZXdyaXRlQ29va2llRG9tYWluQ29uZmlnID0geyAnKic6IHJld3JpdGVDb29raWVEb21haW5Db25maWcgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJld3JpdGVDb29raWVQYXRoQ29uZmlnID09PSAnc3RyaW5nJykgeyAvL2Fsc28gdGVzdCBmb3IgJydcbiAgICAgIHJld3JpdGVDb29raWVQYXRoQ29uZmlnID0geyAnKic6IHJld3JpdGVDb29raWVQYXRoQ29uZmlnIH07XG4gICAgfVxuXG4gICAgLy8gbWVzc2FnZS5yYXdIZWFkZXJzIGlzIGFkZGVkIGluOiB2MC4xMS42XG4gICAgLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX3Jhd2hlYWRlcnNcbiAgICBpZiAocHJlc2VydmVIZWFkZXJLZXlDYXNlICYmIHByb3h5UmVzLnJhd0hlYWRlcnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICByYXdIZWFkZXJLZXlNYXAgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJveHlSZXMucmF3SGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICB2YXIga2V5ID0gcHJveHlSZXMucmF3SGVhZGVyc1tpXTtcbiAgICAgICAgcmF3SGVhZGVyS2V5TWFwW2tleS50b0xvd2VyQ2FzZSgpXSA9IGtleTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhwcm94eVJlcy5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgdmFyIGhlYWRlciA9IHByb3h5UmVzLmhlYWRlcnNba2V5XTtcbiAgICAgIGlmIChwcmVzZXJ2ZUhlYWRlcktleUNhc2UgJiYgcmF3SGVhZGVyS2V5TWFwKSB7XG4gICAgICAgIGtleSA9IHJhd0hlYWRlcktleU1hcFtrZXldIHx8IGtleTtcbiAgICAgIH1cbiAgICAgIHNldEhlYWRlcihrZXksIGhlYWRlcik7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc3RhdHVzQ29kZSBmcm9tIHRoZSBwcm94eVJlc3BvbnNlXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtwcm94eVJlc3BvbnNlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0IGZyb20gdGhlIHByb3h5IHJlcXVlc3RcbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuICB3cml0ZVN0YXR1c0NvZGU6IGZ1bmN0aW9uIHdyaXRlU3RhdHVzQ29kZShyZXEsIHJlcywgcHJveHlSZXMpIHtcbiAgICAvLyBGcm9tIE5vZGUuanMgZG9jczogcmVzcG9uc2Uud3JpdGVIZWFkKHN0YXR1c0NvZGVbLCBzdGF0dXNNZXNzYWdlXVssIGhlYWRlcnNdKVxuICAgIGlmKHByb3h5UmVzLnN0YXR1c01lc3NhZ2UpIHtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gcHJveHlSZXMuc3RhdHVzQ29kZTtcbiAgICAgIHJlcy5zdGF0dXNNZXNzYWdlID0gcHJveHlSZXMuc3RhdHVzTWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSBwcm94eVJlcy5zdGF0dXNDb2RlO1xuICAgIH1cbiAgfVxuXG59O1xuIiwgIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0bGV0IGVuYWJsZWRDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcblx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0aWYgKCFkZWJ1Zy5lbmFibGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VsZiA9IGRlYnVnO1xuXG5cdFx0XHQvLyBTZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdGNvbnN0IG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcblx0XHRcdHNlbGYuZGlmZiA9IG1zO1xuXHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRzZWxmLmN1cnIgPSBjdXJyO1xuXHRcdFx0cHJldlRpbWUgPSBjdXJyO1xuXG5cdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdC8vIEFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG5cdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgKG1hdGNoLCBmb3JtYXQpID0+IHtcblx0XHRcdFx0Ly8gSWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlciA9IGNyZWF0ZURlYnVnLmZvcm1hdHRlcnNbZm9ybWF0XTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHRcdFx0XHQvLyBOb3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG5cdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdGluZGV4LS07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG5cdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdGNvbnN0IGxvZ0ZuID0gc2VsZi5sb2cgfHwgY3JlYXRlRGVidWcubG9nO1xuXHRcdFx0bG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cdFx0fVxuXG5cdFx0ZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHRcdGRlYnVnLnVzZUNvbG9ycyA9IGNyZWF0ZURlYnVnLnVzZUNvbG9ycygpO1xuXHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRkZWJ1Zy5leHRlbmQgPSBleHRlbmQ7XG5cdFx0ZGVidWcuZGVzdHJveSA9IGNyZWF0ZURlYnVnLmRlc3Ryb3k7IC8vIFhYWCBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmIChlbmFibGVPdmVycmlkZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBlbmFibGVPdmVycmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobmFtZXNwYWNlc0NhY2hlICE9PSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0bmFtZXNwYWNlc0NhY2hlID0gY3JlYXRlRGVidWcubmFtZXNwYWNlcztcblx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZW5hYmxlZENhY2hlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogdiA9PiB7XG5cdFx0XHRcdGVuYWJsZU92ZXJyaWRlID0gdjtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG5cdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5pbml0KGRlYnVnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVidWc7XG5cdH1cblxuXHRmdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlLCBkZWxpbWl0ZXIpIHtcblx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0bmV3RGVidWcubG9nID0gdGhpcy5sb2c7XG5cdFx0cmV0dXJuIG5ld0RlYnVnO1xuXHR9XG5cblx0LyoqXG5cdCogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuXHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG5cdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcblxuXHRcdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdGxldCBpO1xuXHRcdGNvbnN0IHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcblx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmICghc3BsaXRbaV0pIHtcblx0XHRcdFx0Ly8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuXG5cdFx0XHRpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnNsaWNlKDEpICsgJyQnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuXHQqXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZGlzYWJsZSgpIHtcblx0XHRjb25zdCBuYW1lc3BhY2VzID0gW1xuXHRcdFx0Li4uY3JlYXRlRGVidWcubmFtZXMubWFwKHRvTmFtZXNwYWNlKSxcblx0XHRcdC4uLmNyZWF0ZURlYnVnLnNraXBzLm1hcCh0b05hbWVzcGFjZSkubWFwKG5hbWVzcGFjZSA9PiAnLScgKyBuYW1lc3BhY2UpXG5cdFx0XS5qb2luKCcsJyk7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlKCcnKTtcblx0XHRyZXR1cm4gbmFtZXNwYWNlcztcblx0fVxuXG5cdC8qKlxuXHQqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdCogQHJldHVybiB7Qm9vbGVhbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHRpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGxldCBpO1xuXHRcdGxldCBsZW47XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcubmFtZXNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0KiBDb252ZXJ0IHJlZ2V4cCB0byBuYW1lc3BhY2Vcblx0KlxuXHQqIEBwYXJhbSB7UmVnRXhwfSByZWd4ZXBcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiB0b05hbWVzcGFjZShyZWdleHApIHtcblx0XHRyZXR1cm4gcmVnZXhwLnRvU3RyaW5nKClcblx0XHRcdC5zdWJzdHJpbmcoMiwgcmVnZXhwLnRvU3RyaW5nKCkubGVuZ3RoIC0gMilcblx0XHRcdC5yZXBsYWNlKC9cXC5cXCpcXD8kLywgJyonKTtcblx0fVxuXG5cdC8qKlxuXHQqIENvZXJjZSBgdmFsYC5cblx0KlxuXHQqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuXHQqIEByZXR1cm4ge01peGVkfVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0aWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCogWFhYIERPIE5PVCBVU0UuIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3R1YiBmdW5jdGlvbi5cblx0KiBYWFggSXQgV0lMTCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cdCovXG5cdGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdH1cblxuXHRjcmVhdGVEZWJ1Zy5lbmFibGUoY3JlYXRlRGVidWcubG9hZCgpKTtcblxuXHRyZXR1cm4gY3JlYXRlRGVidWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dXA7XG4iLCAiLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gbG9jYWxzdG9yYWdlKCk7XG5leHBvcnRzLmRlc3Ryb3kgPSAoKCkgPT4ge1xuXHRsZXQgd2FybmVkID0gZmFsc2U7XG5cblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIXdhcm5lZCkge1xuXHRcdFx0d2FybmVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuXHQnIzAwMDBDQycsXG5cdCcjMDAwMEZGJyxcblx0JyMwMDMzQ0MnLFxuXHQnIzAwMzNGRicsXG5cdCcjMDA2NkNDJyxcblx0JyMwMDY2RkYnLFxuXHQnIzAwOTlDQycsXG5cdCcjMDA5OUZGJyxcblx0JyMwMENDMDAnLFxuXHQnIzAwQ0MzMycsXG5cdCcjMDBDQzY2Jyxcblx0JyMwMENDOTknLFxuXHQnIzAwQ0NDQycsXG5cdCcjMDBDQ0ZGJyxcblx0JyMzMzAwQ0MnLFxuXHQnIzMzMDBGRicsXG5cdCcjMzMzM0NDJyxcblx0JyMzMzMzRkYnLFxuXHQnIzMzNjZDQycsXG5cdCcjMzM2NkZGJyxcblx0JyMzMzk5Q0MnLFxuXHQnIzMzOTlGRicsXG5cdCcjMzNDQzAwJyxcblx0JyMzM0NDMzMnLFxuXHQnIzMzQ0M2NicsXG5cdCcjMzNDQzk5Jyxcblx0JyMzM0NDQ0MnLFxuXHQnIzMzQ0NGRicsXG5cdCcjNjYwMENDJyxcblx0JyM2NjAwRkYnLFxuXHQnIzY2MzNDQycsXG5cdCcjNjYzM0ZGJyxcblx0JyM2NkNDMDAnLFxuXHQnIzY2Q0MzMycsXG5cdCcjOTkwMENDJyxcblx0JyM5OTAwRkYnLFxuXHQnIzk5MzNDQycsXG5cdCcjOTkzM0ZGJyxcblx0JyM5OUNDMDAnLFxuXHQnIzk5Q0MzMycsXG5cdCcjQ0MwMDAwJyxcblx0JyNDQzAwMzMnLFxuXHQnI0NDMDA2NicsXG5cdCcjQ0MwMDk5Jyxcblx0JyNDQzAwQ0MnLFxuXHQnI0NDMDBGRicsXG5cdCcjQ0MzMzAwJyxcblx0JyNDQzMzMzMnLFxuXHQnI0NDMzM2NicsXG5cdCcjQ0MzMzk5Jyxcblx0JyNDQzMzQ0MnLFxuXHQnI0NDMzNGRicsXG5cdCcjQ0M2NjAwJyxcblx0JyNDQzY2MzMnLFxuXHQnI0NDOTkwMCcsXG5cdCcjQ0M5OTMzJyxcblx0JyNDQ0NDMDAnLFxuXHQnI0NDQ0MzMycsXG5cdCcjRkYwMDAwJyxcblx0JyNGRjAwMzMnLFxuXHQnI0ZGMDA2NicsXG5cdCcjRkYwMDk5Jyxcblx0JyNGRjAwQ0MnLFxuXHQnI0ZGMDBGRicsXG5cdCcjRkYzMzAwJyxcblx0JyNGRjMzMzMnLFxuXHQnI0ZGMzM2NicsXG5cdCcjRkYzMzk5Jyxcblx0JyNGRjMzQ0MnLFxuXHQnI0ZGMzNGRicsXG5cdCcjRkY2NjAwJyxcblx0JyNGRjY2MzMnLFxuXHQnI0ZGOTkwMCcsXG5cdCcjRkY5OTMzJyxcblx0JyNGRkNDMDAnLFxuXHQnI0ZGQ0MzMydcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0Ly8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuXHQvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuXHQvLyBleHBsaWNpdGx5XG5cdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiAod2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCB3aW5kb3cucHJvY2Vzcy5fX253anMpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG5cdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIElzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG5cdC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG5cdHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuXHRcdC8vIElzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcblx0XHQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuXHRcdC8vIElzIGZpcmVmb3ggPj0gdjMxP1xuXHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuXHRcdC8vIERvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRhcmdzWzBdID0gKHRoaXMudXNlQ29sb3JzID8gJyVjJyA6ICcnKSArXG5cdFx0dGhpcy5uYW1lc3BhY2UgK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKSArXG5cdFx0YXJnc1swXSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyVjICcgOiAnICcpICtcblx0XHQnKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG5cdGlmICghdGhpcy51c2VDb2xvcnMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcblx0YXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0Jyk7XG5cblx0Ly8gVGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcblx0Ly8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuXHQvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cblx0bGV0IGluZGV4ID0gMDtcblx0bGV0IGxhc3RDID0gMDtcblx0YXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIG1hdGNoID0+IHtcblx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aW5kZXgrKztcblx0XHRpZiAobWF0Y2ggPT09ICclYycpIHtcblx0XHRcdC8vIFdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuXHRcdFx0Ly8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcblx0XHRcdGxhc3RDID0gaW5kZXg7XG5cdFx0fVxuXHR9KTtcblxuXHRhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5kZWJ1ZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqIElmIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYXZhaWxhYmxlLCBmYWxscyBiYWNrXG4gKiB0byBgY29uc29sZS5sb2dgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydHMubG9nID0gY29uc29sZS5kZWJ1ZyB8fCBjb25zb2xlLmxvZyB8fCAoKCkgPT4ge30pO1xuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdHRyeSB7XG5cdFx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5zZXRJdGVtKCdkZWJ1ZycsIG5hbWVzcGFjZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcblx0XHR9XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdGxldCByO1xuXHR0cnkge1xuXHRcdHIgPSBleHBvcnRzLnN0b3JhZ2UuZ2V0SXRlbSgnZGVidWcnKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cblxuXHQvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG5cdGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuXHRcdHIgPSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxuXG5cdHJldHVybiByO1xufVxuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcblx0dHJ5IHtcblx0XHQvLyBUVk1MS2l0IChBcHBsZSBUViBKUyBSdW50aW1lKSBkb2VzIG5vdCBoYXZlIGEgd2luZG93IG9iamVjdCwganVzdCBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0XG5cdFx0Ly8gVGhlIEJyb3dzZXIgYWxzbyBoYXMgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dC5cblx0XHRyZXR1cm4gbG9jYWxTdG9yYWdlO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbiAodikge1xuXHR0cnkge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRyZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyb3IubWVzc2FnZTtcblx0fVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGZsYWcsIGFyZ3YgPSBwcm9jZXNzLmFyZ3YpID0+IHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgb3MgPSByZXF1aXJlKCdvcycpO1xuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCBoYXNGbGFnID0gcmVxdWlyZSgnaGFzLWZsYWcnKTtcblxuY29uc3Qge2Vudn0gPSBwcm9jZXNzO1xuXG5sZXQgZm9yY2VDb2xvcjtcbmlmIChoYXNGbGFnKCduby1jb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ25vLWNvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPWZhbHNlJykgfHxcblx0aGFzRmxhZygnY29sb3I9bmV2ZXInKSkge1xuXHRmb3JjZUNvbG9yID0gMDtcbn0gZWxzZSBpZiAoaGFzRmxhZygnY29sb3InKSB8fFxuXHRoYXNGbGFnKCdjb2xvcnMnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj10cnVlJykgfHxcblx0aGFzRmxhZygnY29sb3I9YWx3YXlzJykpIHtcblx0Zm9yY2VDb2xvciA9IDE7XG59XG5cbmlmICgnRk9SQ0VfQ09MT1InIGluIGVudikge1xuXHRpZiAoZW52LkZPUkNFX0NPTE9SID09PSAndHJ1ZScpIHtcblx0XHRmb3JjZUNvbG9yID0gMTtcblx0fSBlbHNlIGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICdmYWxzZScpIHtcblx0XHRmb3JjZUNvbG9yID0gMDtcblx0fSBlbHNlIHtcblx0XHRmb3JjZUNvbG9yID0gZW52LkZPUkNFX0NPTE9SLmxlbmd0aCA9PT0gMCA/IDEgOiBNYXRoLm1pbihwYXJzZUludChlbnYuRk9SQ0VfQ09MT1IsIDEwKSwgMyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpIHtcblx0aWYgKGxldmVsID09PSAwKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRsZXZlbCxcblx0XHRoYXNCYXNpYzogdHJ1ZSxcblx0XHRoYXMyNTY6IGxldmVsID49IDIsXG5cdFx0aGFzMTZtOiBsZXZlbCA+PSAzXG5cdH07XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzQ29sb3IoaGF2ZVN0cmVhbSwgc3RyZWFtSXNUVFkpIHtcblx0aWYgKGZvcmNlQ29sb3IgPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGlmIChoYXNGbGFnKCdjb2xvcj0xNm0nKSB8fFxuXHRcdGhhc0ZsYWcoJ2NvbG9yPWZ1bGwnKSB8fFxuXHRcdGhhc0ZsYWcoJ2NvbG9yPXRydWVjb2xvcicpKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoaGFzRmxhZygnY29sb3I9MjU2JykpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXG5cdGlmIChoYXZlU3RyZWFtICYmICFzdHJlYW1Jc1RUWSAmJiBmb3JjZUNvbG9yID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGNvbnN0IG1pbiA9IGZvcmNlQ29sb3IgfHwgMDtcblxuXHRpZiAoZW52LlRFUk0gPT09ICdkdW1iJykge1xuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTA1ODYgaXMgdGhlIGZpcnN0IFdpbmRvd3MgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDI1NiBjb2xvcnMuXG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxNDkzMSBpcyB0aGUgZmlyc3QgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDE2bS9UcnVlQ29sb3IuXG5cdFx0Y29uc3Qgb3NSZWxlYXNlID0gb3MucmVsZWFzZSgpLnNwbGl0KCcuJyk7XG5cdFx0aWYgKFxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVswXSkgPj0gMTAgJiZcblx0XHRcdE51bWJlcihvc1JlbGVhc2VbMl0pID49IDEwNTg2XG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTQ5MzEgPyAzIDogMjtcblx0XHR9XG5cblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ0knIGluIGVudikge1xuXHRcdGlmIChbJ1RSQVZJUycsICdDSVJDTEVDSScsICdBUFBWRVlPUicsICdHSVRMQUJfQ0knLCAnR0lUSFVCX0FDVElPTlMnLCAnQlVJTERLSVRFJ10uc29tZShzaWduID0+IHNpZ24gaW4gZW52KSB8fCBlbnYuQ0lfTkFNRSA9PT0gJ2NvZGVzaGlwJykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmICgnVEVBTUNJVFlfVkVSU0lPTicgaW4gZW52KSB7XG5cdFx0cmV0dXJuIC9eKDlcXC4oMCpbMS05XVxcZCopXFwufFxcZHsyLH1cXC4pLy50ZXN0KGVudi5URUFNQ0lUWV9WRVJTSU9OKSA/IDEgOiAwO1xuXHR9XG5cblx0aWYgKGVudi5DT0xPUlRFUk0gPT09ICd0cnVlY29sb3InKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoJ1RFUk1fUFJPR1JBTScgaW4gZW52KSB7XG5cdFx0Y29uc3QgdmVyc2lvbiA9IHBhcnNlSW50KChlbnYuVEVSTV9QUk9HUkFNX1ZFUlNJT04gfHwgJycpLnNwbGl0KCcuJylbMF0sIDEwKTtcblxuXHRcdHN3aXRjaCAoZW52LlRFUk1fUFJPR1JBTSkge1xuXHRcdFx0Y2FzZSAnaVRlcm0uYXBwJzpcblx0XHRcdFx0cmV0dXJuIHZlcnNpb24gPj0gMyA/IDMgOiAyO1xuXHRcdFx0Y2FzZSAnQXBwbGVfVGVybWluYWwnOlxuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdC8vIE5vIGRlZmF1bHRcblx0XHR9XG5cdH1cblxuXHRpZiAoLy0yNTYoY29sb3IpPyQvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKC9ec2NyZWVufF54dGVybXxednQxMDB8XnZ0MjIwfF5yeHZ0fGNvbG9yfGFuc2l8Y3lnd2lufGxpbnV4L2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ09MT1JURVJNJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdHJldHVybiBtaW47XG59XG5cbmZ1bmN0aW9uIGdldFN1cHBvcnRMZXZlbChzdHJlYW0pIHtcblx0Y29uc3QgbGV2ZWwgPSBzdXBwb3J0c0NvbG9yKHN0cmVhbSwgc3RyZWFtICYmIHN0cmVhbS5pc1RUWSk7XG5cdHJldHVybiB0cmFuc2xhdGVMZXZlbChsZXZlbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRzdXBwb3J0c0NvbG9yOiBnZXRTdXBwb3J0TGV2ZWwsXG5cdHN0ZG91dDogdHJhbnNsYXRlTGV2ZWwoc3VwcG9ydHNDb2xvcih0cnVlLCB0dHkuaXNhdHR5KDEpKSksXG5cdHN0ZGVycjogdHJhbnNsYXRlTGV2ZWwoc3VwcG9ydHNDb2xvcih0cnVlLCB0dHkuaXNhdHR5KDIpKSlcbn07XG4iLCAiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbmNvbnN0IHR0eSA9IHJlcXVpcmUoJ3R0eScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuZGVzdHJveSA9IHV0aWwuZGVwcmVjYXRlKFxuXHQoKSA9PiB7fSxcblx0J0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nXG4pO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFs2LCAyLCAzLCA0LCA1LCAxXTtcblxudHJ5IHtcblx0Ly8gT3B0aW9uYWwgZGVwZW5kZW5jeSAoYXMgaW4sIGRvZXNuJ3QgbmVlZCB0byBiZSBpbnN0YWxsZWQsIE5PVCBsaWtlIG9wdGlvbmFsRGVwZW5kZW5jaWVzIGluIHBhY2thZ2UuanNvbilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuXHRjb25zdCBzdXBwb3J0c0NvbG9yID0gcmVxdWlyZSgnc3VwcG9ydHMtY29sb3InKTtcblxuXHRpZiAoc3VwcG9ydHNDb2xvciAmJiAoc3VwcG9ydHNDb2xvci5zdGRlcnIgfHwgc3VwcG9ydHNDb2xvcikubGV2ZWwgPj0gMikge1xuXHRcdGV4cG9ydHMuY29sb3JzID0gW1xuXHRcdFx0MjAsXG5cdFx0XHQyMSxcblx0XHRcdDI2LFxuXHRcdFx0MjcsXG5cdFx0XHQzMixcblx0XHRcdDMzLFxuXHRcdFx0MzgsXG5cdFx0XHQzOSxcblx0XHRcdDQwLFxuXHRcdFx0NDEsXG5cdFx0XHQ0Mixcblx0XHRcdDQzLFxuXHRcdFx0NDQsXG5cdFx0XHQ0NSxcblx0XHRcdDU2LFxuXHRcdFx0NTcsXG5cdFx0XHQ2Mixcblx0XHRcdDYzLFxuXHRcdFx0NjgsXG5cdFx0XHQ2OSxcblx0XHRcdDc0LFxuXHRcdFx0NzUsXG5cdFx0XHQ3Nixcblx0XHRcdDc3LFxuXHRcdFx0NzgsXG5cdFx0XHQ3OSxcblx0XHRcdDgwLFxuXHRcdFx0ODEsXG5cdFx0XHQ5Mixcblx0XHRcdDkzLFxuXHRcdFx0OTgsXG5cdFx0XHQ5OSxcblx0XHRcdDExMixcblx0XHRcdDExMyxcblx0XHRcdDEyOCxcblx0XHRcdDEyOSxcblx0XHRcdDEzNCxcblx0XHRcdDEzNSxcblx0XHRcdDE0OCxcblx0XHRcdDE0OSxcblx0XHRcdDE2MCxcblx0XHRcdDE2MSxcblx0XHRcdDE2Mixcblx0XHRcdDE2Myxcblx0XHRcdDE2NCxcblx0XHRcdDE2NSxcblx0XHRcdDE2Nixcblx0XHRcdDE2Nyxcblx0XHRcdDE2OCxcblx0XHRcdDE2OSxcblx0XHRcdDE3MCxcblx0XHRcdDE3MSxcblx0XHRcdDE3Mixcblx0XHRcdDE3Myxcblx0XHRcdDE3OCxcblx0XHRcdDE3OSxcblx0XHRcdDE4NCxcblx0XHRcdDE4NSxcblx0XHRcdDE5Nixcblx0XHRcdDE5Nyxcblx0XHRcdDE5OCxcblx0XHRcdDE5OSxcblx0XHRcdDIwMCxcblx0XHRcdDIwMSxcblx0XHRcdDIwMixcblx0XHRcdDIwMyxcblx0XHRcdDIwNCxcblx0XHRcdDIwNSxcblx0XHRcdDIwNixcblx0XHRcdDIwNyxcblx0XHRcdDIwOCxcblx0XHRcdDIwOSxcblx0XHRcdDIxNCxcblx0XHRcdDIxNSxcblx0XHRcdDIyMCxcblx0XHRcdDIyMVxuXHRcdF07XG5cdH1cbn0gY2F0Y2ggKGVycm9yKSB7XG5cdC8vIFN3YWxsb3cgLSB3ZSBvbmx5IGNhcmUgaWYgYHN1cHBvcnRzLWNvbG9yYCBpcyBhdmFpbGFibGU7IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbn1cblxuLyoqXG4gKiBCdWlsZCB1cCB0aGUgZGVmYXVsdCBgaW5zcGVjdE9wdHNgIG9iamVjdCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogICAkIERFQlVHX0NPTE9SUz1ubyBERUJVR19ERVBUSD0xMCBERUJVR19TSE9XX0hJRERFTj1lbmFibGVkIG5vZGUgc2NyaXB0LmpzXG4gKi9cblxuZXhwb3J0cy5pbnNwZWN0T3B0cyA9IE9iamVjdC5rZXlzKHByb2Nlc3MuZW52KS5maWx0ZXIoa2V5ID0+IHtcblx0cmV0dXJuIC9eZGVidWdfL2kudGVzdChrZXkpO1xufSkucmVkdWNlKChvYmosIGtleSkgPT4ge1xuXHQvLyBDYW1lbC1jYXNlXG5cdGNvbnN0IHByb3AgPSBrZXlcblx0XHQuc3Vic3RyaW5nKDYpXG5cdFx0LnRvTG93ZXJDYXNlKClcblx0XHQucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGspID0+IHtcblx0XHRcdHJldHVybiBrLnRvVXBwZXJDYXNlKCk7XG5cdFx0fSk7XG5cblx0Ly8gQ29lcmNlIHN0cmluZyB2YWx1ZSBpbnRvIEpTIHZhbHVlXG5cdGxldCB2YWwgPSBwcm9jZXNzLmVudltrZXldO1xuXHRpZiAoL14oeWVzfG9ufHRydWV8ZW5hYmxlZCkkL2kudGVzdCh2YWwpKSB7XG5cdFx0dmFsID0gdHJ1ZTtcblx0fSBlbHNlIGlmICgvXihub3xvZmZ8ZmFsc2V8ZGlzYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IGZhbHNlO1xuXHR9IGVsc2UgaWYgKHZhbCA9PT0gJ251bGwnKSB7XG5cdFx0dmFsID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHR2YWwgPSBOdW1iZXIodmFsKTtcblx0fVxuXG5cdG9ialtwcm9wXSA9IHZhbDtcblx0cmV0dXJuIG9iajtcbn0sIHt9KTtcblxuLyoqXG4gKiBJcyBzdGRvdXQgYSBUVFk/IENvbG9yZWQgb3V0cHV0IGlzIGVuYWJsZWQgd2hlbiBgdHJ1ZWAuXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHRyZXR1cm4gJ2NvbG9ycycgaW4gZXhwb3J0cy5pbnNwZWN0T3B0cyA/XG5cdFx0Qm9vbGVhbihleHBvcnRzLmluc3BlY3RPcHRzLmNvbG9ycykgOlxuXHRcdHR0eS5pc2F0dHkocHJvY2Vzcy5zdGRlcnIuZmQpO1xufVxuXG4vKipcbiAqIEFkZHMgQU5TSSBjb2xvciBlc2NhcGUgY29kZXMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRjb25zdCB7bmFtZXNwYWNlOiBuYW1lLCB1c2VDb2xvcnN9ID0gdGhpcztcblxuXHRpZiAodXNlQ29sb3JzKSB7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY29sb3I7XG5cdFx0Y29uc3QgY29sb3JDb2RlID0gJ1xcdTAwMUJbMycgKyAoYyA8IDggPyBjIDogJzg7NTsnICsgYyk7XG5cdFx0Y29uc3QgcHJlZml4ID0gYCAgJHtjb2xvckNvZGV9OzFtJHtuYW1lfSBcXHUwMDFCWzBtYDtcblxuXHRcdGFyZ3NbMF0gPSBwcmVmaXggKyBhcmdzWzBdLnNwbGl0KCdcXG4nKS5qb2luKCdcXG4nICsgcHJlZml4KTtcblx0XHRhcmdzLnB1c2goY29sb3JDb2RlICsgJ20rJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZikgKyAnXFx1MDAxQlswbScpO1xuXHR9IGVsc2Uge1xuXHRcdGFyZ3NbMF0gPSBnZXREYXRlKCkgKyBuYW1lICsgJyAnICsgYXJnc1swXTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXREYXRlKCkge1xuXHRpZiAoZXhwb3J0cy5pbnNwZWN0T3B0cy5oaWRlRGF0ZSkge1xuXHRcdHJldHVybiAnJztcblx0fVxuXHRyZXR1cm4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpICsgJyAnO1xufVxuXG4vKipcbiAqIEludm9rZXMgYHV0aWwuZm9ybWF0KClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBzdGRlcnIuXG4gKi9cblxuZnVuY3Rpb24gbG9nKC4uLmFyZ3MpIHtcblx0cmV0dXJuIHByb2Nlc3Muc3RkZXJyLndyaXRlKHV0aWwuZm9ybWF0KC4uLmFyZ3MpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0cHJvY2Vzcy5lbnYuREVCVUcgPSBuYW1lc3BhY2VzO1xuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuXHRcdC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG5cdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcblx0cmV0dXJuIHByb2Nlc3MuZW52LkRFQlVHO1xufVxuXG4vKipcbiAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICpcbiAqIENyZWF0ZSBhIG5ldyBgaW5zcGVjdE9wdHNgIG9iamVjdCBpbiBjYXNlIGB1c2VDb2xvcnNgIGlzIHNldFxuICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGluaXQoZGVidWcpIHtcblx0ZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuXHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXhwb3J0cy5pbnNwZWN0T3B0cyk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGRlYnVnLmluc3BlY3RPcHRzW2tleXNbaV1dID0gZXhwb3J0cy5pbnNwZWN0T3B0c1trZXlzW2ldXTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGwgb24gYSBzaW5nbGUgbGluZS5cbiAqL1xuXG5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG5cdFx0LnNwbGl0KCdcXG4nKVxuXHRcdC5tYXAoc3RyID0+IHN0ci50cmltKCkpXG5cdFx0LmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogTWFwICVPIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cbiAqL1xuXG5mb3JtYXR0ZXJzLk8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcbiIsICIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciAvIG53anMgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbmlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHByb2Nlc3MuYnJvd3NlciA9PT0gdHJ1ZSB8fCBwcm9jZXNzLl9fbndqcykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYnJvd3Nlci5qcycpO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUuanMnKTtcbn1cbiIsICJ2YXIgZGVidWc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIWRlYnVnKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8qIGVzbGludCBnbG9iYWwtcmVxdWlyZTogb2ZmICovXG4gICAgICBkZWJ1ZyA9IHJlcXVpcmUoXCJkZWJ1Z1wiKShcImZvbGxvdy1yZWRpcmVjdHNcIik7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyAvKiAqLyB9XG4gICAgaWYgKHR5cGVvZiBkZWJ1ZyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHsgLyogKi8gfTtcbiAgICB9XG4gIH1cbiAgZGVidWcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn07XG4iLCAidmFyIHVybCA9IHJlcXVpcmUoXCJ1cmxcIik7XG52YXIgVVJMID0gdXJsLlVSTDtcbnZhciBodHRwID0gcmVxdWlyZShcImh0dHBcIik7XG52YXIgaHR0cHMgPSByZXF1aXJlKFwiaHR0cHNcIik7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKFwic3RyZWFtXCIpLldyaXRhYmxlO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG52YXIgZGVidWcgPSByZXF1aXJlKFwiLi9kZWJ1Z1wiKTtcblxuLy8gQ3JlYXRlIGhhbmRsZXJzIHRoYXQgcGFzcyBldmVudHMgZnJvbSBuYXRpdmUgcmVxdWVzdHNcbnZhciBldmVudHMgPSBbXCJhYm9ydFwiLCBcImFib3J0ZWRcIiwgXCJjb25uZWN0XCIsIFwiZXJyb3JcIiwgXCJzb2NrZXRcIiwgXCJ0aW1lb3V0XCJdO1xudmFyIGV2ZW50SGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGV2ZW50SGFuZGxlcnNbZXZlbnRdID0gZnVuY3Rpb24gKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICB0aGlzLl9yZWRpcmVjdGFibGUuZW1pdChldmVudCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gIH07XG59KTtcblxudmFyIEludmFsaWRVcmxFcnJvciA9IGNyZWF0ZUVycm9yVHlwZShcbiAgXCJFUlJfSU5WQUxJRF9VUkxcIixcbiAgXCJJbnZhbGlkIFVSTFwiLFxuICBUeXBlRXJyb3Jcbik7XG4vLyBFcnJvciB0eXBlcyB3aXRoIGNvZGVzXG52YXIgUmVkaXJlY3Rpb25FcnJvciA9IGNyZWF0ZUVycm9yVHlwZShcbiAgXCJFUlJfRlJfUkVESVJFQ1RJT05fRkFJTFVSRVwiLFxuICBcIlJlZGlyZWN0ZWQgcmVxdWVzdCBmYWlsZWRcIlxuKTtcbnZhciBUb29NYW55UmVkaXJlY3RzRXJyb3IgPSBjcmVhdGVFcnJvclR5cGUoXG4gIFwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUU1wiLFxuICBcIk1heGltdW0gbnVtYmVyIG9mIHJlZGlyZWN0cyBleGNlZWRlZFwiXG4pO1xudmFyIE1heEJvZHlMZW5ndGhFeGNlZWRlZEVycm9yID0gY3JlYXRlRXJyb3JUeXBlKFxuICBcIkVSUl9GUl9NQVhfQk9EWV9MRU5HVEhfRVhDRUVERURcIixcbiAgXCJSZXF1ZXN0IGJvZHkgbGFyZ2VyIHRoYW4gbWF4Qm9keUxlbmd0aCBsaW1pdFwiXG4pO1xudmFyIFdyaXRlQWZ0ZXJFbmRFcnJvciA9IGNyZWF0ZUVycm9yVHlwZShcbiAgXCJFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORFwiLFxuICBcIndyaXRlIGFmdGVyIGVuZFwiXG4pO1xuXG4vLyBBbiBIVFRQKFMpIHJlcXVlc3QgdGhhdCBjYW4gYmUgcmVkaXJlY3RlZFxuZnVuY3Rpb24gUmVkaXJlY3RhYmxlUmVxdWVzdChvcHRpb25zLCByZXNwb25zZUNhbGxiYWNrKSB7XG4gIC8vIEluaXRpYWxpemUgdGhlIHJlcXVlc3RcbiAgV3JpdGFibGUuY2FsbCh0aGlzKTtcbiAgdGhpcy5fc2FuaXRpemVPcHRpb25zKG9wdGlvbnMpO1xuICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgdGhpcy5fZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5fZW5kaW5nID0gZmFsc2U7XG4gIHRoaXMuX3JlZGlyZWN0Q291bnQgPSAwO1xuICB0aGlzLl9yZWRpcmVjdHMgPSBbXTtcbiAgdGhpcy5fcmVxdWVzdEJvZHlMZW5ndGggPSAwO1xuICB0aGlzLl9yZXF1ZXN0Qm9keUJ1ZmZlcnMgPSBbXTtcblxuICAvLyBBdHRhY2ggYSBjYWxsYmFjayBpZiBwYXNzZWRcbiAgaWYgKHJlc3BvbnNlQ2FsbGJhY2spIHtcbiAgICB0aGlzLm9uKFwicmVzcG9uc2VcIiwgcmVzcG9uc2VDYWxsYmFjayk7XG4gIH1cblxuICAvLyBSZWFjdCB0byByZXNwb25zZXMgb2YgbmF0aXZlIHJlcXVlc3RzXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fb25OYXRpdmVSZXNwb25zZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgIHNlbGYuX3Byb2Nlc3NSZXNwb25zZShyZXNwb25zZSk7XG4gIH07XG5cbiAgLy8gUGVyZm9ybSB0aGUgZmlyc3QgcmVxdWVzdFxuICB0aGlzLl9wZXJmb3JtUmVxdWVzdCgpO1xufVxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5cblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICBhYm9ydFJlcXVlc3QodGhpcy5fY3VycmVudFJlcXVlc3QpO1xuICB0aGlzLmVtaXQoXCJhYm9ydFwiKTtcbn07XG5cbi8vIFdyaXRlcyBidWZmZXJlZCBkYXRhIHRvIHRoZSBjdXJyZW50IG5hdGl2ZSByZXF1ZXN0XG5SZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChkYXRhLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgLy8gV3JpdGluZyBpcyBub3QgYWxsb3dlZCBpZiBlbmQgaGFzIGJlZW4gY2FsbGVkXG4gIGlmICh0aGlzLl9lbmRpbmcpIHtcbiAgICB0aHJvdyBuZXcgV3JpdGVBZnRlckVuZEVycm9yKCk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBpbnB1dCBhbmQgc2hpZnQgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnlcbiAgaWYgKCFpc1N0cmluZyhkYXRhKSAmJiAhaXNCdWZmZXIoZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiZGF0YSBzaG91bGQgYmUgYSBzdHJpbmcsIEJ1ZmZlciBvciBVaW50OEFycmF5XCIpO1xuICB9XG4gIGlmIChpc0Z1bmN0aW9uKGVuY29kaW5nKSkge1xuICAgIGNhbGxiYWNrID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgLy8gSWdub3JlIGVtcHR5IGJ1ZmZlcnMsIHNpbmNlIHdyaXRpbmcgdGhlbSBkb2Vzbid0IGludm9rZSB0aGUgY2FsbGJhY2tcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8yMjA2NlxuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICAvLyBPbmx5IHdyaXRlIHdoZW4gd2UgZG9uJ3QgZXhjZWVkIHRoZSBtYXhpbXVtIGJvZHkgbGVuZ3RoXG4gIGlmICh0aGlzLl9yZXF1ZXN0Qm9keUxlbmd0aCArIGRhdGEubGVuZ3RoIDw9IHRoaXMuX29wdGlvbnMubWF4Qm9keUxlbmd0aCkge1xuICAgIHRoaXMuX3JlcXVlc3RCb2R5TGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuX3JlcXVlc3RCb2R5QnVmZmVycy5wdXNoKHsgZGF0YTogZGF0YSwgZW5jb2Rpbmc6IGVuY29kaW5nIH0pO1xuICAgIHRoaXMuX2N1cnJlbnRSZXF1ZXN0LndyaXRlKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjayk7XG4gIH1cbiAgLy8gRXJyb3Igd2hlbiB3ZSBleGNlZWQgdGhlIG1heGltdW0gYm9keSBsZW5ndGhcbiAgZWxzZSB7XG4gICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgbmV3IE1heEJvZHlMZW5ndGhFeGNlZWRlZEVycm9yKCkpO1xuICAgIHRoaXMuYWJvcnQoKTtcbiAgfVxufTtcblxuLy8gRW5kcyB0aGUgY3VycmVudCBuYXRpdmUgcmVxdWVzdFxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAvLyBTaGlmdCBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeVxuICBpZiAoaXNGdW5jdGlvbihkYXRhKSkge1xuICAgIGNhbGxiYWNrID0gZGF0YTtcbiAgICBkYXRhID0gZW5jb2RpbmcgPSBudWxsO1xuICB9XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24oZW5jb2RpbmcpKSB7XG4gICAgY2FsbGJhY2sgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICAvLyBXcml0ZSBkYXRhIGlmIG5lZWRlZCBhbmQgZW5kXG4gIGlmICghZGF0YSkge1xuICAgIHRoaXMuX2VuZGVkID0gdGhpcy5fZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9jdXJyZW50UmVxdWVzdC5lbmQobnVsbCwgbnVsbCwgY2FsbGJhY2spO1xuICB9XG4gIGVsc2Uge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY3VycmVudFJlcXVlc3QgPSB0aGlzLl9jdXJyZW50UmVxdWVzdDtcbiAgICB0aGlzLndyaXRlKGRhdGEsIGVuY29kaW5nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9lbmRlZCA9IHRydWU7XG4gICAgICBjdXJyZW50UmVxdWVzdC5lbmQobnVsbCwgbnVsbCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHRoaXMuX2VuZGluZyA9IHRydWU7XG4gIH1cbn07XG5cbi8vIFNldHMgYSBoZWFkZXIgdmFsdWUgb24gdGhlIGN1cnJlbnQgbmF0aXZlIHJlcXVlc3RcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLnNldEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICB0aGlzLl9vcHRpb25zLmhlYWRlcnNbbmFtZV0gPSB2YWx1ZTtcbiAgdGhpcy5fY3VycmVudFJlcXVlc3Quc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbn07XG5cbi8vIENsZWFycyBhIGhlYWRlciB2YWx1ZSBvbiB0aGUgY3VycmVudCBuYXRpdmUgcmVxdWVzdFxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUucmVtb3ZlSGVhZGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMuX29wdGlvbnMuaGVhZGVyc1tuYW1lXTtcbiAgdGhpcy5fY3VycmVudFJlcXVlc3QucmVtb3ZlSGVhZGVyKG5hbWUpO1xufTtcblxuLy8gR2xvYmFsIHRpbWVvdXQgZm9yIGFsbCB1bmRlcmx5aW5nIHJlcXVlc3RzXG5SZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZS5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKG1zZWNzLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gRGVzdHJveXMgdGhlIHNvY2tldCBvbiB0aW1lb3V0XG4gIGZ1bmN0aW9uIGRlc3Ryb3lPblRpbWVvdXQoc29ja2V0KSB7XG4gICAgc29ja2V0LnNldFRpbWVvdXQobXNlY3MpO1xuICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcihcInRpbWVvdXRcIiwgc29ja2V0LmRlc3Ryb3kpO1xuICAgIHNvY2tldC5hZGRMaXN0ZW5lcihcInRpbWVvdXRcIiwgc29ja2V0LmRlc3Ryb3kpO1xuICB9XG5cbiAgLy8gU2V0cyB1cCBhIHRpbWVyIHRvIHRyaWdnZXIgYSB0aW1lb3V0IGV2ZW50XG4gIGZ1bmN0aW9uIHN0YXJ0VGltZXIoc29ja2V0KSB7XG4gICAgaWYgKHNlbGYuX3RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChzZWxmLl90aW1lb3V0KTtcbiAgICB9XG4gICAgc2VsZi5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5lbWl0KFwidGltZW91dFwiKTtcbiAgICAgIGNsZWFyVGltZXIoKTtcbiAgICB9LCBtc2Vjcyk7XG4gICAgZGVzdHJveU9uVGltZW91dChzb2NrZXQpO1xuICB9XG5cbiAgLy8gU3RvcHMgYSB0aW1lb3V0IGZyb20gdHJpZ2dlcmluZ1xuICBmdW5jdGlvbiBjbGVhclRpbWVyKCkge1xuICAgIC8vIENsZWFyIHRoZSB0aW1lb3V0XG4gICAgaWYgKHNlbGYuX3RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChzZWxmLl90aW1lb3V0KTtcbiAgICAgIHNlbGYuX3RpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIGFsbCBhdHRhY2hlZCBsaXN0ZW5lcnNcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKFwiYWJvcnRcIiwgY2xlYXJUaW1lcik7XG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIGNsZWFyVGltZXIpO1xuICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoXCJyZXNwb25zZVwiLCBjbGVhclRpbWVyKTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoXCJ0aW1lb3V0XCIsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgaWYgKCFzZWxmLnNvY2tldCkge1xuICAgICAgc2VsZi5fY3VycmVudFJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoXCJzb2NrZXRcIiwgc3RhcnRUaW1lcik7XG4gICAgfVxuICB9XG5cbiAgLy8gQXR0YWNoIGNhbGxiYWNrIGlmIHBhc3NlZFxuICBpZiAoY2FsbGJhY2spIHtcbiAgICB0aGlzLm9uKFwidGltZW91dFwiLCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyBTdGFydCB0aGUgdGltZXIgaWYgb3Igd2hlbiB0aGUgc29ja2V0IGlzIG9wZW5lZFxuICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICBzdGFydFRpbWVyKHRoaXMuc29ja2V0KTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aGlzLl9jdXJyZW50UmVxdWVzdC5vbmNlKFwic29ja2V0XCIsIHN0YXJ0VGltZXIpO1xuICB9XG5cbiAgLy8gQ2xlYW4gdXAgb24gZXZlbnRzXG4gIHRoaXMub24oXCJzb2NrZXRcIiwgZGVzdHJveU9uVGltZW91dCk7XG4gIHRoaXMub24oXCJhYm9ydFwiLCBjbGVhclRpbWVyKTtcbiAgdGhpcy5vbihcImVycm9yXCIsIGNsZWFyVGltZXIpO1xuICB0aGlzLm9uKFwicmVzcG9uc2VcIiwgY2xlYXJUaW1lcik7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBQcm94eSBhbGwgb3RoZXIgcHVibGljIENsaWVudFJlcXVlc3QgbWV0aG9kc1xuW1xuICBcImZsdXNoSGVhZGVyc1wiLCBcImdldEhlYWRlclwiLFxuICBcInNldE5vRGVsYXlcIiwgXCJzZXRTb2NrZXRLZWVwQWxpdmVcIixcbl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gIFJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UmVxdWVzdFttZXRob2RdKGEsIGIpO1xuICB9O1xufSk7XG5cbi8vIFByb3h5IGFsbCBwdWJsaWMgQ2xpZW50UmVxdWVzdCBwcm9wZXJ0aWVzXG5bXCJhYm9ydGVkXCIsIFwiY29ubmVjdGlvblwiLCBcInNvY2tldFwiXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUsIHByb3BlcnR5LCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jdXJyZW50UmVxdWVzdFtwcm9wZXJ0eV07IH0sXG4gIH0pO1xufSk7XG5cblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLl9zYW5pdGl6ZU9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAvLyBFbnN1cmUgaGVhZGVycyBhcmUgYWx3YXlzIHByZXNlbnRcbiAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgfVxuXG4gIC8vIFNpbmNlIGh0dHAucmVxdWVzdCB0cmVhdHMgaG9zdCBhcyBhbiBhbGlhcyBvZiBob3N0bmFtZSxcbiAgLy8gYnV0IHRoZSB1cmwgbW9kdWxlIGludGVycHJldHMgaG9zdCBhcyBob3N0bmFtZSBwbHVzIHBvcnQsXG4gIC8vIGVsaW1pbmF0ZSB0aGUgaG9zdCBwcm9wZXJ0eSB0byBhdm9pZCBjb25mdXNpb24uXG4gIGlmIChvcHRpb25zLmhvc3QpIHtcbiAgICAvLyBVc2UgaG9zdG5hbWUgaWYgc2V0LCBiZWNhdXNlIGl0IGhhcyBwcmVjZWRlbmNlXG4gICAgaWYgKCFvcHRpb25zLmhvc3RuYW1lKSB7XG4gICAgICBvcHRpb25zLmhvc3RuYW1lID0gb3B0aW9ucy5ob3N0O1xuICAgIH1cbiAgICBkZWxldGUgb3B0aW9ucy5ob3N0O1xuICB9XG5cbiAgLy8gQ29tcGxldGUgdGhlIFVSTCBvYmplY3Qgd2hlbiBuZWNlc3NhcnlcbiAgaWYgKCFvcHRpb25zLnBhdGhuYW1lICYmIG9wdGlvbnMucGF0aCkge1xuICAgIHZhciBzZWFyY2hQb3MgPSBvcHRpb25zLnBhdGguaW5kZXhPZihcIj9cIik7XG4gICAgaWYgKHNlYXJjaFBvcyA8IDApIHtcbiAgICAgIG9wdGlvbnMucGF0aG5hbWUgPSBvcHRpb25zLnBhdGg7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgb3B0aW9ucy5wYXRobmFtZSA9IG9wdGlvbnMucGF0aC5zdWJzdHJpbmcoMCwgc2VhcmNoUG9zKTtcbiAgICAgIG9wdGlvbnMuc2VhcmNoID0gb3B0aW9ucy5wYXRoLnN1YnN0cmluZyhzZWFyY2hQb3MpO1xuICAgIH1cbiAgfVxufTtcblxuXG4vLyBFeGVjdXRlcyB0aGUgbmV4dCBuYXRpdmUgcmVxdWVzdCAoaW5pdGlhbCBvciByZWRpcmVjdClcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLl9wZXJmb3JtUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gTG9hZCB0aGUgbmF0aXZlIHByb3RvY29sXG4gIHZhciBwcm90b2NvbCA9IHRoaXMuX29wdGlvbnMucHJvdG9jb2w7XG4gIHZhciBuYXRpdmVQcm90b2NvbCA9IHRoaXMuX29wdGlvbnMubmF0aXZlUHJvdG9jb2xzW3Byb3RvY29sXTtcbiAgaWYgKCFuYXRpdmVQcm90b2NvbCkge1xuICAgIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBUeXBlRXJyb3IoXCJVbnN1cHBvcnRlZCBwcm90b2NvbCBcIiArIHByb3RvY29sKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgc3BlY2lmaWVkLCB1c2UgdGhlIGFnZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3RvY29sXG4gIC8vIChIVFRQIGFuZCBIVFRQUyB1c2UgZGlmZmVyZW50IHR5cGVzIG9mIGFnZW50cylcbiAgaWYgKHRoaXMuX29wdGlvbnMuYWdlbnRzKSB7XG4gICAgdmFyIHNjaGVtZSA9IHByb3RvY29sLnNsaWNlKDAsIC0xKTtcbiAgICB0aGlzLl9vcHRpb25zLmFnZW50ID0gdGhpcy5fb3B0aW9ucy5hZ2VudHNbc2NoZW1lXTtcbiAgfVxuXG4gIC8vIENyZWF0ZSB0aGUgbmF0aXZlIHJlcXVlc3QgYW5kIHNldCB1cCBpdHMgZXZlbnQgaGFuZGxlcnNcbiAgdmFyIHJlcXVlc3QgPSB0aGlzLl9jdXJyZW50UmVxdWVzdCA9XG4gICAgICAgIG5hdGl2ZVByb3RvY29sLnJlcXVlc3QodGhpcy5fb3B0aW9ucywgdGhpcy5fb25OYXRpdmVSZXNwb25zZSk7XG4gIHJlcXVlc3QuX3JlZGlyZWN0YWJsZSA9IHRoaXM7XG4gIGZvciAodmFyIGV2ZW50IG9mIGV2ZW50cykge1xuICAgIHJlcXVlc3Qub24oZXZlbnQsIGV2ZW50SGFuZGxlcnNbZXZlbnRdKTtcbiAgfVxuXG4gIC8vIFJGQzcyMzBcdTAwQTc1LjMuMTogV2hlbiBtYWtpbmcgYSByZXF1ZXN0IGRpcmVjdGx5IHRvIGFuIG9yaWdpbiBzZXJ2ZXIsIFtcdTIwMjZdXG4gIC8vIGEgY2xpZW50IE1VU1Qgc2VuZCBvbmx5IHRoZSBhYnNvbHV0ZSBwYXRoIFtcdTIwMjZdIGFzIHRoZSByZXF1ZXN0LXRhcmdldC5cbiAgdGhpcy5fY3VycmVudFVybCA9IC9eXFwvLy50ZXN0KHRoaXMuX29wdGlvbnMucGF0aCkgP1xuICAgIHVybC5mb3JtYXQodGhpcy5fb3B0aW9ucykgOlxuICAgIC8vIFdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBhIHByb3h5LCBbXHUyMDI2XVxuICAgIC8vIGEgY2xpZW50IE1VU1Qgc2VuZCB0aGUgdGFyZ2V0IFVSSSBpbiBhYnNvbHV0ZS1mb3JtIFtcdTIwMjZdLlxuICAgIHRoaXMuX29wdGlvbnMucGF0aDtcblxuICAvLyBFbmQgYSByZWRpcmVjdGVkIHJlcXVlc3RcbiAgLy8gKFRoZSBmaXJzdCByZXF1ZXN0IG11c3QgYmUgZW5kZWQgZXhwbGljaXRseSB3aXRoIFJlZGlyZWN0YWJsZVJlcXVlc3QjZW5kKVxuICBpZiAodGhpcy5faXNSZWRpcmVjdCkge1xuICAgIC8vIFdyaXRlIHRoZSByZXF1ZXN0IGVudGl0eSBhbmQgZW5kXG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYnVmZmVycyA9IHRoaXMuX3JlcXVlc3RCb2R5QnVmZmVycztcbiAgICAoZnVuY3Rpb24gd3JpdGVOZXh0KGVycm9yKSB7XG4gICAgICAvLyBPbmx5IHdyaXRlIGlmIHRoaXMgcmVxdWVzdCBoYXMgbm90IGJlZW4gcmVkaXJlY3RlZCB5ZXRcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocmVxdWVzdCA9PT0gc2VsZi5fY3VycmVudFJlcXVlc3QpIHtcbiAgICAgICAgLy8gUmVwb3J0IGFueSB3cml0ZSBlcnJvcnNcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHNlbGYuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSB0aGUgbmV4dCBidWZmZXIgaWYgdGhlcmUgYXJlIHN0aWxsIGxlZnRcbiAgICAgICAgZWxzZSBpZiAoaSA8IGJ1ZmZlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGJ1ZmZlciA9IGJ1ZmZlcnNbaSsrXTtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmICghcmVxdWVzdC5maW5pc2hlZCkge1xuICAgICAgICAgICAgcmVxdWVzdC53cml0ZShidWZmZXIuZGF0YSwgYnVmZmVyLmVuY29kaW5nLCB3cml0ZU5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbmQgdGhlIHJlcXVlc3QgaWYgYGVuZGAgaGFzIGJlZW4gY2FsbGVkIG9uIHVzXG4gICAgICAgIGVsc2UgaWYgKHNlbGYuX2VuZGVkKSB7XG4gICAgICAgICAgcmVxdWVzdC5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0oKSk7XG4gIH1cbn07XG5cbi8vIFByb2Nlc3NlcyBhIHJlc3BvbnNlIGZyb20gdGhlIGN1cnJlbnQgbmF0aXZlIHJlcXVlc3RcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLl9wcm9jZXNzUmVzcG9uc2UgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgLy8gU3RvcmUgdGhlIHJlZGlyZWN0ZWQgcmVzcG9uc2VcbiAgdmFyIHN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlO1xuICBpZiAodGhpcy5fb3B0aW9ucy50cmFja1JlZGlyZWN0cykge1xuICAgIHRoaXMuX3JlZGlyZWN0cy5wdXNoKHtcbiAgICAgIHVybDogdGhpcy5fY3VycmVudFVybCxcbiAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBzdGF0dXNDb2RlOiBzdGF0dXNDb2RlLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gUkZDNzIzMVx1MDBBNzYuNDogVGhlIDN4eCAoUmVkaXJlY3Rpb24pIGNsYXNzIG9mIHN0YXR1cyBjb2RlIGluZGljYXRlc1xuICAvLyB0aGF0IGZ1cnRoZXIgYWN0aW9uIG5lZWRzIHRvIGJlIHRha2VuIGJ5IHRoZSB1c2VyIGFnZW50IGluIG9yZGVyIHRvXG4gIC8vIGZ1bGZpbGwgdGhlIHJlcXVlc3QuIElmIGEgTG9jYXRpb24gaGVhZGVyIGZpZWxkIGlzIHByb3ZpZGVkLFxuICAvLyB0aGUgdXNlciBhZ2VudCBNQVkgYXV0b21hdGljYWxseSByZWRpcmVjdCBpdHMgcmVxdWVzdCB0byB0aGUgVVJJXG4gIC8vIHJlZmVyZW5jZWQgYnkgdGhlIExvY2F0aW9uIGZpZWxkIHZhbHVlLFxuICAvLyBldmVuIGlmIHRoZSBzcGVjaWZpYyBzdGF0dXMgY29kZSBpcyBub3QgdW5kZXJzdG9vZC5cblxuICAvLyBJZiB0aGUgcmVzcG9uc2UgaXMgbm90IGEgcmVkaXJlY3Q7IHJldHVybiBpdCBhcy1pc1xuICB2YXIgbG9jYXRpb24gPSByZXNwb25zZS5oZWFkZXJzLmxvY2F0aW9uO1xuICBpZiAoIWxvY2F0aW9uIHx8IHRoaXMuX29wdGlvbnMuZm9sbG93UmVkaXJlY3RzID09PSBmYWxzZSB8fFxuICAgICAgc3RhdHVzQ29kZSA8IDMwMCB8fCBzdGF0dXNDb2RlID49IDQwMCkge1xuICAgIHJlc3BvbnNlLnJlc3BvbnNlVXJsID0gdGhpcy5fY3VycmVudFVybDtcbiAgICByZXNwb25zZS5yZWRpcmVjdHMgPSB0aGlzLl9yZWRpcmVjdHM7XG4gICAgdGhpcy5lbWl0KFwicmVzcG9uc2VcIiwgcmVzcG9uc2UpO1xuXG4gICAgLy8gQ2xlYW4gdXBcbiAgICB0aGlzLl9yZXF1ZXN0Qm9keUJ1ZmZlcnMgPSBbXTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgcmVzcG9uc2UgaXMgYSByZWRpcmVjdCwgc28gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdFxuICBhYm9ydFJlcXVlc3QodGhpcy5fY3VycmVudFJlcXVlc3QpO1xuICAvLyBEaXNjYXJkIHRoZSByZW1haW5kZXIgb2YgdGhlIHJlc3BvbnNlIHRvIGF2b2lkIHdhaXRpbmcgZm9yIGRhdGFcbiAgcmVzcG9uc2UuZGVzdHJveSgpO1xuXG4gIC8vIFJGQzcyMzFcdTAwQTc2LjQ6IEEgY2xpZW50IFNIT1VMRCBkZXRlY3QgYW5kIGludGVydmVuZVxuICAvLyBpbiBjeWNsaWNhbCByZWRpcmVjdGlvbnMgKGkuZS4sIFwiaW5maW5pdGVcIiByZWRpcmVjdGlvbiBsb29wcykuXG4gIGlmICgrK3RoaXMuX3JlZGlyZWN0Q291bnQgPiB0aGlzLl9vcHRpb25zLm1heFJlZGlyZWN0cykge1xuICAgIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBUb29NYW55UmVkaXJlY3RzRXJyb3IoKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU3RvcmUgdGhlIHJlcXVlc3QgaGVhZGVycyBpZiBhcHBsaWNhYmxlXG4gIHZhciByZXF1ZXN0SGVhZGVycztcbiAgdmFyIGJlZm9yZVJlZGlyZWN0ID0gdGhpcy5fb3B0aW9ucy5iZWZvcmVSZWRpcmVjdDtcbiAgaWYgKGJlZm9yZVJlZGlyZWN0KSB7XG4gICAgcmVxdWVzdEhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIC8vIFRoZSBIb3N0IGhlYWRlciB3YXMgc2V0IGJ5IG5hdGl2ZVByb3RvY29sLnJlcXVlc3RcbiAgICAgIEhvc3Q6IHJlc3BvbnNlLnJlcS5nZXRIZWFkZXIoXCJob3N0XCIpLFxuICAgIH0sIHRoaXMuX29wdGlvbnMuaGVhZGVycyk7XG4gIH1cblxuICAvLyBSRkM3MjMxXHUwMEE3Ni40OiBBdXRvbWF0aWMgcmVkaXJlY3Rpb24gbmVlZHMgdG8gZG9uZSB3aXRoXG4gIC8vIGNhcmUgZm9yIG1ldGhvZHMgbm90IGtub3duIHRvIGJlIHNhZmUsIFtcdTIwMjZdXG4gIC8vIFJGQzcyMzFcdTAwQTc2LjQuMlx1MjAxMzM6IEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIGEgdXNlciBhZ2VudCBNQVkgY2hhbmdlXG4gIC8vIHRoZSByZXF1ZXN0IG1ldGhvZCBmcm9tIFBPU1QgdG8gR0VUIGZvciB0aGUgc3Vic2VxdWVudCByZXF1ZXN0LlxuICB2YXIgbWV0aG9kID0gdGhpcy5fb3B0aW9ucy5tZXRob2Q7XG4gIGlmICgoc3RhdHVzQ29kZSA9PT0gMzAxIHx8IHN0YXR1c0NvZGUgPT09IDMwMikgJiYgdGhpcy5fb3B0aW9ucy5tZXRob2QgPT09IFwiUE9TVFwiIHx8XG4gICAgICAvLyBSRkM3MjMxXHUwMEE3Ni40LjQ6IFRoZSAzMDMgKFNlZSBPdGhlcikgc3RhdHVzIGNvZGUgaW5kaWNhdGVzIHRoYXRcbiAgICAgIC8vIHRoZSBzZXJ2ZXIgaXMgcmVkaXJlY3RpbmcgdGhlIHVzZXIgYWdlbnQgdG8gYSBkaWZmZXJlbnQgcmVzb3VyY2UgW1x1MjAyNl1cbiAgICAgIC8vIEEgdXNlciBhZ2VudCBjYW4gcGVyZm9ybSBhIHJldHJpZXZhbCByZXF1ZXN0IHRhcmdldGluZyB0aGF0IFVSSVxuICAgICAgLy8gKGEgR0VUIG9yIEhFQUQgcmVxdWVzdCBpZiB1c2luZyBIVFRQKSBbXHUyMDI2XVxuICAgICAgKHN0YXR1c0NvZGUgPT09IDMwMykgJiYgIS9eKD86R0VUfEhFQUQpJC8udGVzdCh0aGlzLl9vcHRpb25zLm1ldGhvZCkpIHtcbiAgICB0aGlzLl9vcHRpb25zLm1ldGhvZCA9IFwiR0VUXCI7XG4gICAgLy8gRHJvcCBhIHBvc3NpYmxlIGVudGl0eSBhbmQgaGVhZGVycyByZWxhdGVkIHRvIGl0XG4gICAgdGhpcy5fcmVxdWVzdEJvZHlCdWZmZXJzID0gW107XG4gICAgcmVtb3ZlTWF0Y2hpbmdIZWFkZXJzKC9eY29udGVudC0vaSwgdGhpcy5fb3B0aW9ucy5oZWFkZXJzKTtcbiAgfVxuXG4gIC8vIERyb3AgdGhlIEhvc3QgaGVhZGVyLCBhcyB0aGUgcmVkaXJlY3QgbWlnaHQgbGVhZCB0byBhIGRpZmZlcmVudCBob3N0XG4gIHZhciBjdXJyZW50SG9zdEhlYWRlciA9IHJlbW92ZU1hdGNoaW5nSGVhZGVycygvXmhvc3QkL2ksIHRoaXMuX29wdGlvbnMuaGVhZGVycyk7XG5cbiAgLy8gSWYgdGhlIHJlZGlyZWN0IGlzIHJlbGF0aXZlLCBjYXJyeSBvdmVyIHRoZSBob3N0IG9mIHRoZSBsYXN0IHJlcXVlc3RcbiAgdmFyIGN1cnJlbnRVcmxQYXJ0cyA9IHVybC5wYXJzZSh0aGlzLl9jdXJyZW50VXJsKTtcbiAgdmFyIGN1cnJlbnRIb3N0ID0gY3VycmVudEhvc3RIZWFkZXIgfHwgY3VycmVudFVybFBhcnRzLmhvc3Q7XG4gIHZhciBjdXJyZW50VXJsID0gL15cXHcrOi8udGVzdChsb2NhdGlvbikgPyB0aGlzLl9jdXJyZW50VXJsIDpcbiAgICB1cmwuZm9ybWF0KE9iamVjdC5hc3NpZ24oY3VycmVudFVybFBhcnRzLCB7IGhvc3Q6IGN1cnJlbnRIb3N0IH0pKTtcblxuICAvLyBEZXRlcm1pbmUgdGhlIFVSTCBvZiB0aGUgcmVkaXJlY3Rpb25cbiAgdmFyIHJlZGlyZWN0VXJsO1xuICB0cnkge1xuICAgIHJlZGlyZWN0VXJsID0gdXJsLnJlc29sdmUoY3VycmVudFVybCwgbG9jYXRpb24pO1xuICB9XG4gIGNhdGNoIChjYXVzZSkge1xuICAgIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBSZWRpcmVjdGlvbkVycm9yKHsgY2F1c2U6IGNhdXNlIH0pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDcmVhdGUgdGhlIHJlZGlyZWN0ZWQgcmVxdWVzdFxuICBkZWJ1ZyhcInJlZGlyZWN0aW5nIHRvXCIsIHJlZGlyZWN0VXJsKTtcbiAgdGhpcy5faXNSZWRpcmVjdCA9IHRydWU7XG4gIHZhciByZWRpcmVjdFVybFBhcnRzID0gdXJsLnBhcnNlKHJlZGlyZWN0VXJsKTtcbiAgT2JqZWN0LmFzc2lnbih0aGlzLl9vcHRpb25zLCByZWRpcmVjdFVybFBhcnRzKTtcblxuICAvLyBEcm9wIGNvbmZpZGVudGlhbCBoZWFkZXJzIHdoZW4gcmVkaXJlY3RpbmcgdG8gYSBsZXNzIHNlY3VyZSBwcm90b2NvbFxuICAvLyBvciB0byBhIGRpZmZlcmVudCBkb21haW4gdGhhdCBpcyBub3QgYSBzdXBlcmRvbWFpblxuICBpZiAocmVkaXJlY3RVcmxQYXJ0cy5wcm90b2NvbCAhPT0gY3VycmVudFVybFBhcnRzLnByb3RvY29sICYmXG4gICAgIHJlZGlyZWN0VXJsUGFydHMucHJvdG9jb2wgIT09IFwiaHR0cHM6XCIgfHxcbiAgICAgcmVkaXJlY3RVcmxQYXJ0cy5ob3N0ICE9PSBjdXJyZW50SG9zdCAmJlxuICAgICAhaXNTdWJkb21haW4ocmVkaXJlY3RVcmxQYXJ0cy5ob3N0LCBjdXJyZW50SG9zdCkpIHtcbiAgICByZW1vdmVNYXRjaGluZ0hlYWRlcnMoL14oPzphdXRob3JpemF0aW9ufGNvb2tpZSkkL2ksIHRoaXMuX29wdGlvbnMuaGVhZGVycyk7XG4gIH1cblxuICAvLyBFdmFsdWF0ZSB0aGUgYmVmb3JlUmVkaXJlY3QgY2FsbGJhY2tcbiAgaWYgKGlzRnVuY3Rpb24oYmVmb3JlUmVkaXJlY3QpKSB7XG4gICAgdmFyIHJlc3BvbnNlRGV0YWlscyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBzdGF0dXNDb2RlOiBzdGF0dXNDb2RlLFxuICAgIH07XG4gICAgdmFyIHJlcXVlc3REZXRhaWxzID0ge1xuICAgICAgdXJsOiBjdXJyZW50VXJsLFxuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBiZWZvcmVSZWRpcmVjdCh0aGlzLl9vcHRpb25zLCByZXNwb25zZURldGFpbHMsIHJlcXVlc3REZXRhaWxzKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2FuaXRpemVPcHRpb25zKHRoaXMuX29wdGlvbnMpO1xuICB9XG5cbiAgLy8gUGVyZm9ybSB0aGUgcmVkaXJlY3RlZCByZXF1ZXN0XG4gIHRyeSB7XG4gICAgdGhpcy5fcGVyZm9ybVJlcXVlc3QoKTtcbiAgfVxuICBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBuZXcgUmVkaXJlY3Rpb25FcnJvcih7IGNhdXNlOiBjYXVzZSB9KSk7XG4gIH1cbn07XG5cbi8vIFdyYXBzIHRoZSBrZXkvdmFsdWUgb2JqZWN0IG9mIHByb3RvY29scyB3aXRoIHJlZGlyZWN0IGZ1bmN0aW9uYWxpdHlcbmZ1bmN0aW9uIHdyYXAocHJvdG9jb2xzKSB7XG4gIC8vIERlZmF1bHQgc2V0dGluZ3NcbiAgdmFyIGV4cG9ydHMgPSB7XG4gICAgbWF4UmVkaXJlY3RzOiAyMSxcbiAgICBtYXhCb2R5TGVuZ3RoOiAxMCAqIDEwMjQgKiAxMDI0LFxuICB9O1xuXG4gIC8vIFdyYXAgZWFjaCBwcm90b2NvbFxuICB2YXIgbmF0aXZlUHJvdG9jb2xzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3RvY29scykuZm9yRWFjaChmdW5jdGlvbiAoc2NoZW1lKSB7XG4gICAgdmFyIHByb3RvY29sID0gc2NoZW1lICsgXCI6XCI7XG4gICAgdmFyIG5hdGl2ZVByb3RvY29sID0gbmF0aXZlUHJvdG9jb2xzW3Byb3RvY29sXSA9IHByb3RvY29sc1tzY2hlbWVdO1xuICAgIHZhciB3cmFwcGVkUHJvdG9jb2wgPSBleHBvcnRzW3NjaGVtZV0gPSBPYmplY3QuY3JlYXRlKG5hdGl2ZVByb3RvY29sKTtcblxuICAgIC8vIEV4ZWN1dGVzIGEgcmVxdWVzdCwgZm9sbG93aW5nIHJlZGlyZWN0c1xuICAgIGZ1bmN0aW9uIHJlcXVlc3QoaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAvLyBQYXJzZSBwYXJhbWV0ZXJzXG4gICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgIHZhciBwYXJzZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyc2VkID0gdXJsVG9PcHRpb25zKG5ldyBVUkwoaW5wdXQpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICBwYXJzZWQgPSB1cmwucGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNTdHJpbmcocGFyc2VkLnByb3RvY29sKSkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVXJsRXJyb3IoeyBpbnB1dCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dCA9IHBhcnNlZDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKFVSTCAmJiAoaW5wdXQgaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgICAgIGlucHV0ID0gdXJsVG9PcHRpb25zKGlucHV0KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSBpbnB1dDtcbiAgICAgICAgaW5wdXQgPSB7IHByb3RvY29sOiBwcm90b2NvbCB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICBvcHRpb25zID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIG1heFJlZGlyZWN0czogZXhwb3J0cy5tYXhSZWRpcmVjdHMsXG4gICAgICAgIG1heEJvZHlMZW5ndGg6IGV4cG9ydHMubWF4Qm9keUxlbmd0aCxcbiAgICAgIH0sIGlucHV0LCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMubmF0aXZlUHJvdG9jb2xzID0gbmF0aXZlUHJvdG9jb2xzO1xuICAgICAgaWYgKCFpc1N0cmluZyhvcHRpb25zLmhvc3QpICYmICFpc1N0cmluZyhvcHRpb25zLmhvc3RuYW1lKSkge1xuICAgICAgICBvcHRpb25zLmhvc3RuYW1lID0gXCI6OjFcIjtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0LmVxdWFsKG9wdGlvbnMucHJvdG9jb2wsIHByb3RvY29sLCBcInByb3RvY29sIG1pc21hdGNoXCIpO1xuICAgICAgZGVidWcoXCJvcHRpb25zXCIsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIG5ldyBSZWRpcmVjdGFibGVSZXF1ZXN0KG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlcyBhIEdFVCByZXF1ZXN0LCBmb2xsb3dpbmcgcmVkaXJlY3RzXG4gICAgZnVuY3Rpb24gZ2V0KGlucHV0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgdmFyIHdyYXBwZWRSZXF1ZXN0ID0gd3JhcHBlZFByb3RvY29sLnJlcXVlc3QoaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICAgIHdyYXBwZWRSZXF1ZXN0LmVuZCgpO1xuICAgICAgcmV0dXJuIHdyYXBwZWRSZXF1ZXN0O1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSB0aGUgcHJvcGVydGllcyBvbiB0aGUgd3JhcHBlZCBwcm90b2NvbFxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdyYXBwZWRQcm90b2NvbCwge1xuICAgICAgcmVxdWVzdDogeyB2YWx1ZTogcmVxdWVzdCwgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9LFxuICAgICAgZ2V0OiB7IHZhbHVlOiBnZXQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSxcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBleHBvcnRzO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gbm9vcCgpIHsgLyogZW1wdHkgKi8gfVxuXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL21hc3Rlci9saWIvaW50ZXJuYWwvdXJsLmpzXG5mdW5jdGlvbiB1cmxUb09wdGlvbnModXJsT2JqZWN0KSB7XG4gIHZhciBvcHRpb25zID0ge1xuICAgIHByb3RvY29sOiB1cmxPYmplY3QucHJvdG9jb2wsXG4gICAgaG9zdG5hbWU6IHVybE9iamVjdC5ob3N0bmFtZS5zdGFydHNXaXRoKFwiW1wiKSA/XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdXJsT2JqZWN0Lmhvc3RuYW1lLnNsaWNlKDEsIC0xKSA6XG4gICAgICB1cmxPYmplY3QuaG9zdG5hbWUsXG4gICAgaGFzaDogdXJsT2JqZWN0Lmhhc2gsXG4gICAgc2VhcmNoOiB1cmxPYmplY3Quc2VhcmNoLFxuICAgIHBhdGhuYW1lOiB1cmxPYmplY3QucGF0aG5hbWUsXG4gICAgcGF0aDogdXJsT2JqZWN0LnBhdGhuYW1lICsgdXJsT2JqZWN0LnNlYXJjaCxcbiAgICBocmVmOiB1cmxPYmplY3QuaHJlZixcbiAgfTtcbiAgaWYgKHVybE9iamVjdC5wb3J0ICE9PSBcIlwiKSB7XG4gICAgb3B0aW9ucy5wb3J0ID0gTnVtYmVyKHVybE9iamVjdC5wb3J0KTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTWF0Y2hpbmdIZWFkZXJzKHJlZ2V4LCBoZWFkZXJzKSB7XG4gIHZhciBsYXN0VmFsdWU7XG4gIGZvciAodmFyIGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgaWYgKHJlZ2V4LnRlc3QoaGVhZGVyKSkge1xuICAgICAgbGFzdFZhbHVlID0gaGVhZGVyc1toZWFkZXJdO1xuICAgICAgZGVsZXRlIGhlYWRlcnNbaGVhZGVyXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChsYXN0VmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGxhc3RWYWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgP1xuICAgIHVuZGVmaW5lZCA6IFN0cmluZyhsYXN0VmFsdWUpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JUeXBlKGNvZGUsIG1lc3NhZ2UsIGJhc2VDbGFzcykge1xuICAvLyBDcmVhdGUgY29uc3RydWN0b3JcbiAgZnVuY3Rpb24gQ3VzdG9tRXJyb3IocHJvcGVydGllcykge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcGVydGllcyB8fCB7fSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmNhdXNlID8gbWVzc2FnZSArIFwiOiBcIiArIHRoaXMuY2F1c2UubWVzc2FnZSA6IG1lc3NhZ2U7XG4gIH1cblxuICAvLyBBdHRhY2ggY29uc3RydWN0b3IgYW5kIHNldCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgQ3VzdG9tRXJyb3IucHJvdG90eXBlID0gbmV3IChiYXNlQ2xhc3MgfHwgRXJyb3IpKCk7XG4gIEN1c3RvbUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1c3RvbUVycm9yO1xuICBDdXN0b21FcnJvci5wcm90b3R5cGUubmFtZSA9IFwiRXJyb3IgW1wiICsgY29kZSArIFwiXVwiO1xuICByZXR1cm4gQ3VzdG9tRXJyb3I7XG59XG5cbmZ1bmN0aW9uIGFib3J0UmVxdWVzdChyZXF1ZXN0KSB7XG4gIGZvciAodmFyIGV2ZW50IG9mIGV2ZW50cykge1xuICAgIHJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGV2ZW50SGFuZGxlcnNbZXZlbnRdKTtcbiAgfVxuICByZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgbm9vcCk7XG4gIHJlcXVlc3QuYWJvcnQoKTtcbn1cblxuZnVuY3Rpb24gaXNTdWJkb21haW4oc3ViZG9tYWluLCBkb21haW4pIHtcbiAgYXNzZXJ0KGlzU3RyaW5nKHN1YmRvbWFpbikgJiYgaXNTdHJpbmcoZG9tYWluKSk7XG4gIHZhciBkb3QgPSBzdWJkb21haW4ubGVuZ3RoIC0gZG9tYWluLmxlbmd0aCAtIDE7XG4gIHJldHVybiBkb3QgPiAwICYmIHN1YmRvbWFpbltkb3RdID09PSBcIi5cIiAmJiBzdWJkb21haW4uZW5kc1dpdGgoZG9tYWluKTtcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgKFwibGVuZ3RoXCIgaW4gdmFsdWUpO1xufVxuXG4vLyBFeHBvcnRzXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXAoeyBodHRwOiBodHRwLCBodHRwczogaHR0cHMgfSk7XG5tb2R1bGUuZXhwb3J0cy53cmFwID0gd3JhcDtcbiIsICJ2YXIgaHR0cE5hdGl2ZSAgID0gcmVxdWlyZSgnaHR0cCcpLFxuICAgIGh0dHBzTmF0aXZlICA9IHJlcXVpcmUoJ2h0dHBzJyksXG4gICAgd2ViX28gID0gcmVxdWlyZSgnLi93ZWItb3V0Z29pbmcnKSxcbiAgICBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKSxcbiAgICBmb2xsb3dSZWRpcmVjdHMgPSByZXF1aXJlKCdmb2xsb3ctcmVkaXJlY3RzJyk7XG5cbndlYl9vID0gT2JqZWN0LmtleXMod2ViX28pLm1hcChmdW5jdGlvbihwYXNzKSB7XG4gIHJldHVybiB3ZWJfb1twYXNzXTtcbn0pO1xuXG52YXIgbmF0aXZlQWdlbnRzID0geyBodHRwOiBodHRwTmF0aXZlLCBodHRwczogaHR0cHNOYXRpdmUgfTtcblxuLyohXG4gKiBBcnJheSBvZiBwYXNzZXMuXG4gKlxuICogQSBgcGFzc2AgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgb24gYHJlcSwgcmVzLCBvcHRpb25zYFxuICogc28gdGhhdCB5b3UgY2FuIGVhc2lseSBhZGQgbmV3IGNoZWNrcyB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoZSBiYXNlXG4gKiBmbGV4aWJsZS5cbiAqL1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qKlxuICAgKiBTZXRzIGBjb250ZW50LWxlbmd0aGAgdG8gJzAnIGlmIHJlcXVlc3QgaXMgb2YgREVMRVRFIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBkZWxldGVMZW5ndGg6IGZ1bmN0aW9uIGRlbGV0ZUxlbmd0aChyZXEsIHJlcywgb3B0aW9ucykge1xuICAgIGlmKChyZXEubWV0aG9kID09PSAnREVMRVRFJyB8fCByZXEubWV0aG9kID09PSAnT1BUSU9OUycpXG4gICAgICAgJiYgIXJlcS5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddKSB7XG4gICAgICByZXEuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9ICcwJztcbiAgICAgIGRlbGV0ZSByZXEuaGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgdGltZW91dCBpbiByZXF1ZXN0IHNvY2tldCBpZiBpdCB3YXMgc3BlY2lmaWVkIGluIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICB0aW1lb3V0OiBmdW5jdGlvbiB0aW1lb3V0KHJlcSwgcmVzLCBvcHRpb25zKSB7XG4gICAgaWYob3B0aW9ucy50aW1lb3V0KSB7XG4gICAgICByZXEuc29ja2V0LnNldFRpbWVvdXQob3B0aW9ucy50aW1lb3V0KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYHgtZm9yd2FyZGVkLSpgIGhlYWRlcnMgaWYgc3BlY2lmaWVkIGluIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBvYmplY3RcbiAgICpcdTAwQTBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gUmVzIFJlc3BvbnNlIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gT3B0aW9ucyBDb25maWcgb2JqZWN0IHBhc3NlZCB0byB0aGUgcHJveHlcbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIFhIZWFkZXJzOiBmdW5jdGlvbiBYSGVhZGVycyhyZXEsIHJlcywgb3B0aW9ucykge1xuICAgIGlmKCFvcHRpb25zLnhmd2QpIHJldHVybjtcblxuICAgIHZhciBlbmNyeXB0ZWQgPSByZXEuaXNTcGR5IHx8IGNvbW1vbi5oYXNFbmNyeXB0ZWRDb25uZWN0aW9uKHJlcSk7XG4gICAgdmFyIHZhbHVlcyA9IHtcbiAgICAgIGZvciAgOiByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzIHx8IHJlcS5zb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICAgIHBvcnQgOiBjb21tb24uZ2V0UG9ydChyZXEpLFxuICAgICAgcHJvdG86IGVuY3J5cHRlZCA/ICdodHRwcycgOiAnaHR0cCdcbiAgICB9O1xuXG4gICAgWydmb3InLCAncG9ydCcsICdwcm90byddLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gPVxuICAgICAgICAocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLScgKyBoZWFkZXJdIHx8ICcnKSArXG4gICAgICAgIChyZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gPyAnLCcgOiAnJykgK1xuICAgICAgICB2YWx1ZXNbaGVhZGVyXTtcbiAgICB9KTtcblxuICAgIHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1ob3N0J10gPSByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtaG9zdCddIHx8IHJlcS5oZWFkZXJzWydob3N0J10gfHwgJyc7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERvZXMgdGhlIGFjdHVhbCBwcm94eWluZy4gSWYgYGZvcndhcmRgIGlzIGVuYWJsZWQgZmlyZXMgdXBcbiAgICogYSBGb3J3YXJkU3RyZWFtLCBzYW1lIGhhcHBlbnMgZm9yIFByb3h5U3RyZWFtLiBUaGUgcmVxdWVzdFxuICAgKiBqdXN0IGRpZXMgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7SW5jb21pbmdNZXNzYWdlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIENvbmZpZyBvYmplY3QgcGFzc2VkIHRvIHRoZSBwcm94eVxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgc3RyZWFtOiBmdW5jdGlvbiBzdHJlYW0ocmVxLCByZXMsIG9wdGlvbnMsIF8sIHNlcnZlciwgY2xiKSB7XG5cbiAgICAvLyBBbmQgd2UgYmVnaW4hXG4gICAgc2VydmVyLmVtaXQoJ3N0YXJ0JywgcmVxLCByZXMsIG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMuZm9yd2FyZCk7XG5cbiAgICB2YXIgYWdlbnRzID0gb3B0aW9ucy5mb2xsb3dSZWRpcmVjdHMgPyBmb2xsb3dSZWRpcmVjdHMgOiBuYXRpdmVBZ2VudHM7XG4gICAgdmFyIGh0dHAgPSBhZ2VudHMuaHR0cDtcbiAgICB2YXIgaHR0cHMgPSBhZ2VudHMuaHR0cHM7XG5cbiAgICBpZihvcHRpb25zLmZvcndhcmQpIHtcbiAgICAgIC8vIElmIGZvcndhcmQgZW5hYmxlLCBzbyBqdXN0IHBpcGUgdGhlIHJlcXVlc3RcbiAgICAgIHZhciBmb3J3YXJkUmVxID0gKG9wdGlvbnMuZm9yd2FyZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBodHRwcyA6IGh0dHApLnJlcXVlc3QoXG4gICAgICAgIGNvbW1vbi5zZXR1cE91dGdvaW5nKG9wdGlvbnMuc3NsIHx8IHt9LCBvcHRpb25zLCByZXEsICdmb3J3YXJkJylcbiAgICAgICk7XG5cbiAgICAgIC8vIGVycm9yIGhhbmRsZXIgKGUuZy4gRUNPTk5SRVNFVCwgRUNPTk5SRUZVU0VEKVxuICAgICAgLy8gSGFuZGxlIGVycm9ycyBvbiBpbmNvbWluZyByZXF1ZXN0IGFzIHdlbGwgYXMgaXQgbWFrZXMgc2Vuc2UgdG9cbiAgICAgIHZhciBmb3J3YXJkRXJyb3IgPSBjcmVhdGVFcnJvckhhbmRsZXIoZm9yd2FyZFJlcSwgb3B0aW9ucy5mb3J3YXJkKTtcbiAgICAgIHJlcS5vbignZXJyb3InLCBmb3J3YXJkRXJyb3IpO1xuICAgICAgZm9yd2FyZFJlcS5vbignZXJyb3InLCBmb3J3YXJkRXJyb3IpO1xuXG4gICAgICAob3B0aW9ucy5idWZmZXIgfHwgcmVxKS5waXBlKGZvcndhcmRSZXEpO1xuICAgICAgaWYoIW9wdGlvbnMudGFyZ2V0KSB7IHJldHVybiByZXMuZW5kKCk7IH1cbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IGluaXRhbGl6YXRpb25cbiAgICB2YXIgcHJveHlSZXEgPSAob3B0aW9ucy50YXJnZXQucHJvdG9jb2wgPT09ICdodHRwczonID8gaHR0cHMgOiBodHRwKS5yZXF1ZXN0KFxuICAgICAgY29tbW9uLnNldHVwT3V0Z29pbmcob3B0aW9ucy5zc2wgfHwge30sIG9wdGlvbnMsIHJlcSlcbiAgICApO1xuXG4gICAgLy8gRW5hYmxlIGRldmVsb3BlcnMgdG8gbW9kaWZ5IHRoZSBwcm94eVJlcSBiZWZvcmUgaGVhZGVycyBhcmUgc2VudFxuICAgIHByb3h5UmVxLm9uKCdzb2NrZXQnLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICAgIGlmKHNlcnZlciAmJiAhcHJveHlSZXEuZ2V0SGVhZGVyKCdleHBlY3QnKSkge1xuICAgICAgICBzZXJ2ZXIuZW1pdCgncHJveHlSZXEnLCBwcm94eVJlcSwgcmVxLCByZXMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gYWxsb3cgb3V0Z29pbmcgc29ja2V0IHRvIHRpbWVvdXQgc28gdGhhdCB3ZSBjb3VsZFxuICAgIC8vIHNob3cgYW4gZXJyb3IgcGFnZSBhdCB0aGUgaW5pdGlhbCByZXF1ZXN0XG4gICAgaWYob3B0aW9ucy5wcm94eVRpbWVvdXQpIHtcbiAgICAgIHByb3h5UmVxLnNldFRpbWVvdXQob3B0aW9ucy5wcm94eVRpbWVvdXQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgcHJveHlSZXEuYWJvcnQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB3ZSBhYm9ydCBwcm94eSBpZiByZXF1ZXN0IGlzIGFib3J0ZWRcbiAgICByZXEub24oJ2Fib3J0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm94eVJlcS5hYm9ydCgpO1xuICAgIH0pO1xuXG4gICAgLy8gaGFuZGxlIGVycm9ycyBpbiBwcm94eSBhbmQgaW5jb21pbmcgcmVxdWVzdCwganVzdCBsaWtlIGZvciBmb3J3YXJkIHByb3h5XG4gICAgdmFyIHByb3h5RXJyb3IgPSBjcmVhdGVFcnJvckhhbmRsZXIocHJveHlSZXEsIG9wdGlvbnMudGFyZ2V0KTtcbiAgICByZXEub24oJ2Vycm9yJywgcHJveHlFcnJvcik7XG4gICAgcHJveHlSZXEub24oJ2Vycm9yJywgcHJveHlFcnJvcik7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVFcnJvckhhbmRsZXIocHJveHlSZXEsIHVybCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHByb3h5RXJyb3IoZXJyKSB7XG4gICAgICAgIGlmIChyZXEuc29ja2V0LmRlc3Ryb3llZCAmJiBlcnIuY29kZSA9PT0gJ0VDT05OUkVTRVQnKSB7XG4gICAgICAgICAgc2VydmVyLmVtaXQoJ2Vjb25ucmVzZXQnLCBlcnIsIHJlcSwgcmVzLCB1cmwpO1xuICAgICAgICAgIHJldHVybiBwcm94eVJlcS5hYm9ydCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsYikge1xuICAgICAgICAgIGNsYihlcnIsIHJlcSwgcmVzLCB1cmwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlcnZlci5lbWl0KCdlcnJvcicsIGVyciwgcmVxLCByZXMsIHVybCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAob3B0aW9ucy5idWZmZXIgfHwgcmVxKS5waXBlKHByb3h5UmVxKTtcblxuICAgIHByb3h5UmVxLm9uKCdyZXNwb25zZScsIGZ1bmN0aW9uKHByb3h5UmVzKSB7XG4gICAgICBpZihzZXJ2ZXIpIHsgc2VydmVyLmVtaXQoJ3Byb3h5UmVzJywgcHJveHlSZXMsIHJlcSwgcmVzKTsgfVxuXG4gICAgICBpZighcmVzLmhlYWRlcnNTZW50ICYmICFvcHRpb25zLnNlbGZIYW5kbGVSZXNwb25zZSkge1xuICAgICAgICBmb3IodmFyIGk9MDsgaSA8IHdlYl9vLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYod2ViX29baV0ocmVxLCByZXMsIHByb3h5UmVzLCBvcHRpb25zKSkgeyBicmVhazsgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzLmZpbmlzaGVkKSB7XG4gICAgICAgIC8vIEFsbG93IHVzIHRvIGxpc3RlbiB3aGVuIHRoZSBwcm94eSBoYXMgY29tcGxldGVkXG4gICAgICAgIHByb3h5UmVzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHNlcnZlcikgc2VydmVyLmVtaXQoJ2VuZCcsIHJlcSwgcmVzLCBwcm94eVJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBXZSBwaXBlIHRvIHRoZSByZXNwb25zZSB1bmxlc3MgaXRzIGV4cGVjdGVkIHRvIGJlIGhhbmRsZWQgYnkgdGhlIHVzZXJcbiAgICAgICAgaWYgKCFvcHRpb25zLnNlbGZIYW5kbGVSZXNwb25zZSkgcHJveHlSZXMucGlwZShyZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNlcnZlcikgc2VydmVyLmVtaXQoJ2VuZCcsIHJlcSwgcmVzLCBwcm94eVJlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxufTtcbiIsICJ2YXIgaHR0cCAgID0gcmVxdWlyZSgnaHR0cCcpLFxuICAgIGh0dHBzICA9IHJlcXVpcmUoJ2h0dHBzJyksXG4gICAgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG5cbi8qIVxuICogQXJyYXkgb2YgcGFzc2VzLlxuICpcbiAqIEEgYHBhc3NgIGlzIGp1c3QgYSBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIG9uIGByZXEsIHNvY2tldCwgb3B0aW9uc2BcbiAqIHNvIHRoYXQgeW91IGNhbiBlYXNpbHkgYWRkIG5ldyBjaGVja3Mgd2hpbGUgc3RpbGwga2VlcGluZyB0aGUgYmFzZVxuICogZmxleGlibGUuXG4gKi9cblxuLypcbiAqIFdlYnNvY2tldHMgUGFzc2VzXG4gKlxuICovXG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8qKlxuICAgKiBXZWJTb2NrZXQgcmVxdWVzdHMgbXVzdCBoYXZlIHRoZSBgR0VUYCBtZXRob2QgYW5kXG4gICAqIHRoZSBgdXBncmFkZTp3ZWJzb2NrZXRgIGhlYWRlclxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7U29ja2V0fSBXZWJzb2NrZXRcbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGNoZWNrTWV0aG9kQW5kSGVhZGVyIDogZnVuY3Rpb24gY2hlY2tNZXRob2RBbmRIZWFkZXIocmVxLCBzb2NrZXQpIHtcbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gJ0dFVCcgfHwgIXJlcS5oZWFkZXJzLnVwZ3JhZGUpIHtcbiAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocmVxLmhlYWRlcnMudXBncmFkZS50b0xvd2VyQ2FzZSgpICE9PSAnd2Vic29ja2V0Jykge1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBgeC1mb3J3YXJkZWQtKmAgaGVhZGVycyBpZiBzcGVjaWZpZWQgaW4gY29uZmlnLlxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7U29ja2V0fSBXZWJzb2NrZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBYSGVhZGVycyA6IGZ1bmN0aW9uIFhIZWFkZXJzKHJlcSwgc29ja2V0LCBvcHRpb25zKSB7XG4gICAgaWYoIW9wdGlvbnMueGZ3ZCkgcmV0dXJuO1xuXG4gICAgdmFyIHZhbHVlcyA9IHtcbiAgICAgIGZvciAgOiByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzIHx8IHJlcS5zb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICAgIHBvcnQgOiBjb21tb24uZ2V0UG9ydChyZXEpLFxuICAgICAgcHJvdG86IGNvbW1vbi5oYXNFbmNyeXB0ZWRDb25uZWN0aW9uKHJlcSkgPyAnd3NzJyA6ICd3cydcbiAgICB9O1xuXG4gICAgWydmb3InLCAncG9ydCcsICdwcm90byddLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gPVxuICAgICAgICAocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLScgKyBoZWFkZXJdIHx8ICcnKSArXG4gICAgICAgIChyZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gPyAnLCcgOiAnJykgK1xuICAgICAgICB2YWx1ZXNbaGVhZGVyXTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogRG9lcyB0aGUgYWN0dWFsIHByb3h5aW5nLiBNYWtlIHRoZSByZXF1ZXN0IGFuZCB1cGdyYWRlIGl0XG4gICAqIHNlbmQgdGhlIFN3aXRjaGluZyBQcm90b2NvbHMgcmVxdWVzdCBhbmQgcGlwZSB0aGUgc29ja2V0cy5cbiAgICpcbiAgICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBvYmplY3RcbiAgICpcdTAwQTBAcGFyYW0ge1NvY2tldH0gV2Vic29ja2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIENvbmZpZyBvYmplY3QgcGFzc2VkIHRvIHRoZSBwcm94eVxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIHN0cmVhbSA6IGZ1bmN0aW9uIHN0cmVhbShyZXEsIHNvY2tldCwgb3B0aW9ucywgaGVhZCwgc2VydmVyLCBjbGIpIHtcblxuICAgIHZhciBjcmVhdGVIdHRwSGVhZGVyID0gZnVuY3Rpb24obGluZSwgaGVhZGVycykge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGhlYWRlcnMpLnJlZHVjZShmdW5jdGlvbiAoaGVhZCwga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGhlYWRlcnNba2V5XTtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgaGVhZC5wdXNoKGtleSArICc6ICcgKyB2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhlYWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaGVhZC5wdXNoKGtleSArICc6ICcgKyB2YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWQ7XG4gICAgICB9LCBbbGluZV0pXG4gICAgICAuam9pbignXFxyXFxuJykgKyAnXFxyXFxuXFxyXFxuJztcbiAgICB9XG5cbiAgICBjb21tb24uc2V0dXBTb2NrZXQoc29ja2V0KTtcblxuICAgIGlmIChoZWFkICYmIGhlYWQubGVuZ3RoKSBzb2NrZXQudW5zaGlmdChoZWFkKTtcblxuXG4gICAgdmFyIHByb3h5UmVxID0gKGNvbW1vbi5pc1NTTC50ZXN0KG9wdGlvbnMudGFyZ2V0LnByb3RvY29sKSA/IGh0dHBzIDogaHR0cCkucmVxdWVzdChcbiAgICAgIGNvbW1vbi5zZXR1cE91dGdvaW5nKG9wdGlvbnMuc3NsIHx8IHt9LCBvcHRpb25zLCByZXEpXG4gICAgKTtcblxuICAgIC8vIEVuYWJsZSBkZXZlbG9wZXJzIHRvIG1vZGlmeSB0aGUgcHJveHlSZXEgYmVmb3JlIGhlYWRlcnMgYXJlIHNlbnRcbiAgICBpZiAoc2VydmVyKSB7IHNlcnZlci5lbWl0KCdwcm94eVJlcVdzJywgcHJveHlSZXEsIHJlcSwgc29ja2V0LCBvcHRpb25zLCBoZWFkKTsgfVxuXG4gICAgLy8gRXJyb3IgSGFuZGxlclxuICAgIHByb3h5UmVxLm9uKCdlcnJvcicsIG9uT3V0Z29pbmdFcnJvcik7XG4gICAgcHJveHlSZXEub24oJ3Jlc3BvbnNlJywgZnVuY3Rpb24gKHJlcykge1xuICAgICAgLy8gaWYgdXBncmFkZSBldmVudCBpc24ndCBnb2luZyB0byBoYXBwZW4sIGNsb3NlIHRoZSBzb2NrZXRcbiAgICAgIGlmICghcmVzLnVwZ3JhZGUpIHtcbiAgICAgICAgc29ja2V0LndyaXRlKGNyZWF0ZUh0dHBIZWFkZXIoJ0hUVFAvJyArIHJlcy5odHRwVmVyc2lvbiArICcgJyArIHJlcy5zdGF0dXNDb2RlICsgJyAnICsgcmVzLnN0YXR1c01lc3NhZ2UsIHJlcy5oZWFkZXJzKSk7XG4gICAgICAgIHJlcy5waXBlKHNvY2tldCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwcm94eVJlcS5vbigndXBncmFkZScsIGZ1bmN0aW9uKHByb3h5UmVzLCBwcm94eVNvY2tldCwgcHJveHlIZWFkKSB7XG4gICAgICBwcm94eVNvY2tldC5vbignZXJyb3InLCBvbk91dGdvaW5nRXJyb3IpO1xuXG4gICAgICAvLyBBbGxvdyB1cyB0byBsaXN0ZW4gd2hlbiB0aGUgd2Vic29ja2V0IGhhcyBjb21wbGV0ZWRcbiAgICAgIHByb3h5U29ja2V0Lm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlcnZlci5lbWl0KCdjbG9zZScsIHByb3h5UmVzLCBwcm94eVNvY2tldCwgcHJveHlIZWFkKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGUgcGlwZSBiZWxvdyB3aWxsIGVuZCBwcm94eVNvY2tldCBpZiBzb2NrZXQgY2xvc2VzIGNsZWFubHksIGJ1dCBub3RcbiAgICAgIC8vIGlmIGl0IGVycm9ycyAoZWcsIHZhbmlzaGVzIGZyb20gdGhlIG5ldCBhbmQgc3RhcnRzIHJldHVybmluZ1xuICAgICAgLy8gRUhPU1RVTlJFQUNIKS4gV2UgbmVlZCB0byBkbyB0aGF0IGV4cGxpY2l0bHkuXG4gICAgICBzb2NrZXQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBwcm94eVNvY2tldC5lbmQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb21tb24uc2V0dXBTb2NrZXQocHJveHlTb2NrZXQpO1xuXG4gICAgICBpZiAocHJveHlIZWFkICYmIHByb3h5SGVhZC5sZW5ndGgpIHByb3h5U29ja2V0LnVuc2hpZnQocHJveHlIZWFkKTtcblxuICAgICAgLy9cbiAgICAgIC8vIFJlbWFyazogSGFuZGxlIHdyaXRpbmcgdGhlIGhlYWRlcnMgdG8gdGhlIHNvY2tldCB3aGVuIHN3aXRjaGluZyBwcm90b2NvbHNcbiAgICAgIC8vIEFsc28gaGFuZGxlcyB3aGVuIGEgaGVhZGVyIGlzIGFuIGFycmF5XG4gICAgICAvL1xuICAgICAgc29ja2V0LndyaXRlKGNyZWF0ZUh0dHBIZWFkZXIoJ0hUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzJywgcHJveHlSZXMuaGVhZGVycykpO1xuXG4gICAgICBwcm94eVNvY2tldC5waXBlKHNvY2tldCkucGlwZShwcm94eVNvY2tldCk7XG5cbiAgICAgIHNlcnZlci5lbWl0KCdvcGVuJywgcHJveHlTb2NrZXQpO1xuICAgICAgc2VydmVyLmVtaXQoJ3Byb3h5U29ja2V0JywgcHJveHlTb2NrZXQpOyAgLy9ERVBSRUNBVEVELlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb3h5UmVxLmVuZCgpOyAvLyBYWFg6IENIRUNLIElGIFRISVMgSVMgVEhJUyBDT1JSRUNUXG5cbiAgICBmdW5jdGlvbiBvbk91dGdvaW5nRXJyb3IoZXJyKSB7XG4gICAgICBpZiAoY2xiKSB7XG4gICAgICAgIGNsYihlcnIsIHJlcSwgc29ja2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5lbWl0KCdlcnJvcicsIGVyciwgcmVxLCBzb2NrZXQpO1xuICAgICAgfVxuICAgICAgc29ja2V0LmVuZCgpO1xuICAgIH1cbiAgfVxufTtcbiIsICJ2YXIgaHR0cFByb3h5ID0gbW9kdWxlLmV4cG9ydHMsXG4gICAgZXh0ZW5kICAgID0gcmVxdWlyZSgndXRpbCcpLl9leHRlbmQsXG4gICAgcGFyc2VfdXJsID0gcmVxdWlyZSgndXJsJykucGFyc2UsXG4gICAgRUUzICAgICAgID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpLFxuICAgIGh0dHAgICAgICA9IHJlcXVpcmUoJ2h0dHAnKSxcbiAgICBodHRwcyAgICAgPSByZXF1aXJlKCdodHRwcycpLFxuICAgIHdlYiAgICAgICA9IHJlcXVpcmUoJy4vcGFzc2VzL3dlYi1pbmNvbWluZycpLFxuICAgIHdzICAgICAgICA9IHJlcXVpcmUoJy4vcGFzc2VzL3dzLWluY29taW5nJyk7XG5cbmh0dHBQcm94eS5TZXJ2ZXIgPSBQcm94eVNlcnZlcjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZSBsb2FkZXIgZm9yXG4gKiBlaXRoZXIgYHdzYCBvciBgd2ViYCdzICBwYXNzZXMuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgaHR0cFByb3h5LmNyZWF0ZVJpZ2h0UHJveHkoJ3dzJylcbiAqICAgIC8vID0+IFtGdW5jdGlvbl1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gVHlwZSBFaXRoZXIgJ3dzJyBvciAnd2ViJ1xuICpcdTAwQTBcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBMb2FkZXIgRnVuY3Rpb24gdGhhdCB3aGVuIGNhbGxlZCByZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciB0aGUgcmlnaHQgcGFzc2VzXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlUmlnaHRQcm94eSh0eXBlKSB7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ocmVxLCByZXMgLyosIFtoZWFkXSwgW29wdHNdICovKSB7XG4gICAgICB2YXIgcGFzc2VzID0gKHR5cGUgPT09ICd3cycpID8gdGhpcy53c1Bhc3NlcyA6IHRoaXMud2ViUGFzc2VzLFxuICAgICAgICAgIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyksXG4gICAgICAgICAgY250ciA9IGFyZ3MubGVuZ3RoIC0gMSxcbiAgICAgICAgICBoZWFkLCBjYmw7XG5cbiAgICAgIC8qIG9wdGlvbmFsIGFyZ3MgcGFyc2UgYmVnaW4gKi9cbiAgICAgIGlmKHR5cGVvZiBhcmdzW2NudHJdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNibCA9IGFyZ3NbY250cl07XG5cbiAgICAgICAgY250ci0tO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVxdWVzdE9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgaWYoXG4gICAgICAgICEoYXJnc1tjbnRyXSBpbnN0YW5jZW9mIEJ1ZmZlcikgJiZcbiAgICAgICAgYXJnc1tjbnRyXSAhPT0gcmVzXG4gICAgICApIHtcbiAgICAgICAgLy9Db3B5IGdsb2JhbCBvcHRpb25zXG4gICAgICAgIHJlcXVlc3RPcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcbiAgICAgICAgLy9PdmVyd3JpdGUgd2l0aCByZXF1ZXN0IG9wdGlvbnNcbiAgICAgICAgZXh0ZW5kKHJlcXVlc3RPcHRpb25zLCBhcmdzW2NudHJdKTtcblxuICAgICAgICBjbnRyLS07XG4gICAgICB9XG5cbiAgICAgIGlmKGFyZ3NbY250cl0gaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgaGVhZCA9IGFyZ3NbY250cl07XG4gICAgICB9XG5cbiAgICAgIC8qIG9wdGlvbmFsIGFyZ3MgcGFyc2UgZW5kICovXG5cbiAgICAgIFsndGFyZ2V0JywgJ2ZvcndhcmQnXS5mb3JFYWNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0T3B0aW9uc1tlXSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgcmVxdWVzdE9wdGlvbnNbZV0gPSBwYXJzZV91cmwocmVxdWVzdE9wdGlvbnNbZV0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVxdWVzdE9wdGlvbnMudGFyZ2V0ICYmICFyZXF1ZXN0T3B0aW9ucy5mb3J3YXJkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYSBwcm9wZXIgVVJMIGFzIHRhcmdldCcpKTtcbiAgICAgIH1cblxuICAgICAgZm9yKHZhciBpPTA7IGkgPCBwYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgb2YgcGFzc2VzIGZ1bmN0aW9uc1xuICAgICAgICAgKiBwYXNzKHJlcSwgcmVzLCBvcHRpb25zLCBoZWFkKVxuICAgICAgICAgKlxuICAgICAgICAgKiBJbiBXZWJTb2NrZXRzIGNhc2UgdGhlIGByZXNgIHZhcmlhYmxlXG4gICAgICAgICAqIHJlZmVyIHRvIHRoZSBjb25uZWN0aW9uIHNvY2tldFxuICAgICAgICAgKiBwYXNzKHJlcSwgc29ja2V0LCBvcHRpb25zLCBoZWFkKVxuICAgICAgICAgKi9cbiAgICAgICAgaWYocGFzc2VzW2ldKHJlcSwgcmVzLCByZXF1ZXN0T3B0aW9ucywgaGVhZCwgdGhpcywgY2JsKSkgeyAvLyBwYXNzZXMgY2FuIHJldHVybiBhIHRydXRoeSB2YWx1ZSB0byBoYWx0IHRoZSBsb29wXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xufVxuaHR0cFByb3h5LmNyZWF0ZVJpZ2h0UHJveHkgPSBjcmVhdGVSaWdodFByb3h5O1xuXG5mdW5jdGlvbiBQcm94eVNlcnZlcihvcHRpb25zKSB7XG4gIEVFMy5jYWxsKHRoaXMpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnByZXBlbmRQYXRoID0gb3B0aW9ucy5wcmVwZW5kUGF0aCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7XG5cbiAgdGhpcy53ZWIgPSB0aGlzLnByb3h5UmVxdWVzdCAgICAgICAgICAgPSBjcmVhdGVSaWdodFByb3h5KCd3ZWInKShvcHRpb25zKTtcbiAgdGhpcy53cyAgPSB0aGlzLnByb3h5V2Vic29ja2V0UmVxdWVzdCAgPSBjcmVhdGVSaWdodFByb3h5KCd3cycpKG9wdGlvbnMpO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gIHRoaXMud2ViUGFzc2VzID0gT2JqZWN0LmtleXMod2ViKS5tYXAoZnVuY3Rpb24ocGFzcykge1xuICAgIHJldHVybiB3ZWJbcGFzc107XG4gIH0pO1xuXG4gIHRoaXMud3NQYXNzZXMgPSBPYmplY3Qua2V5cyh3cykubWFwKGZ1bmN0aW9uKHBhc3MpIHtcbiAgICByZXR1cm4gd3NbcGFzc107XG4gIH0pO1xuXG4gIHRoaXMub24oJ2Vycm9yJywgdGhpcy5vbkVycm9yLCB0aGlzKTtcblxufVxuXG5yZXF1aXJlKCd1dGlsJykuaW5oZXJpdHMoUHJveHlTZXJ2ZXIsIEVFMyk7XG5cblByb3h5U2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAvL1xuICAvLyBSZW1hcms6IFJlcGxpY2F0ZSBub2RlIGNvcmUgYmVoYXZpb3IgdXNpbmcgRUUzXG4gIC8vIHNvIHdlIGZvcmNlIHBlb3BsZSB0byBoYW5kbGUgdGhlaXIgb3duIGVycm9yc1xuICAvL1xuICBpZih0aGlzLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGggPT09IDEpIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn07XG5cblByb3h5U2VydmVyLnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbihwb3J0LCBob3N0bmFtZSkge1xuICB2YXIgc2VsZiAgICA9IHRoaXMsXG4gICAgICBjbG9zdXJlID0gZnVuY3Rpb24ocmVxLCByZXMpIHsgc2VsZi53ZWIocmVxLCByZXMpOyB9O1xuXG4gIHRoaXMuX3NlcnZlciAgPSB0aGlzLm9wdGlvbnMuc3NsID9cbiAgICBodHRwcy5jcmVhdGVTZXJ2ZXIodGhpcy5vcHRpb25zLnNzbCwgY2xvc3VyZSkgOlxuICAgIGh0dHAuY3JlYXRlU2VydmVyKGNsb3N1cmUpO1xuXG4gIGlmKHRoaXMub3B0aW9ucy53cykge1xuICAgIHRoaXMuX3NlcnZlci5vbigndXBncmFkZScsIGZ1bmN0aW9uKHJlcSwgc29ja2V0LCBoZWFkKSB7IHNlbGYud3MocmVxLCBzb2NrZXQsIGhlYWQpOyB9KTtcbiAgfVxuXG4gIHRoaXMuX3NlcnZlci5saXN0ZW4ocG9ydCwgaG9zdG5hbWUpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuUHJveHlTZXJ2ZXIucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAodGhpcy5fc2VydmVyKSB7XG4gICAgdGhpcy5fc2VydmVyLmNsb3NlKGRvbmUpO1xuICB9XG5cbiAgLy8gV3JhcCBjYWxsYmFjayB0byBudWxsaWZ5IHNlcnZlciBhZnRlciBhbGwgb3BlbiBjb25uZWN0aW9ucyBhcmUgY2xvc2VkLlxuICBmdW5jdGlvbiBkb25lKCkge1xuICAgIHNlbGYuX3NlcnZlciA9IG51bGw7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfTtcbn07XG5cblByb3h5U2VydmVyLnByb3RvdHlwZS5iZWZvcmUgPSBmdW5jdGlvbih0eXBlLCBwYXNzTmFtZSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGUgIT09ICd3cycgJiYgdHlwZSAhPT0gJ3dlYicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGUgbXVzdCBiZSBgd2ViYCBvciBgd3NgJyk7XG4gIH1cbiAgdmFyIHBhc3NlcyA9ICh0eXBlID09PSAnd3MnKSA/IHRoaXMud3NQYXNzZXMgOiB0aGlzLndlYlBhc3NlcyxcbiAgICAgIGkgPSBmYWxzZTtcblxuICBwYXNzZXMuZm9yRWFjaChmdW5jdGlvbih2LCBpZHgpIHtcbiAgICBpZih2Lm5hbWUgPT09IHBhc3NOYW1lKSBpID0gaWR4O1xuICB9KVxuXG4gIGlmKGkgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1Y2ggcGFzcycpO1xuXG4gIHBhc3Nlcy5zcGxpY2UoaSwgMCwgY2FsbGJhY2spO1xufTtcblByb3h5U2VydmVyLnByb3RvdHlwZS5hZnRlciA9IGZ1bmN0aW9uKHR5cGUsIHBhc3NOYW1lLCBjYWxsYmFjaykge1xuICBpZiAodHlwZSAhPT0gJ3dzJyAmJiB0eXBlICE9PSAnd2ViJykge1xuICAgIHRocm93IG5ldyBFcnJvcigndHlwZSBtdXN0IGJlIGB3ZWJgIG9yIGB3c2AnKTtcbiAgfVxuICB2YXIgcGFzc2VzID0gKHR5cGUgPT09ICd3cycpID8gdGhpcy53c1Bhc3NlcyA6IHRoaXMud2ViUGFzc2VzLFxuICAgICAgaSA9IGZhbHNlO1xuXG4gIHBhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKHYsIGlkeCkge1xuICAgIGlmKHYubmFtZSA9PT0gcGFzc05hbWUpIGkgPSBpZHg7XG4gIH0pXG5cbiAgaWYoaSA9PT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcignTm8gc3VjaCBwYXNzJyk7XG5cbiAgcGFzc2VzLnNwbGljZShpKyssIDAsIGNhbGxiYWNrKTtcbn07XG4iLCAiIC8vIFVzZSBleHBsaWNpdCAvaW5kZXguanMgdG8gaGVscCBicm93c2VyaWZ5IG5lZ29jaWF0aW9uIGluIHJlcXVpcmUgJy9saWIvaHR0cC1wcm94eScgKCEpXG52YXIgUHJveHlTZXJ2ZXIgPSByZXF1aXJlKCcuL2h0dHAtcHJveHkvaW5kZXguanMnKS5TZXJ2ZXI7XG5cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBwcm94eSBzZXJ2ZXIuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgaHR0cFByb3h5LmNyZWF0ZVByb3h5U2VydmVyKHsgLi4gfSwgODAwMClcbiAqICAgIC8vID0+ICd7IHdlYjogW0Z1bmN0aW9uXSwgd3M6IFtGdW5jdGlvbl0gLi4uIH0nXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBQcm94eSBQcm94eSBvYmplY3Qgd2l0aCBoYW5kbGVycyBmb3IgYHdzYCBhbmQgYHdlYmAgcmVxdWVzdHNcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblxuZnVuY3Rpb24gY3JlYXRlUHJveHlTZXJ2ZXIob3B0aW9ucykge1xuICAvKlxuICAgKiAgYG9wdGlvbnNgIGlzIG5lZWRlZCBhbmQgaXQgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgbGF5b3V0OlxuICAgKlxuICAgKiAge1xuICAgKiAgICB0YXJnZXQgOiA8dXJsIHN0cmluZyB0byBiZSBwYXJzZWQgd2l0aCB0aGUgdXJsIG1vZHVsZT5cbiAgICogICAgZm9yd2FyZDogPHVybCBzdHJpbmcgdG8gYmUgcGFyc2VkIHdpdGggdGhlIHVybCBtb2R1bGU+XG4gICAqICAgIGFnZW50ICA6IDxvYmplY3QgdG8gYmUgcGFzc2VkIHRvIGh0dHAocykucmVxdWVzdD5cbiAgICogICAgc3NsICAgIDogPG9iamVjdCB0byBiZSBwYXNzZWQgdG8gaHR0cHMuY3JlYXRlU2VydmVyKCk+XG4gICAqICAgIHdzICAgICA6IDx0cnVlL2ZhbHNlLCBpZiB5b3Ugd2FudCB0byBwcm94eSB3ZWJzb2NrZXRzPlxuICAgKiAgICB4ZndkICAgOiA8dHJ1ZS9mYWxzZSwgYWRkcyB4LWZvcndhcmQgaGVhZGVycz5cbiAgICogICAgc2VjdXJlIDogPHRydWUvZmFsc2UsIHZlcmlmeSBTU0wgY2VydGlmaWNhdGU+XG4gICAqICAgIHRvUHJveHk6IDx0cnVlL2ZhbHNlLCBleHBsaWNpdGx5IHNwZWNpZnkgaWYgd2UgYXJlIHByb3h5aW5nIHRvIGFub3RoZXIgcHJveHk+XG4gICAqICAgIHByZXBlbmRQYXRoOiA8dHJ1ZS9mYWxzZSwgRGVmYXVsdDogdHJ1ZSAtIHNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0byBwcmVwZW5kIHRoZSB0YXJnZXQncyBwYXRoIHRvIHRoZSBwcm94eSBwYXRoPlxuICAgKiAgICBpZ25vcmVQYXRoOiA8dHJ1ZS9mYWxzZSwgRGVmYXVsdDogZmFsc2UgLSBzcGVjaWZ5IHdoZXRoZXIgeW91IHdhbnQgdG8gaWdub3JlIHRoZSBwcm94eSBwYXRoIG9mIHRoZSBpbmNvbWluZyByZXF1ZXN0PlxuICAgKiAgICBsb2NhbEFkZHJlc3MgOiA8TG9jYWwgaW50ZXJmYWNlIHN0cmluZyB0byBiaW5kIGZvciBvdXRnb2luZyBjb25uZWN0aW9ucz5cbiAgICogICAgY2hhbmdlT3JpZ2luOiA8dHJ1ZS9mYWxzZSwgRGVmYXVsdDogZmFsc2UgLSBjaGFuZ2VzIHRoZSBvcmlnaW4gb2YgdGhlIGhvc3QgaGVhZGVyIHRvIHRoZSB0YXJnZXQgVVJMPlxuICAgKiAgICBwcmVzZXJ2ZUhlYWRlcktleUNhc2U6IDx0cnVlL2ZhbHNlLCBEZWZhdWx0OiBmYWxzZSAtIHNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0byBrZWVwIGxldHRlciBjYXNlIG9mIHJlc3BvbnNlIGhlYWRlciBrZXkgPlxuICAgKiAgICBhdXRoICAgOiBCYXNpYyBhdXRoZW50aWNhdGlvbiBpLmUuICd1c2VyOnBhc3N3b3JkJyB0byBjb21wdXRlIGFuIEF1dGhvcml6YXRpb24gaGVhZGVyLlxuICAgKiAgICBob3N0UmV3cml0ZTogcmV3cml0ZXMgdGhlIGxvY2F0aW9uIGhvc3RuYW1lIG9uICgyMDEvMzAxLzMwMi8zMDcvMzA4KSByZWRpcmVjdHMsIERlZmF1bHQ6IG51bGwuXG4gICAqICAgIGF1dG9SZXdyaXRlOiByZXdyaXRlcyB0aGUgbG9jYXRpb24gaG9zdC9wb3J0IG9uICgyMDEvMzAxLzMwMi8zMDcvMzA4KSByZWRpcmVjdHMgYmFzZWQgb24gcmVxdWVzdGVkIGhvc3QvcG9ydC4gRGVmYXVsdDogZmFsc2UuXG4gICAqICAgIHByb3RvY29sUmV3cml0ZTogcmV3cml0ZXMgdGhlIGxvY2F0aW9uIHByb3RvY29sIG9uICgyMDEvMzAxLzMwMi8zMDcvMzA4KSByZWRpcmVjdHMgdG8gJ2h0dHAnIG9yICdodHRwcycuIERlZmF1bHQ6IG51bGwuXG4gICAqICB9XG4gICAqXG4gICAqICBOT1RFOiBgb3B0aW9ucy53c2AgYW5kIGBvcHRpb25zLnNzbGAgYXJlIG9wdGlvbmFsLlxuICAgKiAgICBgb3B0aW9ucy50YXJnZXQgYW5kIGBvcHRpb25zLmZvcndhcmRgIGNhbm5vdCBiZVxuICAgKiAgICBib3RoIG1pc3NpbmdcbiAgICogIH1cbiAgICovXG5cbiAgcmV0dXJuIG5ldyBQcm94eVNlcnZlcihvcHRpb25zKTtcbn1cblxuXG5Qcm94eVNlcnZlci5jcmVhdGVQcm94eVNlcnZlciA9IGNyZWF0ZVByb3h5U2VydmVyO1xuUHJveHlTZXJ2ZXIuY3JlYXRlU2VydmVyICAgICAgPSBjcmVhdGVQcm94eVNlcnZlcjtcblByb3h5U2VydmVyLmNyZWF0ZVByb3h5ICAgICAgID0gY3JlYXRlUHJveHlTZXJ2ZXI7XG5cblxuXG5cbi8qKlxuICogRXhwb3J0IHRoZSBwcm94eSBcIlNlcnZlclwiIGFzIHRoZSBtYWluIGV4cG9ydC5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBQcm94eVNlcnZlcjtcblxuIiwgIi8qIVxuICogQ2Fyb24gZGltb25pbywgY29uIG9jY2hpIGRpIGJyYWdpYVxuICogbG9ybyBhY2Nlbm5hbmRvLCB0dXR0ZSBsZSByYWNjb2dsaWU7XG4gKiBiYXR0ZSBjb2wgcmVtbyBxdWFsdW5xdWUgc1x1MjAxOWFkYWdpYSBcbiAqXG4gKiBDaGFyb24gdGhlIGRlbW9uLCB3aXRoIHRoZSBleWVzIG9mIGdsZWRlLFxuICogQmVja29uaW5nIHRvIHRoZW0sIGNvbGxlY3RzIHRoZW0gYWxsIHRvZ2V0aGVyLFxuICogQmVhdHMgd2l0aCBoaXMgb2FyIHdob2V2ZXIgbGFncyBiZWhpbmRcbiAqICAgICAgICAgIFxuICogICAgICAgICAgRGFudGUgLSBUaGUgRGl2aW5lIENvbWVkeSAoQ2FudG8gSUlJKVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvaHR0cC1wcm94eScpOyIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWUgPT4ge1xuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gcHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkVSUk9SUyA9IHZvaWQgMDtcbnZhciBFUlJPUlM7XG4oZnVuY3Rpb24gKEVSUk9SUykge1xuICAgIEVSUk9SU1tcIkVSUl9DT05GSUdfRkFDVE9SWV9UQVJHRVRfTUlTU0lOR1wiXSA9IFwiW0hQTV0gTWlzc2luZyBcXFwidGFyZ2V0XFxcIiBvcHRpb24uIEV4YW1wbGU6IHt0YXJnZXQ6IFxcXCJodHRwOi8vd3d3LmV4YW1wbGUub3JnXFxcIn1cIjtcbiAgICBFUlJPUlNbXCJFUlJfQ09OVEVYVF9NQVRDSEVSX0dFTkVSSUNcIl0gPSBcIltIUE1dIEludmFsaWQgY29udGV4dC4gRXhwZWN0aW5nIHNvbWV0aGluZyBsaWtlOiBcXFwiL2FwaVxcXCIgb3IgW1xcXCIvYXBpXFxcIiwgXFxcIi9hamF4XFxcIl1cIjtcbiAgICBFUlJPUlNbXCJFUlJfQ09OVEVYVF9NQVRDSEVSX0lOVkFMSURfQVJSQVlcIl0gPSBcIltIUE1dIEludmFsaWQgY29udGV4dC4gRXhwZWN0aW5nIHNvbWV0aGluZyBsaWtlOiBbXFxcIi9hcGlcXFwiLCBcXFwiL2FqYXhcXFwiXSBvciBbXFxcIi9hcGkvKipcXFwiLCBcXFwiISoqLmh0bWxcXFwiXVwiO1xuICAgIEVSUk9SU1tcIkVSUl9QQVRIX1JFV1JJVEVSX0NPTkZJR1wiXSA9IFwiW0hQTV0gSW52YWxpZCBwYXRoUmV3cml0ZSBjb25maWcuIEV4cGVjdGluZyBvYmplY3Qgd2l0aCBwYXRoUmV3cml0ZSBjb25maWcgb3IgYSByZXdyaXRlIGZ1bmN0aW9uXCI7XG59KShFUlJPUlMgPSBleHBvcnRzLkVSUk9SUyB8fCAoZXhwb3J0cy5FUlJPUlMgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLXJlc3QtcGFyYW1zICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEFycm93ID0gZXhwb3J0cy5nZXRJbnN0YW5jZSA9IHZvaWQgMDtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKFwidXRpbFwiKTtcbmxldCBsb2dnZXJJbnN0YW5jZTtcbmNvbnN0IGRlZmF1bHRQcm92aWRlciA9IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTogbm8tY29uc29sZVxuICAgIGxvZzogY29uc29sZS5sb2csXG4gICAgZGVidWc6IGNvbnNvbGUubG9nLFxuICAgIGluZm86IGNvbnNvbGUuaW5mbyxcbiAgICB3YXJuOiBjb25zb2xlLndhcm4sXG4gICAgZXJyb3I6IGNvbnNvbGUuZXJyb3IsXG59O1xuLy8gbG9nIGxldmVsICd3ZWlnaHQnXG52YXIgTEVWRUxTO1xuKGZ1bmN0aW9uIChMRVZFTFMpIHtcbiAgICBMRVZFTFNbTEVWRUxTW1wiZGVidWdcIl0gPSAxMF0gPSBcImRlYnVnXCI7XG4gICAgTEVWRUxTW0xFVkVMU1tcImluZm9cIl0gPSAyMF0gPSBcImluZm9cIjtcbiAgICBMRVZFTFNbTEVWRUxTW1wid2FyblwiXSA9IDMwXSA9IFwid2FyblwiO1xuICAgIExFVkVMU1tMRVZFTFNbXCJlcnJvclwiXSA9IDUwXSA9IFwiZXJyb3JcIjtcbiAgICBMRVZFTFNbTEVWRUxTW1wic2lsZW50XCJdID0gODBdID0gXCJzaWxlbnRcIjtcbn0pKExFVkVMUyB8fCAoTEVWRUxTID0ge30pKTtcbmZ1bmN0aW9uIGdldEluc3RhbmNlKCkge1xuICAgIGlmICghbG9nZ2VySW5zdGFuY2UpIHtcbiAgICAgICAgbG9nZ2VySW5zdGFuY2UgPSBuZXcgTG9nZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBsb2dnZXJJbnN0YW5jZTtcbn1cbmV4cG9ydHMuZ2V0SW5zdGFuY2UgPSBnZXRJbnN0YW5jZTtcbmNsYXNzIExvZ2dlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2V0TGV2ZWwoJ2luZm8nKTtcbiAgICAgICAgdGhpcy5zZXRQcm92aWRlcigoKSA9PiBkZWZhdWx0UHJvdmlkZXIpO1xuICAgIH1cbiAgICAvLyBsb2cgd2lsbCBsb2cgbWVzc2FnZXMsIHJlZ2FyZGxlc3Mgb2YgbG9nTGV2ZWxzXG4gICAgbG9nKCkge1xuICAgICAgICB0aGlzLnByb3ZpZGVyLmxvZyh0aGlzLl9pbnRlcnBvbGF0ZS5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbiAgICB9XG4gICAgZGVidWcoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93TGV2ZWwoJ2RlYnVnJykpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXIuZGVidWcodGhpcy5faW50ZXJwb2xhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5mbygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dMZXZlbCgnaW5mbycpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVyLmluZm8odGhpcy5faW50ZXJwb2xhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2FybigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dMZXZlbCgnd2FybicpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVyLndhcm4odGhpcy5faW50ZXJwb2xhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXJyb3IoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93TGV2ZWwoJ2Vycm9yJykpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXIuZXJyb3IodGhpcy5faW50ZXJwb2xhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0TGV2ZWwodikge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkTGV2ZWwodikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nTGV2ZWwgPSB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFByb3ZpZGVyKGZuKSB7XG4gICAgICAgIGlmIChmbiAmJiB0aGlzLmlzVmFsaWRQcm92aWRlcihmbikpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXIgPSBmbihkZWZhdWx0UHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzVmFsaWRQcm92aWRlcihmblByb3ZpZGVyKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgICAgIGlmIChmblByb3ZpZGVyICYmIHR5cGVvZiBmblByb3ZpZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tIUE1dIExvZyBwcm92aWRlciBjb25maWcgZXJyb3IuIEV4cGVjdGluZyBhIGZ1bmN0aW9uLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlzVmFsaWRMZXZlbChsZXZlbE5hbWUpIHtcbiAgICAgICAgY29uc3QgdmFsaWRMZXZlbHMgPSBPYmplY3Qua2V5cyhMRVZFTFMpO1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRMZXZlbHMuaW5jbHVkZXMobGV2ZWxOYW1lKTtcbiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tIUE1dIExvZyBsZXZlbCBlcnJvci4gSW52YWxpZCBsb2dMZXZlbC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVjaWRlIHRvIGxvZyBvciBub3QgdG8gbG9nLCBiYXNlZCBvbiB0aGUgbG9nIGxldmVscyAnd2VpZ2h0J1xuICAgICAqIEBwYXJhbSAge1N0cmluZ30gIHNob3dMZXZlbCBbZGVidWcsIGluZm8sIHdhcm4sIGVycm9yLCBzaWxlbnRdXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBfc2hvd0xldmVsKHNob3dMZXZlbCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMb2dMZXZlbCA9IExFVkVMU1t0aGlzLmxvZ0xldmVsXTtcbiAgICAgICAgaWYgKGN1cnJlbnRMb2dMZXZlbCAmJiBjdXJyZW50TG9nTGV2ZWwgPD0gTEVWRUxTW3Nob3dMZXZlbF0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIGxvZ2dlZCBtZXNzYWdlcyBhbmQgaXRzIGRhdGEgYXJlIHJldHVybiBpbnRlcnBvbGF0ZWRcbiAgICAvLyBtYWtlIGl0IHBvc3NpYmxlIGZvciBhZGRpdGlvbmFsIGxvZyBkYXRhLCBzdWNoIGRhdGUvdGltZSBvciBjdXN0b20gcHJlZml4LlxuICAgIF9pbnRlcnBvbGF0ZShmb3JtYXQsIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdXRpbC5mb3JtYXQoZm9ybWF0LCAuLi5hcmdzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbiAqIC0+IG5vcm1hbCBwcm94eVxuICogPT4gcm91dGVyXG4gKiB+PiBwYXRoUmV3cml0ZVxuICogXHUyMjQ4PiByb3V0ZXIgKyBwYXRoUmV3cml0ZVxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gb3JpZ2luYWxQYXRoXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG5ld1BhdGhcbiAqIEBwYXJhbSAge1N0cmluZ30gb3JpZ2luYWxUYXJnZXRcbiAqIEBwYXJhbSAge1N0cmluZ30gbmV3VGFyZ2V0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldEFycm93KG9yaWdpbmFsUGF0aCwgbmV3UGF0aCwgb3JpZ2luYWxUYXJnZXQsIG5ld1RhcmdldCkge1xuICAgIGNvbnN0IGFycm93ID0gWyc+J107XG4gICAgY29uc3QgaXNOZXdUYXJnZXQgPSBvcmlnaW5hbFRhcmdldCAhPT0gbmV3VGFyZ2V0OyAvLyByb3V0ZXJcbiAgICBjb25zdCBpc05ld1BhdGggPSBvcmlnaW5hbFBhdGggIT09IG5ld1BhdGg7IC8vIHBhdGhSZXdyaXRlXG4gICAgaWYgKGlzTmV3UGF0aCAmJiAhaXNOZXdUYXJnZXQpIHtcbiAgICAgICAgYXJyb3cudW5zaGlmdCgnficpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNOZXdQYXRoICYmIGlzTmV3VGFyZ2V0KSB7XG4gICAgICAgIGFycm93LnVuc2hpZnQoJz0nKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNOZXdQYXRoICYmIGlzTmV3VGFyZ2V0KSB7XG4gICAgICAgIGFycm93LnVuc2hpZnQoJ1x1MjI0OCcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXJyb3cudW5zaGlmdCgnLScpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyb3cuam9pbignJyk7XG59XG5leHBvcnRzLmdldEFycm93ID0gZ2V0QXJyb3c7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUNvbmZpZyA9IHZvaWQgMDtcbmNvbnN0IGlzUGxhaW5PYmogPSByZXF1aXJlKFwiaXMtcGxhaW4tb2JqXCIpO1xuY29uc3QgdXJsID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgbG9nZ2VyXzEgPSByZXF1aXJlKFwiLi9sb2dnZXJcIik7XG5jb25zdCBsb2dnZXIgPSAoMCwgbG9nZ2VyXzEuZ2V0SW5zdGFuY2UpKCk7XG5mdW5jdGlvbiBjcmVhdGVDb25maWcoY29udGV4dCwgb3B0cykge1xuICAgIC8vIHN0cnVjdHVyZSBvZiBjb25maWcgb2JqZWN0IHRvIGJlIHJldHVybmVkXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICBjb250ZXh0OiB1bmRlZmluZWQsXG4gICAgICAgIG9wdGlvbnM6IHt9LFxuICAgIH07XG4gICAgLy8gYXBwLnVzZSgnL2FwaScsIHByb3h5KHt0YXJnZXQ6J2h0dHA6Ly9sb2NhbGhvc3Q6OTAwMCd9KSk7XG4gICAgaWYgKGlzQ29udGV4dGxlc3MoY29udGV4dCwgb3B0cykpIHtcbiAgICAgICAgY29uZmlnLmNvbnRleHQgPSAnLyc7XG4gICAgICAgIGNvbmZpZy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihjb25maWcub3B0aW9ucywgY29udGV4dCk7XG4gICAgICAgIC8vIGFwcC51c2UoJy9hcGknLCBwcm94eSgnaHR0cDovL2xvY2FsaG9zdDo5MDAwJykpO1xuICAgICAgICAvLyBhcHAudXNlKHByb3h5KCdodHRwOi8vbG9jYWxob3N0OjkwMDAvYXBpJykpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1N0cmluZ1Nob3J0SGFuZChjb250ZXh0KSkge1xuICAgICAgICBjb25zdCBvVXJsID0gdXJsLnBhcnNlKGNvbnRleHQpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBbb1VybC5wcm90b2NvbCwgJy8vJywgb1VybC5ob3N0XS5qb2luKCcnKTtcbiAgICAgICAgY29uZmlnLmNvbnRleHQgPSBvVXJsLnBhdGhuYW1lIHx8ICcvJztcbiAgICAgICAgY29uZmlnLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKGNvbmZpZy5vcHRpb25zLCB7IHRhcmdldCB9LCBvcHRzKTtcbiAgICAgICAgaWYgKG9VcmwucHJvdG9jb2wgPT09ICd3czonIHx8IG9VcmwucHJvdG9jb2wgPT09ICd3c3M6Jykge1xuICAgICAgICAgICAgY29uZmlnLm9wdGlvbnMud3MgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFwcC51c2UoJy9hcGknLCBwcm94eSh7dGFyZ2V0OidodHRwOi8vbG9jYWxob3N0OjkwMDAnfSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uZmlnLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBjb25maWcub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oY29uZmlnLm9wdGlvbnMsIG9wdHMpO1xuICAgIH1cbiAgICBjb25maWd1cmVMb2dnZXIoY29uZmlnLm9wdGlvbnMpO1xuICAgIGlmICghY29uZmlnLm9wdGlvbnMudGFyZ2V0ICYmICFjb25maWcub3B0aW9ucy5yb3V0ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yc18xLkVSUk9SUy5FUlJfQ09ORklHX0ZBQ1RPUllfVEFSR0VUX01JU1NJTkcpO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xufVxuZXhwb3J0cy5jcmVhdGVDb25maWcgPSBjcmVhdGVDb25maWc7XG4vKipcbiAqIENoZWNrcyBpZiBhIFN0cmluZyBvbmx5IHRhcmdldC9jb25maWcgaXMgcHJvdmlkZWQuXG4gKiBUaGlzIGNhbiBiZSBqdXN0IHRoZSBob3N0IG9yIHdpdGggdGhlIG9wdGlvbmFsIHBhdGguXG4gKlxuICogQGV4YW1wbGVcbiAqICAgICAgYXBwLnVzZSgnL2FwaScsIHByb3h5KCdodHRwOi8vbG9jYWxob3N0OjkwMDAnKSk7XG4gKiAgICAgIGFwcC51c2UocHJveHkoJ2h0dHA6Ly9sb2NhbGhvc3Q6OTAwMC9hcGknKSk7XG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSAgY29udGV4dCBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmdTaG9ydEhhbmQoY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICEhdXJsLnBhcnNlKGNvbnRleHQpLmhvc3Q7XG4gICAgfVxufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBPYmplY3Qgb25seSBjb25maWcgaXMgcHJvdmlkZWQsIHdpdGhvdXQgYSBjb250ZXh0LlxuICogSW4gdGhpcyBjYXNlIHRoZSBhbGwgcGF0aHMgd2lsbCBiZSBwcm94aWVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgYXBwLnVzZSgnL2FwaScsIHByb3h5KHt0YXJnZXQ6J2h0dHA6Ly9sb2NhbGhvc3Q6OTAwMCd9KSk7XG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSAgY29udGV4dCBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHsqfSAgICAgICBvcHRzICAgIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICAgW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBpc0NvbnRleHRsZXNzKGNvbnRleHQsIG9wdHMpIHtcbiAgICByZXR1cm4gaXNQbGFpbk9iaihjb250ZXh0KSAmJiAob3B0cyA9PSBudWxsIHx8IE9iamVjdC5rZXlzKG9wdHMpLmxlbmd0aCA9PT0gMCk7XG59XG5mdW5jdGlvbiBjb25maWd1cmVMb2dnZXIob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmxvZ0xldmVsKSB7XG4gICAgICAgIGxvZ2dlci5zZXRMZXZlbChvcHRpb25zLmxvZ0xldmVsKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubG9nUHJvdmlkZXIpIHtcbiAgICAgICAgbG9nZ2VyLnNldFByb3ZpZGVyKG9wdGlvbnMubG9nUHJvdmlkZXIpO1xuICAgIH1cbn1cbiIsICIvKiFcbiAqIGlzLWV4dGdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWV4dGdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNFeHRnbG9iKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgc3RyID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBtYXRjaDtcbiAgd2hpbGUgKChtYXRjaCA9IC8oXFxcXCkufChbQD8hKypdXFwoLipcXCkpL2cuZXhlYyhzdHIpKSkge1xuICAgIGlmIChtYXRjaFsyXSkgcmV0dXJuIHRydWU7XG4gICAgc3RyID0gc3RyLnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCAiLyohXG4gKiBpcy1nbG9iIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1nbG9iPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG52YXIgaXNFeHRnbG9iID0gcmVxdWlyZSgnaXMtZXh0Z2xvYicpO1xudmFyIGNoYXJzID0geyAneyc6ICd9JywgJygnOiAnKScsICdbJzogJ10nfTtcbnZhciBzdHJpY3RDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcGlwZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZVNxdWFyZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZUN1cmx5SW5kZXggPSAtMjtcbiAgdmFyIGNsb3NlUGFyZW5JbmRleCA9IC0yO1xuICB2YXIgYmFja1NsYXNoSW5kZXggPSAtMjtcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIGlmIChzdHJbaW5kZXhdID09PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bXFxdLispXS8udGVzdChzdHJbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlU3F1YXJlSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICdbJyAmJiBzdHJbaW5kZXggKyAxXSAhPT0gJ10nKSB7XG4gICAgICBpZiAoY2xvc2VTcXVhcmVJbmRleCA8IGluZGV4KSB7XG4gICAgICAgIGNsb3NlU3F1YXJlSW5kZXggPSBzdHIuaW5kZXhPZignXScsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9zZVNxdWFyZUluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlU3F1YXJlSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrU2xhc2hJbmRleCA9IHN0ci5pbmRleE9mKCdcXFxcJywgaW5kZXgpO1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VTcXVhcmVJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlQ3VybHlJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJ3snICYmIHN0cltpbmRleCArIDFdICE9PSAnfScpIHtcbiAgICAgIGNsb3NlQ3VybHlJbmRleCA9IHN0ci5pbmRleE9mKCd9JywgaW5kZXgpO1xuICAgICAgaWYgKGNsb3NlQ3VybHlJbmRleCA+IGluZGV4KSB7XG4gICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBpbmRleCk7XG4gICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZUN1cmx5SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbG9zZVBhcmVuSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICcoJyAmJiBzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bOiE9XS8udGVzdChzdHJbaW5kZXggKyAyXSkgJiYgc3RyW2luZGV4ICsgM10gIT09ICcpJykge1xuICAgICAgY2xvc2VQYXJlbkluZGV4ID0gc3RyLmluZGV4T2YoJyknLCBpbmRleCk7XG4gICAgICBpZiAoY2xvc2VQYXJlbkluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIGluZGV4KTtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlUGFyZW5JbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBpcGVJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJygnICYmIHN0cltpbmRleCArIDFdICE9PSAnfCcpIHtcbiAgICAgIGlmIChwaXBlSW5kZXggPCBpbmRleCkge1xuICAgICAgICBwaXBlSW5kZXggPSBzdHIuaW5kZXhPZignfCcsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChwaXBlSW5kZXggIT09IC0xICYmIHN0cltwaXBlSW5kZXggKyAxXSAhPT0gJyknKSB7XG4gICAgICAgIGNsb3NlUGFyZW5JbmRleCA9IHN0ci5pbmRleE9mKCcpJywgcGlwZUluZGV4KTtcbiAgICAgICAgaWYgKGNsb3NlUGFyZW5JbmRleCA+IHBpcGVJbmRleCkge1xuICAgICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBwaXBlSW5kZXgpO1xuICAgICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZVBhcmVuSW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHJlbGF4ZWRDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgaWYgKC9bKj97fSgpW1xcXV0vLnRlc3Qoc3RyW2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0dsb2Ioc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzRXh0Z2xvYihzdHIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgY2hlY2sgPSBzdHJpY3RDaGVjaztcblxuICAvLyBvcHRpb25hbGx5IHJlbGF4IGNoZWNrXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0ID09PSBmYWxzZSkge1xuICAgIGNoZWNrID0gcmVsYXhlZENoZWNrO1xuICB9XG5cbiAgcmV0dXJuIGNoZWNrKHN0cik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5pc0ludGVnZXIgPSBudW0gPT4ge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihudW0pO1xuICB9XG4gIGlmICh0eXBlb2YgbnVtID09PSAnc3RyaW5nJyAmJiBudW0udHJpbSgpICE9PSAnJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcihudW0pKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEZpbmQgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlXG4gKi9cblxuZXhwb3J0cy5maW5kID0gKG5vZGUsIHR5cGUpID0+IG5vZGUubm9kZXMuZmluZChub2RlID0+IG5vZGUudHlwZSA9PT0gdHlwZSk7XG5cbi8qKlxuICogRmluZCBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGVcbiAqL1xuXG5leHBvcnRzLmV4Y2VlZHNMaW1pdCA9IChtaW4sIG1heCwgc3RlcCA9IDEsIGxpbWl0KSA9PiB7XG4gIGlmIChsaW1pdCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFleHBvcnRzLmlzSW50ZWdlcihtaW4pIHx8ICFleHBvcnRzLmlzSW50ZWdlcihtYXgpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoKE51bWJlcihtYXgpIC0gTnVtYmVyKG1pbikpIC8gTnVtYmVyKHN0ZXApKSA+PSBsaW1pdDtcbn07XG5cbi8qKlxuICogRXNjYXBlIHRoZSBnaXZlbiBub2RlIHdpdGggJ1xcXFwnIGJlZm9yZSBub2RlLnZhbHVlXG4gKi9cblxuZXhwb3J0cy5lc2NhcGVOb2RlID0gKGJsb2NrLCBuID0gMCwgdHlwZSkgPT4ge1xuICBsZXQgbm9kZSA9IGJsb2NrLm5vZGVzW25dO1xuICBpZiAoIW5vZGUpIHJldHVybjtcblxuICBpZiAoKHR5cGUgJiYgbm9kZS50eXBlID09PSB0eXBlKSB8fCBub2RlLnR5cGUgPT09ICdvcGVuJyB8fCBub2RlLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICBpZiAobm9kZS5lc2NhcGVkICE9PSB0cnVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gJ1xcXFwnICsgbm9kZS52YWx1ZTtcbiAgICAgIG5vZGUuZXNjYXBlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnJhY2Ugbm9kZSBzaG91bGQgYmUgZW5jbG9zZWQgaW4gbGl0ZXJhbCBicmFjZXNcbiAqL1xuXG5leHBvcnRzLmVuY2xvc2VCcmFjZSA9IG5vZGUgPT4ge1xuICBpZiAobm9kZS50eXBlICE9PSAnYnJhY2UnKSByZXR1cm4gZmFsc2U7XG4gIGlmICgobm9kZS5jb21tYXMgPj4gMCArIG5vZGUucmFuZ2VzID4+IDApID09PSAwKSB7XG4gICAgbm9kZS5pbnZhbGlkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIGJyYWNlIG5vZGUgaXMgaW52YWxpZC5cbiAqL1xuXG5leHBvcnRzLmlzSW52YWxpZEJyYWNlID0gYmxvY2sgPT4ge1xuICBpZiAoYmxvY2sudHlwZSAhPT0gJ2JyYWNlJykgcmV0dXJuIGZhbHNlO1xuICBpZiAoYmxvY2suaW52YWxpZCA9PT0gdHJ1ZSB8fCBibG9jay5kb2xsYXIpIHJldHVybiB0cnVlO1xuICBpZiAoKGJsb2NrLmNvbW1hcyA+PiAwICsgYmxvY2sucmFuZ2VzID4+IDApID09PSAwKSB7XG4gICAgYmxvY2suaW52YWxpZCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGJsb2NrLm9wZW4gIT09IHRydWUgfHwgYmxvY2suY2xvc2UgIT09IHRydWUpIHtcbiAgICBibG9jay5pbnZhbGlkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIG5vZGUgaXMgYW4gb3BlbiBvciBjbG9zZSBub2RlXG4gKi9cblxuZXhwb3J0cy5pc09wZW5PckNsb3NlID0gbm9kZSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09ICdvcGVuJyB8fCBub2RlLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gbm9kZS5vcGVuID09PSB0cnVlIHx8IG5vZGUuY2xvc2UgPT09IHRydWU7XG59O1xuXG4vKipcbiAqIFJlZHVjZSBhbiBhcnJheSBvZiB0ZXh0IG5vZGVzLlxuICovXG5cbmV4cG9ydHMucmVkdWNlID0gbm9kZXMgPT4gbm9kZXMucmVkdWNlKChhY2MsIG5vZGUpID0+IHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3RleHQnKSBhY2MucHVzaChub2RlLnZhbHVlKTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3JhbmdlJykgbm9kZS50eXBlID0gJ3RleHQnO1xuICByZXR1cm4gYWNjO1xufSwgW10pO1xuXG4vKipcbiAqIEZsYXR0ZW4gYW4gYXJyYXlcbiAqL1xuXG5leHBvcnRzLmZsYXR0ZW4gPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgZmxhdCA9IGFyciA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBlbGUgPSBhcnJbaV07XG4gICAgICBBcnJheS5pc0FycmF5KGVsZSkgPyBmbGF0KGVsZSwgcmVzdWx0KSA6IGVsZSAhPT0gdm9pZCAwICYmIHJlc3VsdC5wdXNoKGVsZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIGZsYXQoYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKGFzdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCBzdHJpbmdpZnkgPSAobm9kZSwgcGFyZW50ID0ge30pID0+IHtcbiAgICBsZXQgaW52YWxpZEJsb2NrID0gb3B0aW9ucy5lc2NhcGVJbnZhbGlkICYmIHV0aWxzLmlzSW52YWxpZEJyYWNlKHBhcmVudCk7XG4gICAgbGV0IGludmFsaWROb2RlID0gbm9kZS5pbnZhbGlkID09PSB0cnVlICYmIG9wdGlvbnMuZXNjYXBlSW52YWxpZCA9PT0gdHJ1ZTtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgaWYgKChpbnZhbGlkQmxvY2sgfHwgaW52YWxpZE5vZGUpICYmIHV0aWxzLmlzT3Blbk9yQ2xvc2Uobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuICdcXFxcJyArIG5vZGUudmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMpIHtcbiAgICAgIGZvciAobGV0IGNoaWxkIG9mIG5vZGUubm9kZXMpIHtcbiAgICAgICAgb3V0cHV0ICs9IHN0cmluZ2lmeShjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShhc3QpO1xufTtcblxuIiwgIi8qIVxuICogaXMtbnVtYmVyIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1udW1iZXI+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihudW0pIHtcbiAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIG51bSAtIG51bSA9PT0gMDtcbiAgfVxuICBpZiAodHlwZW9mIG51bSA9PT0gJ3N0cmluZycgJiYgbnVtLnRyaW0oKSAhPT0gJycpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlID8gTnVtYmVyLmlzRmluaXRlKCtudW0pIDogaXNGaW5pdGUoK251bSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsICIvKiFcbiAqIHRvLXJlZ2V4LXJhbmdlIDxodHRwczovL2dpdGh1Yi5jb20vbWljcm9tYXRjaC90by1yZWdleC1yYW5nZT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpc051bWJlciA9IHJlcXVpcmUoJ2lzLW51bWJlcicpO1xuXG5jb25zdCB0b1JlZ2V4UmFuZ2UgPSAobWluLCBtYXgsIG9wdGlvbnMpID0+IHtcbiAgaWYgKGlzTnVtYmVyKG1pbikgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9SZWdleFJhbmdlOiBleHBlY3RlZCB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYmUgYSBudW1iZXInKTtcbiAgfVxuXG4gIGlmIChtYXggPT09IHZvaWQgMCB8fCBtaW4gPT09IG1heCkge1xuICAgIHJldHVybiBTdHJpbmcobWluKTtcbiAgfVxuXG4gIGlmIChpc051bWJlcihtYXgpID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RvUmVnZXhSYW5nZTogZXhwZWN0ZWQgdGhlIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIG51bWJlci4nKTtcbiAgfVxuXG4gIGxldCBvcHRzID0geyByZWxheFplcm9zOiB0cnVlLCAuLi5vcHRpb25zIH07XG4gIGlmICh0eXBlb2Ygb3B0cy5zdHJpY3RaZXJvcyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgb3B0cy5yZWxheFplcm9zID0gb3B0cy5zdHJpY3RaZXJvcyA9PT0gZmFsc2U7XG4gIH1cblxuICBsZXQgcmVsYXggPSBTdHJpbmcob3B0cy5yZWxheFplcm9zKTtcbiAgbGV0IHNob3J0aGFuZCA9IFN0cmluZyhvcHRzLnNob3J0aGFuZCk7XG4gIGxldCBjYXB0dXJlID0gU3RyaW5nKG9wdHMuY2FwdHVyZSk7XG4gIGxldCB3cmFwID0gU3RyaW5nKG9wdHMud3JhcCk7XG4gIGxldCBjYWNoZUtleSA9IG1pbiArICc6JyArIG1heCArICc9JyArIHJlbGF4ICsgc2hvcnRoYW5kICsgY2FwdHVyZSArIHdyYXA7XG5cbiAgaWYgKHRvUmVnZXhSYW5nZS5jYWNoZS5oYXNPd25Qcm9wZXJ0eShjYWNoZUtleSkpIHtcbiAgICByZXR1cm4gdG9SZWdleFJhbmdlLmNhY2hlW2NhY2hlS2V5XS5yZXN1bHQ7XG4gIH1cblxuICBsZXQgYSA9IE1hdGgubWluKG1pbiwgbWF4KTtcbiAgbGV0IGIgPSBNYXRoLm1heChtaW4sIG1heCk7XG5cbiAgaWYgKE1hdGguYWJzKGEgLSBiKSA9PT0gMSkge1xuICAgIGxldCByZXN1bHQgPSBtaW4gKyAnfCcgKyBtYXg7XG4gICAgaWYgKG9wdHMuY2FwdHVyZSkge1xuICAgICAgcmV0dXJuIGAoJHtyZXN1bHR9KWA7XG4gICAgfVxuICAgIGlmIChvcHRzLndyYXAgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gYCg/OiR7cmVzdWx0fSlgO1xuICB9XG5cbiAgbGV0IGlzUGFkZGVkID0gaGFzUGFkZGluZyhtaW4pIHx8IGhhc1BhZGRpbmcobWF4KTtcbiAgbGV0IHN0YXRlID0geyBtaW4sIG1heCwgYSwgYiB9O1xuICBsZXQgcG9zaXRpdmVzID0gW107XG4gIGxldCBuZWdhdGl2ZXMgPSBbXTtcblxuICBpZiAoaXNQYWRkZWQpIHtcbiAgICBzdGF0ZS5pc1BhZGRlZCA9IGlzUGFkZGVkO1xuICAgIHN0YXRlLm1heExlbiA9IFN0cmluZyhzdGF0ZS5tYXgpLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChhIDwgMCkge1xuICAgIGxldCBuZXdNaW4gPSBiIDwgMCA/IE1hdGguYWJzKGIpIDogMTtcbiAgICBuZWdhdGl2ZXMgPSBzcGxpdFRvUGF0dGVybnMobmV3TWluLCBNYXRoLmFicyhhKSwgc3RhdGUsIG9wdHMpO1xuICAgIGEgPSBzdGF0ZS5hID0gMDtcbiAgfVxuXG4gIGlmIChiID49IDApIHtcbiAgICBwb3NpdGl2ZXMgPSBzcGxpdFRvUGF0dGVybnMoYSwgYiwgc3RhdGUsIG9wdHMpO1xuICB9XG5cbiAgc3RhdGUubmVnYXRpdmVzID0gbmVnYXRpdmVzO1xuICBzdGF0ZS5wb3NpdGl2ZXMgPSBwb3NpdGl2ZXM7XG4gIHN0YXRlLnJlc3VsdCA9IGNvbGxhdGVQYXR0ZXJucyhuZWdhdGl2ZXMsIHBvc2l0aXZlcywgb3B0cyk7XG5cbiAgaWYgKG9wdHMuY2FwdHVyZSA9PT0gdHJ1ZSkge1xuICAgIHN0YXRlLnJlc3VsdCA9IGAoJHtzdGF0ZS5yZXN1bHR9KWA7XG4gIH0gZWxzZSBpZiAob3B0cy53cmFwICE9PSBmYWxzZSAmJiAocG9zaXRpdmVzLmxlbmd0aCArIG5lZ2F0aXZlcy5sZW5ndGgpID4gMSkge1xuICAgIHN0YXRlLnJlc3VsdCA9IGAoPzoke3N0YXRlLnJlc3VsdH0pYDtcbiAgfVxuXG4gIHRvUmVnZXhSYW5nZS5jYWNoZVtjYWNoZUtleV0gPSBzdGF0ZTtcbiAgcmV0dXJuIHN0YXRlLnJlc3VsdDtcbn07XG5cbmZ1bmN0aW9uIGNvbGxhdGVQYXR0ZXJucyhuZWcsIHBvcywgb3B0aW9ucykge1xuICBsZXQgb25seU5lZ2F0aXZlID0gZmlsdGVyUGF0dGVybnMobmVnLCBwb3MsICctJywgZmFsc2UsIG9wdGlvbnMpIHx8IFtdO1xuICBsZXQgb25seVBvc2l0aXZlID0gZmlsdGVyUGF0dGVybnMocG9zLCBuZWcsICcnLCBmYWxzZSwgb3B0aW9ucykgfHwgW107XG4gIGxldCBpbnRlcnNlY3RlZCA9IGZpbHRlclBhdHRlcm5zKG5lZywgcG9zLCAnLT8nLCB0cnVlLCBvcHRpb25zKSB8fCBbXTtcbiAgbGV0IHN1YnBhdHRlcm5zID0gb25seU5lZ2F0aXZlLmNvbmNhdChpbnRlcnNlY3RlZCkuY29uY2F0KG9ubHlQb3NpdGl2ZSk7XG4gIHJldHVybiBzdWJwYXR0ZXJucy5qb2luKCd8Jyk7XG59XG5cbmZ1bmN0aW9uIHNwbGl0VG9SYW5nZXMobWluLCBtYXgpIHtcbiAgbGV0IG5pbmVzID0gMTtcbiAgbGV0IHplcm9zID0gMTtcblxuICBsZXQgc3RvcCA9IGNvdW50TmluZXMobWluLCBuaW5lcyk7XG4gIGxldCBzdG9wcyA9IG5ldyBTZXQoW21heF0pO1xuXG4gIHdoaWxlIChtaW4gPD0gc3RvcCAmJiBzdG9wIDw9IG1heCkge1xuICAgIHN0b3BzLmFkZChzdG9wKTtcbiAgICBuaW5lcyArPSAxO1xuICAgIHN0b3AgPSBjb3VudE5pbmVzKG1pbiwgbmluZXMpO1xuICB9XG5cbiAgc3RvcCA9IGNvdW50WmVyb3MobWF4ICsgMSwgemVyb3MpIC0gMTtcblxuICB3aGlsZSAobWluIDwgc3RvcCAmJiBzdG9wIDw9IG1heCkge1xuICAgIHN0b3BzLmFkZChzdG9wKTtcbiAgICB6ZXJvcyArPSAxO1xuICAgIHN0b3AgPSBjb3VudFplcm9zKG1heCArIDEsIHplcm9zKSAtIDE7XG4gIH1cblxuICBzdG9wcyA9IFsuLi5zdG9wc107XG4gIHN0b3BzLnNvcnQoY29tcGFyZSk7XG4gIHJldHVybiBzdG9wcztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgcmFuZ2UgdG8gYSByZWdleCBwYXR0ZXJuXG4gKiBAcGFyYW0ge051bWJlcn0gYHN0YXJ0YFxuICogQHBhcmFtIHtOdW1iZXJ9IGBzdG9wYFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIHJhbmdlVG9QYXR0ZXJuKHN0YXJ0LCBzdG9wLCBvcHRpb25zKSB7XG4gIGlmIChzdGFydCA9PT0gc3RvcCkge1xuICAgIHJldHVybiB7IHBhdHRlcm46IHN0YXJ0LCBjb3VudDogW10sIGRpZ2l0czogMCB9O1xuICB9XG5cbiAgbGV0IHppcHBlZCA9IHppcChzdGFydCwgc3RvcCk7XG4gIGxldCBkaWdpdHMgPSB6aXBwZWQubGVuZ3RoO1xuICBsZXQgcGF0dGVybiA9ICcnO1xuICBsZXQgY291bnQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlnaXRzOyBpKyspIHtcbiAgICBsZXQgW3N0YXJ0RGlnaXQsIHN0b3BEaWdpdF0gPSB6aXBwZWRbaV07XG5cbiAgICBpZiAoc3RhcnREaWdpdCA9PT0gc3RvcERpZ2l0KSB7XG4gICAgICBwYXR0ZXJuICs9IHN0YXJ0RGlnaXQ7XG5cbiAgICB9IGVsc2UgaWYgKHN0YXJ0RGlnaXQgIT09ICcwJyB8fCBzdG9wRGlnaXQgIT09ICc5Jykge1xuICAgICAgcGF0dGVybiArPSB0b0NoYXJhY3RlckNsYXNzKHN0YXJ0RGlnaXQsIHN0b3BEaWdpdCwgb3B0aW9ucyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH1cblxuICBpZiAoY291bnQpIHtcbiAgICBwYXR0ZXJuICs9IG9wdGlvbnMuc2hvcnRoYW5kID09PSB0cnVlID8gJ1xcXFxkJyA6ICdbMC05XSc7XG4gIH1cblxuICByZXR1cm4geyBwYXR0ZXJuLCBjb3VudDogW2NvdW50XSwgZGlnaXRzIH07XG59XG5cbmZ1bmN0aW9uIHNwbGl0VG9QYXR0ZXJucyhtaW4sIG1heCwgdG9rLCBvcHRpb25zKSB7XG4gIGxldCByYW5nZXMgPSBzcGxpdFRvUmFuZ2VzKG1pbiwgbWF4KTtcbiAgbGV0IHRva2VucyA9IFtdO1xuICBsZXQgc3RhcnQgPSBtaW47XG4gIGxldCBwcmV2O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IG1heCA9IHJhbmdlc1tpXTtcbiAgICBsZXQgb2JqID0gcmFuZ2VUb1BhdHRlcm4oU3RyaW5nKHN0YXJ0KSwgU3RyaW5nKG1heCksIG9wdGlvbnMpO1xuICAgIGxldCB6ZXJvcyA9ICcnO1xuXG4gICAgaWYgKCF0b2suaXNQYWRkZWQgJiYgcHJldiAmJiBwcmV2LnBhdHRlcm4gPT09IG9iai5wYXR0ZXJuKSB7XG4gICAgICBpZiAocHJldi5jb3VudC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHByZXYuY291bnQucG9wKCk7XG4gICAgICB9XG5cbiAgICAgIHByZXYuY291bnQucHVzaChvYmouY291bnRbMF0pO1xuICAgICAgcHJldi5zdHJpbmcgPSBwcmV2LnBhdHRlcm4gKyB0b1F1YW50aWZpZXIocHJldi5jb3VudCk7XG4gICAgICBzdGFydCA9IG1heCArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodG9rLmlzUGFkZGVkKSB7XG4gICAgICB6ZXJvcyA9IHBhZFplcm9zKG1heCwgdG9rLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBvYmouc3RyaW5nID0gemVyb3MgKyBvYmoucGF0dGVybiArIHRvUXVhbnRpZmllcihvYmouY291bnQpO1xuICAgIHRva2Vucy5wdXNoKG9iaik7XG4gICAgc3RhcnQgPSBtYXggKyAxO1xuICAgIHByZXYgPSBvYmo7XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJQYXR0ZXJucyhhcnIsIGNvbXBhcmlzb24sIHByZWZpeCwgaW50ZXJzZWN0aW9uLCBvcHRpb25zKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcblxuICBmb3IgKGxldCBlbGUgb2YgYXJyKSB7XG4gICAgbGV0IHsgc3RyaW5nIH0gPSBlbGU7XG5cbiAgICAvLyBvbmx5IHB1c2ggaWYgX2JvdGhfIGFyZSBuZWdhdGl2ZS4uLlxuICAgIGlmICghaW50ZXJzZWN0aW9uICYmICFjb250YWlucyhjb21wYXJpc29uLCAnc3RyaW5nJywgc3RyaW5nKSkge1xuICAgICAgcmVzdWx0LnB1c2gocHJlZml4ICsgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvLyBvciBfYm90aF8gYXJlIHBvc2l0aXZlXG4gICAgaWYgKGludGVyc2VjdGlvbiAmJiBjb250YWlucyhjb21wYXJpc29uLCAnc3RyaW5nJywgc3RyaW5nKSkge1xuICAgICAgcmVzdWx0LnB1c2gocHJlZml4ICsgc3RyaW5nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBaaXAgc3RyaW5nc1xuICovXG5cbmZ1bmN0aW9uIHppcChhLCBiKSB7XG4gIGxldCBhcnIgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSBhcnIucHVzaChbYVtpXSwgYltpXV0pO1xuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgcmV0dXJuIGEgPiBiID8gMSA6IGIgPiBhID8gLTEgOiAwO1xufVxuXG5mdW5jdGlvbiBjb250YWlucyhhcnIsIGtleSwgdmFsKSB7XG4gIHJldHVybiBhcnIuc29tZShlbGUgPT4gZWxlW2tleV0gPT09IHZhbCk7XG59XG5cbmZ1bmN0aW9uIGNvdW50TmluZXMobWluLCBsZW4pIHtcbiAgcmV0dXJuIE51bWJlcihTdHJpbmcobWluKS5zbGljZSgwLCAtbGVuKSArICc5Jy5yZXBlYXQobGVuKSk7XG59XG5cbmZ1bmN0aW9uIGNvdW50WmVyb3MoaW50ZWdlciwgemVyb3MpIHtcbiAgcmV0dXJuIGludGVnZXIgLSAoaW50ZWdlciAlIE1hdGgucG93KDEwLCB6ZXJvcykpO1xufVxuXG5mdW5jdGlvbiB0b1F1YW50aWZpZXIoZGlnaXRzKSB7XG4gIGxldCBbc3RhcnQgPSAwLCBzdG9wID0gJyddID0gZGlnaXRzO1xuICBpZiAoc3RvcCB8fCBzdGFydCA+IDEpIHtcbiAgICByZXR1cm4gYHske3N0YXJ0ICsgKHN0b3AgPyAnLCcgKyBzdG9wIDogJycpfX1gO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gdG9DaGFyYWN0ZXJDbGFzcyhhLCBiLCBvcHRpb25zKSB7XG4gIHJldHVybiBgWyR7YX0keyhiIC0gYSA9PT0gMSkgPyAnJyA6ICctJ30ke2J9XWA7XG59XG5cbmZ1bmN0aW9uIGhhc1BhZGRpbmcoc3RyKSB7XG4gIHJldHVybiAvXi0/KDArKVxcZC8udGVzdChzdHIpO1xufVxuXG5mdW5jdGlvbiBwYWRaZXJvcyh2YWx1ZSwgdG9rLCBvcHRpb25zKSB7XG4gIGlmICghdG9rLmlzUGFkZGVkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgbGV0IGRpZmYgPSBNYXRoLmFicyh0b2subWF4TGVuIC0gU3RyaW5nKHZhbHVlKS5sZW5ndGgpO1xuICBsZXQgcmVsYXggPSBvcHRpb25zLnJlbGF4WmVyb3MgIT09IGZhbHNlO1xuXG4gIHN3aXRjaCAoZGlmZikge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiAnJztcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gcmVsYXggPyAnMD8nIDogJzAnO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiByZWxheCA/ICcwezAsMn0nIDogJzAwJztcbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gcmVsYXggPyBgMHswLCR7ZGlmZn19YCA6IGAweyR7ZGlmZn19YDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDYWNoZVxuICovXG5cbnRvUmVnZXhSYW5nZS5jYWNoZSA9IHt9O1xudG9SZWdleFJhbmdlLmNsZWFyQ2FjaGUgPSAoKSA9PiAodG9SZWdleFJhbmdlLmNhY2hlID0ge30pO1xuXG4vKipcbiAqIEV4cG9zZSBgdG9SZWdleFJhbmdlYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdG9SZWdleFJhbmdlO1xuIiwgIi8qIVxuICogZmlsbC1yYW5nZSA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvZmlsbC1yYW5nZT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuY29uc3QgdG9SZWdleFJhbmdlID0gcmVxdWlyZSgndG8tcmVnZXgtcmFuZ2UnKTtcblxuY29uc3QgaXNPYmplY3QgPSB2YWwgPT4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbmNvbnN0IHRyYW5zZm9ybSA9IHRvTnVtYmVyID0+IHtcbiAgcmV0dXJuIHZhbHVlID0+IHRvTnVtYmVyID09PSB0cnVlID8gTnVtYmVyKHZhbHVlKSA6IFN0cmluZyh2YWx1ZSk7XG59O1xuXG5jb25zdCBpc1ZhbGlkVmFsdWUgPSB2YWx1ZSA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlICE9PSAnJyk7XG59O1xuXG5jb25zdCBpc051bWJlciA9IG51bSA9PiBOdW1iZXIuaXNJbnRlZ2VyKCtudW0pO1xuXG5jb25zdCB6ZXJvcyA9IGlucHV0ID0+IHtcbiAgbGV0IHZhbHVlID0gYCR7aW5wdXR9YDtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGlmICh2YWx1ZVswXSA9PT0gJy0nKSB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICBpZiAodmFsdWUgPT09ICcwJykgcmV0dXJuIGZhbHNlO1xuICB3aGlsZSAodmFsdWVbKytpbmRleF0gPT09ICcwJyk7XG4gIHJldHVybiBpbmRleCA+IDA7XG59O1xuXG5jb25zdCBzdHJpbmdpZnkgPSAoc3RhcnQsIGVuZCwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBvcHRpb25zLnN0cmluZ2lmeSA9PT0gdHJ1ZTtcbn07XG5cbmNvbnN0IHBhZCA9IChpbnB1dCwgbWF4TGVuZ3RoLCB0b051bWJlcikgPT4ge1xuICBpZiAobWF4TGVuZ3RoID4gMCkge1xuICAgIGxldCBkYXNoID0gaW5wdXRbMF0gPT09ICctJyA/ICctJyA6ICcnO1xuICAgIGlmIChkYXNoKSBpbnB1dCA9IGlucHV0LnNsaWNlKDEpO1xuICAgIGlucHV0ID0gKGRhc2ggKyBpbnB1dC5wYWRTdGFydChkYXNoID8gbWF4TGVuZ3RoIC0gMSA6IG1heExlbmd0aCwgJzAnKSk7XG4gIH1cbiAgaWYgKHRvTnVtYmVyID09PSBmYWxzZSkge1xuICAgIHJldHVybiBTdHJpbmcoaW5wdXQpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn07XG5cbmNvbnN0IHRvTWF4TGVuID0gKGlucHV0LCBtYXhMZW5ndGgpID0+IHtcbiAgbGV0IG5lZ2F0aXZlID0gaW5wdXRbMF0gPT09ICctJyA/ICctJyA6ICcnO1xuICBpZiAobmVnYXRpdmUpIHtcbiAgICBpbnB1dCA9IGlucHV0LnNsaWNlKDEpO1xuICAgIG1heExlbmd0aC0tO1xuICB9XG4gIHdoaWxlIChpbnB1dC5sZW5ndGggPCBtYXhMZW5ndGgpIGlucHV0ID0gJzAnICsgaW5wdXQ7XG4gIHJldHVybiBuZWdhdGl2ZSA/ICgnLScgKyBpbnB1dCkgOiBpbnB1dDtcbn07XG5cbmNvbnN0IHRvU2VxdWVuY2UgPSAocGFydHMsIG9wdGlvbnMpID0+IHtcbiAgcGFydHMubmVnYXRpdmVzLnNvcnQoKGEsIGIpID0+IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcbiAgcGFydHMucG9zaXRpdmVzLnNvcnQoKGEsIGIpID0+IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcblxuICBsZXQgcHJlZml4ID0gb3B0aW9ucy5jYXB0dXJlID8gJycgOiAnPzonO1xuICBsZXQgcG9zaXRpdmVzID0gJyc7XG4gIGxldCBuZWdhdGl2ZXMgPSAnJztcbiAgbGV0IHJlc3VsdDtcblxuICBpZiAocGFydHMucG9zaXRpdmVzLmxlbmd0aCkge1xuICAgIHBvc2l0aXZlcyA9IHBhcnRzLnBvc2l0aXZlcy5qb2luKCd8Jyk7XG4gIH1cblxuICBpZiAocGFydHMubmVnYXRpdmVzLmxlbmd0aCkge1xuICAgIG5lZ2F0aXZlcyA9IGAtKCR7cHJlZml4fSR7cGFydHMubmVnYXRpdmVzLmpvaW4oJ3wnKX0pYDtcbiAgfVxuXG4gIGlmIChwb3NpdGl2ZXMgJiYgbmVnYXRpdmVzKSB7XG4gICAgcmVzdWx0ID0gYCR7cG9zaXRpdmVzfXwke25lZ2F0aXZlc31gO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHBvc2l0aXZlcyB8fCBuZWdhdGl2ZXM7XG4gIH1cblxuICBpZiAob3B0aW9ucy53cmFwKSB7XG4gICAgcmV0dXJuIGAoJHtwcmVmaXh9JHtyZXN1bHR9KWA7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgdG9SYW5nZSA9IChhLCBiLCBpc051bWJlcnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKGlzTnVtYmVycykge1xuICAgIHJldHVybiB0b1JlZ2V4UmFuZ2UoYSwgYiwgeyB3cmFwOiBmYWxzZSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIGxldCBzdGFydCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7XG4gIGlmIChhID09PSBiKSByZXR1cm4gc3RhcnQ7XG5cbiAgbGV0IHN0b3AgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO1xuICByZXR1cm4gYFske3N0YXJ0fS0ke3N0b3B9XWA7XG59O1xuXG5jb25zdCB0b1JlZ2V4ID0gKHN0YXJ0LCBlbmQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RhcnQpKSB7XG4gICAgbGV0IHdyYXAgPSBvcHRpb25zLndyYXAgPT09IHRydWU7XG4gICAgbGV0IHByZWZpeCA9IG9wdGlvbnMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgICByZXR1cm4gd3JhcCA/IGAoJHtwcmVmaXh9JHtzdGFydC5qb2luKCd8Jyl9KWAgOiBzdGFydC5qb2luKCd8Jyk7XG4gIH1cbiAgcmV0dXJuIHRvUmVnZXhSYW5nZShzdGFydCwgZW5kLCBvcHRpb25zKTtcbn07XG5cbmNvbnN0IHJhbmdlRXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICByZXR1cm4gbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgcmFuZ2UgYXJndW1lbnRzOiAnICsgdXRpbC5pbnNwZWN0KC4uLmFyZ3MpKTtcbn07XG5cbmNvbnN0IGludmFsaWRSYW5nZSA9IChzdGFydCwgZW5kLCBvcHRpb25zKSA9PiB7XG4gIGlmIChvcHRpb25zLnN0cmljdFJhbmdlcyA9PT0gdHJ1ZSkgdGhyb3cgcmFuZ2VFcnJvcihbc3RhcnQsIGVuZF0pO1xuICByZXR1cm4gW107XG59O1xuXG5jb25zdCBpbnZhbGlkU3RlcCA9IChzdGVwLCBvcHRpb25zKSA9PiB7XG4gIGlmIChvcHRpb25zLnN0cmljdFJhbmdlcyA9PT0gdHJ1ZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIHN0ZXAgXCIke3N0ZXB9XCIgdG8gYmUgYSBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gW107XG59O1xuXG5jb25zdCBmaWxsTnVtYmVycyA9IChzdGFydCwgZW5kLCBzdGVwID0gMSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCBhID0gTnVtYmVyKHN0YXJ0KTtcbiAgbGV0IGIgPSBOdW1iZXIoZW5kKTtcblxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoYSkgfHwgIU51bWJlci5pc0ludGVnZXIoYikpIHtcbiAgICBpZiAob3B0aW9ucy5zdHJpY3RSYW5nZXMgPT09IHRydWUpIHRocm93IHJhbmdlRXJyb3IoW3N0YXJ0LCBlbmRdKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyBmaXggbmVnYXRpdmUgemVyb1xuICBpZiAoYSA9PT0gMCkgYSA9IDA7XG4gIGlmIChiID09PSAwKSBiID0gMDtcblxuICBsZXQgZGVzY2VuZGluZyA9IGEgPiBiO1xuICBsZXQgc3RhcnRTdHJpbmcgPSBTdHJpbmcoc3RhcnQpO1xuICBsZXQgZW5kU3RyaW5nID0gU3RyaW5nKGVuZCk7XG4gIGxldCBzdGVwU3RyaW5nID0gU3RyaW5nKHN0ZXApO1xuICBzdGVwID0gTWF0aC5tYXgoTWF0aC5hYnMoc3RlcCksIDEpO1xuXG4gIGxldCBwYWRkZWQgPSB6ZXJvcyhzdGFydFN0cmluZykgfHwgemVyb3MoZW5kU3RyaW5nKSB8fCB6ZXJvcyhzdGVwU3RyaW5nKTtcbiAgbGV0IG1heExlbiA9IHBhZGRlZCA/IE1hdGgubWF4KHN0YXJ0U3RyaW5nLmxlbmd0aCwgZW5kU3RyaW5nLmxlbmd0aCwgc3RlcFN0cmluZy5sZW5ndGgpIDogMDtcbiAgbGV0IHRvTnVtYmVyID0gcGFkZGVkID09PSBmYWxzZSAmJiBzdHJpbmdpZnkoc3RhcnQsIGVuZCwgb3B0aW9ucykgPT09IGZhbHNlO1xuICBsZXQgZm9ybWF0ID0gb3B0aW9ucy50cmFuc2Zvcm0gfHwgdHJhbnNmb3JtKHRvTnVtYmVyKTtcblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ICYmIHN0ZXAgPT09IDEpIHtcbiAgICByZXR1cm4gdG9SYW5nZSh0b01heExlbihzdGFydCwgbWF4TGVuKSwgdG9NYXhMZW4oZW5kLCBtYXhMZW4pLCB0cnVlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IHsgbmVnYXRpdmVzOiBbXSwgcG9zaXRpdmVzOiBbXSB9O1xuICBsZXQgcHVzaCA9IG51bSA9PiBwYXJ0c1tudW0gPCAwID8gJ25lZ2F0aXZlcycgOiAncG9zaXRpdmVzJ10ucHVzaChNYXRoLmFicyhudW0pKTtcbiAgbGV0IHJhbmdlID0gW107XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGRlc2NlbmRpbmcgPyBhID49IGIgOiBhIDw9IGIpIHtcbiAgICBpZiAob3B0aW9ucy50b1JlZ2V4ID09PSB0cnVlICYmIHN0ZXAgPiAxKSB7XG4gICAgICBwdXNoKGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZS5wdXNoKHBhZChmb3JtYXQoYSwgaW5kZXgpLCBtYXhMZW4sIHRvTnVtYmVyKSk7XG4gICAgfVxuICAgIGEgPSBkZXNjZW5kaW5nID8gYSAtIHN0ZXAgOiBhICsgc3RlcDtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBzdGVwID4gMVxuICAgICAgPyB0b1NlcXVlbmNlKHBhcnRzLCBvcHRpb25zKVxuICAgICAgOiB0b1JlZ2V4KHJhbmdlLCBudWxsLCB7IHdyYXA6IGZhbHNlLCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufTtcblxuY29uc3QgZmlsbExldHRlcnMgPSAoc3RhcnQsIGVuZCwgc3RlcCA9IDEsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoKCFpc051bWJlcihzdGFydCkgJiYgc3RhcnQubGVuZ3RoID4gMSkgfHwgKCFpc051bWJlcihlbmQpICYmIGVuZC5sZW5ndGggPiAxKSkge1xuICAgIHJldHVybiBpbnZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgb3B0aW9ucyk7XG4gIH1cblxuXG4gIGxldCBmb3JtYXQgPSBvcHRpb25zLnRyYW5zZm9ybSB8fCAodmFsID0+IFN0cmluZy5mcm9tQ2hhckNvZGUodmFsKSk7XG4gIGxldCBhID0gYCR7c3RhcnR9YC5jaGFyQ29kZUF0KDApO1xuICBsZXQgYiA9IGAke2VuZH1gLmNoYXJDb2RlQXQoMCk7XG5cbiAgbGV0IGRlc2NlbmRpbmcgPSBhID4gYjtcbiAgbGV0IG1pbiA9IE1hdGgubWluKGEsIGIpO1xuICBsZXQgbWF4ID0gTWF0aC5tYXgoYSwgYik7XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCAmJiBzdGVwID09PSAxKSB7XG4gICAgcmV0dXJuIHRvUmFuZ2UobWluLCBtYXgsIGZhbHNlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGxldCByYW5nZSA9IFtdO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIHdoaWxlIChkZXNjZW5kaW5nID8gYSA+PSBiIDogYSA8PSBiKSB7XG4gICAgcmFuZ2UucHVzaChmb3JtYXQoYSwgaW5kZXgpKTtcbiAgICBhID0gZGVzY2VuZGluZyA/IGEgLSBzdGVwIDogYSArIHN0ZXA7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggPT09IHRydWUpIHtcbiAgICByZXR1cm4gdG9SZWdleChyYW5nZSwgbnVsbCwgeyB3cmFwOiBmYWxzZSwgb3B0aW9ucyB9KTtcbiAgfVxuXG4gIHJldHVybiByYW5nZTtcbn07XG5cbmNvbnN0IGZpbGwgPSAoc3RhcnQsIGVuZCwgc3RlcCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChlbmQgPT0gbnVsbCAmJiBpc1ZhbGlkVmFsdWUoc3RhcnQpKSB7XG4gICAgcmV0dXJuIFtzdGFydF07XG4gIH1cblxuICBpZiAoIWlzVmFsaWRWYWx1ZShzdGFydCkgfHwgIWlzVmFsaWRWYWx1ZShlbmQpKSB7XG4gICAgcmV0dXJuIGludmFsaWRSYW5nZShzdGFydCwgZW5kLCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RlcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmaWxsKHN0YXJ0LCBlbmQsIDEsIHsgdHJhbnNmb3JtOiBzdGVwIH0pO1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KHN0ZXApKSB7XG4gICAgcmV0dXJuIGZpbGwoc3RhcnQsIGVuZCwgMCwgc3RlcCk7XG4gIH1cblxuICBsZXQgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICBpZiAob3B0cy5jYXB0dXJlID09PSB0cnVlKSBvcHRzLndyYXAgPSB0cnVlO1xuICBzdGVwID0gc3RlcCB8fCBvcHRzLnN0ZXAgfHwgMTtcblxuICBpZiAoIWlzTnVtYmVyKHN0ZXApKSB7XG4gICAgaWYgKHN0ZXAgIT0gbnVsbCAmJiAhaXNPYmplY3Qoc3RlcCkpIHJldHVybiBpbnZhbGlkU3RlcChzdGVwLCBvcHRzKTtcbiAgICByZXR1cm4gZmlsbChzdGFydCwgZW5kLCAxLCBzdGVwKTtcbiAgfVxuXG4gIGlmIChpc051bWJlcihzdGFydCkgJiYgaXNOdW1iZXIoZW5kKSkge1xuICAgIHJldHVybiBmaWxsTnVtYmVycyhzdGFydCwgZW5kLCBzdGVwLCBvcHRzKTtcbiAgfVxuXG4gIHJldHVybiBmaWxsTGV0dGVycyhzdGFydCwgZW5kLCBNYXRoLm1heChNYXRoLmFicyhzdGVwKSwgMSksIG9wdHMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaWxsO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZmlsbCA9IHJlcXVpcmUoJ2ZpbGwtcmFuZ2UnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5jb25zdCBjb21waWxlID0gKGFzdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCB3YWxrID0gKG5vZGUsIHBhcmVudCA9IHt9KSA9PiB7XG4gICAgbGV0IGludmFsaWRCbG9jayA9IHV0aWxzLmlzSW52YWxpZEJyYWNlKHBhcmVudCk7XG4gICAgbGV0IGludmFsaWROb2RlID0gbm9kZS5pbnZhbGlkID09PSB0cnVlICYmIG9wdGlvbnMuZXNjYXBlSW52YWxpZCA9PT0gdHJ1ZTtcbiAgICBsZXQgaW52YWxpZCA9IGludmFsaWRCbG9jayA9PT0gdHJ1ZSB8fCBpbnZhbGlkTm9kZSA9PT0gdHJ1ZTtcbiAgICBsZXQgcHJlZml4ID0gb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlID8gJ1xcXFwnIDogJyc7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgaWYgKG5vZGUuaXNPcGVuID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ICsgbm9kZS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKG5vZGUuaXNDbG9zZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHByZWZpeCArIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nKSB7XG4gICAgICByZXR1cm4gaW52YWxpZCA/IChwcmVmaXggKyBub2RlLnZhbHVlKSA6ICcoJztcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICByZXR1cm4gaW52YWxpZCA/IChwcmVmaXggKyBub2RlLnZhbHVlKSA6ICcpJztcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnY29tbWEnKSB7XG4gICAgICByZXR1cm4gbm9kZS5wcmV2LnR5cGUgPT09ICdjb21tYScgPyAnJyA6IChpbnZhbGlkID8gbm9kZS52YWx1ZSA6ICd8Jyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzICYmIG5vZGUucmFuZ2VzID4gMCkge1xuICAgICAgbGV0IGFyZ3MgPSB1dGlscy5yZWR1Y2Uobm9kZS5ub2Rlcyk7XG4gICAgICBsZXQgcmFuZ2UgPSBmaWxsKC4uLmFyZ3MsIHsgLi4ub3B0aW9ucywgd3JhcDogZmFsc2UsIHRvUmVnZXg6IHRydWUgfSk7XG5cbiAgICAgIGlmIChyYW5nZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoID4gMSAmJiByYW5nZS5sZW5ndGggPiAxID8gYCgke3JhbmdlfSlgIDogcmFuZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMpIHtcbiAgICAgIGZvciAobGV0IGNoaWxkIG9mIG5vZGUubm9kZXMpIHtcbiAgICAgICAgb3V0cHV0ICs9IHdhbGsoY2hpbGQsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIHJldHVybiB3YWxrKGFzdCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBpbGU7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmaWxsID0gcmVxdWlyZSgnZmlsbC1yYW5nZScpO1xuY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5jb25zdCBhcHBlbmQgPSAocXVldWUgPSAnJywgc3Rhc2ggPSAnJywgZW5jbG9zZSA9IGZhbHNlKSA9PiB7XG4gIGxldCByZXN1bHQgPSBbXTtcblxuICBxdWV1ZSA9IFtdLmNvbmNhdChxdWV1ZSk7XG4gIHN0YXNoID0gW10uY29uY2F0KHN0YXNoKTtcblxuICBpZiAoIXN0YXNoLmxlbmd0aCkgcmV0dXJuIHF1ZXVlO1xuICBpZiAoIXF1ZXVlLmxlbmd0aCkge1xuICAgIHJldHVybiBlbmNsb3NlID8gdXRpbHMuZmxhdHRlbihzdGFzaCkubWFwKGVsZSA9PiBgeyR7ZWxlfX1gKSA6IHN0YXNoO1xuICB9XG5cbiAgZm9yIChsZXQgaXRlbSBvZiBxdWV1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBmb3IgKGxldCB2YWx1ZSBvZiBpdGVtKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGFwcGVuZCh2YWx1ZSwgc3Rhc2gsIGVuY2xvc2UpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgZWxlIG9mIHN0YXNoKSB7XG4gICAgICAgIGlmIChlbmNsb3NlID09PSB0cnVlICYmIHR5cGVvZiBlbGUgPT09ICdzdHJpbmcnKSBlbGUgPSBgeyR7ZWxlfX1gO1xuICAgICAgICByZXN1bHQucHVzaChBcnJheS5pc0FycmF5KGVsZSkgPyBhcHBlbmQoaXRlbSwgZWxlLCBlbmNsb3NlKSA6IChpdGVtICsgZWxlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1dGlscy5mbGF0dGVuKHJlc3VsdCk7XG59O1xuXG5jb25zdCBleHBhbmQgPSAoYXN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IHJhbmdlTGltaXQgPSBvcHRpb25zLnJhbmdlTGltaXQgPT09IHZvaWQgMCA/IDEwMDAgOiBvcHRpb25zLnJhbmdlTGltaXQ7XG5cbiAgbGV0IHdhbGsgPSAobm9kZSwgcGFyZW50ID0ge30pID0+IHtcbiAgICBub2RlLnF1ZXVlID0gW107XG5cbiAgICBsZXQgcCA9IHBhcmVudDtcbiAgICBsZXQgcSA9IHBhcmVudC5xdWV1ZTtcblxuICAgIHdoaWxlIChwLnR5cGUgIT09ICdicmFjZScgJiYgcC50eXBlICE9PSAncm9vdCcgJiYgcC5wYXJlbnQpIHtcbiAgICAgIHAgPSBwLnBhcmVudDtcbiAgICAgIHEgPSBwLnF1ZXVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLmludmFsaWQgfHwgbm9kZS5kb2xsYXIpIHtcbiAgICAgIHEucHVzaChhcHBlbmQocS5wb3AoKSwgc3RyaW5naWZ5KG5vZGUsIG9wdGlvbnMpKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ2JyYWNlJyAmJiBub2RlLmludmFsaWQgIT09IHRydWUgJiYgbm9kZS5ub2Rlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHEucHVzaChhcHBlbmQocS5wb3AoKSwgWyd7fSddKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMgJiYgbm9kZS5yYW5nZXMgPiAwKSB7XG4gICAgICBsZXQgYXJncyA9IHV0aWxzLnJlZHVjZShub2RlLm5vZGVzKTtcblxuICAgICAgaWYgKHV0aWxzLmV4Y2VlZHNMaW1pdCguLi5hcmdzLCBvcHRpb25zLnN0ZXAsIHJhbmdlTGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdleHBhbmRlZCBhcnJheSBsZW5ndGggZXhjZWVkcyByYW5nZSBsaW1pdC4gVXNlIG9wdGlvbnMucmFuZ2VMaW1pdCB0byBpbmNyZWFzZSBvciBkaXNhYmxlIHRoZSBsaW1pdC4nKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHJhbmdlID0gZmlsbCguLi5hcmdzLCBvcHRpb25zKTtcbiAgICAgIGlmIChyYW5nZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmFuZ2UgPSBzdHJpbmdpZnkobm9kZSwgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIHEucHVzaChhcHBlbmQocS5wb3AoKSwgcmFuZ2UpKTtcbiAgICAgIG5vZGUubm9kZXMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZW5jbG9zZSA9IHV0aWxzLmVuY2xvc2VCcmFjZShub2RlKTtcbiAgICBsZXQgcXVldWUgPSBub2RlLnF1ZXVlO1xuICAgIGxldCBibG9jayA9IG5vZGU7XG5cbiAgICB3aGlsZSAoYmxvY2sudHlwZSAhPT0gJ2JyYWNlJyAmJiBibG9jay50eXBlICE9PSAncm9vdCcgJiYgYmxvY2sucGFyZW50KSB7XG4gICAgICBibG9jayA9IGJsb2NrLnBhcmVudDtcbiAgICAgIHF1ZXVlID0gYmxvY2sucXVldWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY2hpbGQgPSBub2RlLm5vZGVzW2ldO1xuXG4gICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ2NvbW1hJyAmJiBub2RlLnR5cGUgPT09ICdicmFjZScpIHtcbiAgICAgICAgaWYgKGkgPT09IDEpIHF1ZXVlLnB1c2goJycpO1xuICAgICAgICBxdWV1ZS5wdXNoKCcnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICAgIHEucHVzaChhcHBlbmQocS5wb3AoKSwgcXVldWUsIGVuY2xvc2UpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZC52YWx1ZSAmJiBjaGlsZC50eXBlICE9PSAnb3BlbicpIHtcbiAgICAgICAgcXVldWUucHVzaChhcHBlbmQocXVldWUucG9wKCksIGNoaWxkLnZhbHVlKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQubm9kZXMpIHtcbiAgICAgICAgd2FsayhjaGlsZCwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXVlO1xuICB9O1xuXG4gIHJldHVybiB1dGlscy5mbGF0dGVuKHdhbGsoYXN0KSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cGFuZDtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RIOiAxMDI0ICogNjQsXG5cbiAgLy8gRGlnaXRzXG4gIENIQVJfMDogJzAnLCAvKiAwICovXG4gIENIQVJfOTogJzknLCAvKiA5ICovXG5cbiAgLy8gQWxwaGFiZXQgY2hhcnMuXG4gIENIQVJfVVBQRVJDQVNFX0E6ICdBJywgLyogQSAqL1xuICBDSEFSX0xPV0VSQ0FTRV9BOiAnYScsIC8qIGEgKi9cbiAgQ0hBUl9VUFBFUkNBU0VfWjogJ1onLCAvKiBaICovXG4gIENIQVJfTE9XRVJDQVNFX1o6ICd6JywgLyogeiAqL1xuXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUzogJygnLCAvKiAoICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVM6ICcpJywgLyogKSAqL1xuXG4gIENIQVJfQVNURVJJU0s6ICcqJywgLyogKiAqL1xuXG4gIC8vIE5vbi1hbHBoYWJldGljIGNoYXJzLlxuICBDSEFSX0FNUEVSU0FORDogJyYnLCAvKiAmICovXG4gIENIQVJfQVQ6ICdAJywgLyogQCAqL1xuICBDSEFSX0JBQ0tTTEFTSDogJ1xcXFwnLCAvKiBcXCAqL1xuICBDSEFSX0JBQ0tUSUNLOiAnYCcsIC8qIGAgKi9cbiAgQ0hBUl9DQVJSSUFHRV9SRVRVUk46ICdcXHInLCAvKiBcXHIgKi9cbiAgQ0hBUl9DSVJDVU1GTEVYX0FDQ0VOVDogJ14nLCAvKiBeICovXG4gIENIQVJfQ09MT046ICc6JywgLyogOiAqL1xuICBDSEFSX0NPTU1BOiAnLCcsIC8qICwgKi9cbiAgQ0hBUl9ET0xMQVI6ICckJywgLyogLiAqL1xuICBDSEFSX0RPVDogJy4nLCAvKiAuICovXG4gIENIQVJfRE9VQkxFX1FVT1RFOiAnXCInLCAvKiBcIiAqL1xuICBDSEFSX0VRVUFMOiAnPScsIC8qID0gKi9cbiAgQ0hBUl9FWENMQU1BVElPTl9NQVJLOiAnIScsIC8qICEgKi9cbiAgQ0hBUl9GT1JNX0ZFRUQ6ICdcXGYnLCAvKiBcXGYgKi9cbiAgQ0hBUl9GT1JXQVJEX1NMQVNIOiAnLycsIC8qIC8gKi9cbiAgQ0hBUl9IQVNIOiAnIycsIC8qICMgKi9cbiAgQ0hBUl9IWVBIRU5fTUlOVVM6ICctJywgLyogLSAqL1xuICBDSEFSX0xFRlRfQU5HTEVfQlJBQ0tFVDogJzwnLCAvKiA8ICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRTogJ3snLCAvKiB7ICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVDogJ1snLCAvKiBbICovXG4gIENIQVJfTElORV9GRUVEOiAnXFxuJywgLyogXFxuICovXG4gIENIQVJfTk9fQlJFQUtfU1BBQ0U6ICdcXHUwMEEwJywgLyogXFx1MDBBMCAqL1xuICBDSEFSX1BFUkNFTlQ6ICclJywgLyogJSAqL1xuICBDSEFSX1BMVVM6ICcrJywgLyogKyAqL1xuICBDSEFSX1FVRVNUSU9OX01BUks6ICc/JywgLyogPyAqL1xuICBDSEFSX1JJR0hUX0FOR0xFX0JSQUNLRVQ6ICc+JywgLyogPiAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFOiAnfScsIC8qIH0gKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVDogJ10nLCAvKiBdICovXG4gIENIQVJfU0VNSUNPTE9OOiAnOycsIC8qIDsgKi9cbiAgQ0hBUl9TSU5HTEVfUVVPVEU6ICdcXCcnLCAvKiAnICovXG4gIENIQVJfU1BBQ0U6ICcgJywgLyogICAqL1xuICBDSEFSX1RBQjogJ1xcdCcsIC8qIFxcdCAqL1xuICBDSEFSX1VOREVSU0NPUkU6ICdfJywgLyogXyAqL1xuICBDSEFSX1ZFUlRJQ0FMX0xJTkU6ICd8JywgLyogfCAqL1xuICBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRTogJ1xcdUZFRkYnIC8qIFxcdUZFRkYgKi9cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IHtcbiAgTUFYX0xFTkdUSCxcbiAgQ0hBUl9CQUNLU0xBU0gsIC8qIFxcICovXG4gIENIQVJfQkFDS1RJQ0ssIC8qIGAgKi9cbiAgQ0hBUl9DT01NQSwgLyogLCAqL1xuICBDSEFSX0RPVCwgLyogLiAqL1xuICBDSEFSX0xFRlRfUEFSRU5USEVTRVMsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUywgLyogKSAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UsIC8qIHsgKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSwgLyogfSAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQsIC8qIFsgKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCwgLyogXSAqL1xuICBDSEFSX0RPVUJMRV9RVU9URSwgLyogXCIgKi9cbiAgQ0hBUl9TSU5HTEVfUVVPVEUsIC8qICcgKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRSxcbiAgQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0Vcbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG4vKipcbiAqIHBhcnNlXG4gKi9cblxuY29uc3QgcGFyc2UgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIH1cblxuICBsZXQgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGxldCBtYXggPSB0eXBlb2Ygb3B0cy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4oTUFYX0xFTkdUSCwgb3B0cy5tYXhMZW5ndGgpIDogTUFYX0xFTkdUSDtcbiAgaWYgKGlucHV0Lmxlbmd0aCA+IG1heCkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW5wdXQgbGVuZ3RoICgke2lucHV0Lmxlbmd0aH0pLCBleGNlZWRzIG1heCBjaGFyYWN0ZXJzICgke21heH0pYCk7XG4gIH1cblxuICBsZXQgYXN0ID0geyB0eXBlOiAncm9vdCcsIGlucHV0LCBub2RlczogW10gfTtcbiAgbGV0IHN0YWNrID0gW2FzdF07XG4gIGxldCBibG9jayA9IGFzdDtcbiAgbGV0IHByZXYgPSBhc3Q7XG4gIGxldCBicmFja2V0cyA9IDA7XG4gIGxldCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBkZXB0aCA9IDA7XG4gIGxldCB2YWx1ZTtcbiAgbGV0IG1lbW8gPSB7fTtcblxuICAvKipcbiAgICogSGVscGVyc1xuICAgKi9cblxuICBjb25zdCBhZHZhbmNlID0gKCkgPT4gaW5wdXRbaW5kZXgrK107XG4gIGNvbnN0IHB1c2ggPSBub2RlID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAndGV4dCcgJiYgcHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgcHJldi50eXBlID0gJ3RleHQnO1xuICAgIH1cblxuICAgIGlmIChwcmV2ICYmIHByZXYudHlwZSA9PT0gJ3RleHQnICYmIG5vZGUudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICBwcmV2LnZhbHVlICs9IG5vZGUudmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYmxvY2subm9kZXMucHVzaChub2RlKTtcbiAgICBub2RlLnBhcmVudCA9IGJsb2NrO1xuICAgIG5vZGUucHJldiA9IHByZXY7XG4gICAgcHJldiA9IG5vZGU7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG5cbiAgcHVzaCh7IHR5cGU6ICdib3MnIH0pO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGJsb2NrID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgdmFsdWUgPSBhZHZhbmNlKCk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZhbGlkIGNoYXJzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFIHx8IHZhbHVlID09PSBDSEFSX05PX0JSRUFLX1NQQUNFKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVkIGNoYXJzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfQkFDS1NMQVNIKSB7XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogKG9wdGlvbnMua2VlcEVzY2FwaW5nID8gdmFsdWUgOiAnJykgKyBhZHZhbmNlKCkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSaWdodCBzcXVhcmUgYnJhY2tldCAobGl0ZXJhbCk6ICddJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogJ1xcXFwnICsgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMZWZ0IHNxdWFyZSBicmFja2V0OiAnWydcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICBicmFja2V0cysrO1xuXG4gICAgICBsZXQgY2xvc2VkID0gdHJ1ZTtcbiAgICAgIGxldCBuZXh0O1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgKG5leHQgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIHZhbHVlICs9IG5leHQ7XG5cbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgICAgIGJyYWNrZXRzKys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgICAgICB2YWx1ZSArPSBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgICAgIGJyYWNrZXRzLS07XG5cbiAgICAgICAgICBpZiAoYnJhY2tldHMgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcmVudGhlc2VzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUykge1xuICAgICAgYmxvY2sgPSBwdXNoKHsgdHlwZTogJ3BhcmVuJywgbm9kZXM6IFtdIH0pO1xuICAgICAgc3RhY2sucHVzaChibG9jayk7XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUykge1xuICAgICAgaWYgKGJsb2NrLnR5cGUgIT09ICdwYXJlbicpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYmxvY2sgPSBzdGFjay5wb3AoKTtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgYmxvY2sgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1b3RlczogJ3xcInxgXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfRE9VQkxFX1FVT1RFIHx8IHZhbHVlID09PSBDSEFSX1NJTkdMRV9RVU9URSB8fCB2YWx1ZSA9PT0gQ0hBUl9CQUNLVElDSykge1xuICAgICAgbGV0IG9wZW4gPSB2YWx1ZTtcbiAgICAgIGxldCBuZXh0O1xuXG4gICAgICBpZiAob3B0aW9ucy5rZWVwUXVvdGVzICE9PSB0cnVlKSB7XG4gICAgICAgIHZhbHVlID0gJyc7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfQkFDS1NMQVNIKSB7XG4gICAgICAgICAgdmFsdWUgKz0gbmV4dCArIGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBvcGVuKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMua2VlcFF1b3RlcyA9PT0gdHJ1ZSkgdmFsdWUgKz0gbmV4dDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlICs9IG5leHQ7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGVmdCBjdXJseSBicmFjZTogJ3snXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgZGVwdGgrKztcblxuICAgICAgbGV0IGRvbGxhciA9IHByZXYudmFsdWUgJiYgcHJldi52YWx1ZS5zbGljZSgtMSkgPT09ICckJyB8fCBibG9jay5kb2xsYXIgPT09IHRydWU7XG4gICAgICBsZXQgYnJhY2UgPSB7XG4gICAgICAgIHR5cGU6ICdicmFjZScsXG4gICAgICAgIG9wZW46IHRydWUsXG4gICAgICAgIGNsb3NlOiBmYWxzZSxcbiAgICAgICAgZG9sbGFyLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgY29tbWFzOiAwLFxuICAgICAgICByYW5nZXM6IDAsXG4gICAgICAgIG5vZGVzOiBbXVxuICAgICAgfTtcblxuICAgICAgYmxvY2sgPSBwdXNoKGJyYWNlKTtcbiAgICAgIHN0YWNrLnB1c2goYmxvY2spO1xuICAgICAgcHVzaCh7IHR5cGU6ICdvcGVuJywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSaWdodCBjdXJseSBicmFjZTogJ30nXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgIGlmIChibG9jay50eXBlICE9PSAnYnJhY2UnKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IHR5cGUgPSAnY2xvc2UnO1xuICAgICAgYmxvY2sgPSBzdGFjay5wb3AoKTtcbiAgICAgIGJsb2NrLmNsb3NlID0gdHJ1ZTtcblxuICAgICAgcHVzaCh7IHR5cGUsIHZhbHVlIH0pO1xuICAgICAgZGVwdGgtLTtcblxuICAgICAgYmxvY2sgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbW1hOiAnLCdcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9DT01NQSAmJiBkZXB0aCA+IDApIHtcbiAgICAgIGlmIChibG9jay5yYW5nZXMgPiAwKSB7XG4gICAgICAgIGJsb2NrLnJhbmdlcyA9IDA7XG4gICAgICAgIGxldCBvcGVuID0gYmxvY2subm9kZXMuc2hpZnQoKTtcbiAgICAgICAgYmxvY2subm9kZXMgPSBbb3BlbiwgeyB0eXBlOiAndGV4dCcsIHZhbHVlOiBzdHJpbmdpZnkoYmxvY2spIH1dO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2NvbW1hJywgdmFsdWUgfSk7XG4gICAgICBibG9jay5jb21tYXMrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvdDogJy4nXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfRE9UICYmIGRlcHRoID4gMCAmJiBibG9jay5jb21tYXMgPT09IDApIHtcbiAgICAgIGxldCBzaWJsaW5ncyA9IGJsb2NrLm5vZGVzO1xuXG4gICAgICBpZiAoZGVwdGggPT09IDAgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgICAgYmxvY2sucmFuZ2UgPSBbXTtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgcHJldi50eXBlID0gJ3JhbmdlJztcblxuICAgICAgICBpZiAoYmxvY2subm9kZXMubGVuZ3RoICE9PSAzICYmIGJsb2NrLm5vZGVzLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICAgIGJsb2NrLmludmFsaWQgPSB0cnVlO1xuICAgICAgICAgIGJsb2NrLnJhbmdlcyA9IDA7XG4gICAgICAgICAgcHJldi50eXBlID0gJ3RleHQnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYmxvY2sucmFuZ2VzKys7XG4gICAgICAgIGJsb2NrLmFyZ3MgPSBbXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgc2libGluZ3MucG9wKCk7XG5cbiAgICAgICAgbGV0IGJlZm9yZSA9IHNpYmxpbmdzW3NpYmxpbmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICBiZWZvcmUudmFsdWUgKz0gcHJldi52YWx1ZSArIHZhbHVlO1xuICAgICAgICBwcmV2ID0gYmVmb3JlO1xuICAgICAgICBibG9jay5yYW5nZXMtLTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnZG90JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXh0XG4gICAgICovXG5cbiAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8vIE1hcmsgaW1iYWxhbmNlZCBicmFjZXMgYW5kIGJyYWNrZXRzIGFzIGludmFsaWRcbiAgZG8ge1xuICAgIGJsb2NrID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ3Jvb3QnKSB7XG4gICAgICBibG9jay5ub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICBpZiAoIW5vZGUubm9kZXMpIHtcbiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnb3BlbicpIG5vZGUuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnY2xvc2UnKSBub2RlLmlzQ2xvc2UgPSB0cnVlO1xuICAgICAgICAgIGlmICghbm9kZS5ub2Rlcykgbm9kZS50eXBlID0gJ3RleHQnO1xuICAgICAgICAgIG5vZGUuaW52YWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBnZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBibG9jayBvbiBwYXJlbnQubm9kZXMgKGJsb2NrJ3Mgc2libGluZ3MpXG4gICAgICBsZXQgcGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBsZXQgaW5kZXggPSBwYXJlbnQubm9kZXMuaW5kZXhPZihibG9jayk7XG4gICAgICAvLyByZXBsYWNlIHRoZSAoaW52YWxpZCkgYmxvY2sgd2l0aCBpdCdzIG5vZGVzXG4gICAgICBwYXJlbnQubm9kZXMuc3BsaWNlKGluZGV4LCAxLCAuLi5ibG9jay5ub2Rlcyk7XG4gICAgfVxuICB9IHdoaWxlIChzdGFjay5sZW5ndGggPiAwKTtcblxuICBwdXNoKHsgdHlwZTogJ2VvcycgfSk7XG4gIHJldHVybiBhc3Q7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9saWIvc3RyaW5naWZ5Jyk7XG5jb25zdCBjb21waWxlID0gcmVxdWlyZSgnLi9saWIvY29tcGlsZScpO1xuY29uc3QgZXhwYW5kID0gcmVxdWlyZSgnLi9saWIvZXhwYW5kJyk7XG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vbGliL3BhcnNlJyk7XG5cbi8qKlxuICogRXhwYW5kIHRoZSBnaXZlbiBwYXR0ZXJuIG9yIGNyZWF0ZSBhIHJlZ2V4LWNvbXBhdGlibGUgc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcygne2EsYixjfScsIHsgY29tcGlsZTogdHJ1ZSB9KSk7IC8vPT4gWycoYXxifGMpJ11cbiAqIGNvbnNvbGUubG9nKGJyYWNlcygne2EsYixjfScpKTsgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IGJyYWNlcyA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCBvdXRwdXQgPSBbXTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICBmb3IgKGxldCBwYXR0ZXJuIG9mIGlucHV0KSB7XG4gICAgICBsZXQgcmVzdWx0ID0gYnJhY2VzLmNyZWF0ZShwYXR0ZXJuLCBvcHRpb25zKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgb3V0cHV0LnB1c2goLi4ucmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IFtdLmNvbmNhdChicmFjZXMuY3JlYXRlKGlucHV0LCBvcHRpb25zKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmV4cGFuZCA9PT0gdHJ1ZSAmJiBvcHRpb25zLm5vZHVwZXMgPT09IHRydWUpIHtcbiAgICBvdXRwdXQgPSBbLi4ubmV3IFNldChvdXRwdXQpXTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgd2l0aCB0aGUgZ2l2ZW4gYG9wdGlvbnNgLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBicmFjZXMucGFyc2UocGF0dGVybiwgWywgb3B0aW9uc10pO1xuICogY29uc3QgYXN0ID0gYnJhY2VzLnBhcnNlKCdhL3tiLGN9L2QnKTtcbiAqIGNvbnNvbGUubG9nKGFzdCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXR0ZXJuIEJyYWNlIHBhdHRlcm4gdG8gcGFyc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gQVNUXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5wYXJzZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiBwYXJzZShpbnB1dCwgb3B0aW9ucyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJyYWNlcyBzdHJpbmcgZnJvbSBhbiBBU1QsIG9yIGFuIEFTVCBub2RlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGxldCBhc3QgPSBicmFjZXMucGFyc2UoJ2Zvby97YSxifS9iYXInKTtcbiAqIGNvbnNvbGUubG9nKHN0cmluZ2lmeShhc3Qubm9kZXNbMl0pKTsgLy89PiAne2EsYn0nXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIEJyYWNlIHBhdHRlcm4gb3IgQVNULlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgZXhwYW5kZWQgdmFsdWVzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMuc3RyaW5naWZ5ID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5KGJyYWNlcy5wYXJzZShpbnB1dCwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZnkoaW5wdXQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBDb21waWxlcyBhIGJyYWNlIHBhdHRlcm4gaW50byBhIHJlZ2V4LWNvbXBhdGlibGUsIG9wdGltaXplZCBzdHJpbmcuXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIG1haW4gW2JyYWNlc10oI2JyYWNlcykgZnVuY3Rpb24gYnkgZGVmYXVsdC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMuY29tcGlsZSgnYS97YixjfS9kJykpO1xuICogLy89PiBbJ2EvKGJ8YykvZCddXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIEJyYWNlIHBhdHRlcm4gb3IgQVNULlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgZXhwYW5kZWQgdmFsdWVzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMuY29tcGlsZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgaW5wdXQgPSBicmFjZXMucGFyc2UoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBjb21waWxlKGlucHV0LCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogRXhwYW5kcyBhIGJyYWNlIHBhdHRlcm4gaW50byBhbiBhcnJheS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZVxuICogbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbiB3aGVuIGBvcHRpb25zLmV4cGFuZGAgaXMgdHJ1ZS4gQmVmb3JlXG4gKiB1c2luZyB0aGlzIG1ldGhvZCBpdCdzIHJlY29tbWVuZGVkIHRoYXQgeW91IHJlYWQgdGhlIFtwZXJmb3JtYW5jZSBub3Rlc10oI3BlcmZvcm1hbmNlKSlcbiAqIGFuZCBhZHZhbnRhZ2VzIG9mIHVzaW5nIFsuY29tcGlsZV0oI2NvbXBpbGUpIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzLmV4cGFuZCgnYS97YixjfS9kJykpO1xuICogLy89PiBbJ2EvYi9kJywgJ2EvYy9kJ107XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgQnJhY2UgcGF0dGVyblxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgZXhwYW5kZWQgdmFsdWVzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMuZXhwYW5kID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICBpbnB1dCA9IGJyYWNlcy5wYXJzZShpbnB1dCwgb3B0aW9ucyk7XG4gIH1cblxuICBsZXQgcmVzdWx0ID0gZXhwYW5kKGlucHV0LCBvcHRpb25zKTtcblxuICAvLyBmaWx0ZXIgb3V0IGVtcHR5IHN0cmluZ3MgaWYgc3BlY2lmaWVkXG4gIGlmIChvcHRpb25zLm5vZW1wdHkgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgLy8gZmlsdGVyIG91dCBkdXBsaWNhdGVzIGlmIHNwZWNpZmllZFxuICBpZiAob3B0aW9ucy5ub2R1cGVzID09PSB0cnVlKSB7XG4gICAgcmVzdWx0ID0gWy4uLm5ldyBTZXQocmVzdWx0KV07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBicmFjZSBwYXR0ZXJuIGFuZCByZXR1cm5zIGVpdGhlciBhbiBleHBhbmRlZCBhcnJheVxuICogKGlmIGBvcHRpb25zLmV4cGFuZGAgaXMgdHJ1ZSksIGEgaGlnaGx5IG9wdGltaXplZCByZWdleC1jb21wYXRpYmxlIHN0cmluZy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMuY3JlYXRlKCd1c2VyLXsyMDAuLjMwMH0vcHJvamVjdC17YSxiLGN9LXsxLi4xMH0nKSlcbiAqIC8vPT4gJ3VzZXItKDIwWzAtOV18MlsxLTldWzAtOV18MzAwKS9wcm9qZWN0LShhfGJ8YyktKFsxLTldfDEwKSdcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBCcmFjZSBwYXR0ZXJuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5jcmVhdGUgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoaW5wdXQgPT09ICcnIHx8IGlucHV0Lmxlbmd0aCA8IDMpIHtcbiAgICByZXR1cm4gW2lucHV0XTtcbiAgfVxuXG4gcmV0dXJuIG9wdGlvbnMuZXhwYW5kICE9PSB0cnVlXG4gICAgPyBicmFjZXMuY29tcGlsZShpbnB1dCwgb3B0aW9ucylcbiAgICA6IGJyYWNlcy5leHBhbmQoaW5wdXQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgXCJicmFjZXNcIlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gYnJhY2VzO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IFdJTl9TTEFTSCA9ICdcXFxcXFxcXC8nO1xuY29uc3QgV0lOX05PX1NMQVNIID0gYFteJHtXSU5fU0xBU0h9XWA7XG5cbi8qKlxuICogUG9zaXggZ2xvYiByZWdleFxuICovXG5cbmNvbnN0IERPVF9MSVRFUkFMID0gJ1xcXFwuJztcbmNvbnN0IFBMVVNfTElURVJBTCA9ICdcXFxcKyc7XG5jb25zdCBRTUFSS19MSVRFUkFMID0gJ1xcXFw/JztcbmNvbnN0IFNMQVNIX0xJVEVSQUwgPSAnXFxcXC8nO1xuY29uc3QgT05FX0NIQVIgPSAnKD89LiknO1xuY29uc3QgUU1BUksgPSAnW14vXSc7XG5jb25zdCBFTkRfQU5DSE9SID0gYCg/OiR7U0xBU0hfTElURVJBTH18JClgO1xuY29uc3QgU1RBUlRfQU5DSE9SID0gYCg/Ol58JHtTTEFTSF9MSVRFUkFMfSlgO1xuY29uc3QgRE9UU19TTEFTSCA9IGAke0RPVF9MSVRFUkFMfXsxLDJ9JHtFTkRfQU5DSE9SfWA7XG5jb25zdCBOT19ET1QgPSBgKD8hJHtET1RfTElURVJBTH0pYDtcbmNvbnN0IE5PX0RPVFMgPSBgKD8hJHtTVEFSVF9BTkNIT1J9JHtET1RTX1NMQVNIfSlgO1xuY29uc3QgTk9fRE9UX1NMQVNIID0gYCg/ISR7RE9UX0xJVEVSQUx9ezAsMX0ke0VORF9BTkNIT1J9KWA7XG5jb25zdCBOT19ET1RTX1NMQVNIID0gYCg/ISR7RE9UU19TTEFTSH0pYDtcbmNvbnN0IFFNQVJLX05PX0RPVCA9IGBbXi4ke1NMQVNIX0xJVEVSQUx9XWA7XG5jb25zdCBTVEFSID0gYCR7UU1BUkt9Kj9gO1xuXG5jb25zdCBQT1NJWF9DSEFSUyA9IHtcbiAgRE9UX0xJVEVSQUwsXG4gIFBMVVNfTElURVJBTCxcbiAgUU1BUktfTElURVJBTCxcbiAgU0xBU0hfTElURVJBTCxcbiAgT05FX0NIQVIsXG4gIFFNQVJLLFxuICBFTkRfQU5DSE9SLFxuICBET1RTX1NMQVNILFxuICBOT19ET1QsXG4gIE5PX0RPVFMsXG4gIE5PX0RPVF9TTEFTSCxcbiAgTk9fRE9UU19TTEFTSCxcbiAgUU1BUktfTk9fRE9ULFxuICBTVEFSLFxuICBTVEFSVF9BTkNIT1Jcbn07XG5cbi8qKlxuICogV2luZG93cyBnbG9iIHJlZ2V4XG4gKi9cblxuY29uc3QgV0lORE9XU19DSEFSUyA9IHtcbiAgLi4uUE9TSVhfQ0hBUlMsXG5cbiAgU0xBU0hfTElURVJBTDogYFske1dJTl9TTEFTSH1dYCxcbiAgUU1BUks6IFdJTl9OT19TTEFTSCxcbiAgU1RBUjogYCR7V0lOX05PX1NMQVNIfSo/YCxcbiAgRE9UU19TTEFTSDogYCR7RE9UX0xJVEVSQUx9ezEsMn0oPzpbJHtXSU5fU0xBU0h9XXwkKWAsXG4gIE5PX0RPVDogYCg/ISR7RE9UX0xJVEVSQUx9KWAsXG4gIE5PX0RPVFM6IGAoPyEoPzpefFske1dJTl9TTEFTSH1dKSR7RE9UX0xJVEVSQUx9ezEsMn0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLFxuICBOT19ET1RfU0xBU0g6IGAoPyEke0RPVF9MSVRFUkFMfXswLDF9KD86WyR7V0lOX1NMQVNIfV18JCkpYCxcbiAgTk9fRE9UU19TTEFTSDogYCg/ISR7RE9UX0xJVEVSQUx9ezEsMn0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLFxuICBRTUFSS19OT19ET1Q6IGBbXi4ke1dJTl9TTEFTSH1dYCxcbiAgU1RBUlRfQU5DSE9SOiBgKD86XnxbJHtXSU5fU0xBU0h9XSlgLFxuICBFTkRfQU5DSE9SOiBgKD86WyR7V0lOX1NMQVNIfV18JClgXG59O1xuXG4vKipcbiAqIFBPU0lYIEJyYWNrZXQgUmVnZXhcbiAqL1xuXG5jb25zdCBQT1NJWF9SRUdFWF9TT1VSQ0UgPSB7XG4gIGFsbnVtOiAnYS16QS1aMC05JyxcbiAgYWxwaGE6ICdhLXpBLVonLFxuICBhc2NpaTogJ1xcXFx4MDAtXFxcXHg3RicsXG4gIGJsYW5rOiAnIFxcXFx0JyxcbiAgY250cmw6ICdcXFxceDAwLVxcXFx4MUZcXFxceDdGJyxcbiAgZGlnaXQ6ICcwLTknLFxuICBncmFwaDogJ1xcXFx4MjEtXFxcXHg3RScsXG4gIGxvd2VyOiAnYS16JyxcbiAgcHJpbnQ6ICdcXFxceDIwLVxcXFx4N0UgJyxcbiAgcHVuY3Q6ICdcXFxcLSFcIiMkJSZcXCcoKVxcXFwqKywuLzo7PD0+P0BbXFxcXF1eX2B7fH1+JyxcbiAgc3BhY2U6ICcgXFxcXHRcXFxcclxcXFxuXFxcXHZcXFxcZicsXG4gIHVwcGVyOiAnQS1aJyxcbiAgd29yZDogJ0EtWmEtejAtOV8nLFxuICB4ZGlnaXQ6ICdBLUZhLWYwLTknXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSDogMTAyNCAqIDY0LFxuICBQT1NJWF9SRUdFWF9TT1VSQ0UsXG5cbiAgLy8gcmVndWxhciBleHByZXNzaW9uc1xuICBSRUdFWF9CQUNLU0xBU0g6IC9cXFxcKD8hWyorP14ke30ofClbXFxdXSkvZyxcbiAgUkVHRVhfTk9OX1NQRUNJQUxfQ0hBUlM6IC9eW15AIVtcXF0uLCQqKz9ee30oKXxcXFxcL10rLyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSUzogL1stKis/Ll4ke30ofClbXFxdXS8sXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfQkFDS1JFRjogLyhcXFxcPykoKFxcVykoXFwzKikpL2csXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMOiAvKFstKis/Ll4ke30ofClbXFxdXSkvZyxcbiAgUkVHRVhfUkVNT1ZFX0JBQ0tTTEFTSDogLyg/OlxcWy4qP1teXFxcXF1cXF18XFxcXCg/PS4pKS9nLFxuXG4gIC8vIFJlcGxhY2UgZ2xvYnMgd2l0aCBlcXVpdmFsZW50IHBhdHRlcm5zIHRvIHJlZHVjZSBwYXJzaW5nIHRpbWUuXG4gIFJFUExBQ0VNRU5UUzoge1xuICAgICcqKionOiAnKicsXG4gICAgJyoqLyoqJzogJyoqJyxcbiAgICAnKiovKiovKionOiAnKionXG4gIH0sXG5cbiAgLy8gRGlnaXRzXG4gIENIQVJfMDogNDgsIC8qIDAgKi9cbiAgQ0hBUl85OiA1NywgLyogOSAqL1xuXG4gIC8vIEFscGhhYmV0IGNoYXJzLlxuICBDSEFSX1VQUEVSQ0FTRV9BOiA2NSwgLyogQSAqL1xuICBDSEFSX0xPV0VSQ0FTRV9BOiA5NywgLyogYSAqL1xuICBDSEFSX1VQUEVSQ0FTRV9aOiA5MCwgLyogWiAqL1xuICBDSEFSX0xPV0VSQ0FTRV9aOiAxMjIsIC8qIHogKi9cblxuICBDSEFSX0xFRlRfUEFSRU5USEVTRVM6IDQwLCAvKiAoICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVM6IDQxLCAvKiApICovXG5cbiAgQ0hBUl9BU1RFUklTSzogNDIsIC8qICogKi9cblxuICAvLyBOb24tYWxwaGFiZXRpYyBjaGFycy5cbiAgQ0hBUl9BTVBFUlNBTkQ6IDM4LCAvKiAmICovXG4gIENIQVJfQVQ6IDY0LCAvKiBAICovXG4gIENIQVJfQkFDS1dBUkRfU0xBU0g6IDkyLCAvKiBcXCAqL1xuICBDSEFSX0NBUlJJQUdFX1JFVFVSTjogMTMsIC8qIFxcciAqL1xuICBDSEFSX0NJUkNVTUZMRVhfQUNDRU5UOiA5NCwgLyogXiAqL1xuICBDSEFSX0NPTE9OOiA1OCwgLyogOiAqL1xuICBDSEFSX0NPTU1BOiA0NCwgLyogLCAqL1xuICBDSEFSX0RPVDogNDYsIC8qIC4gKi9cbiAgQ0hBUl9ET1VCTEVfUVVPVEU6IDM0LCAvKiBcIiAqL1xuICBDSEFSX0VRVUFMOiA2MSwgLyogPSAqL1xuICBDSEFSX0VYQ0xBTUFUSU9OX01BUks6IDMzLCAvKiAhICovXG4gIENIQVJfRk9STV9GRUVEOiAxMiwgLyogXFxmICovXG4gIENIQVJfRk9SV0FSRF9TTEFTSDogNDcsIC8qIC8gKi9cbiAgQ0hBUl9HUkFWRV9BQ0NFTlQ6IDk2LCAvKiBgICovXG4gIENIQVJfSEFTSDogMzUsIC8qICMgKi9cbiAgQ0hBUl9IWVBIRU5fTUlOVVM6IDQ1LCAvKiAtICovXG4gIENIQVJfTEVGVF9BTkdMRV9CUkFDS0VUOiA2MCwgLyogPCAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0U6IDEyMywgLyogeyAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQ6IDkxLCAvKiBbICovXG4gIENIQVJfTElORV9GRUVEOiAxMCwgLyogXFxuICovXG4gIENIQVJfTk9fQlJFQUtfU1BBQ0U6IDE2MCwgLyogXFx1MDBBMCAqL1xuICBDSEFSX1BFUkNFTlQ6IDM3LCAvKiAlICovXG4gIENIQVJfUExVUzogNDMsIC8qICsgKi9cbiAgQ0hBUl9RVUVTVElPTl9NQVJLOiA2MywgLyogPyAqL1xuICBDSEFSX1JJR0hUX0FOR0xFX0JSQUNLRVQ6IDYyLCAvKiA+ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0U6IDEyNSwgLyogfSAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUOiA5MywgLyogXSAqL1xuICBDSEFSX1NFTUlDT0xPTjogNTksIC8qIDsgKi9cbiAgQ0hBUl9TSU5HTEVfUVVPVEU6IDM5LCAvKiAnICovXG4gIENIQVJfU1BBQ0U6IDMyLCAvKiAgICovXG4gIENIQVJfVEFCOiA5LCAvKiBcXHQgKi9cbiAgQ0hBUl9VTkRFUlNDT1JFOiA5NSwgLyogXyAqL1xuICBDSEFSX1ZFUlRJQ0FMX0xJTkU6IDEyNCwgLyogfCAqL1xuICBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRTogNjUyNzksIC8qIFxcdUZFRkYgKi9cblxuICBTRVA6IHBhdGguc2VwLFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgRVhUR0xPQl9DSEFSU1xuICAgKi9cblxuICBleHRnbG9iQ2hhcnMoY2hhcnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJyEnOiB7IHR5cGU6ICduZWdhdGUnLCBvcGVuOiAnKD86KD8hKD86JywgY2xvc2U6IGApKSR7Y2hhcnMuU1RBUn0pYCB9LFxuICAgICAgJz8nOiB7IHR5cGU6ICdxbWFyaycsIG9wZW46ICcoPzonLCBjbG9zZTogJyk/JyB9LFxuICAgICAgJysnOiB7IHR5cGU6ICdwbHVzJywgb3BlbjogJyg/OicsIGNsb3NlOiAnKSsnIH0sXG4gICAgICAnKic6IHsgdHlwZTogJ3N0YXInLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpKicgfSxcbiAgICAgICdAJzogeyB0eXBlOiAnYXQnLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpJyB9XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlIEdMT0JfQ0hBUlNcbiAgICovXG5cbiAgZ2xvYkNoYXJzKHdpbjMyKSB7XG4gICAgcmV0dXJuIHdpbjMyID09PSB0cnVlID8gV0lORE9XU19DSEFSUyA6IFBPU0lYX0NIQVJTO1xuICB9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHdpbjMyID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbmNvbnN0IHtcbiAgUkVHRVhfQkFDS1NMQVNILFxuICBSRUdFWF9SRU1PVkVfQkFDS1NMQVNILFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTX0dMT0JBTFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbmV4cG9ydHMuaXNPYmplY3QgPSB2YWwgPT4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5leHBvcnRzLmhhc1JlZ2V4Q2hhcnMgPSBzdHIgPT4gUkVHRVhfU1BFQ0lBTF9DSEFSUy50ZXN0KHN0cik7XG5leHBvcnRzLmlzUmVnZXhDaGFyID0gc3RyID0+IHN0ci5sZW5ndGggPT09IDEgJiYgZXhwb3J0cy5oYXNSZWdleENoYXJzKHN0cik7XG5leHBvcnRzLmVzY2FwZVJlZ2V4ID0gc3RyID0+IHN0ci5yZXBsYWNlKFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMLCAnXFxcXCQxJyk7XG5leHBvcnRzLnRvUG9zaXhTbGFzaGVzID0gc3RyID0+IHN0ci5yZXBsYWNlKFJFR0VYX0JBQ0tTTEFTSCwgJy8nKTtcblxuZXhwb3J0cy5yZW1vdmVCYWNrc2xhc2hlcyA9IHN0ciA9PiB7XG4gIHJldHVybiBzdHIucmVwbGFjZShSRUdFWF9SRU1PVkVfQkFDS1NMQVNILCBtYXRjaCA9PiB7XG4gICAgcmV0dXJuIG1hdGNoID09PSAnXFxcXCcgPyAnJyA6IG1hdGNoO1xuICB9KTtcbn07XG5cbmV4cG9ydHMuc3VwcG9ydHNMb29rYmVoaW5kcyA9ICgpID0+IHtcbiAgY29uc3Qgc2VncyA9IHByb2Nlc3MudmVyc2lvbi5zbGljZSgxKS5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICBpZiAoc2Vncy5sZW5ndGggPT09IDMgJiYgc2Vnc1swXSA+PSA5IHx8IChzZWdzWzBdID09PSA4ICYmIHNlZ3NbMV0gPj0gMTApKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0cy5pc1dpbmRvd3MgPSBvcHRpb25zID0+IHtcbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMud2luZG93cyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMud2luZG93cztcbiAgfVxuICByZXR1cm4gd2luMzIgPT09IHRydWUgfHwgcGF0aC5zZXAgPT09ICdcXFxcJztcbn07XG5cbmV4cG9ydHMuZXNjYXBlTGFzdCA9IChpbnB1dCwgY2hhciwgbGFzdElkeCkgPT4ge1xuICBjb25zdCBpZHggPSBpbnB1dC5sYXN0SW5kZXhPZihjaGFyLCBsYXN0SWR4KTtcbiAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiBpbnB1dDtcbiAgaWYgKGlucHV0W2lkeCAtIDFdID09PSAnXFxcXCcpIHJldHVybiBleHBvcnRzLmVzY2FwZUxhc3QoaW5wdXQsIGNoYXIsIGlkeCAtIDEpO1xuICByZXR1cm4gYCR7aW5wdXQuc2xpY2UoMCwgaWR4KX1cXFxcJHtpbnB1dC5zbGljZShpZHgpfWA7XG59O1xuXG5leHBvcnRzLnJlbW92ZVByZWZpeCA9IChpbnB1dCwgc3RhdGUgPSB7fSkgPT4ge1xuICBsZXQgb3V0cHV0ID0gaW5wdXQ7XG4gIGlmIChvdXRwdXQuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIG91dHB1dCA9IG91dHB1dC5zbGljZSgyKTtcbiAgICBzdGF0ZS5wcmVmaXggPSAnLi8nO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5leHBvcnRzLndyYXBPdXRwdXQgPSAoaW5wdXQsIHN0YXRlID0ge30sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCBwcmVwZW5kID0gb3B0aW9ucy5jb250YWlucyA/ICcnIDogJ14nO1xuICBjb25zdCBhcHBlbmQgPSBvcHRpb25zLmNvbnRhaW5zID8gJycgOiAnJCc7XG5cbiAgbGV0IG91dHB1dCA9IGAke3ByZXBlbmR9KD86JHtpbnB1dH0pJHthcHBlbmR9YDtcbiAgaWYgKHN0YXRlLm5lZ2F0ZWQgPT09IHRydWUpIHtcbiAgICBvdXRwdXQgPSBgKD86Xig/ISR7b3V0cHV0fSkuKiQpYDtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuY29uc3Qge1xuICBDSEFSX0FTVEVSSVNLLCAgICAgICAgICAgICAvKiAqICovXG4gIENIQVJfQVQsICAgICAgICAgICAgICAgICAgIC8qIEAgKi9cbiAgQ0hBUl9CQUNLV0FSRF9TTEFTSCwgICAgICAgLyogXFwgKi9cbiAgQ0hBUl9DT01NQSwgICAgICAgICAgICAgICAgLyogLCAqL1xuICBDSEFSX0RPVCwgICAgICAgICAgICAgICAgICAvKiAuICovXG4gIENIQVJfRVhDTEFNQVRJT05fTUFSSywgICAgIC8qICEgKi9cbiAgQ0hBUl9GT1JXQVJEX1NMQVNILCAgICAgICAgLyogLyAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UsICAgICAvKiB7ICovXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUywgICAgIC8qICggKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VULCAgLyogWyAqL1xuICBDSEFSX1BMVVMsICAgICAgICAgICAgICAgICAvKiArICovXG4gIENIQVJfUVVFU1RJT05fTUFSSywgICAgICAgIC8qID8gKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSwgICAgLyogfSAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTLCAgICAvKiApICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQgIC8qIF0gKi9cbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5jb25zdCBpc1BhdGhTZXBhcmF0b3IgPSBjb2RlID0+IHtcbiAgcmV0dXJuIGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCB8fCBjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIO1xufTtcblxuY29uc3QgZGVwdGggPSB0b2tlbiA9PiB7XG4gIGlmICh0b2tlbi5pc1ByZWZpeCAhPT0gdHJ1ZSkge1xuICAgIHRva2VuLmRlcHRoID0gdG9rZW4uaXNHbG9ic3RhciA/IEluZmluaXR5IDogMTtcbiAgfVxufTtcblxuLyoqXG4gKiBRdWlja2x5IHNjYW5zIGEgZ2xvYiBwYXR0ZXJuIGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgaGFuZGZ1bCBvZlxuICogdXNlZnVsIHByb3BlcnRpZXMsIGxpa2UgYGlzR2xvYmAsIGBwYXRoYCAodGhlIGxlYWRpbmcgbm9uLWdsb2IsIGlmIGl0IGV4aXN0cyksXG4gKiBgZ2xvYmAgKHRoZSBhY3R1YWwgcGF0dGVybiksIGBuZWdhdGVkYCAodHJ1ZSBpZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBgIWAgYnV0IG5vdFxuICogd2l0aCBgIShgKSBhbmQgYG5lZ2F0ZWRFeHRnbG9iYCAodHJ1ZSBpZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBgIShgKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcG0gPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIGNvbnNvbGUubG9nKHBtLnNjYW4oJ2Zvby9iYXIvKi5qcycpKTtcbiAqIHsgaXNHbG9iOiB0cnVlLCBpbnB1dDogJ2Zvby9iYXIvKi5qcycsIGJhc2U6ICdmb28vYmFyJywgZ2xvYjogJyouanMnIH1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggdG9rZW5zIGFuZCByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5jb25zdCBzY2FuID0gKGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aCAtIDE7XG4gIGNvbnN0IHNjYW5Ub0VuZCA9IG9wdHMucGFydHMgPT09IHRydWUgfHwgb3B0cy5zY2FuVG9FbmQgPT09IHRydWU7XG4gIGNvbnN0IHNsYXNoZXMgPSBbXTtcbiAgY29uc3QgdG9rZW5zID0gW107XG4gIGNvbnN0IHBhcnRzID0gW107XG5cbiAgbGV0IHN0ciA9IGlucHV0O1xuICBsZXQgaW5kZXggPSAtMTtcbiAgbGV0IHN0YXJ0ID0gMDtcbiAgbGV0IGxhc3RJbmRleCA9IDA7XG4gIGxldCBpc0JyYWNlID0gZmFsc2U7XG4gIGxldCBpc0JyYWNrZXQgPSBmYWxzZTtcbiAgbGV0IGlzR2xvYiA9IGZhbHNlO1xuICBsZXQgaXNFeHRnbG9iID0gZmFsc2U7XG4gIGxldCBpc0dsb2JzdGFyID0gZmFsc2U7XG4gIGxldCBicmFjZUVzY2FwZWQgPSBmYWxzZTtcbiAgbGV0IGJhY2tzbGFzaGVzID0gZmFsc2U7XG4gIGxldCBuZWdhdGVkID0gZmFsc2U7XG4gIGxldCBuZWdhdGVkRXh0Z2xvYiA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgbGV0IGJyYWNlcyA9IDA7XG4gIGxldCBwcmV2O1xuICBsZXQgY29kZTtcbiAgbGV0IHRva2VuID0geyB2YWx1ZTogJycsIGRlcHRoOiAwLCBpc0dsb2I6IGZhbHNlIH07XG5cbiAgY29uc3QgZW9zID0gKCkgPT4gaW5kZXggPj0gbGVuZ3RoO1xuICBjb25zdCBwZWVrID0gKCkgPT4gc3RyLmNoYXJDb2RlQXQoaW5kZXggKyAxKTtcbiAgY29uc3QgYWR2YW5jZSA9ICgpID0+IHtcbiAgICBwcmV2ID0gY29kZTtcbiAgICByZXR1cm4gc3RyLmNoYXJDb2RlQXQoKytpbmRleCk7XG4gIH07XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY29kZSA9IGFkdmFuY2UoKTtcbiAgICBsZXQgbmV4dDtcblxuICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgIGNvZGUgPSBhZHZhbmNlKCk7XG5cbiAgICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgICAgYnJhY2VFc2NhcGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChicmFjZUVzY2FwZWQgPT09IHRydWUgfHwgY29kZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICBicmFjZXMrKztcblxuICAgICAgd2hpbGUgKGVvcygpICE9PSB0cnVlICYmIChjb2RlID0gYWR2YW5jZSgpKSkge1xuICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICAgIGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgICAgICBicmFjZXMrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChicmFjZUVzY2FwZWQgIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9ET1QgJiYgKGNvZGUgPSBhZHZhbmNlKCkpID09PSBDSEFSX0RPVCkge1xuICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTtcbiAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJyYWNlRXNjYXBlZCAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0NPTU1BKSB7XG4gICAgICAgICAgaXNCcmFjZSA9IHRva2VuLmlzQnJhY2UgPSB0cnVlO1xuICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSkge1xuICAgICAgICAgIGJyYWNlcy0tO1xuXG4gICAgICAgICAgaWYgKGJyYWNlcyA9PT0gMCkge1xuICAgICAgICAgICAgYnJhY2VFc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpc0JyYWNlID0gdG9rZW4uaXNCcmFjZSA9IHRydWU7XG4gICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkge1xuICAgICAgc2xhc2hlcy5wdXNoKGluZGV4KTtcbiAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgIHRva2VuID0geyB2YWx1ZTogJycsIGRlcHRoOiAwLCBpc0dsb2I6IGZhbHNlIH07XG5cbiAgICAgIGlmIChmaW5pc2hlZCA9PT0gdHJ1ZSkgY29udGludWU7XG4gICAgICBpZiAocHJldiA9PT0gQ0hBUl9ET1QgJiYgaW5kZXggPT09IChzdGFydCArIDEpKSB7XG4gICAgICAgIHN0YXJ0ICs9IDI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsYXN0SW5kZXggPSBpbmRleCArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5ub2V4dCAhPT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaXNFeHRnbG9iQ2hhciA9IGNvZGUgPT09IENIQVJfUExVU1xuICAgICAgICB8fCBjb2RlID09PSBDSEFSX0FUXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfQVNURVJJU0tcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9RVUVTVElPTl9NQVJLXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfRVhDTEFNQVRJT05fTUFSSztcblxuICAgICAgaWYgKGlzRXh0Z2xvYkNoYXIgPT09IHRydWUgJiYgcGVlaygpID09PSBDSEFSX0xFRlRfUEFSRU5USEVTRVMpIHtcbiAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgaXNFeHRnbG9iID0gdG9rZW4uaXNFeHRnbG9iID0gdHJ1ZTtcbiAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLICYmIGluZGV4ID09PSBzdGFydCkge1xuICAgICAgICAgIG5lZ2F0ZWRFeHRnbG9iID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29kZSA9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTKSB7XG4gICAgICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX0FTVEVSSVNLKSB7XG4gICAgICBpZiAocHJldiA9PT0gQ0hBUl9BU1RFUklTSykgaXNHbG9ic3RhciA9IHRva2VuLmlzR2xvYnN0YXIgPSB0cnVlO1xuICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX1FVRVNUSU9OX01BUkspIHtcbiAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKG5leHQgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgICAgICBpc0JyYWNrZXQgPSB0b2tlbi5pc0JyYWNrZXQgPSB0cnVlO1xuICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vbmVnYXRlICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfRVhDTEFNQVRJT05fTUFSSyAmJiBpbmRleCA9PT0gc3RhcnQpIHtcbiAgICAgIG5lZ2F0ZWQgPSB0b2tlbi5uZWdhdGVkID0gdHJ1ZTtcbiAgICAgIHN0YXJ0Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5ub3BhcmVuICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUykge1xuICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUykge1xuICAgICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgICBjb2RlID0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfUEFSRU5USEVTRVMpIHtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChpc0dsb2IgPT09IHRydWUpIHtcbiAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMubm9leHQgPT09IHRydWUpIHtcbiAgICBpc0V4dGdsb2IgPSBmYWxzZTtcbiAgICBpc0dsb2IgPSBmYWxzZTtcbiAgfVxuXG4gIGxldCBiYXNlID0gc3RyO1xuICBsZXQgcHJlZml4ID0gJyc7XG4gIGxldCBnbG9iID0gJyc7XG5cbiAgaWYgKHN0YXJ0ID4gMCkge1xuICAgIHByZWZpeCA9IHN0ci5zbGljZSgwLCBzdGFydCk7XG4gICAgc3RyID0gc3RyLnNsaWNlKHN0YXJ0KTtcbiAgICBsYXN0SW5kZXggLT0gc3RhcnQ7XG4gIH1cblxuICBpZiAoYmFzZSAmJiBpc0dsb2IgPT09IHRydWUgJiYgbGFzdEluZGV4ID4gMCkge1xuICAgIGJhc2UgPSBzdHIuc2xpY2UoMCwgbGFzdEluZGV4KTtcbiAgICBnbG9iID0gc3RyLnNsaWNlKGxhc3RJbmRleCk7XG4gIH0gZWxzZSBpZiAoaXNHbG9iID09PSB0cnVlKSB7XG4gICAgYmFzZSA9ICcnO1xuICAgIGdsb2IgPSBzdHI7XG4gIH0gZWxzZSB7XG4gICAgYmFzZSA9IHN0cjtcbiAgfVxuXG4gIGlmIChiYXNlICYmIGJhc2UgIT09ICcnICYmIGJhc2UgIT09ICcvJyAmJiBiYXNlICE9PSBzdHIpIHtcbiAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGJhc2UuY2hhckNvZGVBdChiYXNlLmxlbmd0aCAtIDEpKSkge1xuICAgICAgYmFzZSA9IGJhc2Uuc2xpY2UoMCwgLTEpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLnVuZXNjYXBlID09PSB0cnVlKSB7XG4gICAgaWYgKGdsb2IpIGdsb2IgPSB1dGlscy5yZW1vdmVCYWNrc2xhc2hlcyhnbG9iKTtcblxuICAgIGlmIChiYXNlICYmIGJhY2tzbGFzaGVzID09PSB0cnVlKSB7XG4gICAgICBiYXNlID0gdXRpbHMucmVtb3ZlQmFja3NsYXNoZXMoYmFzZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgcHJlZml4LFxuICAgIGlucHV0LFxuICAgIHN0YXJ0LFxuICAgIGJhc2UsXG4gICAgZ2xvYixcbiAgICBpc0JyYWNlLFxuICAgIGlzQnJhY2tldCxcbiAgICBpc0dsb2IsXG4gICAgaXNFeHRnbG9iLFxuICAgIGlzR2xvYnN0YXIsXG4gICAgbmVnYXRlZCxcbiAgICBuZWdhdGVkRXh0Z2xvYlxuICB9O1xuXG4gIGlmIChvcHRzLnRva2VucyA9PT0gdHJ1ZSkge1xuICAgIHN0YXRlLm1heERlcHRoID0gMDtcbiAgICBpZiAoIWlzUGF0aFNlcGFyYXRvcihjb2RlKSkge1xuICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgIH1cbiAgICBzdGF0ZS50b2tlbnMgPSB0b2tlbnM7XG4gIH1cblxuICBpZiAob3B0cy5wYXJ0cyA9PT0gdHJ1ZSB8fCBvcHRzLnRva2VucyA9PT0gdHJ1ZSkge1xuICAgIGxldCBwcmV2SW5kZXg7XG5cbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBzbGFzaGVzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgIGNvbnN0IG4gPSBwcmV2SW5kZXggPyBwcmV2SW5kZXggKyAxIDogc3RhcnQ7XG4gICAgICBjb25zdCBpID0gc2xhc2hlc1tpZHhdO1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC5zbGljZShuLCBpKTtcbiAgICAgIGlmIChvcHRzLnRva2Vucykge1xuICAgICAgICBpZiAoaWR4ID09PSAwICYmIHN0YXJ0ICE9PSAwKSB7XG4gICAgICAgICAgdG9rZW5zW2lkeF0uaXNQcmVmaXggPSB0cnVlO1xuICAgICAgICAgIHRva2Vuc1tpZHhdLnZhbHVlID0gcHJlZml4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vuc1tpZHhdLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZGVwdGgodG9rZW5zW2lkeF0pO1xuICAgICAgICBzdGF0ZS5tYXhEZXB0aCArPSB0b2tlbnNbaWR4XS5kZXB0aDtcbiAgICAgIH1cbiAgICAgIGlmIChpZHggIT09IDAgfHwgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgIHBhcnRzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgICAgcHJldkluZGV4ID0gaTtcbiAgICB9XG5cbiAgICBpZiAocHJldkluZGV4ICYmIHByZXZJbmRleCArIDEgPCBpbnB1dC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5wdXQuc2xpY2UocHJldkluZGV4ICsgMSk7XG4gICAgICBwYXJ0cy5wdXNoKHZhbHVlKTtcblxuICAgICAgaWYgKG9wdHMudG9rZW5zKSB7XG4gICAgICAgIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZGVwdGgodG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSk7XG4gICAgICAgIHN0YXRlLm1heERlcHRoICs9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0uZGVwdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGUuc2xhc2hlcyA9IHNsYXNoZXM7XG4gICAgc3RhdGUucGFydHMgPSBwYXJ0cztcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gc2NhbjtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCB7XG4gIE1BWF9MRU5HVEgsXG4gIFBPU0lYX1JFR0VYX1NPVVJDRSxcbiAgUkVHRVhfTk9OX1NQRUNJQUxfQ0hBUlMsXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfQkFDS1JFRixcbiAgUkVQTEFDRU1FTlRTXG59ID0gY29uc3RhbnRzO1xuXG4vKipcbiAqIEhlbHBlcnNcbiAqL1xuXG5jb25zdCBleHBhbmRSYW5nZSA9IChhcmdzLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5leHBhbmRSYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBvcHRpb25zLmV4cGFuZFJhbmdlKC4uLmFyZ3MsIG9wdGlvbnMpO1xuICB9XG5cbiAgYXJncy5zb3J0KCk7XG4gIGNvbnN0IHZhbHVlID0gYFske2FyZ3Muam9pbignLScpfV1gO1xuXG4gIHRyeSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldyAqL1xuICAgIG5ldyBSZWdFeHAodmFsdWUpO1xuICB9IGNhdGNoIChleCkge1xuICAgIHJldHVybiBhcmdzLm1hcCh2ID0+IHV0aWxzLmVzY2FwZVJlZ2V4KHYpKS5qb2luKCcuLicpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIG1lc3NhZ2UgZm9yIGEgc3ludGF4IGVycm9yXG4gKi9cblxuY29uc3Qgc3ludGF4RXJyb3IgPSAodHlwZSwgY2hhcikgPT4ge1xuICByZXR1cm4gYE1pc3NpbmcgJHt0eXBlfTogXCIke2NoYXJ9XCIgLSB1c2UgXCJcXFxcXFxcXCR7Y2hhcn1cIiB0byBtYXRjaCBsaXRlcmFsIGNoYXJhY3RlcnNgO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaW5wdXQgc3RyaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5cbmNvbnN0IHBhcnNlID0gKGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlucHV0ID0gUkVQTEFDRU1FTlRTW2lucHV0XSB8fCBpbnB1dDtcblxuICBjb25zdCBvcHRzID0geyAuLi5vcHRpb25zIH07XG4gIGNvbnN0IG1heCA9IHR5cGVvZiBvcHRzLm1heExlbmd0aCA9PT0gJ251bWJlcicgPyBNYXRoLm1pbihNQVhfTEVOR1RILCBvcHRzLm1heExlbmd0aCkgOiBNQVhfTEVOR1RIO1xuXG4gIGxldCBsZW4gPSBpbnB1dC5sZW5ndGg7XG4gIGlmIChsZW4gPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYElucHV0IGxlbmd0aDogJHtsZW59LCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBsZW5ndGg6ICR7bWF4fWApO1xuICB9XG5cbiAgY29uc3QgYm9zID0geyB0eXBlOiAnYm9zJywgdmFsdWU6ICcnLCBvdXRwdXQ6IG9wdHMucHJlcGVuZCB8fCAnJyB9O1xuICBjb25zdCB0b2tlbnMgPSBbYm9zXTtcblxuICBjb25zdCBjYXB0dXJlID0gb3B0cy5jYXB0dXJlID8gJycgOiAnPzonO1xuICBjb25zdCB3aW4zMiA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKTtcblxuICAvLyBjcmVhdGUgY29uc3RhbnRzIGJhc2VkIG9uIHBsYXRmb3JtLCBmb3Igd2luZG93cyBvciBwb3NpeFxuICBjb25zdCBQTEFURk9STV9DSEFSUyA9IGNvbnN0YW50cy5nbG9iQ2hhcnMod2luMzIpO1xuICBjb25zdCBFWFRHTE9CX0NIQVJTID0gY29uc3RhbnRzLmV4dGdsb2JDaGFycyhQTEFURk9STV9DSEFSUyk7XG5cbiAgY29uc3Qge1xuICAgIERPVF9MSVRFUkFMLFxuICAgIFBMVVNfTElURVJBTCxcbiAgICBTTEFTSF9MSVRFUkFMLFxuICAgIE9ORV9DSEFSLFxuICAgIERPVFNfU0xBU0gsXG4gICAgTk9fRE9ULFxuICAgIE5PX0RPVF9TTEFTSCxcbiAgICBOT19ET1RTX1NMQVNILFxuICAgIFFNQVJLLFxuICAgIFFNQVJLX05PX0RPVCxcbiAgICBTVEFSLFxuICAgIFNUQVJUX0FOQ0hPUlxuICB9ID0gUExBVEZPUk1fQ0hBUlM7XG5cbiAgY29uc3QgZ2xvYnN0YXIgPSBvcHRzID0+IHtcbiAgICByZXR1cm4gYCgke2NhcHR1cmV9KD86KD8hJHtTVEFSVF9BTkNIT1J9JHtvcHRzLmRvdCA/IERPVFNfU0xBU0ggOiBET1RfTElURVJBTH0pLikqPylgO1xuICB9O1xuXG4gIGNvbnN0IG5vZG90ID0gb3B0cy5kb3QgPyAnJyA6IE5PX0RPVDtcbiAgY29uc3QgcW1hcmtOb0RvdCA9IG9wdHMuZG90ID8gUU1BUksgOiBRTUFSS19OT19ET1Q7XG4gIGxldCBzdGFyID0gb3B0cy5iYXNoID09PSB0cnVlID8gZ2xvYnN0YXIob3B0cykgOiBTVEFSO1xuXG4gIGlmIChvcHRzLmNhcHR1cmUpIHtcbiAgICBzdGFyID0gYCgke3N0YXJ9KWA7XG4gIH1cblxuICAvLyBtaW5pbWF0Y2ggb3B0aW9ucyBzdXBwb3J0XG4gIGlmICh0eXBlb2Ygb3B0cy5ub2V4dCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgb3B0cy5ub2V4dGdsb2IgPSBvcHRzLm5vZXh0O1xuICB9XG5cbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgaW5wdXQsXG4gICAgaW5kZXg6IC0xLFxuICAgIHN0YXJ0OiAwLFxuICAgIGRvdDogb3B0cy5kb3QgPT09IHRydWUsXG4gICAgY29uc3VtZWQ6ICcnLFxuICAgIG91dHB1dDogJycsXG4gICAgcHJlZml4OiAnJyxcbiAgICBiYWNrdHJhY2s6IGZhbHNlLFxuICAgIG5lZ2F0ZWQ6IGZhbHNlLFxuICAgIGJyYWNrZXRzOiAwLFxuICAgIGJyYWNlczogMCxcbiAgICBwYXJlbnM6IDAsXG4gICAgcXVvdGVzOiAwLFxuICAgIGdsb2JzdGFyOiBmYWxzZSxcbiAgICB0b2tlbnNcbiAgfTtcblxuICBpbnB1dCA9IHV0aWxzLnJlbW92ZVByZWZpeChpbnB1dCwgc3RhdGUpO1xuICBsZW4gPSBpbnB1dC5sZW5ndGg7XG5cbiAgY29uc3QgZXh0Z2xvYnMgPSBbXTtcbiAgY29uc3QgYnJhY2VzID0gW107XG4gIGNvbnN0IHN0YWNrID0gW107XG4gIGxldCBwcmV2ID0gYm9zO1xuICBsZXQgdmFsdWU7XG5cbiAgLyoqXG4gICAqIFRva2VuaXppbmcgaGVscGVyc1xuICAgKi9cblxuICBjb25zdCBlb3MgPSAoKSA9PiBzdGF0ZS5pbmRleCA9PT0gbGVuIC0gMTtcbiAgY29uc3QgcGVlayA9IHN0YXRlLnBlZWsgPSAobiA9IDEpID0+IGlucHV0W3N0YXRlLmluZGV4ICsgbl07XG4gIGNvbnN0IGFkdmFuY2UgPSBzdGF0ZS5hZHZhbmNlID0gKCkgPT4gaW5wdXRbKytzdGF0ZS5pbmRleF0gfHwgJyc7XG4gIGNvbnN0IHJlbWFpbmluZyA9ICgpID0+IGlucHV0LnNsaWNlKHN0YXRlLmluZGV4ICsgMSk7XG4gIGNvbnN0IGNvbnN1bWUgPSAodmFsdWUgPSAnJywgbnVtID0gMCkgPT4ge1xuICAgIHN0YXRlLmNvbnN1bWVkICs9IHZhbHVlO1xuICAgIHN0YXRlLmluZGV4ICs9IG51bTtcbiAgfTtcblxuICBjb25zdCBhcHBlbmQgPSB0b2tlbiA9PiB7XG4gICAgc3RhdGUub3V0cHV0ICs9IHRva2VuLm91dHB1dCAhPSBudWxsID8gdG9rZW4ub3V0cHV0IDogdG9rZW4udmFsdWU7XG4gICAgY29uc3VtZSh0b2tlbi52YWx1ZSk7XG4gIH07XG5cbiAgY29uc3QgbmVnYXRlID0gKCkgPT4ge1xuICAgIGxldCBjb3VudCA9IDE7XG5cbiAgICB3aGlsZSAocGVlaygpID09PSAnIScgJiYgKHBlZWsoMikgIT09ICcoJyB8fCBwZWVrKDMpID09PSAnPycpKSB7XG4gICAgICBhZHZhbmNlKCk7XG4gICAgICBzdGF0ZS5zdGFydCsrO1xuICAgICAgY291bnQrKztcbiAgICB9XG5cbiAgICBpZiAoY291bnQgJSAyID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3RhdGUubmVnYXRlZCA9IHRydWU7XG4gICAgc3RhdGUuc3RhcnQrKztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBpbmNyZW1lbnQgPSB0eXBlID0+IHtcbiAgICBzdGF0ZVt0eXBlXSsrO1xuICAgIHN0YWNrLnB1c2godHlwZSk7XG4gIH07XG5cbiAgY29uc3QgZGVjcmVtZW50ID0gdHlwZSA9PiB7XG4gICAgc3RhdGVbdHlwZV0tLTtcbiAgICBzdGFjay5wb3AoKTtcbiAgfTtcblxuICAvKipcbiAgICogUHVzaCB0b2tlbnMgb250byB0aGUgdG9rZW5zIGFycmF5LiBUaGlzIGhlbHBlciBzcGVlZHMgdXBcbiAgICogdG9rZW5pemluZyBieSAxKSBoZWxwaW5nIHVzIGF2b2lkIGJhY2t0cmFja2luZyBhcyBtdWNoIGFzIHBvc3NpYmxlLFxuICAgKiBhbmQgMikgaGVscGluZyB1cyBhdm9pZCBjcmVhdGluZyBleHRyYSB0b2tlbnMgd2hlbiBjb25zZWN1dGl2ZVxuICAgKiBjaGFyYWN0ZXJzIGFyZSBwbGFpbiB0ZXh0LiBUaGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlIGFuZCBzaW1wbGlmaWVzXG4gICAqIGxvb2tiZWhpbmRzLlxuICAgKi9cblxuICBjb25zdCBwdXNoID0gdG9rID0+IHtcbiAgICBpZiAocHJldi50eXBlID09PSAnZ2xvYnN0YXInKSB7XG4gICAgICBjb25zdCBpc0JyYWNlID0gc3RhdGUuYnJhY2VzID4gMCAmJiAodG9rLnR5cGUgPT09ICdjb21tYScgfHwgdG9rLnR5cGUgPT09ICdicmFjZScpO1xuICAgICAgY29uc3QgaXNFeHRnbG9iID0gdG9rLmV4dGdsb2IgPT09IHRydWUgfHwgKGV4dGdsb2JzLmxlbmd0aCAmJiAodG9rLnR5cGUgPT09ICdwaXBlJyB8fCB0b2sudHlwZSA9PT0gJ3BhcmVuJykpO1xuXG4gICAgICBpZiAodG9rLnR5cGUgIT09ICdzbGFzaCcgJiYgdG9rLnR5cGUgIT09ICdwYXJlbicgJiYgIWlzQnJhY2UgJiYgIWlzRXh0Z2xvYikge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLXByZXYub3V0cHV0Lmxlbmd0aCk7XG4gICAgICAgIHByZXYudHlwZSA9ICdzdGFyJztcbiAgICAgICAgcHJldi52YWx1ZSA9ICcqJztcbiAgICAgICAgcHJldi5vdXRwdXQgPSBzdGFyO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJldi5vdXRwdXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4dGdsb2JzLmxlbmd0aCAmJiB0b2sudHlwZSAhPT0gJ3BhcmVuJykge1xuICAgICAgZXh0Z2xvYnNbZXh0Z2xvYnMubGVuZ3RoIC0gMV0uaW5uZXIgKz0gdG9rLnZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0b2sudmFsdWUgfHwgdG9rLm91dHB1dCkgYXBwZW5kKHRvayk7XG4gICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAndGV4dCcgJiYgdG9rLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcHJldi52YWx1ZSArPSB0b2sudmFsdWU7XG4gICAgICBwcmV2Lm91dHB1dCA9IChwcmV2Lm91dHB1dCB8fCAnJykgKyB0b2sudmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9rLnByZXYgPSBwcmV2O1xuICAgIHRva2Vucy5wdXNoKHRvayk7XG4gICAgcHJldiA9IHRvaztcbiAgfTtcblxuICBjb25zdCBleHRnbG9iT3BlbiA9ICh0eXBlLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHRva2VuID0geyAuLi5FWFRHTE9CX0NIQVJTW3ZhbHVlXSwgY29uZGl0aW9uczogMSwgaW5uZXI6ICcnIH07XG5cbiAgICB0b2tlbi5wcmV2ID0gcHJldjtcbiAgICB0b2tlbi5wYXJlbnMgPSBzdGF0ZS5wYXJlbnM7XG4gICAgdG9rZW4ub3V0cHV0ID0gc3RhdGUub3V0cHV0O1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLmNhcHR1cmUgPyAnKCcgOiAnJykgKyB0b2tlbi5vcGVuO1xuXG4gICAgaW5jcmVtZW50KCdwYXJlbnMnKTtcbiAgICBwdXNoKHsgdHlwZSwgdmFsdWUsIG91dHB1dDogc3RhdGUub3V0cHV0ID8gJycgOiBPTkVfQ0hBUiB9KTtcbiAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgZXh0Z2xvYjogdHJ1ZSwgdmFsdWU6IGFkdmFuY2UoKSwgb3V0cHV0IH0pO1xuICAgIGV4dGdsb2JzLnB1c2godG9rZW4pO1xuICB9O1xuXG4gIGNvbnN0IGV4dGdsb2JDbG9zZSA9IHRva2VuID0+IHtcbiAgICBsZXQgb3V0cHV0ID0gdG9rZW4uY2xvc2UgKyAob3B0cy5jYXB0dXJlID8gJyknIDogJycpO1xuICAgIGxldCByZXN0O1xuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICduZWdhdGUnKSB7XG4gICAgICBsZXQgZXh0Z2xvYlN0YXIgPSBzdGFyO1xuXG4gICAgICBpZiAodG9rZW4uaW5uZXIgJiYgdG9rZW4uaW5uZXIubGVuZ3RoID4gMSAmJiB0b2tlbi5pbm5lci5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgIGV4dGdsb2JTdGFyID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChleHRnbG9iU3RhciAhPT0gc3RhciB8fCBlb3MoKSB8fCAvXlxcKSskLy50ZXN0KHJlbWFpbmluZygpKSkge1xuICAgICAgICBvdXRwdXQgPSB0b2tlbi5jbG9zZSA9IGApJCkpJHtleHRnbG9iU3Rhcn1gO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4uaW5uZXIuaW5jbHVkZXMoJyonKSAmJiAocmVzdCA9IHJlbWFpbmluZygpKSAmJiAvXlxcLlteXFxcXC8uXSskLy50ZXN0KHJlc3QpKSB7XG4gICAgICAgIC8vIEFueSBub24tbWFnaWNhbCBzdHJpbmcgKGAudHNgKSBvciBldmVuIG5lc3RlZCBleHByZXNzaW9uIChgLnt0cyx0c3h9YCkgY2FuIGZvbGxvdyBhZnRlciB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcy5cbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHBhcnNlIHRoZSBzdHJpbmcgYW5kIHVzZSBpdCBpbiB0aGUgb3V0cHV0IG9mIHRoZSBvcmlnaW5hbCBwYXR0ZXJuLlxuICAgICAgICAvLyBTdWl0YWJsZSBwYXR0ZXJuczogYC8hKCouZCkudHNgLCBgLyEoKi5kKS57dHMsdHN4fWAsIGAqKi8hKCotZGJnKS5AKGpzKWAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERpc2FibGluZyB0aGUgYGZhc3RwYXRoc2Agb3B0aW9uIGR1ZSB0byBhIHByb2JsZW0gd2l0aCBwYXJzaW5nIHN0cmluZ3MgYXMgYC50c2AgaW4gdGhlIHBhdHRlcm4gbGlrZSBgKiovISgqLmQpLnRzYC5cbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHBhcnNlKHJlc3QsIHsgLi4ub3B0aW9ucywgZmFzdHBhdGhzOiBmYWxzZSB9KS5vdXRwdXQ7XG5cbiAgICAgICAgb3V0cHV0ID0gdG9rZW4uY2xvc2UgPSBgKSR7ZXhwcmVzc2lvbn0pJHtleHRnbG9iU3Rhcn0pYDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2VuLnByZXYudHlwZSA9PT0gJ2JvcycpIHtcbiAgICAgICAgc3RhdGUubmVnYXRlZEV4dGdsb2IgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCBleHRnbG9iOiB0cnVlLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgIGRlY3JlbWVudCgncGFyZW5zJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZhc3QgcGF0aHNcbiAgICovXG5cbiAgaWYgKG9wdHMuZmFzdHBhdGhzICE9PSBmYWxzZSAmJiAhLyheWyohXXxbLygpW1xcXXt9XCJdKS8udGVzdChpbnB1dCkpIHtcbiAgICBsZXQgYmFja3NsYXNoZXMgPSBmYWxzZTtcblxuICAgIGxldCBvdXRwdXQgPSBpbnB1dC5yZXBsYWNlKFJFR0VYX1NQRUNJQUxfQ0hBUlNfQkFDS1JFRiwgKG0sIGVzYywgY2hhcnMsIGZpcnN0LCByZXN0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGZpcnN0ID09PSAnXFxcXCcpIHtcbiAgICAgICAgYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0ID09PSAnPycpIHtcbiAgICAgICAgaWYgKGVzYykge1xuICAgICAgICAgIHJldHVybiBlc2MgKyBmaXJzdCArIChyZXN0ID8gUU1BUksucmVwZWF0KHJlc3QubGVuZ3RoKSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcW1hcmtOb0RvdCArIChyZXN0ID8gUU1BUksucmVwZWF0KHJlc3QubGVuZ3RoKSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUU1BUksucmVwZWF0KGNoYXJzLmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdCA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBET1RfTElURVJBTC5yZXBlYXQoY2hhcnMubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0ID09PSAnKicpIHtcbiAgICAgICAgaWYgKGVzYykge1xuICAgICAgICAgIHJldHVybiBlc2MgKyBmaXJzdCArIChyZXN0ID8gc3RhciA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlc2MgPyBtIDogYFxcXFwke219YDtcbiAgICB9KTtcblxuICAgIGlmIChiYWNrc2xhc2hlcyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKG9wdHMudW5lc2NhcGUgPT09IHRydWUpIHtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcXFwrL2csIG0gPT4ge1xuICAgICAgICAgIHJldHVybiBtLmxlbmd0aCAlIDIgPT09IDAgPyAnXFxcXFxcXFwnIDogKG0gPyAnXFxcXCcgOiAnJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvdXRwdXQgPT09IGlucHV0ICYmIG9wdHMuY29udGFpbnMgPT09IHRydWUpIHtcbiAgICAgIHN0YXRlLm91dHB1dCA9IGlucHV0O1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLndyYXBPdXRwdXQob3V0cHV0LCBzdGF0ZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRva2VuaXplIGlucHV0IHVudGlsIHdlIHJlYWNoIGVuZC1vZi1zdHJpbmdcbiAgICovXG5cbiAgd2hpbGUgKCFlb3MoKSkge1xuICAgIHZhbHVlID0gYWR2YW5jZSgpO1xuXG4gICAgaWYgKHZhbHVlID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZWQgY2hhcmFjdGVyc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnXFxcXCcpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBwZWVrKCk7XG5cbiAgICAgIGlmIChuZXh0ID09PSAnLycgJiYgb3B0cy5iYXNoICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dCA9PT0gJy4nIHx8IG5leHQgPT09ICc7Jykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgIHZhbHVlICs9ICdcXFxcJztcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb2xsYXBzZSBzbGFzaGVzIHRvIHJlZHVjZSBwb3RlbnRpYWwgZm9yIGV4cGxvaXRzXG4gICAgICBjb25zdCBtYXRjaCA9IC9eXFxcXCsvLmV4ZWMocmVtYWluaW5nKCkpO1xuICAgICAgbGV0IHNsYXNoZXMgPSAwO1xuXG4gICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMF0ubGVuZ3RoID4gMikge1xuICAgICAgICBzbGFzaGVzID0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5pbmRleCArPSBzbGFzaGVzO1xuICAgICAgICBpZiAoc2xhc2hlcyAlIDIgIT09IDApIHtcbiAgICAgICAgICB2YWx1ZSArPSAnXFxcXCc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMudW5lc2NhcGUgPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUgPSBhZHZhbmNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSArPSBhZHZhbmNlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZS5icmFja2V0cyA9PT0gMCkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgd2UncmUgaW5zaWRlIGEgcmVnZXggY2hhcmFjdGVyIGNsYXNzLCBjb250aW51ZVxuICAgICAqIHVudGlsIHdlIHJlYWNoIHRoZSBjbG9zaW5nIGJyYWNrZXQuXG4gICAgICovXG5cbiAgICBpZiAoc3RhdGUuYnJhY2tldHMgPiAwICYmICh2YWx1ZSAhPT0gJ10nIHx8IHByZXYudmFsdWUgPT09ICdbJyB8fCBwcmV2LnZhbHVlID09PSAnW14nKSkge1xuICAgICAgaWYgKG9wdHMucG9zaXggIT09IGZhbHNlICYmIHZhbHVlID09PSAnOicpIHtcbiAgICAgICAgY29uc3QgaW5uZXIgPSBwcmV2LnZhbHVlLnNsaWNlKDEpO1xuICAgICAgICBpZiAoaW5uZXIuaW5jbHVkZXMoJ1snKSkge1xuICAgICAgICAgIHByZXYucG9zaXggPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKGlubmVyLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHByZXYudmFsdWUubGFzdEluZGV4T2YoJ1snKTtcbiAgICAgICAgICAgIGNvbnN0IHByZSA9IHByZXYudmFsdWUuc2xpY2UoMCwgaWR4KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBwcmV2LnZhbHVlLnNsaWNlKGlkeCArIDIpO1xuICAgICAgICAgICAgY29uc3QgcG9zaXggPSBQT1NJWF9SRUdFWF9TT1VSQ0VbcmVzdF07XG4gICAgICAgICAgICBpZiAocG9zaXgpIHtcbiAgICAgICAgICAgICAgcHJldi52YWx1ZSA9IHByZSArIHBvc2l4O1xuICAgICAgICAgICAgICBzdGF0ZS5iYWNrdHJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICBhZHZhbmNlKCk7XG5cbiAgICAgICAgICAgICAgaWYgKCFib3Mub3V0cHV0ICYmIHRva2Vucy5pbmRleE9mKHByZXYpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgYm9zLm91dHB1dCA9IE9ORV9DSEFSO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoKHZhbHVlID09PSAnWycgJiYgcGVlaygpICE9PSAnOicpIHx8ICh2YWx1ZSA9PT0gJy0nICYmIHBlZWsoKSA9PT0gJ10nKSkge1xuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09ICddJyAmJiAocHJldi52YWx1ZSA9PT0gJ1snIHx8IHByZXYudmFsdWUgPT09ICdbXicpKSB7XG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLnBvc2l4ID09PSB0cnVlICYmIHZhbHVlID09PSAnIScgJiYgcHJldi52YWx1ZSA9PT0gJ1snKSB7XG4gICAgICAgIHZhbHVlID0gJ14nO1xuICAgICAgfVxuXG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgYXBwZW5kKHsgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB3ZSdyZSBpbnNpZGUgYSBxdW90ZWQgc3RyaW5nLCBjb250aW51ZVxuICAgICAqIHVudGlsIHdlIHJlYWNoIHRoZSBjbG9zaW5nIGRvdWJsZSBxdW90ZS5cbiAgICAgKi9cblxuICAgIGlmIChzdGF0ZS5xdW90ZXMgPT09IDEgJiYgdmFsdWUgIT09ICdcIicpIHtcbiAgICAgIHZhbHVlID0gdXRpbHMuZXNjYXBlUmVnZXgodmFsdWUpO1xuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgIGFwcGVuZCh7IHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG91YmxlIHF1b3Rlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnXCInKSB7XG4gICAgICBzdGF0ZS5xdW90ZXMgPSBzdGF0ZS5xdW90ZXMgPT09IDEgPyAwIDogMTtcbiAgICAgIGlmIChvcHRzLmtlZXBRdW90ZXMgPT09IHRydWUpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJlbnRoZXNlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnKCcpIHtcbiAgICAgIGluY3JlbWVudCgncGFyZW5zJyk7XG4gICAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICcpJykge1xuICAgICAgaWYgKHN0YXRlLnBhcmVucyA9PT0gMCAmJiBvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignb3BlbmluZycsICcoJykpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRnbG9iID0gZXh0Z2xvYnNbZXh0Z2xvYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoZXh0Z2xvYiAmJiBzdGF0ZS5wYXJlbnMgPT09IGV4dGdsb2IucGFyZW5zICsgMSkge1xuICAgICAgICBleHRnbG9iQ2xvc2UoZXh0Z2xvYnMucG9wKCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIHZhbHVlLCBvdXRwdXQ6IHN0YXRlLnBhcmVucyA/ICcpJyA6ICdcXFxcKScgfSk7XG4gICAgICBkZWNyZW1lbnQoJ3BhcmVucycpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3F1YXJlIGJyYWNrZXRzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdbJykge1xuICAgICAgaWYgKG9wdHMubm9icmFja2V0ID09PSB0cnVlIHx8ICFyZW1haW5pbmcoKS5pbmNsdWRlcygnXScpKSB7XG4gICAgICAgIGlmIChvcHRzLm5vYnJhY2tldCAhPT0gdHJ1ZSAmJiBvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdjbG9zaW5nJywgJ10nKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jcmVtZW50KCdicmFja2V0cycpO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2JyYWNrZXQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJ10nKSB7XG4gICAgICBpZiAob3B0cy5ub2JyYWNrZXQgPT09IHRydWUgfHwgKHByZXYgJiYgcHJldi50eXBlID09PSAnYnJhY2tldCcgJiYgcHJldi52YWx1ZS5sZW5ndGggPT09IDEpKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IGBcXFxcJHt2YWx1ZX1gIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlLmJyYWNrZXRzID09PSAwKSB7XG4gICAgICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdvcGVuaW5nJywgJ1snKSk7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiBgXFxcXCR7dmFsdWV9YCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGRlY3JlbWVudCgnYnJhY2tldHMnKTtcblxuICAgICAgY29uc3QgcHJldlZhbHVlID0gcHJldi52YWx1ZS5zbGljZSgxKTtcbiAgICAgIGlmIChwcmV2LnBvc2l4ICE9PSB0cnVlICYmIHByZXZWYWx1ZVswXSA9PT0gJ14nICYmICFwcmV2VmFsdWUuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICB2YWx1ZSA9IGAvJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgYXBwZW5kKHsgdmFsdWUgfSk7XG5cbiAgICAgIC8vIHdoZW4gbGl0ZXJhbCBicmFja2V0cyBhcmUgZXhwbGljaXRseSBkaXNhYmxlZFxuICAgICAgLy8gYXNzdW1lIHdlIHNob3VsZCBtYXRjaCB3aXRoIGEgcmVnZXggY2hhcmFjdGVyIGNsYXNzXG4gICAgICBpZiAob3B0cy5saXRlcmFsQnJhY2tldHMgPT09IGZhbHNlIHx8IHV0aWxzLmhhc1JlZ2V4Q2hhcnMocHJldlZhbHVlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXNjYXBlZCA9IHV0aWxzLmVzY2FwZVJlZ2V4KHByZXYudmFsdWUpO1xuICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC1wcmV2LnZhbHVlLmxlbmd0aCk7XG5cbiAgICAgIC8vIHdoZW4gbGl0ZXJhbCBicmFja2V0cyBhcmUgZXhwbGljaXRseSBlbmFibGVkXG4gICAgICAvLyBhc3N1bWUgd2Ugc2hvdWxkIGVzY2FwZSB0aGUgYnJhY2tldHMgdG8gbWF0Y2ggbGl0ZXJhbCBjaGFyYWN0ZXJzXG4gICAgICBpZiAob3B0cy5saXRlcmFsQnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IGVzY2FwZWQ7XG4gICAgICAgIHByZXYudmFsdWUgPSBlc2NhcGVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gd2hlbiB0aGUgdXNlciBzcGVjaWZpZXMgbm90aGluZywgdHJ5IHRvIG1hdGNoIGJvdGhcbiAgICAgIHByZXYudmFsdWUgPSBgKCR7Y2FwdHVyZX0ke2VzY2FwZWR9fCR7cHJldi52YWx1ZX0pYDtcbiAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2LnZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnJhY2VzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICd7JyAmJiBvcHRzLm5vYnJhY2UgIT09IHRydWUpIHtcbiAgICAgIGluY3JlbWVudCgnYnJhY2VzJyk7XG5cbiAgICAgIGNvbnN0IG9wZW4gPSB7XG4gICAgICAgIHR5cGU6ICdicmFjZScsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBvdXRwdXQ6ICcoJyxcbiAgICAgICAgb3V0cHV0SW5kZXg6IHN0YXRlLm91dHB1dC5sZW5ndGgsXG4gICAgICAgIHRva2Vuc0luZGV4OiBzdGF0ZS50b2tlbnMubGVuZ3RoXG4gICAgICB9O1xuXG4gICAgICBicmFjZXMucHVzaChvcGVuKTtcbiAgICAgIHB1c2gob3Blbik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICd9Jykge1xuICAgICAgY29uc3QgYnJhY2UgPSBicmFjZXNbYnJhY2VzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAob3B0cy5ub2JyYWNlID09PSB0cnVlIHx8ICFicmFjZSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBvdXRwdXQgPSAnKSc7XG5cbiAgICAgIGlmIChicmFjZS5kb3RzID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHRva2Vucy5zbGljZSgpO1xuICAgICAgICBjb25zdCByYW5nZSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0b2tlbnMucG9wKCk7XG4gICAgICAgICAgaWYgKGFycltpXS50eXBlID09PSAnYnJhY2UnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFycltpXS50eXBlICE9PSAnZG90cycpIHtcbiAgICAgICAgICAgIHJhbmdlLnVuc2hpZnQoYXJyW2ldLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQgPSBleHBhbmRSYW5nZShyYW5nZSwgb3B0cyk7XG4gICAgICAgIHN0YXRlLmJhY2t0cmFjayA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChicmFjZS5jb21tYSAhPT0gdHJ1ZSAmJiBicmFjZS5kb3RzICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG91dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCBicmFjZS5vdXRwdXRJbmRleCk7XG4gICAgICAgIGNvbnN0IHRva3MgPSBzdGF0ZS50b2tlbnMuc2xpY2UoYnJhY2UudG9rZW5zSW5kZXgpO1xuICAgICAgICBicmFjZS52YWx1ZSA9IGJyYWNlLm91dHB1dCA9ICdcXFxceyc7XG4gICAgICAgIHZhbHVlID0gb3V0cHV0ID0gJ1xcXFx9JztcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gb3V0O1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdG9rcykge1xuICAgICAgICAgIHN0YXRlLm91dHB1dCArPSAodC5vdXRwdXQgfHwgdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdicmFjZScsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgICBkZWNyZW1lbnQoJ2JyYWNlcycpO1xuICAgICAgYnJhY2VzLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGlwZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ3wnKSB7XG4gICAgICBpZiAoZXh0Z2xvYnMubGVuZ3RoID4gMCkge1xuICAgICAgICBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXS5jb25kaXRpb25zKys7XG4gICAgICB9XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbW1hc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnLCcpIHtcbiAgICAgIGxldCBvdXRwdXQgPSB2YWx1ZTtcblxuICAgICAgY29uc3QgYnJhY2UgPSBicmFjZXNbYnJhY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGJyYWNlICYmIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAnYnJhY2VzJykge1xuICAgICAgICBicmFjZS5jb21tYSA9IHRydWU7XG4gICAgICAgIG91dHB1dCA9ICd8JztcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdjb21tYScsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTbGFzaGVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcvJykge1xuICAgICAgLy8gaWYgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2xvYiBpcyBcIi4vXCIsIGFkdmFuY2UgdGhlIHN0YXJ0XG4gICAgICAvLyB0byB0aGUgY3VycmVudCBpbmRleCwgYW5kIGRvbid0IGFkZCB0aGUgXCIuL1wiIGNoYXJhY3RlcnNcbiAgICAgIC8vIHRvIHRoZSBzdGF0ZS4gVGhpcyBncmVhdGx5IHNpbXBsaWZpZXMgbG9va2JlaGluZHMgd2hlblxuICAgICAgLy8gY2hlY2tpbmcgZm9yIEJPUyBjaGFyYWN0ZXJzIGxpa2UgXCIhXCIgYW5kIFwiLlwiIChub3QgXCIuL1wiKVxuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ2RvdCcgJiYgc3RhdGUuaW5kZXggPT09IHN0YXRlLnN0YXJ0ICsgMSkge1xuICAgICAgICBzdGF0ZS5zdGFydCA9IHN0YXRlLmluZGV4ICsgMTtcbiAgICAgICAgc3RhdGUuY29uc3VtZWQgPSAnJztcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gJyc7XG4gICAgICAgIHRva2Vucy5wb3AoKTtcbiAgICAgICAgcHJldiA9IGJvczsgLy8gcmVzZXQgXCJwcmV2XCIgdG8gdGhlIGZpcnN0IHRva2VuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3NsYXNoJywgdmFsdWUsIG91dHB1dDogU0xBU0hfTElURVJBTCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvdHNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJy4nKSB7XG4gICAgICBpZiAoc3RhdGUuYnJhY2VzID4gMCAmJiBwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICAgIGlmIChwcmV2LnZhbHVlID09PSAnLicpIHByZXYub3V0cHV0ID0gRE9UX0xJVEVSQUw7XG4gICAgICAgIGNvbnN0IGJyYWNlID0gYnJhY2VzW2JyYWNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgcHJldi50eXBlID0gJ2RvdHMnO1xuICAgICAgICBwcmV2Lm91dHB1dCArPSB2YWx1ZTtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgYnJhY2UuZG90cyA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHN0YXRlLmJyYWNlcyArIHN0YXRlLnBhcmVucykgPT09IDAgJiYgcHJldi50eXBlICE9PSAnYm9zJyAmJiBwcmV2LnR5cGUgIT09ICdzbGFzaCcpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogRE9UX0xJVEVSQUwgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2RvdCcsIHZhbHVlLCBvdXRwdXQ6IERPVF9MSVRFUkFMIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlc3Rpb24gbWFya3NcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJz8nKSB7XG4gICAgICBjb25zdCBpc0dyb3VwID0gcHJldiAmJiBwcmV2LnZhbHVlID09PSAnKCc7XG4gICAgICBpZiAoIWlzR3JvdXAgJiYgb3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAnKCcgJiYgcGVlaygyKSAhPT0gJz8nKSB7XG4gICAgICAgIGV4dGdsb2JPcGVuKCdxbWFyaycsIHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2ICYmIHByZXYudHlwZSA9PT0gJ3BhcmVuJykge1xuICAgICAgICBjb25zdCBuZXh0ID0gcGVlaygpO1xuICAgICAgICBsZXQgb3V0cHV0ID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKG5leHQgPT09ICc8JyAmJiAhdXRpbHMuc3VwcG9ydHNMb29rYmVoaW5kcygpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb2RlLmpzIHYxMCBvciBoaWdoZXIgaXMgcmVxdWlyZWQgZm9yIHJlZ2V4IGxvb2tiZWhpbmRzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHByZXYudmFsdWUgPT09ICcoJyAmJiAhL1shPTw6XS8udGVzdChuZXh0KSkgfHwgKG5leHQgPT09ICc8JyAmJiAhLzwoWyE9XXxcXHcrPikvLnRlc3QocmVtYWluaW5nKCkpKSkge1xuICAgICAgICAgIG91dHB1dCA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLmRvdCAhPT0gdHJ1ZSAmJiAocHJldi50eXBlID09PSAnc2xhc2gnIHx8IHByZXYudHlwZSA9PT0gJ2JvcycpKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAncW1hcmsnLCB2YWx1ZSwgb3V0cHV0OiBRTUFSS19OT19ET1QgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3FtYXJrJywgdmFsdWUsIG91dHB1dDogUU1BUksgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNsYW1hdGlvblxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnIScpIHtcbiAgICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJykge1xuICAgICAgICBpZiAocGVlaygyKSAhPT0gJz8nIHx8ICEvWyE9PDpdLy50ZXN0KHBlZWsoMykpKSB7XG4gICAgICAgICAgZXh0Z2xvYk9wZW4oJ25lZ2F0ZScsIHZhbHVlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5ub25lZ2F0ZSAhPT0gdHJ1ZSAmJiBzdGF0ZS5pbmRleCA9PT0gMCkge1xuICAgICAgICBuZWdhdGUoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1c1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnKycpIHtcbiAgICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgZXh0Z2xvYk9wZW4oJ3BsdXMnLCB2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHByZXYgJiYgcHJldi52YWx1ZSA9PT0gJygnKSB8fCBvcHRzLnJlZ2V4ID09PSBmYWxzZSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3BsdXMnLCB2YWx1ZSwgb3V0cHV0OiBQTFVTX0xJVEVSQUwgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHByZXYgJiYgKHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnIHx8IHByZXYudHlwZSA9PT0gJ3BhcmVuJyB8fCBwcmV2LnR5cGUgPT09ICdicmFjZScpKSB8fCBzdGF0ZS5wYXJlbnMgPiAwKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAncGx1cycsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdwbHVzJywgdmFsdWU6IFBMVVNfTElURVJBTCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHRcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ0AnKSB7XG4gICAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAnKCcgJiYgcGVlaygyKSAhPT0gJz8nKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnYXQnLCBleHRnbG9iOiB0cnVlLCB2YWx1ZSwgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dFxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlICE9PSAnKicpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJyQnIHx8IHZhbHVlID09PSAnXicpIHtcbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF0Y2ggPSBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUy5leGVjKHJlbWFpbmluZygpKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICB2YWx1ZSArPSBtYXRjaFswXTtcbiAgICAgICAgc3RhdGUuaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJzXG4gICAgICovXG5cbiAgICBpZiAocHJldiAmJiAocHJldi50eXBlID09PSAnZ2xvYnN0YXInIHx8IHByZXYuc3RhciA9PT0gdHJ1ZSkpIHtcbiAgICAgIHByZXYudHlwZSA9ICdzdGFyJztcbiAgICAgIHByZXYuc3RhciA9IHRydWU7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgcHJldi5vdXRwdXQgPSBzdGFyO1xuICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc3QgPSByZW1haW5pbmcoKTtcbiAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgL15cXChbXj9dLy50ZXN0KHJlc3QpKSB7XG4gICAgICBleHRnbG9iT3Blbignc3RhcicsIHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcmV2LnR5cGUgPT09ICdzdGFyJykge1xuICAgICAgaWYgKG9wdHMubm9nbG9ic3RhciA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByaW9yID0gcHJldi5wcmV2O1xuICAgICAgY29uc3QgYmVmb3JlID0gcHJpb3IucHJldjtcbiAgICAgIGNvbnN0IGlzU3RhcnQgPSBwcmlvci50eXBlID09PSAnc2xhc2gnIHx8IHByaW9yLnR5cGUgPT09ICdib3MnO1xuICAgICAgY29uc3QgYWZ0ZXJTdGFyID0gYmVmb3JlICYmIChiZWZvcmUudHlwZSA9PT0gJ3N0YXInIHx8IGJlZm9yZS50eXBlID09PSAnZ2xvYnN0YXInKTtcblxuICAgICAgaWYgKG9wdHMuYmFzaCA9PT0gdHJ1ZSAmJiAoIWlzU3RhcnQgfHwgKHJlc3RbMF0gJiYgcmVzdFswXSAhPT0gJy8nKSkpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdzdGFyJywgdmFsdWUsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0JyYWNlID0gc3RhdGUuYnJhY2VzID4gMCAmJiAocHJpb3IudHlwZSA9PT0gJ2NvbW1hJyB8fCBwcmlvci50eXBlID09PSAnYnJhY2UnKTtcbiAgICAgIGNvbnN0IGlzRXh0Z2xvYiA9IGV4dGdsb2JzLmxlbmd0aCAmJiAocHJpb3IudHlwZSA9PT0gJ3BpcGUnIHx8IHByaW9yLnR5cGUgPT09ICdwYXJlbicpO1xuICAgICAgaWYgKCFpc1N0YXJ0ICYmIHByaW9yLnR5cGUgIT09ICdwYXJlbicgJiYgIWlzQnJhY2UgJiYgIWlzRXh0Z2xvYikge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHN0cmlwIGNvbnNlY3V0aXZlIGAvKiovYFxuICAgICAgd2hpbGUgKHJlc3Quc2xpY2UoMCwgMykgPT09ICcvKionKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gaW5wdXRbc3RhdGUuaW5kZXggKyA0XTtcbiAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyICE9PSAnLycpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXN0ID0gcmVzdC5zbGljZSgzKTtcbiAgICAgICAgY29uc3VtZSgnLyoqJywgMyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnYm9zJyAmJiBlb3MoKSkge1xuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGdsb2JzdGFyKG9wdHMpO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBwcmV2Lm91dHB1dDtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnc2xhc2gnICYmIHByaW9yLnByZXYudHlwZSAhPT0gJ2JvcycgJiYgIWFmdGVyU3RhciAmJiBlb3MoKSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLShwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dCkubGVuZ3RoKTtcbiAgICAgICAgcHJpb3Iub3V0cHV0ID0gYCg/OiR7cHJpb3Iub3V0cHV0fWA7XG5cbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi5vdXRwdXQgPSBnbG9ic3RhcihvcHRzKSArIChvcHRzLnN0cmljdFNsYXNoZXMgPyAnKScgOiAnfCQpJyk7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0O1xuICAgICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnc2xhc2gnICYmIHByaW9yLnByZXYudHlwZSAhPT0gJ2JvcycgJiYgcmVzdFswXSA9PT0gJy8nKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlc3RbMV0gIT09IHZvaWQgMCA/ICd8JCcgOiAnJztcblxuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLShwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dCkubGVuZ3RoKTtcbiAgICAgICAgcHJpb3Iub3V0cHV0ID0gYCg/OiR7cHJpb3Iub3V0cHV0fWA7XG5cbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi5vdXRwdXQgPSBgJHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9fCR7U0xBU0hfTElURVJBTH0ke2VuZH0pYDtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcblxuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQ7XG4gICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcblxuICAgICAgICBjb25zdW1lKHZhbHVlICsgYWR2YW5jZSgpKTtcblxuICAgICAgICBwdXNoKHsgdHlwZTogJ3NsYXNoJywgdmFsdWU6ICcvJywgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnYm9zJyAmJiByZXN0WzBdID09PSAnLycpIHtcbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgcHJldi5vdXRwdXQgPSBgKD86Xnwke1NMQVNIX0xJVEVSQUx9fCR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSlgO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBwcmV2Lm91dHB1dDtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICBjb25zdW1lKHZhbHVlICsgYWR2YW5jZSgpKTtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdzbGFzaCcsIHZhbHVlOiAnLycsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyByZW1vdmUgc2luZ2xlIHN0YXIgZnJvbSBvdXRwdXRcbiAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi5vdXRwdXQubGVuZ3RoKTtcblxuICAgICAgLy8gcmVzZXQgcHJldmlvdXMgdG9rZW4gdG8gZ2xvYnN0YXJcbiAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICBwcmV2Lm91dHB1dCA9IGdsb2JzdGFyKG9wdHMpO1xuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcblxuICAgICAgLy8gcmVzZXQgb3V0cHV0IHdpdGggZ2xvYnN0YXJcbiAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2Lm91dHB1dDtcbiAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSB7IHR5cGU6ICdzdGFyJywgdmFsdWUsIG91dHB1dDogc3RhciB9O1xuXG4gICAgaWYgKG9wdHMuYmFzaCA9PT0gdHJ1ZSkge1xuICAgICAgdG9rZW4ub3V0cHV0ID0gJy4qPyc7XG4gICAgICBpZiAocHJldi50eXBlID09PSAnYm9zJyB8fCBwcmV2LnR5cGUgPT09ICdzbGFzaCcpIHtcbiAgICAgICAgdG9rZW4ub3V0cHV0ID0gbm9kb3QgKyB0b2tlbi5vdXRwdXQ7XG4gICAgICB9XG4gICAgICBwdXNoKHRva2VuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcmV2ICYmIChwcmV2LnR5cGUgPT09ICdicmFja2V0JyB8fCBwcmV2LnR5cGUgPT09ICdwYXJlbicpICYmIG9wdHMucmVnZXggPT09IHRydWUpIHtcbiAgICAgIHRva2VuLm91dHB1dCA9IHZhbHVlO1xuICAgICAgcHVzaCh0b2tlbik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuaW5kZXggPT09IHN0YXRlLnN0YXJ0IHx8IHByZXYudHlwZSA9PT0gJ3NsYXNoJyB8fCBwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gTk9fRE9UX1NMQVNIO1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBOT19ET1RfU0xBU0g7XG5cbiAgICAgIH0gZWxzZSBpZiAob3B0cy5kb3QgPT09IHRydWUpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IE5PX0RPVFNfU0xBU0g7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IE5PX0RPVFNfU0xBU0g7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBub2RvdDtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gbm9kb3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChwZWVrKCkgIT09ICcqJykge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gT05FX0NIQVI7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IE9ORV9DSEFSO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1c2godG9rZW4pO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLmJyYWNrZXRzID4gMCkge1xuICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnXScpKTtcbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy5lc2NhcGVMYXN0KHN0YXRlLm91dHB1dCwgJ1snKTtcbiAgICBkZWNyZW1lbnQoJ2JyYWNrZXRzJyk7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUucGFyZW5zID4gMCkge1xuICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnKScpKTtcbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy5lc2NhcGVMYXN0KHN0YXRlLm91dHB1dCwgJygnKTtcbiAgICBkZWNyZW1lbnQoJ3BhcmVucycpO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLmJyYWNlcyA+IDApIHtcbiAgICBpZiAob3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdjbG9zaW5nJywgJ30nKSk7XG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMuZXNjYXBlTGFzdChzdGF0ZS5vdXRwdXQsICd7Jyk7XG4gICAgZGVjcmVtZW50KCdicmFjZXMnKTtcbiAgfVxuXG4gIGlmIChvcHRzLnN0cmljdFNsYXNoZXMgIT09IHRydWUgJiYgKHByZXYudHlwZSA9PT0gJ3N0YXInIHx8IHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnKSkge1xuICAgIHB1c2goeyB0eXBlOiAnbWF5YmVfc2xhc2gnLCB2YWx1ZTogJycsIG91dHB1dDogYCR7U0xBU0hfTElURVJBTH0/YCB9KTtcbiAgfVxuXG4gIC8vIHJlYnVpbGQgdGhlIG91dHB1dCBpZiB3ZSBoYWQgdG8gYmFja3RyYWNrIGF0IGFueSBwb2ludFxuICBpZiAoc3RhdGUuYmFja3RyYWNrID09PSB0cnVlKSB7XG4gICAgc3RhdGUub3V0cHV0ID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHN0YXRlLnRva2Vucykge1xuICAgICAgc3RhdGUub3V0cHV0ICs9IHRva2VuLm91dHB1dCAhPSBudWxsID8gdG9rZW4ub3V0cHV0IDogdG9rZW4udmFsdWU7XG5cbiAgICAgIGlmICh0b2tlbi5zdWZmaXgpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IHRva2VuLnN1ZmZpeDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIEZhc3QgcGF0aHMgZm9yIGNyZWF0aW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGNvbW1vbiBnbG9iIHBhdHRlcm5zLlxuICogVGhpcyBjYW4gc2lnbmlmaWNhbnRseSBzcGVlZCB1cCBwcm9jZXNzaW5nIGFuZCBoYXMgdmVyeSBsaXR0bGUgZG93bnNpZGVcbiAqIGltcGFjdCB3aGVuIG5vbmUgb2YgdGhlIGZhc3QgcGF0aHMgbWF0Y2guXG4gKi9cblxucGFyc2UuZmFzdHBhdGhzID0gKGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IG9wdHMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgY29uc3QgbWF4ID0gdHlwZW9mIG9wdHMubWF4TGVuZ3RoID09PSAnbnVtYmVyJyA/IE1hdGgubWluKE1BWF9MRU5HVEgsIG9wdHMubWF4TGVuZ3RoKSA6IE1BWF9MRU5HVEg7XG4gIGNvbnN0IGxlbiA9IGlucHV0Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IG1heCkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW5wdXQgbGVuZ3RoOiAke2xlbn0sIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIGxlbmd0aDogJHttYXh9YCk7XG4gIH1cblxuICBpbnB1dCA9IFJFUExBQ0VNRU5UU1tpbnB1dF0gfHwgaW5wdXQ7XG4gIGNvbnN0IHdpbjMyID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuXG4gIC8vIGNyZWF0ZSBjb25zdGFudHMgYmFzZWQgb24gcGxhdGZvcm0sIGZvciB3aW5kb3dzIG9yIHBvc2l4XG4gIGNvbnN0IHtcbiAgICBET1RfTElURVJBTCxcbiAgICBTTEFTSF9MSVRFUkFMLFxuICAgIE9ORV9DSEFSLFxuICAgIERPVFNfU0xBU0gsXG4gICAgTk9fRE9ULFxuICAgIE5PX0RPVFMsXG4gICAgTk9fRE9UU19TTEFTSCxcbiAgICBTVEFSLFxuICAgIFNUQVJUX0FOQ0hPUlxuICB9ID0gY29uc3RhbnRzLmdsb2JDaGFycyh3aW4zMik7XG5cbiAgY29uc3Qgbm9kb3QgPSBvcHRzLmRvdCA/IE5PX0RPVFMgOiBOT19ET1Q7XG4gIGNvbnN0IHNsYXNoRG90ID0gb3B0cy5kb3QgPyBOT19ET1RTX1NMQVNIIDogTk9fRE9UO1xuICBjb25zdCBjYXB0dXJlID0gb3B0cy5jYXB0dXJlID8gJycgOiAnPzonO1xuICBjb25zdCBzdGF0ZSA9IHsgbmVnYXRlZDogZmFsc2UsIHByZWZpeDogJycgfTtcbiAgbGV0IHN0YXIgPSBvcHRzLmJhc2ggPT09IHRydWUgPyAnLio/JyA6IFNUQVI7XG5cbiAgaWYgKG9wdHMuY2FwdHVyZSkge1xuICAgIHN0YXIgPSBgKCR7c3Rhcn0pYDtcbiAgfVxuXG4gIGNvbnN0IGdsb2JzdGFyID0gb3B0cyA9PiB7XG4gICAgaWYgKG9wdHMubm9nbG9ic3RhciA9PT0gdHJ1ZSkgcmV0dXJuIHN0YXI7XG4gICAgcmV0dXJuIGAoJHtjYXB0dXJlfSg/Oig/ISR7U1RBUlRfQU5DSE9SfSR7b3B0cy5kb3QgPyBET1RTX1NMQVNIIDogRE9UX0xJVEVSQUx9KS4pKj8pYDtcbiAgfTtcblxuICBjb25zdCBjcmVhdGUgPSBzdHIgPT4ge1xuICAgIHN3aXRjaCAoc3RyKSB7XG4gICAgICBjYXNlICcqJzpcbiAgICAgICAgcmV0dXJuIGAke25vZG90fSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJy4qJzpcbiAgICAgICAgcmV0dXJuIGAke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyouKic6XG4gICAgICAgIHJldHVybiBgJHtub2RvdH0ke3N0YXJ9JHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqLyonOlxuICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtzdGFyfSR7U0xBU0hfTElURVJBTH0ke09ORV9DSEFSfSR7c2xhc2hEb3R9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyoqJzpcbiAgICAgICAgcmV0dXJuIG5vZG90ICsgZ2xvYnN0YXIob3B0cyk7XG5cbiAgICAgIGNhc2UgJyoqLyonOlxuICAgICAgICByZXR1cm4gYCg/OiR7bm9kb3R9JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KT8ke3NsYXNoRG90fSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyoqLyouKic6XG4gICAgICAgIHJldHVybiBgKD86JHtub2RvdH0ke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pPyR7c2xhc2hEb3R9JHtzdGFyfSR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKiovLionOlxuICAgICAgICByZXR1cm4gYCg/OiR7bm9kb3R9JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KT8ke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvXiguKj8pXFwuKFxcdyspJC8uZXhlYyhzdHIpO1xuICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc291cmNlID0gY3JlYXRlKG1hdGNoWzFdKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHJldHVybjtcblxuICAgICAgICByZXR1cm4gc291cmNlICsgRE9UX0xJVEVSQUwgKyBtYXRjaFsyXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb3V0cHV0ID0gdXRpbHMucmVtb3ZlUHJlZml4KGlucHV0LCBzdGF0ZSk7XG4gIGxldCBzb3VyY2UgPSBjcmVhdGUob3V0cHV0KTtcblxuICBpZiAoc291cmNlICYmIG9wdHMuc3RyaWN0U2xhc2hlcyAhPT0gdHJ1ZSkge1xuICAgIHNvdXJjZSArPSBgJHtTTEFTSF9MSVRFUkFMfT9gO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3Qgc2NhbiA9IHJlcXVpcmUoJy4vc2NhbicpO1xuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiB2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0Y2hlciBmdW5jdGlvbiBmcm9tIG9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMuIFRoZVxuICogcmV0dXJuZWQgZnVuY3Rpb24gdGFrZXMgYSBzdHJpbmcgdG8gbWF0Y2ggYXMgaXRzIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgbWF0Y2guIFRoZSByZXR1cm5lZCBtYXRjaGVyXG4gKiBmdW5jdGlvbiBhbHNvIHRha2VzIGEgYm9vbGVhbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRoYXQsIHdoZW4gdHJ1ZSxcbiAqIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2goZ2xvYlssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCBpc01hdGNoID0gcGljb21hdGNoKCcqLiEoKmEpJyk7XG4gKiBjb25zb2xlLmxvZyhpc01hdGNoKCdhLmEnKSk7IC8vPT4gZmFsc2VcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYicpKTsgLy89PiB0cnVlXG4gKiBgYGBcbiAqIEBuYW1lIHBpY29tYXRjaFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBnbG9ic2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtGdW5jdGlvbj19IFJldHVybnMgYSBtYXRjaGVyIGZ1bmN0aW9uLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5jb25zdCBwaWNvbWF0Y2ggPSAoZ2xvYiwgb3B0aW9ucywgcmV0dXJuU3RhdGUgPSBmYWxzZSkgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShnbG9iKSkge1xuICAgIGNvbnN0IGZucyA9IGdsb2IubWFwKGlucHV0ID0+IHBpY29tYXRjaChpbnB1dCwgb3B0aW9ucywgcmV0dXJuU3RhdGUpKTtcbiAgICBjb25zdCBhcnJheU1hdGNoZXIgPSBzdHIgPT4ge1xuICAgICAgZm9yIChjb25zdCBpc01hdGNoIG9mIGZucykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGlzTWF0Y2goc3RyKTtcbiAgICAgICAgaWYgKHN0YXRlKSByZXR1cm4gc3RhdGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICByZXR1cm4gYXJyYXlNYXRjaGVyO1xuICB9XG5cbiAgY29uc3QgaXNTdGF0ZSA9IGlzT2JqZWN0KGdsb2IpICYmIGdsb2IudG9rZW5zICYmIGdsb2IuaW5wdXQ7XG5cbiAgaWYgKGdsb2IgPT09ICcnIHx8ICh0eXBlb2YgZ2xvYiAhPT0gJ3N0cmluZycgJiYgIWlzU3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgcGF0dGVybiB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBwb3NpeCA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKTtcbiAgY29uc3QgcmVnZXggPSBpc1N0YXRlXG4gICAgPyBwaWNvbWF0Y2guY29tcGlsZVJlKGdsb2IsIG9wdGlvbnMpXG4gICAgOiBwaWNvbWF0Y2gubWFrZVJlKGdsb2IsIG9wdGlvbnMsIGZhbHNlLCB0cnVlKTtcblxuICBjb25zdCBzdGF0ZSA9IHJlZ2V4LnN0YXRlO1xuICBkZWxldGUgcmVnZXguc3RhdGU7XG5cbiAgbGV0IGlzSWdub3JlZCA9ICgpID0+IGZhbHNlO1xuICBpZiAob3B0cy5pZ25vcmUpIHtcbiAgICBjb25zdCBpZ25vcmVPcHRzID0geyAuLi5vcHRpb25zLCBpZ25vcmU6IG51bGwsIG9uTWF0Y2g6IG51bGwsIG9uUmVzdWx0OiBudWxsIH07XG4gICAgaXNJZ25vcmVkID0gcGljb21hdGNoKG9wdHMuaWdub3JlLCBpZ25vcmVPcHRzLCByZXR1cm5TdGF0ZSk7XG4gIH1cblxuICBjb25zdCBtYXRjaGVyID0gKGlucHV0LCByZXR1cm5PYmplY3QgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IHsgaXNNYXRjaCwgbWF0Y2gsIG91dHB1dCB9ID0gcGljb21hdGNoLnRlc3QoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCB7IGdsb2IsIHBvc2l4IH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHsgZ2xvYiwgc3RhdGUsIHJlZ2V4LCBwb3NpeCwgaW5wdXQsIG91dHB1dCwgbWF0Y2gsIGlzTWF0Y2ggfTtcblxuICAgIGlmICh0eXBlb2Ygb3B0cy5vblJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0cy5vblJlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIGlmIChpc01hdGNoID09PSBmYWxzZSkge1xuICAgICAgcmVzdWx0LmlzTWF0Y2ggPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3QgPyByZXN1bHQgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaXNJZ25vcmVkKGlucHV0KSkge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uSWdub3JlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdHMub25JZ25vcmUocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5pc01hdGNoID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmV0dXJuT2JqZWN0ID8gcmVzdWx0IDogZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLm9uTWF0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdHMub25NYXRjaChyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuT2JqZWN0ID8gcmVzdWx0IDogdHJ1ZTtcbiAgfTtcblxuICBpZiAocmV0dXJuU3RhdGUpIHtcbiAgICBtYXRjaGVyLnN0YXRlID0gc3RhdGU7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlcjtcbn07XG5cbi8qKlxuICogVGVzdCBgaW5wdXRgIHdpdGggdGhlIGdpdmVuIGByZWdleGAuIFRoaXMgaXMgdXNlZCBieSB0aGUgbWFpblxuICogYHBpY29tYXRjaCgpYCBmdW5jdGlvbiB0byB0ZXN0IHRoZSBpbnB1dCBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLnRlc3QoaW5wdXQsIHJlZ2V4Wywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC50ZXN0KCdmb28vYmFyJywgL14oPzooW14vXSo/KVxcLyhbXi9dKj8pKSQvKSk7XG4gKiAvLyB7IGlzTWF0Y2g6IHRydWUsIG1hdGNoOiBbICdmb28vJywgJ2ZvbycsICdiYXInIF0sIG91dHB1dDogJ2Zvby9iYXInIH1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgU3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1JlZ0V4cH0gYHJlZ2V4YFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG1hdGNoaW5nIGluZm8uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC50ZXN0ID0gKGlucHV0LCByZWdleCwgb3B0aW9ucywgeyBnbG9iLCBwb3NpeCB9ID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBpbnB1dCB0byBiZSBhIHN0cmluZycpO1xuICB9XG5cbiAgaWYgKGlucHV0ID09PSAnJykge1xuICAgIHJldHVybiB7IGlzTWF0Y2g6IGZhbHNlLCBvdXRwdXQ6ICcnIH07XG4gIH1cblxuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3QgZm9ybWF0ID0gb3B0cy5mb3JtYXQgfHwgKHBvc2l4ID8gdXRpbHMudG9Qb3NpeFNsYXNoZXMgOiBudWxsKTtcbiAgbGV0IG1hdGNoID0gaW5wdXQgPT09IGdsb2I7XG4gIGxldCBvdXRwdXQgPSAobWF0Y2ggJiYgZm9ybWF0KSA/IGZvcm1hdChpbnB1dCkgOiBpbnB1dDtcblxuICBpZiAobWF0Y2ggPT09IGZhbHNlKSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0ID8gZm9ybWF0KGlucHV0KSA6IGlucHV0O1xuICAgIG1hdGNoID0gb3V0cHV0ID09PSBnbG9iO1xuICB9XG5cbiAgaWYgKG1hdGNoID09PSBmYWxzZSB8fCBvcHRzLmNhcHR1cmUgPT09IHRydWUpIHtcbiAgICBpZiAob3B0cy5tYXRjaEJhc2UgPT09IHRydWUgfHwgb3B0cy5iYXNlbmFtZSA9PT0gdHJ1ZSkge1xuICAgICAgbWF0Y2ggPSBwaWNvbWF0Y2gubWF0Y2hCYXNlKGlucHV0LCByZWdleCwgb3B0aW9ucywgcG9zaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWMob3V0cHV0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBpc01hdGNoOiBCb29sZWFuKG1hdGNoKSwgbWF0Y2gsIG91dHB1dCB9O1xufTtcblxuLyoqXG4gKiBNYXRjaCB0aGUgYmFzZW5hbWUgb2YgYSBmaWxlcGF0aC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2gubWF0Y2hCYXNlKGlucHV0LCBnbG9iWywgb3B0aW9uc10pO1xuICogY29uc29sZS5sb2cocGljb21hdGNoLm1hdGNoQmFzZSgnZm9vL2Jhci5qcycsICcqLmpzJyk7IC8vIHRydWVcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgU3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1JlZ0V4cHxTdHJpbmd9IGBnbG9iYCBHbG9iIHBhdHRlcm4gb3IgcmVnZXggY3JlYXRlZCBieSBbLm1ha2VSZV0oI21ha2VSZSkuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gubWF0Y2hCYXNlID0gKGlucHV0LCBnbG9iLCBvcHRpb25zLCBwb3NpeCA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKSkgPT4ge1xuICBjb25zdCByZWdleCA9IGdsb2IgaW5zdGFuY2VvZiBSZWdFeHAgPyBnbG9iIDogcGljb21hdGNoLm1ha2VSZShnbG9iLCBvcHRpb25zKTtcbiAgcmV0dXJuIHJlZ2V4LnRlc3QocGF0aC5iYXNlbmFtZShpbnB1dCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbnkqKiBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgIG1hdGNoIHRoZSBzcGVjaWZpZWQgYHN0cmluZ2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLmlzTWF0Y2goc3RyaW5nLCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2guaXNNYXRjaCgnYS5hJywgWydiLionLCAnKi5hJ10pKTsgLy89PiB0cnVlXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2guaXNNYXRjaCgnYS5hJywgJ2IuKicpKTsgLy89PiBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gc3RyIFRoZSBzdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBwYXR0ZXJucyBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgcGF0dGVybnMgbWF0Y2ggYHN0cmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLmlzTWF0Y2ggPSAoc3RyLCBwYXR0ZXJucywgb3B0aW9ucykgPT4gcGljb21hdGNoKHBhdHRlcm5zLCBvcHRpb25zKShzdHIpO1xuXG4vKipcbiAqIFBhcnNlIGEgZ2xvYiBwYXR0ZXJuIHRvIGNyZWF0ZSB0aGUgc291cmNlIHN0cmluZyBmb3IgYSByZWd1bGFyXG4gKiBleHByZXNzaW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IHBpY29tYXRjaC5wYXJzZShwYXR0ZXJuWywgb3B0aW9uc10pO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggdXNlZnVsIHByb3BlcnRpZXMgYW5kIG91dHB1dCB0byBiZSB1c2VkIGFzIGEgcmVnZXggc291cmNlIHN0cmluZy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLnBhcnNlID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0dGVybikpIHJldHVybiBwYXR0ZXJuLm1hcChwID0+IHBpY29tYXRjaC5wYXJzZShwLCBvcHRpb25zKSk7XG4gIHJldHVybiBwYXJzZShwYXR0ZXJuLCB7IC4uLm9wdGlvbnMsIGZhc3RwYXRoczogZmFsc2UgfSk7XG59O1xuXG4vKipcbiAqIFNjYW4gYSBnbG9iIHBhdHRlcm4gdG8gc2VwYXJhdGUgdGhlIHBhdHRlcm4gaW50byBzZWdtZW50cy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2guc2NhbihpbnB1dFssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBwaWNvbWF0Y2guc2NhbignIS4vZm9vLyouanMnKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gKiB7IHByZWZpeDogJyEuLycsXG4gKiAgIGlucHV0OiAnIS4vZm9vLyouanMnLFxuICogICBzdGFydDogMyxcbiAqICAgYmFzZTogJ2ZvbycsXG4gKiAgIGdsb2I6ICcqLmpzJyxcbiAqICAgaXNCcmFjZTogZmFsc2UsXG4gKiAgIGlzQnJhY2tldDogZmFsc2UsXG4gKiAgIGlzR2xvYjogdHJ1ZSxcbiAqICAgaXNFeHRnbG9iOiBmYWxzZSxcbiAqICAgaXNHbG9ic3RhcjogZmFsc2UsXG4gKiAgIG5lZ2F0ZWQ6IHRydWUgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBHbG9iIHBhdHRlcm4gdG8gc2Nhbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2guc2NhbiA9IChpbnB1dCwgb3B0aW9ucykgPT4gc2NhbihpbnB1dCwgb3B0aW9ucyk7XG5cbi8qKlxuICogQ29tcGlsZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBgc3RhdGVgIG9iamVjdCByZXR1cm5lZCBieSB0aGVcbiAqIFtwYXJzZSgpXSgjcGFyc2UpIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYHN0YXRlYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuT3V0cHV0YCBJbnRlbmRlZCBmb3IgaW1wbGVtZW50b3JzLCB0aGlzIGFyZ3VtZW50IGFsbG93cyB5b3UgdG8gcmV0dXJuIHRoZSByYXcgb3V0cHV0IGZyb20gdGhlIHBhcnNlci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVyblN0YXRlYCBBZGRzIHRoZSBzdGF0ZSB0byBhIGBzdGF0ZWAgcHJvcGVydHkgb24gdGhlIHJldHVybmVkIHJlZ2V4LiBVc2VmdWwgZm9yIGltcGxlbWVudG9ycyBhbmQgZGVidWdnaW5nLlxuICogQHJldHVybiB7UmVnRXhwfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2guY29tcGlsZVJlID0gKHN0YXRlLCBvcHRpb25zLCByZXR1cm5PdXRwdXQgPSBmYWxzZSwgcmV0dXJuU3RhdGUgPSBmYWxzZSkgPT4ge1xuICBpZiAocmV0dXJuT3V0cHV0ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHN0YXRlLm91dHB1dDtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBwcmVwZW5kID0gb3B0cy5jb250YWlucyA/ICcnIDogJ14nO1xuICBjb25zdCBhcHBlbmQgPSBvcHRzLmNvbnRhaW5zID8gJycgOiAnJCc7XG5cbiAgbGV0IHNvdXJjZSA9IGAke3ByZXBlbmR9KD86JHtzdGF0ZS5vdXRwdXR9KSR7YXBwZW5kfWA7XG4gIGlmIChzdGF0ZSAmJiBzdGF0ZS5uZWdhdGVkID09PSB0cnVlKSB7XG4gICAgc291cmNlID0gYF4oPyEke3NvdXJjZX0pLiokYDtcbiAgfVxuXG4gIGNvbnN0IHJlZ2V4ID0gcGljb21hdGNoLnRvUmVnZXgoc291cmNlLCBvcHRpb25zKTtcbiAgaWYgKHJldHVyblN0YXRlID09PSB0cnVlKSB7XG4gICAgcmVnZXguc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiByZWdleDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gYSBwYXJzZWQgZ2xvYiBwYXR0ZXJuLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIGNvbnN0IHN0YXRlID0gcGljb21hdGNoLnBhcnNlKCcqLmpzJyk7XG4gKiAvLyBwaWNvbWF0Y2guY29tcGlsZVJlKHN0YXRlWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5jb21waWxlUmUoc3RhdGUpKTtcbiAqIC8vPT4gL14oPzooPyFcXC4pKD89LilbXi9dKj9cXC5qcykkL1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0YXRlYCBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIGAucGFyc2VgIG1ldGhvZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVybk91dHB1dGAgSW1wbGVtZW50b3JzIG1heSB1c2UgdGhpcyBhcmd1bWVudCB0byByZXR1cm4gdGhlIGNvbXBpbGVkIG91dHB1dCwgaW5zdGVhZCBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVGhpcyBpcyBub3QgZXhwb3NlZCBvbiB0aGUgb3B0aW9ucyB0byBwcmV2ZW50IGVuZC11c2VycyBmcm9tIG11dGF0aW5nIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5TdGF0ZWAgSW1wbGVtZW50b3JzIG1heSB1c2UgdGhpcyBhcmd1bWVudCB0byByZXR1cm4gdGhlIHN0YXRlIGZyb20gdGhlIHBhcnNlZCBnbG9iIHdpdGggdGhlIHJldHVybmVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm4ge1JlZ0V4cH0gUmV0dXJucyBhIHJlZ2V4IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gcGF0dGVybi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLm1ha2VSZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9LCByZXR1cm5PdXRwdXQgPSBmYWxzZSwgcmV0dXJuU3RhdGUgPSBmYWxzZSkgPT4ge1xuICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGxldCBwYXJzZWQgPSB7IG5lZ2F0ZWQ6IGZhbHNlLCBmYXN0cGF0aHM6IHRydWUgfTtcblxuICBpZiAob3B0aW9ucy5mYXN0cGF0aHMgIT09IGZhbHNlICYmIChpbnB1dFswXSA9PT0gJy4nIHx8IGlucHV0WzBdID09PSAnKicpKSB7XG4gICAgcGFyc2VkLm91dHB1dCA9IHBhcnNlLmZhc3RwYXRocyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cblxuICBpZiAoIXBhcnNlZC5vdXRwdXQpIHtcbiAgICBwYXJzZWQgPSBwYXJzZShpbnB1dCwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gcGljb21hdGNoLmNvbXBpbGVSZShwYXJzZWQsIG9wdGlvbnMsIHJldHVybk91dHB1dCwgcmV0dXJuU3RhdGUpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgZ2l2ZW4gcmVnZXggc291cmNlIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2gudG9SZWdleChzb3VyY2VbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgeyBvdXRwdXQgfSA9IHBpY29tYXRjaC5wYXJzZSgnKi5qcycpO1xuICogY29uc29sZS5sb2cocGljb21hdGNoLnRvUmVnZXgob3V0cHV0KSk7XG4gKiAvLz0+IC9eKD86KD8hXFwuKSg/PS4pW14vXSo/XFwuanMpJC9cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzb3VyY2VgIFJlZ3VsYXIgZXhwcmVzc2lvbiBzb3VyY2Ugc3RyaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7UmVnRXhwfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gudG9SZWdleCA9IChzb3VyY2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UsIG9wdHMuZmxhZ3MgfHwgKG9wdHMubm9jYXNlID8gJ2knIDogJycpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWJ1ZyA9PT0gdHJ1ZSkgdGhyb3cgZXJyO1xuICAgIHJldHVybiAvJF4vO1xuICB9XG59O1xuXG4vKipcbiAqIFBpY29tYXRjaCBjb25zdGFudHMuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblxucGljb21hdGNoLmNvbnN0YW50cyA9IGNvbnN0YW50cztcblxuLyoqXG4gKiBFeHBvc2UgXCJwaWNvbWF0Y2hcIlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcGljb21hdGNoO1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9waWNvbWF0Y2gnKTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbmNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCdwaWNvbWF0Y2gvbGliL3V0aWxzJyk7XG5jb25zdCBpc0VtcHR5U3RyaW5nID0gdmFsID0+IHZhbCA9PT0gJycgfHwgdmFsID09PSAnLi8nO1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IG1hdGNoIG9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0obGlzdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0oWydhLmpzJywgJ2EudHh0J10sIFsnKi5qcyddKSk7XG4gKiAvLz0+IFsgJ2EuanMnIF1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXk8c3RyaW5nPn0gYGxpc3RgIExpc3Qgb2Ygc3RyaW5ncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5PHN0cmluZz59IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucylcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIG1hdGNoZXNcbiAqIEBzdW1tYXJ5IGZhbHNlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IG1pY3JvbWF0Y2ggPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgcGF0dGVybnMgPSBbXS5jb25jYXQocGF0dGVybnMpO1xuICBsaXN0ID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGxldCBvbWl0ID0gbmV3IFNldCgpO1xuICBsZXQga2VlcCA9IG5ldyBTZXQoKTtcbiAgbGV0IGl0ZW1zID0gbmV3IFNldCgpO1xuICBsZXQgbmVnYXRpdmVzID0gMDtcblxuICBsZXQgb25SZXN1bHQgPSBzdGF0ZSA9PiB7XG4gICAgaXRlbXMuYWRkKHN0YXRlLm91dHB1dCk7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5vblJlc3VsdCkge1xuICAgICAgb3B0aW9ucy5vblJlc3VsdChzdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgaXNNYXRjaCA9IHBpY29tYXRjaChTdHJpbmcocGF0dGVybnNbaV0pLCB7IC4uLm9wdGlvbnMsIG9uUmVzdWx0IH0sIHRydWUpO1xuICAgIGxldCBuZWdhdGVkID0gaXNNYXRjaC5zdGF0ZS5uZWdhdGVkIHx8IGlzTWF0Y2guc3RhdGUubmVnYXRlZEV4dGdsb2I7XG4gICAgaWYgKG5lZ2F0ZWQpIG5lZ2F0aXZlcysrO1xuXG4gICAgZm9yIChsZXQgaXRlbSBvZiBsaXN0KSB7XG4gICAgICBsZXQgbWF0Y2hlZCA9IGlzTWF0Y2goaXRlbSwgdHJ1ZSk7XG5cbiAgICAgIGxldCBtYXRjaCA9IG5lZ2F0ZWQgPyAhbWF0Y2hlZC5pc01hdGNoIDogbWF0Y2hlZC5pc01hdGNoO1xuICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgIGlmIChuZWdhdGVkKSB7XG4gICAgICAgIG9taXQuYWRkKG1hdGNoZWQub3V0cHV0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9taXQuZGVsZXRlKG1hdGNoZWQub3V0cHV0KTtcbiAgICAgICAga2VlcC5hZGQobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCByZXN1bHQgPSBuZWdhdGl2ZXMgPT09IHBhdHRlcm5zLmxlbmd0aCA/IFsuLi5pdGVtc10gOiBbLi4ua2VlcF07XG4gIGxldCBtYXRjaGVzID0gcmVzdWx0LmZpbHRlcihpdGVtID0+ICFvbWl0LmhhcyhpdGVtKSk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgbWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAob3B0aW9ucy5mYWlsZ2xvYiA9PT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBtYXRjaGVzIGZvdW5kIGZvciBcIiR7cGF0dGVybnMuam9pbignLCAnKX1cImApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm5vbnVsbCA9PT0gdHJ1ZSB8fCBvcHRpb25zLm51bGxnbG9iID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy51bmVzY2FwZSA/IHBhdHRlcm5zLm1hcChwID0+IHAucmVwbGFjZSgvXFxcXC9nLCAnJykpIDogcGF0dGVybnM7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoZXM7XG59O1xuXG4vKipcbiAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKi9cblxubWljcm9tYXRjaC5tYXRjaCA9IG1pY3JvbWF0Y2g7XG5cbi8qKlxuICogUmV0dXJucyBhIG1hdGNoZXIgZnVuY3Rpb24gZnJvbSB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybmAgYW5kIGBvcHRpb25zYC5cbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiB0YWtlcyBhIHN0cmluZyB0byBtYXRjaCBhcyBpdHMgb25seSBhcmd1bWVudCBhbmQgcmV0dXJuc1xuICogdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgbWF0Y2guXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubWF0Y2hlcihwYXR0ZXJuWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IGlzTWF0Y2ggPSBtbS5tYXRjaGVyKCcqLiEoKmEpJyk7XG4gKiBjb25zb2xlLmxvZyhpc01hdGNoKCdhLmEnKSk7IC8vPT4gZmFsc2VcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYicpKTsgLy89PiB0cnVlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgR2xvYiBwYXR0ZXJuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gUmV0dXJucyBhIG1hdGNoZXIgZnVuY3Rpb24uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gubWF0Y2hlciA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiBwaWNvbWF0Y2gocGF0dGVybiwgb3B0aW9ucyk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmICoqYW55Kiogb2YgdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5zYCBtYXRjaCB0aGUgc3BlY2lmaWVkIGBzdHJpbmdgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmlzTWF0Y2goc3RyaW5nLCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5pc01hdGNoKCdhLmEnLCBbJ2IuKicsICcqLmEnXSkpOyAvLz0+IHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmlzTWF0Y2goJ2EuYScsICdiLionKSk7IC8vPT4gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJgIFRoZSBzdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgW29wdGlvbnNdYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBhdHRlcm5zIG1hdGNoIGBzdHJgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guaXNNYXRjaCA9IChzdHIsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiBwaWNvbWF0Y2gocGF0dGVybnMsIG9wdGlvbnMpKHN0cik7XG5cbi8qKlxuICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqL1xuXG5taWNyb21hdGNoLmFueSA9IG1pY3JvbWF0Y2guaXNNYXRjaDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJpbmdzIHRoYXQgXyoqZG8gbm90IG1hdGNoIGFueSoqXyBvZiB0aGUgZ2l2ZW4gYHBhdHRlcm5zYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5ub3QobGlzdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0ubm90KFsnYS5hJywgJ2IuYicsICdjLmMnXSwgJyouYScpKTtcbiAqIC8vPT4gWydiLmInLCAnYy5jJ11cbiAqIGBgYFxuICogQHBhcmFtIHtBcnJheX0gYGxpc3RgIEFycmF5IG9mIHN0cmluZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgKipkbyBub3QgbWF0Y2gqKiB0aGUgZ2l2ZW4gcGF0dGVybnMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gubm90ID0gKGxpc3QsIHBhdHRlcm5zLCBvcHRpb25zID0ge30pID0+IHtcbiAgcGF0dGVybnMgPSBbXS5jb25jYXQocGF0dGVybnMpLm1hcChTdHJpbmcpO1xuICBsZXQgcmVzdWx0ID0gbmV3IFNldCgpO1xuICBsZXQgaXRlbXMgPSBbXTtcblxuICBsZXQgb25SZXN1bHQgPSBzdGF0ZSA9PiB7XG4gICAgaWYgKG9wdGlvbnMub25SZXN1bHQpIG9wdGlvbnMub25SZXN1bHQoc3RhdGUpO1xuICAgIGl0ZW1zLnB1c2goc3RhdGUub3V0cHV0KTtcbiAgfTtcblxuICBsZXQgbWF0Y2hlcyA9IG5ldyBTZXQobWljcm9tYXRjaChsaXN0LCBwYXR0ZXJucywgeyAuLi5vcHRpb25zLCBvblJlc3VsdCB9KSk7XG5cbiAgZm9yIChsZXQgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmICghbWF0Y2hlcy5oYXMoaXRlbSkpIHtcbiAgICAgIHJlc3VsdC5hZGQoaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ucmVzdWx0XTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgc3RyaW5nYCBjb250YWlucyB0aGUgZ2l2ZW4gcGF0dGVybi4gU2ltaWxhclxuICogdG8gWy5pc01hdGNoXSgjaXNNYXRjaCkgYnV0IHRoZSBwYXR0ZXJuIGNhbiBtYXRjaCBhbnkgcGFydCBvZiB0aGUgc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5jb250YWlucyhzdHJpbmcsIHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uY29udGFpbnMoJ2FhL2JiL2NjJywgJypiJykpO1xuICogLy89PiB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5jb250YWlucygnYWEvYmIvY2MnLCAnKmQnKSk7XG4gKiAvLz0+IGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYCBUaGUgc3RyaW5nIHRvIG1hdGNoLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgR2xvYiBwYXR0ZXJuIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgcGF0dGVybnMgbWF0Y2hlcyBhbnkgcGFydCBvZiBgc3RyYC5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5jb250YWlucyA9IChzdHIsIHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmc6IFwiJHt1dGlsLmluc3BlY3Qoc3RyKX1cImApO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zb21lKHAgPT4gbWljcm9tYXRjaC5jb250YWlucyhzdHIsIHAsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoaXNFbXB0eVN0cmluZyhzdHIpIHx8IGlzRW1wdHlTdHJpbmcocGF0dGVybikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RyLmluY2x1ZGVzKHBhdHRlcm4pIHx8IChzdHIuc3RhcnRzV2l0aCgnLi8nKSAmJiBzdHIuc2xpY2UoMikuaW5jbHVkZXMocGF0dGVybikpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWljcm9tYXRjaC5pc01hdGNoKHN0ciwgcGF0dGVybiwgeyAuLi5vcHRpb25zLCBjb250YWluczogdHJ1ZSB9KTtcbn07XG5cbi8qKlxuICogRmlsdGVyIHRoZSBrZXlzIG9mIHRoZSBnaXZlbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gYGdsb2JgIHBhdHRlcm5cbiAqIGFuZCBgb3B0aW9uc2AuIERvZXMgbm90IGF0dGVtcHQgdG8gbWF0Y2ggbmVzdGVkIGtleXMuIElmIHlvdSBuZWVkIHRoaXMgZmVhdHVyZSxcbiAqIHVzZSBbZ2xvYi1vYmplY3RdW10gaW5zdGVhZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5tYXRjaEtleXMob2JqZWN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCBvYmogPSB7IGFhOiAnYScsIGFiOiAnYicsIGFjOiAnYycgfTtcbiAqIGNvbnNvbGUubG9nKG1tLm1hdGNoS2V5cyhvYmosICcqYicpKTtcbiAqIC8vPT4geyBhYjogJ2InIH1cbiAqIGBgYFxuICogQHBhcmFtIHtPYmplY3R9IGBvYmplY3RgIFRoZSBvYmplY3Qgd2l0aCBrZXlzIHRvIGZpbHRlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggb25seSBrZXlzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm5zLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLm1hdGNoS2V5cyA9IChvYmosIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGlmICghdXRpbHMuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHRoZSBmaXJzdCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3QnKTtcbiAgfVxuICBsZXQga2V5cyA9IG1pY3JvbWF0Y2goT2JqZWN0LmtleXMob2JqKSwgcGF0dGVybnMsIG9wdGlvbnMpO1xuICBsZXQgcmVzID0ge307XG4gIGZvciAobGV0IGtleSBvZiBrZXlzKSByZXNba2V5XSA9IG9ialtrZXldO1xuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgc29tZSBvZiB0aGUgc3RyaW5ncyBpbiB0aGUgZ2l2ZW4gYGxpc3RgIG1hdGNoIGFueSBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLnNvbWUobGlzdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uc29tZShbJ2Zvby5qcycsICdiYXIuanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uc29tZShbJ2Zvby5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYGxpc3RgIFRoZSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyB0byB0ZXN0LiBSZXR1cm5zIGFzIHNvb24gYXMgdGhlIGZpcnN0IG1hdGNoIGlzIGZvdW5kLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgYHBhdHRlcm5zYCBtYXRjaGVzIGFueSBvZiB0aGUgc3RyaW5ncyBpbiBgbGlzdGBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5zb21lID0gKGxpc3QsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGxldCBpdGVtcyA9IFtdLmNvbmNhdChsaXN0KTtcblxuICBmb3IgKGxldCBwYXR0ZXJuIG9mIFtdLmNvbmNhdChwYXR0ZXJucykpIHtcbiAgICBsZXQgaXNNYXRjaCA9IHBpY29tYXRjaChTdHJpbmcocGF0dGVybiksIG9wdGlvbnMpO1xuICAgIGlmIChpdGVtcy5zb21lKGl0ZW0gPT4gaXNNYXRjaChpdGVtKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBldmVyeSBzdHJpbmcgaW4gdGhlIGdpdmVuIGBsaXN0YCBtYXRjaGVzXG4gKiBhbnkgb2YgdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5zYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5ldmVyeShsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeSgnZm9vLmpzJywgWydmb28uanMnXSkpO1xuICogLy8gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uZXZlcnkoWydmb28uanMnLCAnYmFyLmpzJ10sIFsnKi5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeShbJ2Zvby5qcycsICdiYXIuanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KFsnZm9vLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgbGlzdGAgVGhlIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFsbCBgcGF0dGVybnNgIG1hdGNoZXMgYWxsIG9mIHRoZSBzdHJpbmdzIGluIGBsaXN0YFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmV2ZXJ5ID0gKGxpc3QsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGxldCBpdGVtcyA9IFtdLmNvbmNhdChsaXN0KTtcblxuICBmb3IgKGxldCBwYXR0ZXJuIG9mIFtdLmNvbmNhdChwYXR0ZXJucykpIHtcbiAgICBsZXQgaXNNYXRjaCA9IHBpY29tYXRjaChTdHJpbmcocGF0dGVybiksIG9wdGlvbnMpO1xuICAgIGlmICghaXRlbXMuZXZlcnkoaXRlbSA9PiBpc01hdGNoKGl0ZW0pKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmICoqYWxsKiogb2YgdGhlIGdpdmVuIGBwYXR0ZXJuc2AgbWF0Y2hcbiAqIHRoZSBzcGVjaWZpZWQgc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmFsbChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWydmb28uanMnXSkpO1xuICogLy8gdHJ1ZVxuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5hbGwoJ2Zvby5qcycsIFsnKi5qcycsICdmb28uanMnXSkpO1xuICogLy8gdHJ1ZVxuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWycqLmpzJywgJ2YqJywgJypvKicsICcqby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgc3RyYCBUaGUgc3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwYXR0ZXJucyBtYXRjaCBgc3RyYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmFsbCA9IChzdHIsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGEgc3RyaW5nOiBcIiR7dXRpbC5pbnNwZWN0KHN0cil9XCJgKTtcbiAgfVxuXG4gIHJldHVybiBbXS5jb25jYXQocGF0dGVybnMpLmV2ZXJ5KHAgPT4gcGljb21hdGNoKHAsIG9wdGlvbnMpKHN0cikpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIG1hdGNoZXMgY2FwdHVyZWQgYnkgYHBhdHRlcm5gIGluIGBzdHJpbmcsIG9yIGBudWxsYCBpZiB0aGUgcGF0dGVybiBkaWQgbm90IG1hdGNoLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmNhcHR1cmUocGF0dGVybiwgc3RyaW5nWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmNhcHR1cmUoJ3Rlc3QvKi5qcycsICd0ZXN0L2Zvby5qcycpKTtcbiAqIC8vPT4gWydmb28nXVxuICogY29uc29sZS5sb2cobW0uY2FwdHVyZSgndGVzdC8qLmpzJywgJ2Zvby9iYXIuY3NzJykpO1xuICogLy89PiBudWxsXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgZ2xvYmAgR2xvYiBwYXR0ZXJuIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBTdHJpbmcgdG8gbWF0Y2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtBcnJheXxudWxsfSBSZXR1cm5zIGFuIGFycmF5IG9mIGNhcHR1cmVzIGlmIHRoZSBpbnB1dCBtYXRjaGVzIHRoZSBnbG9iIHBhdHRlcm4sIG90aGVyd2lzZSBgbnVsbGAuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guY2FwdHVyZSA9IChnbG9iLCBpbnB1dCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcG9zaXggPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucyk7XG4gIGxldCByZWdleCA9IHBpY29tYXRjaC5tYWtlUmUoU3RyaW5nKGdsb2IpLCB7IC4uLm9wdGlvbnMsIGNhcHR1cmU6IHRydWUgfSk7XG4gIGxldCBtYXRjaCA9IHJlZ2V4LmV4ZWMocG9zaXggPyB1dGlscy50b1Bvc2l4U2xhc2hlcyhpbnB1dCkgOiBpbnB1dCk7XG5cbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1hdGNoLnNsaWNlKDEpLm1hcCh2ID0+IHYgPT09IHZvaWQgMCA/ICcnIDogdik7XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm1ha2VSZShwYXR0ZXJuWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLm1ha2VSZSgnKi5qcycpKTtcbiAqIC8vPT4gL14oPzooXFwuW1xcXFxcXC9dKT8oPyFcXC4pKD89LilbXlxcL10qP1xcLmpzKSQvXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgQSBnbG9iIHBhdHRlcm4gdG8gY29udmVydCB0byByZWdleC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1JlZ0V4cH0gUmV0dXJucyBhIHJlZ2V4IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gcGF0dGVybi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5tYWtlUmUgPSAoLi4uYXJncykgPT4gcGljb21hdGNoLm1ha2VSZSguLi5hcmdzKTtcblxuLyoqXG4gKiBTY2FuIGEgZ2xvYiBwYXR0ZXJuIHRvIHNlcGFyYXRlIHRoZSBwYXR0ZXJuIGludG8gc2VnbWVudHMuIFVzZWRcbiAqIGJ5IHRoZSBbc3BsaXRdKCNzcGxpdCkgbWV0aG9kLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIGNvbnN0IHN0YXRlID0gbW0uc2NhbihwYXR0ZXJuWywgb3B0aW9uc10pO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGhcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5zY2FuID0gKC4uLmFyZ3MpID0+IHBpY29tYXRjaC5zY2FuKC4uLmFyZ3MpO1xuXG4vKipcbiAqIFBhcnNlIGEgZ2xvYiBwYXR0ZXJuIHRvIGNyZWF0ZSB0aGUgc291cmNlIHN0cmluZyBmb3IgYSByZWd1bGFyXG4gKiBleHByZXNzaW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIGNvbnN0IHN0YXRlID0gbW0ucGFyc2UocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBnbG9iYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHVzZWZ1bCBwcm9wZXJ0aWVzIGFuZCBvdXRwdXQgdG8gYmUgdXNlZCBhcyByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLnBhcnNlID0gKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXMgPSBbXTtcbiAgZm9yIChsZXQgcGF0dGVybiBvZiBbXS5jb25jYXQocGF0dGVybnMgfHwgW10pKSB7XG4gICAgZm9yIChsZXQgc3RyIG9mIGJyYWNlcyhTdHJpbmcocGF0dGVybiksIG9wdGlvbnMpKSB7XG4gICAgICByZXMucHVzaChwaWNvbWF0Y2gucGFyc2Uoc3RyLCBvcHRpb25zKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgdGhlIGdpdmVuIGJyYWNlIGBwYXR0ZXJuYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeyBicmFjZXMgfSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcygnZm9vL3thLGIsY30vYmFyJykpO1xuICogLy89PiBbICdmb28vKGF8YnxjKS9iYXInIF1cbiAqXG4gKiBjb25zb2xlLmxvZyhicmFjZXMoJ2Zvby97YSxiLGN9L2JhcicsIHsgZXhwYW5kOiB0cnVlIH0pKTtcbiAqIC8vPT4gWyAnZm9vL2EvYmFyJywgJ2Zvby9iL2JhcicsICdmb28vYy9iYXInIF1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBTdHJpbmcgd2l0aCBicmFjZSBwYXR0ZXJuIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIEFueSBbb3B0aW9uc10oI29wdGlvbnMpIHRvIGNoYW5nZSBob3cgZXhwYW5zaW9uIGlzIHBlcmZvcm1lZC4gU2VlIHRoZSBbYnJhY2VzXVtdIGxpYnJhcnkgZm9yIGFsbCBhdmFpbGFibGUgb3B0aW9ucy5cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmJyYWNlcyA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIGlmICgob3B0aW9ucyAmJiBvcHRpb25zLm5vYnJhY2UgPT09IHRydWUpIHx8ICEvXFx7LipcXH0vLnRlc3QocGF0dGVybikpIHtcbiAgICByZXR1cm4gW3BhdHRlcm5dO1xuICB9XG4gIHJldHVybiBicmFjZXMocGF0dGVybiwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEV4cGFuZCBicmFjZXNcbiAqL1xuXG5taWNyb21hdGNoLmJyYWNlRXhwYW5kID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgcmV0dXJuIG1pY3JvbWF0Y2guYnJhY2VzKHBhdHRlcm4sIHsgLi4ub3B0aW9ucywgZXhwYW5kOiB0cnVlIH0pO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgbWljcm9tYXRjaFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gbWljcm9tYXRjaDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubWF0Y2ggPSB2b2lkIDA7XG5jb25zdCBpc0dsb2IgPSByZXF1aXJlKFwiaXMtZ2xvYlwiKTtcbmNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKFwibWljcm9tYXRjaFwiKTtcbmNvbnN0IHVybCA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmZ1bmN0aW9uIG1hdGNoKGNvbnRleHQsIHVyaSwgcmVxKSB7XG4gICAgLy8gc2luZ2xlIHBhdGhcbiAgICBpZiAoaXNTdHJpbmdQYXRoKGNvbnRleHQpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFNpbmdsZVN0cmluZ1BhdGgoY29udGV4dCwgdXJpKTtcbiAgICB9XG4gICAgLy8gc2luZ2xlIGdsb2IgcGF0aFxuICAgIGlmIChpc0dsb2JQYXRoKGNvbnRleHQpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFNpbmdsZUdsb2JQYXRoKGNvbnRleHQsIHVyaSk7XG4gICAgfVxuICAgIC8vIG11bHRpIHBhdGhcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBpZiAoY29udGV4dC5ldmVyeShpc1N0cmluZ1BhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hNdWx0aVBhdGgoY29udGV4dCwgdXJpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGV4dC5ldmVyeShpc0dsb2JQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoTXVsdGlHbG9iUGF0aChjb250ZXh0LCB1cmkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcnNfMS5FUlJPUlMuRVJSX0NPTlRFWFRfTUFUQ0hFUl9JTlZBTElEX0FSUkFZKTtcbiAgICB9XG4gICAgLy8gY3VzdG9tIG1hdGNoaW5nXG4gICAgaWYgKHR5cGVvZiBjb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHBhdGhuYW1lID0gZ2V0VXJsUGF0aE5hbWUodXJpKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQocGF0aG5hbWUsIHJlcSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihlcnJvcnNfMS5FUlJPUlMuRVJSX0NPTlRFWFRfTUFUQ0hFUl9HRU5FUklDKTtcbn1cbmV4cG9ydHMubWF0Y2ggPSBtYXRjaDtcbi8qKlxuICogQHBhcmFtICB7U3RyaW5nfSBjb250ZXh0ICcvYXBpJ1xuICogQHBhcmFtICB7U3RyaW5nfSB1cmkgICAgICdodHRwOi8vZXhhbXBsZS5vcmcvYXBpL2IvYy9kLmh0bWwnXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBtYXRjaFNpbmdsZVN0cmluZ1BhdGgoY29udGV4dCwgdXJpKSB7XG4gICAgY29uc3QgcGF0aG5hbWUgPSBnZXRVcmxQYXRoTmFtZSh1cmkpO1xuICAgIHJldHVybiBwYXRobmFtZS5pbmRleE9mKGNvbnRleHQpID09PSAwO1xufVxuZnVuY3Rpb24gbWF0Y2hTaW5nbGVHbG9iUGF0aChwYXR0ZXJuLCB1cmkpIHtcbiAgICBjb25zdCBwYXRobmFtZSA9IGdldFVybFBhdGhOYW1lKHVyaSk7XG4gICAgY29uc3QgbWF0Y2hlcyA9IG1pY3JvbWF0Y2goW3BhdGhuYW1lXSwgcGF0dGVybik7XG4gICAgcmV0dXJuIG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gbWF0Y2hNdWx0aUdsb2JQYXRoKHBhdHRlcm5MaXN0LCB1cmkpIHtcbiAgICByZXR1cm4gbWF0Y2hTaW5nbGVHbG9iUGF0aChwYXR0ZXJuTGlzdCwgdXJpKTtcbn1cbi8qKlxuICogQHBhcmFtICB7U3RyaW5nfSBjb250ZXh0TGlzdCBbJy9hcGknLCAnL2FqYXgnXVxuICogQHBhcmFtICB7U3RyaW5nfSB1cmkgICAgICdodHRwOi8vZXhhbXBsZS5vcmcvYXBpL2IvYy9kLmh0bWwnXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBtYXRjaE11bHRpUGF0aChjb250ZXh0TGlzdCwgdXJpKSB7XG4gICAgbGV0IGlzTXVsdGlQYXRoID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBjb250ZXh0IG9mIGNvbnRleHRMaXN0KSB7XG4gICAgICAgIGlmIChtYXRjaFNpbmdsZVN0cmluZ1BhdGgoY29udGV4dCwgdXJpKSkge1xuICAgICAgICAgICAgaXNNdWx0aVBhdGggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzTXVsdGlQYXRoO1xufVxuLyoqXG4gKiBQYXJzZXMgVVJJIGFuZCByZXR1cm5zIFJGQyAzOTg2IHBhdGhcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHVyaSBmcm9tIHJlcS51cmxcbiAqIEByZXR1cm4ge1N0cmluZ30gICAgIFJGQyAzOTg2IHBhdGhcbiAqL1xuZnVuY3Rpb24gZ2V0VXJsUGF0aE5hbWUodXJpKSB7XG4gICAgcmV0dXJuIHVyaSAmJiB1cmwucGFyc2UodXJpKS5wYXRobmFtZTtcbn1cbmZ1bmN0aW9uIGlzU3RyaW5nUGF0aChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJyAmJiAhaXNHbG9iKGNvbnRleHQpO1xufVxuZnVuY3Rpb24gaXNHbG9iUGF0aChjb250ZXh0KSB7XG4gICAgcmV0dXJuIGlzR2xvYihjb250ZXh0KTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0SGFuZGxlcnMgPSBleHBvcnRzLmluaXQgPSB2b2lkIDA7XG5jb25zdCBsb2dnZXJfMSA9IHJlcXVpcmUoXCIuL2xvZ2dlclwiKTtcbmNvbnN0IGxvZ2dlciA9ICgwLCBsb2dnZXJfMS5nZXRJbnN0YW5jZSkoKTtcbmZ1bmN0aW9uIGluaXQocHJveHksIG9wdGlvbikge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gZ2V0SGFuZGxlcnMob3B0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBPYmplY3Qua2V5cyhoYW5kbGVycykpIHtcbiAgICAgICAgcHJveHkub24oZXZlbnROYW1lLCBoYW5kbGVyc1tldmVudE5hbWVdKTtcbiAgICB9XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2svd2VicGFjay1kZXYtc2VydmVyL2lzc3Vlcy8xNjQyXG4gICAgcHJveHkub24oJ2Vjb25ucmVzZXQnLCAoZXJyb3IsIHJlcSwgcmVzLCB0YXJnZXQpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbSFBNXSBFQ09OTlJFU0VUOiAlT2AsIGVycm9yKTtcbiAgICB9KTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay93ZWJwYWNrLWRldi1zZXJ2ZXIvaXNzdWVzLzE2NDIjaXNzdWVjb21tZW50LTExMDQzMjUxMjBcbiAgICBwcm94eS5vbigncHJveHlSZXFXcycsIChwcm94eVJlcSwgcmVxLCBzb2NrZXQsIG9wdGlvbnMsIGhlYWQpID0+IHtcbiAgICAgICAgc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBbSFBNXSBXZWJTb2NrZXQgZXJyb3I6ICVPYCwgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBsb2dnZXIuZGVidWcoJ1tIUE1dIFN1YnNjcmliZWQgdG8gaHR0cC1wcm94eSBldmVudHM6JywgT2JqZWN0LmtleXMoaGFuZGxlcnMpKTtcbn1cbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5mdW5jdGlvbiBnZXRIYW5kbGVycyhvcHRpb25zKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqaXRzdS9ub2RlLWh0dHAtcHJveHkjbGlzdGVuaW5nLWZvci1wcm94eS1ldmVudHNcbiAgICBjb25zdCBwcm94eUV2ZW50c01hcCA9IHtcbiAgICAgICAgZXJyb3I6ICdvbkVycm9yJyxcbiAgICAgICAgcHJveHlSZXE6ICdvblByb3h5UmVxJyxcbiAgICAgICAgcHJveHlSZXFXczogJ29uUHJveHlSZXFXcycsXG4gICAgICAgIHByb3h5UmVzOiAnb25Qcm94eVJlcycsXG4gICAgICAgIG9wZW46ICdvbk9wZW4nLFxuICAgICAgICBjbG9zZTogJ29uQ2xvc2UnLFxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlcnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIG9uRXZlbnROYW1lXSBvZiBPYmplY3QuZW50cmllcyhwcm94eUV2ZW50c01hcCkpIHtcbiAgICAgICAgLy8gYWxsIGhhbmRsZXJzIGZvciB0aGUgaHR0cC1wcm94eSBldmVudHMgYXJlIHByZWZpeGVkIHdpdGggJ29uJy5cbiAgICAgICAgLy8gbG9vcCB0aHJvdWdoIG9wdGlvbnMgYW5kIHRyeSB0byBmaW5kIHRoZXNlIGhhbmRsZXJzXG4gICAgICAgIC8vIGFuZCBhZGQgdGhlbSB0byB0aGUgaGFuZGxlcnMgb2JqZWN0IGZvciBzdWJzY3JpcHRpb24gaW4gaW5pdCgpLlxuICAgICAgICBjb25zdCBmbkhhbmRsZXIgPSBvcHRpb25zID8gb3B0aW9uc1tvbkV2ZW50TmFtZV0gOiBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIGZuSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaGFuZGxlcnNbZXZlbnROYW1lXSA9IGZuSGFuZGxlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgZGVmYXVsdCBlcnJvciBoYW5kbGVyIGluIGFic2VuY2Ugb2YgZXJyb3IgaGFuZGxlclxuICAgIGlmICh0eXBlb2YgaGFuZGxlcnMuZXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGFuZGxlcnMuZXJyb3IgPSBkZWZhdWx0RXJyb3JIYW5kbGVyO1xuICAgIH1cbiAgICAvLyBhZGQgZGVmYXVsdCBjbG9zZSBoYW5kbGVyIGluIGFic2VuY2Ugb2YgY2xvc2UgaGFuZGxlclxuICAgIGlmICh0eXBlb2YgaGFuZGxlcnMuY2xvc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGFuZGxlcnMuY2xvc2UgPSBsb2dDbG9zZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZXJzO1xufVxuZXhwb3J0cy5nZXRIYW5kbGVycyA9IGdldEhhbmRsZXJzO1xuZnVuY3Rpb24gZGVmYXVsdEVycm9ySGFuZGxlcihlcnIsIHJlcSwgcmVzKSB7XG4gICAgLy8gUmUtdGhyb3cgZXJyb3IuIE5vdCByZWNvdmVyYWJsZSBzaW5jZSByZXEgJiByZXMgYXJlIGVtcHR5LlxuICAgIGlmICghcmVxICYmICFyZXMpIHtcbiAgICAgICAgdGhyb3cgZXJyOyAvLyBcIkVycm9yOiBNdXN0IHByb3ZpZGUgYSBwcm9wZXIgVVJMIGFzIHRhcmdldFwiXG4gICAgfVxuICAgIGNvbnN0IGhvc3QgPSByZXEuaGVhZGVycyAmJiByZXEuaGVhZGVycy5ob3N0O1xuICAgIGNvbnN0IGNvZGUgPSBlcnIuY29kZTtcbiAgICBpZiAocmVzLndyaXRlSGVhZCAmJiAhcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIGlmICgvSFBFX0lOVkFMSUQvLnRlc3QoY29kZSkpIHtcbiAgICAgICAgICAgIHJlcy53cml0ZUhlYWQoNTAyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0VDT05OUkVTRVQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0VOT1RGT1VORCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRUNPTk5SRUZVU0VEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdFVElNRURPVVQnOlxuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVIZWFkKDUwNCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUhlYWQoNTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXMuZW5kKGBFcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcHJveHk6ICR7aG9zdH0ke3JlcS51cmx9YCk7XG59XG5mdW5jdGlvbiBsb2dDbG9zZShyZXEsIHNvY2tldCwgaGVhZCkge1xuICAgIC8vIHZpZXcgZGlzY29ubmVjdGVkIHdlYnNvY2tldCBjb25uZWN0aW9uc1xuICAgIGxvZ2dlci5pbmZvKCdbSFBNXSBDbGllbnQgZGlzY29ubmVjdGVkJyk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZVBhdGhSZXdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IGlzUGxhaW5PYmogPSByZXF1aXJlKFwiaXMtcGxhaW4tb2JqXCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG5jb25zdCBsb2dnZXJfMSA9IHJlcXVpcmUoXCIuL2xvZ2dlclwiKTtcbmNvbnN0IGxvZ2dlciA9ICgwLCBsb2dnZXJfMS5nZXRJbnN0YW5jZSkoKTtcbi8qKlxuICogQ3JlYXRlIHJld3JpdGUgZnVuY3Rpb24sIHRvIGNhY2hlIHBhcnNlZCByZXdyaXRlIHJ1bGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXdyaXRlQ29uZmlnXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gRnVuY3Rpb24gdG8gcmV3cml0ZSBwYXRoczsgVGhpcyBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IGBwYXRoYCAocmVxdWVzdC51cmwpIGFzIHBhcmFtZXRlclxuICovXG5mdW5jdGlvbiBjcmVhdGVQYXRoUmV3cml0ZXIocmV3cml0ZUNvbmZpZykge1xuICAgIGxldCBydWxlc0NhY2hlO1xuICAgIGlmICghaXNWYWxpZFJld3JpdGVDb25maWcocmV3cml0ZUNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJld3JpdGVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tUmV3cml0ZUZuID0gcmV3cml0ZUNvbmZpZztcbiAgICAgICAgcmV0dXJuIGN1c3RvbVJld3JpdGVGbjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJ1bGVzQ2FjaGUgPSBwYXJzZVBhdGhSZXdyaXRlUnVsZXMocmV3cml0ZUNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXdyaXRlUGF0aDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmV3cml0ZVBhdGgocGF0aCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gcGF0aDtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzQ2FjaGUpIHtcbiAgICAgICAgICAgIGlmIChydWxlLnJlZ2V4LnRlc3QocGF0aCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShydWxlLnJlZ2V4LCBydWxlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1tIUE1dIFJld3JpdGluZyBwYXRoIGZyb20gXCIlc1wiIHRvIFwiJXNcIicsIHBhdGgsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLmNyZWF0ZVBhdGhSZXdyaXRlciA9IGNyZWF0ZVBhdGhSZXdyaXRlcjtcbmZ1bmN0aW9uIGlzVmFsaWRSZXdyaXRlQ29uZmlnKHJld3JpdGVDb25maWcpIHtcbiAgICBpZiAodHlwZW9mIHJld3JpdGVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUGxhaW5PYmoocmV3cml0ZUNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHJld3JpdGVDb25maWcpLmxlbmd0aCAhPT0gMDtcbiAgICB9XG4gICAgZWxzZSBpZiAocmV3cml0ZUNvbmZpZyA9PT0gdW5kZWZpbmVkIHx8IHJld3JpdGVDb25maWcgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yc18xLkVSUk9SUy5FUlJfUEFUSF9SRVdSSVRFUl9DT05GSUcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlUGF0aFJld3JpdGVSdWxlcyhyZXdyaXRlQ29uZmlnKSB7XG4gICAgY29uc3QgcnVsZXMgPSBbXTtcbiAgICBpZiAoaXNQbGFpbk9iaihyZXdyaXRlQ29uZmlnKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXldIG9mIE9iamVjdC5lbnRyaWVzKHJld3JpdGVDb25maWcpKSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICByZWdleDogbmV3IFJlZ0V4cChrZXkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXdyaXRlQ29uZmlnW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbSFBNXSBQcm94eSByZXdyaXRlIHJ1bGUgY3JlYXRlZDogXCIlc1wiIH4+IFwiJXNcIicsIGtleSwgcmV3cml0ZUNvbmZpZ1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnVsZXM7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFRhcmdldCA9IHZvaWQgMDtcbmNvbnN0IGlzUGxhaW5PYmogPSByZXF1aXJlKFwiaXMtcGxhaW4tb2JqXCIpO1xuY29uc3QgbG9nZ2VyXzEgPSByZXF1aXJlKFwiLi9sb2dnZXJcIik7XG5jb25zdCBsb2dnZXIgPSAoMCwgbG9nZ2VyXzEuZ2V0SW5zdGFuY2UpKCk7XG5hc3luYyBmdW5jdGlvbiBnZXRUYXJnZXQocmVxLCBjb25maWcpIHtcbiAgICBsZXQgbmV3VGFyZ2V0O1xuICAgIGNvbnN0IHJvdXRlciA9IGNvbmZpZy5yb3V0ZXI7XG4gICAgaWYgKGlzUGxhaW5PYmoocm91dGVyKSkge1xuICAgICAgICBuZXdUYXJnZXQgPSBnZXRUYXJnZXRGcm9tUHJveHlUYWJsZShyZXEsIHJvdXRlcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiByb3V0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbmV3VGFyZ2V0ID0gYXdhaXQgcm91dGVyKHJlcSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdUYXJnZXQ7XG59XG5leHBvcnRzLmdldFRhcmdldCA9IGdldFRhcmdldDtcbmZ1bmN0aW9uIGdldFRhcmdldEZyb21Qcm94eVRhYmxlKHJlcSwgdGFibGUpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IGhvc3QgPSByZXEuaGVhZGVycy5ob3N0O1xuICAgIGNvbnN0IHBhdGggPSByZXEudXJsO1xuICAgIGNvbnN0IGhvc3RBbmRQYXRoID0gaG9zdCArIHBhdGg7XG4gICAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3QuZW50cmllcyh0YWJsZSkpIHtcbiAgICAgICAgaWYgKGNvbnRhaW5zUGF0aChrZXkpKSB7XG4gICAgICAgICAgICBpZiAoaG9zdEFuZFBhdGguaW5kZXhPZihrZXkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBtYXRjaCAnbG9jYWxob3N0OjMwMDAvYXBpJ1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRhYmxlW2tleV07XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbSFBNXSBSb3V0ZXIgdGFibGUgbWF0Y2g6IFwiJXNcIicsIGtleSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBob3N0KSB7XG4gICAgICAgICAgICAgICAgLy8gbWF0Y2ggJ2xvY2FsaG9zdDozMDAwJ1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRhYmxlW2tleV07XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbSFBNXSBSb3V0ZXIgdGFibGUgbWF0Y2g6IFwiJXNcIicsIGhvc3QpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb250YWluc1BhdGgodikge1xuICAgIHJldHVybiB2LmluZGV4T2YoJy8nKSA+IC0xO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwUHJveHlNaWRkbGV3YXJlID0gdm9pZCAwO1xuY29uc3QgaHR0cFByb3h5ID0gcmVxdWlyZShcImh0dHAtcHJveHlcIik7XG5jb25zdCBjb25maWdfZmFjdG9yeV8xID0gcmVxdWlyZShcIi4vY29uZmlnLWZhY3RvcnlcIik7XG5jb25zdCBjb250ZXh0TWF0Y2hlciA9IHJlcXVpcmUoXCIuL2NvbnRleHQtbWF0Y2hlclwiKTtcbmNvbnN0IGhhbmRsZXJzID0gcmVxdWlyZShcIi4vX2hhbmRsZXJzXCIpO1xuY29uc3QgbG9nZ2VyXzEgPSByZXF1aXJlKFwiLi9sb2dnZXJcIik7XG5jb25zdCBQYXRoUmV3cml0ZXIgPSByZXF1aXJlKFwiLi9wYXRoLXJld3JpdGVyXCIpO1xuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4vcm91dGVyXCIpO1xuY2xhc3MgSHR0cFByb3h5TWlkZGxld2FyZSB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dCwgb3B0cykge1xuICAgICAgICB0aGlzLmxvZ2dlciA9ICgwLCBsb2dnZXJfMS5nZXRJbnN0YW5jZSkoKTtcbiAgICAgICAgdGhpcy53c0ludGVybmFsU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlcnZlck9uQ2xvc2VTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC93aWtpLyd0aGlzJy1pbi1UeXBlU2NyaXB0I3JlZC1mbGFncy1mb3ItdGhpc1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmUgPSBhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRQcm94eSh0aGlzLmNvbmZpZy5jb250ZXh0LCByZXEpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlUHJveHlPcHRpb25zID0gYXdhaXQgdGhpcy5wcmVwYXJlUHJveHlSZXF1ZXN0KHJlcSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHkud2ViKHJlcSwgcmVzLCBhY3RpdmVQcm94eU9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEdldCB0aGUgc2VydmVyIG9iamVjdCB0byBzdWJzY3JpYmUgdG8gc2VydmVyIGV2ZW50cztcbiAgICAgICAgICAgICAqICd1cGdyYWRlJyBmb3Igd2Vic29ja2V0IGFuZCAnY2xvc2UnIGZvciBncmFjZWZ1bCBzaHV0ZG93blxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIE5PVEU6XG4gICAgICAgICAgICAgKiByZXEuc29ja2V0OiBub2RlID49IDEzXG4gICAgICAgICAgICAgKiByZXEuY29ubmVjdGlvbjogbm9kZSA8IDEzIChSZW1vdmUgdGhpcyB3aGVuIG5vZGUgMTIvMTMgc3VwcG9ydCBpcyBkcm9wcGVkKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXIgPSAoX2IgPSAoKF9hID0gcmVxLnNvY2tldCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogcmVxLmNvbm5lY3Rpb24pKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc2VydmVyO1xuICAgICAgICAgICAgaWYgKHNlcnZlciAmJiAhdGhpcy5zZXJ2ZXJPbkNsb3NlU3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgICAgIHNlcnZlci5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1tIUE1dIHNlcnZlciBjbG9zZSBzaWduYWwgcmVjZWl2ZWQ6IGNsb3NpbmcgcHJveHkgc2VydmVyJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHkuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZlck9uQ2xvc2VTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnByb3h5T3B0aW9ucy53cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIC8vIHVzZSBpbml0aWFsIHJlcXVlc3QgdG8gYWNjZXNzIHRoZSBzZXJ2ZXIgb2JqZWN0IHRvIHN1YnNjcmliZSB0byBodHRwIHVwZ3JhZGUgZXZlbnRcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGNoVXBncmFkZVJlcXVlc3Qoc2VydmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jYXRjaFVwZ3JhZGVSZXF1ZXN0ID0gKHNlcnZlcikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLndzSW50ZXJuYWxTdWJzY3JpYmVkKSB7XG4gICAgICAgICAgICAgICAgc2VydmVyLm9uKCd1cGdyYWRlJywgdGhpcy5oYW5kbGVVcGdyYWRlKTtcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGR1cGxpY2F0ZSB1cGdyYWRlIGhhbmRsaW5nO1xuICAgICAgICAgICAgICAgIC8vIGluIGNhc2UgZXh0ZXJuYWwgdXBncmFkZSBpcyBhbHNvIGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgICB0aGlzLndzSW50ZXJuYWxTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVVcGdyYWRlID0gYXN5bmMgKHJlcSwgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRQcm94eSh0aGlzLmNvbmZpZy5jb250ZXh0LCByZXEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlUHJveHlPcHRpb25zID0gYXdhaXQgdGhpcy5wcmVwYXJlUHJveHlSZXF1ZXN0KHJlcSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm94eS53cyhyZXEsIHNvY2tldCwgaGVhZCwgYWN0aXZlUHJveHlPcHRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdbSFBNXSBVcGdyYWRpbmcgdG8gV2ViU29ja2V0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmUgd2hldGhlciByZXF1ZXN0IHNob3VsZCBiZSBwcm94aWVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGNvbnRleHQgW2Rlc2NyaXB0aW9uXVxuICAgICAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHJlcSAgICAgW2Rlc2NyaXB0aW9uXVxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zaG91bGRQcm94eSA9IChjb250ZXh0LCByZXEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSByZXEub3JpZ2luYWxVcmwgfHwgcmVxLnVybDtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0TWF0Y2hlci5tYXRjaChjb250ZXh0LCBwYXRoLCByZXEpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbHkgb3B0aW9uLnJvdXRlciBhbmQgb3B0aW9uLnBhdGhSZXdyaXRlXG4gICAgICAgICAqIE9yZGVyIG1hdHRlcnM6XG4gICAgICAgICAqICAgIFJvdXRlciB1c2VzIG9yaWdpbmFsIHBhdGggZm9yIHJvdXRpbmc7XG4gICAgICAgICAqICAgIE5PVCB0aGUgbW9kaWZpZWQgcGF0aCwgYWZ0ZXIgaXQgaGFzIGJlZW4gcmV3cml0dGVuIGJ5IHBhdGhSZXdyaXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXFcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBwcm94eSBvcHRpb25zXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnByZXBhcmVQcm94eVJlcXVlc3QgPSBhc3luYyAocmVxKSA9PiB7XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hpbXVyYWkvaHR0cC1wcm94eS1taWRkbGV3YXJlL2lzc3Vlcy8xN1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoaW11cmFpL2h0dHAtcHJveHktbWlkZGxld2FyZS9pc3N1ZXMvOTRcbiAgICAgICAgICAgIHJlcS51cmwgPSByZXEub3JpZ2luYWxVcmwgfHwgcmVxLnVybDtcbiAgICAgICAgICAgIC8vIHN0b3JlIHVyaSBiZWZvcmUgaXQgZ2V0cyByZXdyaXR0ZW4gZm9yIGxvZ2dpbmdcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUGF0aCA9IHJlcS51cmw7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm94eU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3h5T3B0aW9ucyk7XG4gICAgICAgICAgICAvLyBBcHBseSBpbiBvcmRlcjpcbiAgICAgICAgICAgIC8vIDEuIG9wdGlvbi5yb3V0ZXJcbiAgICAgICAgICAgIC8vIDIuIG9wdGlvbi5wYXRoUmV3cml0ZVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVJvdXRlcihyZXEsIG5ld1Byb3h5T3B0aW9ucyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGx5UGF0aFJld3JpdGUocmVxLCB0aGlzLnBhdGhSZXdyaXRlcik7XG4gICAgICAgICAgICAvLyBkZWJ1ZyBsb2dnaW5nIGZvciBib3RoIGh0dHAocykgYW5kIHdlYnNvY2tldHNcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3h5T3B0aW9ucy5sb2dMZXZlbCA9PT0gJ2RlYnVnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycm93ID0gKDAsIGxvZ2dlcl8xLmdldEFycm93KShvcmlnaW5hbFBhdGgsIHJlcS51cmwsIHRoaXMucHJveHlPcHRpb25zLnRhcmdldCwgbmV3UHJveHlPcHRpb25zLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1tIUE1dICVzICVzICVzICVzJywgcmVxLm1ldGhvZCwgb3JpZ2luYWxQYXRoLCBhcnJvdywgbmV3UHJveHlPcHRpb25zLnRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3UHJveHlPcHRpb25zO1xuICAgICAgICB9O1xuICAgICAgICAvLyBNb2RpZnkgb3B0aW9uLnRhcmdldCB3aGVuIHJvdXRlciBwcmVzZW50LlxuICAgICAgICB0aGlzLmFwcGx5Um91dGVyID0gYXN5bmMgKHJlcSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IG5ld1RhcmdldDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJvdXRlcikge1xuICAgICAgICAgICAgICAgIG5ld1RhcmdldCA9IGF3YWl0IFJvdXRlci5nZXRUYXJnZXQocmVxLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3VGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdbSFBNXSBSb3V0ZXIgbmV3IHRhcmdldDogJXMgLT4gXCIlc1wiJywgb3B0aW9ucy50YXJnZXQsIG5ld1RhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudGFyZ2V0ID0gbmV3VGFyZ2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gcmV3cml0ZSBwYXRoXG4gICAgICAgIHRoaXMuYXBwbHlQYXRoUmV3cml0ZSA9IGFzeW5jIChyZXEsIHBhdGhSZXdyaXRlcikgPT4ge1xuICAgICAgICAgICAgaWYgKHBhdGhSZXdyaXRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCBwYXRoUmV3cml0ZXIocmVxLnVybCwgcmVxKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcS51cmwgPSBwYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnW0hQTV0gcGF0aFJld3JpdGU6IE5vIHJld3JpdHRlbiBwYXRoIGZvdW5kLiAoJXMpJywgcmVxLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmxvZ0Vycm9yID0gKGVyciwgcmVxLCByZXMsIHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3QgaG9zdG5hbWUgPSAoKF9hID0gcmVxLmhlYWRlcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ob3N0KSB8fCByZXEuaG9zdG5hbWUgfHwgcmVxLmhvc3Q7IC8vICh3ZWJzb2NrZXQpIHx8IChub2RlMC4xMCB8fCBub2RlIDQvNSlcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RIcmVmID0gYCR7aG9zdG5hbWV9JHtyZXEudXJsfWA7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRIcmVmID0gYCR7dGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LmhyZWZ9YDsgLy8gdGFyZ2V0IGlzIHVuZGVmaW5lZCB3aGVuIHdlYnNvY2tldCBlcnJvcnNcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdbSFBNXSBFcnJvciBvY2N1cnJlZCB3aGlsZSBwcm94eWluZyByZXF1ZXN0ICVzIHRvICVzIFslc10gKCVzKSc7XG4gICAgICAgICAgICBjb25zdCBlcnJSZWZlcmVuY2UgPSAnaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9lcnJvcnMuaHRtbCNlcnJvcnNfY29tbW9uX3N5c3RlbV9lcnJvcnMnOyAvLyBsaW5rIHRvIE5vZGUgQ29tbW9uIFN5c3RlbXMgRXJyb3JzIHBhZ2VcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSwgcmVxdWVzdEhyZWYsIHRhcmdldEhyZWYsIGVyci5jb2RlIHx8IGVyciwgZXJyUmVmZXJlbmNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb25maWcgPSAoMCwgY29uZmlnX2ZhY3RvcnlfMS5jcmVhdGVDb25maWcpKGNvbnRleHQsIG9wdHMpO1xuICAgICAgICB0aGlzLnByb3h5T3B0aW9ucyA9IHRoaXMuY29uZmlnLm9wdGlvbnM7XG4gICAgICAgIC8vIGNyZWF0ZSBwcm94eVxuICAgICAgICB0aGlzLnByb3h5ID0gaHR0cFByb3h5LmNyZWF0ZVByb3h5U2VydmVyKHt9KTtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgW0hQTV0gUHJveHkgY3JlYXRlZDogJHt0aGlzLmNvbmZpZy5jb250ZXh0fSAgLT4gJHt0aGlzLnByb3h5T3B0aW9ucy50YXJnZXR9YCk7XG4gICAgICAgIHRoaXMucGF0aFJld3JpdGVyID0gUGF0aFJld3JpdGVyLmNyZWF0ZVBhdGhSZXdyaXRlcih0aGlzLnByb3h5T3B0aW9ucy5wYXRoUmV3cml0ZSk7IC8vIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gXCJwYXRoUmV3cml0ZVwiIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICAvLyBhdHRhY2ggaGFuZGxlciB0byBodHRwLXByb3h5IGV2ZW50c1xuICAgICAgICBoYW5kbGVycy5pbml0KHRoaXMucHJveHksIHRoaXMucHJveHlPcHRpb25zKTtcbiAgICAgICAgLy8gbG9nIGVycm9ycyBmb3IgZGVidWcgcHVycG9zZVxuICAgICAgICB0aGlzLnByb3h5Lm9uKCdlcnJvcicsIHRoaXMubG9nRXJyb3IpO1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hpbXVyYWkvaHR0cC1wcm94eS1taWRkbGV3YXJlL2lzc3Vlcy8xOVxuICAgICAgICAvLyBleHBvc2UgZnVuY3Rpb24gdG8gdXBncmFkZSBleHRlcm5hbGx5XG4gICAgICAgIHRoaXMubWlkZGxld2FyZS51cGdyYWRlID0gKHJlcSwgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMud3NJbnRlcm5hbFN1YnNjcmliZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVVwZ3JhZGUocmVxLCBzb2NrZXQsIGhlYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuSHR0cFByb3h5TWlkZGxld2FyZSA9IEh0dHBQcm94eU1pZGRsZXdhcmU7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlc3BvbnNlSW50ZXJjZXB0b3IgPSB2b2lkIDA7XG5jb25zdCB6bGliID0gcmVxdWlyZShcInpsaWJcIik7XG4vKipcbiAqIEludGVyY2VwdCByZXNwb25zZXMgZnJvbSB1cHN0cmVhbS5cbiAqIEF1dG9tYXRpY2FsbHkgZGVjb21wcmVzcyAoZGVmbGF0ZSwgZ3ppcCwgYnJvdGxpKS5cbiAqIEdpdmUgZGV2ZWxvcGVyIHRoZSBvcHBvcnR1bml0eSB0byBtb2RpZnkgaW50ZXJjZXB0ZWQgQnVmZmVyIGFuZCBodHRwLlNlcnZlclJlc3BvbnNlXG4gKlxuICogTk9URTogbXVzdCBzZXQgb3B0aW9ucy5zZWxmSGFuZGxlUmVzcG9uc2U9dHJ1ZSAocHJldmVudCBhdXRvbWF0aWMgY2FsbCBvZiByZXMuZW5kKCkpXG4gKi9cbmZ1bmN0aW9uIHJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcHJveHlSZXMocHJveHlSZXMsIHJlcSwgcmVzKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUHJveHlSZXMgPSBwcm94eVJlcztcbiAgICAgICAgbGV0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKCcnLCAndXRmOCcpO1xuICAgICAgICAvLyBkZWNvbXByZXNzIHByb3h5IHJlc3BvbnNlXG4gICAgICAgIGNvbnN0IF9wcm94eVJlcyA9IGRlY29tcHJlc3MocHJveHlSZXMsIHByb3h5UmVzLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSk7XG4gICAgICAgIC8vIGNvbmNhdCBkYXRhIHN0cmVhbVxuICAgICAgICBfcHJveHlSZXMub24oJ2RhdGEnLCAoY2h1bmspID0+IChidWZmZXIgPSBCdWZmZXIuY29uY2F0KFtidWZmZXIsIGNodW5rXSkpKTtcbiAgICAgICAgX3Byb3h5UmVzLm9uKCdlbmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBjb3B5IG9yaWdpbmFsIGhlYWRlcnNcbiAgICAgICAgICAgIGNvcHlIZWFkZXJzKHByb3h5UmVzLCByZXMpO1xuICAgICAgICAgICAgLy8gY2FsbCBpbnRlcmNlcHRvciB3aXRoIGludGVyY2VwdGVkIHJlc3BvbnNlIChidWZmZXIpXG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRlZEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGF3YWl0IGludGVyY2VwdG9yKGJ1ZmZlciwgb3JpZ2luYWxQcm94eVJlcywgcmVxLCByZXMpKTtcbiAgICAgICAgICAgIC8vIHNldCBjb3JyZWN0IGNvbnRlbnQtbGVuZ3RoICh3aXRoIGRvdWJsZSBieXRlIGNoYXJhY3RlciBzdXBwb3J0KVxuICAgICAgICAgICAgcmVzLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCBCdWZmZXIuYnl0ZUxlbmd0aChpbnRlcmNlcHRlZEJ1ZmZlciwgJ3V0ZjgnKSk7XG4gICAgICAgICAgICByZXMud3JpdGUoaW50ZXJjZXB0ZWRCdWZmZXIpO1xuICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgX3Byb3h5UmVzLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVzLmVuZChgRXJyb3IgZmV0Y2hpbmcgcHJveGllZCByZXF1ZXN0OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5leHBvcnRzLnJlc3BvbnNlSW50ZXJjZXB0b3IgPSByZXNwb25zZUludGVyY2VwdG9yO1xuLyoqXG4gKiBTdHJlYW1pbmcgZGVjb21wcmVzc2lvbiBvZiBwcm94eSByZXNwb25zZVxuICogc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3N1cGVyc2V0L2Jsb2IvOTc3M2FiYTUyMmU5NTdlZDk0MjMwNDVjYTE1MzIxOTYzOGE4NWQyZi9zdXBlcnNldC1mcm9udGVuZC93ZWJwYWNrLnByb3h5LWNvbmZpZy5qcyNMMTE2XG4gKi9cbmZ1bmN0aW9uIGRlY29tcHJlc3MocHJveHlSZXMsIGNvbnRlbnRFbmNvZGluZykge1xuICAgIGxldCBfcHJveHlSZXMgPSBwcm94eVJlcztcbiAgICBsZXQgZGVjb21wcmVzcztcbiAgICBzd2l0Y2ggKGNvbnRlbnRFbmNvZGluZykge1xuICAgICAgICBjYXNlICdnemlwJzpcbiAgICAgICAgICAgIGRlY29tcHJlc3MgPSB6bGliLmNyZWF0ZUd1bnppcCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JyJzpcbiAgICAgICAgICAgIGRlY29tcHJlc3MgPSB6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkZWZsYXRlJzpcbiAgICAgICAgICAgIGRlY29tcHJlc3MgPSB6bGliLmNyZWF0ZUluZmxhdGUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChkZWNvbXByZXNzKSB7XG4gICAgICAgIF9wcm94eVJlcy5waXBlKGRlY29tcHJlc3MpO1xuICAgICAgICBfcHJveHlSZXMgPSBkZWNvbXByZXNzO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb3h5UmVzO1xufVxuLyoqXG4gKiBDb3B5IG9yaWdpbmFsIGhlYWRlcnNcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3VwZXJzZXQvYmxvYi85NzczYWJhNTIyZTk1N2VkOTQyMzA0NWNhMTUzMjE5NjM4YTg1ZDJmL3N1cGVyc2V0LWZyb250ZW5kL3dlYnBhY2sucHJveHktY29uZmlnLmpzI0w3OFxuICovXG5mdW5jdGlvbiBjb3B5SGVhZGVycyhvcmlnaW5hbFJlc3BvbnNlLCByZXNwb25zZSkge1xuICAgIHJlc3BvbnNlLnN0YXR1c0NvZGUgPSBvcmlnaW5hbFJlc3BvbnNlLnN0YXR1c0NvZGU7XG4gICAgcmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSA9IG9yaWdpbmFsUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZTtcbiAgICBpZiAocmVzcG9uc2Uuc2V0SGVhZGVyKSB7XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMob3JpZ2luYWxSZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgLy8gaWdub3JlIGNodW5rZWQsIGJyb3RsaSwgZ3ppcCwgZGVmbGF0ZSBoZWFkZXJzXG4gICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcigoa2V5KSA9PiAhWydjb250ZW50LWVuY29kaW5nJywgJ3RyYW5zZmVyLWVuY29kaW5nJ10uaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBvcmlnaW5hbFJlc3BvbnNlLmhlYWRlcnNba2V5XTtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBjb29raWUgZG9tYWluXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcCgoeCkgPT4geC5yZXBsYWNlKC9Eb21haW49W147XSs/L2ksICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IG9yaWdpbmFsUmVzcG9uc2UuaGVhZGVycztcbiAgICB9XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmZpeFJlcXVlc3RCb2R5ID0gdm9pZCAwO1xuY29uc3QgcXVlcnlzdHJpbmcgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7XG4vKipcbiAqIEZpeCBwcm94aWVkIGJvZHkgaWYgYm9keVBhcnNlciBpcyBpbnZvbHZlZC5cbiAqL1xuZnVuY3Rpb24gZml4UmVxdWVzdEJvZHkocHJveHlSZXEsIHJlcSkge1xuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxLmJvZHk7XG4gICAgaWYgKCFyZXF1ZXN0Qm9keSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcHJveHlSZXEuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKTtcbiAgICBjb25zdCB3cml0ZUJvZHkgPSAoYm9keURhdGEpID0+IHtcbiAgICAgICAgLy8gZGVlcGNvZGUgaWdub3JlIENvbnRlbnRMZW5ndGhJbkNvZGU6IGJvZHlQYXJzZXIgZml4XG4gICAgICAgIHByb3h5UmVxLnNldEhlYWRlcignQ29udGVudC1MZW5ndGgnLCBCdWZmZXIuYnl0ZUxlbmd0aChib2R5RGF0YSkpO1xuICAgICAgICBwcm94eVJlcS53cml0ZShib2R5RGF0YSk7XG4gICAgfTtcbiAgICBpZiAoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgICB3cml0ZUJvZHkoSlNPTi5zdHJpbmdpZnkocmVxdWVzdEJvZHkpKTtcbiAgICB9XG4gICAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSkge1xuICAgICAgICB3cml0ZUJvZHkocXVlcnlzdHJpbmcuc3RyaW5naWZ5KHJlcXVlc3RCb2R5KSk7XG4gICAgfVxufVxuZXhwb3J0cy5maXhSZXF1ZXN0Qm9keSA9IGZpeFJlcXVlc3RCb2R5O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5maXhSZXF1ZXN0Qm9keSA9IGV4cG9ydHMucmVzcG9uc2VJbnRlcmNlcHRvciA9IHZvaWQgMDtcbnZhciByZXNwb25zZV9pbnRlcmNlcHRvcl8xID0gcmVxdWlyZShcIi4vcmVzcG9uc2UtaW50ZXJjZXB0b3JcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJyZXNwb25zZUludGVyY2VwdG9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNwb25zZV9pbnRlcmNlcHRvcl8xLnJlc3BvbnNlSW50ZXJjZXB0b3I7IH0gfSk7XG52YXIgZml4X3JlcXVlc3RfYm9keV8xID0gcmVxdWlyZShcIi4vZml4LXJlcXVlc3QtYm9keVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZpeFJlcXVlc3RCb2R5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBmaXhfcmVxdWVzdF9ib2R5XzEuZml4UmVxdWVzdEJvZHk7IH0gfSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9wdWJsaWNcIiksIGV4cG9ydHMpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZVByb3h5TWlkZGxld2FyZSA9IHZvaWQgMDtcbmNvbnN0IGh0dHBfcHJveHlfbWlkZGxld2FyZV8xID0gcmVxdWlyZShcIi4vaHR0cC1wcm94eS1taWRkbGV3YXJlXCIpO1xuZnVuY3Rpb24gY3JlYXRlUHJveHlNaWRkbGV3YXJlKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IG1pZGRsZXdhcmUgfSA9IG5ldyBodHRwX3Byb3h5X21pZGRsZXdhcmVfMS5IdHRwUHJveHlNaWRkbGV3YXJlKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtaWRkbGV3YXJlO1xufVxuZXhwb3J0cy5jcmVhdGVQcm94eU1pZGRsZXdhcmUgPSBjcmVhdGVQcm94eU1pZGRsZXdhcmU7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaGFuZGxlcnNcIiksIGV4cG9ydHMpO1xuIiwgIlxudmFyIFhNTF9DSEFSQUNURVJfTUFQID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyZhcG9zOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0Oydcbn07XG5cbmZ1bmN0aW9uIGVzY2FwZUZvclhNTChzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UoLyhbJlwiPD4nXSkvZywgZnVuY3Rpb24oc3RyLCBpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gWE1MX0NIQVJBQ1RFUl9NQVBbaXRlbV07XG4gICAgICAgICAgfSlcbiAgICAgICAgOiBzdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXNjYXBlRm9yWE1MO1xuIiwgInZhciBlc2NhcGVGb3JYTUwgPSByZXF1aXJlKCcuL2VzY2FwZUZvclhNTCcpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcblxudmFyIERFRkFVTFRfSU5ERU5UID0gJyAgICAnO1xuXG5mdW5jdGlvbiB4bWwoaW5wdXQsIG9wdGlvbnMpIHtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGluZGVudDogb3B0aW9uc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBzdHJlYW0gICAgICA9IG9wdGlvbnMuc3RyZWFtID8gbmV3IFN0cmVhbSgpIDogbnVsbCxcbiAgICAgICAgb3V0cHV0ICAgICAgPSBcIlwiLFxuICAgICAgICBpbnRlcnJ1cHRlZCA9IGZhbHNlLFxuICAgICAgICBpbmRlbnQgICAgICA9ICFvcHRpb25zLmluZGVudCA/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbnMuaW5kZW50ID09PSB0cnVlID8gREVGQVVMVF9JTkRFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbnMuaW5kZW50LFxuICAgICAgICBpbnN0YW50ICAgICA9IHRydWU7XG5cblxuICAgIGZ1bmN0aW9uIGRlbGF5IChmdW5jKSB7XG4gICAgICAgIGlmICghaW5zdGFudCkge1xuICAgICAgICAgICAgZnVuYygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGVuZCAoaW50ZXJydXB0LCBvdXQpIHtcbiAgICAgICAgaWYgKG91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gb3V0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnJ1cHQgJiYgIWludGVycnVwdGVkKSB7XG4gICAgICAgICAgICBzdHJlYW0gPSBzdHJlYW0gfHwgbmV3IFN0cmVhbSgpO1xuICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnJ1cHQgJiYgaW50ZXJydXB0ZWQpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gb3V0cHV0O1xuICAgICAgICAgICAgZGVsYXkoZnVuY3Rpb24gKCkgeyBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpIH0pO1xuICAgICAgICAgICAgb3V0cHV0ID0gXCJcIjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZCAodmFsdWUsIGxhc3QpIHtcbiAgICAgICAgZm9ybWF0KGFwcGVuZCwgcmVzb2x2ZSh2YWx1ZSwgaW5kZW50LCBpbmRlbnQgPyAxIDogMCksIGxhc3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgICAgaWYgKHN0cmVhbSkge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBvdXRwdXQ7XG4gICAgICAgICAgICBkZWxheShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgZGF0YSk7XG4gICAgICAgICAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgICAgICAgICAgICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIHN0cmVhbS5lbWl0KCdjbG9zZScpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRYbWxEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikge1xuICAgICAgICB2YXIgZW5jb2RpbmcgPSBkZWNsYXJhdGlvbi5lbmNvZGluZyB8fCAnVVRGLTgnLFxuICAgICAgICAgICAgYXR0ciA9ICB7IHZlcnNpb246ICcxLjAnLCBlbmNvZGluZzogZW5jb2RpbmcgfTtcblxuICAgICAgICBpZiAoZGVjbGFyYXRpb24uc3RhbmRhbG9uZSkge1xuICAgICAgICAgICAgYXR0ci5zdGFuZGFsb25lID0gZGVjbGFyYXRpb24uc3RhbmRhbG9uZVxuICAgICAgICB9XG5cbiAgICAgICAgYWRkKHsnP3htbCc6IHsgX2F0dHI6IGF0dHIgfSB9KTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoJy8+JywgJz8+Jyk7XG4gICAgfVxuXG4gICAgLy8gZGlzYWJsZSBkZWxheSBkZWxheWVkXG4gICAgZGVsYXkoZnVuY3Rpb24gKCkgeyBpbnN0YW50ID0gZmFsc2UgfSk7XG5cbiAgICBpZiAob3B0aW9ucy5kZWNsYXJhdGlvbikge1xuICAgICAgICBhZGRYbWxEZWNsYXJhdGlvbihvcHRpb25zLmRlY2xhcmF0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQgJiYgaW5wdXQuZm9yRWFjaCkge1xuICAgICAgICBpbnB1dC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgICAgICAgdmFyIGxhc3Q7XG4gICAgICAgICAgICBpZiAoaSArIDEgPT09IGlucHV0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICBsYXN0ID0gZW5kO1xuICAgICAgICAgICAgYWRkKHZhbHVlLCBsYXN0KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYWRkKGlucHV0LCBlbmQpO1xuICAgIH1cblxuICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLnJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuZnVuY3Rpb24gZWxlbWVudCAoLyppbnB1dCwgXHUyMDI2Ki8pIHtcbiAgICB2YXIgaW5wdXQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLFxuICAgICAgICBzZWxmID0ge1xuICAgICAgICAgICAgX2VsZW06ICByZXNvbHZlKGlucHV0KVxuICAgICAgICB9O1xuXG4gICAgc2VsZi5wdXNoID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5hcHBlbmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBhc3NpZ25lZCB0byBhIHBhcmVudCFcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5fZWxlbS5pbmRlbnQ7XG4gICAgICAgIGZvcm1hdCh0aGlzLmFwcGVuZCwgcmVzb2x2ZShcbiAgICAgICAgICAgIGlucHV0LCBpbmRlbnQsIHRoaXMuX2VsZW0uaWNvdW50ICsgKGluZGVudCA/IDEgOiAwKSksXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHRoYXQuYXBwZW5kKHRydWUpIH0pO1xuICAgIH07XG5cbiAgICBzZWxmLmNsb3NlID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVuZCkge1xuICAgICAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gc2VsZjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2luZGVudChjaGFyYWN0ZXIsIGNvdW50KSB7XG4gICAgcmV0dXJuIChuZXcgQXJyYXkoY291bnQgfHwgMCkuam9pbihjaGFyYWN0ZXIgfHwgJycpKVxufVxuXG5mdW5jdGlvbiByZXNvbHZlKGRhdGEsIGluZGVudCwgaW5kZW50X2NvdW50KSB7XG4gICAgaW5kZW50X2NvdW50ID0gaW5kZW50X2NvdW50IHx8IDA7XG4gICAgdmFyIGluZGVudF9zcGFjZXMgPSBjcmVhdGVfaW5kZW50KGluZGVudCwgaW5kZW50X2NvdW50KTtcbiAgICB2YXIgbmFtZTtcbiAgICB2YXIgdmFsdWVzID0gZGF0YTtcbiAgICB2YXIgaW50ZXJydXB0ID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgICAgIG5hbWUgPSBrZXlzWzBdO1xuICAgICAgICB2YWx1ZXMgPSBkYXRhW25hbWVdO1xuXG4gICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLl9lbGVtKSB7XG4gICAgICAgICAgICB2YWx1ZXMuX2VsZW0ubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB2YWx1ZXMuX2VsZW0uaWNvdW50ID0gaW5kZW50X2NvdW50O1xuICAgICAgICAgICAgdmFsdWVzLl9lbGVtLmluZGVudCA9IGluZGVudDtcbiAgICAgICAgICAgIHZhbHVlcy5fZWxlbS5pbmRlbnRzID0gaW5kZW50X3NwYWNlcztcbiAgICAgICAgICAgIHZhbHVlcy5fZWxlbS5pbnRlcnJ1cHQgPSB2YWx1ZXM7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzLl9lbGVtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBbXSxcbiAgICAgICAgY29udGVudCA9IFtdO1xuXG4gICAgdmFyIGlzU3RyaW5nQ29udGVudDtcblxuICAgIGZ1bmN0aW9uIGdldF9hdHRyaWJ1dGVzKG9iail7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKGtleSwgb2JqW2tleV0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3dpdGNoKHR5cGVvZiB2YWx1ZXMpIHtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgIGlmICh2YWx1ZXMgPT09IG51bGwpIGJyZWFrO1xuXG4gICAgICAgICAgICBpZiAodmFsdWVzLl9hdHRyKSB7XG4gICAgICAgICAgICAgICAgZ2V0X2F0dHJpYnV0ZXModmFsdWVzLl9hdHRyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlcy5fY2RhdGEpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICgnPCFbQ0RBVEFbJyArIHZhbHVlcy5fY2RhdGEpLnJlcGxhY2UoL1xcXVxcXT4vZywgJ11dXV0+PCFbQ0RBVEFbPicpICsgJ11dPidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWVzLmZvckVhY2gpIHtcbiAgICAgICAgICAgICAgICBpc1N0cmluZ0NvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goJycpO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IE9iamVjdC5rZXlzKHZhbHVlKVswXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lID09ICdfYXR0cicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYXR0cmlidXRlcyh2YWx1ZS5fYXR0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChyZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgaW5kZW50LCBpbmRlbnRfY291bnQgKyAxKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3N0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RyaW5nQ29udGVudD10cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wdXNoKGVzY2FwZUZvclhNTCh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzU3RyaW5nQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vc3RyaW5nXG4gICAgICAgICAgICBjb250ZW50LnB1c2goZXNjYXBlRm9yWE1MKHZhbHVlcykpO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogICAgICAgbmFtZSxcbiAgICAgICAgaW50ZXJydXB0OiAgaW50ZXJydXB0LFxuICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuICAgICAgICBjb250ZW50OiAgICBjb250ZW50LFxuICAgICAgICBpY291bnQ6ICAgICBpbmRlbnRfY291bnQsXG4gICAgICAgIGluZGVudHM6ICAgIGluZGVudF9zcGFjZXMsXG4gICAgICAgIGluZGVudDogICAgIGluZGVudFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdChhcHBlbmQsIGVsZW0sIGVuZCkge1xuXG4gICAgaWYgKHR5cGVvZiBlbGVtICE9ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBhcHBlbmQoZmFsc2UsIGVsZW0pO1xuICAgIH1cblxuICAgIHZhciBsZW4gPSBlbGVtLmludGVycnVwdCA/IDEgOiBlbGVtLmNvbnRlbnQubGVuZ3RoO1xuXG4gICAgZnVuY3Rpb24gcHJvY2VlZCAoKSB7XG4gICAgICAgIHdoaWxlIChlbGVtLmNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbGVtLmNvbnRlbnQuc2hpZnQoKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGludGVycnVwdCh2YWx1ZSkpIHJldHVybjtcblxuICAgICAgICAgICAgZm9ybWF0KGFwcGVuZCwgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwZW5kKGZhbHNlLCAobGVuID4gMSA/IGVsZW0uaW5kZW50cyA6ICcnKVxuICAgICAgICAgICAgKyAoZWxlbS5uYW1lID8gJzwvJyArIGVsZW0ubmFtZSArICc+JyA6ICcnKVxuICAgICAgICAgICAgKyAoZWxlbS5pbmRlbnQgJiYgIWVuZCA/ICdcXG4nIDogJycpKTtcblxuICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICBlbmQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludGVycnVwdCh2YWx1ZSkge1xuICAgICAgIGlmICh2YWx1ZS5pbnRlcnJ1cHQpIHtcbiAgICAgICAgICAgdmFsdWUuaW50ZXJydXB0LmFwcGVuZCA9IGFwcGVuZDtcbiAgICAgICAgICAgdmFsdWUuaW50ZXJydXB0LmVuZCA9IHByb2NlZWQ7XG4gICAgICAgICAgIHZhbHVlLmludGVycnVwdCA9IGZhbHNlO1xuICAgICAgICAgICBhcHBlbmQodHJ1ZSk7XG4gICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgIH1cbiAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXBwZW5kKGZhbHNlLCBlbGVtLmluZGVudHNcbiAgICAgICAgKyAoZWxlbS5uYW1lID8gJzwnICsgZWxlbS5uYW1lIDogJycpXG4gICAgICAgICsgKGVsZW0uYXR0cmlidXRlcy5sZW5ndGggPyAnICcgKyBlbGVtLmF0dHJpYnV0ZXMuam9pbignICcpIDogJycpXG4gICAgICAgICsgKGxlbiA/IChlbGVtLm5hbWUgPyAnPicgOiAnJykgOiAoZWxlbS5uYW1lID8gJy8+JyA6ICcnKSlcbiAgICAgICAgKyAoZWxlbS5pbmRlbnQgJiYgbGVuID4gMSA/ICdcXG4nIDogJycpKTtcblxuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHJldHVybiBhcHBlbmQoZmFsc2UsIGVsZW0uaW5kZW50ID8gJ1xcbicgOiAnJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnRlcnJ1cHQoZWxlbSkpIHtcbiAgICAgICAgcHJvY2VlZCgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYXR0cmlidXRlKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4ga2V5ICsgJz0nICsgJ1wiJyArIGVzY2FwZUZvclhNTCh2YWx1ZSkgKyAnXCInO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHhtbDtcbm1vZHVsZS5leHBvcnRzLmVsZW1lbnQgPSBtb2R1bGUuZXhwb3J0cy5FbGVtZW50ID0gZWxlbWVudDtcbiIsICJpbXBvcnQgeyBFZGl0b3IsIE1hcmtkb3duVmlldywgUGx1Z2luLCBNb2RhbCwgQXBwLCBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCBSZWFjdFBsYXllciBmcm9tICdyZWFjdC1wbGF5ZXIvbGF6eSdcclxuXHJcbmltcG9ydCB7IFZpZGVvVmlldywgVklERU9fVklFVyB9IGZyb20gJy4vdmlldy9WaWRlb1ZpZXcnO1xyXG5pbXBvcnQgeyBUaW1lc3RhbXBQbHVnaW5TZXR0aW5ncywgVGltZXN0YW1wUGx1Z2luU2V0dGluZ1RhYiwgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJ3NldHRpbmdzJztcclxuXHJcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSBcImh0dHBcIjtcclxuaW1wb3J0IHsgQWRkcmVzc0luZm8gfSBmcm9tIFwibm9kZTpuZXRcIjtcclxuaW1wb3J0IHsgc2VydmVyLCBzdGFydFNlcnZlciwgUE9SVCwgbG9jYWxWaWRlb1JlZGlyZWN0LCBzdWJ0aXRsZVJlZGlyZWN0IH0gZnJvbSBcImhhbmRsZXJzL3NlcnZlclwiO1xyXG5pbXBvcnQgeyBpc0xvY2FsRmlsZSwgY2xlYW5VcmwsIGlzU2FtZVZpZGVvIH0gZnJvbSBcImhhbmRsZXJzL21pc2NcIjtcclxuaW1wb3J0IHsgZ2V0QmlsaUluZm8sIGlzQmlsaVVybCB9IGZyb20gJ2hhbmRsZXJzL2JpbGliaWxpJztcclxuXHJcbmNvbnN0IEVSUk9SUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuXHRcIklOVkFMSURfVVJMXCI6IFwiXFxuPiBbIWVycm9yXSBJbnZhbGlkIFZpZGVvIFVSTFxcbj4gVGhlIGhpZ2hsaWdodGVkIGxpbmsgaXMgbm90IGEgdmFsaWQgdmlkZW8gdXJsLiBQbGVhc2UgdHJ5IGFnYWluIHdpdGggYSB2YWxpZCBsaW5rLlxcblwiLFxyXG5cdFwiTk9fQUNUSVZFX1ZJREVPXCI6IFwiXFxuPiBbIWNhdXRpb25dIFNlbGVjdCBWaWRlb1xcbj4gQSB2aWRlbyBuZWVkcyB0byBiZSBvcGVuZWQgYmVmb3JlIHVzaW5nIHRoaXMgaG90a2V5LlxcbiBIaWdobGlnaHQgeW91ciB2aWRlbyBsaW5rIGFuZCBpbnB1dCB5b3VyICdPcGVuIHZpZGVvIHBsYXllcicgaG90a2V5IHRvIHJlZ2lzdGVyIGEgdmlkZW8uXFxuXCIsXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVzdGFtcFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0c2V0dGluZ3M6IFRpbWVzdGFtcFBsdWdpblNldHRpbmdzO1xyXG5cdHBsYXllcjogUmVhY3RQbGF5ZXI7XHJcblx0c2V0UGxheWluZzogUmVhY3QuRGlzcGF0Y2g8UmVhY3QuU2V0U3RhdGVBY3Rpb248Ym9vbGVhbj4+O1xyXG5cdGVkaXRvcjogRWRpdG9yO1xyXG5cdHNlcnZlcjogaHR0cC5TZXJ2ZXI7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdC8vIFJlZ2lzdGVyIHZpZXdcclxuXHRcdHRoaXMucmVnaXN0ZXJWaWV3KFxyXG5cdFx0XHRWSURFT19WSUVXLFxyXG5cdFx0XHQobGVhZikgPT4gbmV3IFZpZGVvVmlldyhsZWFmKVxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBSZWdpc3RlciBzZXR0aW5nc1xyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHQvLyBTdGFydCBsb2NhbCBzZXJ2ZXJcclxuXHRcdGlmICghc2VydmVyKSBhd2FpdCBzdGFydFNlcnZlcih0aGlzLnNldHRpbmdzLnBvcnQpO1xyXG5cdFx0dGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XHJcblxyXG5cdFx0Ly8gTWFya2Rvd24gcHJvY2Vzc29yIHRoYXQgdHVybnMgdGltZXN0YW1wcyBpbnRvIGJ1dHRvbnNcclxuXHRcdHRoaXMucmVnaXN0ZXJNYXJrZG93bkNvZGVCbG9ja1Byb2Nlc3NvcihcInRpbWVzdGFtcFwiLCAoc291cmNlLCBlbCwgY3R4KSA9PiB7XHJcblx0XHRcdC8vIE1hdGNoIG1tOnNzIG9yIGhoOm1tOnNzIHRpbWVzdGFtcCBmb3JtYXRcclxuXHRcdFx0Y29uc3QgcmVnRXhwID0gL1xcZCs6XFxkKzpcXGQrfFxcZCs6XFxkKy9nO1xyXG5cdFx0XHRjb25zdCByb3dzID0gc291cmNlLnNwbGl0KFwiXFxuXCIpLmZpbHRlcigocm93KSA9PiByb3cubGVuZ3RoID4gMCk7XHJcblx0XHRcdHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgbWF0Y2ggPSByb3cubWF0Y2gocmVnRXhwKTtcclxuXHRcdFx0XHRpZiAobWF0Y2gpIHtcclxuXHRcdFx0XHRcdC8vY3JlYXRlIGJ1dHRvbiBmb3IgZWFjaCB0aW1lc3RhbXBcclxuXHRcdFx0XHRcdGNvbnN0IGRpdiA9IGVsLmNyZWF0ZUVsKFwiZGl2XCIpO1xyXG5cdFx0XHRcdFx0Y29uc3QgYnV0dG9uID0gZGl2LmNyZWF0ZUVsKFwiYnV0dG9uXCIpO1xyXG5cdFx0XHRcdFx0YnV0dG9uLmlubmVyVGV4dCA9IG1hdGNoWzBdO1xyXG5cdFx0XHRcdFx0YnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2V0dGluZ3MudGltZXN0YW1wQ29sb3I7XHJcblx0XHRcdFx0XHRidXR0b24uc3R5bGUuY29sb3IgPSB0aGlzLnNldHRpbmdzLnRpbWVzdGFtcFRleHRDb2xvcjtcclxuXHJcblx0XHRcdFx0XHQvLyBjb252ZXJ0IHRpbWVzdGFtcCB0byBzZWNvbmRzIGFuZCBzZWVrIHRvIHRoYXQgcG9zaXRpb24gd2hlbiBjbGlja2VkXHJcblx0XHRcdFx0XHRidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgdGltZUFyciA9IG1hdGNoWzBdLnNwbGl0KFwiOlwiKS5tYXAoKHYpID0+IHBhcnNlSW50KHYpKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgW2hoLCBtbSwgc3NdID0gdGltZUFyci5sZW5ndGggPT09IDIgPyBbMCwgLi4udGltZUFycl0gOiB0aW1lQXJyO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzZWNvbmRzID0gKGhoIHx8IDApICogMzYwMCArIChtbSB8fCAwKSAqIDYwICsgKHNzIHx8IDApO1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5wbGF5ZXIpIHRoaXMucGxheWVyLnNlZWtUbyhzZWNvbmRzKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0ZGl2LmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0fSk7XHJcblxyXG5cclxuXHRcdC8vIE1hcmtkb3duIHByb2Nlc3NvciB0aGF0IHR1cm5zIHZpZGVvIHVybHMgaW50byBidXR0b25zIHRvIG9wZW4gdmlld3Mgb2YgdGhlIHZpZGVvXHJcblx0XHR0aGlzLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IoXCJ0aW1lc3RhbXAtdXJsXCIsIChzb3VyY2UsIGVsLCBjdHgpID0+IHtcclxuXHRcdFx0Y29uc3QgdXJsID0gc291cmNlLnRyaW0oKTtcclxuXHRcdFx0Ly8gQ3JlYXRlcyBidXR0b24gZm9yIHZpZGVvIHVybFxyXG5cdFx0XHRjb25zdCBkaXYgPSBlbC5jcmVhdGVFbChcImRpdlwiKTtcclxuXHRcdFx0Y29uc3QgYnV0dG9uID0gZGl2LmNyZWF0ZUVsKFwiYnV0dG9uXCIpO1xyXG5cdFx0XHRidXR0b24uaW5uZXJUZXh0ID0gdXJsO1xyXG5cdFx0XHRidXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJHUkFZXCI7XHJcblx0XHRcdGJ1dHRvbi5zdHlsZS5jb2xvciA9IHRoaXMuc2V0dGluZ3MudXJsVGV4dENvbG9yO1xyXG5cdFx0XHRpZiAoaXNMb2NhbEZpbGUodXJsKSB8fCBSZWFjdFBsYXllci5jYW5QbGF5KHVybCkgfHwgaXNCaWxpVXJsKHVybCkpIHtcclxuXHRcdFx0YnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2V0dGluZ3MudXJsQ29sb3I7XHJcblx0XHRcdFxyXG5cdFx0XHRidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuXHRcdFx0XHRpZiAoaXNTYW1lVmlkZW8odGhpcy5wbGF5ZXIsIHVybCkpIHtcdFxyXG5cdFx0XHRcdFx0dGhpcy5wbGF5ZXI/LnNlZWtUbygwKTtcclxuXHRcdFx0XHQgIH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLmFjdGl2YXRlVmlldyh1cmwsIHRoaXMuZWRpdG9yKTtcclxuXHRcdFx0XHQgIH1cdFx0XHRcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAodGhpcy5lZGl0b3IpIHtcclxuXHRcdFx0XHRcdHRoaXMuZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5lZGl0b3IuZ2V0U2VsZWN0aW9uKCkgKyBcIlxcblwiICsgRVJST1JTW1wiSU5WQUxJRF9VUkxcIl0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gQ29tbWFuZCB0aGF0IGdldHMgc2VsZWN0ZWQgdmlkZW8gbGluayBhbmQgc2VuZHMgaXQgdG8gdmlldyB3aGljaCBwYXNzZXMgaXQgdG8gUmVhY3QgY29tcG9uZW50XHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ3RyaWdnZXItcGxheWVyJyxcclxuXHRcdFx0bmFtZTogJ09wZW4gdmlkZW8gcGxheWVyIChjb3B5IHZpZGVvIHVybCBhbmQgdXNlIGhvdGtleSknLFxyXG5cdFx0XHRlZGl0b3JDYWxsYmFjazogYXN5bmMgKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpID0+IHtcclxuXHRcdFx0XHQvLyBHZXQgc2VsZWN0ZWQgdGV4dCBvciBjbGlwYm9hcmQgY29udGVudCBhbmQgbWF0Y2ggYWdhaW5zdCB2aWRlbyB1cmwgdG8gY29udmVydCBsaW5rIHRvIHZpZGVvIHZpZGVvIGlkXHJcblx0XHRcdFx0Y29uc3QgdXJsID0gZWRpdG9yLmdldFNlbGVjdGlvbigpLnRyaW0oKSB8fCAoYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpKS50cmltKCk7XHJcblxyXG5cdFx0XHRcdC8vIEFjdGl2YXRlIHRoZSB2aWV3IHdpdGggdGhlIHZhbGlkIGxpbmtcclxuXHRcdFx0XHRpZiAoaXNMb2NhbEZpbGUodXJsKSB8fCBSZWFjdFBsYXllci5jYW5QbGF5KHVybCkgfHwgaXNCaWxpVXJsKHVybCkpIHtcclxuXHRcdFx0XHRcdHRoaXMuYWN0aXZhdGVWaWV3KHVybCwgZWRpdG9yKTtcclxuXHRcdFx0XHRcdHRoaXMuc2V0dGluZ3Mubm90ZVRpdGxlID9cclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXCJcXG5cIiArIHRoaXMuc2V0dGluZ3Mubm90ZVRpdGxlICsgXCJcXG5cIiArIFwiYGBgdGltZXN0YW1wLXVybCBcXG4gXCIgKyB1cmwgKyBcIlxcbiBgYGBcXG5cIikgOlxyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcImBgYHRpbWVzdGFtcC11cmwgXFxuIFwiICsgdXJsICsgXCJcXG4gYGBgXFxuXCIpXHJcblx0XHRcdFx0XHR0aGlzLmVkaXRvciA9IGVkaXRvcjtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oRVJST1JTW1wiSU5WQUxJRF9VUkxcIl0pXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoZWRpdG9yLmdldEN1cnNvcigpLmxpbmUgKyAxKVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBUaGlzIGNvbW1hbmQgaW5zZXJ0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBwbGF5aW5nIHZpZGVvIGludG8gdGhlIGVkaXRvclxyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6ICd0aW1lc3RhbXAtaW5zZXJ0JyxcclxuXHRcdFx0bmFtZTogJ0luc2VydCB0aW1lc3RhbXAgYmFzZWQgb24gdmlkZW9zIGN1cnJlbnQgcGxheSB0aW1lJyxcclxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLnBsYXllcikge1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oRVJST1JTW1wiTk9fQUNUSVZFX1ZJREVPXCJdKVxyXG5cdFx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBjb252ZXJ0IGN1cnJlbnQgdmlkZW8gdGltZSBpbnRvIHRpbWVzdGFtcFxyXG5cdFx0XHRcdGNvbnN0IGxlYWRpbmdaZXJvID0gKG51bTogbnVtYmVyKSA9PiBudW0gPCAxMCA/IFwiMFwiICsgbnVtLnRvRml4ZWQoMCkgOiBudW0udG9GaXhlZCgwKTtcclxuXHRcdFx0XHRjb25zdCB0b3RhbFNlY29uZHMgPSBOdW1iZXIodGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKS50b0ZpeGVkKDIpKTtcclxuXHRcdFx0XHRjb25zdCBob3VycyA9IE1hdGguZmxvb3IodG90YWxTZWNvbmRzIC8gMzYwMCk7XHJcblx0XHRcdFx0Y29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHRvdGFsU2Vjb25kcyAtIChob3VycyAqIDM2MDApKSAvIDYwKTtcclxuXHRcdFx0XHRjb25zdCBzZWNvbmRzID0gdG90YWxTZWNvbmRzIC0gKGhvdXJzICogMzYwMCkgLSAobWludXRlcyAqIDYwKTtcclxuXHRcdFx0XHRjb25zdCB0aW1lID0gKGhvdXJzID4gMCA/IGxlYWRpbmdaZXJvKGhvdXJzKSArIFwiOlwiIDogXCJcIikgKyBsZWFkaW5nWmVybyhtaW51dGVzKSArIFwiOlwiICsgbGVhZGluZ1plcm8oc2Vjb25kcyk7XHJcblxyXG5cdFx0XHRcdC8vIGluc2VydCB0aW1lc3RhbXAgaW50byBlZGl0b3JcclxuXHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcImBgYHRpbWVzdGFtcCBcXG4gXCIgKyB0aW1lICsgXCJcXG4gYGBgXFxuXCIpXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vQ29tbWFuZCB0aGF0IHBsYXkvcGF1c2VzIHRoZSB2aWRlb1xyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6ICdwYXVzZS1wbGF5ZXInLFxyXG5cdFx0XHRuYW1lOiAnUGF1c2UgcGxheWVyJyxcclxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XHJcblx0XHRcdFx0dGhpcy5zZXRQbGF5aW5nKCF0aGlzLnBsYXllci5wcm9wcy5wbGF5aW5nKVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBTZWVrIGZvcndhcmQgYnkgc2V0IGFtb3VudCBvZiBzZWNvbmRzXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ3NlZWstZm9yd2FyZCcsXHJcblx0XHRcdG5hbWU6ICdTZWVrIEZvcndhcmQnLFxyXG5cdFx0XHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpID0+IHtcclxuXHRcdFx0XHRpZiAodGhpcy5wbGF5ZXIpIHRoaXMucGxheWVyLnNlZWtUbyh0aGlzLnBsYXllci5nZXRDdXJyZW50VGltZSgpICsgcGFyc2VJbnQodGhpcy5zZXR0aW5ncy5mb3J3YXJkU2VlaykpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBTZWVrIGJhY2t3YXJkcyBieSBzZXQgYW1vdW50IG9mIHNlY29uZHNcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAnc2Vlay1iYWNrd2FyZCcsXHJcblx0XHRcdG5hbWU6ICdTZWVrIEJhY2t3YXJkJyxcclxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XHJcblx0XHRcdFx0aWYgKHRoaXMucGxheWVyKSB0aGlzLnBsYXllci5zZWVrVG8odGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKSAtIHBhcnNlSW50KHRoaXMuc2V0dGluZ3MuYmFja3dhcmRzU2VlaykpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyAvLyBUaGlzIGFkZHMgYSBjb21wbGV4IGNvbW1hbmQgdGhhdCBjYW4gY2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwIGFsbG93cyBleGVjdXRpb24gb2YgdGhlIGNvbW1hbmRcclxuXHRcdC8vIHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHQvLyBcdGlkOiAnb3Blbi1zYW1wbGUtbW9kYWwtY29tcGxleCcsXHJcblx0XHQvLyBcdG5hbWU6ICdPcGVuIHNhbXBsZSBtb2RhbCAoY29tcGxleCknLFxyXG5cdFx0Ly8gXHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpID0+IHtcclxuXHRcdC8vIFx0XHR0aGlzLmVkaXRvciA9IGVkaXRvcjtcclxuXHRcdC8vIFx0XHRuZXcgU2FtcGxlTW9kYWwodGhpcy5hcHAsIHRoaXMuYWN0aXZhdGVWaWV3LmJpbmQodGhpcyksIGVkaXRvcikub3BlbigpO1xyXG5cdFx0Ly8gXHRcdC8vIFRoaXMgY29tbWFuZCB3aWxsIG9ubHkgc2hvdyB1cCBpbiBDb21tYW5kIFBhbGV0dGUgd2hlbiB0aGUgY2hlY2sgZnVuY3Rpb24gcmV0dXJucyB0cnVlXHJcblx0XHQvLyBcdFx0cmV0dXJuIHRydWU7XHJcblx0XHQvLyBcdH1cclxuXHRcdC8vIH0pO1xyXG5cclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiBcImFkZC1sb2NhbC1tZWRpYVwiLFxyXG5cdFx0XHRuYW1lOiBcIk9wZW4gTG9jYWwgTWVkaWFcIixcclxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcblx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImZpbGVcIik7XHJcblx0XHRcdFx0aW5wdXQuYWNjZXB0ID0gXCJ2aWRlby8qLCBhdWRpby8qLCAubXBkLCAuZmx2XCI7XHJcblx0XHRcdFx0aW5wdXQub25jaGFuZ2UgPSAoZTogYW55KSA9PiB7XHJcblx0XHRcdFx0ICB2YXIgdXJsID0gZS50YXJnZXQuZmlsZXNbMF0ucGF0aC50cmltKCk7XHJcblx0XHRcdFx0ICB0aGlzLmFjdGl2YXRlVmlldyh1cmwsIHRoaXMuZWRpdG9yKTtcclxuXHRcdFx0XHQgIGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKFwiXFxuXCIgKyBcImBgYHRpbWVzdGFtcC11cmwgXFxuIFwiICsgdXJsICsgXCJcXG4gYGBgXFxuXCIpO1xyXG5cdFx0XHRcdH07XHQgIFxyXG5cdFx0XHQgIGlucHV0LmNsaWNrKCk7XHJcblx0XHRcdH0sXHJcblx0XHQgIH0pO1xyXG5cclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiBcImFkZC1zdWJ0aXRsZXNcIixcclxuXHRcdFx0bmFtZTogXCJBZGQgc3VidGl0bGUgZmlsZVwiLFxyXG5cdFx0XHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcclxuXHRcdFx0XHRpbnB1dC50eXBlID0gXCJmaWxlXCI7XHJcblx0XHRcdFx0aW5wdXQuYWNjZXB0ID0gXCIuc3J0LC52dHRcIjtcclxuXHRcdFx0XHRpbnB1dC5vbmNoYW5nZSA9IChlOiBhbnkpID0+IHtcclxuXHRcdFx0XHR2YXIgZmlsZXMgPSBlLnRhcmdldC5maWxlcztcclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHR2YXIgZmlsZSA9IGZpbGVzW2ldO1xyXG5cdFx0XHRcdFx0dmFyIHRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyYWNrXCIpO1xyXG5cdFx0XHRcdFx0dHJhY2sua2luZCA9IFwic3VidGl0bGVzXCI7XHJcblx0XHRcdFx0XHR0cmFjay5sYWJlbCA9IGZpbGUubmFtZTtcclxuXHRcdFx0XHRcdHRyYWNrLnNyYyA9IHN1YnRpdGxlUmVkaXJlY3QoZmlsZS5wYXRoKTtcclxuXHRcdFx0XHRcdC8vIHRyYWNrLm1vZGUgPSBpID09IGZpbGVzLmxlbmd0aCAtIDEgPyBcInNob3dpbmdcIiA6IFwiaGlkZGVuXCI7XHJcblx0XHRcdFx0XHR0aGlzLnBsYXllci5nZXRJbnRlcm5hbFBsYXllcigpLmFwcGVuZENoaWxkKHRyYWNrKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0fTtcclxuXHRcdFxyXG5cdFx0XHRcdGlucHV0LmNsaWNrKCk7XHJcblx0XHRcdH0sXHJcblx0XHR9KTtcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiBcInZpZGVvLXNuYXBzaG90XCIsXHJcblx0XHRcdG5hbWU6IFwiVGFrZSBhbmQgY29weSB0byBjbGlwYm9hcmQgc25hcHNob3QgZnJvbSB2aWRlb1wiLFxyXG5cdFx0XHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHQgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pbGtrYW8vY2FwdHVyZS12aWRlby1mcmFtZS9ibG9iL21hc3Rlci9jYXB0dXJlLXZpZGVvLWZyYW1lLmpzXHJcblx0XHRcdCAgaWYgKCF0aGlzLnBsYXllcikgcmV0dXJuO1xyXG5cdFx0XHQgIHZhciB2aWRlbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ2aWRlb1wiKTtcdCAgXHQgIFxyXG5cdFx0XHQgIGlmICghdmlkZW8gfHwgdmlkZW8udmlkZW9IZWlnaHQ9PTAgfHwgdmlkZW8udmlkZW9XaWR0aD09MCkge1xyXG5cdFx0XHRcdHJldHVybiBuZXcgTm90aWNlKFwiQ3VycmVudCBwbGF5ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGFraW5nIHNuYXBzaG90IVwiKTtcclxuXHRcdFx0ICB9XHJcblx0ICBcclxuXHRcdFx0ICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuXHQgIFxyXG5cdFx0XHQgIGNhbnZhcy53aWR0aCA9IHZpZGVvLnZpZGVvV2lkdGg7XHJcblx0XHRcdCAgY2FudmFzLmhlaWdodCA9IHZpZGVvLnZpZGVvSGVpZ2h0O1xyXG5cdCAgXHJcblx0XHRcdCAgY2FudmFzLmdldENvbnRleHQoXCIyZFwiKS5kcmF3SW1hZ2UodmlkZW8sIDAsIDApO1xyXG5cdFx0XHQgIFxyXG5cdFx0XHQgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS82MDQwMTEzMFxyXG5cdFx0XHQgIGNhbnZhcy50b0Jsb2IoYXN5bmMgKGJsb2IpID0+IHtcclxuXHRcdFx0XHRuYXZpZ2F0b3IuY2xpcGJvYXJkXHJcblx0XHRcdFx0ICAud3JpdGUoW1xyXG5cdFx0XHRcdFx0bmV3IENsaXBib2FyZEl0ZW0oe1xyXG5cdFx0XHRcdFx0ICBbYmxvYi50eXBlXTogYmxvYixcclxuXHRcdFx0XHRcdH0pLFxyXG5cdFx0XHRcdCAgXSlcclxuXHRcdFx0XHQgIC50aGVuKGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdC8vIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwicGFzdGVcIik7XHJcblx0XHRcdFx0XHRuZXcgTm90aWNlKFwiU25hcHNob3QgY29waWVkIHRvIGNsaXBib2FyZCFcIik7XHJcblx0XHRcdFx0ICB9KTtcclxuXHRcdFx0ICB9KTtcclxuXHRcdFx0fSxcclxuXHRcdCAgfSk7XHJcblx0ICBcclxuXHJcblx0XHQvLyBUaGlzIGFkZHMgYSBzZXR0aW5ncyB0YWIgc28gdGhlIHVzZXIgY2FuIGNvbmZpZ3VyZSB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIHBsdWdpblxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBUaW1lc3RhbXBQbHVnaW5TZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBvbnVubG9hZCgpIHtcclxuXHRcdHRoaXMucGxheWVyID0gbnVsbDtcclxuXHRcdHRoaXMuZWRpdG9yID0gbnVsbDtcclxuXHRcdHRoaXMuc2V0UGxheWluZyA9IG51bGw7XHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2UuZGV0YWNoTGVhdmVzT2ZUeXBlKFZJREVPX1ZJRVcpO1xyXG5cdFx0dGhpcy5zZXJ2ZXIuY2xvc2UoKTtcclxuXHR9XHJcblxyXG5cdC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSB2YWxpZCB1cmwgaXMgZm91bmQgPT4gaXQgYWN0aXZhdGVzIHRoZSBWaWV3IHdoaWNoIGxvYWRzIHRoZSBSZWFjdCB2aWV3XHJcblx0YXN5bmMgYWN0aXZhdGVWaWV3KHVybDogc3RyaW5nLCBlZGl0b3I6IEVkaXRvcikge1xyXG5cdFx0dGhpcy5hcHAud29ya3NwYWNlLmRldGFjaExlYXZlc09mVHlwZShWSURFT19WSUVXKTtcclxuXHJcblx0XHRhd2FpdCB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0UmlnaHRMZWFmKGZhbHNlKS5zZXRWaWV3U3RhdGUoe1xyXG5cdFx0XHR0eXBlOiBWSURFT19WSUVXLFxyXG5cdFx0XHRhY3RpdmU6IHRydWUsXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2UucmV2ZWFsTGVhZihcclxuXHRcdFx0dGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWSURFT19WSUVXKVswXVxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBUaGlzIHRyaWdnZXJzIHRoZSBSZWFjdCBjb21wb25lbnQgdG8gYmUgbG9hZGVkXHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZJREVPX1ZJRVcpLmZvckVhY2goYXN5bmMgKGxlYWYpID0+IHtcclxuXHRcdFx0aWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIFZpZGVvVmlldykge1xyXG5cclxuXHRcdFx0XHR2YXIgbG9jYWxob3N0X3VybDogc3RyaW5nO1xyXG5cdFx0XHRcdHZhciBzdWJ0aXRsZXM6IGFueVtdID0gW107XHJcblxyXG5cdFx0XHRcdGlmIChpc0xvY2FsRmlsZSh1cmwpKSB7IFxyXG5cdFx0XHRcdFx0bG9jYWxob3N0X3VybCA9IGxvY2FsVmlkZW9SZWRpcmVjdCh1cmwpOyBcclxuXHRcdFx0XHRcdHVybCA9IHVybC50b1N0cmluZygpLnJlcGxhY2UoL15cXFwiKC4rKVxcXCIkLywgXCIkMVwiKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmIChpc0JpbGlVcmwodXJsKSkge1xyXG5cdFx0XHRcdFx0dmFyIGJpbGlfaW5mbyA9IGF3YWl0IGdldEJpbGlJbmZvKHVybCk7XHJcblx0XHRcdFx0XHRsb2NhbGhvc3RfdXJsID0gYmlsaV9pbmZvLnVybDtcclxuXHRcdFx0XHRcdHN1YnRpdGxlcyA9IGJpbGlfaW5mby5zdWJ0aXRsZXM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGVsc2V7XHJcblx0XHRcdFx0XHR1cmwgPSBjbGVhblVybCh1cmwpXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBzZXR1cFBsYXllciA9IChwbGF5ZXI6IFJlYWN0UGxheWVyLCBzZXRQbGF5aW5nOiBSZWFjdC5EaXNwYXRjaDxSZWFjdC5TZXRTdGF0ZUFjdGlvbjxib29sZWFuPj4pID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGxheWVyID0gcGxheWVyO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRQbGF5aW5nID0gc2V0UGxheWluZztcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNldHVwRXJyb3IgPSAoZXJyOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKGVkaXRvci5nZXRTZWxlY3Rpb24oKSArIGBcXG4+IFshZXJyb3JdIFN0cmVhbWluZyBFcnJvciBcXG4+ICR7ZXJyfVxcbmApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3Qgc2F2ZVRpbWVPblVubG9hZCA9IGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnBsYXllcikge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldHRpbmdzLnVybFN0YXJ0VGltZU1hcC5zZXQodXJsLCBOdW1iZXIodGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKS50b0ZpeGVkKDApKSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRcclxuXHJcblx0XHRcdFx0Ly8gY3JlYXRlIGEgbmV3IHZpZGVvIGluc3RhbmNlLCBzZXRzIHVwIHN0YXRlL3VubG9hZCBmdW5jdGlvbmFsaXR5LCBhbmQgcGFzc2VzIGluIGEgc3RhcnQgdGltZSBpZiBhdmFpbGFibGUgZWxzZSAwXHJcblx0XHRcdFx0bGVhZi5zZXRFcGhlbWVyYWxTdGF0ZSh7XHJcblx0XHRcdFx0XHR1cmw6IGxvY2FsaG9zdF91cmwgfHwgdXJsLFxyXG5cdFx0XHRcdFx0bWFpbl91cmw6IGxvY2FsaG9zdF91cmwgPyB1cmwgOiBudWxsLFxyXG5cdFx0XHRcdFx0c2V0dXBQbGF5ZXIsXHJcblx0XHRcdFx0XHRzZXR1cEVycm9yLFxyXG5cdFx0XHRcdFx0c2F2ZVRpbWVPblVubG9hZCxcclxuXHRcdFx0XHRcdHN0YXJ0OiB0aGlzLnNldHRpbmdzLnN0YXJ0QXRMYXN0UG9zaXRpb24gPyB+fnRoaXMuc2V0dGluZ3MudXJsU3RhcnRUaW1lTWFwLmdldCh1cmwpIDogMCxcclxuXHRcdFx0XHRcdHN1YnRpdGxlczogc3VidGl0bGVzLFxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcclxuXHRcdC8vIEZpeCBmb3IgYSB3ZWlyZCBidWcgdGhhdCB0dXJucyBkZWZhdWx0IG1hcCBpbnRvIGEgbm9ybWFsIG9iamVjdCB3aGVuIGxvYWRlZFxyXG5cdFx0Y29uc3QgZGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKVxyXG5cdFx0aWYgKGRhdGEpIHtcclxuXHRcdFx0Y29uc3QgbWFwID0gbmV3IE1hcChPYmplY3Qua2V5cyhkYXRhLnVybFN0YXJ0VGltZU1hcCkubWFwKGsgPT4gW2ssIGRhdGEudXJsU3RhcnRUaW1lTWFwW2tdXSkpXHJcblx0XHRcdHRoaXMuc2V0dGluZ3MgPSB7IC4uLkRFRkFVTFRfU0VUVElOR1MsIC4uLmRhdGEsIHVybFN0YXJ0VGltZU1hcDogbWFwIH07XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG59XHJcblxyXG4vLyBjbGFzcyBTYW1wbGVNb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuLy8gXHRlZGl0b3I6IEVkaXRvcjtcclxuLy8gXHRhY3RpdmF0ZVZpZXc6ICh1cmw6IHN0cmluZywgZWRpdG9yOiBFZGl0b3IpID0+IHZvaWQ7XHJcbi8vIFx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIGFjdGl2YXRlVmlldzogKHVybDogc3RyaW5nLCBlZGl0b3I6IEVkaXRvcikgPT4gdm9pZCwgZWRpdG9yOiBFZGl0b3IpIHtcclxuLy8gXHRcdHN1cGVyKGFwcCk7XHJcbi8vIFx0XHR0aGlzLmFjdGl2YXRlVmlldyA9IGFjdGl2YXRlVmlldztcclxuLy8gXHRcdHRoaXMuZWRpdG9yID0gZWRpdG9yO1xyXG4vLyBcdH1cclxuXHJcbi8vIFx0b25PcGVuKCkge1xyXG4vLyBcdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcbi8vIFx0XHQvLyBhZGQgYW4gaW5wdXQgZmllbGQgdG8gY29udGVudEVsXHJcblxyXG4vLyBcdFx0Y29uc3QgaW5wdXQgPSBjb250ZW50RWwuY3JlYXRlRWwoJ2lucHV0Jyk7XHJcbi8vIFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZmlsZVwiKTtcclxuLy8gXHRcdGlucHV0Lm9uY2hhbmdlID0gKGU6IGFueSkgPT4ge1xyXG4vLyBcdFx0XHQvLyBhY2NlcHQgbG9jYWwgdmlkZW8gaW5wdXQgYW5kIG1ha2UgYSB1cmwgZnJvbSBpbnB1dFxyXG4vLyBcdFx0XHRjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGUudGFyZ2V0LmZpbGVzWzBdKTtcclxuLy8gXHRcdFx0dGhpcy5hY3RpdmF0ZVZpZXcodXJsLCB0aGlzLmVkaXRvcik7XHJcblxyXG4vLyBcdFx0XHQvLyBDYW4ndCBnZXQgdGhlIGJ1dHRvbnMgdG8gd29yayB3aXRoIGxvY2FsIHZpZGVvcyB1bmZvcnR1bmF0ZWx5XHJcbi8vIFx0XHRcdC8vIHRoaXMuZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXCJcXG5cIiArIFwiYGBgdGltZXN0YW1wLXVybCBcXG4gXCIgKyB1cmwudHJpbSgpICsgXCJcXG4gYGBgXFxuXCIpXHJcbi8vIFx0XHRcdHRoaXMuY2xvc2UoKTtcclxuLy8gXHRcdH1cclxuLy8gXHR9XHJcblxyXG4vLyBcdG9uQ2xvc2UoKSB7XHJcbi8vIFx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuLy8gXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG4vLyBcdH1cclxuLy8gfVxyXG4iLCAiaW1wb3J0IHsgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XHJcbmltcG9ydCB7IGNyZWF0ZVJvb3QsIFJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcclxuXHJcbmltcG9ydCB7IFZpZGVvQ29udGFpbmVyLCBWaWRlb0NvbnRhaW5lclByb3BzIH0gZnJvbSBcIi4vVmlkZW9Db250YWluZXJcIlxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBWaWRlb1ZpZXdQcm9wcyBleHRlbmRzIFZpZGVvQ29udGFpbmVyUHJvcHMge1xyXG5cdHNhdmVUaW1lT25VbmxvYWQ6ICgpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBWSURFT19WSUVXID0gXCJ2aWRlby12aWV3XCI7XHJcbmV4cG9ydCBjbGFzcyBWaWRlb1ZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XHJcblx0Y29tcG9uZW50OiBSZWFjdERPTS5SZW5kZXJlclxyXG5cdHNhdmVUaW1lT25VbmxvYWQ6ICgpID0+IHZvaWRcclxuXHRyb290OiBSb290XHJcblx0Y29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZikge1xyXG5cdFx0c3VwZXIobGVhZik7XHJcblx0XHR0aGlzLnNhdmVUaW1lT25VbmxvYWQgPSAoKSA9PiB7IH07XHJcblx0XHR0aGlzLnJvb3QgPSBjcmVhdGVSb290KHRoaXMuY29udGFpbmVyRWwuY2hpbGRyZW5bMV0pXHJcblx0fVxyXG5cclxuXHRnZXRWaWV3VHlwZSgpIHtcclxuXHRcdHJldHVybiBWSURFT19WSUVXO1xyXG5cdH1cclxuXHJcblx0Z2V0RGlzcGxheVRleHQoKSB7XHJcblx0XHRyZXR1cm4gXCJUaW1lc3RhbXAgVmlkZW9cIjtcclxuXHR9XHJcblxyXG5cdGdldEljb24oKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBcInZpZGVvXCI7XHJcblx0fVxyXG5cclxuXHRzZXRFcGhlbWVyYWxTdGF0ZSh7IHVybCwgbWFpbl91cmwsIHNldHVwUGxheWVyLCBzZXR1cEVycm9yLCBzYXZlVGltZU9uVW5sb2FkLCBzdGFydCAsIHN1YnRpdGxlcyB9OiBWaWRlb1ZpZXdQcm9wcykge1xyXG5cclxuXHRcdC8vIEFsbG93cyB2aWV3IHRvIHNhdmUgdGhlIHBsYXliYWNrIHRpbWUgaW4gdGhlIHNldHRpbmcgc3RhdGUgd2hlbiB0aGUgdmlldyBpcyBjbG9zZWQgXHJcblx0XHR0aGlzLnNhdmVUaW1lT25VbmxvYWQgPSBzYXZlVGltZU9uVW5sb2FkO1xyXG5cclxuXHRcdC8vIENyZWF0ZSBhIHJvb3QgZWxlbWVudCBmb3IgdGhlIHZpZXcgdG8gcmVuZGVyIGludG9cclxuXHRcdHRoaXMucm9vdC5yZW5kZXIoXHJcblx0XHRcdDxWaWRlb0NvbnRhaW5lclxyXG5cdFx0XHRcdHVybD17dXJsfVxyXG5cdFx0XHRcdG1haW5fdXJsPXttYWluX3VybH1cclxuXHRcdFx0XHRzdGFydD17c3RhcnR9XHJcblx0XHRcdFx0c2V0dXBQbGF5ZXI9e3NldHVwUGxheWVyfVxyXG5cdFx0XHRcdHNldHVwRXJyb3I9e3NldHVwRXJyb3J9XHJcblx0XHRcdFx0c3VidGl0bGVzPXtzdWJ0aXRsZXN9XHJcblx0XHRcdC8+XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25DbG9zZSgpIHtcclxuXHRcdGlmICh0aGlzLnNhdmVUaW1lT25VbmxvYWQpIGF3YWl0IHRoaXMuc2F2ZVRpbWVPblVubG9hZCgpO1xyXG5cdFx0dGhpcy5yb290LnVubW91bnQoKVxyXG5cdFx0UmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0aGlzLmNvbnRhaW5lckVsLmNoaWxkcmVuWzFdKTtcclxuXHR9XHJcbn1cclxuIiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuaW1wb3J0IFJlYWN0UGxheWVyIGZyb20gJ3JlYWN0LXBsYXllci9sYXp5J1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9Db250YWluZXJQcm9wcyB7XHJcblx0dXJsOiBzdHJpbmc7XHJcblx0bWFpbl91cmw6IHN0cmluZztcclxuXHRzdGFydDogbnVtYmVyXHJcblx0c2V0dXBQbGF5ZXI6IChwbGF5ZXI6IFJlYWN0UGxheWVyLCBzZXRQbGF5aW5nOiBSZWFjdC5EaXNwYXRjaDxSZWFjdC5TZXRTdGF0ZUFjdGlvbjxib29sZWFuPj4pID0+IHZvaWQ7XHJcblx0c2V0dXBFcnJvcjogKGVycjogc3RyaW5nKSA9PiB2b2lkO1xyXG5cdHN1YnRpdGxlczogYW55W107XHJcblxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgVmlkZW9Db250YWluZXIgPSAoeyB1cmwsIG1haW5fdXJsLCBzZXR1cFBsYXllciwgc3RhcnQsIHNldHVwRXJyb3IsIHN1YnRpdGxlcyB9OiBWaWRlb0NvbnRhaW5lclByb3BzKTogSlNYLkVsZW1lbnQgPT4ge1xyXG5cdC8vIFJlZmVyZW5jZSB0byBwbGF5ZXIgcGFzc2VkIGJhY2sgdG8gdGhlIHNldHVwUGxheWVyIHByb3BcclxuXHRjb25zdCBwbGF5ZXJSZWYgPSB1c2VSZWY8UmVhY3RQbGF5ZXI+KCk7XHJcblxyXG5cdGNvbnN0IFtwbGF5aW5nLCBzZXRQbGF5aW5nXSA9IHVzZVN0YXRlKHRydWUpXHJcblxyXG5cdGNvbnN0IG9uUmVhZHkgPSAoKSA9PiB7XHJcblx0XHQvLyBTdGFydHMgcGxheWVyIGF0IGxhc3QgcGxheWVkIHRpbWUgaWYgdGhlIHZpZGVvIGhhcyBiZWVuIHBsYXllZCBiZWZvcmVcclxuXHRcdGlmIChzdGFydCAmJiBwbGF5ZXJSZWYuY3VycmVudC5nZXRDdXJyZW50VGltZSgpIDw9IDApIHBsYXllclJlZi5jdXJyZW50LnNlZWtUbyhzdGFydCk7XHJcblxyXG5cdFx0Ly8gU2V0cyB1cCB2aWRlbyBwbGF5ZXIgdG8gYmUgYWNjZXNzZWQgaW4gbWFpbi50c1xyXG5cdFx0aWYgKHBsYXllclJlZikgc2V0dXBQbGF5ZXIocGxheWVyUmVmLmN1cnJlbnQsIHNldFBsYXlpbmcpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIChcclxuXHRcdDw+XHJcblx0XHRcdDxSZWFjdFBsYXllclxyXG5cdFx0XHRcdHJlZj17cGxheWVyUmVmfVxyXG5cdFx0XHRcdHVybD17dXJsfVxyXG5cdFx0XHRcdG1haW5fdXJsPXttYWluX3VybH1cclxuXHRcdFx0XHRwbGF5aW5nPXtwbGF5aW5nfVxyXG5cdFx0XHRcdGNvbnRyb2xzPXt0cnVlfVxyXG5cdFx0XHRcdHdpZHRoPScxMDAlJ1xyXG5cdFx0XHRcdGhlaWdodD0nOTUlJ1xyXG5cdFx0XHRcdGNvbmZpZz17e1xyXG5cdFx0XHRcdFx0ZmlsZToge1xyXG5cdFx0XHRcdFx0ICAvLyBmb3JjZURBU0g6IGRhc2gsXHJcblx0XHRcdFx0XHQgIC8vIGZvcmNlRkxWOiB0cnVlLFxyXG5cdFx0XHRcdFx0ICAvLyBmb3JjZVZpZGVvOiB0cnVlLFxyXG5cdFx0XHRcdFx0ICAvLyBkYXNoVmVyc2lvbjpcIjQuNy4wXCIsXHJcblx0XHRcdFx0XHQgIGF0dHJpYnV0ZXM6IHtcclxuXHRcdFx0XHRcdFx0Y3Jvc3NPcmlnaW46IFwiYW5vbnltb3VzXCIsXHJcblx0XHRcdFx0XHQgIH0sXHJcblx0XHRcdFx0XHQgIHRyYWNrczogc3VidGl0bGVzLFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHQgIH19XHJcblx0XHRcdFx0b25SZWFkeT17b25SZWFkeX1cclxuXHRcdFx0XHRvbkVycm9yPXsoZXJyKSA9PiBzZXR1cEVycm9yKGVyciA/XHJcblx0XHRcdFx0XHRlcnIubWVzc2FnZSA6XHJcblx0XHRcdFx0XHRgVmlkZW8gaXMgdW5wbGF5YWJsZSBkdWUgdG8gcHJpdmFjeSBzZXR0aW5ncywgc3RyZWFtaW5nIHBlcm1pc3Npb25zLCBldGMuYCl9IC8vIEVycm9yIGhhbmRsaW5nIGZvciBpbnZhbGlkIFVSTHNcclxuXHRcdFx0Lz5cclxuXHRcdDwvPlxyXG5cdClcclxufTtcclxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IFRpbWVzdGFtcFBsdWdpbiBmcm9tICcuL21haW4nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUaW1lc3RhbXBQbHVnaW5TZXR0aW5ncyB7XHJcblx0bm90ZVRpdGxlOiBzdHJpbmc7XHJcblx0dXJsU3RhcnRUaW1lTWFwOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xyXG5cdHVybENvbG9yOiBzdHJpbmc7XHJcblx0dGltZXN0YW1wQ29sb3I6IHN0cmluZztcclxuXHR1cmxUZXh0Q29sb3I6IHN0cmluZztcclxuXHR0aW1lc3RhbXBUZXh0Q29sb3I6IHN0cmluZztcclxuXHRmb3J3YXJkU2Vlazogc3RyaW5nO1xyXG5cdGJhY2t3YXJkc1NlZWs6IHN0cmluZztcclxuXHRwb3J0OiBudW1iZXI7XHJcblx0c3RhcnRBdExhc3RQb3NpdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFRpbWVzdGFtcFBsdWdpblNldHRpbmdzID0ge1xyXG5cdG5vdGVUaXRsZTogXCJcIixcclxuXHR1cmxTdGFydFRpbWVNYXA6IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCksXHJcblx0dXJsQ29sb3I6ICdibHVlJyxcclxuXHR0aW1lc3RhbXBDb2xvcjogJ2dyZWVuJyxcclxuXHR1cmxUZXh0Q29sb3I6ICd3aGl0ZScsXHJcblx0dGltZXN0YW1wVGV4dENvbG9yOiAnd2hpdGUnLFxyXG5cdGZvcndhcmRTZWVrOiAnMTAnLFxyXG5cdGJhY2t3YXJkc1NlZWs6ICcxMCcsXHJcblx0cG9ydDogMTIzNDUsXHJcblx0c3RhcnRBdExhc3RQb3NpdGlvbjogdHJ1ZVxyXG59XHJcblxyXG5jb25zdCBDT0xPUlMgPSB7ICdibHVlJzogJ2JsdWUnLCAncmVkJzogJ3JlZCcsICdncmVlbic6ICdncmVlbicsICd5ZWxsb3cnOiAneWVsbG93JywgJ29yYW5nZSc6ICdvcmFuZ2UnLCAncHVycGxlJzogJ3B1cnBsZScsICdwaW5rJzogJ3BpbmsnLCAnZ3JleSc6ICdncmV5JywgJ2JsYWNrJzogJ2JsYWNrJywgJ3doaXRlJzogJ3doaXRlJyB9O1xyXG5cclxuY29uc3QgVElNRVMgPSB7ICc1JzogJzUnLCAnMTAnOiAnMTAnLCAnMTUnOiAnMTUnLCAnMjAnOiAnMjAnLCAnMjUnOiAnMjUnLCAnMzAnOiAnMzAnLCAnMzUnOiAnMzUnLCAnNDAnOiAnNDAnLCAnNDUnOiAnNDUnLCAnNTAnOiAnNTAnLCAnNTUnOiAnNTUnLCAnNjAnOiAnNjAnLCAnNjUnOiAnNjUnLCAnNzAnOiAnNzAnLCAnNzUnOiAnNzUnLCAnODAnOiAnODAnLCAnODUnOiAnODUnLCAnOTAnOiAnOTAnLCAnOTUnOiAnOTUnLCAnMTAwJzogJzEwMCcsICcxMDUnOiAnMTA1JywgJzExMCc6ICcxMTAnLCAnMTE1JzogJzExNScsICcxMjAnOiAnMTIwJyB9XHJcblxyXG5leHBvcnQgY2xhc3MgVGltZXN0YW1wUGx1Z2luU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogVGltZXN0YW1wUGx1Z2luO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBUaW1lc3RhbXBQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdUaW1lc3RhbXAgTm90ZXMgUGx1Z2luJyB9KTtcclxuXHJcblx0XHQvLyBDdXN0b21pemUgdGl0bGVcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVGl0bGUnKVxyXG5cdFx0XHQuc2V0RGVzYygnVGhpcyB0aXRsZSB3aWxsIGJlIHByaW50ZWQgYWZ0ZXIgb3BlbmluZyBhIHZpZGVvIHdpdGggdGhlIGhvdGtleS4gVXNlIDxicj4gZm9yIG5ldyBsaW5lcy4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIHRpdGxlIHRlbXBsYXRlLicpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm5vdGVUaXRsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5ub3RlVGl0bGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHQvLyBDdXN0b21pemUgIHVybCBidXR0b24gY29sb3JcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVVJMIEJ1dHRvbiBDb2xvcicpXHJcblx0XHRcdC5zZXREZXNjKCdQaWNrIGEgY29sb3IgZm9yIHRoZSB1cmwgYnV0dG9uLicpXHJcblx0XHRcdC5hZGREcm9wZG93bihkcm9wZG93biA9PiBkcm9wZG93blxyXG5cdFx0XHRcdC5hZGRPcHRpb25zKENPTE9SUylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXJsQ29sb3IpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXJsQ29sb3IgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQpKTtcclxuXHJcblx0XHQvLyBDdXN0b21pemUgdXJsIHRleHQgY29sb3JcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVVJMIFRleHQgQ29sb3InKVxyXG5cdFx0XHQuc2V0RGVzYygnUGljayBhIGNvbG9yIGZvciB0aGUgVVJMIHRleHQgYnV0dG9uLicpXHJcblx0XHRcdC5hZGREcm9wZG93bihkcm9wZG93biA9PiBkcm9wZG93blxyXG5cdFx0XHRcdC5hZGRPcHRpb25zKENPTE9SUylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXJsVGV4dENvbG9yKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVybFRleHRDb2xvciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdCkpO1xyXG5cclxuXHRcdC8vIEN1c3RvbWl6ZSB0aW1lc3RhbXAgYnV0dG9uIGNvbG9yXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1RpbWVzdGFtcCBCdXR0b24gQ29sb3InKVxyXG5cdFx0XHQuc2V0RGVzYygnUGljayBhIGNvbG9yIGZvciB0aGUgdGltZXN0YW1wIGJ1dHRvbi4nKVxyXG5cdFx0XHQuYWRkRHJvcGRvd24oZHJvcGRvd24gPT4gZHJvcGRvd25cclxuXHRcdFx0XHQuYWRkT3B0aW9ucyhDT0xPUlMpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRpbWVzdGFtcENvbG9yKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRpbWVzdGFtcENvbG9yID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0KSk7XHJcblxyXG5cdFx0Ly8gQ3VzdG9taXplIHRpbWVzdGFtcCB0ZXh0IGNvbG9yXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1RpbWVzdGFtcCBUZXh0IENvbG9yJylcclxuXHRcdFx0LnNldERlc2MoJ1BpY2sgYSBjb2xvciBmb3IgdGhlIHRpbWVzdGFtcCB0ZXh0LicpXHJcblx0XHRcdC5hZGREcm9wZG93bihkcm9wZG93biA9PiBkcm9wZG93blxyXG5cdFx0XHRcdC5hZGRPcHRpb25zKENPTE9SUylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudGltZXN0YW1wVGV4dENvbG9yKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRpbWVzdGFtcFRleHRDb2xvciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdCkpO1xyXG5cclxuXHRcdC8vIEN1c3RvbWl6ZSBmb3J3YXJkIHNlZWsgdGltZVxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdGb3dhcmQgdGltZSBzZWVrJylcclxuXHRcdFx0LnNldERlc2MoJ1RoaXMgaXMgdGhlIGFtb3VudCBvZiBzZWNvbmRzIHRoZSB2aWRlbyB3aWxsIHNlZWsgZm9yd2FyZCB3aGVuIHByZXNzaW5nIHRoZSBzZWVrIGZvcndhcmQgY29tbWFuZC4nKVxyXG5cdFx0XHQuYWRkRHJvcGRvd24oZHJvcGRvd24gPT4gZHJvcGRvd25cclxuXHRcdFx0XHQuYWRkT3B0aW9ucyhUSU1FUylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9yd2FyZFNlZWspXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9yd2FyZFNlZWsgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQpKTtcclxuXHJcblx0XHQvLyBDdXN0b21pemUgYmFja3dhcmRzIHNlZWsgdGltZVxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdCYWNrd2FyZHMgdGltZSBzZWVrJylcclxuXHRcdFx0LnNldERlc2MoJ1RoaXMgaXMgdGhlIGFtb3VudCBvZiBzZWNvbmRzIHRoZSB2aWRlbyB3aWxsIHNlZWsgYmFja3dhcmRzIHdoZW4gcHJlc3NpbmcgdGhlIHNlZWsgYmFja3dhcmRzIGNvbW1hbmQuJylcclxuXHRcdFx0LmFkZERyb3Bkb3duKGRyb3Bkb3duID0+IGRyb3Bkb3duXHJcblx0XHRcdFx0LmFkZE9wdGlvbnMoVElNRVMpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmJhY2t3YXJkc1NlZWspXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYmFja3dhcmRzU2VlayA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdCkpO1xyXG5cclxuXHRcdC8vIEN1c3RvbWl6ZSBsb2NhbCBzZXJ2ZXIgcG9ydFxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdTZXJ2ZXIgUG9ydCcpXHJcblx0XHRcdC5zZXREZXNjKCdTZWxlY3QgYSBjdXN0b20gcG9ydCBmb3IgdGhlIGxvY2FsIHNlcnZlciB3aGVyZSBsb2NhbCB2aWRlb3Mgd2lsbCBiZSBzdHJlYW1lZCAod2lsbCBiZSBhc3NpZ25lZCByYW5kb21seSBpZiBsZWZ0IGVtcHR5KScpXHJcblx0XHRcdC5hZGRUZXh0KG51bWJlciA9PiBudW1iZXJcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIGEgcG9ydCBudW1iZXInKVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wb3J0LnRvU3RyaW5nKCkpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCFpc05hTihOdW1iZXIodmFsdWUpKSAmJiBOdW1iZXIodmFsdWUpIDwgNjU1MDApIHtcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucG9ydCA9IE51bWJlcih2YWx1ZSk7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHQvLyBUb2dnbGUgc3RhcnQgYXQgbGFzdCBwb3NpdGlvbiBvcHRpb25cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0LnNldE5hbWUoJ1N0YXJ0IGF0IGxhc3QgcG9zaXRpb24nKVxyXG5cdFx0LnNldERlc2MoJ09wZW4gdmlkZW9zIGF0IHRoZSB0aW1lc3RhbXAgeW91IGxlZnQgb2ZmIG9uJylcclxuXHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSk9PntcclxuXHRcdFx0dG9nZ2xlXHJcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zdGFydEF0TGFzdFBvc2l0aW9uKVxyXG5cdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc3RhcnRBdExhc3RQb3NpdGlvbiA9IHZhbHVlO1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHR9KVxyXG5cdFx0fSlcclxuXHR9XHJcbn0iLCAiaW1wb3J0IGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcclxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XHJcbmltcG9ydCAqIGFzIG1pbWUgZnJvbSBcIm1pbWUtdHlwZXNcIjtcclxuaW1wb3J0IHsgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSBcImh0dHBcIjtcclxuaW1wb3J0IHsgQWRkcmVzc0luZm8gfSBmcm9tIFwibm9kZTpuZXRcIjtcclxuaW1wb3J0IGxhbmd1YWdlRW5jb2RpbmcgZnJvbSBcImRldGVjdC1maWxlLWVuY29kaW5nLWFuZC1sYW5ndWFnZVwiO1xyXG5pbXBvcnQgeyBiaWxpUmVkaXJlY3RzIH0gZnJvbSBcIi4vYmlsaWJpbGlcIjtcclxuXHJcbmV4cG9ydCB2YXIgc2VydmVyOiBodHRwLlNlcnZlciA9IHVuZGVmaW5lZDtcclxuZXhwb3J0IHZhciBQT1JUOiBudW1iZXI7XHJcbmV4cG9ydCB2YXIgSE9TVCA9IFwiMTI3LjAuMC4xXCI7XHJcblxyXG52YXIgbG9jYWxWaWRlb1JvdXRlID0gXCJsb2NhbHZpZGVvXCI7XHJcbnZhciBzdWJ0aXRsZVJvdXRlID0gXCJzdWJ0aXRsZXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2NhbFZpZGVvUmVkaXJlY3QodXJsOiBzdHJpbmcpIHtcclxuICB1cmwgPSB1cmwudG9TdHJpbmcoKS5yZXBsYWNlKC9eXFxcIiguKylcXFwiJC8sIFwiJDFcIik7XHJcbiAgcmV0dXJuIGBodHRwOi8vJHtIT1NUfToke1BPUlR9LyR7bG9jYWxWaWRlb1JvdXRlfS8ke3VybH1gO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3VidGl0bGVSZWRpcmVjdCh1cmw6IHN0cmluZykge1xyXG4gIHVybCA9IHVybC50b1N0cmluZygpLnJlcGxhY2UoL15cXFwiKC4rKVxcXCIkLywgXCIkMVwiKTtcclxuICByZXR1cm4gYGh0dHA6Ly8ke0hPU1R9OiR7UE9SVH0vJHtzdWJ0aXRsZVJvdXRlfS8ke3VybH1gO1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBjaGVja1BvcnQocG9ydDogbnVtYmVyKSB7XHJcbiAgaWYgKDAgPiBwb3J0IHx8IHBvcnQgPiA2NTUzNikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgIHZhciByZXEgPSBodHRwLmdldChgaHR0cDovLzEyNy4wLjAuMToke3BvcnR9YCwgZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT0gNDAwKSB7XHJcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXEub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICByZXNvbHZlKHBvcnQpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdGFydFNlcnZlcihwb3J0XzogYW55KSB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXMpID0+IHtcclxuICAgIHZhciBhcHA6IGV4cHJlc3MuQXBwbGljYXRpb24gPSBleHByZXNzKCk7XHJcbiAgICBzZXJ2ZXIgPSBhcHAubGlzdGVuKGF3YWl0IGNoZWNrUG9ydChwb3J0XyksIGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHNlcnZlcl9hZHJlc3MgPSBzZXJ2ZXIuYWRkcmVzcygpIGFzIEFkZHJlc3NJbmZvO1xyXG4gICAgICBQT1JUID0gc2VydmVyX2FkcmVzcy5wb3J0O1xyXG4gICAgICBjb25zb2xlLmxvZyhgUG9ydCAke1BPUlR9IGxpc3RlbmluZ2ApO1xyXG4gICAgICBuZXcgTm90aWNlKHBvcnRfID8gYExvY2FsIHNlcnZlciBzdGFydGVkIG9uIFBvcnQgJHtwb3J0X31gIDogYFBvcnQgJHtwb3J0X30gaXMgYWxyZWFkeSB1c2VkLCBsb2NhbCBzZXJ2ZXIgc3RhcnRlZCBhdCBwb3J0ICR7UE9SVH1gKTtcclxuICAgICAgcmVzKHNlcnZlcik7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhcHAuZ2V0KGAvJHtsb2NhbFZpZGVvUm91dGV9LypgLCBmdW5jdGlvbiAocmVxLCByZXMpIHtcclxuICAgICAgLy8gaHR0cHM6Ly9ibG9nLmxvZ3JvY2tldC5jb20vYnVpbGQtdmlkZW8tc3RyZWFtaW5nLXNlcnZlci1ub2RlL1xyXG4gICAgICB2YXIgcGF0aCA9IGRlY29kZVVSSShyZXEudXJsLnNwbGl0KGAvJHtsb2NhbFZpZGVvUm91dGV9L2ApWzFdKS5yZXBsYWNlKC9eXFxcIiguKylcXFwiJC8sIFwiJDFcIik7XHJcbiAgICAgIHZhciByYW5nZSA9IHJlcS5oZWFkZXJzLnJhbmdlO1xyXG5cclxuICAgICAgaWYgKCFyYW5nZSkge1xyXG4gICAgICAgIHJhbmdlID0gXCJieXRlcz0wLVwiO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZpZGVvU2l6ZSA9IGZzLnN0YXRTeW5jKHBhdGgpLnNpemU7XHJcblxyXG4gICAgICBjb25zdCBDSFVOS19TSVpFID0gMTAgKiogNiAqIDQ7IC8vIDRNQlxyXG4gICAgICBjb25zdCBzdGFydCA9IE51bWJlcihyYW5nZS5yZXBsYWNlKC9cXEQvZywgXCJcIikpO1xyXG4gICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihzdGFydCArIENIVU5LX1NJWkUsIHZpZGVvU2l6ZSAtIDEpO1xyXG5cclxuICAgICAgLy8gQ3JlYXRlIGhlYWRlcnNcclxuICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IGVuZCAtIHN0YXJ0ICsgMTtcclxuICAgICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgICBcIkNvbnRlbnQtUmFuZ2VcIjogYGJ5dGVzICR7c3RhcnR9LSR7ZW5kfS8ke3ZpZGVvU2l6ZX1gLFxyXG4gICAgICAgIFwiQWNjZXB0LVJhbmdlc1wiOiBcImJ5dGVzXCIsXHJcbiAgICAgICAgXCJDb250ZW50LUxlbmd0aFwiOiBjb250ZW50TGVuZ3RoLFxyXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IG1pbWUubG9va3VwKHBhdGgpIHx8IFwidmlkZW8vbXA0XCIsXHJcbiAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogXCIqXCIsXHJcbiAgICAgICAgLy8gXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogXCJhcHA6Ly9vYnNpZGlhbi5tZFwiLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gSFRUUCBTdGF0dXMgMjA2IGZvciBQYXJ0aWFsIENvbnRlbnRcclxuICAgICAgcmVzLndyaXRlSGVhZCgyMDYsIGhlYWRlcnMpO1xyXG5cclxuICAgICAgLy8gY3JlYXRlIHZpZGVvIHJlYWQgc3RyZWFtIGZvciB0aGlzIHBhcnRpY3VsYXIgY2h1bmtcclxuICAgICAgY29uc3QgdmlkZW9TdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgsIHsgc3RhcnQsIGVuZCB9KTtcclxuXHJcbiAgICAgIC8vIFN0cmVhbSB0aGUgdmlkZW8gY2h1bmsgdG8gdGhlIGNsaWVudFxyXG4gICAgICB2aWRlb1N0cmVhbS5waXBlKHJlcyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhcHAuZ2V0KGAvJHtzdWJ0aXRsZVJvdXRlfS8qYCwgYXN5bmMgZnVuY3Rpb24gKHJlcSwgcmVzKSB7XHJcbiAgICAgIHZhciBwYXRoID0gZGVjb2RlVVJJKHJlcS51cmwuc3BsaXQoYC8ke3N1YnRpdGxlUm91dGV9L2ApWzFdKS5yZXBsYWNlKC9eXFxcIiguKylcXFwiJC8sIFwiJDFcIik7XHJcbiAgICAgIHZhciBzcnRfID0gZnMucmVhZEZpbGVTeW5jKHBhdGgpO1xyXG4gICAgICB2YXIgZW5jb2RpbmcgPSAoYXdhaXQgbGFuZ3VhZ2VFbmNvZGluZyhwYXRoKSkuZW5jb2Rpbmc7XHJcbiAgICAgIGxldCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKTsgLy8gZGVmYXVsdCAndXRmLTgnIG9yICd1dGY4J1xyXG4gICAgICB2YXIgc3J0ID0gZGVjb2Rlci5kZWNvZGUoc3J0Xyk7XHJcbiAgICAgIHZhciB2dHQ7XHJcbiAgICAgIGlmIChwYXRoLmVuZHNXaXRoKFwiLnNydFwiKSkge1xyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvc3J0LXRvLXZ0dC9ibG9iLzhiMGU0YmFjMjhmMTg2OTRlNzQxOTQ5YzUwYThjYmY3M2NkN2JiNmUvaW5kZXguanMjTDlcclxuICAgICAgICB2dHQgPVxyXG4gICAgICAgICAgXCJXRUJWVFQgRklMRVxcclxcblxcclxcblwiICtcclxuICAgICAgICAgIHNydFxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFx7XFxcXChbaWJ1XSlcXH0vZywgXCI8LyQxPlwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFx7XFxcXChbaWJ1XSkxXFx9L2csIFwiPCQxPlwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFx7KFtpYnVdKVxcfS9nLCBcIjwkMT5cIilcclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xce1xcLyhbaWJ1XSlcXH0vZywgXCI8LyQxPlwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvKFxcZFxcZDpcXGRcXGQ6XFxkXFxkKSwoXFxkXFxkXFxkKS9nLCBcIiQxLiQyXCIpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oXFxkXFxkOlxcZFxcZDpcXGRcXGRcXC5cXGRcXGRcXGQgLS0+IFxcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkXFxkXFxkKS9nLCBcIiQxIGFsaWduOm1pZGRsZSBsaW5lOjkwJVwiKSAvLyBmb3IgdXNpbmcgd2l0aCBhdWRpbyBwbGF5ZXJcclxuICAgICAgICAgICAgLmNvbmNhdChcIlxcclxcblxcclxcblwiKTtcclxuICAgICAgfSBlbHNlIGlmIChwYXRoLmVuZHNXaXRoKFwiLnZ0dFwiKSkge1xyXG4gICAgICAgIHZ0dCA9IHNydDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvdnR0XCIsXHJcbiAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogXCIqXCIsXHJcbiAgICAgIH07XHJcbiAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCBoZWFkZXJzKTtcclxuICAgICAgcmVzLmVuZCh2dHQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgYmlsaVJlZGlyZWN0cyhhcHApO1xyXG4gICAgXHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IEFwcGxpY2F0aW9uIH0gZnJvbSBcImV4cHJlc3NcIjtcclxuaW1wb3J0IHsgY3JlYXRlUHJveHlNaWRkbGV3YXJlIH0gZnJvbSBcImh0dHAtcHJveHktbWlkZGxld2FyZVwiO1xyXG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSBcImh0dHAtcHJveHktbWlkZGxld2FyZS9kaXN0L3R5cGVzXCI7XHJcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gXCJodHRwc1wiO1xyXG5pbXBvcnQgeyBQT1JULCBIT1NUIH0gZnJvbSBcIi4vc2VydmVyXCI7XHJcbmltcG9ydCB4bWwgZnJvbSBcInhtbFwiO1xyXG5cclxuY29uc3QgYmlsaVVybFBhdHRlcm4gPSAvKGJpbGliaWxpXFwuY29tXFwvKHZpZGVvXFwvKT8oKChhdlxcZHs4fSl8KGJ2W0EtWmEtejAtOX1dezEwfSkpKFxcP3xcXC8pPykpfChiMjNcXC50dlxcLyhbQS1aYS16MC05XXs2fXxbQS1aYS16MC05XXsxMn0pJCkvaTtcclxuXHJcbnZhciBkYXNoQmFzZVVybFJvdXRlID0gXCJiaWxpUmVkaXJlY3RcIjtcclxudmFyIG1wZFJvdXRlID0gXCJiaWxpZ2V0bXBkXCI7XHJcbnZhciBiaWxpU3ViUm91dGUgPSBcImJpbGlzdWJ0b3Z0dFwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQmlsaVVybCh1cmw6IHN0cmluZykge1xyXG4gIGlmIChiaWxpVXJsUGF0dGVybi50ZXN0KHVybCkpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZWRpcmVjdF9iMjModXJsOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgaHR0cHMuZ2V0KCgvXihodHRwc3xodHRwKTpcXC9cXC8vLnRlc3QodXJsKSA/IFwiXCIgOiBcImh0dHBzOi8vXCIpICsgdXJsLCB7IG1ldGhvZDogXCJIRUFEXCIgfSwgYXN5bmMgKHJlcykgPT4ge1xyXG4gICAgICByZXNvbHZlKHJlcy5oZWFkZXJzLmxvY2F0aW9uKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vMTAxNTc3MDQ5Mi9iaWxpYmlsaS1kb3dubG9hZC9ibG9iL21hc3Rlci9kb2MvYmlsaWJpbGktQXBpJUU2JTk2JTg3JUU2JUExJUEzLm1kXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRCaWxpSW5mbyh1cmw6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZTx7IHVybDogc3RyaW5nOyBzdWJ0aXRsZXM6IG9iamVjdFtdIH0+KGFzeW5jIChyZXMpID0+IHtcclxuICAgIGlmICgvYjIzXFwudHZcXC8oW0EtWmEtejAtOV17Nn0pLy50ZXN0KHVybCkpIHtcclxuICAgICAgdXJsID0gKGF3YWl0IHJlZGlyZWN0X2IyMyh1cmwpKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBhcGlfdmlld19wYXJhbXM7XHJcbiAgICBpZiAodXJsLm1hdGNoKC9cXC9idltBLVphLXowLTl9XXsxMH0vZ2kpKSB7XHJcbiAgICAgIGFwaV92aWV3X3BhcmFtcyA9IHsgYnZpZDogdXJsLm1hdGNoKC9cXC9idltBLVphLXowLTl9XXsxMH0vZ2kpWzBdLnNsaWNlKDEpIH07XHJcbiAgICB9IGVsc2UgaWYgKHVybC5tYXRjaCgvXFwvYXZcXGR7OH0vZ2kpKSB7XHJcbiAgICAgIGFwaV92aWV3X3BhcmFtcyA9IHsgYWlkOiB1cmwubWF0Y2goL1xcL2F2XFxkezh9L2dpKVswXS5zbGljZSgzKSB9O1xyXG4gICAgfVxyXG4gICAgdmFyIHBhZ2VfbnVtYmVyID0gdXJsLm1hdGNoKC8oPzw9XFw/cD0pXFxkKy9pKT8uWzBdIHx8IFwiMVwiO1xyXG5cclxuICAgIHZhciBhcGlfdmlld191cmwgPSBcImh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3dlYi1pbnRlcmZhY2Uvdmlld1wiO1xyXG4gICAgdmFyIGNpZF9yZXMgPSBhd2FpdCAoYXdhaXQgZmV0Y2goYmlsaVVybFByb3h5KGAke2FwaV92aWV3X3VybH0/JHtuZXcgVVJMU2VhcmNoUGFyYW1zKGFwaV92aWV3X3BhcmFtcyl9YCkpKS5qc29uKCk7XHJcblxyXG4gICAgdmFyIHBhZ2UgPSBjaWRfcmVzLmRhdGEucGFnZXMuZmluZCgocDogYW55KSA9PiBwLnBhZ2UgPT0gcGFnZV9udW1iZXIpO1xyXG4gICAgdmFyIGNpZCA9IHBhZ2UuY2lkO1xyXG5cclxuICAgIHZhciBwYXJhbXMgPSB7IGJ2aWQ6IGFwaV92aWV3X3BhcmFtcy5idmlkIHx8IGNpZF9yZXMuZGF0YS5idmlkLCBjaWQ6IGNpZCB9O1xyXG5cclxuICAgIHZhciBzdWJ0aXRsZXM6IGFueVtdID0gW107XHJcbiAgICB2YXIgc3ViQXJyOiBhbnlbXTtcclxuICAgIGlmIChwYWdlX251bWJlciAhPT0gXCIxXCIpIHtcclxuICAgICAgdmFyIG5ld19yZXMgPSBhd2FpdCAoYXdhaXQgZmV0Y2goYmlsaVVybFByb3h5KGAke2FwaV92aWV3X3VybH0/JHtuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcyl9YCkpKS5qc29uKCk7XHJcbiAgICAgIHN1YkFyciA9IG5ld19yZXMuZGF0YS5zdWJ0aXRsZS5saXN0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3ViQXJyID0gY2lkX3Jlcy5kYXRhLnN1YnRpdGxlLmxpc3Q7XHJcbiAgICB9XHJcbiAgICBzdWJBcnIuZm9yRWFjaCgoc3ViLCBpKSA9PiB7XHJcbiAgICAgIHN1YnRpdGxlcy5wdXNoKHtcclxuICAgICAgICBraW5kOiBcInN1YnRpdGxlc1wiLFxyXG4gICAgICAgIHNyYzogYGh0dHA6Ly8ke0hPU1R9OiR7UE9SVH0vJHtiaWxpU3ViUm91dGV9L3N1YnRpdGxlX3VybD0ke3N1Yi5zdWJ0aXRsZV91cmx9YCxcclxuICAgICAgICBzcmNMYW5nOiBzdWIubGFuLFxyXG4gICAgICAgIGxhYmVsOiBzdWIubGFuLFxyXG4gICAgICAgIGRlZmF1bHQ6IGkgPT0gMCA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXMoe1xyXG4gICAgICB1cmw6IGBodHRwOi8vJHtIT1NUfToke1BPUlR9LyR7bXBkUm91dGV9LyR7bmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpfS5tcGRgLFxyXG4gICAgICBzdWJ0aXRsZXM6IHN1YnRpdGxlcyxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG52YXIgYmlsaVVybFByb3h5ID0gKHVybDogc3RyaW5nKSA9PiB7XHJcbiAgcmV0dXJuIGBodHRwOi8vJHtIT1NUfToke1BPUlR9LyR7ZGFzaEJhc2VVcmxSb3V0ZX0vYCArIG5ldyBVUkwodXJsKS5ob3N0ICsgbmV3IFVSTCh1cmwpLnBhdGhuYW1lICsgbmV3IFVSTCh1cmwpLnNlYXJjaDtcclxufTtcclxuXHJcbmZ1bmN0aW9uIGdldERhc2gocGFyYW1zOiBvYmplY3QpIHtcclxuICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPihhc3luYyAocmVzKSA9PiB7XHJcbiAgICBjb25zdCBhcGlfcGxheXVybF91cmwgPSBcImh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3BsYXllci9wbGF5dXJsXCI7XHJcbiAgICB2YXIgYXBpX3BsYXl1cmxfcGFyYW1zID0ge1xyXG4gICAgICAuLi5wYXJhbXMsXHJcbiAgICAgIGZudmFsOiBcIjE2XCIsXHJcbiAgICAgIHFuOiBcIjY0XCIsXHJcbiAgICAgIGZudmVyOiBcIjBcIixcclxuICAgICAgZm91cms6IFwiMVwiLFxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgdmFyIGRhc2hfcmVzID0gYXdhaXQgKGF3YWl0IGZldGNoKGJpbGlVcmxQcm94eShgJHthcGlfcGxheXVybF91cmx9PyR7bmV3IFVSTFNlYXJjaFBhcmFtcyhhcGlfcGxheXVybF9wYXJhbXMpfWApKSkuanNvbigpO1xyXG4gICAgdmFyIGRhc2ggPSBkYXNoX3Jlcy5kYXRhLmRhc2g7XHJcblxyXG4gICAgdmFyIHZpZGVvID0gW107XHJcbiAgICB2YXIgYXVkaW8gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXNoLnZpZGVvKSB7XHJcbiAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChkYXNoLnZpZGVvLCBrZXkpICYmIGRhc2gudmlkZW9ba2V5XS5jb2RlY3Muc3RhcnRzV2l0aChcImF2XCIpKSB7XHJcbiAgICAgICAgY29uc3QgZSA9IGRhc2gudmlkZW9ba2V5XTtcclxuICAgICAgICB2YXIgdmlkZW9feG1sX29iaiA9IHtcclxuICAgICAgICAgIFJlcHJlc2VudGF0aW9uOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBfYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGUuaWQsXHJcbiAgICAgICAgICAgICAgICBiYW5kd2lkdGg6IGUuYmFuZHdpZHRoLFxyXG4gICAgICAgICAgICAgICAgbWltZVR5cGU6IGUubWltZVR5cGUsXHJcbiAgICAgICAgICAgICAgICBjb2RlY3M6IGUuY29kZWNzLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IGUud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGUuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZnJhbWVSYXRlOiBlLmZyYW1lUmF0ZSxcclxuICAgICAgICAgICAgICAgIHNhcjogZS5zYXIsXHJcbiAgICAgICAgICAgICAgICBzdGFydFdpdGhTYXA6IGUuc3RhcnRXaXRoU2FwLFxyXG4gICAgICAgICAgICAgICAgY29kZWNpZDogZS5jb2RlY2lkLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBCYXNlVVJMOiBiaWxpVXJsUHJveHkoZS5iYXNlVXJsKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFNlZ21lbnRCYXNlOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIF9hdHRyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhSYW5nZTogZS5TZWdtZW50QmFzZS5pbmRleFJhbmdlLFxyXG4gICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uOiBlLlNlZ21lbnRCYXNlLkluaXRpYWxpemF0aW9uLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZpZGVvLnB1c2godmlkZW9feG1sX29iaik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhc2guYXVkaW8pIHtcclxuICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhc2guYXVkaW8sIGtleSkpIHtcclxuICAgICAgICBjb25zdCBlID0gZGFzaC5hdWRpb1trZXldO1xyXG5cclxuICAgICAgICB2YXIgYXVkaW9feG1sX29iaiA9IHtcclxuICAgICAgICAgIFJlcHJlc2VudGF0aW9uOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBfYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGUuaWQsXHJcbiAgICAgICAgICAgICAgICBiYW5kd2lkdGg6IGUuYmFuZHdpZHRoLFxyXG4gICAgICAgICAgICAgICAgbWltZVR5cGU6IGUubWltZVR5cGUsXHJcbiAgICAgICAgICAgICAgICBjb2RlY3M6IGUuY29kZWNzLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoU2FwOiBlLnN0YXJ0V2l0aFNhcCxcclxuICAgICAgICAgICAgICAgIGNvZGVjaWQ6IGUuY29kZWNpZCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgQmFzZVVSTDogYmlsaVVybFByb3h5KGUuYmFzZVVybCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBTZWdtZW50QmFzZTogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBfYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4UmFuZ2U6IGUuU2VnbWVudEJhc2UuaW5kZXhSYW5nZSxcclxuICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvbjogZS5TZWdtZW50QmFzZS5Jbml0aWFsaXphdGlvbixcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBhdWRpby5wdXNoKGF1ZGlvX3htbF9vYmopO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB2YXIgeG1sQXJyID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgTVBEOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIF9hdHRyOiB7XHJcbiAgICAgICAgICAgICAgeG1sbnM6IFwidXJuOm1wZWc6ZGFzaDpzY2hlbWE6bXBkOjIwMTFcIixcclxuICAgICAgICAgICAgICBwcm9maWxlczogXCJ1cm46bXBlZzpkYXNoOnByb2ZpbGU6aXNvZmYtb24tZGVtYW5kOjIwMTEsaHR0cDovL2Rhc2hpZi5vcmcvZ3VpZGVsaW5lcy9kYXNoMjY0XCIsXHJcbiAgICAgICAgICAgICAgdHlwZTogXCJzdGF0aWNcIixcclxuICAgICAgICAgICAgICBtaW5CdWZmZXJUaW1lOiBgUFQke2Rhc2gubWluQnVmZmVyVGltZX1TYCxcclxuICAgICAgICAgICAgICBtZWRpYVByZXNlbnRhdGlvbkR1cmF0aW9uOiBgUFQke2Rhc2guZHVyYXRpb259U2AsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBQZXJpb2Q6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbjogYFBUJHtkYXNoLmR1cmF0aW9ufVNgLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEFkYXB0YXRpb25TZXQ6IFtcclxuICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIF9hdHRyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogXCJ2aWRlb1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtU3dpdGNoaW5nOiBcInRydWVcIixcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAuLi52aWRlbyxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBBZGFwdGF0aW9uU2V0OiBbXHJcbiAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBfYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IFwiYXVkaW9cIixcclxuICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbVN3aXRjaGluZzogXCJ0cnVlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgLi4uYXVkaW8sXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gICAgdmFyIHhtbF8gPSB4bWwoeG1sQXJyLCB0cnVlKTtcclxuICAgIHJlcyh4bWxfKTtcclxuICB9KTtcclxufVxyXG5cclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FpZGVubHgvbXgtYmlsaS1wbHVnaW4vYmxvYi9tYXN0ZXIvc3JjL2Zha2UtYmlsaS9wcm94eS9mYWtlLnRzXHJcbmV4cG9ydCBmdW5jdGlvbiBiaWxpUmVkaXJlY3RzKGFwcDogQXBwbGljYXRpb24pIHtcclxuICB2YXIgdXNlcl9hZ2VudCA9IFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6MTA5LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvMTEyLjBcIjtcclxuXHJcbiAgY29uc3Qgb3B0aW9uczogT3B0aW9ucyA9IHtcclxuICAgIHRhcmdldDogXCJodHRwOi8vd3d3LmV4YW1wbGUub3JnXCIsXHJcbiAgICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICB3czogdHJ1ZSxcclxuICAgIHBhdGhSZXdyaXRlOiB7XHJcbiAgICAgIFtgXi8ke2Rhc2hCYXNlVXJsUm91dGV9Ly4rPy9gXTogXCIvXCIsXHJcbiAgICB9LFxyXG4gICAgcm91dGVyOiAocmVxKSA9PiB7XHJcbiAgICAgIHJldHVybiBcImh0dHBzOi8vXCIgKyByZXEucGFyYW1zLmhvc3Q7XHJcbiAgICB9LFxyXG4gICAgb25Qcm94eVJlcTogKHByb3h5UmVxKSA9PiB7XHJcbiAgICAgIHByb3h5UmVxLnNldEhlYWRlcihcInVzZXItYWdlbnRcIiwgdXNlcl9hZ2VudCk7XHJcbiAgICAgIHByb3h5UmVxLnNldEhlYWRlcihcInJlZmVyZXJcIiwgXCJodHRwczovL3d3dy5iaWxpYmlsaS5jb20vXCIpO1xyXG4gICAgICBwcm94eVJlcS5zZXRIZWFkZXIoXCJvcmlnaW5cIiwgXCJodHRwczovL3d3dy5iaWxpYmlsaS5jb20vXCIpO1xyXG4gICAgfSxcclxuICAgIG9uUHJveHlSZXM6IChwcm94eVJlcykgPT4ge1xyXG4gICAgICBwcm94eVJlcy5oZWFkZXJzW1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCJdID0gXCIqXCI7XHJcbiAgICB9LFxyXG4gIH07XHJcblxyXG4gIGFwcC51c2UoYC8ke2Rhc2hCYXNlVXJsUm91dGV9Lzpob3N0YCwgY3JlYXRlUHJveHlNaWRkbGV3YXJlKG9wdGlvbnMpKTtcclxuXHJcbiAgYXBwLmdldChgLyR7bXBkUm91dGV9LypgLCBhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcclxuICAgIHZhciBwYXJhbXM6IGFueSA9IGRlY29kZVVSSShyZXEudXJsLnNwbGl0KGAvJHttcGRSb3V0ZX0vYClbMV0pLnNsaWNlKDAsIC00KTtcclxuICAgIHBhcmFtcyA9IE9iamVjdC5mcm9tRW50cmllcyhuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcykpO1xyXG4gICAgdmFyIG1wZCA9IGF3YWl0IGdldERhc2gocGFyYW1zKTtcclxuICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7XHJcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vZGFzaCt4bWxcIixcclxuICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogXCIqXCIsXHJcbiAgICB9KTtcclxuICAgIHJlcy5lbmQobXBkKTtcclxuICB9KTtcclxuXHJcbiAgYXBwLmdldChgLyR7YmlsaVN1YlJvdXRlfS8qYCwgYXN5bmMgZnVuY3Rpb24gKHJlcSwgcmVzKSB7XHJcbiAgICB2YXIgcGFyYW1zOiBhbnkgPSBkZWNvZGVVUkkocmVxLnVybC5zcGxpdChgLyR7YmlsaVN1YlJvdXRlfS9gKVsxXSk7XHJcbiAgICBwYXJhbXMgPSBPYmplY3QuZnJvbUVudHJpZXMobmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpKTtcclxuXHJcbiAgICB2YXIgc3ViX3VybCA9IHBhcmFtcy5zdWJ0aXRsZV91cmw7XHJcbiAgICBpZiAoIXBhcmFtcy5zdWJ0aXRsZV91cmwpIHtcclxuICAgICAgdmFyIHBhcmFtc19zdHIgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCgoeyBpbmRleCwgLi4ubyB9KSA9PiBvKShwYXJhbXMpKS50b1N0cmluZygpO1xyXG5cclxuICAgICAgdmFyIGFwaV92aWV3X3VybCA9IFwiaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvd2ViLWludGVyZmFjZS92aWV3XCI7XHJcbiAgICAgIHZhciBmZXRjaF91cmwgPSBiaWxpVXJsUHJveHkoYCR7YXBpX3ZpZXdfdXJsfT8ke3BhcmFtc19zdHJ9YCk7XHJcbiAgICAgIHZhciBsaXN0X3JlcyA9IGF3YWl0IChhd2FpdCBmZXRjaChmZXRjaF91cmwpKS5qc29uKCk7XHJcblxyXG4gICAgICBzdWJfdXJsID0gbGlzdF9yZXMuZGF0YS5zdWJ0aXRsZS5saXN0W3BhcmFtcy5pbmRleF0uc3VidGl0bGVfdXJsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB2YXIgc3RyID0gXCJcIjtcclxuICAgIHZhciBzdWJqc29uID0gKGF3YWl0IChhd2FpdCBmZXRjaChzdWJfdXJsKSkuanNvbigpKS5ib2R5O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJqc29uLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHN1YiA9IHN1Ympzb25baV07XHJcbiAgICAgIHZhciBmcm9tdGltZSA9IG5ldyBEYXRlKHN1Yi5mcm9tICogMTAwMCkudG9JU09TdHJpbmcoKS5zbGljZSgxMSwgMjMpO1xyXG4gICAgICB2YXIgdG90aW1lID0gbmV3IERhdGUoc3ViLnRvICogMTAwMCkudG9JU09TdHJpbmcoKS5zbGljZSgxMSwgMjMpO1xyXG4gICAgICBzdHIgKz0gYCR7aSArIDF9XFxuYDtcclxuICAgICAgc3RyICs9IGAke2Zyb210aW1lfSAtLT4gJHt0b3RpbWV9XFxuYDtcclxuICAgICAgc3RyICs9IGAke3N1Yi5jb250ZW50fVxcblxcbmA7XHJcbiAgICB9XHJcbiAgICB2YXIgdnR0ID0gXCJXRUJWVFQgRklMRVxcclxcblxcclxcblwiICsgc3RyO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L3Z0dFwiLFxyXG4gICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiOiBcIipcIixcclxuICAgIH07XHJcbiAgICByZXMud3JpdGVIZWFkKDIwMCwgaGVhZGVycyk7XHJcbiAgICByZXMuZW5kKHZ0dCk7XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xyXG5pbXBvcnQgUmVhY3RQbGF5ZXIgZnJvbSBcInJlYWN0LXBsYXllclwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXJsKHVybDogc3RyaW5nKSB7XHJcbiAgdmFyIHVybHJlZ2V4ID0gbmV3IFJlZ0V4cChcclxuICAgIC8oKGh0dHBzOlxcL1xcL3d3d1xcLnxodHRwOlxcL1xcL3d3d1xcLnxodHRwczpcXC9cXC98aHR0cDpcXC9cXC8pP1thLXpBLVpdezIsfShcXC5bYS16QS1aXXsyLH0pKFxcLlthLXpBLVpdezIsfSk/XFwvW2EtekEtWjAtOV17Mix9fCgoaHR0cHM6XFwvXFwvd3d3XFwufGh0dHA6XFwvXFwvd3d3XFwufGh0dHBzOlxcL1xcL3xodHRwOlxcL1xcLyk/W2EtekEtWl17Mix9KFxcLlthLXpBLVpdezIsfSkoXFwuW2EtekEtWl17Mix9KT8pfChodHRwczpcXC9cXC93d3dcXC58aHR0cDpcXC9cXC93d3dcXC58aHR0cHM6XFwvXFwvfGh0dHA6XFwvXFwvKT9bYS16QS1aMC05XXsyLH1cXC5bYS16QS1aMC05XXsyLH1cXC5bYS16QS1aMC05XXsyLH0oXFwuW2EtekEtWjAtOV17Mix9KXxodHRwOlxcL1xcLzEyN1xcLjBcXC4wXFwuMTpbMC05XXxodHRwOlxcL1xcL2xvY2FsaG9zdDpbMC05XSlbXlxcc10rL2dpXHJcbiAgKTtcclxuICBpZiAodXJsLm1hdGNoKHVybHJlZ2V4KSkge1xyXG4gICAgdXJsID0gdXJsLm1hdGNoKHVybHJlZ2V4KVswXS50b1N0cmluZygpO1xyXG4gICAgdXJsID0gL15baHR0cHN8aHR0cF0vLnRlc3QodXJsKSA/IHVybCA6IFwiaHR0cHM6Ly9cIiArIHVybDtcclxuICB9XHJcbiAgcmV0dXJuIHVybDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9jYWxGaWxlKHBhdGg6IGZzLlBhdGhMaWtlKSB7XHJcbiAgdmFyIGNsZWFucGF0aCA9IHBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKC9eXFxcIiguKylcXFwiJC8sIFwiJDFcIik7IC8vIGZvciByZW1vdmluZyBxdW90ZXMgZnJvbSBsaW5rcyBjb3BpZWQgdmlhIFwiY29weSBhcyBwYXRoXCIgaW4gd2luZG93c1xyXG4gIGlmIChmcy5leGlzdHNTeW5jKGNsZWFucGF0aCkpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc1NhbWVWaWRlbyhyZWFjdHBsYXllcjogYW55LCBsYXN0TGluZTogc3RyaW5nKSB7XHJcbiAgaWYgKCFyZWFjdHBsYXllcikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICBsYXN0TGluZSA9IGxhc3RMaW5lLnRvU3RyaW5nKCkucmVwbGFjZSgvXlxcXCIoLispXFxcIiQvLCBcIiQxXCIpO1xyXG4gIHZhciB1cmwgPSByZWFjdHBsYXllcj8ucHJvcHM/Lm1haW5fdXJsIHx8IHJlYWN0cGxheWVyPy5wcm9wcz8udXJsO1xyXG4gIGlmICghdXJsKSByZXR1cm4gZmFsc2U7XHJcbiAgaWYgKHVybC5pbmNsdWRlcyhsYXN0TGluZSkgfHwgbGFzdExpbmUuaW5jbHVkZXModXJsKSkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICB2YXIgcGxheWVyID0gcmVhY3RwbGF5ZXIuZ2V0SW50ZXJuYWxQbGF5ZXIoKTtcclxuXHJcbiAgLy8geW91dHViZSBpZFxyXG4gIGlmIChwbGF5ZXI/LnBsYXllckluZm8pIHtcclxuICAgIGlmIChsYXN0TGluZS5pbmNsdWRlcyhwbGF5ZXIucGxheWVySW5mbz8udmlkZW9EYXRhPy52aWRlb19pZCkpIHtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFyIHNhbWUgPSBmYWxzZTtcclxuICB2YXIgcGF0dGVybnMgPSBbXHJcbiAgICAvLyBub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGF0dGVybnMuanNcclxuICAgIC92aW1lb1xcLmNvbVxcLyg/IXByb2dyZXNzaXZlX3JlZGlyZWN0KS4rLyxcclxuICAgIC9eaHR0cHM/OlxcL1xcLyh3d3dcXC4pP2ZhY2Vib29rXFwuY29tLipcXC8odmlkZW8ocyk/fHdhdGNofHN0b3J5KShcXC5waHA/fFxcLykuKyQvLFxyXG4gICAgL15odHRwcz86XFwvXFwvZmJcXC53YXRjaFxcLy4rJC8sXHJcbiAgICAvc3RyZWFtYWJsZVxcLmNvbVxcLyhbYS16MC05XSspJC8sXHJcbiAgICAvKD86d2lzdGlhXFwuKD86Y29tfG5ldCl8d2lcXC5zdClcXC8oPzptZWRpYXN8ZW1iZWQpXFwvKD86aWZyYW1lXFwvKT8oLiopJC8sXHJcbiAgICAvKD86d3d3XFwufGdvXFwuKT90d2l0Y2hcXC50dlxcL3ZpZGVvc1xcLyhcXGQrKSgkfFxcPykvLFxyXG4gICAgLyg/Ond3d1xcLnxnb1xcLik/dHdpdGNoXFwudHZcXC8oW2EtekEtWjAtOV9dKykoJHxcXD8pLyxcclxuICAgIC9eKD86KD86aHR0cHM/KTopPyg/OlxcL1xcLyk/KD86d3d3XFwuKT8oPzooPzpkYWlseW1vdGlvblxcLmNvbSg/OlxcL2VtYmVkKT9cXC92aWRlbyl8ZGFpXFwubHkpXFwvKFthLXpBLVowLTldKykoPzpfW1xcd18tXSspPyQvLFxyXG4gICAgL21peGNsb3VkXFwuY29tXFwvKFteL10rXFwvW14vXSspLyxcclxuICAgIC92aWR5YXJkLmNvbVxcLyg/OndhdGNoXFwvKT8oW2EtekEtWjAtOS1fXSspLyxcclxuICAgIC9eaHR0cHM/OlxcL1xcL1thLXpBLVpdK1xcLmthbHR1cmEuKGNvbXxvcmcpXFwvcFxcLyhbMC05XSspXFwvc3BcXC8oWzAtOV0rKTAwXFwvZW1iZWRJZnJhbWVKc1xcL3VpY29uZl9pZFxcLyhbMC05XSspXFwvcGFydG5lcl9pZFxcLyhbMC05XSspKC4qKWVudHJ5X2lkLihbYS16QS1aMC05LV9dLiopJC8sXHJcbiAgICAvL2h0dHBzOi8vZ2lzdC5naXRodWIuY29tL1RyZXZvckpUQ2xhcmtlL2ExNGMzN2RiM2MxMWVlMjNhNzAwXHJcbiAgICAvaHR0cHM/OlxcL1xcLyg/OndcXC58d3d3XFwufCkoPzpzb3VuZGNsb3VkXFwuY29tXFwvKSg/Oig/OnBsYXllclxcL1xcP3VybD1odHRwc1xcJTNBXFwvXFwvYXBpLnNvdW5kY2xvdWQuY29tXFwvdHJhY2tzXFwvKXwpKCgoXFx3fC0pW15BLXpdezd9KXwoW0EtWmEtejAtOV0rKD86Wy1fXVtBLVphLXowLTldKykqKD8hXFwvc2V0cyg/OlxcL3wkKSkoPzpcXC9bQS1aYS16MC05XSsoPzpbLV9dW0EtWmEtejAtOV0rKSopezEsMn0pKS8sXHJcbiAgXTtcclxuICBwYXR0ZXJucy5mb3JFYWNoKChwYXR0ZXJuKSA9PiB7XHJcbiAgICB2YXIgaWQgPSB1cmwubWF0Y2gocGF0dGVybik/LlsxXSB8fCBudWxsO1xyXG4gICAgaWYgKHBhdHRlcm4udGVzdChsYXN0TGluZSkgJiYgbmV3IFJlZ0V4cChpZCkudGVzdChsYXN0TGluZSkpIHtcclxuICAgICAgc2FtZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHNhbWU7XHJcbn1cclxuIl0sCiAgIm1hcHBpbmdzIjog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QUNiLHlCQUF5QjtBQUFBLFVBQ3pCLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLGNBQWM7QUFBQSxVQUNkLE9BQU87QUFBQSxVQUNQLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLHlCQUF5QjtBQUFBLFVBQ3pCLHVCQUF1QjtBQUFBLFVBQ3ZCLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULGNBQWM7QUFBQSxVQUNkLEtBQUs7QUFBQSxVQUNMLE1BQU07QUFBQSxVQUNOLFlBQVk7QUFBQSxVQUNaLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxVQUNSLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLElBQUk7QUFBQSxVQUNKLFFBQVE7QUFBQSxVQUNSLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLGFBQWE7QUFBQSxVQUNiLGNBQWM7QUFBQSxVQUNkLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxVQUNaLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULGFBQWE7QUFBQSxVQUNiLGFBQWE7QUFBQSxVQUNiLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFVBQVU7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxVQUNQLFFBQVE7QUFBQSxVQUNSLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFlBQVk7QUFBQSxVQUNaLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUVOLE9BQU87QUFBQSxVQUNQLGNBQWM7QUFBQSxVQUNkLGlCQUFpQjtBQUFBLFVBQ2pCLFlBQVk7QUFBQSxVQUNaLFVBQVU7QUFBQSxVQUNWLG1CQUFtQjtBQUFBLFVBQ25CLHNCQUFzQjtBQUFBLFVBQ3RCLGNBQWM7QUFBQSxVQUNkLFlBQVk7QUFBQSxVQUNaLFdBQVc7QUFBQSxVQUNYLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxVQUNmLFFBQVE7QUFBQSxVQUNSLGVBQWU7QUFBQSxVQUNmLGVBQWU7QUFBQSxVQUNmLGFBQWE7QUFBQSxVQUNiLFNBQVM7QUFBQSxVQUNULGVBQWU7QUFBQSxVQUNmLGVBQWU7QUFBQSxVQUNmLGtCQUFrQjtBQUFBLFVBQ2xCLGFBQWE7QUFBQSxVQUNiLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLGFBQWE7QUFBQSxVQUNiLGVBQWU7QUFBQSxVQUNmLFVBQVU7QUFBQSxVQUNWLGFBQWE7QUFBQSxVQUNiLE9BQU87QUFBQSxVQUNQLG9CQUFvQjtBQUFBLFVBQ3BCLHVCQUF1QjtBQUFBLFVBQ3ZCLDJCQUEyQjtBQUFBLFVBQzNCLCtCQUErQjtBQUFBLFVBQy9CLGNBQWM7QUFBQSxVQUNkLGlCQUFpQjtBQUFBLFVBQ2pCLGdCQUFnQjtBQUFBLFVBQ2hCLG1CQUFtQjtBQUFBLFVBQ25CLG1CQUFtQjtBQUFBLFVBQ25CLGtCQUFrQjtBQUFBLFVBQ2xCLFFBQVE7QUFBQSxVQUNSLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLEdBQUc7QUFBQSxVQUNILFVBQVU7QUFBQSxVQUNWLFlBQVk7QUFBQSxVQUNaLFNBQVM7QUFBQSxVQUNULGlCQUFpQjtBQUFBLFVBQ2pCLFdBQVc7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULGtCQUFrQjtBQUFBLFVBQ2xCLHFCQUFxQjtBQUFBLFVBQ3JCLEtBQUs7QUFBQSxVQUNMLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLGtCQUFrQjtBQUFBLFVBQ2xCLHFCQUFxQjtBQUFBLFVBQ3JCLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLDJCQUEyQjtBQUFBLFVBQzNCLE1BQU07QUFBQSxVQUNOLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLGFBQWE7QUFBQSxVQUNiLFFBQVE7QUFBQSxVQUNSLFdBQVc7QUFBQSxVQUNYLGFBQWE7QUFBQSxVQUNiLGNBQWM7QUFBQSxVQUNkLGlCQUFpQjtBQUFBLFVBQ2pCLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxVQUNmLFdBQVc7QUFBQSxVQUNYLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxVQUNmLFVBQVU7QUFBQSxVQUNWLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLG9CQUFvQjtBQUFBLFVBQ3BCLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxVQUNmLFFBQVE7QUFBQSxVQUNSLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLDRCQUE0QjtBQUFBLFVBQzVCLGdDQUFnQztBQUFBLFVBQ2hDLDBCQUEwQjtBQUFBLFVBQzFCLDhCQUE4QjtBQUFBLFVBQzlCLFVBQVU7QUFBQSxVQUNWLG1CQUFtQjtBQUFBLFVBQ25CLGVBQWU7QUFBQSxVQUNmLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLGVBQWU7QUFBQSxVQUNmLGNBQWM7QUFBQSxVQUNkLGtCQUFrQjtBQUFBLFVBQ2xCLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLG1CQUFtQjtBQUFBLFVBQ25CLEtBQUs7QUFBQSxVQUNMLElBQUk7QUFBQSxVQUNKLFFBQVE7QUFBQSxVQUNSLFdBQVc7QUFBQSxVQUNYLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLEdBQUc7QUFBQSxVQUNILGNBQWM7QUFBQSxVQUNkLGtCQUFrQjtBQUFBLFVBQ2xCLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLFlBQVk7QUFBQSxVQUNaLFVBQVU7QUFBQSxVQUNWLGNBQWM7QUFBQSxVQUNkLGVBQWU7QUFBQSxVQUNmLGtCQUFrQjtBQUFBLFVBQ2xCLGVBQWU7QUFBQSxVQUNmLGtCQUFrQjtBQUFBLFVBQ2xCLG1CQUFtQjtBQUFBLFVBQ25CLE9BQU87QUFBQSxVQUNQLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLGNBQWM7QUFBQSxVQUNkLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLGFBQWE7QUFBQSxVQUNiLGFBQWE7QUFBQSxVQUNiLE1BQU07QUFBQSxVQUNOLGtCQUFrQjtBQUFBLFVBQ2xCLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLE1BQU07QUFBQSxVQUNOLFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLFFBQVE7QUFBQSxVQUNSLGFBQWE7QUFBQSxVQUNiLFFBQVE7QUFBQSxVQUNSLFVBQVU7QUFBQSxVQUNWLGtCQUFrQjtBQUFBLFVBQ2xCLHFCQUFxQjtBQUFBLFVBQ3JCLG1CQUFtQjtBQUFBLFVBQ25CLHNCQUFzQjtBQUFBLFVBQ3RCLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxVQUNmLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFlBQVk7QUFBQSxVQUNaLHFCQUFxQjtBQUFBLFVBQ3JCLGtCQUFrQjtBQUFBLFVBQ2xCLGNBQWM7QUFBQSxVQUNkLGVBQWU7QUFBQSxVQUNmLGtCQUFrQjtBQUFBLFVBQ2xCLFFBQVE7QUFBQSxVQUNSLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLFFBQVE7QUFBQSxVQUNSLGVBQWU7QUFBQSxVQUNmLHFCQUFxQjtBQUFBLFVBQ3JCLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLEdBQUc7QUFBQSxVQUNILFFBQVE7QUFBQSxVQUNSLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLGlCQUFpQjtBQUFBLFVBQ2pCLG9CQUFvQjtBQUFBLFVBQ3BCLGFBQWE7QUFBQSxVQUNiLFdBQVc7QUFBQSxVQUNYLG9CQUFvQjtBQUFBLFVBQ3BCLGtCQUFrQjtBQUFBLFVBQ2xCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFVBQVU7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLGdCQUFnQjtBQUFBLFVBQ2hCLG1CQUFtQjtBQUFBLFVBQ25CLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxVQUNULGtCQUFrQjtBQUFBLFVBQ2xCLGtCQUFrQjtBQUFBLFVBQ2xCLE9BQU87QUFBQSxVQUNQLGNBQWM7QUFBQSxVQUNkLGFBQWE7QUFBQSxVQUNiLGNBQWM7QUFBQSxVQUNkLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLGFBQWE7QUFBQSxVQUNiLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLHVCQUF1QjtBQUFBLFVBQ3ZCLDBCQUEwQjtBQUFBLFVBQzFCLHdCQUF3QjtBQUFBLFVBQ3hCLDJCQUEyQjtBQUFBLFVBQzNCLFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxVQUNSLGlCQUFpQjtBQUFBLFVBQ2pCLG9CQUFvQjtBQUFBLFVBQ3BCLGtCQUFrQjtBQUFBLFVBQ2xCLHFCQUFxQjtBQUFBLFVBQ3JCLGVBQWU7QUFBQSxVQUNmLGtCQUFrQjtBQUFBLFVBQ2xCLGdCQUFnQjtBQUFBLFVBQ2hCLG1CQUFtQjtBQUFBLFVBQ25CLGtCQUFrQjtBQUFBLFVBQ2xCLHFCQUFxQjtBQUFBLFVBQ3JCLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLGVBQWU7QUFBQSxVQUNmLGtCQUFrQjtBQUFBLFVBQ2xCLGdDQUFnQztBQUFBLFVBQ2hDLDBCQUEwQjtBQUFBLFVBQzFCLGNBQWM7QUFBQSxVQUNkLGdCQUFnQjtBQUFBLFVBQ2hCLGFBQWE7QUFBQSxVQUNiLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLG1CQUFtQjtBQUFBLFVBQ25CLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxVQUNmLGtCQUFrQjtBQUFBLFVBQ2xCLElBQUk7QUFBQSxVQUNKLFdBQVc7QUFBQSxVQUNYLFFBQVE7QUFBQSxVQUNSLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLG1CQUFtQjtBQUFBLFVBQ25CLHNCQUFzQjtBQUFBLFVBQ3RCLG9CQUFvQjtBQUFBLFVBQ3BCLHVCQUF1QjtBQUFBLFVBQ3ZCLFNBQVM7QUFBQSxVQUNULGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLGNBQWM7QUFBQSxVQUNkLGlCQUFpQjtBQUFBLFVBQ2pCLFlBQVk7QUFBQSxVQUNaLGdCQUFnQjtBQUFBLFVBQ2hCLGNBQWM7QUFBQSxVQUNkLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFFBQVE7QUFBQSxVQUNSLGNBQWM7QUFBQSxVQUNkLGlCQUFpQjtBQUFBLFVBQ2pCLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLGNBQWM7QUFBQSxVQUNkLGFBQWE7QUFBQSxVQUNiLGlCQUFpQjtBQUFBLFVBQ2pCLGFBQWE7QUFBQSxVQUNiLGlCQUFpQjtBQUFBLFVBQ2pCLFVBQVU7QUFBQSxVQUNWLGFBQWE7QUFBQSxVQUNiLGNBQWM7QUFBQSxVQUNkLGlCQUFpQjtBQUFBLFVBQ2pCLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxVQUNmLGtCQUFrQjtBQUFBLFVBQ2xCLE9BQU87QUFBQSxVQUNQLFFBQVE7QUFBQSxVQUNSLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLEdBQUc7QUFBQSxVQUNILGtCQUFrQjtBQUFBLFVBQ2xCLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLGNBQWM7QUFBQSxVQUNkLGlCQUFpQjtBQUFBLFVBQ2pCLGNBQWM7QUFBQSxVQUNkLGlCQUFpQjtBQUFBLFVBQ2pCLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxVQUNmLFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLE9BQU87QUFBQSxVQUNQLGFBQWE7QUFBQSxVQUNiLFlBQVk7QUFBQSxVQUNaLGVBQWU7QUFBQSxVQUNmLFVBQVU7QUFBQSxVQUNWLElBQUk7QUFBQSxVQUNKLElBQUk7QUFBQSxVQUNKLEdBQUc7QUFBQSxVQUNILGtCQUFrQjtBQUFBLFVBQ2xCLEdBQUc7QUFBQSxVQUNILFlBQVk7QUFBQTtBQUdkLFlBQUksaUJBQWlCO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUEsVUFFaEIsb0JBQW9CO0FBQUEsVUFDcEIsZ0JBQWdCO0FBQUEsVUFDaEIsaUJBQWlCO0FBQUEsVUFFakIsZUFBZTtBQUFBLFVBRWYsZ0JBQWdCO0FBQUEsVUFFaEIscUJBQXFCO0FBQUEsVUFDckIsY0FBYztBQUFBLFVBQ2Qsd0JBQXdCO0FBQUEsVUFFeEIscUJBQXFCO0FBQUEsVUFDckIsZ0JBQWdCO0FBQUEsVUFDaEIsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCO0FBQUEsVUFDakIsY0FBYztBQUFBLFVBQ2QsY0FBYztBQUFBLFVBQ2Qsa0JBQWtCO0FBQUEsVUFDbEIsd0JBQXdCO0FBQUEsVUFDeEIsb0JBQW9CO0FBQUEsVUFDcEIsb0JBQW9CO0FBQUEsVUFDcEIsZ0JBQWdCO0FBQUEsVUFDaEIsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCO0FBQUEsVUFDakIsYUFBYTtBQUFBLFVBQ2IsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCO0FBQUEsVUFDakIsa0JBQWtCO0FBQUEsVUFFbEIsZUFBZTtBQUFBLFVBQ2YsYUFBYTtBQUFBLFVBQ2IsYUFBYTtBQUFBLFVBQ2IsaUJBQWlCO0FBQUEsVUFFakIsbUJBQW1CO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUEsVUFFaEIseUJBQXlCO0FBQUEsVUFDekIsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsaUJBQWlCO0FBQUEsVUFDakIsb0JBQW9CO0FBQUEsVUFDcEIscUJBQXFCO0FBQUEsVUFDckIsZUFBZTtBQUFBLFVBQ2YsbUJBQW1CO0FBQUEsVUFDbkIsYUFBYTtBQUFBLFVBQ2IsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUE7QUFHbEIsWUFBSSxtQkFBbUI7QUFDdkIsWUFBSSxRQUFRLElBQUksT0FBTyxjQUFjLHNCQUFzQjtBQUMzRCxZQUFJLGFBQWEsSUFBSSxPQUFPLGtCQUFrQixzQkFBc0I7QUFFcEUsa0NBQTBCLFNBQVMsTUFBTTtBQUN2QztBQUNFLGdCQUFJLGVBQWUsS0FBSyxrQkFBa0IsU0FBUyxpQkFBaUIsT0FBTztBQUN6RSxxQkFBTztBQUFBO0FBR1QsZ0JBQUksV0FBVyxLQUFLLE9BQU87QUFDekIsa0JBQUksV0FBVyxVQUFVLEtBQUssTUFBTSxHQUFHO0FBQ3ZDLGtCQUFJLGNBQWMsZUFBZSxlQUFlLFlBQVksV0FBVztBQUd2RSxrQkFBSSxlQUFlLE1BQU07QUFDdkIsc0JBQU0saUdBQWlHO0FBRXZHLGlDQUFpQixRQUFRO0FBQ3pCLHVCQUFPO0FBQUE7QUFJVCxrQkFBSSxTQUFTLGFBQWE7QUFDeEIsc0JBQU0sbURBQW1ELE1BQU07QUFFL0QsaUNBQWlCLFFBQVE7QUFDekIsdUJBQU87QUFBQTtBQUFBO0FBSVgsZ0JBQUksTUFBTSxLQUFLLE9BQU87QUFDcEIsa0JBQUksaUJBQWlCLEtBQUs7QUFDMUIsa0JBQUksZUFBZSxlQUFlLGVBQWUsa0JBQWtCLGlCQUFpQjtBQUdwRixrQkFBSSxnQkFBZ0IsTUFBTTtBQUN4QixpQ0FBaUIsUUFBUTtBQUN6Qix1QkFBTztBQUFBO0FBSVQsa0JBQUksU0FBUyxjQUFjO0FBQ3pCLHNCQUFNLG1EQUFtRCxNQUFNO0FBRS9ELGlDQUFpQixRQUFRO0FBQ3pCLHVCQUFPO0FBQUE7QUFBQTtBQUFBO0FBS2IsaUJBQU87QUFBQTtBQUdULHNDQUE4QixNQUFNLE9BQU87QUFDekM7QUFDRSxnQkFBSSxlQUFlO0FBRW5CLHFCQUFTLE9BQU8sT0FBTztBQUNyQixrQkFBSSxVQUFVLGlCQUFpQixNQUFNO0FBRXJDLGtCQUFJLENBQUMsU0FBUztBQUNaLDZCQUFhLEtBQUs7QUFBQTtBQUFBO0FBSXRCLGdCQUFJLG9CQUFvQixhQUFhLElBQUksU0FBVSxNQUFNO0FBQ3ZELHFCQUFPLE1BQU0sT0FBTztBQUFBLGVBQ25CLEtBQUs7QUFFUixnQkFBSSxhQUFhLFdBQVcsR0FBRztBQUM3QixvQkFBTSxrR0FBdUcsbUJBQW1CO0FBQUEsdUJBQ3ZILGFBQWEsU0FBUyxHQUFHO0FBQ2xDLG9CQUFNLG1HQUF3RyxtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFLdkksb0NBQTRCLE1BQU0sT0FBTztBQUN2QyxjQUFJLGtCQUFrQixNQUFNLFFBQVE7QUFDbEM7QUFBQTtBQUdGLCtCQUFxQixNQUFNO0FBQUE7QUFHN0IsWUFBSSxtQkFBbUI7QUFDdkIsc0NBQThCLE1BQU0sT0FBTztBQUN6QztBQUNFLGdCQUFJLFNBQVMsV0FBVyxTQUFTLGNBQWMsU0FBUyxVQUFVO0FBQ2hFO0FBQUE7QUFHRixnQkFBSSxTQUFTLFFBQVEsTUFBTSxVQUFVLFFBQVEsQ0FBQyxrQkFBa0I7QUFDOUQsaUNBQW1CO0FBRW5CLGtCQUFJLFNBQVMsWUFBWSxNQUFNLFVBQVU7QUFDdkMsc0JBQU0sOEtBQXdMO0FBQUEscUJBQ3pMO0FBQ0wsc0JBQU0sOElBQXdKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNdEssWUFBSSxxQkFBcUIsV0FBWTtBQUFBO0FBRXJDO0FBQ0UsY0FBSSxxQkFBcUI7QUFDekIsY0FBSSxtQkFBbUI7QUFDdkIsY0FBSSwyQkFBMkI7QUFDL0IsY0FBSSxVQUFVLElBQUksT0FBTyxjQUFjLHNCQUFzQjtBQUM3RCxjQUFJLGVBQWUsSUFBSSxPQUFPLGtCQUFrQixzQkFBc0I7QUFFdEUsK0JBQXFCLFNBQVUsU0FBUyxNQUFNLE9BQU8sZUFBZTtBQUNsRSxnQkFBSSxlQUFlLEtBQUssb0JBQW9CLFNBQVMsbUJBQW1CLE9BQU87QUFDN0UscUJBQU87QUFBQTtBQUdULGdCQUFJLGlCQUFpQixLQUFLO0FBRTFCLGdCQUFJLG1CQUFtQixlQUFlLG1CQUFtQixjQUFjO0FBQ3JFLG9CQUFNO0FBRU4saUNBQW1CLFFBQVE7QUFDM0IscUJBQU87QUFBQTtBQUlULGdCQUFJLGlCQUFpQixNQUFNO0FBQ3pCLGtCQUFJLGdDQUErQixjQUFjLDhCQUM3Qyw2QkFBNEIsY0FBYztBQUU5QyxrQkFBSSw4QkFBNkIsZUFBZSxPQUFPO0FBQ3JELHVCQUFPO0FBQUE7QUFHVCxrQkFBSSxtQkFBbUIsMkJBQTBCLGVBQWUsa0JBQWtCLDJCQUEwQixrQkFBa0I7QUFFOUgsa0JBQUksb0JBQW9CLE1BQU07QUFDNUIsc0JBQU0sMkRBQTJELE1BQU07QUFFdkUsbUNBQW1CLFFBQVE7QUFDM0IsdUJBQU87QUFBQTtBQUdULGtCQUFJLGlCQUFpQixLQUFLLE9BQU87QUFDL0Isc0JBQU0sNERBQTREO0FBRWxFLG1DQUFtQixRQUFRO0FBQzNCLHVCQUFPO0FBQUE7QUFBQSx1QkFFQSxpQkFBaUIsS0FBSyxPQUFPO0FBSXRDLGtCQUFJLHlCQUF5QixLQUFLLE9BQU87QUFDdkMsc0JBQU0saUhBQXNIO0FBQUE7QUFHOUgsaUNBQW1CLFFBQVE7QUFDM0IscUJBQU87QUFBQTtBQUlULGdCQUFJLFFBQVEsS0FBSyxTQUFTLGFBQWEsS0FBSyxPQUFPO0FBQ2pELHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxtQkFBbUIsYUFBYTtBQUNsQyxvQkFBTTtBQUVOLGlDQUFtQixRQUFRO0FBQzNCLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxtQkFBbUIsUUFBUTtBQUM3QixvQkFBTTtBQUVOLGlDQUFtQixRQUFRO0FBQzNCLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxtQkFBbUIsUUFBUSxVQUFVLFFBQVEsVUFBVSxVQUFhLE9BQU8sVUFBVSxVQUFVO0FBQ2pHLG9CQUFNLGlHQUFzRyxPQUFPO0FBRW5ILGlDQUFtQixRQUFRO0FBQzNCLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxPQUFPLFVBQVUsWUFBWSxNQUFNLFFBQVE7QUFDN0Msb0JBQU0seUZBQThGO0FBRXBHLGlDQUFtQixRQUFRO0FBQzNCLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxlQUFlLGdCQUFnQjtBQUNuQyxnQkFBSSxhQUFhLGlCQUFpQixRQUFRLGFBQWEsU0FBUztBQUVoRSxnQkFBSSxzQkFBc0IsZUFBZSxpQkFBaUI7QUFDeEQsa0JBQUksZUFBZSxzQkFBc0I7QUFFekMsa0JBQUksaUJBQWlCLE1BQU07QUFDekIsc0JBQU0saURBQWlELE1BQU07QUFFN0QsbUNBQW1CLFFBQVE7QUFDM0IsdUJBQU87QUFBQTtBQUFBLHVCQUVBLENBQUMsY0FBYyxTQUFTLGdCQUFnQjtBQUdqRCxvQkFBTSxnUUFBb1IsTUFBTTtBQUVoUyxpQ0FBbUIsUUFBUTtBQUMzQixxQkFBTztBQUFBO0FBR1QsZ0JBQUksT0FBTyxVQUFVLGFBQWEsaUNBQWlDLE1BQU0sT0FBTyxjQUFjLFFBQVE7QUFDcEcsa0JBQUksT0FBTztBQUNULHNCQUFNLG1KQUE2SixPQUFPLE1BQU0sTUFBTSxPQUFPO0FBQUEscUJBQ3hMO0FBQ0wsc0JBQU0sMFFBQThSLE9BQU8sTUFBTSxNQUFNLE9BQU8sTUFBTSxNQUFNO0FBQUE7QUFHNVUsaUNBQW1CLFFBQVE7QUFDM0IscUJBQU87QUFBQTtBQUtULGdCQUFJLFlBQVk7QUFDZCxxQkFBTztBQUFBO0FBSVQsZ0JBQUksaUNBQWlDLE1BQU0sT0FBTyxjQUFjLFFBQVE7QUFDdEUsaUNBQW1CLFFBQVE7QUFDM0IscUJBQU87QUFBQTtBQUlULGdCQUFLLFdBQVUsV0FBVyxVQUFVLFdBQVcsaUJBQWlCLFFBQVEsYUFBYSxTQUFTLFNBQVM7QUFDckcsb0JBQU0scUZBQStGLE9BQU8sTUFBTSxVQUFVLFVBQVUscURBQXFELHFGQUFxRixNQUFNO0FBRXRSLGlDQUFtQixRQUFRO0FBQzNCLHFCQUFPO0FBQUE7QUFHVCxtQkFBTztBQUFBO0FBQUE7QUFJWCxZQUFJLHdCQUF3QixTQUFVLE1BQU0sT0FBTyxlQUFlO0FBQ2hFO0FBQ0UsZ0JBQUksZUFBZTtBQUVuQixxQkFBUyxPQUFPLE9BQU87QUFDckIsa0JBQUksVUFBVSxtQkFBbUIsTUFBTSxLQUFLLE1BQU0sTUFBTTtBQUV4RCxrQkFBSSxDQUFDLFNBQVM7QUFDWiw2QkFBYSxLQUFLO0FBQUE7QUFBQTtBQUl0QixnQkFBSSxvQkFBb0IsYUFBYSxJQUFJLFNBQVUsTUFBTTtBQUN2RCxxQkFBTyxNQUFNLE9BQU87QUFBQSxlQUNuQixLQUFLO0FBRVIsZ0JBQUksYUFBYSxXQUFXLEdBQUc7QUFDN0Isb0JBQU0sbU1BQTZNLG1CQUFtQjtBQUFBLHVCQUM3TixhQUFhLFNBQVMsR0FBRztBQUNsQyxvQkFBTSx5TUFBbU4sbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBS2xQLHNDQUE4QixNQUFNLE9BQU8sZUFBZTtBQUN4RCxjQUFJLGtCQUFrQixNQUFNLFFBQVE7QUFDbEM7QUFBQTtBQUdGLGdDQUFzQixNQUFNLE9BQU87QUFBQTtBQUdyQyxZQUFJLG1DQUFtQztBQUN2QyxZQUFJLG1CQUFtQixLQUFLO0FBQzVCLFlBQUksbUJBQW1CLEtBQUs7QUFNNUIsWUFBSSw0Q0FBNEMsbUNBQW1DLG1CQUFtQjtBQUl0RyxZQUFJLHdCQUF3QjtBQUM1QixtQ0FBMkIsT0FBTztBQUNoQztBQUNFLGdCQUFJLDBCQUEwQixNQUFNO0FBQ2xDLG9CQUFNO0FBQUE7QUFBQTtBQUlWLGtDQUF3QjtBQUFBO0FBRTFCLHVDQUErQjtBQUM3QjtBQUNFLGdCQUFJLDBCQUEwQixNQUFNO0FBQ2xDLG9CQUFNO0FBQUE7QUFBQTtBQUlWLGtDQUF3QjtBQUFBO0FBRTFCLGtDQUEwQixPQUFPO0FBQy9CLGlCQUFPLFVBQVU7QUFBQTtBQVduQixnQ0FBd0IsYUFBYTtBQUduQyxjQUFJLFNBQVMsWUFBWSxVQUFVLFlBQVksY0FBYztBQUU3RCxjQUFJLE9BQU8seUJBQXlCO0FBQ2xDLHFCQUFTLE9BQU87QUFBQTtBQUtsQixpQkFBTyxPQUFPLGFBQWEsWUFBWSxPQUFPLGFBQWE7QUFBQTtBQUc3RCxZQUFJLGNBQWM7QUFDbEIsWUFBSSxnQkFBZ0I7QUFDcEIsWUFBSSxlQUFlO0FBRW5CLHNDQUE4QixRQUFRO0FBR3BDLGNBQUksbUJBQW1CLG9CQUFvQjtBQUUzQyxjQUFJLENBQUMsa0JBQWtCO0FBRXJCO0FBQUE7QUFHRixjQUFJLE9BQU8sZ0JBQWdCLFlBQVk7QUFDckMsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsY0FBSSxZQUFZLGlCQUFpQjtBQUVqQyxjQUFJLFdBQVc7QUFDYixnQkFBSSxTQUFTLDZCQUE2QjtBQUUxQyx3QkFBWSxpQkFBaUIsV0FBVyxpQkFBaUIsTUFBTTtBQUFBO0FBQUE7QUFJbkUsMENBQWtDLE1BQU07QUFDdEMsd0JBQWM7QUFBQTtBQUVoQixxQ0FBNkIsUUFBUTtBQUNuQyxjQUFJLGVBQWU7QUFDakIsZ0JBQUksY0FBYztBQUNoQiwyQkFBYSxLQUFLO0FBQUEsbUJBQ2I7QUFDTCw2QkFBZSxDQUFDO0FBQUE7QUFBQSxpQkFFYjtBQUNMLDRCQUFnQjtBQUFBO0FBQUE7QUFHcEIscUNBQTZCO0FBQzNCLGlCQUFPLGtCQUFrQixRQUFRLGlCQUFpQjtBQUFBO0FBRXBELHdDQUFnQztBQUM5QixjQUFJLENBQUMsZUFBZTtBQUNsQjtBQUFBO0FBR0YsY0FBSSxTQUFTO0FBQ2IsY0FBSSxnQkFBZ0I7QUFDcEIsMEJBQWdCO0FBQ2hCLHlCQUFlO0FBQ2YsK0JBQXFCO0FBRXJCLGNBQUksZUFBZTtBQUNqQixxQkFBUyxJQUFJLEdBQUcsSUFBSSxjQUFjLFFBQVEsS0FBSztBQUM3QyxtQ0FBcUIsY0FBYztBQUFBO0FBQUE7QUFBQTtBQVd6QyxZQUFJLHFCQUFxQixTQUFVLElBQUksYUFBYTtBQUNsRCxpQkFBTyxHQUFHO0FBQUE7QUFHWixZQUFJLGdCQUFnQixXQUFZO0FBQUE7QUFFaEMsWUFBSSx1QkFBdUI7QUFFM0Isc0NBQThCO0FBSzVCLGNBQUkseUNBQXlDO0FBRTdDLGNBQUksd0NBQXdDO0FBTTFDO0FBQ0E7QUFBQTtBQUFBO0FBSUosZ0NBQXdCLElBQUksR0FBRyxHQUFHO0FBQ2hDLGNBQUksc0JBQXNCO0FBR3hCLG1CQUFPLEdBQUcsR0FBRztBQUFBO0FBR2YsaUNBQXVCO0FBRXZCLGNBQUk7QUFDRixtQkFBTyxtQkFBbUIsSUFBSSxHQUFHO0FBQUEsb0JBQ2pDO0FBQ0EsbUNBQXVCO0FBQ3ZCO0FBQUE7QUFBQTtBQUdKLDJDQUFtQyxxQkFBcUIsc0JBQXNCLGdCQUFnQjtBQUM1RiwrQkFBcUI7QUFDckIsMEJBQWdCO0FBQUE7QUFHbEIsK0JBQXVCLEtBQUs7QUFDMUIsaUJBQU8sUUFBUSxZQUFZLFFBQVEsV0FBVyxRQUFRLFlBQVksUUFBUTtBQUFBO0FBRzVFLHlDQUFpQyxNQUFNLE1BQU0sT0FBTztBQUNsRCxrQkFBUTtBQUFBLGlCQUNEO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFDSCxxQkFBTyxDQUFDLENBQUUsT0FBTSxZQUFZLGNBQWM7QUFBQTtBQUcxQyxxQkFBTztBQUFBO0FBQUE7QUFVYiw2QkFBcUIsTUFBTSxrQkFBa0I7QUFDM0MsY0FBSSxZQUFZLEtBQUs7QUFFckIsY0FBSSxjQUFjLE1BQU07QUFFdEIsbUJBQU87QUFBQTtBQUdULGNBQUksUUFBUSw2QkFBNkI7QUFFekMsY0FBSSxVQUFVLE1BQU07QUFFbEIsbUJBQU87QUFBQTtBQUdULGNBQUksV0FBVyxNQUFNO0FBRXJCLGNBQUksd0JBQXdCLGtCQUFrQixLQUFLLE1BQU0sUUFBUTtBQUMvRCxtQkFBTztBQUFBO0FBR1QsY0FBSSxZQUFZLE9BQU8sYUFBYSxZQUFZO0FBQzlDLGtCQUFNLElBQUksTUFBTSxlQUFlLG1CQUFtQiwwREFBMEQsT0FBTyxXQUFXO0FBQUE7QUFHaEksaUJBQU87QUFBQTtBQUdULFlBQUksZ0NBQWdDO0FBR3BDLFlBQUksV0FBVztBQUNiLGNBQUk7QUFDRixnQkFBSSxVQUFVO0FBRWQsbUJBQU8sZUFBZSxTQUFTLFdBQVc7QUFBQSxjQUN4QyxLQUFLLFdBQVk7QUFDZixnREFBZ0M7QUFBQTtBQUFBO0FBR3BDLG1CQUFPLGlCQUFpQixRQUFRLFNBQVM7QUFDekMsbUJBQU8sb0JBQW9CLFFBQVEsU0FBUztBQUFBLG1CQUNyQyxHQUFQO0FBQ0EsNENBQWdDO0FBQUE7QUFBQTtBQUlwQywyQ0FBbUMsTUFBTSxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDeEUsY0FBSSxXQUFXLE1BQU0sVUFBVSxNQUFNLEtBQUssV0FBVztBQUVyRCxjQUFJO0FBQ0YsaUJBQUssTUFBTSxTQUFTO0FBQUEsbUJBQ2IsUUFBUDtBQUNBLGlCQUFLLFFBQVE7QUFBQTtBQUFBO0FBSWpCLFlBQUksNEJBQTRCO0FBRWhDO0FBcUJFLGNBQUksT0FBTyxXQUFXLGVBQWUsT0FBTyxPQUFPLGtCQUFrQixjQUFjLE9BQU8sYUFBYSxlQUFlLE9BQU8sU0FBUyxnQkFBZ0IsWUFBWTtBQUNoSyxnQkFBSSxXQUFXLFNBQVMsY0FBYztBQUV0Qyx3Q0FBNEIsa0NBQWtDLE1BQU0sTUFBTSxTQUFTLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBS25HLGtCQUFJLE9BQU8sYUFBYSxlQUFlLGFBQWEsTUFBTTtBQUN4RCxzQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQixrQkFBSSxNQUFNLFNBQVMsWUFBWTtBQUMvQixrQkFBSSxVQUFVO0FBT2Qsa0JBQUksV0FBVztBQUlmLGtCQUFJLGNBQWMsT0FBTztBQUd6QixrQkFBSSx3QkFBd0IsT0FBTyx5QkFBeUIsUUFBUTtBQUVwRSw4Q0FBZ0M7QUFLOUIseUJBQVMsb0JBQW9CLFNBQVMsZUFBYztBQUtwRCxvQkFBSSxPQUFPLE9BQU8sVUFBVSxlQUFlLE9BQU8sZUFBZSxVQUFVO0FBQ3pFLHlCQUFPLFFBQVE7QUFBQTtBQUFBO0FBT25CLGtCQUFJLFdBQVcsTUFBTSxVQUFVLE1BQU0sS0FBSyxXQUFXO0FBRXJELHVDQUF3QjtBQUN0QiwwQkFBVTtBQUNWO0FBQ0EscUJBQUssTUFBTSxTQUFTO0FBQ3BCLDJCQUFXO0FBQUE7QUFjYixrQkFBSTtBQUVKLGtCQUFJLGNBQWM7QUFDbEIsa0JBQUkscUJBQXFCO0FBRXpCLHlDQUEyQixPQUFPO0FBQ2hDLHlCQUFRLE1BQU07QUFDZCw4QkFBYztBQUVkLG9CQUFJLFdBQVUsUUFBUSxNQUFNLFVBQVUsS0FBSyxNQUFNLFdBQVcsR0FBRztBQUM3RCx1Q0FBcUI7QUFBQTtBQUd2QixvQkFBSSxNQUFNLGtCQUFrQjtBQUkxQixzQkFBSSxVQUFTLFFBQVEsT0FBTyxXQUFVLFVBQVU7QUFDOUMsd0JBQUk7QUFDRiw2QkFBTSxtQkFBbUI7QUFBQSw2QkFDbEIsT0FBUDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT1Isa0JBQUksVUFBVSxXQUFZLFFBQU8sT0FBTztBQUV4QyxxQkFBTyxpQkFBaUIsU0FBUztBQUNqQyx1QkFBUyxpQkFBaUIsU0FBUyxlQUFjO0FBR2pELGtCQUFJLFVBQVUsU0FBUyxPQUFPO0FBQzlCLHVCQUFTLGNBQWM7QUFFdkIsa0JBQUksdUJBQXVCO0FBQ3pCLHVCQUFPLGVBQWUsUUFBUSxTQUFTO0FBQUE7QUFHekMsa0JBQUksV0FBVyxVQUFVO0FBQ3ZCLG9CQUFJLENBQUMsYUFBYTtBQUdoQiwyQkFBUSxJQUFJLE1BQU07QUFBQSwyQkFDVCxvQkFBb0I7QUFFN0IsMkJBQVEsSUFBSSxNQUFNO0FBQUE7QUFHcEIscUJBQUssUUFBUTtBQUFBO0FBSWYscUJBQU8sb0JBQW9CLFNBQVM7QUFFcEMsa0JBQUksQ0FBQyxTQUFTO0FBS1o7QUFDQSx1QkFBTywwQkFBMEIsTUFBTSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNckQsWUFBSSw4QkFBOEI7QUFFbEMsWUFBSSxXQUFXO0FBQ2YsWUFBSSxjQUFjO0FBRWxCLFlBQUksa0JBQWtCO0FBQ3RCLFlBQUksZUFBZTtBQUNuQixZQUFJLFdBQVc7QUFBQSxVQUNiLFNBQVMsU0FBVSxRQUFPO0FBQ3hCLHVCQUFXO0FBQ1gsMEJBQWM7QUFBQTtBQUFBO0FBaUJsQix1Q0FBK0IsTUFBTSxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDcEUscUJBQVc7QUFDWCx3QkFBYztBQUNkLHNDQUE0QixNQUFNLFVBQVU7QUFBQTtBQWE5Qyx5REFBaUQsTUFBTSxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFDdEYsZ0NBQXNCLE1BQU0sTUFBTTtBQUVsQyxjQUFJLFVBQVU7QUFDWixnQkFBSSxTQUFRO0FBRVosZ0JBQUksQ0FBQyxpQkFBaUI7QUFDcEIsZ0NBQWtCO0FBQ2xCLDZCQUFlO0FBQUE7QUFBQTtBQUFBO0FBU3JCLHNDQUE4QjtBQUM1QixjQUFJLGlCQUFpQjtBQUNuQixnQkFBSSxTQUFRO0FBQ1osOEJBQWtCO0FBQ2xCLDJCQUFlO0FBQ2Ysa0JBQU07QUFBQTtBQUFBO0FBR1Ysa0NBQTBCO0FBQ3hCLGlCQUFPO0FBQUE7QUFFVCxvQ0FBNEI7QUFDMUIsY0FBSSxVQUFVO0FBQ1osZ0JBQUksU0FBUTtBQUNaLHVCQUFXO0FBQ1gsMEJBQWM7QUFDZCxtQkFBTztBQUFBLGlCQUNGO0FBQ0wsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFBQTtBQWFwQixzQkFBYSxLQUFLO0FBQ2hCLGlCQUFPLElBQUk7QUFBQTtBQUViLHFCQUFhLEtBQUs7QUFDaEIsaUJBQU8sSUFBSSxvQkFBb0I7QUFBQTtBQUVqQyxxQkFBYSxLQUFLLE9BQU87QUFDdkIsY0FBSSxrQkFBa0I7QUFBQTtBQUl4QixZQUFJLFVBRUo7QUFDQSxZQUFJLGdCQUVKO0FBRUEsWUFBSSxZQUVKO0FBQ0EsWUFBSSxTQUVKO0FBQ0EsWUFBSSxnQkFFSjtBQUNBLFlBQUksZUFFSjtBQUNBLFlBQUksV0FFSjtBQUNBLFlBQUksYUFFSjtBQUNBLFlBQUksb0JBRUo7QUFDQSxZQUFJLE1BRUo7QUFDQSxZQUFJLFdBRUo7QUFDQSxZQUFJLFVBRUo7QUFDQSxZQUFJLFlBRUo7QUFDQSxZQUFJLGFBRUo7QUFDQSxZQUFJLG1CQUVKO0FBQ0EsWUFBSSxzQkFBc0IsVUFBVSxTQUFTLFdBQVcsTUFBTSxXQUFXO0FBRXpFLFlBQUksaUJBRUo7QUFFQSxZQUFJLGFBRUo7QUFDQSxZQUFJLGdCQUVKO0FBQ0EsWUFBSSwrQkFFSjtBQUNBLFlBQUksU0FFSjtBQU1BLFlBQUksWUFFSjtBQUNBLFlBQUksZUFFSjtBQUNBLFlBQUksZ0JBRUo7QUFJQSxZQUFJLGlCQUVKO0FBQ0EsWUFBSSxrQkFFSjtBQUdBLFlBQUkscUJBRUosU0FBUyxXQUFhO0FBQ3RCLFlBQUksZUFBZSxZQUFZLFNBQVMsZ0JBQWdCLGVBQWUsTUFBTSxZQUFZO0FBQ3pGLFlBQUksYUFBYSxTQUFTLFdBQVcsTUFBTTtBQUUzQyxZQUFJLGNBQWMsVUFBVTtBQUk1QixZQUFJLGFBQWEsZUFBZSxnQkFBZ0I7QUFFaEQsWUFBSSxvQkFBb0IscUJBQXFCO0FBQzdDLHdDQUFnQyxPQUFPO0FBQ3JDLGNBQUksT0FBTztBQUNYLGNBQUksaUJBQWlCO0FBRXJCLGNBQUksQ0FBQyxNQUFNLFdBQVc7QUFHcEIsZ0JBQUksV0FBVztBQUVmLGVBQUc7QUFDRCxxQkFBTztBQUVQLGtCQUFLLE1BQUssUUFBUyxhQUFZLGdCQUFnQixTQUFTO0FBSXRELGlDQUFpQixLQUFLO0FBQUE7QUFHeEIseUJBQVcsS0FBSztBQUFBLHFCQUNUO0FBQUEsaUJBQ0o7QUFDTCxtQkFBTyxLQUFLLFFBQVE7QUFDbEIscUJBQU8sS0FBSztBQUFBO0FBQUE7QUFJaEIsY0FBSSxLQUFLLFFBQVEsVUFBVTtBQUd6QixtQkFBTztBQUFBO0FBS1QsaUJBQU87QUFBQTtBQUVULDhDQUFzQyxPQUFPO0FBQzNDLGNBQUksTUFBTSxRQUFRLG1CQUFtQjtBQUNuQyxnQkFBSSxnQkFBZ0IsTUFBTTtBQUUxQixnQkFBSSxrQkFBa0IsTUFBTTtBQUMxQixrQkFBSSxXQUFVLE1BQU07QUFFcEIsa0JBQUksYUFBWSxNQUFNO0FBQ3BCLGdDQUFnQixTQUFRO0FBQUE7QUFBQTtBQUk1QixnQkFBSSxrQkFBa0IsTUFBTTtBQUMxQixxQkFBTyxjQUFjO0FBQUE7QUFBQTtBQUl6QixpQkFBTztBQUFBO0FBRVQsdUNBQStCLE9BQU87QUFDcEMsaUJBQU8sTUFBTSxRQUFRLFdBQVcsTUFBTSxVQUFVLGdCQUFnQjtBQUFBO0FBRWxFLGdDQUF3QixPQUFPO0FBQzdCLGlCQUFPLHVCQUF1QixXQUFXO0FBQUE7QUFFM0MsMkJBQW1CLFdBQVc7QUFDNUI7QUFDRSxnQkFBSSxRQUFRLGtCQUFrQjtBQUU5QixnQkFBSSxVQUFVLFFBQVEsTUFBTSxRQUFRLGdCQUFnQjtBQUNsRCxrQkFBSSxhQUFhO0FBQ2pCLGtCQUFJLFdBQVcsV0FBVztBQUUxQixrQkFBSSxDQUFDLFNBQVMsMEJBQTBCO0FBQ3RDLHNCQUFNLHlSQUE2UywwQkFBMEIsZUFBZTtBQUFBO0FBRzlWLHVCQUFTLDJCQUEyQjtBQUFBO0FBQUE7QUFJeEMsY0FBSSxRQUFRLEtBQUk7QUFFaEIsY0FBSSxDQUFDLE9BQU87QUFDVixtQkFBTztBQUFBO0FBR1QsaUJBQU8sdUJBQXVCLFdBQVc7QUFBQTtBQUczQyxpQ0FBeUIsT0FBTztBQUM5QixjQUFJLHVCQUF1QixXQUFXLE9BQU87QUFDM0Msa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFBQTtBQUlwQiwrQ0FBdUMsT0FBTztBQUM1QyxjQUFJLFlBQVksTUFBTTtBQUV0QixjQUFJLENBQUMsV0FBVztBQUVkLGdCQUFJLGlCQUFpQix1QkFBdUI7QUFFNUMsZ0JBQUksbUJBQW1CLE1BQU07QUFDM0Isb0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsZ0JBQUksbUJBQW1CLE9BQU87QUFDNUIscUJBQU87QUFBQTtBQUdULG1CQUFPO0FBQUE7QUFNVCxjQUFJLElBQUk7QUFDUixjQUFJLElBQUk7QUFFUixpQkFBTyxNQUFNO0FBQ1gsZ0JBQUksVUFBVSxFQUFFO0FBRWhCLGdCQUFJLFlBQVksTUFBTTtBQUVwQjtBQUFBO0FBR0YsZ0JBQUksVUFBVSxRQUFRO0FBRXRCLGdCQUFJLFlBQVksTUFBTTtBQUtwQixrQkFBSSxhQUFhLFFBQVE7QUFFekIsa0JBQUksZUFBZSxNQUFNO0FBQ3ZCLG9CQUFJLElBQUk7QUFDUjtBQUFBO0FBSUY7QUFBQTtBQU1GLGdCQUFJLFFBQVEsVUFBVSxRQUFRLE9BQU87QUFDbkMsa0JBQUksUUFBUSxRQUFRO0FBRXBCLHFCQUFPLE9BQU87QUFDWixvQkFBSSxVQUFVLEdBQUc7QUFFZixrQ0FBZ0I7QUFDaEIseUJBQU87QUFBQTtBQUdULG9CQUFJLFVBQVUsR0FBRztBQUVmLGtDQUFnQjtBQUNoQix5QkFBTztBQUFBO0FBR1Qsd0JBQVEsTUFBTTtBQUFBO0FBS2hCLG9CQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGdCQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVE7QUFLekIsa0JBQUk7QUFDSixrQkFBSTtBQUFBLG1CQUNDO0FBTUwsa0JBQUksZUFBZTtBQUNuQixrQkFBSSxTQUFTLFFBQVE7QUFFckIscUJBQU8sUUFBUTtBQUNiLG9CQUFJLFdBQVcsR0FBRztBQUNoQixpQ0FBZTtBQUNmLHNCQUFJO0FBQ0osc0JBQUk7QUFDSjtBQUFBO0FBR0Ysb0JBQUksV0FBVyxHQUFHO0FBQ2hCLGlDQUFlO0FBQ2Ysc0JBQUk7QUFDSixzQkFBSTtBQUNKO0FBQUE7QUFHRix5QkFBUyxPQUFPO0FBQUE7QUFHbEIsa0JBQUksQ0FBQyxjQUFjO0FBRWpCLHlCQUFTLFFBQVE7QUFFakIsdUJBQU8sUUFBUTtBQUNiLHNCQUFJLFdBQVcsR0FBRztBQUNoQixtQ0FBZTtBQUNmLHdCQUFJO0FBQ0osd0JBQUk7QUFDSjtBQUFBO0FBR0Ysc0JBQUksV0FBVyxHQUFHO0FBQ2hCLG1DQUFlO0FBQ2Ysd0JBQUk7QUFDSix3QkFBSTtBQUNKO0FBQUE7QUFHRiwyQkFBUyxPQUFPO0FBQUE7QUFHbEIsb0JBQUksQ0FBQyxjQUFjO0FBQ2pCLHdCQUFNLElBQUksTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUt0QixnQkFBSSxFQUFFLGNBQWMsR0FBRztBQUNyQixvQkFBTSxJQUFJLE1BQU07QUFBQTtBQUFBO0FBTXBCLGNBQUksRUFBRSxRQUFRLFVBQVU7QUFDdEIsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsY0FBSSxFQUFFLFVBQVUsWUFBWSxHQUFHO0FBRTdCLG1CQUFPO0FBQUE7QUFJVCxpQkFBTztBQUFBO0FBRVQsc0NBQThCLFFBQVE7QUFDcEMsY0FBSSxnQkFBZ0IsOEJBQThCO0FBQ2xELGlCQUFPLGtCQUFrQixPQUFPLHlCQUF5QixpQkFBaUI7QUFBQTtBQUc1RSwwQ0FBa0MsTUFBTTtBQUV0QyxjQUFJLEtBQUssUUFBUSxpQkFBaUIsS0FBSyxRQUFRLFVBQVU7QUFDdkQsbUJBQU87QUFBQTtBQUdULGNBQUksUUFBUSxLQUFLO0FBRWpCLGlCQUFPLFVBQVUsTUFBTTtBQUNyQixnQkFBSSxRQUFRLHlCQUF5QjtBQUVyQyxnQkFBSSxVQUFVLE1BQU07QUFDbEIscUJBQU87QUFBQTtBQUdULG9CQUFRLE1BQU07QUFBQTtBQUdoQixpQkFBTztBQUFBO0FBR1QsbURBQTJDLFFBQVE7QUFDakQsY0FBSSxnQkFBZ0IsOEJBQThCO0FBQ2xELGlCQUFPLGtCQUFrQixPQUFPLHNDQUFzQyxpQkFBaUI7QUFBQTtBQUd6Rix1REFBK0MsTUFBTTtBQUVuRCxjQUFJLEtBQUssUUFBUSxpQkFBaUIsS0FBSyxRQUFRLFVBQVU7QUFDdkQsbUJBQU87QUFBQTtBQUdULGNBQUksUUFBUSxLQUFLO0FBRWpCLGlCQUFPLFVBQVUsTUFBTTtBQUNyQixnQkFBSSxNQUFNLFFBQVEsWUFBWTtBQUM1QixrQkFBSSxRQUFRLHNDQUFzQztBQUVsRCxrQkFBSSxVQUFVLE1BQU07QUFDbEIsdUJBQU87QUFBQTtBQUFBO0FBSVgsb0JBQVEsTUFBTTtBQUFBO0FBR2hCLGlCQUFPO0FBQUE7QUFJVCxZQUFJLG1CQUFtQixVQUFVO0FBQ2pDLFlBQUksaUJBQWlCLFVBQVU7QUFDL0IsWUFBSSxjQUFjLFVBQVU7QUFDNUIsWUFBSSxlQUFlLFVBQVU7QUFDN0IsWUFBSSxNQUFNLFVBQVU7QUFDcEIsWUFBSSwwQkFBMEIsVUFBVTtBQUN4QyxZQUFJLG9CQUFvQixVQUFVO0FBQ2xDLFlBQUksdUJBQXVCLFVBQVU7QUFDckMsWUFBSSxpQkFBaUIsVUFBVTtBQUMvQixZQUFJLGNBQWMsVUFBVTtBQUM1QixZQUFJLGVBQWUsVUFBVTtBQUc3QixZQUFJLHNCQUFzQixVQUFVO0FBQ3BDLFlBQUksZ0NBQWdDLFVBQVU7QUFFOUMsWUFBSSxhQUFhO0FBQ2pCLFlBQUksZUFBZTtBQUNuQixZQUFJLHlCQUF5QjtBQUM3QixZQUFJLGlCQUFpQjtBQUNyQixZQUFJLG9CQUFvQixPQUFPLG1DQUFtQztBQUNsRSxpQ0FBeUIsV0FBVztBQUNsQyxjQUFJLE9BQU8sbUNBQW1DLGFBQWE7QUFFekQsbUJBQU87QUFBQTtBQUdULGNBQUksT0FBTztBQUVYLGNBQUksS0FBSyxZQUFZO0FBSW5CLG1CQUFPO0FBQUE7QUFHVCxjQUFJLENBQUMsS0FBSyxlQUFlO0FBQ3ZCO0FBQ0Usb0JBQU07QUFBQTtBQUlSLG1CQUFPO0FBQUE7QUFHVCxjQUFJO0FBQ0YsZ0JBQUksMEJBQTBCO0FBSTVCLDBCQUFZLE9BQU8sSUFBSSxXQUFXO0FBQUEsZ0JBQ2hDO0FBQUEsZ0JBQ0E7QUFBQTtBQUFBO0FBSUoseUJBQWEsS0FBSyxPQUFPO0FBRXpCLDJCQUFlO0FBQUEsbUJBQ1IsS0FBUDtBQUVBO0FBQ0Usb0JBQU0sbURBQW1EO0FBQUE7QUFBQTtBQUk3RCxjQUFJLEtBQUssVUFBVTtBQUVqQixtQkFBTztBQUFBLGlCQUNGO0FBRUwsbUJBQU87QUFBQTtBQUFBO0FBR1gsZ0NBQXdCLE9BQU0sVUFBVTtBQUN0QztBQUNFLGdCQUFJLGdCQUFnQixPQUFPLGFBQWEsd0JBQXdCLFlBQVk7QUFDMUUsa0JBQUk7QUFDRiw2QkFBYSxvQkFBb0IsWUFBWSxPQUFNO0FBQUEsdUJBQzVDLEtBQVA7QUFDQSxvQkFBSyxDQUFDLGdCQUFnQjtBQUNwQixtQ0FBaUI7QUFFakIsd0JBQU0sa0RBQWtEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1sRSw4QkFBc0IsT0FBTSxlQUFlO0FBQ3pDLGNBQUksZ0JBQWdCLE9BQU8sYUFBYSxzQkFBc0IsWUFBWTtBQUN4RSxnQkFBSTtBQUNGLGtCQUFJLFdBQVksT0FBSyxRQUFRLFFBQVEsZ0JBQWdCO0FBRXJELGtCQUFJLHFCQUFxQjtBQUN2QixvQkFBSTtBQUVKLHdCQUFRO0FBQUEsdUJBQ0Q7QUFDSCx3Q0FBb0I7QUFDcEI7QUFBQSx1QkFFRztBQUNILHdDQUFvQjtBQUNwQjtBQUFBLHVCQUVHO0FBQ0gsd0NBQW9CO0FBQ3BCO0FBQUEsdUJBRUc7QUFDSCx3Q0FBb0I7QUFDcEI7QUFBQTtBQUdBLHdDQUFvQjtBQUNwQjtBQUFBO0FBR0osNkJBQWEsa0JBQWtCLFlBQVksT0FBTSxtQkFBbUI7QUFBQSxxQkFDL0Q7QUFDTCw2QkFBYSxrQkFBa0IsWUFBWSxPQUFNLFFBQVc7QUFBQTtBQUFBLHFCQUV2RCxLQUFQO0FBQ0E7QUFDRSxvQkFBSSxDQUFDLGdCQUFnQjtBQUNuQixtQ0FBaUI7QUFFakIsd0JBQU0sa0RBQWtEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1sRSxrQ0FBMEIsT0FBTTtBQUM5QixjQUFJLGdCQUFnQixPQUFPLGFBQWEsMEJBQTBCLFlBQVk7QUFDNUUsZ0JBQUk7QUFDRiwyQkFBYSxzQkFBc0IsWUFBWTtBQUFBLHFCQUN4QyxLQUFQO0FBQ0E7QUFDRSxvQkFBSSxDQUFDLGdCQUFnQjtBQUNuQixtQ0FBaUI7QUFFakIsd0JBQU0sa0RBQWtEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1sRSxpQ0FBeUIsT0FBTztBQUM5QixjQUFJLGdCQUFnQixPQUFPLGFBQWEseUJBQXlCLFlBQVk7QUFDM0UsZ0JBQUk7QUFDRiwyQkFBYSxxQkFBcUIsWUFBWTtBQUFBLHFCQUN2QyxLQUFQO0FBQ0E7QUFDRSxvQkFBSSxDQUFDLGdCQUFnQjtBQUNuQixtQ0FBaUI7QUFFakIsd0JBQU0sa0RBQWtEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1sRSw0Q0FBb0MsaUJBQWlCO0FBQ25EO0FBQ0UsZ0JBQUksT0FBTyx3QkFBd0IsWUFBWTtBQUk3Qyw0Q0FBOEI7QUFDOUIsaUNBQW1CO0FBQUE7QUFHckIsZ0JBQUksZ0JBQWdCLE9BQU8sYUFBYSxrQkFBa0IsWUFBWTtBQUNwRSxrQkFBSTtBQUNGLDZCQUFhLGNBQWMsWUFBWTtBQUFBLHVCQUNoQyxLQUFQO0FBQ0E7QUFDRSxzQkFBSSxDQUFDLGdCQUFnQjtBQUNuQixxQ0FBaUI7QUFFakIsMEJBQU0sa0RBQWtEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUXBFLHNDQUE4QixnQkFBZ0I7QUFDNUMsbUNBQXlCO0FBQUE7QUFHM0IsbUNBQTJCO0FBQ3pCO0FBQ0UsZ0JBQUksTUFBTSxJQUFJO0FBQ2QsZ0JBQUksT0FBTztBQUVYLHFCQUFTLFNBQVEsR0FBRyxTQUFRLFlBQVksVUFBUztBQUMvQyxrQkFBSSxRQUFRLGdCQUFnQjtBQUM1QixrQkFBSSxJQUFJLE1BQU07QUFDZCxzQkFBUTtBQUFBO0FBR1YsbUJBQU87QUFBQTtBQUFBO0FBSVgsbUNBQTJCLE9BQU87QUFDaEM7QUFDRSxnQkFBSSwyQkFBMkIsUUFBUSxPQUFPLHVCQUF1QixzQkFBc0IsWUFBWTtBQUNyRyxxQ0FBdUIsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBSS9DLHFDQUE2QjtBQUMzQjtBQUNFLGdCQUFJLDJCQUEyQixRQUFRLE9BQU8sdUJBQXVCLHNCQUFzQixZQUFZO0FBQ3JHLHFDQUF1QjtBQUFBO0FBQUE7QUFBQTtBQUk3Qiw0Q0FBb0MsT0FBTztBQUN6QztBQUNFLGdCQUFJLDJCQUEyQixRQUFRLE9BQU8sdUJBQXVCLCtCQUErQixZQUFZO0FBQzlHLHFDQUF1QiwyQkFBMkI7QUFBQTtBQUFBO0FBQUE7QUFJeEQsOENBQXNDO0FBQ3BDO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIsK0JBQStCLFlBQVk7QUFDOUcscUNBQXVCO0FBQUE7QUFBQTtBQUFBO0FBSTdCLHdEQUFnRCxPQUFPO0FBQ3JEO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIsMkNBQTJDLFlBQVk7QUFDMUgscUNBQXVCLHVDQUF1QztBQUFBO0FBQUE7QUFBQTtBQUlwRSwwREFBa0Q7QUFDaEQ7QUFDRSxnQkFBSSwyQkFBMkIsUUFBUSxPQUFPLHVCQUF1QiwyQ0FBMkMsWUFBWTtBQUMxSCxxQ0FBdUI7QUFBQTtBQUFBO0FBQUE7QUFJN0IsMERBQWtELE9BQU87QUFDdkQ7QUFDRSxnQkFBSSwyQkFBMkIsUUFBUSxPQUFPLHVCQUF1Qiw2Q0FBNkMsWUFBWTtBQUM1SCxxQ0FBdUIseUNBQXlDO0FBQUE7QUFBQTtBQUFBO0FBSXRFLDREQUFvRDtBQUNsRDtBQUNFLGdCQUFJLDJCQUEyQixRQUFRLE9BQU8sdUJBQXVCLDZDQUE2QyxZQUFZO0FBQzVILHFDQUF1QjtBQUFBO0FBQUE7QUFBQTtBQUk3Qix1REFBK0MsT0FBTztBQUNwRDtBQUNFLGdCQUFJLDJCQUEyQixRQUFRLE9BQU8sdUJBQXVCLDBDQUEwQyxZQUFZO0FBQ3pILHFDQUF1QixzQ0FBc0M7QUFBQTtBQUFBO0FBQUE7QUFJbkUseURBQWlEO0FBQy9DO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIsMENBQTBDLFlBQVk7QUFDekgscUNBQXVCO0FBQUE7QUFBQTtBQUFBO0FBSTdCLHlEQUFpRCxPQUFPO0FBQ3REO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIsNENBQTRDLFlBQVk7QUFDM0gscUNBQXVCLHdDQUF3QztBQUFBO0FBQUE7QUFBQTtBQUlyRSwyREFBbUQ7QUFDakQ7QUFDRSxnQkFBSSwyQkFBMkIsUUFBUSxPQUFPLHVCQUF1Qiw0Q0FBNEMsWUFBWTtBQUMzSCxxQ0FBdUI7QUFBQTtBQUFBO0FBQUE7QUFJN0Isc0NBQThCLE9BQU8sYUFBYSxPQUFPO0FBQ3ZEO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIseUJBQXlCLFlBQVk7QUFDeEcscUNBQXVCLHFCQUFxQixPQUFPLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFJdEUsd0NBQWdDLE9BQU8sVUFBVSxPQUFPO0FBQ3REO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIsMkJBQTJCLFlBQVk7QUFDMUcscUNBQXVCLHVCQUF1QixPQUFPLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFJckUsMENBQWtDLE9BQU87QUFDdkM7QUFDRSxnQkFBSSwyQkFBMkIsUUFBUSxPQUFPLHVCQUF1Qiw2QkFBNkIsWUFBWTtBQUM1RyxxQ0FBdUIseUJBQXlCO0FBQUE7QUFBQTtBQUFBO0FBSXRELDRDQUFvQztBQUNsQztBQUNFLGdCQUFJLDJCQUEyQixRQUFRLE9BQU8sdUJBQXVCLDZCQUE2QixZQUFZO0FBQzVHLHFDQUF1QjtBQUFBO0FBQUE7QUFBQTtBQUk3QiwyQ0FBbUMsT0FBTztBQUN4QztBQUNFLGdCQUFJLDJCQUEyQixRQUFRLE9BQU8sdUJBQXVCLDhCQUE4QixZQUFZO0FBQzdHLHFDQUF1QiwwQkFBMEI7QUFBQTtBQUFBO0FBQUE7QUFJdkQsNkNBQXFDO0FBQ25DO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIsOEJBQThCLFlBQVk7QUFDN0cscUNBQXVCO0FBQUE7QUFBQTtBQUFBO0FBSTdCLG1DQUEyQixPQUFPO0FBQ2hDO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIsc0JBQXNCLFlBQVk7QUFDckcscUNBQXVCLGtCQUFrQjtBQUFBO0FBQUE7QUFBQTtBQUkvQyxxQ0FBNkI7QUFDM0I7QUFDRSxnQkFBSSwyQkFBMkIsUUFBUSxPQUFPLHVCQUF1QixzQkFBc0IsWUFBWTtBQUNyRyxxQ0FBdUI7QUFBQTtBQUFBO0FBQUE7QUFJN0IscUNBQTZCO0FBQzNCO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIsc0JBQXNCLFlBQVk7QUFDckcscUNBQXVCO0FBQUE7QUFBQTtBQUFBO0FBSTdCLHFDQUE2QixNQUFNO0FBQ2pDO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIsd0JBQXdCLFlBQVk7QUFDdkcscUNBQXVCLG9CQUFvQjtBQUFBO0FBQUE7QUFBQTtBQUlqRCwwQ0FBa0MsT0FBTyxNQUFNO0FBQzdDO0FBQ0UsZ0JBQUksMkJBQTJCLFFBQVEsT0FBTyx1QkFBdUIsNkJBQTZCLFlBQVk7QUFDNUcscUNBQXVCLHlCQUF5QixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBSTdELDBDQUFrQyxPQUFPLE1BQU07QUFDN0M7QUFDRSxnQkFBSSwyQkFBMkIsUUFBUSxPQUFPLHVCQUF1Qiw2QkFBNkIsWUFBWTtBQUM1RyxxQ0FBdUIseUJBQXlCLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFLN0QsWUFBSSxTQUVKO0FBRUEsWUFBSSxpQkFFSjtBQUNBLFlBQUksY0FFSjtBQUNBLFlBQUksbUJBRUo7QUFDQSxZQUFJLG9CQUVKO0FBR0EsWUFBSSxRQUFRLEtBQUssUUFBUSxLQUFLLFFBQVE7QUFJdEMsWUFBSSxNQUFNLEtBQUs7QUFDZixZQUFJLE1BQU0sS0FBSztBQUVmLCtCQUF1QixHQUFHO0FBQ3hCLGNBQUksU0FBUyxNQUFNO0FBRW5CLGNBQUksV0FBVyxHQUFHO0FBQ2hCLG1CQUFPO0FBQUE7QUFHVCxpQkFBTyxLQUFNLEtBQUksVUFBVSxNQUFNLEtBQUs7QUFBQTtBQUt4QyxZQUFJLGFBQWE7QUFDakIsWUFBSSxVQUVKO0FBQ0EsWUFBSSxTQUVKO0FBQ0EsWUFBSSxXQUVKO0FBQ0EsWUFBSSwrQkFFSjtBQUNBLFlBQUksc0JBRUo7QUFDQSxZQUFJLHVCQUVKO0FBQ0EsWUFBSSxjQUVKO0FBQ0EsWUFBSSwwQkFFSjtBQUNBLFlBQUksa0JBRUo7QUFDQSxZQUFJLGtCQUVKO0FBQ0EsWUFBSSxrQkFFSjtBQUNBLFlBQUksa0JBRUo7QUFDQSxZQUFJLGtCQUVKO0FBQ0EsWUFBSSxrQkFFSjtBQUNBLFlBQUksa0JBRUo7QUFDQSxZQUFJLGtCQUVKO0FBQ0EsWUFBSSxrQkFFSjtBQUNBLFlBQUksa0JBRUo7QUFDQSxZQUFJLG1CQUVKO0FBQ0EsWUFBSSxtQkFFSjtBQUNBLFlBQUksbUJBRUo7QUFDQSxZQUFJLG1CQUVKO0FBQ0EsWUFBSSxtQkFFSjtBQUNBLFlBQUksbUJBRUo7QUFDQSxZQUFJLG1CQUVKO0FBQ0EsWUFBSSxhQUVKO0FBQ0EsWUFBSSxhQUVKO0FBQ0EsWUFBSSxhQUVKO0FBQ0EsWUFBSSxhQUVKO0FBQ0EsWUFBSSxhQUVKO0FBQ0EsWUFBSSxhQUVKO0FBQ0EsWUFBSSxnQkFBZ0I7QUFDcEIsWUFBSSx5QkFFSjtBQUNBLFlBQUksZUFFSjtBQUNBLFlBQUksb0JBRUo7QUFDQSxZQUFJLFdBRUo7QUFDQSxZQUFJLGdCQUVKO0FBR0EsaUNBQXlCLE1BQU07QUFDN0I7QUFDRSxnQkFBSSxPQUFPLFVBQVU7QUFDbkIscUJBQU87QUFBQTtBQUdULGdCQUFJLE9BQU8sOEJBQThCO0FBQ3ZDLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxPQUFPLHFCQUFxQjtBQUM5QixxQkFBTztBQUFBO0FBR1QsZ0JBQUksT0FBTyxzQkFBc0I7QUFDL0IscUJBQU87QUFBQTtBQUdULGdCQUFJLE9BQU8sYUFBYTtBQUN0QixxQkFBTztBQUFBO0FBR1QsZ0JBQUksT0FBTyx5QkFBeUI7QUFDbEMscUJBQU87QUFBQTtBQUdULGdCQUFJLE9BQU8saUJBQWlCO0FBQzFCLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxPQUFPLFlBQVk7QUFDckIscUJBQU87QUFBQTtBQUdULGdCQUFJLE9BQU8sd0JBQXdCO0FBQ2pDLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxPQUFPLG1CQUFtQjtBQUM1QixxQkFBTztBQUFBO0FBR1QsZ0JBQUksT0FBTyxVQUFVO0FBQ25CLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxPQUFPLGVBQWU7QUFDeEIscUJBQU87QUFBQTtBQUFBO0FBQUE7QUFJYixZQUFJLGNBQWM7QUFDbEIsWUFBSSxxQkFBcUI7QUFDekIsWUFBSSxnQkFBZ0I7QUFFcEIseUNBQWlDLE9BQU87QUFDdEMsa0JBQVEsdUJBQXVCO0FBQUEsaUJBQ3hCO0FBQ0gscUJBQU87QUFBQSxpQkFFSjtBQUNILHFCQUFPO0FBQUEsaUJBRUo7QUFDSCxxQkFBTztBQUFBLGlCQUVKO0FBQ0gscUJBQU87QUFBQSxpQkFFSjtBQUNILHFCQUFPO0FBQUEsaUJBRUo7QUFDSCxxQkFBTztBQUFBLGlCQUVKO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQ0gscUJBQU8sUUFBUTtBQUFBLGlCQUVaO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFDSCxxQkFBTyxRQUFRO0FBQUEsaUJBRVo7QUFDSCxxQkFBTztBQUFBLGlCQUVKO0FBQ0gscUJBQU87QUFBQSxpQkFFSjtBQUNILHFCQUFPO0FBQUEsaUJBRUo7QUFDSCxxQkFBTztBQUFBO0FBR1A7QUFDRSxzQkFBTTtBQUFBO0FBSVIscUJBQU87QUFBQTtBQUFBO0FBSWIsOEJBQXNCLE9BQU0sVUFBVTtBQUVwQyxjQUFJLGVBQWUsTUFBSztBQUV4QixjQUFJLGlCQUFpQixTQUFTO0FBQzVCLG1CQUFPO0FBQUE7QUFHVCxjQUFJLFlBQVk7QUFDaEIsY0FBSSxpQkFBaUIsTUFBSztBQUMxQixjQUFJLGNBQWMsTUFBSztBQUd2QixjQUFJLHNCQUFzQixlQUFlO0FBRXpDLGNBQUksd0JBQXdCLFNBQVM7QUFDbkMsZ0JBQUksd0JBQXdCLHNCQUFzQixDQUFDO0FBRW5ELGdCQUFJLDBCQUEwQixTQUFTO0FBQ3JDLDBCQUFZLHdCQUF3QjtBQUFBLG1CQUMvQjtBQUNMLGtCQUFJLHFCQUFxQixzQkFBc0I7QUFFL0Msa0JBQUksdUJBQXVCLFNBQVM7QUFDbEMsNEJBQVksd0JBQXdCO0FBQUE7QUFBQTtBQUFBLGlCQUduQztBQUVMLGdCQUFJLGlCQUFpQixlQUFlLENBQUM7QUFFckMsZ0JBQUksbUJBQW1CLFNBQVM7QUFDOUIsMEJBQVksd0JBQXdCO0FBQUEsbUJBQy9CO0FBQ0wsa0JBQUksZ0JBQWdCLFNBQVM7QUFDM0IsNEJBQVksd0JBQXdCO0FBQUE7QUFBQTtBQUFBO0FBSzFDLGNBQUksY0FBYyxTQUFTO0FBR3pCLG1CQUFPO0FBQUE7QUFNVCxjQUFJLGFBQWEsV0FBVyxhQUFhLGFBRXhDLFlBQVcsb0JBQW9CLFNBQVM7QUFDdkMsZ0JBQUksV0FBVyx1QkFBdUI7QUFDdEMsZ0JBQUksVUFBVSx1QkFBdUI7QUFFckMsZ0JBRUEsWUFBWSxXQUdaLGFBQWEsZUFBZ0IsV0FBVSxxQkFBcUIsU0FBUztBQUVuRSxxQkFBTztBQUFBO0FBQUE7QUFJWCxjQUFLLGFBQVkseUJBQXlCLFNBQVM7QUFLakQseUJBQWEsZUFBZTtBQUFBO0FBeUI5QixjQUFJLGlCQUFpQixNQUFLO0FBRTFCLGNBQUksbUJBQW1CLFNBQVM7QUFDOUIsZ0JBQUksZ0JBQWdCLE1BQUs7QUFDekIsZ0JBQUksUUFBUSxZQUFZO0FBRXhCLG1CQUFPLFFBQVEsR0FBRztBQUNoQixrQkFBSSxTQUFRLHVCQUF1QjtBQUNuQyxrQkFBSSxPQUFPLEtBQUs7QUFDaEIsMkJBQWEsY0FBYztBQUMzQix1QkFBUyxDQUFDO0FBQUE7QUFBQTtBQUlkLGlCQUFPO0FBQUE7QUFFVCx3Q0FBZ0MsT0FBTSxPQUFPO0FBQzNDLGNBQUksYUFBYSxNQUFLO0FBQ3RCLGNBQUksc0JBQXNCO0FBRTFCLGlCQUFPLFFBQVEsR0FBRztBQUNoQixnQkFBSSxTQUFRLHVCQUF1QjtBQUNuQyxnQkFBSSxPQUFPLEtBQUs7QUFDaEIsZ0JBQUksWUFBWSxXQUFXO0FBRTNCLGdCQUFJLFlBQVkscUJBQXFCO0FBQ25DLG9DQUFzQjtBQUFBO0FBR3hCLHFCQUFTLENBQUM7QUFBQTtBQUdaLGlCQUFPO0FBQUE7QUFHVCx1Q0FBK0IsTUFBTSxhQUFhO0FBQ2hELGtCQUFRO0FBQUEsaUJBQ0Q7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBVUgscUJBQU8sY0FBYztBQUFBLGlCQUVsQjtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUNILHFCQUFPLGNBQWM7QUFBQSxpQkFFbEI7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQU1ILHFCQUFPO0FBQUEsaUJBRUo7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFFSCxxQkFBTztBQUFBO0FBR1A7QUFDRSxzQkFBTTtBQUFBO0FBR1IscUJBQU87QUFBQTtBQUFBO0FBSWIsMkNBQW1DLE9BQU0sYUFBYTtBQUlwRCxjQUFJLGVBQWUsTUFBSztBQUN4QixjQUFJLGlCQUFpQixNQUFLO0FBQzFCLGNBQUksY0FBYyxNQUFLO0FBQ3ZCLGNBQUksa0JBQWtCLE1BQUs7QUFJM0IsY0FBSSxRQUFRO0FBRVosaUJBQU8sUUFBUSxHQUFHO0FBQ2hCLGdCQUFJLFNBQVEsdUJBQXVCO0FBQ25DLGdCQUFJLE9BQU8sS0FBSztBQUNoQixnQkFBSSxpQkFBaUIsZ0JBQWdCO0FBRXJDLGdCQUFJLG1CQUFtQixhQUFhO0FBSWxDLGtCQUFLLFFBQU8sb0JBQW9CLFdBQVksUUFBTyxpQkFBaUIsU0FBUztBQUUzRSxnQ0FBZ0IsVUFBUyxzQkFBc0IsTUFBTTtBQUFBO0FBQUEsdUJBRTlDLGtCQUFrQixhQUFhO0FBRXhDLG9CQUFLLGdCQUFnQjtBQUFBO0FBR3ZCLHFCQUFTLENBQUM7QUFBQTtBQUFBO0FBS2QsZ0RBQXdDLE9BQU07QUFDNUMsaUJBQU8sd0JBQXdCLE1BQUs7QUFBQTtBQUV0QyxxREFBNkMsT0FBTTtBQUNqRCxjQUFJLHlCQUF5QixNQUFLLGVBQWUsQ0FBQztBQUVsRCxjQUFJLDJCQUEyQixTQUFTO0FBQ3RDLG1CQUFPO0FBQUE7QUFHVCxjQUFJLHlCQUF5QixlQUFlO0FBQzFDLG1CQUFPO0FBQUE7QUFHVCxpQkFBTztBQUFBO0FBRVQsa0NBQTBCLE9BQU87QUFDL0IsaUJBQVEsU0FBUSxjQUFjO0FBQUE7QUFFaEMscUNBQTZCLE9BQU87QUFDbEMsaUJBQVEsU0FBUSxrQkFBa0I7QUFBQTtBQUVwQyxxQ0FBNkIsT0FBTztBQUNsQyxpQkFBUSxTQUFRLGdCQUFnQjtBQUFBO0FBRWxDLDRDQUFvQyxPQUFPO0FBQ3pDLGNBQUksY0FBYyxXQUFXLHNCQUFzQjtBQUNuRCxpQkFBUSxTQUFRLGlCQUFpQjtBQUFBO0FBRW5DLHlDQUFpQyxPQUFPO0FBQ3RDLGlCQUFRLFNBQVEscUJBQXFCO0FBQUE7QUFFdkMsc0NBQThCLE9BQU0sT0FBTztBQUV6QyxjQUFJLG1CQUFtQiwrQkFBK0Isc0JBQXNCLHVCQUF1QjtBQUNuRyxpQkFBUSxTQUFRLHNCQUFzQjtBQUFBO0FBRXhDLHFDQUE2QixPQUFNLE9BQU87QUFHeEMsaUJBQVEsU0FBUSxNQUFLLGtCQUFrQjtBQUFBO0FBRXpDLGtDQUEwQixNQUFNO0FBQzlCLGlCQUFRLFFBQU8scUJBQXFCO0FBQUE7QUFFdEMsMkNBQW1DO0FBSWpDLGNBQUksT0FBTztBQUNYLGlDQUF1QjtBQUV2QixjQUFLLHNCQUFxQixxQkFBcUIsU0FBUztBQUN0RCxpQ0FBcUI7QUFBQTtBQUd2QixpQkFBTztBQUFBO0FBRVQsc0NBQThCO0FBQzVCLGNBQUksT0FBTztBQUNYLDRCQUFrQjtBQUVsQixjQUFLLGlCQUFnQixnQkFBZ0IsU0FBUztBQUM1Qyw0QkFBZ0I7QUFBQTtBQUdsQixpQkFBTztBQUFBO0FBRVQsd0NBQWdDLE9BQU87QUFDckMsaUJBQU8sUUFBUSxDQUFDO0FBQUE7QUFFbEIsbUNBQTJCLE9BQU87QUFLaEMsaUJBQU8sdUJBQXVCO0FBQUE7QUFHaEMsd0NBQWdDLE9BQU87QUFDckMsaUJBQU8sS0FBSyxNQUFNO0FBQUE7QUFHcEIsNkJBQXFCLE1BQU07QUFDekIsaUJBQU8sdUJBQXVCO0FBQUE7QUFHaEMsa0NBQTBCLEdBQUcsR0FBRztBQUM5QixpQkFBUSxLQUFJLE9BQU87QUFBQTtBQUVyQixpQ0FBeUIsTUFBSyxRQUFRO0FBQ3BDLGlCQUFRLFFBQU0sWUFBWTtBQUFBO0FBRTVCLDRCQUFvQixHQUFHLEdBQUc7QUFDeEIsaUJBQU8sSUFBSTtBQUFBO0FBRWIsNkJBQXFCLE1BQUssUUFBUTtBQUNoQyxpQkFBTyxPQUFNLENBQUM7QUFBQTtBQUVoQixnQ0FBd0IsR0FBRyxHQUFHO0FBQzVCLGlCQUFPLElBQUk7QUFBQTtBQUliLDZCQUFxQixNQUFNO0FBQ3pCLGlCQUFPO0FBQUE7QUFFVCxvQ0FBNEIsR0FBRyxHQUFHO0FBRWhDLGlCQUFPLE1BQU0sVUFBVSxJQUFJLElBQUksSUFBSTtBQUFBO0FBRXJDLCtCQUF1QixTQUFTO0FBRzlCLGNBQUksVUFBVTtBQUVkLG1CQUFTLElBQUksR0FBRyxJQUFJLFlBQVksS0FBSztBQUNuQyxvQkFBUSxLQUFLO0FBQUE7QUFHZixpQkFBTztBQUFBO0FBRVQsaUNBQXlCLE9BQU0sWUFBWSxXQUFXO0FBQ3BELGdCQUFLLGdCQUFnQjtBQWFyQixjQUFJLGVBQWUsVUFBVTtBQUMzQixrQkFBSyxpQkFBaUI7QUFDdEIsa0JBQUssY0FBYztBQUFBO0FBR3JCLGNBQUksYUFBYSxNQUFLO0FBQ3RCLGNBQUksU0FBUSxZQUFZO0FBR3hCLHFCQUFXLFVBQVM7QUFBQTtBQUV0QixtQ0FBMkIsT0FBTSxnQkFBZ0I7QUFDL0MsZ0JBQUssa0JBQWtCO0FBQ3ZCLGdCQUFLLGVBQWUsQ0FBQztBQUVyQixjQUFJLGtCQUFrQixNQUFLO0FBQzNCLGNBQUksUUFBUTtBQUVaLGlCQUFPLFFBQVEsR0FBRztBQUNoQixnQkFBSSxTQUFRLHVCQUF1QjtBQUNuQyxnQkFBSSxPQUFPLEtBQUs7QUFDaEIsNEJBQWdCLFVBQVM7QUFDekIscUJBQVMsQ0FBQztBQUFBO0FBQUE7QUFHZCxnQ0FBd0IsT0FBTSxhQUFhLFdBQVc7QUFDcEQsZ0JBQUssZUFBZSxNQUFLLGlCQUFpQjtBQUFBO0FBRTVDLGtDQUEwQixPQUFNLGdCQUFnQjtBQUM5QyxjQUFJLHVCQUF1QixNQUFLLGVBQWUsQ0FBQztBQUNoRCxnQkFBSyxlQUFlO0FBRXBCLGdCQUFLLGlCQUFpQjtBQUN0QixnQkFBSyxjQUFjO0FBQ25CLGdCQUFLLGdCQUFnQjtBQUNyQixnQkFBSyxvQkFBb0I7QUFDekIsZ0JBQUssa0JBQWtCO0FBQ3ZCLGNBQUksZ0JBQWdCLE1BQUs7QUFDekIsY0FBSSxhQUFhLE1BQUs7QUFDdEIsY0FBSSxrQkFBa0IsTUFBSztBQUUzQixjQUFJLFFBQVE7QUFFWixpQkFBTyxRQUFRLEdBQUc7QUFDaEIsZ0JBQUksU0FBUSx1QkFBdUI7QUFDbkMsZ0JBQUksT0FBTyxLQUFLO0FBQ2hCLDBCQUFjLFVBQVM7QUFDdkIsdUJBQVcsVUFBUztBQUNwQiw0QkFBZ0IsVUFBUztBQUN6QixxQkFBUyxDQUFDO0FBQUE7QUFBQTtBQUdkLG1DQUEyQixPQUFNLGdCQUFnQjtBQVkvQyxjQUFJLHFCQUFxQixNQUFLLGtCQUFrQjtBQUNoRCxjQUFJLGdCQUFnQixNQUFLO0FBQ3pCLGNBQUksUUFBUTtBQUVaLGlCQUFPLE9BQU87QUFDWixnQkFBSSxTQUFRLHVCQUF1QjtBQUNuQyxnQkFBSSxPQUFPLEtBQUs7QUFFaEIsZ0JBQ0EsT0FBTyxpQkFDUCxjQUFjLFVBQVMsZ0JBQWdCO0FBQ3JDLDRCQUFjLFdBQVU7QUFBQTtBQUcxQixxQkFBUyxDQUFDO0FBQUE7QUFBQTtBQUdkLDJDQUFtQyxPQUFNLGNBQWE7QUFDcEQsY0FBSSxhQUFhLHVCQUF1QjtBQUN4QyxjQUFJO0FBRUosa0JBQVE7QUFBQSxpQkFDRDtBQUNILHFCQUFPO0FBQ1A7QUFBQSxpQkFFRztBQUNILHFCQUFPO0FBQ1A7QUFBQSxpQkFFRztBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFDSCxxQkFBTztBQUNQO0FBQUEsaUJBRUc7QUFDSCxxQkFBTztBQUNQO0FBQUE7QUFLQSxxQkFBTztBQUNQO0FBQUE7QUFNSixjQUFLLFFBQVEsT0FBSyxpQkFBaUIsbUJBQWtCLFFBQVE7QUFFM0QsbUJBQU87QUFBQTtBQUdULGlCQUFPO0FBQUE7QUFFVCxvQ0FBNEIsT0FBTSxPQUFPLE9BQU87QUFFOUMsY0FBSSxDQUFDLG1CQUFtQjtBQUN0QjtBQUFBO0FBR0YsY0FBSSx5QkFBeUIsTUFBSztBQUVsQyxpQkFBTyxRQUFRLEdBQUc7QUFDaEIsZ0JBQUksU0FBUSxZQUFZO0FBQ3hCLGdCQUFJLE9BQU8sS0FBSztBQUNoQixnQkFBSSxXQUFXLHVCQUF1QjtBQUN0QyxxQkFBUyxJQUFJO0FBQ2IscUJBQVMsQ0FBQztBQUFBO0FBQUE7QUFHZCw2Q0FBcUMsT0FBTSxPQUFPO0FBRWhELGNBQUksQ0FBQyxtQkFBbUI7QUFDdEI7QUFBQTtBQUdGLGNBQUkseUJBQXlCLE1BQUs7QUFDbEMsY0FBSSxtQkFBbUIsTUFBSztBQUU1QixpQkFBTyxRQUFRLEdBQUc7QUFDaEIsZ0JBQUksU0FBUSxZQUFZO0FBQ3hCLGdCQUFJLE9BQU8sS0FBSztBQUNoQixnQkFBSSxXQUFXLHVCQUF1QjtBQUV0QyxnQkFBSSxTQUFTLE9BQU8sR0FBRztBQUNyQix1QkFBUyxRQUFRLFNBQVUsT0FBTztBQUNoQyxvQkFBSSxZQUFZLE1BQU07QUFFdEIsb0JBQUksY0FBYyxRQUFRLENBQUMsaUJBQWlCLElBQUksWUFBWTtBQUMxRCxtQ0FBaUIsSUFBSTtBQUFBO0FBQUE7QUFHekIsdUJBQVM7QUFBQTtBQUdYLHFCQUFTLENBQUM7QUFBQTtBQUFBO0FBR2Qsd0NBQWdDLE9BQU0sT0FBTztBQUMzQztBQUNFLG1CQUFPO0FBQUE7QUFBQTtBQUlYLFlBQUksd0JBQXdCO0FBQzVCLFlBQUksMEJBQTBCO0FBQzlCLFlBQUksdUJBQXVCO0FBQzNCLFlBQUksb0JBQW9CO0FBQ3hCLFlBQUksd0JBQXdCO0FBQzVCLDRDQUFvQztBQUNsQyxpQkFBTztBQUFBO0FBRVQsMENBQWtDLGFBQWE7QUFDN0Msa0NBQXdCO0FBQUE7QUFFMUIsaUNBQXlCLFVBQVUsSUFBSTtBQUNyQyxjQUFJLG1CQUFtQjtBQUV2QixjQUFJO0FBQ0Ysb0NBQXdCO0FBQ3hCLG1CQUFPO0FBQUEsb0JBQ1A7QUFDQSxvQ0FBd0I7QUFBQTtBQUFBO0FBRzVCLHFDQUE2QixHQUFHLEdBQUc7QUFDakMsaUJBQU8sTUFBTSxLQUFLLElBQUksSUFBSSxJQUFJO0FBQUE7QUFFaEMsb0NBQTRCLEdBQUcsR0FBRztBQUNoQyxpQkFBTyxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUk7QUFBQTtBQUVoQyx1Q0FBK0IsR0FBRyxHQUFHO0FBQ25DLGlCQUFPLE1BQU0sS0FBSyxJQUFJO0FBQUE7QUFFeEIsc0NBQThCLE9BQU87QUFDbkMsY0FBSSxPQUFPLHVCQUF1QjtBQUVsQyxjQUFJLENBQUMsc0JBQXNCLHVCQUF1QixPQUFPO0FBQ3ZELG1CQUFPO0FBQUE7QUFHVCxjQUFJLENBQUMsc0JBQXNCLHlCQUF5QixPQUFPO0FBQ3pELG1CQUFPO0FBQUE7QUFHVCxjQUFJLG9CQUFvQixPQUFPO0FBQzdCLG1CQUFPO0FBQUE7QUFHVCxpQkFBTztBQUFBO0FBTVQsa0NBQTBCLE9BQU07QUFDOUIsY0FBSSxlQUFlLE1BQUssUUFBUTtBQUNoQyxpQkFBTyxhQUFhO0FBQUE7QUFHdEIsWUFBSTtBQUVKLGdEQUF3QyxJQUFJO0FBQzFDLHlDQUErQjtBQUFBO0FBRWpDLDZDQUFxQyxPQUFPO0FBQzFDLHVDQUE2QjtBQUFBO0FBRS9CLFlBQUk7QUFDSiwrQ0FBdUMsSUFBSTtBQUN6Qyx1Q0FBNkI7QUFBQTtBQUUvQixZQUFJO0FBQ0osc0RBQThDLElBQUk7QUFDaEQsOENBQW9DO0FBQUE7QUFFdEMsWUFBSTtBQUNKLDZDQUFxQyxJQUFJO0FBQ3ZDLHVDQUE2QjtBQUFBO0FBRS9CLFlBQUk7QUFDSiwrQ0FBdUMsSUFBSTtBQUN6Qyx1Q0FBNkI7QUFBQTtBQUkvQixZQUFJLDRCQUE0QjtBQUVoQyxZQUFJLHVCQUF1QjtBQUczQixZQUFJLGNBQWM7QUFDbEIsWUFBSSxhQUFhO0FBQ2pCLFlBQUksY0FBYztBQUVsQixZQUFJLGlCQUFpQixJQUFJO0FBQ3pCLFlBQUksd0JBQXdCLElBQUk7QUFFaEMsWUFBSSxpQ0FBaUM7QUFDckMsWUFBSSwyQkFBMkI7QUFBQSxVQUFDO0FBQUEsVUFBYTtBQUFBLFVBQVc7QUFBQSxVQUFlO0FBQUEsVUFBWTtBQUFBLFVBQWM7QUFBQSxVQUFZO0FBQUEsVUFBWTtBQUFBLFVBQWlCO0FBQUEsVUFBZTtBQUFBLFVBQWE7QUFBQSxVQUFXO0FBQUEsVUFBYTtBQUFBLFVBQVE7QUFBQSxVQUFrQjtBQUFBLFVBQW9CO0FBQUEsVUFBVztBQUFBLFVBQVk7QUFBQSxVQUFTO0FBQUEsVUFBUztBQUFBLFVBQ3JSO0FBQUEsVUFBUTtBQUFBLFVBQU87QUFBQSxVQUFTO0FBQUEsVUFBUztBQUFBLFVBQVU7QUFBQSxVQUFlO0FBQUEsVUFBUztBQUFBO0FBQ25FLHNEQUE4QyxXQUFXO0FBQ3ZELGlCQUFPLHlCQUF5QixRQUFRLGFBQWE7QUFBQTtBQUd2RCw2Q0FBcUMsV0FBVyxjQUFjLGtCQUFrQixpQkFBaUIsYUFBYTtBQUM1RyxpQkFBTztBQUFBLFlBQ0w7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBLGtCQUFrQixDQUFDO0FBQUE7QUFBQTtBQUl2Qix3Q0FBZ0MsY0FBYyxhQUFhO0FBQ3pELGtCQUFRO0FBQUEsaUJBQ0Q7QUFBQSxpQkFDQTtBQUNILDRCQUFjO0FBQ2Q7QUFBQSxpQkFFRztBQUFBLGlCQUNBO0FBQ0gsMkJBQWE7QUFDYjtBQUFBLGlCQUVHO0FBQUEsaUJBQ0E7QUFDSCw0QkFBYztBQUNkO0FBQUEsaUJBRUc7QUFBQSxpQkFDQSxjQUNIO0FBQ0Usa0JBQUksWUFBWSxZQUFZO0FBQzVCLDZCQUFlLE9BQU87QUFDdEI7QUFBQTtBQUFBLGlCQUdDO0FBQUEsaUJBQ0Esc0JBQ0g7QUFDRSxrQkFBSSxhQUFhLFlBQVk7QUFDN0Isb0NBQXNCLE9BQU87QUFDN0I7QUFBQTtBQUFBO0FBQUE7QUFLUixtRUFBMkQscUJBQXFCLFdBQVcsY0FBYyxrQkFBa0IsaUJBQWlCLGFBQWE7QUFDdkosY0FBSSx3QkFBd0IsUUFBUSxvQkFBb0IsZ0JBQWdCLGFBQWE7QUFDbkYsZ0JBQUksY0FBYyw0QkFBNEIsV0FBVyxjQUFjLGtCQUFrQixpQkFBaUI7QUFFMUcsZ0JBQUksY0FBYyxNQUFNO0FBQ3RCLGtCQUFJLFVBQVUsb0JBQW9CO0FBRWxDLGtCQUFJLFlBQVksTUFBTTtBQUVwQiwyQ0FBMkI7QUFBQTtBQUFBO0FBSS9CLG1CQUFPO0FBQUE7QUFPVCw4QkFBb0Isb0JBQW9CO0FBQ3hDLGNBQUksbUJBQW1CLG9CQUFvQjtBQUUzQyxjQUFJLG9CQUFvQixRQUFRLGlCQUFpQixRQUFRLHFCQUFxQixJQUFJO0FBQ2hGLDZCQUFpQixLQUFLO0FBQUE7QUFHeEIsaUJBQU87QUFBQTtBQUdULHdDQUFnQyxXQUFXLGNBQWMsa0JBQWtCLGlCQUFpQixhQUFhO0FBSXZHLGtCQUFRO0FBQUEsaUJBQ0QsV0FDSDtBQUNFLGtCQUFJLGFBQWE7QUFDakIsNEJBQWMsa0RBQWtELGFBQWEsV0FBVyxjQUFjLGtCQUFrQixpQkFBaUI7QUFDekkscUJBQU87QUFBQTtBQUFBLGlCQUdOLGFBQ0g7QUFDRSxrQkFBSSxZQUFZO0FBQ2hCLDJCQUFhLGtEQUFrRCxZQUFZLFdBQVcsY0FBYyxrQkFBa0IsaUJBQWlCO0FBQ3ZJLHFCQUFPO0FBQUE7QUFBQSxpQkFHTixhQUNIO0FBQ0Usa0JBQUksYUFBYTtBQUNqQiw0QkFBYyxrREFBa0QsYUFBYSxXQUFXLGNBQWMsa0JBQWtCLGlCQUFpQjtBQUN6SSxxQkFBTztBQUFBO0FBQUEsaUJBR04sZUFDSDtBQUNFLGtCQUFJLGVBQWU7QUFDbkIsa0JBQUksWUFBWSxhQUFhO0FBQzdCLDZCQUFlLElBQUksV0FBVyxrREFBa0QsZUFBZSxJQUFJLGNBQWMsTUFBTSxXQUFXLGNBQWMsa0JBQWtCLGlCQUFpQjtBQUNuTCxxQkFBTztBQUFBO0FBQUEsaUJBR04scUJBQ0g7QUFDRSxrQkFBSSxnQkFBZ0I7QUFDcEIsa0JBQUksY0FBYyxjQUFjO0FBQ2hDLG9DQUFzQixJQUFJLGFBQWEsa0RBQWtELHNCQUFzQixJQUFJLGdCQUFnQixNQUFNLFdBQVcsY0FBYyxrQkFBa0IsaUJBQWlCO0FBQ3JNLHFCQUFPO0FBQUE7QUFBQTtBQUliLGlCQUFPO0FBQUE7QUFHVCxnREFBd0MsY0FBYztBQUlwRCxjQUFJLGFBQWEsMkJBQTJCLGFBQWE7QUFFekQsY0FBSSxlQUFlLE1BQU07QUFDdkIsZ0JBQUksaUJBQWlCLHVCQUF1QjtBQUU1QyxnQkFBSSxtQkFBbUIsTUFBTTtBQUMzQixrQkFBSSxNQUFNLGVBQWU7QUFFekIsa0JBQUksUUFBUSxtQkFBbUI7QUFDN0Isb0JBQUksV0FBVyw2QkFBNkI7QUFFNUMsb0JBQUksYUFBYSxNQUFNO0FBR3JCLCtCQUFhLFlBQVk7QUFDekIsNkNBQTJCLGFBQWEsVUFBVSxXQUFZO0FBQzVELHNEQUFrQztBQUFBO0FBRXBDO0FBQUE7QUFBQSx5QkFFTyxRQUFRLFVBQVU7QUFDM0Isb0JBQUksUUFBTyxlQUFlO0FBRTFCLG9CQUFJLGlCQUFpQixRQUFPO0FBQzFCLCtCQUFhLFlBQVksc0JBQXNCO0FBRy9DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNUix1QkFBYSxZQUFZO0FBQUE7QUFHM0IsOENBQXNDLFFBQVE7QUFJNUMsY0FBSSxpQkFBaUI7QUFDckIsY0FBSSxlQUFlO0FBQUEsWUFDakIsV0FBVztBQUFBLFlBQ1g7QUFBQSxZQUNBLFVBQVU7QUFBQTtBQUVaLGNBQUksSUFBSTtBQUVSLGlCQUFPLElBQUksK0JBQStCLFFBQVEsS0FBSztBQUVyRCxnQkFBSSxDQUFDLHNCQUFzQixnQkFBZ0IsK0JBQStCLEdBQUcsV0FBVztBQUN0RjtBQUFBO0FBQUE7QUFJSix5Q0FBK0IsT0FBTyxHQUFHLEdBQUc7QUFFNUMsY0FBSSxNQUFNLEdBQUc7QUFDWCwyQ0FBK0I7QUFBQTtBQUFBO0FBSW5DLG9EQUE0QyxhQUFhO0FBQ3ZELGNBQUksWUFBWSxjQUFjLE1BQU07QUFDbEMsbUJBQU87QUFBQTtBQUdULGNBQUksbUJBQW1CLFlBQVk7QUFFbkMsaUJBQU8saUJBQWlCLFNBQVMsR0FBRztBQUNsQyxnQkFBSSxrQkFBa0IsaUJBQWlCO0FBQ3ZDLGdCQUFJLGdCQUFnQiwwQkFBMEIsWUFBWSxjQUFjLFlBQVksa0JBQWtCLGlCQUFpQixZQUFZO0FBRW5JLGdCQUFJLGtCQUFrQixNQUFNO0FBQzFCO0FBQ0Usb0JBQUksY0FBYyxZQUFZO0FBQzlCLG9CQUFJLG1CQUFtQixJQUFJLFlBQVksWUFBWSxZQUFZLE1BQU07QUFDckUsa0NBQWtCO0FBQ2xCLDRCQUFZLE9BQU8sY0FBYztBQUNqQztBQUFBO0FBQUEsbUJBRUc7QUFFTCxrQkFBSSxVQUFVLG9CQUFvQjtBQUVsQyxrQkFBSSxZQUFZLE1BQU07QUFDcEIsMkNBQTJCO0FBQUE7QUFHN0IsMEJBQVksWUFBWTtBQUN4QixxQkFBTztBQUFBO0FBSVQsNkJBQWlCO0FBQUE7QUFHbkIsaUJBQU87QUFBQTtBQUdULHlEQUFpRCxhQUFhLEtBQUssS0FBSztBQUN0RSxjQUFJLG1DQUFtQyxjQUFjO0FBQ25ELGdCQUFJLE9BQU87QUFBQTtBQUFBO0FBSWYseUNBQWlDO0FBQy9CLHNDQUE0QjtBQUc1QixjQUFJLGdCQUFnQixRQUFRLG1DQUFtQyxjQUFjO0FBQzNFLDBCQUFjO0FBQUE7QUFHaEIsY0FBSSxlQUFlLFFBQVEsbUNBQW1DLGFBQWE7QUFDekUseUJBQWE7QUFBQTtBQUdmLGNBQUksZ0JBQWdCLFFBQVEsbUNBQW1DLGNBQWM7QUFDM0UsMEJBQWM7QUFBQTtBQUdoQix5QkFBZSxRQUFRO0FBQ3ZCLGdDQUFzQixRQUFRO0FBQUE7QUFHaEMsNkNBQXFDLGFBQWEsV0FBVztBQUMzRCxjQUFJLFlBQVksY0FBYyxXQUFXO0FBQ3ZDLHdCQUFZLFlBQVk7QUFFeEIsZ0JBQUksQ0FBQywyQkFBMkI7QUFDOUIsMENBQTRCO0FBSTVCLHdCQUFVLDBCQUEwQixVQUFVLHlCQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUs3RSxrQ0FBMEIsV0FBVztBQUduQyxjQUFJLHFCQUFxQixTQUFTLEdBQUc7QUFDbkMsd0NBQTRCLHFCQUFxQixJQUFJO0FBSXJELHFCQUFTLElBQUksR0FBRyxJQUFJLHFCQUFxQixRQUFRLEtBQUs7QUFDcEQsa0JBQUksY0FBYyxxQkFBcUI7QUFFdkMsa0JBQUksWUFBWSxjQUFjLFdBQVc7QUFDdkMsNEJBQVksWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUs5QixjQUFJLGdCQUFnQixNQUFNO0FBQ3hCLHdDQUE0QixhQUFhO0FBQUE7QUFHM0MsY0FBSSxlQUFlLE1BQU07QUFDdkIsd0NBQTRCLFlBQVk7QUFBQTtBQUcxQyxjQUFJLGdCQUFnQixNQUFNO0FBQ3hCLHdDQUE0QixhQUFhO0FBQUE7QUFHM0MsY0FBSSxVQUFVLFNBQVUsY0FBYTtBQUNuQyxtQkFBTyw0QkFBNEIsY0FBYTtBQUFBO0FBR2xELHlCQUFlLFFBQVE7QUFDdkIsZ0NBQXNCLFFBQVE7QUFFOUIsbUJBQVMsS0FBSyxHQUFHLEtBQUssK0JBQStCLFFBQVEsTUFBTTtBQUNqRSxnQkFBSSxlQUFlLCtCQUErQjtBQUVsRCxnQkFBSSxhQUFhLGNBQWMsV0FBVztBQUN4QywyQkFBYSxZQUFZO0FBQUE7QUFBQTtBQUk3QixpQkFBTywrQkFBK0IsU0FBUyxHQUFHO0FBQ2hELGdCQUFJLHFCQUFxQiwrQkFBK0I7QUFFeEQsZ0JBQUksbUJBQW1CLGNBQWMsTUFBTTtBQUV6QztBQUFBLG1CQUNLO0FBQ0wsNkNBQStCO0FBRS9CLGtCQUFJLG1CQUFtQixjQUFjLE1BQU07QUFFekMsK0NBQStCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNdkMsWUFBSSwwQkFBMEIscUJBQXFCO0FBRW5ELFlBQUksV0FBVztBQUdmLDRCQUFvQixTQUFTO0FBQzNCLHFCQUFXLENBQUMsQ0FBQztBQUFBO0FBRWYsNkJBQXFCO0FBQ25CLGlCQUFPO0FBQUE7QUFFVCx3REFBZ0QsaUJBQWlCLGNBQWMsa0JBQWtCO0FBQy9GLGNBQUksZ0JBQWdCLGlCQUFpQjtBQUNyQyxjQUFJO0FBRUosa0JBQVE7QUFBQSxpQkFDRDtBQUNILGdDQUFrQjtBQUNsQjtBQUFBLGlCQUVHO0FBQ0gsZ0NBQWtCO0FBQ2xCO0FBQUEsaUJBRUc7QUFBQTtBQUVILGdDQUFrQjtBQUNsQjtBQUFBO0FBR0osaUJBQU8sZ0JBQWdCLEtBQUssTUFBTSxjQUFjLGtCQUFrQjtBQUFBO0FBR3BFLHVDQUErQixjQUFjLGtCQUFrQixXQUFXLGFBQWE7QUFDckYsY0FBSSxtQkFBbUI7QUFDdkIsY0FBSSxpQkFBaUIsd0JBQXdCO0FBQzdDLGtDQUF3QixhQUFhO0FBRXJDLGNBQUk7QUFDRixxQ0FBeUI7QUFDekIsMEJBQWMsY0FBYyxrQkFBa0IsV0FBVztBQUFBLG9CQUN6RDtBQUNBLHFDQUF5QjtBQUN6QixvQ0FBd0IsYUFBYTtBQUFBO0FBQUE7QUFJekMseUNBQWlDLGNBQWMsa0JBQWtCLFdBQVcsYUFBYTtBQUN2RixjQUFJLG1CQUFtQjtBQUN2QixjQUFJLGlCQUFpQix3QkFBd0I7QUFDN0Msa0NBQXdCLGFBQWE7QUFFckMsY0FBSTtBQUNGLHFDQUF5QjtBQUN6QiwwQkFBYyxjQUFjLGtCQUFrQixXQUFXO0FBQUEsb0JBQ3pEO0FBQ0EscUNBQXlCO0FBQ3pCLG9DQUF3QixhQUFhO0FBQUE7QUFBQTtBQUl6QywrQkFBdUIsY0FBYyxrQkFBa0IsaUJBQWlCLGFBQWE7QUFDbkYsY0FBSSxDQUFDLFVBQVU7QUFDYjtBQUFBO0FBR0Y7QUFDRSw0RkFBZ0YsY0FBYyxrQkFBa0IsaUJBQWlCO0FBQUE7QUFBQTtBQUlySSxpR0FBeUYsY0FBYyxrQkFBa0IsaUJBQWlCLGFBQWE7QUFDckosY0FBSSxZQUFZLDBCQUEwQixjQUFjLGtCQUFrQixpQkFBaUI7QUFFM0YsY0FBSSxjQUFjLE1BQU07QUFDdEIsOENBQWtDLGNBQWMsa0JBQWtCLGFBQWEsbUJBQW1CO0FBQ2xHLG1DQUF1QixjQUFjO0FBQ3JDO0FBQUE7QUFHRixjQUFJLHVCQUF1QixXQUFXLGNBQWMsa0JBQWtCLGlCQUFpQixjQUFjO0FBQ25HLHdCQUFZO0FBQ1o7QUFBQTtBQUtGLGlDQUF1QixjQUFjO0FBRXJDLGNBQUksbUJBQW1CLG9CQUFvQixxQ0FBcUMsZUFBZTtBQUM3RixtQkFBTyxjQUFjLE1BQU07QUFDekIsa0JBQUksUUFBUSxvQkFBb0I7QUFFaEMsa0JBQUksVUFBVSxNQUFNO0FBQ2xCLDRDQUE0QjtBQUFBO0FBRzlCLGtCQUFJLGdCQUFnQiwwQkFBMEIsY0FBYyxrQkFBa0IsaUJBQWlCO0FBRS9GLGtCQUFJLGtCQUFrQixNQUFNO0FBQzFCLGtEQUFrQyxjQUFjLGtCQUFrQixhQUFhLG1CQUFtQjtBQUFBO0FBR3BHLGtCQUFJLGtCQUFrQixXQUFXO0FBQy9CO0FBQUE7QUFHRiwwQkFBWTtBQUFBO0FBR2QsZ0JBQUksY0FBYyxNQUFNO0FBQ3RCLDBCQUFZO0FBQUE7QUFHZDtBQUFBO0FBS0YsNENBQWtDLGNBQWMsa0JBQWtCLGFBQWEsTUFBTTtBQUFBO0FBR3ZGLFlBQUksb0JBQW9CO0FBR3hCLDJDQUFtQyxjQUFjLGtCQUFrQixpQkFBaUIsYUFBYTtBQUUvRiw4QkFBb0I7QUFDcEIsY0FBSSxvQkFBb0IsZUFBZTtBQUN2QyxjQUFJLGFBQWEsMkJBQTJCO0FBRTVDLGNBQUksZUFBZSxNQUFNO0FBQ3ZCLGdCQUFJLGlCQUFpQix1QkFBdUI7QUFFNUMsZ0JBQUksbUJBQW1CLE1BQU07QUFFM0IsMkJBQWE7QUFBQSxtQkFDUjtBQUNMLGtCQUFJLE1BQU0sZUFBZTtBQUV6QixrQkFBSSxRQUFRLG1CQUFtQjtBQUM3QixvQkFBSSxXQUFXLDZCQUE2QjtBQUU1QyxvQkFBSSxhQUFhLE1BQU07QUFLckIseUJBQU87QUFBQTtBQU1ULDZCQUFhO0FBQUEseUJBQ0osUUFBUSxVQUFVO0FBQzNCLG9CQUFJLFFBQU8sZUFBZTtBQUUxQixvQkFBSSxpQkFBaUIsUUFBTztBQUcxQix5QkFBTyxzQkFBc0I7QUFBQTtBQUcvQiw2QkFBYTtBQUFBLHlCQUNKLG1CQUFtQixZQUFZO0FBS3hDLDZCQUFhO0FBQUE7QUFBQTtBQUFBO0FBS25CLDhCQUFvQjtBQUVwQixpQkFBTztBQUFBO0FBRVQsa0NBQTBCLGNBQWM7QUFDdEMsa0JBQVE7QUFBQSxpQkFFRDtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBR0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBR0E7QUFBQSxpQkFDQTtBQUFBLGlCQUdBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFDSCxxQkFBTztBQUFBLGlCQUVKO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUdBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQ0gscUJBQU87QUFBQSxpQkFFSixXQUNIO0FBSUUsa0JBQUksb0JBQW9CO0FBRXhCLHNCQUFRO0FBQUEscUJBQ0Q7QUFDSCx5QkFBTztBQUFBLHFCQUVKO0FBQ0gseUJBQU87QUFBQSxxQkFFSjtBQUFBLHFCQUNBO0FBRUgseUJBQU87QUFBQSxxQkFFSjtBQUNILHlCQUFPO0FBQUE7QUFHUCx5QkFBTztBQUFBO0FBQUE7QUFBQTtBQUtiLHFCQUFPO0FBQUE7QUFBQTtBQUliLHdDQUFnQyxRQUFRLFdBQVcsVUFBVTtBQUMzRCxpQkFBTyxpQkFBaUIsV0FBVyxVQUFVO0FBQzdDLGlCQUFPO0FBQUE7QUFFVCx5Q0FBaUMsUUFBUSxXQUFXLFVBQVU7QUFDNUQsaUJBQU8saUJBQWlCLFdBQVcsVUFBVTtBQUM3QyxpQkFBTztBQUFBO0FBRVQsd0RBQWdELFFBQVEsV0FBVyxVQUFVLFNBQVM7QUFDcEYsaUJBQU8saUJBQWlCLFdBQVcsVUFBVTtBQUFBLFlBQzNDLFNBQVM7QUFBQSxZQUNUO0FBQUE7QUFFRixpQkFBTztBQUFBO0FBRVQsdURBQStDLFFBQVEsV0FBVyxVQUFVLFNBQVM7QUFDbkYsaUJBQU8saUJBQWlCLFdBQVcsVUFBVTtBQUFBLFlBQzNDO0FBQUE7QUFFRixpQkFBTztBQUFBO0FBY1QsWUFBSSxPQUFPO0FBQ1gsWUFBSSxZQUFZO0FBQ2hCLFlBQUksZUFBZTtBQUNuQiw0QkFBb0IsbUJBQW1CO0FBQ3JDLGlCQUFPO0FBQ1Asc0JBQVk7QUFDWixpQkFBTztBQUFBO0FBRVQseUJBQWlCO0FBQ2YsaUJBQU87QUFDUCxzQkFBWTtBQUNaLHlCQUFlO0FBQUE7QUFFakIsMkJBQW1CO0FBQ2pCLGNBQUksY0FBYztBQUNoQixtQkFBTztBQUFBO0FBR1QsY0FBSTtBQUNKLGNBQUksYUFBYTtBQUNqQixjQUFJLGNBQWMsV0FBVztBQUM3QixjQUFJO0FBQ0osY0FBSSxXQUFXO0FBQ2YsY0FBSSxZQUFZLFNBQVM7QUFFekIsZUFBSyxRQUFRLEdBQUcsUUFBUSxhQUFhLFNBQVM7QUFDNUMsZ0JBQUksV0FBVyxXQUFXLFNBQVMsUUFBUTtBQUN6QztBQUFBO0FBQUE7QUFJSixjQUFJLFNBQVMsY0FBYztBQUUzQixlQUFLLE1BQU0sR0FBRyxPQUFPLFFBQVEsT0FBTztBQUNsQyxnQkFBSSxXQUFXLGNBQWMsU0FBUyxTQUFTLFlBQVksTUFBTTtBQUMvRDtBQUFBO0FBQUE7QUFJSixjQUFJLFlBQVksTUFBTSxJQUFJLElBQUksTUFBTTtBQUNwQyx5QkFBZSxTQUFTLE1BQU0sT0FBTztBQUNyQyxpQkFBTztBQUFBO0FBRVQsMkJBQW1CO0FBQ2pCLGNBQUksV0FBVyxNQUFNO0FBQ25CLG1CQUFPLEtBQUs7QUFBQTtBQUdkLGlCQUFPLEtBQUs7QUFBQTtBQWFkLGtDQUEwQixhQUFhO0FBQ3JDLGNBQUk7QUFDSixjQUFJLFVBQVUsWUFBWTtBQUUxQixjQUFJLGNBQWMsYUFBYTtBQUM3Qix1QkFBVyxZQUFZO0FBRXZCLGdCQUFJLGFBQWEsS0FBSyxZQUFZLElBQUk7QUFDcEMseUJBQVc7QUFBQTtBQUFBLGlCQUVSO0FBRUwsdUJBQVc7QUFBQTtBQUtiLGNBQUksYUFBYSxJQUFJO0FBQ25CLHVCQUFXO0FBQUE7QUFLYixjQUFJLFlBQVksTUFBTSxhQUFhLElBQUk7QUFDckMsbUJBQU87QUFBQTtBQUdULGlCQUFPO0FBQUE7QUFHVCwyQ0FBbUM7QUFDakMsaUJBQU87QUFBQTtBQUdULDRDQUFvQztBQUNsQyxpQkFBTztBQUFBO0FBS1Qsc0NBQThCLFdBQVc7QUFjdkMsc0NBQTRCLFdBQVcsZ0JBQWdCLFlBQVksYUFBYSxtQkFBbUI7QUFDakcsaUJBQUssYUFBYTtBQUNsQixpQkFBSyxjQUFjO0FBQ25CLGlCQUFLLE9BQU87QUFDWixpQkFBSyxjQUFjO0FBQ25CLGlCQUFLLFNBQVM7QUFDZCxpQkFBSyxnQkFBZ0I7QUFFckIscUJBQVMsYUFBYSxXQUFXO0FBQy9CLGtCQUFJLENBQUMsVUFBVSxlQUFlLFlBQVk7QUFDeEM7QUFBQTtBQUdGLGtCQUFJLFlBQVksVUFBVTtBQUUxQixrQkFBSSxXQUFXO0FBQ2IscUJBQUssYUFBYSxVQUFVO0FBQUEscUJBQ3ZCO0FBQ0wscUJBQUssYUFBYSxZQUFZO0FBQUE7QUFBQTtBQUlsQyxnQkFBSSxtQkFBbUIsWUFBWSxvQkFBb0IsT0FBTyxZQUFZLG1CQUFtQixZQUFZLGdCQUFnQjtBQUV6SCxnQkFBSSxrQkFBa0I7QUFDcEIsbUJBQUsscUJBQXFCO0FBQUEsbUJBQ3JCO0FBQ0wsbUJBQUsscUJBQXFCO0FBQUE7QUFHNUIsaUJBQUssdUJBQXVCO0FBQzVCLG1CQUFPO0FBQUE7QUFHVCxpQkFBTyxtQkFBbUIsV0FBVztBQUFBLFlBQ25DLGdCQUFnQixXQUFZO0FBQzFCLG1CQUFLLG1CQUFtQjtBQUN4QixrQkFBSSxRQUFRLEtBQUs7QUFFakIsa0JBQUksQ0FBQyxPQUFPO0FBQ1Y7QUFBQTtBQUdGLGtCQUFJLE1BQU0sZ0JBQWdCO0FBQ3hCLHNCQUFNO0FBQUEseUJBQ0csT0FBTyxNQUFNLGdCQUFnQixXQUFXO0FBQ2pELHNCQUFNLGNBQWM7QUFBQTtBQUd0QixtQkFBSyxxQkFBcUI7QUFBQTtBQUFBLFlBRTVCLGlCQUFpQixXQUFZO0FBQzNCLGtCQUFJLFFBQVEsS0FBSztBQUVqQixrQkFBSSxDQUFDLE9BQU87QUFDVjtBQUFBO0FBR0Ysa0JBQUksTUFBTSxpQkFBaUI7QUFDekIsc0JBQU07QUFBQSx5QkFDRyxPQUFPLE1BQU0saUJBQWlCLFdBQVc7QUFNbEQsc0JBQU0sZUFBZTtBQUFBO0FBR3ZCLG1CQUFLLHVCQUF1QjtBQUFBO0FBQUEsWUFROUIsU0FBUyxXQUFZO0FBQUE7QUFBQSxZQVFyQixjQUFjO0FBQUE7QUFFaEIsaUJBQU87QUFBQTtBQVFULFlBQUksaUJBQWlCO0FBQUEsVUFDbkIsWUFBWTtBQUFBLFVBQ1osU0FBUztBQUFBLFVBQ1QsWUFBWTtBQUFBLFVBQ1osV0FBVyxTQUFVLE9BQU87QUFDMUIsbUJBQU8sTUFBTSxhQUFhLEtBQUs7QUFBQTtBQUFBLFVBRWpDLGtCQUFrQjtBQUFBLFVBQ2xCLFdBQVc7QUFBQTtBQUViLFlBQUksaUJBQWlCLHFCQUFxQjtBQUUxQyxZQUFJLG1CQUFtQixPQUFPLElBQUksZ0JBQWdCO0FBQUEsVUFDaEQsTUFBTTtBQUFBLFVBQ04sUUFBUTtBQUFBO0FBR1YsWUFBSSxtQkFBbUIscUJBQXFCO0FBQzVDLFlBQUk7QUFDSixZQUFJO0FBQ0osWUFBSTtBQUVKLGtEQUEwQyxPQUFPO0FBQy9DLGNBQUksVUFBVSxnQkFBZ0I7QUFDNUIsZ0JBQUksa0JBQWtCLE1BQU0sU0FBUyxhQUFhO0FBQ2hELDhCQUFnQixNQUFNLFVBQVUsZUFBZTtBQUMvQyw4QkFBZ0IsTUFBTSxVQUFVLGVBQWU7QUFBQSxtQkFDMUM7QUFDTCw4QkFBZ0I7QUFDaEIsOEJBQWdCO0FBQUE7QUFHbEIsNkJBQWlCO0FBQUE7QUFBQTtBQVNyQixZQUFJLHNCQUFzQixPQUFPLElBQUksa0JBQWtCO0FBQUEsVUFDckQsU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsU0FBUztBQUFBLFVBQ1QsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1Qsa0JBQWtCO0FBQUEsVUFDbEIsUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsZUFBZSxTQUFVLE9BQU87QUFDOUIsZ0JBQUksTUFBTSxrQkFBa0I7QUFBVyxxQkFBTyxNQUFNLGdCQUFnQixNQUFNLGFBQWEsTUFBTSxZQUFZLE1BQU07QUFDL0csbUJBQU8sTUFBTTtBQUFBO0FBQUEsVUFFZixXQUFXLFNBQVUsT0FBTztBQUMxQixnQkFBSSxlQUFlLE9BQU87QUFDeEIscUJBQU8sTUFBTTtBQUFBO0FBR2YsNkNBQWlDO0FBQ2pDLG1CQUFPO0FBQUE7QUFBQSxVQUVULFdBQVcsU0FBVSxPQUFPO0FBQzFCLGdCQUFJLGVBQWUsT0FBTztBQUN4QixxQkFBTyxNQUFNO0FBQUE7QUFNZixtQkFBTztBQUFBO0FBQUE7QUFJWCxZQUFJLHNCQUFzQixxQkFBcUI7QUFNL0MsWUFBSSxxQkFBcUIsT0FBTyxJQUFJLHFCQUFxQjtBQUFBLFVBQ3ZELGNBQWM7QUFBQTtBQUdoQixZQUFJLHFCQUFxQixxQkFBcUI7QUFNOUMsWUFBSSxzQkFBc0IsT0FBTyxJQUFJLGtCQUFrQjtBQUFBLFVBQ3JELGVBQWU7QUFBQTtBQUdqQixZQUFJLHNCQUFzQixxQkFBcUI7QUFPL0MsWUFBSSwwQkFBMEIsT0FBTyxJQUFJLGdCQUFnQjtBQUFBLFVBQ3ZELGVBQWU7QUFBQSxVQUNmLGFBQWE7QUFBQSxVQUNiLGVBQWU7QUFBQTtBQUdqQixZQUFJLDBCQUEwQixxQkFBcUI7QUFNbkQsWUFBSSwwQkFBMEIsT0FBTyxJQUFJLGdCQUFnQjtBQUFBLFVBQ3ZELGVBQWUsU0FBVSxPQUFPO0FBQzlCLG1CQUFPLG1CQUFtQixRQUFRLE1BQU0sZ0JBQWdCLE9BQU87QUFBQTtBQUFBO0FBSW5FLFlBQUksMEJBQTBCLHFCQUFxQjtBQU1uRCxZQUFJLDRCQUE0QixPQUFPLElBQUksZ0JBQWdCO0FBQUEsVUFDekQsTUFBTTtBQUFBO0FBR1IsWUFBSSw0QkFBNEIscUJBQXFCO0FBUXJELFlBQUksc0JBQXNCO0FBTTFCLFlBQUksZUFBZTtBQUFBLFVBQ2pCLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLEtBQUs7QUFBQSxVQUNMLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFFBQVE7QUFBQSxVQUNSLGlCQUFpQjtBQUFBO0FBUW5CLFlBQUksaUJBQWlCO0FBQUEsVUFDbkIsS0FBSztBQUFBLFVBQ0wsS0FBSztBQUFBLFVBQ0wsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFVBQ04sT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBO0FBT1QsNkJBQXFCLGFBQWE7QUFDaEMsY0FBSSxZQUFZLEtBQUs7QUFLbkIsZ0JBQUksTUFBTSxhQUFhLFlBQVksUUFBUSxZQUFZO0FBRXZELGdCQUFJLFFBQVEsZ0JBQWdCO0FBQzFCLHFCQUFPO0FBQUE7QUFBQTtBQUtYLGNBQUksWUFBWSxTQUFTLFlBQVk7QUFDbkMsZ0JBQUksV0FBVyxpQkFBaUI7QUFHaEMsbUJBQU8sYUFBYSxLQUFLLFVBQVUsT0FBTyxhQUFhO0FBQUE7QUFHekQsY0FBSSxZQUFZLFNBQVMsYUFBYSxZQUFZLFNBQVMsU0FBUztBQUdsRSxtQkFBTyxlQUFlLFlBQVksWUFBWTtBQUFBO0FBR2hELGlCQUFPO0FBQUE7QUFRVCxZQUFJLG9CQUFvQjtBQUFBLFVBQ3RCLEtBQUs7QUFBQSxVQUNMLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQTtBQUtULHFDQUE2QixRQUFRO0FBQ25DLGNBQUksaUJBQWlCO0FBQ3JCLGNBQUksY0FBYyxlQUFlO0FBRWpDLGNBQUksWUFBWSxrQkFBa0I7QUFDaEMsbUJBQU8sWUFBWSxpQkFBaUI7QUFBQTtBQUd0QyxjQUFJLFVBQVUsa0JBQWtCO0FBQ2hDLGlCQUFPLFVBQVUsQ0FBQyxDQUFDLFlBQVksV0FBVztBQUFBO0FBRzVDLHVDQUErQixhQUFhO0FBQzFDLGlCQUFPO0FBQUE7QUFRVCxZQUFJLHlCQUF5QixPQUFPLElBQUksa0JBQWtCO0FBQUEsVUFDeEQsS0FBSztBQUFBLFVBQ0wsTUFBTTtBQUFBLFVBQ04sVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsVUFBVTtBQUFBLFVBQ1YsUUFBUTtBQUFBLFVBQ1IsU0FBUztBQUFBLFVBQ1QsUUFBUTtBQUFBLFVBQ1IsUUFBUTtBQUFBLFVBQ1Isa0JBQWtCO0FBQUEsVUFFbEIsVUFBVSxTQUFVLE9BQU87QUFLekIsZ0JBQUksTUFBTSxTQUFTLFlBQVk7QUFDN0IscUJBQU8saUJBQWlCO0FBQUE7QUFHMUIsbUJBQU87QUFBQTtBQUFBLFVBRVQsU0FBUyxTQUFVLE9BQU87QUFPeEIsZ0JBQUksTUFBTSxTQUFTLGFBQWEsTUFBTSxTQUFTLFNBQVM7QUFDdEQscUJBQU8sTUFBTTtBQUFBO0FBR2YsbUJBQU87QUFBQTtBQUFBLFVBRVQsT0FBTyxTQUFVLE9BQU87QUFHdEIsZ0JBQUksTUFBTSxTQUFTLFlBQVk7QUFDN0IscUJBQU8saUJBQWlCO0FBQUE7QUFHMUIsZ0JBQUksTUFBTSxTQUFTLGFBQWEsTUFBTSxTQUFTLFNBQVM7QUFDdEQscUJBQU8sTUFBTTtBQUFBO0FBR2YsbUJBQU87QUFBQTtBQUFBO0FBSVgsWUFBSSx5QkFBeUIscUJBQXFCO0FBTWxELFlBQUksd0JBQXdCLE9BQU8sSUFBSSxxQkFBcUI7QUFBQSxVQUMxRCxXQUFXO0FBQUEsVUFDWCxPQUFPO0FBQUEsVUFDUCxRQUFRO0FBQUEsVUFDUixVQUFVO0FBQUEsVUFDVixvQkFBb0I7QUFBQSxVQUNwQixPQUFPO0FBQUEsVUFDUCxPQUFPO0FBQUEsVUFDUCxPQUFPO0FBQUEsVUFDUCxhQUFhO0FBQUEsVUFDYixXQUFXO0FBQUE7QUFHYixZQUFJLHdCQUF3QixxQkFBcUI7QUFNakQsWUFBSSxzQkFBc0IsT0FBTyxJQUFJLGtCQUFrQjtBQUFBLFVBQ3JELFNBQVM7QUFBQSxVQUNULGVBQWU7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLGtCQUFrQjtBQUFBO0FBR3BCLFlBQUksc0JBQXNCLHFCQUFxQjtBQU8vQyxZQUFJLDJCQUEyQixPQUFPLElBQUksZ0JBQWdCO0FBQUEsVUFDeEQsY0FBYztBQUFBLFVBQ2QsYUFBYTtBQUFBLFVBQ2IsZUFBZTtBQUFBO0FBR2pCLFlBQUksMkJBQTJCLHFCQUFxQjtBQU1wRCxZQUFJLHNCQUFzQixPQUFPLElBQUkscUJBQXFCO0FBQUEsVUFDeEQsUUFBUSxTQUFVLE9BQU87QUFDdkIsbUJBQU8sWUFBWSxRQUFRLE1BQU0sU0FDakMsaUJBQWlCLFFBQVEsQ0FBQyxNQUFNLGNBQWM7QUFBQTtBQUFBLFVBRWhELFFBQVEsU0FBVSxPQUFPO0FBQ3ZCLG1CQUFPLFlBQVksUUFBUSxNQUFNLFNBQ2pDLGlCQUFpQixRQUFRLENBQUMsTUFBTSxjQUNoQyxnQkFBZ0IsUUFBUSxDQUFDLE1BQU0sYUFBYTtBQUFBO0FBQUEsVUFFOUMsUUFBUTtBQUFBLFVBS1IsV0FBVztBQUFBO0FBR2IsWUFBSSxzQkFBc0IscUJBQXFCO0FBRS9DLFlBQUksZUFBZSxDQUFDLEdBQUcsSUFBSSxJQUFJO0FBRS9CLFlBQUksZ0JBQWdCO0FBQ3BCLFlBQUkseUJBQXlCLGFBQWEsc0JBQXNCO0FBQ2hFLFlBQUksZUFBZTtBQUVuQixZQUFJLGFBQWEsa0JBQWtCLFVBQVU7QUFDM0MseUJBQWUsU0FBUztBQUFBO0FBTTFCLFlBQUksdUJBQXVCLGFBQWEsZUFBZSxVQUFVLENBQUM7QUFJbEUsWUFBSSw2QkFBNkIsYUFBYyxFQUFDLDBCQUEwQixnQkFBZ0IsZUFBZSxLQUFLLGdCQUFnQjtBQUM5SCxZQUFJLGdCQUFnQjtBQUNwQixZQUFJLGdCQUFnQixPQUFPLGFBQWE7QUFFeEMsa0NBQTBCO0FBQ3hCLGdDQUFzQixpQkFBaUIsQ0FBQyxrQkFBa0IsWUFBWSxhQUFhO0FBQ25GLGdDQUFzQixvQkFBb0IsQ0FBQyxrQkFBa0IsWUFBWSxXQUFXLFlBQVksU0FBUztBQUN6RyxnQ0FBc0Isc0JBQXNCLENBQUMsb0JBQW9CLFlBQVksV0FBVyxZQUFZLFNBQVM7QUFDN0csZ0NBQXNCLHVCQUF1QixDQUFDLHFCQUFxQixZQUFZLFdBQVcsWUFBWSxTQUFTO0FBQUE7QUFJakgsWUFBSSxtQkFBbUI7QUFPdkIsbUNBQTJCLGFBQWE7QUFDdEMsaUJBQVEsYUFBWSxXQUFXLFlBQVksVUFBVSxZQUFZLFlBQ2pFLENBQUUsYUFBWSxXQUFXLFlBQVk7QUFBQTtBQU92Qyx5Q0FBaUMsY0FBYztBQUM3QyxrQkFBUTtBQUFBLGlCQUNEO0FBQ0gscUJBQU87QUFBQSxpQkFFSjtBQUNILHFCQUFPO0FBQUEsaUJBRUo7QUFDSCxxQkFBTztBQUFBO0FBQUE7QUFTYiw0Q0FBb0MsY0FBYyxhQUFhO0FBQzdELGlCQUFPLGlCQUFpQixhQUFhLFlBQVksWUFBWTtBQUFBO0FBTy9ELDBDQUFrQyxjQUFjLGFBQWE7QUFDM0Qsa0JBQVE7QUFBQSxpQkFDRDtBQUVILHFCQUFPLGFBQWEsUUFBUSxZQUFZLGFBQWE7QUFBQSxpQkFFbEQ7QUFHSCxxQkFBTyxZQUFZLFlBQVk7QUFBQSxpQkFFNUI7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBRUgscUJBQU87QUFBQTtBQUdQLHFCQUFPO0FBQUE7QUFBQTtBQWNiLHdDQUFnQyxhQUFhO0FBQzNDLGNBQUksU0FBUyxZQUFZO0FBRXpCLGNBQUksT0FBTyxXQUFXLFlBQVksVUFBVSxRQUFRO0FBQ2xELG1CQUFPLE9BQU87QUFBQTtBQUdoQixpQkFBTztBQUFBO0FBY1Qsa0NBQTBCLGFBQWE7QUFDckMsaUJBQU8sWUFBWSxXQUFXO0FBQUE7QUFJaEMsWUFBSSxjQUFjO0FBS2xCLHlDQUFpQyxlQUFlLGNBQWMsWUFBWSxhQUFhLG1CQUFtQjtBQUN4RyxjQUFJO0FBQ0osY0FBSTtBQUVKLGNBQUksd0JBQXdCO0FBQzFCLHdCQUFZLHdCQUF3QjtBQUFBLHFCQUMzQixDQUFDLGFBQWE7QUFDdkIsZ0JBQUksMkJBQTJCLGNBQWMsY0FBYztBQUN6RCwwQkFBWTtBQUFBO0FBQUEscUJBRUwseUJBQXlCLGNBQWMsY0FBYztBQUM5RCx3QkFBWTtBQUFBO0FBR2QsY0FBSSxDQUFDLFdBQVc7QUFDZCxtQkFBTztBQUFBO0FBR1QsY0FBSSw4QkFBOEIsQ0FBQyxpQkFBaUIsY0FBYztBQUdoRSxnQkFBSSxDQUFDLGVBQWUsY0FBYyxzQkFBc0I7QUFDdEQsNEJBQWMsV0FBVztBQUFBLHVCQUNoQixjQUFjLG9CQUFvQjtBQUMzQyxrQkFBSSxhQUFhO0FBQ2YsK0JBQWU7QUFBQTtBQUFBO0FBQUE7QUFLckIsY0FBSSxZQUFZLDRCQUE0QixZQUFZO0FBRXhELGNBQUksVUFBVSxTQUFTLEdBQUc7QUFDeEIsZ0JBQUksUUFBUSxJQUFJLDBCQUEwQixXQUFXLGNBQWMsTUFBTSxhQUFhO0FBQ3RGLDBCQUFjLEtBQUs7QUFBQSxjQUNqQjtBQUFBLGNBQ0E7QUFBQTtBQUdGLGdCQUFJLGNBQWM7QUFHaEIsb0JBQU0sT0FBTztBQUFBLG1CQUNSO0FBQ0wsa0JBQUksYUFBYSx1QkFBdUI7QUFFeEMsa0JBQUksZUFBZSxNQUFNO0FBQ3ZCLHNCQUFNLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1yQiwyQ0FBbUMsY0FBYyxhQUFhO0FBQzVELGtCQUFRO0FBQUEsaUJBQ0Q7QUFDSCxxQkFBTyx1QkFBdUI7QUFBQSxpQkFFM0I7QUFlSCxrQkFBSSxRQUFRLFlBQVk7QUFFeEIsa0JBQUksVUFBVSxlQUFlO0FBQzNCLHVCQUFPO0FBQUE7QUFHVCxpQ0FBbUI7QUFDbkIscUJBQU87QUFBQSxpQkFFSjtBQUVILGtCQUFJLFFBQVEsWUFBWTtBQUl4QixrQkFBSSxVQUFVLGlCQUFpQixrQkFBa0I7QUFDL0MsdUJBQU87QUFBQTtBQUdULHFCQUFPO0FBQUE7QUFJUCxxQkFBTztBQUFBO0FBQUE7QUFTYiw2Q0FBcUMsY0FBYyxhQUFhO0FBSzlELGNBQUksYUFBYTtBQUNmLGdCQUFJLGlCQUFpQixvQkFBb0IsQ0FBQywwQkFBMEIseUJBQXlCLGNBQWMsY0FBYztBQUN2SCxrQkFBSSxRQUFRO0FBQ1o7QUFDQSw0QkFBYztBQUNkLHFCQUFPO0FBQUE7QUFHVCxtQkFBTztBQUFBO0FBR1Qsa0JBQVE7QUFBQSxpQkFDRDtBQUdILHFCQUFPO0FBQUEsaUJBRUo7QUFpQkgsa0JBQUksQ0FBQyxrQkFBa0IsY0FBYztBQU9uQyxvQkFBSSxZQUFZLFFBQVEsWUFBWSxLQUFLLFNBQVMsR0FBRztBQUNuRCx5QkFBTyxZQUFZO0FBQUEsMkJBQ1YsWUFBWSxPQUFPO0FBQzVCLHlCQUFPLE9BQU8sYUFBYSxZQUFZO0FBQUE7QUFBQTtBQUkzQyxxQkFBTztBQUFBLGlCQUVKO0FBQ0gscUJBQU8sOEJBQThCLENBQUMsaUJBQWlCLGVBQWUsT0FBTyxZQUFZO0FBQUE7QUFHekYscUJBQU87QUFBQTtBQUFBO0FBV2IseUNBQWlDLGVBQWUsY0FBYyxZQUFZLGFBQWEsbUJBQW1CO0FBQ3hHLGNBQUk7QUFFSixjQUFJLHNCQUFzQjtBQUN4QixvQkFBUSwwQkFBMEIsY0FBYztBQUFBLGlCQUMzQztBQUNMLG9CQUFRLDRCQUE0QixjQUFjO0FBQUE7QUFLcEQsY0FBSSxDQUFDLE9BQU87QUFDVixtQkFBTztBQUFBO0FBR1QsY0FBSSxZQUFZLDRCQUE0QixZQUFZO0FBRXhELGNBQUksVUFBVSxTQUFTLEdBQUc7QUFDeEIsZ0JBQUksUUFBUSxJQUFJLG9CQUFvQixpQkFBaUIsZUFBZSxNQUFNLGFBQWE7QUFDdkYsMEJBQWMsS0FBSztBQUFBLGNBQ2pCO0FBQUEsY0FDQTtBQUFBO0FBRUYsa0JBQU0sT0FBTztBQUFBO0FBQUE7QUF1QmpCLCtCQUF1QixlQUFlLGNBQWMsWUFBWSxhQUFhLG1CQUFtQixrQkFBa0IsaUJBQWlCO0FBQ2pJLGtDQUF3QixlQUFlLGNBQWMsWUFBWSxhQUFhO0FBQzlFLGtDQUF3QixlQUFlLGNBQWMsWUFBWSxhQUFhO0FBQUE7QUFNaEYsWUFBSSxzQkFBc0I7QUFBQSxVQUN4QixPQUFPO0FBQUEsVUFDUCxNQUFNO0FBQUEsVUFDTixVQUFVO0FBQUEsVUFDVixrQkFBa0I7QUFBQSxVQUNsQixPQUFPO0FBQUEsVUFDUCxPQUFPO0FBQUEsVUFDUCxRQUFRO0FBQUEsVUFDUixVQUFVO0FBQUEsVUFDVixPQUFPO0FBQUEsVUFDUCxRQUFRO0FBQUEsVUFDUixLQUFLO0FBQUEsVUFDTCxNQUFNO0FBQUEsVUFDTixNQUFNO0FBQUEsVUFDTixLQUFLO0FBQUEsVUFDTCxNQUFNO0FBQUE7QUFHUixvQ0FBNEIsTUFBTTtBQUNoQyxjQUFJLFdBQVcsUUFBUSxLQUFLLFlBQVksS0FBSyxTQUFTO0FBRXRELGNBQUksYUFBYSxTQUFTO0FBQ3hCLG1CQUFPLENBQUMsQ0FBQyxvQkFBb0IsS0FBSztBQUFBO0FBR3BDLGNBQUksYUFBYSxZQUFZO0FBQzNCLG1CQUFPO0FBQUE7QUFHVCxpQkFBTztBQUFBO0FBR1QsQUFjQSxrQ0FBMEIsaUJBQWlCO0FBQ3pDLGNBQUksQ0FBQyxXQUFXO0FBQ2QsbUJBQU87QUFBQTtBQUdULGNBQUksWUFBWSxPQUFPO0FBQ3ZCLGNBQUksY0FBZSxhQUFhO0FBRWhDLGNBQUksQ0FBQyxhQUFhO0FBQ2hCLGdCQUFJLFVBQVUsU0FBUyxjQUFjO0FBQ3JDLG9CQUFRLGFBQWEsV0FBVztBQUNoQywwQkFBYyxPQUFPLFFBQVEsZUFBZTtBQUFBO0FBRzlDLGlCQUFPO0FBQUE7QUFHVCxvQ0FBNEI7QUFDMUIsZ0NBQXNCLFlBQVksQ0FBQyxVQUFVLFNBQVMsV0FBVyxZQUFZLFNBQVMsV0FBVyxTQUFTO0FBQUE7QUFHNUcsZ0RBQXdDLGVBQWUsTUFBTSxhQUFhLFFBQVE7QUFFaEYsOEJBQW9CO0FBQ3BCLGNBQUksWUFBWSw0QkFBNEIsTUFBTTtBQUVsRCxjQUFJLFVBQVUsU0FBUyxHQUFHO0FBQ3hCLGdCQUFJLFFBQVEsSUFBSSxlQUFlLFlBQVksVUFBVSxNQUFNLGFBQWE7QUFDeEUsMEJBQWMsS0FBSztBQUFBLGNBQ2pCO0FBQUEsY0FDQTtBQUFBO0FBQUE7QUFBQTtBQVNOLFlBQUksZ0JBQWdCO0FBQ3BCLFlBQUksb0JBQW9CO0FBS3hCLHNDQUE4QixNQUFNO0FBQ2xDLGNBQUksV0FBVyxLQUFLLFlBQVksS0FBSyxTQUFTO0FBQzlDLGlCQUFPLGFBQWEsWUFBWSxhQUFhLFdBQVcsS0FBSyxTQUFTO0FBQUE7QUFHeEUsMkNBQW1DLGFBQWE7QUFDOUMsY0FBSSxnQkFBZ0I7QUFDcEIseUNBQStCLGVBQWUsbUJBQW1CLGFBQWEsZUFBZTtBQVk3Rix5QkFBZSxpQkFBaUI7QUFBQTtBQUdsQyxpQ0FBeUIsZUFBZTtBQUN0QywrQkFBcUIsZUFBZTtBQUFBO0FBR3RDLHVDQUErQixZQUFZO0FBQ3pDLGNBQUksYUFBYSxvQkFBb0I7QUFFckMsY0FBSSxxQkFBcUIsYUFBYTtBQUNwQyxtQkFBTztBQUFBO0FBQUE7QUFJWCw2Q0FBcUMsY0FBYyxZQUFZO0FBQzdELGNBQUksaUJBQWlCLFVBQVU7QUFDN0IsbUJBQU87QUFBQTtBQUFBO0FBUVgsWUFBSSx3QkFBd0I7QUFFNUIsWUFBSSxXQUFXO0FBR2Isa0NBQXdCLGlCQUFpQixZQUFhLEVBQUMsU0FBUyxnQkFBZ0IsU0FBUyxlQUFlO0FBQUE7QUFTMUcsNkNBQXFDLFFBQVEsWUFBWTtBQUN2RCwwQkFBZ0I7QUFDaEIsOEJBQW9CO0FBQ3BCLHdCQUFjLFlBQVksb0JBQW9CO0FBQUE7QUFRaEQsOENBQXNDO0FBQ3BDLGNBQUksQ0FBQyxlQUFlO0FBQ2xCO0FBQUE7QUFHRix3QkFBYyxZQUFZLG9CQUFvQjtBQUM5QywwQkFBZ0I7QUFDaEIsOEJBQW9CO0FBQUE7QUFRdEIsc0NBQThCLGFBQWE7QUFDekMsY0FBSSxZQUFZLGlCQUFpQixTQUFTO0FBQ3hDO0FBQUE7QUFHRixjQUFJLHNCQUFzQixvQkFBb0I7QUFDNUMsc0NBQTBCO0FBQUE7QUFBQTtBQUk5QixtREFBMkMsY0FBYyxRQUFRLFlBQVk7QUFDM0UsY0FBSSxpQkFBaUIsV0FBVztBQVc5QjtBQUNBLHdDQUE0QixRQUFRO0FBQUEscUJBQzNCLGlCQUFpQixZQUFZO0FBQ3RDO0FBQUE7QUFBQTtBQUtKLG9EQUE0QyxjQUFjLFlBQVk7QUFDcEUsY0FBSSxpQkFBaUIscUJBQXFCLGlCQUFpQixXQUFXLGlCQUFpQixXQUFXO0FBV2hHLG1CQUFPLHNCQUFzQjtBQUFBO0FBQUE7QUFRakMscUNBQTZCLE1BQU07QUFJakMsY0FBSSxXQUFXLEtBQUs7QUFDcEIsaUJBQU8sWUFBWSxTQUFTLGtCQUFrQixXQUFZLE1BQUssU0FBUyxjQUFjLEtBQUssU0FBUztBQUFBO0FBR3RHLDRDQUFvQyxjQUFjLFlBQVk7QUFDNUQsY0FBSSxpQkFBaUIsU0FBUztBQUM1QixtQkFBTyxzQkFBc0I7QUFBQTtBQUFBO0FBSWpDLG9EQUE0QyxjQUFjLFlBQVk7QUFDcEUsY0FBSSxpQkFBaUIsV0FBVyxpQkFBaUIsVUFBVTtBQUN6RCxtQkFBTyxzQkFBc0I7QUFBQTtBQUFBO0FBSWpDLDJDQUFtQyxNQUFNO0FBQ3ZDLGNBQUksUUFBUSxLQUFLO0FBRWpCLGNBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxjQUFjLEtBQUssU0FBUyxVQUFVO0FBQ3pEO0FBQUE7QUFHRjtBQUVFLDRCQUFnQixNQUFNLFVBQVUsS0FBSztBQUFBO0FBQUE7QUFlekMsaUNBQXlCLGVBQWUsY0FBYyxZQUFZLGFBQWEsbUJBQW1CLGtCQUFrQixpQkFBaUI7QUFDbkksY0FBSSxhQUFhLGFBQWEsb0JBQW9CLGNBQWM7QUFDaEUsY0FBSSxtQkFBbUI7QUFFdkIsY0FBSSxxQkFBcUIsYUFBYTtBQUNwQyxnQ0FBb0I7QUFBQSxxQkFDWCxtQkFBbUIsYUFBYTtBQUN6QyxnQkFBSSx1QkFBdUI7QUFDekIsa0NBQW9CO0FBQUEsbUJBQ2Y7QUFDTCxrQ0FBb0I7QUFDcEIsZ0NBQWtCO0FBQUE7QUFBQSxxQkFFWCxvQkFBb0IsYUFBYTtBQUMxQyxnQ0FBb0I7QUFBQTtBQUd0QixjQUFJLG1CQUFtQjtBQUNyQixnQkFBSSxPQUFPLGtCQUFrQixjQUFjO0FBRTNDLGdCQUFJLE1BQU07QUFDUiw2Q0FBK0IsZUFBZSxNQUFNLGFBQWE7QUFDakU7QUFBQTtBQUFBO0FBSUosY0FBSSxpQkFBaUI7QUFDbkIsNEJBQWdCLGNBQWMsWUFBWTtBQUFBO0FBSTVDLGNBQUksaUJBQWlCLFlBQVk7QUFDL0Isc0NBQTBCO0FBQUE7QUFBQTtBQUk5QixvQ0FBNEI7QUFDMUIsOEJBQW9CLGdCQUFnQixDQUFDLFlBQVk7QUFDakQsOEJBQW9CLGdCQUFnQixDQUFDLFlBQVk7QUFDakQsOEJBQW9CLGtCQUFrQixDQUFDLGNBQWM7QUFDckQsOEJBQW9CLGtCQUFrQixDQUFDLGNBQWM7QUFBQTtBQVd2RCxpQ0FBeUIsZUFBZSxjQUFjLFlBQVksYUFBYSxtQkFBbUIsa0JBQWtCLGlCQUFpQjtBQUNuSSxjQUFJLGNBQWMsaUJBQWlCLGVBQWUsaUJBQWlCO0FBQ25FLGNBQUksYUFBYSxpQkFBaUIsY0FBYyxpQkFBaUI7QUFFakUsY0FBSSxlQUFlLENBQUMsaUJBQWlCLGNBQWM7QUFLakQsZ0JBQUksVUFBVSxZQUFZLGlCQUFpQixZQUFZO0FBRXZELGdCQUFJLFNBQVM7QUFHWCxrQkFBSSwyQkFBMkIsWUFBWSx3QkFBd0IsVUFBVTtBQUMzRTtBQUFBO0FBQUE7QUFBQTtBQUtOLGNBQUksQ0FBQyxjQUFjLENBQUMsYUFBYTtBQUUvQjtBQUFBO0FBR0YsY0FBSTtBQUVKLGNBQUksa0JBQWtCLFdBQVcsbUJBQW1CO0FBRWxELGtCQUFNO0FBQUEsaUJBQ0Q7QUFFTCxnQkFBSSxNQUFNLGtCQUFrQjtBQUU1QixnQkFBSSxLQUFLO0FBQ1Asb0JBQU0sSUFBSSxlQUFlLElBQUk7QUFBQSxtQkFDeEI7QUFDTCxvQkFBTTtBQUFBO0FBQUE7QUFJVixjQUFJO0FBQ0osY0FBSTtBQUVKLGNBQUksWUFBWTtBQUNkLGdCQUFJLFdBQVcsWUFBWSxpQkFBaUIsWUFBWTtBQUV4RCxtQkFBTztBQUNQLGlCQUFLLFdBQVcsMkJBQTJCLFlBQVk7QUFFdkQsZ0JBQUksT0FBTyxNQUFNO0FBQ2Ysa0JBQUksaUJBQWlCLHVCQUF1QjtBQUU1QyxrQkFBSSxPQUFPLGtCQUFrQixHQUFHLFFBQVEsaUJBQWlCLEdBQUcsUUFBUSxVQUFVO0FBQzVFLHFCQUFLO0FBQUE7QUFBQTtBQUFBLGlCQUdKO0FBRUwsbUJBQU87QUFDUCxpQkFBSztBQUFBO0FBR1AsY0FBSSxTQUFTLElBQUk7QUFFZjtBQUFBO0FBR0YsY0FBSSxxQkFBcUI7QUFDekIsY0FBSSxpQkFBaUI7QUFDckIsY0FBSSxpQkFBaUI7QUFDckIsY0FBSSxrQkFBa0I7QUFFdEIsY0FBSSxpQkFBaUIsZ0JBQWdCLGlCQUFpQixlQUFlO0FBQ25FLGlDQUFxQjtBQUNyQiw2QkFBaUI7QUFDakIsNkJBQWlCO0FBQ2pCLDhCQUFrQjtBQUFBO0FBR3BCLGNBQUksV0FBVyxRQUFRLE9BQU8sTUFBTSxvQkFBb0I7QUFDeEQsY0FBSSxTQUFTLE1BQU0sT0FBTyxNQUFNLG9CQUFvQjtBQUNwRCxjQUFJLFFBQVEsSUFBSSxtQkFBbUIsZ0JBQWdCLGtCQUFrQixTQUFTLE1BQU0sYUFBYTtBQUNqRyxnQkFBTSxTQUFTO0FBQ2YsZ0JBQU0sZ0JBQWdCO0FBQ3RCLGNBQUksUUFBUTtBQUdaLGNBQUksbUJBQW1CLDJCQUEyQjtBQUVsRCxjQUFJLHFCQUFxQixZQUFZO0FBQ25DLGdCQUFJLGFBQWEsSUFBSSxtQkFBbUIsZ0JBQWdCLGtCQUFrQixTQUFTLElBQUksYUFBYTtBQUNwRyx1QkFBVyxTQUFTO0FBQ3BCLHVCQUFXLGdCQUFnQjtBQUMzQixvQkFBUTtBQUFBO0FBR1YsZ0RBQXNDLGVBQWUsT0FBTyxPQUFPLE1BQU07QUFBQTtBQU8zRSxvQkFBWSxHQUFHLEdBQUc7QUFDaEIsaUJBQU8sTUFBTSxLQUFNLE9BQU0sS0FBSyxJQUFJLE1BQU0sSUFBSSxNQUFNLE1BQU0sS0FBSyxNQUFNO0FBQUE7QUFJckUsWUFBSSxXQUFXLE9BQU8sT0FBTyxPQUFPLGFBQWEsT0FBTyxLQUFLO0FBUTdELDhCQUFzQixNQUFNLE1BQU07QUFDaEMsY0FBSSxTQUFTLE1BQU0sT0FBTztBQUN4QixtQkFBTztBQUFBO0FBR1QsY0FBSSxPQUFPLFNBQVMsWUFBWSxTQUFTLFFBQVEsT0FBTyxTQUFTLFlBQVksU0FBUyxNQUFNO0FBQzFGLG1CQUFPO0FBQUE7QUFHVCxjQUFJLFFBQVEsT0FBTyxLQUFLO0FBQ3hCLGNBQUksUUFBUSxPQUFPLEtBQUs7QUFFeEIsY0FBSSxNQUFNLFdBQVcsTUFBTSxRQUFRO0FBQ2pDLG1CQUFPO0FBQUE7QUFJVCxtQkFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNyQyxnQkFBSSxhQUFhLE1BQU07QUFFdkIsZ0JBQUksQ0FBQyxlQUFlLEtBQUssTUFBTSxlQUFlLENBQUMsU0FBUyxLQUFLLGFBQWEsS0FBSyxjQUFjO0FBQzNGLHFCQUFPO0FBQUE7QUFBQTtBQUlYLGlCQUFPO0FBQUE7QUFVVCw2QkFBcUIsTUFBTTtBQUN6QixpQkFBTyxRQUFRLEtBQUssWUFBWTtBQUM5QixtQkFBTyxLQUFLO0FBQUE7QUFHZCxpQkFBTztBQUFBO0FBV1QsZ0NBQXdCLE1BQU07QUFDNUIsaUJBQU8sTUFBTTtBQUNYLGdCQUFJLEtBQUssYUFBYTtBQUNwQixxQkFBTyxLQUFLO0FBQUE7QUFHZCxtQkFBTyxLQUFLO0FBQUE7QUFBQTtBQVloQiwyQ0FBbUMsT0FBTSxRQUFRO0FBQy9DLGNBQUksT0FBTyxZQUFZO0FBQ3ZCLGNBQUksWUFBWTtBQUNoQixjQUFJLFVBQVU7QUFFZCxpQkFBTyxNQUFNO0FBQ1gsZ0JBQUksS0FBSyxhQUFhLFdBQVc7QUFDL0Isd0JBQVUsWUFBWSxLQUFLLFlBQVk7QUFFdkMsa0JBQUksYUFBYSxVQUFVLFdBQVcsUUFBUTtBQUM1Qyx1QkFBTztBQUFBLGtCQUNMO0FBQUEsa0JBQ0EsUUFBUSxTQUFTO0FBQUE7QUFBQTtBQUlyQiwwQkFBWTtBQUFBO0FBR2QsbUJBQU8sWUFBWSxlQUFlO0FBQUE7QUFBQTtBQVN0Qyw0QkFBb0IsV0FBVztBQUM3QixjQUFJLGdCQUFnQixVQUFVO0FBQzlCLGNBQUksTUFBTSxpQkFBaUIsY0FBYyxlQUFlO0FBQ3hELGNBQUksWUFBWSxJQUFJLGdCQUFnQixJQUFJO0FBRXhDLGNBQUksQ0FBQyxhQUFhLFVBQVUsZUFBZSxHQUFHO0FBQzVDLG1CQUFPO0FBQUE7QUFHVCxjQUFJLGFBQWEsVUFBVSxZQUN2QixlQUFlLFVBQVUsY0FDekIsWUFBWSxVQUFVLFdBQ3RCLGNBQWMsVUFBVTtBQVE1QixjQUFJO0FBRUYsdUJBQVc7QUFDWCxzQkFBVTtBQUFBLG1CQUVILEdBQVA7QUFDQSxtQkFBTztBQUFBO0FBR1QsaUJBQU8sMkJBQTJCLFdBQVcsWUFBWSxjQUFjLFdBQVc7QUFBQTtBQVlwRiw0Q0FBb0MsV0FBVyxZQUFZLGNBQWMsV0FBVyxhQUFhO0FBQy9GLGNBQUksU0FBUztBQUNiLGNBQUksUUFBUTtBQUNaLGNBQUksTUFBTTtBQUNWLGNBQUksb0JBQW9CO0FBQ3hCLGNBQUksbUJBQW1CO0FBQ3ZCLGNBQUksT0FBTztBQUNYLGNBQUksYUFBYTtBQUVqQjtBQUFPLG1CQUFPLE1BQU07QUFDbEIsa0JBQUksT0FBTztBQUVYLHFCQUFPLE1BQU07QUFDWCxvQkFBSSxTQUFTLGNBQWUsa0JBQWlCLEtBQUssS0FBSyxhQUFhLFlBQVk7QUFDOUUsMEJBQVEsU0FBUztBQUFBO0FBR25CLG9CQUFJLFNBQVMsYUFBYyxpQkFBZ0IsS0FBSyxLQUFLLGFBQWEsWUFBWTtBQUM1RSx3QkFBTSxTQUFTO0FBQUE7QUFHakIsb0JBQUksS0FBSyxhQUFhLFdBQVc7QUFDL0IsNEJBQVUsS0FBSyxVQUFVO0FBQUE7QUFHM0Isb0JBQUssUUFBTyxLQUFLLGdCQUFnQixNQUFNO0FBQ3JDO0FBQUE7QUFJRiw2QkFBYTtBQUNiLHVCQUFPO0FBQUE7QUFHVCxxQkFBTyxNQUFNO0FBQ1gsb0JBQUksU0FBUyxXQUFXO0FBS3RCO0FBQUE7QUFHRixvQkFBSSxlQUFlLGNBQWMsRUFBRSxzQkFBc0IsY0FBYztBQUNyRSwwQkFBUTtBQUFBO0FBR1Ysb0JBQUksZUFBZSxhQUFhLEVBQUUscUJBQXFCLGFBQWE7QUFDbEUsd0JBQU07QUFBQTtBQUdSLG9CQUFLLFFBQU8sS0FBSyxpQkFBaUIsTUFBTTtBQUN0QztBQUFBO0FBR0YsdUJBQU87QUFDUCw2QkFBYSxLQUFLO0FBQUE7QUFJcEIscUJBQU87QUFBQTtBQUdULGNBQUksVUFBVSxNQUFNLFFBQVEsSUFBSTtBQUc5QixtQkFBTztBQUFBO0FBR1QsaUJBQU87QUFBQSxZQUNMO0FBQUEsWUFDQTtBQUFBO0FBQUE7QUFnQkosNEJBQW9CLE1BQU0sU0FBUztBQUNqQyxjQUFJLE1BQU0sS0FBSyxpQkFBaUI7QUFDaEMsY0FBSSxNQUFNLE9BQU8sSUFBSSxlQUFlO0FBSXBDLGNBQUksQ0FBQyxJQUFJLGNBQWM7QUFDckI7QUFBQTtBQUdGLGNBQUksWUFBWSxJQUFJO0FBQ3BCLGNBQUksU0FBUyxLQUFLLFlBQVk7QUFDOUIsY0FBSSxRQUFRLEtBQUssSUFBSSxRQUFRLE9BQU87QUFDcEMsY0FBSSxNQUFNLFFBQVEsUUFBUSxTQUFZLFFBQVEsS0FBSyxJQUFJLFFBQVEsS0FBSztBQUdwRSxjQUFJLENBQUMsVUFBVSxVQUFVLFFBQVEsS0FBSztBQUNwQyxnQkFBSSxPQUFPO0FBQ1gsa0JBQU07QUFDTixvQkFBUTtBQUFBO0FBR1YsY0FBSSxjQUFjLDBCQUEwQixNQUFNO0FBQ2xELGNBQUksWUFBWSwwQkFBMEIsTUFBTTtBQUVoRCxjQUFJLGVBQWUsV0FBVztBQUM1QixnQkFBSSxVQUFVLGVBQWUsS0FBSyxVQUFVLGVBQWUsWUFBWSxRQUFRLFVBQVUsaUJBQWlCLFlBQVksVUFBVSxVQUFVLGNBQWMsVUFBVSxRQUFRLFVBQVUsZ0JBQWdCLFVBQVUsUUFBUTtBQUNwTjtBQUFBO0FBR0YsZ0JBQUksUUFBUSxJQUFJO0FBQ2hCLGtCQUFNLFNBQVMsWUFBWSxNQUFNLFlBQVk7QUFDN0Msc0JBQVU7QUFFVixnQkFBSSxRQUFRLEtBQUs7QUFDZix3QkFBVSxTQUFTO0FBQ25CLHdCQUFVLE9BQU8sVUFBVSxNQUFNLFVBQVU7QUFBQSxtQkFDdEM7QUFDTCxvQkFBTSxPQUFPLFVBQVUsTUFBTSxVQUFVO0FBQ3ZDLHdCQUFVLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFLekIsNEJBQW9CLE1BQU07QUFDeEIsaUJBQU8sUUFBUSxLQUFLLGFBQWE7QUFBQTtBQUduQyw4QkFBc0IsV0FBVyxXQUFXO0FBQzFDLGNBQUksQ0FBQyxhQUFhLENBQUMsV0FBVztBQUM1QixtQkFBTztBQUFBLHFCQUNFLGNBQWMsV0FBVztBQUNsQyxtQkFBTztBQUFBLHFCQUNFLFdBQVcsWUFBWTtBQUNoQyxtQkFBTztBQUFBLHFCQUNFLFdBQVcsWUFBWTtBQUNoQyxtQkFBTyxhQUFhLFdBQVcsVUFBVTtBQUFBLHFCQUNoQyxjQUFjLFdBQVc7QUFDbEMsbUJBQU8sVUFBVSxTQUFTO0FBQUEscUJBQ2pCLFVBQVUseUJBQXlCO0FBQzVDLG1CQUFPLENBQUMsQ0FBRSxXQUFVLHdCQUF3QixhQUFhO0FBQUEsaUJBQ3BEO0FBQ0wsbUJBQU87QUFBQTtBQUFBO0FBSVgsOEJBQXNCLE1BQU07QUFDMUIsaUJBQU8sUUFBUSxLQUFLLGlCQUFpQixhQUFhLEtBQUssY0FBYyxpQkFBaUI7QUFBQTtBQUd4RixtQ0FBMkIsUUFBUTtBQUNqQyxjQUFJO0FBUUYsbUJBQU8sT0FBTyxPQUFPLGNBQWMsU0FBUyxTQUFTO0FBQUEsbUJBQzlDLEtBQVA7QUFDQSxtQkFBTztBQUFBO0FBQUE7QUFJWCx3Q0FBZ0M7QUFDOUIsY0FBSSxNQUFNO0FBQ1YsY0FBSSxVQUFVO0FBRWQsaUJBQU8sbUJBQW1CLElBQUksbUJBQW1CO0FBQy9DLGdCQUFJLGtCQUFrQixVQUFVO0FBQzlCLG9CQUFNLFFBQVE7QUFBQSxtQkFDVDtBQUNMLHFCQUFPO0FBQUE7QUFHVCxzQkFBVSxpQkFBaUIsSUFBSTtBQUFBO0FBR2pDLGlCQUFPO0FBQUE7QUFnQlQsMENBQWtDLE1BQU07QUFDdEMsY0FBSSxXQUFXLFFBQVEsS0FBSyxZQUFZLEtBQUssU0FBUztBQUN0RCxpQkFBTyxZQUFhLGNBQWEsV0FBWSxNQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsWUFBWSxLQUFLLFNBQVMsU0FBUyxLQUFLLFNBQVMsU0FBUyxLQUFLLFNBQVMsZUFBZSxhQUFhLGNBQWMsS0FBSyxvQkFBb0I7QUFBQTtBQUVoTywyQ0FBbUM7QUFDakMsY0FBSSxjQUFjO0FBQ2xCLGlCQUFPO0FBQUEsWUFDTDtBQUFBLFlBQ0EsZ0JBQWdCLHlCQUF5QixlQUFlLGFBQWEsZUFBZTtBQUFBO0FBQUE7QUFTeEYsa0NBQTBCLDJCQUEyQjtBQUNuRCxjQUFJLGlCQUFpQjtBQUNyQixjQUFJLG1CQUFtQiwwQkFBMEI7QUFDakQsY0FBSSxzQkFBc0IsMEJBQTBCO0FBRXBELGNBQUksbUJBQW1CLG9CQUFvQixhQUFhLG1CQUFtQjtBQUN6RSxnQkFBSSx3QkFBd0IsUUFBUSx5QkFBeUIsbUJBQW1CO0FBQzlFLDJCQUFhLGtCQUFrQjtBQUFBO0FBSWpDLGdCQUFJLFlBQVk7QUFDaEIsZ0JBQUksV0FBVztBQUVmLG1CQUFPLFdBQVcsU0FBUyxZQUFZO0FBQ3JDLGtCQUFJLFNBQVMsYUFBYSxjQUFjO0FBQ3RDLDBCQUFVLEtBQUs7QUFBQSxrQkFDYixTQUFTO0FBQUEsa0JBQ1QsTUFBTSxTQUFTO0FBQUEsa0JBQ2YsS0FBSyxTQUFTO0FBQUE7QUFBQTtBQUFBO0FBS3BCLGdCQUFJLE9BQU8saUJBQWlCLFVBQVUsWUFBWTtBQUNoRCwrQkFBaUI7QUFBQTtBQUduQixxQkFBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsS0FBSztBQUN6QyxrQkFBSSxPQUFPLFVBQVU7QUFDckIsbUJBQUssUUFBUSxhQUFhLEtBQUs7QUFDL0IsbUJBQUssUUFBUSxZQUFZLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFXcEMsOEJBQXNCLE9BQU87QUFDM0IsY0FBSTtBQUVKLGNBQUksb0JBQW9CLE9BQU87QUFFN0Isd0JBQVk7QUFBQSxjQUNWLE9BQU8sTUFBTTtBQUFBLGNBQ2IsS0FBSyxNQUFNO0FBQUE7QUFBQSxpQkFFUjtBQUVMLHdCQUFZLFdBQVc7QUFBQTtBQUd6QixpQkFBTyxhQUFhO0FBQUEsWUFDbEIsT0FBTztBQUFBLFlBQ1AsS0FBSztBQUFBO0FBQUE7QUFVVCw4QkFBc0IsT0FBTyxTQUFTO0FBQ3BDLGNBQUksUUFBUSxRQUFRO0FBQ3BCLGNBQUksTUFBTSxRQUFRO0FBRWxCLGNBQUksUUFBUSxRQUFXO0FBQ3JCLGtCQUFNO0FBQUE7QUFHUixjQUFJLG9CQUFvQixPQUFPO0FBQzdCLGtCQUFNLGlCQUFpQjtBQUN2QixrQkFBTSxlQUFlLEtBQUssSUFBSSxLQUFLLE1BQU0sTUFBTTtBQUFBLGlCQUMxQztBQUNMLHVCQUFXLE9BQU87QUFBQTtBQUFBO0FBSXRCLFlBQUksMkJBQTJCLGFBQWEsa0JBQWtCLFlBQVksU0FBUyxnQkFBZ0I7QUFFbkcsb0NBQTRCO0FBQzFCLGdDQUFzQixZQUFZLENBQUMsWUFBWSxlQUFlLFdBQVcsV0FBVyxXQUFXLFNBQVMsYUFBYSxXQUFXO0FBQUE7QUFHbEksWUFBSSxrQkFBa0I7QUFDdEIsWUFBSSxzQkFBc0I7QUFDMUIsWUFBSSxnQkFBZ0I7QUFDcEIsWUFBSSxZQUFZO0FBUWhCLGdDQUF3QixNQUFNO0FBQzVCLGNBQUksb0JBQW9CLFFBQVEseUJBQXlCLE9BQU87QUFDOUQsbUJBQU87QUFBQSxjQUNMLE9BQU8sS0FBSztBQUFBLGNBQ1osS0FBSyxLQUFLO0FBQUE7QUFBQSxpQkFFUDtBQUNMLGdCQUFJLE1BQU0sS0FBSyxpQkFBaUIsS0FBSyxjQUFjLGVBQWU7QUFDbEUsZ0JBQUksWUFBWSxJQUFJO0FBQ3BCLG1CQUFPO0FBQUEsY0FDTCxZQUFZLFVBQVU7QUFBQSxjQUN0QixjQUFjLFVBQVU7QUFBQSxjQUN4QixXQUFXLFVBQVU7QUFBQSxjQUNyQixhQUFhLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFTN0Isd0NBQWdDLGFBQWE7QUFDM0MsaUJBQU8sWUFBWSxXQUFXLGNBQWMsWUFBWSxXQUFXLFlBQVksYUFBYSxnQkFBZ0IsY0FBYyxZQUFZO0FBQUE7QUFXeEksc0NBQThCLGVBQWUsYUFBYSxtQkFBbUI7QUFLM0UsY0FBSSxNQUFNLHVCQUF1QjtBQUVqQyxjQUFJLGFBQWEsbUJBQW1CLFFBQVEsb0JBQW9CLGlCQUFpQixNQUFNO0FBQ3JGO0FBQUE7QUFJRixjQUFJLG1CQUFtQixlQUFlO0FBRXRDLGNBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLGVBQWUsbUJBQW1CO0FBQ3BFLDRCQUFnQjtBQUNoQixnQkFBSSxZQUFZLDRCQUE0QixxQkFBcUI7QUFFakUsZ0JBQUksVUFBVSxTQUFTLEdBQUc7QUFDeEIsa0JBQUksUUFBUSxJQUFJLGVBQWUsWUFBWSxVQUFVLE1BQU0sYUFBYTtBQUN4RSw0QkFBYyxLQUFLO0FBQUEsZ0JBQ2pCO0FBQUEsZ0JBQ0E7QUFBQTtBQUVGLG9CQUFNLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFvQnJCLGlDQUF5QixlQUFlLGNBQWMsWUFBWSxhQUFhLG1CQUFtQixrQkFBa0IsaUJBQWlCO0FBQ25JLGNBQUksYUFBYSxhQUFhLG9CQUFvQixjQUFjO0FBRWhFLGtCQUFRO0FBQUEsaUJBRUQ7QUFDSCxrQkFBSSxtQkFBbUIsZUFBZSxXQUFXLG9CQUFvQixRQUFRO0FBQzNFLGtDQUFrQjtBQUNsQixzQ0FBc0I7QUFDdEIsZ0NBQWdCO0FBQUE7QUFHbEI7QUFBQSxpQkFFRztBQUNILGdDQUFrQjtBQUNsQixvQ0FBc0I7QUFDdEIsOEJBQWdCO0FBQ2hCO0FBQUEsaUJBSUc7QUFDSCwwQkFBWTtBQUNaO0FBQUEsaUJBRUc7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQ0gsMEJBQVk7QUFDWixtQ0FBcUIsZUFBZSxhQUFhO0FBQ2pEO0FBQUEsaUJBV0c7QUFDSCxrQkFBSSwwQkFBMEI7QUFDNUI7QUFBQTtBQUFBLGlCQUtDO0FBQUEsaUJBQ0E7QUFDSCxtQ0FBcUIsZUFBZSxhQUFhO0FBQUE7QUFBQTtBQVl2RCwrQkFBdUIsV0FBVyxXQUFXO0FBQzNDLGNBQUksWUFBVztBQUNmLG9CQUFTLFVBQVUsaUJBQWlCLFVBQVU7QUFDOUMsb0JBQVMsV0FBVyxhQUFhLFdBQVc7QUFDNUMsb0JBQVMsUUFBUSxhQUFhLFFBQVE7QUFDdEMsaUJBQU87QUFBQTtBQU9ULFlBQUksaUJBQWlCO0FBQUEsVUFDbkIsY0FBYyxjQUFjLGFBQWE7QUFBQSxVQUN6QyxvQkFBb0IsY0FBYyxhQUFhO0FBQUEsVUFDL0MsZ0JBQWdCLGNBQWMsYUFBYTtBQUFBLFVBQzNDLGVBQWUsY0FBYyxjQUFjO0FBQUE7QUFNN0MsWUFBSSxxQkFBcUI7QUFLekIsWUFBSSxRQUFRO0FBS1osWUFBSSxXQUFXO0FBQ2Isa0JBQVEsU0FBUyxjQUFjLE9BQU87QUFLdEMsY0FBSSxDQUFFLHFCQUFvQixTQUFTO0FBQ2pDLG1CQUFPLGVBQWUsYUFBYTtBQUNuQyxtQkFBTyxlQUFlLG1CQUFtQjtBQUN6QyxtQkFBTyxlQUFlLGVBQWU7QUFBQTtBQUl2QyxjQUFJLENBQUUsc0JBQXFCLFNBQVM7QUFDbEMsbUJBQU8sZUFBZSxjQUFjO0FBQUE7QUFBQTtBQVd4Qyw0Q0FBb0MsV0FBVztBQUM3QyxjQUFJLG1CQUFtQixZQUFZO0FBQ2pDLG1CQUFPLG1CQUFtQjtBQUFBLHFCQUNqQixDQUFDLGVBQWUsWUFBWTtBQUNyQyxtQkFBTztBQUFBO0FBR1QsY0FBSSxZQUFZLGVBQWU7QUFFL0IsbUJBQVMsYUFBYSxXQUFXO0FBQy9CLGdCQUFJLFVBQVUsZUFBZSxjQUFjLGFBQWEsT0FBTztBQUM3RCxxQkFBTyxtQkFBbUIsYUFBYSxVQUFVO0FBQUE7QUFBQTtBQUlyRCxpQkFBTztBQUFBO0FBR1QsWUFBSSxnQkFBZ0IsMkJBQTJCO0FBQy9DLFlBQUksc0JBQXNCLDJCQUEyQjtBQUNyRCxZQUFJLGtCQUFrQiwyQkFBMkI7QUFDakQsWUFBSSxpQkFBaUIsMkJBQTJCO0FBRWhELFlBQUksNkJBQTZCLElBQUk7QUFVckMsWUFBSSwwQkFBMEIsQ0FBQyxTQUFTLFlBQVksVUFBVSxXQUFXLGtCQUFrQixTQUFTLFNBQVMsZUFBZSxRQUFRLE9BQU8sUUFBUSxXQUFXLGFBQWEsWUFBWSxhQUFhLFlBQVksYUFBYSxRQUFRLGtCQUFrQixXQUFXLGFBQWEsU0FBUyxTQUFTLHFCQUFxQixTQUFTLFdBQVcsV0FBVyxZQUFZLFNBQVMsUUFBUSxjQUFjLGtCQUFrQixhQUFhLHNCQUFzQixhQUFhLGFBQWEsWUFBWSxhQUFhLFdBQVcsU0FBUyxTQUFTLFFBQVEsV0FBVyxpQkFBaUIsZUFBZSxlQUFlLGNBQWMsZUFBZSxhQUFhLFlBQVksY0FBYyxTQUFTLFVBQVUsVUFBVSxXQUFXLFdBQVcsVUFBVSxXQUFXLGNBQWMsZUFBZSxZQUFZLGNBQWMsZ0JBQWdCLFVBQVUsVUFBVSxhQUFhLFdBQVc7QUFFdDBCLHFDQUE2QixjQUFjLFdBQVc7QUFDcEQscUNBQTJCLElBQUksY0FBYztBQUM3QyxnQ0FBc0IsV0FBVyxDQUFDO0FBQUE7QUFHcEMsd0NBQWdDO0FBQzlCLG1CQUFTLElBQUksR0FBRyxJQUFJLHdCQUF3QixRQUFRLEtBQUs7QUFDdkQsZ0JBQUksWUFBWSx3QkFBd0I7QUFDeEMsZ0JBQUksZUFBZSxVQUFVO0FBQzdCLGdCQUFJLG1CQUFtQixVQUFVLEdBQUcsZ0JBQWdCLFVBQVUsTUFBTTtBQUNwRSxnQ0FBb0IsY0FBYyxPQUFPO0FBQUE7QUFJM0MsOEJBQW9CLGVBQWU7QUFDbkMsOEJBQW9CLHFCQUFxQjtBQUN6Qyw4QkFBb0IsaUJBQWlCO0FBQ3JDLDhCQUFvQixZQUFZO0FBQ2hDLDhCQUFvQixXQUFXO0FBQy9CLDhCQUFvQixZQUFZO0FBQ2hDLDhCQUFvQixnQkFBZ0I7QUFBQTtBQUd0QyxpQ0FBeUIsZUFBZSxjQUFjLFlBQVksYUFBYSxtQkFBbUIsa0JBQWtCLGlCQUFpQjtBQUNuSSxjQUFJLFlBQVksMkJBQTJCLElBQUk7QUFFL0MsY0FBSSxjQUFjLFFBQVc7QUFDM0I7QUFBQTtBQUdGLGNBQUkscUJBQXFCO0FBQ3pCLGNBQUksaUJBQWlCO0FBRXJCLGtCQUFRO0FBQUEsaUJBQ0Q7QUFJSCxrQkFBSSxpQkFBaUIsaUJBQWlCLEdBQUc7QUFDdkM7QUFBQTtBQUFBLGlCQUtDO0FBQUEsaUJBQ0E7QUFDSCxtQ0FBcUI7QUFDckI7QUFBQSxpQkFFRztBQUNILCtCQUFpQjtBQUNqQixtQ0FBcUI7QUFDckI7QUFBQSxpQkFFRztBQUNILCtCQUFpQjtBQUNqQixtQ0FBcUI7QUFDckI7QUFBQSxpQkFFRztBQUFBLGlCQUNBO0FBQ0gsbUNBQXFCO0FBQ3JCO0FBQUEsaUJBRUc7QUFHSCxrQkFBSSxZQUFZLFdBQVcsR0FBRztBQUM1QjtBQUFBO0FBQUEsaUJBS0M7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUlBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUNILG1DQUFxQjtBQUNyQjtBQUFBLGlCQUVHO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFDSCxtQ0FBcUI7QUFDckI7QUFBQSxpQkFFRztBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUNILG1DQUFxQjtBQUNyQjtBQUFBLGlCQUVHO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUNILG1DQUFxQjtBQUNyQjtBQUFBLGlCQUVHO0FBQ0gsbUNBQXFCO0FBQ3JCO0FBQUEsaUJBRUc7QUFDSCxtQ0FBcUI7QUFDckI7QUFBQSxpQkFFRztBQUNILG1DQUFxQjtBQUNyQjtBQUFBLGlCQUVHO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUNILG1DQUFxQjtBQUNyQjtBQUFBLGlCQUVHO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFDSCxtQ0FBcUI7QUFDckI7QUFBQTtBQUdKLGNBQUksaUJBQWtCLG9CQUFtQixzQkFBc0I7QUFFL0Q7QUFLRSxnQkFBSSx1QkFBdUIsQ0FBQyxrQkFJNUIsaUJBQWlCO0FBRWpCLGdCQUFJLGFBQWEsK0JBQStCLFlBQVksV0FBVyxZQUFZLE1BQU0sZ0JBQWdCO0FBRXpHLGdCQUFJLFdBQVcsU0FBUyxHQUFHO0FBRXpCLGtCQUFJLFNBQVMsSUFBSSxtQkFBbUIsV0FBVyxnQkFBZ0IsTUFBTSxhQUFhO0FBRWxGLDRCQUFjLEtBQUs7QUFBQSxnQkFDakIsT0FBTztBQUFBLGdCQUNQLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9uQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsaUNBQXlCLGVBQWUsY0FBYyxZQUFZLGFBQWEsbUJBQW1CLGtCQUFrQixpQkFBaUI7QUFPbkksMEJBQWdCLGVBQWUsY0FBYyxZQUFZLGFBQWEsbUJBQW1CO0FBQ3pGLGNBQUksK0JBQWdDLG9CQUFtQiwrQ0FBK0M7QUFrQnRHLGNBQUksOEJBQThCO0FBQ2hDLDRCQUFnQixlQUFlLGNBQWMsWUFBWSxhQUFhO0FBQ3RFLDRCQUFnQixlQUFlLGNBQWMsWUFBWSxhQUFhO0FBQ3RFLDRCQUFnQixlQUFlLGNBQWMsWUFBWSxhQUFhO0FBQ3RFLDBCQUFjLGVBQWUsY0FBYyxZQUFZLGFBQWE7QUFBQTtBQUFBO0FBS3hFLFlBQUksa0JBQWtCLENBQUMsU0FBUyxXQUFXLGtCQUFrQixrQkFBa0IsV0FBVyxhQUFhLFNBQVMsU0FBUyxjQUFjLGtCQUFrQixhQUFhLFNBQVMsUUFBUSxXQUFXLFlBQVksY0FBYyxVQUFVLFVBQVUsV0FBVyxXQUFXLFdBQVcsY0FBYyxnQkFBZ0I7QUFJL1MsWUFBSSxxQkFBcUIsSUFBSSxJQUFJLENBQUMsVUFBVSxTQUFTLFdBQVcsUUFBUSxVQUFVLFVBQVUsT0FBTztBQUVuRyxpQ0FBeUIsT0FBTyxVQUFVLGVBQWU7QUFDdkQsY0FBSSxPQUFPLE1BQU0sUUFBUTtBQUN6QixnQkFBTSxnQkFBZ0I7QUFDdEIsa0RBQXdDLE1BQU0sVUFBVSxRQUFXO0FBQ25FLGdCQUFNLGdCQUFnQjtBQUFBO0FBR3hCLGtEQUEwQyxPQUFPLG1CQUFtQixnQkFBZ0I7QUFDbEYsY0FBSTtBQUVKLGNBQUksZ0JBQWdCO0FBQ2xCLHFCQUFTLElBQUksa0JBQWtCLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUN0RCxrQkFBSSx1QkFBdUIsa0JBQWtCLElBQ3pDLFdBQVcscUJBQXFCLFVBQ2hDLGdCQUFnQixxQkFBcUIsZUFDckMsV0FBVyxxQkFBcUI7QUFFcEMsa0JBQUksYUFBYSxvQkFBb0IsTUFBTSx3QkFBd0I7QUFDakU7QUFBQTtBQUdGLDhCQUFnQixPQUFPLFVBQVU7QUFDakMsaUNBQW1CO0FBQUE7QUFBQSxpQkFFaEI7QUFDTCxxQkFBUyxLQUFLLEdBQUcsS0FBSyxrQkFBa0IsUUFBUSxNQUFNO0FBQ3BELGtCQUFJLHdCQUF3QixrQkFBa0IsS0FDMUMsWUFBWSxzQkFBc0IsVUFDbEMsaUJBQWlCLHNCQUFzQixlQUN2QyxZQUFZLHNCQUFzQjtBQUV0QyxrQkFBSSxjQUFjLG9CQUFvQixNQUFNLHdCQUF3QjtBQUNsRTtBQUFBO0FBR0YsOEJBQWdCLE9BQU8sV0FBVztBQUNsQyxpQ0FBbUI7QUFBQTtBQUFBO0FBQUE7QUFLekIsc0NBQThCLGVBQWUsa0JBQWtCO0FBQzdELGNBQUksaUJBQWtCLG9CQUFtQixzQkFBc0I7QUFFL0QsbUJBQVMsSUFBSSxHQUFHLElBQUksY0FBYyxRQUFRLEtBQUs7QUFDN0MsZ0JBQUksbUJBQW1CLGNBQWMsSUFDakMsUUFBUSxpQkFBaUIsT0FDekIsWUFBWSxpQkFBaUI7QUFDakMsNkNBQWlDLE9BQU8sV0FBVztBQUFBO0FBSXJEO0FBQUE7QUFHRiwwQ0FBa0MsY0FBYyxrQkFBa0IsYUFBYSxZQUFZLGlCQUFpQjtBQUMxRyxjQUFJLG9CQUFvQixlQUFlO0FBQ3ZDLGNBQUksZ0JBQWdCO0FBQ3BCLDBCQUFnQixlQUFlLGNBQWMsWUFBWSxhQUFhLG1CQUFtQjtBQUN6RiwrQkFBcUIsZUFBZTtBQUFBO0FBR3RDLDJDQUFtQyxjQUFjLGVBQWU7QUFDOUQ7QUFDRSxnQkFBSSxDQUFDLG1CQUFtQixJQUFJLGVBQWU7QUFDekMsb0JBQU0sNkdBQWtIO0FBQUE7QUFBQTtBQUk1SCxjQUFJLHlCQUF5QjtBQUM3QixjQUFJLGNBQWMsb0JBQW9CO0FBQ3RDLGNBQUksaUJBQWlCLGtCQUFrQixjQUFjO0FBRXJELGNBQUksQ0FBQyxZQUFZLElBQUksaUJBQWlCO0FBQ3BDLG9DQUF3QixlQUFlLGNBQWMsa0JBQWtCO0FBQ3ZFLHdCQUFZLElBQUk7QUFBQTtBQUFBO0FBR3BCLHFDQUE2QixjQUFjLHdCQUF3QixRQUFRO0FBQ3pFO0FBQ0UsZ0JBQUksbUJBQW1CLElBQUksaUJBQWlCLENBQUMsd0JBQXdCO0FBQ25FLG9CQUFNLDJIQUFnSTtBQUFBO0FBQUE7QUFJMUksY0FBSSxtQkFBbUI7QUFFdkIsY0FBSSx3QkFBd0I7QUFDMUIsZ0NBQW9CO0FBQUE7QUFHdEIsa0NBQXdCLFFBQVEsY0FBYyxrQkFBa0I7QUFBQTtBQUVsRSxZQUFJLGtCQUFrQixvQkFBb0IsS0FBSyxTQUFTLFNBQVMsSUFBSSxNQUFNO0FBQzNFLDRDQUFvQyxzQkFBc0I7QUFDeEQsY0FBSSxDQUFDLHFCQUFxQixrQkFBa0I7QUFDMUMsaUNBQXFCLG1CQUFtQjtBQUN4Qyw0QkFBZ0IsUUFBUSxTQUFVLGNBQWM7QUFHOUMsa0JBQUksaUJBQWlCLG1CQUFtQjtBQUN0QyxvQkFBSSxDQUFDLG1CQUFtQixJQUFJLGVBQWU7QUFDekMsc0NBQW9CLGNBQWMsT0FBTztBQUFBO0FBRzNDLG9DQUFvQixjQUFjLE1BQU07QUFBQTtBQUFBO0FBRzVDLGdCQUFJLGdCQUFnQixxQkFBcUIsYUFBYSxnQkFBZ0IsdUJBQXVCLHFCQUFxQjtBQUVsSCxnQkFBSSxrQkFBa0IsTUFBTTtBQUcxQixrQkFBSSxDQUFDLGNBQWMsa0JBQWtCO0FBQ25DLDhCQUFjLG1CQUFtQjtBQUNqQyxvQ0FBb0IsbUJBQW1CLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU10RCx5Q0FBaUMsaUJBQWlCLGNBQWMsa0JBQWtCLHdCQUF3QixzQ0FBc0M7QUFDOUksY0FBSSxXQUFXLHVDQUF1QyxpQkFBaUIsY0FBYztBQUdyRixjQUFJLG9CQUFvQjtBQUV4QixjQUFJLCtCQUErQjtBQU9qQyxnQkFBSSxpQkFBaUIsZ0JBQWdCLGlCQUFpQixlQUFlLGlCQUFpQixTQUFTO0FBQzdGLGtDQUFvQjtBQUFBO0FBQUE7QUFJeEIsNEJBQW1CO0FBQ25CLGNBQUk7QUFHSixjQUFJLHdCQUF3QjtBQUMxQixnQkFBSSxzQkFBc0IsUUFBVztBQUNuQyxvQ0FBc0IsdUNBQXVDLGlCQUFpQixjQUFjLFVBQVU7QUFBQSxtQkFDakc7QUFDTCxvQ0FBc0Isd0JBQXdCLGlCQUFpQixjQUFjO0FBQUE7QUFBQSxpQkFFMUU7QUFDTCxnQkFBSSxzQkFBc0IsUUFBVztBQUNuQyxvQ0FBc0Isc0NBQXNDLGlCQUFpQixjQUFjLFVBQVU7QUFBQSxtQkFDaEc7QUFDTCxvQ0FBc0IsdUJBQXVCLGlCQUFpQixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBS2xGLHlDQUFpQyxnQkFBZ0IsaUJBQWlCO0FBQ2hFLGlCQUFPLG1CQUFtQixtQkFBbUIsZUFBZSxhQUFhLGdCQUFnQixlQUFlLGVBQWU7QUFBQTtBQUd6SCxtREFBMkMsY0FBYyxrQkFBa0IsYUFBYSxZQUFZLGlCQUFpQjtBQUNuSCxjQUFJLGVBQWU7QUFFbkIsY0FBSyxvQkFBbUIsc0NBQXNDLEtBQU0sb0JBQW1CLHNCQUFzQixHQUFHO0FBQzlHLGdCQUFJLHNCQUFzQjtBQUUxQixnQkFBSSxlQUFlLE1BQU07QUFZdkIsa0JBQUksT0FBTztBQUVYO0FBQVUsdUJBQU8sTUFBTTtBQUNyQixzQkFBSSxTQUFTLE1BQU07QUFDakI7QUFBQTtBQUdGLHNCQUFJLFVBQVUsS0FBSztBQUVuQixzQkFBSSxZQUFZLFlBQVksWUFBWSxZQUFZO0FBQ2xELHdCQUFJLFlBQVksS0FBSyxVQUFVO0FBRS9CLHdCQUFJLHdCQUF3QixXQUFXLHNCQUFzQjtBQUMzRDtBQUFBO0FBR0Ysd0JBQUksWUFBWSxZQUFZO0FBSzFCLDBCQUFJLFlBQVksS0FBSztBQUVyQiw2QkFBTyxjQUFjLE1BQU07QUFDekIsNEJBQUksV0FBVyxVQUFVO0FBRXpCLDRCQUFJLGFBQWEsWUFBWSxhQUFhLFlBQVk7QUFDcEQsOEJBQUksaUJBQWlCLFVBQVUsVUFBVTtBQUV6Qyw4QkFBSSx3QkFBd0IsZ0JBQWdCLHNCQUFzQjtBQUloRTtBQUFBO0FBQUE7QUFJSixvQ0FBWSxVQUFVO0FBQUE7QUFBQTtBQVMxQiwyQkFBTyxjQUFjLE1BQU07QUFDekIsMEJBQUksYUFBYSwyQkFBMkI7QUFFNUMsMEJBQUksZUFBZSxNQUFNO0FBQ3ZCO0FBQUE7QUFHRiwwQkFBSSxZQUFZLFdBQVc7QUFFM0IsMEJBQUksY0FBYyxpQkFBaUIsY0FBYyxVQUFVO0FBQ3pELCtCQUFPLGVBQWU7QUFDdEI7QUFBQTtBQUdGLGtDQUFZLFVBQVU7QUFBQTtBQUFBO0FBSTFCLHlCQUFPLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFLbEIseUJBQWUsV0FBWTtBQUN6QixtQkFBTyx5QkFBeUIsY0FBYyxrQkFBa0IsYUFBYTtBQUFBO0FBQUE7QUFJakYsd0NBQWdDLFVBQVUsVUFBVSxlQUFlO0FBQ2pFLGlCQUFPO0FBQUEsWUFDTDtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUE7QUFBQTtBQUlKLGdEQUF3QyxhQUFhLFdBQVcsaUJBQWlCLGdCQUFnQixzQkFBc0IsYUFBYTtBQUNsSSxjQUFJLGNBQWMsY0FBYyxPQUFPLFlBQVksWUFBWTtBQUMvRCxjQUFJLGlCQUFpQixpQkFBaUIsY0FBYztBQUNwRCxjQUFJLFlBQVk7QUFDaEIsY0FBSSxXQUFXO0FBQ2YsY0FBSSxvQkFBb0I7QUFFeEIsaUJBQU8sYUFBYSxNQUFNO0FBQ3hCLGdCQUFJLGFBQWEsVUFDYixZQUFZLFdBQVcsV0FDdkIsTUFBTSxXQUFXO0FBRXJCLGdCQUFJLFFBQVEsaUJBQWlCLGNBQWMsTUFBTTtBQUMvQyxrQ0FBb0I7QUFHcEIsa0JBQUksbUJBQW1CLE1BQU07QUFDM0Isb0JBQUksV0FBVyxZQUFZLFVBQVU7QUFFckMsb0JBQUksWUFBWSxNQUFNO0FBQ3BCLDRCQUFVLEtBQUssdUJBQXVCLFVBQVUsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQVFoRSxnQkFBSSxzQkFBc0I7QUFDeEI7QUFBQTtBQUdGLHVCQUFXLFNBQVM7QUFBQTtBQUd0QixpQkFBTztBQUFBO0FBU1QsNkNBQXFDLGFBQWEsV0FBVztBQUMzRCxjQUFJLGNBQWMsWUFBWTtBQUM5QixjQUFJLFlBQVk7QUFDaEIsY0FBSSxXQUFXO0FBRWYsaUJBQU8sYUFBYSxNQUFNO0FBQ3hCLGdCQUFJLGFBQWEsVUFDYixZQUFZLFdBQVcsV0FDdkIsTUFBTSxXQUFXO0FBRXJCLGdCQUFJLFFBQVEsaUJBQWlCLGNBQWMsTUFBTTtBQUMvQyxrQkFBSSxnQkFBZ0I7QUFDcEIsa0JBQUksa0JBQWtCLFlBQVksVUFBVTtBQUU1QyxrQkFBSSxtQkFBbUIsTUFBTTtBQUMzQiwwQkFBVSxRQUFRLHVCQUF1QixVQUFVLGlCQUFpQjtBQUFBO0FBR3RFLGtCQUFJLGlCQUFpQixZQUFZLFVBQVU7QUFFM0Msa0JBQUksa0JBQWtCLE1BQU07QUFDMUIsMEJBQVUsS0FBSyx1QkFBdUIsVUFBVSxnQkFBZ0I7QUFBQTtBQUFBO0FBSXBFLHVCQUFXLFNBQVM7QUFBQTtBQUd0QixpQkFBTztBQUFBO0FBR1QsMkJBQW1CLE1BQU07QUFDdkIsY0FBSSxTQUFTLE1BQU07QUFDakIsbUJBQU87QUFBQTtBQUdULGFBQUc7QUFDRCxtQkFBTyxLQUFLO0FBQUEsbUJBS0wsUUFBUSxLQUFLLFFBQVE7QUFFOUIsY0FBSSxNQUFNO0FBQ1IsbUJBQU87QUFBQTtBQUdULGlCQUFPO0FBQUE7QUFRVCx5Q0FBaUMsT0FBTyxPQUFPO0FBQzdDLGNBQUksUUFBUTtBQUNaLGNBQUksUUFBUTtBQUNaLGNBQUksU0FBUztBQUViLG1CQUFTLFFBQVEsT0FBTyxPQUFPLFFBQVEsVUFBVSxRQUFRO0FBQ3ZEO0FBQUE7QUFHRixjQUFJLFNBQVM7QUFFYixtQkFBUyxRQUFRLE9BQU8sT0FBTyxRQUFRLFVBQVUsUUFBUTtBQUN2RDtBQUFBO0FBSUYsaUJBQU8sU0FBUyxTQUFTLEdBQUc7QUFDMUIsb0JBQVEsVUFBVTtBQUNsQjtBQUFBO0FBSUYsaUJBQU8sU0FBUyxTQUFTLEdBQUc7QUFDMUIsb0JBQVEsVUFBVTtBQUNsQjtBQUFBO0FBSUYsY0FBSSxRQUFRO0FBRVosaUJBQU8sU0FBUztBQUNkLGdCQUFJLFVBQVUsU0FBUyxVQUFVLFFBQVEsVUFBVSxNQUFNLFdBQVc7QUFDbEUscUJBQU87QUFBQTtBQUdULG9CQUFRLFVBQVU7QUFDbEIsb0JBQVEsVUFBVTtBQUFBO0FBR3BCLGlCQUFPO0FBQUE7QUFHVCx1REFBK0MsZUFBZSxPQUFPLFFBQVEsUUFBUSxnQkFBZ0I7QUFDbkcsY0FBSSxtQkFBbUIsTUFBTTtBQUM3QixjQUFJLFlBQVk7QUFDaEIsY0FBSSxXQUFXO0FBRWYsaUJBQU8sYUFBYSxNQUFNO0FBQ3hCLGdCQUFJLGFBQWEsUUFBUTtBQUN2QjtBQUFBO0FBR0YsZ0JBQUksYUFBYSxVQUNiLFlBQVksV0FBVyxXQUN2QixZQUFZLFdBQVcsV0FDdkIsTUFBTSxXQUFXO0FBRXJCLGdCQUFJLGNBQWMsUUFBUSxjQUFjLFFBQVE7QUFDOUM7QUFBQTtBQUdGLGdCQUFJLFFBQVEsaUJBQWlCLGNBQWMsTUFBTTtBQUMvQyxrQkFBSSxnQkFBZ0I7QUFFcEIsa0JBQUksZ0JBQWdCO0FBQ2xCLG9CQUFJLGtCQUFrQixZQUFZLFVBQVU7QUFFNUMsb0JBQUksbUJBQW1CLE1BQU07QUFDM0IsNEJBQVUsUUFBUSx1QkFBdUIsVUFBVSxpQkFBaUI7QUFBQTtBQUFBLHlCQUU3RCxDQUFDLGdCQUFnQjtBQUMxQixvQkFBSSxpQkFBaUIsWUFBWSxVQUFVO0FBRTNDLG9CQUFJLGtCQUFrQixNQUFNO0FBQzFCLDRCQUFVLEtBQUssdUJBQXVCLFVBQVUsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBS3RFLHVCQUFXLFNBQVM7QUFBQTtBQUd0QixjQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLDBCQUFjLEtBQUs7QUFBQSxjQUNqQjtBQUFBLGNBQ0E7QUFBQTtBQUFBO0FBQUE7QUFVTix1REFBK0MsZUFBZSxZQUFZLFlBQVksTUFBTSxJQUFJO0FBQzlGLGNBQUksU0FBUyxRQUFRLEtBQUssd0JBQXdCLE1BQU0sTUFBTTtBQUU5RCxjQUFJLFNBQVMsTUFBTTtBQUNqQixrREFBc0MsZUFBZSxZQUFZLE1BQU0sUUFBUTtBQUFBO0FBR2pGLGNBQUksT0FBTyxRQUFRLGVBQWUsTUFBTTtBQUN0QyxrREFBc0MsZUFBZSxZQUFZLElBQUksUUFBUTtBQUFBO0FBQUE7QUFHakYsbUNBQTJCLGNBQWMsU0FBUztBQUNoRCxpQkFBTyxlQUFlLE9BQVEsV0FBVSxZQUFZO0FBQUE7QUFHdEQsWUFBSSwwQkFBMEI7QUFDOUIsWUFBSSw2QkFBNkI7QUFDakMsWUFBSSxvQ0FBb0M7QUFDeEMsWUFBSSw2QkFBNkI7QUFDakMsWUFBSSxZQUFZO0FBQ2hCLFlBQUksV0FBVztBQUNmLFlBQUksUUFBUTtBQUNaLFlBQUksU0FBUztBQUNiLFlBQUk7QUFDSixZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFDSixZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFFSjtBQUNFLDhCQUFvQjtBQUFBLFlBRWxCLFFBQVE7QUFBQSxZQU1SLFNBQVM7QUFBQTtBQUdYLDRDQUFrQyxTQUFVLE1BQU0sT0FBTztBQUN2RCwrQkFBbUIsTUFBTTtBQUN6QixpQ0FBcUIsTUFBTTtBQUMzQixpQ0FBcUIsTUFBTSxPQUFPO0FBQUEsY0FDaEM7QUFBQSxjQUNBO0FBQUE7QUFBQTtBQVlKLDRDQUFrQyxhQUFhLENBQUMsU0FBUztBQUV6RCxrQ0FBd0IsU0FBVSxVQUFVLGFBQWEsYUFBYTtBQUNwRSxnQkFBSSx5QkFBeUI7QUFDM0I7QUFBQTtBQUdGLGdCQUFJLHdCQUF3QixrQ0FBa0M7QUFDOUQsZ0JBQUksd0JBQXdCLGtDQUFrQztBQUU5RCxnQkFBSSwwQkFBMEIsdUJBQXVCO0FBQ25EO0FBQUE7QUFHRixzQ0FBMEI7QUFFMUIsa0JBQU0sa0RBQWtELFVBQVUsS0FBSyxVQUFVLHdCQUF3QixLQUFLLFVBQVU7QUFBQTtBQUcxSCxtQ0FBeUIsU0FBVSxnQkFBZ0I7QUFDakQsZ0JBQUkseUJBQXlCO0FBQzNCO0FBQUE7QUFHRixzQ0FBMEI7QUFDMUIsZ0JBQUksUUFBUTtBQUNaLDJCQUFlLFFBQVEsU0FBVSxNQUFNO0FBQ3JDLG9CQUFNLEtBQUs7QUFBQTtBQUdiLGtCQUFNLHdDQUF3QztBQUFBO0FBR2hELHdDQUE4QixTQUFVLGtCQUFrQixVQUFVO0FBQ2xFLGdCQUFJLGFBQWEsT0FBTztBQUN0QixvQkFBTSx3TEFBa00sa0JBQWtCLGtCQUFrQjtBQUFBLG1CQUN2TztBQUNMLG9CQUFNLDhFQUE4RSxrQkFBa0IsT0FBTztBQUFBO0FBQUE7QUFNakgsMEJBQWdCLFNBQVUsUUFBUSxNQUFNO0FBS3RDLGdCQUFJLGNBQWMsT0FBTyxpQkFBaUIsaUJBQWlCLE9BQU8sY0FBYyxjQUFjLE9BQU8sV0FBVyxPQUFPLGNBQWMsZ0JBQWdCLE9BQU8sY0FBYyxPQUFPO0FBQ2pMLHdCQUFZLFlBQVk7QUFDeEIsbUJBQU8sWUFBWTtBQUFBO0FBQUE7QUFTdkIsWUFBSSwyQkFBMkI7QUFDL0IsWUFBSSx1Q0FBdUM7QUFFM0MsbURBQTJDLFFBQVE7QUFDakQ7QUFDRSxvQ0FBd0I7QUFBQTtBQUcxQixjQUFJLGVBQWUsT0FBTyxXQUFXLFdBQVcsU0FBUyxLQUFLO0FBQzlELGlCQUFPLGFBQWEsUUFBUSwwQkFBMEIsTUFBTSxRQUFRLHNDQUFzQztBQUFBO0FBRzVHLHVDQUErQixZQUFZLFlBQVksa0JBQWtCLGVBQWU7QUFDdEYsY0FBSSx1QkFBdUIsa0NBQWtDO0FBQzdELGNBQUksdUJBQXVCLGtDQUFrQztBQUU3RCxjQUFJLHlCQUF5QixzQkFBc0I7QUFDakQ7QUFBQTtBQUdGLGNBQUksZUFBZTtBQUNqQjtBQUNFLGtCQUFJLENBQUMseUJBQXlCO0FBQzVCLDBDQUEwQjtBQUUxQixzQkFBTSx5REFBeUQsc0JBQXNCO0FBQUE7QUFBQTtBQUFBO0FBSzNGLGNBQUksb0JBQW9CLDBDQUEwQztBQUdoRSxrQkFBTSxJQUFJLE1BQU07QUFBQTtBQUFBO0FBSXBCLG1EQUEyQyxzQkFBc0I7QUFDL0QsaUJBQU8scUJBQXFCLGFBQWEsZ0JBQWdCLHVCQUF1QixxQkFBcUI7QUFBQTtBQUd2Ryx3QkFBZ0I7QUFBQTtBQUVoQixrREFBMEMsTUFBTTtBQVU5QyxlQUFLLFVBQVU7QUFBQTtBQUdqQix5Q0FBaUMsS0FBSyxZQUFZLHNCQUFzQixXQUFXLHNCQUFzQjtBQUN2RyxtQkFBUyxXQUFXLFdBQVc7QUFDN0IsZ0JBQUksQ0FBQyxVQUFVLGVBQWUsVUFBVTtBQUN0QztBQUFBO0FBR0YsZ0JBQUksV0FBVyxVQUFVO0FBRXpCLGdCQUFJLFlBQVksT0FBTztBQUNyQjtBQUNFLG9CQUFJLFVBQVU7QUFHWix5QkFBTyxPQUFPO0FBQUE7QUFBQTtBQUtsQixnQ0FBa0IsWUFBWTtBQUFBLHVCQUNyQixZQUFZLDRCQUE0QjtBQUNqRCxrQkFBSSxXQUFXLFdBQVcsU0FBUyxVQUFVO0FBRTdDLGtCQUFJLFlBQVksTUFBTTtBQUNwQiw2QkFBYSxZQUFZO0FBQUE7QUFBQSx1QkFFbEIsWUFBWSxVQUFVO0FBQy9CLGtCQUFJLE9BQU8sYUFBYSxVQUFVO0FBS2hDLG9CQUFJLG9CQUFvQixRQUFRLGNBQWMsYUFBYTtBQUUzRCxvQkFBSSxtQkFBbUI7QUFDckIsaUNBQWUsWUFBWTtBQUFBO0FBQUEseUJBRXBCLE9BQU8sYUFBYSxVQUFVO0FBQ3ZDLCtCQUFlLFlBQVksS0FBSztBQUFBO0FBQUEsdUJBRXpCLFlBQVkscUNBQXFDLFlBQVk7QUFBNEI7QUFBQSxxQkFBVyxZQUFZO0FBQVc7QUFBQSxxQkFBVyw2QkFBNkIsZUFBZSxVQUFVO0FBQ3JNLGtCQUFJLFlBQVksTUFBTTtBQUNwQixvQkFBSyxPQUFPLGFBQWEsWUFBWTtBQUNuQyw4Q0FBNEIsU0FBUztBQUFBO0FBR3ZDLG9CQUFJLFlBQVksWUFBWTtBQUMxQiw0Q0FBMEIsVUFBVTtBQUFBO0FBQUE7QUFBQSx1QkFHL0IsWUFBWSxNQUFNO0FBQzNCLGtDQUFvQixZQUFZLFNBQVMsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUt6RCxxQ0FBNkIsWUFBWSxlQUFlLHVCQUF1QixzQkFBc0I7QUFFbkcsbUJBQVMsSUFBSSxHQUFHLElBQUksY0FBYyxRQUFRLEtBQUssR0FBRztBQUNoRCxnQkFBSSxVQUFVLGNBQWM7QUFDNUIsZ0JBQUksWUFBWSxjQUFjLElBQUk7QUFFbEMsZ0JBQUksWUFBWSxPQUFPO0FBQ3JCLGdDQUFrQixZQUFZO0FBQUEsdUJBQ3JCLFlBQVksNEJBQTRCO0FBQ2pELDJCQUFhLFlBQVk7QUFBQSx1QkFDaEIsWUFBWSxVQUFVO0FBQy9CLDZCQUFlLFlBQVk7QUFBQSxtQkFDdEI7QUFDTCxrQ0FBb0IsWUFBWSxTQUFTLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFLMUQsZ0NBQXVCLE1BQU0sT0FBTyxzQkFBc0IsaUJBQWlCO0FBQ3pFLGNBQUk7QUFHSixjQUFJLGdCQUFnQixrQ0FBa0M7QUFDdEQsY0FBSTtBQUNKLGNBQUksZUFBZTtBQUVuQixjQUFJLGlCQUFpQixnQkFBZ0I7QUFDbkMsMkJBQWUsc0JBQXNCO0FBQUE7QUFHdkMsY0FBSSxpQkFBaUIsZ0JBQWdCO0FBQ25DO0FBQ0UscUNBQXVCLGtCQUFrQixNQUFNO0FBRy9DLGtCQUFJLENBQUMsd0JBQXdCLFNBQVMsS0FBSyxlQUFlO0FBQ3hELHNCQUFNLDBHQUFvSDtBQUFBO0FBQUE7QUFJOUgsZ0JBQUksU0FBUyxVQUFVO0FBR3JCLGtCQUFJLE1BQU0sY0FBYyxjQUFjO0FBRXRDLGtCQUFJLFlBQVk7QUFHaEIsa0JBQUksYUFBYSxJQUFJO0FBQ3JCLDJCQUFhLElBQUksWUFBWTtBQUFBLHVCQUNwQixPQUFPLE1BQU0sT0FBTyxVQUFVO0FBRXZDLDJCQUFhLGNBQWMsY0FBYyxNQUFNO0FBQUEsZ0JBQzdDLElBQUksTUFBTTtBQUFBO0FBQUEsbUJBRVA7QUFJTCwyQkFBYSxjQUFjLGNBQWM7QUFTekMsa0JBQUksU0FBUyxVQUFVO0FBQ3JCLG9CQUFJLE9BQU87QUFFWCxvQkFBSSxNQUFNLFVBQVU7QUFDbEIsdUJBQUssV0FBVztBQUFBLDJCQUNQLE1BQU0sTUFBTTtBQUtyQix1QkFBSyxPQUFPLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxpQkFJbkI7QUFDTCx5QkFBYSxjQUFjLGdCQUFnQixjQUFjO0FBQUE7QUFHM0Q7QUFDRSxnQkFBSSxpQkFBaUIsZ0JBQWdCO0FBQ25DLGtCQUFJLENBQUMsd0JBQXdCLE9BQU8sVUFBVSxTQUFTLEtBQUssZ0JBQWdCLGlDQUFpQyxDQUFDLGVBQWUsS0FBSyxtQkFBbUIsT0FBTztBQUMxSixrQ0FBa0IsUUFBUTtBQUUxQixzQkFBTSxvSUFBOEk7QUFBQTtBQUFBO0FBQUE7QUFLMUosaUJBQU87QUFBQTtBQUVULGdDQUF3QixNQUFNLHNCQUFzQjtBQUNsRCxpQkFBTyxrQ0FBa0Msc0JBQXNCLGVBQWU7QUFBQTtBQUVoRixzQ0FBOEIsWUFBWSxLQUFLLFVBQVUsc0JBQXNCO0FBQzdFLGNBQUksdUJBQXVCLGtCQUFrQixLQUFLO0FBRWxEO0FBQ0UsNENBQWdDLEtBQUs7QUFBQTtBQUl2QyxjQUFJO0FBRUosa0JBQVE7QUFBQSxpQkFDRDtBQUNILHdDQUEwQixVQUFVO0FBQ3BDLHdDQUEwQixTQUFTO0FBQ25DLHNCQUFRO0FBQ1I7QUFBQSxpQkFFRztBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFHSCx3Q0FBMEIsUUFBUTtBQUNsQyxzQkFBUTtBQUNSO0FBQUEsaUJBRUc7QUFBQSxpQkFDQTtBQUdILHVCQUFTLElBQUksR0FBRyxJQUFJLGdCQUFnQixRQUFRLEtBQUs7QUFDL0MsMENBQTBCLGdCQUFnQixJQUFJO0FBQUE7QUFHaEQsc0JBQVE7QUFDUjtBQUFBLGlCQUVHO0FBR0gsd0NBQTBCLFNBQVM7QUFDbkMsc0JBQVE7QUFDUjtBQUFBLGlCQUVHO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUdILHdDQUEwQixTQUFTO0FBQ25DLHdDQUEwQixRQUFRO0FBQ2xDLHNCQUFRO0FBQ1I7QUFBQSxpQkFFRztBQUdILHdDQUEwQixVQUFVO0FBQ3BDLHNCQUFRO0FBQ1I7QUFBQSxpQkFFRztBQUNILCtCQUFpQixZQUFZO0FBQzdCLHNCQUFRLGFBQWEsWUFBWTtBQUdqQyx3Q0FBMEIsV0FBVztBQUNyQztBQUFBLGlCQUVHO0FBQ0gsNEJBQWMsWUFBWTtBQUMxQixzQkFBUTtBQUNSO0FBQUEsaUJBRUc7QUFDSCxpQ0FBbUIsWUFBWTtBQUMvQixzQkFBUSxlQUFlLFlBQVk7QUFHbkMsd0NBQTBCLFdBQVc7QUFDckM7QUFBQSxpQkFFRztBQUNILGlDQUFtQixZQUFZO0FBQy9CLHNCQUFRLGVBQWUsWUFBWTtBQUduQyx3Q0FBMEIsV0FBVztBQUNyQztBQUFBO0FBR0Esc0JBQVE7QUFBQTtBQUdaLDJCQUFpQixLQUFLO0FBQ3RCLGtDQUF3QixLQUFLLFlBQVksc0JBQXNCLE9BQU87QUFFdEUsa0JBQVE7QUFBQSxpQkFDRDtBQUdILG9CQUFNO0FBQ04sK0JBQWlCLFlBQVksVUFBVTtBQUN2QztBQUFBLGlCQUVHO0FBR0gsb0JBQU07QUFDTixpQ0FBbUI7QUFDbkI7QUFBQSxpQkFFRztBQUNILGlDQUFtQixZQUFZO0FBQy9CO0FBQUEsaUJBRUc7QUFDSCxpQ0FBbUIsWUFBWTtBQUMvQjtBQUFBO0FBR0Esa0JBQUksT0FBTyxNQUFNLFlBQVksWUFBWTtBQUV2QyxpREFBaUM7QUFBQTtBQUduQztBQUFBO0FBQUE7QUFJTixnQ0FBd0IsWUFBWSxLQUFLLGNBQWMsY0FBYyxzQkFBc0I7QUFDekY7QUFDRSw0Q0FBZ0MsS0FBSztBQUFBO0FBR3ZDLGNBQUksZ0JBQWdCO0FBQ3BCLGNBQUk7QUFDSixjQUFJO0FBRUosa0JBQVE7QUFBQSxpQkFDRDtBQUNILDBCQUFZLGFBQWEsWUFBWTtBQUNyQywwQkFBWSxhQUFhLFlBQVk7QUFDckMsOEJBQWdCO0FBQ2hCO0FBQUEsaUJBRUc7QUFDSCwwQkFBWSxlQUFlLFlBQVk7QUFDdkMsMEJBQVksZUFBZSxZQUFZO0FBQ3ZDLDhCQUFnQjtBQUNoQjtBQUFBLGlCQUVHO0FBQ0gsMEJBQVksZUFBZSxZQUFZO0FBQ3ZDLDBCQUFZLGVBQWUsWUFBWTtBQUN2Qyw4QkFBZ0I7QUFDaEI7QUFBQTtBQUdBLDBCQUFZO0FBQ1osMEJBQVk7QUFFWixrQkFBSSxPQUFPLFVBQVUsWUFBWSxjQUFjLE9BQU8sVUFBVSxZQUFZLFlBQVk7QUFFdEYsaURBQWlDO0FBQUE7QUFHbkM7QUFBQTtBQUdKLDJCQUFpQixLQUFLO0FBQ3RCLGNBQUk7QUFDSixjQUFJO0FBQ0osY0FBSSxlQUFlO0FBRW5CLGVBQUssV0FBVyxXQUFXO0FBQ3pCLGdCQUFJLFVBQVUsZUFBZSxZQUFZLENBQUMsVUFBVSxlQUFlLFlBQVksVUFBVSxZQUFZLE1BQU07QUFDekc7QUFBQTtBQUdGLGdCQUFJLFlBQVksT0FBTztBQUNyQixrQkFBSSxZQUFZLFVBQVU7QUFFMUIsbUJBQUssYUFBYSxXQUFXO0FBQzNCLG9CQUFJLFVBQVUsZUFBZSxZQUFZO0FBQ3ZDLHNCQUFJLENBQUMsY0FBYztBQUNqQixtQ0FBZTtBQUFBO0FBR2pCLCtCQUFhLGFBQWE7QUFBQTtBQUFBO0FBQUEsdUJBR3JCLFlBQVksOEJBQThCLFlBQVk7QUFBVTtBQUFBLHFCQUFXLFlBQVkscUNBQXFDLFlBQVk7QUFBNEI7QUFBQSxxQkFBVyxZQUFZO0FBQVc7QUFBQSxxQkFBVyw2QkFBNkIsZUFBZSxVQUFVO0FBSWhSLGtCQUFJLENBQUMsZUFBZTtBQUNsQixnQ0FBZ0I7QUFBQTtBQUFBLG1CQUViO0FBR0wsY0FBQyxpQkFBZ0IsaUJBQWlCLElBQUksS0FBSyxTQUFTO0FBQUE7QUFBQTtBQUl4RCxlQUFLLFdBQVcsV0FBVztBQUN6QixnQkFBSSxXQUFXLFVBQVU7QUFDekIsZ0JBQUksV0FBVyxhQUFhLE9BQU8sVUFBVSxXQUFXO0FBRXhELGdCQUFJLENBQUMsVUFBVSxlQUFlLFlBQVksYUFBYSxZQUFZLFlBQVksUUFBUSxZQUFZLE1BQU07QUFDdkc7QUFBQTtBQUdGLGdCQUFJLFlBQVksT0FBTztBQUNyQjtBQUNFLG9CQUFJLFVBQVU7QUFHWix5QkFBTyxPQUFPO0FBQUE7QUFBQTtBQUlsQixrQkFBSSxVQUFVO0FBRVoscUJBQUssYUFBYSxVQUFVO0FBQzFCLHNCQUFJLFNBQVMsZUFBZSxjQUFlLEVBQUMsWUFBWSxDQUFDLFNBQVMsZUFBZSxhQUFhO0FBQzVGLHdCQUFJLENBQUMsY0FBYztBQUNqQixxQ0FBZTtBQUFBO0FBR2pCLGlDQUFhLGFBQWE7QUFBQTtBQUFBO0FBSzlCLHFCQUFLLGFBQWEsVUFBVTtBQUMxQixzQkFBSSxTQUFTLGVBQWUsY0FBYyxTQUFTLGVBQWUsU0FBUyxZQUFZO0FBQ3JGLHdCQUFJLENBQUMsY0FBYztBQUNqQixxQ0FBZTtBQUFBO0FBR2pCLGlDQUFhLGFBQWEsU0FBUztBQUFBO0FBQUE7QUFBQSxxQkFHbEM7QUFFTCxvQkFBSSxDQUFDLGNBQWM7QUFDakIsc0JBQUksQ0FBQyxlQUFlO0FBQ2xCLG9DQUFnQjtBQUFBO0FBR2xCLGdDQUFjLEtBQUssU0FBUztBQUFBO0FBRzlCLCtCQUFlO0FBQUE7QUFBQSx1QkFFUixZQUFZLDRCQUE0QjtBQUNqRCxrQkFBSSxXQUFXLFdBQVcsU0FBUyxVQUFVO0FBQzdDLGtCQUFJLFdBQVcsV0FBVyxTQUFTLFVBQVU7QUFFN0Msa0JBQUksWUFBWSxNQUFNO0FBQ3BCLG9CQUFJLGFBQWEsVUFBVTtBQUN6QixrQkFBQyxpQkFBZ0IsaUJBQWlCLElBQUksS0FBSyxTQUFTO0FBQUE7QUFBQTtBQUFBLHVCQUcvQyxZQUFZLFVBQVU7QUFDL0Isa0JBQUksT0FBTyxhQUFhLFlBQVksT0FBTyxhQUFhLFVBQVU7QUFDaEUsZ0JBQUMsaUJBQWdCLGlCQUFpQixJQUFJLEtBQUssU0FBUyxLQUFLO0FBQUE7QUFBQSx1QkFFbEQsWUFBWSxxQ0FBcUMsWUFBWTtBQUE0QjtBQUFBLHFCQUFXLDZCQUE2QixlQUFlLFVBQVU7QUFDbkssa0JBQUksWUFBWSxNQUFNO0FBRXBCLG9CQUFLLE9BQU8sYUFBYSxZQUFZO0FBQ25DLDhDQUE0QixTQUFTO0FBQUE7QUFHdkMsb0JBQUksWUFBWSxZQUFZO0FBQzFCLDRDQUEwQixVQUFVO0FBQUE7QUFBQTtBQUl4QyxrQkFBSSxDQUFDLGlCQUFpQixhQUFhLFVBQVU7QUFJM0MsZ0NBQWdCO0FBQUE7QUFBQSxtQkFFYjtBQUdMLGNBQUMsaUJBQWdCLGlCQUFpQixJQUFJLEtBQUssU0FBUztBQUFBO0FBQUE7QUFJeEQsY0FBSSxjQUFjO0FBQ2hCO0FBQ0Usc0RBQXdDLGNBQWMsVUFBVTtBQUFBO0FBR2xFLFlBQUMsaUJBQWdCLGlCQUFpQixJQUFJLEtBQUssT0FBTztBQUFBO0FBR3BELGlCQUFPO0FBQUE7QUFHVCxrQ0FBMEIsWUFBWSxlQUFlLEtBQUssY0FBYyxjQUFjO0FBSXBGLGNBQUksUUFBUSxXQUFXLGFBQWEsU0FBUyxXQUFXLGFBQWEsUUFBUSxNQUFNO0FBQ2pGLDBCQUFjLFlBQVk7QUFBQTtBQUc1QixjQUFJLHdCQUF3QixrQkFBa0IsS0FBSztBQUNuRCxjQUFJLHVCQUF1QixrQkFBa0IsS0FBSztBQUVsRCw4QkFBb0IsWUFBWSxlQUFlLHVCQUF1QjtBQUd0RSxrQkFBUTtBQUFBLGlCQUNEO0FBSUgsNEJBQWMsWUFBWTtBQUMxQjtBQUFBLGlCQUVHO0FBQ0gsOEJBQWdCLFlBQVk7QUFDNUI7QUFBQSxpQkFFRztBQUdILGdDQUFrQixZQUFZO0FBQzlCO0FBQUE7QUFBQTtBQUlOLHlDQUFpQyxVQUFVO0FBQ3pDO0FBQ0UsZ0JBQUksaUJBQWlCLFNBQVM7QUFFOUIsZ0JBQUksQ0FBQyxzQkFBc0IsZUFBZSxpQkFBaUI7QUFDekQscUJBQU87QUFBQTtBQUdULG1CQUFPLHNCQUFzQixtQkFBbUI7QUFBQTtBQUFBO0FBSXBELHdDQUFnQyxZQUFZLEtBQUssVUFBVSxpQkFBaUIsc0JBQXNCLGtCQUFrQixlQUFlO0FBQ2pJLGNBQUk7QUFDSixjQUFJO0FBRUo7QUFDRSxtQ0FBdUIsa0JBQWtCLEtBQUs7QUFDOUMsNENBQWdDLEtBQUs7QUFBQTtBQUl2QyxrQkFBUTtBQUFBLGlCQUNEO0FBQ0gsd0NBQTBCLFVBQVU7QUFDcEMsd0NBQTBCLFNBQVM7QUFDbkM7QUFBQSxpQkFFRztBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFHSCx3Q0FBMEIsUUFBUTtBQUNsQztBQUFBLGlCQUVHO0FBQUEsaUJBQ0E7QUFHSCx1QkFBUyxJQUFJLEdBQUcsSUFBSSxnQkFBZ0IsUUFBUSxLQUFLO0FBQy9DLDBDQUEwQixnQkFBZ0IsSUFBSTtBQUFBO0FBR2hEO0FBQUEsaUJBRUc7QUFHSCx3Q0FBMEIsU0FBUztBQUNuQztBQUFBLGlCQUVHO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUdILHdDQUEwQixTQUFTO0FBQ25DLHdDQUEwQixRQUFRO0FBQ2xDO0FBQUEsaUJBRUc7QUFHSCx3Q0FBMEIsVUFBVTtBQUNwQztBQUFBLGlCQUVHO0FBQ0gsK0JBQWlCLFlBQVk7QUFHN0Isd0NBQTBCLFdBQVc7QUFDckM7QUFBQSxpQkFFRztBQUNILDRCQUFjLFlBQVk7QUFDMUI7QUFBQSxpQkFFRztBQUNILGlDQUFtQixZQUFZO0FBRy9CLHdDQUEwQixXQUFXO0FBQ3JDO0FBQUEsaUJBRUc7QUFDSCxpQ0FBbUIsWUFBWTtBQUcvQix3Q0FBMEIsV0FBVztBQUNyQztBQUFBO0FBR0osMkJBQWlCLEtBQUs7QUFFdEI7QUFDRSxrQ0FBc0IsSUFBSTtBQUMxQixnQkFBSSxhQUFhLFdBQVc7QUFFNUIscUJBQVMsS0FBSyxHQUFHLEtBQUssV0FBVyxRQUFRLE1BQU07QUFDN0Msa0JBQUksT0FBTyxXQUFXLElBQUksS0FBSztBQUUvQixzQkFBUTtBQUFBLHFCQUdEO0FBQ0g7QUFBQSxxQkFFRztBQUNIO0FBQUEscUJBRUc7QUFDSDtBQUFBO0FBS0Esc0NBQW9CLElBQUksV0FBVyxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBSy9DLGNBQUksZ0JBQWdCO0FBRXBCLG1CQUFTLFdBQVcsVUFBVTtBQUM1QixnQkFBSSxDQUFDLFNBQVMsZUFBZSxVQUFVO0FBQ3JDO0FBQUE7QUFHRixnQkFBSSxXQUFXLFNBQVM7QUFFeEIsZ0JBQUksWUFBWSxVQUFVO0FBVXhCLGtCQUFJLE9BQU8sYUFBYSxVQUFVO0FBQ2hDLG9CQUFJLFdBQVcsZ0JBQWdCLFVBQVU7QUFDdkMsc0JBQUksU0FBUyxnQ0FBZ0MsTUFBTTtBQUNqRCwwQ0FBc0IsV0FBVyxhQUFhLFVBQVUsa0JBQWtCO0FBQUE7QUFHNUUsa0NBQWdCLENBQUMsVUFBVTtBQUFBO0FBQUEseUJBRXBCLE9BQU8sYUFBYSxVQUFVO0FBQ3ZDLG9CQUFJLFdBQVcsZ0JBQWdCLEtBQUssVUFBVTtBQUM1QyxzQkFBSSxTQUFTLGdDQUFnQyxNQUFNO0FBQ2pELDBDQUFzQixXQUFXLGFBQWEsVUFBVSxrQkFBa0I7QUFBQTtBQUc1RSxrQ0FBZ0IsQ0FBQyxVQUFVLEtBQUs7QUFBQTtBQUFBO0FBQUEsdUJBRzNCLDZCQUE2QixlQUFlLFVBQVU7QUFDL0Qsa0JBQUksWUFBWSxNQUFNO0FBQ3BCLG9CQUFLLE9BQU8sYUFBYSxZQUFZO0FBQ25DLDhDQUE0QixTQUFTO0FBQUE7QUFHdkMsb0JBQUksWUFBWSxZQUFZO0FBQzFCLDRDQUEwQixVQUFVO0FBQUE7QUFBQTtBQUFBLHVCQUcvQixpQkFBaUIsUUFDNUIsT0FBTyx5QkFBeUIsV0FBVztBQUV6QyxrQkFBSSxjQUFjO0FBQ2xCLGtCQUFJLGVBQWUsd0JBQXdCLHFDQUFxQyxPQUFPLGdCQUFnQjtBQUV2RyxrQkFBSSxTQUFTLGdDQUFnQztBQUFNO0FBQUEsdUJBQVcsWUFBWSxxQ0FBcUMsWUFBWSw4QkFFM0gsWUFBWSxXQUFXLFlBQVksYUFBYSxZQUFZO0FBQVk7QUFBQSx1QkFBVyxZQUFZLDRCQUE0QjtBQUN6SCxvQkFBSSxhQUFhLFdBQVc7QUFDNUIsb0JBQUksV0FBVyxXQUFXLFNBQVMsVUFBVTtBQUU3QyxvQkFBSSxZQUFZLE1BQU07QUFDcEIsc0JBQUksZUFBZSxjQUFjLFlBQVk7QUFFN0Msc0JBQUksaUJBQWlCLFlBQVk7QUFDL0IsMENBQXNCLFNBQVMsWUFBWTtBQUFBO0FBQUE7QUFBQSx5QkFHdEMsWUFBWSxPQUFPO0FBRTVCLG9DQUFvQixPQUFPO0FBRTNCLG9CQUFJLGlDQUFpQztBQUNuQyxzQkFBSSxnQkFBZ0IsK0JBQStCO0FBQ25ELGdDQUFjLFdBQVcsYUFBYTtBQUV0QyxzQkFBSSxrQkFBa0IsYUFBYTtBQUNqQywwQ0FBc0IsU0FBUyxhQUFhO0FBQUE7QUFBQTtBQUFBLHlCQUd2Qyx3QkFBd0IsQ0FBQyxvQ0FBb0M7QUFFdEUsb0NBQW9CLE9BQU8sUUFBUTtBQUNuQyw4QkFBYyxxQkFBcUIsWUFBWSxTQUFTO0FBRXhELG9CQUFJLGFBQWEsYUFBYTtBQUM1Qix3Q0FBc0IsU0FBUyxhQUFhO0FBQUE7QUFBQSx5QkFFckMsQ0FBQyxzQkFBc0IsU0FBUyxjQUFjLHlCQUF5QixDQUFDLHNCQUFzQixTQUFTLFVBQVUsY0FBYyx1QkFBdUI7QUFDL0osb0JBQUksMkJBQTJCO0FBRS9CLG9CQUFJLGlCQUFpQixNQUFNO0FBRXpCLHNDQUFvQixPQUFPLGFBQWE7QUFDeEMsZ0NBQWMsb0JBQW9CLFlBQVksU0FBUyxVQUFVO0FBQUEsdUJBQzVEO0FBQ0wsc0JBQUksZUFBZTtBQUVuQixzQkFBSSxpQkFBaUIsZ0JBQWdCO0FBQ25DLG1DQUFlLHNCQUFzQjtBQUFBO0FBR3ZDLHNCQUFJLGlCQUFpQixnQkFBZ0I7QUFFbkMsd0NBQW9CLE9BQU8sUUFBUTtBQUFBLHlCQUM5QjtBQUNMLHdCQUFJLGVBQWUsd0JBQXdCO0FBRTNDLHdCQUFJLGlCQUFpQixRQUFRLGlCQUFpQixTQUFTO0FBTXJELGlEQUEyQjtBQUUzQiwwQ0FBb0IsT0FBTztBQUFBO0FBSTdCLHdDQUFvQixPQUFPO0FBQUE7QUFHN0IsZ0NBQWMscUJBQXFCLFlBQVksU0FBUztBQUFBO0FBRzFELG9CQUFJLHdCQUF3QjtBQUU1QixvQkFBSSxDQUFDLHlCQUF5QixhQUFhLGVBQWUsQ0FBQywwQkFBMEI7QUFDbkYsd0NBQXNCLFNBQVMsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTXBEO0FBQ0UsZ0JBQUksZUFBZTtBQUNqQixrQkFDQSxvQkFBb0IsT0FBTyxLQUFLLFNBQVMsZ0NBQWdDLE1BQU07QUFFN0UsdUNBQXVCO0FBQUE7QUFBQTtBQUFBO0FBSzdCLGtCQUFRO0FBQUEsaUJBQ0Q7QUFHSCxvQkFBTTtBQUNOLCtCQUFpQixZQUFZLFVBQVU7QUFDdkM7QUFBQSxpQkFFRztBQUdILG9CQUFNO0FBQ04saUNBQW1CO0FBQ25CO0FBQUEsaUJBRUc7QUFBQSxpQkFDQTtBQU1IO0FBQUE7QUFHQSxrQkFBSSxPQUFPLFNBQVMsWUFBWSxZQUFZO0FBRTFDLGlEQUFpQztBQUFBO0FBR25DO0FBQUE7QUFHSixpQkFBTztBQUFBO0FBRVQsa0NBQTBCLFVBQVUsTUFBTSxrQkFBa0I7QUFDMUQsY0FBSSxjQUFjLFNBQVMsY0FBYztBQUN6QyxpQkFBTztBQUFBO0FBRVQsaURBQXlDLFlBQVksT0FBTztBQUMxRDtBQUNFLGdCQUFJLHlCQUF5QjtBQUMzQjtBQUFBO0FBR0Ysc0NBQTBCO0FBRTFCLGtCQUFNLHlEQUF5RCxNQUFNLFNBQVMsZUFBZSxXQUFXLFNBQVM7QUFBQTtBQUFBO0FBR3JILDhDQUFzQyxZQUFZLE9BQU87QUFDdkQ7QUFDRSxnQkFBSSx5QkFBeUI7QUFDM0I7QUFBQTtBQUdGLHNDQUEwQjtBQUUxQixrQkFBTSxxRUFBcUUsTUFBTSxXQUFXLFdBQVcsU0FBUztBQUFBO0FBQUE7QUFHcEgsZ0RBQXdDLFlBQVksS0FBSyxPQUFPO0FBQzlEO0FBQ0UsZ0JBQUkseUJBQXlCO0FBQzNCO0FBQUE7QUFHRixzQ0FBMEI7QUFFMUIsa0JBQU0sNERBQTRELEtBQUssV0FBVyxTQUFTO0FBQUE7QUFBQTtBQUcvRiw2Q0FBcUMsWUFBWSxNQUFNO0FBQ3JEO0FBQ0UsZ0JBQUksU0FBUyxJQUFJO0FBS2Y7QUFBQTtBQUdGLGdCQUFJLHlCQUF5QjtBQUMzQjtBQUFBO0FBR0Ysc0NBQTBCO0FBRTFCLGtCQUFNLDBFQUEwRSxNQUFNLFdBQVcsU0FBUztBQUFBO0FBQUE7QUFHOUcsMENBQWtDLFlBQVksS0FBSyxPQUFPO0FBQ3hELGtCQUFRO0FBQUEsaUJBQ0Q7QUFDSCxxQ0FBdUIsWUFBWTtBQUNuQztBQUFBLGlCQUVHO0FBQ0gsdUNBQXlCLFlBQVk7QUFDckM7QUFBQSxpQkFFRztBQUNILHVDQUF5QixZQUFZO0FBQ3JDO0FBQUE7QUFBQTtBQUlOLFlBQUkscUJBQXFCLFdBQVk7QUFBQTtBQUVyQyxZQUFJLHNCQUFzQixXQUFZO0FBQUE7QUFFdEM7QUFZRSxjQUFJLGNBQWMsQ0FBQyxXQUFXLFVBQVUsUUFBUSxXQUFXLFNBQVMsUUFBUSxZQUFZLFdBQVcsY0FBYyxRQUFRLE1BQU0sVUFBVSxXQUFXLFVBQVUsT0FBTyxZQUFZLE1BQU0sV0FBVyxPQUFPLE9BQU8sTUFBTSxNQUFNLFNBQVMsWUFBWSxjQUFjLFVBQVUsVUFBVSxRQUFRLFNBQVMsWUFBWSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxRQUFRLFVBQVUsVUFBVSxNQUFNLFFBQVEsVUFBVSxPQUFPLFNBQVMsV0FBVyxNQUFNLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxZQUFZLFFBQVEsT0FBTyxXQUFXLFlBQVksWUFBWSxVQUFVLE1BQU0sS0FBSyxTQUFTLGFBQWEsT0FBTyxVQUFVLFdBQVcsVUFBVSxVQUFVLFNBQVMsV0FBVyxTQUFTLFNBQVMsTUFBTSxZQUFZLFlBQVksU0FBUyxNQUFNLFNBQVMsU0FBUyxNQUFNLFNBQVMsTUFBTSxPQUFPO0FBRWp2QixjQUFJLGNBQWM7QUFBQSxZQUFDO0FBQUEsWUFBVTtBQUFBLFlBQVc7QUFBQSxZQUFRO0FBQUEsWUFBUztBQUFBLFlBQU07QUFBQSxZQUFNO0FBQUEsWUFBVztBQUFBLFlBQVU7QUFBQSxZQUcxRjtBQUFBLFlBQWlCO0FBQUEsWUFBUTtBQUFBO0FBRXpCLGNBQUksa0JBQWtCLFlBQVksT0FBTyxDQUFDO0FBRTFDLGNBQUksaUJBQWlCLENBQUMsTUFBTSxNQUFNLE1BQU0sVUFBVSxZQUFZLEtBQUssTUFBTTtBQUN6RSxjQUFJLG9CQUFvQjtBQUFBLFlBQ3RCLFNBQVM7QUFBQSxZQUNULFNBQVM7QUFBQSxZQUNULGFBQWE7QUFBQSxZQUNiLGtCQUFrQjtBQUFBLFlBQ2xCLGdCQUFnQjtBQUFBLFlBQ2hCLG1CQUFtQjtBQUFBLFlBQ25CLHdCQUF3QjtBQUFBLFlBQ3hCLHNCQUFzQjtBQUFBO0FBR3hCLGdDQUFzQixTQUFVLFNBQVMsS0FBSztBQUM1QyxnQkFBSSxlQUFlLE9BQU8sSUFBSSxXQUFXO0FBRXpDLGdCQUFJLE9BQU87QUFBQSxjQUNUO0FBQUE7QUFHRixnQkFBSSxZQUFZLFFBQVEsU0FBUyxJQUFJO0FBQ25DLDJCQUFhLGNBQWM7QUFDM0IsMkJBQWEsbUJBQW1CO0FBQ2hDLDJCQUFhLGlCQUFpQjtBQUFBO0FBR2hDLGdCQUFJLGdCQUFnQixRQUFRLFNBQVMsSUFBSTtBQUN2QywyQkFBYSxvQkFBb0I7QUFBQTtBQUtuQyxnQkFBSSxZQUFZLFFBQVEsU0FBUyxNQUFNLFFBQVEsYUFBYSxRQUFRLFNBQVMsUUFBUSxLQUFLO0FBQ3hGLDJCQUFhLHlCQUF5QjtBQUN0QywyQkFBYSx1QkFBdUI7QUFBQTtBQUd0Qyx5QkFBYSxVQUFVO0FBRXZCLGdCQUFJLFFBQVEsUUFBUTtBQUNsQiwyQkFBYSxVQUFVO0FBQUE7QUFHekIsZ0JBQUksUUFBUSxLQUFLO0FBQ2YsMkJBQWEsY0FBYztBQUFBO0FBRzdCLGdCQUFJLFFBQVEsVUFBVTtBQUNwQiwyQkFBYSxtQkFBbUI7QUFBQTtBQUdsQyxnQkFBSSxRQUFRLFFBQVE7QUFDbEIsMkJBQWEsaUJBQWlCO0FBQUE7QUFHaEMsZ0JBQUksUUFBUSxLQUFLO0FBQ2YsMkJBQWEsb0JBQW9CO0FBQUE7QUFHbkMsZ0JBQUksUUFBUSxNQUFNO0FBQ2hCLDJCQUFhLHlCQUF5QjtBQUFBO0FBR3hDLGdCQUFJLFFBQVEsUUFBUSxRQUFRLE1BQU07QUFDaEMsMkJBQWEsdUJBQXVCO0FBQUE7QUFHdEMsbUJBQU87QUFBQTtBQU9ULGNBQUksdUJBQXVCLFNBQVUsS0FBSyxXQUFXO0FBRW5ELG9CQUFRO0FBQUEsbUJBRUQ7QUFDSCx1QkFBTyxRQUFRLFlBQVksUUFBUSxjQUFjLFFBQVE7QUFBQSxtQkFFdEQ7QUFDSCx1QkFBTyxRQUFRLFlBQVksUUFBUTtBQUFBLG1CQUloQztBQUNILHVCQUFPLFFBQVE7QUFBQSxtQkFPWjtBQUNILHVCQUFPLFFBQVEsUUFBUSxRQUFRLFFBQVEsUUFBUSxXQUFXLFFBQVEsWUFBWSxRQUFRO0FBQUEsbUJBR25GO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUNILHVCQUFPLFFBQVEsUUFBUSxRQUFRLFdBQVcsUUFBUSxZQUFZLFFBQVE7QUFBQSxtQkFHbkU7QUFDSCx1QkFBTyxRQUFRLFNBQVMsUUFBUTtBQUFBLG1CQUc3QjtBQUNILHVCQUFPLFFBQVEsYUFBYSxRQUFRLGNBQWMsUUFBUSxXQUFXLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxXQUFXLFFBQVEsWUFBWSxRQUFRO0FBQUEsbUJBR3ZKO0FBQ0gsdUJBQU8sUUFBUSxVQUFVLFFBQVEsY0FBYyxRQUFRLGFBQWEsUUFBUSxVQUFVLFFBQVEsVUFBVSxRQUFRLFdBQVcsUUFBUSxjQUFjLFFBQVEsY0FBYyxRQUFRLFdBQVcsUUFBUSxZQUFZLFFBQVE7QUFBQSxtQkFHbk47QUFDSCx1QkFBTyxRQUFRLFVBQVUsUUFBUSxVQUFVLFFBQVE7QUFBQSxtQkFFaEQ7QUFDSCx1QkFBTyxRQUFRO0FBQUEsbUJBRVo7QUFDSCx1QkFBTyxRQUFRO0FBQUE7QUFNbkIsb0JBQVE7QUFBQSxtQkFDRDtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFDSCx1QkFBTyxjQUFjLFFBQVEsY0FBYyxRQUFRLGNBQWMsUUFBUSxjQUFjLFFBQVEsY0FBYyxRQUFRLGNBQWM7QUFBQSxtQkFFaEk7QUFBQSxtQkFDQTtBQUNILHVCQUFPLGVBQWUsUUFBUSxlQUFlO0FBQUEsbUJBRTFDO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFLSCx1QkFBTyxhQUFhO0FBQUE7QUFHeEIsbUJBQU87QUFBQTtBQU9ULGNBQUksNEJBQTRCLFNBQVUsS0FBSyxjQUFjO0FBQzNELG9CQUFRO0FBQUEsbUJBQ0Q7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUNILHVCQUFPLGFBQWE7QUFBQSxtQkFFakI7QUFDSCx1QkFBTyxhQUFhLFdBQVcsYUFBYTtBQUFBLG1CQUV6QztBQUNILHVCQUFPLGFBQWE7QUFBQSxtQkFFakI7QUFBQSxtQkFDQTtBQUNILHVCQUFPLGFBQWE7QUFBQSxtQkFFakI7QUFDSCx1QkFBTyxhQUFhO0FBQUEsbUJBRWpCO0FBR0gsdUJBQU8sYUFBYTtBQUFBLG1CQUVqQjtBQUNILHVCQUFPLGFBQWE7QUFBQTtBQUd4QixtQkFBTztBQUFBO0FBR1QsY0FBSSxZQUFZO0FBRWhCLCtCQUFxQixTQUFVLFVBQVUsV0FBVyxjQUFjO0FBQ2hFLDJCQUFlLGdCQUFnQjtBQUMvQixnQkFBSSxhQUFhLGFBQWE7QUFDOUIsZ0JBQUksWUFBWSxjQUFjLFdBQVc7QUFFekMsZ0JBQUksYUFBYSxNQUFNO0FBQ3JCLGtCQUFJLFlBQVksTUFBTTtBQUNwQixzQkFBTTtBQUFBO0FBR1IseUJBQVc7QUFBQTtBQUdiLGdCQUFJLGdCQUFnQixxQkFBcUIsVUFBVSxhQUFhLE9BQU87QUFDdkUsZ0JBQUksa0JBQWtCLGdCQUFnQixPQUFPLDBCQUEwQixVQUFVO0FBQ2pGLGdCQUFJLDBCQUEwQixpQkFBaUI7QUFFL0MsZ0JBQUksQ0FBQyx5QkFBeUI7QUFDNUI7QUFBQTtBQUdGLGdCQUFJLGNBQWMsd0JBQXdCO0FBQzFDLGdCQUFJLFVBQVUsQ0FBQyxDQUFDLGdCQUFnQixNQUFNLFdBQVcsTUFBTTtBQUV2RCxnQkFBSSxVQUFVLFVBQVU7QUFDdEI7QUFBQTtBQUdGLHNCQUFVLFdBQVc7QUFDckIsZ0JBQUksaUJBQWlCO0FBQ3JCLGdCQUFJLGlCQUFpQjtBQUVyQixnQkFBSSxhQUFhLFNBQVM7QUFDeEIsa0JBQUksS0FBSyxLQUFLLFlBQVk7QUFDeEIsaUNBQWlCO0FBQUEscUJBQ1o7QUFDTCxpQ0FBaUI7QUFDakIsaUNBQWlCO0FBQUE7QUFBQSxtQkFFZDtBQUNMLCtCQUFpQixNQUFNLFdBQVc7QUFBQTtBQUdwQyxnQkFBSSxlQUFlO0FBQ2pCLGtCQUFJLE9BQU87QUFFWCxrQkFBSSxnQkFBZ0IsV0FBVyxhQUFhLE1BQU07QUFDaEQsd0JBQVE7QUFBQTtBQUdWLG9CQUFNLHFFQUFxRSxnQkFBZ0IsYUFBYSxnQkFBZ0I7QUFBQSxtQkFDbkg7QUFDTCxvQkFBTSxzRUFBMkUsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBS3ZHLFlBQUksK0JBQStCO0FBQ25DLFlBQUksc0JBQXNCO0FBQzFCLFlBQUksb0JBQW9CO0FBQ3hCLFlBQUksOEJBQThCO0FBQ2xDLFlBQUksK0JBQStCO0FBQ25DLFlBQUksVUFBVTtBQUNkLFlBQUksZ0JBQWdCO0FBQ3BCLFlBQUksdUJBQXVCO0FBQzNCLG9DQUE0Qix1QkFBdUI7QUFDakQsY0FBSTtBQUNKLGNBQUk7QUFDSixjQUFJLFdBQVcsc0JBQXNCO0FBRXJDLGtCQUFRO0FBQUEsaUJBQ0Q7QUFBQSxpQkFDQSx3QkFDSDtBQUNFLHFCQUFPLGFBQWEsZ0JBQWdCLGNBQWM7QUFDbEQsa0JBQUksUUFBTyxzQkFBc0I7QUFDakMsMEJBQVksUUFBTyxNQUFLLGVBQWUsa0JBQWtCLE1BQU07QUFDL0Q7QUFBQTtBQUFBLHFCQUlGO0FBQ0Usa0JBQUksWUFBWSxhQUFhLGVBQWUsc0JBQXNCLGFBQWE7QUFDL0Usa0JBQUksZUFBZSxVQUFVLGdCQUFnQjtBQUM3QyxxQkFBTyxVQUFVO0FBQ2pCLDBCQUFZLGtCQUFrQixjQUFjO0FBQzVDO0FBQUE7QUFBQTtBQUlOO0FBQ0UsZ0JBQUksZUFBZSxLQUFLO0FBQ3hCLGdCQUFJLGVBQWUsb0JBQW9CLE1BQU07QUFDN0MsbUJBQU87QUFBQSxjQUNMO0FBQUEsY0FDQTtBQUFBO0FBQUE7QUFBQTtBQUlOLHFDQUE2QixtQkFBbUIsTUFBTSx1QkFBdUI7QUFDM0U7QUFDRSxnQkFBSSx1QkFBdUI7QUFDM0IsZ0JBQUksWUFBWSxrQkFBa0IscUJBQXFCLFdBQVc7QUFDbEUsZ0JBQUksZUFBZSxvQkFBb0IscUJBQXFCLGNBQWM7QUFDMUUsbUJBQU87QUFBQSxjQUNMO0FBQUEsY0FDQTtBQUFBO0FBQUE7QUFBQTtBQUlOLG1DQUEyQixVQUFVO0FBQ25DLGlCQUFPO0FBQUE7QUFFVCxrQ0FBMEIsZUFBZTtBQUN2QywwQkFBZ0I7QUFDaEIsaUNBQXVCO0FBQ3ZCLGNBQUksaUJBQWlCO0FBRXJCLHFCQUFXO0FBQ1gsaUJBQU87QUFBQTtBQUVULGtDQUEwQixlQUFlO0FBQ3ZDLDJCQUFpQjtBQUNqQixxQkFBVztBQUNYLDBCQUFnQjtBQUNoQixpQ0FBdUI7QUFBQTtBQUV6QixnQ0FBd0IsTUFBTSxPQUFPLHVCQUF1QixhQUFhLHdCQUF3QjtBQUMvRixjQUFJO0FBRUo7QUFFRSxnQkFBSSxpQkFBaUI7QUFDckIsK0JBQW1CLE1BQU0sTUFBTSxlQUFlO0FBRTlDLGdCQUFJLE9BQU8sTUFBTSxhQUFhLFlBQVksT0FBTyxNQUFNLGFBQWEsVUFBVTtBQUM1RSxrQkFBSSxTQUFTLEtBQUssTUFBTTtBQUN4QixrQkFBSSxrQkFBa0Isb0JBQW9CLGVBQWUsY0FBYztBQUN2RSxpQ0FBbUIsTUFBTSxRQUFRO0FBQUE7QUFHbkMsOEJBQWtCLGVBQWU7QUFBQTtBQUduQyxjQUFJLGFBQWEsZUFBYyxNQUFNLE9BQU8sdUJBQXVCO0FBQ25FLDRCQUFrQix3QkFBd0I7QUFDMUMsMkJBQWlCLFlBQVk7QUFDN0IsaUJBQU87QUFBQTtBQUVULG9DQUE0QixnQkFBZ0IsT0FBTztBQUNqRCx5QkFBZSxZQUFZO0FBQUE7QUFFN0IseUNBQWlDLFlBQVksTUFBTSxPQUFPLHVCQUF1QixhQUFhO0FBQzVGLCtCQUFxQixZQUFZLE1BQU0sT0FBTztBQUU5QyxrQkFBUTtBQUFBLGlCQUNEO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQ0gscUJBQU8sQ0FBQyxDQUFDLE1BQU07QUFBQSxpQkFFWjtBQUNILHFCQUFPO0FBQUE7QUFHUCxxQkFBTztBQUFBO0FBQUE7QUFHYiwrQkFBdUIsWUFBWSxNQUFNLFVBQVUsVUFBVSx1QkFBdUIsYUFBYTtBQUMvRjtBQUNFLGdCQUFJLGlCQUFpQjtBQUVyQixnQkFBSSxPQUFPLFNBQVMsYUFBYSxPQUFPLFNBQVMsWUFBYSxRQUFPLFNBQVMsYUFBYSxZQUFZLE9BQU8sU0FBUyxhQUFhLFdBQVc7QUFDN0ksa0JBQUksU0FBUyxLQUFLLFNBQVM7QUFDM0Isa0JBQUksa0JBQWtCLG9CQUFvQixlQUFlLGNBQWM7QUFDdkUsaUNBQW1CLE1BQU0sUUFBUTtBQUFBO0FBQUE7QUFJckMsaUJBQU8sZUFBZSxZQUFZLE1BQU0sVUFBVTtBQUFBO0FBRXBELHNDQUE4QixNQUFNLE9BQU87QUFDekMsaUJBQU8sU0FBUyxjQUFjLFNBQVMsY0FBYyxPQUFPLE1BQU0sYUFBYSxZQUFZLE9BQU8sTUFBTSxhQUFhLFlBQVksT0FBTyxNQUFNLDRCQUE0QixZQUFZLE1BQU0sNEJBQTRCLFFBQVEsTUFBTSx3QkFBd0IsVUFBVTtBQUFBO0FBRTFRLG9DQUE0QixNQUFNLHVCQUF1QixhQUFhLHdCQUF3QjtBQUM1RjtBQUNFLGdCQUFJLGlCQUFpQjtBQUNyQiwrQkFBbUIsTUFBTSxNQUFNLGVBQWU7QUFBQTtBQUdoRCxjQUFJLFdBQVcsZUFBZSxNQUFNO0FBQ3BDLDRCQUFrQix3QkFBd0I7QUFDMUMsaUJBQU87QUFBQTtBQUVULDJDQUFtQztBQUNqQyxjQUFJLGVBQWUsT0FBTztBQUUxQixjQUFJLGlCQUFpQixRQUFXO0FBQzlCLG1CQUFPO0FBQUE7QUFHVCxpQkFBTyxpQkFBaUIsYUFBYTtBQUFBO0FBS3ZDLFlBQUksa0JBQWtCLE9BQU8sZUFBZSxhQUFhLGFBQWE7QUFDdEUsWUFBSSxnQkFBZ0IsT0FBTyxpQkFBaUIsYUFBYSxlQUFlO0FBQ3hFLFlBQUksWUFBWTtBQUNoQixZQUFJLGVBQWUsT0FBTyxZQUFZLGFBQWEsVUFBVTtBQUM3RCxZQUFJLG9CQUFvQixPQUFPLG1CQUFtQixhQUFhLGlCQUFpQixPQUFPLGlCQUFpQixjQUFjLFNBQVUsVUFBVTtBQUN4SSxpQkFBTyxhQUFhLFFBQVEsTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUFBLFlBQ3JEO0FBRUosdUNBQStCLFFBQU87QUFDcEMscUJBQVcsV0FBWTtBQUNyQixrQkFBTTtBQUFBO0FBQUE7QUFHViw2QkFBcUIsWUFBWSxNQUFNLFVBQVUsd0JBQXdCO0FBT3ZFLGtCQUFRO0FBQUEsaUJBQ0Q7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFDSCxrQkFBSSxTQUFTLFdBQVc7QUFDdEIsMkJBQVc7QUFBQTtBQUdiO0FBQUEsaUJBRUcsT0FDSDtBQUNFLGtCQUFJLFNBQVMsS0FBSztBQUNoQiwyQkFBVyxNQUFNLFNBQVM7QUFBQTtBQUc1QjtBQUFBO0FBQUE7QUFBQTtBQUlSLDhCQUFzQixZQUFZLGVBQWUsTUFBTSxVQUFVLFVBQVUsd0JBQXdCO0FBRWpHLDJCQUFpQixZQUFZLGVBQWUsTUFBTSxVQUFVO0FBRzVELDJCQUFpQixZQUFZO0FBQUE7QUFFL0Isa0NBQTBCLFlBQVk7QUFDcEMseUJBQWUsWUFBWTtBQUFBO0FBRTdCLGtDQUEwQixjQUFjLFNBQVMsU0FBUztBQUN4RCx1QkFBYSxZQUFZO0FBQUE7QUFFM0IsNkJBQXFCLGdCQUFnQixPQUFPO0FBQzFDLHlCQUFlLFlBQVk7QUFBQTtBQUU3Qix3Q0FBZ0MsV0FBVyxPQUFPO0FBQ2hELGNBQUk7QUFFSixjQUFJLFVBQVUsYUFBYSxjQUFjO0FBQ3ZDLHlCQUFhLFVBQVU7QUFDdkIsdUJBQVcsYUFBYSxPQUFPO0FBQUEsaUJBQzFCO0FBQ0wseUJBQWE7QUFDYix1QkFBVyxZQUFZO0FBQUE7QUFXekIsY0FBSSxxQkFBcUIsVUFBVTtBQUVuQyxjQUFLLHdCQUF1QixRQUFRLHVCQUF1QixXQUFjLFdBQVcsWUFBWSxNQUFNO0FBRXBHLDZDQUFpQztBQUFBO0FBQUE7QUFHckMsOEJBQXNCLGdCQUFnQixPQUFPLGFBQWE7QUFDeEQseUJBQWUsYUFBYSxPQUFPO0FBQUE7QUFFckMseUNBQWlDLFdBQVcsT0FBTyxhQUFhO0FBQzlELGNBQUksVUFBVSxhQUFhLGNBQWM7QUFDdkMsc0JBQVUsV0FBVyxhQUFhLE9BQU87QUFBQSxpQkFDcEM7QUFDTCxzQkFBVSxhQUFhLE9BQU87QUFBQTtBQUFBO0FBSWxDLDZCQUFxQixnQkFBZ0IsT0FBTztBQUMxQyx5QkFBZSxZQUFZO0FBQUE7QUFFN0IsMENBQWtDLFdBQVcsT0FBTztBQUNsRCxjQUFJLFVBQVUsYUFBYSxjQUFjO0FBQ3ZDLHNCQUFVLFdBQVcsWUFBWTtBQUFBLGlCQUM1QjtBQUNMLHNCQUFVLFlBQVk7QUFBQTtBQUFBO0FBRzFCLHVDQUErQixnQkFBZ0Isa0JBQWtCO0FBQy9ELGNBQUksT0FBTztBQUlYLGNBQUksUUFBUTtBQUVaLGFBQUc7QUFDRCxnQkFBSSxXQUFXLEtBQUs7QUFDcEIsMkJBQWUsWUFBWTtBQUUzQixnQkFBSSxZQUFZLFNBQVMsYUFBYSxjQUFjO0FBQ2xELGtCQUFJLE9BQU8sU0FBUztBQUVwQixrQkFBSSxTQUFTLG1CQUFtQjtBQUM5QixvQkFBSSxVQUFVLEdBQUc7QUFDZixpQ0FBZSxZQUFZO0FBRTNCLG1DQUFpQjtBQUNqQjtBQUFBLHVCQUNLO0FBQ0w7QUFBQTtBQUFBLHlCQUVPLFNBQVMsdUJBQXVCLFNBQVMsK0JBQStCLFNBQVMsOEJBQThCO0FBQ3hIO0FBQUE7QUFBQTtBQUlKLG1CQUFPO0FBQUEsbUJBQ0E7QUFJVCwyQkFBaUI7QUFBQTtBQUVuQixvREFBNEMsV0FBVyxrQkFBa0I7QUFDdkUsY0FBSSxVQUFVLGFBQWEsY0FBYztBQUN2QyxrQ0FBc0IsVUFBVSxZQUFZO0FBQUEscUJBQ25DLFVBQVUsYUFBYSxjQUFjO0FBQzlDLGtDQUFzQixXQUFXO0FBQUE7QUFJbkMsMkJBQWlCO0FBQUE7QUFFbkIsOEJBQXNCLFVBQVU7QUFHOUIscUJBQVc7QUFDWCxjQUFJLFNBQVEsU0FBUztBQUVyQixjQUFJLE9BQU8sT0FBTSxnQkFBZ0IsWUFBWTtBQUMzQyxtQkFBTSxZQUFZLFdBQVcsUUFBUTtBQUFBLGlCQUNoQztBQUNMLG1CQUFNLFVBQVU7QUFBQTtBQUFBO0FBR3BCLGtDQUEwQixjQUFjO0FBQ3RDLHVCQUFhLFlBQVk7QUFBQTtBQUUzQixnQ0FBd0IsVUFBVSxPQUFPO0FBQ3ZDLHFCQUFXO0FBQ1gsY0FBSSxZQUFZLE1BQU07QUFDdEIsY0FBSSxVQUFVLGNBQWMsVUFBYSxjQUFjLFFBQVEsVUFBVSxlQUFlLGFBQWEsVUFBVSxVQUFVO0FBQ3pILG1CQUFTLE1BQU0sVUFBVSxvQkFBb0IsV0FBVztBQUFBO0FBRTFELG9DQUE0QixjQUFjLE1BQU07QUFDOUMsdUJBQWEsWUFBWTtBQUFBO0FBRTNCLGdDQUF3QixXQUFXO0FBQ2pDLGNBQUksVUFBVSxhQUFhLGNBQWM7QUFDdkMsc0JBQVUsY0FBYztBQUFBLHFCQUNmLFVBQVUsYUFBYSxlQUFlO0FBQy9DLGdCQUFJLE9BQU8sVUFBVTtBQUVyQixnQkFBSSxRQUFRLE1BQU07QUFDaEIsbUJBQUssY0FBYztBQUFBO0FBQUE7QUFBQTtBQUl6QixvQ0FBNEIsVUFBVSxNQUFNLE9BQU87QUFDakQsY0FBSSxTQUFTLGFBQWEsZ0JBQWdCLEtBQUssa0JBQWtCLFNBQVMsU0FBUyxlQUFlO0FBQ2hHLG1CQUFPO0FBQUE7QUFJVCxpQkFBTztBQUFBO0FBRVQsd0NBQWdDLFVBQVUsTUFBTTtBQUM5QyxjQUFJLFNBQVMsTUFBTSxTQUFTLGFBQWEsV0FBVztBQUVsRCxtQkFBTztBQUFBO0FBSVQsaUJBQU87QUFBQTtBQUVULDRDQUFvQyxVQUFVO0FBQzVDLGNBQUksU0FBUyxhQUFhLGNBQWM7QUFFdEMsbUJBQU87QUFBQTtBQUlULGlCQUFPO0FBQUE7QUFFVCwyQ0FBbUMsVUFBVTtBQUMzQyxpQkFBTyxTQUFTLFNBQVM7QUFBQTtBQUUzQiw0Q0FBb0MsVUFBVTtBQUM1QyxpQkFBTyxTQUFTLFNBQVM7QUFBQTtBQUUzQiwrQ0FBdUMsVUFBVSxVQUFVO0FBQ3pELG1CQUFTLGNBQWM7QUFBQTtBQUd6QixtQ0FBMkIsTUFBTTtBQUUvQixpQkFBTyxRQUFRLE1BQU0sT0FBTyxLQUFLLGFBQWE7QUFDNUMsZ0JBQUksV0FBVyxLQUFLO0FBRXBCLGdCQUFJLGFBQWEsZ0JBQWdCLGFBQWEsV0FBVztBQUN2RDtBQUFBO0FBR0YsZ0JBQUksYUFBYSxjQUFjO0FBQzdCLGtCQUFJLFdBQVcsS0FBSztBQUVwQixrQkFBSSxhQUFhLHVCQUF1QixhQUFhLGdDQUFnQyxhQUFhLDZCQUE2QjtBQUM3SDtBQUFBO0FBR0Ysa0JBQUksYUFBYSxtQkFBbUI7QUFDbEMsdUJBQU87QUFBQTtBQUFBO0FBQUE7QUFLYixpQkFBTztBQUFBO0FBR1QsMENBQWtDLFVBQVU7QUFDMUMsaUJBQU8sa0JBQWtCLFNBQVM7QUFBQTtBQUVwQyx5Q0FBaUMsZ0JBQWdCO0FBQy9DLGlCQUFPLGtCQUFrQixlQUFlO0FBQUE7QUFFMUMsd0RBQWdELGlCQUFpQjtBQUMvRCxpQkFBTyxrQkFBa0IsZ0JBQWdCO0FBQUE7QUFFM0MsK0RBQXVELGdCQUFnQjtBQUNyRSxpQkFBTyxrQkFBa0IsZUFBZTtBQUFBO0FBRTFDLGlDQUF5QixVQUFVLE1BQU0sT0FBTyx1QkFBdUIsYUFBYSx3QkFBd0IsZUFBZTtBQUN6SCw0QkFBa0Isd0JBQXdCO0FBRzFDLDJCQUFpQixVQUFVO0FBQzNCLGNBQUk7QUFFSjtBQUNFLGdCQUFJLGlCQUFpQjtBQUNyQiw4QkFBa0IsZUFBZTtBQUFBO0FBS25DLGNBQUksbUJBQW9CLHdCQUF1QixPQUFPLG9CQUFvQjtBQUMxRSxpQkFBTyx1QkFBdUIsVUFBVSxNQUFNLE9BQU8saUJBQWlCLHVCQUF1QixrQkFBa0I7QUFBQTtBQUVqSCxxQ0FBNkIsY0FBYyxNQUFNLHdCQUF3QixlQUFlO0FBQ3RGLDRCQUFrQix3QkFBd0I7QUFHMUMsY0FBSSxtQkFBb0Isd0JBQXVCLE9BQU8sb0JBQW9CO0FBQzFFLGlCQUFPLGlCQUFpQixjQUFjO0FBQUE7QUFFeEMseUNBQWlDLGtCQUFrQix3QkFBd0I7QUFDekUsNEJBQWtCLHdCQUF3QjtBQUFBO0FBRTVDLGdFQUF3RCxrQkFBa0I7QUFDeEUsY0FBSSxPQUFPLGlCQUFpQjtBQUk1QixjQUFJLFFBQVE7QUFFWixpQkFBTyxNQUFNO0FBQ1gsZ0JBQUksS0FBSyxhQUFhLGNBQWM7QUFDbEMsa0JBQUksT0FBTyxLQUFLO0FBRWhCLGtCQUFJLFNBQVMsbUJBQW1CO0FBQzlCLG9CQUFJLFVBQVUsR0FBRztBQUNmLHlCQUFPLHlCQUF5QjtBQUFBLHVCQUMzQjtBQUNMO0FBQUE7QUFBQSx5QkFFTyxTQUFTLHVCQUF1QixTQUFTLGdDQUFnQyxTQUFTLDZCQUE2QjtBQUN4SDtBQUFBO0FBQUE7QUFJSixtQkFBTyxLQUFLO0FBQUE7QUFJZCxpQkFBTztBQUFBO0FBS1QsMkNBQW1DLGdCQUFnQjtBQUNqRCxjQUFJLE9BQU8sZUFBZTtBQUkxQixjQUFJLFFBQVE7QUFFWixpQkFBTyxNQUFNO0FBQ1gsZ0JBQUksS0FBSyxhQUFhLGNBQWM7QUFDbEMsa0JBQUksT0FBTyxLQUFLO0FBRWhCLGtCQUFJLFNBQVMsdUJBQXVCLFNBQVMsZ0NBQWdDLFNBQVMsNkJBQTZCO0FBQ2pILG9CQUFJLFVBQVUsR0FBRztBQUNmLHlCQUFPO0FBQUEsdUJBQ0Y7QUFDTDtBQUFBO0FBQUEseUJBRU8sU0FBUyxtQkFBbUI7QUFDckM7QUFBQTtBQUFBO0FBSUosbUJBQU8sS0FBSztBQUFBO0FBR2QsaUJBQU87QUFBQTtBQUVULHlDQUFpQyxXQUFXO0FBRTFDLDJCQUFpQjtBQUFBO0FBRW5CLGdEQUF3QyxrQkFBa0I7QUFFeEQsMkJBQWlCO0FBQUE7QUFFbkIscURBQTZDLFlBQVk7QUFDdkQsaUJBQU8sZUFBZSxVQUFVLGVBQWU7QUFBQTtBQUVqRCwwREFBa0QsaUJBQWlCLGNBQWMsTUFBTSxrQkFBa0I7QUFDdkcsY0FBSSxnQkFBZ0I7QUFDcEIsZ0NBQXNCLGFBQWEsV0FBVyxNQUFNLGtCQUFrQjtBQUFBO0FBRXhFLGlEQUF5QyxZQUFZLGFBQWEsZ0JBQWdCLGNBQWMsTUFBTSxrQkFBa0I7QUFDdEgsY0FBSSxZQUFZLGtDQUFrQyxNQUFNO0FBQ3RELGdCQUFJLGdCQUFnQjtBQUNwQixrQ0FBc0IsYUFBYSxXQUFXLE1BQU0sa0JBQWtCO0FBQUE7QUFBQTtBQUcxRSxzREFBOEMsaUJBQWlCLFVBQVU7QUFDdkU7QUFDRSxnQkFBSSxTQUFTLGFBQWEsY0FBYztBQUN0Qyw4Q0FBZ0MsaUJBQWlCO0FBQUEsdUJBQ3hDLFNBQVMsYUFBYTtBQUFjO0FBQUEsaUJBQU87QUFDcEQsMkNBQTZCLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUlwRCw2REFBcUQsZ0JBQWdCLFVBQVU7QUFDN0U7QUFFRSxnQkFBSSxhQUFhLGVBQWU7QUFFaEMsZ0JBQUksZUFBZSxNQUFNO0FBQ3ZCLGtCQUFJLFNBQVMsYUFBYSxjQUFjO0FBQ3RDLGdEQUFnQyxZQUFZO0FBQUEseUJBQ25DLFNBQVMsYUFBYTtBQUFjO0FBQUEsbUJBQU87QUFDcEQsNkNBQTZCLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtqRCx1Q0FBK0IsWUFBWSxhQUFhLGdCQUFnQixVQUFVLGtCQUFrQjtBQUNsRztBQUNFLGdCQUFJLG9CQUFvQixZQUFZLGtDQUFrQyxNQUFNO0FBQzFFLGtCQUFJLFNBQVMsYUFBYSxjQUFjO0FBQ3RDLGdEQUFnQyxnQkFBZ0I7QUFBQSx5QkFDdkMsU0FBUyxhQUFhO0FBQWM7QUFBQSxtQkFBTztBQUNwRCw2Q0FBNkIsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLckQsNkRBQXFELGlCQUFpQixNQUFNLE9BQU87QUFDakY7QUFDRSwyQ0FBK0IsaUJBQWlCO0FBQUE7QUFBQTtBQUdwRCxpRUFBeUQsaUJBQWlCLE1BQU07QUFDOUU7QUFDRSx3Q0FBNEIsaUJBQWlCO0FBQUE7QUFBQTtBQUdqRCxvRUFBNEQsZ0JBQWdCLE1BQU0sT0FBTztBQUN2RjtBQUVFLGdCQUFJLGFBQWEsZUFBZTtBQUNoQyxnQkFBSSxlQUFlO0FBQU0sNkNBQStCLFlBQVk7QUFBQTtBQUFBO0FBR3hFLHdFQUFnRSxnQkFBZ0IsTUFBTTtBQUNwRjtBQUVFLGdCQUFJLGFBQWEsZUFBZTtBQUNoQyxnQkFBSSxlQUFlO0FBQU0sMENBQTRCLFlBQVk7QUFBQTtBQUFBO0FBR3JFLDhDQUFzQyxZQUFZLGFBQWEsZ0JBQWdCLE1BQU0sT0FBTyxrQkFBa0I7QUFDNUc7QUFDRSxnQkFBSSxvQkFBb0IsWUFBWSxrQ0FBa0MsTUFBTTtBQUMxRSw2Q0FBK0IsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBSXJELGtEQUEwQyxZQUFZLGFBQWEsZ0JBQWdCLE1BQU0sa0JBQWtCO0FBQ3pHO0FBQ0UsZ0JBQUksb0JBQW9CLFlBQVksa0NBQWtDLE1BQU07QUFDMUUsMENBQTRCLGdCQUFnQjtBQUFBO0FBQUE7QUFBQTtBQUlsRCx5Q0FBaUMsaUJBQWlCO0FBQ2hEO0FBR0Usa0JBQU0saUdBQWlHLGdCQUFnQixTQUFTO0FBQUE7QUFBQTtBQUdwSSxvQ0FBNEIsZ0JBQWdCO0FBQzFDLHFDQUEyQjtBQUFBO0FBRzdCLFlBQUksWUFBWSxLQUFLLFNBQVMsU0FBUyxJQUFJLE1BQU07QUFDakQsWUFBSSxzQkFBc0Isa0JBQWtCO0FBQzVDLFlBQUksbUJBQW1CLGtCQUFrQjtBQUN6QyxZQUFJLCtCQUErQixzQkFBc0I7QUFDekQsWUFBSSwyQkFBMkIsbUJBQW1CO0FBQ2xELFlBQUksbUNBQW1DLHNCQUFzQjtBQUM3RCxZQUFJLDZCQUE2QixvQkFBb0I7QUFDckQsdUNBQStCLE1BQU07QUFHbkMsaUJBQU8sS0FBSztBQUNaLGlCQUFPLEtBQUs7QUFDWixpQkFBTyxLQUFLO0FBQ1osaUJBQU8sS0FBSztBQUNaLGlCQUFPLEtBQUs7QUFBQTtBQUVkLG1DQUEyQixVQUFVLE1BQU07QUFDekMsZUFBSyx1QkFBdUI7QUFBQTtBQUU5QixxQ0FBNkIsVUFBVSxNQUFNO0FBQzNDLGVBQUssZ0NBQWdDO0FBQUE7QUFFdkMsdUNBQStCLE1BQU07QUFDbkMsZUFBSyxnQ0FBZ0M7QUFBQTtBQUV2Qyx5Q0FBaUMsTUFBTTtBQUNyQyxpQkFBTyxDQUFDLENBQUMsS0FBSztBQUFBO0FBU2hCLDRDQUFvQyxZQUFZO0FBQzlDLGNBQUksYUFBYSxXQUFXO0FBRTVCLGNBQUksWUFBWTtBQUVkLG1CQUFPO0FBQUE7QUFLVCxjQUFJLGFBQWEsV0FBVztBQUU1QixpQkFBTyxZQUFZO0FBU2pCLHlCQUFhLFdBQVcsaUNBQWlDLFdBQVc7QUFFcEUsZ0JBQUksWUFBWTtBQWNkLGtCQUFJLFlBQVksV0FBVztBQUUzQixrQkFBSSxXQUFXLFVBQVUsUUFBUSxjQUFjLFFBQVEsVUFBVSxVQUFVLE1BQU07QUFHL0Usb0JBQUksbUJBQW1CLDBCQUEwQjtBQUVqRCx1QkFBTyxxQkFBcUIsTUFBTTtBQVNoQyxzQkFBSSxxQkFBcUIsaUJBQWlCO0FBRTFDLHNCQUFJLG9CQUFvQjtBQUN0QiwyQkFBTztBQUFBO0FBT1QscUNBQW1CLDBCQUEwQjtBQUFBO0FBQUE7QUFNakQscUJBQU87QUFBQTtBQUdULHlCQUFhO0FBQ2IseUJBQWEsV0FBVztBQUFBO0FBRzFCLGlCQUFPO0FBQUE7QUFPVCxxQ0FBNkIsTUFBTTtBQUNqQyxjQUFJLE9BQU8sS0FBSyx3QkFBd0IsS0FBSztBQUU3QyxjQUFJLE1BQU07QUFDUixnQkFBSSxLQUFLLFFBQVEsaUJBQWlCLEtBQUssUUFBUSxZQUFZLEtBQUssUUFBUSxxQkFBcUIsS0FBSyxRQUFRLFVBQVU7QUFDbEgscUJBQU87QUFBQSxtQkFDRjtBQUNMLHFCQUFPO0FBQUE7QUFBQTtBQUlYLGlCQUFPO0FBQUE7QUFPVCxxQ0FBNkIsTUFBTTtBQUNqQyxjQUFJLEtBQUssUUFBUSxpQkFBaUIsS0FBSyxRQUFRLFVBQVU7QUFHdkQsbUJBQU8sS0FBSztBQUFBO0FBS2QsZ0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFFbEIsOENBQXNDLE1BQU07QUFDMUMsaUJBQU8sS0FBSyxxQkFBcUI7QUFBQTtBQUVuQyxrQ0FBMEIsTUFBTSxPQUFPO0FBQ3JDLGVBQUssb0JBQW9CO0FBQUE7QUFFM0IscUNBQTZCLE1BQU07QUFDakMsY0FBSSxxQkFBcUIsS0FBSztBQUU5QixjQUFJLHVCQUF1QixRQUFXO0FBQ3BDLGlDQUFxQixLQUFLLDRCQUE0QixJQUFJO0FBQUE7QUFHNUQsaUJBQU87QUFBQTtBQUdULFlBQUkscUJBQXFCO0FBQ3pCLFlBQUksMkJBQTJCLHFCQUFxQjtBQUVwRCwrQ0FBdUMsU0FBUztBQUM5QztBQUNFLGdCQUFJLFNBQVM7QUFDWCxrQkFBSSxRQUFRLFFBQVE7QUFDcEIsa0JBQUksUUFBUSxxQ0FBcUMsUUFBUSxNQUFNLFFBQVEsU0FBUyxRQUFRLE1BQU0sT0FBTztBQUNyRyx1Q0FBeUIsbUJBQW1CO0FBQUEsbUJBQ3ZDO0FBQ0wsdUNBQXlCLG1CQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUtsRCxnQ0FBd0IsV0FBVyxRQUFRLFVBQVUsZUFBZSxTQUFTO0FBQzNFO0FBRUUsZ0JBQUksT0FBTSxTQUFTLEtBQUssS0FBSztBQUU3QixxQkFBUyxnQkFBZ0IsV0FBVztBQUNsQyxrQkFBSSxLQUFJLFdBQVcsZUFBZTtBQUNoQyxvQkFBSSxVQUFVO0FBSWQsb0JBQUk7QUFHRixzQkFBSSxPQUFPLFVBQVUsa0JBQWtCLFlBQVk7QUFFakQsd0JBQUksTUFBTSxNQUFPLGtCQUFpQixpQkFBaUIsT0FBTyxXQUFXLFlBQVksZUFBZSwrRkFBb0csT0FBTyxVQUFVLGdCQUFnQjtBQUNyTyx3QkFBSSxPQUFPO0FBQ1gsMEJBQU07QUFBQTtBQUdSLDRCQUFVLFVBQVUsY0FBYyxRQUFRLGNBQWMsZUFBZSxVQUFVLE1BQU07QUFBQSx5QkFDaEYsSUFBUDtBQUNBLDRCQUFVO0FBQUE7QUFHWixvQkFBSSxXQUFXLENBQUUsb0JBQW1CLFFBQVE7QUFDMUMsZ0RBQThCO0FBRTlCLHdCQUFNLDRSQUFxVCxpQkFBaUIsZUFBZSxVQUFVLGNBQWMsT0FBTztBQUUxWCxnREFBOEI7QUFBQTtBQUdoQyxvQkFBSSxtQkFBbUIsU0FBUyxDQUFFLFNBQVEsV0FBVyxxQkFBcUI7QUFHeEUscUNBQW1CLFFBQVEsV0FBVztBQUN0QyxnREFBOEI7QUFFOUIsd0JBQU0sc0JBQXNCLFVBQVUsUUFBUTtBQUU5QyxnREFBOEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT3hDLFlBQUksYUFBYTtBQUNqQixZQUFJO0FBRUo7QUFDRSx1QkFBYTtBQUFBO0FBR2YsWUFBSSxRQUFRO0FBRVosOEJBQXNCLGNBQWM7QUFDbEMsaUJBQU87QUFBQSxZQUNMLFNBQVM7QUFBQTtBQUFBO0FBSWIscUJBQWEsUUFBUSxPQUFPO0FBQzFCLGNBQUksUUFBUSxHQUFHO0FBQ2I7QUFDRSxvQkFBTTtBQUFBO0FBR1I7QUFBQTtBQUdGO0FBQ0UsZ0JBQUksVUFBVSxXQUFXLFFBQVE7QUFDL0Isb0JBQU07QUFBQTtBQUFBO0FBSVYsaUJBQU8sVUFBVSxXQUFXO0FBQzVCLHFCQUFXLFNBQVM7QUFFcEI7QUFDRSx1QkFBVyxTQUFTO0FBQUE7QUFHdEI7QUFBQTtBQUdGLHNCQUFjLFFBQVEsT0FBTyxPQUFPO0FBQ2xDO0FBQ0EscUJBQVcsU0FBUyxPQUFPO0FBRTNCO0FBQ0UsdUJBQVcsU0FBUztBQUFBO0FBR3RCLGlCQUFPLFVBQVU7QUFBQTtBQUduQixZQUFJO0FBRUo7QUFDRSw4Q0FBb0M7QUFBQTtBQUd0QyxZQUFJLHFCQUFxQjtBQUV6QjtBQUNFLGlCQUFPLE9BQU87QUFBQTtBQUloQixZQUFJLHFCQUFxQixhQUFhO0FBRXRDLFlBQUksNEJBQTRCLGFBQWE7QUFJN0MsWUFBSSxrQkFBa0I7QUFFdEIsb0NBQTRCLGlCQUFnQixXQUFXLDZCQUE2QjtBQUNsRjtBQUNFLGdCQUFJLCtCQUErQixrQkFBa0IsWUFBWTtBQUsvRCxxQkFBTztBQUFBO0FBR1QsbUJBQU8sbUJBQW1CO0FBQUE7QUFBQTtBQUk5Qiw4QkFBc0IsaUJBQWdCLGlCQUFpQixlQUFlO0FBQ3BFO0FBQ0UsZ0JBQUksV0FBVyxnQkFBZTtBQUM5QixxQkFBUyw4Q0FBOEM7QUFDdkQscUJBQVMsNENBQTRDO0FBQUE7QUFBQTtBQUl6RCxrQ0FBMEIsaUJBQWdCLGlCQUFpQjtBQUN6RDtBQUNFLGdCQUFJLE9BQU8sZ0JBQWU7QUFDMUIsZ0JBQUksZUFBZSxLQUFLO0FBRXhCLGdCQUFJLENBQUMsY0FBYztBQUNqQixxQkFBTztBQUFBO0FBTVQsZ0JBQUksV0FBVyxnQkFBZTtBQUU5QixnQkFBSSxZQUFZLFNBQVMsZ0RBQWdELGlCQUFpQjtBQUN4RixxQkFBTyxTQUFTO0FBQUE7QUFHbEIsZ0JBQUksVUFBVTtBQUVkLHFCQUFTLE9BQU8sY0FBYztBQUM1QixzQkFBUSxPQUFPLGdCQUFnQjtBQUFBO0FBR2pDO0FBQ0Usa0JBQUksT0FBTywwQkFBMEIsb0JBQW1CO0FBQ3hELDZCQUFlLGNBQWMsU0FBUyxXQUFXO0FBQUE7QUFLbkQsZ0JBQUksVUFBVTtBQUNaLDJCQUFhLGlCQUFnQixpQkFBaUI7QUFBQTtBQUdoRCxtQkFBTztBQUFBO0FBQUE7QUFJWCxxQ0FBNkI7QUFDM0I7QUFDRSxtQkFBTywwQkFBMEI7QUFBQTtBQUFBO0FBSXJDLG1DQUEyQixNQUFNO0FBQy9CO0FBQ0UsZ0JBQUksb0JBQW9CLEtBQUs7QUFDN0IsbUJBQU8sc0JBQXNCLFFBQVEsc0JBQXNCO0FBQUE7QUFBQTtBQUkvRCw0QkFBb0IsT0FBTztBQUN6QjtBQUNFLGdCQUFJLDJCQUEyQjtBQUMvQixnQkFBSSxvQkFBb0I7QUFBQTtBQUFBO0FBSTVCLDBDQUFrQyxPQUFPO0FBQ3ZDO0FBQ0UsZ0JBQUksMkJBQTJCO0FBQy9CLGdCQUFJLG9CQUFvQjtBQUFBO0FBQUE7QUFJNUIsMkNBQW1DLE9BQU8sU0FBUyxXQUFXO0FBQzVEO0FBQ0UsZ0JBQUksbUJBQW1CLFlBQVksb0JBQW9CO0FBQ3JELG9CQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGlCQUFLLG9CQUFvQixTQUFTO0FBQ2xDLGlCQUFLLDJCQUEyQixXQUFXO0FBQUE7QUFBQTtBQUkvQyxxQ0FBNkIsT0FBTyxNQUFNLGVBQWU7QUFDdkQ7QUFDRSxnQkFBSSxXQUFXLE1BQU07QUFDckIsZ0JBQUksb0JBQW9CLEtBQUs7QUFHN0IsZ0JBQUksT0FBTyxTQUFTLG9CQUFvQixZQUFZO0FBQ2xEO0FBQ0Usb0JBQUksZ0JBQWdCLDBCQUEwQixVQUFVO0FBRXhELG9CQUFJLENBQUMsa0NBQWtDLGdCQUFnQjtBQUNyRCxvREFBa0MsaUJBQWlCO0FBRW5ELHdCQUFNLGtMQUE0TCxlQUFlO0FBQUE7QUFBQTtBQUlyTixxQkFBTztBQUFBO0FBR1QsZ0JBQUksZUFBZSxTQUFTO0FBRTVCLHFCQUFTLGNBQWMsY0FBYztBQUNuQyxrQkFBSSxDQUFFLGVBQWMsb0JBQW9CO0FBQ3RDLHNCQUFNLElBQUksTUFBTywyQkFBMEIsVUFBVSxhQUFhLDhCQUErQixhQUFhO0FBQUE7QUFBQTtBQUlsSDtBQUNFLGtCQUFJLE9BQU8sMEJBQTBCLFVBQVU7QUFDL0MsNkJBQWUsbUJBQW1CLGNBQWMsaUJBQWlCO0FBQUE7QUFHbkUsbUJBQU8sT0FBTyxJQUFJLGVBQWU7QUFBQTtBQUFBO0FBSXJDLHFDQUE2QixpQkFBZ0I7QUFDM0M7QUFDRSxnQkFBSSxXQUFXLGdCQUFlO0FBSTlCLGdCQUFJLDZCQUE2QixZQUFZLFNBQVMsNkNBQTZDO0FBR25HLDhCQUFrQixtQkFBbUI7QUFDckMsaUJBQUssb0JBQW9CLDRCQUE0QjtBQUNyRCxpQkFBSywyQkFBMkIsMEJBQTBCLFNBQVM7QUFDbkUsbUJBQU87QUFBQTtBQUFBO0FBSVgsMkNBQW1DLGlCQUFnQixNQUFNLFdBQVc7QUFDbEU7QUFDRSxnQkFBSSxXQUFXLGdCQUFlO0FBRTlCLGdCQUFJLENBQUMsVUFBVTtBQUNiLG9CQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGdCQUFJLFdBQVc7QUFJYixrQkFBSSxnQkFBZ0Isb0JBQW9CLGlCQUFnQixNQUFNO0FBQzlELHVCQUFTLDRDQUE0QztBQUdyRCxrQkFBSSwyQkFBMkI7QUFDL0Isa0JBQUksb0JBQW9CO0FBRXhCLG1CQUFLLG9CQUFvQixlQUFlO0FBQ3hDLG1CQUFLLDJCQUEyQixXQUFXO0FBQUEsbUJBQ3RDO0FBQ0wsa0JBQUksMkJBQTJCO0FBQy9CLG1CQUFLLDJCQUEyQixXQUFXO0FBQUE7QUFBQTtBQUFBO0FBS2pELDRDQUFvQyxPQUFPO0FBQ3pDO0FBR0UsZ0JBQUksQ0FBQyxlQUFlLFVBQVUsTUFBTSxRQUFRLGdCQUFnQjtBQUMxRCxvQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQixnQkFBSSxPQUFPO0FBRVgsZUFBRztBQUNELHNCQUFRLEtBQUs7QUFBQSxxQkFDTjtBQUNILHlCQUFPLEtBQUssVUFBVTtBQUFBLHFCQUVuQixnQkFDSDtBQUNFLHNCQUFJLFlBQVksS0FBSztBQUVyQixzQkFBSSxrQkFBa0IsWUFBWTtBQUNoQywyQkFBTyxLQUFLLFVBQVU7QUFBQTtBQUd4QjtBQUFBO0FBQUE7QUFJTixxQkFBTyxLQUFLO0FBQUEscUJBQ0wsU0FBUztBQUVsQixrQkFBTSxJQUFJLE1BQU07QUFBQTtBQUFBO0FBSXBCLFlBQUksYUFBYTtBQUNqQixZQUFJLGlCQUFpQjtBQUVyQixZQUFJLFlBQVk7QUFDaEIsWUFBSSw4QkFBOEI7QUFDbEMsWUFBSSxzQkFBc0I7QUFDMUIsc0NBQThCLFVBQVU7QUFHdEMsY0FBSSxjQUFjLE1BQU07QUFDdEIsd0JBQVksQ0FBQztBQUFBLGlCQUNSO0FBR0wsc0JBQVUsS0FBSztBQUFBO0FBQUE7QUFHbkIsNENBQW9DLFVBQVU7QUFDNUMsd0NBQThCO0FBQzlCLCtCQUFxQjtBQUFBO0FBRXZCLHNEQUE4QztBQU01QyxjQUFJLDZCQUE2QjtBQUMvQjtBQUFBO0FBQUE7QUFHSixzQ0FBOEI7QUFDNUIsY0FBSSxDQUFDLHVCQUF1QixjQUFjLE1BQU07QUFFOUMsa0NBQXNCO0FBQ3RCLGdCQUFJLElBQUk7QUFDUixnQkFBSSx5QkFBeUI7QUFFN0IsZ0JBQUk7QUFDRixrQkFBSSxTQUFTO0FBQ2Isa0JBQUksUUFBUTtBQUdaLHVDQUF5QjtBQUV6QixxQkFBTyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQzVCLG9CQUFJLFdBQVcsTUFBTTtBQUVyQixtQkFBRztBQUNELDZCQUFXLFNBQVM7QUFBQSx5QkFDYixhQUFhO0FBQUE7QUFHeEIsMEJBQVk7QUFDWiw0Q0FBOEI7QUFBQSxxQkFDdkIsUUFBUDtBQUVBLGtCQUFJLGNBQWMsTUFBTTtBQUN0Qiw0QkFBWSxVQUFVLE1BQU0sSUFBSTtBQUFBO0FBSWxDLCtCQUFpQixtQkFBbUI7QUFDcEMsb0JBQU07QUFBQSxzQkFDTjtBQUNBLHVDQUF5QjtBQUN6QixvQ0FBc0I7QUFBQTtBQUFBO0FBSTFCLGlCQUFPO0FBQUE7QUFHVCxZQUFJLDRCQUE0QixxQkFBcUI7QUFDckQsWUFBSSxlQUFlO0FBQ25CLDRDQUFvQztBQUNsQyxpQkFBTywwQkFBMEI7QUFBQTtBQUduQyxZQUFJLDBCQUEwQjtBQUFBLFVBQzVCLCtCQUErQixTQUFVLE9BQU8sVUFBVTtBQUFBO0FBQUEsVUFDMUQscUNBQXFDLFdBQVk7QUFBQTtBQUFBLFVBQ2pELDRCQUE0QixTQUFVLE9BQU8sVUFBVTtBQUFBO0FBQUEsVUFDdkQsMkJBQTJCLFdBQVk7QUFBQTtBQUFBLFVBQ3ZDLHdCQUF3QixXQUFZO0FBQUE7QUFBQTtBQUd0QztBQUNFLGNBQUksaUJBQWlCLFNBQVUsT0FBTztBQUNwQyxnQkFBSSxrQkFBa0I7QUFDdEIsZ0JBQUksT0FBTztBQUVYLG1CQUFPLFNBQVMsTUFBTTtBQUNwQixrQkFBSSxLQUFLLE9BQU8sa0JBQWtCO0FBQ2hDLGtDQUFrQjtBQUFBO0FBR3BCLHFCQUFPLEtBQUs7QUFBQTtBQUdkLG1CQUFPO0FBQUE7QUFHVCxjQUFJLG9CQUFvQixTQUFVLE1BQUs7QUFDckMsZ0JBQUksUUFBUTtBQUNaLGlCQUFJLFFBQVEsU0FBVSxPQUFPO0FBQzNCLG9CQUFNLEtBQUs7QUFBQTtBQUViLG1CQUFPLE1BQU0sT0FBTyxLQUFLO0FBQUE7QUFHM0IsY0FBSSxvQ0FBb0M7QUFDeEMsY0FBSSwyQ0FBMkM7QUFDL0MsY0FBSSwyQ0FBMkM7QUFDL0MsY0FBSSxrREFBa0Q7QUFDdEQsY0FBSSxxQ0FBcUM7QUFDekMsY0FBSSw0Q0FBNEM7QUFFaEQsY0FBSSwrQkFBK0IsSUFBSTtBQUV2QyxrQ0FBd0IsZ0NBQWdDLFNBQVUsT0FBTyxVQUFVO0FBRWpGLGdCQUFJLDZCQUE2QixJQUFJLE1BQU0sT0FBTztBQUNoRDtBQUFBO0FBR0YsZ0JBQUksT0FBTyxTQUFTLHVCQUF1QixjQUMzQyxTQUFTLG1CQUFtQixpQ0FBaUMsTUFBTTtBQUNqRSxnREFBa0MsS0FBSztBQUFBO0FBR3pDLGdCQUFJLE1BQU0sT0FBTyxvQkFBb0IsT0FBTyxTQUFTLDhCQUE4QixZQUFZO0FBQzdGLHVEQUF5QyxLQUFLO0FBQUE7QUFHaEQsZ0JBQUksT0FBTyxTQUFTLDhCQUE4QixjQUFjLFNBQVMsMEJBQTBCLGlDQUFpQyxNQUFNO0FBQ3hJLHVEQUF5QyxLQUFLO0FBQUE7QUFHaEQsZ0JBQUksTUFBTSxPQUFPLG9CQUFvQixPQUFPLFNBQVMscUNBQXFDLFlBQVk7QUFDcEcsOERBQWdELEtBQUs7QUFBQTtBQUd2RCxnQkFBSSxPQUFPLFNBQVMsd0JBQXdCLGNBQWMsU0FBUyxvQkFBb0IsaUNBQWlDLE1BQU07QUFDNUgsaURBQW1DLEtBQUs7QUFBQTtBQUcxQyxnQkFBSSxNQUFNLE9BQU8sb0JBQW9CLE9BQU8sU0FBUywrQkFBK0IsWUFBWTtBQUM5Rix3REFBMEMsS0FBSztBQUFBO0FBQUE7QUFJbkQsa0NBQXdCLHNDQUFzQyxXQUFZO0FBRXhFLGdCQUFJLGdDQUFnQyxJQUFJO0FBRXhDLGdCQUFJLGtDQUFrQyxTQUFTLEdBQUc7QUFDaEQsZ0RBQWtDLFFBQVEsU0FBVSxPQUFPO0FBQ3pELDhDQUE4QixJQUFJLDBCQUEwQixVQUFVO0FBQ3RFLDZDQUE2QixJQUFJLE1BQU07QUFBQTtBQUV6QyxrREFBb0M7QUFBQTtBQUd0QyxnQkFBSSx1Q0FBdUMsSUFBSTtBQUUvQyxnQkFBSSx5Q0FBeUMsU0FBUyxHQUFHO0FBQ3ZELHVEQUF5QyxRQUFRLFNBQVUsT0FBTztBQUNoRSxxREFBcUMsSUFBSSwwQkFBMEIsVUFBVTtBQUM3RSw2Q0FBNkIsSUFBSSxNQUFNO0FBQUE7QUFFekMseURBQTJDO0FBQUE7QUFHN0MsZ0JBQUksdUNBQXVDLElBQUk7QUFFL0MsZ0JBQUkseUNBQXlDLFNBQVMsR0FBRztBQUN2RCx1REFBeUMsUUFBUSxTQUFVLE9BQU87QUFDaEUscURBQXFDLElBQUksMEJBQTBCLFVBQVU7QUFDN0UsNkNBQTZCLElBQUksTUFBTTtBQUFBO0FBRXpDLHlEQUEyQztBQUFBO0FBRzdDLGdCQUFJLDhDQUE4QyxJQUFJO0FBRXRELGdCQUFJLGdEQUFnRCxTQUFTLEdBQUc7QUFDOUQsOERBQWdELFFBQVEsU0FBVSxPQUFPO0FBQ3ZFLDREQUE0QyxJQUFJLDBCQUEwQixVQUFVO0FBQ3BGLDZDQUE2QixJQUFJLE1BQU07QUFBQTtBQUV6QyxnRUFBa0Q7QUFBQTtBQUdwRCxnQkFBSSxpQ0FBaUMsSUFBSTtBQUV6QyxnQkFBSSxtQ0FBbUMsU0FBUyxHQUFHO0FBQ2pELGlEQUFtQyxRQUFRLFNBQVUsT0FBTztBQUMxRCwrQ0FBK0IsSUFBSSwwQkFBMEIsVUFBVTtBQUN2RSw2Q0FBNkIsSUFBSSxNQUFNO0FBQUE7QUFFekMsbURBQXFDO0FBQUE7QUFHdkMsZ0JBQUksd0NBQXdDLElBQUk7QUFFaEQsZ0JBQUksMENBQTBDLFNBQVMsR0FBRztBQUN4RCx3REFBMEMsUUFBUSxTQUFVLE9BQU87QUFDakUsc0RBQXNDLElBQUksMEJBQTBCLFVBQVU7QUFDOUUsNkNBQTZCLElBQUksTUFBTTtBQUFBO0FBRXpDLDBEQUE0QztBQUFBO0FBSzlDLGdCQUFJLHFDQUFxQyxPQUFPLEdBQUc7QUFDakQsa0JBQUksY0FBYyxrQkFBa0I7QUFFcEMsb0JBQU0sOFRBQTZVO0FBQUE7QUFHclYsZ0JBQUksNENBQTRDLE9BQU8sR0FBRztBQUN4RCxrQkFBSSxlQUFlLGtCQUFrQjtBQUVyQyxvQkFBTSxpZkFBb2hCO0FBQUE7QUFHNWhCLGdCQUFJLHNDQUFzQyxPQUFPLEdBQUc7QUFDbEQsa0JBQUksZ0JBQWdCLGtCQUFrQjtBQUV0QyxvQkFBTSxrU0FBc1Q7QUFBQTtBQUc5VCxnQkFBSSw4QkFBOEIsT0FBTyxHQUFHO0FBQzFDLGtCQUFJLGdCQUFnQixrQkFBa0I7QUFFdEMsbUJBQUssb2tCQUF1bUI7QUFBQTtBQUc5bUIsZ0JBQUkscUNBQXFDLE9BQU8sR0FBRztBQUNqRCxrQkFBSSxnQkFBZ0Isa0JBQWtCO0FBRXRDLG1CQUFLLHF3QkFBdXpCO0FBQUE7QUFHOXpCLGdCQUFJLCtCQUErQixPQUFPLEdBQUc7QUFDM0Msa0JBQUksZ0JBQWdCLGtCQUFrQjtBQUV0QyxtQkFBSywwaUJBQTZrQjtBQUFBO0FBQUE7QUFJdGxCLGNBQUksOEJBQThCLElBQUk7QUFFdEMsY0FBSSw0QkFBNEIsSUFBSTtBQUVwQyxrQ0FBd0IsNkJBQTZCLFNBQVUsT0FBTyxVQUFVO0FBQzlFLGdCQUFJLGFBQWEsZUFBZTtBQUVoQyxnQkFBSSxlQUFlLE1BQU07QUFDdkIsb0JBQU07QUFFTjtBQUFBO0FBSUYsZ0JBQUksMEJBQTBCLElBQUksTUFBTSxPQUFPO0FBQzdDO0FBQUE7QUFHRixnQkFBSSxrQkFBa0IsNEJBQTRCLElBQUk7QUFFdEQsZ0JBQUksTUFBTSxLQUFLLGdCQUFnQixRQUFRLE1BQU0sS0FBSyxxQkFBcUIsUUFBUSxhQUFhLFFBQVEsT0FBTyxTQUFTLG9CQUFvQixZQUFZO0FBQ2xKLGtCQUFJLG9CQUFvQixRQUFXO0FBQ2pDLGtDQUFrQjtBQUNsQiw0Q0FBNEIsSUFBSSxZQUFZO0FBQUE7QUFHOUMsOEJBQWdCLEtBQUs7QUFBQTtBQUFBO0FBSXpCLGtDQUF3Qiw0QkFBNEIsV0FBWTtBQUM5RCx3Q0FBNEIsUUFBUSxTQUFVLFlBQVksWUFBWTtBQUNwRSxrQkFBSSxXQUFXLFdBQVcsR0FBRztBQUMzQjtBQUFBO0FBR0Ysa0JBQUksYUFBYSxXQUFXO0FBQzVCLGtCQUFJLGNBQWMsSUFBSTtBQUN0Qix5QkFBVyxRQUFRLFNBQVUsT0FBTztBQUNsQyw0QkFBWSxJQUFJLDBCQUEwQixVQUFVO0FBQ3BELDBDQUEwQixJQUFJLE1BQU07QUFBQTtBQUV0QyxrQkFBSSxjQUFjLGtCQUFrQjtBQUVwQyxrQkFBSTtBQUNGLGdDQUFnQjtBQUVoQixzQkFBTSxvVEFBd1U7QUFBQSx3QkFDOVU7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUtOLGtDQUF3Qix5QkFBeUIsV0FBWTtBQUMzRCxnREFBb0M7QUFDcEMsdURBQTJDO0FBQzNDLHVEQUEyQztBQUMzQyw4REFBa0Q7QUFDbEQsaURBQXFDO0FBQ3JDLHdEQUE0QztBQUM1QywwQ0FBOEIsSUFBSTtBQUFBO0FBQUE7QUFJdEMscUNBQTZCLFdBQVcsV0FBVztBQUNqRCxjQUFJLGFBQWEsVUFBVSxjQUFjO0FBRXZDLGdCQUFJLFFBQVEsT0FBTyxJQUFJO0FBQ3ZCLGdCQUFJLGVBQWUsVUFBVTtBQUU3QixxQkFBUyxZQUFZLGNBQWM7QUFDakMsa0JBQUksTUFBTSxjQUFjLFFBQVc7QUFDakMsc0JBQU0sWUFBWSxhQUFhO0FBQUE7QUFBQTtBQUluQyxtQkFBTztBQUFBO0FBR1QsaUJBQU87QUFBQTtBQUdULFlBQUksY0FBYyxhQUFhO0FBQy9CLFlBQUk7QUFFSjtBQUVFLDBCQUFnQjtBQUFBO0FBR2xCLFlBQUksMEJBQTBCO0FBQzlCLFlBQUksd0JBQXdCO0FBQzVCLFlBQUksMkJBQTJCO0FBQy9CLFlBQUksK0JBQStCO0FBQ25DLDRDQUFvQztBQUdsQyxvQ0FBMEI7QUFDMUIsa0NBQXdCO0FBQ3hCLHFDQUEyQjtBQUUzQjtBQUNFLDJDQUErQjtBQUFBO0FBQUE7QUFHbkMsbURBQTJDO0FBQ3pDO0FBQ0UsMkNBQStCO0FBQUE7QUFBQTtBQUduQyxrREFBMEM7QUFDeEM7QUFDRSwyQ0FBK0I7QUFBQTtBQUFBO0FBR25DLDhCQUFzQixlQUFlLFNBQVMsV0FBVztBQUN2RDtBQUNFLGlCQUFLLGFBQWEsUUFBUSxlQUFlO0FBQ3pDLG9CQUFRLGdCQUFnQjtBQUV4QjtBQUNFLGtCQUFJLFFBQVEscUJBQXFCLFVBQWEsUUFBUSxxQkFBcUIsUUFBUSxRQUFRLHFCQUFxQixlQUFlO0FBQzdILHNCQUFNO0FBQUE7QUFHUixzQkFBUSxtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFJakMsNkJBQXFCLFNBQVMsZUFBZTtBQUMzQyxjQUFJLGVBQWUsWUFBWTtBQUMvQixjQUFJLGFBQWE7QUFFakI7QUFDRTtBQUNFLHNCQUFRLGdCQUFnQjtBQUFBO0FBQUE7QUFBQTtBQUk5QixpREFBeUMsUUFBUSxjQUFhLGlCQUFpQjtBQUU3RSxjQUFJLE9BQU87QUFFWCxpQkFBTyxTQUFTLE1BQU07QUFDcEIsZ0JBQUksWUFBWSxLQUFLO0FBRXJCLGdCQUFJLENBQUMsZ0JBQWdCLEtBQUssWUFBWSxlQUFjO0FBQ2xELG1CQUFLLGFBQWEsV0FBVyxLQUFLLFlBQVk7QUFFOUMsa0JBQUksY0FBYyxNQUFNO0FBQ3RCLDBCQUFVLGFBQWEsV0FBVyxVQUFVLFlBQVk7QUFBQTtBQUFBLHVCQUVqRCxjQUFjLFFBQVEsQ0FBQyxnQkFBZ0IsVUFBVSxZQUFZLGVBQWM7QUFDcEYsd0JBQVUsYUFBYSxXQUFXLFVBQVUsWUFBWTtBQUFBO0FBRzFELGdCQUFJLFNBQVMsaUJBQWlCO0FBQzVCO0FBQUE7QUFHRixtQkFBTyxLQUFLO0FBQUE7QUFHZDtBQUNFLGdCQUFJLFNBQVMsaUJBQWlCO0FBQzVCLG9CQUFNO0FBQUE7QUFBQTtBQUFBO0FBSVosd0NBQWdDLGlCQUFnQixTQUFTLGNBQWE7QUFDcEU7QUFDRSx5Q0FBNkIsaUJBQWdCLFNBQVM7QUFBQTtBQUFBO0FBSTFELDhDQUFzQyxpQkFBZ0IsU0FBUyxjQUFhO0FBRTFFLGNBQUksUUFBUSxnQkFBZTtBQUUzQixjQUFJLFVBQVUsTUFBTTtBQUVsQixrQkFBTSxTQUFTO0FBQUE7QUFHakIsaUJBQU8sVUFBVSxNQUFNO0FBQ3JCLGdCQUFJLFlBQVk7QUFFaEIsZ0JBQUksT0FBTyxNQUFNO0FBRWpCLGdCQUFJLFNBQVMsTUFBTTtBQUNqQiwwQkFBWSxNQUFNO0FBQ2xCLGtCQUFJLGFBQWEsS0FBSztBQUV0QixxQkFBTyxlQUFlLE1BQU07QUFFMUIsb0JBQUksV0FBVyxZQUFZLFNBQVM7QUFFbEMsc0JBQUksTUFBTSxRQUFRLGdCQUFnQjtBQUVoQyx3QkFBSSxPQUFPLGtCQUFrQjtBQUM3Qix3QkFBSSxTQUFTLGFBQWEsYUFBYTtBQUN2QywyQkFBTyxNQUFNO0FBTWIsd0JBQUksY0FBYyxNQUFNO0FBRXhCLHdCQUFJLGdCQUFnQjtBQUFNO0FBQUEseUJBQU87QUFDL0IsMEJBQUksY0FBYyxZQUFZO0FBQzlCLDBCQUFJLFVBQVUsWUFBWTtBQUUxQiwwQkFBSSxZQUFZLE1BQU07QUFFcEIsK0JBQU8sT0FBTztBQUFBLDZCQUNUO0FBQ0wsK0JBQU8sT0FBTyxRQUFRO0FBQ3RCLGdDQUFRLE9BQU87QUFBQTtBQUdqQixrQ0FBWSxVQUFVO0FBQUE7QUFBQTtBQUkxQix3QkFBTSxRQUFRLFdBQVcsTUFBTSxPQUFPO0FBQ3RDLHNCQUFJLFlBQVksTUFBTTtBQUV0QixzQkFBSSxjQUFjLE1BQU07QUFDdEIsOEJBQVUsUUFBUSxXQUFXLFVBQVUsT0FBTztBQUFBO0FBR2hELGtEQUFnQyxNQUFNLFFBQVEsY0FBYTtBQUUzRCx1QkFBSyxRQUFRLFdBQVcsS0FBSyxPQUFPO0FBR3BDO0FBQUE7QUFHRiw2QkFBYSxXQUFXO0FBQUE7QUFBQSx1QkFFakIsTUFBTSxRQUFRLGlCQUFpQjtBQUV4QywwQkFBWSxNQUFNLFNBQVMsZ0JBQWUsT0FBTyxPQUFPLE1BQU07QUFBQSx1QkFDckQsTUFBTSxRQUFRLG9CQUFvQjtBQUkzQyxrQkFBSSxpQkFBaUIsTUFBTTtBQUUzQixrQkFBSSxtQkFBbUIsTUFBTTtBQUMzQixzQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQiw2QkFBZSxRQUFRLFdBQVcsZUFBZSxPQUFPO0FBQ3hELGtCQUFJLGFBQWEsZUFBZTtBQUVoQyxrQkFBSSxlQUFlLE1BQU07QUFDdkIsMkJBQVcsUUFBUSxXQUFXLFdBQVcsT0FBTztBQUFBO0FBT2xELDhDQUFnQyxnQkFBZ0IsY0FBYTtBQUM3RCwwQkFBWSxNQUFNO0FBQUEsbUJBQ2I7QUFFTCwwQkFBWSxNQUFNO0FBQUE7QUFHcEIsZ0JBQUksY0FBYyxNQUFNO0FBRXRCLHdCQUFVLFNBQVM7QUFBQSxtQkFDZDtBQUVMLDBCQUFZO0FBRVoscUJBQU8sY0FBYyxNQUFNO0FBQ3pCLG9CQUFJLGNBQWMsaUJBQWdCO0FBRWhDLDhCQUFZO0FBQ1o7QUFBQTtBQUdGLG9CQUFJLFVBQVUsVUFBVTtBQUV4QixvQkFBSSxZQUFZLE1BQU07QUFFcEIsMEJBQVEsU0FBUyxVQUFVO0FBQzNCLDhCQUFZO0FBQ1o7QUFBQTtBQUlGLDRCQUFZLFVBQVU7QUFBQTtBQUFBO0FBSTFCLG9CQUFRO0FBQUE7QUFBQTtBQUdaLHNDQUE4QixpQkFBZ0IsY0FBYTtBQUN6RCxvQ0FBMEI7QUFDMUIsa0NBQXdCO0FBQ3hCLHFDQUEyQjtBQUMzQixjQUFJLGVBQWUsZ0JBQWU7QUFFbEMsY0FBSSxpQkFBaUIsTUFBTTtBQUN6QjtBQUNFLGtCQUFJLGVBQWUsYUFBYTtBQUVoQyxrQkFBSSxpQkFBaUIsTUFBTTtBQUN6QixvQkFBSSxpQkFBaUIsYUFBYSxPQUFPLGVBQWM7QUFFckQ7QUFBQTtBQUlGLDZCQUFhLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtwQyw2QkFBcUIsU0FBUztBQUM1QjtBQUdFLGdCQUFJLDhCQUE4QjtBQUNoQyxvQkFBTTtBQUFBO0FBQUE7QUFJVixjQUFJLFFBQVMsUUFBUTtBQUVyQixjQUFJLDZCQUE2QjtBQUFTO0FBQUEsZUFBTztBQUMvQyxnQkFBSSxjQUFjO0FBQUEsY0FDaEI7QUFBQSxjQUNBLGVBQWU7QUFBQSxjQUNmLE1BQU07QUFBQTtBQUdSLGdCQUFJLDBCQUEwQixNQUFNO0FBQ2xDLGtCQUFJLDRCQUE0QixNQUFNO0FBQ3BDLHNCQUFNLElBQUksTUFBTTtBQUFBO0FBSWxCLHNDQUF3QjtBQUN4QixzQ0FBd0IsZUFBZTtBQUFBLGdCQUNyQyxPQUFPO0FBQUEsZ0JBQ1AsY0FBYztBQUFBO0FBQUEsbUJBRVg7QUFFTCxzQ0FBd0Isc0JBQXNCLE9BQU87QUFBQTtBQUFBO0FBSXpELGlCQUFPO0FBQUE7QUFPVCxZQUFJLG9CQUFvQjtBQUN4QixzQ0FBOEIsT0FBTztBQUNuQyxjQUFJLHNCQUFzQixNQUFNO0FBQzlCLGdDQUFvQixDQUFDO0FBQUEsaUJBQ2hCO0FBQ0wsOEJBQWtCLEtBQUs7QUFBQTtBQUFBO0FBRzNCLHlDQUFpQztBQUMvQixpQkFBTyxzQkFBc0I7QUFBQTtBQUUvQiw2Q0FBcUM7QUFNbkMsY0FBSSxzQkFBc0IsTUFBTTtBQUM5QixxQkFBUyxJQUFJLEdBQUcsSUFBSSxrQkFBa0IsUUFBUSxLQUFLO0FBQ2pELGtCQUFJLFFBQVEsa0JBQWtCO0FBQzlCLGtCQUFJLHdCQUF3QixNQUFNO0FBRWxDLGtCQUFJLDBCQUEwQixNQUFNO0FBQ2xDLHNCQUFNLGNBQWM7QUFDcEIsb0JBQUkseUJBQXlCLHNCQUFzQjtBQUNuRCxvQkFBSSxvQkFBb0IsTUFBTTtBQUU5QixvQkFBSSxzQkFBc0IsTUFBTTtBQUM5QixzQkFBSSxxQkFBcUIsa0JBQWtCO0FBQzNDLG9DQUFrQixPQUFPO0FBQ3pCLHdDQUFzQixPQUFPO0FBQUE7QUFHL0Isc0JBQU0sVUFBVTtBQUFBO0FBQUE7QUFJcEIsZ0NBQW9CO0FBQUE7QUFBQTtBQUl4QixZQUFJLGNBQWM7QUFDbEIsWUFBSSxlQUFlO0FBQ25CLFlBQUksY0FBYztBQUNsQixZQUFJLGdCQUFnQjtBQUlwQixZQUFJLGlCQUFpQjtBQUNyQixZQUFJO0FBQ0osWUFBSTtBQUVKO0FBQ0Usc0NBQTRCO0FBQzVCLHFDQUEyQjtBQUFBO0FBRzdCLHVDQUErQixPQUFPO0FBQ3BDLGNBQUksUUFBUTtBQUFBLFlBQ1YsV0FBVyxNQUFNO0FBQUEsWUFDakIsaUJBQWlCO0FBQUEsWUFDakIsZ0JBQWdCO0FBQUEsWUFDaEIsUUFBUTtBQUFBLGNBQ04sU0FBUztBQUFBLGNBQ1QsYUFBYTtBQUFBLGNBQ2IsT0FBTztBQUFBO0FBQUEsWUFFVCxTQUFTO0FBQUE7QUFFWCxnQkFBTSxjQUFjO0FBQUE7QUFFdEIsa0NBQTBCLFVBQVMsaUJBQWdCO0FBRWpELGNBQUksUUFBUSxnQkFBZTtBQUMzQixjQUFJLGVBQWUsU0FBUTtBQUUzQixjQUFJLFVBQVUsY0FBYztBQUMxQixnQkFBSSxRQUFRO0FBQUEsY0FDVixXQUFXLGFBQWE7QUFBQSxjQUN4QixpQkFBaUIsYUFBYTtBQUFBLGNBQzlCLGdCQUFnQixhQUFhO0FBQUEsY0FDN0IsUUFBUSxhQUFhO0FBQUEsY0FDckIsU0FBUyxhQUFhO0FBQUE7QUFFeEIsNEJBQWUsY0FBYztBQUFBO0FBQUE7QUFHakMsOEJBQXNCLFdBQVcsTUFBTTtBQUNyQyxjQUFJLFNBQVM7QUFBQSxZQUNYO0FBQUEsWUFDQTtBQUFBLFlBQ0EsS0FBSztBQUFBLFlBQ0wsU0FBUztBQUFBLFlBQ1QsVUFBVTtBQUFBLFlBQ1YsTUFBTTtBQUFBO0FBRVIsaUJBQU87QUFBQTtBQUVULCtCQUF1QixPQUFPLFFBQVEsTUFBTTtBQUMxQyxjQUFJLGNBQWMsTUFBTTtBQUV4QixjQUFJLGdCQUFnQixNQUFNO0FBRXhCO0FBQUE7QUFHRixjQUFJLGNBQWMsWUFBWTtBQUU5QixjQUFJLG9CQUFvQixRQUFRO0FBQzlCLGdCQUFJLGNBQWMsWUFBWTtBQUU5QixnQkFBSSxnQkFBZ0IsTUFBTTtBQUV4QixxQkFBTyxPQUFPO0FBR2QsbUNBQXFCO0FBQUEsbUJBQ2hCO0FBQ0wscUJBQU8sT0FBTyxZQUFZO0FBQzFCLDBCQUFZLE9BQU87QUFBQTtBQUdyQix3QkFBWSxjQUFjO0FBQUEsaUJBQ3JCO0FBQ0wsZ0JBQUksVUFBVSxZQUFZO0FBRTFCLGdCQUFJLFlBQVksTUFBTTtBQUVwQixxQkFBTyxPQUFPO0FBQUEsbUJBQ1Q7QUFDTCxxQkFBTyxPQUFPLFFBQVE7QUFDdEIsc0JBQVEsT0FBTztBQUFBO0FBR2pCLHdCQUFZLFVBQVU7QUFBQTtBQUd4QjtBQUNFLGdCQUFJLDZCQUE2QixlQUFlLENBQUMsMkJBQTJCO0FBQzFFLG9CQUFNO0FBRU4sMENBQTRCO0FBQUE7QUFBQTtBQUFBO0FBSWxDLHFDQUE2QixPQUFNLE9BQU8sTUFBTTtBQUM5QyxjQUFJLGNBQWMsTUFBTTtBQUV4QixjQUFJLGdCQUFnQixNQUFNO0FBRXhCO0FBQUE7QUFHRixjQUFJLGNBQWMsWUFBWTtBQUU5QixjQUFJLGlCQUFpQixPQUFPO0FBQzFCLGdCQUFJLGFBQWEsWUFBWTtBQU03Qix5QkFBYSxlQUFlLFlBQVksTUFBSztBQUU3QyxnQkFBSSxnQkFBZ0IsV0FBVyxZQUFZO0FBQzNDLHdCQUFZLFFBQVE7QUFJcEIsOEJBQWtCLE9BQU07QUFBQTtBQUFBO0FBRzVCLHVDQUErQixpQkFBZ0IsZ0JBQWdCO0FBSTdELGNBQUksUUFBUSxnQkFBZTtBQUUzQixjQUFJLFdBQVUsZ0JBQWU7QUFFN0IsY0FBSSxhQUFZLE1BQU07QUFDcEIsZ0JBQUksZUFBZSxTQUFRO0FBRTNCLGdCQUFJLFVBQVUsY0FBYztBQU8xQixrQkFBSSxXQUFXO0FBQ2Ysa0JBQUksVUFBVTtBQUNkLGtCQUFJLGtCQUFrQixNQUFNO0FBRTVCLGtCQUFJLG9CQUFvQixNQUFNO0FBRTVCLG9CQUFJLFNBQVM7QUFFYixtQkFBRztBQUNELHNCQUFJLFFBQVE7QUFBQSxvQkFDVixXQUFXLE9BQU87QUFBQSxvQkFDbEIsTUFBTSxPQUFPO0FBQUEsb0JBQ2IsS0FBSyxPQUFPO0FBQUEsb0JBQ1osU0FBUyxPQUFPO0FBQUEsb0JBQ2hCLFVBQVUsT0FBTztBQUFBLG9CQUNqQixNQUFNO0FBQUE7QUFHUixzQkFBSSxZQUFZLE1BQU07QUFDcEIsK0JBQVcsVUFBVTtBQUFBLHlCQUNoQjtBQUNMLDRCQUFRLE9BQU87QUFDZiw4QkFBVTtBQUFBO0FBR1osMkJBQVMsT0FBTztBQUFBLHlCQUNULFdBQVc7QUFHcEIsb0JBQUksWUFBWSxNQUFNO0FBQ3BCLDZCQUFXLFVBQVU7QUFBQSx1QkFDaEI7QUFDTCwwQkFBUSxPQUFPO0FBQ2YsNEJBQVU7QUFBQTtBQUFBLHFCQUVQO0FBRUwsMkJBQVcsVUFBVTtBQUFBO0FBR3ZCLHNCQUFRO0FBQUEsZ0JBQ04sV0FBVyxhQUFhO0FBQUEsZ0JBQ3hCLGlCQUFpQjtBQUFBLGdCQUNqQixnQkFBZ0I7QUFBQSxnQkFDaEIsUUFBUSxhQUFhO0FBQUEsZ0JBQ3JCLFNBQVMsYUFBYTtBQUFBO0FBRXhCLDhCQUFlLGNBQWM7QUFDN0I7QUFBQTtBQUFBO0FBS0osY0FBSSxpQkFBaUIsTUFBTTtBQUUzQixjQUFJLG1CQUFtQixNQUFNO0FBQzNCLGtCQUFNLGtCQUFrQjtBQUFBLGlCQUNuQjtBQUNMLDJCQUFlLE9BQU87QUFBQTtBQUd4QixnQkFBTSxpQkFBaUI7QUFBQTtBQUd6QixvQ0FBNEIsaUJBQWdCLE9BQU8sUUFBUSxXQUFXLFdBQVcsVUFBVTtBQUN6RixrQkFBUSxPQUFPO0FBQUEsaUJBQ1IsY0FDSDtBQUNFLGtCQUFJLFVBQVUsT0FBTztBQUVyQixrQkFBSSxPQUFPLFlBQVksWUFBWTtBQUVqQztBQUNFO0FBQUE7QUFHRixvQkFBSSxZQUFZLFFBQVEsS0FBSyxVQUFVLFdBQVc7QUFFbEQ7QUFDRSxzQkFBSyxnQkFBZSxPQUFPLGtCQUFrQjtBQUMzQywrQ0FBMkI7QUFFM0Isd0JBQUk7QUFDRiw4QkFBUSxLQUFLLFVBQVUsV0FBVztBQUFBLDhCQUNsQztBQUNBLGlEQUEyQjtBQUFBO0FBQUE7QUFJL0I7QUFBQTtBQUdGLHVCQUFPO0FBQUE7QUFJVCxxQkFBTztBQUFBO0FBQUEsaUJBR04sZUFDSDtBQUNFLDhCQUFlLFFBQVEsZ0JBQWUsUUFBUSxDQUFDLGdCQUFnQjtBQUFBO0FBQUEsaUJBSTlELGFBQ0g7QUFDRSxrQkFBSSxXQUFXLE9BQU87QUFDdEIsa0JBQUk7QUFFSixrQkFBSSxPQUFPLGFBQWEsWUFBWTtBQUVsQztBQUNFO0FBQUE7QUFHRiwrQkFBZSxTQUFTLEtBQUssVUFBVSxXQUFXO0FBRWxEO0FBQ0Usc0JBQUssZ0JBQWUsT0FBTyxrQkFBa0I7QUFDM0MsK0NBQTJCO0FBRTNCLHdCQUFJO0FBQ0YsK0JBQVMsS0FBSyxVQUFVLFdBQVc7QUFBQSw4QkFDbkM7QUFDQSxpREFBMkI7QUFBQTtBQUFBO0FBSS9CO0FBQUE7QUFBQSxxQkFFRztBQUVMLCtCQUFlO0FBQUE7QUFHakIsa0JBQUksaUJBQWlCLFFBQVEsaUJBQWlCLFFBQVc7QUFFdkQsdUJBQU87QUFBQTtBQUlULHFCQUFPLE9BQU8sSUFBSSxXQUFXO0FBQUE7QUFBQSxpQkFHNUIsYUFDSDtBQUNFLCtCQUFpQjtBQUNqQixxQkFBTztBQUFBO0FBQUE7QUFJYixpQkFBTztBQUFBO0FBR1Qsb0NBQTRCLGlCQUFnQixPQUFPLFVBQVUsY0FBYTtBQUV4RSxjQUFJLFFBQVEsZ0JBQWU7QUFDM0IsMkJBQWlCO0FBRWpCO0FBQ0UsdUNBQTJCLE1BQU07QUFBQTtBQUduQyxjQUFJLGtCQUFrQixNQUFNO0FBQzVCLGNBQUksaUJBQWlCLE1BQU07QUFFM0IsY0FBSSxlQUFlLE1BQU0sT0FBTztBQUVoQyxjQUFJLGlCQUFpQixNQUFNO0FBQ3pCLGtCQUFNLE9BQU8sVUFBVTtBQUd2QixnQkFBSSxvQkFBb0I7QUFDeEIsZ0JBQUkscUJBQXFCLGtCQUFrQjtBQUMzQyw4QkFBa0IsT0FBTztBQUV6QixnQkFBSSxtQkFBbUIsTUFBTTtBQUMzQixnQ0FBa0I7QUFBQSxtQkFDYjtBQUNMLDZCQUFlLE9BQU87QUFBQTtBQUd4Qiw2QkFBaUI7QUFNakIsZ0JBQUksV0FBVSxnQkFBZTtBQUU3QixnQkFBSSxhQUFZLE1BQU07QUFFcEIsa0JBQUksZUFBZSxTQUFRO0FBQzNCLGtCQUFJLHdCQUF3QixhQUFhO0FBRXpDLGtCQUFJLDBCQUEwQixnQkFBZ0I7QUFDNUMsb0JBQUksMEJBQTBCLE1BQU07QUFDbEMsK0JBQWEsa0JBQWtCO0FBQUEsdUJBQzFCO0FBQ0wsd0NBQXNCLE9BQU87QUFBQTtBQUcvQiw2QkFBYSxpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFNcEMsY0FBSSxvQkFBb0IsTUFBTTtBQUU1QixnQkFBSSxXQUFXLE1BQU07QUFHckIsZ0JBQUksV0FBVztBQUNmLGdCQUFJLGVBQWU7QUFDbkIsZ0JBQUkscUJBQXFCO0FBQ3pCLGdCQUFJLG9CQUFvQjtBQUN4QixnQkFBSSxTQUFTO0FBRWIsZUFBRztBQUNELGtCQUFJLGFBQWEsT0FBTztBQUN4QixrQkFBSSxrQkFBa0IsT0FBTztBQUU3QixrQkFBSSxDQUFDLGdCQUFnQixjQUFhLGFBQWE7QUFJN0Msb0JBQUksUUFBUTtBQUFBLGtCQUNWLFdBQVc7QUFBQSxrQkFDWCxNQUFNO0FBQUEsa0JBQ04sS0FBSyxPQUFPO0FBQUEsa0JBQ1osU0FBUyxPQUFPO0FBQUEsa0JBQ2hCLFVBQVUsT0FBTztBQUFBLGtCQUNqQixNQUFNO0FBQUE7QUFHUixvQkFBSSxzQkFBc0IsTUFBTTtBQUM5Qix1Q0FBcUIsb0JBQW9CO0FBQ3pDLGlDQUFlO0FBQUEsdUJBQ1Y7QUFDTCxzQ0FBb0Isa0JBQWtCLE9BQU87QUFBQTtBQUkvQywyQkFBVyxXQUFXLFVBQVU7QUFBQSxxQkFDM0I7QUFFTCxvQkFBSSxzQkFBc0IsTUFBTTtBQUM5QixzQkFBSSxTQUFTO0FBQUEsb0JBQ1gsV0FBVztBQUFBLG9CQUlYLE1BQU07QUFBQSxvQkFDTixLQUFLLE9BQU87QUFBQSxvQkFDWixTQUFTLE9BQU87QUFBQSxvQkFDaEIsVUFBVSxPQUFPO0FBQUEsb0JBQ2pCLE1BQU07QUFBQTtBQUVSLHNDQUFvQixrQkFBa0IsT0FBTztBQUFBO0FBSS9DLDJCQUFXLG1CQUFtQixpQkFBZ0IsT0FBTyxRQUFRLFVBQVUsT0FBTztBQUM5RSxvQkFBSSxXQUFXLE9BQU87QUFFdEIsb0JBQUksYUFBYSxRQUVqQixPQUFPLFNBQVMsUUFBUTtBQUN0QixrQ0FBZSxTQUFTO0FBQ3hCLHNCQUFJLFVBQVUsTUFBTTtBQUVwQixzQkFBSSxZQUFZLE1BQU07QUFDcEIsMEJBQU0sVUFBVSxDQUFDO0FBQUEseUJBQ1o7QUFDTCw0QkFBUSxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBS25CLHVCQUFTLE9BQU87QUFFaEIsa0JBQUksV0FBVyxNQUFNO0FBQ25CLCtCQUFlLE1BQU0sT0FBTztBQUU1QixvQkFBSSxpQkFBaUIsTUFBTTtBQUN6QjtBQUFBLHVCQUNLO0FBR0wsc0JBQUkscUJBQXFCO0FBR3pCLHNCQUFJLHNCQUFzQixtQkFBbUI7QUFDN0MscUNBQW1CLE9BQU87QUFDMUIsMkJBQVM7QUFDVCx3QkFBTSxpQkFBaUI7QUFDdkIsd0JBQU0sT0FBTyxVQUFVO0FBQUE7QUFBQTtBQUFBLHFCQUdwQjtBQUVULGdCQUFJLHNCQUFzQixNQUFNO0FBQzlCLDZCQUFlO0FBQUE7QUFHakIsa0JBQU0sWUFBWTtBQUNsQixrQkFBTSxrQkFBa0I7QUFDeEIsa0JBQU0saUJBQWlCO0FBSXZCLGdCQUFJLGtCQUFrQixNQUFNLE9BQU87QUFFbkMsZ0JBQUksb0JBQW9CLE1BQU07QUFDNUIsa0JBQUksY0FBYztBQUVsQixpQkFBRztBQUNELDJCQUFXLFdBQVcsVUFBVSxZQUFZO0FBQzVDLDhCQUFjLFlBQVk7QUFBQSx1QkFDbkIsZ0JBQWdCO0FBQUEsdUJBQ2hCLG9CQUFvQixNQUFNO0FBR25DLG9CQUFNLE9BQU8sUUFBUTtBQUFBO0FBVXZCLG1DQUF1QjtBQUN2Qiw0QkFBZSxRQUFRO0FBQ3ZCLDRCQUFlLGdCQUFnQjtBQUFBO0FBR2pDO0FBQ0UsdUNBQTJCO0FBQUE7QUFBQTtBQUkvQiw4QkFBc0IsVUFBVSxTQUFTO0FBQ3ZDLGNBQUksT0FBTyxhQUFhLFlBQVk7QUFDbEMsa0JBQU0sSUFBSSxNQUFNLHVFQUF3RSxnQkFBZTtBQUFBO0FBR3pHLG1CQUFTLEtBQUs7QUFBQTtBQUdoQix1REFBK0M7QUFDN0MsMkJBQWlCO0FBQUE7QUFFbkIsc0RBQThDO0FBQzVDLGlCQUFPO0FBQUE7QUFFVCxtQ0FBMkIsY0FBYyxlQUFlLFVBQVU7QUFFaEUsY0FBSSxVQUFVLGNBQWM7QUFDNUIsd0JBQWMsVUFBVTtBQUV4QixjQUFJLFlBQVksTUFBTTtBQUNwQixxQkFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUN2QyxrQkFBSSxTQUFTLFFBQVE7QUFDckIsa0JBQUksV0FBVyxPQUFPO0FBRXRCLGtCQUFJLGFBQWEsTUFBTTtBQUNyQix1QkFBTyxXQUFXO0FBQ2xCLDZCQUFhLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU0vQixZQUFJLHVCQUF1QjtBQUczQixZQUFJLGtCQUFrQixJQUFJLE9BQU0sWUFBWTtBQUM1QyxZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFDSixZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFDSixZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFDSixZQUFJO0FBRUo7QUFDRSxvREFBMEMsSUFBSTtBQUM5QywyQ0FBaUMsSUFBSTtBQUNyQyxnRUFBc0QsSUFBSTtBQUMxRCx3REFBOEMsSUFBSTtBQUNsRCxzREFBNEMsSUFBSTtBQUNoRCw4Q0FBb0MsSUFBSTtBQUN4QyxtREFBeUMsSUFBSTtBQUM3Qyw4Q0FBb0MsSUFBSTtBQUN4QyxjQUFJLDJCQUEyQixJQUFJO0FBRW5DLGtDQUF3QixTQUFVLFVBQVUsWUFBWTtBQUN0RCxnQkFBSSxhQUFhLFFBQVEsT0FBTyxhQUFhLFlBQVk7QUFDdkQ7QUFBQTtBQUdGLGdCQUFJLE1BQU0sYUFBYSxNQUFNO0FBRTdCLGdCQUFJLENBQUMseUJBQXlCLElBQUksTUFBTTtBQUN0Qyx1Q0FBeUIsSUFBSTtBQUU3QixvQkFBTSxtR0FBd0csWUFBWTtBQUFBO0FBQUE7QUFJOUgsd0NBQThCLFNBQVUsTUFBTSxjQUFjO0FBQzFELGdCQUFJLGlCQUFpQixRQUFXO0FBQzlCLGtCQUFJLGdCQUFnQix5QkFBeUIsU0FBUztBQUV0RCxrQkFBSSxDQUFDLGtDQUFrQyxJQUFJLGdCQUFnQjtBQUN6RCxrREFBa0MsSUFBSTtBQUV0QyxzQkFBTSxnSEFBcUg7QUFBQTtBQUFBO0FBQUE7QUFVakksaUJBQU8sZUFBZSxzQkFBc0Isd0JBQXdCO0FBQUEsWUFDbEUsWUFBWTtBQUFBLFlBQ1osT0FBTyxXQUFZO0FBQ2pCLG9CQUFNLElBQUksTUFBTTtBQUFBO0FBQUE7QUFHcEIsaUJBQU8sT0FBTztBQUFBO0FBR2hCLDRDQUFvQyxpQkFBZ0IsTUFBTSwwQkFBMEIsV0FBVztBQUM3RixjQUFJLFlBQVksZ0JBQWU7QUFDL0IsY0FBSSxlQUFlLHlCQUF5QixXQUFXO0FBRXZEO0FBQ0UsZ0JBQUssZ0JBQWUsT0FBTyxrQkFBa0I7QUFDM0MseUNBQTJCO0FBRTNCLGtCQUFJO0FBRUYsK0JBQWUseUJBQXlCLFdBQVc7QUFBQSx3QkFDbkQ7QUFDQSwyQ0FBMkI7QUFBQTtBQUFBO0FBSS9CLHdDQUE0QixNQUFNO0FBQUE7QUFJcEMsY0FBSSxnQkFBZ0IsaUJBQWlCLFFBQVEsaUJBQWlCLFNBQVksWUFBWSxPQUFPLElBQUksV0FBVztBQUM1RywwQkFBZSxnQkFBZ0I7QUFHL0IsY0FBSSxnQkFBZSxVQUFVLFNBQVM7QUFFcEMsZ0JBQUksY0FBYyxnQkFBZTtBQUNqQyx3QkFBWSxZQUFZO0FBQUE7QUFBQTtBQUk1QixZQUFJLHdCQUF3QjtBQUFBLFVBQzFCO0FBQUEsVUFDQSxpQkFBaUIsU0FBVSxNQUFNLFNBQVMsVUFBVTtBQUNsRCxnQkFBSSxRQUFRLEtBQUk7QUFDaEIsZ0JBQUksWUFBWTtBQUNoQixnQkFBSSxPQUFPLGtCQUFrQjtBQUM3QixnQkFBSSxTQUFTLGFBQWEsV0FBVztBQUNyQyxtQkFBTyxVQUFVO0FBRWpCLGdCQUFJLGFBQWEsVUFBYSxhQUFhLE1BQU07QUFDL0M7QUFDRSxzQ0FBc0IsVUFBVTtBQUFBO0FBR2xDLHFCQUFPLFdBQVc7QUFBQTtBQUdwQiwwQkFBYyxPQUFPO0FBQ3JCLGdCQUFJLFFBQU8sc0JBQXNCLE9BQU8sTUFBTTtBQUU5QyxnQkFBSSxVQUFTLE1BQU07QUFDakIsa0NBQW9CLE9BQU0sT0FBTztBQUFBO0FBR25DO0FBQ0UsdUNBQXlCLE9BQU87QUFBQTtBQUFBO0FBQUEsVUFHcEMscUJBQXFCLFNBQVUsTUFBTSxTQUFTLFVBQVU7QUFDdEQsZ0JBQUksUUFBUSxLQUFJO0FBQ2hCLGdCQUFJLFlBQVk7QUFDaEIsZ0JBQUksT0FBTyxrQkFBa0I7QUFDN0IsZ0JBQUksU0FBUyxhQUFhLFdBQVc7QUFDckMsbUJBQU8sTUFBTTtBQUNiLG1CQUFPLFVBQVU7QUFFakIsZ0JBQUksYUFBYSxVQUFhLGFBQWEsTUFBTTtBQUMvQztBQUNFLHNDQUFzQixVQUFVO0FBQUE7QUFHbEMscUJBQU8sV0FBVztBQUFBO0FBR3BCLDBCQUFjLE9BQU87QUFDckIsZ0JBQUksUUFBTyxzQkFBc0IsT0FBTyxNQUFNO0FBRTlDLGdCQUFJLFVBQVMsTUFBTTtBQUNqQixrQ0FBb0IsT0FBTSxPQUFPO0FBQUE7QUFHbkM7QUFDRSx1Q0FBeUIsT0FBTztBQUFBO0FBQUE7QUFBQSxVQUdwQyxvQkFBb0IsU0FBVSxNQUFNLFVBQVU7QUFDNUMsZ0JBQUksUUFBUSxLQUFJO0FBQ2hCLGdCQUFJLFlBQVk7QUFDaEIsZ0JBQUksT0FBTyxrQkFBa0I7QUFDN0IsZ0JBQUksU0FBUyxhQUFhLFdBQVc7QUFDckMsbUJBQU8sTUFBTTtBQUViLGdCQUFJLGFBQWEsVUFBYSxhQUFhLE1BQU07QUFDL0M7QUFDRSxzQ0FBc0IsVUFBVTtBQUFBO0FBR2xDLHFCQUFPLFdBQVc7QUFBQTtBQUdwQiwwQkFBYyxPQUFPO0FBQ3JCLGdCQUFJLFFBQU8sc0JBQXNCLE9BQU8sTUFBTTtBQUU5QyxnQkFBSSxVQUFTLE1BQU07QUFDakIsa0NBQW9CLE9BQU0sT0FBTztBQUFBO0FBR25DO0FBQ0UsdUNBQXlCLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFLdEMsNENBQW9DLGlCQUFnQixNQUFNLFVBQVUsVUFBVSxVQUFVLFVBQVUsYUFBYTtBQUM3RyxjQUFJLFdBQVcsZ0JBQWU7QUFFOUIsY0FBSSxPQUFPLFNBQVMsMEJBQTBCLFlBQVk7QUFDeEQsZ0JBQUksZUFBZSxTQUFTLHNCQUFzQixVQUFVLFVBQVU7QUFFdEU7QUFDRSxrQkFBSyxnQkFBZSxPQUFPLGtCQUFrQjtBQUMzQywyQ0FBMkI7QUFFM0Isb0JBQUk7QUFFRixpQ0FBZSxTQUFTLHNCQUFzQixVQUFVLFVBQVU7QUFBQSwwQkFDbEU7QUFDQSw2Q0FBMkI7QUFBQTtBQUFBO0FBSS9CLGtCQUFJLGlCQUFpQixRQUFXO0FBQzlCLHNCQUFNLGlIQUFzSCx5QkFBeUIsU0FBUztBQUFBO0FBQUE7QUFJbEssbUJBQU87QUFBQTtBQUdULGNBQUksS0FBSyxhQUFhLEtBQUssVUFBVSxzQkFBc0I7QUFDekQsbUJBQU8sQ0FBQyxhQUFhLFVBQVUsYUFBYSxDQUFDLGFBQWEsVUFBVTtBQUFBO0FBR3RFLGlCQUFPO0FBQUE7QUFHVCxvQ0FBNEIsaUJBQWdCLE1BQU0sVUFBVTtBQUMxRCxjQUFJLFdBQVcsZ0JBQWU7QUFFOUI7QUFDRSxnQkFBSSxPQUFPLHlCQUF5QixTQUFTO0FBQzdDLGdCQUFJLGdCQUFnQixTQUFTO0FBRTdCLGdCQUFJLENBQUMsZUFBZTtBQUNsQixrQkFBSSxLQUFLLGFBQWEsT0FBTyxLQUFLLFVBQVUsV0FBVyxZQUFZO0FBQ2pFLHNCQUFNLHFJQUEwSTtBQUFBLHFCQUMzSTtBQUNMLHNCQUFNLG9IQUF5SDtBQUFBO0FBQUE7QUFJbkksZ0JBQUksU0FBUyxtQkFBbUIsQ0FBQyxTQUFTLGdCQUFnQix3QkFBd0IsQ0FBQyxTQUFTLE9BQU87QUFDakcsb0JBQU0scUxBQStMO0FBQUE7QUFHdk0sZ0JBQUksU0FBUyxtQkFBbUIsQ0FBQyxTQUFTLGdCQUFnQixzQkFBc0I7QUFDOUUsb0JBQU0sMExBQW9NO0FBQUE7QUFHNU0sZ0JBQUksU0FBUyxXQUFXO0FBQ3RCLG9CQUFNLDJHQUFnSDtBQUFBO0FBR3hILGdCQUFJLFNBQVMsYUFBYTtBQUN4QixvQkFBTSwrR0FBb0g7QUFBQTtBQUc1SDtBQUNFLGtCQUFJLFNBQVMsY0FBYztBQUN6QixzQkFBTSxpSEFBc0g7QUFBQTtBQUc5SCxrQkFBSSxLQUFLLGVBQWUsS0FBSyxnQkFBZ0IsQ0FBQyx1Q0FBdUMsSUFBSSxPQUFPO0FBQzlGLHVEQUF1QyxJQUFJO0FBRTNDLHNCQUFNLHNIQUEySDtBQUFBO0FBQUE7QUFJckksZ0JBQUksT0FBTyxTQUFTLDBCQUEwQixZQUFZO0FBQ3hELG9CQUFNLCtLQUE4TDtBQUFBO0FBR3RNLGdCQUFJLEtBQUssYUFBYSxLQUFLLFVBQVUsd0JBQXdCLE9BQU8sU0FBUywwQkFBMEIsYUFBYTtBQUNsSCxvQkFBTSxnTUFBME0seUJBQXlCLFNBQVM7QUFBQTtBQUdwUCxnQkFBSSxPQUFPLFNBQVMsd0JBQXdCLFlBQVk7QUFDdEQsb0JBQU0sNkhBQXVJO0FBQUE7QUFHL0ksZ0JBQUksT0FBTyxTQUFTLDZCQUE2QixZQUFZO0FBQzNELG9CQUFNLG9UQUF3VTtBQUFBO0FBR2hWLGdCQUFJLE9BQU8sU0FBUyw4QkFBOEIsWUFBWTtBQUM1RCxvQkFBTSxpR0FBc0c7QUFBQTtBQUc5RyxnQkFBSSxPQUFPLFNBQVMscUNBQXFDLFlBQVk7QUFDbkUsb0JBQU0sK0dBQW9IO0FBQUE7QUFHNUgsZ0JBQUksa0JBQWtCLFNBQVMsVUFBVTtBQUV6QyxnQkFBSSxTQUFTLFVBQVUsVUFBYSxpQkFBaUI7QUFDbkQsb0JBQU0sNEhBQWlJLE1BQU07QUFBQTtBQUcvSSxnQkFBSSxTQUFTLGNBQWM7QUFDekIsb0JBQU0scUpBQTBKLE1BQU07QUFBQTtBQUd4SyxnQkFBSSxPQUFPLFNBQVMsNEJBQTRCLGNBQWMsT0FBTyxTQUFTLHVCQUF1QixjQUFjLENBQUMsb0RBQW9ELElBQUksT0FBTztBQUNqTCxrRUFBb0QsSUFBSTtBQUV4RCxvQkFBTSxrSUFBdUkseUJBQXlCO0FBQUE7QUFHeEssZ0JBQUksT0FBTyxTQUFTLDZCQUE2QixZQUFZO0FBQzNELG9CQUFNLGdJQUFxSTtBQUFBO0FBRzdJLGdCQUFJLE9BQU8sU0FBUyw2QkFBNkIsWUFBWTtBQUMzRCxvQkFBTSxnSUFBcUk7QUFBQTtBQUc3SSxnQkFBSSxPQUFPLEtBQUssNEJBQTRCLFlBQVk7QUFDdEQsb0JBQU0sK0hBQW9JO0FBQUE7QUFHNUksZ0JBQUksU0FBUyxTQUFTO0FBRXRCLGdCQUFJLFVBQVcsUUFBTyxXQUFXLFlBQVksUUFBUSxVQUFVO0FBQzdELG9CQUFNLDhDQUE4QztBQUFBO0FBR3RELGdCQUFJLE9BQU8sU0FBUyxvQkFBb0IsY0FBYyxPQUFPLEtBQUssc0JBQXNCLFVBQVU7QUFDaEcsb0JBQU0sOEZBQW1HO0FBQUE7QUFBQTtBQUFBO0FBSy9HLG9DQUE0QixpQkFBZ0IsVUFBVTtBQUNwRCxtQkFBUyxVQUFVO0FBQ25CLDBCQUFlLFlBQVk7QUFFM0IsY0FBSSxVQUFVO0FBRWQ7QUFDRSxxQkFBUyx5QkFBeUI7QUFBQTtBQUFBO0FBSXRDLHdDQUFnQyxpQkFBZ0IsTUFBTSxPQUFPO0FBQzNELGNBQUksMEJBQTBCO0FBQzlCLGNBQUksa0JBQWtCO0FBQ3RCLGNBQUksVUFBVTtBQUNkLGNBQUksY0FBYyxLQUFLO0FBRXZCO0FBQ0UsZ0JBQUksaUJBQWlCLE1BQU07QUFDekIsa0JBQUksVUFDSixnQkFBZ0IsUUFBUSxnQkFBZ0IsVUFBYSxZQUFZLGFBQWEsc0JBQXNCLFlBQVksYUFBYTtBQUU3SCxrQkFBSSxDQUFDLFdBQVcsQ0FBQyxrQ0FBa0MsSUFBSSxPQUFPO0FBQzVELGtEQUFrQyxJQUFJO0FBQ3RDLG9CQUFJLFdBQVc7QUFFZixvQkFBSSxnQkFBZ0IsUUFBVztBQUM3Qiw2QkFBVztBQUFBLDJCQUNGLE9BQU8sZ0JBQWdCLFVBQVU7QUFDMUMsNkJBQVcsOEJBQThCLE9BQU8sY0FBYztBQUFBLDJCQUNyRCxZQUFZLGFBQWEscUJBQXFCO0FBQ3ZELDZCQUFXO0FBQUEsMkJBQ0YsWUFBWSxhQUFhLFFBQVc7QUFFN0MsNkJBQVc7QUFBQSx1QkFDTjtBQUNMLDZCQUFXLGlEQUFpRCxPQUFPLEtBQUssYUFBYSxLQUFLLFFBQVE7QUFBQTtBQUdwRyxzQkFBTSwwSEFBK0gseUJBQXlCLFNBQVMsYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUsxTCxjQUFJLE9BQU8sZ0JBQWdCLFlBQVksZ0JBQWdCLE1BQU07QUFDM0Qsc0JBQVUsWUFBWTtBQUFBLGlCQUNqQjtBQUNMLDhCQUFrQixtQkFBbUIsaUJBQWdCLE1BQU07QUFDM0QsZ0JBQUksZUFBZSxLQUFLO0FBQ3hCLHNDQUEwQixpQkFBaUIsUUFBUSxpQkFBaUI7QUFDcEUsc0JBQVUsMEJBQTBCLGlCQUFpQixpQkFBZ0IsbUJBQW1CO0FBQUE7QUFHMUYsY0FBSSxXQUFXLElBQUksS0FBSyxPQUFPO0FBRS9CO0FBQ0UsZ0JBQUssZ0JBQWUsT0FBTyxrQkFBa0I7QUFDM0MseUNBQTJCO0FBRTNCLGtCQUFJO0FBQ0YsMkJBQVcsSUFBSSxLQUFLLE9BQU87QUFBQSx3QkFDM0I7QUFDQSwyQ0FBMkI7QUFBQTtBQUFBO0FBQUE7QUFLakMsY0FBSSxRQUFRLGdCQUFlLGdCQUFnQixTQUFTLFVBQVUsUUFBUSxTQUFTLFVBQVUsU0FBWSxTQUFTLFFBQVE7QUFDdEgsNkJBQW1CLGlCQUFnQjtBQUVuQztBQUNFLGdCQUFJLE9BQU8sS0FBSyw2QkFBNkIsY0FBYyxVQUFVLE1BQU07QUFDekUsa0JBQUksZ0JBQWdCLHlCQUF5QixTQUFTO0FBRXRELGtCQUFJLENBQUMsK0JBQStCLElBQUksZ0JBQWdCO0FBQ3RELCtDQUErQixJQUFJO0FBRW5DLHNCQUFNLG1SQUFrUyxlQUFlLFNBQVMsVUFBVSxPQUFPLFNBQVMsYUFBYTtBQUFBO0FBQUE7QUFPM1csZ0JBQUksT0FBTyxLQUFLLDZCQUE2QixjQUFjLE9BQU8sU0FBUyw0QkFBNEIsWUFBWTtBQUNqSCxrQkFBSSxxQkFBcUI7QUFDekIsa0JBQUksNEJBQTRCO0FBQ2hDLGtCQUFJLHNCQUFzQjtBQUUxQixrQkFBSSxPQUFPLFNBQVMsdUJBQXVCLGNBQWMsU0FBUyxtQkFBbUIsaUNBQWlDLE1BQU07QUFDMUgscUNBQXFCO0FBQUEseUJBQ1osT0FBTyxTQUFTLDhCQUE4QixZQUFZO0FBQ25FLHFDQUFxQjtBQUFBO0FBR3ZCLGtCQUFJLE9BQU8sU0FBUyw4QkFBOEIsY0FBYyxTQUFTLDBCQUEwQixpQ0FBaUMsTUFBTTtBQUN4SSw0Q0FBNEI7QUFBQSx5QkFDbkIsT0FBTyxTQUFTLHFDQUFxQyxZQUFZO0FBQzFFLDRDQUE0QjtBQUFBO0FBRzlCLGtCQUFJLE9BQU8sU0FBUyx3QkFBd0IsY0FBYyxTQUFTLG9CQUFvQixpQ0FBaUMsTUFBTTtBQUM1SCxzQ0FBc0I7QUFBQSx5QkFDYixPQUFPLFNBQVMsK0JBQStCLFlBQVk7QUFDcEUsc0NBQXNCO0FBQUE7QUFHeEIsa0JBQUksdUJBQXVCLFFBQVEsOEJBQThCLFFBQVEsd0JBQXdCLE1BQU07QUFDckcsb0JBQUksaUJBQWlCLHlCQUF5QixTQUFTO0FBRXZELG9CQUFJLGFBQWEsT0FBTyxLQUFLLDZCQUE2QixhQUFhLCtCQUErQjtBQUV0RyxvQkFBSSxDQUFDLDRDQUE0QyxJQUFJLGlCQUFpQjtBQUNwRSw4REFBNEMsSUFBSTtBQUVoRCx3QkFBTSxvU0FBbVQsZ0JBQWdCLFlBQVksdUJBQXVCLE9BQU8sU0FBUyxxQkFBcUIsSUFBSSw4QkFBOEIsT0FBTyxTQUFTLDRCQUE0QixJQUFJLHdCQUF3QixPQUFPLFNBQVMsc0JBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRemlCLGNBQUkseUJBQXlCO0FBQzNCLHlCQUFhLGlCQUFnQixpQkFBaUI7QUFBQTtBQUdoRCxpQkFBTztBQUFBO0FBR1Qsd0NBQWdDLGlCQUFnQixVQUFVO0FBQ3hELGNBQUksV0FBVyxTQUFTO0FBRXhCLGNBQUksT0FBTyxTQUFTLHVCQUF1QixZQUFZO0FBQ3JELHFCQUFTO0FBQUE7QUFHWCxjQUFJLE9BQU8sU0FBUyw4QkFBOEIsWUFBWTtBQUM1RCxxQkFBUztBQUFBO0FBR1gsY0FBSSxhQUFhLFNBQVMsT0FBTztBQUMvQjtBQUNFLG9CQUFNLDRJQUFzSiwwQkFBMEIsb0JBQW1CO0FBQUE7QUFHM00sa0NBQXNCLG9CQUFvQixVQUFVLFNBQVMsT0FBTztBQUFBO0FBQUE7QUFJeEUsK0NBQXVDLGlCQUFnQixVQUFVLFVBQVUsYUFBYTtBQUN0RixjQUFJLFdBQVcsU0FBUztBQUV4QixjQUFJLE9BQU8sU0FBUyw4QkFBOEIsWUFBWTtBQUM1RCxxQkFBUywwQkFBMEIsVUFBVTtBQUFBO0FBRy9DLGNBQUksT0FBTyxTQUFTLHFDQUFxQyxZQUFZO0FBQ25FLHFCQUFTLGlDQUFpQyxVQUFVO0FBQUE7QUFHdEQsY0FBSSxTQUFTLFVBQVUsVUFBVTtBQUMvQjtBQUNFLGtCQUFJLGdCQUFnQiwwQkFBMEIsb0JBQW1CO0FBRWpFLGtCQUFJLENBQUMsd0NBQXdDLElBQUksZ0JBQWdCO0FBQy9ELHdEQUF3QyxJQUFJO0FBRTVDLHNCQUFNLG1KQUE2SjtBQUFBO0FBQUE7QUFJdkssa0NBQXNCLG9CQUFvQixVQUFVLFNBQVMsT0FBTztBQUFBO0FBQUE7QUFLeEUsb0NBQTRCLGlCQUFnQixNQUFNLFVBQVUsY0FBYTtBQUN2RTtBQUNFLCtCQUFtQixpQkFBZ0IsTUFBTTtBQUFBO0FBRzNDLGNBQUksV0FBVyxnQkFBZTtBQUM5QixtQkFBUyxRQUFRO0FBQ2pCLG1CQUFTLFFBQVEsZ0JBQWU7QUFDaEMsbUJBQVMsT0FBTztBQUNoQixnQ0FBc0I7QUFDdEIsY0FBSSxjQUFjLEtBQUs7QUFFdkIsY0FBSSxPQUFPLGdCQUFnQixZQUFZLGdCQUFnQixNQUFNO0FBQzNELHFCQUFTLFVBQVUsWUFBWTtBQUFBLGlCQUMxQjtBQUNMLGdCQUFJLGtCQUFrQixtQkFBbUIsaUJBQWdCLE1BQU07QUFDL0QscUJBQVMsVUFBVSxpQkFBaUIsaUJBQWdCO0FBQUE7QUFHdEQ7QUFDRSxnQkFBSSxTQUFTLFVBQVUsVUFBVTtBQUMvQixrQkFBSSxnQkFBZ0IseUJBQXlCLFNBQVM7QUFFdEQsa0JBQUksQ0FBQywwQ0FBMEMsSUFBSSxnQkFBZ0I7QUFDakUsMERBQTBDLElBQUk7QUFFOUMsc0JBQU0sd0tBQWtMO0FBQUE7QUFBQTtBQUk1TCxnQkFBSSxnQkFBZSxPQUFPLGtCQUFrQjtBQUMxQyxzQ0FBd0IsMkJBQTJCLGlCQUFnQjtBQUFBO0FBR3JFO0FBQ0Usc0NBQXdCLDhCQUE4QixpQkFBZ0I7QUFBQTtBQUFBO0FBSTFFLG1CQUFTLFFBQVEsZ0JBQWU7QUFDaEMsY0FBSSwyQkFBMkIsS0FBSztBQUVwQyxjQUFJLE9BQU8sNkJBQTZCLFlBQVk7QUFDbEQsdUNBQTJCLGlCQUFnQixNQUFNLDBCQUEwQjtBQUMzRSxxQkFBUyxRQUFRLGdCQUFlO0FBQUE7QUFLbEMsY0FBSSxPQUFPLEtBQUssNkJBQTZCLGNBQWMsT0FBTyxTQUFTLDRCQUE0QixjQUFlLFFBQU8sU0FBUyw4QkFBOEIsY0FBYyxPQUFPLFNBQVMsdUJBQXVCLGFBQWE7QUFDcE8sbUNBQXVCLGlCQUFnQjtBQUd2QywrQkFBbUIsaUJBQWdCLFVBQVUsVUFBVTtBQUN2RCxxQkFBUyxRQUFRLGdCQUFlO0FBQUE7QUFHbEMsY0FBSSxPQUFPLFNBQVMsc0JBQXNCLFlBQVk7QUFDcEQsZ0JBQUksYUFBYTtBQUVqQjtBQUNFLDRCQUFjO0FBQUE7QUFHaEIsZ0JBQU0saUJBQWUsT0FBTyx1QkFBdUIsUUFBUTtBQUN6RCw0QkFBYztBQUFBO0FBR2hCLDRCQUFlLFNBQVM7QUFBQTtBQUFBO0FBSTVCLDBDQUFrQyxpQkFBZ0IsTUFBTSxVQUFVLGNBQWE7QUFDN0UsY0FBSSxXQUFXLGdCQUFlO0FBQzlCLGNBQUksV0FBVyxnQkFBZTtBQUM5QixtQkFBUyxRQUFRO0FBQ2pCLGNBQUksYUFBYSxTQUFTO0FBQzFCLGNBQUksY0FBYyxLQUFLO0FBQ3ZCLGNBQUksY0FBYztBQUVsQixjQUFJLE9BQU8sZ0JBQWdCLFlBQVksZ0JBQWdCLE1BQU07QUFDM0QsMEJBQWMsWUFBWTtBQUFBLGlCQUNyQjtBQUNMLGdCQUFJLDRCQUE0QixtQkFBbUIsaUJBQWdCLE1BQU07QUFDekUsMEJBQWMsaUJBQWlCLGlCQUFnQjtBQUFBO0FBR2pELGNBQUksMkJBQTJCLEtBQUs7QUFDcEMsY0FBSSxtQkFBbUIsT0FBTyw2QkFBNkIsY0FBYyxPQUFPLFNBQVMsNEJBQTRCO0FBTXJILGNBQUksQ0FBQyxvQkFBcUIsUUFBTyxTQUFTLHFDQUFxQyxjQUFjLE9BQU8sU0FBUyw4QkFBOEIsYUFBYTtBQUN0SixnQkFBSSxhQUFhLFlBQVksZUFBZSxhQUFhO0FBQ3ZELDRDQUE4QixpQkFBZ0IsVUFBVSxVQUFVO0FBQUE7QUFBQTtBQUl0RTtBQUNBLGNBQUksV0FBVyxnQkFBZTtBQUM5QixjQUFJLFdBQVcsU0FBUyxRQUFRO0FBQ2hDLDZCQUFtQixpQkFBZ0IsVUFBVSxVQUFVO0FBQ3ZELHFCQUFXLGdCQUFlO0FBRTFCLGNBQUksYUFBYSxZQUFZLGFBQWEsWUFBWSxDQUFDLHVCQUF1QixDQUFDLHNDQUFzQztBQUduSCxnQkFBSSxPQUFPLFNBQVMsc0JBQXNCLFlBQVk7QUFDcEQsa0JBQUksYUFBYTtBQUVqQjtBQUNFLDhCQUFjO0FBQUE7QUFHaEIsa0JBQU0saUJBQWUsT0FBTyx1QkFBdUIsUUFBUTtBQUN6RCw4QkFBYztBQUFBO0FBR2hCLDhCQUFlLFNBQVM7QUFBQTtBQUcxQixtQkFBTztBQUFBO0FBR1QsY0FBSSxPQUFPLDZCQUE2QixZQUFZO0FBQ2xELHVDQUEyQixpQkFBZ0IsTUFBTSwwQkFBMEI7QUFDM0UsdUJBQVcsZ0JBQWU7QUFBQTtBQUc1QixjQUFJLGVBQWUsd0NBQXdDLDJCQUEyQixpQkFBZ0IsTUFBTSxVQUFVLFVBQVUsVUFBVSxVQUFVO0FBRXBKLGNBQUksY0FBYztBQUdoQixnQkFBSSxDQUFDLG9CQUFxQixRQUFPLFNBQVMsOEJBQThCLGNBQWMsT0FBTyxTQUFTLHVCQUF1QixhQUFhO0FBQ3hJLGtCQUFJLE9BQU8sU0FBUyx1QkFBdUIsWUFBWTtBQUNyRCx5QkFBUztBQUFBO0FBR1gsa0JBQUksT0FBTyxTQUFTLDhCQUE4QixZQUFZO0FBQzVELHlCQUFTO0FBQUE7QUFBQTtBQUliLGdCQUFJLE9BQU8sU0FBUyxzQkFBc0IsWUFBWTtBQUNwRCxrQkFBSSxjQUFjO0FBRWxCO0FBQ0UsK0JBQWU7QUFBQTtBQUdqQixrQkFBTSxpQkFBZSxPQUFPLHVCQUF1QixRQUFRO0FBQ3pELCtCQUFlO0FBQUE7QUFHakIsOEJBQWUsU0FBUztBQUFBO0FBQUEsaUJBRXJCO0FBR0wsZ0JBQUksT0FBTyxTQUFTLHNCQUFzQixZQUFZO0FBQ3BELGtCQUFJLGVBQWU7QUFFbkI7QUFDRSxnQ0FBZ0I7QUFBQTtBQUdsQixrQkFBTSxpQkFBZSxPQUFPLHVCQUF1QixRQUFRO0FBQ3pELGdDQUFnQjtBQUFBO0FBR2xCLDhCQUFlLFNBQVM7QUFBQTtBQUsxQiw0QkFBZSxnQkFBZ0I7QUFDL0IsNEJBQWUsZ0JBQWdCO0FBQUE7QUFLakMsbUJBQVMsUUFBUTtBQUNqQixtQkFBUyxRQUFRO0FBQ2pCLG1CQUFTLFVBQVU7QUFDbkIsaUJBQU87QUFBQTtBQUlULHFDQUE2QixVQUFTLGlCQUFnQixNQUFNLFVBQVUsY0FBYTtBQUNqRixjQUFJLFdBQVcsZ0JBQWU7QUFDOUIsMkJBQWlCLFVBQVM7QUFDMUIsY0FBSSxxQkFBcUIsZ0JBQWU7QUFDeEMsY0FBSSxXQUFXLGdCQUFlLFNBQVMsZ0JBQWUsY0FBYyxxQkFBcUIsb0JBQW9CLGdCQUFlLE1BQU07QUFDbEksbUJBQVMsUUFBUTtBQUNqQixjQUFJLHFCQUFxQixnQkFBZTtBQUN4QyxjQUFJLGFBQWEsU0FBUztBQUMxQixjQUFJLGNBQWMsS0FBSztBQUN2QixjQUFJLGNBQWM7QUFFbEIsY0FBSSxPQUFPLGdCQUFnQixZQUFZLGdCQUFnQixNQUFNO0FBQzNELDBCQUFjLFlBQVk7QUFBQSxpQkFDckI7QUFDTCxnQkFBSSxzQkFBc0IsbUJBQW1CLGlCQUFnQixNQUFNO0FBQ25FLDBCQUFjLGlCQUFpQixpQkFBZ0I7QUFBQTtBQUdqRCxjQUFJLDJCQUEyQixLQUFLO0FBQ3BDLGNBQUksbUJBQW1CLE9BQU8sNkJBQTZCLGNBQWMsT0FBTyxTQUFTLDRCQUE0QjtBQU1ySCxjQUFJLENBQUMsb0JBQXFCLFFBQU8sU0FBUyxxQ0FBcUMsY0FBYyxPQUFPLFNBQVMsOEJBQThCLGFBQWE7QUFDdEosZ0JBQUksdUJBQXVCLHNCQUFzQixlQUFlLGFBQWE7QUFDM0UsNENBQThCLGlCQUFnQixVQUFVLFVBQVU7QUFBQTtBQUFBO0FBSXRFO0FBQ0EsY0FBSSxXQUFXLGdCQUFlO0FBQzlCLGNBQUksV0FBVyxTQUFTLFFBQVE7QUFDaEMsNkJBQW1CLGlCQUFnQixVQUFVLFVBQVU7QUFDdkQscUJBQVcsZ0JBQWU7QUFFMUIsY0FBSSx1QkFBdUIsc0JBQXNCLGFBQWEsWUFBWSxDQUFDLHVCQUF1QixDQUFDLHdDQUF3QyxDQUFFLDhCQUFrQztBQUc3SyxnQkFBSSxPQUFPLFNBQVMsdUJBQXVCLFlBQVk7QUFDckQsa0JBQUksdUJBQXVCLFNBQVEsaUJBQWlCLGFBQWEsU0FBUSxlQUFlO0FBQ3RGLGdDQUFlLFNBQVM7QUFBQTtBQUFBO0FBSTVCLGdCQUFJLE9BQU8sU0FBUyw0QkFBNEIsWUFBWTtBQUMxRCxrQkFBSSx1QkFBdUIsU0FBUSxpQkFBaUIsYUFBYSxTQUFRLGVBQWU7QUFDdEYsZ0NBQWUsU0FBUztBQUFBO0FBQUE7QUFJNUIsbUJBQU87QUFBQTtBQUdULGNBQUksT0FBTyw2QkFBNkIsWUFBWTtBQUNsRCx1Q0FBMkIsaUJBQWdCLE1BQU0sMEJBQTBCO0FBQzNFLHVCQUFXLGdCQUFlO0FBQUE7QUFHNUIsY0FBSSxlQUFlLHdDQUF3QywyQkFBMkIsaUJBQWdCLE1BQU0sVUFBVSxVQUFVLFVBQVUsVUFBVSxnQkFJcEo7QUFFQSxjQUFJLGNBQWM7QUFHaEIsZ0JBQUksQ0FBQyxvQkFBcUIsUUFBTyxTQUFTLCtCQUErQixjQUFjLE9BQU8sU0FBUyx3QkFBd0IsYUFBYTtBQUMxSSxrQkFBSSxPQUFPLFNBQVMsd0JBQXdCLFlBQVk7QUFDdEQseUJBQVMsb0JBQW9CLFVBQVUsVUFBVTtBQUFBO0FBR25ELGtCQUFJLE9BQU8sU0FBUywrQkFBK0IsWUFBWTtBQUM3RCx5QkFBUywyQkFBMkIsVUFBVSxVQUFVO0FBQUE7QUFBQTtBQUk1RCxnQkFBSSxPQUFPLFNBQVMsdUJBQXVCLFlBQVk7QUFDckQsOEJBQWUsU0FBUztBQUFBO0FBRzFCLGdCQUFJLE9BQU8sU0FBUyw0QkFBNEIsWUFBWTtBQUMxRCw4QkFBZSxTQUFTO0FBQUE7QUFBQSxpQkFFckI7QUFHTCxnQkFBSSxPQUFPLFNBQVMsdUJBQXVCLFlBQVk7QUFDckQsa0JBQUksdUJBQXVCLFNBQVEsaUJBQWlCLGFBQWEsU0FBUSxlQUFlO0FBQ3RGLGdDQUFlLFNBQVM7QUFBQTtBQUFBO0FBSTVCLGdCQUFJLE9BQU8sU0FBUyw0QkFBNEIsWUFBWTtBQUMxRCxrQkFBSSx1QkFBdUIsU0FBUSxpQkFBaUIsYUFBYSxTQUFRLGVBQWU7QUFDdEYsZ0NBQWUsU0FBUztBQUFBO0FBQUE7QUFNNUIsNEJBQWUsZ0JBQWdCO0FBQy9CLDRCQUFlLGdCQUFnQjtBQUFBO0FBS2pDLG1CQUFTLFFBQVE7QUFDakIsbUJBQVMsUUFBUTtBQUNqQixtQkFBUyxVQUFVO0FBQ25CLGlCQUFPO0FBQUE7QUFPVCxZQUFJLFlBQVk7QUFDaEIsWUFBSSxpQkFBaUI7QUFDckIsWUFBSSxtQkFBbUI7QUFDdkIsWUFBSSxnQkFBZ0I7QUFDcEIsWUFBSSxVQUFVO0FBQ2QsWUFBSSxlQUFlO0FBQ25CLFlBQUksc0JBQXNCO0FBQzFCLFlBQUksZ0JBQWdCO0FBQ3BCLFlBQUksc0JBQXNCO0FBQzFCLCtCQUF1QixpQkFBZ0I7QUFDckM7QUFDQSxpQkFBUSxpQkFBZSxRQUFRLFlBQVk7QUFBQTtBQUU3QyxpQ0FBeUIsaUJBQWdCO0FBQ3ZDO0FBQ0EsaUJBQU87QUFBQTtBQUVULDZCQUFxQjtBQUNuQixjQUFJLFdBQVc7QUFDZixjQUFJLG1CQUFtQjtBQUN2QixjQUFJLEtBQUssbUJBQW1CLENBQUMsY0FBYztBQUMzQyxpQkFBTyxHQUFHLFNBQVMsTUFBTTtBQUFBO0FBRTNCLDhCQUFzQixpQkFBZ0IsZUFBZTtBQWVuRDtBQUNBLG9CQUFVLG9CQUFvQjtBQUM5QixvQkFBVSxvQkFBb0I7QUFDOUIsNkJBQW1CO0FBQ25CLDBCQUFnQjtBQUFBO0FBRWxCLDRCQUFvQixpQkFBZ0IsZUFBZSxRQUFPO0FBQ3hEO0FBQ0Esa0JBQVEsa0JBQWtCO0FBQzFCLGtCQUFRLGtCQUFrQjtBQUMxQixrQkFBUSxrQkFBa0I7QUFDMUIsZ0NBQXNCO0FBQ3RCLGNBQUksdUJBQXVCO0FBQzNCLGNBQUksZUFBZTtBQUduQixjQUFJLGFBQWEsYUFBYSx3QkFBd0I7QUFDdEQsY0FBSSxTQUFTLHVCQUF1QixDQUFFLE1BQUs7QUFDM0MsY0FBSSxPQUFPLFNBQVE7QUFDbkIsY0FBSSxTQUFTLGFBQWEsaUJBQWlCO0FBRzNDLGNBQUksU0FBUyxJQUFJO0FBY2YsZ0JBQUksdUJBQXVCLGFBQWEsYUFBYTtBQUVyRCxnQkFBSSxrQkFBbUIsTUFBSyx3QkFBd0I7QUFFcEQsZ0JBQUksY0FBZSxVQUFTLGlCQUFpQixTQUFTO0FBRXRELGdCQUFJLGVBQWUsVUFBVTtBQUM3QixnQkFBSSxtQkFBbUIsYUFBYTtBQUdwQyxnQkFBSSxlQUFlLGFBQWEsaUJBQWlCO0FBQ2pELGdCQUFJLGdCQUFnQixRQUFRO0FBQzVCLGdCQUFJLEtBQUssZ0JBQWdCO0FBQ3pCLGdCQUFJLFdBQVcsY0FBYztBQUM3Qiw0QkFBZ0IsS0FBSyxlQUFlO0FBQ3BDLGtDQUFzQjtBQUFBLGlCQUNqQjtBQUVMLGdCQUFJLFVBQVUsUUFBUTtBQUV0QixnQkFBSSxNQUFNLFVBQVU7QUFFcEIsZ0JBQUksWUFBWTtBQUNoQiw0QkFBZ0IsS0FBSyxTQUFTO0FBQzlCLGtDQUFzQjtBQUFBO0FBQUE7QUFHMUIsd0NBQWdDLGlCQUFnQjtBQUM5QztBQUdBLGNBQUksY0FBYyxnQkFBZTtBQUVqQyxjQUFJLGdCQUFnQixNQUFNO0FBQ3hCLGdCQUFJLGdCQUFnQjtBQUNwQixnQkFBSSxZQUFZO0FBQ2hCLHlCQUFhLGlCQUFnQjtBQUM3Qix1QkFBVyxpQkFBZ0IsZUFBZTtBQUFBO0FBQUE7QUFJOUMsOEJBQXNCLFFBQVE7QUFDNUIsaUJBQU8sS0FBSyxNQUFNO0FBQUE7QUFHcEIsK0JBQXVCLElBQUk7QUFDekIsaUJBQU8sS0FBSyxhQUFhLE1BQU07QUFBQTtBQUdqQyxnQ0FBd0IsaUJBQWdCO0FBTXRDLGlCQUFPLG9CQUFtQixrQkFBa0I7QUFDMUMsK0JBQW1CLFVBQVUsRUFBRTtBQUMvQixzQkFBVSxrQkFBa0I7QUFDNUIsNEJBQWdCLFVBQVUsRUFBRTtBQUM1QixzQkFBVSxrQkFBa0I7QUFBQTtBQUc5QixpQkFBTyxvQkFBbUIscUJBQXFCO0FBQzdDLGtDQUFzQixRQUFRLEVBQUU7QUFDaEMsb0JBQVEsZ0JBQWdCO0FBQ3hCLGtDQUFzQixRQUFRLEVBQUU7QUFDaEMsb0JBQVEsZ0JBQWdCO0FBQ3hCLDRCQUFnQixRQUFRLEVBQUU7QUFDMUIsb0JBQVEsZ0JBQWdCO0FBQUE7QUFBQTtBQUc1QiwyQ0FBbUM7QUFDakM7QUFFQSxjQUFJLHdCQUF3QixNQUFNO0FBQ2hDLG1CQUFPO0FBQUEsY0FDTCxJQUFJO0FBQUEsY0FDSixVQUFVO0FBQUE7QUFBQSxpQkFFUDtBQUNMLG1CQUFPO0FBQUE7QUFBQTtBQUdYLDZDQUFxQyxpQkFBZ0Isa0JBQWtCO0FBQ3JFO0FBQ0Esa0JBQVEsa0JBQWtCO0FBQzFCLGtCQUFRLGtCQUFrQjtBQUMxQixrQkFBUSxrQkFBa0I7QUFDMUIsMEJBQWdCLGlCQUFpQjtBQUNqQyxnQ0FBc0IsaUJBQWlCO0FBQ3ZDLGdDQUFzQjtBQUFBO0FBR3hCLHNDQUE4QjtBQUM1QjtBQUNFLGdCQUFJLENBQUMsa0JBQWtCO0FBQ3JCLG9CQUFNO0FBQUE7QUFBQTtBQUFBO0FBT1osWUFBSSx1QkFBdUI7QUFDM0IsWUFBSSx5QkFBeUI7QUFDN0IsWUFBSSxjQUFjO0FBR2xCLFlBQUksdUJBQXVCO0FBRTNCLFlBQUksa0JBQWtCO0FBRXRCLG1DQUEyQjtBQUN6QjtBQUNFLGdCQUFJLGFBQWE7QUFDZixvQkFBTTtBQUFBO0FBQUE7QUFBQTtBQUtaLGlEQUF5QztBQUN2QztBQUNFLG1DQUF1QjtBQUFBO0FBQUE7QUFJM0IscUNBQTZCLE9BQU87QUFFbEMsY0FBSSxpQkFBaUIsTUFBTSxVQUFVO0FBQ3JDLG1DQUF5Qix1Q0FBdUM7QUFDaEUsaUNBQXVCO0FBQ3ZCLHdCQUFjO0FBQ2QsNEJBQWtCO0FBQ2xCLGlDQUF1QjtBQUN2QixpQkFBTztBQUFBO0FBR1QscUVBQTZELE9BQU8sa0JBQWtCLGFBQWE7QUFFakcsbUNBQXlCLDhDQUE4QztBQUN2RSxpQ0FBdUI7QUFDdkIsd0JBQWM7QUFDZCw0QkFBa0I7QUFDbEIsaUNBQXVCO0FBRXZCLGNBQUksZ0JBQWdCLE1BQU07QUFDeEIsd0NBQTRCLE9BQU87QUFBQTtBQUdyQyxpQkFBTztBQUFBO0FBR1Qsd0NBQWdDLGFBQWEsVUFBVTtBQUNyRDtBQUNFLG9CQUFRLFlBQVk7QUFBQSxtQkFDYixVQUNIO0FBQ0UscURBQXFDLFlBQVksVUFBVSxlQUFlO0FBQzFFO0FBQUE7QUFBQSxtQkFHQyxlQUNIO0FBQ0Usb0JBQUksbUJBQW9CLGFBQVksT0FBTyxvQkFBb0I7QUFDL0Qsc0NBQXNCLFlBQVksTUFBTSxZQUFZLGVBQWUsWUFBWSxXQUFXLFVBQzFGO0FBQ0E7QUFBQTtBQUFBLG1CQUdDLG1CQUNIO0FBQ0Usb0JBQUksZ0JBQWdCLFlBQVk7QUFDaEMsb0JBQUksY0FBYyxlQUFlO0FBQU0sOERBQTRDLGNBQWMsWUFBWTtBQUM3RztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTVYsMENBQWtDLGFBQWEsVUFBVTtBQUN2RCxpQ0FBdUIsYUFBYTtBQUNwQyxjQUFJLGdCQUFnQjtBQUNwQix3QkFBYyxZQUFZO0FBQzFCLHdCQUFjLFNBQVM7QUFDdkIsY0FBSSxZQUFZLFlBQVk7QUFFNUIsY0FBSSxjQUFjLE1BQU07QUFDdEIsd0JBQVksWUFBWSxDQUFDO0FBQ3pCLHdCQUFZLFNBQVM7QUFBQSxpQkFDaEI7QUFDTCxzQkFBVSxLQUFLO0FBQUE7QUFBQTtBQUluQix5Q0FBaUMsYUFBYSxPQUFPO0FBQ25EO0FBQ0UsZ0JBQUksc0JBQXNCO0FBSXhCO0FBQUE7QUFHRixvQkFBUSxZQUFZO0FBQUEsbUJBQ2IsVUFDSDtBQUNFLG9CQUFJLGtCQUFrQixZQUFZLFVBQVU7QUFFNUMsd0JBQVEsTUFBTTtBQUFBLHVCQUNQO0FBQ0gsd0JBQUksT0FBTyxNQUFNO0FBQ2pCLHdCQUFJLFFBQVEsTUFBTTtBQUNsQixnRUFBNEMsaUJBQWlCO0FBQzdEO0FBQUEsdUJBRUc7QUFDSCx3QkFBSSxPQUFPLE1BQU07QUFDakIsb0VBQWdELGlCQUFpQjtBQUNqRTtBQUFBO0FBR0o7QUFBQTtBQUFBLG1CQUdDLGVBQ0g7QUFDRSxvQkFBSSxhQUFhLFlBQVk7QUFDN0Isb0JBQUksY0FBYyxZQUFZO0FBQzlCLG9CQUFJLGlCQUFpQixZQUFZO0FBRWpDLHdCQUFRLE1BQU07QUFBQSx1QkFDUCxlQUNIO0FBQ0Usd0JBQUksUUFBUSxNQUFNO0FBQ2xCLHdCQUFJLFNBQVMsTUFBTTtBQUNuQix3QkFBSSxtQkFBb0IsYUFBWSxPQUFPLG9CQUFvQjtBQUMvRCxpREFBNkIsWUFBWSxhQUFhLGdCQUFnQixPQUFPLFFBQzdFO0FBQ0E7QUFBQTtBQUFBLHVCQUdDLFVBQ0g7QUFDRSx3QkFBSSxRQUFRLE1BQU07QUFFbEIsd0JBQUksb0JBQXFCLGFBQVksT0FBTyxvQkFBb0I7QUFFaEUscURBQWlDLFlBQVksYUFBYSxnQkFBZ0IsT0FDMUU7QUFDQTtBQUFBO0FBQUE7QUFJTjtBQUFBO0FBQUEsbUJBR0MsbUJBQ0g7QUFDRSxvQkFBSSxnQkFBZ0IsWUFBWTtBQUNoQyxvQkFBSSxrQkFBa0IsY0FBYztBQUNwQyxvQkFBSSxvQkFBb0I7QUFBTSwwQkFBUSxNQUFNO0FBQUEseUJBQ3JDO0FBQ0gsMEJBQUksU0FBUyxNQUFNO0FBQ25CLDBCQUFJLFVBQVUsTUFBTTtBQUNwQix5RUFBbUQsaUJBQWlCO0FBQ3BFO0FBQUEseUJBRUc7QUFDSCwwQkFBSSxTQUFTLE1BQU07QUFDbkIsNkVBQXVELGlCQUFpQjtBQUN4RTtBQUFBO0FBRUo7QUFBQTtBQUFBO0FBSUY7QUFBQTtBQUFBO0FBQUE7QUFLUiwyQ0FBbUMsYUFBYSxPQUFPO0FBQ3JELGdCQUFNLFFBQVEsTUFBTSxRQUFRLENBQUMsWUFBWTtBQUN6QyxrQ0FBd0IsYUFBYTtBQUFBO0FBR3ZDLDRCQUFvQixPQUFPLGNBQWM7QUFDdkMsa0JBQVEsTUFBTTtBQUFBLGlCQUNQLGVBQ0g7QUFDRSxrQkFBSSxPQUFPLE1BQU07QUFDakIsa0JBQUksUUFBUSxNQUFNO0FBQ2xCLGtCQUFJLFdBQVcsbUJBQW1CLGNBQWM7QUFFaEQsa0JBQUksYUFBYSxNQUFNO0FBQ3JCLHNCQUFNLFlBQVk7QUFDbEIsdUNBQXVCO0FBQ3ZCLHlDQUF5Qix3QkFBd0I7QUFDakQsdUJBQU87QUFBQTtBQUdULHFCQUFPO0FBQUE7QUFBQSxpQkFHTixVQUNIO0FBQ0Usa0JBQUksT0FBTyxNQUFNO0FBQ2pCLGtCQUFJLGVBQWUsdUJBQXVCLGNBQWM7QUFFeEQsa0JBQUksaUJBQWlCLE1BQU07QUFDekIsc0JBQU0sWUFBWTtBQUNsQix1Q0FBdUI7QUFFdkIseUNBQXlCO0FBQ3pCLHVCQUFPO0FBQUE7QUFHVCxxQkFBTztBQUFBO0FBQUEsaUJBR04sbUJBQ0g7QUFDRSxrQkFBSSxtQkFBbUIsMkJBQTJCO0FBRWxELGtCQUFJLHFCQUFxQixNQUFNO0FBQzdCLG9CQUFJLGdCQUFnQjtBQUFBLGtCQUNsQixZQUFZO0FBQUEsa0JBQ1osYUFBYTtBQUFBLGtCQUNiLFdBQVc7QUFBQTtBQUViLHNCQUFNLGdCQUFnQjtBQUt0QixvQkFBSSxxQkFBcUIsa0NBQWtDO0FBQzNELG1DQUFtQixTQUFTO0FBQzVCLHNCQUFNLFFBQVE7QUFDZCx1Q0FBdUI7QUFHdkIseUNBQXlCO0FBQ3pCLHVCQUFPO0FBQUE7QUFHVCxxQkFBTztBQUFBO0FBQUE7QUFJVCxxQkFBTztBQUFBO0FBQUE7QUFJYiw4Q0FBc0MsT0FBTztBQUMzQyxpQkFBUSxPQUFNLE9BQU8sb0JBQW9CLFVBQVcsT0FBTSxRQUFRLGdCQUFnQjtBQUFBO0FBR3BGLDBDQUFrQyxPQUFPO0FBQ3ZDLGdCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGtEQUEwQyxPQUFPO0FBQy9DLGNBQUksQ0FBQyxhQUFhO0FBQ2hCO0FBQUE7QUFHRixjQUFJLGVBQWU7QUFFbkIsY0FBSSxDQUFDLGNBQWM7QUFDakIsZ0JBQUksNkJBQTZCLFFBQVE7QUFDdkMsc0NBQXdCLHNCQUFzQjtBQUM5QztBQUFBO0FBSUYsc0NBQTBCLHNCQUFzQjtBQUNoRCwwQkFBYztBQUNkLG1DQUF1QjtBQUN2QjtBQUFBO0FBR0YsY0FBSSx5QkFBeUI7QUFFN0IsY0FBSSxDQUFDLFdBQVcsT0FBTyxlQUFlO0FBQ3BDLGdCQUFJLDZCQUE2QixRQUFRO0FBQ3ZDLHNDQUF3QixzQkFBc0I7QUFDOUM7QUFBQTtBQU1GLDJCQUFlLHlCQUF5QjtBQUN4QyxnQkFBSSwyQkFBMkI7QUFFL0IsZ0JBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLE9BQU8sZUFBZTtBQUVyRCx3Q0FBMEIsc0JBQXNCO0FBQ2hELDRCQUFjO0FBQ2QscUNBQXVCO0FBQ3ZCO0FBQUE7QUFPRixxQ0FBeUIsMEJBQTBCO0FBQUE7QUFBQTtBQUl2RCw4Q0FBc0MsT0FBTyx1QkFBdUIsYUFBYTtBQUUvRSxjQUFJLFdBQVcsTUFBTTtBQUNyQixjQUFJLDBCQUEwQixDQUFDO0FBQy9CLGNBQUksZ0JBQWdCLGdCQUFnQixVQUFVLE1BQU0sTUFBTSxNQUFNLGVBQWUsdUJBQXVCLGFBQWEsT0FBTztBQUUxSCxnQkFBTSxjQUFjO0FBR3BCLGNBQUksa0JBQWtCLE1BQU07QUFDMUIsbUJBQU87QUFBQTtBQUdULGlCQUFPO0FBQUE7QUFHVCxrREFBMEMsT0FBTztBQUUvQyxjQUFJLGVBQWUsTUFBTTtBQUN6QixjQUFJLGNBQWMsTUFBTTtBQUN4QixjQUFJLGVBQWUsb0JBQW9CLGNBQWMsYUFBYTtBQUVsRSxjQUFJLGNBQWM7QUFHaEIsZ0JBQUksY0FBYztBQUVsQixnQkFBSSxnQkFBZ0IsTUFBTTtBQUN4QixzQkFBUSxZQUFZO0FBQUEscUJBQ2IsVUFDSDtBQUNFLHNCQUFJLGtCQUFrQixZQUFZLFVBQVU7QUFDNUMsc0JBQUksbUJBQW9CLGFBQVksT0FBTyxvQkFBb0I7QUFDL0QsMkRBQXlDLGlCQUFpQixjQUFjLGFBQ3hFO0FBQ0E7QUFBQTtBQUFBLHFCQUdDLGVBQ0g7QUFDRSxzQkFBSSxhQUFhLFlBQVk7QUFDN0Isc0JBQUksY0FBYyxZQUFZO0FBQzlCLHNCQUFJLGlCQUFpQixZQUFZO0FBRWpDLHNCQUFJLHFCQUFzQixhQUFZLE9BQU8sb0JBQW9CO0FBRWpFLGtEQUFnQyxZQUFZLGFBQWEsZ0JBQWdCLGNBQWMsYUFDdkY7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTVYsaUJBQU87QUFBQTtBQUdULHNEQUE4QyxPQUFPO0FBRW5ELGNBQUksZ0JBQWdCLE1BQU07QUFDMUIsY0FBSSxtQkFBbUIsa0JBQWtCLE9BQU8sY0FBYyxhQUFhO0FBRTNFLGNBQUksQ0FBQyxrQkFBa0I7QUFDckIsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsa0NBQXdCLGtCQUFrQjtBQUFBO0FBRzVDLG9EQUE0QyxPQUFPO0FBRWpELGNBQUksZ0JBQWdCLE1BQU07QUFDMUIsY0FBSSxtQkFBbUIsa0JBQWtCLE9BQU8sY0FBYyxhQUFhO0FBRTNFLGNBQUksQ0FBQyxrQkFBa0I7QUFDckIsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsaUJBQU8sK0NBQStDO0FBQUE7QUFHeEQscUNBQTZCLE9BQU87QUFDbEMsY0FBSSxTQUFTLE1BQU07QUFFbkIsaUJBQU8sV0FBVyxRQUFRLE9BQU8sUUFBUSxpQkFBaUIsT0FBTyxRQUFRLFlBQVksT0FBTyxRQUFRLG1CQUFtQjtBQUNySCxxQkFBUyxPQUFPO0FBQUE7QUFHbEIsaUNBQXVCO0FBQUE7QUFHekIsbUNBQTJCLE9BQU87QUFFaEMsY0FBSSxVQUFVLHNCQUFzQjtBQUdsQyxtQkFBTztBQUFBO0FBR1QsY0FBSSxDQUFDLGFBQWE7QUFJaEIsZ0NBQW9CO0FBQ3BCLDBCQUFjO0FBQ2QsbUJBQU87QUFBQTtBQU9ULGNBQUksTUFBTSxRQUFRLFlBQWEsT0FBTSxRQUFRLGlCQUFpQixvQ0FBb0MsTUFBTSxTQUFTLENBQUMscUJBQXFCLE1BQU0sTUFBTSxNQUFNLGlCQUFpQjtBQUN4SyxnQkFBSSxlQUFlO0FBRW5CLGdCQUFJLGNBQWM7QUFDaEIsa0JBQUksNkJBQTZCLFFBQVE7QUFDdkMsMENBQTBCO0FBQzFCO0FBQUEscUJBQ0s7QUFDTCx1QkFBTyxjQUFjO0FBQ25CLDJDQUF5QixPQUFPO0FBQ2hDLGlDQUFlLHlCQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTWhELDhCQUFvQjtBQUVwQixjQUFJLE1BQU0sUUFBUSxtQkFBbUI7QUFDbkMscUNBQXlCLG1DQUFtQztBQUFBLGlCQUN2RDtBQUNMLHFDQUF5Qix1QkFBdUIseUJBQXlCLE1BQU0sYUFBYTtBQUFBO0FBRzlGLGlCQUFPO0FBQUE7QUFHVCwwQ0FBa0M7QUFDaEMsaUJBQU8sZUFBZSwyQkFBMkI7QUFBQTtBQUduRCwyQ0FBbUMsT0FBTztBQUN4QyxjQUFJLGVBQWU7QUFFbkIsaUJBQU8sY0FBYztBQUNuQixtQ0FBdUIsT0FBTztBQUM5QiwyQkFBZSx5QkFBeUI7QUFBQTtBQUFBO0FBSTVDLHVDQUErQjtBQUU3QixpQ0FBdUI7QUFDdkIsbUNBQXlCO0FBQ3pCLHdCQUFjO0FBQ2QsaUNBQXVCO0FBQUE7QUFHekIsdURBQStDO0FBQzdDLGNBQUksb0JBQW9CLE1BQU07QUFJNUIsbUNBQXVCO0FBQ3ZCLDhCQUFrQjtBQUFBO0FBQUE7QUFJdEIsa0NBQTBCO0FBQ3hCLGlCQUFPO0FBQUE7QUFHVCxxQ0FBNkIsUUFBTztBQUNsQyxjQUFJLG9CQUFvQixNQUFNO0FBQzVCLDhCQUFrQixDQUFDO0FBQUEsaUJBQ2Q7QUFDTCw0QkFBZ0IsS0FBSztBQUFBO0FBQUE7QUFJekIsWUFBSTtBQUNKLFlBQUk7QUFDSixZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFFSixZQUFJLG9CQUFvQixTQUFVLE9BQU8sYUFBYTtBQUFBO0FBRXREO0FBQ0UsNkJBQW1CO0FBQ25CLG1DQUF5QjtBQUN6QixtQ0FBeUI7QUFPekIsa0NBQXdCO0FBQ3hCLHdDQUE4QjtBQUU5Qiw4QkFBb0IsU0FBVSxPQUFPLGFBQWE7QUFDaEQsZ0JBQUksVUFBVSxRQUFRLE9BQU8sVUFBVSxVQUFVO0FBQy9DO0FBQUE7QUFHRixnQkFBSSxDQUFDLE1BQU0sVUFBVSxNQUFNLE9BQU8sYUFBYSxNQUFNLE9BQU8sTUFBTTtBQUNoRTtBQUFBO0FBR0YsZ0JBQUksT0FBTyxNQUFNLFdBQVcsVUFBVTtBQUNwQyxvQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQixrQkFBTSxPQUFPLFlBQVk7QUFDekIsZ0JBQUksZ0JBQWdCLDBCQUEwQixnQkFBZ0I7QUFFOUQsZ0JBQUksc0JBQXNCLGdCQUFnQjtBQUN4QztBQUFBO0FBR0Ysa0NBQXNCLGlCQUFpQjtBQUV2QyxrQkFBTTtBQUFBO0FBQUE7QUFJViwyQkFBbUIsYUFBYSxVQUFTLFNBQVM7QUFDaEQsY0FBSSxXQUFXLFFBQVE7QUFFdkIsY0FBSSxhQUFhLFFBQVEsT0FBTyxhQUFhLGNBQWMsT0FBTyxhQUFhLFVBQVU7QUFDdkY7QUFHRSxrQkFBSyxhQUFZLE9BQU8sb0JBQW9CLHdCQUc1QyxDQUFFLFNBQVEsVUFBVSxRQUFRLFNBQVMsUUFBUSxPQUFPLGNBQWMsUUFBUSxRQUFRO0FBQ2hGLG9CQUFJLGdCQUFnQiwwQkFBMEIsZ0JBQWdCO0FBRTlELG9CQUFJLENBQUMsdUJBQXVCLGdCQUFnQjtBQUMxQztBQUNFLDBCQUFNLGdSQUFvUztBQUFBO0FBRzVTLHlDQUF1QixpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFLOUMsZ0JBQUksUUFBUSxRQUFRO0FBQ2xCLGtCQUFJLFFBQVEsUUFBUTtBQUNwQixrQkFBSTtBQUVKLGtCQUFJLE9BQU87QUFDVCxvQkFBSSxhQUFhO0FBRWpCLG9CQUFJLFdBQVcsUUFBUSxnQkFBZ0I7QUFDckMsd0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsdUJBQU8sV0FBVztBQUFBO0FBR3BCLGtCQUFJLENBQUMsTUFBTTtBQUNULHNCQUFNLElBQUksTUFBTSxrQ0FBa0MsV0FBVztBQUFBO0FBSS9ELGtCQUFJLGVBQWU7QUFFbkI7QUFDRSx3Q0FBd0IsVUFBVTtBQUFBO0FBR3BDLGtCQUFJLFlBQVksS0FBSztBQUVyQixrQkFBSSxhQUFZLFFBQVEsU0FBUSxRQUFRLFFBQVEsT0FBTyxTQUFRLFFBQVEsY0FBYyxTQUFRLElBQUksZUFBZSxXQUFXO0FBQ3pILHVCQUFPLFNBQVE7QUFBQTtBQUdqQixrQkFBSSxNQUFNLFNBQVUsT0FBTztBQUN6QixvQkFBSSxPQUFPLGFBQWE7QUFFeEIsb0JBQUksU0FBUyxpQkFBaUI7QUFFNUIseUJBQU8sYUFBYSxPQUFPO0FBQUE7QUFHN0Isb0JBQUksVUFBVSxNQUFNO0FBQ2xCLHlCQUFPLEtBQUs7QUFBQSx1QkFDUDtBQUNMLHVCQUFLLGFBQWE7QUFBQTtBQUFBO0FBSXRCLGtCQUFJLGFBQWE7QUFDakIscUJBQU87QUFBQSxtQkFDRjtBQUNMLGtCQUFJLE9BQU8sYUFBYSxVQUFVO0FBQ2hDLHNCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGtCQUFJLENBQUMsUUFBUSxRQUFRO0FBQ25CLHNCQUFNLElBQUksTUFBTSw0Q0FBNEMsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUs3RSxpQkFBTztBQUFBO0FBR1QsMENBQWtDLGFBQWEsVUFBVTtBQUN2RCxjQUFJLGNBQWMsT0FBTyxVQUFVLFNBQVMsS0FBSztBQUNqRCxnQkFBTSxJQUFJLE1BQU0sb0RBQXFELGlCQUFnQixvQkFBb0IsdUJBQXVCLE9BQU8sS0FBSyxVQUFVLEtBQUssUUFBUSxNQUFNLGVBQWU7QUFBQTtBQUcxTCxvQ0FBNEIsYUFBYTtBQUN2QztBQUNFLGdCQUFJLGdCQUFnQiwwQkFBMEIsZ0JBQWdCO0FBRTlELGdCQUFJLDRCQUE0QixnQkFBZ0I7QUFDOUM7QUFBQTtBQUdGLHdDQUE0QixpQkFBaUI7QUFFN0Msa0JBQU07QUFBQTtBQUFBO0FBSVYsNkJBQXFCLFVBQVU7QUFDN0IsY0FBSSxVQUFVLFNBQVM7QUFDdkIsY0FBSSxPQUFPLFNBQVM7QUFDcEIsaUJBQU8sS0FBSztBQUFBO0FBT2QsaUNBQXlCLHdCQUF3QjtBQUMvQywrQkFBcUIsYUFBYSxlQUFlO0FBQy9DLGdCQUFJLENBQUMsd0JBQXdCO0FBRTNCO0FBQUE7QUFHRixnQkFBSSxZQUFZLFlBQVk7QUFFNUIsZ0JBQUksY0FBYyxNQUFNO0FBQ3RCLDBCQUFZLFlBQVksQ0FBQztBQUN6QiwwQkFBWSxTQUFTO0FBQUEsbUJBQ2hCO0FBQ0wsd0JBQVUsS0FBSztBQUFBO0FBQUE7QUFJbkIsMkNBQWlDLGFBQWEsbUJBQW1CO0FBQy9ELGdCQUFJLENBQUMsd0JBQXdCO0FBRTNCLHFCQUFPO0FBQUE7QUFLVCxnQkFBSSxnQkFBZ0I7QUFFcEIsbUJBQU8sa0JBQWtCLE1BQU07QUFDN0IsMEJBQVksYUFBYTtBQUN6Qiw4QkFBZ0IsY0FBYztBQUFBO0FBR2hDLG1CQUFPO0FBQUE7QUFHVCx3Q0FBOEIsYUFBYSxtQkFBbUI7QUFJNUQsZ0JBQUksbUJBQW1CLElBQUk7QUFDM0IsZ0JBQUksZ0JBQWdCO0FBRXBCLG1CQUFPLGtCQUFrQixNQUFNO0FBQzdCLGtCQUFJLGNBQWMsUUFBUSxNQUFNO0FBQzlCLGlDQUFpQixJQUFJLGNBQWMsS0FBSztBQUFBLHFCQUNuQztBQUNMLGlDQUFpQixJQUFJLGNBQWMsT0FBTztBQUFBO0FBRzVDLDhCQUFnQixjQUFjO0FBQUE7QUFHaEMsbUJBQU87QUFBQTtBQUdULDRCQUFrQixPQUFPLGNBQWM7QUFHckMsZ0JBQUksUUFBUSxxQkFBcUIsT0FBTztBQUN4QyxrQkFBTSxRQUFRO0FBQ2Qsa0JBQU0sVUFBVTtBQUNoQixtQkFBTztBQUFBO0FBR1QsOEJBQW9CLFVBQVUsaUJBQWlCLFVBQVU7QUFDdkQscUJBQVMsUUFBUTtBQUVqQixnQkFBSSxDQUFDLHdCQUF3QjtBQUczQix1QkFBUyxTQUFTO0FBQ2xCLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxXQUFVLFNBQVM7QUFFdkIsZ0JBQUksYUFBWSxNQUFNO0FBQ3BCLGtCQUFJLFdBQVcsU0FBUTtBQUV2QixrQkFBSSxXQUFXLGlCQUFpQjtBQUU5Qix5QkFBUyxTQUFTO0FBQ2xCLHVCQUFPO0FBQUEscUJBQ0Y7QUFFTCx1QkFBTztBQUFBO0FBQUEsbUJBRUo7QUFFTCx1QkFBUyxTQUFTO0FBQ2xCLHFCQUFPO0FBQUE7QUFBQTtBQUlYLG9DQUEwQixVQUFVO0FBR2xDLGdCQUFJLDBCQUEwQixTQUFTLGNBQWMsTUFBTTtBQUN6RCx1QkFBUyxTQUFTO0FBQUE7QUFHcEIsbUJBQU87QUFBQTtBQUdULGtDQUF3QixhQUFhLFVBQVMsYUFBYSxPQUFPO0FBQ2hFLGdCQUFJLGFBQVksUUFBUSxTQUFRLFFBQVEsVUFBVTtBQUVoRCxrQkFBSSxVQUFVLG9CQUFvQixhQUFhLFlBQVksTUFBTTtBQUNqRSxzQkFBUSxTQUFTO0FBQ2pCLHFCQUFPO0FBQUEsbUJBQ0Y7QUFFTCxrQkFBSSxXQUFXLFNBQVMsVUFBUztBQUNqQyx1QkFBUyxTQUFTO0FBQ2xCLHFCQUFPO0FBQUE7QUFBQTtBQUlYLGlDQUF1QixhQUFhLFVBQVMsU0FBUyxPQUFPO0FBQzNELGdCQUFJLGNBQWMsUUFBUTtBQUUxQixnQkFBSSxnQkFBZ0IscUJBQXFCO0FBQ3ZDLHFCQUFPLGdCQUFlLGFBQWEsVUFBUyxRQUFRLE1BQU0sVUFBVSxPQUFPLFFBQVE7QUFBQTtBQUdyRixnQkFBSSxhQUFZLE1BQU07QUFDcEIsa0JBQUksU0FBUSxnQkFBZ0IsZUFDM0Isa0NBQWtDLFVBQVMsWUFJNUMsT0FBTyxnQkFBZ0IsWUFBWSxnQkFBZ0IsUUFBUSxZQUFZLGFBQWEsbUJBQW1CLFlBQVksaUJBQWlCLFNBQVEsTUFBTTtBQUVoSixvQkFBSSxXQUFXLFNBQVMsVUFBUyxRQUFRO0FBQ3pDLHlCQUFTLE1BQU0sVUFBVSxhQUFhLFVBQVM7QUFDL0MseUJBQVMsU0FBUztBQUVsQjtBQUNFLDJCQUFTLGVBQWUsUUFBUTtBQUNoQywyQkFBUyxjQUFjLFFBQVE7QUFBQTtBQUdqQyx1QkFBTztBQUFBO0FBQUE7QUFLWCxnQkFBSSxVQUFVLHVCQUF1QixTQUFTLFlBQVksTUFBTTtBQUNoRSxvQkFBUSxNQUFNLFVBQVUsYUFBYSxVQUFTO0FBQzlDLG9CQUFRLFNBQVM7QUFDakIsbUJBQU87QUFBQTtBQUdULGdDQUFzQixhQUFhLFVBQVMsUUFBUSxPQUFPO0FBQ3pELGdCQUFJLGFBQVksUUFBUSxTQUFRLFFBQVEsY0FBYyxTQUFRLFVBQVUsa0JBQWtCLE9BQU8saUJBQWlCLFNBQVEsVUFBVSxtQkFBbUIsT0FBTyxnQkFBZ0I7QUFFNUssa0JBQUksVUFBVSxzQkFBc0IsUUFBUSxZQUFZLE1BQU07QUFDOUQsc0JBQVEsU0FBUztBQUNqQixxQkFBTztBQUFBLG1CQUNGO0FBRUwsa0JBQUksV0FBVyxTQUFTLFVBQVMsT0FBTyxZQUFZO0FBQ3BELHVCQUFTLFNBQVM7QUFDbEIscUJBQU87QUFBQTtBQUFBO0FBSVgsbUNBQXdCLGFBQWEsVUFBUyxVQUFVLE9BQU8sS0FBSztBQUNsRSxnQkFBSSxhQUFZLFFBQVEsU0FBUSxRQUFRLFdBQVU7QUFFaEQsa0JBQUksVUFBVSx3QkFBd0IsVUFBVSxZQUFZLE1BQU0sT0FBTztBQUN6RSxzQkFBUSxTQUFTO0FBQ2pCLHFCQUFPO0FBQUEsbUJBQ0Y7QUFFTCxrQkFBSSxXQUFXLFNBQVMsVUFBUztBQUNqQyx1QkFBUyxTQUFTO0FBQ2xCLHFCQUFPO0FBQUE7QUFBQTtBQUlYLCtCQUFxQixhQUFhLFVBQVUsT0FBTztBQUNqRCxnQkFBSSxPQUFPLGFBQWEsWUFBWSxhQUFhLE1BQU0sT0FBTyxhQUFhLFVBQVU7QUFJbkYsa0JBQUksVUFBVSxvQkFBb0IsS0FBSyxVQUFVLFlBQVksTUFBTTtBQUNuRSxzQkFBUSxTQUFTO0FBQ2pCLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxPQUFPLGFBQWEsWUFBWSxhQUFhLE1BQU07QUFDckQsc0JBQVEsU0FBUztBQUFBLHFCQUNWLG9CQUNIO0FBQ0Usc0JBQUksV0FBVyx1QkFBdUIsVUFBVSxZQUFZLE1BQU07QUFFbEUsMkJBQVMsTUFBTSxVQUFVLGFBQWEsTUFBTTtBQUM1QywyQkFBUyxTQUFTO0FBQ2xCLHlCQUFPO0FBQUE7QUFBQSxxQkFHTixtQkFDSDtBQUNFLHNCQUFJLFlBQVksc0JBQXNCLFVBQVUsWUFBWSxNQUFNO0FBRWxFLDRCQUFVLFNBQVM7QUFDbkIseUJBQU87QUFBQTtBQUFBLHFCQUdOLGlCQUNIO0FBQ0Usc0JBQUksVUFBVSxTQUFTO0FBQ3ZCLHNCQUFJLE9BQU8sU0FBUztBQUNwQix5QkFBTyxZQUFZLGFBQWEsS0FBSyxVQUFVO0FBQUE7QUFBQTtBQUlyRCxrQkFBSSxRQUFRLGFBQWEsY0FBYyxXQUFXO0FBQ2hELG9CQUFJLFlBQVksd0JBQXdCLFVBQVUsWUFBWSxNQUFNLE9BQU87QUFFM0UsMEJBQVUsU0FBUztBQUNuQix1QkFBTztBQUFBO0FBR1QsdUNBQXlCLGFBQWE7QUFBQTtBQUd4QztBQUNFLGtCQUFJLE9BQU8sYUFBYSxZQUFZO0FBQ2xDLG1DQUFtQjtBQUFBO0FBQUE7QUFJdkIsbUJBQU87QUFBQTtBQUdULDhCQUFvQixhQUFhLFVBQVUsVUFBVSxPQUFPO0FBRTFELGdCQUFJLE1BQU0sYUFBYSxPQUFPLFNBQVMsTUFBTTtBQUU3QyxnQkFBSSxPQUFPLGFBQWEsWUFBWSxhQUFhLE1BQU0sT0FBTyxhQUFhLFVBQVU7QUFJbkYsa0JBQUksUUFBUSxNQUFNO0FBQ2hCLHVCQUFPO0FBQUE7QUFHVCxxQkFBTyxlQUFlLGFBQWEsVUFBVSxLQUFLLFVBQVU7QUFBQTtBQUc5RCxnQkFBSSxPQUFPLGFBQWEsWUFBWSxhQUFhLE1BQU07QUFDckQsc0JBQVEsU0FBUztBQUFBLHFCQUNWLG9CQUNIO0FBQ0Usc0JBQUksU0FBUyxRQUFRLEtBQUs7QUFDeEIsMkJBQU8sY0FBYyxhQUFhLFVBQVUsVUFBVTtBQUFBLHlCQUNqRDtBQUNMLDJCQUFPO0FBQUE7QUFBQTtBQUFBLHFCQUlSLG1CQUNIO0FBQ0Usc0JBQUksU0FBUyxRQUFRLEtBQUs7QUFDeEIsMkJBQU8sYUFBYSxhQUFhLFVBQVUsVUFBVTtBQUFBLHlCQUNoRDtBQUNMLDJCQUFPO0FBQUE7QUFBQTtBQUFBLHFCQUlSLGlCQUNIO0FBQ0Usc0JBQUksVUFBVSxTQUFTO0FBQ3ZCLHNCQUFJLE9BQU8sU0FBUztBQUNwQix5QkFBTyxXQUFXLGFBQWEsVUFBVSxLQUFLLFVBQVU7QUFBQTtBQUFBO0FBSTlELGtCQUFJLFFBQVEsYUFBYSxjQUFjLFdBQVc7QUFDaEQsb0JBQUksUUFBUSxNQUFNO0FBQ2hCLHlCQUFPO0FBQUE7QUFHVCx1QkFBTyxnQkFBZSxhQUFhLFVBQVUsVUFBVSxPQUFPO0FBQUE7QUFHaEUsdUNBQXlCLGFBQWE7QUFBQTtBQUd4QztBQUNFLGtCQUFJLE9BQU8sYUFBYSxZQUFZO0FBQ2xDLG1DQUFtQjtBQUFBO0FBQUE7QUFJdkIsbUJBQU87QUFBQTtBQUdULGlDQUF1QixrQkFBa0IsYUFBYSxRQUFRLFVBQVUsT0FBTztBQUM3RSxnQkFBSSxPQUFPLGFBQWEsWUFBWSxhQUFhLE1BQU0sT0FBTyxhQUFhLFVBQVU7QUFHbkYsa0JBQUksZUFBZSxpQkFBaUIsSUFBSSxXQUFXO0FBQ25ELHFCQUFPLGVBQWUsYUFBYSxjQUFjLEtBQUssVUFBVTtBQUFBO0FBR2xFLGdCQUFJLE9BQU8sYUFBYSxZQUFZLGFBQWEsTUFBTTtBQUNyRCxzQkFBUSxTQUFTO0FBQUEscUJBQ1Ysb0JBQ0g7QUFDRSxzQkFBSSxnQkFBZ0IsaUJBQWlCLElBQUksU0FBUyxRQUFRLE9BQU8sU0FBUyxTQUFTLFFBQVE7QUFFM0YseUJBQU8sY0FBYyxhQUFhLGVBQWUsVUFBVTtBQUFBO0FBQUEscUJBRzFELG1CQUNIO0FBQ0Usc0JBQUksaUJBQWlCLGlCQUFpQixJQUFJLFNBQVMsUUFBUSxPQUFPLFNBQVMsU0FBUyxRQUFRO0FBRTVGLHlCQUFPLGFBQWEsYUFBYSxnQkFBZ0IsVUFBVTtBQUFBO0FBQUEscUJBRzFEO0FBQ0gsc0JBQUksVUFBVSxTQUFTO0FBQ3ZCLHNCQUFJLE9BQU8sU0FBUztBQUNwQix5QkFBTyxjQUFjLGtCQUFrQixhQUFhLFFBQVEsS0FBSyxVQUFVO0FBQUE7QUFHL0Usa0JBQUksUUFBUSxhQUFhLGNBQWMsV0FBVztBQUNoRCxvQkFBSSxpQkFBaUIsaUJBQWlCLElBQUksV0FBVztBQUVyRCx1QkFBTyxnQkFBZSxhQUFhLGdCQUFnQixVQUFVLE9BQU87QUFBQTtBQUd0RSx1Q0FBeUIsYUFBYTtBQUFBO0FBR3hDO0FBQ0Usa0JBQUksT0FBTyxhQUFhLFlBQVk7QUFDbEMsbUNBQW1CO0FBQUE7QUFBQTtBQUl2QixtQkFBTztBQUFBO0FBT1Qsb0NBQTBCLE9BQU8sV0FBVyxhQUFhO0FBQ3ZEO0FBQ0Usa0JBQUksT0FBTyxVQUFVLFlBQVksVUFBVSxNQUFNO0FBQy9DLHVCQUFPO0FBQUE7QUFHVCxzQkFBUSxNQUFNO0FBQUEscUJBQ1A7QUFBQSxxQkFDQTtBQUNILG9DQUFrQixPQUFPO0FBQ3pCLHNCQUFJLE1BQU0sTUFBTTtBQUVoQixzQkFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQjtBQUFBO0FBR0Ysc0JBQUksY0FBYyxNQUFNO0FBQ3RCLGdDQUFZLElBQUk7QUFDaEIsOEJBQVUsSUFBSTtBQUNkO0FBQUE7QUFHRixzQkFBSSxDQUFDLFVBQVUsSUFBSSxNQUFNO0FBQ3ZCLDhCQUFVLElBQUk7QUFDZDtBQUFBO0FBR0Ysd0JBQU0sa1JBQWlTO0FBRXZTO0FBQUEscUJBRUc7QUFDSCxzQkFBSSxVQUFVLE1BQU07QUFDcEIsc0JBQUksT0FBTyxNQUFNO0FBQ2pCLG1DQUFpQixLQUFLLFVBQVUsV0FBVztBQUMzQztBQUFBO0FBQUE7QUFJTixtQkFBTztBQUFBO0FBR1QsMENBQWdDLGFBQWEsbUJBQW1CLGFBQWEsT0FBTztBQWdCbEY7QUFFRSxrQkFBSSxZQUFZO0FBRWhCLHVCQUFTLElBQUksR0FBRyxJQUFJLFlBQVksUUFBUSxLQUFLO0FBQzNDLG9CQUFJLFFBQVEsWUFBWTtBQUN4Qiw0QkFBWSxpQkFBaUIsT0FBTyxXQUFXO0FBQUE7QUFBQTtBQUluRCxnQkFBSSxzQkFBc0I7QUFDMUIsZ0JBQUksbUJBQW1CO0FBQ3ZCLGdCQUFJLFdBQVc7QUFDZixnQkFBSSxrQkFBa0I7QUFDdEIsZ0JBQUksU0FBUztBQUNiLGdCQUFJLGVBQWU7QUFFbkIsbUJBQU8sYUFBYSxRQUFRLFNBQVMsWUFBWSxRQUFRLFVBQVU7QUFDakUsa0JBQUksU0FBUyxRQUFRLFFBQVE7QUFDM0IsK0JBQWU7QUFDZiwyQkFBVztBQUFBLHFCQUNOO0FBQ0wsK0JBQWUsU0FBUztBQUFBO0FBRzFCLGtCQUFJLFdBQVcsV0FBVyxhQUFhLFVBQVUsWUFBWSxTQUFTO0FBRXRFLGtCQUFJLGFBQWEsTUFBTTtBQUtyQixvQkFBSSxhQUFhLE1BQU07QUFDckIsNkJBQVc7QUFBQTtBQUdiO0FBQUE7QUFHRixrQkFBSSx3QkFBd0I7QUFDMUIsb0JBQUksWUFBWSxTQUFTLGNBQWMsTUFBTTtBQUczQyw4QkFBWSxhQUFhO0FBQUE7QUFBQTtBQUk3QixnQ0FBa0IsV0FBVyxVQUFVLGlCQUFpQjtBQUV4RCxrQkFBSSxxQkFBcUIsTUFBTTtBQUU3QixzQ0FBc0I7QUFBQSxxQkFDakI7QUFLTCxpQ0FBaUIsVUFBVTtBQUFBO0FBRzdCLGlDQUFtQjtBQUNuQix5QkFBVztBQUFBO0FBR2IsZ0JBQUksV0FBVyxZQUFZLFFBQVE7QUFFakMsc0NBQXdCLGFBQWE7QUFFckMsa0JBQUksa0JBQWtCO0FBQ3BCLG9CQUFJLGdCQUFnQjtBQUNwQiw2QkFBYSxhQUFhO0FBQUE7QUFHNUIscUJBQU87QUFBQTtBQUdULGdCQUFJLGFBQWEsTUFBTTtBQUdyQixxQkFBTyxTQUFTLFlBQVksUUFBUSxVQUFVO0FBQzVDLG9CQUFJLFlBQVksWUFBWSxhQUFhLFlBQVksU0FBUztBQUU5RCxvQkFBSSxjQUFjLE1BQU07QUFDdEI7QUFBQTtBQUdGLGtDQUFrQixXQUFXLFdBQVcsaUJBQWlCO0FBRXpELG9CQUFJLHFCQUFxQixNQUFNO0FBRTdCLHdDQUFzQjtBQUFBLHVCQUNqQjtBQUNMLG1DQUFpQixVQUFVO0FBQUE7QUFHN0IsbUNBQW1CO0FBQUE7QUFHckIsa0JBQUksa0JBQWtCO0FBQ3BCLG9CQUFJLGlCQUFpQjtBQUNyQiw2QkFBYSxhQUFhO0FBQUE7QUFHNUIscUJBQU87QUFBQTtBQUlULGdCQUFJLG1CQUFtQixxQkFBcUIsYUFBYTtBQUV6RCxtQkFBTyxTQUFTLFlBQVksUUFBUSxVQUFVO0FBQzVDLGtCQUFJLGFBQWEsY0FBYyxrQkFBa0IsYUFBYSxRQUFRLFlBQVksU0FBUztBQUUzRixrQkFBSSxlQUFlLE1BQU07QUFDdkIsb0JBQUksd0JBQXdCO0FBQzFCLHNCQUFJLFdBQVcsY0FBYyxNQUFNO0FBS2pDLHFDQUFpQixPQUFPLFdBQVcsUUFBUSxPQUFPLFNBQVMsV0FBVztBQUFBO0FBQUE7QUFJMUUsa0NBQWtCLFdBQVcsWUFBWSxpQkFBaUI7QUFFMUQsb0JBQUkscUJBQXFCLE1BQU07QUFDN0Isd0NBQXNCO0FBQUEsdUJBQ2pCO0FBQ0wsbUNBQWlCLFVBQVU7QUFBQTtBQUc3QixtQ0FBbUI7QUFBQTtBQUFBO0FBSXZCLGdCQUFJLHdCQUF3QjtBQUcxQiwrQkFBaUIsUUFBUSxTQUFVLFFBQU87QUFDeEMsdUJBQU8sWUFBWSxhQUFhO0FBQUE7QUFBQTtBQUlwQyxnQkFBSSxrQkFBa0I7QUFDcEIsa0JBQUksa0JBQWtCO0FBQ3RCLDJCQUFhLGFBQWE7QUFBQTtBQUc1QixtQkFBTztBQUFBO0FBR1QsNkNBQW1DLGFBQWEsbUJBQW1CLHFCQUFxQixPQUFPO0FBRzdGLGdCQUFJLGFBQWEsY0FBYztBQUUvQixnQkFBSSxPQUFPLGVBQWUsWUFBWTtBQUNwQyxvQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQjtBQUdFLGtCQUFJLE9BQU8sV0FBVyxjQUN0QixvQkFBb0IsT0FBTyxpQkFBaUIsYUFBYTtBQUN2RCxvQkFBSSxDQUFDLHdCQUF3QjtBQUMzQix3QkFBTTtBQUFBO0FBR1IseUNBQXlCO0FBQUE7QUFJM0Isa0JBQUksb0JBQW9CLFlBQVksWUFBWTtBQUM5QyxvQkFBSSxDQUFDLGtCQUFrQjtBQUNyQix3QkFBTTtBQUFBO0FBR1IsbUNBQW1CO0FBQUE7QUFLckIsa0JBQUksZUFBZSxXQUFXLEtBQUs7QUFFbkMsa0JBQUksY0FBYztBQUNoQixvQkFBSSxZQUFZO0FBRWhCLG9CQUFJLFFBQVEsYUFBYTtBQUV6Qix1QkFBTyxDQUFDLE1BQU0sTUFBTSxRQUFRLGFBQWEsUUFBUTtBQUMvQyxzQkFBSSxRQUFRLE1BQU07QUFDbEIsOEJBQVksaUJBQWlCLE9BQU8sV0FBVztBQUFBO0FBQUE7QUFBQTtBQUtyRCxnQkFBSSxjQUFjLFdBQVcsS0FBSztBQUVsQyxnQkFBSSxlQUFlLE1BQU07QUFDdkIsb0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsZ0JBQUksc0JBQXNCO0FBQzFCLGdCQUFJLG1CQUFtQjtBQUN2QixnQkFBSSxXQUFXO0FBQ2YsZ0JBQUksa0JBQWtCO0FBQ3RCLGdCQUFJLFNBQVM7QUFDYixnQkFBSSxlQUFlO0FBQ25CLGdCQUFJLE9BQU8sWUFBWTtBQUV2QixtQkFBTyxhQUFhLFFBQVEsQ0FBQyxLQUFLLE1BQU0sVUFBVSxPQUFPLFlBQVksUUFBUTtBQUMzRSxrQkFBSSxTQUFTLFFBQVEsUUFBUTtBQUMzQiwrQkFBZTtBQUNmLDJCQUFXO0FBQUEscUJBQ047QUFDTCwrQkFBZSxTQUFTO0FBQUE7QUFHMUIsa0JBQUksV0FBVyxXQUFXLGFBQWEsVUFBVSxLQUFLLE9BQU87QUFFN0Qsa0JBQUksYUFBYSxNQUFNO0FBS3JCLG9CQUFJLGFBQWEsTUFBTTtBQUNyQiw2QkFBVztBQUFBO0FBR2I7QUFBQTtBQUdGLGtCQUFJLHdCQUF3QjtBQUMxQixvQkFBSSxZQUFZLFNBQVMsY0FBYyxNQUFNO0FBRzNDLDhCQUFZLGFBQWE7QUFBQTtBQUFBO0FBSTdCLGdDQUFrQixXQUFXLFVBQVUsaUJBQWlCO0FBRXhELGtCQUFJLHFCQUFxQixNQUFNO0FBRTdCLHNDQUFzQjtBQUFBLHFCQUNqQjtBQUtMLGlDQUFpQixVQUFVO0FBQUE7QUFHN0IsaUNBQW1CO0FBQ25CLHlCQUFXO0FBQUE7QUFHYixnQkFBSSxLQUFLLE1BQU07QUFFYixzQ0FBd0IsYUFBYTtBQUVyQyxrQkFBSSxrQkFBa0I7QUFDcEIsb0JBQUksZ0JBQWdCO0FBQ3BCLDZCQUFhLGFBQWE7QUFBQTtBQUc1QixxQkFBTztBQUFBO0FBR1QsZ0JBQUksYUFBYSxNQUFNO0FBR3JCLHFCQUFPLENBQUMsS0FBSyxNQUFNLFVBQVUsT0FBTyxZQUFZLFFBQVE7QUFDdEQsb0JBQUksYUFBYSxZQUFZLGFBQWEsS0FBSyxPQUFPO0FBRXRELG9CQUFJLGVBQWUsTUFBTTtBQUN2QjtBQUFBO0FBR0Ysa0NBQWtCLFdBQVcsWUFBWSxpQkFBaUI7QUFFMUQsb0JBQUkscUJBQXFCLE1BQU07QUFFN0Isd0NBQXNCO0FBQUEsdUJBQ2pCO0FBQ0wsbUNBQWlCLFVBQVU7QUFBQTtBQUc3QixtQ0FBbUI7QUFBQTtBQUdyQixrQkFBSSxrQkFBa0I7QUFDcEIsb0JBQUksa0JBQWtCO0FBQ3RCLDZCQUFhLGFBQWE7QUFBQTtBQUc1QixxQkFBTztBQUFBO0FBSVQsZ0JBQUksbUJBQW1CLHFCQUFxQixhQUFhO0FBRXpELG1CQUFPLENBQUMsS0FBSyxNQUFNLFVBQVUsT0FBTyxZQUFZLFFBQVE7QUFDdEQsa0JBQUksYUFBYSxjQUFjLGtCQUFrQixhQUFhLFFBQVEsS0FBSyxPQUFPO0FBRWxGLGtCQUFJLGVBQWUsTUFBTTtBQUN2QixvQkFBSSx3QkFBd0I7QUFDMUIsc0JBQUksV0FBVyxjQUFjLE1BQU07QUFLakMscUNBQWlCLE9BQU8sV0FBVyxRQUFRLE9BQU8sU0FBUyxXQUFXO0FBQUE7QUFBQTtBQUkxRSxrQ0FBa0IsV0FBVyxZQUFZLGlCQUFpQjtBQUUxRCxvQkFBSSxxQkFBcUIsTUFBTTtBQUM3Qix3Q0FBc0I7QUFBQSx1QkFDakI7QUFDTCxtQ0FBaUIsVUFBVTtBQUFBO0FBRzdCLG1DQUFtQjtBQUFBO0FBQUE7QUFJdkIsZ0JBQUksd0JBQXdCO0FBRzFCLCtCQUFpQixRQUFRLFNBQVUsUUFBTztBQUN4Qyx1QkFBTyxZQUFZLGFBQWE7QUFBQTtBQUFBO0FBSXBDLGdCQUFJLGtCQUFrQjtBQUNwQixrQkFBSSxrQkFBa0I7QUFDdEIsMkJBQWEsYUFBYTtBQUFBO0FBRzVCLG1CQUFPO0FBQUE7QUFHVCwyQ0FBaUMsYUFBYSxtQkFBbUIsYUFBYSxPQUFPO0FBR25GLGdCQUFJLHNCQUFzQixRQUFRLGtCQUFrQixRQUFRLFVBQVU7QUFHcEUsc0NBQXdCLGFBQWEsa0JBQWtCO0FBQ3ZELGtCQUFJLFdBQVcsU0FBUyxtQkFBbUI7QUFDM0MsdUJBQVMsU0FBUztBQUNsQixxQkFBTztBQUFBO0FBS1Qsb0NBQXdCLGFBQWE7QUFDckMsZ0JBQUksVUFBVSxvQkFBb0IsYUFBYSxZQUFZLE1BQU07QUFDakUsb0JBQVEsU0FBUztBQUNqQixtQkFBTztBQUFBO0FBR1QsMENBQWdDLGFBQWEsbUJBQW1CLFNBQVMsT0FBTztBQUM5RSxnQkFBSSxNQUFNLFFBQVE7QUFDbEIsZ0JBQUksUUFBUTtBQUVaLG1CQUFPLFVBQVUsTUFBTTtBQUdyQixrQkFBSSxNQUFNLFFBQVEsS0FBSztBQUNyQixvQkFBSSxjQUFjLFFBQVE7QUFFMUIsb0JBQUksZ0JBQWdCLHFCQUFxQjtBQUN2QyxzQkFBSSxNQUFNLFFBQVEsV0FBVTtBQUMxQiw0Q0FBd0IsYUFBYSxNQUFNO0FBQzNDLHdCQUFJLFdBQVcsU0FBUyxPQUFPLFFBQVEsTUFBTTtBQUM3Qyw2QkFBUyxTQUFTO0FBRWxCO0FBQ0UsK0JBQVMsZUFBZSxRQUFRO0FBQ2hDLCtCQUFTLGNBQWMsUUFBUTtBQUFBO0FBR2pDLDJCQUFPO0FBQUE7QUFBQSx1QkFFSjtBQUNMLHNCQUFJLE1BQU0sZ0JBQWdCLGVBQ3pCLGtDQUFrQyxPQUFPLFlBSTFDLE9BQU8sZ0JBQWdCLFlBQVksZ0JBQWdCLFFBQVEsWUFBWSxhQUFhLG1CQUFtQixZQUFZLGlCQUFpQixNQUFNLE1BQU07QUFDOUksNENBQXdCLGFBQWEsTUFBTTtBQUUzQyx3QkFBSSxZQUFZLFNBQVMsT0FBTyxRQUFRO0FBRXhDLDhCQUFVLE1BQU0sVUFBVSxhQUFhLE9BQU87QUFDOUMsOEJBQVUsU0FBUztBQUVuQjtBQUNFLGdDQUFVLGVBQWUsUUFBUTtBQUNqQyxnQ0FBVSxjQUFjLFFBQVE7QUFBQTtBQUdsQywyQkFBTztBQUFBO0FBQUE7QUFLWCx3Q0FBd0IsYUFBYTtBQUNyQztBQUFBLHFCQUNLO0FBQ0wsNEJBQVksYUFBYTtBQUFBO0FBRzNCLHNCQUFRLE1BQU07QUFBQTtBQUdoQixnQkFBSSxRQUFRLFNBQVMscUJBQXFCO0FBQ3hDLGtCQUFJLFVBQVUsd0JBQXdCLFFBQVEsTUFBTSxVQUFVLFlBQVksTUFBTSxPQUFPLFFBQVE7QUFDL0Ysc0JBQVEsU0FBUztBQUNqQixxQkFBTztBQUFBLG1CQUNGO0FBQ0wsa0JBQUksWUFBWSx1QkFBdUIsU0FBUyxZQUFZLE1BQU07QUFFbEUsd0JBQVUsTUFBTSxVQUFVLGFBQWEsbUJBQW1CO0FBQzFELHdCQUFVLFNBQVM7QUFDbkIscUJBQU87QUFBQTtBQUFBO0FBSVgseUNBQStCLGFBQWEsbUJBQW1CLFFBQVEsT0FBTztBQUM1RSxnQkFBSSxNQUFNLE9BQU87QUFDakIsZ0JBQUksUUFBUTtBQUVaLG1CQUFPLFVBQVUsTUFBTTtBQUdyQixrQkFBSSxNQUFNLFFBQVEsS0FBSztBQUNyQixvQkFBSSxNQUFNLFFBQVEsY0FBYyxNQUFNLFVBQVUsa0JBQWtCLE9BQU8saUJBQWlCLE1BQU0sVUFBVSxtQkFBbUIsT0FBTyxnQkFBZ0I7QUFDbEosMENBQXdCLGFBQWEsTUFBTTtBQUMzQyxzQkFBSSxXQUFXLFNBQVMsT0FBTyxPQUFPLFlBQVk7QUFDbEQsMkJBQVMsU0FBUztBQUNsQix5QkFBTztBQUFBLHVCQUNGO0FBQ0wsMENBQXdCLGFBQWE7QUFDckM7QUFBQTtBQUFBLHFCQUVHO0FBQ0wsNEJBQVksYUFBYTtBQUFBO0FBRzNCLHNCQUFRLE1BQU07QUFBQTtBQUdoQixnQkFBSSxVQUFVLHNCQUFzQixRQUFRLFlBQVksTUFBTTtBQUM5RCxvQkFBUSxTQUFTO0FBQ2pCLG1CQUFPO0FBQUE7QUFNVCx5Q0FBOEIsYUFBYSxtQkFBbUIsVUFBVSxPQUFPO0FBUTdFLGdCQUFJLDRCQUE0QixPQUFPLGFBQWEsWUFBWSxhQUFhLFFBQVEsU0FBUyxTQUFTLHVCQUF1QixTQUFTLFFBQVE7QUFFL0ksZ0JBQUksMkJBQTJCO0FBQzdCLHlCQUFXLFNBQVMsTUFBTTtBQUFBO0FBSTVCLGdCQUFJLE9BQU8sYUFBYSxZQUFZLGFBQWEsTUFBTTtBQUNyRCxzQkFBUSxTQUFTO0FBQUEscUJBQ1Y7QUFDSCx5QkFBTyxpQkFBaUIsdUJBQXVCLGFBQWEsbUJBQW1CLFVBQVU7QUFBQSxxQkFFdEY7QUFDSCx5QkFBTyxpQkFBaUIsc0JBQXNCLGFBQWEsbUJBQW1CLFVBQVU7QUFBQSxxQkFFckY7QUFDSCxzQkFBSSxVQUFVLFNBQVM7QUFDdkIsc0JBQUksT0FBTyxTQUFTO0FBRXBCLHlCQUFPLHNCQUFxQixhQUFhLG1CQUFtQixLQUFLLFVBQVU7QUFBQTtBQUcvRSxrQkFBSSxRQUFRLFdBQVc7QUFDckIsdUJBQU8sdUJBQXVCLGFBQWEsbUJBQW1CLFVBQVU7QUFBQTtBQUcxRSxrQkFBSSxjQUFjLFdBQVc7QUFDM0IsdUJBQU8sMEJBQTBCLGFBQWEsbUJBQW1CLFVBQVU7QUFBQTtBQUc3RSx1Q0FBeUIsYUFBYTtBQUFBO0FBR3hDLGdCQUFJLE9BQU8sYUFBYSxZQUFZLGFBQWEsTUFBTSxPQUFPLGFBQWEsVUFBVTtBQUNuRixxQkFBTyxpQkFBaUIsd0JBQXdCLGFBQWEsbUJBQW1CLEtBQUssVUFBVTtBQUFBO0FBR2pHO0FBQ0Usa0JBQUksT0FBTyxhQUFhLFlBQVk7QUFDbEMsbUNBQW1CO0FBQUE7QUFBQTtBQUt2QixtQkFBTyx3QkFBd0IsYUFBYTtBQUFBO0FBRzlDLGlCQUFPO0FBQUE7QUFHVCxZQUFJLHVCQUF1QixnQkFBZ0I7QUFDM0MsWUFBSSxtQkFBbUIsZ0JBQWdCO0FBQ3ZDLGtDQUEwQixVQUFTLGlCQUFnQjtBQUNqRCxjQUFJLGFBQVksUUFBUSxnQkFBZSxVQUFVLFNBQVEsT0FBTztBQUM5RCxrQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQixjQUFJLGdCQUFlLFVBQVUsTUFBTTtBQUNqQztBQUFBO0FBR0YsY0FBSSxlQUFlLGdCQUFlO0FBQ2xDLGNBQUksV0FBVyxxQkFBcUIsY0FBYyxhQUFhO0FBQy9ELDBCQUFlLFFBQVE7QUFDdkIsbUJBQVMsU0FBUztBQUVsQixpQkFBTyxhQUFhLFlBQVksTUFBTTtBQUNwQywyQkFBZSxhQUFhO0FBQzVCLHVCQUFXLFNBQVMsVUFBVSxxQkFBcUIsY0FBYyxhQUFhO0FBQzlFLHFCQUFTLFNBQVM7QUFBQTtBQUdwQixtQkFBUyxVQUFVO0FBQUE7QUFHckIsa0NBQTBCLGlCQUFnQixPQUFPO0FBQy9DLGNBQUksUUFBUSxnQkFBZTtBQUUzQixpQkFBTyxVQUFVLE1BQU07QUFDckIsZ0NBQW9CLE9BQU87QUFDM0Isb0JBQVEsTUFBTTtBQUFBO0FBQUE7QUFJbEIsWUFBSSxhQUFhO0FBQ2pCLFlBQUksdUJBQXVCLGFBQWE7QUFDeEMsWUFBSSwwQkFBMEIsYUFBYTtBQUMzQyxZQUFJLDBCQUEwQixhQUFhO0FBRTNDLGlDQUF5QixHQUFHO0FBQzFCLGNBQUksTUFBTSxZQUFZO0FBQ3BCLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGlCQUFPO0FBQUE7QUFHVCx3Q0FBZ0M7QUFDOUIsY0FBSSxlQUFlLGdCQUFnQix3QkFBd0I7QUFDM0QsaUJBQU87QUFBQTtBQUdULG1DQUEyQixPQUFPLGtCQUFrQjtBQUdsRCxlQUFLLHlCQUF5QixrQkFBa0I7QUFHaEQsZUFBSyx5QkFBeUIsT0FBTztBQU1yQyxlQUFLLHNCQUFzQixZQUFZO0FBQ3ZDLGNBQUksa0JBQWtCLG1CQUFtQjtBQUV6QyxjQUFJLHNCQUFzQjtBQUMxQixlQUFLLHNCQUFzQixpQkFBaUI7QUFBQTtBQUc5QyxrQ0FBMEIsT0FBTztBQUMvQixjQUFJLHNCQUFzQjtBQUMxQixjQUFJLHlCQUF5QjtBQUM3QixjQUFJLHlCQUF5QjtBQUFBO0FBRy9CLGtDQUEwQjtBQUN4QixjQUFJLFVBQVUsZ0JBQWdCLHFCQUFxQjtBQUNuRCxpQkFBTztBQUFBO0FBR1QsaUNBQXlCLE9BQU87QUFDOUIsY0FBSSxlQUFlLGdCQUFnQix3QkFBd0I7QUFDM0QsY0FBSSxVQUFVLGdCQUFnQixxQkFBcUI7QUFDbkQsY0FBSSxjQUFjLG9CQUFvQixTQUFTLE1BQU07QUFFckQsY0FBSSxZQUFZLGFBQWE7QUFDM0I7QUFBQTtBQUtGLGVBQUsseUJBQXlCLE9BQU87QUFDckMsZUFBSyxzQkFBc0IsYUFBYTtBQUFBO0FBRzFDLGdDQUF3QixPQUFPO0FBRzdCLGNBQUksd0JBQXdCLFlBQVksT0FBTztBQUM3QztBQUFBO0FBR0YsY0FBSSxzQkFBc0I7QUFDMUIsY0FBSSx5QkFBeUI7QUFBQTtBQUcvQixZQUFJLHlCQUF5QjtBQUs3QixZQUFJLDZCQUE2QjtBQVFqQyxZQUFJLGlDQUFpQztBQUlyQyxZQUFJLHdCQUF3QjtBQUM1QixZQUFJLHNCQUFzQixhQUFhO0FBQ3ZDLG9DQUE0QixlQUFlLE1BQU07QUFDL0MsaUJBQVEsaUJBQWdCLFVBQVU7QUFBQTtBQUVwQyxrREFBMEMsZUFBZTtBQUN2RCxpQkFBTyxnQkFBZ0I7QUFBQTtBQUV6QiwyQ0FBbUMsZUFBZSxnQkFBZ0I7QUFDaEUsaUJBQU8sZ0JBQWdCLDZCQUE2QjtBQUFBO0FBRXRELDJDQUFtQyxlQUFlLGdCQUFnQjtBQUNoRSxpQkFBTyxnQkFBZ0I7QUFBQTtBQUV6QixxQ0FBNkIsT0FBTyxZQUFZO0FBQzlDLGVBQUsscUJBQXFCLFlBQVk7QUFBQTtBQUV4QyxvQ0FBNEIsT0FBTztBQUNqQyxjQUFJLHFCQUFxQjtBQUFBO0FBRzNCLHVDQUErQixpQkFBZ0Isb0JBQW9CO0FBR2pFLGNBQUksWUFBWSxnQkFBZTtBQUUvQixjQUFJLGNBQWMsTUFBTTtBQUN0QixnQkFBSSxVQUFVLGVBQWUsTUFBTTtBQUVqQyxxQkFBTztBQUFBO0FBR1QsbUJBQU87QUFBQTtBQUdULGNBQUksUUFBUSxnQkFBZTtBQUUzQjtBQUNFLG1CQUFPO0FBQUE7QUFBQTtBQUdYLG9DQUE0QixLQUFLO0FBQy9CLGNBQUksT0FBTztBQUVYLGlCQUFPLFNBQVMsTUFBTTtBQUNwQixnQkFBSSxLQUFLLFFBQVEsbUJBQW1CO0FBQ2xDLGtCQUFJLFFBQVEsS0FBSztBQUVqQixrQkFBSSxVQUFVLE1BQU07QUFDbEIsb0JBQUksYUFBYSxNQUFNO0FBRXZCLG9CQUFJLGVBQWUsUUFBUSwwQkFBMEIsZUFBZSwyQkFBMkIsYUFBYTtBQUMxRyx5QkFBTztBQUFBO0FBQUE7QUFBQSx1QkFHRixLQUFLLFFBQVEseUJBRXhCLEtBQUssY0FBYyxnQkFBZ0IsUUFBVztBQUM1QyxrQkFBSSxhQUFjLE1BQUssUUFBUSxnQkFBZ0I7QUFFL0Msa0JBQUksWUFBWTtBQUNkLHVCQUFPO0FBQUE7QUFBQSx1QkFFQSxLQUFLLFVBQVUsTUFBTTtBQUM5QixtQkFBSyxNQUFNLFNBQVM7QUFDcEIscUJBQU8sS0FBSztBQUNaO0FBQUE7QUFHRixnQkFBSSxTQUFTLEtBQUs7QUFDaEIscUJBQU87QUFBQTtBQUdULG1CQUFPLEtBQUssWUFBWSxNQUFNO0FBQzVCLGtCQUFJLEtBQUssV0FBVyxRQUFRLEtBQUssV0FBVyxLQUFLO0FBQy9DLHVCQUFPO0FBQUE7QUFHVCxxQkFBTyxLQUFLO0FBQUE7QUFHZCxpQkFBSyxRQUFRLFNBQVMsS0FBSztBQUMzQixtQkFBTyxLQUFLO0FBQUE7QUFHZCxpQkFBTztBQUFBO0FBR1QsWUFBSSxZQUVKO0FBRUEsWUFBSSxZQUVKO0FBRUEsWUFBSSxZQUVKO0FBQ0EsWUFBSSxTQUVKO0FBQ0EsWUFBSSxZQUVKO0FBS0EsWUFBSSx3QkFBd0I7QUFDNUIsK0NBQXVDO0FBQ3JDLG1CQUFTLElBQUksR0FBRyxJQUFJLHNCQUFzQixRQUFRLEtBQUs7QUFDckQsZ0JBQUksZ0JBQWdCLHNCQUFzQjtBQUUxQztBQUNFLDRCQUFjLGdDQUFnQztBQUFBO0FBQUE7QUFJbEQsZ0NBQXNCLFNBQVM7QUFBQTtBQU1qQyxtREFBMkMsT0FBTSxlQUFlO0FBQzlELGNBQUksYUFBYSxjQUFjO0FBQy9CLGNBQUksVUFBVSxXQUFXLGNBQWM7QUFHdkMsY0FBSSxNQUFLLG1DQUFtQyxNQUFNO0FBQ2hELGtCQUFLLGtDQUFrQyxDQUFDLGVBQWU7QUFBQSxpQkFDbEQ7QUFDTCxrQkFBSyxnQ0FBZ0MsS0FBSyxlQUFlO0FBQUE7QUFBQTtBQUk3RCxZQUFJLDJCQUEyQixxQkFBcUIsd0JBQ2hELDRCQUE0QixxQkFBcUI7QUFDckQsWUFBSTtBQUNKLFlBQUk7QUFFSjtBQUNFLG9EQUEwQyxJQUFJO0FBQUE7QUFJaEQsWUFBSSxjQUFjO0FBR2xCLFlBQUksNEJBQTRCO0FBS2hDLFlBQUksY0FBYztBQUNsQixZQUFJLHFCQUFxQjtBQUt6QixZQUFJLCtCQUErQjtBQUtuQyxZQUFJLDZDQUE2QztBQUVqRCxZQUFJLGlCQUFpQjtBQUlyQixZQUFJLHdCQUF3QjtBQUM1QixZQUFJLGtCQUFrQjtBQUV0QixZQUFJLHVCQUF1QjtBQUkzQixZQUFJLGVBQWU7QUFDbkIsWUFBSSwwQkFBMEI7QUFJOUIsWUFBSSw2QkFBNkI7QUFFakMscUNBQTZCO0FBQzNCO0FBQ0UsZ0JBQUksV0FBVztBQUVmLGdCQUFJLGlCQUFpQixNQUFNO0FBQ3pCLDZCQUFlLENBQUM7QUFBQSxtQkFDWDtBQUNMLDJCQUFhLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFLeEIsc0NBQThCO0FBQzVCO0FBQ0UsZ0JBQUksV0FBVztBQUVmLGdCQUFJLGlCQUFpQixNQUFNO0FBQ3pCO0FBRUEsa0JBQUksYUFBYSw2QkFBNkIsVUFBVTtBQUN0RCx3Q0FBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1oQyxzQ0FBOEIsTUFBTTtBQUNsQztBQUNFLGdCQUFJLFNBQVMsVUFBYSxTQUFTLFFBQVEsQ0FBQyxRQUFRLE9BQU87QUFHekQsb0JBQU0sb0lBQXlJLHNCQUFzQixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBS2xMLHlDQUFpQyxpQkFBaUI7QUFDaEQ7QUFDRSxnQkFBSSxnQkFBZ0IsMEJBQTBCO0FBRTlDLGdCQUFJLENBQUMsd0NBQXdDLElBQUksZ0JBQWdCO0FBQy9ELHNEQUF3QyxJQUFJO0FBRTVDLGtCQUFJLGlCQUFpQixNQUFNO0FBQ3pCLG9CQUFJLFFBQVE7QUFDWixvQkFBSSxvQkFBb0I7QUFFeEIseUJBQVMsSUFBSSxHQUFHLEtBQUsseUJBQXlCLEtBQUs7QUFDakQsc0JBQUksY0FBYyxhQUFhO0FBQy9CLHNCQUFJLGNBQWMsTUFBTSwwQkFBMEIsa0JBQWtCO0FBQ3BFLHNCQUFJLE1BQU0sSUFBSSxJQUFJLE9BQU87QUFHekIseUJBQU8sSUFBSSxTQUFTLG1CQUFtQjtBQUNyQywyQkFBTztBQUFBO0FBR1QseUJBQU8sY0FBYztBQUNyQiwyQkFBUztBQUFBO0FBR1gsc0JBQU0saVhBQStZLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU01YSx5Q0FBaUM7QUFDL0IsZ0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsb0NBQTRCLFVBQVUsVUFBVTtBQUM5QztBQUNFLGdCQUFJLDRCQUE0QjtBQUU5QixxQkFBTztBQUFBO0FBQUE7QUFJWCxjQUFJLGFBQWEsTUFBTTtBQUNyQjtBQUNFLG9CQUFNLDRLQUFzTDtBQUFBO0FBRzlMLG1CQUFPO0FBQUE7QUFHVDtBQUdFLGdCQUFJLFNBQVMsV0FBVyxTQUFTLFFBQVE7QUFDdkMsb0JBQU0sc0pBQXFLLHNCQUFzQixNQUFNLFNBQVMsS0FBSyxRQUFRLEtBQUssTUFBTSxTQUFTLEtBQUssUUFBUTtBQUFBO0FBQUE7QUFJbFEsbUJBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxVQUFVLElBQUksU0FBUyxRQUFRLEtBQUs7QUFDL0QsZ0JBQUksU0FBUyxTQUFTLElBQUksU0FBUyxLQUFLO0FBQ3RDO0FBQUE7QUFHRixtQkFBTztBQUFBO0FBR1QsaUJBQU87QUFBQTtBQUdULGlDQUF5QixVQUFTLGlCQUFnQixXQUFXLE9BQU8sV0FBVyxpQkFBaUI7QUFDOUYsd0JBQWM7QUFDZCxzQ0FBNEI7QUFFNUI7QUFDRSwyQkFBZSxhQUFZLE9BQU8sU0FBUSxrQkFBa0I7QUFDNUQsc0NBQTBCO0FBRTFCLHlDQUE2QixhQUFZLFFBQVEsU0FBUSxTQUFTLGdCQUFlO0FBQUE7QUFHbkYsMEJBQWUsZ0JBQWdCO0FBQy9CLDBCQUFlLGNBQWM7QUFDN0IsMEJBQWUsUUFBUTtBQVl2QjtBQUNFLGdCQUFJLGFBQVksUUFBUSxTQUFRLGtCQUFrQixNQUFNO0FBQ3RELHVDQUF5QixVQUFVO0FBQUEsdUJBQzFCLGlCQUFpQixNQUFNO0FBTWhDLHVDQUF5QixVQUFVO0FBQUEsbUJBQzlCO0FBQ0wsdUNBQXlCLFVBQVU7QUFBQTtBQUFBO0FBSXZDLGNBQUksV0FBVyxVQUFVLE9BQU87QUFFaEMsY0FBSSw0Q0FBNEM7QUFHOUMsZ0JBQUksb0JBQW9CO0FBRXhCLGVBQUc7QUFDRCwyREFBNkM7QUFDN0MsK0JBQWlCO0FBRWpCLGtCQUFJLHFCQUFxQixpQkFBaUI7QUFDeEMsc0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsbUNBQXFCO0FBRXJCO0FBR0UsNkNBQTZCO0FBQUE7QUFJL0IsNEJBQWM7QUFDZCxtQ0FBcUI7QUFDckIsOEJBQWUsY0FBYztBQUU3QjtBQUVFLDBDQUEwQjtBQUFBO0FBRzVCLHVDQUF5QixVQUFXO0FBQ3BDLHlCQUFXLFVBQVUsT0FBTztBQUFBLHFCQUNyQjtBQUFBO0FBS1gsbUNBQXlCLFVBQVU7QUFFbkM7QUFDRSw0QkFBZSxrQkFBa0I7QUFBQTtBQUtuQyxjQUFJLHVCQUF1QixnQkFBZ0IsUUFBUSxZQUFZLFNBQVM7QUFDeEUsd0JBQWM7QUFDZCxzQ0FBNEI7QUFDNUIsd0JBQWM7QUFDZCwrQkFBcUI7QUFFckI7QUFDRSxtQ0FBdUI7QUFDdkIsMkJBQWU7QUFDZixzQ0FBMEI7QUFLMUIsZ0JBQUksYUFBWSxRQUFTLFVBQVEsUUFBUSxnQkFBaUIsaUJBQWUsUUFBUSxlQUtoRixVQUFRLE9BQU8sb0JBQW9CLFFBQVE7QUFDMUMsb0JBQU07QUFBQTtBQUFBO0FBSVYseUNBQStCO0FBRy9CLGNBQUksc0JBQXNCO0FBQ3hCLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGlCQUFPO0FBQUE7QUFFVCx3Q0FBZ0M7QUFJOUIsY0FBSSxrQkFBa0IsbUJBQW1CO0FBQ3pDLDJCQUFpQjtBQUNqQixpQkFBTztBQUFBO0FBRVQsOEJBQXNCLFVBQVMsaUJBQWdCLE9BQU87QUFDcEQsMEJBQWUsY0FBYyxTQUFRO0FBR3JDLGNBQU0saUJBQWUsT0FBTyx1QkFBdUIsUUFBUTtBQUN6RCw0QkFBZSxTQUFTLENBQUUsbUJBQWtCLGlCQUFpQixVQUFVO0FBQUEsaUJBQ2xFO0FBQ0wsNEJBQWUsU0FBUyxDQUFFLFdBQVU7QUFBQTtBQUd0QyxtQkFBUSxRQUFRLFlBQVksU0FBUSxPQUFPO0FBQUE7QUFFN0Msd0NBQWdDO0FBRzlCLG1DQUF5QixVQUFVO0FBRW5DLGNBQUksOEJBQThCO0FBU2hDLGdCQUFJLE9BQU8sMEJBQTBCO0FBRXJDLG1CQUFPLFNBQVMsTUFBTTtBQUNwQixrQkFBSSxRQUFRLEtBQUs7QUFFakIsa0JBQUksVUFBVSxNQUFNO0FBQ2xCLHNCQUFNLFVBQVU7QUFBQTtBQUdsQixxQkFBTyxLQUFLO0FBQUE7QUFHZCwyQ0FBK0I7QUFBQTtBQUdqQyx3QkFBYztBQUNkLHNDQUE0QjtBQUM1Qix3QkFBYztBQUNkLCtCQUFxQjtBQUVyQjtBQUNFLDJCQUFlO0FBQ2Ysc0NBQTBCO0FBQzFCLG1DQUF1QjtBQUN2QixpREFBcUM7QUFBQTtBQUd2Qyx1REFBNkM7QUFDN0MsMkJBQWlCO0FBQUE7QUFHbkIsMkNBQW1DO0FBQ2pDLGNBQUksT0FBTztBQUFBLFlBQ1QsZUFBZTtBQUFBLFlBQ2YsV0FBVztBQUFBLFlBQ1gsV0FBVztBQUFBLFlBQ1gsT0FBTztBQUFBLFlBQ1AsTUFBTTtBQUFBO0FBR1IsY0FBSSx1QkFBdUIsTUFBTTtBQUUvQixzQ0FBMEIsZ0JBQWdCLHFCQUFxQjtBQUFBLGlCQUMxRDtBQUVMLGlDQUFxQixtQkFBbUIsT0FBTztBQUFBO0FBR2pELGlCQUFPO0FBQUE7QUFHVCw0Q0FBb0M7QUFNbEMsY0FBSTtBQUVKLGNBQUksZ0JBQWdCLE1BQU07QUFDeEIsZ0JBQUksV0FBVSwwQkFBMEI7QUFFeEMsZ0JBQUksYUFBWSxNQUFNO0FBQ3BCLGdDQUFrQixTQUFRO0FBQUEsbUJBQ3JCO0FBQ0wsZ0NBQWtCO0FBQUE7QUFBQSxpQkFFZjtBQUNMLDhCQUFrQixZQUFZO0FBQUE7QUFHaEMsY0FBSTtBQUVKLGNBQUksdUJBQXVCLE1BQU07QUFDL0IscUNBQXlCLDBCQUEwQjtBQUFBLGlCQUM5QztBQUNMLHFDQUF5QixtQkFBbUI7QUFBQTtBQUc5QyxjQUFJLDJCQUEyQixNQUFNO0FBRW5DLGlDQUFxQjtBQUNyQixxQ0FBeUIsbUJBQW1CO0FBQzVDLDBCQUFjO0FBQUEsaUJBQ1Q7QUFFTCxnQkFBSSxvQkFBb0IsTUFBTTtBQUM1QixvQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQiwwQkFBYztBQUNkLGdCQUFJLFVBQVU7QUFBQSxjQUNaLGVBQWUsWUFBWTtBQUFBLGNBQzNCLFdBQVcsWUFBWTtBQUFBLGNBQ3ZCLFdBQVcsWUFBWTtBQUFBLGNBQ3ZCLE9BQU8sWUFBWTtBQUFBLGNBQ25CLE1BQU07QUFBQTtBQUdSLGdCQUFJLHVCQUF1QixNQUFNO0FBRS9CLHdDQUEwQixnQkFBZ0IscUJBQXFCO0FBQUEsbUJBQzFEO0FBRUwsbUNBQXFCLG1CQUFtQixPQUFPO0FBQUE7QUFBQTtBQUluRCxpQkFBTztBQUFBO0FBR1Qsc0RBQThDO0FBQzVDLGlCQUFPO0FBQUEsWUFDTCxZQUFZO0FBQUEsWUFDWixRQUFRO0FBQUE7QUFBQTtBQUlaLG1DQUEyQixPQUFPLFFBQVE7QUFFeEMsaUJBQU8sT0FBTyxXQUFXLGFBQWEsT0FBTyxTQUFTO0FBQUE7QUFHeEQsOEJBQXNCLFNBQVMsWUFBWSxNQUFNO0FBQy9DLGNBQUksT0FBTztBQUNYLGNBQUk7QUFFSixjQUFJLFNBQVMsUUFBVztBQUN0QiwyQkFBZSxLQUFLO0FBQUEsaUJBQ2Y7QUFDTCwyQkFBZTtBQUFBO0FBR2pCLGVBQUssZ0JBQWdCLEtBQUssWUFBWTtBQUN0QyxjQUFJLFFBQVE7QUFBQSxZQUNWLFNBQVM7QUFBQSxZQUNULGFBQWE7QUFBQSxZQUNiLE9BQU87QUFBQSxZQUNQLFVBQVU7QUFBQSxZQUNWLHFCQUFxQjtBQUFBLFlBQ3JCLG1CQUFtQjtBQUFBO0FBRXJCLGVBQUssUUFBUTtBQUNiLGNBQUksV0FBVyxNQUFNLFdBQVcsc0JBQXNCLEtBQUssTUFBTSwyQkFBMkI7QUFDNUYsaUJBQU8sQ0FBQyxLQUFLLGVBQWU7QUFBQTtBQUc5QiwrQkFBdUIsU0FBUyxZQUFZLE1BQU07QUFDaEQsY0FBSSxPQUFPO0FBQ1gsY0FBSSxRQUFRLEtBQUs7QUFFakIsY0FBSSxVQUFVLE1BQU07QUFDbEIsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsZ0JBQU0sc0JBQXNCO0FBQzVCLGNBQUksV0FBVTtBQUVkLGNBQUksWUFBWSxTQUFRO0FBRXhCLGNBQUksZUFBZSxNQUFNO0FBRXpCLGNBQUksaUJBQWlCLE1BQU07QUFHekIsZ0JBQUksY0FBYyxNQUFNO0FBRXRCLGtCQUFJLFlBQVksVUFBVTtBQUMxQixrQkFBSSxlQUFlLGFBQWE7QUFDaEMsd0JBQVUsT0FBTztBQUNqQiwyQkFBYSxPQUFPO0FBQUE7QUFHdEI7QUFDRSxrQkFBSSxTQUFRLGNBQWMsV0FBVztBQUduQyxzQkFBTTtBQUFBO0FBQUE7QUFJVixxQkFBUSxZQUFZLFlBQVk7QUFDaEMsa0JBQU0sVUFBVTtBQUFBO0FBR2xCLGNBQUksY0FBYyxNQUFNO0FBRXRCLGdCQUFJLFFBQVEsVUFBVTtBQUN0QixnQkFBSSxXQUFXLFNBQVE7QUFDdkIsZ0JBQUksZUFBZTtBQUNuQixnQkFBSSxvQkFBb0I7QUFDeEIsZ0JBQUksbUJBQW1CO0FBQ3ZCLGdCQUFJLFNBQVM7QUFFYixlQUFHO0FBQ0Qsa0JBQUksYUFBYSxPQUFPO0FBRXhCLGtCQUFJLENBQUMsZ0JBQWdCLGFBQWEsYUFBYTtBQUk3QyxvQkFBSSxRQUFRO0FBQUEsa0JBQ1YsTUFBTTtBQUFBLGtCQUNOLFFBQVEsT0FBTztBQUFBLGtCQUNmLGVBQWUsT0FBTztBQUFBLGtCQUN0QixZQUFZLE9BQU87QUFBQSxrQkFDbkIsTUFBTTtBQUFBO0FBR1Isb0JBQUkscUJBQXFCLE1BQU07QUFDN0Isc0NBQW9CLG1CQUFtQjtBQUN2QyxpQ0FBZTtBQUFBLHVCQUNWO0FBQ0wscUNBQW1CLGlCQUFpQixPQUFPO0FBQUE7QUFNN0MsMENBQTBCLFFBQVEsV0FBVywwQkFBMEIsT0FBTztBQUM5RSx1Q0FBdUI7QUFBQSxxQkFDbEI7QUFFTCxvQkFBSSxxQkFBcUIsTUFBTTtBQUM3QixzQkFBSSxTQUFTO0FBQUEsb0JBSVgsTUFBTTtBQUFBLG9CQUNOLFFBQVEsT0FBTztBQUFBLG9CQUNmLGVBQWUsT0FBTztBQUFBLG9CQUN0QixZQUFZLE9BQU87QUFBQSxvQkFDbkIsTUFBTTtBQUFBO0FBRVIscUNBQW1CLGlCQUFpQixPQUFPO0FBQUE7QUFJN0Msb0JBQUksT0FBTyxlQUFlO0FBR3hCLDZCQUFXLE9BQU87QUFBQSx1QkFDYjtBQUNMLHNCQUFJLFNBQVMsT0FBTztBQUNwQiw2QkFBVyxRQUFRLFVBQVU7QUFBQTtBQUFBO0FBSWpDLHVCQUFTLE9BQU87QUFBQSxxQkFDVCxXQUFXLFFBQVEsV0FBVztBQUV2QyxnQkFBSSxxQkFBcUIsTUFBTTtBQUM3Qiw2QkFBZTtBQUFBLG1CQUNWO0FBQ0wsK0JBQWlCLE9BQU87QUFBQTtBQUsxQixnQkFBSSxDQUFDLFNBQVMsVUFBVSxLQUFLLGdCQUFnQjtBQUMzQztBQUFBO0FBR0YsaUJBQUssZ0JBQWdCO0FBQ3JCLGlCQUFLLFlBQVk7QUFDakIsaUJBQUssWUFBWTtBQUNqQixrQkFBTSxvQkFBb0I7QUFBQTtBQU01QixjQUFJLGtCQUFrQixNQUFNO0FBRTVCLGNBQUksb0JBQW9CLE1BQU07QUFDNUIsZ0JBQUksY0FBYztBQUVsQixlQUFHO0FBQ0Qsa0JBQUksa0JBQWtCLFlBQVk7QUFDbEMsd0NBQTBCLFFBQVEsV0FBVywwQkFBMEIsT0FBTztBQUM5RSxxQ0FBdUI7QUFDdkIsNEJBQWMsWUFBWTtBQUFBLHFCQUNuQixnQkFBZ0I7QUFBQSxxQkFDaEIsY0FBYyxNQUFNO0FBRzdCLGtCQUFNLFFBQVE7QUFBQTtBQUdoQixjQUFJLFdBQVcsTUFBTTtBQUNyQixpQkFBTyxDQUFDLEtBQUssZUFBZTtBQUFBO0FBRzlCLGlDQUF5QixTQUFTLFlBQVksTUFBTTtBQUNsRCxjQUFJLE9BQU87QUFDWCxjQUFJLFFBQVEsS0FBSztBQUVqQixjQUFJLFVBQVUsTUFBTTtBQUNsQixrQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQixnQkFBTSxzQkFBc0I7QUFHNUIsY0FBSSxXQUFXLE1BQU07QUFDckIsY0FBSSx3QkFBd0IsTUFBTTtBQUNsQyxjQUFJLFdBQVcsS0FBSztBQUVwQixjQUFJLDBCQUEwQixNQUFNO0FBRWxDLGtCQUFNLFVBQVU7QUFDaEIsZ0JBQUkseUJBQXlCLHNCQUFzQjtBQUNuRCxnQkFBSSxTQUFTO0FBRWIsZUFBRztBQUlELGtCQUFJLFNBQVMsT0FBTztBQUNwQix5QkFBVyxRQUFRLFVBQVU7QUFDN0IsdUJBQVMsT0FBTztBQUFBLHFCQUNULFdBQVc7QUFJcEIsZ0JBQUksQ0FBQyxTQUFTLFVBQVUsS0FBSyxnQkFBZ0I7QUFDM0M7QUFBQTtBQUdGLGlCQUFLLGdCQUFnQjtBQUtyQixnQkFBSSxLQUFLLGNBQWMsTUFBTTtBQUMzQixtQkFBSyxZQUFZO0FBQUE7QUFHbkIsa0JBQU0sb0JBQW9CO0FBQUE7QUFHNUIsaUJBQU8sQ0FBQyxVQUFVO0FBQUE7QUFHcEIsb0NBQTRCLFFBQVEsYUFBYSxXQUFXO0FBQzFEO0FBQ0UsbUJBQU87QUFBQTtBQUFBO0FBSVgscUNBQTZCLFFBQVEsYUFBYSxXQUFXO0FBQzNEO0FBQ0UsbUJBQU87QUFBQTtBQUFBO0FBSVgsd0NBQWdDLFdBQVcsYUFBYSxtQkFBbUI7QUFDekUsY0FBSSxRQUFRO0FBQ1osY0FBSSxPQUFPO0FBQ1gsY0FBSTtBQUNKLGNBQUksZUFBYztBQUVsQixjQUFJLGNBQWE7QUFDZixnQkFBSSxzQkFBc0IsUUFBVztBQUNuQyxvQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQiwyQkFBZTtBQUVmO0FBQ0Usa0JBQUksQ0FBQyw0QkFBNEI7QUFDL0Isb0JBQUksaUJBQWlCLHFCQUFxQjtBQUN4Qyx3QkFBTTtBQUVOLCtDQUE2QjtBQUFBO0FBQUE7QUFBQTtBQUFBLGlCQUk5QjtBQUNMLDJCQUFlO0FBRWY7QUFDRSxrQkFBSSxDQUFDLDRCQUE0QjtBQUMvQixvQkFBSSxpQkFBaUI7QUFFckIsb0JBQUksQ0FBQyxTQUFTLGNBQWMsaUJBQWlCO0FBQzNDLHdCQUFNO0FBRU4sK0NBQTZCO0FBQUE7QUFBQTtBQUFBO0FBWW5DLGdCQUFJLFFBQU87QUFFWCxnQkFBSSxVQUFTLE1BQU07QUFDakIsb0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsZ0JBQUksQ0FBQyxxQkFBcUIsT0FBTSxjQUFjO0FBQzVDLHdDQUEwQixPQUFPLGFBQWE7QUFBQTtBQUFBO0FBT2xELGVBQUssZ0JBQWdCO0FBQ3JCLGNBQUksT0FBTztBQUFBLFlBQ1QsT0FBTztBQUFBLFlBQ1A7QUFBQTtBQUVGLGVBQUssUUFBUTtBQUViLHNCQUFZLGlCQUFpQixLQUFLLE1BQU0sT0FBTyxNQUFNLFlBQVksQ0FBQztBQVFsRSxnQkFBTSxTQUFTO0FBQ2YscUJBQVcsWUFBWSxXQUFXLG9CQUFvQixLQUFLLE1BQU0sT0FBTyxNQUFNLGNBQWMsY0FBYyxRQUFXO0FBQ3JILGlCQUFPO0FBQUE7QUFHVCx5Q0FBaUMsV0FBVyxhQUFhLG1CQUFtQjtBQUMxRSxjQUFJLFFBQVE7QUFDWixjQUFJLE9BQU87QUFJWCxjQUFJLGVBQWU7QUFFbkI7QUFDRSxnQkFBSSxDQUFDLDRCQUE0QjtBQUMvQixrQkFBSSxpQkFBaUI7QUFFckIsa0JBQUksQ0FBQyxTQUFTLGNBQWMsaUJBQWlCO0FBQzNDLHNCQUFNO0FBRU4sNkNBQTZCO0FBQUE7QUFBQTtBQUFBO0FBS25DLGNBQUksZUFBZSxLQUFLO0FBQ3hCLGNBQUksa0JBQWtCLENBQUMsU0FBUyxjQUFjO0FBRTlDLGNBQUksaUJBQWlCO0FBQ25CLGlCQUFLLGdCQUFnQjtBQUNyQjtBQUFBO0FBR0YsY0FBSSxPQUFPLEtBQUs7QUFDaEIsdUJBQWEsaUJBQWlCLEtBQUssTUFBTSxPQUFPLE1BQU0sWUFBWSxDQUFDO0FBS25FLGNBQUksS0FBSyxnQkFBZ0IsZUFBZSxtQkFFeEMsdUJBQXVCLFFBQVEsbUJBQW1CLGNBQWMsTUFBTSxXQUFXO0FBQy9FLGtCQUFNLFNBQVM7QUFDZix1QkFBVyxZQUFZLFdBQVcsb0JBQW9CLEtBQUssTUFBTSxPQUFPLE1BQU0sY0FBYyxjQUFjLFFBQVc7QUFJckgsZ0JBQUksUUFBTztBQUVYLGdCQUFJLFVBQVMsTUFBTTtBQUNqQixvQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQixnQkFBSSxDQUFDLHFCQUFxQixPQUFNLGNBQWM7QUFDNUMsd0NBQTBCLE9BQU8sYUFBYTtBQUFBO0FBQUE7QUFJbEQsaUJBQU87QUFBQTtBQUdULDJDQUFtQyxPQUFPLGFBQWEsa0JBQWtCO0FBQ3ZFLGdCQUFNLFNBQVM7QUFDZixjQUFJLFFBQVE7QUFBQSxZQUNWO0FBQUEsWUFDQSxPQUFPO0FBQUE7QUFFVCxjQUFJLHVCQUF1QiwwQkFBMEI7QUFFckQsY0FBSSx5QkFBeUIsTUFBTTtBQUNqQyxtQ0FBdUI7QUFDdkIsc0NBQTBCLGNBQWM7QUFDeEMsaUNBQXFCLFNBQVMsQ0FBQztBQUFBLGlCQUMxQjtBQUNMLGdCQUFJLFNBQVMscUJBQXFCO0FBRWxDLGdCQUFJLFdBQVcsTUFBTTtBQUNuQixtQ0FBcUIsU0FBUyxDQUFDO0FBQUEsbUJBQzFCO0FBQ0wscUJBQU8sS0FBSztBQUFBO0FBQUE7QUFBQTtBQUtsQixxQ0FBNkIsT0FBTyxNQUFNLGNBQWMsYUFBYTtBQUVuRSxlQUFLLFFBQVE7QUFDYixlQUFLLGNBQWM7QUFLbkIsY0FBSSx1QkFBdUIsT0FBTztBQUVoQywrQkFBbUI7QUFBQTtBQUFBO0FBSXZCLGtDQUEwQixPQUFPLE1BQU0sV0FBVztBQUNoRCxjQUFJLG9CQUFvQixXQUFZO0FBR2xDLGdCQUFJLHVCQUF1QixPQUFPO0FBRWhDLGlDQUFtQjtBQUFBO0FBQUE7QUFLdkIsaUJBQU8sVUFBVTtBQUFBO0FBR25CLHdDQUFnQyxNQUFNO0FBQ3BDLGNBQUksb0JBQW9CLEtBQUs7QUFDN0IsY0FBSSxZQUFZLEtBQUs7QUFFckIsY0FBSTtBQUNGLGdCQUFJLFlBQVk7QUFDaEIsbUJBQU8sQ0FBQyxTQUFTLFdBQVc7QUFBQSxtQkFDckIsUUFBUDtBQUNBLG1CQUFPO0FBQUE7QUFBQTtBQUlYLG9DQUE0QixPQUFPO0FBQ2pDLGdDQUFzQixPQUFPLFVBQVU7QUFBQTtBQUd6Qyw0QkFBb0IsY0FBYztBQUNoQyxjQUFJLE9BQU87QUFFWCxjQUFJLE9BQU8saUJBQWlCLFlBQVk7QUFFdEMsMkJBQWU7QUFBQTtBQUdqQixlQUFLLGdCQUFnQixLQUFLLFlBQVk7QUFDdEMsY0FBSSxRQUFRO0FBQUEsWUFDVixTQUFTO0FBQUEsWUFDVCxhQUFhO0FBQUEsWUFDYixPQUFPO0FBQUEsWUFDUCxVQUFVO0FBQUEsWUFDVixxQkFBcUI7QUFBQSxZQUNyQixtQkFBbUI7QUFBQTtBQUVyQixlQUFLLFFBQVE7QUFDYixjQUFJLFdBQVcsTUFBTSxXQUFXLGlCQUFpQixLQUFLLE1BQU0sMkJBQTJCO0FBQ3ZGLGlCQUFPLENBQUMsS0FBSyxlQUFlO0FBQUE7QUFHOUIsNkJBQXFCLGNBQWM7QUFDakMsaUJBQU8sY0FBYztBQUFBO0FBR3ZCLCtCQUF1QixjQUFjO0FBQ25DLGlCQUFPLGdCQUFnQjtBQUFBO0FBR3pCLDRCQUFvQixLQUFLLFFBQVEsU0FBUyxNQUFNO0FBQzlDLGNBQUksU0FBUztBQUFBLFlBQ1g7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUVBLE1BQU07QUFBQTtBQUVSLGNBQUksdUJBQXVCLDBCQUEwQjtBQUVyRCxjQUFJLHlCQUF5QixNQUFNO0FBQ2pDLG1DQUF1QjtBQUN2QixzQ0FBMEIsY0FBYztBQUN4QyxpQ0FBcUIsYUFBYSxPQUFPLE9BQU87QUFBQSxpQkFDM0M7QUFDTCxnQkFBSSxhQUFhLHFCQUFxQjtBQUV0QyxnQkFBSSxlQUFlLE1BQU07QUFDdkIsbUNBQXFCLGFBQWEsT0FBTyxPQUFPO0FBQUEsbUJBQzNDO0FBQ0wsa0JBQUksY0FBYyxXQUFXO0FBQzdCLHlCQUFXLE9BQU87QUFDbEIscUJBQU8sT0FBTztBQUNkLG1DQUFxQixhQUFhO0FBQUE7QUFBQTtBQUl0QyxpQkFBTztBQUFBO0FBR1QsMEJBQWtCLGNBQWM7QUFDOUIsY0FBSSxPQUFPO0FBRVg7QUFDRSxnQkFBSSxRQUFRO0FBQUEsY0FDVixTQUFTO0FBQUE7QUFFWCxpQkFBSyxnQkFBZ0I7QUFDckIsbUJBQU87QUFBQTtBQUFBO0FBSVgsMkJBQW1CLGNBQWM7QUFDL0IsY0FBSSxPQUFPO0FBQ1gsaUJBQU8sS0FBSztBQUFBO0FBR2QsaUNBQXlCLFlBQVksV0FBVyxRQUFRLE1BQU07QUFDNUQsY0FBSSxPQUFPO0FBQ1gsY0FBSSxXQUFXLFNBQVMsU0FBWSxPQUFPO0FBQzNDLG9DQUEwQixTQUFTO0FBQ25DLGVBQUssZ0JBQWdCLFdBQVcsWUFBWSxXQUFXLFFBQVEsUUFBVztBQUFBO0FBRzVFLGtDQUEwQixZQUFZLFdBQVcsUUFBUSxNQUFNO0FBQzdELGNBQUksT0FBTztBQUNYLGNBQUksV0FBVyxTQUFTLFNBQVksT0FBTztBQUMzQyxjQUFJLFVBQVU7QUFFZCxjQUFJLGdCQUFnQixNQUFNO0FBQ3hCLGdCQUFJLGFBQWEsWUFBWTtBQUM3QixzQkFBVSxXQUFXO0FBRXJCLGdCQUFJLGFBQWEsTUFBTTtBQUNyQixrQkFBSSxXQUFXLFdBQVc7QUFFMUIsa0JBQUksbUJBQW1CLFVBQVUsV0FBVztBQUMxQyxxQkFBSyxnQkFBZ0IsV0FBVyxXQUFXLFFBQVEsU0FBUztBQUM1RDtBQUFBO0FBQUE7QUFBQTtBQUtOLG9DQUEwQixTQUFTO0FBQ25DLGVBQUssZ0JBQWdCLFdBQVcsWUFBWSxXQUFXLFFBQVEsU0FBUztBQUFBO0FBRzFFLDZCQUFxQixRQUFRLE1BQU07QUFDakMsY0FBTSwyQkFBMEIsT0FBTyx1QkFBdUIsUUFBUTtBQUNwRSxtQkFBTyxnQkFBZ0Isa0JBQWtCLFVBQVUsZUFBZSxXQUFXLFFBQVE7QUFBQSxpQkFDaEY7QUFDTCxtQkFBTyxnQkFBZ0IsVUFBVSxlQUFlLFdBQVcsUUFBUTtBQUFBO0FBQUE7QUFJdkUsOEJBQXNCLFFBQVEsTUFBTTtBQUNsQyxpQkFBTyxpQkFBaUIsU0FBUyxXQUFXLFFBQVE7QUFBQTtBQUd0RCxzQ0FBOEIsUUFBUSxNQUFNO0FBQzFDLGlCQUFPLGdCQUFnQixRQUFRLFdBQVcsUUFBUTtBQUFBO0FBR3BELHVDQUErQixRQUFRLE1BQU07QUFDM0MsaUJBQU8saUJBQWlCLFFBQVEsV0FBVyxRQUFRO0FBQUE7QUFHckQsbUNBQTJCLFFBQVEsTUFBTTtBQUN2QyxjQUFJLGFBQWE7QUFFakI7QUFDRSwwQkFBYztBQUFBO0FBR2hCLGNBQU0sMkJBQTBCLE9BQU8sdUJBQXVCLFFBQVE7QUFDcEUsMEJBQWM7QUFBQTtBQUdoQixpQkFBTyxnQkFBZ0IsWUFBWSxRQUFRLFFBQVE7QUFBQTtBQUdyRCxvQ0FBNEIsUUFBUSxNQUFNO0FBQ3hDLGlCQUFPLGlCQUFpQixRQUFRLFFBQVEsUUFBUTtBQUFBO0FBR2xELHdDQUFnQyxRQUFRLEtBQUs7QUFDM0MsY0FBSSxPQUFPLFFBQVEsWUFBWTtBQUM3QixnQkFBSSxjQUFjO0FBRWxCLGdCQUFJLFFBQVE7QUFFWix3QkFBWTtBQUNaLG1CQUFPLFdBQVk7QUFDakIsMEJBQVk7QUFBQTtBQUFBLHFCQUVMLFFBQVEsUUFBUSxRQUFRLFFBQVc7QUFDNUMsZ0JBQUksWUFBWTtBQUVoQjtBQUNFLGtCQUFJLENBQUMsVUFBVSxlQUFlLFlBQVk7QUFDeEMsc0JBQU0sZ0lBQXFJLDBCQUEwQixPQUFPLEtBQUssV0FBVyxLQUFLLFFBQVE7QUFBQTtBQUFBO0FBSTdNLGdCQUFJLFNBQVM7QUFFYixzQkFBVSxVQUFVO0FBQ3BCLG1CQUFPLFdBQVk7QUFDakIsd0JBQVUsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUsxQix1Q0FBK0IsS0FBSyxRQUFRLE1BQU07QUFDaEQ7QUFDRSxnQkFBSSxPQUFPLFdBQVcsWUFBWTtBQUNoQyxvQkFBTSxnSEFBcUgsV0FBVyxPQUFPLE9BQU8sU0FBUztBQUFBO0FBQUE7QUFLakssY0FBSSxhQUFhLFNBQVMsUUFBUSxTQUFTLFNBQVksS0FBSyxPQUFPLENBQUMsUUFBUTtBQUM1RSxjQUFJLGFBQWE7QUFFakI7QUFDRSwwQkFBYztBQUFBO0FBR2hCLGNBQU0sMkJBQTBCLE9BQU8sdUJBQXVCLFFBQVE7QUFDcEUsMEJBQWM7QUFBQTtBQUdoQixpQkFBTyxnQkFBZ0IsWUFBWSxRQUFRLHVCQUF1QixLQUFLLE1BQU0sUUFBUSxNQUFNO0FBQUE7QUFHN0Ysd0NBQWdDLEtBQUssUUFBUSxNQUFNO0FBQ2pEO0FBQ0UsZ0JBQUksT0FBTyxXQUFXLFlBQVk7QUFDaEMsb0JBQU0sZ0hBQXFILFdBQVcsT0FBTyxPQUFPLFNBQVM7QUFBQTtBQUFBO0FBS2pLLGNBQUksYUFBYSxTQUFTLFFBQVEsU0FBUyxTQUFZLEtBQUssT0FBTyxDQUFDLFFBQVE7QUFDNUUsaUJBQU8saUJBQWlCLFFBQVEsUUFBUSx1QkFBdUIsS0FBSyxNQUFNLFFBQVEsTUFBTTtBQUFBO0FBRzFGLGlDQUF5QixPQUFPLGFBQWE7QUFBQTtBQUs3QyxZQUFJLG1CQUFtQjtBQUV2QiwrQkFBdUIsVUFBVSxNQUFNO0FBQ3JDLGNBQUksT0FBTztBQUNYLGNBQUksV0FBVyxTQUFTLFNBQVksT0FBTztBQUMzQyxlQUFLLGdCQUFnQixDQUFDLFVBQVU7QUFDaEMsaUJBQU87QUFBQTtBQUdULGdDQUF3QixVQUFVLE1BQU07QUFDdEMsY0FBSSxPQUFPO0FBQ1gsY0FBSSxXQUFXLFNBQVMsU0FBWSxPQUFPO0FBQzNDLGNBQUksWUFBWSxLQUFLO0FBRXJCLGNBQUksY0FBYyxNQUFNO0FBQ3RCLGdCQUFJLGFBQWEsTUFBTTtBQUNyQixrQkFBSSxXQUFXLFVBQVU7QUFFekIsa0JBQUksbUJBQW1CLFVBQVUsV0FBVztBQUMxQyx1QkFBTyxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBS3ZCLGVBQUssZ0JBQWdCLENBQUMsVUFBVTtBQUNoQyxpQkFBTztBQUFBO0FBR1QsMkJBQW1CLFlBQVksTUFBTTtBQUNuQyxjQUFJLE9BQU87QUFDWCxjQUFJLFdBQVcsU0FBUyxTQUFZLE9BQU87QUFDM0MsY0FBSSxZQUFZO0FBQ2hCLGVBQUssZ0JBQWdCLENBQUMsV0FBVztBQUNqQyxpQkFBTztBQUFBO0FBR1QsNEJBQW9CLFlBQVksTUFBTTtBQUNwQyxjQUFJLE9BQU87QUFDWCxjQUFJLFdBQVcsU0FBUyxTQUFZLE9BQU87QUFDM0MsY0FBSSxZQUFZLEtBQUs7QUFFckIsY0FBSSxjQUFjLE1BQU07QUFFdEIsZ0JBQUksYUFBYSxNQUFNO0FBQ3JCLGtCQUFJLFdBQVcsVUFBVTtBQUV6QixrQkFBSSxtQkFBbUIsVUFBVSxXQUFXO0FBQzFDLHVCQUFPLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFLdkIsY0FBSSxZQUFZO0FBQ2hCLGVBQUssZ0JBQWdCLENBQUMsV0FBVztBQUNqQyxpQkFBTztBQUFBO0FBR1Qsb0NBQTRCLE9BQU87QUFDakMsY0FBSSxPQUFPO0FBQ1gsZUFBSyxnQkFBZ0I7QUFDckIsaUJBQU87QUFBQTtBQUdULHFDQUE2QixPQUFPO0FBQ2xDLGNBQUksT0FBTztBQUNYLGNBQUksc0JBQXNCO0FBQzFCLGNBQUksWUFBWSxvQkFBb0I7QUFDcEMsaUJBQU8sd0JBQXdCLE1BQU0sV0FBVztBQUFBO0FBR2xELHVDQUErQixPQUFPO0FBQ3BDLGNBQUksT0FBTztBQUVYLGNBQUksZ0JBQWdCLE1BQU07QUFFeEIsaUJBQUssZ0JBQWdCO0FBQ3JCLG1CQUFPO0FBQUEsaUJBQ0Y7QUFFTCxnQkFBSSxZQUFZLFlBQVk7QUFDNUIsbUJBQU8sd0JBQXdCLE1BQU0sV0FBVztBQUFBO0FBQUE7QUFJcEQseUNBQWlDLE1BQU0sV0FBVyxPQUFPO0FBQ3ZELGNBQUksbUJBQW1CLENBQUMsMkJBQTJCO0FBRW5ELGNBQUksa0JBQWtCO0FBR3BCLGdCQUFJLENBQUMsU0FBUyxPQUFPLFlBQVk7QUFFL0Isa0JBQUksZUFBZTtBQUNuQix3Q0FBMEIsUUFBUSxXQUFXLDBCQUEwQixPQUFPO0FBQzlFLHFDQUF1QjtBQUt2QixtQkFBSyxZQUFZO0FBQUE7QUFJbkIsbUJBQU87QUFBQSxpQkFDRjtBQVNMLGdCQUFJLEtBQUssV0FBVztBQUVsQixtQkFBSyxZQUFZO0FBQ2pCO0FBQUE7QUFHRixpQkFBSyxnQkFBZ0I7QUFDckIsbUJBQU87QUFBQTtBQUFBO0FBSVgsaUNBQXlCLFlBQVksVUFBVSxVQUFTO0FBQ3RELGNBQUksbUJBQW1CO0FBQ3ZCLG1DQUF5QixvQkFBb0Isa0JBQWtCO0FBQy9ELHFCQUFXO0FBQ1gsY0FBSSxpQkFBaUIsMEJBQTBCO0FBQy9DLG9DQUEwQixhQUFhO0FBQ3ZDLGNBQUksb0JBQW9CLDBCQUEwQjtBQUVsRDtBQUNFLHNDQUEwQixXQUFXLGlCQUFpQixJQUFJO0FBQUE7QUFHNUQsY0FBSTtBQUNGLHVCQUFXO0FBQ1g7QUFBQSxvQkFDQTtBQUNBLHFDQUF5QjtBQUN6QixzQ0FBMEIsYUFBYTtBQUV2QztBQUNFLGtCQUFJLG1CQUFtQixRQUFRLGtCQUFrQixnQkFBZ0I7QUFDL0Qsb0JBQUkscUJBQXFCLGtCQUFrQixlQUFlO0FBRTFELG9CQUFJLHFCQUFxQixJQUFJO0FBQzNCLHVCQUFLO0FBQUE7QUFHUCxrQ0FBa0IsZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTXpDLG1DQUEyQjtBQUN6QixjQUFJLGNBQWMsV0FBVyxRQUN6QixZQUFZLFlBQVksSUFDeEIsYUFBYSxZQUFZO0FBRzdCLGNBQUksUUFBUSxnQkFBZ0IsS0FBSyxNQUFNO0FBQ3ZDLGNBQUksT0FBTztBQUNYLGVBQUssZ0JBQWdCO0FBQ3JCLGlCQUFPLENBQUMsV0FBVztBQUFBO0FBR3JCLG9DQUE0QjtBQUMxQixjQUFJLGVBQWUsZUFDZixZQUFZLGFBQWE7QUFFN0IsY0FBSSxPQUFPO0FBQ1gsY0FBSSxRQUFRLEtBQUs7QUFDakIsaUJBQU8sQ0FBQyxXQUFXO0FBQUE7QUFHckIsc0NBQThCO0FBQzVCLGNBQUksaUJBQWlCLGlCQUNqQixZQUFZLGVBQWU7QUFFL0IsY0FBSSxPQUFPO0FBQ1gsY0FBSSxRQUFRLEtBQUs7QUFDakIsaUJBQU8sQ0FBQyxXQUFXO0FBQUE7QUFHckIsWUFBSSxxQ0FBcUM7QUFDekMsOERBQXNEO0FBQ3BEO0FBQ0UsbUJBQU87QUFBQTtBQUFBO0FBSVgsMkJBQW1CO0FBQ2pCLGNBQUksT0FBTztBQUNYLGNBQUksUUFBTztBQU1YLGNBQUksbUJBQW1CLE1BQUs7QUFDNUIsY0FBSTtBQUVKLGNBQUksa0JBQWtCO0FBQ3BCLGdCQUFJLFNBQVM7QUFFYixpQkFBSyxNQUFNLG1CQUFtQixNQUFNO0FBSXBDLGdCQUFJLFVBQVU7QUFFZCxnQkFBSSxVQUFVLEdBQUc7QUFDZixvQkFBTSxNQUFNLFFBQVEsU0FBUztBQUFBO0FBRy9CLGtCQUFNO0FBQUEsaUJBQ0Q7QUFFTCxnQkFBSSxpQkFBaUI7QUFDckIsaUJBQUssTUFBTSxtQkFBbUIsTUFBTSxlQUFlLFNBQVMsTUFBTTtBQUFBO0FBR3BFLGVBQUssZ0JBQWdCO0FBQ3JCLGlCQUFPO0FBQUE7QUFHVCw0QkFBb0I7QUFDbEIsY0FBSSxPQUFPO0FBQ1gsY0FBSSxLQUFLLEtBQUs7QUFDZCxpQkFBTztBQUFBO0FBR1QsdUNBQStCLE9BQU8sT0FBTyxRQUFRO0FBQ25EO0FBQ0UsZ0JBQUksT0FBTyxVQUFVLE9BQU8sWUFBWTtBQUN0QyxvQkFBTTtBQUFBO0FBQUE7QUFJVixjQUFJLE9BQU8sa0JBQWtCO0FBQzdCLGNBQUksU0FBUztBQUFBLFlBQ1g7QUFBQSxZQUNBO0FBQUEsWUFDQSxlQUFlO0FBQUEsWUFDZixZQUFZO0FBQUEsWUFDWixNQUFNO0FBQUE7QUFHUixjQUFJLG9CQUFvQixRQUFRO0FBQzlCLHFDQUF5QixPQUFPO0FBQUEsaUJBQzNCO0FBQ0wsNEJBQWdCLE9BQU8sT0FBTztBQUM5QixnQkFBSSxZQUFZO0FBQ2hCLGdCQUFJLFFBQU8sc0JBQXNCLE9BQU8sTUFBTTtBQUU5QyxnQkFBSSxVQUFTLE1BQU07QUFDakIsdUNBQXlCLE9BQU0sT0FBTztBQUFBO0FBQUE7QUFJMUMsK0JBQXFCLE9BQU87QUFBQTtBQUc5QixrQ0FBMEIsT0FBTyxPQUFPLFFBQVE7QUFDOUM7QUFDRSxnQkFBSSxPQUFPLFVBQVUsT0FBTyxZQUFZO0FBQ3RDLG9CQUFNO0FBQUE7QUFBQTtBQUlWLGNBQUksT0FBTyxrQkFBa0I7QUFDN0IsY0FBSSxTQUFTO0FBQUEsWUFDWDtBQUFBLFlBQ0E7QUFBQSxZQUNBLGVBQWU7QUFBQSxZQUNmLFlBQVk7QUFBQSxZQUNaLE1BQU07QUFBQTtBQUdSLGNBQUksb0JBQW9CLFFBQVE7QUFDOUIscUNBQXlCLE9BQU87QUFBQSxpQkFDM0I7QUFDTCw0QkFBZ0IsT0FBTyxPQUFPO0FBQzlCLGdCQUFJLFlBQVksTUFBTTtBQUV0QixnQkFBSSxNQUFNLFVBQVUsV0FBWSxlQUFjLFFBQVEsVUFBVSxVQUFVLFVBQVU7QUFJbEYsa0JBQUksc0JBQXNCLE1BQU07QUFFaEMsa0JBQUksd0JBQXdCLE1BQU07QUFDaEMsb0JBQUk7QUFFSjtBQUNFLG1DQUFpQix5QkFBeUI7QUFDMUMsMkNBQXlCLFVBQVU7QUFBQTtBQUdyQyxvQkFBSTtBQUNGLHNCQUFJLGVBQWUsTUFBTTtBQUN6QixzQkFBSSxhQUFhLG9CQUFvQixjQUFjO0FBS25ELHlCQUFPLGdCQUFnQjtBQUN2Qix5QkFBTyxhQUFhO0FBRXBCLHNCQUFJLFNBQVMsWUFBWSxlQUFlO0FBS3RDO0FBQUE7QUFBQSx5QkFFSyxRQUFQO0FBQUEsMEJBQ0E7QUFDQTtBQUNFLDZDQUF5QixVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNM0MsZ0JBQUksWUFBWTtBQUNoQixnQkFBSSxRQUFPLHNCQUFzQixPQUFPLE1BQU07QUFFOUMsZ0JBQUksVUFBUyxNQUFNO0FBQ2pCLHVDQUF5QixPQUFNLE9BQU87QUFBQTtBQUFBO0FBSTFDLCtCQUFxQixPQUFPO0FBQUE7QUFHOUIscUNBQTZCLE9BQU87QUFDbEMsY0FBSSxZQUFZLE1BQU07QUFDdEIsaUJBQU8sVUFBVSw2QkFBNkIsY0FBYyxRQUFRLGNBQWM7QUFBQTtBQUdwRiwwQ0FBa0MsT0FBTyxRQUFRO0FBSS9DLHVEQUE2QywrQkFBK0I7QUFDNUUsY0FBSSxVQUFVLE1BQU07QUFFcEIsY0FBSSxZQUFZLE1BQU07QUFFcEIsbUJBQU8sT0FBTztBQUFBLGlCQUNUO0FBQ0wsbUJBQU8sT0FBTyxRQUFRO0FBQ3RCLG9CQUFRLE9BQU87QUFBQTtBQUdqQixnQkFBTSxVQUFVO0FBQUE7QUFHbEIsaUNBQXlCLE9BQU8sT0FBTyxRQUFRLE1BQU07QUFDbkQsY0FBSSxvQkFBb0IsUUFBUTtBQUM5QixnQkFBSSxjQUFjLE1BQU07QUFFeEIsZ0JBQUksZ0JBQWdCLE1BQU07QUFFeEIscUJBQU8sT0FBTztBQUdkLG1DQUFxQjtBQUFBLG1CQUNoQjtBQUNMLHFCQUFPLE9BQU8sWUFBWTtBQUMxQiwwQkFBWSxPQUFPO0FBQUE7QUFHckIsa0JBQU0sY0FBYztBQUFBLGlCQUNmO0FBQ0wsZ0JBQUksVUFBVSxNQUFNO0FBRXBCLGdCQUFJLFlBQVksTUFBTTtBQUVwQixxQkFBTyxPQUFPO0FBQUEsbUJBQ1Q7QUFDTCxxQkFBTyxPQUFPLFFBQVE7QUFDdEIsc0JBQVEsT0FBTztBQUFBO0FBR2pCLGtCQUFNLFVBQVU7QUFBQTtBQUFBO0FBSXBCLDBDQUFrQyxPQUFNLE9BQU8sTUFBTTtBQUNuRCxjQUFJLGlCQUFpQixPQUFPO0FBQzFCLGdCQUFJLGFBQWEsTUFBTTtBQU12Qix5QkFBYSxlQUFlLFlBQVksTUFBSztBQUU3QyxnQkFBSSxnQkFBZ0IsV0FBVyxZQUFZO0FBQzNDLGtCQUFNLFFBQVE7QUFJZCw4QkFBa0IsT0FBTTtBQUFBO0FBQUE7QUFJNUIsc0NBQThCLE9BQU8sTUFBTSxRQUFRO0FBRWpEO0FBQ0UscUNBQXlCLE9BQU87QUFBQTtBQUFBO0FBSXBDLFlBQUksd0JBQXdCO0FBQUEsVUFDMUI7QUFBQSxVQUNBLGFBQWE7QUFBQSxVQUNiLFlBQVk7QUFBQSxVQUNaLFdBQVc7QUFBQSxVQUNYLHFCQUFxQjtBQUFBLFVBQ3JCLG9CQUFvQjtBQUFBLFVBQ3BCLGlCQUFpQjtBQUFBLFVBQ2pCLFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLFVBQVU7QUFBQSxVQUNWLGVBQWU7QUFBQSxVQUNmLGtCQUFrQjtBQUFBLFVBQ2xCLGVBQWU7QUFBQSxVQUNmLGtCQUFrQjtBQUFBLFVBQ2xCLHNCQUFzQjtBQUFBLFVBQ3RCLE9BQU87QUFBQSxVQUNQLDBCQUEwQjtBQUFBO0FBRzVCLFlBQUksOEJBQThCO0FBQ2xDLFlBQUksMkNBQTJDO0FBQy9DLFlBQUksK0JBQStCO0FBQ25DLFlBQUksaUNBQWlDO0FBQ3JDLFlBQUksMkNBQTJDO0FBQy9DLFlBQUksNENBQTRDO0FBQ2hELFlBQUksOENBQThDO0FBRWxEO0FBQ0UsY0FBSSwyQkFBMkIsV0FBWTtBQUN6QyxrQkFBTTtBQUFBO0FBR1IsY0FBSSx3QkFBd0IsV0FBWTtBQUN0QyxrQkFBTTtBQUFBO0FBR1Isd0NBQThCO0FBQUEsWUFDNUIsYUFBYSxTQUFVLFNBQVM7QUFDOUIscUJBQU8sWUFBWTtBQUFBO0FBQUEsWUFFckIsYUFBYSxTQUFVLFVBQVUsTUFBTTtBQUNyQyxxQ0FBdUI7QUFDdkI7QUFDQSxtQ0FBcUI7QUFDckIscUJBQU8sY0FBYyxVQUFVO0FBQUE7QUFBQSxZQUVqQyxZQUFZLFNBQVUsU0FBUztBQUM3QixxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTyxZQUFZO0FBQUE7QUFBQSxZQUVyQixXQUFXLFNBQVUsUUFBUSxNQUFNO0FBQ2pDLHFDQUF1QjtBQUN2QjtBQUNBLG1DQUFxQjtBQUNyQixxQkFBTyxZQUFZLFFBQVE7QUFBQTtBQUFBLFlBRTdCLHFCQUFxQixTQUFVLEtBQUssUUFBUSxNQUFNO0FBQ2hELHFDQUF1QjtBQUN2QjtBQUNBLG1DQUFxQjtBQUNyQixxQkFBTyxzQkFBc0IsS0FBSyxRQUFRO0FBQUE7QUFBQSxZQUU1QyxvQkFBb0IsU0FBVSxRQUFRLE1BQU07QUFDMUMscUNBQXVCO0FBQ3ZCO0FBQ0EsbUNBQXFCO0FBQ3JCLHFCQUFPLHFCQUFxQixRQUFRO0FBQUE7QUFBQSxZQUV0QyxpQkFBaUIsU0FBVSxRQUFRLE1BQU07QUFDdkMscUNBQXVCO0FBQ3ZCO0FBQ0EsbUNBQXFCO0FBQ3JCLHFCQUFPLGtCQUFrQixRQUFRO0FBQUE7QUFBQSxZQUVuQyxTQUFTLFNBQVUsUUFBUSxNQUFNO0FBQy9CLHFDQUF1QjtBQUN2QjtBQUNBLG1DQUFxQjtBQUNyQixrQkFBSSxpQkFBaUIseUJBQXlCO0FBQzlDLHVDQUF5QixVQUFVO0FBRW5DLGtCQUFJO0FBQ0YsdUJBQU8sVUFBVSxRQUFRO0FBQUEsd0JBQ3pCO0FBQ0EseUNBQXlCLFVBQVU7QUFBQTtBQUFBO0FBQUEsWUFHdkMsWUFBWSxTQUFVLFNBQVMsWUFBWSxNQUFNO0FBQy9DLHFDQUF1QjtBQUN2QjtBQUNBLGtCQUFJLGlCQUFpQix5QkFBeUI7QUFDOUMsdUNBQXlCLFVBQVU7QUFFbkMsa0JBQUk7QUFDRix1QkFBTyxhQUFhLFNBQVMsWUFBWTtBQUFBLHdCQUN6QztBQUNBLHlDQUF5QixVQUFVO0FBQUE7QUFBQTtBQUFBLFlBR3ZDLFFBQVEsU0FBVSxjQUFjO0FBQzlCLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLFNBQVM7QUFBQTtBQUFBLFlBRWxCLFVBQVUsU0FBVSxjQUFjO0FBQ2hDLHFDQUF1QjtBQUN2QjtBQUNBLGtCQUFJLGlCQUFpQix5QkFBeUI7QUFDOUMsdUNBQXlCLFVBQVU7QUFFbkMsa0JBQUk7QUFDRix1QkFBTyxXQUFXO0FBQUEsd0JBQ2xCO0FBQ0EseUNBQXlCLFVBQVU7QUFBQTtBQUFBO0FBQUEsWUFHdkMsZUFBZSxTQUFVLE9BQU8sYUFBYTtBQUMzQyxxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTztBQUFBO0FBQUEsWUFFVCxrQkFBa0IsU0FBVSxPQUFPO0FBQ2pDLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLG1CQUFtQjtBQUFBO0FBQUEsWUFFNUIsZUFBZSxXQUFZO0FBQ3pCLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULGtCQUFrQixTQUFVLFFBQVEsYUFBYSxXQUFXO0FBQzFELHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULHNCQUFzQixTQUFVLFdBQVcsYUFBYSxtQkFBbUI7QUFDekUscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU8sdUJBQXVCLFdBQVcsYUFBYTtBQUFBO0FBQUEsWUFFeEQsT0FBTyxXQUFZO0FBQ2pCLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULDBCQUEwQjtBQUFBO0FBRzVCLHFEQUEyQztBQUFBLFlBQ3pDLGFBQWEsU0FBVSxTQUFTO0FBQzlCLHFCQUFPLFlBQVk7QUFBQTtBQUFBLFlBRXJCLGFBQWEsU0FBVSxVQUFVLE1BQU07QUFDckMscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU8sY0FBYyxVQUFVO0FBQUE7QUFBQSxZQUVqQyxZQUFZLFNBQVUsU0FBUztBQUM3QixxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTyxZQUFZO0FBQUE7QUFBQSxZQUVyQixXQUFXLFNBQVUsUUFBUSxNQUFNO0FBQ2pDLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLFlBQVksUUFBUTtBQUFBO0FBQUEsWUFFN0IscUJBQXFCLFNBQVUsS0FBSyxRQUFRLE1BQU07QUFDaEQscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU8sc0JBQXNCLEtBQUssUUFBUTtBQUFBO0FBQUEsWUFFNUMsb0JBQW9CLFNBQVUsUUFBUSxNQUFNO0FBQzFDLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLHFCQUFxQixRQUFRO0FBQUE7QUFBQSxZQUV0QyxpQkFBaUIsU0FBVSxRQUFRLE1BQU07QUFDdkMscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU8sa0JBQWtCLFFBQVE7QUFBQTtBQUFBLFlBRW5DLFNBQVMsU0FBVSxRQUFRLE1BQU07QUFDL0IscUNBQXVCO0FBQ3ZCO0FBQ0Esa0JBQUksaUJBQWlCLHlCQUF5QjtBQUM5Qyx1Q0FBeUIsVUFBVTtBQUVuQyxrQkFBSTtBQUNGLHVCQUFPLFVBQVUsUUFBUTtBQUFBLHdCQUN6QjtBQUNBLHlDQUF5QixVQUFVO0FBQUE7QUFBQTtBQUFBLFlBR3ZDLFlBQVksU0FBVSxTQUFTLFlBQVksTUFBTTtBQUMvQyxxQ0FBdUI7QUFDdkI7QUFDQSxrQkFBSSxpQkFBaUIseUJBQXlCO0FBQzlDLHVDQUF5QixVQUFVO0FBRW5DLGtCQUFJO0FBQ0YsdUJBQU8sYUFBYSxTQUFTLFlBQVk7QUFBQSx3QkFDekM7QUFDQSx5Q0FBeUIsVUFBVTtBQUFBO0FBQUE7QUFBQSxZQUd2QyxRQUFRLFNBQVUsY0FBYztBQUM5QixxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTyxTQUFTO0FBQUE7QUFBQSxZQUVsQixVQUFVLFNBQVUsY0FBYztBQUNoQyxxQ0FBdUI7QUFDdkI7QUFDQSxrQkFBSSxpQkFBaUIseUJBQXlCO0FBQzlDLHVDQUF5QixVQUFVO0FBRW5DLGtCQUFJO0FBQ0YsdUJBQU8sV0FBVztBQUFBLHdCQUNsQjtBQUNBLHlDQUF5QixVQUFVO0FBQUE7QUFBQTtBQUFBLFlBR3ZDLGVBQWUsU0FBVSxPQUFPLGFBQWE7QUFDM0MscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU87QUFBQTtBQUFBLFlBRVQsa0JBQWtCLFNBQVUsT0FBTztBQUNqQyxxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTyxtQkFBbUI7QUFBQTtBQUFBLFlBRTVCLGVBQWUsV0FBWTtBQUN6QixxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTztBQUFBO0FBQUEsWUFFVCxrQkFBa0IsU0FBVSxRQUFRLGFBQWEsV0FBVztBQUMxRCxxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTztBQUFBO0FBQUEsWUFFVCxzQkFBc0IsU0FBVSxXQUFXLGFBQWEsbUJBQW1CO0FBQ3pFLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLHVCQUF1QixXQUFXLGFBQWE7QUFBQTtBQUFBLFlBRXhELE9BQU8sV0FBWTtBQUNqQixxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTztBQUFBO0FBQUEsWUFFVCwwQkFBMEI7QUFBQTtBQUc1Qix5Q0FBK0I7QUFBQSxZQUM3QixhQUFhLFNBQVUsU0FBUztBQUM5QixxQkFBTyxZQUFZO0FBQUE7QUFBQSxZQUVyQixhQUFhLFNBQVUsVUFBVSxNQUFNO0FBQ3JDLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLGVBQWUsVUFBVTtBQUFBO0FBQUEsWUFFbEMsWUFBWSxTQUFVLFNBQVM7QUFDN0IscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU8sWUFBWTtBQUFBO0FBQUEsWUFFckIsV0FBVyxTQUFVLFFBQVEsTUFBTTtBQUNqQyxxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTyxhQUFhLFFBQVE7QUFBQTtBQUFBLFlBRTlCLHFCQUFxQixTQUFVLEtBQUssUUFBUSxNQUFNO0FBQ2hELHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLHVCQUF1QixLQUFLLFFBQVE7QUFBQTtBQUFBLFlBRTdDLG9CQUFvQixTQUFVLFFBQVEsTUFBTTtBQUMxQyxxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTyxzQkFBc0IsUUFBUTtBQUFBO0FBQUEsWUFFdkMsaUJBQWlCLFNBQVUsUUFBUSxNQUFNO0FBQ3ZDLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLG1CQUFtQixRQUFRO0FBQUE7QUFBQSxZQUVwQyxTQUFTLFNBQVUsUUFBUSxNQUFNO0FBQy9CLHFDQUF1QjtBQUN2QjtBQUNBLGtCQUFJLGlCQUFpQix5QkFBeUI7QUFDOUMsdUNBQXlCLFVBQVU7QUFFbkMsa0JBQUk7QUFDRix1QkFBTyxXQUFXLFFBQVE7QUFBQSx3QkFDMUI7QUFDQSx5Q0FBeUIsVUFBVTtBQUFBO0FBQUE7QUFBQSxZQUd2QyxZQUFZLFNBQVUsU0FBUyxZQUFZLE1BQU07QUFDL0MscUNBQXVCO0FBQ3ZCO0FBQ0Esa0JBQUksaUJBQWlCLHlCQUF5QjtBQUM5Qyx1Q0FBeUIsVUFBVTtBQUVuQyxrQkFBSTtBQUNGLHVCQUFPLGNBQWMsU0FBUyxZQUFZO0FBQUEsd0JBQzFDO0FBQ0EseUNBQXlCLFVBQVU7QUFBQTtBQUFBO0FBQUEsWUFHdkMsUUFBUSxTQUFVLGNBQWM7QUFDOUIscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU87QUFBQTtBQUFBLFlBRVQsVUFBVSxTQUFVLGNBQWM7QUFDaEMscUNBQXVCO0FBQ3ZCO0FBQ0Esa0JBQUksaUJBQWlCLHlCQUF5QjtBQUM5Qyx1Q0FBeUIsVUFBVTtBQUVuQyxrQkFBSTtBQUNGLHVCQUFPLFlBQVk7QUFBQSx3QkFDbkI7QUFDQSx5Q0FBeUIsVUFBVTtBQUFBO0FBQUE7QUFBQSxZQUd2QyxlQUFlLFNBQVUsT0FBTyxhQUFhO0FBQzNDLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULGtCQUFrQixTQUFVLE9BQU87QUFDakMscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU8sb0JBQW9CO0FBQUE7QUFBQSxZQUU3QixlQUFlLFdBQVk7QUFDekIscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU87QUFBQTtBQUFBLFlBRVQsa0JBQWtCLFNBQVUsUUFBUSxhQUFhLFdBQVc7QUFDMUQscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU87QUFBQTtBQUFBLFlBRVQsc0JBQXNCLFNBQVUsV0FBVyxhQUFhLG1CQUFtQjtBQUN6RSxxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTyx3QkFBd0IsV0FBVztBQUFBO0FBQUEsWUFFNUMsT0FBTyxXQUFZO0FBQ2pCLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULDBCQUEwQjtBQUFBO0FBRzVCLDJDQUFpQztBQUFBLFlBQy9CLGFBQWEsU0FBVSxTQUFTO0FBQzlCLHFCQUFPLFlBQVk7QUFBQTtBQUFBLFlBRXJCLGFBQWEsU0FBVSxVQUFVLE1BQU07QUFDckMscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU8sZUFBZSxVQUFVO0FBQUE7QUFBQSxZQUVsQyxZQUFZLFNBQVUsU0FBUztBQUM3QixxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTyxZQUFZO0FBQUE7QUFBQSxZQUVyQixXQUFXLFNBQVUsUUFBUSxNQUFNO0FBQ2pDLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLGFBQWEsUUFBUTtBQUFBO0FBQUEsWUFFOUIscUJBQXFCLFNBQVUsS0FBSyxRQUFRLE1BQU07QUFDaEQscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU8sdUJBQXVCLEtBQUssUUFBUTtBQUFBO0FBQUEsWUFFN0Msb0JBQW9CLFNBQVUsUUFBUSxNQUFNO0FBQzFDLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLHNCQUFzQixRQUFRO0FBQUE7QUFBQSxZQUV2QyxpQkFBaUIsU0FBVSxRQUFRLE1BQU07QUFDdkMscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU8sbUJBQW1CLFFBQVE7QUFBQTtBQUFBLFlBRXBDLFNBQVMsU0FBVSxRQUFRLE1BQU07QUFDL0IscUNBQXVCO0FBQ3ZCO0FBQ0Esa0JBQUksaUJBQWlCLHlCQUF5QjtBQUM5Qyx1Q0FBeUIsVUFBVTtBQUVuQyxrQkFBSTtBQUNGLHVCQUFPLFdBQVcsUUFBUTtBQUFBLHdCQUMxQjtBQUNBLHlDQUF5QixVQUFVO0FBQUE7QUFBQTtBQUFBLFlBR3ZDLFlBQVksU0FBVSxTQUFTLFlBQVksTUFBTTtBQUMvQyxxQ0FBdUI7QUFDdkI7QUFDQSxrQkFBSSxpQkFBaUIseUJBQXlCO0FBQzlDLHVDQUF5QixVQUFVO0FBRW5DLGtCQUFJO0FBQ0YsdUJBQU8sZ0JBQWdCLFNBQVMsWUFBWTtBQUFBLHdCQUM1QztBQUNBLHlDQUF5QixVQUFVO0FBQUE7QUFBQTtBQUFBLFlBR3ZDLFFBQVEsU0FBVSxjQUFjO0FBQzlCLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULFVBQVUsU0FBVSxjQUFjO0FBQ2hDLHFDQUF1QjtBQUN2QjtBQUNBLGtCQUFJLGlCQUFpQix5QkFBeUI7QUFDOUMsdUNBQXlCLFVBQVU7QUFFbkMsa0JBQUk7QUFDRix1QkFBTyxjQUFjO0FBQUEsd0JBQ3JCO0FBQ0EseUNBQXlCLFVBQVU7QUFBQTtBQUFBO0FBQUEsWUFHdkMsZUFBZSxTQUFVLE9BQU8sYUFBYTtBQUMzQyxxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTztBQUFBO0FBQUEsWUFFVCxrQkFBa0IsU0FBVSxPQUFPO0FBQ2pDLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPLHNCQUFzQjtBQUFBO0FBQUEsWUFFL0IsZUFBZSxXQUFZO0FBQ3pCLHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULGtCQUFrQixTQUFVLFFBQVEsYUFBYSxXQUFXO0FBQzFELHFDQUF1QjtBQUN2QjtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULHNCQUFzQixTQUFVLFdBQVcsYUFBYSxtQkFBbUI7QUFDekUscUNBQXVCO0FBQ3ZCO0FBQ0EscUJBQU8sd0JBQXdCLFdBQVc7QUFBQTtBQUFBLFlBRTVDLE9BQU8sV0FBWTtBQUNqQixxQ0FBdUI7QUFDdkI7QUFDQSxxQkFBTztBQUFBO0FBQUEsWUFFVCwwQkFBMEI7QUFBQTtBQUc1QixxREFBMkM7QUFBQSxZQUN6QyxhQUFhLFNBQVUsU0FBUztBQUM5QjtBQUNBLHFCQUFPLFlBQVk7QUFBQTtBQUFBLFlBRXJCLGFBQWEsU0FBVSxVQUFVLE1BQU07QUFDckMscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTyxjQUFjLFVBQVU7QUFBQTtBQUFBLFlBRWpDLFlBQVksU0FBVSxTQUFTO0FBQzdCLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU8sWUFBWTtBQUFBO0FBQUEsWUFFckIsV0FBVyxTQUFVLFFBQVEsTUFBTTtBQUNqQyxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPLFlBQVksUUFBUTtBQUFBO0FBQUEsWUFFN0IscUJBQXFCLFNBQVUsS0FBSyxRQUFRLE1BQU07QUFDaEQscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTyxzQkFBc0IsS0FBSyxRQUFRO0FBQUE7QUFBQSxZQUU1QyxvQkFBb0IsU0FBVSxRQUFRLE1BQU07QUFDMUMscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTyxxQkFBcUIsUUFBUTtBQUFBO0FBQUEsWUFFdEMsaUJBQWlCLFNBQVUsUUFBUSxNQUFNO0FBQ3ZDLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU8sa0JBQWtCLFFBQVE7QUFBQTtBQUFBLFlBRW5DLFNBQVMsU0FBVSxRQUFRLE1BQU07QUFDL0IscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxrQkFBSSxpQkFBaUIseUJBQXlCO0FBQzlDLHVDQUF5QixVQUFVO0FBRW5DLGtCQUFJO0FBQ0YsdUJBQU8sVUFBVSxRQUFRO0FBQUEsd0JBQ3pCO0FBQ0EseUNBQXlCLFVBQVU7QUFBQTtBQUFBO0FBQUEsWUFHdkMsWUFBWSxTQUFVLFNBQVMsWUFBWSxNQUFNO0FBQy9DLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0Esa0JBQUksaUJBQWlCLHlCQUF5QjtBQUM5Qyx1Q0FBeUIsVUFBVTtBQUVuQyxrQkFBSTtBQUNGLHVCQUFPLGFBQWEsU0FBUyxZQUFZO0FBQUEsd0JBQ3pDO0FBQ0EseUNBQXlCLFVBQVU7QUFBQTtBQUFBO0FBQUEsWUFHdkMsUUFBUSxTQUFVLGNBQWM7QUFDOUIscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTyxTQUFTO0FBQUE7QUFBQSxZQUVsQixVQUFVLFNBQVUsY0FBYztBQUNoQyxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLGtCQUFJLGlCQUFpQix5QkFBeUI7QUFDOUMsdUNBQXlCLFVBQVU7QUFFbkMsa0JBQUk7QUFDRix1QkFBTyxXQUFXO0FBQUEsd0JBQ2xCO0FBQ0EseUNBQXlCLFVBQVU7QUFBQTtBQUFBO0FBQUEsWUFHdkMsZUFBZSxTQUFVLE9BQU8sYUFBYTtBQUMzQyxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULGtCQUFrQixTQUFVLE9BQU87QUFDakMscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTyxtQkFBbUI7QUFBQTtBQUFBLFlBRTVCLGVBQWUsV0FBWTtBQUN6QixxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULGtCQUFrQixTQUFVLFFBQVEsYUFBYSxXQUFXO0FBQzFELHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU87QUFBQTtBQUFBLFlBRVQsc0JBQXNCLFNBQVUsV0FBVyxhQUFhLG1CQUFtQjtBQUN6RSxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPLHVCQUF1QixXQUFXLGFBQWE7QUFBQTtBQUFBLFlBRXhELE9BQU8sV0FBWTtBQUNqQixxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULDBCQUEwQjtBQUFBO0FBRzVCLHNEQUE0QztBQUFBLFlBQzFDLGFBQWEsU0FBVSxTQUFTO0FBQzlCO0FBQ0EscUJBQU8sWUFBWTtBQUFBO0FBQUEsWUFFckIsYUFBYSxTQUFVLFVBQVUsTUFBTTtBQUNyQyxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPLGVBQWUsVUFBVTtBQUFBO0FBQUEsWUFFbEMsWUFBWSxTQUFVLFNBQVM7QUFDN0IscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTyxZQUFZO0FBQUE7QUFBQSxZQUVyQixXQUFXLFNBQVUsUUFBUSxNQUFNO0FBQ2pDLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU8sYUFBYSxRQUFRO0FBQUE7QUFBQSxZQUU5QixxQkFBcUIsU0FBVSxLQUFLLFFBQVEsTUFBTTtBQUNoRCxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPLHVCQUF1QixLQUFLLFFBQVE7QUFBQTtBQUFBLFlBRTdDLG9CQUFvQixTQUFVLFFBQVEsTUFBTTtBQUMxQyxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPLHNCQUFzQixRQUFRO0FBQUE7QUFBQSxZQUV2QyxpQkFBaUIsU0FBVSxRQUFRLE1BQU07QUFDdkMscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTyxtQkFBbUIsUUFBUTtBQUFBO0FBQUEsWUFFcEMsU0FBUyxTQUFVLFFBQVEsTUFBTTtBQUMvQixxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLGtCQUFJLGlCQUFpQix5QkFBeUI7QUFDOUMsdUNBQXlCLFVBQVU7QUFFbkMsa0JBQUk7QUFDRix1QkFBTyxXQUFXLFFBQVE7QUFBQSx3QkFDMUI7QUFDQSx5Q0FBeUIsVUFBVTtBQUFBO0FBQUE7QUFBQSxZQUd2QyxZQUFZLFNBQVUsU0FBUyxZQUFZLE1BQU07QUFDL0MscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxrQkFBSSxpQkFBaUIseUJBQXlCO0FBQzlDLHVDQUF5QixVQUFVO0FBRW5DLGtCQUFJO0FBQ0YsdUJBQU8sY0FBYyxTQUFTLFlBQVk7QUFBQSx3QkFDMUM7QUFDQSx5Q0FBeUIsVUFBVTtBQUFBO0FBQUE7QUFBQSxZQUd2QyxRQUFRLFNBQVUsY0FBYztBQUM5QixxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULFVBQVUsU0FBVSxjQUFjO0FBQ2hDLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0Esa0JBQUksaUJBQWlCLHlCQUF5QjtBQUM5Qyx1Q0FBeUIsVUFBVTtBQUVuQyxrQkFBSTtBQUNGLHVCQUFPLFlBQVk7QUFBQSx3QkFDbkI7QUFDQSx5Q0FBeUIsVUFBVTtBQUFBO0FBQUE7QUFBQSxZQUd2QyxlQUFlLFNBQVUsT0FBTyxhQUFhO0FBQzNDLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU87QUFBQTtBQUFBLFlBRVQsa0JBQWtCLFNBQVUsT0FBTztBQUNqQyxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPLG9CQUFvQjtBQUFBO0FBQUEsWUFFN0IsZUFBZSxXQUFZO0FBQ3pCLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU87QUFBQTtBQUFBLFlBRVQsa0JBQWtCLFNBQVUsUUFBUSxhQUFhLFdBQVc7QUFDMUQscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTztBQUFBO0FBQUEsWUFFVCxzQkFBc0IsU0FBVSxXQUFXLGFBQWEsbUJBQW1CO0FBQ3pFLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU8sd0JBQXdCLFdBQVc7QUFBQTtBQUFBLFlBRTVDLE9BQU8sV0FBWTtBQUNqQixxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULDBCQUEwQjtBQUFBO0FBRzVCLHdEQUE4QztBQUFBLFlBQzVDLGFBQWEsU0FBVSxTQUFTO0FBQzlCO0FBQ0EscUJBQU8sWUFBWTtBQUFBO0FBQUEsWUFFckIsYUFBYSxTQUFVLFVBQVUsTUFBTTtBQUNyQyxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPLGVBQWUsVUFBVTtBQUFBO0FBQUEsWUFFbEMsWUFBWSxTQUFVLFNBQVM7QUFDN0IscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTyxZQUFZO0FBQUE7QUFBQSxZQUVyQixXQUFXLFNBQVUsUUFBUSxNQUFNO0FBQ2pDLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU8sYUFBYSxRQUFRO0FBQUE7QUFBQSxZQUU5QixxQkFBcUIsU0FBVSxLQUFLLFFBQVEsTUFBTTtBQUNoRCxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPLHVCQUF1QixLQUFLLFFBQVE7QUFBQTtBQUFBLFlBRTdDLG9CQUFvQixTQUFVLFFBQVEsTUFBTTtBQUMxQyxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPLHNCQUFzQixRQUFRO0FBQUE7QUFBQSxZQUV2QyxpQkFBaUIsU0FBVSxRQUFRLE1BQU07QUFDdkMscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTyxtQkFBbUIsUUFBUTtBQUFBO0FBQUEsWUFFcEMsU0FBUyxTQUFVLFFBQVEsTUFBTTtBQUMvQixxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLGtCQUFJLGlCQUFpQix5QkFBeUI7QUFDOUMsdUNBQXlCLFVBQVU7QUFFbkMsa0JBQUk7QUFDRix1QkFBTyxXQUFXLFFBQVE7QUFBQSx3QkFDMUI7QUFDQSx5Q0FBeUIsVUFBVTtBQUFBO0FBQUE7QUFBQSxZQUd2QyxZQUFZLFNBQVUsU0FBUyxZQUFZLE1BQU07QUFDL0MscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxrQkFBSSxpQkFBaUIseUJBQXlCO0FBQzlDLHVDQUF5QixVQUFVO0FBRW5DLGtCQUFJO0FBQ0YsdUJBQU8sZ0JBQWdCLFNBQVMsWUFBWTtBQUFBLHdCQUM1QztBQUNBLHlDQUF5QixVQUFVO0FBQUE7QUFBQTtBQUFBLFlBR3ZDLFFBQVEsU0FBVSxjQUFjO0FBQzlCLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU87QUFBQTtBQUFBLFlBRVQsVUFBVSxTQUFVLGNBQWM7QUFDaEMscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxrQkFBSSxpQkFBaUIseUJBQXlCO0FBQzlDLHVDQUF5QixVQUFVO0FBRW5DLGtCQUFJO0FBQ0YsdUJBQU8sY0FBYztBQUFBLHdCQUNyQjtBQUNBLHlDQUF5QixVQUFVO0FBQUE7QUFBQTtBQUFBLFlBR3ZDLGVBQWUsU0FBVSxPQUFPLGFBQWE7QUFDM0MscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTztBQUFBO0FBQUEsWUFFVCxrQkFBa0IsU0FBVSxPQUFPO0FBQ2pDLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU8sc0JBQXNCO0FBQUE7QUFBQSxZQUUvQixlQUFlLFdBQVk7QUFDekIscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTztBQUFBO0FBQUEsWUFFVCxrQkFBa0IsU0FBVSxRQUFRLGFBQWEsV0FBVztBQUMxRCxxQ0FBdUI7QUFDdkI7QUFDQTtBQUNBLHFCQUFPO0FBQUE7QUFBQSxZQUVULHNCQUFzQixTQUFVLFdBQVcsYUFBYSxtQkFBbUI7QUFDekUscUNBQXVCO0FBQ3ZCO0FBQ0E7QUFDQSxxQkFBTyx3QkFBd0IsV0FBVztBQUFBO0FBQUEsWUFFNUMsT0FBTyxXQUFZO0FBQ2pCLHFDQUF1QjtBQUN2QjtBQUNBO0FBQ0EscUJBQU87QUFBQTtBQUFBLFlBRVQsMEJBQTBCO0FBQUE7QUFBQTtBQUk5QixZQUFJLFFBQVEsVUFBVTtBQUN0QixZQUFJLGFBQWE7QUFDakIsWUFBSSx3QkFBd0I7QUFDNUIsWUFBSSxvQkFBb0I7QUFDeEIsWUFBSSx5QkFBeUI7QUFrQjdCLFlBQUksd0JBQXdCO0FBQzVCLFlBQUksd0JBQXdCO0FBRTVCLHlDQUFpQztBQUMvQixpQkFBTztBQUFBO0FBR1QsNkNBQXFDO0FBQ25DO0FBQ0Usb0NBQXdCO0FBQUE7QUFBQTtBQUk1Qix5Q0FBaUM7QUFDL0I7QUFDRSxvQ0FBd0I7QUFDeEIsb0NBQXdCO0FBQUE7QUFBQTtBQUk1Qix3Q0FBZ0M7QUFDOUI7QUFDRSxvQ0FBd0I7QUFDeEIsb0NBQXdCO0FBQUE7QUFBQTtBQUk1QixpQ0FBeUI7QUFDdkIsaUJBQU87QUFBQTtBQUdULG9DQUE0QjtBQUUxQix1QkFBYTtBQUFBO0FBR2Ysb0NBQTRCLE9BQU87QUFFakMsOEJBQW9CO0FBRXBCLGNBQUksTUFBTSxrQkFBa0IsR0FBRztBQUM3QixrQkFBTSxrQkFBa0I7QUFBQTtBQUFBO0FBSTVCLDRDQUFvQyxPQUFPO0FBRXpDLDhCQUFvQjtBQUFBO0FBR3RCLDBEQUFrRCxPQUFPLGtCQUFrQjtBQUV6RSxjQUFJLHFCQUFxQixHQUFHO0FBQzFCLGdCQUFJLGNBQWMsVUFBVTtBQUM1QixrQkFBTSxrQkFBa0I7QUFFeEIsZ0JBQUksa0JBQWtCO0FBQ3BCLG9CQUFNLG1CQUFtQjtBQUFBO0FBRzNCLGdDQUFvQjtBQUFBO0FBQUE7QUFJeEIsNENBQW9DLE9BQU87QUFFekMsY0FBSSx5QkFBeUIsR0FBRztBQUM5QixnQkFBSSxjQUFjLFVBQVU7QUFDNUIsb0NBQXdCO0FBR3hCLGdCQUFJLGNBQWMsTUFBTTtBQUV4QixtQkFBTyxnQkFBZ0IsTUFBTTtBQUMzQixzQkFBUSxZQUFZO0FBQUEscUJBQ2I7QUFDSCxzQkFBSSxRQUFPLFlBQVk7QUFDdkIsd0JBQUssa0JBQWtCO0FBQ3ZCO0FBQUEscUJBRUc7QUFDSCxzQkFBSSxrQkFBa0IsWUFBWTtBQUNsQyxrQ0FBZ0Isa0JBQWtCO0FBQ2xDO0FBQUE7QUFHSiw0QkFBYyxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBS2hDLDZDQUFxQyxPQUFPO0FBRTFDLGNBQUksMEJBQTBCLEdBQUc7QUFDL0IsZ0JBQUksY0FBYyxVQUFVO0FBQzVCLHFDQUF5QjtBQUd6QixnQkFBSSxjQUFjLE1BQU07QUFFeEIsbUJBQU8sZ0JBQWdCLE1BQU07QUFDM0Isc0JBQVEsWUFBWTtBQUFBLHFCQUNiO0FBQ0gsc0JBQUksUUFBTyxZQUFZO0FBRXZCLHNCQUFJLFVBQVMsTUFBTTtBQUNqQiwwQkFBSyx5QkFBeUI7QUFBQTtBQUdoQztBQUFBLHFCQUVHO0FBQ0gsc0JBQUksa0JBQWtCLFlBQVk7QUFFbEMsc0JBQUksb0JBQW9CLE1BQU07QUFJNUIsb0NBQWdCLHlCQUF5QjtBQUFBO0FBRzNDO0FBQUE7QUFHSiw0QkFBYyxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBS2hDLDBDQUFrQztBQUVoQyxrQ0FBd0I7QUFBQTtBQUcxQiwyQ0FBbUM7QUFFakMsbUNBQXlCO0FBQUE7QUFHM0Isd0NBQWdDLE9BQU87QUFJckMsY0FBSSxRQUFRLE1BQU07QUFFbEIsaUJBQU8sT0FBTztBQUNaLGtCQUFNLGtCQUFrQixNQUFNO0FBQzlCLG9CQUFRLE1BQU07QUFBQTtBQUFBO0FBSWxCLHFDQUE2QixPQUFPLFFBQVE7QUFHMUMsaUJBQU87QUFBQSxZQUNMO0FBQUEsWUFDQTtBQUFBLFlBQ0EsT0FBTyw0QkFBNEI7QUFBQTtBQUFBO0FBT3ZDLGlDQUF5QixVQUFVLFdBQVc7QUFDNUMsaUJBQU87QUFBQTtBQUdULGtDQUEwQixVQUFVLFdBQVc7QUFDN0MsY0FBSTtBQUNGLGdCQUFJLFdBQVcsZ0JBQWdCLFVBQVU7QUFHekMsZ0JBQUksYUFBYSxPQUFPO0FBQ3RCO0FBQUE7QUFHRixnQkFBSSxTQUFRLFVBQVU7QUFFdEIsZ0JBQUksTUFBTTtBQUNSLGtCQUFJLFNBQVMsVUFBVTtBQUN2QixrQkFBSSxRQUFRLFVBQVU7QUFDdEIsa0JBQUksaUJBQWlCLFVBQVUsT0FBTyxRQUFRO0FBSTlDLGtCQUFJLFVBQVMsUUFBUSxPQUFNLGtCQUFrQjtBQUMzQyxvQkFBSSxTQUFTLFFBQVEsZ0JBQWdCO0FBSW5DO0FBQUE7QUFPRix3QkFBUSxTQUFTO0FBQUE7QUFLbkIsa0JBQUksZ0JBQWdCLFNBQVMsMEJBQTBCLFVBQVU7QUFDakUsa0JBQUksdUJBQXVCLGdCQUFnQixzQ0FBc0MsZ0JBQWdCLGlCQUFpQjtBQUNsSCxrQkFBSTtBQUVKLGtCQUFJLFNBQVMsUUFBUSxVQUFVO0FBQzdCLHVDQUF1QjtBQUFBLHFCQUNsQjtBQUNMLG9CQUFJLG9CQUFvQiwwQkFBMEIsYUFBYTtBQUMvRCx1Q0FBdUIsaUVBQWtFLDZDQUE0QyxvQkFBb0I7QUFBQTtBQUczSixrQkFBSSxrQkFBa0IsdUJBQXVCLE9BQU8saUJBQWlCLFNBQVUsTUFBSztBQUtwRixzQkFBUSxTQUFTO0FBQUEsbUJBQ1o7QUFJTCxzQkFBUSxTQUFTO0FBQUE7QUFBQSxtQkFFWixHQUFQO0FBS0EsdUJBQVcsV0FBWTtBQUNyQixvQkFBTTtBQUFBO0FBQUE7QUFBQTtBQUtaLFlBQUksb0JBQW9CLE9BQU8sWUFBWSxhQUFhLFVBQVU7QUFFbEUsdUNBQStCLE9BQU8sV0FBVyxNQUFNO0FBQ3JELGNBQUksU0FBUyxhQUFhLGFBQWE7QUFFdkMsaUJBQU8sTUFBTTtBQUdiLGlCQUFPLFVBQVU7QUFBQSxZQUNmLFNBQVM7QUFBQTtBQUVYLGNBQUksU0FBUSxVQUFVO0FBRXRCLGlCQUFPLFdBQVcsV0FBWTtBQUM1Qiw0QkFBZ0I7QUFDaEIsNkJBQWlCLE9BQU87QUFBQTtBQUcxQixpQkFBTztBQUFBO0FBR1Qsd0NBQWdDLE9BQU8sV0FBVyxNQUFNO0FBQ3RELGNBQUksU0FBUyxhQUFhLGFBQWE7QUFDdkMsaUJBQU8sTUFBTTtBQUNiLGNBQUksMkJBQTJCLE1BQU0sS0FBSztBQUUxQyxjQUFJLE9BQU8sNkJBQTZCLFlBQVk7QUFDbEQsZ0JBQUksVUFBVSxVQUFVO0FBRXhCLG1CQUFPLFVBQVUsV0FBWTtBQUMzQixxQkFBTyx5QkFBeUI7QUFBQTtBQUdsQyxtQkFBTyxXQUFXLFdBQVk7QUFDNUI7QUFDRSx1REFBdUM7QUFBQTtBQUd6QywrQkFBaUIsT0FBTztBQUFBO0FBQUE7QUFJNUIsY0FBSSxPQUFPLE1BQU07QUFFakIsY0FBSSxTQUFTLFFBQVEsT0FBTyxLQUFLLHNCQUFzQixZQUFZO0FBQ2pFLG1CQUFPLFdBQVcsb0JBQW9CO0FBQ3BDO0FBQ0UsdURBQXVDO0FBQUE7QUFHekMsK0JBQWlCLE9BQU87QUFFeEIsa0JBQUksT0FBTyw2QkFBNkIsWUFBWTtBQU1sRCxnREFBZ0M7QUFBQTtBQUdsQyxrQkFBSSxXQUFVLFVBQVU7QUFDeEIsa0JBQUksUUFBUSxVQUFVO0FBQ3RCLG1CQUFLLGtCQUFrQixVQUFTO0FBQUEsZ0JBQzlCLGdCQUFnQixVQUFVLE9BQU8sUUFBUTtBQUFBO0FBRzNDO0FBQ0Usb0JBQUksT0FBTyw2QkFBNkIsWUFBWTtBQUlsRCxzQkFBSSxDQUFDLGlCQUFpQixNQUFNLE9BQU8sV0FBVztBQUM1QywwQkFBTSx1SkFBNEosMEJBQTBCLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT2hOLGlCQUFPO0FBQUE7QUFHVCxvQ0FBNEIsT0FBTSxVQUFVLE9BQU87QUFhakQsY0FBSSxZQUFZLE1BQUs7QUFDckIsY0FBSTtBQUVKLGNBQUksY0FBYyxNQUFNO0FBQ3RCLHdCQUFZLE1BQUssWUFBWSxJQUFJO0FBQ2pDLHdCQUFZLElBQUk7QUFDaEIsc0JBQVUsSUFBSSxVQUFVO0FBQUEsaUJBQ25CO0FBQ0wsd0JBQVksVUFBVSxJQUFJO0FBRTFCLGdCQUFJLGNBQWMsUUFBVztBQUMzQiwwQkFBWSxJQUFJO0FBQ2hCLHdCQUFVLElBQUksVUFBVTtBQUFBO0FBQUE7QUFJNUIsY0FBSSxDQUFDLFVBQVUsSUFBSSxRQUFRO0FBRXpCLHNCQUFVLElBQUk7QUFDZCxnQkFBSSxPQUFPLGtCQUFrQixLQUFLLE1BQU0sT0FBTSxVQUFVO0FBRXhEO0FBQ0Usa0JBQUksbUJBQW1CO0FBRXJCLHVDQUF1QixPQUFNO0FBQUE7QUFBQTtBQUlqQyxxQkFBUyxLQUFLLE1BQU07QUFBQTtBQUFBO0FBSXhCLHFDQUE2QixrQkFBa0IsT0FBTSxVQUFVLE9BQU87QUFZcEUsY0FBSSxZQUFZLGlCQUFpQjtBQUVqQyxjQUFJLGNBQWMsTUFBTTtBQUN0QixnQkFBSSxjQUFjLElBQUk7QUFDdEIsd0JBQVksSUFBSTtBQUNoQiw2QkFBaUIsY0FBYztBQUFBLGlCQUMxQjtBQUNMLHNCQUFVLElBQUk7QUFBQTtBQUFBO0FBSWxCLHlDQUFpQyxhQUFhLGlCQUFpQjtBQUk3RCxjQUFJLE1BQU0sWUFBWTtBQUV0QixjQUFLLGFBQVksT0FBTyxvQkFBb0IsVUFBVyxTQUFRLHFCQUFxQixRQUFRLGNBQWMsUUFBUSxzQkFBc0I7QUFDdEksZ0JBQUksZ0JBQWdCLFlBQVk7QUFFaEMsZ0JBQUksZUFBZTtBQUNqQiwwQkFBWSxjQUFjLGNBQWM7QUFDeEMsMEJBQVksZ0JBQWdCLGNBQWM7QUFDMUMsMEJBQVksUUFBUSxjQUFjO0FBQUEsbUJBQzdCO0FBQ0wsMEJBQVksY0FBYztBQUMxQiwwQkFBWSxnQkFBZ0I7QUFBQTtBQUFBO0FBQUE7QUFLbEMscURBQTZDLGFBQWE7QUFDeEQsY0FBSSxPQUFPO0FBRVgsYUFBRztBQUNELGdCQUFJLEtBQUssUUFBUSxxQkFBcUIsc0JBQXNCLE9BQU87QUFDakUscUJBQU87QUFBQTtBQUtULG1CQUFPLEtBQUs7QUFBQSxtQkFDTCxTQUFTO0FBRWxCLGlCQUFPO0FBQUE7QUFHVCxtREFBMkMsa0JBQWtCLGFBQWEsYUFBYSxPQUFNLGlCQUFpQjtBQUc1RyxjQUFLLGtCQUFpQixPQUFPLG9CQUFvQixRQUFRO0FBT3ZELGdCQUFJLHFCQUFxQixhQUFhO0FBZ0JwQywrQkFBaUIsU0FBUztBQUFBLG1CQUNyQjtBQUNMLCtCQUFpQixTQUFTO0FBQzFCLDBCQUFZLFNBQVM7QUFJckIsMEJBQVksU0FBUyxDQUFFLHVCQUFzQjtBQUU3QyxrQkFBSSxZQUFZLFFBQVEsZ0JBQWdCO0FBQ3RDLG9CQUFJLHFCQUFxQixZQUFZO0FBRXJDLG9CQUFJLHVCQUF1QixNQUFNO0FBSS9CLDhCQUFZLE1BQU07QUFBQSx1QkFDYjtBQUlMLHNCQUFJLFNBQVMsYUFBYSxhQUFhO0FBQ3ZDLHlCQUFPLE1BQU07QUFDYixnQ0FBYyxhQUFhO0FBQUE7QUFBQTtBQU0vQiwwQkFBWSxRQUFRLFdBQVcsWUFBWSxPQUFPO0FBQUE7QUFHcEQsbUJBQU87QUFBQTtBQTJDVCwyQkFBaUIsU0FBUztBQUcxQiwyQkFBaUIsUUFBUTtBQUN6QixpQkFBTztBQUFBO0FBR1QsZ0NBQXdCLE9BQU0sYUFBYSxhQUFhLE9BQU8saUJBQWlCO0FBRTlFLHNCQUFZLFNBQVM7QUFFckI7QUFDRSxnQkFBSSxtQkFBbUI7QUFFckIscUNBQXVCLE9BQU07QUFBQTtBQUFBO0FBSWpDLGNBQUksVUFBVSxRQUFRLE9BQU8sVUFBVSxZQUFZLE9BQU8sTUFBTSxTQUFTLFlBQVk7QUFFbkYsZ0JBQUksV0FBVztBQUNmLG9DQUF3QjtBQUV4QjtBQUNFLGtCQUFJLG9CQUFvQixZQUFZLE9BQU8sZ0JBQWdCO0FBQ3pEO0FBQUE7QUFBQTtBQUtKLGdCQUFJLG1CQUFtQixvQ0FBb0M7QUFFM0QsZ0JBQUkscUJBQXFCLE1BQU07QUFDN0IsK0JBQWlCLFNBQVMsQ0FBQztBQUMzQixnREFBa0Msa0JBQWtCLGFBQWEsYUFBYSxPQUFNO0FBR3BGLGtCQUFJLGlCQUFpQixPQUFPLGdCQUFnQjtBQUMxQyxtQ0FBbUIsT0FBTSxVQUFVO0FBQUE7QUFHckMsa0NBQW9CLGtCQUFrQixPQUFNO0FBQzVDO0FBQUEsbUJBQ0s7QUFHTCxrQkFBSSxDQUFDLGlCQUFpQixrQkFBa0I7QUFRdEMsbUNBQW1CLE9BQU0sVUFBVTtBQUNuQztBQUNBO0FBQUE7QUFNRixrQkFBSSx3QkFBd0IsSUFBSSxNQUFNO0FBR3RDLHNCQUFRO0FBQUE7QUFBQSxpQkFFTDtBQUVMLGdCQUFJLG9CQUFvQixZQUFZLE9BQU8sZ0JBQWdCO0FBQ3pEO0FBRUEsa0JBQUksb0JBQW9CLG9DQUFvQztBQU01RCxrQkFBSSxzQkFBc0IsTUFBTTtBQUM5QixvQkFBSyxtQkFBa0IsUUFBUSxtQkFBbUIsU0FBUztBQUd6RCxvQ0FBa0IsU0FBUztBQUFBO0FBRzdCLGtEQUFrQyxtQkFBbUIsYUFBYSxhQUFhLE9BQU07QUFHckYsb0NBQW9CO0FBQ3BCO0FBQUE7QUFBQTtBQUFBO0FBUU4seUJBQWU7QUFDZixrQkFBUSxvQkFBb0IsT0FBTztBQUNuQyxjQUFJLGtCQUFpQjtBQUVyQixhQUFHO0FBQ0Qsb0JBQVEsZ0JBQWU7QUFBQSxtQkFDaEIsVUFDSDtBQUNFLG9CQUFJLGFBQWE7QUFDakIsZ0NBQWUsU0FBUztBQUN4QixvQkFBSSxPQUFPLGtCQUFrQjtBQUM3QixnQ0FBZSxRQUFRLFdBQVcsZ0JBQWUsT0FBTztBQUN4RCxvQkFBSSxTQUFTLHNCQUFzQixpQkFBZ0IsWUFBWTtBQUMvRCxzQ0FBc0IsaUJBQWdCO0FBQ3RDO0FBQUE7QUFBQSxtQkFHQztBQUVILG9CQUFJLFlBQVk7QUFDaEIsb0JBQUksT0FBTyxnQkFBZTtBQUMxQixvQkFBSSxXQUFXLGdCQUFlO0FBRTlCLG9CQUFLLGlCQUFlLFFBQVEsZ0JBQWdCLFdBQVksUUFBTyxLQUFLLDZCQUE2QixjQUFjLGFBQWEsUUFBUSxPQUFPLFNBQVMsc0JBQXNCLGNBQWMsQ0FBQyxtQ0FBbUMsWUFBWTtBQUN0TyxrQ0FBZSxTQUFTO0FBRXhCLHNCQUFJLFFBQVEsa0JBQWtCO0FBRTlCLGtDQUFlLFFBQVEsV0FBVyxnQkFBZSxPQUFPO0FBRXhELHNCQUFJLFVBQVUsdUJBQXVCLGlCQUFnQixXQUFXO0FBRWhFLHdDQUFzQixpQkFBZ0I7QUFDdEM7QUFBQTtBQUdGO0FBQUE7QUFHSiw4QkFBaUIsZ0JBQWU7QUFBQSxtQkFDekIsb0JBQW1CO0FBQUE7QUFHOUIscUNBQTZCO0FBQzNCO0FBQ0UsbUJBQU87QUFBQTtBQUFBO0FBSVgsNEJBQW9CLGlCQUFnQjtBQUdsQywwQkFBZSxTQUFTO0FBQUE7QUFHMUIseUJBQWlCLGlCQUFnQjtBQUMvQiwwQkFBZSxTQUFTO0FBRXhCO0FBQ0UsNEJBQWUsU0FBUztBQUFBO0FBQUE7QUFJNUIsWUFBSTtBQUNKLFlBQUk7QUFDSixZQUFJO0FBQ0osWUFBSTtBQUVKO0FBRUUsOEJBQW9CLFNBQVUsUUFBUSxpQkFBZ0IsdUJBQXVCLFVBQVU7QUFHckYsZ0JBQUksT0FBTyxnQkFBZTtBQUUxQixtQkFBTyxTQUFTLE1BQU07QUFDcEIsa0JBQUksS0FBSyxRQUFRLGlCQUFpQixLQUFLLFFBQVEsVUFBVTtBQUN2RCxtQ0FBbUIsUUFBUSxLQUFLO0FBQUEseUJBQ3ZCLEtBQUssUUFBUTtBQUFZO0FBQUEsdUJBQVcsS0FBSyxVQUFVLE1BQU07QUFDbEUscUJBQUssTUFBTSxTQUFTO0FBQ3BCLHVCQUFPLEtBQUs7QUFDWjtBQUFBO0FBR0Ysa0JBQUksU0FBUyxpQkFBZ0I7QUFDM0I7QUFBQTtBQUdGLHFCQUFPLEtBQUssWUFBWSxNQUFNO0FBQzVCLG9CQUFJLEtBQUssV0FBVyxRQUFRLEtBQUssV0FBVyxpQkFBZ0I7QUFDMUQ7QUFBQTtBQUdGLHVCQUFPLEtBQUs7QUFBQTtBQUdkLG1CQUFLLFFBQVEsU0FBUyxLQUFLO0FBQzNCLHFCQUFPLEtBQUs7QUFBQTtBQUFBO0FBSWhCLGdDQUFzQixTQUFVLFVBQVMsaUJBQWdCO0FBQUE7QUFHekQsZ0NBQXNCLFNBQVUsVUFBUyxpQkFBZ0IsTUFBTSxVQUFVLHVCQUF1QjtBQUc5RixnQkFBSSxXQUFXLFNBQVE7QUFFdkIsZ0JBQUksYUFBYSxVQUFVO0FBR3pCO0FBQUE7QUFPRixnQkFBSSxXQUFXLGdCQUFlO0FBQzlCLGdCQUFJLHFCQUFxQjtBQUl6QixnQkFBSSxnQkFBZ0IsY0FBYyxVQUFVLE1BQU0sVUFBVSxVQUFVLHVCQUF1QjtBQUU3Riw0QkFBZSxjQUFjO0FBRzdCLGdCQUFJLGVBQWU7QUFDakIseUJBQVc7QUFBQTtBQUFBO0FBSWYsMkJBQWlCLFNBQVUsVUFBUyxpQkFBZ0IsU0FBUyxTQUFTO0FBRXBFLGdCQUFJLFlBQVksU0FBUztBQUN2Qix5QkFBVztBQUFBO0FBQUE7QUFBQTtBQUtqQixvQ0FBNEIsYUFBYSwwQkFBMEI7QUFDakUsY0FBSSxrQkFBa0I7QUFHcEI7QUFBQTtBQUdGLGtCQUFRLFlBQVk7QUFBQSxpQkFDYixVQUNIO0FBTUUsa0JBQUksV0FBVyxZQUFZO0FBQzNCLGtCQUFJLGVBQWU7QUFFbkIscUJBQU8sYUFBYSxNQUFNO0FBQ3hCLG9CQUFJLFNBQVMsY0FBYyxNQUFNO0FBQy9CLGlDQUFlO0FBQUE7QUFHakIsMkJBQVcsU0FBUztBQUFBO0FBS3RCLGtCQUFJLGlCQUFpQixNQUFNO0FBRXpCLDRCQUFZLE9BQU87QUFBQSxxQkFDZDtBQUdMLDZCQUFhLFVBQVU7QUFBQTtBQUd6QjtBQUFBO0FBQUEsaUJBR0MsYUFDSDtBQU1FLGtCQUFJLFlBQVksWUFBWTtBQUM1QixrQkFBSSxnQkFBZ0I7QUFFcEIscUJBQU8sY0FBYyxNQUFNO0FBQ3pCLG9CQUFJLFVBQVUsY0FBYyxNQUFNO0FBQ2hDLGtDQUFnQjtBQUFBO0FBR2xCLDRCQUFZLFVBQVU7QUFBQTtBQUt4QixrQkFBSSxrQkFBa0IsTUFBTTtBQUUxQixvQkFBSSxDQUFDLDRCQUE0QixZQUFZLFNBQVMsTUFBTTtBQUcxRCw4QkFBWSxLQUFLLFVBQVU7QUFBQSx1QkFDdEI7QUFDTCw4QkFBWSxPQUFPO0FBQUE7QUFBQSxxQkFFaEI7QUFHTCw4QkFBYyxVQUFVO0FBQUE7QUFHMUI7QUFBQTtBQUFBO0FBQUE7QUFLUixrQ0FBMEIsZUFBZTtBQUN2QyxjQUFJLGFBQWEsY0FBYyxjQUFjLFFBQVEsY0FBYyxVQUFVLFVBQVUsY0FBYztBQUNyRyxjQUFJLGdCQUFnQjtBQUNwQixjQUFJLGVBQWU7QUFFbkIsY0FBSSxDQUFDLFlBQVk7QUFFZixnQkFBTSxlQUFjLE9BQU8saUJBQWlCLFFBQVE7QUFHbEQsa0JBQUksaUJBQWlCLGNBQWM7QUFDbkMsa0JBQUksbUJBQW1CLGNBQWM7QUFDckMsa0JBQUksUUFBUSxjQUFjO0FBRTFCLHFCQUFPLFVBQVUsTUFBTTtBQUNyQixnQ0FBZ0IsV0FBVyxlQUFlLFdBQVcsTUFBTSxPQUFPLE1BQU07QUFDeEUsZ0NBQWdCLE1BQU07QUFDdEIsZ0NBQWdCLE1BQU07QUFRdEIsa0NBQWtCLE1BQU07QUFDeEIsb0NBQW9CLE1BQU07QUFDMUIsd0JBQVEsTUFBTTtBQUFBO0FBR2hCLDRCQUFjLGlCQUFpQjtBQUMvQiw0QkFBYyxtQkFBbUI7QUFBQSxtQkFDNUI7QUFDTCxrQkFBSSxTQUFTLGNBQWM7QUFFM0IscUJBQU8sV0FBVyxNQUFNO0FBQ3RCLGdDQUFnQixXQUFXLGVBQWUsV0FBVyxPQUFPLE9BQU8sT0FBTztBQUMxRSxnQ0FBZ0IsT0FBTztBQUN2QixnQ0FBZ0IsT0FBTztBQUl2Qix1QkFBTyxTQUFTO0FBQ2hCLHlCQUFTLE9BQU87QUFBQTtBQUFBO0FBSXBCLDBCQUFjLGdCQUFnQjtBQUFBLGlCQUN6QjtBQUVMLGdCQUFNLGVBQWMsT0FBTyxpQkFBaUIsUUFBUTtBQUdsRCxrQkFBSSxvQkFBb0IsY0FBYztBQUN0QyxrQkFBSSxVQUFVLGNBQWM7QUFFNUIscUJBQU8sWUFBWSxNQUFNO0FBQ3ZCLGdDQUFnQixXQUFXLGVBQWUsV0FBVyxRQUFRLE9BQU8sUUFBUTtBQUs1RSxnQ0FBZ0IsUUFBUSxlQUFlO0FBQ3ZDLGdDQUFnQixRQUFRLFFBQVE7QUFDaEMscUNBQXFCLFFBQVE7QUFDN0IsMEJBQVUsUUFBUTtBQUFBO0FBR3BCLDRCQUFjLG1CQUFtQjtBQUFBLG1CQUM1QjtBQUNMLGtCQUFJLFVBQVUsY0FBYztBQUU1QixxQkFBTyxZQUFZLE1BQU07QUFDdkIsZ0NBQWdCLFdBQVcsZUFBZSxXQUFXLFFBQVEsT0FBTyxRQUFRO0FBSzVFLGdDQUFnQixRQUFRLGVBQWU7QUFDdkMsZ0NBQWdCLFFBQVEsUUFBUTtBQUloQyx3QkFBUSxTQUFTO0FBQ2pCLDBCQUFVLFFBQVE7QUFBQTtBQUFBO0FBSXRCLDBCQUFjLGdCQUFnQjtBQUFBO0FBR2hDLHdCQUFjLGFBQWE7QUFDM0IsaUJBQU87QUFBQTtBQUdULDhCQUFzQixVQUFTLGlCQUFnQixjQUFhO0FBQzFELGNBQUksV0FBVyxnQkFBZTtBQUs5Qix5QkFBZTtBQUVmLGtCQUFRLGdCQUFlO0FBQUEsaUJBQ2hCO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQTtBQUFBLGlCQUNBO0FBQ0gsK0JBQWlCO0FBQ2pCLHFCQUFPO0FBQUEsaUJBRUosZ0JBQ0g7QUFDRSxrQkFBSSxZQUFZLGdCQUFlO0FBRS9CLGtCQUFJLGtCQUFrQixZQUFZO0FBQ2hDLDJCQUFXO0FBQUE7QUFHYiwrQkFBaUI7QUFDakIscUJBQU87QUFBQTtBQUFBLGlCQUdOLFVBQ0g7QUFDRSxrQkFBSSxZQUFZLGdCQUFlO0FBQy9CLCtCQUFpQjtBQUNqQix1Q0FBeUI7QUFDekI7QUFFQSxrQkFBSSxVQUFVLGdCQUFnQjtBQUM1QiwwQkFBVSxVQUFVLFVBQVU7QUFDOUIsMEJBQVUsaUJBQWlCO0FBQUE7QUFHN0Isa0JBQUksYUFBWSxRQUFRLFNBQVEsVUFBVSxNQUFNO0FBRzlDLG9CQUFJLGNBQWMsa0JBQWtCO0FBRXBDLG9CQUFJLGFBQWE7QUFHZiw2QkFBVztBQUFBLHVCQUNOO0FBQ0wsc0JBQUksYUFBWSxNQUFNO0FBQ3BCLHdCQUFJLFlBQVksU0FBUTtBQUV4Qix3QkFDQSxDQUFDLFVBQVUsZ0JBQ1YsaUJBQWUsUUFBUSx1QkFBdUIsU0FBUztBQU90RCxzQ0FBZSxTQUFTO0FBSXhCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNUixrQ0FBb0IsVUFBUztBQUM3QiwrQkFBaUI7QUFFakIscUJBQU87QUFBQTtBQUFBLGlCQUdOLGVBQ0g7QUFDRSw2QkFBZTtBQUNmLGtCQUFJLHdCQUF3QjtBQUM1QixrQkFBSSxPQUFPLGdCQUFlO0FBRTFCLGtCQUFJLGFBQVksUUFBUSxnQkFBZSxhQUFhLE1BQU07QUFDeEQsb0NBQW9CLFVBQVMsaUJBQWdCLE1BQU0sVUFBVTtBQUU3RCxvQkFBSSxTQUFRLFFBQVEsZ0JBQWUsS0FBSztBQUN0QywwQkFBUTtBQUFBO0FBQUEscUJBRUw7QUFDTCxvQkFBSSxDQUFDLFVBQVU7QUFDYixzQkFBSSxnQkFBZSxjQUFjLE1BQU07QUFDckMsMEJBQU0sSUFBSSxNQUFNO0FBQUE7QUFJbEIsbUNBQWlCO0FBQ2pCLHlCQUFPO0FBQUE7QUFHVCxvQkFBSSxxQkFBcUI7QUFLekIsb0JBQUksZUFBZSxrQkFBa0I7QUFFckMsb0JBQUksY0FBYztBQUdoQixzQkFBSSw2QkFBNkIsaUJBQWdCLHVCQUF1QixxQkFBcUI7QUFHM0YsK0JBQVc7QUFBQTtBQUFBLHVCQUVSO0FBQ0wsc0JBQUksV0FBVyxlQUFlLE1BQU0sVUFBVSx1QkFBdUIsb0JBQW9CO0FBQ3pGLG9DQUFrQixVQUFVLGlCQUFnQixPQUFPO0FBQ25ELGtDQUFlLFlBQVk7QUFJM0Isc0JBQUksd0JBQXdCLFVBQVUsTUFBTSxVQUFVLHdCQUF3QjtBQUM1RSwrQkFBVztBQUFBO0FBQUE7QUFJZixvQkFBSSxnQkFBZSxRQUFRLE1BQU07QUFFL0IsMEJBQVE7QUFBQTtBQUFBO0FBSVosK0JBQWlCO0FBQ2pCLHFCQUFPO0FBQUE7QUFBQSxpQkFHTixVQUNIO0FBQ0Usa0JBQUksVUFBVTtBQUVkLGtCQUFJLFlBQVcsZ0JBQWUsYUFBYSxNQUFNO0FBQy9DLG9CQUFJLFVBQVUsU0FBUTtBQUd0QiwrQkFBZSxVQUFTLGlCQUFnQixTQUFTO0FBQUEscUJBQzVDO0FBQ0wsb0JBQUksT0FBTyxZQUFZLFVBQVU7QUFDL0Isc0JBQUksZ0JBQWUsY0FBYyxNQUFNO0FBQ3JDLDBCQUFNLElBQUksTUFBTTtBQUFBO0FBQUE7QUFLcEIsb0JBQUkseUJBQXlCO0FBRTdCLG9CQUFJLHNCQUFzQjtBQUUxQixvQkFBSSxnQkFBZ0Isa0JBQWtCO0FBRXRDLG9CQUFJLGVBQWU7QUFDakIsc0JBQUksaUNBQWlDLGtCQUFpQjtBQUNwRCwrQkFBVztBQUFBO0FBQUEsdUJBRVI7QUFDTCxrQ0FBZSxZQUFZLG1CQUFtQixTQUFTLHdCQUF3QixxQkFBcUI7QUFBQTtBQUFBO0FBSXhHLCtCQUFpQjtBQUNqQixxQkFBTztBQUFBO0FBQUEsaUJBR04sbUJBQ0g7QUFDRSxpQ0FBbUI7QUFDbkIsa0JBQUksWUFBWSxnQkFBZTtBQUUvQixrQkFBSSw0QkFBNkIsaUJBQWUsT0FBTyxvQkFBb0IsVUFBVyxpQkFBZSxRQUFRLGdCQUFnQixTQUFTO0FBQ3BJLDBDQUEwQjtBQUMxQjtBQUNBLGdDQUFlLFNBQVMsb0JBQW9CLGFBQWE7QUFDekQsdUJBQU87QUFBQTtBQUdULGtCQUFJLGNBQWMsUUFBUSxVQUFVLGVBQWUsTUFBTTtBQUd2RCxvQkFBSSxnQkFBZ0Isa0JBQWtCO0FBRXRDLG9CQUFJLGFBQVksTUFBTTtBQUNwQixzQkFBSSxDQUFDLGVBQWU7QUFDbEIsMEJBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsdURBQXFDO0FBQ3JDLG1DQUFpQjtBQUVqQjtBQUNFLHdCQUFLLGlCQUFlLE9BQU8saUJBQWlCLFFBQVE7QUFDbEQsMEJBQUkscUJBQXFCLGNBQWM7QUFFdkMsMEJBQUksb0JBQW9CO0FBRXRCLDRCQUFJLHVCQUF1QixnQkFBZTtBQUUxQyw0QkFBSSx5QkFBeUIsTUFBTTtBQUVqQywwQ0FBZSxvQkFBb0IscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNaEUseUJBQU87QUFBQSx1QkFDRjtBQUdMO0FBRUEsc0JBQUssaUJBQWUsUUFBUSxnQkFBZ0IsU0FBUztBQUVuRCxvQ0FBZSxnQkFBZ0I7QUFBQTtBQVFqQyxrQ0FBZSxTQUFTO0FBQ3hCLG1DQUFpQjtBQUVqQjtBQUNFLHdCQUFLLGlCQUFlLE9BQU8saUJBQWlCLFFBQVE7QUFDbEQsMEJBQUksc0JBQXNCLGNBQWM7QUFFeEMsMEJBQUkscUJBQXFCO0FBRXZCLDRCQUFJLHdCQUF3QixnQkFBZTtBQUUzQyw0QkFBSSwwQkFBMEIsTUFBTTtBQUVsQywwQ0FBZSxvQkFBb0Isc0JBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNakUseUJBQU87QUFBQTtBQUFBO0FBUVg7QUFFQSxrQkFBSyxpQkFBZSxRQUFRLGdCQUFnQixTQUFTO0FBRW5ELGdDQUFlLFFBQVE7QUFFdkIsb0JBQU0saUJBQWUsT0FBTyxpQkFBaUIsUUFBUTtBQUNuRCx5Q0FBdUI7QUFBQTtBQUl6Qix1QkFBTztBQUFBO0FBR1Qsa0JBQUksaUJBQWlCLGNBQWM7QUFDbkMsa0JBQUksaUJBQWlCO0FBRXJCLGtCQUFJLGFBQVksTUFBTTtBQUNwQixrQ0FBa0I7QUFBQSxxQkFDYjtBQUNMLG9CQUFJLGFBQWEsU0FBUTtBQUN6QixpQ0FBaUIsZUFBZTtBQUFBO0FBS2xDLGtCQUFJLG1CQUFtQixnQkFBZ0I7QUFhckMsb0JBQUksZ0JBQWdCO0FBQ2xCLHNCQUFJLG1CQUFtQixnQkFBZTtBQUN0QyxtQ0FBaUIsU0FBUztBQUkxQixzQkFBSyxpQkFBZSxPQUFPLG9CQUFvQixRQUFRO0FBUXJELHdCQUFJLDJCQUEyQixhQUFZLFFBQVMsaUJBQWUsY0FBYywrQkFBK0IsUUFBUSxDQUFDO0FBRXpILHdCQUFJLDRCQUE0QixtQkFBbUIsb0JBQW9CLFNBQVMsaUNBQWlDO0FBRy9HO0FBQUEsMkJBQ0s7QUFHTDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTVIsa0JBQUksWUFBWSxnQkFBZTtBQUUvQixrQkFBSSxjQUFjLE1BQU07QUFHdEIsZ0NBQWUsU0FBUztBQUFBO0FBRzFCLCtCQUFpQjtBQUVqQjtBQUNFLG9CQUFLLGlCQUFlLE9BQU8saUJBQWlCLFFBQVE7QUFDbEQsc0JBQUksZ0JBQWdCO0FBRWxCLHdCQUFJLHlCQUF5QixnQkFBZTtBQUU1Qyx3QkFBSSwyQkFBMkIsTUFBTTtBQUVuQyxzQ0FBZSxvQkFBb0IsdUJBQXVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNbEUscUJBQU87QUFBQTtBQUFBLGlCQUdOO0FBQ0gsK0JBQWlCO0FBQ2pCLGtDQUFvQixVQUFTO0FBRTdCLGtCQUFJLGFBQVksTUFBTTtBQUNwQixtQ0FBbUIsZ0JBQWUsVUFBVTtBQUFBO0FBRzlDLCtCQUFpQjtBQUNqQixxQkFBTztBQUFBLGlCQUVKO0FBRUgsa0JBQUksVUFBVSxnQkFBZSxLQUFLO0FBQ2xDLDBCQUFZLFNBQVM7QUFDckIsK0JBQWlCO0FBQ2pCLHFCQUFPO0FBQUEsaUJBRUosMEJBQ0g7QUFHRSxrQkFBSSxhQUFhLGdCQUFlO0FBRWhDLGtCQUFJLGtCQUFrQixhQUFhO0FBQ2pDLDJCQUFXO0FBQUE7QUFHYiwrQkFBaUI7QUFDakIscUJBQU87QUFBQTtBQUFBLGlCQUdOLHVCQUNIO0FBQ0UsaUNBQW1CO0FBQ25CLGtCQUFJLGNBQWMsZ0JBQWU7QUFFakMsa0JBQUksZ0JBQWdCLE1BQU07QUFHeEIsaUNBQWlCO0FBQ2pCLHVCQUFPO0FBQUE7QUFHVCxrQkFBSSxvQkFBcUIsaUJBQWUsUUFBUSxnQkFBZ0I7QUFDaEUsa0JBQUksZUFBZSxZQUFZO0FBRS9CLGtCQUFJLGlCQUFpQixNQUFNO0FBRXpCLG9CQUFJLENBQUMsbUJBQW1CO0FBVXRCLHNCQUFJLG9CQUFvQiw4QkFBK0IsY0FBWSxRQUFTLFVBQVEsUUFBUSxnQkFBZ0I7QUFFNUcsc0JBQUksQ0FBQyxtQkFBbUI7QUFDdEIsd0JBQUksTUFBTSxnQkFBZTtBQUV6QiwyQkFBTyxRQUFRLE1BQU07QUFDbkIsMEJBQUksWUFBWSxtQkFBbUI7QUFFbkMsMEJBQUksY0FBYyxNQUFNO0FBQ3RCLDRDQUFvQjtBQUNwQix3Q0FBZSxTQUFTO0FBQ3hCLDJDQUFtQixhQUFhO0FBYWhDLDRCQUFJLGVBQWUsVUFBVTtBQUU3Qiw0QkFBSSxpQkFBaUIsTUFBTTtBQUN6QiwwQ0FBZSxjQUFjO0FBQzdCLDBDQUFlLFNBQVM7QUFBQTtBQU8xQix3Q0FBZSxlQUFlO0FBQzlCLHlDQUFpQixpQkFBZ0I7QUFHakMsNENBQW9CLGlCQUFnQiwwQkFBMEIsb0JBQW9CLFNBQVM7QUFFM0YsK0JBQU8sZ0JBQWU7QUFBQTtBQUd4Qiw0QkFBTSxJQUFJO0FBQUE7QUFBQTtBQUlkLHNCQUFJLFlBQVksU0FBUyxRQUFRLFFBQVEsdUJBQXVCO0FBSTlELG9DQUFlLFNBQVM7QUFDeEIsd0NBQW9CO0FBQ3BCLHVDQUFtQixhQUFhO0FBU2hDLG9DQUFlLFFBQVE7QUFBQTtBQUFBLHVCQUVwQjtBQUNMLHFDQUFtQixhQUFhO0FBQUE7QUFBQSxxQkFHN0I7QUFFTCxvQkFBSSxDQUFDLG1CQUFtQjtBQUN0QixzQkFBSSxhQUFhLG1CQUFtQjtBQUVwQyxzQkFBSSxlQUFlLE1BQU07QUFDdkIsb0NBQWUsU0FBUztBQUN4Qix3Q0FBb0I7QUFHcEIsd0JBQUksZ0JBQWdCLFdBQVc7QUFFL0Isd0JBQUksa0JBQWtCLE1BQU07QUFDMUIsc0NBQWUsY0FBYztBQUM3QixzQ0FBZSxTQUFTO0FBQUE7QUFHMUIsdUNBQW1CLGFBQWE7QUFFaEMsd0JBQUksWUFBWSxTQUFTLFFBQVEsWUFBWSxhQUFhLFlBQVksQ0FBQyxhQUFhLGFBQWEsQ0FBQyxrQkFDaEc7QUFFRSx1Q0FBaUI7QUFDakIsNkJBQU87QUFBQTtBQUFBLDZCQUtiLFFBQVEsSUFBSSxZQUFZLHFCQUFxQix5QkFBeUIsaUJBQWdCLGVBQWU7QUFJbkcsb0NBQWUsU0FBUztBQUN4Qix3Q0FBb0I7QUFDcEIsdUNBQW1CLGFBQWE7QUFTaEMsb0NBQWUsUUFBUTtBQUFBO0FBQUE7QUFJM0Isb0JBQUksWUFBWSxhQUFhO0FBTTNCLCtCQUFhLFVBQVUsZ0JBQWU7QUFDdEMsa0NBQWUsUUFBUTtBQUFBLHVCQUNsQjtBQUNMLHNCQUFJLGtCQUFrQixZQUFZO0FBRWxDLHNCQUFJLG9CQUFvQixNQUFNO0FBQzVCLG9DQUFnQixVQUFVO0FBQUEseUJBQ3JCO0FBQ0wsb0NBQWUsUUFBUTtBQUFBO0FBR3pCLDhCQUFZLE9BQU87QUFBQTtBQUFBO0FBSXZCLGtCQUFJLFlBQVksU0FBUyxNQUFNO0FBRzdCLG9CQUFJLE9BQU8sWUFBWTtBQUN2Qiw0QkFBWSxZQUFZO0FBQ3hCLDRCQUFZLE9BQU8sS0FBSztBQUN4Qiw0QkFBWSxxQkFBcUI7QUFDakMscUJBQUssVUFBVTtBQUlmLG9CQUFJLGtCQUFrQixvQkFBb0I7QUFFMUMsb0JBQUksbUJBQW1CO0FBQ3JCLG9DQUFrQiwwQkFBMEIsaUJBQWlCO0FBQUEsdUJBQ3hEO0FBQ0wsb0NBQWtCLGlDQUFpQztBQUFBO0FBR3JELG9DQUFvQixpQkFBZ0I7QUFHcEMsdUJBQU87QUFBQTtBQUdULCtCQUFpQjtBQUNqQixxQkFBTztBQUFBO0FBQUEsaUJBR04sZ0JBQ0g7QUFFRTtBQUFBO0FBQUEsaUJBR0M7QUFBQSxpQkFDQSx1QkFDSDtBQUNFLDZCQUFlO0FBQ2Ysa0JBQUksYUFBYSxnQkFBZTtBQUNoQyxrQkFBSSxlQUFlLGVBQWU7QUFFbEMsa0JBQUksYUFBWSxNQUFNO0FBQ3BCLG9CQUFJLGNBQWMsU0FBUTtBQUMxQixvQkFBSSxlQUFlLGdCQUFnQjtBQUVuQyxvQkFBSSxpQkFBaUIsZ0JBQ3JCLENBQUMsb0JBQXNCO0FBQ3JCLGtDQUFlLFNBQVM7QUFBQTtBQUFBO0FBSTVCLGtCQUFJLENBQUMsZ0JBQWlCLGlCQUFlLE9BQU8sb0JBQW9CLFFBQVE7QUFDdEUsaUNBQWlCO0FBQUEscUJBQ1o7QUFHTCxvQkFBSSxpQkFBaUIsb0JBQW9CLGdCQUFnQjtBQUN2RCxtQ0FBaUI7QUFFakI7QUFJRSx3QkFBSyxnQkFBZSxlQUFnQixhQUFZLFNBQVM7QUFDdkQsc0NBQWUsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS2hDLHFCQUFPO0FBQUE7QUFBQSxpQkFHTixnQkFDSDtBQUVFLHFCQUFPO0FBQUE7QUFBQSxpQkFHTix3QkFDSDtBQUVFLHFCQUFPO0FBQUE7QUFBQTtBQUliLGdCQUFNLElBQUksTUFBTSwrQkFBK0IsZ0JBQWUsTUFBTTtBQUFBO0FBR3RFLFlBQUksc0JBQXNCLHFCQUFxQjtBQUMvQyxZQUFJLG1CQUFtQjtBQUN2QixZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFDSixZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFDSixZQUFJO0FBQ0osWUFBSTtBQUVKO0FBQ0UsaUNBQXVCO0FBQ3ZCLCtDQUFxQztBQUNyQyx1REFBNkM7QUFDN0MsMkRBQWlEO0FBQ2pELHFDQUEyQjtBQUMzQix5Q0FBK0I7QUFDL0Isb0NBQTBCO0FBQzFCLG9DQUEwQjtBQUFBO0FBRzVCLG1DQUEyQixVQUFTLGlCQUFnQixjQUFjLGNBQWE7QUFDN0UsY0FBSSxhQUFZLE1BQU07QUFLcEIsNEJBQWUsUUFBUSxpQkFBaUIsaUJBQWdCLE1BQU0sY0FBYztBQUFBLGlCQUN2RTtBQU1MLDRCQUFlLFFBQVEscUJBQXFCLGlCQUFnQixTQUFRLE9BQU8sY0FBYztBQUFBO0FBQUE7QUFJN0YsaURBQXlDLFVBQVMsaUJBQWdCLGNBQWMsY0FBYTtBQVMzRiwwQkFBZSxRQUFRLHFCQUFxQixpQkFBZ0IsU0FBUSxPQUFPLE1BQU07QUFLakYsMEJBQWUsUUFBUSxxQkFBcUIsaUJBQWdCLE1BQU0sY0FBYztBQUFBO0FBR2xGLGtDQUEwQixVQUFTLGlCQUFnQixXQUFXLFdBQVcsY0FBYTtBQUlwRjtBQUNFLGdCQUFJLGdCQUFlLFNBQVMsZ0JBQWUsYUFBYTtBQUd0RCxrQkFBSSxpQkFBaUIsVUFBVTtBQUUvQixrQkFBSSxnQkFBZ0I7QUFDbEIsK0JBQWUsZ0JBQWdCLFdBQy9CLFFBQVEseUJBQXlCO0FBQUE7QUFBQTtBQUFBO0FBS3ZDLGNBQUksVUFBUyxVQUFVO0FBQ3ZCLGNBQUksTUFBTSxnQkFBZTtBQUV6QixjQUFJO0FBQ0osY0FBSTtBQUNKLCtCQUFxQixpQkFBZ0I7QUFFckM7QUFDRSx1Q0FBMkI7QUFBQTtBQUc3QjtBQUNFLGdDQUFvQixVQUFVO0FBQzlCLDJCQUFlO0FBQ2YsMkJBQWUsZ0JBQWdCLFVBQVMsaUJBQWdCLFNBQVEsV0FBVyxLQUFLO0FBQ2hGLG9CQUFRO0FBRVIsZ0JBQUssZ0JBQWUsT0FBTyxrQkFBa0I7QUFDM0MseUNBQTJCO0FBRTNCLGtCQUFJO0FBQ0YsK0JBQWUsZ0JBQWdCLFVBQVMsaUJBQWdCLFNBQVEsV0FBVyxLQUFLO0FBQ2hGLHdCQUFRO0FBQUEsd0JBQ1I7QUFDQSwyQ0FBMkI7QUFBQTtBQUFBO0FBSS9CLDJCQUFlO0FBQUE7QUFHakI7QUFDRTtBQUFBO0FBR0YsY0FBSSxhQUFZLFFBQVEsQ0FBQyxrQkFBa0I7QUFDekMseUJBQWEsVUFBUyxpQkFBZ0I7QUFDdEMsbUJBQU8sNkJBQTZCLFVBQVMsaUJBQWdCO0FBQUE7QUFHL0QsY0FBSSxvQkFBb0IsT0FBTztBQUM3QixtQ0FBdUI7QUFBQTtBQUl6QiwwQkFBZSxTQUFTO0FBQ3hCLDRCQUFrQixVQUFTLGlCQUFnQixjQUFjO0FBQ3pELGlCQUFPLGdCQUFlO0FBQUE7QUFHeEIscUNBQTZCLFVBQVMsaUJBQWdCLFdBQVcsV0FBVyxjQUFhO0FBQ3ZGLGNBQUksYUFBWSxNQUFNO0FBQ3BCLGdCQUFJLE9BQU8sVUFBVTtBQUVyQixnQkFBSSwwQkFBMEIsU0FBUyxVQUFVLFlBQVksUUFDN0QsVUFBVSxpQkFBaUIsUUFBVztBQUNwQyxrQkFBSSxlQUFlO0FBRW5CO0FBQ0UsK0JBQWUsK0JBQStCO0FBQUE7QUFNaEQsOEJBQWUsTUFBTTtBQUNyQiw4QkFBZSxPQUFPO0FBRXRCO0FBQ0UsK0NBQStCLGlCQUFnQjtBQUFBO0FBR2pELHFCQUFPLDBCQUEwQixVQUFTLGlCQUFnQixjQUFjLFdBQVc7QUFBQTtBQUdyRjtBQUNFLGtCQUFJLGlCQUFpQixLQUFLO0FBRTFCLGtCQUFJLGdCQUFnQjtBQUdsQiwrQkFBZSxnQkFBZ0IsV0FDL0IsUUFBUSx5QkFBeUI7QUFBQTtBQUFBO0FBSXJDLGdCQUFJLFFBQVEsNEJBQTRCLFVBQVUsTUFBTSxNQUFNLFdBQVcsaUJBQWdCLGdCQUFlLE1BQU07QUFDOUcsa0JBQU0sTUFBTSxnQkFBZTtBQUMzQixrQkFBTSxTQUFTO0FBQ2YsNEJBQWUsUUFBUTtBQUN2QixtQkFBTztBQUFBO0FBR1Q7QUFDRSxnQkFBSSxRQUFRLFVBQVU7QUFDdEIsZ0JBQUksa0JBQWtCLE1BQU07QUFFNUIsZ0JBQUksaUJBQWlCO0FBR25CLDZCQUFlLGlCQUFpQixXQUNoQyxRQUFRLHlCQUF5QjtBQUFBO0FBQUE7QUFJckMsY0FBSSxlQUFlLFNBQVE7QUFFM0IsY0FBSSw4QkFBOEIsOEJBQThCLFVBQVM7QUFFekUsY0FBSSxDQUFDLDZCQUE2QjtBQUdoQyxnQkFBSSxZQUFZLGFBQWE7QUFFN0IsZ0JBQUksVUFBVSxVQUFVO0FBQ3hCLHNCQUFVLFlBQVksT0FBTyxVQUFVO0FBRXZDLGdCQUFJLFFBQVEsV0FBVyxjQUFjLFNBQVEsUUFBUSxnQkFBZSxLQUFLO0FBQ3ZFLHFCQUFPLDZCQUE2QixVQUFTLGlCQUFnQjtBQUFBO0FBQUE7QUFLakUsMEJBQWUsU0FBUztBQUN4QixjQUFJLFdBQVcscUJBQXFCLGNBQWM7QUFDbEQsbUJBQVMsTUFBTSxnQkFBZTtBQUM5QixtQkFBUyxTQUFTO0FBQ2xCLDBCQUFlLFFBQVE7QUFDdkIsaUJBQU87QUFBQTtBQUdULDJDQUFtQyxVQUFTLGlCQUFnQixXQUFXLFdBQVcsY0FBYTtBQUk3RjtBQUNFLGdCQUFJLGdCQUFlLFNBQVMsZ0JBQWUsYUFBYTtBQUd0RCxrQkFBSSxnQkFBZ0IsZ0JBQWU7QUFFbkMsa0JBQUksY0FBYyxhQUFhLGlCQUFpQjtBQUk5QyxvQkFBSSxnQkFBZ0I7QUFDcEIsb0JBQUksVUFBVSxjQUFjO0FBQzVCLG9CQUFJLE9BQU8sY0FBYztBQUV6QixvQkFBSTtBQUNGLGtDQUFnQixLQUFLO0FBQUEseUJBQ2QsR0FBUDtBQUNBLGtDQUFnQjtBQUFBO0FBSWxCLG9CQUFJLGlCQUFpQixpQkFBaUIsY0FBYztBQUVwRCxvQkFBSSxnQkFBZ0I7QUFDbEIsaUNBQWUsZ0JBQWdCLFdBQy9CLFFBQVEseUJBQXlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNekMsY0FBSSxhQUFZLE1BQU07QUFDcEIsZ0JBQUksWUFBWSxTQUFRO0FBRXhCLGdCQUFJLGFBQWEsV0FBVyxjQUFjLFNBQVEsUUFBUSxnQkFBZSxPQUN4RSxnQkFBZSxTQUFTLFNBQVEsTUFBUTtBQUN2QyxpQ0FBbUI7QUFnQm5CLDhCQUFlLGVBQWUsWUFBWTtBQUUxQyxrQkFBSSxDQUFDLDhCQUE4QixVQUFTLGVBQWM7QUFjeEQsZ0NBQWUsUUFBUSxTQUFRO0FBQy9CLHVCQUFPLDZCQUE2QixVQUFTLGlCQUFnQjtBQUFBLHlCQUNuRCxVQUFRLFFBQVEsa0NBQWtDLFNBQVM7QUFHckUsbUNBQW1CO0FBQUE7QUFBQTtBQUFBO0FBS3pCLGlCQUFPLHdCQUF3QixVQUFTLGlCQUFnQixXQUFXLFdBQVc7QUFBQTtBQUdoRiwwQ0FBa0MsVUFBUyxpQkFBZ0IsY0FBYTtBQUN0RSxjQUFJLFlBQVksZ0JBQWU7QUFDL0IsY0FBSSxlQUFlLFVBQVU7QUFDN0IsY0FBSSxZQUFZLGFBQVksT0FBTyxTQUFRLGdCQUFnQjtBQUUzRCxjQUFJLFVBQVUsU0FBUyxZQUFZLG9CQUFxQjtBQUV0RCxnQkFBSyxpQkFBZSxPQUFPLG9CQUFvQixRQUFRO0FBR3JELGtCQUFJLFlBQVk7QUFBQSxnQkFDZCxXQUFXO0FBQUEsZ0JBQ1gsV0FBVztBQUFBLGdCQUNYLGFBQWE7QUFBQTtBQUVmLDhCQUFlLGdCQUFnQjtBQUUvQiw4QkFBZ0IsaUJBQWdCO0FBQUEsdUJBQ3ZCLENBQUMsaUJBQWlCLGNBQWEsZ0JBQWdCO0FBQ3hELGtCQUFJLG1CQUFtQjtBQUd2QixrQkFBSTtBQUVKLGtCQUFJLGNBQWMsTUFBTTtBQUN0QixvQkFBSSxnQkFBZ0IsVUFBVTtBQUM5QixnQ0FBZ0IsV0FBVyxlQUFlO0FBQUEscUJBQ3JDO0FBQ0wsZ0NBQWdCO0FBQUE7QUFJbEIsOEJBQWUsUUFBUSxnQkFBZSxhQUFhLFlBQVk7QUFDL0Qsa0JBQUksYUFBYTtBQUFBLGdCQUNmLFdBQVc7QUFBQSxnQkFDWCxXQUFXO0FBQUEsZ0JBQ1gsYUFBYTtBQUFBO0FBRWYsOEJBQWUsZ0JBQWdCO0FBQy9CLDhCQUFlLGNBQWM7QUFJN0IsOEJBQWdCLGlCQUFnQjtBQUVoQyxxQkFBTztBQUFBLG1CQUNGO0FBSUwsa0JBQUksY0FBYztBQUFBLGdCQUNoQixXQUFXO0FBQUEsZ0JBQ1gsV0FBVztBQUFBLGdCQUNYLGFBQWE7QUFBQTtBQUVmLDhCQUFlLGdCQUFnQjtBQUUvQixrQkFBSSxzQkFBcUIsY0FBYyxPQUFPLFVBQVUsWUFBWTtBQUVwRSw4QkFBZ0IsaUJBQWdCO0FBQUE7QUFBQSxpQkFFN0I7QUFFTCxnQkFBSTtBQUVKLGdCQUFJLGNBQWMsTUFBTTtBQUV0QixvQ0FBc0IsV0FBVyxVQUFVLFdBQVc7QUFFdEQsOEJBQWUsZ0JBQWdCO0FBQUEsbUJBQzFCO0FBSUwsb0NBQXNCO0FBQUE7QUFHeEIsNEJBQWdCLGlCQUFnQjtBQUFBO0FBR2xDO0FBQ0UsOEJBQWtCLFVBQVMsaUJBQWdCLGNBQWM7QUFDekQsbUJBQU8sZ0JBQWU7QUFBQTtBQUFBO0FBSTFCLGdDQUF3QixVQUFTLGlCQUFnQixjQUFhO0FBQzVELGNBQUksZUFBZSxnQkFBZTtBQUNsQyw0QkFBa0IsVUFBUyxpQkFBZ0IsY0FBYztBQUN6RCxpQkFBTyxnQkFBZTtBQUFBO0FBR3hCLDRCQUFvQixVQUFTLGlCQUFnQixjQUFhO0FBQ3hELGNBQUksZUFBZSxnQkFBZSxhQUFhO0FBQy9DLDRCQUFrQixVQUFTLGlCQUFnQixjQUFjO0FBQ3pELGlCQUFPLGdCQUFlO0FBQUE7QUFHeEIsZ0NBQXdCLFVBQVMsaUJBQWdCLGNBQWE7QUFDNUQ7QUFDRSw0QkFBZSxTQUFTO0FBRXhCO0FBR0Usa0JBQUksWUFBWSxnQkFBZTtBQUMvQix3QkFBVSxpQkFBaUI7QUFDM0Isd0JBQVUsd0JBQXdCO0FBQUE7QUFBQTtBQUl0QyxjQUFJLFlBQVksZ0JBQWU7QUFDL0IsY0FBSSxlQUFlLFVBQVU7QUFDN0IsNEJBQWtCLFVBQVMsaUJBQWdCLGNBQWM7QUFDekQsaUJBQU8sZ0JBQWU7QUFBQTtBQUd4QiwyQkFBbUIsVUFBUyxpQkFBZ0I7QUFDMUMsY0FBSSxNQUFNLGdCQUFlO0FBRXpCLGNBQUksYUFBWSxRQUFRLFFBQVEsUUFBUSxhQUFZLFFBQVEsU0FBUSxRQUFRLEtBQUs7QUFFL0UsNEJBQWUsU0FBUztBQUV4QjtBQUNFLDhCQUFlLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFLOUIseUNBQWlDLFVBQVMsaUJBQWdCLFdBQVcsV0FBVyxjQUFhO0FBQzNGO0FBQ0UsZ0JBQUksZ0JBQWUsU0FBUyxnQkFBZSxhQUFhO0FBR3RELGtCQUFJLGlCQUFpQixVQUFVO0FBRS9CLGtCQUFJLGdCQUFnQjtBQUNsQiwrQkFBZSxnQkFBZ0IsV0FDL0IsUUFBUSx5QkFBeUI7QUFBQTtBQUFBO0FBQUE7QUFLdkMsY0FBSTtBQUVKO0FBQ0UsZ0JBQUksa0JBQWtCLG1CQUFtQixpQkFBZ0IsV0FBVztBQUNwRSxzQkFBVSxpQkFBaUIsaUJBQWdCO0FBQUE7QUFHN0MsY0FBSTtBQUNKLGNBQUk7QUFDSiwrQkFBcUIsaUJBQWdCO0FBRXJDO0FBQ0UsdUNBQTJCO0FBQUE7QUFHN0I7QUFDRSxnQ0FBb0IsVUFBVTtBQUM5QiwyQkFBZTtBQUNmLDJCQUFlLGdCQUFnQixVQUFTLGlCQUFnQixXQUFXLFdBQVcsU0FBUztBQUN2RixvQkFBUTtBQUVSLGdCQUFLLGdCQUFlLE9BQU8sa0JBQWtCO0FBQzNDLHlDQUEyQjtBQUUzQixrQkFBSTtBQUNGLCtCQUFlLGdCQUFnQixVQUFTLGlCQUFnQixXQUFXLFdBQVcsU0FBUztBQUN2Rix3QkFBUTtBQUFBLHdCQUNSO0FBQ0EsMkNBQTJCO0FBQUE7QUFBQTtBQUkvQiwyQkFBZTtBQUFBO0FBR2pCO0FBQ0U7QUFBQTtBQUdGLGNBQUksYUFBWSxRQUFRLENBQUMsa0JBQWtCO0FBQ3pDLHlCQUFhLFVBQVMsaUJBQWdCO0FBQ3RDLG1CQUFPLDZCQUE2QixVQUFTLGlCQUFnQjtBQUFBO0FBRy9ELGNBQUksb0JBQW9CLE9BQU87QUFDN0IsbUNBQXVCO0FBQUE7QUFJekIsMEJBQWUsU0FBUztBQUN4Qiw0QkFBa0IsVUFBUyxpQkFBZ0IsY0FBYztBQUN6RCxpQkFBTyxnQkFBZTtBQUFBO0FBR3hCLHNDQUE4QixVQUFTLGlCQUFnQixXQUFXLFdBQVcsY0FBYTtBQUN4RjtBQUVFLG9CQUFRLFlBQVk7QUFBQSxtQkFDYixPQUNIO0FBQ0Usb0JBQUksWUFBWSxnQkFBZTtBQUMvQixvQkFBSSxPQUFPLGdCQUFlO0FBRzFCLG9CQUFJLGVBQWUsSUFBSSxLQUFLLGdCQUFlLGVBQWUsVUFBVTtBQUNwRSxvQkFBSSxRQUFRLGFBQWE7QUFFekIsMEJBQVUsUUFBUSxnQkFBZ0IsV0FBVyxPQUFPO0FBRXBEO0FBQUE7QUFBQSxtQkFHQyxNQUNIO0FBQ0UsZ0NBQWUsU0FBUztBQUN4QixnQ0FBZSxTQUFTO0FBRXhCLG9CQUFJLFVBQVUsSUFBSSxNQUFNO0FBQ3hCLG9CQUFJLE9BQU8sa0JBQWtCO0FBQzdCLGdDQUFlLFFBQVEsV0FBVyxnQkFBZSxPQUFPO0FBRXhELG9CQUFJLFNBQVMsdUJBQXVCLGlCQUFnQixvQkFBb0IsU0FBUyxrQkFBaUI7QUFDbEcsc0NBQXNCLGlCQUFnQjtBQUN0QztBQUFBO0FBQUE7QUFJTixnQkFBSSxnQkFBZSxTQUFTLGdCQUFlLGFBQWE7QUFHdEQsa0JBQUksaUJBQWlCLFVBQVU7QUFFL0Isa0JBQUksZ0JBQWdCO0FBQ2xCLCtCQUFlLGdCQUFnQixXQUMvQixRQUFRLHlCQUF5QjtBQUFBO0FBQUE7QUFBQTtBQVF2QyxjQUFJO0FBRUosY0FBSSxrQkFBa0IsWUFBWTtBQUNoQyx5QkFBYTtBQUNiLGdDQUFvQjtBQUFBLGlCQUNmO0FBQ0wseUJBQWE7QUFBQTtBQUdmLCtCQUFxQixpQkFBZ0I7QUFDckMsY0FBSSxXQUFXLGdCQUFlO0FBQzlCLGNBQUk7QUFFSixjQUFJLGFBQWEsTUFBTTtBQUNyQixnQkFBSSxhQUFZLE1BQU07QUFLcEIsdUJBQVEsWUFBWTtBQUNwQiw4QkFBZSxZQUFZO0FBRTNCLDhCQUFlLFNBQVM7QUFBQTtBQUkxQixtQ0FBdUIsaUJBQWdCLFdBQVc7QUFDbEQsK0JBQW1CLGlCQUFnQixXQUFXLFdBQVc7QUFDekQsMkJBQWU7QUFBQSxxQkFDTixhQUFZLE1BQU07QUFFM0IsMkJBQWUseUJBQXlCLGlCQUFnQixXQUFXLFdBQVc7QUFBQSxpQkFDekU7QUFDTCwyQkFBZSxvQkFBb0IsVUFBUyxpQkFBZ0IsV0FBVyxXQUFXO0FBQUE7QUFHcEYsY0FBSSxpQkFBaUIscUJBQXFCLFVBQVMsaUJBQWdCLFdBQVcsY0FBYyxZQUFZO0FBRXhHO0FBQ0UsZ0JBQUksT0FBTyxnQkFBZTtBQUUxQixnQkFBSSxnQkFBZ0IsS0FBSyxVQUFVLFdBQVc7QUFDNUMsa0JBQUksQ0FBQyw4QkFBOEI7QUFDakMsc0JBQU0sK0hBQW9JLDBCQUEwQixvQkFBbUI7QUFBQTtBQUd6TCw2Q0FBK0I7QUFBQTtBQUFBO0FBSW5DLGlCQUFPO0FBQUE7QUFHVCxzQ0FBOEIsVUFBUyxpQkFBZ0IsV0FBVyxjQUFjLFlBQVksY0FBYTtBQUV2RyxvQkFBVSxVQUFTO0FBQ25CLGNBQUksa0JBQW1CLGlCQUFlLFFBQVEsZ0JBQWdCO0FBRTlELGNBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUI7QUFFckMsZ0JBQUksWUFBWTtBQUNkLHdDQUEwQixpQkFBZ0IsV0FBVztBQUFBO0FBR3ZELG1CQUFPLDZCQUE2QixVQUFTLGlCQUFnQjtBQUFBO0FBRy9ELGNBQUksV0FBVyxnQkFBZTtBQUU5Qiw4QkFBb0IsVUFBVTtBQUM5QixjQUFJO0FBRUosY0FBSSxtQkFBbUIsT0FBTyxVQUFVLDZCQUE2QixZQUFZO0FBTS9FLDJCQUFlO0FBRWY7QUFDRTtBQUFBO0FBQUEsaUJBRUc7QUFDTDtBQUNFLHlDQUEyQjtBQUFBO0FBRzdCO0FBQ0UsNkJBQWU7QUFDZiw2QkFBZSxTQUFTO0FBRXhCLGtCQUFLLGdCQUFlLE9BQU8sa0JBQWtCO0FBQzNDLDJDQUEyQjtBQUUzQixvQkFBSTtBQUNGLDJCQUFTO0FBQUEsMEJBQ1Q7QUFDQSw2Q0FBMkI7QUFBQTtBQUFBO0FBSS9CLDZCQUFlO0FBQUE7QUFHakI7QUFDRTtBQUFBO0FBQUE7QUFLSiwwQkFBZSxTQUFTO0FBRXhCLGNBQUksYUFBWSxRQUFRLGlCQUFpQjtBQUt2Qyw0Q0FBZ0MsVUFBUyxpQkFBZ0IsY0FBYztBQUFBLGlCQUNsRTtBQUNMLDhCQUFrQixVQUFTLGlCQUFnQixjQUFjO0FBQUE7QUFLM0QsMEJBQWUsZ0JBQWdCLFNBQVM7QUFFeEMsY0FBSSxZQUFZO0FBQ2Qsc0NBQTBCLGlCQUFnQixXQUFXO0FBQUE7QUFHdkQsaUJBQU8sZ0JBQWU7QUFBQTtBQUd4QixxQ0FBNkIsaUJBQWdCO0FBQzNDLGNBQUksUUFBTyxnQkFBZTtBQUUxQixjQUFJLE1BQUssZ0JBQWdCO0FBQ3ZCLHNDQUEwQixpQkFBZ0IsTUFBSyxnQkFBZ0IsTUFBSyxtQkFBbUIsTUFBSztBQUFBLHFCQUNuRixNQUFLLFNBQVM7QUFFdkIsc0NBQTBCLGlCQUFnQixNQUFLLFNBQVM7QUFBQTtBQUcxRCw0QkFBa0IsaUJBQWdCLE1BQUs7QUFBQTtBQUd6QyxnQ0FBd0IsVUFBUyxpQkFBZ0IsY0FBYTtBQUM1RCw4QkFBb0I7QUFFcEIsY0FBSSxhQUFZLE1BQU07QUFDcEIsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsY0FBSSxZQUFZLGdCQUFlO0FBQy9CLGNBQUksWUFBWSxnQkFBZTtBQUMvQixjQUFJLGVBQWUsVUFBVTtBQUM3QiwyQkFBaUIsVUFBUztBQUMxQiw2QkFBbUIsaUJBQWdCLFdBQVcsTUFBTTtBQUNwRCxjQUFJLFlBQVksZ0JBQWU7QUFDL0IsY0FBSSxRQUFPLGdCQUFlO0FBSTFCLGNBQUksZUFBZSxVQUFVO0FBRTdCLGNBQUssVUFBVSxjQUFjO0FBSzNCLGdCQUFJLGdCQUFnQjtBQUFBLGNBQ2xCLFNBQVM7QUFBQSxjQUNULGNBQWM7QUFBQSxjQUNkLE9BQU8sVUFBVTtBQUFBLGNBQ2pCLDJCQUEyQixVQUFVO0FBQUEsY0FDckMsYUFBYSxVQUFVO0FBQUE7QUFFekIsZ0JBQUksY0FBYyxnQkFBZTtBQUdqQyx3QkFBWSxZQUFZO0FBQ3hCLDRCQUFlLGdCQUFnQjtBQUUvQixnQkFBSSxnQkFBZSxRQUFRLG1CQUFtQjtBQUc1QyxrQkFBSSxtQkFBbUIsSUFBSSxNQUFNO0FBQ2pDLHFCQUFPLDhCQUE4QixVQUFTLGlCQUFnQixjQUFjLGNBQWE7QUFBQSx1QkFDaEYsaUJBQWlCLGNBQWM7QUFDeEMsa0JBQUksb0JBQW9CLElBQUksTUFBTTtBQUVsQyxxQkFBTyw4QkFBOEIsVUFBUyxpQkFBZ0IsY0FBYyxjQUFhO0FBQUEsbUJBQ3BGO0FBRUwsa0NBQW9CO0FBRXBCLGtCQUFJLFFBQVEsaUJBQWlCLGlCQUFnQixNQUFNLGNBQWM7QUFDakUsOEJBQWUsUUFBUTtBQUN2QixrQkFBSSxPQUFPO0FBRVgscUJBQU8sTUFBTTtBQU9YLHFCQUFLLFFBQVEsS0FBSyxRQUFRLENBQUMsWUFBWTtBQUN2Qyx1QkFBTyxLQUFLO0FBQUE7QUFBQTtBQUFBLGlCQUdYO0FBR0w7QUFFQSxnQkFBSSxpQkFBaUIsY0FBYztBQUNqQyxxQkFBTyw2QkFBNkIsVUFBUyxpQkFBZ0I7QUFBQTtBQUcvRCw4QkFBa0IsVUFBUyxpQkFBZ0IsY0FBYztBQUFBO0FBRzNELGlCQUFPLGdCQUFlO0FBQUE7QUFHeEIsK0NBQXVDLFVBQVMsaUJBQWdCLGNBQWMsY0FBYSxrQkFBa0I7QUFFM0c7QUFDQSw4QkFBb0I7QUFDcEIsMEJBQWUsU0FBUztBQUN4Qiw0QkFBa0IsVUFBUyxpQkFBZ0IsY0FBYztBQUN6RCxpQkFBTyxnQkFBZTtBQUFBO0FBR3hCLHVDQUErQixVQUFTLGlCQUFnQixjQUFhO0FBQ25FLDBCQUFnQjtBQUVoQixjQUFJLGFBQVksTUFBTTtBQUNwQiw2Q0FBaUM7QUFBQTtBQUduQyxjQUFJLE9BQU8sZ0JBQWU7QUFDMUIsY0FBSSxZQUFZLGdCQUFlO0FBQy9CLGNBQUksWUFBWSxhQUFZLE9BQU8sU0FBUSxnQkFBZ0I7QUFDM0QsY0FBSSxlQUFlLFVBQVU7QUFDN0IsY0FBSSxvQkFBb0IscUJBQXFCLE1BQU07QUFFbkQsY0FBSSxtQkFBbUI7QUFLckIsMkJBQWU7QUFBQSxxQkFDTixjQUFjLFFBQVEscUJBQXFCLE1BQU0sWUFBWTtBQUd0RSw0QkFBZSxTQUFTO0FBQUE7QUFHMUIsb0JBQVUsVUFBUztBQUNuQiw0QkFBa0IsVUFBUyxpQkFBZ0IsY0FBYztBQUN6RCxpQkFBTyxnQkFBZTtBQUFBO0FBR3hCLGtDQUEwQixVQUFTLGlCQUFnQjtBQUNqRCxjQUFJLGFBQVksTUFBTTtBQUNwQiw2Q0FBaUM7QUFBQTtBQUtuQyxpQkFBTztBQUFBO0FBR1Qsb0NBQTRCLFVBQVUsaUJBQWdCLGFBQWEsY0FBYTtBQUM5RSxjQUFJLGFBQWEsTUFBTTtBQUtyQixxQkFBUyxZQUFZO0FBQ3JCLDRCQUFlLFlBQVk7QUFFM0IsNEJBQWUsU0FBUztBQUFBO0FBRzFCLGNBQUksUUFBUSxnQkFBZTtBQUMzQixjQUFJLGdCQUFnQjtBQUNwQixjQUFJLFVBQVUsY0FBYztBQUM1QixjQUFJLE9BQU8sY0FBYztBQUN6QixjQUFJLFlBQVksS0FBSztBQUVyQiwwQkFBZSxPQUFPO0FBQ3RCLGNBQUksY0FBYyxnQkFBZSxNQUFNLHdCQUF3QjtBQUMvRCxjQUFJLGdCQUFnQixvQkFBb0IsV0FBVztBQUNuRCxjQUFJO0FBRUosa0JBQVE7QUFBQSxpQkFDRCxtQkFDSDtBQUNFO0FBQ0UsK0NBQStCLGlCQUFnQjtBQUMvQyxnQ0FBZSxPQUFPLFlBQVksK0JBQStCO0FBQUE7QUFHbkUsc0JBQVEsd0JBQXdCLE1BQU0saUJBQWdCLFdBQVcsZUFBZTtBQUNoRixxQkFBTztBQUFBO0FBQUEsaUJBR04sZ0JBQ0g7QUFDRTtBQUNFLGdDQUFlLE9BQU8sWUFBWSw0QkFBNEI7QUFBQTtBQUdoRSxzQkFBUSxxQkFBcUIsTUFBTSxpQkFBZ0IsV0FBVyxlQUFlO0FBQzdFLHFCQUFPO0FBQUE7QUFBQSxpQkFHTixZQUNIO0FBQ0U7QUFDRSxnQ0FBZSxPQUFPLFlBQVksaUNBQWlDO0FBQUE7QUFHckUsc0JBQVEsaUJBQWlCLE1BQU0saUJBQWdCLFdBQVcsZUFBZTtBQUN6RSxxQkFBTztBQUFBO0FBQUEsaUJBR04sZUFDSDtBQUNFO0FBQ0Usb0JBQUksZ0JBQWUsU0FBUyxnQkFBZSxhQUFhO0FBQ3RELHNCQUFJLGlCQUFpQixVQUFVO0FBRS9CLHNCQUFJLGdCQUFnQjtBQUNsQixtQ0FBZSxnQkFBZ0IsZUFDL0IsUUFBUSx5QkFBeUI7QUFBQTtBQUFBO0FBQUE7QUFLdkMsc0JBQVEsb0JBQW9CLE1BQU0saUJBQWdCLFdBQVcsb0JBQW9CLFVBQVUsTUFBTSxnQkFDakc7QUFDQSxxQkFBTztBQUFBO0FBQUE7QUFJYixjQUFJLE9BQU87QUFFWDtBQUNFLGdCQUFJLGNBQWMsUUFBUSxPQUFPLGNBQWMsWUFBWSxVQUFVLGFBQWEsaUJBQWlCO0FBQ2pHLHFCQUFPO0FBQUE7QUFBQTtBQU9YLGdCQUFNLElBQUksTUFBTSxtRUFBbUUsWUFBWSxPQUFRLDREQUEyRDtBQUFBO0FBR3BLLCtDQUF1QyxVQUFVLGlCQUFnQixXQUFXLFdBQVcsY0FBYTtBQUNsRyxjQUFJLGFBQWEsTUFBTTtBQUtyQixxQkFBUyxZQUFZO0FBQ3JCLDRCQUFlLFlBQVk7QUFFM0IsNEJBQWUsU0FBUztBQUFBO0FBSTFCLDBCQUFlLE1BQU07QUFLckIsY0FBSTtBQUVKLGNBQUksa0JBQWtCLFlBQVk7QUFDaEMseUJBQWE7QUFDYixnQ0FBb0I7QUFBQSxpQkFDZjtBQUNMLHlCQUFhO0FBQUE7QUFHZiwrQkFBcUIsaUJBQWdCO0FBQ3JDLGlDQUF1QixpQkFBZ0IsV0FBVztBQUNsRCw2QkFBbUIsaUJBQWdCLFdBQVcsV0FBVztBQUN6RCxpQkFBTyxxQkFBcUIsTUFBTSxpQkFBZ0IsV0FBVyxNQUFNLFlBQVk7QUFBQTtBQUdqRiw2Q0FBcUMsVUFBVSxpQkFBZ0IsV0FBVyxjQUFhO0FBQ3JGLGNBQUksYUFBYSxNQUFNO0FBS3JCLHFCQUFTLFlBQVk7QUFDckIsNEJBQWUsWUFBWTtBQUUzQiw0QkFBZSxTQUFTO0FBQUE7QUFHMUIsY0FBSSxRQUFRLGdCQUFlO0FBQzNCLGNBQUk7QUFFSjtBQUNFLGdCQUFJLGtCQUFrQixtQkFBbUIsaUJBQWdCLFdBQVc7QUFDcEUsc0JBQVUsaUJBQWlCLGlCQUFnQjtBQUFBO0FBRzdDLCtCQUFxQixpQkFBZ0I7QUFDckMsY0FBSTtBQUNKLGNBQUk7QUFFSjtBQUNFLHVDQUEyQjtBQUFBO0FBRzdCO0FBQ0UsZ0JBQUksVUFBVSxhQUFhLE9BQU8sVUFBVSxVQUFVLFdBQVcsWUFBWTtBQUMzRSxrQkFBSSxnQkFBZ0IseUJBQXlCLGNBQWM7QUFFM0Qsa0JBQUksQ0FBQyxxQkFBcUIsZ0JBQWdCO0FBQ3hDLHNCQUFNLDBLQUErSyxlQUFlO0FBRXBNLHFDQUFxQixpQkFBaUI7QUFBQTtBQUFBO0FBSTFDLGdCQUFJLGdCQUFlLE9BQU8sa0JBQWtCO0FBQzFDLHNDQUF3QiwyQkFBMkIsaUJBQWdCO0FBQUE7QUFHckUsMkJBQWU7QUFDZixnQ0FBb0IsVUFBVTtBQUM5QixvQkFBUSxnQkFBZ0IsTUFBTSxpQkFBZ0IsV0FBVyxPQUFPLFNBQVM7QUFDekUsb0JBQVE7QUFDUiwyQkFBZTtBQUFBO0FBR2pCO0FBQ0U7QUFBQTtBQUlGLDBCQUFlLFNBQVM7QUFFeEI7QUFHRSxnQkFBSSxPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsT0FBTyxNQUFNLFdBQVcsY0FBYyxNQUFNLGFBQWEsUUFBVztBQUNySCxrQkFBSSxpQkFBaUIseUJBQXlCLGNBQWM7QUFFNUQsa0JBQUksQ0FBQyxtQ0FBbUMsaUJBQWlCO0FBQ3ZELHNCQUFNLGtXQUFzWCxnQkFBZ0IsZ0JBQWdCO0FBRTVaLG1EQUFtQyxrQkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFLM0QsY0FFQyxPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsT0FBTyxNQUFNLFdBQVcsY0FBYyxNQUFNLGFBQWEsUUFBVztBQUNsSDtBQUNFLGtCQUFJLGtCQUFrQix5QkFBeUIsY0FBYztBQUU3RCxrQkFBSSxDQUFDLG1DQUFtQyxrQkFBa0I7QUFDeEQsc0JBQU0sa1dBQXNYLGlCQUFpQixpQkFBaUI7QUFFOVosbURBQW1DLG1CQUFtQjtBQUFBO0FBQUE7QUFLMUQsNEJBQWUsTUFBTTtBQUVyQiw0QkFBZSxnQkFBZ0I7QUFDL0IsNEJBQWUsY0FBYztBQUk3QixnQkFBSSxhQUFhO0FBRWpCLGdCQUFJLGtCQUFrQixZQUFZO0FBQ2hDLDJCQUFhO0FBQ2Isa0NBQW9CO0FBQUEsbUJBQ2Y7QUFDTCwyQkFBYTtBQUFBO0FBR2YsNEJBQWUsZ0JBQWdCLE1BQU0sVUFBVSxRQUFRLE1BQU0sVUFBVSxTQUFZLE1BQU0sUUFBUTtBQUNqRyxrQ0FBc0I7QUFDdEIsK0JBQW1CLGlCQUFnQjtBQUNuQywrQkFBbUIsaUJBQWdCLFdBQVcsT0FBTztBQUNyRCxtQkFBTyxxQkFBcUIsTUFBTSxpQkFBZ0IsV0FBVyxNQUFNLFlBQVk7QUFBQSxpQkFDMUU7QUFFTCw0QkFBZSxNQUFNO0FBRXJCO0FBRUUsa0JBQUssZ0JBQWUsT0FBTyxrQkFBa0I7QUFDM0MsMkNBQTJCO0FBRTNCLG9CQUFJO0FBQ0YsMEJBQVEsZ0JBQWdCLE1BQU0saUJBQWdCLFdBQVcsT0FBTyxTQUFTO0FBQ3pFLDBCQUFRO0FBQUEsMEJBQ1I7QUFDQSw2Q0FBMkI7QUFBQTtBQUFBO0FBQUE7QUFLakMsZ0JBQUksb0JBQW9CLE9BQU87QUFDN0IscUNBQXVCO0FBQUE7QUFHekIsOEJBQWtCLE1BQU0saUJBQWdCLE9BQU87QUFFL0M7QUFDRSw2Q0FBK0IsaUJBQWdCO0FBQUE7QUFHakQsbUJBQU8sZ0JBQWU7QUFBQTtBQUFBO0FBSTFCLGdEQUF3QyxpQkFBZ0IsV0FBVztBQUNqRTtBQUNFLGdCQUFJLFdBQVc7QUFDYixrQkFBSSxVQUFVLG1CQUFtQjtBQUMvQixzQkFBTSx5RUFBeUUsVUFBVSxlQUFlLFVBQVUsUUFBUTtBQUFBO0FBQUE7QUFJOUgsZ0JBQUksZ0JBQWUsUUFBUSxNQUFNO0FBQy9CLGtCQUFJLE9BQU87QUFDWCxrQkFBSSxZQUFZO0FBRWhCLGtCQUFJLFdBQVc7QUFDYix3QkFBUSxxQ0FBcUMsWUFBWTtBQUFBO0FBRzNELGtCQUFJLGFBQWEsYUFBYTtBQUM5QixrQkFBSSxjQUFjLGdCQUFlO0FBRWpDLGtCQUFJLGFBQWE7QUFDZiw2QkFBYSxZQUFZLFdBQVcsTUFBTSxZQUFZO0FBQUE7QUFHeEQsa0JBQUksQ0FBQyx5QkFBeUIsYUFBYTtBQUN6Qyx5Q0FBeUIsY0FBYztBQUV2QyxzQkFBTSw4SEFBd0k7QUFBQTtBQUFBO0FBSWxKLGdCQUFJLE9BQU8sVUFBVSw2QkFBNkIsWUFBWTtBQUM1RCxrQkFBSSxrQkFBa0IseUJBQXlCLGNBQWM7QUFFN0Qsa0JBQUksQ0FBQywrQ0FBK0Msa0JBQWtCO0FBQ3BFLHNCQUFNLG9FQUFvRTtBQUUxRSwrREFBK0MsbUJBQW1CO0FBQUE7QUFBQTtBQUl0RSxnQkFBSSxPQUFPLFVBQVUsZ0JBQWdCLFlBQVksVUFBVSxnQkFBZ0IsTUFBTTtBQUMvRSxrQkFBSSxrQkFBa0IseUJBQXlCLGNBQWM7QUFFN0Qsa0JBQUksQ0FBQywyQ0FBMkMsa0JBQWtCO0FBQ2hFLHNCQUFNLHVEQUF1RDtBQUU3RCwyREFBMkMsbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNdEUsWUFBSSxtQkFBbUI7QUFBQSxVQUNyQixZQUFZO0FBQUEsVUFDWixhQUFhO0FBQUEsVUFDYixXQUFXO0FBQUE7QUFHYiw2Q0FBcUMsY0FBYTtBQUNoRCxpQkFBTztBQUFBLFlBQ0wsV0FBVztBQUFBLFlBQ1gsV0FBVztBQUFBLFlBQ1gsYUFBYTtBQUFBO0FBQUE7QUFJakIsOENBQXNDLG9CQUFvQixjQUFhO0FBQ3JFLGNBQUksWUFBWTtBQUVoQixpQkFBTztBQUFBLFlBQ0wsV0FBVyxXQUFXLG1CQUFtQixXQUFXO0FBQUEsWUFDcEQ7QUFBQSxZQUNBLGFBQWEsbUJBQW1CO0FBQUE7QUFBQTtBQUtwQyx3Q0FBZ0MsaUJBQWlCLFVBQVMsaUJBQWdCLGNBQWE7QUFJckYsY0FBSSxhQUFZLE1BQU07QUFDcEIsZ0JBQUksZ0JBQWdCLFNBQVE7QUFFNUIsZ0JBQUksa0JBQWtCLE1BQU07QUFLMUIscUJBQU87QUFBQTtBQUFBO0FBS1gsaUJBQU8sbUJBQW1CLGlCQUFpQjtBQUFBO0FBRzdDLCtDQUF1QyxVQUFTLGNBQWE7QUFFM0QsaUJBQU8sWUFBWSxTQUFRLFlBQVk7QUFBQTtBQUd6Qyx5Q0FBaUMsVUFBUyxpQkFBZ0IsY0FBYTtBQUNyRSxjQUFJLFlBQVksZ0JBQWU7QUFFL0I7QUFDRSxnQkFBSSxjQUFjLGtCQUFpQjtBQUNqQyw4QkFBZSxTQUFTO0FBQUE7QUFBQTtBQUk1QixjQUFJLGtCQUFrQixvQkFBb0I7QUFDMUMsY0FBSSxlQUFlO0FBQ25CLGNBQUksYUFBYyxpQkFBZSxRQUFRLGdCQUFnQjtBQUV6RCxjQUFJLGNBQWMsdUJBQXVCLGlCQUFpQixXQUFVO0FBR2xFLDJCQUFlO0FBQ2YsNEJBQWUsU0FBUyxDQUFDO0FBQUEsaUJBQ3BCO0FBRUwsZ0JBQUksYUFBWSxRQUFRLFNBQVEsa0JBQWtCLE1BQU07QUFLdEQ7QUFDRSxrQ0FBa0IsMEJBQTBCLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUtuRSw0QkFBa0IsaUNBQWlDO0FBQ25ELDhCQUFvQixpQkFBZ0I7QUF1QnBDLGNBQUksYUFBWSxNQUFNO0FBR3BCLDZDQUFpQztBQUVqQyxnQkFBSSxnQkFBZ0IsZ0JBQWU7QUFFbkMsZ0JBQUksa0JBQWtCLE1BQU07QUFDMUIsa0JBQUksYUFBYSxjQUFjO0FBRS9CLGtCQUFJLGVBQWUsTUFBTTtBQUN2Qix1QkFBTyxpQ0FBaUMsaUJBQWdCO0FBQUE7QUFBQTtBQUk1RCxnQkFBSSxzQkFBc0IsVUFBVTtBQUNwQyxnQkFBSSx1QkFBdUIsVUFBVTtBQUVyQyxnQkFBSSxjQUFjO0FBQ2hCLGtCQUFJLG1CQUFtQiw4QkFBOEIsaUJBQWdCLHFCQUFxQixzQkFBc0I7QUFDaEgsa0JBQUksdUJBQXVCLGdCQUFlO0FBQzFDLG1DQUFxQixnQkFBZ0IsNEJBQTRCO0FBQ2pFLDhCQUFlLGdCQUFnQjtBQUUvQixxQkFBTztBQUFBLG1CQUNGO0FBQ0wscUJBQU8sNkJBQTZCLGlCQUFnQjtBQUFBO0FBQUEsaUJBRWpEO0FBSUwsZ0JBQUksWUFBWSxTQUFRO0FBRXhCLGdCQUFJLGNBQWMsTUFBTTtBQUd0QixrQkFBSSxjQUFjLFVBQVU7QUFFNUIsa0JBQUksZ0JBQWdCLE1BQU07QUFDeEIsb0JBQUksQ0FBQyxZQUFZO0FBQ2YseUJBQU8sa0NBQWtDLFVBQVMsaUJBQWdCLGFBQWEsV0FBVztBQUFBLDJCQUNqRixnQkFBZSxRQUFRLG1CQUFtQjtBQUVuRCxrQ0FBZSxTQUFTLENBQUM7QUFDekIseUJBQU8sdUNBQXVDLFVBQVMsaUJBQWdCLGNBQWEsSUFBSSxNQUFNO0FBQUEsMkJBQ3JGLGdCQUFlLGtCQUFrQixNQUFNO0FBR2hELGtDQUFlLFFBQVEsU0FBUTtBQUcvQixrQ0FBZSxTQUFTO0FBQ3hCLHlCQUFPO0FBQUEsdUJBQ0Y7QUFHTCxzQkFBSSx1QkFBdUIsVUFBVTtBQUNyQyxzQkFBSSx3QkFBd0IsVUFBVTtBQUN0QyxzQkFBSSx3QkFBd0IsZ0RBQWdELFVBQVMsaUJBQWdCLHNCQUFzQix1QkFBdUI7QUFDbEosc0JBQUkseUJBQXlCLGdCQUFlO0FBQzVDLHlDQUF1QixnQkFBZ0IsNEJBQTRCO0FBQ25FLGtDQUFlLGdCQUFnQjtBQUMvQix5QkFBTztBQUFBO0FBQUE7QUFJWCxrQkFBSSxjQUFjO0FBQ2hCLG9CQUFJLHlCQUF5QixVQUFVO0FBQ3ZDLG9CQUFJLHdCQUF3QixVQUFVO0FBRXRDLG9CQUFJLHlCQUF5QiwrQkFBK0IsVUFBUyxpQkFBZ0IsdUJBQXVCLHdCQUF3QjtBQUVwSSxvQkFBSSx5QkFBeUIsZ0JBQWU7QUFDNUMsb0JBQUkscUJBQXFCLFNBQVEsTUFBTTtBQUN2Qyx1Q0FBdUIsZ0JBQWdCLHVCQUF1QixPQUFPLDRCQUE0QixnQkFBZSw2QkFBNkIsb0JBQW9CO0FBRWpLLHVDQUF1QixhQUFhLDhCQUE4QixVQUFTO0FBQzNFLGdDQUFlLGdCQUFnQjtBQUMvQix1QkFBTztBQUFBLHFCQUNGO0FBQ0wsb0JBQUksd0JBQXdCLFVBQVU7QUFFdEMsb0JBQUkseUJBQXlCLDhCQUE4QixVQUFTLGlCQUFnQix1QkFBdUI7QUFFM0csZ0NBQWUsZ0JBQWdCO0FBQy9CLHVCQUFPO0FBQUE7QUFBQSxtQkFFSjtBQUVMLGtCQUFJLGNBQWM7QUFFaEIsb0JBQUkseUJBQXlCLFVBQVU7QUFDdkMsb0JBQUksd0JBQXdCLFVBQVU7QUFFdEMsb0JBQUksMEJBQTBCLCtCQUErQixVQUFTLGlCQUFnQix1QkFBdUIsd0JBQXdCO0FBRXJJLG9CQUFJLHlCQUF5QixnQkFBZTtBQUM1QyxvQkFBSSxzQkFBc0IsU0FBUSxNQUFNO0FBQ3hDLHVDQUF1QixnQkFBZ0Isd0JBQXdCLE9BQU8sNEJBQTRCLGdCQUFlLDZCQUE2QixxQkFBcUI7QUFDbkssdUNBQXVCLGFBQWEsOEJBQThCLFVBQVM7QUFJM0UsZ0NBQWUsZ0JBQWdCO0FBQy9CLHVCQUFPO0FBQUEscUJBQ0Y7QUFHTCxvQkFBSSx3QkFBd0IsVUFBVTtBQUV0QyxvQkFBSSx5QkFBeUIsOEJBQThCLFVBQVMsaUJBQWdCLHVCQUF1QjtBQUUzRyxnQ0FBZSxnQkFBZ0I7QUFDL0IsdUJBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1mLDhDQUFzQyxpQkFBZ0IsaUJBQWlCLGNBQWE7QUFDbEYsY0FBSSxPQUFPLGdCQUFlO0FBQzFCLGNBQUksb0JBQW9CO0FBQUEsWUFDdEIsTUFBTTtBQUFBLFlBQ04sVUFBVTtBQUFBO0FBRVosY0FBSSx1QkFBdUIsa0NBQWtDLG1CQUFtQjtBQUNoRiwrQkFBcUIsU0FBUztBQUM5QiwwQkFBZSxRQUFRO0FBQ3ZCLGlCQUFPO0FBQUE7QUFHVCwrQ0FBdUMsaUJBQWdCLGlCQUFpQixrQkFBa0IsY0FBYTtBQUNyRyxjQUFJLE9BQU8sZ0JBQWU7QUFDMUIsY0FBSSw0QkFBNEIsZ0JBQWU7QUFDL0MsY0FBSSxvQkFBb0I7QUFBQSxZQUN0QixNQUFNO0FBQUEsWUFDTixVQUFVO0FBQUE7QUFFWixjQUFJO0FBQ0osY0FBSTtBQUVKLGNBQUssUUFBTyxvQkFBb0IsVUFBVSw4QkFBOEIsTUFBTTtBQUc1RSxtQ0FBdUI7QUFDdkIsaUNBQXFCLGFBQWE7QUFDbEMsaUNBQXFCLGVBQWU7QUFFcEMsZ0JBQUssZ0JBQWUsT0FBTyxhQUFhO0FBS3RDLG1DQUFxQixpQkFBaUI7QUFDdEMsbUNBQXFCLGtCQUFrQjtBQUN2QyxtQ0FBcUIsbUJBQW1CO0FBQ3hDLG1DQUFxQixtQkFBbUI7QUFBQTtBQUcxQyxvQ0FBd0Isd0JBQXdCLGtCQUFrQixNQUFNLGNBQWE7QUFBQSxpQkFDaEY7QUFDTCxtQ0FBdUIsa0NBQWtDLG1CQUFtQjtBQUM1RSxvQ0FBd0Isd0JBQXdCLGtCQUFrQixNQUFNLGNBQWE7QUFBQTtBQUd2RiwrQkFBcUIsU0FBUztBQUM5QixnQ0FBc0IsU0FBUztBQUMvQiwrQkFBcUIsVUFBVTtBQUMvQiwwQkFBZSxRQUFRO0FBQ3ZCLGlCQUFPO0FBQUE7QUFHVCxtREFBMkMsZ0JBQWdCLE1BQU0sY0FBYTtBQUc1RSxpQkFBTyx5QkFBeUIsZ0JBQWdCLE1BQU0sU0FBUztBQUFBO0FBR2pFLG9EQUE0QyxVQUFTLGdCQUFnQjtBQUduRSxpQkFBTyxxQkFBcUIsVUFBUztBQUFBO0FBR3ZDLCtDQUF1QyxVQUFTLGlCQUFnQixpQkFBaUIsY0FBYTtBQUM1RixjQUFJLDhCQUE4QixTQUFRO0FBQzFDLGNBQUksK0JBQStCLDRCQUE0QjtBQUMvRCxjQUFJLHVCQUF1QixtQ0FBbUMsNkJBQTZCO0FBQUEsWUFDekYsTUFBTTtBQUFBLFlBQ04sVUFBVTtBQUFBO0FBR1osY0FBSyxpQkFBZSxPQUFPLG9CQUFvQixRQUFRO0FBQ3JELGlDQUFxQixRQUFRO0FBQUE7QUFHL0IsK0JBQXFCLFNBQVM7QUFDOUIsK0JBQXFCLFVBQVU7QUFFL0IsY0FBSSxpQ0FBaUMsTUFBTTtBQUV6QyxnQkFBSSxZQUFZLGdCQUFlO0FBRS9CLGdCQUFJLGNBQWMsTUFBTTtBQUN0Qiw4QkFBZSxZQUFZLENBQUM7QUFDNUIsOEJBQWUsU0FBUztBQUFBLG1CQUNuQjtBQUNMLHdCQUFVLEtBQUs7QUFBQTtBQUFBO0FBSW5CLDBCQUFlLFFBQVE7QUFDdkIsaUJBQU87QUFBQTtBQUdULGdEQUF3QyxVQUFTLGlCQUFnQixpQkFBaUIsa0JBQWtCLGNBQWE7QUFDL0csY0FBSSxPQUFPLGdCQUFlO0FBQzFCLGNBQUksOEJBQThCLFNBQVE7QUFDMUMsY0FBSSwrQkFBK0IsNEJBQTRCO0FBQy9ELGNBQUksb0JBQW9CO0FBQUEsWUFDdEIsTUFBTTtBQUFBLFlBQ04sVUFBVTtBQUFBO0FBRVosY0FBSTtBQUVKLGNBRUMsUUFBTyxvQkFBb0IsVUFNNUIsZ0JBQWUsVUFBVSw2QkFBNkI7QUFDcEQsZ0JBQUksNEJBQTRCLGdCQUFlO0FBQy9DLG1DQUF1QjtBQUN2QixpQ0FBcUIsYUFBYTtBQUNsQyxpQ0FBcUIsZUFBZTtBQUVwQyxnQkFBSyxnQkFBZSxPQUFPLGFBQWE7QUFLdEMsbUNBQXFCLGlCQUFpQjtBQUN0QyxtQ0FBcUIsa0JBQWtCO0FBQ3ZDLG1DQUFxQixtQkFBbUIsNEJBQTRCO0FBQ3BFLG1DQUFxQixtQkFBbUIsNEJBQTRCO0FBQUE7QUFNdEUsNEJBQWUsWUFBWTtBQUFBLGlCQUN0QjtBQUNMLG1DQUF1QixtQ0FBbUMsNkJBQTZCO0FBS3ZGLGlDQUFxQixlQUFlLDRCQUE0QixlQUFlO0FBQUE7QUFHakYsY0FBSTtBQUVKLGNBQUksaUNBQWlDLE1BQU07QUFDekMsb0NBQXdCLHFCQUFxQiw4QkFBOEI7QUFBQSxpQkFDdEU7QUFDTCxvQ0FBd0Isd0JBQXdCLGtCQUFrQixNQUFNLGNBQWE7QUFHckYsa0NBQXNCLFNBQVM7QUFBQTtBQUdqQyxnQ0FBc0IsU0FBUztBQUMvQiwrQkFBcUIsU0FBUztBQUM5QiwrQkFBcUIsVUFBVTtBQUMvQiwwQkFBZSxRQUFRO0FBQ3ZCLGlCQUFPO0FBQUE7QUFHVCx3REFBZ0QsVUFBUyxpQkFBZ0IsY0FBYSxrQkFBa0I7QUFRdEcsY0FBSSxxQkFBcUIsTUFBTTtBQUM3QixnQ0FBb0I7QUFBQTtBQUl0QiwrQkFBcUIsaUJBQWdCLFNBQVEsT0FBTyxNQUFNO0FBRTFELGNBQUksWUFBWSxnQkFBZTtBQUMvQixjQUFJLGtCQUFrQixVQUFVO0FBQ2hDLGNBQUksdUJBQXVCLDZCQUE2QixpQkFBZ0I7QUFHeEUsK0JBQXFCLFNBQVM7QUFDOUIsMEJBQWUsZ0JBQWdCO0FBQy9CLGlCQUFPO0FBQUE7QUFHVCxpRUFBeUQsVUFBUyxpQkFBZ0IsaUJBQWlCLGtCQUFrQixjQUFhO0FBQ2hJLGNBQUksWUFBWSxnQkFBZTtBQUMvQixjQUFJLG9CQUFvQjtBQUFBLFlBQ3RCLE1BQU07QUFBQSxZQUNOLFVBQVU7QUFBQTtBQUVaLGNBQUksdUJBQXVCLGtDQUFrQyxtQkFBbUI7QUFDaEYsY0FBSSx3QkFBd0Isd0JBQXdCLGtCQUFrQixXQUFXLGNBQWE7QUFHOUYsZ0NBQXNCLFNBQVM7QUFDL0IsK0JBQXFCLFNBQVM7QUFDOUIsZ0NBQXNCLFNBQVM7QUFDL0IsK0JBQXFCLFVBQVU7QUFDL0IsMEJBQWUsUUFBUTtBQUV2QixjQUFLLGlCQUFlLE9BQU8sb0JBQW9CLFFBQVE7QUFHckQsaUNBQXFCLGlCQUFnQixTQUFRLE9BQU8sTUFBTTtBQUFBO0FBRzVELGlCQUFPO0FBQUE7QUFHVCxrREFBMEMsaUJBQWdCLGtCQUFrQixjQUFhO0FBR3ZGLGNBQUssaUJBQWUsT0FBTyxvQkFBb0IsUUFBUTtBQUNyRDtBQUNFLG9CQUFNO0FBQUE7QUFHUiw0QkFBZSxRQUFRLFlBQVk7QUFBQSxxQkFDMUIsMkJBQTJCLG1CQUFtQjtBQVl2RCw0QkFBZSxRQUFRLFlBQVk7QUFBQSxpQkFDOUI7QUFHTCw0QkFBZSxRQUFRLFlBQVk7QUFBQTtBQUdyQyxpQkFBTztBQUFBO0FBR1QsbURBQTJDLFVBQVMsaUJBQWdCLGtCQUFrQixlQUFlLGNBQWE7QUFHaEg7QUFFQSxjQUFLLGlCQUFlLE9BQU8sb0JBQW9CLFFBQVE7QUFDckQsbUJBQU8sdUNBQXVDLFVBQVMsaUJBQWdCLGNBR3ZFO0FBQUE7QUFHRixjQUFJLDJCQUEyQixtQkFBbUI7QUFJaEQsbUJBQU8sdUNBQXVDLFVBQVMsaUJBQWdCLGNBR3ZFLElBQUksTUFBTTtBQUFBO0FBS1osY0FBSSxxQkFBb0IsaUJBQWlCLGNBQWEsU0FBUTtBQUU5RCxjQUFJLG9CQUFvQixvQkFBbUI7QUFHekMsZ0JBQUksUUFBTztBQUVYLGdCQUFJLFVBQVMsTUFBTTtBQUNqQixrQkFBSSx5QkFBeUIsMEJBQTBCLE9BQU07QUFFN0Qsa0JBQUksMkJBQTJCLFVBQVUsMkJBQTJCLGNBQWMsV0FBVztBQUkzRiw4QkFBYyxZQUFZO0FBRTFCLG9CQUFJLFlBQVk7QUFDaEIsc0NBQXNCLFVBQVMsd0JBQXdCO0FBQUE7QUFBQTtBQVMzRDtBQUNBLG1CQUFPLHVDQUF1QyxVQUFTLGlCQUFnQixjQUFhLElBQUksTUFBTTtBQUFBLHFCQUNyRiwwQkFBMEIsbUJBQW1CO0FBVXRELDRCQUFlLFNBQVM7QUFFeEIsNEJBQWUsUUFBUSxTQUFRO0FBRS9CLGdCQUFJLFFBQVEsZ0NBQWdDLEtBQUssTUFBTTtBQUN2RCwwQ0FBOEIsa0JBQWtCO0FBQ2hELG1CQUFPO0FBQUEsaUJBQ0Y7QUFFTCxnRUFBb0QsaUJBQWdCLGtCQUFrQixjQUFjO0FBQ3BHLGdCQUFJLFlBQVksZ0JBQWU7QUFDL0IsZ0JBQUksa0JBQWtCLFVBQVU7QUFDaEMsZ0JBQUksdUJBQXVCLDZCQUE2QixpQkFBZ0I7QUFPeEUsaUNBQXFCLFNBQVM7QUFDOUIsbUJBQU87QUFBQTtBQUFBO0FBSVgsNkNBQXFDLE9BQU8sY0FBYSxpQkFBaUI7QUFDeEUsZ0JBQU0sUUFBUSxXQUFXLE1BQU0sT0FBTztBQUN0QyxjQUFJLFlBQVksTUFBTTtBQUV0QixjQUFJLGNBQWMsTUFBTTtBQUN0QixzQkFBVSxRQUFRLFdBQVcsVUFBVSxPQUFPO0FBQUE7QUFHaEQsMENBQWdDLE1BQU0sUUFBUSxjQUFhO0FBQUE7QUFHN0QsZ0RBQXdDLGlCQUFnQixZQUFZLGNBQWE7QUFJL0UsY0FBSSxPQUFPO0FBRVgsaUJBQU8sU0FBUyxNQUFNO0FBQ3BCLGdCQUFJLEtBQUssUUFBUSxtQkFBbUI7QUFDbEMsa0JBQUksUUFBUSxLQUFLO0FBRWpCLGtCQUFJLFVBQVUsTUFBTTtBQUNsQiw0Q0FBNEIsTUFBTSxjQUFhO0FBQUE7QUFBQSx1QkFFeEMsS0FBSyxRQUFRLHVCQUF1QjtBQU03QywwQ0FBNEIsTUFBTSxjQUFhO0FBQUEsdUJBQ3RDLEtBQUssVUFBVSxNQUFNO0FBQzlCLG1CQUFLLE1BQU0sU0FBUztBQUNwQixxQkFBTyxLQUFLO0FBQ1o7QUFBQTtBQUdGLGdCQUFJLFNBQVMsaUJBQWdCO0FBQzNCO0FBQUE7QUFHRixtQkFBTyxLQUFLLFlBQVksTUFBTTtBQUM1QixrQkFBSSxLQUFLLFdBQVcsUUFBUSxLQUFLLFdBQVcsaUJBQWdCO0FBQzFEO0FBQUE7QUFHRixxQkFBTyxLQUFLO0FBQUE7QUFHZCxpQkFBSyxRQUFRLFNBQVMsS0FBSztBQUMzQixtQkFBTyxLQUFLO0FBQUE7QUFBQTtBQUloQixvQ0FBNEIsWUFBWTtBQVF0QyxjQUFJLE1BQU07QUFDVixjQUFJLGlCQUFpQjtBQUVyQixpQkFBTyxRQUFRLE1BQU07QUFDbkIsZ0JBQUksYUFBYSxJQUFJO0FBRXJCLGdCQUFJLGVBQWUsUUFBUSxtQkFBbUIsZ0JBQWdCLE1BQU07QUFDbEUsK0JBQWlCO0FBQUE7QUFHbkIsa0JBQU0sSUFBSTtBQUFBO0FBR1osaUJBQU87QUFBQTtBQUdULHFDQUE2QixhQUFhO0FBQ3hDO0FBQ0UsZ0JBQUksZ0JBQWdCLFVBQWEsZ0JBQWdCLGNBQWMsZ0JBQWdCLGVBQWUsZ0JBQWdCLGNBQWMsQ0FBQyx3QkFBd0IsY0FBYztBQUNqSyxzQ0FBd0IsZUFBZTtBQUV2QyxrQkFBSSxPQUFPLGdCQUFnQixVQUFVO0FBQ25DLHdCQUFRLFlBQVk7QUFBQSx1QkFDYjtBQUFBLHVCQUNBO0FBQUEsdUJBQ0EsYUFDSDtBQUNFLDBCQUFNLDhGQUFtRyxhQUFhLFlBQVk7QUFFbEk7QUFBQTtBQUFBLHVCQUdDO0FBQUEsdUJBQ0EsWUFDSDtBQUNFLDBCQUFNLCtIQUFvSSxhQUFhLFlBQVk7QUFFbks7QUFBQTtBQUFBO0FBSUYsMEJBQU0sZ0hBQXFIO0FBRTNIO0FBQUE7QUFBQSxxQkFFQztBQUNMLHNCQUFNLHdIQUE2SDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTTNJLHFDQUE2QixVQUFVLGFBQWE7QUFDbEQ7QUFDRSxnQkFBSSxhQUFhLFVBQWEsQ0FBQyx3QkFBd0IsV0FBVztBQUNoRSxrQkFBSSxhQUFhLGVBQWUsYUFBYSxVQUFVO0FBQ3JELHdDQUF3QixZQUFZO0FBRXBDLHNCQUFNLHFHQUEwRztBQUFBLHlCQUN2RyxnQkFBZ0IsY0FBYyxnQkFBZ0IsYUFBYTtBQUNwRSx3Q0FBd0IsWUFBWTtBQUVwQyxzQkFBTSx5SUFBbUo7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1qSyxpREFBeUMsV0FBVyxRQUFPO0FBQ3pEO0FBQ0UsZ0JBQUksWUFBWSxRQUFRO0FBQ3hCLGdCQUFJLGFBQWEsQ0FBQyxhQUFhLE9BQU8sY0FBYyxlQUFlO0FBRW5FLGdCQUFJLGFBQWEsWUFBWTtBQUMzQixrQkFBSSxPQUFPLFlBQVksVUFBVTtBQUVqQyxvQkFBTSx1T0FBMlAsTUFBTSxRQUFPO0FBRTlRLHFCQUFPO0FBQUE7QUFBQTtBQUlYLGlCQUFPO0FBQUE7QUFHVCw4Q0FBc0MsVUFBVSxhQUFhO0FBQzNEO0FBQ0UsZ0JBQUssaUJBQWdCLGNBQWMsZ0JBQWdCLGdCQUFnQixhQUFhLFVBQWEsYUFBYSxRQUFRLGFBQWEsT0FBTztBQUNwSSxrQkFBSSxRQUFRLFdBQVc7QUFDckIseUJBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7QUFDeEMsc0JBQUksQ0FBQyxnQ0FBZ0MsU0FBUyxJQUFJLElBQUk7QUFDcEQ7QUFBQTtBQUFBO0FBQUEscUJBR0M7QUFDTCxvQkFBSSxhQUFhLGNBQWM7QUFFL0Isb0JBQUksT0FBTyxlQUFlLFlBQVk7QUFDcEMsc0JBQUksbUJBQW1CLFdBQVcsS0FBSztBQUV2QyxzQkFBSSxrQkFBa0I7QUFDcEIsd0JBQUksT0FBTyxpQkFBaUI7QUFDNUIsd0JBQUksS0FBSztBQUVULDJCQUFPLENBQUMsS0FBSyxNQUFNLE9BQU8saUJBQWlCLFFBQVE7QUFDakQsMEJBQUksQ0FBQyxnQ0FBZ0MsS0FBSyxPQUFPLEtBQUs7QUFDcEQ7QUFBQTtBQUdGO0FBQUE7QUFBQTtBQUFBLHVCQUdDO0FBQ0wsd0JBQU0sd0tBQWtMO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9sTSw2Q0FBcUMsaUJBQWdCLGFBQWEsTUFBTSxnQkFBZ0IsVUFBVTtBQUNoRyxjQUFJLGNBQWMsZ0JBQWU7QUFFakMsY0FBSSxnQkFBZ0IsTUFBTTtBQUN4Qiw0QkFBZSxnQkFBZ0I7QUFBQSxjQUM3QjtBQUFBLGNBQ0EsV0FBVztBQUFBLGNBQ1gsb0JBQW9CO0FBQUEsY0FDcEIsTUFBTTtBQUFBLGNBQ047QUFBQSxjQUNBO0FBQUE7QUFBQSxpQkFFRztBQUVMLHdCQUFZLGNBQWM7QUFDMUIsd0JBQVksWUFBWTtBQUN4Qix3QkFBWSxxQkFBcUI7QUFDakMsd0JBQVksT0FBTztBQUNuQix3QkFBWSxPQUFPO0FBQ25CLHdCQUFZLFdBQVc7QUFBQTtBQUFBO0FBVzNCLDZDQUFxQyxVQUFTLGlCQUFnQixjQUFhO0FBQ3pFLGNBQUksWUFBWSxnQkFBZTtBQUMvQixjQUFJLGNBQWMsVUFBVTtBQUM1QixjQUFJLFdBQVcsVUFBVTtBQUN6QixjQUFJLGNBQWMsVUFBVTtBQUM1Qiw4QkFBb0I7QUFDcEIsOEJBQW9CLFVBQVU7QUFDOUIsdUNBQTZCLGFBQWE7QUFDMUMsNEJBQWtCLFVBQVMsaUJBQWdCLGFBQWE7QUFDeEQsY0FBSSxrQkFBa0Isb0JBQW9CO0FBQzFDLGNBQUksc0JBQXNCLG1CQUFtQixpQkFBaUI7QUFFOUQsY0FBSSxxQkFBcUI7QUFDdkIsOEJBQWtCLDBCQUEwQixpQkFBaUI7QUFDN0QsNEJBQWUsU0FBUztBQUFBLGlCQUNuQjtBQUNMLGdCQUFJLG1CQUFtQixhQUFZLFFBQVMsVUFBUSxRQUFRLGdCQUFnQjtBQUU1RSxnQkFBSSxrQkFBa0I7QUFJcEIsNkNBQStCLGlCQUFnQixnQkFBZSxPQUFPO0FBQUE7QUFHdkUsOEJBQWtCLGlDQUFpQztBQUFBO0FBR3JELDhCQUFvQixpQkFBZ0I7QUFFcEMsY0FBSyxpQkFBZSxPQUFPLG9CQUFvQixRQUFRO0FBR3JELDRCQUFlLGdCQUFnQjtBQUFBLGlCQUMxQjtBQUNMLG9CQUFRO0FBQUEsbUJBQ0QsWUFDSDtBQUNFLG9CQUFJLGlCQUFpQixtQkFBbUIsZ0JBQWU7QUFDdkQsb0JBQUk7QUFFSixvQkFBSSxtQkFBbUIsTUFBTTtBQUczQix5QkFBTyxnQkFBZTtBQUN0QixrQ0FBZSxRQUFRO0FBQUEsdUJBQ2xCO0FBR0wseUJBQU8sZUFBZTtBQUN0QixpQ0FBZSxVQUFVO0FBQUE7QUFHM0IsNENBQTRCLGlCQUFnQixPQUM1QyxNQUFNLGdCQUFnQjtBQUN0QjtBQUFBO0FBQUEsbUJBR0MsYUFDSDtBQUtFLG9CQUFJLFFBQVE7QUFDWixvQkFBSSxNQUFNLGdCQUFlO0FBQ3pCLGdDQUFlLFFBQVE7QUFFdkIsdUJBQU8sUUFBUSxNQUFNO0FBQ25CLHNCQUFJLGFBQWEsSUFBSTtBQUVyQixzQkFBSSxlQUFlLFFBQVEsbUJBQW1CLGdCQUFnQixNQUFNO0FBRWxFLG9DQUFlLFFBQVE7QUFDdkI7QUFBQTtBQUdGLHNCQUFJLFVBQVUsSUFBSTtBQUNsQixzQkFBSSxVQUFVO0FBQ2QsMEJBQVE7QUFDUix3QkFBTTtBQUFBO0FBSVIsNENBQTRCLGlCQUFnQixNQUM1QyxPQUFPLE1BQ1A7QUFDQTtBQUFBO0FBQUEsbUJBR0MsWUFDSDtBQUNFLDRDQUE0QixpQkFBZ0IsT0FDNUMsTUFDQSxNQUNBO0FBQ0E7QUFBQTtBQUFBLHVCQUlGO0FBR0UsZ0NBQWUsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBS3ZDLGlCQUFPLGdCQUFlO0FBQUE7QUFHeEIsdUNBQStCLFVBQVMsaUJBQWdCLGNBQWE7QUFDbkUsNEJBQWtCLGlCQUFnQixnQkFBZSxVQUFVO0FBQzNELGNBQUksZUFBZSxnQkFBZTtBQUVsQyxjQUFJLGFBQVksTUFBTTtBQU1wQiw0QkFBZSxRQUFRLHFCQUFxQixpQkFBZ0IsTUFBTSxjQUFjO0FBQUEsaUJBQzNFO0FBQ0wsOEJBQWtCLFVBQVMsaUJBQWdCLGNBQWM7QUFBQTtBQUczRCxpQkFBTyxnQkFBZTtBQUFBO0FBR3hCLFlBQUksa0RBQWtEO0FBRXRELHVDQUErQixVQUFTLGlCQUFnQixjQUFhO0FBQ25FLGNBQUksZUFBZSxnQkFBZTtBQUNsQyxjQUFJLFVBQVUsYUFBYTtBQUMzQixjQUFJLFdBQVcsZ0JBQWU7QUFDOUIsY0FBSSxXQUFXLGdCQUFlO0FBQzlCLGNBQUksV0FBVyxTQUFTO0FBRXhCO0FBQ0UsZ0JBQUksQ0FBRSxZQUFXLFdBQVc7QUFDMUIsa0JBQUksQ0FBQyxpREFBaUQ7QUFDcEQsa0VBQWtEO0FBRWxELHNCQUFNO0FBQUE7QUFBQTtBQUlWLGdCQUFJLG9CQUFvQixnQkFBZSxLQUFLO0FBRTVDLGdCQUFJLG1CQUFtQjtBQUNyQiw2QkFBZSxtQkFBbUIsVUFBVSxRQUFRO0FBQUE7QUFBQTtBQUl4RCx1QkFBYSxpQkFBZ0IsU0FBUztBQUV0QztBQUNFLGdCQUFJLGFBQWEsTUFBTTtBQUNyQixrQkFBSSxXQUFXLFNBQVM7QUFFeEIsa0JBQUksU0FBUyxVQUFVLFdBQVc7QUFFaEMsb0JBQUksU0FBUyxhQUFhLFNBQVMsWUFBWSxDQUFDLHFCQUFxQjtBQUNuRSx5QkFBTyw2QkFBNkIsVUFBUyxpQkFBZ0I7QUFBQTtBQUFBLHFCQUUxRDtBQUdMLHVDQUF1QixpQkFBZ0IsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUt0RCxjQUFJLGNBQWMsU0FBUztBQUMzQiw0QkFBa0IsVUFBUyxpQkFBZ0IsYUFBYTtBQUN4RCxpQkFBTyxnQkFBZTtBQUFBO0FBR3hCLFlBQUksdUNBQXVDO0FBRTNDLHVDQUErQixVQUFTLGlCQUFnQixjQUFhO0FBQ25FLGNBQUksVUFBVSxnQkFBZTtBQVE3QjtBQUNFLGdCQUFJLFFBQVEsYUFBYSxRQUFXO0FBSWxDLGtCQUFJLFlBQVksUUFBUSxVQUFVO0FBQ2hDLG9CQUFJLENBQUMsc0NBQXNDO0FBQ3pDLHlEQUF1QztBQUV2Qyx3QkFBTTtBQUFBO0FBQUE7QUFBQSxtQkFHTDtBQUNMLHdCQUFVLFFBQVE7QUFBQTtBQUFBO0FBSXRCLGNBQUksV0FBVyxnQkFBZTtBQUM5QixjQUFJLFVBQVMsU0FBUztBQUV0QjtBQUNFLGdCQUFJLE9BQU8sWUFBVyxZQUFZO0FBQ2hDLG9CQUFNO0FBQUE7QUFBQTtBQUlWLCtCQUFxQixpQkFBZ0I7QUFDckMsY0FBSSxXQUFXLFlBQVk7QUFFM0I7QUFDRSx1Q0FBMkI7QUFBQTtBQUc3QixjQUFJO0FBRUo7QUFDRSxnQ0FBb0IsVUFBVTtBQUM5QiwyQkFBZTtBQUNmLDBCQUFjLFFBQU87QUFDckIsMkJBQWU7QUFBQTtBQUdqQjtBQUNFO0FBQUE7QUFJRiwwQkFBZSxTQUFTO0FBQ3hCLDRCQUFrQixVQUFTLGlCQUFnQixhQUFhO0FBQ3hELGlCQUFPLGdCQUFlO0FBQUE7QUFHeEIsb0RBQTRDO0FBQzFDLDZCQUFtQjtBQUFBO0FBR3JCLDhDQUFzQyxVQUFTLGlCQUFnQixjQUFhO0FBQzFFLGNBQUksYUFBWSxNQUFNO0FBRXBCLDRCQUFlLGVBQWUsU0FBUTtBQUFBO0FBR3hDO0FBRUU7QUFBQTtBQUdGLGlDQUF1QixnQkFBZTtBQUV0QyxjQUFJLENBQUMsaUJBQWlCLGNBQWEsZ0JBQWUsYUFBYTtBQUk3RDtBQUNFLHFCQUFPO0FBQUE7QUFBQTtBQU1YLDJCQUFpQixVQUFTO0FBQzFCLGlCQUFPLGdCQUFlO0FBQUE7QUFHeEIsOEJBQXNCLFVBQVMsbUJBQW1CLG1CQUFtQjtBQUNuRTtBQUNFLGdCQUFJLGNBQWMsa0JBQWtCO0FBRXBDLGdCQUFJLGdCQUFnQixNQUFNO0FBRXhCLG9CQUFNLElBQUksTUFBTTtBQUFBO0FBS2xCLHFCQUFRLFlBQVk7QUFDcEIsOEJBQWtCLFlBQVk7QUFFOUIsOEJBQWtCLFFBQVEsa0JBQWtCO0FBQzVDLDhCQUFrQixVQUFVLGtCQUFrQjtBQUM5Qyw4QkFBa0IsU0FBUyxrQkFBa0I7QUFDN0MsOEJBQWtCLE1BQU0sa0JBQWtCO0FBRTFDLGdCQUFJLHNCQUFzQixZQUFZLE9BQU87QUFDM0MsMEJBQVksUUFBUTtBQUFBLG1CQUNmO0FBQ0wsa0JBQUksY0FBYyxZQUFZO0FBRTlCLGtCQUFJLGdCQUFnQixNQUFNO0FBRXhCLHNCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLHFCQUFPLFlBQVksWUFBWSxtQkFBbUI7QUFDaEQsOEJBQWMsWUFBWTtBQUUxQixvQkFBSSxnQkFBZ0IsTUFBTTtBQUV4Qix3QkFBTSxJQUFJLE1BQU07QUFBQTtBQUFBO0FBSXBCLDBCQUFZLFVBQVU7QUFBQTtBQUt4QixnQkFBSSxZQUFZLFlBQVk7QUFFNUIsZ0JBQUksY0FBYyxNQUFNO0FBQ3RCLDBCQUFZLFlBQVksQ0FBQztBQUN6QiwwQkFBWSxTQUFTO0FBQUEsbUJBQ2hCO0FBQ0wsd0JBQVUsS0FBSztBQUFBO0FBR2pCLDhCQUFrQixTQUFTO0FBRTNCLG1CQUFPO0FBQUE7QUFBQTtBQUlYLCtDQUF1QyxVQUFTLGNBQWE7QUFHM0QsY0FBSSxjQUFjLFNBQVE7QUFFMUIsY0FBSSxpQkFBaUIsYUFBYSxlQUFjO0FBQzlDLG1CQUFPO0FBQUE7QUFHVCxpQkFBTztBQUFBO0FBR1Qsd0RBQWdELFVBQVMsaUJBQWdCLGNBQWE7QUFJcEYsa0JBQVEsZ0JBQWU7QUFBQSxpQkFDaEI7QUFDSCxrQ0FBb0I7QUFDcEIsa0JBQUksUUFBTyxnQkFBZTtBQUUxQjtBQUNBO0FBQUEsaUJBRUc7QUFDSCw4QkFBZ0I7QUFDaEI7QUFBQSxpQkFFRyxnQkFDSDtBQUNFLGtCQUFJLFlBQVksZ0JBQWU7QUFFL0Isa0JBQUksa0JBQWtCLFlBQVk7QUFDaEMsb0NBQW9CO0FBQUE7QUFHdEI7QUFBQTtBQUFBLGlCQUdDO0FBQ0gsZ0NBQWtCLGlCQUFnQixnQkFBZSxVQUFVO0FBQzNEO0FBQUEsaUJBRUcsaUJBQ0g7QUFDRSxrQkFBSSxXQUFXLGdCQUFlLGNBQWM7QUFDNUMsa0JBQUksVUFBVSxnQkFBZSxLQUFLO0FBQ2xDLDJCQUFhLGlCQUFnQixTQUFTO0FBQ3RDO0FBQUE7QUFBQSxpQkFHQztBQUNIO0FBRUUsb0JBQUksZUFBZSxpQkFBaUIsY0FBYSxnQkFBZTtBQUVoRSxvQkFBSSxjQUFjO0FBQ2hCLGtDQUFlLFNBQVM7QUFBQTtBQUcxQjtBQUdFLHNCQUFJLFlBQVksZ0JBQWU7QUFDL0IsNEJBQVUsaUJBQWlCO0FBQzNCLDRCQUFVLHdCQUF3QjtBQUFBO0FBQUE7QUFJdEM7QUFBQSxpQkFFRyxtQkFDSDtBQUNFLGtCQUFJLFFBQVEsZ0JBQWU7QUFFM0Isa0JBQUksVUFBVSxNQUFNO0FBQ2xCLG9CQUFJLE1BQU0sZUFBZSxNQUFNO0FBQzdCLHNDQUFvQixpQkFBZ0IsaUNBQWlDLG9CQUFvQjtBQUl6RixrQ0FBZSxTQUFTO0FBR3hCLHlCQUFPO0FBQUE7QUFPVCxvQkFBSSx1QkFBdUIsZ0JBQWU7QUFDMUMsb0JBQUksb0JBQW9CLHFCQUFxQjtBQUU3QyxvQkFBSSxpQkFBaUIsY0FBYSxvQkFBb0I7QUFHcEQseUJBQU8sd0JBQXdCLFVBQVMsaUJBQWdCO0FBQUEsdUJBQ25EO0FBR0wsc0NBQW9CLGlCQUFnQixpQ0FBaUMsb0JBQW9CO0FBR3pGLHNCQUFJLFFBQVEsNkJBQTZCLFVBQVMsaUJBQWdCO0FBRWxFLHNCQUFJLFVBQVUsTUFBTTtBQUdsQiwyQkFBTyxNQUFNO0FBQUEseUJBQ1I7QUFJTCwyQkFBTztBQUFBO0FBQUE7QUFBQSxxQkFHTjtBQUNMLG9DQUFvQixpQkFBZ0IsaUNBQWlDLG9CQUFvQjtBQUFBO0FBRzNGO0FBQUE7QUFBQSxpQkFHQyx1QkFDSDtBQUNFLGtCQUFJLG1CQUFvQixVQUFRLFFBQVEsZ0JBQWdCO0FBRXhELGtCQUFJLGdCQUFnQixpQkFBaUIsY0FBYSxnQkFBZTtBQUVqRSxrQkFBSSxrQkFBa0I7QUFDcEIsb0JBQUksZUFBZTtBQU1qQix5QkFBTyw0QkFBNEIsVUFBUyxpQkFBZ0I7QUFBQTtBQU05RCxnQ0FBZSxTQUFTO0FBQUE7QUFNMUIsa0JBQUksY0FBYyxnQkFBZTtBQUVqQyxrQkFBSSxnQkFBZ0IsTUFBTTtBQUd4Qiw0QkFBWSxZQUFZO0FBQ3hCLDRCQUFZLE9BQU87QUFDbkIsNEJBQVksYUFBYTtBQUFBO0FBRzNCLGtDQUFvQixpQkFBZ0Isb0JBQW9CO0FBRXhELGtCQUFJLGVBQWU7QUFDakI7QUFBQSxxQkFDSztBQUlMLHVCQUFPO0FBQUE7QUFBQTtBQUFBLGlCQUlSO0FBQUEsaUJBQ0EsdUJBQ0g7QUFTRSw4QkFBZSxRQUFRO0FBQ3ZCLHFCQUFPLHlCQUF5QixVQUFTLGlCQUFnQjtBQUFBO0FBQUE7QUFJL0QsaUJBQU8sNkJBQTZCLFVBQVMsaUJBQWdCO0FBQUE7QUFHL0QsMkJBQW1CLFVBQVMsaUJBQWdCLGNBQWE7QUFDdkQ7QUFDRSxnQkFBSSxnQkFBZSxzQkFBc0IsYUFBWSxNQUFNO0FBRXpELHFCQUFPLGFBQWEsVUFBUyxpQkFBZ0IsNEJBQTRCLGdCQUFlLE1BQU0sZ0JBQWUsS0FBSyxnQkFBZSxjQUFjLGdCQUFlLGVBQWUsTUFBTSxnQkFBZSxNQUFNLGdCQUFlO0FBQUE7QUFBQTtBQUkzTixjQUFJLGFBQVksTUFBTTtBQUNwQixnQkFBSSxXQUFXLFNBQVE7QUFDdkIsZ0JBQUksV0FBVyxnQkFBZTtBQUU5QixnQkFBSSxhQUFhLFlBQVksdUJBQzVCLGdCQUFlLFNBQVMsU0FBUSxNQUFRO0FBR3ZDLGlDQUFtQjtBQUFBLG1CQUNkO0FBR0wsa0JBQUksOEJBQThCLDhCQUE4QixVQUFTO0FBRXpFLGtCQUFJLENBQUMsK0JBRUosaUJBQWUsUUFBUSxnQkFBZ0IsU0FBUztBQUUvQyxtQ0FBbUI7QUFDbkIsdUJBQU8sdUNBQXVDLFVBQVMsaUJBQWdCO0FBQUE7QUFHekUsa0JBQUssVUFBUSxRQUFRLGtDQUFrQyxTQUFTO0FBRzlELG1DQUFtQjtBQUFBLHFCQUNkO0FBS0wsbUNBQW1CO0FBQUE7QUFBQTtBQUFBLGlCQUdsQjtBQUNMLCtCQUFtQjtBQUVuQixnQkFBSSxvQkFBb0IsY0FBYyxrQkFBaUI7QUFVckQsa0JBQUksWUFBWSxnQkFBZTtBQUMvQixrQkFBSSxnQkFBZ0I7QUFDcEIseUJBQVcsaUJBQWdCLGVBQWU7QUFBQTtBQUFBO0FBUzlDLDBCQUFlLFFBQVE7QUFFdkIsa0JBQVEsZ0JBQWU7QUFBQSxpQkFDaEIsd0JBQ0g7QUFDRSxxQkFBTyw0QkFBNEIsVUFBUyxpQkFBZ0IsZ0JBQWUsTUFBTTtBQUFBO0FBQUEsaUJBR2hGLGVBQ0g7QUFDRSxrQkFBSSxjQUFjLGdCQUFlO0FBQ2pDLHFCQUFPLG1CQUFtQixVQUFTLGlCQUFnQixhQUFhO0FBQUE7QUFBQSxpQkFHL0QsbUJBQ0g7QUFDRSxrQkFBSSxZQUFZLGdCQUFlO0FBQy9CLGtCQUFJLGtCQUFrQixnQkFBZTtBQUNyQyxrQkFBSSxnQkFBZ0IsZ0JBQWUsZ0JBQWdCLFlBQVksa0JBQWtCLG9CQUFvQixXQUFXO0FBQ2hILHFCQUFPLHdCQUF3QixVQUFTLGlCQUFnQixXQUFXLGVBQWU7QUFBQTtBQUFBLGlCQUdqRixnQkFDSDtBQUNFLGtCQUFJLGFBQWEsZ0JBQWU7QUFDaEMsa0JBQUksbUJBQW1CLGdCQUFlO0FBRXRDLGtCQUFJLGlCQUFpQixnQkFBZSxnQkFBZ0IsYUFBYSxtQkFBbUIsb0JBQW9CLFlBQVk7QUFFcEgscUJBQU8scUJBQXFCLFVBQVMsaUJBQWdCLFlBQVksZ0JBQWdCO0FBQUE7QUFBQSxpQkFHaEY7QUFDSCxxQkFBTyxlQUFlLFVBQVMsaUJBQWdCO0FBQUEsaUJBRTVDO0FBQ0gscUJBQU8sc0JBQXNCLFVBQVMsaUJBQWdCO0FBQUEsaUJBRW5EO0FBQ0gscUJBQU8saUJBQWlCLFVBQVM7QUFBQSxpQkFFOUI7QUFDSCxxQkFBTyx3QkFBd0IsVUFBUyxpQkFBZ0I7QUFBQSxpQkFFckQ7QUFDSCxxQkFBTyxzQkFBc0IsVUFBUyxpQkFBZ0I7QUFBQSxpQkFFbkQsWUFDSDtBQUNFLGtCQUFJLE9BQU8sZ0JBQWU7QUFDMUIsa0JBQUksb0JBQW9CLGdCQUFlO0FBRXZDLGtCQUFJLGtCQUFrQixnQkFBZSxnQkFBZ0IsT0FBTyxvQkFBb0Isb0JBQW9CLE1BQU07QUFFMUcscUJBQU8saUJBQWlCLFVBQVMsaUJBQWdCLE1BQU0saUJBQWlCO0FBQUE7QUFBQSxpQkFHdkU7QUFDSCxxQkFBTyxlQUFlLFVBQVMsaUJBQWdCO0FBQUEsaUJBRTVDO0FBQ0gscUJBQU8sV0FBVyxVQUFTLGlCQUFnQjtBQUFBLGlCQUV4QztBQUNILHFCQUFPLGVBQWUsVUFBUyxpQkFBZ0I7QUFBQSxpQkFFNUM7QUFDSCxxQkFBTyxzQkFBc0IsVUFBUyxpQkFBZ0I7QUFBQSxpQkFFbkQ7QUFDSCxxQkFBTyxzQkFBc0IsVUFBUyxpQkFBZ0I7QUFBQSxpQkFFbkQsZUFDSDtBQUNFLGtCQUFJLFNBQVMsZ0JBQWU7QUFDNUIsa0JBQUksb0JBQW9CLGdCQUFlO0FBRXZDLGtCQUFJLGtCQUFrQixvQkFBb0IsUUFBUTtBQUVsRDtBQUNFLG9CQUFJLGdCQUFlLFNBQVMsZ0JBQWUsYUFBYTtBQUN0RCxzQkFBSSxpQkFBaUIsT0FBTztBQUU1QixzQkFBSSxnQkFBZ0I7QUFDbEIsbUNBQWUsZ0JBQWdCLGlCQUMvQixRQUFRLHlCQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUt2QyxnQ0FBa0Isb0JBQW9CLE9BQU8sTUFBTTtBQUNuRCxxQkFBTyxvQkFBb0IsVUFBUyxpQkFBZ0IsUUFBUSxpQkFBaUI7QUFBQTtBQUFBLGlCQUc1RSxxQkFDSDtBQUNFLHFCQUFPLDBCQUEwQixVQUFTLGlCQUFnQixnQkFBZSxNQUFNLGdCQUFlLGNBQWM7QUFBQTtBQUFBLGlCQUczRywwQkFDSDtBQUNFLGtCQUFJLGNBQWMsZ0JBQWU7QUFDakMsa0JBQUksb0JBQW9CLGdCQUFlO0FBRXZDLGtCQUFJLGtCQUFrQixnQkFBZSxnQkFBZ0IsY0FBYyxvQkFBb0Isb0JBQW9CLGFBQWE7QUFFeEgscUJBQU8sOEJBQThCLFVBQVMsaUJBQWdCLGFBQWEsaUJBQWlCO0FBQUE7QUFBQSxpQkFHM0YsdUJBQ0g7QUFDRSxxQkFBTyw0QkFBNEIsVUFBUyxpQkFBZ0I7QUFBQTtBQUFBLGlCQUczRCxnQkFDSDtBQUVFO0FBQUE7QUFBQSxpQkFHQyxvQkFDSDtBQUNFLHFCQUFPLHlCQUF5QixVQUFTLGlCQUFnQjtBQUFBO0FBQUE7QUFJL0QsZ0JBQU0sSUFBSSxNQUFNLCtCQUErQixnQkFBZSxNQUFNO0FBQUE7QUFHdEUsNEJBQW9CLFVBQVMsaUJBQWdCLGNBQWE7QUFLeEQseUJBQWU7QUFFZixrQkFBUSxnQkFBZTtBQUFBLGlCQUNoQixnQkFDSDtBQUNFLGtCQUFJLFlBQVksZ0JBQWU7QUFFL0Isa0JBQUksa0JBQWtCLFlBQVk7QUFDaEMsMkJBQVc7QUFBQTtBQUdiLGtCQUFJLFFBQVEsZ0JBQWU7QUFFM0Isa0JBQUksUUFBUSxlQUFlO0FBQ3pCLGdDQUFlLFFBQVEsUUFBUSxDQUFDLGdCQUFnQjtBQUVoRCxvQkFBTSxpQkFBZSxPQUFPLGlCQUFpQixRQUFRO0FBQ25ELHlDQUF1QjtBQUFBO0FBR3pCLHVCQUFPO0FBQUE7QUFHVCxxQkFBTztBQUFBO0FBQUEsaUJBR04sVUFDSDtBQUNFLGtCQUFJLFFBQU8sZ0JBQWU7QUFDMUIsK0JBQWlCO0FBQ2pCLHVDQUF5QjtBQUN6QjtBQUNBLGtCQUFJLFNBQVMsZ0JBQWU7QUFFNUIsa0JBQUssVUFBUyxtQkFBbUIsV0FBWSxVQUFTLGdCQUFnQixTQUFTO0FBRzdFLGdDQUFlLFFBQVEsU0FBUyxDQUFDLGdCQUFnQjtBQUNqRCx1QkFBTztBQUFBO0FBSVQscUJBQU87QUFBQTtBQUFBLGlCQUdOLGVBQ0g7QUFFRSw2QkFBZTtBQUNmLHFCQUFPO0FBQUE7QUFBQSxpQkFHTixtQkFDSDtBQUNFLGlDQUFtQjtBQUNuQixrQkFBSSxnQkFBZ0IsZ0JBQWU7QUFFbkMsa0JBQUksa0JBQWtCLFFBQVEsY0FBYyxlQUFlLE1BQU07QUFDL0Qsb0JBQUksZ0JBQWUsY0FBYyxNQUFNO0FBQ3JDLHdCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCO0FBQUE7QUFHRixrQkFBSSxVQUFVLGdCQUFlO0FBRTdCLGtCQUFJLFVBQVUsZUFBZTtBQUMzQixnQ0FBZSxRQUFRLFVBQVUsQ0FBQyxnQkFBZ0I7QUFFbEQsb0JBQU0saUJBQWUsT0FBTyxpQkFBaUIsUUFBUTtBQUNuRCx5Q0FBdUI7QUFBQTtBQUd6Qix1QkFBTztBQUFBO0FBR1QscUJBQU87QUFBQTtBQUFBLGlCQUdOLHVCQUNIO0FBQ0UsaUNBQW1CO0FBR25CLHFCQUFPO0FBQUE7QUFBQSxpQkFHTjtBQUNILCtCQUFpQjtBQUNqQixxQkFBTztBQUFBLGlCQUVKO0FBQ0gsa0JBQUksVUFBVSxnQkFBZSxLQUFLO0FBQ2xDLDBCQUFZLFNBQVM7QUFDckIscUJBQU87QUFBQSxpQkFFSjtBQUFBLGlCQUNBO0FBQ0gsNkJBQWU7QUFDZixxQkFBTztBQUFBLGlCQUVKO0FBRUgscUJBQU87QUFBQTtBQUdQLHFCQUFPO0FBQUE7QUFBQTtBQUliLHVDQUErQixVQUFTLGlCQUFpQixjQUFhO0FBS3BFLHlCQUFlO0FBRWYsa0JBQVEsZ0JBQWdCO0FBQUEsaUJBQ2pCLGdCQUNIO0FBQ0Usa0JBQUksb0JBQW9CLGdCQUFnQixLQUFLO0FBRTdDLGtCQUFJLHNCQUFzQixRQUFRLHNCQUFzQixRQUFXO0FBQ2pFLDJCQUFXO0FBQUE7QUFHYjtBQUFBO0FBQUEsaUJBR0MsVUFDSDtBQUNFLGtCQUFJLFFBQU8sZ0JBQWdCO0FBQzNCLCtCQUFpQjtBQUNqQix1Q0FBeUI7QUFDekI7QUFDQTtBQUFBO0FBQUEsaUJBR0MsZUFDSDtBQUNFLDZCQUFlO0FBQ2Y7QUFBQTtBQUFBLGlCQUdDO0FBQ0gsK0JBQWlCO0FBQ2pCO0FBQUEsaUJBRUc7QUFDSCxpQ0FBbUI7QUFDbkI7QUFBQSxpQkFFRztBQUNILGlDQUFtQjtBQUNuQjtBQUFBLGlCQUVHO0FBQ0gsa0JBQUksVUFBVSxnQkFBZ0IsS0FBSztBQUNuQywwQkFBWSxTQUFTO0FBQ3JCO0FBQUEsaUJBRUc7QUFBQSxpQkFDQTtBQUNILDZCQUFlO0FBQ2Y7QUFBQTtBQUFBO0FBSU4sWUFBSSw0Q0FBNEM7QUFFaEQ7QUFDRSxzREFBNEMsSUFBSTtBQUFBO0FBTWxELFlBQUksMkJBQTJCO0FBQy9CLFlBQUksNEJBQTRCO0FBQ2hDLFlBQUksa0JBQWtCLE9BQU8sWUFBWSxhQUFhLFVBQVU7QUFDaEUsWUFBSSxhQUFhO0FBRWpCLFlBQUksa0JBQWtCO0FBQ3RCLFlBQUksaUJBQWlCO0FBQ3JCLDBDQUFrQyxRQUFPO0FBTXZDO0FBQ0Usa0NBQXNCLE1BQU0sV0FBWTtBQUN0QyxvQkFBTTtBQUFBO0FBRVI7QUFBQTtBQUFBO0FBSUosWUFBSSxvQ0FBb0MsU0FBVSxVQUFTLFVBQVU7QUFDbkUsbUJBQVMsUUFBUSxTQUFRO0FBQ3pCLG1CQUFTLFFBQVEsU0FBUTtBQUV6QixjQUFLLFNBQVEsT0FBTyxhQUFhO0FBQy9CLGdCQUFJO0FBQ0Y7QUFDQSx1QkFBUztBQUFBLHNCQUNUO0FBQ0EseUNBQTJCO0FBQUE7QUFBQSxpQkFFeEI7QUFDTCxxQkFBUztBQUFBO0FBQUE7QUFLYiwyREFBbUQsVUFBUyx3QkFBd0I7QUFDbEYsY0FBSTtBQUNGLHNDQUEwQixRQUFRO0FBQUEsbUJBQzNCLFFBQVA7QUFDQSxvQ0FBd0IsVUFBUyx3QkFBd0I7QUFBQTtBQUFBO0FBSzdELGdEQUF3QyxVQUFTLHdCQUF3QixVQUFVO0FBQ2pGLGNBQUk7QUFDRiw4Q0FBa0MsVUFBUztBQUFBLG1CQUNwQyxRQUFQO0FBQ0Esb0NBQXdCLFVBQVMsd0JBQXdCO0FBQUE7QUFBQTtBQUs3RCw2Q0FBcUMsVUFBUyx3QkFBd0IsVUFBVTtBQUM5RSxjQUFJO0FBQ0YscUJBQVM7QUFBQSxtQkFDRixRQUFQO0FBQ0Esb0NBQXdCLFVBQVMsd0JBQXdCO0FBQUE7QUFBQTtBQUs3RCxpQ0FBeUIsVUFBUyx3QkFBd0I7QUFDeEQsY0FBSTtBQUNGLDRCQUFnQjtBQUFBLG1CQUNULFFBQVA7QUFDQSxvQ0FBd0IsVUFBUyx3QkFBd0I7QUFBQTtBQUFBO0FBSTdELGlDQUF5QixVQUFTLHdCQUF3QjtBQUN4RCxjQUFJLE1BQU0sU0FBUTtBQUVsQixjQUFJLFFBQVEsTUFBTTtBQUNoQixnQkFBSSxPQUFPLFFBQVEsWUFBWTtBQUM3QixrQkFBSTtBQUVKLGtCQUFJO0FBQ0Ysb0JBQUksdUJBQXVCLDZCQUE2QixTQUFRLE9BQU8sYUFBYTtBQUNsRixzQkFBSTtBQUNGO0FBQ0EsNkJBQVMsSUFBSTtBQUFBLDRCQUNiO0FBQ0EsK0NBQTJCO0FBQUE7QUFBQSx1QkFFeEI7QUFDTCwyQkFBUyxJQUFJO0FBQUE7QUFBQSx1QkFFUixRQUFQO0FBQ0Esd0NBQXdCLFVBQVMsd0JBQXdCO0FBQUE7QUFHM0Q7QUFDRSxvQkFBSSxPQUFPLFdBQVcsWUFBWTtBQUNoQyx3QkFBTSxtR0FBd0csMEJBQTBCO0FBQUE7QUFBQTtBQUFBLG1CQUd2STtBQUNMLGtCQUFJLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFLcEIsbUNBQTJCLFVBQVMsd0JBQXdCLFNBQVM7QUFDbkUsY0FBSTtBQUNGO0FBQUEsbUJBQ08sUUFBUDtBQUNBLG9DQUF3QixVQUFTLHdCQUF3QjtBQUFBO0FBQUE7QUFJN0QsWUFBSSx3QkFBd0I7QUFDNUIsWUFBSSxvQ0FBb0M7QUFDeEMsNkNBQXFDLE9BQU0sWUFBWTtBQUNyRCxrQ0FBd0IsaUJBQWlCLE1BQUs7QUFDOUMsdUJBQWE7QUFDYjtBQUVBLGNBQUksYUFBYTtBQUNqQiw4Q0FBb0M7QUFDcEMsa0NBQXdCO0FBQ3hCLGlCQUFPO0FBQUE7QUFHVCxxREFBNkM7QUFDM0MsaUJBQU8sZUFBZSxNQUFNO0FBQzFCLGdCQUFJLFFBQVE7QUFFWixnQkFBSSxRQUFRLE1BQU07QUFFbEIsZ0JBQUssT0FBTSxlQUFlLHdCQUF3QixXQUFXLFVBQVUsTUFBTTtBQUMzRSxvQkFBTSxTQUFTO0FBQ2YsMkJBQWE7QUFBQSxtQkFDUjtBQUNMO0FBQUE7QUFBQTtBQUFBO0FBS04sd0RBQWdEO0FBQzlDLGlCQUFPLGVBQWUsTUFBTTtBQUMxQixnQkFBSSxRQUFRO0FBQ1osNEJBQWdCO0FBRWhCLGdCQUFJO0FBQ0YsaURBQW1DO0FBQUEscUJBQzVCLFFBQVA7QUFDQSxzQ0FBd0IsT0FBTyxNQUFNLFFBQVE7QUFBQTtBQUcvQztBQUNBLGdCQUFJLFVBQVUsTUFBTTtBQUVwQixnQkFBSSxZQUFZLE1BQU07QUFDcEIsc0JBQVEsU0FBUyxNQUFNO0FBQ3ZCLDJCQUFhO0FBQ2I7QUFBQTtBQUdGLHlCQUFhLE1BQU07QUFBQTtBQUFBO0FBSXZCLG9EQUE0QyxjQUFjO0FBQ3hELGNBQUksV0FBVSxhQUFhO0FBQzNCLGNBQUksUUFBUSxhQUFhO0FBRXpCLGNBQUssU0FBUSxjQUFjLFNBQVM7QUFDbEMsNEJBQWdCO0FBRWhCLG9CQUFRLGFBQWE7QUFBQSxtQkFDZDtBQUFBLG1CQUNBO0FBQUEsbUJBQ0EscUJBQ0g7QUFDRTtBQUFBO0FBQUEsbUJBR0MsZ0JBQ0g7QUFDRSxvQkFBSSxhQUFZLE1BQU07QUFDcEIsc0JBQUksWUFBWSxTQUFRO0FBQ3hCLHNCQUFJLFlBQVksU0FBUTtBQUN4QixzQkFBSSxXQUFXLGFBQWE7QUFJNUI7QUFDRSx3QkFBSSxhQUFhLFNBQVMsYUFBYSxlQUFlLENBQUMsOEJBQThCO0FBQ25GLDBCQUFJLFNBQVMsVUFBVSxhQUFhLGVBQWU7QUFDakQsOEJBQU0sME1BQThOLDBCQUEwQixpQkFBaUI7QUFBQTtBQUdqUiwwQkFBSSxTQUFTLFVBQVUsYUFBYSxlQUFlO0FBQ2pELDhCQUFNLDBNQUE4TiwwQkFBMEIsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBS3JSLHNCQUFJLFdBQVcsU0FBUyx3QkFBd0IsYUFBYSxnQkFBZ0IsYUFBYSxPQUFPLFlBQVksb0JBQW9CLGFBQWEsTUFBTSxZQUFZO0FBRWhLO0FBQ0Usd0JBQUksYUFBYTtBQUVqQix3QkFBSSxhQUFhLFVBQWEsQ0FBQyxXQUFXLElBQUksYUFBYSxPQUFPO0FBQ2hFLGlDQUFXLElBQUksYUFBYTtBQUU1Qiw0QkFBTSwyR0FBZ0gsMEJBQTBCO0FBQUE7QUFBQTtBQUlwSiwyQkFBUyxzQ0FBc0M7QUFBQTtBQUdqRDtBQUFBO0FBQUEsbUJBR0MsVUFDSDtBQUNFO0FBQ0Usc0JBQUksUUFBTyxhQUFhO0FBQ3hCLGlDQUFlLE1BQUs7QUFBQTtBQUd0QjtBQUFBO0FBQUEsbUJBR0M7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFFSDtBQUFBLHVCQUdBO0FBQ0Usc0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFBQTtBQUl0QjtBQUFBO0FBQUE7QUFJSiw2Q0FBcUMsT0FBTyxjQUFjLHdCQUF3QjtBQUNoRixjQUFJLGNBQWMsYUFBYTtBQUMvQixjQUFJLGFBQWEsZ0JBQWdCLE9BQU8sWUFBWSxhQUFhO0FBRWpFLGNBQUksZUFBZSxNQUFNO0FBQ3ZCLGdCQUFJLGNBQWMsV0FBVztBQUM3QixnQkFBSSxTQUFTO0FBRWIsZUFBRztBQUNELGtCQUFLLFFBQU8sTUFBTSxXQUFXLE9BQU87QUFFbEMsb0JBQUksVUFBVSxPQUFPO0FBQ3JCLHVCQUFPLFVBQVU7QUFFakIsb0JBQUksWUFBWSxRQUFXO0FBQ3pCO0FBQ0Usd0JBQUssU0FBUSxlQUFlLFdBQVc7QUFDckMsK0RBQXlDO0FBQUEsK0JBQy9CLFNBQVEsWUFBWSxXQUFXO0FBQ3pDLDhEQUF3QztBQUFBO0FBQUE7QUFJNUM7QUFDRSx3QkFBSyxTQUFRLGVBQWUsV0FBVztBQUNyQyxrREFBNEI7QUFBQTtBQUFBO0FBSWhDLG9DQUFrQixjQUFjLHdCQUF3QjtBQUV4RDtBQUNFLHdCQUFLLFNBQVEsZUFBZSxXQUFXO0FBQ3JDLGtEQUE0QjtBQUFBO0FBQUE7QUFJaEM7QUFDRSx3QkFBSyxTQUFRLGVBQWUsV0FBVztBQUNyQztBQUFBLCtCQUNVLFNBQVEsWUFBWSxXQUFXO0FBQ3pDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNUix1QkFBUyxPQUFPO0FBQUEscUJBQ1QsV0FBVztBQUFBO0FBQUE7QUFJeEIsMkNBQW1DLE9BQU8sY0FBYztBQUN0RCxjQUFJLGNBQWMsYUFBYTtBQUMvQixjQUFJLGFBQWEsZ0JBQWdCLE9BQU8sWUFBWSxhQUFhO0FBRWpFLGNBQUksZUFBZSxNQUFNO0FBQ3ZCLGdCQUFJLGNBQWMsV0FBVztBQUM3QixnQkFBSSxTQUFTO0FBRWIsZUFBRztBQUNELGtCQUFLLFFBQU8sTUFBTSxXQUFXLE9BQU87QUFDbEM7QUFDRSxzQkFBSyxTQUFRLGVBQWUsV0FBVztBQUNyQywyREFBdUM7QUFBQSw2QkFDN0IsU0FBUSxZQUFZLFdBQVc7QUFDekMsMERBQXNDO0FBQUE7QUFBQTtBQUsxQyxvQkFBSSxTQUFTLE9BQU87QUFFcEI7QUFDRSxzQkFBSyxTQUFRLGVBQWUsV0FBVztBQUNyQyxnREFBNEI7QUFBQTtBQUFBO0FBSWhDLHVCQUFPLFVBQVU7QUFFakI7QUFDRSxzQkFBSyxTQUFRLGVBQWUsV0FBVztBQUNyQyxnREFBNEI7QUFBQTtBQUFBO0FBSWhDO0FBQ0Usc0JBQUssU0FBUSxlQUFlLFdBQVc7QUFDckM7QUFBQSw2QkFDVSxTQUFRLFlBQVksV0FBVztBQUN6QztBQUFBO0FBQUE7QUFJSjtBQUNFLHNCQUFJLFVBQVUsT0FBTztBQUVyQixzQkFBSSxZQUFZLFVBQWEsT0FBTyxZQUFZLFlBQVk7QUFDMUQsd0JBQUksV0FBVztBQUVmLHdCQUFLLFFBQU8sTUFBTSxZQUFZLFNBQVM7QUFDckMsaUNBQVc7QUFBQSwrQkFDRCxRQUFPLE1BQU0sZUFBZSxTQUFTO0FBQy9DLGlDQUFXO0FBQUEsMkJBQ047QUFDTCxpQ0FBVztBQUFBO0FBR2Isd0JBQUksV0FBVztBQUVmLHdCQUFJLFlBQVksTUFBTTtBQUNwQixpQ0FBVztBQUFBLCtCQUNGLE9BQU8sUUFBUSxTQUFTLFlBQVk7QUFDN0MsaUNBQVcsaUNBQWlDLFdBQVcsK0hBQXlJLFdBQVc7QUFBQSwyQkFDdE07QUFDTCxpQ0FBVyxvQkFBb0I7QUFBQTtBQUdqQywwQkFBTSxpRkFBc0YsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUs1Ryx1QkFBUyxPQUFPO0FBQUEscUJBQ1QsV0FBVztBQUFBO0FBQUE7QUFJeEIsOENBQXNDLGNBQWMsY0FBYztBQUNoRTtBQUVFLGdCQUFLLGNBQWEsUUFBUSxZQUFZLFNBQVM7QUFDN0Msc0JBQVEsYUFBYTtBQUFBLHFCQUNkLFVBQ0g7QUFDRSxzQkFBSSx3QkFBd0IsYUFBYSxVQUFVO0FBQ25ELHNCQUFJLHdCQUF3QixhQUFhLGVBQ3JDLEtBQUssc0JBQXNCLElBQzNCLGVBQWUsc0JBQXNCO0FBR3pDLHNCQUFJLGNBQWE7QUFDakIsc0JBQUksUUFBUSxhQUFhLGNBQWMsT0FBTyxVQUFVO0FBRXhEO0FBQ0Usd0JBQUkseUJBQXlCO0FBQzNCLDhCQUFRO0FBQUE7QUFBQTtBQUlaLHNCQUFJLE9BQU8saUJBQWlCLFlBQVk7QUFDdEMsaUNBQWEsSUFBSSxPQUFPLHVCQUF1QjtBQUFBO0FBS2pELHNCQUFJLGNBQWMsYUFBYTtBQUUvQjtBQUFPLDJCQUFPLGdCQUFnQixNQUFNO0FBQ2xDLDhCQUFRLFlBQVk7QUFBQSw2QkFDYjtBQUNILDhCQUFJLFFBQU8sWUFBWTtBQUN2QixnQ0FBSyx5QkFBeUI7QUFDOUI7QUFBQSw2QkFFRztBQUNILDhCQUFJLGtCQUFrQixZQUFZO0FBQ2xDLDBDQUFnQix5QkFBeUI7QUFDekM7QUFBQTtBQUdKLG9DQUFjLFlBQVk7QUFBQTtBQUc1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPWiwyQ0FBbUMsY0FBYyxVQUFTLGNBQWMsZ0JBQWdCO0FBQ3RGLGNBQUssY0FBYSxRQUFRLGdCQUFnQixTQUFTO0FBQ2pELG9CQUFRLGFBQWE7QUFBQSxtQkFDZDtBQUFBLG1CQUNBO0FBQUEsbUJBQ0EscUJBQ0g7QUFDRSxvQkFBSyxDQUFDLDJCQUEyQjtBQUsvQixzQkFBSyxhQUFhLE9BQU8sYUFBYTtBQUNwQyx3QkFBSTtBQUNGO0FBQ0EsZ0RBQTBCLFNBQVMsV0FBVztBQUFBLDhCQUM5QztBQUNBLGlEQUEyQjtBQUFBO0FBQUEseUJBRXhCO0FBQ0wsOENBQTBCLFNBQVMsV0FBVztBQUFBO0FBQUE7QUFJbEQ7QUFBQTtBQUFBLG1CQUdDLGdCQUNIO0FBQ0Usb0JBQUksV0FBVyxhQUFhO0FBRTVCLG9CQUFJLGFBQWEsUUFBUSxRQUFRO0FBQy9CLHNCQUFJLENBQUMsMkJBQTJCO0FBQzlCLHdCQUFJLGFBQVksTUFBTTtBQUlwQjtBQUNFLDRCQUFJLGFBQWEsU0FBUyxhQUFhLGVBQWUsQ0FBQyw4QkFBOEI7QUFDbkYsOEJBQUksU0FBUyxVQUFVLGFBQWEsZUFBZTtBQUNqRCxrQ0FBTSxvTUFBd04sMEJBQTBCLGlCQUFpQjtBQUFBO0FBRzNRLDhCQUFJLFNBQVMsVUFBVSxhQUFhLGVBQWU7QUFDakQsa0NBQU0sb01BQXdOLDBCQUEwQixpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFLL1EsMEJBQUssYUFBYSxPQUFPLGFBQWE7QUFDcEMsNEJBQUk7QUFDRjtBQUNBLG1DQUFTO0FBQUEsa0NBQ1Q7QUFDQSxxREFBMkI7QUFBQTtBQUFBLDZCQUV4QjtBQUNMLGlDQUFTO0FBQUE7QUFBQSwyQkFFTjtBQUNMLDBCQUFJLFlBQVksYUFBYSxnQkFBZ0IsYUFBYSxPQUFPLFNBQVEsZ0JBQWdCLG9CQUFvQixhQUFhLE1BQU0sU0FBUTtBQUN4SSwwQkFBSSxZQUFZLFNBQVE7QUFJeEI7QUFDRSw0QkFBSSxhQUFhLFNBQVMsYUFBYSxlQUFlLENBQUMsOEJBQThCO0FBQ25GLDhCQUFJLFNBQVMsVUFBVSxhQUFhLGVBQWU7QUFDakQsa0NBQU0scU1BQXlOLDBCQUEwQixpQkFBaUI7QUFBQTtBQUc1USw4QkFBSSxTQUFTLFVBQVUsYUFBYSxlQUFlO0FBQ2pELGtDQUFNLHFNQUF5TiwwQkFBMEIsaUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBS2hSLDBCQUFLLGFBQWEsT0FBTyxhQUFhO0FBQ3BDLDRCQUFJO0FBQ0Y7QUFDQSxtQ0FBUyxtQkFBbUIsV0FBVyxXQUFXLFNBQVM7QUFBQSxrQ0FDM0Q7QUFDQSxxREFBMkI7QUFBQTtBQUFBLDZCQUV4QjtBQUNMLGlDQUFTLG1CQUFtQixXQUFXLFdBQVcsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUW5FLG9CQUFJLGNBQWMsYUFBYTtBQUUvQixvQkFBSSxnQkFBZ0IsTUFBTTtBQUN4QjtBQUNFLHdCQUFJLGFBQWEsU0FBUyxhQUFhLGVBQWUsQ0FBQyw4QkFBOEI7QUFDbkYsMEJBQUksU0FBUyxVQUFVLGFBQWEsZUFBZTtBQUNqRCw4QkFBTSw4TUFBa08sMEJBQTBCLGlCQUFpQjtBQUFBO0FBR3JSLDBCQUFJLFNBQVMsVUFBVSxhQUFhLGVBQWU7QUFDakQsOEJBQU0sOE1BQWtPLDBCQUEwQixpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFRelIsb0NBQWtCLGNBQWMsYUFBYTtBQUFBO0FBRy9DO0FBQUE7QUFBQSxtQkFHQyxVQUNIO0FBR0Usb0JBQUksZUFBZSxhQUFhO0FBRWhDLG9CQUFJLGlCQUFpQixNQUFNO0FBQ3pCLHNCQUFJLFlBQVk7QUFFaEIsc0JBQUksYUFBYSxVQUFVLE1BQU07QUFDL0IsNEJBQVEsYUFBYSxNQUFNO0FBQUEsMkJBQ3BCO0FBQ0gsb0NBQVksa0JBQWtCLGFBQWEsTUFBTTtBQUNqRDtBQUFBLDJCQUVHO0FBQ0gsb0NBQVksYUFBYSxNQUFNO0FBQy9CO0FBQUE7QUFBQTtBQUlOLG9DQUFrQixjQUFjLGNBQWM7QUFBQTtBQUdoRDtBQUFBO0FBQUEsbUJBR0MsZUFDSDtBQUNFLG9CQUFJLGFBQWEsYUFBYTtBQUs5QixvQkFBSSxhQUFZLFFBQVEsYUFBYSxRQUFRLFFBQVE7QUFDbkQsc0JBQUksT0FBTyxhQUFhO0FBQ3hCLHNCQUFJLFFBQVEsYUFBYTtBQUN6Qiw4QkFBWSxZQUFZLE1BQU07QUFBQTtBQUdoQztBQUFBO0FBQUEsbUJBR0MsVUFDSDtBQUVFO0FBQUE7QUFBQSxtQkFHQyxZQUNIO0FBRUU7QUFBQTtBQUFBLG1CQUdDLFVBQ0g7QUFDRTtBQUNFLHNCQUFJLHlCQUF5QixhQUFhLGVBQ3RDLFdBQVcsdUJBQXVCLFVBQ2xDLFdBQVcsdUJBQXVCO0FBQ3RDLHNCQUFJLGlCQUFpQixhQUFhLFVBQVU7QUFDNUMsc0JBQUksY0FBYTtBQUNqQixzQkFBSSxRQUFRLGFBQVksT0FBTyxVQUFVO0FBRXpDO0FBQ0Usd0JBQUkseUJBQXlCO0FBQzNCLDhCQUFRO0FBQUE7QUFBQTtBQUlaLHNCQUFJLE9BQU8sYUFBYSxZQUFZO0FBQ2xDLDZCQUFTLGFBQWEsY0FBYyxJQUFJLE9BQU8sYUFBYSxnQkFBZ0IsYUFBYSxrQkFBa0IsYUFBYSxpQkFBaUI7QUFBQTtBQUczSTtBQUNFLHdCQUFJLE9BQU8sYUFBYSxZQUFZO0FBQ2xDLCtCQUFTLGFBQWEsY0FBYyxJQUFJLE9BQU8sZ0JBQWdCO0FBQUE7QUFNakUsd0RBQW9DO0FBR3BDLHdCQUFJLGNBQWMsYUFBYTtBQUUvQjtBQUFPLDZCQUFPLGdCQUFnQixNQUFNO0FBQ2xDLGdDQUFRLFlBQVk7QUFBQSwrQkFDYjtBQUNILGdDQUFJLFFBQU8sWUFBWTtBQUN2QixrQ0FBSyxrQkFBa0I7QUFDdkI7QUFBQSwrQkFFRztBQUNILGdDQUFJLGtCQUFrQixZQUFZO0FBQ2xDLDRDQUFnQixrQkFBa0I7QUFDbEM7QUFBQTtBQUdKLHNDQUFjLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFLaEM7QUFBQTtBQUFBLG1CQUdDLG1CQUNIO0FBQ0UsaURBQWlDLGNBQWM7QUFDL0M7QUFBQTtBQUFBLG1CQUdDO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQUEsbUJBQ0EsdUJBQ0g7QUFDRTtBQUFBO0FBQUE7QUFJRixzQkFBTSxJQUFJLE1BQU07QUFBQTtBQUFBO0FBSXRCLGNBQUssQ0FBQywyQkFBMkI7QUFDL0I7QUFDRSxrQkFBSSxhQUFhLFFBQVEsS0FBSztBQUM1QixnQ0FBZ0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU14Qiw4Q0FBc0MsTUFBTTtBQUcxQyxrQkFBUSxLQUFLO0FBQUEsaUJBQ047QUFBQSxpQkFDQTtBQUFBLGlCQUNBLHFCQUNIO0FBQ0Usa0JBQUssS0FBSyxPQUFPLGFBQWE7QUFDNUIsb0JBQUk7QUFDRjtBQUNBLDREQUEwQyxNQUFNLEtBQUs7QUFBQSwwQkFDckQ7QUFDQSw2Q0FBMkI7QUFBQTtBQUFBLHFCQUV4QjtBQUNMLDBEQUEwQyxNQUFNLEtBQUs7QUFBQTtBQUd2RDtBQUFBO0FBQUEsaUJBR0MsZ0JBQ0g7QUFDRSxrQkFBSSxXQUFXLEtBQUs7QUFFcEIsa0JBQUksT0FBTyxTQUFTLHNCQUFzQixZQUFZO0FBQ3BELDRDQUE0QixNQUFNLEtBQUssUUFBUTtBQUFBO0FBR2pELDhCQUFnQixNQUFNLEtBQUs7QUFDM0I7QUFBQTtBQUFBLGlCQUdDLGVBQ0g7QUFDRSw4QkFBZ0IsTUFBTSxLQUFLO0FBQzNCO0FBQUE7QUFBQTtBQUFBO0FBS1IseUNBQWlDLGNBQWMsVUFBVTtBQUV2RCxjQUFJLGtCQUFrQjtBQUV0QjtBQUdFLGdCQUFJLE9BQU87QUFFWCxtQkFBTyxNQUFNO0FBQ1gsa0JBQUksS0FBSyxRQUFRLGVBQWU7QUFDOUIsb0JBQUksb0JBQW9CLE1BQU07QUFDNUIsb0NBQWtCO0FBRWxCLHNCQUFJO0FBQ0Ysd0JBQUksV0FBVyxLQUFLO0FBRXBCLHdCQUFJLFVBQVU7QUFDWixtQ0FBYTtBQUFBLDJCQUNSO0FBQ0wscUNBQWUsS0FBSyxXQUFXLEtBQUs7QUFBQTtBQUFBLDJCQUUvQixRQUFQO0FBQ0EsNENBQXdCLGNBQWMsYUFBYSxRQUFRO0FBQUE7QUFBQTtBQUFBLHlCQUd0RCxLQUFLLFFBQVEsVUFBVTtBQUNoQyxvQkFBSSxvQkFBb0IsTUFBTTtBQUM1QixzQkFBSTtBQUNGLHdCQUFJLGFBQWEsS0FBSztBQUV0Qix3QkFBSSxVQUFVO0FBQ1osdUNBQWlCO0FBQUEsMkJBQ1o7QUFDTCx5Q0FBbUIsWUFBWSxLQUFLO0FBQUE7QUFBQSwyQkFFL0IsUUFBUDtBQUNBLDRDQUF3QixjQUFjLGFBQWEsUUFBUTtBQUFBO0FBQUE7QUFBQSx5QkFHckQsTUFBSyxRQUFRLHNCQUFzQixLQUFLLFFBQVEsMEJBQTBCLEtBQUssa0JBQWtCLFFBQVEsU0FBUztBQUFjO0FBQUEsdUJBQVcsS0FBSyxVQUFVLE1BQU07QUFDMUsscUJBQUssTUFBTSxTQUFTO0FBQ3BCLHVCQUFPLEtBQUs7QUFDWjtBQUFBO0FBR0Ysa0JBQUksU0FBUyxjQUFjO0FBQ3pCO0FBQUE7QUFHRixxQkFBTyxLQUFLLFlBQVksTUFBTTtBQUM1QixvQkFBSSxLQUFLLFdBQVcsUUFBUSxLQUFLLFdBQVcsY0FBYztBQUN4RDtBQUFBO0FBR0Ysb0JBQUksb0JBQW9CLE1BQU07QUFDNUIsb0NBQWtCO0FBQUE7QUFHcEIsdUJBQU8sS0FBSztBQUFBO0FBR2Qsa0JBQUksb0JBQW9CLE1BQU07QUFDNUIsa0NBQWtCO0FBQUE7QUFHcEIsbUJBQUssUUFBUSxTQUFTLEtBQUs7QUFDM0IscUJBQU8sS0FBSztBQUFBO0FBQUE7QUFBQTtBQUtsQixpQ0FBeUIsY0FBYztBQUNyQyxjQUFJLE1BQU0sYUFBYTtBQUV2QixjQUFJLFFBQVEsTUFBTTtBQUNoQixnQkFBSSxXQUFXLGFBQWE7QUFDNUIsZ0JBQUk7QUFFSixvQkFBUSxhQUFhO0FBQUEsbUJBQ2Q7QUFDSCxnQ0FBZ0Isa0JBQWtCO0FBQ2xDO0FBQUE7QUFHQSxnQ0FBZ0I7QUFBQTtBQUdwQixnQkFBSSxPQUFPLFFBQVEsWUFBWTtBQUM3QixrQkFBSTtBQUVKLGtCQUFLLGFBQWEsT0FBTyxhQUFhO0FBQ3BDLG9CQUFJO0FBQ0Y7QUFDQSwyQkFBUyxJQUFJO0FBQUEsMEJBQ2I7QUFDQSw2Q0FBMkI7QUFBQTtBQUFBLHFCQUV4QjtBQUNMLHlCQUFTLElBQUk7QUFBQTtBQUdmO0FBQ0Usb0JBQUksT0FBTyxXQUFXLFlBQVk7QUFDaEMsd0JBQU0sbUdBQXdHLDBCQUEwQjtBQUFBO0FBQUE7QUFBQSxtQkFHdkk7QUFDTDtBQUNFLG9CQUFJLENBQUMsSUFBSSxlQUFlLFlBQVk7QUFDbEMsd0JBQU0saUdBQXNHLDBCQUEwQjtBQUFBO0FBQUE7QUFJMUksa0JBQUksVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUtwQixxQ0FBNkIsT0FBTztBQWlCbEMsY0FBSSxZQUFZLE1BQU07QUFFdEIsY0FBSSxjQUFjLE1BQU07QUFDdEIsc0JBQVUsU0FBUztBQUFBO0FBR3JCLGdCQUFNLFNBQVM7QUFBQTtBQUdqQix5Q0FBaUMsT0FBTztBQUN0QyxjQUFJLFlBQVksTUFBTTtBQUV0QixjQUFJLGNBQWMsTUFBTTtBQUN0QixrQkFBTSxZQUFZO0FBQ2xCLG9DQUF3QjtBQUFBO0FBSzFCO0FBT0Usa0JBQU0sUUFBUTtBQUNkLGtCQUFNLFlBQVk7QUFDbEIsa0JBQU0sVUFBVTtBQUtoQixnQkFBSSxNQUFNLFFBQVEsZUFBZTtBQUMvQixrQkFBSSxlQUFlLE1BQU07QUFFekIsa0JBQUksaUJBQWlCLE1BQU07QUFDekIsc0NBQXNCO0FBQUE7QUFBQTtBQUkxQixrQkFBTSxZQUFZO0FBTWxCO0FBQ0Usb0JBQU0sY0FBYztBQUFBO0FBR3RCO0FBUUUsb0JBQU0sU0FBUztBQUNmLG9CQUFNLGVBQWU7QUFDckIsb0JBQU0sZ0JBQWdCO0FBQ3RCLG9CQUFNLGdCQUFnQjtBQUN0QixvQkFBTSxlQUFlO0FBQ3JCLG9CQUFNLFlBQVk7QUFFbEIsb0JBQU0sY0FBYztBQUFBO0FBQUE7QUFBQTtBQUsxQixvQ0FBNEIsT0FBTztBQUNqQyxjQUFJLFNBQVMsTUFBTTtBQUVuQixpQkFBTyxXQUFXLE1BQU07QUFDdEIsZ0JBQUksYUFBYSxTQUFTO0FBQ3hCLHFCQUFPO0FBQUE7QUFHVCxxQkFBUyxPQUFPO0FBQUE7QUFHbEIsZ0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsOEJBQXNCLE9BQU87QUFDM0IsaUJBQU8sTUFBTSxRQUFRLGlCQUFpQixNQUFNLFFBQVEsWUFBWSxNQUFNLFFBQVE7QUFBQTtBQUdoRixnQ0FBd0IsT0FBTztBQUs3QixjQUFJLE9BQU87QUFFWDtBQUFVLG1CQUFPLE1BQU07QUFFckIscUJBQU8sS0FBSyxZQUFZLE1BQU07QUFDNUIsb0JBQUksS0FBSyxXQUFXLFFBQVEsYUFBYSxLQUFLLFNBQVM7QUFHckQseUJBQU87QUFBQTtBQUdULHVCQUFPLEtBQUs7QUFBQTtBQUdkLG1CQUFLLFFBQVEsU0FBUyxLQUFLO0FBQzNCLHFCQUFPLEtBQUs7QUFFWixxQkFBTyxLQUFLLFFBQVEsaUJBQWlCLEtBQUssUUFBUSxZQUFZLEtBQUssUUFBUSxvQkFBb0I7QUFHN0Ysb0JBQUksS0FBSyxRQUFRLFdBQVc7QUFFMUI7QUFBQTtBQUtGLG9CQUFJLEtBQUssVUFBVSxRQUFRLEtBQUssUUFBUSxZQUFZO0FBQ2xEO0FBQUEsdUJBQ0s7QUFDTCx1QkFBSyxNQUFNLFNBQVM7QUFDcEIseUJBQU8sS0FBSztBQUFBO0FBQUE7QUFLaEIsa0JBQUksQ0FBRSxNQUFLLFFBQVEsWUFBWTtBQUU3Qix1QkFBTyxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBS2xCLGlDQUF5QixjQUFjO0FBR3JDLGNBQUksY0FBYyxtQkFBbUI7QUFFckMsa0JBQVEsWUFBWTtBQUFBLGlCQUNiLGVBQ0g7QUFDRSxrQkFBSSxTQUFTLFlBQVk7QUFFekIsa0JBQUksWUFBWSxRQUFRLGNBQWM7QUFFcEMsaUNBQWlCO0FBRWpCLDRCQUFZLFNBQVMsQ0FBQztBQUFBO0FBR3hCLGtCQUFJLFNBQVMsZUFBZTtBQUc1QiwwQ0FBNEIsY0FBYyxRQUFRO0FBQ2xEO0FBQUE7QUFBQSxpQkFHQztBQUFBLGlCQUNBLFlBQ0g7QUFDRSxrQkFBSSxVQUFVLFlBQVksVUFBVTtBQUVwQyxrQkFBSSxVQUFVLGVBQWU7QUFFN0IsdURBQXlDLGNBQWMsU0FBUztBQUNoRTtBQUFBO0FBQUE7QUFLRixvQkFBTSxJQUFJLE1BQU07QUFBQTtBQUFBO0FBSXRCLDBEQUFrRCxNQUFNLFFBQVEsUUFBUTtBQUN0RSxjQUFJLE1BQU0sS0FBSztBQUNmLGNBQUksU0FBUyxRQUFRLGlCQUFpQixRQUFRO0FBRTlDLGNBQUksUUFBUTtBQUNWLGdCQUFJLFlBQVksS0FBSztBQUVyQixnQkFBSSxRQUFRO0FBQ1Ysc0NBQXdCLFFBQVEsV0FBVztBQUFBLG1CQUN0QztBQUNMLHFDQUF1QixRQUFRO0FBQUE7QUFBQSxxQkFFeEIsUUFBUTtBQUFZO0FBQUEsZUFBTztBQUNwQyxnQkFBSSxRQUFRLEtBQUs7QUFFakIsZ0JBQUksVUFBVSxNQUFNO0FBQ2xCLHVEQUF5QyxPQUFPLFFBQVE7QUFDeEQsa0JBQUksVUFBVSxNQUFNO0FBRXBCLHFCQUFPLFlBQVksTUFBTTtBQUN2Qix5REFBeUMsU0FBUyxRQUFRO0FBQzFELDBCQUFVLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU0xQiw2Q0FBcUMsTUFBTSxRQUFRLFFBQVE7QUFDekQsY0FBSSxNQUFNLEtBQUs7QUFDZixjQUFJLFNBQVMsUUFBUSxpQkFBaUIsUUFBUTtBQUU5QyxjQUFJLFFBQVE7QUFDVixnQkFBSSxZQUFZLEtBQUs7QUFFckIsZ0JBQUksUUFBUTtBQUNWLDJCQUFhLFFBQVEsV0FBVztBQUFBLG1CQUMzQjtBQUNMLDBCQUFZLFFBQVE7QUFBQTtBQUFBLHFCQUViLFFBQVE7QUFBWTtBQUFBLGVBQU87QUFDcEMsZ0JBQUksUUFBUSxLQUFLO0FBRWpCLGdCQUFJLFVBQVUsTUFBTTtBQUNsQiwwQ0FBNEIsT0FBTyxRQUFRO0FBQzNDLGtCQUFJLFVBQVUsTUFBTTtBQUVwQixxQkFBTyxZQUFZLE1BQU07QUFDdkIsNENBQTRCLFNBQVMsUUFBUTtBQUM3QywwQkFBVSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFVMUIsWUFBSSxhQUFhO0FBQ2pCLFlBQUksd0JBQXdCO0FBRTVCLHVDQUErQixPQUFNLGFBQWEsY0FBYztBQUM5RDtBQWdCRSxnQkFBSSxTQUFTO0FBRWI7QUFBWSxxQkFBTyxXQUFXLE1BQU07QUFDbEMsd0JBQVEsT0FBTztBQUFBLHVCQUNSLGVBQ0g7QUFDRSxpQ0FBYSxPQUFPO0FBQ3BCLDRDQUF3QjtBQUN4QjtBQUFBO0FBQUEsdUJBR0MsVUFDSDtBQUNFLGlDQUFhLE9BQU8sVUFBVTtBQUM5Qiw0Q0FBd0I7QUFDeEI7QUFBQTtBQUFBLHVCQUdDLFlBQ0g7QUFDRSxpQ0FBYSxPQUFPLFVBQVU7QUFDOUIsNENBQXdCO0FBQ3hCO0FBQUE7QUFBQTtBQUlOLHlCQUFTLE9BQU87QUFBQTtBQUdsQixnQkFBSSxlQUFlLE1BQU07QUFDdkIsb0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIseUNBQTZCLE9BQU0sYUFBYTtBQUNoRCx5QkFBYTtBQUNiLG9DQUF3QjtBQUFBO0FBRzFCLDhCQUFvQjtBQUFBO0FBR3RCLG9EQUE0QyxjQUFjLHdCQUF3QixRQUFRO0FBRXhGLGNBQUksUUFBUSxPQUFPO0FBRW5CLGlCQUFPLFVBQVUsTUFBTTtBQUNyQix5Q0FBNkIsY0FBYyx3QkFBd0I7QUFDbkUsb0JBQVEsTUFBTTtBQUFBO0FBQUE7QUFJbEIsOENBQXNDLGNBQWMsd0JBQXdCLGNBQWM7QUFDeEYsMEJBQWdCO0FBSWhCLGtCQUFRLGFBQWE7QUFBQSxpQkFDZCxlQUNIO0FBQ0Usa0JBQUksQ0FBQywyQkFBMkI7QUFDOUIsZ0NBQWdCLGNBQWM7QUFBQTtBQUFBO0FBQUEsaUJBTS9CLFVBQ0g7QUFJRTtBQUNFLG9CQUFJLGlCQUFpQjtBQUNyQixvQkFBSSw0QkFBNEI7QUFDaEMsNkJBQWE7QUFDYixtREFBbUMsY0FBYyx3QkFBd0I7QUFDekUsNkJBQWE7QUFDYix3Q0FBd0I7QUFFeEIsb0JBQUksZUFBZSxNQUFNO0FBR3ZCLHNCQUFJLHVCQUF1QjtBQUN6Qiw2Q0FBeUIsWUFBWSxhQUFhO0FBQUEseUJBQzdDO0FBQ0wsZ0NBQVksWUFBWSxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBSzNDO0FBQUE7QUFBQSxpQkFHQyxvQkFDSDtBQUlFO0FBQ0Usb0JBQUksZUFBZSxNQUFNO0FBQ3ZCLHNCQUFJLHVCQUF1QjtBQUN6Qix1REFBbUMsWUFBWSxhQUFhO0FBQUEseUJBQ3ZEO0FBQ0wsMENBQXNCLFlBQVksYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUtyRDtBQUFBO0FBQUEsaUJBR0MsWUFDSDtBQUNFO0FBRUUsb0JBQUksa0JBQWtCO0FBQ3RCLG9CQUFJLDZCQUE2QjtBQUNqQyw2QkFBYSxhQUFhLFVBQVU7QUFDcEMsd0NBQXdCO0FBQ3hCLG1EQUFtQyxjQUFjLHdCQUF3QjtBQUN6RSw2QkFBYTtBQUNiLHdDQUF3QjtBQUFBO0FBRzFCO0FBQUE7QUFBQSxpQkFHQztBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQSxxQkFDSDtBQUNFLGtCQUFJLENBQUMsMkJBQTJCO0FBQzlCLG9CQUFJLGNBQWMsYUFBYTtBQUUvQixvQkFBSSxnQkFBZ0IsTUFBTTtBQUN4QixzQkFBSSxhQUFhLFlBQVk7QUFFN0Isc0JBQUksZUFBZSxNQUFNO0FBQ3ZCLHdCQUFJLGNBQWMsV0FBVztBQUM3Qix3QkFBSSxTQUFTO0FBRWIsdUJBQUc7QUFDRCwwQkFBSSxVQUFVLFFBQ1YsVUFBVSxRQUFRLFNBQ2xCLE1BQU0sUUFBUTtBQUVsQiwwQkFBSSxZQUFZLFFBQVc7QUFDekIsNEJBQUssT0FBTSxlQUFlLFdBQVc7QUFDbkMsNENBQWtCLGNBQWMsd0JBQXdCO0FBQUEsbUNBQzlDLE9BQU0sWUFBWSxXQUFXO0FBQ3ZDO0FBQ0Usb0VBQXdDO0FBQUE7QUFHMUMsOEJBQUssYUFBYSxPQUFPLGFBQWE7QUFDcEM7QUFDQSw4Q0FBa0IsY0FBYyx3QkFBd0I7QUFDeEQsdURBQTJCO0FBQUEsaUNBQ3RCO0FBQ0wsOENBQWtCLGNBQWMsd0JBQXdCO0FBQUE7QUFHMUQ7QUFDRTtBQUFBO0FBQUE7QUFBQTtBQUtOLCtCQUFTLE9BQU87QUFBQSw2QkFDVCxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBSzFCLGlEQUFtQyxjQUFjLHdCQUF3QjtBQUN6RTtBQUFBO0FBQUEsaUJBR0MsZ0JBQ0g7QUFDRSxrQkFBSSxDQUFDLDJCQUEyQjtBQUM5QixnQ0FBZ0IsY0FBYztBQUM5QixvQkFBSSxXQUFXLGFBQWE7QUFFNUIsb0JBQUksT0FBTyxTQUFTLHlCQUF5QixZQUFZO0FBQ3ZELGlEQUErQixjQUFjLHdCQUF3QjtBQUFBO0FBQUE7QUFJekUsaURBQW1DLGNBQWMsd0JBQXdCO0FBQ3pFO0FBQUE7QUFBQSxpQkFHQyxnQkFDSDtBQUVFLGlEQUFtQyxjQUFjLHdCQUF3QjtBQUN6RTtBQUFBO0FBQUEsaUJBR0Msb0JBQ0g7QUFDRSxrQkFDQyxhQUFhLE9BQU8sZ0JBQWdCO0FBVW5DLG9CQUFJLGdDQUFnQztBQUNwQyw0Q0FBNEIsaUNBQWlDLGFBQWEsa0JBQWtCO0FBQzVGLG1EQUFtQyxjQUFjLHdCQUF3QjtBQUN6RSw0Q0FBNEI7QUFBQSxxQkFDdkI7QUFDTCxtREFBbUMsY0FBYyx3QkFBd0I7QUFBQTtBQUczRTtBQUFBO0FBQUEscUJBSUY7QUFDRSxpREFBbUMsY0FBYyx3QkFBd0I7QUFDekU7QUFBQTtBQUFBO0FBQUE7QUFLUix3Q0FBZ0MsY0FBYztBQUU1QyxjQUFJLFdBQVcsYUFBYTtBQUFBO0FBRzlCLGtEQUEwQyxjQUFjLGNBQWM7QUFFcEUsY0FBSSxXQUFXLGFBQWE7QUFFNUIsY0FBSSxhQUFhLE1BQU07QUFDckIsZ0JBQUksV0FBVSxhQUFhO0FBRTNCLGdCQUFJLGFBQVksTUFBTTtBQUNwQixrQkFBSSxZQUFZLFNBQVE7QUFFeEIsa0JBQUksY0FBYyxNQUFNO0FBQ3RCLG9CQUFJLG1CQUFtQixVQUFVO0FBRWpDLG9CQUFJLHFCQUFxQixNQUFNO0FBQzdCLGlEQUErQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPekMsOENBQXNDLGNBQWM7QUFJbEQsY0FBSSxZQUFZLGFBQWE7QUFFN0IsY0FBSSxjQUFjLE1BQU07QUFDdEIseUJBQWEsY0FBYztBQUMzQixnQkFBSSxhQUFhLGFBQWE7QUFFOUIsZ0JBQUksZUFBZSxNQUFNO0FBQ3ZCLDJCQUFhLGFBQWEsWUFBWSxJQUFJO0FBQUE7QUFHNUMsc0JBQVUsUUFBUSxTQUFVLFVBQVU7QUFFcEMsa0JBQUksUUFBUSxxQkFBcUIsS0FBSyxNQUFNLGNBQWM7QUFFMUQsa0JBQUksQ0FBQyxXQUFXLElBQUksV0FBVztBQUM3QiwyQkFBVyxJQUFJO0FBRWY7QUFDRSxzQkFBSSxtQkFBbUI7QUFDckIsd0JBQUksb0JBQW9CLFFBQVEsbUJBQW1CLE1BQU07QUFFdkQsNkNBQXVCLGdCQUFnQjtBQUFBLDJCQUNsQztBQUNMLDRCQUFNLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFLbEIseUJBQVMsS0FBSyxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLN0IsdUNBQStCLE9BQU0sY0FBYyxnQkFBZ0I7QUFDakUsNEJBQWtCO0FBQ2xCLDJCQUFpQjtBQUNqQiwwQkFBZ0I7QUFDaEIsdUNBQTZCLGNBQWM7QUFDM0MsMEJBQWdCO0FBQ2hCLDRCQUFrQjtBQUNsQiwyQkFBaUI7QUFBQTtBQUduQixvREFBNEMsT0FBTSxhQUFhLE9BQU87QUFHcEUsY0FBSSxZQUFZLFlBQVk7QUFFNUIsY0FBSSxjQUFjLE1BQU07QUFDdEIscUJBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7QUFDekMsa0JBQUksZ0JBQWdCLFVBQVU7QUFFOUIsa0JBQUk7QUFDRixzQ0FBc0IsT0FBTSxhQUFhO0FBQUEsdUJBQ2xDLFFBQVA7QUFDQSx3Q0FBd0IsZUFBZSxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBSzFELGNBQUksaUJBQWlCO0FBRXJCLGNBQUksWUFBWSxlQUFlLGNBQWM7QUFDM0MsZ0JBQUksUUFBUSxZQUFZO0FBRXhCLG1CQUFPLFVBQVUsTUFBTTtBQUNyQiw4QkFBZ0I7QUFDaEIsMkNBQTZCLE9BQU87QUFDcEMsc0JBQVEsTUFBTTtBQUFBO0FBQUE7QUFJbEIsMEJBQWdCO0FBQUE7QUFHbEIsOENBQXNDLGNBQWMsT0FBTSxPQUFPO0FBQy9ELGNBQUksV0FBVSxhQUFhO0FBQzNCLGNBQUksUUFBUSxhQUFhO0FBSXpCLGtCQUFRLGFBQWE7QUFBQSxpQkFDZDtBQUFBLGlCQUNBO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQSxxQkFDSDtBQUNFLGlEQUFtQyxPQUFNO0FBQ3pDLDBDQUE0QjtBQUU1QixrQkFBSSxRQUFRLFFBQVE7QUFDbEIsb0JBQUk7QUFDRiw4Q0FBNEIsWUFBWSxXQUFXLGNBQWMsYUFBYTtBQUM5RSw0Q0FBMEIsWUFBWSxXQUFXO0FBQUEseUJBQzFDLFFBQVA7QUFDQSwwQ0FBd0IsY0FBYyxhQUFhLFFBQVE7QUFBQTtBQVE3RCxvQkFBSyxhQUFhLE9BQU8sYUFBYTtBQUNwQyxzQkFBSTtBQUNGO0FBQ0EsZ0RBQTRCLFNBQVMsV0FBVyxjQUFjLGFBQWE7QUFBQSwyQkFDcEUsUUFBUDtBQUNBLDRDQUF3QixjQUFjLGFBQWEsUUFBUTtBQUFBO0FBRzdELDZDQUEyQjtBQUFBLHVCQUN0QjtBQUNMLHNCQUFJO0FBQ0YsZ0RBQTRCLFNBQVMsV0FBVyxjQUFjLGFBQWE7QUFBQSwyQkFDcEUsUUFBUDtBQUNBLDRDQUF3QixjQUFjLGFBQWEsUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUtqRTtBQUFBO0FBQUEsaUJBR0MsZ0JBQ0g7QUFDRSxpREFBbUMsT0FBTTtBQUN6QywwQ0FBNEI7QUFFNUIsa0JBQUksUUFBUSxLQUFLO0FBQ2Ysb0JBQUksYUFBWSxNQUFNO0FBQ3BCLGtDQUFnQixVQUFTLFNBQVE7QUFBQTtBQUFBO0FBSXJDO0FBQUE7QUFBQSxpQkFHQyxlQUNIO0FBQ0UsaURBQW1DLE9BQU07QUFDekMsMENBQTRCO0FBRTVCLGtCQUFJLFFBQVEsS0FBSztBQUNmLG9CQUFJLGFBQVksTUFBTTtBQUNwQixrQ0FBZ0IsVUFBUyxTQUFRO0FBQUE7QUFBQTtBQUlyQztBQU9FLG9CQUFJLGFBQWEsUUFBUSxjQUFjO0FBQ3JDLHNCQUFJLFdBQVcsYUFBYTtBQUU1QixzQkFBSTtBQUNGLHFDQUFpQjtBQUFBLDJCQUNWLFFBQVA7QUFDQSw0Q0FBd0IsY0FBYyxhQUFhLFFBQVE7QUFBQTtBQUFBO0FBSS9ELG9CQUFJLFFBQVEsUUFBUTtBQUNsQixzQkFBSSxhQUFhLGFBQWE7QUFFOUIsc0JBQUksY0FBYyxNQUFNO0FBRXRCLHdCQUFJLFdBQVcsYUFBYTtBQUk1Qix3QkFBSSxXQUFXLGFBQVksT0FBTyxTQUFRLGdCQUFnQjtBQUMxRCx3QkFBSSxPQUFPLGFBQWE7QUFFeEIsd0JBQUksZ0JBQWdCLGFBQWE7QUFDakMsaUNBQWEsY0FBYztBQUUzQix3QkFBSSxrQkFBa0IsTUFBTTtBQUMxQiwwQkFBSTtBQUNGLHFDQUFhLFlBQVksZUFBZSxNQUFNLFVBQVUsVUFBVTtBQUFBLCtCQUMzRCxRQUFQO0FBQ0EsZ0RBQXdCLGNBQWMsYUFBYSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9yRTtBQUFBO0FBQUEsaUJBR0MsVUFDSDtBQUNFLGlEQUFtQyxPQUFNO0FBQ3pDLDBDQUE0QjtBQUU1QixrQkFBSSxRQUFRLFFBQVE7QUFDbEI7QUFDRSxzQkFBSSxhQUFhLGNBQWMsTUFBTTtBQUNuQywwQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQixzQkFBSSxlQUFlLGFBQWE7QUFDaEMsc0JBQUksVUFBVSxhQUFhO0FBSTNCLHNCQUFJLFVBQVUsYUFBWSxPQUFPLFNBQVEsZ0JBQWdCO0FBRXpELHNCQUFJO0FBQ0YscUNBQWlCLGNBQWMsU0FBUztBQUFBLDJCQUNqQyxRQUFQO0FBQ0EsNENBQXdCLGNBQWMsYUFBYSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBS2pFO0FBQUE7QUFBQSxpQkFHQyxVQUNIO0FBQ0UsaURBQW1DLE9BQU07QUFDekMsMENBQTRCO0FBRTVCLGtCQUFJLFFBQVEsUUFBUTtBQUNsQjtBQUNFLHNCQUFJLGFBQVksTUFBTTtBQUNwQix3QkFBSSxnQkFBZ0IsU0FBUTtBQUU1Qix3QkFBSSxjQUFjLGNBQWM7QUFDOUIsMEJBQUk7QUFDRixnREFBd0IsTUFBSztBQUFBLCtCQUN0QixRQUFQO0FBQ0EsZ0RBQXdCLGNBQWMsYUFBYSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9yRTtBQUFBO0FBQUEsaUJBR0MsWUFDSDtBQUNFLGlEQUFtQyxPQUFNO0FBQ3pDLDBDQUE0QjtBQUU1QjtBQUFBO0FBQUEsaUJBR0MsbUJBQ0g7QUFDRSxpREFBbUMsT0FBTTtBQUN6QywwQ0FBNEI7QUFDNUIsa0JBQUksaUJBQWlCLGFBQWE7QUFFbEMsa0JBQUksZUFBZSxRQUFRLFlBQVk7QUFDckMsb0JBQUksV0FBVyxlQUFlO0FBQzlCLG9CQUFJLFdBQVcsYUFBYTtBQUU1QixvQkFBSSxVQUFVO0FBQ1osc0JBQUksWUFBWSxlQUFlLGNBQWMsUUFBUSxlQUFlLFVBQVUsa0JBQWtCO0FBRWhHLHNCQUFJLENBQUMsV0FBVztBQUVkO0FBQUE7QUFBQTtBQUFBO0FBS04sa0JBQUksUUFBUSxRQUFRO0FBQ2xCLG9CQUFJO0FBQ0YseUNBQXVCO0FBQUEseUJBQ2hCLFFBQVA7QUFDQSwwQ0FBd0IsY0FBYyxhQUFhLFFBQVE7QUFBQTtBQUc3RCw2Q0FBNkI7QUFBQTtBQUcvQjtBQUFBO0FBQUEsaUJBR0Msb0JBQ0g7QUFDRSxrQkFBSSxhQUFhLGFBQVksUUFBUSxTQUFRLGtCQUFrQjtBQUUvRCxrQkFDQyxhQUFhLE9BQU8sZ0JBQWdCO0FBSW5DLG9CQUFJLGdDQUFnQztBQUNwQyw0Q0FBNEIsaUNBQWlDO0FBQzdELG1EQUFtQyxPQUFNO0FBQ3pDLDRDQUE0QjtBQUFBLHFCQUN2QjtBQUNMLG1EQUFtQyxPQUFNO0FBQUE7QUFHM0MsMENBQTRCO0FBRTVCLGtCQUFJLFFBQVEsWUFBWTtBQUN0QixvQkFBSSxZQUFZLGFBQWE7QUFFN0Isb0JBQUksWUFBWSxjQUFjO0FBRTlCLG9CQUFJLG9CQUFvQjtBQUV4QjtBQUdFLDBDQUF3QixtQkFBbUI7QUFBQTtBQUc3QztBQUNFLHNCQUFJLFdBQVc7QUFDYix3QkFBSSxDQUFDLFlBQVk7QUFDZiwwQkFBSyxtQkFBa0IsT0FBTyxvQkFBb0IsUUFBUTtBQUN4RCxxQ0FBYTtBQUNiLDRCQUFJLGlCQUFpQixrQkFBa0I7QUFFdkMsK0JBQU8sbUJBQW1CLE1BQU07QUFDOUIsdUNBQWE7QUFDYix1REFBNkI7QUFDN0IsMkNBQWlCLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRNUM7QUFBQTtBQUFBLGlCQUdDLHVCQUNIO0FBQ0UsaURBQW1DLE9BQU07QUFDekMsMENBQTRCO0FBRTVCLGtCQUFJLFFBQVEsUUFBUTtBQUNsQiw2Q0FBNkI7QUFBQTtBQUcvQjtBQUFBO0FBQUEsaUJBR0MsZ0JBQ0g7QUFFRTtBQUFBO0FBQUEscUJBSUY7QUFDRSxpREFBbUMsT0FBTTtBQUN6QywwQ0FBNEI7QUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFLUiw2Q0FBcUMsY0FBYztBQUlqRCxjQUFJLFFBQVEsYUFBYTtBQUV6QixjQUFJLFFBQVEsV0FBVztBQUNyQixnQkFBSTtBQUNGLDhCQUFnQjtBQUFBLHFCQUNULFFBQVA7QUFDQSxzQ0FBd0IsY0FBYyxhQUFhLFFBQVE7QUFBQTtBQU83RCx5QkFBYSxTQUFTLENBQUM7QUFBQTtBQUd6QixjQUFJLFFBQVEsV0FBVztBQUNyQix5QkFBYSxTQUFTLENBQUM7QUFBQTtBQUFBO0FBSTNCLHFDQUE2QixjQUFjLE9BQU0sZ0JBQWdCO0FBQy9ELDRCQUFrQjtBQUNsQiwyQkFBaUI7QUFDakIsdUJBQWE7QUFDYixvQ0FBMEIsY0FBYyxPQUFNO0FBQzlDLDRCQUFrQjtBQUNsQiwyQkFBaUI7QUFBQTtBQUduQiwyQ0FBbUMsYUFBYSxPQUFNLGdCQUFnQjtBQUVwRSxjQUFJLGVBQWdCLGFBQVksT0FBTyxvQkFBb0I7QUFFM0QsaUJBQU8sZUFBZSxNQUFNO0FBQzFCLGdCQUFJLFFBQVE7QUFDWixnQkFBSSxhQUFhLE1BQU07QUFFdkIsZ0JBQUssTUFBTSxRQUFRLHNCQUFzQixjQUFjO0FBRXJELGtCQUFJLFdBQVcsTUFBTSxrQkFBa0I7QUFDdkMsa0JBQUksOEJBQThCLFlBQVk7QUFFOUMsa0JBQUksNkJBQTZCO0FBRS9CLGtEQUFrQyxhQUFhLE9BQU07QUFDckQ7QUFBQSxxQkFDSztBQUVMLG9CQUFJLFdBQVUsTUFBTTtBQUNwQixvQkFBSSxZQUFZLGFBQVksUUFBUSxTQUFRLGtCQUFrQjtBQUM5RCxvQkFBSSwrQkFBK0IsYUFBYTtBQUNoRCxvQkFBSSwrQkFBK0I7QUFDbkMsb0JBQUksZ0NBQWdDO0FBRXBDLDJDQUEyQjtBQUMzQiw0Q0FBNEI7QUFFNUIsb0JBQUksNkJBQTZCLENBQUMsK0JBQStCO0FBRy9ELCtCQUFhO0FBQ2IsOENBQTRCO0FBQUE7QUFHOUIsb0JBQUksUUFBUTtBQUVaLHVCQUFPLFVBQVUsTUFBTTtBQUNyQiwrQkFBYTtBQUNiLDRDQUEwQixPQUMxQixPQUFNO0FBQ04sMEJBQVEsTUFBTTtBQUFBO0FBSWhCLDZCQUFhO0FBQ2IsMkNBQTJCO0FBQzNCLDRDQUE0QjtBQUM1QixrREFBa0MsYUFBYSxPQUFNO0FBQ3JEO0FBQUE7QUFBQTtBQUlKLGdCQUFLLE9BQU0sZUFBZSxnQkFBZ0IsV0FBVyxlQUFlLE1BQU07QUFDeEUseUJBQVcsU0FBUztBQUNwQiwyQkFBYTtBQUFBLG1CQUNSO0FBQ0wsZ0RBQWtDLGFBQWEsT0FBTTtBQUFBO0FBQUE7QUFBQTtBQUszRCxtREFBMkMsYUFBYSxPQUFNLGdCQUFnQjtBQUM1RSxpQkFBTyxlQUFlLE1BQU07QUFDMUIsZ0JBQUksUUFBUTtBQUVaLGdCQUFLLE9BQU0sUUFBUSxnQkFBZ0IsU0FBUztBQUMxQyxrQkFBSSxXQUFVLE1BQU07QUFDcEIsOEJBQWdCO0FBRWhCLGtCQUFJO0FBQ0YsMENBQTBCLE9BQU0sVUFBUyxPQUFPO0FBQUEsdUJBQ3pDLFFBQVA7QUFDQSx3Q0FBd0IsT0FBTyxNQUFNLFFBQVE7QUFBQTtBQUcvQztBQUFBO0FBR0YsZ0JBQUksVUFBVSxhQUFhO0FBQ3pCLDJCQUFhO0FBQ2I7QUFBQTtBQUdGLGdCQUFJLFVBQVUsTUFBTTtBQUVwQixnQkFBSSxZQUFZLE1BQU07QUFDcEIsc0JBQVEsU0FBUyxNQUFNO0FBQ3ZCLDJCQUFhO0FBQ2I7QUFBQTtBQUdGLHlCQUFhLE1BQU07QUFBQTtBQUFBO0FBSXZCLDhDQUFzQyxhQUFhO0FBQ2pELGlCQUFPLGVBQWUsTUFBTTtBQUMxQixnQkFBSSxRQUFRO0FBQ1osZ0JBQUksYUFBYSxNQUFNO0FBRXZCLG9CQUFRLE1BQU07QUFBQSxtQkFDUDtBQUFBLG1CQUNBO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQSxxQkFDSDtBQUNFLG9CQUFLLE1BQU0sT0FBTyxhQUFhO0FBQzdCLHNCQUFJO0FBQ0Y7QUFDQSxnREFBNEIsUUFBUSxPQUFPLE1BQU07QUFBQSw0QkFDakQ7QUFDQSwrQ0FBMkI7QUFBQTtBQUFBLHVCQUV4QjtBQUNMLDhDQUE0QixRQUFRLE9BQU8sTUFBTTtBQUFBO0FBR25EO0FBQUE7QUFBQSxtQkFHQyxnQkFDSDtBQUVFLGdDQUFnQixPQUFPLE1BQU07QUFDN0Isb0JBQUksV0FBVyxNQUFNO0FBRXJCLG9CQUFJLE9BQU8sU0FBUyx5QkFBeUIsWUFBWTtBQUN2RCxpREFBK0IsT0FBTyxNQUFNLFFBQVE7QUFBQTtBQUd0RDtBQUFBO0FBQUEsbUJBR0MsZUFDSDtBQUNFLGdDQUFnQixPQUFPLE1BQU07QUFDN0I7QUFBQTtBQUFBLG1CQUdDLG9CQUNIO0FBRUUsb0JBQUksV0FBVyxNQUFNLGtCQUFrQjtBQUV2QyxvQkFBSSxVQUFVO0FBR1osa0RBQWdDO0FBQ2hDO0FBQUE7QUFHRjtBQUFBO0FBQUE7QUFLTixnQkFBSSxlQUFlLE1BQU07QUFDdkIseUJBQVcsU0FBUztBQUNwQiwyQkFBYTtBQUFBLG1CQUNSO0FBQ0wsOENBQWdDO0FBQUE7QUFBQTtBQUFBO0FBS3RDLGlEQUF5QyxhQUFhO0FBQ3BELGlCQUFPLGVBQWUsTUFBTTtBQUMxQixnQkFBSSxRQUFRO0FBRVosZ0JBQUksVUFBVSxhQUFhO0FBQ3pCLDJCQUFhO0FBQ2I7QUFBQTtBQUdGLGdCQUFJLFVBQVUsTUFBTTtBQUVwQixnQkFBSSxZQUFZLE1BQU07QUFDcEIsc0JBQVEsU0FBUyxNQUFNO0FBQ3ZCLDJCQUFhO0FBQ2I7QUFBQTtBQUdGLHlCQUFhLE1BQU07QUFBQTtBQUFBO0FBSXZCLDZDQUFxQyxhQUFhO0FBQ2hELGlCQUFPLGVBQWUsTUFBTTtBQUMxQixnQkFBSSxRQUFRO0FBQ1osZ0JBQUksYUFBYSxNQUFNO0FBRXZCLGdCQUFJLE1BQU0sUUFBUSxvQkFBb0I7QUFDcEMsa0JBQUksV0FBVyxNQUFNLGtCQUFrQjtBQUV2QyxrQkFBSSxVQUFVO0FBRVosK0NBQStCO0FBQy9CO0FBQUE7QUFBQTtBQUtKLGdCQUFJLGVBQWUsTUFBTTtBQUd2Qix5QkFBVyxTQUFTO0FBQ3BCLDJCQUFhO0FBQUEsbUJBQ1I7QUFDTCw2Q0FBK0I7QUFBQTtBQUFBO0FBQUE7QUFLckMsZ0RBQXdDLGFBQWE7QUFDbkQsaUJBQU8sZUFBZSxNQUFNO0FBQzFCLGdCQUFJLFFBQVE7QUFFWiw0QkFBZ0I7QUFFaEIsZ0JBQUk7QUFDRiwyQ0FBNkI7QUFBQSxxQkFDdEIsUUFBUDtBQUNBLHNDQUF3QixPQUFPLE1BQU0sUUFBUTtBQUFBO0FBRy9DO0FBRUEsZ0JBQUksVUFBVSxhQUFhO0FBQ3pCLDJCQUFhO0FBQ2I7QUFBQTtBQUdGLGdCQUFJLFVBQVUsTUFBTTtBQUVwQixnQkFBSSxZQUFZLE1BQU07QUFHcEIsc0JBQVEsU0FBUyxNQUFNO0FBQ3ZCLDJCQUFhO0FBQ2I7QUFBQTtBQUdGLHlCQUFhLE1BQU07QUFBQTtBQUFBO0FBSXZCLDJDQUFtQyxPQUFNLGNBQWMsZ0JBQWdCLHNCQUFzQjtBQUMzRix1QkFBYTtBQUNiLDBDQUFnQyxjQUFjLE9BQU0sZ0JBQWdCO0FBQUE7QUFHdEUsaURBQXlDLGFBQWEsT0FBTSxnQkFBZ0Isc0JBQXNCO0FBQ2hHLGlCQUFPLGVBQWUsTUFBTTtBQUMxQixnQkFBSSxRQUFRO0FBQ1osZ0JBQUksYUFBYSxNQUFNO0FBRXZCLGdCQUFLLE9BQU0sZUFBZSxpQkFBaUIsV0FBVyxlQUFlLE1BQU07QUFDekUseUJBQVcsU0FBUztBQUNwQiwyQkFBYTtBQUFBLG1CQUNSO0FBQ0wsaURBQW1DLGFBQWEsT0FBTSxnQkFBZ0I7QUFBQTtBQUFBO0FBQUE7QUFLNUUsb0RBQTRDLGFBQWEsT0FBTSxnQkFBZ0Isc0JBQXNCO0FBQ25HLGlCQUFPLGVBQWUsTUFBTTtBQUMxQixnQkFBSSxRQUFRO0FBRVosZ0JBQUssT0FBTSxRQUFRLGFBQWEsU0FBUztBQUN2Qyw4QkFBZ0I7QUFFaEIsa0JBQUk7QUFDRiwwQ0FBMEIsT0FBTSxPQUFPLGdCQUFnQjtBQUFBLHVCQUNoRCxRQUFQO0FBQ0Esd0NBQXdCLE9BQU8sTUFBTSxRQUFRO0FBQUE7QUFHL0M7QUFBQTtBQUdGLGdCQUFJLFVBQVUsYUFBYTtBQUN6QiwyQkFBYTtBQUNiO0FBQUE7QUFHRixnQkFBSSxVQUFVLE1BQU07QUFFcEIsZ0JBQUksWUFBWSxNQUFNO0FBQ3BCLHNCQUFRLFNBQVMsTUFBTTtBQUN2QiwyQkFBYTtBQUNiO0FBQUE7QUFHRix5QkFBYSxNQUFNO0FBQUE7QUFBQTtBQUl2QiwyQ0FBbUMsY0FBYyxjQUFjLGdCQUFnQixzQkFBc0I7QUFDbkcsa0JBQVEsYUFBYTtBQUFBLGlCQUNkO0FBQUEsaUJBQ0E7QUFBQSxpQkFDQSxxQkFDSDtBQUNFLGtCQUFLLGFBQWEsT0FBTyxhQUFhO0FBQ3BDO0FBRUEsb0JBQUk7QUFDRiw0Q0FBMEIsWUFBWSxXQUFXO0FBQUEsMEJBQ2pEO0FBQ0EsOENBQTRCO0FBQUE7QUFBQSxxQkFFekI7QUFDTCwwQ0FBMEIsWUFBWSxXQUFXO0FBQUE7QUFHbkQ7QUFBQTtBQUFBO0FBQUE7QUFLUiw2Q0FBcUMsWUFBWTtBQUMvQyx1QkFBYTtBQUNiO0FBQUE7QUFHRixxREFBNkM7QUFDM0MsaUJBQU8sZUFBZSxNQUFNO0FBQzFCLGdCQUFJLFFBQVE7QUFDWixnQkFBSSxRQUFRLE1BQU07QUFFbEIsZ0JBQUssWUFBVyxRQUFRLG1CQUFtQixTQUFTO0FBQ2xELGtCQUFJLFlBQVksTUFBTTtBQUV0QixrQkFBSSxjQUFjLE1BQU07QUFDdEIseUJBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7QUFDekMsc0JBQUksZ0JBQWdCLFVBQVU7QUFDOUIsK0JBQWE7QUFDYix1RUFBcUQsZUFBZTtBQUFBO0FBR3RFO0FBWUUsc0JBQUksZ0JBQWdCLE1BQU07QUFFMUIsc0JBQUksa0JBQWtCLE1BQU07QUFDMUIsd0JBQUksZ0JBQWdCLGNBQWM7QUFFbEMsd0JBQUksa0JBQWtCLE1BQU07QUFDMUIsb0NBQWMsUUFBUTtBQUV0Qix5QkFBRztBQUNELDRCQUFJLGtCQUFrQixjQUFjO0FBQ3BDLHNDQUFjLFVBQVU7QUFDeEIsd0NBQWdCO0FBQUEsK0JBQ1Qsa0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBS2pDLDZCQUFhO0FBQUE7QUFBQTtBQUlqQixnQkFBSyxPQUFNLGVBQWUsaUJBQWlCLFdBQVcsVUFBVSxNQUFNO0FBQ3BFLG9CQUFNLFNBQVM7QUFDZiwyQkFBYTtBQUFBLG1CQUNSO0FBQ0w7QUFBQTtBQUFBO0FBQUE7QUFLTix3REFBZ0Q7QUFDOUMsaUJBQU8sZUFBZSxNQUFNO0FBQzFCLGdCQUFJLFFBQVE7QUFFWixnQkFBSyxPQUFNLFFBQVEsYUFBYSxTQUFTO0FBQ3ZDLDhCQUFnQjtBQUNoQiwwQ0FBNEI7QUFDNUI7QUFBQTtBQUdGLGdCQUFJLFVBQVUsTUFBTTtBQUVwQixnQkFBSSxZQUFZLE1BQU07QUFDcEIsc0JBQVEsU0FBUyxNQUFNO0FBQ3ZCLDJCQUFhO0FBQ2I7QUFBQTtBQUdGLHlCQUFhLE1BQU07QUFBQTtBQUFBO0FBSXZCLDZDQUFxQyxjQUFjO0FBQ2pELGtCQUFRLGFBQWE7QUFBQSxpQkFDZDtBQUFBLGlCQUNBO0FBQUEsaUJBQ0EscUJBQ0g7QUFDRSxrQkFBSyxhQUFhLE9BQU8sYUFBYTtBQUNwQztBQUNBLDRDQUE0QixZQUFZLFdBQVcsY0FBYyxhQUFhO0FBQzlFLDRDQUE0QjtBQUFBLHFCQUN2QjtBQUNMLDRDQUE0QixZQUFZLFdBQVcsY0FBYyxhQUFhO0FBQUE7QUFHaEY7QUFBQTtBQUFBO0FBQUE7QUFLUixzRUFBOEQsb0JBQW9CLHdCQUF3QjtBQUN4RyxpQkFBTyxlQUFlLE1BQU07QUFDMUIsZ0JBQUksUUFBUTtBQUdaLDRCQUFnQjtBQUNoQix5REFBNkMsT0FBTztBQUNwRDtBQUNBLGdCQUFJLFFBQVEsTUFBTTtBQUdsQixnQkFBSSxVQUFVLE1BQU07QUFDbEIsb0JBQU0sU0FBUztBQUNmLDJCQUFhO0FBQUEsbUJBQ1I7QUFDTCxzRUFBd0Q7QUFBQTtBQUFBO0FBQUE7QUFLOUQseUVBQWlFLG9CQUFvQjtBQUNuRixpQkFBTyxlQUFlLE1BQU07QUFDMUIsZ0JBQUksUUFBUTtBQUNaLGdCQUFJLFVBQVUsTUFBTTtBQUNwQixnQkFBSSxjQUFjLE1BQU07QUFFeEI7QUFJRSxzQ0FBd0I7QUFFeEIsa0JBQUksVUFBVSxvQkFBb0I7QUFDaEMsNkJBQWE7QUFDYjtBQUFBO0FBQUE7QUFJSixnQkFBSSxZQUFZLE1BQU07QUFDcEIsc0JBQVEsU0FBUztBQUNqQiwyQkFBYTtBQUNiO0FBQUE7QUFHRix5QkFBYTtBQUFBO0FBQUE7QUFJakIsOERBQXNELFVBQVMsd0JBQXdCO0FBQ3JGLGtCQUFRLFNBQVE7QUFBQSxpQkFDVDtBQUFBLGlCQUNBO0FBQUEsaUJBQ0EscUJBQ0g7QUFDRSxrQkFBSyxTQUFRLE9BQU8sYUFBYTtBQUMvQjtBQUNBLDRDQUE0QixXQUFXLFVBQVM7QUFDaEQsNENBQTRCO0FBQUEscUJBQ3ZCO0FBQ0wsNENBQTRCLFdBQVcsVUFBUztBQUFBO0FBR2xEO0FBQUE7QUFBQTtBQUFBO0FBTVIsOENBQXNDLE9BQU87QUFDM0M7QUFHRSxvQkFBUSxNQUFNO0FBQUEsbUJBQ1A7QUFBQSxtQkFDQTtBQUFBLG1CQUNBLHFCQUNIO0FBQ0Usb0JBQUk7QUFDRiw0Q0FBMEIsU0FBUyxXQUFXO0FBQUEseUJBQ3ZDLFFBQVA7QUFDQSwwQ0FBd0IsT0FBTyxNQUFNLFFBQVE7QUFBQTtBQUcvQztBQUFBO0FBQUEsbUJBR0MsZ0JBQ0g7QUFDRSxvQkFBSSxXQUFXLE1BQU07QUFFckIsb0JBQUk7QUFDRiwyQkFBUztBQUFBLHlCQUNGLFFBQVA7QUFDQSwwQ0FBd0IsT0FBTyxNQUFNLFFBQVE7QUFBQTtBQUcvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTVYsK0NBQXVDLE9BQU87QUFDNUM7QUFHRSxvQkFBUSxNQUFNO0FBQUEsbUJBQ1A7QUFBQSxtQkFDQTtBQUFBLG1CQUNBLHFCQUNIO0FBQ0Usb0JBQUk7QUFDRiw0Q0FBMEIsWUFBWSxXQUFXO0FBQUEseUJBQzFDLFFBQVA7QUFDQSwwQ0FBd0IsT0FBTyxNQUFNLFFBQVE7QUFBQTtBQUcvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTVYsZ0RBQXdDLE9BQU87QUFDN0M7QUFHRSxvQkFBUSxNQUFNO0FBQUEsbUJBQ1A7QUFBQSxtQkFDQTtBQUFBLG1CQUNBLHFCQUNIO0FBQ0Usb0JBQUk7QUFDRiw4Q0FBNEIsU0FBUyxXQUFXLE9BQU8sTUFBTTtBQUFBLHlCQUN0RCxRQUFQO0FBQ0EsMENBQXdCLE9BQU8sTUFBTSxRQUFRO0FBQUE7QUFHL0M7QUFBQTtBQUFBLG1CQUdDLGdCQUNIO0FBQ0Usb0JBQUksV0FBVyxNQUFNO0FBRXJCLG9CQUFJLE9BQU8sU0FBUyx5QkFBeUIsWUFBWTtBQUN2RCxpREFBK0IsT0FBTyxNQUFNLFFBQVE7QUFBQTtBQUd0RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTVYsaURBQXlDLE9BQU87QUFDOUM7QUFHRSxvQkFBUSxNQUFNO0FBQUEsbUJBQ1A7QUFBQSxtQkFDQTtBQUFBLG1CQUNBLHFCQUNIO0FBQ0Usb0JBQUk7QUFDRiw4Q0FBNEIsWUFBWSxXQUFXLE9BQU8sTUFBTTtBQUFBLHlCQUN6RCxRQUFQO0FBQ0EsMENBQXdCLE9BQU8sTUFBTSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU96RCxZQUFJLGlCQUFpQjtBQUNyQixZQUFJLHdCQUF3QjtBQUM1QixZQUFJLFlBQVk7QUFDaEIsWUFBSSxpQkFBaUI7QUFDckIsWUFBSSxZQUFZO0FBRWhCLFlBQUksT0FBTyxXQUFXLGNBQWMsT0FBTyxLQUFLO0FBQzlDLGNBQUksWUFBWSxPQUFPO0FBQ3ZCLDJCQUFpQixVQUFVO0FBQzNCLGtDQUF3QixVQUFVO0FBQ2xDLHNCQUFZLFVBQVU7QUFDdEIsMkJBQWlCLFVBQVU7QUFDM0Isc0JBQVksVUFBVTtBQUFBO0FBRXhCLFlBQUksY0FBYztBQUNsQixrQ0FBMEI7QUFDeEI7QUFDRSx3QkFBWSxRQUFRLFNBQVUsWUFBWTtBQUN4QyxxQkFBTztBQUFBO0FBQUE7QUFBQTtBQUtiLFlBQUksdUJBQXVCLHFCQUFxQjtBQUNoRCx3Q0FBZ0MsT0FBTztBQUNyQztBQUtFLGdCQUFJLDhCQUNKLE9BQU8sNkJBQTZCLGNBQWMsMkJBQTJCO0FBRTdFLGdCQUFJLGdCQUFnQixPQUFPLFNBQVM7QUFDcEMsbUJBQVEsaUJBQWlCLGdDQUFnQztBQUFBO0FBQUE7QUFHN0QsOENBQXNDO0FBQ3BDO0FBQ0UsZ0JBQUksOEJBQ0osT0FBTyw2QkFBNkIsY0FBYywyQkFBMkI7QUFFN0UsZ0JBQUksQ0FBQywrQkFBK0IscUJBQXFCLFlBQVksTUFBTTtBQUV6RSxvQkFBTTtBQUFBO0FBR1IsbUJBQU87QUFBQTtBQUFBO0FBSVgsWUFBSSxPQUFPLEtBQUs7QUFDaEIsWUFBSSwyQkFBMkIscUJBQXFCLHdCQUNoRCxzQkFBc0IscUJBQXFCLG1CQUMzQyw0QkFBNEIscUJBQXFCLHlCQUNqRCx5QkFBeUIscUJBQXFCO0FBQ2xELFlBQUksWUFFSjtBQUNBLFlBQUksaUJBRUo7QUFDQSxZQUFJLGdCQUVKO0FBQ0EsWUFBSSxnQkFFSjtBQUNBLFlBQUksaUJBQWlCO0FBQ3JCLFlBQUksbUJBQW1CO0FBQ3ZCLFlBQUksY0FBYztBQUNsQixZQUFJLGdCQUFnQjtBQUNwQixZQUFJLHlCQUF5QjtBQUM3QixZQUFJLGdCQUFnQjtBQUNwQixZQUFJLHFCQUFxQjtBQUV6QixZQUFJLG1CQUFtQjtBQUV2QixZQUFJLHFCQUFxQjtBQUV6QixZQUFJLGlCQUFpQjtBQUVyQixZQUFJLGdDQUFnQztBQVNwQyxZQUFJLHFCQUFxQjtBQUN6QixZQUFJLDJCQUEyQixhQUFhO0FBRTVDLFlBQUksK0JBQStCO0FBRW5DLFlBQUksK0JBQStCO0FBS25DLFlBQUksa0NBQWtDO0FBR3RDLFlBQUksaUNBQWlDO0FBRXJDLFlBQUksNENBQTRDO0FBRWhELFlBQUksZ0NBQWdDO0FBRXBDLFlBQUkscUNBQXFDO0FBR3pDLFlBQUksc0NBQXNDO0FBRzFDLFlBQUksK0JBQStCO0FBQ25DLFlBQUksdUJBQXVCO0FBRzNCLFlBQUkscUNBQXFDO0FBR3pDLFlBQUksb0JBQW9CO0FBQ3hCLFlBQUksNEJBQTRCO0FBRWhDLG9DQUE0QjtBQUMxQiwrQ0FBcUMsUUFBUTtBQUFBO0FBRy9DLHVDQUErQjtBQUM3QixpQkFBTztBQUFBO0FBRVQsWUFBSSxtQkFBbUI7QUFDdkIsWUFBSSxxQkFBcUI7QUFDekIsWUFBSSx5Q0FBeUM7QUFDN0MsWUFBSSw2QkFBNkI7QUFDakMsWUFBSSxnQ0FBZ0M7QUFDcEMsWUFBSSw2QkFBNkI7QUFDakMsWUFBSSxnQ0FBZ0M7QUFDcEMsWUFBSSw0QkFBNEI7QUFFaEMsWUFBSSxzQkFBc0I7QUFDMUIsWUFBSSxvQkFBb0I7QUFDeEIsWUFBSSx3QkFBd0I7QUFDNUIsWUFBSSwyQkFBMkI7QUFDL0IsWUFBSSx3Q0FBd0M7QUFDNUMsWUFBSSw4QkFBOEI7QUFDbEMsWUFBSSwyQkFBMkI7QUFDL0IsWUFBSSwrQkFBK0I7QUFJbkMsWUFBSSxtQkFBbUI7QUFDdkIsWUFBSSw2QkFBNkI7QUFDakMsWUFBSSwyQkFBMkI7QUFDL0IseUNBQWlDO0FBQy9CLGlCQUFPO0FBQUE7QUFFVCxvQ0FBNEI7QUFDMUIsY0FBSyxvQkFBb0IsaUJBQWdCLG9CQUFvQixXQUFXO0FBRXRFLG1CQUFPO0FBQUE7QUFJVCxjQUFJLHFCQUFxQixhQUFhO0FBRXBDLG1CQUFPO0FBQUE7QUFJVCw2QkFBbUI7QUFDbkIsaUJBQU87QUFBQTtBQUVULG1DQUEyQixPQUFPO0FBRWhDLGNBQUksT0FBTyxNQUFNO0FBRWpCLGNBQUssUUFBTyxvQkFBb0IsUUFBUTtBQUN0QyxtQkFBTztBQUFBLHFCQUNJLG9CQUFtQixtQkFBbUIsYUFBYSxrQ0FBa0MsU0FBUztBQVV6RyxtQkFBTyxrQkFBa0I7QUFBQTtBQUczQixjQUFJLGVBQWUsK0JBQStCO0FBRWxELGNBQUksY0FBYztBQUNoQixnQkFBSywwQkFBMEIsZUFBZSxNQUFNO0FBQ2xELGtCQUFJLGFBQWEsMEJBQTBCO0FBRTNDLGtCQUFJLENBQUMsV0FBVyxnQkFBZ0I7QUFDOUIsMkJBQVcsaUJBQWlCLElBQUk7QUFBQTtBQUdsQyx5QkFBVyxlQUFlLElBQUk7QUFBQTtBQVVoQyxnQkFBSSwrQkFBK0IsUUFBUTtBQUV6QywyQ0FBNkI7QUFBQTtBQUcvQixtQkFBTztBQUFBO0FBU1QsY0FBSSxhQUFhO0FBRWpCLGNBQUksZUFBZSxRQUFRO0FBQ3pCLG1CQUFPO0FBQUE7QUFTVCxjQUFJLFlBQVk7QUFDaEIsaUJBQU87QUFBQTtBQUdULGtDQUEwQixPQUFPO0FBSy9CLGNBQUksT0FBTyxNQUFNO0FBRWpCLGNBQUssUUFBTyxvQkFBb0IsUUFBUTtBQUN0QyxtQkFBTztBQUFBO0FBR1QsaUJBQU87QUFBQTtBQUdULHVDQUErQixPQUFPLE1BQU0sV0FBVztBQUNyRDtBQUVBO0FBQ0UsZ0JBQUksMEJBQTBCO0FBQzVCLG9CQUFNO0FBQUE7QUFBQTtBQUlWLGNBQUksUUFBTyw4QkFBOEIsT0FBTztBQUVoRCxjQUFJLFVBQVMsTUFBTTtBQUNqQixtQkFBTztBQUFBO0FBR1Q7QUFDRSxnQkFBSSwwQkFBMEI7QUFDNUIsc0RBQXdDO0FBQUE7QUFBQTtBQUs1QywwQkFBZ0IsT0FBTSxNQUFNO0FBRTVCLGNBQUssb0JBQW1CLG1CQUFtQixXQUFXLFVBQVMsb0JBQW9CO0FBTWpGLDZDQUFpQztBQUFBLGlCQUM1QjtBQUdMO0FBQ0Usa0JBQUksbUJBQW1CO0FBQ3JCLG1DQUFtQixPQUFNLE9BQU87QUFBQTtBQUFBO0FBSXBDLDhDQUFrQztBQUVsQyxnQkFBSSxVQUFTLG9CQUFvQjtBQU8vQixrQkFBTSxvQkFBbUIsbUJBQW1CLFdBQVc7QUFDckQsNERBQTRDLFdBQVcsMkNBQTJDO0FBQUE7QUFHcEcsa0JBQUksaUNBQWlDLHdCQUF3QjtBQU8zRCxvQ0FBb0IsT0FBTTtBQUFBO0FBQUE7QUFJOUIsa0NBQXNCLE9BQU07QUFFNUIsZ0JBQUksU0FBUyxZQUFZLHFCQUFxQixhQUFjLE9BQU0sT0FBTyxvQkFBb0IsVUFDN0YsQ0FBRyx1QkFBdUIsa0JBQW1CO0FBTTNDO0FBQ0E7QUFBQTtBQUFBO0FBSUosaUJBQU87QUFBQTtBQUVULGdEQUF3QyxPQUFNLE1BQU0sV0FBVztBQVU3RCxjQUFJLFdBQVUsTUFBSztBQUNuQixtQkFBUSxRQUFRO0FBQ2hCLDBCQUFnQixPQUFNLE1BQU07QUFDNUIsZ0NBQXNCLE9BQU07QUFBQTtBQU05QiwrQ0FBdUMsYUFBYSxNQUFNO0FBRXhELHNCQUFZLFFBQVEsV0FBVyxZQUFZLE9BQU87QUFDbEQsY0FBSSxZQUFZLFlBQVk7QUFFNUIsY0FBSSxjQUFjLE1BQU07QUFDdEIsc0JBQVUsUUFBUSxXQUFXLFVBQVUsT0FBTztBQUFBO0FBR2hEO0FBQ0UsZ0JBQUksY0FBYyxRQUFTLGFBQVksUUFBUyxhQUFZLGdCQUFnQixTQUFTO0FBQ25GLHVEQUF5QztBQUFBO0FBQUE7QUFLN0MsY0FBSSxPQUFPO0FBQ1gsY0FBSSxTQUFTLFlBQVk7QUFFekIsaUJBQU8sV0FBVyxNQUFNO0FBQ3RCLG1CQUFPLGFBQWEsV0FBVyxPQUFPLFlBQVk7QUFDbEQsd0JBQVksT0FBTztBQUVuQixnQkFBSSxjQUFjLE1BQU07QUFDdEIsd0JBQVUsYUFBYSxXQUFXLFVBQVUsWUFBWTtBQUFBLG1CQUNuRDtBQUNMO0FBQ0Usb0JBQUssUUFBTyxRQUFTLGFBQVksZ0JBQWdCLFNBQVM7QUFDeEQsMkRBQXlDO0FBQUE7QUFBQTtBQUFBO0FBSy9DLG1CQUFPO0FBQ1AscUJBQVMsT0FBTztBQUFBO0FBR2xCLGNBQUksS0FBSyxRQUFRLFVBQVU7QUFDekIsZ0JBQUksUUFBTyxLQUFLO0FBQ2hCLG1CQUFPO0FBQUEsaUJBQ0Y7QUFDTCxtQkFBTztBQUFBO0FBQUE7QUFJWCxxQ0FBNkIsT0FBTyxNQUFNO0FBQ3hDLGlCQUdHLHdCQUF1QixRQUt4Qiw0QkFBNkIsT0FBTSxPQUFPLG9CQUFvQixVQUk1RCxvQkFBbUIsbUJBQW1CO0FBQUE7QUFRNUMsdUNBQStCLE9BQU0sYUFBYTtBQUNoRCxjQUFJLHVCQUF1QixNQUFLO0FBR2hDLG9DQUEwQixPQUFNO0FBRWhDLGNBQUksWUFBWSxhQUFhLE9BQU0sVUFBUyxxQkFBcUIsZ0NBQWdDO0FBRWpHLGNBQUksY0FBYyxTQUFTO0FBRXpCLGdCQUFJLHlCQUF5QixNQUFNO0FBQ2pDLCtCQUFpQjtBQUFBO0FBR25CLGtCQUFLLGVBQWU7QUFDcEIsa0JBQUssbUJBQW1CO0FBQ3hCO0FBQUE7QUFJRixjQUFJLHNCQUFzQix1QkFBdUI7QUFFakQsY0FBSSwyQkFBMkIsTUFBSztBQUVwQyxjQUFJLDZCQUE2Qix1QkFHakMsQ0FBRyx3QkFBdUIsWUFBWSxRQUFRLHlCQUF5QixzQkFBc0I7QUFDM0Y7QUFJRSxrQkFBSSx3QkFBd0IsUUFBUSw2QkFBNkIsVUFBVTtBQUN6RSxzQkFBTTtBQUFBO0FBQUE7QUFLVjtBQUFBO0FBR0YsY0FBSSx3QkFBd0IsTUFBTTtBQUVoQyw2QkFBaUI7QUFBQTtBQUluQixjQUFJO0FBRUosY0FBSSx3QkFBd0IsVUFBVTtBQUdwQyxnQkFBSSxNQUFLLFFBQVEsWUFBWTtBQUMzQixrQkFBSyx1QkFBdUIscUJBQXFCLE1BQU07QUFDckQsdUNBQXVCLDBCQUEwQjtBQUFBO0FBR25ELHlDQUEyQixzQkFBc0IsS0FBSyxNQUFNO0FBQUEsbUJBQ3ZEO0FBQ0wsbUNBQXFCLHNCQUFzQixLQUFLLE1BQU07QUFBQTtBQUd4RDtBQUVFLGtCQUFLLHVCQUF1QixZQUFZLE1BQU07QUFJNUMsdUNBQXVCLFFBQVEsS0FBSztBQUFBLHFCQUMvQjtBQUNMLGtDQUFrQixXQUFZO0FBSzVCLHNCQUFJLHFCQUFxQixXQUFXO0FBR2xDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNUiw4QkFBa0I7QUFBQSxpQkFDYjtBQUNMLGdCQUFJO0FBRUosb0JBQVEscUJBQXFCO0FBQUEsbUJBQ3RCO0FBQ0gseUNBQXlCO0FBQ3pCO0FBQUEsbUJBRUc7QUFDSCx5Q0FBeUI7QUFDekI7QUFBQSxtQkFFRztBQUNILHlDQUF5QjtBQUN6QjtBQUFBLG1CQUVHO0FBQ0gseUNBQXlCO0FBQ3pCO0FBQUE7QUFHQSx5Q0FBeUI7QUFDekI7QUFBQTtBQUdKLDhCQUFrQixtQkFBbUIsd0JBQXdCLDRCQUE0QixLQUFLLE1BQU07QUFBQTtBQUd0RyxnQkFBSyxtQkFBbUI7QUFDeEIsZ0JBQUssZUFBZTtBQUFBO0FBS3RCLDZDQUFxQyxPQUFNLFlBQVk7QUFDckQ7QUFDRTtBQUFBO0FBS0YsNkJBQW1CO0FBQ25CLHVDQUE2QjtBQUU3QixjQUFLLG9CQUFvQixpQkFBZ0Isb0JBQW9CLFdBQVc7QUFDdEUsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFLbEIsY0FBSSx1QkFBdUIsTUFBSztBQUNoQyxjQUFJLHlCQUF5QjtBQUU3QixjQUFJLHdCQUF3QjtBQUcxQixnQkFBSSxNQUFLLGlCQUFpQixzQkFBc0I7QUFJOUMscUJBQU87QUFBQTtBQUFBO0FBTVgsY0FBSSxRQUFRLGFBQWEsT0FBTSxVQUFTLHFCQUFxQixnQ0FBZ0M7QUFFN0YsY0FBSSxVQUFVLFNBQVM7QUFFckIsbUJBQU87QUFBQTtBQVNULGNBQUksa0JBQWtCLENBQUMscUJBQXFCLE9BQU0sVUFBVSxDQUFDLG9CQUFvQixPQUFNLFVBQVksQ0FBQztBQUNwRyxjQUFJLGFBQWEsa0JBQWtCLHFCQUFxQixPQUFNLFNBQVMsZUFBZSxPQUFNO0FBRTVGLGNBQUksZUFBZSxnQkFBZ0I7QUFDakMsZ0JBQUksZUFBZSxhQUFhO0FBSzlCLGtCQUFJLGtCQUFrQixvQ0FBb0M7QUFFMUQsa0JBQUksb0JBQW9CLFNBQVM7QUFDL0Isd0JBQVE7QUFDUiw2QkFBYSwyQkFBMkIsT0FBTTtBQUFBO0FBQUE7QUFJbEQsZ0JBQUksZUFBZSxrQkFBa0I7QUFDbkMsa0JBQUksYUFBYTtBQUNqQixnQ0FBa0IsT0FBTTtBQUN4QixrQ0FBb0IsT0FBTTtBQUMxQixvQ0FBc0IsT0FBTTtBQUM1QixvQkFBTTtBQUFBO0FBR1IsZ0JBQUksZUFBZSxvQkFBb0I7QUFRckMsa0NBQW9CLE9BQU07QUFBQSxtQkFDckI7QUFPTCxrQkFBSSxzQkFBc0IsQ0FBQyxxQkFBcUIsT0FBTTtBQUN0RCxrQkFBSSxlQUFlLE1BQUssUUFBUTtBQUVoQyxrQkFBSSx1QkFBdUIsQ0FBQyxxQ0FBcUMsZUFBZTtBQUc5RSw2QkFBYSxlQUFlLE9BQU07QUFFbEMsb0JBQUksZUFBZSxhQUFhO0FBQzlCLHNCQUFJLG1CQUFtQixvQ0FBb0M7QUFFM0Qsc0JBQUkscUJBQXFCLFNBQVM7QUFDaEMsNEJBQVE7QUFDUixpQ0FBYSwyQkFBMkIsT0FBTTtBQUFBO0FBQUE7QUFLbEQsb0JBQUksZUFBZSxrQkFBa0I7QUFDbkMsc0JBQUksY0FBYztBQUNsQixvQ0FBa0IsT0FBTTtBQUN4QixzQ0FBb0IsT0FBTTtBQUMxQix3Q0FBc0IsT0FBTTtBQUM1Qix3QkFBTTtBQUFBO0FBQUE7QUFNVixvQkFBSyxlQUFlO0FBQ3BCLG9CQUFLLGdCQUFnQjtBQUNyQixxQ0FBdUIsT0FBTSxZQUFZO0FBQUE7QUFBQTtBQUk3QyxnQ0FBc0IsT0FBTTtBQUU1QixjQUFJLE1BQUssaUJBQWlCLHNCQUFzQjtBQUc5QyxtQkFBTyw0QkFBNEIsS0FBSyxNQUFNO0FBQUE7QUFHaEQsaUJBQU87QUFBQTtBQUdULDRDQUFvQyxPQUFNLGlCQUFpQjtBQUl6RCxjQUFJLHlCQUF5QjtBQUU3QixjQUFJLGlCQUFpQixRQUFPO0FBWTFCLGdCQUFJLHFCQUFxQixrQkFBa0IsT0FBTTtBQUNqRCwrQkFBbUIsU0FBUztBQUU1QjtBQUNFLHNDQUF3QixNQUFLO0FBQUE7QUFBQTtBQUlqQyxjQUFJLGFBQWEsZUFBZSxPQUFNO0FBRXRDLGNBQUksZUFBZSxhQUFhO0FBSzlCLGdCQUFJLDBCQUEwQjtBQUM5QixrREFBc0M7QUFHdEMsZ0JBQUksNEJBQTRCLE1BQU07QUFDcEMscUNBQXVCO0FBQUE7QUFBQTtBQUkzQixpQkFBTztBQUFBO0FBR1Qsd0NBQWdDLFFBQVE7QUFDdEMsY0FBSSx3Q0FBd0MsTUFBTTtBQUNoRCxrREFBc0M7QUFBQSxpQkFDakM7QUFDTCxnREFBb0MsS0FBSyxNQUFNLHFDQUFxQztBQUFBO0FBQUE7QUFJeEYsd0NBQWdDLE9BQU0sWUFBWSxPQUFPO0FBQ3ZELGtCQUFRO0FBQUEsaUJBQ0Q7QUFBQSxpQkFDQSxrQkFDSDtBQUNFLG9CQUFNLElBQUksTUFBTTtBQUFBO0FBQUEsaUJBTWYsYUFDSDtBQUdFLHlCQUFXLE9BQU0scUNBQXFDO0FBQ3REO0FBQUE7QUFBQSxpQkFHQyxlQUNIO0FBQ0Usa0NBQW9CLE9BQU07QUFHMUIsa0JBQUksb0JBQW9CLFVBQ3hCLENBQUMsa0NBQWtDO0FBR2pDLG9CQUFJLGlCQUFpQiwrQkFBK0IsdUJBQXVCO0FBRTNFLG9CQUFJLGlCQUFpQixJQUFJO0FBQ3ZCLHNCQUFJLFlBQVksYUFBYSxPQUFNO0FBRW5DLHNCQUFJLGNBQWMsU0FBUztBQUV6QjtBQUFBO0FBR0Ysc0JBQUksaUJBQWlCLE1BQUs7QUFFMUIsc0JBQUksQ0FBQyxnQkFBZ0IsZ0JBQWdCLFFBQVE7QUFLM0Msd0JBQUksWUFBWTtBQUNoQixtQ0FBZSxPQUFNO0FBQ3JCO0FBQUE7QUFNRix3QkFBSyxnQkFBZ0IsZ0JBQWdCLFdBQVcsS0FBSyxNQUFNLE9BQU0scUNBQXFDLDRCQUE0QjtBQUNsSTtBQUFBO0FBQUE7QUFLSix5QkFBVyxPQUFNLHFDQUFxQztBQUN0RDtBQUFBO0FBQUEsaUJBR0Msd0JBQ0g7QUFDRSxrQ0FBb0IsT0FBTTtBQUUxQixrQkFBSSx3QkFBd0IsUUFBUTtBQUlsQztBQUFBO0FBR0Ysa0JBQUksQ0FBQyxrQ0FBa0M7QUFPckMsb0JBQUksc0JBQXNCLHVCQUF1QixPQUFNO0FBQ3ZELG9CQUFJLGNBQWM7QUFDbEIsb0JBQUksZ0JBQWdCLFFBQVE7QUFFNUIsb0JBQUksa0JBQWtCLElBQUksaUJBQWlCO0FBRzNDLG9CQUFJLGtCQUFrQixJQUFJO0FBR3hCLHdCQUFLLGdCQUFnQixnQkFBZ0IsV0FBVyxLQUFLLE1BQU0sT0FBTSxxQ0FBcUMsNEJBQTRCO0FBQ2xJO0FBQUE7QUFBQTtBQUtKLHlCQUFXLE9BQU0scUNBQXFDO0FBQ3REO0FBQUE7QUFBQSxpQkFHQyxlQUNIO0FBRUUseUJBQVcsT0FBTSxxQ0FBcUM7QUFDdEQ7QUFBQTtBQUFBLHFCQUlGO0FBQ0Usb0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBS3hCLHNEQUE4QyxjQUFjO0FBSTFELGNBQUksT0FBTztBQUVYLGlCQUFPLE1BQU07QUFDWCxnQkFBSSxLQUFLLFFBQVEsa0JBQWtCO0FBQ2pDLGtCQUFJLGNBQWMsS0FBSztBQUV2QixrQkFBSSxnQkFBZ0IsTUFBTTtBQUN4QixvQkFBSSxTQUFTLFlBQVk7QUFFekIsb0JBQUksV0FBVyxNQUFNO0FBQ25CLDJCQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ3RDLHdCQUFJLFFBQVEsT0FBTztBQUNuQix3QkFBSSxjQUFjLE1BQU07QUFDeEIsd0JBQUksZ0JBQWdCLE1BQU07QUFFMUIsd0JBQUk7QUFDRiwwQkFBSSxDQUFDLFNBQVMsZUFBZSxnQkFBZ0I7QUFFM0MsK0JBQU87QUFBQTtBQUFBLDZCQUVGLFFBQVA7QUFHQSw2QkFBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPakIsZ0JBQUksUUFBUSxLQUFLO0FBRWpCLGdCQUFJLEtBQUssZUFBZSxvQkFBb0IsVUFBVSxNQUFNO0FBQzFELG9CQUFNLFNBQVM7QUFDZixxQkFBTztBQUNQO0FBQUE7QUFHRixnQkFBSSxTQUFTLGNBQWM7QUFDekIscUJBQU87QUFBQTtBQUdULG1CQUFPLEtBQUssWUFBWSxNQUFNO0FBQzVCLGtCQUFJLEtBQUssV0FBVyxRQUFRLEtBQUssV0FBVyxjQUFjO0FBQ3hELHVCQUFPO0FBQUE7QUFHVCxxQkFBTyxLQUFLO0FBQUE7QUFHZCxpQkFBSyxRQUFRLFNBQVMsS0FBSztBQUMzQixtQkFBTyxLQUFLO0FBQUE7QUFLZCxpQkFBTztBQUFBO0FBR1QscUNBQTZCLE9BQU0sZ0JBQWdCO0FBS2pELDJCQUFpQixZQUFZLGdCQUFnQjtBQUM3QywyQkFBaUIsWUFBWSxnQkFBZ0I7QUFDN0MsNEJBQWtCLE9BQU07QUFBQTtBQUsxQix1Q0FBK0IsT0FBTTtBQUNuQztBQUNFO0FBQUE7QUFHRixjQUFLLG9CQUFvQixpQkFBZ0Isb0JBQW9CLFdBQVc7QUFDdEUsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEI7QUFDQSxjQUFJLFFBQVEsYUFBYSxPQUFNO0FBRS9CLGNBQUksQ0FBQyxpQkFBaUIsT0FBTyxXQUFXO0FBRXRDLGtDQUFzQixPQUFNO0FBQzVCLG1CQUFPO0FBQUE7QUFHVCxjQUFJLGFBQWEsZUFBZSxPQUFNO0FBRXRDLGNBQUksTUFBSyxRQUFRLGNBQWMsZUFBZSxhQUFhO0FBS3pELGdCQUFJLGtCQUFrQixvQ0FBb0M7QUFFMUQsZ0JBQUksb0JBQW9CLFNBQVM7QUFDL0Isc0JBQVE7QUFDUiwyQkFBYSwyQkFBMkIsT0FBTTtBQUFBO0FBQUE7QUFJbEQsY0FBSSxlQUFlLGtCQUFrQjtBQUNuQyxnQkFBSSxhQUFhO0FBQ2pCLDhCQUFrQixPQUFNO0FBQ3hCLGdDQUFvQixPQUFNO0FBQzFCLGtDQUFzQixPQUFNO0FBQzVCLGtCQUFNO0FBQUE7QUFHUixjQUFJLGVBQWUsb0JBQW9CO0FBQ3JDLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBS2xCLGNBQUksZUFBZSxNQUFLLFFBQVE7QUFDaEMsZ0JBQUssZUFBZTtBQUNwQixnQkFBSyxnQkFBZ0I7QUFDckIscUJBQVcsT0FBTSxxQ0FBcUM7QUFHdEQsZ0NBQXNCLE9BQU07QUFDNUIsaUJBQU87QUFBQTtBQUdULDJCQUFtQixPQUFNLE9BQU87QUFDOUIsY0FBSSxVQUFVLFNBQVM7QUFDckIsOEJBQWtCLE9BQU0sV0FBVyxPQUFPO0FBQzFDLGtDQUFzQixPQUFNO0FBRTVCLGdCQUFLLG9CQUFvQixpQkFBZ0Isb0JBQW9CLFdBQVc7QUFDdEU7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlOLGtDQUEwQixJQUFJLEdBQUc7QUFDL0IsY0FBSSx1QkFBdUI7QUFDM0IsOEJBQW9CO0FBRXBCLGNBQUk7QUFDRixtQkFBTyxHQUFHO0FBQUEsb0JBQ1Y7QUFDQSwrQkFBbUI7QUFHbkIsZ0JBQUkscUJBQXFCLGFBQ3pCLENBQUcsdUJBQXVCLGtCQUFtQjtBQUMzQztBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSU4saUNBQXlCLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRztBQUN2QyxjQUFJLG1CQUFtQjtBQUN2QixjQUFJLGlCQUFpQiwwQkFBMEI7QUFFL0MsY0FBSTtBQUNGLHNDQUEwQixhQUFhO0FBQ3ZDLHFDQUF5QjtBQUN6QixtQkFBTyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQUEsb0JBQ25CO0FBQ0EscUNBQXlCO0FBQ3pCLHNDQUEwQixhQUFhO0FBRXZDLGdCQUFJLHFCQUFxQixXQUFXO0FBQ2xDO0FBQUE7QUFBQTtBQUFBO0FBT04sMkJBQW1CLElBQUk7QUFHckIsY0FBSSxrQ0FBa0MsUUFBUSw4QkFBOEIsUUFBUSxjQUFlLG9CQUFvQixpQkFBZ0Isb0JBQW9CLFdBQVc7QUFDcEs7QUFBQTtBQUdGLGNBQUksdUJBQXVCO0FBQzNCLDhCQUFvQjtBQUNwQixjQUFJLGlCQUFpQiwwQkFBMEI7QUFDL0MsY0FBSSxtQkFBbUI7QUFFdkIsY0FBSTtBQUNGLHNDQUEwQixhQUFhO0FBQ3ZDLHFDQUF5QjtBQUV6QixnQkFBSSxJQUFJO0FBQ04scUJBQU87QUFBQSxtQkFDRjtBQUNMLHFCQUFPO0FBQUE7QUFBQSxvQkFFVDtBQUNBLHFDQUF5QjtBQUN6QixzQ0FBMEIsYUFBYTtBQUN2QywrQkFBbUI7QUFJbkIsZ0JBQUssb0JBQW9CLGlCQUFnQixvQkFBb0IsV0FBVztBQUN0RTtBQUFBO0FBQUE7QUFBQTtBQUlOLHNDQUE4QjtBQUc1QixpQkFBUyxvQkFBb0IsaUJBQWdCLG9CQUFvQjtBQUFBO0FBRW5FLGlDQUF5QixPQUFPLE9BQU87QUFDckMsZUFBSywwQkFBMEIsb0JBQW9CO0FBQ25ELCtCQUFxQixXQUFXLG9CQUFvQjtBQUNwRCw0Q0FBa0MsV0FBVyxpQ0FBaUM7QUFBQTtBQUVoRixnQ0FBd0IsT0FBTztBQUM3QiwrQkFBcUIseUJBQXlCO0FBQzlDLGNBQUksMEJBQTBCO0FBQUE7QUFHaEMsbUNBQTJCLE9BQU0sT0FBTztBQUN0QyxnQkFBSyxlQUFlO0FBQ3BCLGdCQUFLLGdCQUFnQjtBQUNyQixjQUFJLGdCQUFnQixNQUFLO0FBRXpCLGNBQUksa0JBQWtCLFdBQVc7QUFHL0Isa0JBQUssZ0JBQWdCO0FBRXJCLDBCQUFjO0FBQUE7QUFHaEIsY0FBSSxtQkFBbUIsTUFBTTtBQUMzQixnQkFBSSxrQkFBa0IsZUFBZTtBQUVyQyxtQkFBTyxvQkFBb0IsTUFBTTtBQUMvQixrQkFBSSxXQUFVLGdCQUFnQjtBQUM5QixvQ0FBc0IsVUFBUztBQUMvQixnQ0FBa0IsZ0JBQWdCO0FBQUE7QUFBQTtBQUl0QywrQkFBcUI7QUFDckIsY0FBSSxxQkFBcUIscUJBQXFCLE1BQUssU0FBUztBQUM1RCwyQkFBaUI7QUFDakIsMENBQWdDLHFCQUFxQixrQ0FBa0M7QUFDdkYseUNBQStCO0FBQy9CLHlDQUErQjtBQUMvQiwyQ0FBaUM7QUFDakMsc0RBQTRDO0FBQzVDLDBDQUFnQztBQUNoQywrQ0FBcUM7QUFDckMsZ0RBQXNDO0FBQ3RDO0FBRUE7QUFDRSxvQ0FBd0I7QUFBQTtBQUcxQixpQkFBTztBQUFBO0FBR1QsNkJBQXFCLE9BQU0sYUFBYTtBQUN0QyxhQUFHO0FBQ0QsZ0JBQUksY0FBYztBQUVsQixnQkFBSTtBQUVGO0FBQ0E7QUFDQTtBQUdBLGtDQUFvQixVQUFVO0FBRTlCLGtCQUFJLGdCQUFnQixRQUFRLFlBQVksV0FBVyxNQUFNO0FBS3ZELCtDQUErQjtBQUMvQiwrQ0FBK0I7QUFPL0IsaUNBQWlCO0FBQ2pCO0FBQUE7QUFHRixrQkFBSSx1QkFBdUIsWUFBWSxPQUFPLGFBQWE7QUFJekQseURBQXlDLGFBQWE7QUFBQTtBQUd4RCxrQkFBSSwwQkFBMEI7QUFDNUI7QUFFQSxvQkFBSSxnQkFBZ0IsUUFBUSxPQUFPLGdCQUFnQixZQUFZLE9BQU8sWUFBWSxTQUFTLFlBQVk7QUFDckcsc0JBQUksV0FBVztBQUNmLHlDQUF1QixhQUFhLFVBQVU7QUFBQSx1QkFDekM7QUFDTCx1Q0FBcUIsYUFBYSxhQUFhO0FBQUE7QUFBQTtBQUluRCw2QkFBZSxPQUFNLFlBQVksUUFBUSxhQUFhLGFBQWE7QUFDbkUsaUNBQW1CO0FBQUEscUJBQ1osdUJBQVA7QUFFQSw0QkFBYztBQUVkLGtCQUFJLG1CQUFtQixlQUFlLGdCQUFnQixNQUFNO0FBRzFELDhCQUFjLFlBQVk7QUFDMUIsaUNBQWlCO0FBQUEscUJBQ1o7QUFDTCw4QkFBYztBQUFBO0FBR2hCO0FBQUE7QUFJRjtBQUFBLG1CQUNPO0FBQUE7QUFHWCxrQ0FBMEI7QUFDeEIsY0FBSSxpQkFBaUIseUJBQXlCO0FBQzlDLG1DQUF5QixVQUFVO0FBRW5DLGNBQUksbUJBQW1CLE1BQU07QUFJM0IsbUJBQU87QUFBQSxpQkFDRjtBQUNMLG1CQUFPO0FBQUE7QUFBQTtBQUlYLCtCQUF1QixnQkFBZ0I7QUFDckMsbUNBQXlCLFVBQVU7QUFBQTtBQUdyQyw0Q0FBb0M7QUFDbEMseUNBQStCO0FBQUE7QUFFakMsd0NBQWdDLE1BQU07QUFDcEMsMkNBQWlDLFdBQVcsTUFBTTtBQUFBO0FBRXBELG9DQUE0QjtBQUMxQixjQUFJLGlDQUFpQyxnQkFBZ0I7QUFDbkQsMkNBQStCO0FBQUE7QUFBQTtBQUduQyxtREFBMkM7QUFDekMsY0FBSSxpQ0FBaUMsa0JBQWtCLGlDQUFpQyxpQkFBaUIsaUNBQWlDLGFBQWE7QUFDckosMkNBQStCO0FBQUE7QUFLakMsY0FBSSx1QkFBdUIsUUFBUyxxQkFBb0IsbUNBQW1DLG9CQUFvQiw2Q0FBNkM7QUFRMUosZ0NBQW9CLG9CQUFvQjtBQUFBO0FBQUE7QUFHNUMsZ0NBQXdCLFFBQU87QUFDN0IsY0FBSSxpQ0FBaUMsd0JBQXdCO0FBQzNELDJDQUErQjtBQUFBO0FBR2pDLGNBQUksdUNBQXVDLE1BQU07QUFDL0MsaURBQXFDLENBQUM7QUFBQSxpQkFDakM7QUFDTCwrQ0FBbUMsS0FBSztBQUFBO0FBQUE7QUFLNUMsNENBQW9DO0FBR2xDLGlCQUFPLGlDQUFpQztBQUFBO0FBRzFDLGdDQUF3QixPQUFNLE9BQU87QUFDbkMsY0FBSSx1QkFBdUI7QUFDM0IsOEJBQW9CO0FBQ3BCLGNBQUksaUJBQWlCO0FBR3JCLGNBQUksdUJBQXVCLFNBQVEsa0NBQWtDLE9BQU87QUFDMUU7QUFDRSxrQkFBSSxtQkFBbUI7QUFDckIsb0JBQUksbUJBQW1CLE1BQUs7QUFFNUIsb0JBQUksaUJBQWlCLE9BQU8sR0FBRztBQUM3Qix5Q0FBdUIsT0FBTTtBQUM3QixtQ0FBaUI7QUFBQTtBQU9uQiw0Q0FBNEIsT0FBTTtBQUFBO0FBQUE7QUFJdEMsd0NBQTRCO0FBQzVCLDhCQUFrQixPQUFNO0FBQUE7QUFHMUI7QUFDRSw4QkFBa0I7QUFBQTtBQUdwQixhQUFHO0FBQ0QsZ0JBQUk7QUFDRjtBQUNBO0FBQUEscUJBQ08sYUFBUDtBQUNBLDBCQUFZLE9BQU07QUFBQTtBQUFBLG1CQUViO0FBRVQ7QUFDQSw2QkFBbUI7QUFDbkIsd0JBQWM7QUFFZCxjQUFJLG1CQUFtQixNQUFNO0FBRTNCLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCO0FBQ0U7QUFBQTtBQUlGLCtCQUFxQjtBQUNyQiwwQ0FBZ0M7QUFDaEMsaUJBQU87QUFBQTtBQU1ULGdDQUF3QjtBQUV0QixpQkFBTyxtQkFBbUIsTUFBTTtBQUM5Qiw4QkFBa0I7QUFBQTtBQUFBO0FBSXRCLHNDQUE4QixPQUFNLE9BQU87QUFDekMsY0FBSSx1QkFBdUI7QUFDM0IsOEJBQW9CO0FBQ3BCLGNBQUksaUJBQWlCO0FBR3JCLGNBQUksdUJBQXVCLFNBQVEsa0NBQWtDLE9BQU87QUFDMUU7QUFDRSxrQkFBSSxtQkFBbUI7QUFDckIsb0JBQUksbUJBQW1CLE1BQUs7QUFFNUIsb0JBQUksaUJBQWlCLE9BQU8sR0FBRztBQUM3Qix5Q0FBdUIsT0FBTTtBQUM3QixtQ0FBaUI7QUFBQTtBQU9uQiw0Q0FBNEIsT0FBTTtBQUFBO0FBQUE7QUFJdEMsd0NBQTRCO0FBQzVCO0FBQ0EsOEJBQWtCLE9BQU07QUFBQTtBQUcxQjtBQUNFLDhCQUFrQjtBQUFBO0FBR3BCLGFBQUc7QUFDRCxnQkFBSTtBQUNGO0FBQ0E7QUFBQSxxQkFDTyxhQUFQO0FBQ0EsMEJBQVksT0FBTTtBQUFBO0FBQUEsbUJBRWI7QUFFVDtBQUNBLHdCQUFjO0FBQ2QsNkJBQW1CO0FBR25CLGNBQUksbUJBQW1CLE1BQU07QUFFM0I7QUFDRTtBQUFBO0FBR0YsbUJBQU87QUFBQSxpQkFDRjtBQUVMO0FBQ0U7QUFBQTtBQUlGLGlDQUFxQjtBQUNyQiw0Q0FBZ0M7QUFFaEMsbUJBQU87QUFBQTtBQUFBO0FBTVgsc0NBQThCO0FBRTVCLGlCQUFPLG1CQUFtQixRQUFRLENBQUMsZUFBZTtBQUNoRCw4QkFBa0I7QUFBQTtBQUFBO0FBSXRCLG1DQUEyQixZQUFZO0FBSXJDLGNBQUksV0FBVSxXQUFXO0FBQ3pCLDBCQUFnQjtBQUNoQixjQUFJO0FBRUosY0FBTSxZQUFXLE9BQU8saUJBQWlCLFFBQVE7QUFDL0MsK0JBQW1CO0FBQ25CLG1CQUFPLFlBQVksVUFBUyxZQUFZO0FBQ3hDLHFEQUF5QyxZQUFZO0FBQUEsaUJBQ2hEO0FBQ0wsbUJBQU8sWUFBWSxVQUFTLFlBQVk7QUFBQTtBQUcxQztBQUNBLHFCQUFXLGdCQUFnQixXQUFXO0FBRXRDLGNBQUksU0FBUyxNQUFNO0FBRWpCLCtCQUFtQjtBQUFBLGlCQUNkO0FBQ0wsNkJBQWlCO0FBQUE7QUFHbkIsOEJBQW9CLFVBQVU7QUFBQTtBQUdoQyxvQ0FBNEIsWUFBWTtBQUd0QyxjQUFJLGdCQUFnQjtBQUVwQixhQUFHO0FBSUQsZ0JBQUksV0FBVSxjQUFjO0FBQzVCLGdCQUFJLGNBQWMsY0FBYztBQUVoQyxnQkFBSyxlQUFjLFFBQVEsZ0JBQWdCLFNBQVM7QUFDbEQsOEJBQWdCO0FBQ2hCLGtCQUFJLE9BQU87QUFFWCxrQkFBTSxlQUFjLE9BQU8saUJBQWlCLFFBQVE7QUFDbEQsdUJBQU8sYUFBYSxVQUFTLGVBQWU7QUFBQSxxQkFDdkM7QUFDTCxtQ0FBbUI7QUFDbkIsdUJBQU8sYUFBYSxVQUFTLGVBQWU7QUFFNUMseURBQXlDLGVBQWU7QUFBQTtBQUcxRDtBQUVBLGtCQUFJLFNBQVMsTUFBTTtBQUVqQixpQ0FBaUI7QUFDakI7QUFBQTtBQUFBLG1CQUVHO0FBSUwsa0JBQUksUUFBUSxXQUFXLFVBQVM7QUFHaEMsa0JBQUksVUFBVSxNQUFNO0FBS2xCLHNCQUFNLFNBQVM7QUFDZixpQ0FBaUI7QUFDakI7QUFBQTtBQUdGLGtCQUFNLGVBQWMsT0FBTyxpQkFBaUIsUUFBUTtBQUVsRCx5REFBeUMsZUFBZTtBQUV4RCxvQkFBSSxpQkFBaUIsY0FBYztBQUNuQyxvQkFBSSxRQUFRLGNBQWM7QUFFMUIsdUJBQU8sVUFBVSxNQUFNO0FBQ3JCLG9DQUFrQixNQUFNO0FBQ3hCLDBCQUFRLE1BQU07QUFBQTtBQUdoQiw4QkFBYyxpQkFBaUI7QUFBQTtBQUdqQyxrQkFBSSxnQkFBZ0IsTUFBTTtBQUV4Qiw0QkFBWSxTQUFTO0FBQ3JCLDRCQUFZLGVBQWU7QUFDM0IsNEJBQVksWUFBWTtBQUFBLHFCQUNuQjtBQUVMLCtDQUErQjtBQUMvQixpQ0FBaUI7QUFDakI7QUFBQTtBQUFBO0FBSUosZ0JBQUksZUFBZSxjQUFjO0FBRWpDLGdCQUFJLGlCQUFpQixNQUFNO0FBRXpCLCtCQUFpQjtBQUNqQjtBQUFBO0FBSUYsNEJBQWdCO0FBRWhCLDZCQUFpQjtBQUFBLG1CQUNWLGtCQUFrQjtBQUczQixjQUFJLGlDQUFpQyxnQkFBZ0I7QUFDbkQsMkNBQStCO0FBQUE7QUFBQTtBQUluQyw0QkFBb0IsT0FBTSxtQkFBbUIsYUFBYTtBQUd4RCxjQUFJLDZCQUE2QjtBQUNqQyxjQUFJLGlCQUFpQiwwQkFBMEI7QUFFL0MsY0FBSTtBQUNGLHNDQUEwQixhQUFhO0FBQ3ZDLHFDQUF5QjtBQUN6QiwyQkFBZSxPQUFNLG1CQUFtQixhQUFhO0FBQUEsb0JBQ3JEO0FBQ0Esc0NBQTBCLGFBQWE7QUFDdkMscUNBQXlCO0FBQUE7QUFHM0IsaUJBQU87QUFBQTtBQUdULGdDQUF3QixPQUFNLG1CQUFtQixhQUFhLHFCQUFxQjtBQUNqRixhQUFHO0FBT0Q7QUFBQSxtQkFDTyxrQ0FBa0M7QUFFM0M7QUFFQSxjQUFLLG9CQUFvQixpQkFBZ0Isb0JBQW9CLFdBQVc7QUFDdEUsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsY0FBSSxlQUFlLE1BQUs7QUFDeEIsY0FBSSxRQUFRLE1BQUs7QUFFakI7QUFDRSw4QkFBa0I7QUFBQTtBQUdwQixjQUFJLGlCQUFpQixNQUFNO0FBRXpCO0FBQ0U7QUFBQTtBQUdGLG1CQUFPO0FBQUEsaUJBQ0Y7QUFDTDtBQUNFLGtCQUFJLFVBQVUsU0FBUztBQUNyQixzQkFBTTtBQUFBO0FBQUE7QUFBQTtBQUtaLGdCQUFLLGVBQWU7QUFDcEIsZ0JBQUssZ0JBQWdCO0FBRXJCLGNBQUksaUJBQWlCLE1BQUssU0FBUztBQUNqQyxrQkFBTSxJQUFJLE1BQU07QUFBQTtBQUtsQixnQkFBSyxlQUFlO0FBQ3BCLGdCQUFLLG1CQUFtQjtBQUd4QixjQUFJLGlCQUFpQixXQUFXLGFBQWEsT0FBTyxhQUFhO0FBQ2pFLDJCQUFpQixPQUFNO0FBRXZCLGNBQUksVUFBUyxvQkFBb0I7QUFFL0IsaUNBQXFCO0FBQ3JCLDZCQUFpQjtBQUNqQiw0Q0FBZ0M7QUFBQTtBQVFsQyxjQUFLLGNBQWEsZUFBZSxpQkFBaUIsV0FBWSxjQUFhLFFBQVEsaUJBQWlCLFNBQVM7QUFDM0csZ0JBQUksQ0FBQyw0QkFBNEI7QUFDL0IsMkNBQTZCO0FBTzdCLDBDQUE0QjtBQUM1QixpQ0FBbUIsZ0JBQWdCLFdBQVk7QUFDN0M7QUFJQSx1QkFBTztBQUFBO0FBQUE7QUFBQTtBQVViLGNBQUksb0JBQXFCLGNBQWEsZUFBZ0Isc0JBQXFCLGVBQWUsYUFBYSxrQkFBa0I7QUFDekgsY0FBSSxnQkFBaUIsY0FBYSxRQUFTLHNCQUFxQixlQUFlLGFBQWEsa0JBQWtCO0FBRTlHLGNBQUkscUJBQXFCLGVBQWU7QUFDdEMsZ0JBQUksaUJBQWlCLDBCQUEwQjtBQUMvQyxzQ0FBMEIsYUFBYTtBQUN2QyxnQkFBSSxtQkFBbUI7QUFDdkIscUNBQXlCO0FBQ3pCLGdCQUFJLHVCQUF1QjtBQUMzQixnQ0FBb0I7QUFFcEIsZ0NBQW9CLFVBQVU7QUFPOUIsZ0JBQUkscUNBQW9DLDRCQUE0QixPQUFNO0FBRTFFO0FBR0U7QUFBQTtBQUlGLGtDQUFzQixPQUFNLGNBQWM7QUFFMUMsNkJBQWlCLE1BQUs7QUFLdEIsa0JBQUssVUFBVTtBQUVmO0FBQ0UsdUNBQXlCO0FBQUE7QUFHM0IsZ0NBQW9CLGNBQWMsT0FBTTtBQUV4QztBQUNFO0FBQUE7QUFLRjtBQUNBLCtCQUFtQjtBQUVuQixxQ0FBeUI7QUFDekIsc0NBQTBCLGFBQWE7QUFBQSxpQkFDbEM7QUFFTCxrQkFBSyxVQUFVO0FBSWY7QUFDRTtBQUFBO0FBQUE7QUFJSixjQUFJLDRCQUE0QjtBQUVoQyxjQUFJLDRCQUE0QjtBQUc5Qix5Q0FBNkI7QUFDN0IsNENBQWdDO0FBQ2hDLHlDQUE2QjtBQUFBLGlCQUN4QjtBQUVMO0FBQ0UseUNBQTJCO0FBQzNCLDZDQUErQjtBQUFBO0FBQUE7QUFLbkMsMkJBQWlCLE1BQUs7QUFXdEIsY0FBSSxtQkFBbUIsU0FBUztBQUc5QixxREFBeUM7QUFBQTtBQUczQztBQUNFLGdCQUFJLENBQUMsMkJBQTJCO0FBQzlCLDZDQUErQixNQUFLLFNBQVM7QUFBQTtBQUFBO0FBSWpELHVCQUFhLGFBQWEsV0FBVztBQUVyQztBQUNFLGdCQUFJLG1CQUFtQjtBQUNyQixvQkFBSyxpQkFBaUI7QUFBQTtBQUFBO0FBSTFCO0FBQ0U7QUFBQTtBQUtGLGdDQUFzQixPQUFNO0FBRTVCLGNBQUksc0JBQXNCLE1BQU07QUFHOUIsZ0JBQUkscUJBQXFCLE1BQUs7QUFFOUIscUJBQVMsSUFBSSxHQUFHLElBQUksa0JBQWtCLFFBQVEsS0FBSztBQUNqRCxrQkFBSSxtQkFBbUIsa0JBQWtCO0FBQ3pDLGlDQUFtQjtBQUFBO0FBQUE7QUFJdkIsY0FBSSxrQkFBa0I7QUFDcEIsK0JBQW1CO0FBQ25CLGdCQUFJLFVBQVU7QUFDZCxpQ0FBcUI7QUFDckIsa0JBQU07QUFBQTtBQVdSLGNBQUksaUJBQWlCLDRCQUE0QixhQUFhLE1BQUssUUFBUSxZQUFZO0FBQ3JGO0FBQUE7QUFJRiwyQkFBaUIsTUFBSztBQUV0QixjQUFJLGlCQUFpQixnQkFBZ0IsV0FBVztBQUM5QztBQUNFO0FBQUE7QUFLRixnQkFBSSxVQUFTLHVCQUF1QjtBQUNsQztBQUFBLG1CQUNLO0FBQ0wsa0NBQW9CO0FBQ3BCLHNDQUF3QjtBQUFBO0FBQUEsaUJBRXJCO0FBQ0wsZ0NBQW9CO0FBQUE7QUFJdEI7QUFFQTtBQUNFO0FBQUE7QUFHRixpQkFBTztBQUFBO0FBR1QsdUNBQStCO0FBTzdCLGNBQUksa0NBQWtDLE1BQU07QUFDMUMsZ0JBQUksaUJBQWlCLHFCQUFxQjtBQUMxQyxnQkFBSSxXQUFXLG1CQUFtQixzQkFBc0I7QUFDeEQsZ0JBQUksaUJBQWlCLDBCQUEwQjtBQUMvQyxnQkFBSSxtQkFBbUI7QUFFdkIsZ0JBQUk7QUFDRix3Q0FBMEIsYUFBYTtBQUN2Qyx1Q0FBeUI7QUFDekIscUJBQU87QUFBQSxzQkFDUDtBQUNBLHVDQUF5QjtBQUN6Qix3Q0FBMEIsYUFBYTtBQUFBO0FBQUE7QUFJM0MsaUJBQU87QUFBQTtBQUVULHFEQUE2QyxPQUFPO0FBQ2xEO0FBQ0UsMENBQThCLEtBQUs7QUFFbkMsZ0JBQUksQ0FBQyw0QkFBNEI7QUFDL0IsMkNBQTZCO0FBQzdCLGlDQUFtQixnQkFBZ0IsV0FBWTtBQUM3QztBQUNBLHVCQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNZiwyQ0FBbUM7QUFDakMsY0FBSSxrQ0FBa0MsTUFBTTtBQUMxQyxtQkFBTztBQUFBO0FBSVQsY0FBSSxjQUFjO0FBQ2xCLHNDQUE0QjtBQUM1QixjQUFJLFFBQU87QUFDWCxjQUFJLFFBQVE7QUFDWiwwQ0FBZ0M7QUFJaEMsdUNBQTZCO0FBRTdCLGNBQUssb0JBQW9CLGlCQUFnQixvQkFBb0IsV0FBVztBQUN0RSxrQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQjtBQUNFLHVDQUEyQjtBQUMzQixvREFBd0M7QUFBQTtBQUcxQztBQUNFLHNDQUEwQjtBQUFBO0FBRzVCLGNBQUksdUJBQXVCO0FBQzNCLDhCQUFvQjtBQUNwQixzQ0FBNEIsTUFBSztBQUNqQyxvQ0FBMEIsT0FBTSxNQUFLLFNBQVMsT0FBTztBQUVyRDtBQUNFLGdCQUFJLGtCQUFrQjtBQUN0Qiw0Q0FBZ0M7QUFFaEMscUJBQVMsSUFBSSxHQUFHLElBQUksZ0JBQWdCLFFBQVEsS0FBSztBQUMvQyxrQkFBSSxTQUFTLGdCQUFnQjtBQUM3QiwyQ0FBNkIsT0FBTTtBQUFBO0FBQUE7QUFJdkM7QUFDRTtBQUFBO0FBR0Y7QUFDRSwyQ0FBK0IsTUFBSyxTQUFTO0FBQUE7QUFHL0MsNkJBQW1CO0FBQ25CO0FBRUE7QUFHRSxnQkFBSSx1Q0FBdUM7QUFDekMsa0JBQUksVUFBUyw4QkFBOEI7QUFDekM7QUFBQSxxQkFDSztBQUNMLDJDQUEyQjtBQUMzQiwrQ0FBK0I7QUFBQTtBQUFBLG1CQUU1QjtBQUNMLHlDQUEyQjtBQUFBO0FBRzdCLHVDQUEyQjtBQUMzQixvREFBd0M7QUFBQTtBQUkxQywyQkFBaUI7QUFFakI7QUFDRSxnQkFBSSxZQUFZLE1BQUssUUFBUTtBQUM3QixzQkFBVSxpQkFBaUI7QUFDM0Isc0JBQVUsd0JBQXdCO0FBQUE7QUFHcEMsaUJBQU87QUFBQTtBQUdULG9EQUE0QyxVQUFVO0FBQ3BELGlCQUFPLDJDQUEyQyxRQUFRLHVDQUF1QyxJQUFJO0FBQUE7QUFFdkcsaURBQXlDLFVBQVU7QUFDakQsY0FBSSwyQ0FBMkMsTUFBTTtBQUNuRCxxREFBeUMsSUFBSSxJQUFJLENBQUM7QUFBQSxpQkFDN0M7QUFDTCxtREFBdUMsSUFBSTtBQUFBO0FBQUE7QUFJL0MsNkNBQXFDLFFBQU87QUFDMUMsY0FBSSxDQUFDLGtCQUFrQjtBQUNyQiwrQkFBbUI7QUFDbkIsaUNBQXFCO0FBQUE7QUFBQTtBQUl6QixZQUFJLGtCQUFrQjtBQUV0QiwrQ0FBdUMsV0FBVyxhQUFhLFFBQU87QUFDcEUsY0FBSSxZQUFZLG9CQUFvQixRQUFPO0FBQzNDLGNBQUksU0FBUyxzQkFBc0IsV0FBVyxXQUFXO0FBQ3pELHdCQUFjLFdBQVc7QUFDekIsY0FBSSxZQUFZO0FBQ2hCLGNBQUksUUFBTyw4QkFBOEIsV0FBVztBQUVwRCxjQUFJLFVBQVMsTUFBTTtBQUNqQiw0QkFBZ0IsT0FBTSxVQUFVO0FBQ2hDLGtDQUFzQixPQUFNO0FBQUE7QUFBQTtBQUloQyx5Q0FBaUMsYUFBYSx3QkFBd0IsU0FBUztBQUM3RTtBQUNFLHFDQUF5QjtBQUN6Qix3Q0FBNEI7QUFBQTtBQUc5QixjQUFJLFlBQVksUUFBUSxVQUFVO0FBR2hDLDBDQUE4QixhQUFhLGFBQWE7QUFDeEQ7QUFBQTtBQUdGLGNBQUksUUFBUTtBQUVaO0FBQ0Usb0JBQVE7QUFBQTtBQUdWLGlCQUFPLFVBQVUsTUFBTTtBQUNyQixnQkFBSSxNQUFNLFFBQVEsVUFBVTtBQUMxQiw0Q0FBOEIsT0FBTyxhQUFhO0FBQ2xEO0FBQUEsdUJBQ1MsTUFBTSxRQUFRLGdCQUFnQjtBQUN2QyxrQkFBSSxPQUFPLE1BQU07QUFDakIsa0JBQUksV0FBVyxNQUFNO0FBRXJCLGtCQUFJLE9BQU8sS0FBSyw2QkFBNkIsY0FBYyxPQUFPLFNBQVMsc0JBQXNCLGNBQWMsQ0FBQyxtQ0FBbUMsV0FBVztBQUM1SixvQkFBSSxZQUFZLG9CQUFvQixTQUFTO0FBQzdDLG9CQUFJLFNBQVMsdUJBQXVCLE9BQU8sV0FBVztBQUN0RCw4QkFBYyxPQUFPO0FBQ3JCLG9CQUFJLFlBQVk7QUFDaEIsb0JBQUksUUFBTyw4QkFBOEIsT0FBTztBQUVoRCxvQkFBSSxVQUFTLE1BQU07QUFDakIsa0NBQWdCLE9BQU0sVUFBVTtBQUNoQyx3Q0FBc0IsT0FBTTtBQUFBO0FBRzlCO0FBQUE7QUFBQTtBQUlKLG9CQUFRLE1BQU07QUFBQTtBQUdoQjtBQU1FLGtCQUFNLHdSQUE0UztBQUFBO0FBQUE7QUFHdFQsbUNBQTJCLE9BQU0sVUFBVSxhQUFhO0FBQ3RELGNBQUksWUFBWSxNQUFLO0FBRXJCLGNBQUksY0FBYyxNQUFNO0FBR3RCLHNCQUFVLE9BQU87QUFBQTtBQUduQixjQUFJLFlBQVk7QUFDaEIseUJBQWUsT0FBTTtBQUNyQix1REFBNkM7QUFFN0MsY0FBSSx1QkFBdUIsU0FBUSxnQkFBZ0IsK0JBQStCLGNBQWM7QUFROUYsZ0JBQUksaUNBQWlDLDBCQUEwQixpQ0FBaUMsaUJBQWlCLG9CQUFvQixrQ0FBa0MsUUFBUSwrQkFBK0Isc0JBQXNCO0FBRWxPLGdDQUFrQixPQUFNO0FBQUEsbUJBQ25CO0FBR0wsOENBQWdDLFdBQVcsK0JBQStCO0FBQUE7QUFBQTtBQUk5RSxnQ0FBc0IsT0FBTTtBQUFBO0FBRzlCLHVDQUErQixlQUFlLFdBQVc7QUFLdkQsY0FBSSxjQUFjLFFBQVE7QUFHeEIsd0JBQVksaUJBQWlCO0FBQUE7QUFJL0IsY0FBSSxZQUFZO0FBQ2hCLGNBQUksUUFBTyw4QkFBOEIsZUFBZTtBQUV4RCxjQUFJLFVBQVMsTUFBTTtBQUNqQiw0QkFBZ0IsT0FBTSxXQUFXO0FBQ2pDLGtDQUFzQixPQUFNO0FBQUE7QUFBQTtBQUloQyxpREFBeUMsZUFBZTtBQUN0RCxjQUFJLGdCQUFnQixjQUFjO0FBQ2xDLGNBQUksWUFBWTtBQUVoQixjQUFJLGtCQUFrQixNQUFNO0FBQzFCLHdCQUFZLGNBQWM7QUFBQTtBQUc1QixnQ0FBc0IsZUFBZTtBQUFBO0FBRXZDLHNDQUE4QixlQUFlLFVBQVU7QUFDckQsY0FBSSxZQUFZO0FBRWhCLGNBQUk7QUFFSixrQkFBUSxjQUFjO0FBQUEsaUJBQ2Y7QUFDSCwyQkFBYSxjQUFjO0FBQzNCLGtCQUFJLGdCQUFnQixjQUFjO0FBRWxDLGtCQUFJLGtCQUFrQixNQUFNO0FBQzFCLDRCQUFZLGNBQWM7QUFBQTtBQUc1QjtBQUFBLGlCQUVHO0FBQ0gsMkJBQWEsY0FBYztBQUMzQjtBQUFBO0FBR0Esb0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHcEIsY0FBSSxlQUFlLE1BQU07QUFHdkIsdUJBQVcsT0FBTztBQUFBO0FBR3BCLGdDQUFzQixlQUFlO0FBQUE7QUFXdkMscUJBQWEsYUFBYTtBQUN4QixpQkFBTyxjQUFjLE1BQU0sTUFBTSxjQUFjLE1BQU0sTUFBTSxjQUFjLE9BQU8sT0FBTyxjQUFjLE9BQU8sT0FBTyxjQUFjLE1BQU8sTUFBTyxjQUFjLE9BQU8sT0FBTyxLQUFLLGNBQWMsUUFBUTtBQUFBO0FBR3hNLHlDQUFpQztBQUMvQixjQUFJLG9CQUFvQixxQkFBcUI7QUFDM0MsZ0NBQW9CO0FBQ3BCLG9DQUF3QjtBQUN4QixrQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQjtBQUNFLGdCQUFJLDJCQUEyQiw2QkFBNkI7QUFDMUQseUNBQTJCO0FBQzNCLDZDQUErQjtBQUUvQixvQkFBTTtBQUFBO0FBQUE7QUFBQTtBQUtaLDJEQUFtRDtBQUNqRDtBQUNFLG9DQUF3QjtBQUV4QjtBQUNFLHNDQUF3QjtBQUFBO0FBQUE7QUFBQTtBQUs5QixnREFBd0MsT0FBTyxtQkFBbUI7QUFDaEU7QUFJRSw0QkFBZ0I7QUFDaEIsK0JBQW1CLE9BQU8sZ0JBQWdCO0FBRTFDLGdCQUFJLG1CQUFtQjtBQUNyQixpQ0FBbUIsT0FBTyxpQkFBaUI7QUFBQTtBQUc3QywrQkFBbUIsT0FBTyxnQkFBZ0I7QUFFMUMsZ0JBQUksbUJBQW1CO0FBQ3JCLGlDQUFtQixPQUFPLGlCQUFpQjtBQUFBO0FBRzdDO0FBQUE7QUFBQTtBQUlKLG9DQUE0QixZQUFZLFlBQVksZ0JBQWdCO0FBQ2xFO0FBR0UsZ0JBQUksV0FBVTtBQUNkLGdCQUFJLGNBQWM7QUFFbEIsbUJBQU8sYUFBWSxNQUFNO0FBQ3ZCLGtCQUFJLHFCQUFxQixTQUFRLGVBQWU7QUFFaEQsa0JBQUksYUFBWSxlQUFlLFNBQVEsVUFBVSxRQUFRLHVCQUF1QixTQUFTO0FBQ3ZGLDJCQUFVLFNBQVE7QUFBQSxxQkFDYjtBQUNMLG9CQUFLLFVBQVEsUUFBUSxnQkFBZ0IsU0FBUztBQUM1QyxpQ0FBZTtBQUFBO0FBR2pCLG9CQUFJLFNBQVEsWUFBWSxNQUFNO0FBQzVCLDZCQUFVLFNBQVE7QUFBQSx1QkFDYjtBQUNMLDZCQUFVLGNBQWMsU0FBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFPMUMsWUFBSSw4Q0FBOEM7QUFFbEQsMERBQWtELE9BQU87QUFDdkQ7QUFDRSxnQkFBSyxvQkFBbUIsbUJBQW1CLFdBQVc7QUFFcEQ7QUFBQTtBQUdGLGdCQUFJLENBQUUsT0FBTSxPQUFPLGlCQUFpQjtBQUNsQztBQUFBO0FBR0YsZ0JBQUksTUFBTSxNQUFNO0FBRWhCLGdCQUFJLFFBQVEsMEJBQTBCLFFBQVEsWUFBWSxRQUFRLGtCQUFrQixRQUFRLHFCQUFxQixRQUFRLGNBQWMsUUFBUSxpQkFBaUIsUUFBUSxxQkFBcUI7QUFFM0w7QUFBQTtBQUtGLGdCQUFJLGdCQUFnQiwwQkFBMEIsVUFBVTtBQUV4RCxnQkFBSSxnREFBZ0QsTUFBTTtBQUN4RCxrQkFBSSw0Q0FBNEMsSUFBSSxnQkFBZ0I7QUFDbEU7QUFBQTtBQUdGLDBEQUE0QyxJQUFJO0FBQUEsbUJBQzNDO0FBQ0wsNERBQThDLElBQUksSUFBSSxDQUFDO0FBQUE7QUFHekQsZ0JBQUksZ0JBQWdCO0FBRXBCLGdCQUFJO0FBQ0YsOEJBQWdCO0FBRWhCLG9CQUFNO0FBQUEsc0JBQ047QUFDQSxrQkFBSSxlQUFlO0FBQ2pCLGdDQUFnQjtBQUFBLHFCQUNYO0FBQ0w7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1SLFlBQUk7QUFFSjtBQUNFLGNBQUksYUFBYTtBQUVqQix3QkFBYyxTQUFVLFVBQVMsWUFBWSxPQUFPO0FBTWxELGdCQUFJLDZCQUE2QiwyQkFBMkIsWUFBWTtBQUV4RSxnQkFBSTtBQUNGLHFCQUFPLFVBQVUsVUFBUyxZQUFZO0FBQUEscUJBQy9CLGVBQVA7QUFDQSxrQkFBSSxrQkFBa0IsUUFBUSxPQUFPLGtCQUFrQixZQUFZLE9BQU8sY0FBYyxTQUFTLFlBQVk7QUFFM0csc0JBQU07QUFBQTtBQUtSO0FBQ0E7QUFJQSxvQ0FBc0IsVUFBUztBQUUvQix5Q0FBMkIsWUFBWTtBQUV2QyxrQkFBSyxXQUFXLE9BQU8sYUFBYTtBQUVsQyxtQ0FBbUI7QUFBQTtBQUlyQixvQ0FBc0IsTUFBTSxXQUFXLE1BQU0sVUFBUyxZQUFZO0FBRWxFLGtCQUFJLGtCQUFrQjtBQUNwQixvQkFBSSxjQUFjO0FBRWxCLG9CQUFJLE9BQU8sZ0JBQWdCLFlBQVksZ0JBQWdCLFFBQVEsWUFBWSxvQkFBb0IsT0FBTyxrQkFBa0IsWUFBWSxrQkFBa0IsUUFBUSxDQUFDLGNBQWMsa0JBQWtCO0FBRTdMLGdDQUFjLG1CQUFtQjtBQUFBO0FBQUE7QUFNckMsb0JBQU07QUFBQTtBQUFBO0FBQUE7QUFLWixZQUFJLDZCQUE2QjtBQUNqQyxZQUFJO0FBRUo7QUFDRSwwREFBZ0QsSUFBSTtBQUFBO0FBR3RELGtEQUEwQyxPQUFPO0FBQy9DO0FBQ0UsZ0JBQUksZUFBZSxDQUFDLDhDQUE4QztBQUNoRSxzQkFBUSxNQUFNO0FBQUEscUJBQ1A7QUFBQSxxQkFDQTtBQUFBLHFCQUNBLHFCQUNIO0FBQ0Usc0JBQUkseUJBQXlCLGtCQUFrQiwwQkFBMEIsbUJBQW1CO0FBRTVGLHNCQUFJLFlBQVk7QUFFaEIsc0JBQUksQ0FBQyw4Q0FBOEMsSUFBSSxZQUFZO0FBQ2pFLGtFQUE4QyxJQUFJO0FBQ2xELHdCQUFJLHdCQUF3QiwwQkFBMEIsVUFBVTtBQUVoRSwwQkFBTSxvTkFBOE4sdUJBQXVCLHdCQUF3QjtBQUFBO0FBR3JSO0FBQUE7QUFBQSxxQkFHQyxnQkFDSDtBQUNFLHNCQUFJLENBQUMsNEJBQTRCO0FBQy9CLDBCQUFNO0FBRU4saURBQTZCO0FBQUE7QUFHL0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT1osd0NBQWdDLE9BQU0sT0FBTztBQUMzQztBQUNFLGdCQUFJLG1CQUFtQjtBQUNyQixrQkFBSSxtQkFBbUIsTUFBSztBQUM1QiwrQkFBaUIsUUFBUSxTQUFVLGlCQUFpQjtBQUNsRCxtQ0FBbUIsT0FBTSxpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9sRCxZQUFJLHNCQUFzQjtBQUUxQixvQ0FBNEIsZUFBZSxVQUFVO0FBQ25EO0FBR0UsZ0JBQUksV0FBVyx1QkFBdUI7QUFFdEMsZ0JBQUksYUFBYSxNQUFNO0FBQ3JCLHVCQUFTLEtBQUs7QUFDZCxxQkFBTztBQUFBLG1CQUNGO0FBQ0wscUJBQU8saUJBQWlCLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFLN0Msa0NBQTBCLGNBQWM7QUFDdEMsY0FBSyxpQkFBaUIscUJBQXFCO0FBQ3pDO0FBQUE7QUFJRixpQkFBTyxlQUFlO0FBQUE7QUFHeEIsa0RBQTBDO0FBRXhDLGlCQUFRLHVCQUF1QixZQUFZO0FBQUE7QUFHN0MsbURBQTJDLE9BQU87QUFDaEQ7QUFDRSxnQkFBSSxNQUFNLE9BQU8sZ0JBQWdCO0FBQy9CLGtCQUFJLENBQUMsOEJBQThCO0FBRWpDO0FBQUE7QUFBQSxtQkFFRztBQUVMLGtCQUFJLENBQUMsMEJBQTBCO0FBRTdCO0FBQUE7QUFHRixrQkFBSSxxQkFBcUIsV0FBVztBQUdsQztBQUFBO0FBR0Ysa0JBQUksTUFBTSxRQUFRLHFCQUFxQixNQUFNLFFBQVEsY0FBYyxNQUFNLFFBQVEscUJBQXFCO0FBR3BHO0FBQUE7QUFBQTtBQUlKLGdCQUFJLHVCQUF1QixZQUFZLE1BQU07QUFDM0Msa0JBQUksZ0JBQWdCO0FBRXBCLGtCQUFJO0FBQ0YsZ0NBQWdCO0FBRWhCLHNCQUFNLDJYQUF3YSwwQkFBMEI7QUFBQSx3QkFDeGM7QUFDQSxvQkFBSSxlQUFlO0FBQ2pCLGtDQUFnQjtBQUFBLHVCQUNYO0FBQ0w7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT1YsOERBQXNELE9BQU07QUFDMUQ7QUFDRSxnQkFBSSxNQUFLLFFBQVEsY0FBYyxnQ0FBZ0MsdUJBQXVCLFlBQVksTUFBTTtBQUN0RyxvQkFBTTtBQUFBO0FBQUE7QUFBQTtBQUtaLDZDQUFxQyxXQUFXO0FBQzlDO0FBQ0UsdUNBQTJCO0FBQUE7QUFBQTtBQUsvQixZQUFJLGdCQUFnQjtBQUVwQixZQUFJLG1CQUFtQjtBQUN2QixZQUFJLG9CQUFvQixTQUFVLFNBQVM7QUFDekM7QUFDRSw0QkFBZ0I7QUFBQTtBQUFBO0FBR3BCLGdEQUF3QyxNQUFNO0FBQzVDO0FBQ0UsZ0JBQUksa0JBQWtCLE1BQU07QUFFMUIscUJBQU87QUFBQTtBQUdULGdCQUFJLFNBQVMsY0FBYztBQUUzQixnQkFBSSxXQUFXLFFBQVc7QUFDeEIscUJBQU87QUFBQTtBQUlULG1CQUFPLE9BQU87QUFBQTtBQUFBO0FBR2xCLDZDQUFxQyxNQUFNO0FBRXpDLGlCQUFPLCtCQUErQjtBQUFBO0FBRXhDLGtEQUEwQyxNQUFNO0FBQzlDO0FBQ0UsZ0JBQUksa0JBQWtCLE1BQU07QUFFMUIscUJBQU87QUFBQTtBQUdULGdCQUFJLFNBQVMsY0FBYztBQUUzQixnQkFBSSxXQUFXLFFBQVc7QUFFeEIsa0JBQUksU0FBUyxRQUFRLFNBQVMsVUFBYSxPQUFPLEtBQUssV0FBVyxZQUFZO0FBSTVFLG9CQUFJLGdCQUFnQiwrQkFBK0IsS0FBSztBQUV4RCxvQkFBSSxLQUFLLFdBQVcsZUFBZTtBQUNqQyxzQkFBSSxnQkFBZ0I7QUFBQSxvQkFDbEIsVUFBVTtBQUFBLG9CQUNWLFFBQVE7QUFBQTtBQUdWLHNCQUFJLEtBQUssZ0JBQWdCLFFBQVc7QUFDbEMsa0NBQWMsY0FBYyxLQUFLO0FBQUE7QUFHbkMseUJBQU87QUFBQTtBQUFBO0FBSVgscUJBQU87QUFBQTtBQUlULG1CQUFPLE9BQU87QUFBQTtBQUFBO0FBR2xCLG1EQUEyQyxPQUFPLFNBQVM7QUFDekQ7QUFDRSxnQkFBSSxrQkFBa0IsTUFBTTtBQUUxQixxQkFBTztBQUFBO0FBR1QsZ0JBQUksV0FBVyxNQUFNO0FBQ3JCLGdCQUFJLFdBQVcsUUFBUTtBQUV2QixnQkFBSSx1QkFBdUI7QUFDM0IsZ0JBQUksbUJBQW1CLE9BQU8sYUFBYSxZQUFZLGFBQWEsT0FBTyxTQUFTLFdBQVc7QUFFL0Ysb0JBQVEsTUFBTTtBQUFBLG1CQUNQLGdCQUNIO0FBQ0Usb0JBQUksT0FBTyxhQUFhLFlBQVk7QUFDbEMseUNBQXVCO0FBQUE7QUFHekI7QUFBQTtBQUFBLG1CQUdDLG1CQUNIO0FBQ0Usb0JBQUksT0FBTyxhQUFhLFlBQVk7QUFDbEMseUNBQXVCO0FBQUEsMkJBQ2QscUJBQXFCLGlCQUFpQjtBQUsvQyx5Q0FBdUI7QUFBQTtBQUd6QjtBQUFBO0FBQUEsbUJBR0MsWUFDSDtBQUNFLG9CQUFJLHFCQUFxQix3QkFBd0I7QUFDL0MseUNBQXVCO0FBQUEsMkJBQ2QscUJBQXFCLGlCQUFpQjtBQUMvQyx5Q0FBdUI7QUFBQTtBQUd6QjtBQUFBO0FBQUEsbUJBR0M7QUFBQSxtQkFDQSxxQkFDSDtBQUNFLG9CQUFJLHFCQUFxQixpQkFBaUI7QUFHeEMseUNBQXVCO0FBQUEsMkJBQ2QscUJBQXFCLGlCQUFpQjtBQUMvQyx5Q0FBdUI7QUFBQTtBQUd6QjtBQUFBO0FBQUE7QUFJRix1QkFBTztBQUFBO0FBSVgsZ0JBQUksc0JBQXNCO0FBTXhCLGtCQUFJLGFBQWEsY0FBYztBQUUvQixrQkFBSSxlQUFlLFVBQWEsZUFBZSxjQUFjLFdBQVc7QUFDdEUsdUJBQU87QUFBQTtBQUFBO0FBSVgsbUJBQU87QUFBQTtBQUFBO0FBR1gsd0RBQWdELE9BQU87QUFDckQ7QUFDRSxnQkFBSSxrQkFBa0IsTUFBTTtBQUUxQjtBQUFBO0FBR0YsZ0JBQUksT0FBTyxZQUFZLFlBQVk7QUFDakM7QUFBQTtBQUdGLGdCQUFJLHFCQUFxQixNQUFNO0FBQzdCLGlDQUFtQixJQUFJO0FBQUE7QUFHekIsNkJBQWlCLElBQUk7QUFBQTtBQUFBO0FBR3pCLFlBQUksa0JBQWtCLFNBQVUsT0FBTSxRQUFRO0FBQzVDO0FBQ0UsZ0JBQUksa0JBQWtCLE1BQU07QUFFMUI7QUFBQTtBQUdGLGdCQUFJLGdCQUFnQixPQUFPLGVBQ3ZCLGtCQUFrQixPQUFPO0FBQzdCO0FBQ0Esc0JBQVUsV0FBWTtBQUNwQixvREFBc0MsTUFBSyxTQUFTLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUkzRSxZQUFJLGVBQWUsU0FBVSxPQUFNLFNBQVM7QUFDMUM7QUFDRSxnQkFBSSxNQUFLLFlBQVksb0JBQW9CO0FBSXZDO0FBQUE7QUFHRjtBQUNBLHNCQUFVLFdBQVk7QUFDcEIsOEJBQWdCLFNBQVMsT0FBTSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBSzNDLHVEQUErQyxPQUFPLGlCQUFpQixlQUFlO0FBQ3BGO0FBQ0UsZ0JBQUksWUFBWSxNQUFNLFdBQ2xCLFFBQVEsTUFBTSxPQUNkLFVBQVUsTUFBTSxTQUNoQixNQUFNLE1BQU0sS0FDWixPQUFPLE1BQU07QUFDakIsZ0JBQUksZ0JBQWdCO0FBRXBCLG9CQUFRO0FBQUEsbUJBQ0Q7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQ0gsZ0NBQWdCO0FBQ2hCO0FBQUEsbUJBRUc7QUFDSCxnQ0FBZ0IsS0FBSztBQUNyQjtBQUFBO0FBR0osZ0JBQUksa0JBQWtCLE1BQU07QUFDMUIsb0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsZ0JBQUksY0FBYztBQUNsQixnQkFBSSxlQUFlO0FBRW5CLGdCQUFJLGtCQUFrQixNQUFNO0FBQzFCLGtCQUFJLFNBQVMsY0FBYztBQUUzQixrQkFBSSxXQUFXLFFBQVc7QUFDeEIsb0JBQUksY0FBYyxJQUFJLFNBQVM7QUFDN0IsaUNBQWU7QUFBQSwyQkFDTixnQkFBZ0IsSUFBSSxTQUFTO0FBQ3RDLHNCQUFJLFFBQVEsZ0JBQWdCO0FBQzFCLG1DQUFlO0FBQUEseUJBQ1Y7QUFDTCxrQ0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTXRCLGdCQUFJLHFCQUFxQixNQUFNO0FBQzdCLGtCQUFJLGlCQUFpQixJQUFJLFVBQVUsY0FBYyxRQUFRLGlCQUFpQixJQUFJLFlBQVk7QUFDeEYsK0JBQWU7QUFBQTtBQUFBO0FBSW5CLGdCQUFJLGNBQWM7QUFDaEIsb0JBQU0scUJBQXFCO0FBQUE7QUFHN0IsZ0JBQUksZ0JBQWdCLGFBQWE7QUFDL0Isb0NBQXNCLE9BQU8sVUFBVTtBQUFBO0FBR3pDLGdCQUFJLFVBQVUsUUFBUSxDQUFDLGNBQWM7QUFDbkMsb0RBQXNDLE9BQU8saUJBQWlCO0FBQUE7QUFHaEUsZ0JBQUksWUFBWSxNQUFNO0FBQ3BCLG9EQUFzQyxTQUFTLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUt0RSxZQUFJLDhCQUE4QixTQUFVLE9BQU0sVUFBVTtBQUMxRDtBQUNFLGdCQUFJLGdCQUFnQixJQUFJO0FBQ3hCLGdCQUFJLFFBQVEsSUFBSSxJQUFJLFNBQVMsSUFBSSxTQUFVLFFBQVE7QUFDakQscUJBQU8sT0FBTztBQUFBO0FBRWhCLDBEQUE4QyxNQUFLLFNBQVMsT0FBTztBQUNuRSxtQkFBTztBQUFBO0FBQUE7QUFJWCwrREFBdUQsT0FBTyxPQUFPLGVBQWU7QUFDbEY7QUFDRSxnQkFBSSxRQUFRLE1BQU0sT0FDZCxVQUFVLE1BQU0sU0FDaEIsTUFBTSxNQUFNLEtBQ1osT0FBTyxNQUFNO0FBQ2pCLGdCQUFJLGdCQUFnQjtBQUVwQixvQkFBUTtBQUFBLG1CQUNEO0FBQUEsbUJBQ0E7QUFBQSxtQkFDQTtBQUNILGdDQUFnQjtBQUNoQjtBQUFBLG1CQUVHO0FBQ0gsZ0NBQWdCLEtBQUs7QUFDckI7QUFBQTtBQUdKLGdCQUFJLFdBQVc7QUFFZixnQkFBSSxrQkFBa0IsTUFBTTtBQUMxQixrQkFBSSxNQUFNLElBQUksZ0JBQWdCO0FBQzVCLDJCQUFXO0FBQUE7QUFBQTtBQUlmLGdCQUFJLFVBQVU7QUFJWixpREFBbUMsT0FBTztBQUFBLG1CQUNyQztBQUVMLGtCQUFJLFVBQVUsTUFBTTtBQUNsQiw4REFBOEMsT0FBTyxPQUFPO0FBQUE7QUFBQTtBQUloRSxnQkFBSSxZQUFZLE1BQU07QUFDcEIsNERBQThDLFNBQVMsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUtwRSxvREFBNEMsT0FBTyxlQUFlO0FBQ2hFO0FBQ0UsZ0JBQUkscUJBQXFCLHdDQUF3QyxPQUFPO0FBRXhFLGdCQUFJLG9CQUFvQjtBQUN0QjtBQUFBO0FBSUYsZ0JBQUksT0FBTztBQUVYLG1CQUFPLE1BQU07QUFDWCxzQkFBUSxLQUFLO0FBQUEscUJBQ047QUFDSCxnQ0FBYyxJQUFJLEtBQUs7QUFDdkI7QUFBQSxxQkFFRztBQUNILGdDQUFjLElBQUksS0FBSyxVQUFVO0FBQ2pDO0FBQUEscUJBRUc7QUFDSCxnQ0FBYyxJQUFJLEtBQUssVUFBVTtBQUNqQztBQUFBO0FBR0osa0JBQUksS0FBSyxXQUFXLE1BQU07QUFDeEIsc0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIscUJBQU8sS0FBSztBQUFBO0FBQUE7QUFBQTtBQUtsQix5REFBaUQsT0FBTyxlQUFlO0FBQ3JFO0FBQ0UsZ0JBQUksT0FBTztBQUNYLGdCQUFJLHFCQUFxQjtBQUV6QixtQkFBTyxNQUFNO0FBQ1gsa0JBQUksS0FBSyxRQUFRLGVBQWU7QUFFOUIscUNBQXFCO0FBQ3JCLDhCQUFjLElBQUksS0FBSztBQUFBLHlCQUNkLEtBQUssVUFBVSxNQUFNO0FBQzlCLHFCQUFLLE1BQU0sU0FBUztBQUNwQix1QkFBTyxLQUFLO0FBQ1o7QUFBQTtBQUdGLGtCQUFJLFNBQVMsT0FBTztBQUNsQix1QkFBTztBQUFBO0FBR1QscUJBQU8sS0FBSyxZQUFZLE1BQU07QUFDNUIsb0JBQUksS0FBSyxXQUFXLFFBQVEsS0FBSyxXQUFXLE9BQU87QUFDakQseUJBQU87QUFBQTtBQUdULHVCQUFPLEtBQUs7QUFBQTtBQUdkLG1CQUFLLFFBQVEsU0FBUyxLQUFLO0FBQzNCLHFCQUFPLEtBQUs7QUFBQTtBQUFBO0FBSWhCLGlCQUFPO0FBQUE7QUFHVCxZQUFJO0FBRUo7QUFDRSw4QkFBb0I7QUFFcEIsY0FBSTtBQUNGLGdCQUFJLHNCQUFzQixPQUFPLGtCQUFrQjtBQUduRCxnQkFBSSxJQUFJLENBQUMsQ0FBQyxxQkFBcUI7QUFDL0IsZ0JBQUksSUFBSSxDQUFDO0FBQUEsbUJBRUYsR0FBUDtBQUVBLGdDQUFvQjtBQUFBO0FBQUE7QUFJeEIsMkJBQW1CLEtBQUssY0FBYyxLQUFLLE1BQU07QUFFL0MsZUFBSyxNQUFNO0FBQ1gsZUFBSyxNQUFNO0FBQ1gsZUFBSyxjQUFjO0FBQ25CLGVBQUssT0FBTztBQUNaLGVBQUssWUFBWTtBQUVqQixlQUFLLFNBQVM7QUFDZCxlQUFLLFFBQVE7QUFDYixlQUFLLFVBQVU7QUFDZixlQUFLLFFBQVE7QUFDYixlQUFLLE1BQU07QUFDWCxlQUFLLGVBQWU7QUFDcEIsZUFBSyxnQkFBZ0I7QUFDckIsZUFBSyxjQUFjO0FBQ25CLGVBQUssZ0JBQWdCO0FBQ3JCLGVBQUssZUFBZTtBQUNwQixlQUFLLE9BQU87QUFFWixlQUFLLFFBQVE7QUFDYixlQUFLLGVBQWU7QUFDcEIsZUFBSyxZQUFZO0FBQ2pCLGVBQUssUUFBUTtBQUNiLGVBQUssYUFBYTtBQUNsQixlQUFLLFlBQVk7QUFFakI7QUFhRSxpQkFBSyxpQkFBaUIsT0FBTztBQUM3QixpQkFBSyxrQkFBa0IsT0FBTztBQUM5QixpQkFBSyxtQkFBbUIsT0FBTztBQUMvQixpQkFBSyxtQkFBbUIsT0FBTztBQUkvQixpQkFBSyxpQkFBaUI7QUFDdEIsaUJBQUssa0JBQWtCO0FBQ3ZCLGlCQUFLLG1CQUFtQjtBQUN4QixpQkFBSyxtQkFBbUI7QUFBQTtBQUcxQjtBQUVFLGlCQUFLLGVBQWU7QUFDcEIsaUJBQUssY0FBYztBQUNuQixpQkFBSyxxQkFBcUI7QUFDMUIsaUJBQUssa0JBQWtCO0FBRXZCLGdCQUFJLENBQUMscUJBQXFCLE9BQU8sT0FBTyxzQkFBc0IsWUFBWTtBQUN4RSxxQkFBTyxrQkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFrQi9CLFlBQUksY0FBYyxTQUFVLEtBQUssY0FBYyxLQUFLLE1BQU07QUFFeEQsaUJBQU8sSUFBSSxVQUFVLEtBQUssY0FBYyxLQUFLO0FBQUE7QUFHL0MsbUNBQTJCLFdBQVc7QUFDcEMsY0FBSSxZQUFZLFVBQVU7QUFDMUIsaUJBQU8sQ0FBQyxDQUFFLGNBQWEsVUFBVTtBQUFBO0FBR25DLDJDQUFtQyxNQUFNO0FBQ3ZDLGlCQUFPLE9BQU8sU0FBUyxjQUFjLENBQUMsa0JBQWtCLFNBQVMsS0FBSyxpQkFBaUI7QUFBQTtBQUV6Rix5Q0FBaUMsV0FBVztBQUMxQyxjQUFJLE9BQU8sY0FBYyxZQUFZO0FBQ25DLG1CQUFPLGtCQUFrQixhQUFhLGlCQUFpQjtBQUFBLHFCQUM5QyxjQUFjLFVBQWEsY0FBYyxNQUFNO0FBQ3hELGdCQUFJLFdBQVcsVUFBVTtBQUV6QixnQkFBSSxhQUFhLHdCQUF3QjtBQUN2QyxxQkFBTztBQUFBO0FBR1QsZ0JBQUksYUFBYSxpQkFBaUI7QUFDaEMscUJBQU87QUFBQTtBQUFBO0FBSVgsaUJBQU87QUFBQTtBQUdULHNDQUE4QixVQUFTLGNBQWM7QUFDbkQsY0FBSSxrQkFBaUIsU0FBUTtBQUU3QixjQUFJLG9CQUFtQixNQUFNO0FBTTNCLDhCQUFpQixZQUFZLFNBQVEsS0FBSyxjQUFjLFNBQVEsS0FBSyxTQUFRO0FBQzdFLDRCQUFlLGNBQWMsU0FBUTtBQUNyQyw0QkFBZSxPQUFPLFNBQVE7QUFDOUIsNEJBQWUsWUFBWSxTQUFRO0FBRW5DO0FBRUUsOEJBQWUsZUFBZSxTQUFRO0FBQ3RDLDhCQUFlLGNBQWMsU0FBUTtBQUNyQyw4QkFBZSxrQkFBa0IsU0FBUTtBQUFBO0FBRzNDLDRCQUFlLFlBQVk7QUFDM0IscUJBQVEsWUFBWTtBQUFBLGlCQUNmO0FBQ0wsNEJBQWUsZUFBZTtBQUU5Qiw0QkFBZSxPQUFPLFNBQVE7QUFHOUIsNEJBQWUsUUFBUTtBQUV2Qiw0QkFBZSxlQUFlO0FBQzlCLDRCQUFlLFlBQVk7QUFFM0I7QUFLRSw4QkFBZSxpQkFBaUI7QUFDaEMsOEJBQWUsa0JBQWtCO0FBQUE7QUFBQTtBQU1yQywwQkFBZSxRQUFRLFNBQVEsUUFBUTtBQUN2QywwQkFBZSxhQUFhLFNBQVE7QUFDcEMsMEJBQWUsUUFBUSxTQUFRO0FBQy9CLDBCQUFlLFFBQVEsU0FBUTtBQUMvQiwwQkFBZSxnQkFBZ0IsU0FBUTtBQUN2QywwQkFBZSxnQkFBZ0IsU0FBUTtBQUN2QywwQkFBZSxjQUFjLFNBQVE7QUFHckMsY0FBSSxzQkFBc0IsU0FBUTtBQUNsQywwQkFBZSxlQUFlLHdCQUF3QixPQUFPLE9BQU87QUFBQSxZQUNsRSxPQUFPLG9CQUFvQjtBQUFBLFlBQzNCLGNBQWMsb0JBQW9CO0FBQUE7QUFHcEMsMEJBQWUsVUFBVSxTQUFRO0FBQ2pDLDBCQUFlLFFBQVEsU0FBUTtBQUMvQiwwQkFBZSxNQUFNLFNBQVE7QUFFN0I7QUFDRSw0QkFBZSxtQkFBbUIsU0FBUTtBQUMxQyw0QkFBZSxtQkFBbUIsU0FBUTtBQUFBO0FBRzVDO0FBQ0UsNEJBQWUscUJBQXFCLFNBQVE7QUFFNUMsb0JBQVEsZ0JBQWU7QUFBQSxtQkFDaEI7QUFBQSxtQkFDQTtBQUFBLG1CQUNBO0FBQ0gsZ0NBQWUsT0FBTywrQkFBK0IsU0FBUTtBQUM3RDtBQUFBLG1CQUVHO0FBQ0gsZ0NBQWUsT0FBTyw0QkFBNEIsU0FBUTtBQUMxRDtBQUFBLG1CQUVHO0FBQ0gsZ0NBQWUsT0FBTyxpQ0FBaUMsU0FBUTtBQUMvRDtBQUFBO0FBQUE7QUFJTixpQkFBTztBQUFBO0FBR1QscUNBQTZCLGlCQUFnQixjQUFhO0FBU3hELDBCQUFlLFNBQVMsYUFBYTtBQUVyQyxjQUFJLFdBQVUsZ0JBQWU7QUFFN0IsY0FBSSxhQUFZLE1BQU07QUFFcEIsNEJBQWUsYUFBYTtBQUM1Qiw0QkFBZSxRQUFRO0FBQ3ZCLDRCQUFlLFFBQVE7QUFDdkIsNEJBQWUsZUFBZTtBQUM5Qiw0QkFBZSxnQkFBZ0I7QUFDL0IsNEJBQWUsZ0JBQWdCO0FBQy9CLDRCQUFlLGNBQWM7QUFDN0IsNEJBQWUsZUFBZTtBQUM5Qiw0QkFBZSxZQUFZO0FBRTNCO0FBR0UsOEJBQWUsbUJBQW1CO0FBQ2xDLDhCQUFlLG1CQUFtQjtBQUFBO0FBQUEsaUJBRS9CO0FBRUwsNEJBQWUsYUFBYSxTQUFRO0FBQ3BDLDRCQUFlLFFBQVEsU0FBUTtBQUMvQiw0QkFBZSxRQUFRLFNBQVE7QUFDL0IsNEJBQWUsZUFBZTtBQUM5Qiw0QkFBZSxZQUFZO0FBQzNCLDRCQUFlLGdCQUFnQixTQUFRO0FBQ3ZDLDRCQUFlLGdCQUFnQixTQUFRO0FBQ3ZDLDRCQUFlLGNBQWMsU0FBUTtBQUVyQyw0QkFBZSxPQUFPLFNBQVE7QUFHOUIsZ0JBQUksc0JBQXNCLFNBQVE7QUFDbEMsNEJBQWUsZUFBZSx3QkFBd0IsT0FBTyxPQUFPO0FBQUEsY0FDbEUsT0FBTyxvQkFBb0I7QUFBQSxjQUMzQixjQUFjLG9CQUFvQjtBQUFBO0FBR3BDO0FBR0UsOEJBQWUsbUJBQW1CLFNBQVE7QUFDMUMsOEJBQWUsbUJBQW1CLFNBQVE7QUFBQTtBQUFBO0FBSTlDLGlCQUFPO0FBQUE7QUFFVCxxQ0FBNkIsS0FBSyxjQUFjLG9DQUFvQztBQUNsRixjQUFJO0FBRUosY0FBSSxRQUFRLGdCQUFnQjtBQUMxQixtQkFBTztBQUVQLGdCQUFJLGlCQUFpQixNQUFNO0FBQ3pCLHNCQUFRO0FBRVI7QUFDRSx3QkFBUTtBQUFBO0FBQUE7QUFBQSxpQkFHUDtBQUNMLG1CQUFPO0FBQUE7QUFHVCxjQUFLLG1CQUFtQjtBQUl0QixvQkFBUTtBQUFBO0FBR1YsaUJBQU8sWUFBWSxVQUFVLE1BQU0sTUFBTTtBQUFBO0FBRTNDLDZDQUFxQyxNQUNyQyxLQUFLLGNBQWMsT0FBTyxNQUFNLE9BQU87QUFDckMsY0FBSSxXQUFXO0FBRWYsY0FBSSxlQUFlO0FBRW5CLGNBQUksT0FBTyxTQUFTLFlBQVk7QUFDOUIsZ0JBQUksa0JBQWtCLE9BQU87QUFDM0IseUJBQVc7QUFFWDtBQUNFLCtCQUFlLDRCQUE0QjtBQUFBO0FBQUEsbUJBRXhDO0FBQ0w7QUFDRSwrQkFBZSwrQkFBK0I7QUFBQTtBQUFBO0FBQUEscUJBR3pDLE9BQU8sU0FBUyxVQUFVO0FBQ25DLHVCQUFXO0FBQUEsaUJBQ047QUFDTDtBQUFRLHNCQUFRO0FBQUEscUJBQ1Q7QUFDSCx5QkFBTyx3QkFBd0IsYUFBYSxVQUFVLE1BQU0sT0FBTztBQUFBLHFCQUVoRTtBQUNILDZCQUFXO0FBQ1gsMEJBQVE7QUFFUixzQkFBTSxRQUFPLG9CQUFvQixRQUFRO0FBRXZDLDRCQUFRO0FBQUE7QUFHVjtBQUFBLHFCQUVHO0FBQ0gseUJBQU8sd0JBQXdCLGNBQWMsTUFBTSxPQUFPO0FBQUEscUJBRXZEO0FBQ0gseUJBQU8sd0JBQXdCLGNBQWMsTUFBTSxPQUFPO0FBQUEscUJBRXZEO0FBQ0gseUJBQU8sNEJBQTRCLGNBQWMsTUFBTSxPQUFPO0FBQUEscUJBRTNEO0FBQ0gseUJBQU8seUJBQXlCLGNBQWMsTUFBTSxPQUFPO0FBQUEscUJBRXhEO0FBQUEscUJBSUE7QUFBQSxxQkFJQTtBQUFBLHFCQUlBO0FBQUEscUJBSUE7QUFBQSx5QkFLSDtBQUNFLHNCQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUM3Qyw0QkFBUSxLQUFLO0FBQUEsMkJBQ047QUFDSCxtQ0FBVztBQUNYO0FBQUEsMkJBRUc7QUFFSCxtQ0FBVztBQUNYO0FBQUEsMkJBRUc7QUFDSCxtQ0FBVztBQUVYO0FBQ0UseUNBQWUsaUNBQWlDO0FBQUE7QUFHbEQ7QUFBQSwyQkFFRztBQUNILG1DQUFXO0FBQ1g7QUFBQSwyQkFFRztBQUNILG1DQUFXO0FBQ1gsdUNBQWU7QUFDZjtBQUFBO0FBQUE7QUFJTixzQkFBSSxPQUFPO0FBRVg7QUFDRSx3QkFBSSxTQUFTLFVBQWEsT0FBTyxTQUFTLFlBQVksU0FBUyxRQUFRLE9BQU8sS0FBSyxNQUFNLFdBQVcsR0FBRztBQUNyRyw4QkFBUTtBQUFBO0FBR1Ysd0JBQUksWUFBWSxRQUFRLDBCQUEwQixTQUFTO0FBRTNELHdCQUFJLFdBQVc7QUFDYiw4QkFBUSxxQ0FBcUMsWUFBWTtBQUFBO0FBQUE7QUFJN0Qsd0JBQU0sSUFBSSxNQUFNLHlIQUErSCxlQUFlLFNBQVEsT0FBTyxPQUFPLE9BQU8sUUFBUSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBS2pOLGNBQUksUUFBUSxZQUFZLFVBQVUsY0FBYyxLQUFLO0FBQ3JELGdCQUFNLGNBQWM7QUFDcEIsZ0JBQU0sT0FBTztBQUNiLGdCQUFNLFFBQVE7QUFFZDtBQUNFLGtCQUFNLGNBQWM7QUFBQTtBQUd0QixpQkFBTztBQUFBO0FBRVQsd0NBQWdDLFNBQVMsTUFBTSxPQUFPO0FBQ3BELGNBQUksUUFBUTtBQUVaO0FBQ0Usb0JBQVEsUUFBUTtBQUFBO0FBR2xCLGNBQUksT0FBTyxRQUFRO0FBQ25CLGNBQUksTUFBTSxRQUFRO0FBQ2xCLGNBQUksZUFBZSxRQUFRO0FBQzNCLGNBQUksUUFBUSw0QkFBNEIsTUFBTSxLQUFLLGNBQWMsT0FBTyxNQUFNO0FBRTlFO0FBQ0Usa0JBQU0sZUFBZSxRQUFRO0FBQzdCLGtCQUFNLGNBQWMsUUFBUTtBQUFBO0FBRzlCLGlCQUFPO0FBQUE7QUFFVCx5Q0FBaUMsVUFBVSxNQUFNLE9BQU8sS0FBSztBQUMzRCxjQUFJLFFBQVEsWUFBWSxXQUFVLFVBQVUsS0FBSztBQUNqRCxnQkFBTSxRQUFRO0FBQ2QsaUJBQU87QUFBQTtBQUdULHlDQUFpQyxjQUFjLE1BQU0sT0FBTyxLQUFLO0FBQy9EO0FBQ0UsZ0JBQUksT0FBTyxhQUFhLE9BQU8sVUFBVTtBQUN2QyxvQkFBTSw2RkFBNkYsT0FBTyxhQUFhO0FBQUE7QUFBQTtBQUkzSCxjQUFJLFFBQVEsWUFBWSxVQUFVLGNBQWMsS0FBSyxPQUFPO0FBQzVELGdCQUFNLGNBQWM7QUFDcEIsZ0JBQU0sUUFBUTtBQUVkO0FBQ0Usa0JBQU0sWUFBWTtBQUFBLGNBQ2hCLGdCQUFnQjtBQUFBLGNBQ2hCLHVCQUF1QjtBQUFBO0FBQUE7QUFJM0IsaUJBQU87QUFBQTtBQUdULHlDQUFpQyxjQUFjLE1BQU0sT0FBTyxLQUFLO0FBQy9ELGNBQUksUUFBUSxZQUFZLG1CQUFtQixjQUFjLEtBQUs7QUFDOUQsZ0JBQU0sY0FBYztBQUNwQixnQkFBTSxRQUFRO0FBQ2QsaUJBQU87QUFBQTtBQUVULDZDQUFxQyxjQUFjLE1BQU0sT0FBTyxLQUFLO0FBQ25FLGNBQUksUUFBUSxZQUFZLHVCQUF1QixjQUFjLEtBQUs7QUFDbEUsZ0JBQU0sY0FBYztBQUNwQixnQkFBTSxRQUFRO0FBQ2QsaUJBQU87QUFBQTtBQUVULDBDQUFrQyxjQUFjLE1BQU0sT0FBTyxLQUFLO0FBQ2hFLGNBQUksUUFBUSxZQUFZLG9CQUFvQixjQUFjLEtBQUs7QUFDL0QsZ0JBQU0sY0FBYztBQUNwQixnQkFBTSxRQUFRO0FBQ2QsY0FBSSx1QkFBdUI7QUFDM0IsZ0JBQU0sWUFBWTtBQUNsQixpQkFBTztBQUFBO0FBRVQscUNBQTZCLFNBQVMsTUFBTSxPQUFPO0FBQ2pELGNBQUksUUFBUSxZQUFZLFVBQVUsU0FBUyxNQUFNO0FBQ2pELGdCQUFNLFFBQVE7QUFDZCxpQkFBTztBQUFBO0FBRVQsMERBQWtEO0FBQ2hELGNBQUksUUFBUSxZQUFZLGVBQWUsTUFBTSxNQUFNO0FBQ25ELGdCQUFNLGNBQWM7QUFDcEIsaUJBQU87QUFBQTtBQUVULG1EQUEyQyxnQkFBZ0I7QUFDekQsY0FBSSxRQUFRLFlBQVksb0JBQW9CLE1BQU0sTUFBTTtBQUN4RCxnQkFBTSxZQUFZO0FBQ2xCLGlCQUFPO0FBQUE7QUFFVCx1Q0FBK0IsUUFBUSxNQUFNLE9BQU87QUFDbEQsY0FBSSxlQUFlLE9BQU8sYUFBYSxPQUFPLE9BQU8sV0FBVztBQUNoRSxjQUFJLFFBQVEsWUFBWSxZQUFZLGNBQWMsT0FBTyxLQUFLO0FBQzlELGdCQUFNLFFBQVE7QUFDZCxnQkFBTSxZQUFZO0FBQUEsWUFDaEIsZUFBZSxPQUFPO0FBQUEsWUFDdEIsaUJBQWlCO0FBQUEsWUFFakIsZ0JBQWdCLE9BQU87QUFBQTtBQUV6QixpQkFBTztBQUFBO0FBR1QsNENBQW9DLFFBQVEsUUFBUTtBQUNsRCxjQUFJLFdBQVcsTUFBTTtBQUduQixxQkFBUyxZQUFZLHdCQUF3QixNQUFNLE1BQU07QUFBQTtBQVEzRCxpQkFBTyxNQUFNLE9BQU87QUFDcEIsaUJBQU8sTUFBTSxPQUFPO0FBQ3BCLGlCQUFPLGNBQWMsT0FBTztBQUM1QixpQkFBTyxPQUFPLE9BQU87QUFDckIsaUJBQU8sWUFBWSxPQUFPO0FBQzFCLGlCQUFPLFNBQVMsT0FBTztBQUN2QixpQkFBTyxRQUFRLE9BQU87QUFDdEIsaUJBQU8sVUFBVSxPQUFPO0FBQ3hCLGlCQUFPLFFBQVEsT0FBTztBQUN0QixpQkFBTyxNQUFNLE9BQU87QUFDcEIsaUJBQU8sZUFBZSxPQUFPO0FBQzdCLGlCQUFPLGdCQUFnQixPQUFPO0FBQzlCLGlCQUFPLGNBQWMsT0FBTztBQUM1QixpQkFBTyxnQkFBZ0IsT0FBTztBQUM5QixpQkFBTyxlQUFlLE9BQU87QUFDN0IsaUJBQU8sT0FBTyxPQUFPO0FBQ3JCLGlCQUFPLFFBQVEsT0FBTztBQUN0QixpQkFBTyxlQUFlLE9BQU87QUFDN0IsaUJBQU8sWUFBWSxPQUFPO0FBQzFCLGlCQUFPLFFBQVEsT0FBTztBQUN0QixpQkFBTyxhQUFhLE9BQU87QUFDM0IsaUJBQU8sWUFBWSxPQUFPO0FBRTFCO0FBQ0UsbUJBQU8saUJBQWlCLE9BQU87QUFDL0IsbUJBQU8sa0JBQWtCLE9BQU87QUFDaEMsbUJBQU8sbUJBQW1CLE9BQU87QUFDakMsbUJBQU8sbUJBQW1CLE9BQU87QUFBQTtBQUduQyxpQkFBTyxlQUFlLE9BQU87QUFDN0IsaUJBQU8sY0FBYyxPQUFPO0FBQzVCLGlCQUFPLHFCQUFxQixPQUFPO0FBQ25DLGlCQUFPLGtCQUFrQixPQUFPO0FBQ2hDLGlCQUFPO0FBQUE7QUFHVCwrQkFBdUIsZUFBZSxLQUFLLFVBQVMsa0JBQWtCLG9CQUFvQjtBQUN4RixlQUFLLE1BQU07QUFDWCxlQUFLLGdCQUFnQjtBQUNyQixlQUFLLGtCQUFrQjtBQUN2QixlQUFLLFVBQVU7QUFDZixlQUFLLFlBQVk7QUFDakIsZUFBSyxlQUFlO0FBQ3BCLGVBQUssZ0JBQWdCO0FBQ3JCLGVBQUssVUFBVTtBQUNmLGVBQUssaUJBQWlCO0FBQ3RCLGVBQUssZUFBZTtBQUNwQixlQUFLLG1CQUFtQjtBQUN4QixlQUFLLGFBQWEsY0FBYztBQUNoQyxlQUFLLGtCQUFrQixjQUFjO0FBQ3JDLGVBQUssZUFBZTtBQUNwQixlQUFLLGlCQUFpQjtBQUN0QixlQUFLLGNBQWM7QUFDbkIsZUFBSyxlQUFlO0FBQ3BCLGVBQUssbUJBQW1CO0FBQ3hCLGVBQUssZ0JBQWdCO0FBQ3JCLGVBQUssaUJBQWlCO0FBQ3RCLGVBQUssZ0JBQWdCLGNBQWM7QUFDbkMsZUFBSyxtQkFBbUI7QUFDeEIsZUFBSyxxQkFBcUI7QUFFMUI7QUFDRSxpQkFBSyxrQ0FBa0M7QUFBQTtBQUd6QztBQUNFLGlCQUFLLGlCQUFpQjtBQUN0QixpQkFBSyx3QkFBd0I7QUFBQTtBQUcvQjtBQUNFLGlCQUFLLG1CQUFtQixJQUFJO0FBQzVCLGdCQUFJLHlCQUF5QixLQUFLLHlCQUF5QjtBQUUzRCxxQkFBUyxLQUFLLEdBQUcsS0FBSyxZQUFZLE1BQU07QUFDdEMscUNBQXVCLEtBQUssSUFBSTtBQUFBO0FBQUE7QUFJcEM7QUFDRSxvQkFBUTtBQUFBLG1CQUNEO0FBQ0gscUJBQUssaUJBQWlCLFdBQVUsa0JBQWtCO0FBQ2xEO0FBQUEsbUJBRUc7QUFDSCxxQkFBSyxpQkFBaUIsV0FBVSxjQUFjO0FBQzlDO0FBQUE7QUFBQTtBQUFBO0FBS1IsaUNBQXlCLGVBQWUsS0FBSyxVQUFTLGlCQUFpQixvQkFBb0IsY0FBYyxvQ0FJekcsa0JBQWtCLG9CQUFvQixxQkFBcUI7QUFDekQsY0FBSSxRQUFPLElBQUksY0FBYyxlQUFlLEtBQUssVUFBUyxrQkFBa0I7QUFJNUUsY0FBSSxxQkFBcUIsb0JBQW9CLEtBQUs7QUFDbEQsZ0JBQUssVUFBVTtBQUNmLDZCQUFtQixZQUFZO0FBRS9CO0FBQ0UsZ0JBQUksZ0JBQWdCO0FBQUEsY0FDbEIsU0FBUztBQUFBLGNBQ1QsY0FBYztBQUFBLGNBQ2QsT0FBTztBQUFBLGNBRVAsYUFBYTtBQUFBLGNBQ2IsMkJBQTJCO0FBQUE7QUFFN0IsK0JBQW1CLGdCQUFnQjtBQUFBO0FBR3JDLGdDQUFzQjtBQUN0QixpQkFBTztBQUFBO0FBR1QsWUFBSSxlQUFlO0FBRW5CLDhCQUFzQixVQUFVLGVBQ2hDLGdCQUFnQjtBQUNkLGNBQUksTUFBTSxVQUFVLFNBQVMsS0FBSyxVQUFVLE9BQU8sU0FBWSxVQUFVLEtBQUs7QUFFOUU7QUFDRSxtQ0FBdUI7QUFBQTtBQUd6QixpQkFBTztBQUFBLFlBRUwsVUFBVTtBQUFBLFlBQ1YsS0FBSyxPQUFPLE9BQU8sT0FBTyxLQUFLO0FBQUEsWUFDL0I7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBO0FBQUE7QUFJSixZQUFJO0FBQ0osWUFBSTtBQUVKO0FBQ0Usc0NBQTRCO0FBQzVCLDZDQUFtQztBQUFBO0FBR3JDLHNDQUE4QixpQkFBaUI7QUFDN0MsY0FBSSxDQUFDLGlCQUFpQjtBQUNwQixtQkFBTztBQUFBO0FBR1QsY0FBSSxRQUFRLEtBQUk7QUFDaEIsY0FBSSxnQkFBZ0IsMkJBQTJCO0FBRS9DLGNBQUksTUFBTSxRQUFRLGdCQUFnQjtBQUNoQyxnQkFBSSxZQUFZLE1BQU07QUFFdEIsZ0JBQUksa0JBQWtCLFlBQVk7QUFDaEMscUJBQU8sb0JBQW9CLE9BQU8sV0FBVztBQUFBO0FBQUE7QUFJakQsaUJBQU87QUFBQTtBQUdULDZDQUFxQyxXQUFXLFlBQVk7QUFDMUQ7QUFDRSxnQkFBSSxRQUFRLEtBQUk7QUFFaEIsZ0JBQUksVUFBVSxRQUFXO0FBQ3ZCLGtCQUFJLE9BQU8sVUFBVSxXQUFXLFlBQVk7QUFDMUMsc0JBQU0sSUFBSSxNQUFNO0FBQUEscUJBQ1g7QUFDTCxvQkFBSSxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUs7QUFDdkMsc0JBQU0sSUFBSSxNQUFNLHdEQUF3RDtBQUFBO0FBQUE7QUFJNUUsZ0JBQUksWUFBWSxxQkFBcUI7QUFFckMsZ0JBQUksY0FBYyxNQUFNO0FBQ3RCLHFCQUFPO0FBQUE7QUFHVCxnQkFBSSxVQUFVLE9BQU8sa0JBQWtCO0FBQ3JDLGtCQUFJLGdCQUFnQiwwQkFBMEIsVUFBVTtBQUV4RCxrQkFBSSxDQUFDLGlDQUFpQyxnQkFBZ0I7QUFDcEQsaURBQWlDLGlCQUFpQjtBQUNsRCxvQkFBSSxnQkFBZ0I7QUFFcEIsb0JBQUk7QUFDRixrQ0FBZ0I7QUFFaEIsc0JBQUksTUFBTSxPQUFPLGtCQUFrQjtBQUNqQywwQkFBTSx5UEFBNlEsWUFBWSxZQUFZO0FBQUEseUJBQ3RTO0FBQ0wsMEJBQU0sZ1FBQW9SLFlBQVksWUFBWTtBQUFBO0FBQUEsMEJBRXBUO0FBR0Esc0JBQUksZUFBZTtBQUNqQixvQ0FBZ0I7QUFBQSx5QkFDWDtBQUNMO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNUixtQkFBTyxVQUFVO0FBQUE7QUFBQTtBQUlyQixpQ0FBeUIsZUFBZSxLQUFLLG9CQUFvQixjQUFjLG9DQUFvQyxrQkFBa0Isb0JBQW9CLHFCQUFxQjtBQUM1SyxjQUFJLFdBQVU7QUFDZCxjQUFJLGtCQUFrQjtBQUN0QixpQkFBTyxnQkFBZ0IsZUFBZSxLQUFLLFVBQVMsaUJBQWlCLG9CQUFvQixjQUFjLG9DQUFvQyxrQkFBa0I7QUFBQTtBQUUvSiwwQ0FBa0MsaUJBQ2xDLFVBQVUsZUFBZSxLQUFLLG9CQUFvQixjQUFjLG9DQUFvQyxrQkFBa0Isb0JBQW9CLHFCQUFxQjtBQUM3SixjQUFJLFdBQVU7QUFDZCxjQUFJLFFBQU8sZ0JBQWdCLGVBQWUsS0FBSyxVQUFTLGlCQUFpQixvQkFBb0IsY0FBYyxvQ0FBb0Msa0JBQWtCO0FBRWpLLGdCQUFLLFVBQVUscUJBQXFCO0FBT3BDLGNBQUksV0FBVSxNQUFLO0FBQ25CLGNBQUksWUFBWTtBQUNoQixjQUFJLE9BQU8sa0JBQWtCO0FBQzdCLGNBQUksU0FBUyxhQUFhLFdBQVc7QUFDckMsaUJBQU8sV0FBVyxhQUFhLFVBQWEsYUFBYSxPQUFPLFdBQVc7QUFDM0Usd0JBQWMsVUFBUztBQUN2Qix5Q0FBK0IsT0FBTSxNQUFNO0FBQzNDLGlCQUFPO0FBQUE7QUFFVCxpQ0FBeUIsU0FBUyxXQUFXLGlCQUFpQixVQUFVO0FBQ3RFO0FBQ0UsMkJBQWUsV0FBVztBQUFBO0FBRzVCLGNBQUksWUFBWSxVQUFVO0FBQzFCLGNBQUksWUFBWTtBQUNoQixjQUFJLE9BQU8sa0JBQWtCO0FBRTdCO0FBQ0UsZ0NBQW9CO0FBQUE7QUFHdEIsY0FBSSxVQUFVLHFCQUFxQjtBQUVuQyxjQUFJLFVBQVUsWUFBWSxNQUFNO0FBQzlCLHNCQUFVLFVBQVU7QUFBQSxpQkFDZjtBQUNMLHNCQUFVLGlCQUFpQjtBQUFBO0FBRzdCO0FBQ0UsZ0JBQUksZUFBZSxZQUFZLFFBQVEsQ0FBQywyQkFBMkI7QUFDakUsMENBQTRCO0FBRTVCLG9CQUFNLDhOQUE2TywwQkFBMEIsWUFBWTtBQUFBO0FBQUE7QUFJN1IsY0FBSSxTQUFTLGFBQWEsV0FBVztBQUdyQyxpQkFBTyxVQUFVO0FBQUEsWUFDZjtBQUFBO0FBRUYscUJBQVcsYUFBYSxTQUFZLE9BQU87QUFFM0MsY0FBSSxhQUFhLE1BQU07QUFDckI7QUFDRSxrQkFBSSxPQUFPLGFBQWEsWUFBWTtBQUNsQyxzQkFBTSx1R0FBNEc7QUFBQTtBQUFBO0FBSXRILG1CQUFPLFdBQVc7QUFBQTtBQUdwQix3QkFBYyxXQUFXO0FBQ3pCLGNBQUksUUFBTyxzQkFBc0IsV0FBVyxNQUFNO0FBRWxELGNBQUksVUFBUyxNQUFNO0FBQ2pCLGdDQUFvQixPQUFNLFdBQVc7QUFBQTtBQUd2QyxpQkFBTztBQUFBO0FBRVQsdUNBQStCLFdBQVc7QUFDeEMsY0FBSSxpQkFBaUIsVUFBVTtBQUUvQixjQUFJLENBQUMsZUFBZSxPQUFPO0FBQ3pCLG1CQUFPO0FBQUE7QUFHVCxrQkFBUSxlQUFlLE1BQU07QUFBQSxpQkFDdEI7QUFDSCxxQkFBTyxrQkFBa0IsZUFBZSxNQUFNO0FBQUE7QUFHOUMscUJBQU8sZUFBZSxNQUFNO0FBQUE7QUFBQTtBQUdsQywrQ0FBdUMsT0FBTztBQUM1QyxrQkFBUSxNQUFNO0FBQUEsaUJBQ1A7QUFDSCxrQkFBSSxRQUFPLE1BQU07QUFFakIsa0JBQUksaUJBQWlCLFFBQU87QUFFMUIsb0JBQUksUUFBUSwrQkFBK0I7QUFDM0MsMEJBQVUsT0FBTTtBQUFBO0FBR2xCO0FBQUEsaUJBRUc7QUFDSCxrQkFBSSxZQUFZO0FBQ2hCLHdCQUFVLFdBQVk7QUFDcEIsdUJBQU8sc0JBQXNCLE9BQU8sVUFBVTtBQUFBO0FBS2hELGtCQUFJLFlBQVk7QUFDaEIseUNBQTJCLE9BQU87QUFDbEM7QUFBQTtBQUFBO0FBSU4sbUNBQTJCLE9BQU8sV0FBVztBQUMzQyxjQUFJLGdCQUFnQixNQUFNO0FBRTFCLGNBQUksa0JBQWtCLFFBQVEsY0FBYyxlQUFlLE1BQU07QUFDL0QsMEJBQWMsWUFBWSxtQkFBbUIsY0FBYyxXQUFXO0FBQUE7QUFBQTtBQUsxRSw0Q0FBb0MsT0FBTyxXQUFXO0FBQ3BELDRCQUFrQixPQUFPO0FBQ3pCLGNBQUksWUFBWSxNQUFNO0FBRXRCLGNBQUksV0FBVztBQUNiLDhCQUFrQixXQUFXO0FBQUE7QUFBQTtBQUdqQyw4Q0FBc0MsT0FBTztBQUMzQyxjQUFJLE1BQU0sUUFBUSxtQkFBbUI7QUFLbkM7QUFBQTtBQUdGLGNBQUksWUFBWTtBQUNoQixjQUFJLE9BQU87QUFDWCxnQ0FBc0IsT0FBTyxNQUFNO0FBQ25DLHFDQUEyQixPQUFPO0FBQUE7QUFFcEMscURBQTZDLE9BQU87QUFDbEQsY0FBSSxNQUFNLFFBQVEsbUJBQW1CO0FBR25DO0FBQUE7QUFHRixjQUFJLFlBQVk7QUFDaEIsY0FBSSxPQUFPLGtCQUFrQjtBQUM3QixnQ0FBc0IsT0FBTyxNQUFNO0FBQ25DLHFDQUEyQixPQUFPO0FBQUE7QUFFcEMsK0NBQXVDLE9BQU87QUFDNUMsY0FBSSxZQUFZLGtDQUFrQztBQUVsRCxjQUFJLGNBQWMsTUFBTTtBQUN0QixtQkFBTztBQUFBO0FBR1QsaUJBQU8sVUFBVTtBQUFBO0FBR25CLFlBQUksa0JBQWtCLFNBQVUsT0FBTztBQUNyQyxpQkFBTztBQUFBO0FBR1QsNkJBQXFCLE9BQU87QUFDMUIsaUJBQU8sZ0JBQWdCO0FBQUE7QUFHekIsWUFBSSxvQkFBb0IsU0FBVSxPQUFPO0FBQ3ZDLGlCQUFPO0FBQUE7QUFHVCwrQkFBdUIsT0FBTztBQUM1QixpQkFBTyxrQkFBa0I7QUFBQTtBQUUzQixZQUFJLG9CQUFvQjtBQUN4QixZQUFJLDhCQUE4QjtBQUNsQyxZQUFJLDhCQUE4QjtBQUNsQyxZQUFJLGdCQUFnQjtBQUNwQixZQUFJLDBCQUEwQjtBQUM5QixZQUFJLDBCQUEwQjtBQUM5QixZQUFJLGlCQUFpQjtBQUNyQixZQUFJLGtCQUFrQjtBQUN0QixZQUFJLHFCQUFxQjtBQUV6QjtBQUNFLGNBQUkscUJBQXFCLFNBQVUsS0FBSyxNQUFNLFFBQU87QUFDbkQsZ0JBQUksTUFBTSxLQUFLO0FBQ2YsZ0JBQUksVUFBVSxRQUFRLE9BQU8sSUFBSSxVQUFVLE9BQU8sSUFBSTtBQUV0RCxnQkFBSSxTQUFRLE1BQU0sS0FBSyxRQUFRO0FBQzdCLGtCQUFJLFFBQVEsVUFBVTtBQUNwQix3QkFBUSxPQUFPLEtBQUs7QUFBQSxxQkFDZjtBQUNMLHVCQUFPLFFBQVE7QUFBQTtBQUdqQixxQkFBTztBQUFBO0FBSVQsb0JBQVEsT0FBTyxtQkFBbUIsSUFBSSxNQUFNLE1BQU0sU0FBUTtBQUMxRCxtQkFBTztBQUFBO0FBR1QsY0FBSSxpQkFBaUIsU0FBVSxLQUFLLE1BQU07QUFDeEMsbUJBQU8sbUJBQW1CLEtBQUssTUFBTTtBQUFBO0FBR3ZDLGNBQUkscUJBQXFCLFNBQVUsS0FBSyxTQUFTLFNBQVMsUUFBTztBQUMvRCxnQkFBSSxTQUFTLFFBQVE7QUFDckIsZ0JBQUksVUFBVSxRQUFRLE9BQU8sSUFBSSxVQUFVLE9BQU8sSUFBSTtBQUV0RCxnQkFBSSxTQUFRLE1BQU0sUUFBUSxRQUFRO0FBQ2hDLGtCQUFJLFNBQVMsUUFBUTtBQUVyQixzQkFBUSxVQUFVLFFBQVE7QUFFMUIsa0JBQUksUUFBUSxVQUFVO0FBQ3BCLHdCQUFRLE9BQU8sUUFBUTtBQUFBLHFCQUNsQjtBQUNMLHVCQUFPLFFBQVE7QUFBQTtBQUFBLG1CQUVaO0FBRUwsc0JBQVEsVUFBVSxtQkFDbEIsSUFBSSxTQUFTLFNBQVMsU0FBUyxTQUFRO0FBQUE7QUFHekMsbUJBQU87QUFBQTtBQUdULGNBQUksaUJBQWlCLFNBQVUsS0FBSyxTQUFTLFNBQVM7QUFDcEQsZ0JBQUksUUFBUSxXQUFXLFFBQVEsUUFBUTtBQUNyQyxtQkFBSztBQUVMO0FBQUEsbUJBQ0s7QUFDTCx1QkFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFNBQVMsR0FBRyxLQUFLO0FBQzNDLG9CQUFJLFFBQVEsT0FBTyxRQUFRLElBQUk7QUFDN0IsdUJBQUs7QUFFTDtBQUFBO0FBQUE7QUFBQTtBQUtOLG1CQUFPLG1CQUFtQixLQUFLLFNBQVMsU0FBUztBQUFBO0FBR25ELGNBQUksa0JBQWtCLFNBQVUsS0FBSyxNQUFNLFFBQU8sT0FBTztBQUN2RCxnQkFBSSxVQUFTLEtBQUssUUFBUTtBQUN4QixxQkFBTztBQUFBO0FBR1QsZ0JBQUksTUFBTSxLQUFLO0FBQ2YsZ0JBQUksVUFBVSxRQUFRLE9BQU8sSUFBSSxVQUFVLE9BQU8sSUFBSTtBQUV0RCxvQkFBUSxPQUFPLGdCQUFnQixJQUFJLE1BQU0sTUFBTSxTQUFRLEdBQUc7QUFDMUQsbUJBQU87QUFBQTtBQUdULGNBQUksY0FBYyxTQUFVLEtBQUssTUFBTSxPQUFPO0FBQzVDLG1CQUFPLGdCQUFnQixLQUFLLE1BQU0sR0FBRztBQUFBO0FBR3ZDLGNBQUksV0FBVyxTQUFVLE9BQU8sSUFBSTtBQUdsQyxnQkFBSSxlQUFjLE1BQU07QUFFeEIsbUJBQU8saUJBQWdCLFFBQVEsS0FBSyxHQUFHO0FBQ3JDLDZCQUFjLGFBQVk7QUFDMUI7QUFBQTtBQUdGLG1CQUFPO0FBQUE7QUFJVCw4QkFBb0IsU0FBVSxPQUFPLElBQUksTUFBTSxPQUFPO0FBQ3BELGdCQUFJLE9BQU8sU0FBUyxPQUFPO0FBRTNCLGdCQUFJLFNBQVMsTUFBTTtBQUNqQixrQkFBSSxXQUFXLFlBQVksS0FBSyxlQUFlLE1BQU07QUFDckQsbUJBQUssZ0JBQWdCO0FBQ3JCLG1CQUFLLFlBQVk7QUFNakIsb0JBQU0sZ0JBQWdCLE9BQU8sSUFBSSxNQUFNO0FBQ3ZDLG9DQUFzQixPQUFPLFVBQVU7QUFBQTtBQUFBO0FBSTNDLHdDQUE4QixTQUFVLE9BQU8sSUFBSSxNQUFNO0FBQ3ZELGdCQUFJLE9BQU8sU0FBUyxPQUFPO0FBRTNCLGdCQUFJLFNBQVMsTUFBTTtBQUNqQixrQkFBSSxXQUFXLGVBQWUsS0FBSyxlQUFlO0FBQ2xELG1CQUFLLGdCQUFnQjtBQUNyQixtQkFBSyxZQUFZO0FBTWpCLG9CQUFNLGdCQUFnQixPQUFPLElBQUksTUFBTTtBQUN2QyxvQ0FBc0IsT0FBTyxVQUFVO0FBQUE7QUFBQTtBQUkzQyx3Q0FBOEIsU0FBVSxPQUFPLElBQUksU0FBUyxTQUFTO0FBQ25FLGdCQUFJLE9BQU8sU0FBUyxPQUFPO0FBRTNCLGdCQUFJLFNBQVMsTUFBTTtBQUNqQixrQkFBSSxXQUFXLGVBQWUsS0FBSyxlQUFlLFNBQVM7QUFDM0QsbUJBQUssZ0JBQWdCO0FBQ3JCLG1CQUFLLFlBQVk7QUFNakIsb0JBQU0sZ0JBQWdCLE9BQU8sSUFBSSxNQUFNO0FBQ3ZDLG9DQUFzQixPQUFPLFVBQVU7QUFBQTtBQUFBO0FBSzNDLDBCQUFnQixTQUFVLE9BQU8sTUFBTSxPQUFPO0FBQzVDLGtCQUFNLGVBQWUsWUFBWSxNQUFNLGVBQWUsTUFBTTtBQUU1RCxnQkFBSSxNQUFNLFdBQVc7QUFDbkIsb0JBQU0sVUFBVSxlQUFlLE1BQU07QUFBQTtBQUd2QyxrQ0FBc0IsT0FBTyxVQUFVO0FBQUE7QUFHekMsb0NBQTBCLFNBQVUsT0FBTyxNQUFNO0FBQy9DLGtCQUFNLGVBQWUsZUFBZSxNQUFNLGVBQWU7QUFFekQsZ0JBQUksTUFBTSxXQUFXO0FBQ25CLG9CQUFNLFVBQVUsZUFBZSxNQUFNO0FBQUE7QUFHdkMsa0NBQXNCLE9BQU8sVUFBVTtBQUFBO0FBR3pDLG9DQUEwQixTQUFVLE9BQU8sU0FBUyxTQUFTO0FBQzNELGtCQUFNLGVBQWUsZUFBZSxNQUFNLGVBQWUsU0FBUztBQUVsRSxnQkFBSSxNQUFNLFdBQVc7QUFDbkIsb0JBQU0sVUFBVSxlQUFlLE1BQU07QUFBQTtBQUd2QyxrQ0FBc0IsT0FBTyxVQUFVO0FBQUE7QUFHekMsMkJBQWlCLFNBQVUsT0FBTztBQUNoQyxrQ0FBc0IsT0FBTyxVQUFVO0FBQUE7QUFHekMsNEJBQWtCLFNBQVUsb0JBQW9CO0FBQzlDLDhCQUFrQjtBQUFBO0FBR3BCLCtCQUFxQixTQUFVLHNCQUFzQjtBQUNuRCxnQ0FBb0I7QUFBQTtBQUFBO0FBSXhCLHlDQUFpQyxPQUFPO0FBQ3RDLGNBQUksWUFBWSxxQkFBcUI7QUFFckMsY0FBSSxjQUFjLE1BQU07QUFDdEIsbUJBQU87QUFBQTtBQUdULGlCQUFPLFVBQVU7QUFBQTtBQUduQiw4Q0FBc0MsVUFBVTtBQUM5QyxpQkFBTztBQUFBO0FBR1QsOENBQXNDO0FBQ3BDLGlCQUFPO0FBQUE7QUFHVCxvQ0FBNEIsZ0JBQWdCO0FBQzFDLGNBQUksMEJBQTBCLGVBQWU7QUFDN0MsY0FBSSwwQkFBeUIscUJBQXFCO0FBQ2xELGlCQUFPLGdCQUFnQjtBQUFBLFlBQ3JCLFlBQVksZUFBZTtBQUFBLFlBQzNCLFNBQVMsZUFBZTtBQUFBLFlBQ3hCLHFCQUFxQixlQUFlO0FBQUEsWUFDcEMsZ0JBQWdCLGVBQWU7QUFBQSxZQUMvQjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQSxzQkFBc0I7QUFBQSxZQUN0QjtBQUFBLFlBQ0EseUJBQXlCLDJCQUEyQjtBQUFBLFlBRXBEO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFFQSxpQkFBa0I7QUFBQSxZQUdsQixtQkFBbUI7QUFBQTtBQUFBO0FBTXZCLFlBQUksNEJBQTRCLE9BQU8sZ0JBQWdCLGFBRXZELGNBQWMsU0FBVSxRQUFPO0FBRzdCLGtCQUFRLFNBQVM7QUFBQTtBQUduQiw4QkFBc0IsY0FBYztBQUNsQyxlQUFLLGdCQUFnQjtBQUFBO0FBR3ZCLDhCQUFzQixVQUFVLFNBQVMsYUFBYSxVQUFVLFNBQVMsU0FBVSxVQUFVO0FBQzNGLGNBQUksUUFBTyxLQUFLO0FBRWhCLGNBQUksVUFBUyxNQUFNO0FBQ2pCLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCO0FBQ0UsZ0JBQUksT0FBTyxVQUFVLE9BQU8sWUFBWTtBQUN0QyxvQkFBTTtBQUFBLHVCQUNHLGlCQUFpQixVQUFVLEtBQUs7QUFDekMsb0JBQU07QUFBQSx1QkFDRyxPQUFPLFVBQVUsT0FBTyxhQUFhO0FBQzlDLG9CQUFNO0FBQUE7QUFHUixnQkFBSSxZQUFZLE1BQUs7QUFFckIsZ0JBQUksVUFBVSxhQUFhLGNBQWM7QUFDdkMsa0JBQUksZUFBZSw4QkFBOEIsTUFBSztBQUV0RCxrQkFBSSxjQUFjO0FBQ2hCLG9CQUFJLGFBQWEsZUFBZSxXQUFXO0FBQ3pDLHdCQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNZCwwQkFBZ0IsVUFBVSxPQUFNLE1BQU07QUFBQTtBQUd4Qyw4QkFBc0IsVUFBVSxVQUFVLGFBQWEsVUFBVSxVQUFVLFdBQVk7QUFDckY7QUFDRSxnQkFBSSxPQUFPLFVBQVUsT0FBTyxZQUFZO0FBQ3RDLG9CQUFNO0FBQUE7QUFBQTtBQUlWLGNBQUksUUFBTyxLQUFLO0FBRWhCLGNBQUksVUFBUyxNQUFNO0FBQ2pCLGlCQUFLLGdCQUFnQjtBQUNyQixnQkFBSSxZQUFZLE1BQUs7QUFFckI7QUFDRSxrQkFBSSxzQkFBc0I7QUFDeEIsc0JBQU07QUFBQTtBQUFBO0FBSVYsc0JBQVUsV0FBWTtBQUNwQiw4QkFBZ0IsTUFBTSxPQUFNLE1BQU07QUFBQTtBQUVwQyxrQ0FBc0I7QUFBQTtBQUFBO0FBSTFCLDZCQUFvQixXQUFXLFVBQVM7QUFDdEMsY0FBSSxDQUFDLGlCQUFpQixZQUFZO0FBQ2hDLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLHVDQUE2QjtBQUM3QixjQUFJLGVBQWU7QUFDbkIsY0FBSSxxQ0FBcUM7QUFDekMsY0FBSSxtQkFBbUI7QUFDdkIsY0FBSSxxQkFBcUI7QUFDekIsY0FBSSxzQkFBc0I7QUFFMUIsY0FBSSxhQUFZLFFBQVEsYUFBWSxRQUFXO0FBQzdDO0FBQ0Usa0JBQUksU0FBUSxTQUFTO0FBQ25CLHFCQUFLO0FBQUEscUJBQ0E7QUFDTCxvQkFBSSxPQUFPLGFBQVksWUFBWSxhQUFZLFFBQVEsU0FBUSxhQUFhLG9CQUFvQjtBQUM5Rix3QkFBTTtBQUFBO0FBQUE7QUFBQTtBQUtaLGdCQUFJLFNBQVEsd0JBQXdCLE1BQU07QUFDeEMsNkJBQWU7QUFBQTtBQUdqQixnQkFBSSxTQUFRLHFCQUFxQixRQUFXO0FBQzFDLGlDQUFtQixTQUFRO0FBQUE7QUFHN0IsZ0JBQUksU0FBUSx1QkFBdUIsUUFBVztBQUM1QyxtQ0FBcUIsU0FBUTtBQUFBO0FBRy9CLGdCQUFJLFNBQVEsd0JBQXdCLFFBQVc7QUFDN0Msb0NBQXNCLFNBQVE7QUFBQTtBQUFBO0FBSWxDLGNBQUksUUFBTyxnQkFBZ0IsV0FBVyxnQkFBZ0IsTUFBTSxjQUFjLG9DQUFvQyxrQkFBa0I7QUFDaEksOEJBQW9CLE1BQUssU0FBUztBQUNsQyxjQUFJLHVCQUF1QixVQUFVLGFBQWEsZUFBZSxVQUFVLGFBQWE7QUFDeEYscUNBQTJCO0FBQzNCLGlCQUFPLElBQUksYUFBYTtBQUFBO0FBRzFCLHVDQUErQixjQUFjO0FBQzNDLGVBQUssZ0JBQWdCO0FBQUE7QUFHdkIsbUNBQTJCLFFBQVE7QUFDakMsY0FBSSxRQUFRO0FBQ1YseUNBQTZCO0FBQUE7QUFBQTtBQUlqQyw4QkFBc0IsVUFBVSw2QkFBNkI7QUFDN0QsNkJBQXFCLFdBQVcsaUJBQWlCLFVBQVM7QUFDeEQsY0FBSSxDQUFDLGlCQUFpQixZQUFZO0FBQ2hDLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLHVDQUE2QjtBQUU3QjtBQUNFLGdCQUFJLG9CQUFvQixRQUFXO0FBQ2pDLG9CQUFNO0FBQUE7QUFBQTtBQU1WLGNBQUkscUJBQXFCLFlBQVcsT0FBTyxXQUFVO0FBRXJELGNBQUksaUJBQWlCLFlBQVcsUUFBUSxTQUFRLG1CQUFtQjtBQUNuRSxjQUFJLGVBQWU7QUFDbkIsY0FBSSxxQ0FBcUM7QUFDekMsY0FBSSxtQkFBbUI7QUFDdkIsY0FBSSxxQkFBcUI7QUFFekIsY0FBSSxhQUFZLFFBQVEsYUFBWSxRQUFXO0FBQzdDLGdCQUFJLFNBQVEsd0JBQXdCLE1BQU07QUFDeEMsNkJBQWU7QUFBQTtBQUdqQixnQkFBSSxTQUFRLHFCQUFxQixRQUFXO0FBQzFDLGlDQUFtQixTQUFRO0FBQUE7QUFHN0IsZ0JBQUksU0FBUSx1QkFBdUIsUUFBVztBQUM1QyxtQ0FBcUIsU0FBUTtBQUFBO0FBQUE7QUFJakMsY0FBSSxRQUFPLHlCQUF5QixpQkFBaUIsTUFBTSxXQUFXLGdCQUFnQixvQkFBb0IsY0FBYyxvQ0FBb0Msa0JBQWtCO0FBQzlLLDhCQUFvQixNQUFLLFNBQVM7QUFFbEMscUNBQTJCO0FBRTNCLGNBQUksZ0JBQWdCO0FBQ2xCLHFCQUFTLElBQUksR0FBRyxJQUFJLGVBQWUsUUFBUSxLQUFLO0FBQzlDLGtCQUFJLGdCQUFnQixlQUFlO0FBQ25DLGdEQUFrQyxPQUFNO0FBQUE7QUFBQTtBQUk1QyxpQkFBTyxJQUFJLHNCQUFzQjtBQUFBO0FBRW5DLGtDQUEwQixNQUFNO0FBQzlCLGlCQUFPLENBQUMsQ0FBRSxTQUFTLE1BQUssYUFBYSxnQkFBZ0IsS0FBSyxhQUFhLGlCQUFpQixLQUFLLGFBQWEsMEJBQTBCLENBQUM7QUFBQTtBQUl2SSx3Q0FBZ0MsTUFBTTtBQUNwQyxpQkFBTyxDQUFDLENBQUUsU0FBUyxNQUFLLGFBQWEsZ0JBQWdCLEtBQUssYUFBYSxpQkFBaUIsS0FBSyxhQUFhLDBCQUEwQixLQUFLLGFBQWEsZ0JBQWdCLEtBQUssY0FBYztBQUFBO0FBRzNMLDhDQUFzQyxXQUFXO0FBQy9DO0FBQ0UsZ0JBQUksVUFBVSxhQUFhLGdCQUFnQixVQUFVLFdBQVcsVUFBVSxRQUFRLGtCQUFrQixRQUFRO0FBQzFHLG9CQUFNO0FBQUE7QUFHUixnQkFBSSx3QkFBd0IsWUFBWTtBQUN0QyxrQkFBSSxVQUFVLHFCQUFxQjtBQUNqQyxzQkFBTTtBQUFBLHFCQUNEO0FBQ0wsc0JBQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1kLFlBQUksc0JBQXNCLHFCQUFxQjtBQUMvQyxZQUFJO0FBRUo7QUFDRSxtQ0FBeUIsU0FBVSxXQUFXO0FBQzVDLGdCQUFJLFVBQVUsdUJBQXVCLFVBQVUsYUFBYSxjQUFjO0FBQ3hFLGtCQUFJLGVBQWUsOEJBQThCLFVBQVUsb0JBQW9CO0FBRS9FLGtCQUFJLGNBQWM7QUFDaEIsb0JBQUksYUFBYSxlQUFlLFdBQVc7QUFDekMsd0JBQU07QUFBQTtBQUFBO0FBQUE7QUFLWixnQkFBSSw0QkFBNEIsQ0FBQyxDQUFDLFVBQVU7QUFDNUMsZ0JBQUksU0FBUywrQkFBK0I7QUFDNUMsZ0JBQUksdUJBQXVCLENBQUMsQ0FBRSxXQUFVLG9CQUFvQjtBQUU1RCxnQkFBSSx3QkFBd0IsQ0FBQywyQkFBMkI7QUFDdEQsb0JBQU07QUFBQTtBQUdSLGdCQUFJLFVBQVUsYUFBYSxnQkFBZ0IsVUFBVSxXQUFXLFVBQVUsUUFBUSxrQkFBa0IsUUFBUTtBQUMxRyxvQkFBTTtBQUFBO0FBQUE7QUFBQTtBQUtaLGdEQUF3QyxXQUFXO0FBQ2pELGNBQUksQ0FBQyxXQUFXO0FBQ2QsbUJBQU87QUFBQTtBQUdULGNBQUksVUFBVSxhQUFhLGVBQWU7QUFDeEMsbUJBQU8sVUFBVTtBQUFBLGlCQUNaO0FBQ0wsbUJBQU8sVUFBVTtBQUFBO0FBQUE7QUFJckIsMENBQWtDO0FBQUE7QUFJbEMsa0RBQTBDLFdBQVcsaUJBQWlCLGlCQUFpQixVQUFVLHNCQUFzQjtBQUNySCxjQUFJLHNCQUFzQjtBQUN4QixnQkFBSSxPQUFPLGFBQWEsWUFBWTtBQUNsQyxrQkFBSSxtQkFBbUI7QUFFdkIseUJBQVcsV0FBWTtBQUNyQixvQkFBSSxXQUFXLHNCQUFzQjtBQUNyQyxpQ0FBaUIsS0FBSztBQUFBO0FBQUE7QUFJMUIsZ0JBQUksUUFBTyx5QkFBeUIsaUJBQWlCLFVBQVUsV0FBVyxZQUFZLE1BQ3RGLE9BQ0EsT0FDQSxJQUNBO0FBQ0Esc0JBQVUsc0JBQXNCO0FBQ2hDLGdDQUFvQixNQUFLLFNBQVM7QUFDbEMsZ0JBQUksdUJBQXVCLFVBQVUsYUFBYSxlQUFlLFVBQVUsYUFBYTtBQUN4Rix1Q0FBMkI7QUFDM0I7QUFDQSxtQkFBTztBQUFBLGlCQUNGO0FBRUwsZ0JBQUk7QUFFSixtQkFBTyxjQUFjLFVBQVUsV0FBVztBQUN4Qyx3QkFBVSxZQUFZO0FBQUE7QUFHeEIsZ0JBQUksT0FBTyxhQUFhLFlBQVk7QUFDbEMsa0JBQUksb0JBQW9CO0FBRXhCLHlCQUFXLFdBQVk7QUFDckIsb0JBQUksV0FBVyxzQkFBc0I7QUFFckMsa0NBQWtCLEtBQUs7QUFBQTtBQUFBO0FBSTNCLGdCQUFJLFFBQVEsZ0JBQWdCLFdBQVcsWUFBWSxNQUNuRCxPQUNBLE9BQ0EsSUFDQTtBQUVBLHNCQUFVLHNCQUFzQjtBQUNoQyxnQ0FBb0IsTUFBTSxTQUFTO0FBRW5DLGdCQUFJLHdCQUF3QixVQUFVLGFBQWEsZUFBZSxVQUFVLGFBQWE7QUFFekYsdUNBQTJCO0FBRTNCLHNCQUFVLFdBQVk7QUFDcEIsOEJBQWdCLGlCQUFpQixPQUFPLGlCQUFpQjtBQUFBO0FBRTNELG1CQUFPO0FBQUE7QUFBQTtBQUlYLHlDQUFpQyxVQUFVLFlBQVk7QUFDckQ7QUFDRSxnQkFBSSxhQUFhLFFBQVEsT0FBTyxhQUFhLFlBQVk7QUFDdkQsb0JBQU0sbUdBQXdHLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFLaEksa0RBQTBDLGlCQUFpQixVQUFVLFdBQVcsY0FBYyxVQUFVO0FBQ3RHO0FBQ0UsbUNBQXVCO0FBQ3ZCLG9DQUF3QixhQUFhLFNBQVksT0FBTyxVQUFVO0FBQUE7QUFHcEUsY0FBSSxZQUFZLFVBQVU7QUFDMUIsY0FBSTtBQUVKLGNBQUksQ0FBQyxXQUFXO0FBRWQsb0JBQU8saUNBQWlDLFdBQVcsVUFBVSxpQkFBaUIsVUFBVTtBQUFBLGlCQUNuRjtBQUNMLG9CQUFPO0FBRVAsZ0JBQUksT0FBTyxhQUFhLFlBQVk7QUFDbEMsa0JBQUksbUJBQW1CO0FBRXZCLHlCQUFXLFdBQVk7QUFDckIsb0JBQUksV0FBVyxzQkFBc0I7QUFDckMsaUNBQWlCLEtBQUs7QUFBQTtBQUFBO0FBSzFCLDRCQUFnQixVQUFVLE9BQU0saUJBQWlCO0FBQUE7QUFHbkQsaUJBQU8sc0JBQXNCO0FBQUE7QUFHL0IsNkJBQXFCLG9CQUFvQjtBQUN2QztBQUNFLGdCQUFJLFFBQVEsb0JBQW9CO0FBRWhDLGdCQUFJLFVBQVUsUUFBUSxNQUFNLGNBQWMsTUFBTTtBQUM5QyxrQkFBSSwwQkFBMEIsTUFBTSxVQUFVO0FBRTlDLGtCQUFJLENBQUMseUJBQXlCO0FBQzVCLHNCQUFNLGtSQUFzUyx5QkFBeUIsTUFBTSxTQUFTO0FBQUE7QUFHdFYsb0JBQU0sVUFBVSwyQkFBMkI7QUFBQTtBQUFBO0FBSS9DLGNBQUksc0JBQXNCLE1BQU07QUFDOUIsbUJBQU87QUFBQTtBQUdULGNBQUksbUJBQW1CLGFBQWEsY0FBYztBQUNoRCxtQkFBTztBQUFBO0FBR1Q7QUFDRSxtQkFBTyw0QkFBNEIsb0JBQW9CO0FBQUE7QUFBQTtBQUczRCx5QkFBaUIsU0FBUyxXQUFXLFVBQVU7QUFDN0M7QUFDRSxrQkFBTTtBQUFBO0FBR1IsY0FBSSxDQUFDLHVCQUF1QixZQUFZO0FBQ3RDLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCO0FBQ0UsZ0JBQUksZUFBZSx3QkFBd0IsY0FBYyxVQUFVLHdCQUF3QjtBQUUzRixnQkFBSSxjQUFjO0FBQ2hCLG9CQUFNO0FBQUE7QUFBQTtBQUtWLGlCQUFPLGlDQUFpQyxNQUFNLFNBQVMsV0FBVyxNQUFNO0FBQUE7QUFFMUUsd0JBQWdCLFNBQVMsV0FBVyxVQUFVO0FBQzVDO0FBQ0Usa0JBQU07QUFBQTtBQUdSLGNBQUksQ0FBQyx1QkFBdUIsWUFBWTtBQUN0QyxrQkFBTSxJQUFJLE1BQU07QUFBQTtBQUdsQjtBQUNFLGdCQUFJLGVBQWUsd0JBQXdCLGNBQWMsVUFBVSx3QkFBd0I7QUFFM0YsZ0JBQUksY0FBYztBQUNoQixvQkFBTTtBQUFBO0FBQUE7QUFJVixpQkFBTyxpQ0FBaUMsTUFBTSxTQUFTLFdBQVcsT0FBTztBQUFBO0FBRTNFLHFEQUE2QyxpQkFBaUIsU0FBUyxlQUFlLFVBQVU7QUFDOUY7QUFDRSxrQkFBTTtBQUFBO0FBR1IsY0FBSSxDQUFDLHVCQUF1QixnQkFBZ0I7QUFDMUMsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsY0FBSSxtQkFBbUIsUUFBUSxDQUFDLElBQUksa0JBQWtCO0FBQ3BELGtCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGlCQUFPLGlDQUFpQyxpQkFBaUIsU0FBUyxlQUFlLE9BQU87QUFBQTtBQUUxRix5Q0FBZ0MsV0FBVztBQUN6QyxjQUFJLENBQUMsdUJBQXVCLFlBQVk7QUFDdEMsa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEI7QUFDRSxnQkFBSSxlQUFlLHdCQUF3QixjQUFjLFVBQVUsd0JBQXdCO0FBRTNGLGdCQUFJLGNBQWM7QUFDaEIsb0JBQU07QUFBQTtBQUFBO0FBSVYsY0FBSSxVQUFVLHFCQUFxQjtBQUNqQztBQUNFLGtCQUFJLFNBQVMsK0JBQStCO0FBQzVDLGtCQUFJLDJCQUEyQixVQUFVLENBQUMsb0JBQW9CO0FBRTlELGtCQUFJLDBCQUEwQjtBQUM1QixzQkFBTTtBQUFBO0FBQUE7QUFLVixzQkFBVSxXQUFZO0FBQ3BCLCtDQUFpQyxNQUFNLE1BQU0sV0FBVyxPQUFPLFdBQVk7QUFFekUsMEJBQVUsc0JBQXNCO0FBQ2hDLHNDQUFzQjtBQUFBO0FBQUE7QUFLMUIsbUJBQU87QUFBQSxpQkFDRjtBQUNMO0FBQ0Usa0JBQUksVUFBVSwrQkFBK0I7QUFFN0Msa0JBQUksdUJBQXVCLENBQUMsQ0FBRSxZQUFXLG9CQUFvQjtBQUU3RCxrQkFBSSx1QkFBdUIsVUFBVSxhQUFhLGdCQUFnQix1QkFBdUIsVUFBVSxlQUFlLENBQUMsQ0FBQyxVQUFVLFdBQVc7QUFFekksa0JBQUksc0JBQXNCO0FBQ3hCLHNCQUFNLDhIQUFtSSx1QkFBdUIsb0ZBQXlGO0FBQUE7QUFBQTtBQUk3UCxtQkFBTztBQUFBO0FBQUE7QUFJWCx1Q0FBK0I7QUFDL0Isc0NBQThCO0FBQzlCLDZDQUFxQztBQUNyQyxvQ0FBNEI7QUFDNUIsc0NBQThCO0FBRTlCO0FBQ0UsY0FBSSxPQUFPLFFBQVEsY0FDbkIsSUFBSSxhQUFhLFFBQVEsT0FBTyxJQUFJLFVBQVUsWUFBWSxjQUFjLE9BQU8sUUFBUSxjQUN2RixJQUFJLGFBQWEsUUFBUSxPQUFPLElBQUksVUFBVSxVQUFVLGNBQWMsT0FBTyxJQUFJLFVBQVUsWUFBWSxZQUFZO0FBQ2pILGtCQUFNO0FBQUE7QUFBQTtBQUlWLGlDQUF5QjtBQUN6QixrQ0FBMEIsa0JBQWtCLGlCQUFpQjtBQUU3RCxnQ0FBd0IsVUFBVSxXQUFXO0FBQzNDLGNBQUksTUFBTSxVQUFVLFNBQVMsS0FBSyxVQUFVLE9BQU8sU0FBWSxVQUFVLEtBQUs7QUFFOUUsY0FBSSxDQUFDLGlCQUFpQixZQUFZO0FBQ2hDLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBS2xCLGlCQUFPLGFBQWEsVUFBVSxXQUFXLE1BQU07QUFBQTtBQUdqRCw0Q0FBb0MsaUJBQWlCLFNBQVMsZUFBZSxVQUFVO0FBQ3JGLGlCQUFPLG9DQUFvQyxpQkFBaUIsU0FBUyxlQUFlO0FBQUE7QUFHdEYsWUFBSSxZQUFZO0FBQUEsVUFDZCx1QkFBdUI7QUFBQSxVQUd2QixRQUFRLENBQUMscUJBQXFCLHFCQUFxQiw4QkFBOEIscUJBQXFCLHNCQUFzQjtBQUFBO0FBRzlILDhCQUFzQixXQUFXLFVBQVM7QUFDeEM7QUFDRSxnQkFBSSxDQUFDLFVBQVUseUJBQXlCLE1BQVE7QUFDOUMsb0JBQU07QUFBQTtBQUFBO0FBSVYsaUJBQU8sWUFBVyxXQUFXO0FBQUE7QUFHL0IsK0JBQXVCLFdBQVcsaUJBQWlCLFVBQVM7QUFDMUQ7QUFDRSxnQkFBSSxDQUFDLFVBQVUseUJBQXlCLE1BQVE7QUFDOUMsb0JBQU07QUFBQTtBQUFBO0FBSVYsaUJBQU8sWUFBWSxXQUFXLGlCQUFpQjtBQUFBO0FBTWpELDZCQUFxQixJQUFJO0FBQ3ZCO0FBQ0UsZ0JBQUksc0JBQXNCO0FBQ3hCLG9CQUFNO0FBQUE7QUFBQTtBQUlWLGlCQUFPLFVBQVU7QUFBQTtBQUVuQixZQUFJLGdCQUFnQixtQkFBbUI7QUFBQSxVQUNyQyx5QkFBeUI7QUFBQSxVQUN6QixZQUFhO0FBQUEsVUFDYixTQUFTO0FBQUEsVUFDVCxxQkFBcUI7QUFBQTtBQUd2QjtBQUNFLGNBQUksQ0FBQyxpQkFBaUIsYUFBYSxPQUFPLFFBQVEsT0FBTyxNQUFNO0FBRTdELGdCQUFJLFVBQVUsVUFBVSxRQUFRLFlBQVksTUFBTSxVQUFVLFVBQVUsUUFBUSxZQUFZLE1BQU0sVUFBVSxVQUFVLFFBQVEsYUFBYSxJQUFJO0FBQzNJLGtCQUFJLFdBQVcsT0FBTyxTQUFTO0FBRS9CLGtCQUFJLG1CQUFtQixLQUFLLFdBQVc7QUFFckMsd0JBQVEsS0FBSywrR0FBMEgsY0FBYSxVQUFVLGtIQUF1SCxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNbFMsZ0JBQVEscURBQXFEO0FBQzdELGdCQUFRLGVBQWU7QUFDdkIsZ0JBQVEsYUFBYTtBQUNyQixnQkFBUSxjQUFjO0FBQ3RCLGdCQUFRLFlBQVk7QUFDcEIsZ0JBQVEsVUFBVTtBQUNsQixnQkFBUSxjQUFjO0FBQ3RCLGdCQUFRLFNBQVM7QUFDakIsZ0JBQVEseUJBQXlCO0FBQ2pDLGdCQUFRLDBCQUEwQjtBQUNsQyxnQkFBUSxzQ0FBc0M7QUFDOUMsZ0JBQVEsVUFBVTtBQUVsQixZQUNFLE9BQU8sbUNBQW1DLGVBQzFDLE9BQU8sK0JBQStCLCtCQUNwQyxZQUNGO0FBQ0EseUNBQStCLDJCQUEyQixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDcms2QmhFO0FBQUE7QUFBQTtBQUVBLHdCQUFvQjtBQUVsQixVQUNFLE9BQU8sbUNBQW1DLGVBQzFDLE9BQU8sK0JBQStCLGFBQWEsWUFDbkQ7QUFDQTtBQUFBO0FBRUYsVUFBSSxRQUFRLElBQUksYUFBYSxjQUFjO0FBUXpDLGNBQU0sSUFBSSxNQUFNO0FBQUE7QUFFbEIsVUFBSTtBQUVGLHVDQUErQixTQUFTO0FBQUEsZUFDakMsS0FBUDtBQUdBLGdCQUFRLE1BQU07QUFBQTtBQUFBO0FBSWxCLFFBQUksUUFBUSxJQUFJLGFBQWEsY0FBYztBQUd6QztBQUNBLGNBQU8sVUFBVTtBQUFBLFdBQ1o7QUFDTCxjQUFPLFVBQVU7QUFBQTtBQUFBO0FBQUE7OztBQ3BDbkI7QUFBQTtBQUFBO0FBRUEsUUFBSSxJQUFJO0FBQ1IsUUFBSSxRQUFRLElBQUksYUFBYSxjQUFjO0FBQ3pDLGNBQVEsYUFBYSxFQUFFO0FBQ3ZCLGNBQVEsY0FBYyxFQUFFO0FBQUEsV0FDbkI7QUFDRCxVQUFJLEVBQUU7QUFDVixjQUFRLGFBQWEsU0FBUyxHQUFHLEdBQUc7QUFDbEMsVUFBRSx3QkFBd0I7QUFDMUIsWUFBSTtBQUNGLGlCQUFPLEVBQUUsV0FBVyxHQUFHO0FBQUEsa0JBQ3ZCO0FBQ0EsWUFBRSx3QkFBd0I7QUFBQTtBQUFBO0FBRzlCLGNBQVEsY0FBYyxTQUFTLEdBQUcsR0FBRyxHQUFHO0FBQ3RDLFVBQUUsd0JBQXdCO0FBQzFCLFlBQUk7QUFDRixpQkFBTyxFQUFFLFlBQVksR0FBRyxHQUFHO0FBQUEsa0JBQzNCO0FBQ0EsWUFBRSx3QkFBd0I7QUFBQTtBQUFBO0FBQUE7QUFkMUI7QUFBQTtBQUFBOzs7QUNQTjtBQUFBO0FBVUEsUUFBSSxXQUFXLFFBQVEsUUFBUTtBQU0vQixZQUFPLFVBQVU7QUFNakIsUUFBSSxXQUFXLFFBQVE7QUFNdkIsK0JBQTRCLEtBQUssV0FBVztBQUMxQyxVQUFJLE9BQU8sSUFBSSxNQUFNO0FBQ3JCLFVBQUksS0FBSyxPQUFPLFdBQVc7QUFFM0IsZUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUNwQyxZQUFJLE1BQU0sS0FBSztBQUdmLFlBQUksT0FBUSxTQUFRLE9BQU8sSUFBSSxrQkFBa0IsS0FBSztBQUNwRCxpQkFBTztBQUFBO0FBQUE7QUFJWCxhQUFPO0FBQUE7QUFPVCw2Q0FBMEMsS0FBSyxNQUFNLFNBQVM7QUFDNUQsVUFBSSxhQUFhLE9BQU8seUJBQXlCLEtBQUs7QUFDdEQsVUFBSSxRQUFRLFdBQVc7QUFFdkIsaUJBQVcsTUFBTSxrQkFBbUI7QUFBRSxlQUFPO0FBQUE7QUFFN0MsVUFBSSxXQUFXLFVBQVU7QUFDdkIsbUJBQVcsTUFBTSxnQkFBaUIsS0FBSztBQUFFLGlCQUFRLFFBQVE7QUFBQTtBQUFBO0FBRzNELGFBQU8sV0FBVztBQUNsQixhQUFPLFdBQVc7QUFFbEIsYUFBTyxlQUFlLEtBQUssTUFBTTtBQUVqQyxhQUFPO0FBQUE7QUFPVCxtQ0FBZ0MsT0FBTztBQUNyQyxVQUFJLE1BQU07QUFFVixlQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sS0FBSztBQUM5QixlQUFPLFVBQVU7QUFBQTtBQUduQixhQUFPLElBQUksT0FBTztBQUFBO0FBT3BCLCtCQUE0QixPQUFPO0FBQ2pDLFVBQUksTUFBTSxLQUFLLE9BQU8sT0FBTyxLQUFLO0FBRWxDLFVBQUksS0FBSyxTQUFTO0FBQ2hCLGVBQU8saUJBQWlCLEtBQUs7QUFBQTtBQUcvQixlQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQ3JDLGVBQU8sY0FBYyxNQUFNLEdBQUc7QUFBQTtBQUdoQyxhQUFPO0FBQUE7QUFPVCxrQkFBZSxXQUFXO0FBQ3hCLFVBQUksQ0FBQyxXQUFXO0FBQ2QsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixVQUFJLFFBQVE7QUFDWixVQUFJLE9BQU8saUJBQWlCLE1BQU07QUFDbEMsVUFBSSxPQUFPLEtBQUs7QUFFaEIseUJBQW9CLFNBQVM7QUFFM0IsWUFBSSxLQUFLLFdBQVc7QUFBQTtBQUd0QixnQkFBVSxRQUFRO0FBQ2xCLGdCQUFVLFdBQVcsVUFBVTtBQUMvQixnQkFBVSxhQUFhO0FBQ3ZCLGdCQUFVLFVBQVUsU0FBUztBQUM3QixnQkFBVSxVQUFVLE9BQU8sT0FBTztBQUVsQyxnQkFBVSxXQUFXO0FBQ3JCLGdCQUFVLFdBQVc7QUFFckIsYUFBTztBQUFBO0FBZVQsNEJBQXlCLFNBQVMsTUFBTTtBQUN0QyxVQUFJLFFBQVEsT0FBTyxRQUFRLGtCQUFrQixhQUN6QyxRQUFRLFVBQVUsTUFBTSxTQUN4QixRQUFRLGNBQWM7QUFFMUIsYUFBTyxRQUFRO0FBQUE7QUFPakIsdUJBQW9CLFdBQVc7QUFDN0IsVUFBSSxRQUFRLGVBQWU7QUFFekIsZUFBTztBQUFBO0FBR1QsVUFBSSxNQUFNLFFBQVEsSUFBSSxrQkFBa0I7QUFHeEMsYUFBTyxrQkFBa0IsS0FBSztBQUFBO0FBT2hDLHNCQUFtQixXQUFXO0FBQzVCLFVBQUksUUFBUSxrQkFBa0I7QUFFNUIsZUFBTztBQUFBO0FBR1QsVUFBSSxNQUFNLFFBQVEsSUFBSSxxQkFBcUI7QUFHM0MsYUFBTyxrQkFBa0IsS0FBSztBQUFBO0FBT2hDLGlCQUFjLFNBQVMsTUFBTTtBQUMzQixVQUFJLGVBQWUsZUFBZSxTQUFTO0FBRzNDLFVBQUksQ0FBQyxnQkFBZ0IsS0FBSyxVQUFVO0FBQ2xDO0FBQUE7QUFHRixVQUFJO0FBQ0osVUFBSTtBQUNKLFVBQUk7QUFDSixVQUFJO0FBQ0osVUFBSSxJQUFJO0FBQ1IsVUFBSSxPQUFPO0FBQ1gsVUFBSSxRQUFRO0FBQ1osVUFBSSxPQUFPLEtBQUs7QUFFaEIsVUFBSSxNQUFNO0FBRVIsa0JBQVU7QUFDVixtQkFBVyxpQkFBaUIsTUFBTTtBQUNsQyxpQkFBUyxPQUFPLFFBQVE7QUFDeEIsZUFBTyxTQUFTO0FBQUEsYUFDWDtBQUVMLFlBQUk7QUFDSixrQkFBVSxpQkFBaUIsTUFBTTtBQUNqQyxtQkFBVztBQUFBO0FBSWIsYUFBTyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQzVCLGlCQUFTLGlCQUFpQixNQUFNO0FBQ2hDLG1CQUFXLE9BQU87QUFFbEIsWUFBSSxhQUFhLE1BQU07QUFDckIsaUJBQU87QUFBQSxtQkFDRSxhQUFhLEtBQUssT0FBTztBQUNsQyxpQkFBTyxLQUFLO0FBQUEsbUJBQ0gsTUFBTTtBQUNmO0FBQUE7QUFBQTtBQUlKLFVBQUksTUFBTSxTQUNOLFFBQVEsS0FBSyxPQUFPLE9BQU8sT0FBTyxLQUFLLE9BQ3ZDO0FBRUosVUFBSSxRQUFRLFVBQWEsT0FBTyxLQUFLLFNBQVM7QUFFNUM7QUFBQTtBQUdGLFdBQUssUUFBUSxPQUFPO0FBR3BCLFVBQUksTUFBTTtBQUNWLFVBQUksQ0FBQyxLQUFLO0FBQ1IsY0FBTSxhQUFhLFdBQVcsQ0FBQyxTQUFTLE9BQ3BDLGVBQWUsV0FDZixlQUFlO0FBQUE7QUFJckIsVUFBSSxjQUFjO0FBQ2hCLFlBQUksTUFBTSxpQkFBaUIsS0FBSyxZQUFZLEtBQUssTUFBTSxNQUFNO0FBQzdELGdCQUFRLEtBQUssZUFBZTtBQUM1QjtBQUFBO0FBSUYsVUFBSSxTQUFTLFFBQVEsT0FBTyxRQUN4QixjQUNBO0FBQ0osVUFBSSxTQUFTLE9BQU8sS0FBSyxNQUFNLEtBQUssUUFBUSxNQUFNLE1BQU07QUFDeEQsY0FBUSxPQUFPLE1BQU0sU0FBUyxNQUFNO0FBQUE7QUFPdEMsOEJBQTJCLFVBQVU7QUFDbkMsVUFBSSxPQUFPLFNBQVMsaUJBQWlCO0FBQ3JDLFVBQUksT0FBTyxTQUFTO0FBQ3BCLFVBQUksT0FBTyxTQUFTO0FBRXBCLFVBQUksU0FBUyxVQUFVO0FBQ3JCLGVBQU8sU0FBUyxrQkFBa0IsT0FBTztBQUFBO0FBRzNDLFVBQUksT0FBTyxDQUFDLE1BQU0sTUFBTTtBQUV4QixXQUFLLFdBQVc7QUFDaEIsV0FBSyxPQUFPLFNBQVM7QUFFckIsYUFBTztBQUFBO0FBT1QsNEJBQXlCLE1BQU07QUFDN0IsVUFBSSxXQUFXLEtBQUs7QUFDcEIsVUFBSSxXQUFXLEtBQUs7QUFHcEIsVUFBSSxDQUFDLFVBQVU7QUFDYixtQkFBVyxnQkFBZ0IsZUFBZSxRQUFRO0FBQUE7QUFHcEQsVUFBSSxVQUFVLFNBQVM7QUFDdkIsVUFBSSxXQUFXLFdBQVcsU0FBUztBQUduQyxVQUFJLGFBQWEsVUFBVTtBQUN6QixtQkFBVztBQUFBO0FBSWIsVUFBSSxhQUFhLFlBQVk7QUFDM0IsbUJBQVcsUUFBUSxRQUFRO0FBQUE7QUFHN0IsYUFBTyxZQUFZLFNBQVMsa0JBQ3hCLFdBQVcsTUFBTSxXQUNqQjtBQUFBO0FBT04seUJBQXNCLEtBQUssUUFBUSxPQUFPO0FBQ3hDLFVBQUksWUFBWSxJQUFJLE9BQU87QUFFM0IsVUFBSSxZQUFZLFlBQ2QsTUFBTSxLQUFLLGFBQ1gsaUJBQWlCO0FBR25CLFVBQUksS0FBSyxTQUFTO0FBQ2hCLGlCQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQ3JDLHVCQUFhLGNBQWMsTUFBTSxHQUFHO0FBQUE7QUFHdEMsZUFBTztBQUFBO0FBR1QsVUFBSSxRQUFRO0FBQ1YscUJBQWEsU0FBUyxlQUFlO0FBQUE7QUFHdkMsYUFBTztBQUFBO0FBT1QseUJBQXNCLEtBQUssUUFBUSxPQUFPO0FBQ3hDLFVBQUksWUFBWSxZQUFlLEtBQUssYUFBYSw0Q0FFbEMsTUFBTTtBQUdyQixVQUFJLEtBQUssU0FBUztBQUNoQixpQkFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNyQyx1QkFBYSxtQkFBc0IsTUFBTSxHQUFHLGFBQWE7QUFBQTtBQUczRCxlQUFPO0FBQUE7QUFHVCxVQUFJLFFBQVE7QUFDVixxQkFBYSxXQUFjLGVBQWUsVUFBVTtBQUFBO0FBR3RELGFBQU87QUFBQTtBQU9ULDRCQUF5QixVQUFVO0FBQ2pDLGFBQU8sU0FBUyxVQUFVLFNBQVMsTUFDakMsTUFBTSxTQUFTLEtBQ2YsTUFBTSxTQUFTO0FBQUE7QUFPbkIsd0JBQXFCO0FBQ25CLFVBQUksUUFBUSxNQUFNO0FBQ2xCLFVBQUksTUFBTTtBQUNWLFVBQUksT0FBTyxNQUFNO0FBRWpCLFlBQU0sb0JBQW9CO0FBQzFCLFlBQU0sa0JBQWtCLEtBQUssSUFBSSxJQUFJO0FBR3JDLFlBQU0sa0JBQWtCO0FBR3hCLFVBQUksUUFBUSxJQUFJLE1BQU0sTUFBTTtBQUU1QixZQUFNLG9CQUFvQjtBQUMxQixZQUFNLGtCQUFrQjtBQUV4QixhQUFPO0FBQUE7QUFPVCxxQ0FBa0MsS0FBSyxPQUFPO0FBQzVDLGFBQU87QUFBQTtBQU9ULDBCQUF1QixJQUFJLFNBQVM7QUFDbEMsVUFBSSxPQUFPLE9BQU8sWUFBWTtBQUM1QixjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksT0FBTyxzQkFBc0IsR0FBRztBQUNwQyxVQUFJLFFBQVE7QUFDWixVQUFJLE9BQU8saUJBQWlCLE1BQU07QUFFbEMsV0FBSyxPQUFPLEdBQUc7QUFHZixVQUFJLGVBQWUsSUFBSSxTQUFTLE1BQU0sT0FBTyxhQUFhLFdBQVcsUUFDbkUsb0NBQ3NCLE9BQU8sOEVBR3hCLElBQUksS0FBSyxNQUFNLFNBQVM7QUFFL0IsYUFBTztBQUFBO0FBT1QsMEJBQXVCLEtBQUssTUFBTSxTQUFTO0FBQ3pDLFVBQUksQ0FBQyxPQUFRLE9BQU8sUUFBUSxZQUFZLE9BQU8sUUFBUSxZQUFhO0FBQ2xFLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsVUFBSSxhQUFhLE9BQU8seUJBQXlCLEtBQUs7QUFFdEQsVUFBSSxDQUFDLFlBQVk7QUFDZixjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksQ0FBQyxXQUFXLGNBQWM7QUFDNUIsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixVQUFJLFlBQVk7QUFDaEIsVUFBSSxRQUFRO0FBQ1osVUFBSSxPQUFPLGlCQUFpQixNQUFNO0FBR2xDLFdBQUssT0FBTztBQUdaLFVBQUksV0FBVyxZQUFZO0FBQ3pCLHFCQUFhLGdDQUFnQyxLQUFLLE1BQU07QUFBQTtBQUcxRCxVQUFJLE9BQU0sV0FBVztBQUNyQixVQUFJLE1BQU0sV0FBVztBQUdyQixVQUFJLE9BQU8sU0FBUSxZQUFZO0FBQzdCLG1CQUFXLE1BQU0sa0JBQW1CO0FBQ2xDLGNBQUksS0FBSyxXQUFXLFNBQVM7QUFDN0IsaUJBQU8sS0FBSSxNQUFNLE1BQU07QUFBQTtBQUFBO0FBSzNCLFVBQUksT0FBTyxRQUFRLFlBQVk7QUFDN0IsbUJBQVcsTUFBTSxrQkFBbUI7QUFDbEMsY0FBSSxLQUFLLFdBQVcsU0FBUztBQUM3QixpQkFBTyxJQUFJLE1BQU0sTUFBTTtBQUFBO0FBQUE7QUFJM0IsYUFBTyxlQUFlLEtBQUssTUFBTTtBQUFBO0FBT25DLDhCQUEyQixXQUFXLFNBQVMsT0FBTztBQUNwRCxVQUFJLFFBQVEsSUFBSTtBQUNoQixVQUFJO0FBRUosYUFBTyxlQUFlLE9BQU8sZUFBZTtBQUFBLFFBQzFDLE9BQU87QUFBQTtBQUdULGFBQU8sZUFBZSxPQUFPLFdBQVc7QUFBQSxRQUN0QyxjQUFjO0FBQUEsUUFDZCxZQUFZO0FBQUEsUUFDWixPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUE7QUFHWixhQUFPLGVBQWUsT0FBTyxRQUFRO0FBQUEsUUFDbkMsWUFBWTtBQUFBLFFBQ1osY0FBYztBQUFBLFFBQ2QsT0FBTztBQUFBLFFBQ1AsVUFBVTtBQUFBO0FBR1osYUFBTyxlQUFlLE9BQU8sYUFBYTtBQUFBLFFBQ3hDLGNBQWM7QUFBQSxRQUNkLFlBQVk7QUFBQSxRQUNaLE9BQU87QUFBQSxRQUNQLFVBQVU7QUFBQTtBQUdaLGFBQU8sZUFBZSxPQUFPLFNBQVM7QUFBQSxRQUNwQyxjQUFjO0FBQUEsUUFDZCxZQUFZO0FBQUEsUUFDWixLQUFLLFdBQVk7QUFDZixjQUFJLGdCQUFnQixRQUFXO0FBQzdCLG1CQUFPO0FBQUE7QUFJVCxpQkFBUSxjQUFjLGtCQUFrQixLQUFLLE1BQU07QUFBQTtBQUFBLFFBRXJELEtBQUssZ0JBQWlCLEtBQUs7QUFDekIsd0JBQWM7QUFBQTtBQUFBO0FBSWxCLGFBQU87QUFBQTtBQUFBO0FBQUE7OztBQ3hoQlQ7QUFBQTtBQU9BO0FBT0EsWUFBTyxVQUFVO0FBQ2pCLFlBQU8sUUFBUSxTQUFTO0FBQ3hCLFlBQU8sUUFBUSxRQUFRO0FBT3ZCLFFBQUksd0JBQXdCO0FBRTVCLFFBQUksdUJBQXVCO0FBRTNCLFFBQUksTUFBTTtBQUFBLE1BQ1IsR0FBSTtBQUFBLE1BQ0osSUFBSSxLQUFLO0FBQUEsTUFDVCxJQUFJLEtBQUs7QUFBQSxNQUNULElBQUksS0FBSztBQUFBLE1BQ1QsSUFBSSxLQUFLLElBQUksTUFBTTtBQUFBLE1BQ25CLElBQUksS0FBSyxJQUFJLE1BQU07QUFBQTtBQUdyQixRQUFJLGNBQWM7QUFpQmxCLG1CQUFlLE9BQU8sU0FBUztBQUM3QixVQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLGVBQU8sTUFBTTtBQUFBO0FBR2YsVUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixlQUFPLE9BQU8sT0FBTztBQUFBO0FBR3ZCLGFBQU87QUFBQTtBQXFCVCxvQkFBZ0IsT0FBTyxTQUFTO0FBQzlCLFVBQUksQ0FBQyxPQUFPLFNBQVMsUUFBUTtBQUMzQixlQUFPO0FBQUE7QUFHVCxVQUFJLE1BQU0sS0FBSyxJQUFJO0FBQ25CLFVBQUkscUJBQXNCLFdBQVcsUUFBUSxzQkFBdUI7QUFDcEUsVUFBSSxnQkFBaUIsV0FBVyxRQUFRLGlCQUFrQjtBQUMxRCxVQUFJLGdCQUFpQixXQUFXLFFBQVEsa0JBQWtCLFNBQWEsUUFBUSxnQkFBZ0I7QUFDL0YsVUFBSSxnQkFBZ0IsUUFBUSxXQUFXLFFBQVE7QUFDL0MsVUFBSSxPQUFRLFdBQVcsUUFBUSxRQUFTO0FBRXhDLFVBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLGdCQUFnQjtBQUNyQyxZQUFJLE9BQU8sSUFBSSxJQUFJO0FBQ2pCLGlCQUFPO0FBQUEsbUJBQ0UsT0FBTyxJQUFJLElBQUk7QUFDeEIsaUJBQU87QUFBQSxtQkFDRSxPQUFPLElBQUksSUFBSTtBQUN4QixpQkFBTztBQUFBLG1CQUNFLE9BQU8sSUFBSSxJQUFJO0FBQ3hCLGlCQUFPO0FBQUEsbUJBQ0UsT0FBTyxJQUFJLElBQUk7QUFDeEIsaUJBQU87QUFBQSxlQUNGO0FBQ0wsaUJBQU87QUFBQTtBQUFBO0FBSVgsVUFBSSxNQUFNLFFBQVEsSUFBSSxLQUFLO0FBQzNCLFVBQUksTUFBTSxJQUFJLFFBQVE7QUFFdEIsVUFBSSxDQUFDLGVBQWU7QUFDbEIsY0FBTSxJQUFJLFFBQVEsc0JBQXNCO0FBQUE7QUFHMUMsVUFBSSxvQkFBb0I7QUFDdEIsY0FBTSxJQUFJLE1BQU0sS0FBSyxJQUFJLFNBQVUsR0FBRyxHQUFHO0FBQ3ZDLGlCQUFPLE1BQU0sSUFDVCxFQUFFLFFBQVEsdUJBQXVCLHNCQUNqQztBQUFBLFdBQ0gsS0FBSztBQUFBO0FBR1YsYUFBTyxNQUFNLGdCQUFnQjtBQUFBO0FBYy9CLG1CQUFlLEtBQUs7QUFDbEIsVUFBSSxPQUFPLFFBQVEsWUFBWSxDQUFDLE1BQU0sTUFBTTtBQUMxQyxlQUFPO0FBQUE7QUFHVCxVQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLGVBQU87QUFBQTtBQUlULFVBQUksVUFBVSxZQUFZLEtBQUs7QUFDL0IsVUFBSTtBQUNKLFVBQUksT0FBTztBQUVYLFVBQUksQ0FBQyxTQUFTO0FBRVoscUJBQWEsU0FBUyxLQUFLO0FBQzNCLGVBQU87QUFBQSxhQUNGO0FBRUwscUJBQWEsV0FBVyxRQUFRO0FBQ2hDLGVBQU8sUUFBUSxHQUFHO0FBQUE7QUFHcEIsVUFBSSxNQUFNLGFBQWE7QUFDckIsZUFBTztBQUFBO0FBR1QsYUFBTyxLQUFLLE1BQU0sSUFBSSxRQUFRO0FBQUE7QUFBQTtBQUFBOzs7QUN4S2hDO0FBQUE7QUFNQTtBQWdCQSxRQUFJLGVBQWU7QUFDbkIsUUFBSSxjQUFjO0FBQ2xCLFFBQUksZUFBZTtBQVFuQixRQUFJLGNBQWM7QUFLbEIsUUFBSSxlQUFlO0FBU25CLFFBQUksY0FBYztBQU9sQixZQUFRLFNBQVM7QUFDakIsWUFBUSxRQUFRO0FBVWhCLG9CQUFpQixLQUFLO0FBQ3BCLFVBQUksQ0FBQyxPQUFPLE9BQU8sUUFBUSxVQUFVO0FBQ25DLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsVUFBSSxhQUFhLElBQUk7QUFDckIsVUFBSSxPQUFPLElBQUk7QUFFZixVQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksS0FBSyxPQUFPO0FBQ3BDLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsVUFBSSxTQUFTO0FBR2IsVUFBSSxjQUFjLE9BQU8sZUFBZSxVQUFVO0FBQ2hELFlBQUk7QUFDSixZQUFJLFNBQVMsT0FBTyxLQUFLLFlBQVk7QUFFckMsaUJBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEtBQUs7QUFDdEMsa0JBQVEsT0FBTztBQUVmLGNBQUksQ0FBQyxhQUFhLEtBQUssUUFBUTtBQUM3QixrQkFBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixvQkFBVSxPQUFPLFFBQVEsTUFBTSxRQUFRLFdBQVc7QUFBQTtBQUFBO0FBSXRELGFBQU87QUFBQTtBQVdULG1CQUFnQixRQUFRO0FBQ3RCLFVBQUksQ0FBQyxRQUFRO0FBQ1gsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUl0QixVQUFJLFNBQVMsT0FBTyxXQUFXLFdBQzNCLGVBQWUsVUFDZjtBQUVKLFVBQUksT0FBTyxXQUFXLFVBQVU7QUFDOUIsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixVQUFJLFFBQVEsT0FBTyxRQUFRO0FBQzNCLFVBQUksT0FBTyxVQUFVLEtBQ2pCLE9BQU8sTUFBTSxHQUFHLE9BQU8sU0FDdkIsT0FBTztBQUVYLFVBQUksQ0FBQyxZQUFZLEtBQUssT0FBTztBQUMzQixjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksTUFBTSxJQUFJLFlBQVksS0FBSztBQUcvQixVQUFJLFVBQVUsSUFBSTtBQUNoQixZQUFJO0FBQ0osWUFBSTtBQUNKLFlBQUk7QUFFSixxQkFBYSxZQUFZO0FBRXpCLGVBQVEsUUFBUSxhQUFhLEtBQUssU0FBVTtBQUMxQyxjQUFJLE1BQU0sVUFBVSxPQUFPO0FBQ3pCLGtCQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLG1CQUFTLE1BQU0sR0FBRztBQUNsQixnQkFBTSxNQUFNLEdBQUc7QUFDZixrQkFBUSxNQUFNO0FBRWQsY0FBSSxNQUFNLFdBQVcsT0FBTyxJQUFjO0FBRXhDLG9CQUFRLE1BQU0sTUFBTSxHQUFHO0FBR3ZCLGdCQUFJLE1BQU0sUUFBUSxVQUFVLElBQUk7QUFDOUIsc0JBQVEsTUFBTSxRQUFRLGFBQWE7QUFBQTtBQUFBO0FBSXZDLGNBQUksV0FBVyxPQUFPO0FBQUE7QUFHeEIsWUFBSSxVQUFVLE9BQU8sUUFBUTtBQUMzQixnQkFBTSxJQUFJLFVBQVU7QUFBQTtBQUFBO0FBSXhCLGFBQU87QUFBQTtBQVdULDRCQUF5QixLQUFLO0FBQzVCLFVBQUk7QUFFSixVQUFJLE9BQU8sSUFBSSxjQUFjLFlBQVk7QUFFdkMsaUJBQVMsSUFBSSxVQUFVO0FBQUEsaUJBQ2QsT0FBTyxJQUFJLFlBQVksVUFBVTtBQUUxQyxpQkFBUyxJQUFJLFdBQVcsSUFBSSxRQUFRO0FBQUE7QUFHdEMsVUFBSSxPQUFPLFdBQVcsVUFBVTtBQUM5QixjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLGFBQU87QUFBQTtBQVdULHFCQUFrQixLQUFLO0FBQ3JCLFVBQUksTUFBTSxPQUFPO0FBR2pCLFVBQUksYUFBYSxLQUFLLE1BQU07QUFDMUIsZUFBTztBQUFBO0FBR1QsVUFBSSxJQUFJLFNBQVMsS0FBSyxDQUFDLFlBQVksS0FBSyxNQUFNO0FBQzVDLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsYUFBTyxNQUFNLElBQUksUUFBUSxjQUFjLFVBQVU7QUFBQTtBQU9uRCx5QkFBc0IsTUFBTTtBQUMxQixXQUFLLGFBQWEsT0FBTyxPQUFPO0FBQ2hDLFdBQUssT0FBTztBQUFBO0FBQUE7QUFBQTs7O0FDL05kO0FBQUE7QUFBQTtBQUVBLFlBQU8sVUFBVSxPQUFPLGtCQUFtQixHQUFFLFdBQVcsZ0JBQWdCLFFBQVEsYUFBYTtBQUU3Rix3QkFBcUIsS0FBSyxPQUFPO0FBQy9CLFVBQUksWUFBWTtBQUNoQixhQUFPO0FBQUE7QUFHVCw2QkFBMEIsS0FBSyxPQUFPO0FBQ3BDLGVBQVMsUUFBUSxPQUFPO0FBQ3RCLFlBQUksQ0FBQyxPQUFPLFVBQVUsZUFBZSxLQUFLLEtBQUssT0FBTztBQUNwRCxjQUFJLFFBQVEsTUFBTTtBQUFBO0FBQUE7QUFHdEIsYUFBTztBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNmVDtBQUFBO0FBT0E7QUFPQSxRQUFJLFFBQVE7QUFPWixZQUFPLFVBQVU7QUFHakIsV0FBTyxVQUFVO0FBR2pCLFdBQU8sT0FBTyw2QkFBNkI7QUFHM0MsV0FBTyxRQUFRLHFCQUFxQjtBQUdwQyxXQUFPLFdBQVc7QUFBQSxNQUNoQixLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUEsTUFDTCxLQUFLO0FBQUE7QUFJUCxXQUFPLFFBQVE7QUFBQSxNQUNiLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQSxNQUNMLEtBQUs7QUFBQTtBQUlQLFdBQU8sUUFBUTtBQUFBLE1BQ2IsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBLE1BQ0wsS0FBSztBQUFBO0FBUVAsMENBQXVDLFFBQU87QUFDNUMsVUFBSSxNQUFNO0FBRVYsYUFBTyxLQUFLLFFBQU8sUUFBUSxxQkFBc0IsTUFBTTtBQUNyRCxZQUFJLFVBQVUsT0FBTTtBQUNwQixZQUFJLFVBQVMsT0FBTztBQUdwQixZQUFJLFFBQVEsaUJBQWlCO0FBQUE7QUFHL0IsYUFBTztBQUFBO0FBUVQsa0NBQStCLFFBQU87QUFDcEMsYUFBTyxPQUFPLEtBQUssUUFBTyxJQUFJLGlCQUFrQixNQUFNO0FBQ3BELGVBQU8sT0FBTztBQUFBO0FBQUE7QUFTbEIsMkJBQXdCLFNBQVM7QUFDL0IsVUFBSSxNQUFNLFFBQVE7QUFFbEIsVUFBSSxDQUFDLE9BQU8sVUFBVSxlQUFlLEtBQUssT0FBTyxNQUFNLE1BQU07QUFDM0QsY0FBTSxJQUFJLE1BQU0sOEJBQThCLFVBQVU7QUFBQTtBQUcxRCxhQUFPLE9BQU8sS0FBSztBQUFBO0FBUXJCLDhCQUEyQixNQUFNO0FBQy9CLFVBQUksQ0FBQyxPQUFPLFVBQVUsZUFBZSxLQUFLLE9BQU8sU0FBUyxPQUFPO0FBQy9ELGNBQU0sSUFBSSxNQUFNLDBCQUEwQjtBQUFBO0FBRzVDLGFBQU8sT0FBTyxRQUFRO0FBQUE7QUFpQnhCLG9CQUFpQixNQUFNO0FBQ3JCLFVBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsZUFBTyxpQkFBaUI7QUFBQTtBQUcxQixVQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFJdEIsVUFBSSxJQUFJLFNBQVMsTUFBTTtBQUN2QixVQUFJLENBQUMsTUFBTSxJQUFJO0FBQ2IsZUFBTyxpQkFBaUI7QUFBQTtBQUcxQixhQUFPLGNBQWM7QUFBQTtBQUFBO0FBQUE7OztBQ2hKdkI7QUFBQTtBQUFBLFFBQUksT0FBTyxPQUFPLFdBQVcsWUFBWTtBQUV2QyxjQUFPLFVBQVUsa0JBQWtCLE1BQU0sV0FBVztBQUNsRCxZQUFJLFdBQVc7QUFDYixlQUFLLFNBQVM7QUFDZCxlQUFLLFlBQVksT0FBTyxPQUFPLFVBQVUsV0FBVztBQUFBLFlBQ2xELGFBQWE7QUFBQSxjQUNYLE9BQU87QUFBQSxjQUNQLFlBQVk7QUFBQSxjQUNaLFVBQVU7QUFBQSxjQUNWLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFdBS2pCO0FBRUwsY0FBTyxVQUFVLGtCQUFrQixNQUFNLFdBQVc7QUFDbEQsWUFBSSxXQUFXO0FBQ2IsZUFBSyxTQUFTO0FBQ2QsY0FBSSxXQUFXLFdBQVk7QUFBQTtBQUMzQixtQkFBUyxZQUFZLFVBQVU7QUFDL0IsZUFBSyxZQUFZLElBQUk7QUFDckIsZUFBSyxVQUFVLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUN2Qm5DO0FBQUE7QUFBQSxRQUFJO0FBQ0UsYUFBTyxRQUFRO0FBRW5CLFVBQUksT0FBTyxLQUFLLGFBQWE7QUFBWSxjQUFNO0FBQy9DLGNBQU8sVUFBVSxLQUFLO0FBQUEsYUFDZixHQUFQO0FBRUEsY0FBTyxVQUFVO0FBQUE7QUFOYjtBQUFBO0FBQUE7OztBQ0ROO0FBQUE7QUFNQTtBQU9BLFlBQU8sVUFBVTtBQVVqQiwwQkFBdUIsS0FBSztBQUMxQixhQUFPLElBQ0osTUFBTSxLQUNOLElBQUksU0FBVSxPQUFPO0FBQ3BCLGVBQU8sTUFBTSxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsTUFBTSxNQUFNO0FBQUEsU0FFdEQsS0FBSyxJQUNMLFFBQVEsaUJBQWlCO0FBQUE7QUFBQTtBQUFBOzs7QUM5QjlCO0FBQUE7QUFPQTtBQU9BLFFBQUksWUFBWSxlQUFnQjtBQUNoQyxRQUFJLGlCQUFpQjtBQUNyQixRQUFJLFdBQVc7QUFDZixRQUFJLFdBQVc7QUFDZixRQUFJLGVBQWU7QUFPbkIsWUFBTyxVQUFVO0FBQ2pCLFlBQU8sUUFBUSxZQUFZO0FBQzNCLFlBQU8sUUFBUSxjQUFjLDBCQUEwQixRQUFPLFFBQVE7QUFHdEUsK0JBQTJCLFFBQU8sU0FBUyxTQUFTLE9BQU8sUUFBTyxRQUFRO0FBTzFFLHVCQUFvQixRQUFRO0FBQzFCLGFBQU8sT0FBTyxPQUFPLFFBQVEsT0FBTyxLQUFLO0FBQUE7QUFVM0MsMkJBQXdCO0FBRXRCLFVBQUk7QUFDSixVQUFJO0FBQ0osVUFBSSxTQUFTO0FBQ2IsVUFBSSxRQUFRO0FBQ1osZUFBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsS0FBSztBQUN6QyxZQUFJLE1BQU0sVUFBVTtBQUNwQixZQUFJLE9BQU8sT0FBTztBQUNsQixZQUFJLFNBQVMsWUFBWSxlQUFlLE9BQU87QUFDN0MsZ0JBQU07QUFDTixtQkFBUyxJQUFJLFVBQVUsSUFBSSxjQUFjO0FBQUEsbUJBQ2hDLFNBQVMsWUFBWSxNQUFNLEdBQUc7QUFDdkMsbUJBQVM7QUFBQSxtQkFDQSxTQUFTLFVBQVU7QUFDNUIsZ0JBQU07QUFBQSxtQkFDRyxTQUFTLFVBQVU7QUFDNUIsa0JBQVE7QUFBQSxlQUNIO0FBQ0wsZ0JBQU0sSUFBSSxVQUFVLGVBQWdCLEtBQUksS0FBSyx1QkFBdUI7QUFBQTtBQUFBO0FBSXhFLFVBQUksT0FBTyxXQUFXLFlBQWEsVUFBUyxPQUFPLFVBQVUsTUFBTTtBQUNqRSxrQkFBVTtBQUFBO0FBR1osVUFBSSxPQUFPLFdBQVcsWUFDbkIsQ0FBQyxTQUFTLFFBQVEsV0FBWSxVQUFTLE9BQU8sVUFBVSxNQUFPO0FBQ2hFLGlCQUFTO0FBQUE7QUFJWCxVQUFJLFlBQVksWUFBWSxXQUFXLFlBQVksVUFBVTtBQUU3RCxVQUFJLENBQUMsS0FBSztBQUVSLGNBQU0sWUFDRixJQUFJLFVBQVUsT0FDZCxJQUFJLE1BQU0sT0FBTyxTQUFTLFFBQVE7QUFDdEMsY0FBTSxrQkFBa0IsS0FBSztBQUFBO0FBRy9CLFVBQUksQ0FBQyxhQUFhLENBQUUsZ0JBQWUsY0FBYyxJQUFJLFdBQVcsUUFBUTtBQUV0RSxZQUFJLFNBQVMsU0FBUztBQUN0QixZQUFJLFNBQVMsSUFBSSxhQUFhO0FBQUE7QUFHaEMsZUFBUyxPQUFPLE9BQU87QUFDckIsWUFBSSxRQUFRLFlBQVksUUFBUSxjQUFjO0FBQzVDLGNBQUksT0FBTyxNQUFNO0FBQUE7QUFBQTtBQUlyQixhQUFPO0FBQUE7QUFRVCwwQ0FBdUM7QUFDckMsMkJBQXNCO0FBQ3BCLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsZUFBUyxXQUFXO0FBRXBCLGFBQU87QUFBQTtBQVFULDBDQUF1QyxXQUFXLE1BQU0sTUFBTTtBQUM1RCxVQUFJLFlBQVksWUFBWTtBQUU1QiwyQkFBc0IsU0FBUztBQUU3QixZQUFJLE1BQU0sV0FBVyxPQUFPLFVBQVUsU0FBUyxRQUFRO0FBQ3ZELFlBQUksTUFBTSxJQUFJLE1BQU07QUFHcEIsY0FBTSxrQkFBa0IsS0FBSztBQUc3Qix1QkFBZSxLQUFLLFlBQVk7QUFHaEMsZUFBTyxlQUFlLEtBQUssV0FBVztBQUFBLFVBQ3BDLFlBQVk7QUFBQSxVQUNaLGNBQWM7QUFBQSxVQUNkLE9BQU87QUFBQSxVQUNQLFVBQVU7QUFBQTtBQUlaLGVBQU8sZUFBZSxLQUFLLFFBQVE7QUFBQSxVQUNqQyxZQUFZO0FBQUEsVUFDWixjQUFjO0FBQUEsVUFDZCxPQUFPO0FBQUEsVUFDUCxVQUFVO0FBQUE7QUFHWixlQUFPO0FBQUE7QUFHVCxlQUFTLGFBQWE7QUFDdEIsZUFBUyxhQUFhO0FBRXRCLGtCQUFZLFVBQVUsU0FBUztBQUMvQixrQkFBWSxVQUFVLGFBQWE7QUFDbkMsa0JBQVksVUFBVSxTQUFTO0FBRS9CLGFBQU87QUFBQTtBQVFULHVDQUFvQyxXQUFXO0FBQzdDLGFBQU8scUJBQXNCLEtBQUs7QUFDaEMsWUFBSSxDQUFDLE9BQU8sT0FBTyxRQUFRLFVBQVU7QUFDbkMsaUJBQU87QUFBQTtBQUdULFlBQUksZUFBZSxXQUFXO0FBQzVCLGlCQUFPO0FBQUE7QUFHVCxlQUFPLGVBQWUsU0FDcEIsT0FBTyxJQUFJLFdBQVcsYUFDdEIsT0FBTyxJQUFJLGVBQWUsWUFBWSxJQUFJLFdBQVcsSUFBSTtBQUFBO0FBQUE7QUFTL0QsMENBQXVDLFdBQVcsTUFBTSxNQUFNO0FBQzVELFVBQUksWUFBWSxZQUFZO0FBRTVCLDJCQUFzQixTQUFTO0FBRTdCLFlBQUksTUFBTSxXQUFXLE9BQU8sVUFBVSxTQUFTLFFBQVE7QUFDdkQsWUFBSSxNQUFNLElBQUksTUFBTTtBQUdwQixjQUFNLGtCQUFrQixLQUFLO0FBRzdCLHVCQUFlLEtBQUssWUFBWTtBQUdoQyxlQUFPLGVBQWUsS0FBSyxXQUFXO0FBQUEsVUFDcEMsWUFBWTtBQUFBLFVBQ1osY0FBYztBQUFBLFVBQ2QsT0FBTztBQUFBLFVBQ1AsVUFBVTtBQUFBO0FBSVosZUFBTyxlQUFlLEtBQUssUUFBUTtBQUFBLFVBQ2pDLFlBQVk7QUFBQSxVQUNaLGNBQWM7QUFBQSxVQUNkLE9BQU87QUFBQSxVQUNQLFVBQVU7QUFBQTtBQUdaLGVBQU87QUFBQTtBQUdULGVBQVMsYUFBYTtBQUN0QixlQUFTLGFBQWE7QUFFdEIsa0JBQVksVUFBVSxTQUFTO0FBQy9CLGtCQUFZLFVBQVUsYUFBYTtBQUNuQyxrQkFBWSxVQUFVLFNBQVM7QUFFL0IsYUFBTztBQUFBO0FBUVQsc0JBQW1CLE1BQU0sTUFBTTtBQUM3QixVQUFJLE9BQU8sT0FBTyx5QkFBeUIsTUFBTTtBQUVqRCxVQUFJLFFBQVEsS0FBSyxjQUFjO0FBQzdCLGFBQUssUUFBUTtBQUNiLGVBQU8sZUFBZSxNQUFNLFFBQVE7QUFBQTtBQUFBO0FBU3hDLHdDQUFxQyxVQUFTLE9BQU8sV0FBVztBQUM5RCxZQUFNLFFBQVEscUJBQXNCLE1BQU07QUFDeEMsWUFBSTtBQUNKLFlBQUksT0FBTyxhQUFhLFNBQVMsUUFBUTtBQUV6QyxnQkFBUSxVQUFVO0FBQUEsZUFDWDtBQUNILHdCQUFZLDZCQUE2QixXQUFXLE1BQU07QUFDMUQ7QUFBQSxlQUNHO0FBQ0gsd0JBQVksNkJBQTZCLFdBQVcsTUFBTTtBQUMxRDtBQUFBO0FBR0osWUFBSSxXQUFXO0FBRWIsbUJBQVEsUUFBUTtBQUNoQixtQkFBUSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBVXRCLHlCQUFzQixNQUFNO0FBQzFCLGFBQU8sS0FBSyxPQUFPLFFBQVEsVUFDdkIsT0FBTyxVQUNQO0FBQUE7QUFBQTtBQUFBOzs7QUMvUk47QUFBQTtBQUlBLFFBQUksSUFBSTtBQUNSLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBZ0JaLFlBQU8sVUFBVSxTQUFTLEtBQUssU0FBUztBQUN0QyxnQkFBVSxXQUFXO0FBQ3JCLFVBQUksT0FBTyxPQUFPO0FBQ2xCLFVBQUksU0FBUyxZQUFZLElBQUksU0FBUyxHQUFHO0FBQ3ZDLGVBQU8sTUFBTTtBQUFBLGlCQUNKLFNBQVMsWUFBWSxNQUFNLFNBQVMsT0FBTztBQUNwRCxlQUFPLFFBQVEsT0FBTyxRQUFRLE9BQU8sU0FBUztBQUFBO0FBRWhELFlBQU0sSUFBSSxNQUNSLDBEQUNFLEtBQUssVUFBVTtBQUFBO0FBWXJCLG1CQUFlLEtBQUs7QUFDbEIsWUFBTSxPQUFPO0FBQ2IsVUFBSSxJQUFJLFNBQVMsS0FBSztBQUNwQjtBQUFBO0FBRUYsVUFBSSxRQUFRLHdIQUF3SCxLQUNsSTtBQUVGLFVBQUksQ0FBQyxPQUFPO0FBQ1Y7QUFBQTtBQUVGLFVBQUksSUFBSSxXQUFXLE1BQU07QUFDekIsVUFBSSxPQUFRLE9BQU0sTUFBTSxNQUFNO0FBQzlCLGNBQVE7QUFBQSxhQUNEO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTztBQUFBO0FBRVAsaUJBQU87QUFBQTtBQUFBO0FBWWIsc0JBQWtCLElBQUk7QUFDcEIsVUFBSSxNQUFNLEdBQUc7QUFDWCxlQUFPLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQTtBQUU5QixVQUFJLE1BQU0sR0FBRztBQUNYLGVBQU8sS0FBSyxNQUFNLEtBQUssS0FBSztBQUFBO0FBRTlCLFVBQUksTUFBTSxHQUFHO0FBQ1gsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFFOUIsVUFBSSxNQUFNLEdBQUc7QUFDWCxlQUFPLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQTtBQUU5QixhQUFPLEtBQUs7QUFBQTtBQVdkLHFCQUFpQixJQUFJO0FBQ25CLGFBQU8sT0FBTyxJQUFJLEdBQUcsVUFDbkIsT0FBTyxJQUFJLEdBQUcsV0FDZCxPQUFPLElBQUksR0FBRyxhQUNkLE9BQU8sSUFBSSxHQUFHLGFBQ2QsS0FBSztBQUFBO0FBT1Qsb0JBQWdCLElBQUksR0FBRyxNQUFNO0FBQzNCLFVBQUksS0FBSyxHQUFHO0FBQ1Y7QUFBQTtBQUVGLFVBQUksS0FBSyxJQUFJLEtBQUs7QUFDaEIsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU07QUFBQTtBQUVwQyxhQUFPLEtBQUssS0FBSyxLQUFLLEtBQUssTUFBTSxPQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUN0SjFDO0FBQUE7QUFRQSxjQUFVLFFBQU8sVUFBVSxZQUFZLFFBQVEsWUFBWSxhQUFhO0FBQ3hFLFlBQVEsU0FBUztBQUNqQixZQUFRLFVBQVU7QUFDbEIsWUFBUSxTQUFTO0FBQ2pCLFlBQVEsVUFBVTtBQUNsQixZQUFRLFdBQVc7QUFNbkIsWUFBUSxRQUFRO0FBQ2hCLFlBQVEsUUFBUTtBQVFoQixZQUFRLGFBQWE7QUFNckIsUUFBSTtBQVNKLHlCQUFxQixXQUFXO0FBQzlCLFVBQUksT0FBTyxHQUFHO0FBRWQsV0FBSyxLQUFLLFdBQVc7QUFDbkIsZUFBVSxTQUFRLEtBQUssT0FBUSxVQUFVLFdBQVc7QUFDcEQsZ0JBQVE7QUFBQTtBQUdWLGFBQU8sUUFBUSxPQUFPLEtBQUssSUFBSSxRQUFRLFFBQVEsT0FBTztBQUFBO0FBV3hELHlCQUFxQixXQUFXO0FBRTlCLHVCQUFpQjtBQUVmLFlBQUksQ0FBQyxNQUFNO0FBQVM7QUFFcEIsWUFBSSxPQUFPO0FBR1gsWUFBSSxPQUFPLENBQUMsSUFBSTtBQUNoQixZQUFJLEtBQUssT0FBUSxhQUFZO0FBQzdCLGFBQUssT0FBTztBQUNaLGFBQUssT0FBTztBQUNaLGFBQUssT0FBTztBQUNaLG1CQUFXO0FBR1gsWUFBSSxPQUFPLElBQUksTUFBTSxVQUFVO0FBQy9CLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ3BDLGVBQUssS0FBSyxVQUFVO0FBQUE7QUFHdEIsYUFBSyxLQUFLLFFBQVEsT0FBTyxLQUFLO0FBRTlCLFlBQUksQUFBYSxPQUFPLEtBQUssT0FBekIsVUFBNkI7QUFFL0IsZUFBSyxRQUFRO0FBQUE7QUFJZixZQUFJLFFBQVE7QUFDWixhQUFLLEtBQUssS0FBSyxHQUFHLFFBQVEsaUJBQWlCLFNBQVMsT0FBTyxRQUFRO0FBRWpFLGNBQUksVUFBVTtBQUFNLG1CQUFPO0FBQzNCO0FBQ0EsY0FBSSxZQUFZLFFBQVEsV0FBVztBQUNuQyxjQUFJLEFBQWUsT0FBTyxjQUF0QixZQUFpQztBQUNuQyxnQkFBSSxNQUFNLEtBQUs7QUFDZixvQkFBUSxVQUFVLEtBQUssTUFBTTtBQUc3QixpQkFBSyxPQUFPLE9BQU87QUFDbkI7QUFBQTtBQUVGLGlCQUFPO0FBQUE7QUFJVCxnQkFBUSxXQUFXLEtBQUssTUFBTTtBQUU5QixZQUFJLFFBQVEsTUFBTSxPQUFPLFFBQVEsT0FBTyxRQUFRLElBQUksS0FBSztBQUN6RCxjQUFNLE1BQU0sTUFBTTtBQUFBO0FBR3BCLFlBQU0sWUFBWTtBQUNsQixZQUFNLFVBQVUsUUFBUSxRQUFRO0FBQ2hDLFlBQU0sWUFBWSxRQUFRO0FBQzFCLFlBQU0sUUFBUSxZQUFZO0FBRzFCLFVBQUksQUFBZSxPQUFPLFFBQVEsU0FBOUIsWUFBb0M7QUFDdEMsZ0JBQVEsS0FBSztBQUFBO0FBR2YsYUFBTztBQUFBO0FBV1Qsb0JBQWdCLFlBQVk7QUFDMUIsY0FBUSxLQUFLO0FBRWIsY0FBUSxRQUFRO0FBQ2hCLGNBQVEsUUFBUTtBQUVoQixVQUFJLFFBQVMsUUFBTyxlQUFlLFdBQVcsYUFBYSxJQUFJLE1BQU07QUFDckUsVUFBSSxNQUFNLE1BQU07QUFFaEIsZUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUs7QUFDNUIsWUFBSSxDQUFDLE1BQU07QUFBSTtBQUNmLHFCQUFhLE1BQU0sR0FBRyxRQUFRLE9BQU87QUFDckMsWUFBSSxXQUFXLE9BQU8sS0FBSztBQUN6QixrQkFBUSxNQUFNLEtBQUssSUFBSSxPQUFPLE1BQU0sV0FBVyxPQUFPLEtBQUs7QUFBQSxlQUN0RDtBQUNMLGtCQUFRLE1BQU0sS0FBSyxJQUFJLE9BQU8sTUFBTSxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBV3ZELHVCQUFtQjtBQUNqQixjQUFRLE9BQU87QUFBQTtBQVdqQixxQkFBaUIsTUFBTTtBQUNyQixVQUFJLEdBQUc7QUFDUCxXQUFLLElBQUksR0FBRyxNQUFNLFFBQVEsTUFBTSxRQUFRLElBQUksS0FBSyxLQUFLO0FBQ3BELFlBQUksUUFBUSxNQUFNLEdBQUcsS0FBSyxPQUFPO0FBQy9CLGlCQUFPO0FBQUE7QUFBQTtBQUdYLFdBQUssSUFBSSxHQUFHLE1BQU0sUUFBUSxNQUFNLFFBQVEsSUFBSSxLQUFLLEtBQUs7QUFDcEQsWUFBSSxRQUFRLE1BQU0sR0FBRyxLQUFLLE9BQU87QUFDL0IsaUJBQU87QUFBQTtBQUFBO0FBR1gsYUFBTztBQUFBO0FBV1Qsb0JBQWdCLEtBQUs7QUFDbkIsVUFBSSxlQUFlO0FBQU8sZUFBTyxJQUFJLFNBQVMsSUFBSTtBQUNsRCxhQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUN4TVQ7QUFBQTtBQU1BLGNBQVUsUUFBTyxVQUFVO0FBQzNCLFlBQVEsTUFBTTtBQUNkLFlBQVEsYUFBYTtBQUNyQixZQUFRLE9BQU87QUFDZixZQUFRLE9BQU87QUFDZixZQUFRLFlBQVk7QUFDcEIsWUFBUSxVQUFVLEFBQWUsT0FBTyxVQUF0QixlQUNBLEFBQWUsT0FBTyxPQUFPLFdBQTdCLGNBQ0UsT0FBTyxRQUFRLFFBQ2Y7QUFNcEIsWUFBUSxTQUFTO0FBQUEsTUFDZjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUE7QUFXRix5QkFBcUI7QUFJbkIsVUFBSSxPQUFPLFdBQVcsZUFBZSxPQUFPLFdBQVcsT0FBTyxRQUFRLFNBQVMsWUFBWTtBQUN6RixlQUFPO0FBQUE7QUFLVCxhQUFRLE9BQU8sYUFBYSxlQUFlLFNBQVMsbUJBQW1CLFNBQVMsZ0JBQWdCLFNBQVMsU0FBUyxnQkFBZ0IsTUFBTSxvQkFFckksT0FBTyxXQUFXLGVBQWUsT0FBTyxXQUFZLFFBQU8sUUFBUSxXQUFZLE9BQU8sUUFBUSxhQUFhLE9BQU8sUUFBUSxVQUcxSCxPQUFPLGNBQWMsZUFBZSxVQUFVLGFBQWEsVUFBVSxVQUFVLGNBQWMsTUFBTSxxQkFBcUIsU0FBUyxPQUFPLElBQUksT0FBTyxNQUVuSixPQUFPLGNBQWMsZUFBZSxVQUFVLGFBQWEsVUFBVSxVQUFVLGNBQWMsTUFBTTtBQUFBO0FBT3hHLFlBQVEsV0FBVyxJQUFJLFNBQVMsR0FBRztBQUNqQyxVQUFJO0FBQ0YsZUFBTyxLQUFLLFVBQVU7QUFBQSxlQUNmLEtBQVA7QUFDQSxlQUFPLGlDQUFpQyxJQUFJO0FBQUE7QUFBQTtBQVdoRCx3QkFBb0IsTUFBTTtBQUN4QixVQUFJLGFBQVksS0FBSztBQUVyQixXQUFLLEtBQU0sY0FBWSxPQUFPLE1BQzFCLEtBQUssWUFDSixjQUFZLFFBQVEsT0FDckIsS0FBSyxLQUNKLGNBQVksUUFBUSxPQUNyQixNQUFNLFFBQVEsU0FBUyxLQUFLO0FBRWhDLFVBQUksQ0FBQztBQUFXO0FBRWhCLFVBQUksSUFBSSxZQUFZLEtBQUs7QUFDekIsV0FBSyxPQUFPLEdBQUcsR0FBRyxHQUFHO0FBS3JCLFVBQUksUUFBUTtBQUNaLFVBQUksUUFBUTtBQUNaLFdBQUssR0FBRyxRQUFRLGVBQWUsU0FBUyxPQUFPO0FBQzdDLFlBQUksQUFBUyxVQUFUO0FBQWdCO0FBQ3BCO0FBQ0EsWUFBSSxBQUFTLFVBQVQsTUFBZ0I7QUFHbEIsa0JBQVE7QUFBQTtBQUFBO0FBSVosV0FBSyxPQUFPLE9BQU8sR0FBRztBQUFBO0FBVXhCLG1CQUFlO0FBR2IsYUFBTyxBQUFhLE9BQU8sWUFBcEIsWUFDRixRQUFRLE9BQ1IsU0FBUyxVQUFVLE1BQU0sS0FBSyxRQUFRLEtBQUssU0FBUztBQUFBO0FBVTNELGtCQUFjLFlBQVk7QUFDeEIsVUFBSTtBQUNGLFlBQUksQUFBUSxjQUFSLE1BQW9CO0FBQ3RCLGtCQUFRLFFBQVEsV0FBVztBQUFBLGVBQ3RCO0FBQ0wsa0JBQVEsUUFBUSxRQUFRO0FBQUE7QUFBQSxlQUVwQixHQUFOO0FBQUE7QUFBQTtBQVVKLG9CQUFnQjtBQUNkLFVBQUk7QUFDSixVQUFJO0FBQ0YsWUFBSSxRQUFRLFFBQVE7QUFBQSxlQUNkLEdBQU47QUFBQTtBQUdGLFVBQUksQ0FBQyxLQUFLLE9BQU8sWUFBWSxlQUFlLFNBQVMsU0FBUztBQUM1RCxZQUFJLFFBQVEsSUFBSTtBQUFBO0FBR2xCLGFBQU87QUFBQTtBQU9ULFlBQVEsT0FBTztBQWFmLDRCQUF3QjtBQUN0QixVQUFJO0FBQ0YsZUFBTyxPQUFPO0FBQUEsZUFDUCxHQUFQO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ3ZMSjtBQUFBO0FBSUEsUUFBSSxNQUFNLFFBQVE7QUFDbEIsUUFBSSxPQUFPLFFBQVE7QUFRbkIsY0FBVSxRQUFPLFVBQVU7QUFDM0IsWUFBUSxPQUFPO0FBQ2YsWUFBUSxNQUFNO0FBQ2QsWUFBUSxhQUFhO0FBQ3JCLFlBQVEsT0FBTztBQUNmLFlBQVEsT0FBTztBQUNmLFlBQVEsWUFBWTtBQU1wQixZQUFRLFNBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFRakMsWUFBUSxjQUFjLE9BQU8sS0FBSyxRQUFRLEtBQUssT0FBTyxTQUFVLEtBQUs7QUFDbkUsYUFBTyxXQUFXLEtBQUs7QUFBQSxPQUN0QixPQUFPLFNBQVUsS0FBSyxLQUFLO0FBRTVCLFVBQUksT0FBTyxJQUNSLFVBQVUsR0FDVixjQUNBLFFBQVEsYUFBYSxTQUFVLEdBQUcsR0FBRztBQUFFLGVBQU8sRUFBRTtBQUFBO0FBR25ELFVBQUksTUFBTSxRQUFRLElBQUk7QUFDdEIsVUFBSSwyQkFBMkIsS0FBSztBQUFNLGNBQU07QUFBQSxlQUN2Qyw2QkFBNkIsS0FBSztBQUFNLGNBQU07QUFBQSxlQUM5QyxRQUFRO0FBQVEsY0FBTTtBQUFBO0FBQzFCLGNBQU0sT0FBTztBQUVsQixVQUFJLFFBQVE7QUFDWixhQUFPO0FBQUEsT0FDTjtBQVNILFFBQUksS0FBSyxTQUFTLFFBQVEsSUFBSSxVQUFVLE9BQU87QUFFL0MsUUFBSSxBQUFNLE9BQU4sS0FBWSxBQUFNLE9BQU4sR0FBVTtBQUN4QixXQUFLLFVBQVUsV0FBVTtBQUFBLFNBQUk7QUFBQTtBQUcvQixRQUFJLFNBQVMsQUFBTSxPQUFOLElBQVcsUUFBUSxTQUNuQixBQUFNLE9BQU4sSUFBVyxRQUFRLFNBQ25CLDBCQUEwQjtBQU12Qyx5QkFBcUI7QUFDbkIsYUFBTyxZQUFZLFFBQVEsY0FDdkIsUUFBUSxRQUFRLFlBQVksVUFDNUIsSUFBSSxPQUFPO0FBQUE7QUFPakIsWUFBUSxXQUFXLElBQUksU0FBUyxHQUFHO0FBQ2pDLFdBQUssWUFBWSxTQUFTLEtBQUs7QUFDL0IsYUFBTyxLQUFLLFFBQVEsR0FBRyxLQUFLLGFBQ3pCLE1BQU0sTUFBTSxJQUFJLFNBQVMsS0FBSztBQUM3QixlQUFPLElBQUk7QUFBQSxTQUNWLEtBQUs7QUFBQTtBQU9aLFlBQVEsV0FBVyxJQUFJLFNBQVMsR0FBRztBQUNqQyxXQUFLLFlBQVksU0FBUyxLQUFLO0FBQy9CLGFBQU8sS0FBSyxRQUFRLEdBQUcsS0FBSztBQUFBO0FBUzlCLHdCQUFvQixNQUFNO0FBQ3hCLFVBQUksT0FBTyxLQUFLO0FBQ2hCLFVBQUksYUFBWSxLQUFLO0FBRXJCLFVBQUksWUFBVztBQUNiLFlBQUksSUFBSSxLQUFLO0FBQ2IsWUFBSSxTQUFTLFVBQWUsSUFBSSxRQUFRLE9BQU87QUFFL0MsYUFBSyxLQUFLLFNBQVMsS0FBSyxHQUFHLE1BQU0sTUFBTSxLQUFLLE9BQU87QUFDbkQsYUFBSyxLQUFLLFFBQWEsSUFBSSxPQUFPLFFBQVEsU0FBUyxLQUFLLFFBQVE7QUFBQSxhQUMzRDtBQUNMLGFBQUssS0FBSyxJQUFJLE9BQU8sZ0JBQ2pCLE1BQU0sT0FBTyxNQUFNLEtBQUs7QUFBQTtBQUFBO0FBUWhDLG1CQUFlO0FBQ2IsYUFBTyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sTUFBTSxhQUFhO0FBQUE7QUFVM0Qsa0JBQWMsWUFBWTtBQUN4QixVQUFJLEFBQVEsY0FBUixNQUFvQjtBQUd0QixlQUFPLFFBQVEsSUFBSTtBQUFBLGFBQ2Q7QUFDTCxnQkFBUSxJQUFJLFFBQVE7QUFBQTtBQUFBO0FBV3hCLG9CQUFnQjtBQUNkLGFBQU8sUUFBUSxJQUFJO0FBQUE7QUFVckIsdUNBQW9DLEtBQUk7QUFDdEMsVUFBSTtBQUNKLFVBQUksV0FBVyxRQUFRLFFBQVE7QUFJL0IsY0FBUSxTQUFTLGdCQUFnQjtBQUFBLGFBQzFCO0FBQ0gsb0JBQVMsSUFBSSxJQUFJLFlBQVk7QUFDN0Isa0JBQU8sUUFBUTtBQUlmLGNBQUksUUFBTyxXQUFXLFFBQU8sUUFBUSxPQUFPO0FBQzFDLG9CQUFPLFFBQVE7QUFBQTtBQUVqQjtBQUFBLGFBRUc7QUFDSCxjQUFJLE1BQUssUUFBUTtBQUNqQixvQkFBUyxJQUFJLElBQUcsZ0JBQWdCLEtBQUksRUFBRSxXQUFXO0FBQ2pELGtCQUFPLFFBQVE7QUFDZjtBQUFBLGFBRUc7QUFBQSxhQUNBO0FBQ0gsY0FBSSxNQUFNLFFBQVE7QUFDbEIsb0JBQVMsSUFBSSxJQUFJLE9BQU87QUFBQSxZQUN0QixJQUFJO0FBQUEsWUFDSixVQUFVO0FBQUEsWUFDVixVQUFVO0FBQUE7QUFPWixrQkFBTyxXQUFXO0FBQ2xCLGtCQUFPLE9BQU87QUFDZCxrQkFBTyxRQUFRO0FBSWYsY0FBSSxRQUFPLFdBQVcsUUFBTyxRQUFRLE9BQU87QUFDMUMsb0JBQU8sUUFBUTtBQUFBO0FBRWpCO0FBQUE7QUFJQSxnQkFBTSxJQUFJLE1BQU07QUFBQTtBQUlwQixjQUFPLEtBQUs7QUFFWixjQUFPLFdBQVc7QUFFbEIsYUFBTztBQUFBO0FBVVQsa0JBQWUsT0FBTztBQUNwQixZQUFNLGNBQWM7QUFFcEIsVUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO0FBQy9CLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDcEMsY0FBTSxZQUFZLEtBQUssTUFBTSxRQUFRLFlBQVksS0FBSztBQUFBO0FBQUE7QUFRMUQsWUFBUSxPQUFPO0FBQUE7QUFBQTs7O0FDdlBmO0FBQUE7QUFLQSxRQUFJLE9BQU8sWUFBWSxlQUFlLFFBQVEsU0FBUyxZQUFZO0FBQ2pFLGNBQU8sVUFBVTtBQUFBLFdBQ1o7QUFDTCxjQUFPLFVBQVU7QUFBQTtBQUFBO0FBQUE7OztBQ1JuQjtBQUFBO0FBT0E7QUFPQSxRQUFJLGVBQWUsUUFBUSxVQUFVO0FBQ3JDLFFBQUksYUFBYSxRQUFRLE1BQU07QUFDL0IsUUFBSSxTQUFTLFFBQVE7QUFDckIsUUFBSSxPQUFPLFFBQVE7QUFPbkIsWUFBTyxVQUFVO0FBVWpCLHFCQUFrQixRQUFRLFVBQVU7QUFDbEMsVUFBSSxlQUFlLFNBQVM7QUFDMUIsMEJBQWtCO0FBQUEsaUJBQ1QsYUFBYSxTQUFTO0FBQy9CLDBCQUFrQjtBQUFBLGlCQUNULFdBQVcsU0FBUztBQUM3QixlQUFPO0FBQUE7QUFHVCxVQUFJLGVBQWUsV0FBVyxVQUFVO0FBQ3RDLGVBQU8sbUJBQW1CO0FBQzFCLGVBQU8sWUFBWSxTQUFTO0FBQUE7QUFHOUIsYUFBTztBQUFBO0FBVVQsK0JBQTRCLFFBQVE7QUFDbEMsYUFBTztBQUVQLFVBQUksT0FBTyxPQUFPLFVBQVUsWUFBWTtBQUV0QyxlQUFPLEdBQUcsUUFBUTtBQUFBO0FBQUE7QUFjdEIsNkJBQTBCLFFBQVE7QUFDaEMsVUFBSSxPQUFPLGNBQWMsTUFBTTtBQUM3QixZQUFJLE9BQU8sT0FBTyxhQUFhLE9BQzNCLGFBQ0E7QUFFSixlQUFPLFFBQVE7QUFBQSxVQUNiLE9BQU8sV0FBWTtBQUFFLGlCQUFLLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFJdEMsYUFBTztBQUFBO0FBbUJULCtCQUE0QixRQUFRO0FBQ2xDLFVBQUksT0FBTyxPQUFPLFlBQVksWUFBWTtBQUd4QyxZQUFJLE9BQU8sVUFBVTtBQUVuQixpQkFBTztBQUNQLGNBQUksT0FBTyxhQUFhO0FBQ3RCLG1CQUFPLGFBQWE7QUFDcEIsbUJBQU8sS0FBSyxTQUFTO0FBQUEsaUJBQ2hCO0FBQ0wsbUJBQU8sU0FBUztBQUFBO0FBQUEsbUJBRVQsT0FBTyxZQUFZLE9BQU8sYUFBYSxPQUFPLFVBQVUsVUFBVSxVQUFVO0FBRXJGLGlCQUFPO0FBQUEsbUJBQ0UsT0FBTyxZQUFZLE9BQU8sT0FBTyxVQUFVLFlBQVk7QUFFaEUsaUJBQU8sWUFBWTtBQUNuQixpQkFBTztBQUFBLGVBQ0Y7QUFHTCxpQkFBTztBQUFBO0FBQUEsaUJBRUEsT0FBTyxPQUFPLFVBQVUsWUFBWTtBQUU3Qyx3QkFBZ0I7QUFBQTtBQUFBO0FBU3BCLHdCQUFxQixRQUFRO0FBQzNCLGFBQU8sa0JBQWtCLFVBQ3ZCLE9BQU8sT0FBTyxZQUFZO0FBQUE7QUFROUIsNEJBQXlCLEtBQUs7QUFDNUIsYUFBTyxlQUFlO0FBQUE7QUFReEIsNEJBQXlCLFFBQVE7QUFDL0IsYUFBTyxrQkFBa0I7QUFBQTtBQVEzQiwwQkFBdUIsUUFBUTtBQUM3QixhQUFPLGtCQUFrQixLQUFLLFFBQzVCLGtCQUFrQixLQUFLLFVBQ3ZCLGtCQUFrQixLQUFLLFdBQ3ZCLGtCQUFrQixLQUFLLGNBQ3ZCLGtCQUFrQixLQUFLLFdBQ3ZCLGtCQUFrQixLQUFLLGNBQ3ZCLGtCQUFrQixLQUFLO0FBQUE7QUFRM0Isb0JBQWlCO0FBQUE7QUFRakIsbUNBQWdDO0FBQzlCLFdBQUssU0FBUztBQUFBO0FBUWhCLDJCQUF3QjtBQUN0QixVQUFJLE9BQU8sS0FBSyxPQUFPLFVBQVU7QUFFL0IsYUFBSztBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUM5TVQ7QUFBQTtBQUVBO0FBRUEsUUFBSSxTQUFTLFFBQVE7QUFDckIsUUFBSSxVQUFTLE9BQU87QUFFcEIsUUFBSSxRQUFRO0FBRVosUUFBSTtBQUVKLFNBQUssT0FBTyxRQUFRO0FBQ2xCLFVBQUksQ0FBQyxPQUFPLGVBQWU7QUFBTTtBQUNqQyxVQUFJLFFBQVEsZ0JBQWdCLFFBQVE7QUFBVTtBQUM5QyxZQUFNLE9BQU8sT0FBTztBQUFBO0FBR3RCLFFBQUksUUFBUSxNQUFNLFNBQVM7QUFDM0IsU0FBSyxPQUFPLFNBQVE7QUFDbEIsVUFBSSxDQUFDLFFBQU8sZUFBZTtBQUFNO0FBQ2pDLFVBQUksUUFBUSxpQkFBaUIsUUFBUTtBQUFtQjtBQUN4RCxZQUFNLE9BQU8sUUFBTztBQUFBO0FBR3RCLFVBQU0sT0FBTyxZQUFZLFFBQU87QUFFaEMsUUFBSSxDQUFDLE1BQU0sUUFBUSxNQUFNLFNBQVMsV0FBVyxNQUFNO0FBQ2pELFlBQU0sT0FBTyxTQUFVLE9BQU8sa0JBQWtCLFFBQVE7QUFDdEQsWUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixnQkFBTSxJQUFJLFVBQVUsb0VBQW9FLE9BQU87QUFBQTtBQUVqRyxZQUFJLFNBQVMsT0FBTyxNQUFNLFdBQVcsYUFBYTtBQUNoRCxnQkFBTSxJQUFJLFVBQVUsb0hBQW9ILE9BQU87QUFBQTtBQUVqSixlQUFPLFFBQU8sT0FBTyxrQkFBa0I7QUFBQTtBQUFBO0FBSTNDLFFBQUksQ0FBQyxNQUFNLE9BQU87QUFDaEIsWUFBTSxRQUFRLFNBQVUsTUFBTSxNQUFNLFVBQVU7QUFDNUMsWUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixnQkFBTSxJQUFJLFVBQVUsK0RBQStELE9BQU87QUFBQTtBQUU1RixZQUFJLE9BQU8sS0FBSyxRQUFRLElBQUssTUFBSyxLQUFLO0FBQ3JDLGdCQUFNLElBQUksV0FBVyxnQkFBZ0IsT0FBTztBQUFBO0FBRTlDLFlBQUksTUFBTSxRQUFPO0FBQ2pCLFlBQUksQ0FBQyxRQUFRLEtBQUssV0FBVyxHQUFHO0FBQzlCLGNBQUksS0FBSztBQUFBLG1CQUNBLE9BQU8sYUFBYSxVQUFVO0FBQ3ZDLGNBQUksS0FBSyxNQUFNO0FBQUEsZUFDVjtBQUNMLGNBQUksS0FBSztBQUFBO0FBRVgsZUFBTztBQUFBO0FBQUE7QUFJWCxRQUFJLENBQUMsTUFBTSxrQkFBa0I7QUFDM0IsVUFBSTtBQUNGLGNBQU0sbUJBQW1CLFFBQVEsUUFBUSxVQUFVO0FBQUEsZUFDNUMsR0FBUDtBQUFBO0FBQUE7QUFNSixRQUFJLENBQUMsTUFBTSxXQUFXO0FBQ3BCLFlBQU0sWUFBWTtBQUFBLFFBQ2hCLFlBQVksTUFBTTtBQUFBO0FBRXBCLFVBQUksTUFBTSxrQkFBa0I7QUFDMUIsY0FBTSxVQUFVLG9CQUFvQixNQUFNO0FBQUE7QUFBQTtBQUk5QyxZQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUM1RWpCO0FBQUE7QUFBQTtBQUVBLFFBQUksVUFBVTtBQUVkLFlBQVEsYUFBYTtBQUNyQiwrQkFBMkIsU0FBUyxTQUFTO0FBQ3pDLFdBQUssVUFBVTtBQUNmLFdBQUssU0FBUztBQUFBO0FBR2xCLHNCQUFrQixVQUFVLFFBQVEsU0FBUyxLQUFLO0FBQzlDLFVBQUksS0FBSyxRQUFRO0FBQ2IsY0FBTSxVQUFVO0FBQ2hCLGFBQUssU0FBUztBQUFBO0FBR2xCLGFBQU8sS0FBSyxRQUFRLE1BQU07QUFBQTtBQUc5QixzQkFBa0IsVUFBVSxNQUFNLFdBQVc7QUFDekMsYUFBTyxLQUFLLFFBQVE7QUFBQTtBQU14QixZQUFRLFdBQVc7QUFDbkIsNkJBQXlCLFNBQVMsU0FBUztBQUN2QyxXQUFLLFVBQVU7QUFDZixXQUFLLE9BQU87QUFDWixXQUFLLFVBQVUsV0FBVztBQUFBO0FBRzlCLG9CQUFnQixVQUFVLFFBQVEsU0FBUyxLQUFLO0FBQzVDLFVBQUksTUFBTSxLQUFLLFFBQVEsTUFBTTtBQUM3QixVQUFJLEtBQUssUUFBUSxDQUFDO0FBQ2QsZUFBTztBQUVYLFVBQUksSUFBSSxPQUFPLFNBQVM7QUFDcEIsY0FBTSxJQUFJLE1BQU07QUFDaEIsWUFBSSxPQUFPLEtBQUssUUFBUSxhQUFhO0FBQ2pDLGVBQUssUUFBUTtBQUFBO0FBR3JCLFdBQUssT0FBTztBQUNaLGFBQU87QUFBQTtBQUdYLG9CQUFnQixVQUFVLE1BQU0sV0FBVztBQUN2QyxhQUFPLEtBQUssUUFBUTtBQUFBO0FBQUE7QUFBQTs7O0FDakR4QjtBQUFBO0FBQUE7QUFDQSxRQUFJLFVBQVMsZ0JBQXdCO0FBSXJDLFlBQU8sVUFBVTtBQUFBLE1BRWIsTUFBUSxFQUFFLE1BQU0sYUFBYSxVQUFVO0FBQUEsTUFDdkMsT0FBUSxFQUFFLE1BQU0sYUFBYSxVQUFVO0FBQUEsTUFDdkMsZUFBZTtBQUFBLE1BRWYsTUFBUSxFQUFFLE1BQU0sYUFBYSxVQUFVO0FBQUEsTUFDdkMsU0FBUztBQUFBLE1BRVQsUUFBUSxFQUFFLE1BQU07QUFBQSxNQUNoQixRQUFRLEVBQUUsTUFBTTtBQUFBLE1BQ2hCLEtBQVEsRUFBRSxNQUFNO0FBQUEsTUFHaEIsV0FBVztBQUFBO0FBS2YsMkJBQXVCLGNBQWMsT0FBTztBQUN4QyxXQUFLLE1BQU0sYUFBYTtBQUN4QixXQUFLLFdBQVcsYUFBYTtBQUU3QixVQUFJLEtBQUssUUFBUTtBQUNiLGFBQUssVUFBVTtBQUFBLGVBQ1YsS0FBSyxRQUFRLFNBQVM7QUFDM0IsYUFBSyxNQUFNO0FBQ1gsYUFBSyxVQUFVO0FBR2YsWUFBSSxRQUFPLEtBQUssZ0JBQWdCLE9BQU8sZUFBZSxhQUFNO0FBQ3hELGVBQUssVUFBVTtBQUNmLGVBQUsscUJBQXFCLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFLNUMsa0JBQWMsVUFBVSxVQUFVO0FBQ2xDLGtCQUFjLFVBQVUsVUFBVTtBQUtsQyxRQUFJLGdCQUFnQixRQUFRLGtCQUFrQjtBQUU5QyxRQUFJLENBQUMsY0FBYyxVQUFVO0FBQ3pCLG9CQUFjLFVBQVUsTUFBTSxXQUFXO0FBQUE7QUFHN0MsNkJBQXlCLFNBQVMsT0FBTztBQUNyQyxvQkFBYyxLQUFLLE1BQU0sTUFBTTtBQUFBO0FBR25DLG9CQUFnQixZQUFZLGNBQWM7QUFNMUMsNkJBQXlCLFNBQVMsT0FBTztBQUNyQyxXQUFLLE1BQU0sTUFBTTtBQUFBO0FBR3JCLG9CQUFnQixVQUFVLFFBQVEsU0FBUyxLQUFLO0FBQzVDLGFBQU8sUUFBTyxLQUFLLEtBQUssS0FBSztBQUFBO0FBR2pDLG9CQUFnQixVQUFVLE1BQU0sV0FBVztBQUFBO0FBTzNDLG1DQUErQixTQUFTLE9BQU87QUFDM0MsV0FBSyxVQUFVO0FBQUE7QUFHbkIsMEJBQXNCLFVBQVUsUUFBUSxTQUFTLEtBQUs7QUFDbEQsWUFBTSxLQUFLLFVBQVU7QUFDckIsVUFBSSxnQkFBZ0IsSUFBSSxTQUFVLElBQUksU0FBUztBQUMvQyxXQUFLLFVBQVUsSUFBSSxNQUFNO0FBQ3pCLFlBQU0sSUFBSSxNQUFNLEdBQUc7QUFFbkIsYUFBTyxRQUFPLEtBQUssS0FBSztBQUFBO0FBRzVCLDBCQUFzQixVQUFVLE1BQU0sV0FBVztBQUM3QyxhQUFPLFFBQU8sS0FBSyxLQUFLLFNBQVM7QUFBQTtBQU9yQyxrQ0FBOEIsU0FBUyxPQUFPO0FBQUE7QUFHOUMseUJBQXFCLFVBQVUsUUFBUSxTQUFTLEtBQUs7QUFDakQsVUFBSSxNQUFNLFFBQU8sTUFBTSxJQUFJLFNBQVMsSUFBSSxTQUFTO0FBQ2pELGVBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRLEtBQUs7QUFDakMsWUFBSSxXQUFXLElBQUksV0FBVztBQUc5QixZQUFJLFdBQVc7QUFDWCxjQUFJLFlBQVk7QUFBQSxpQkFDWCxXQUFXLE1BQU87QUFDdkIsY0FBSSxZQUFZLE1BQVEsY0FBYTtBQUNyQyxjQUFJLFlBQVksTUFBUSxZQUFXO0FBQUEsZUFFbEM7QUFDRCxjQUFJLFlBQVksTUFBUSxjQUFhO0FBQ3JDLGNBQUksWUFBWSxNQUFTLGNBQWEsSUFBSztBQUMzQyxjQUFJLFlBQVksTUFBUSxZQUFXO0FBQUE7QUFBQTtBQUczQyxhQUFPLElBQUksTUFBTSxHQUFHO0FBQUE7QUFHeEIseUJBQXFCLFVBQVUsTUFBTSxXQUFXO0FBQUE7QUFNaEQsa0NBQThCLFNBQVMsT0FBTztBQUMxQyxXQUFLLE1BQU07QUFDWCxXQUFLLFlBQVk7QUFDakIsV0FBSyxXQUFXO0FBQ2hCLFdBQUsscUJBQXFCLE1BQU07QUFBQTtBQUdwQyx5QkFBcUIsVUFBVSxRQUFRLFNBQVMsS0FBSztBQUNqRCxVQUFJLE1BQU0sS0FBSyxLQUFLLFlBQVksS0FBSyxXQUFXLFdBQVcsS0FBSyxVQUM1RCxNQUFNO0FBQ1YsZUFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNqQyxZQUFJLFVBQVUsSUFBSTtBQUNsQixZQUFLLFdBQVUsU0FBVSxLQUFNO0FBQzNCLGNBQUksWUFBWSxHQUFHO0FBQ2YsbUJBQU8sS0FBSztBQUNaLHdCQUFZO0FBQUE7QUFHaEIsY0FBSSxVQUFVLEtBQU07QUFDaEIsbUJBQU8sT0FBTyxhQUFhO0FBQUEscUJBQ3BCLFVBQVUsS0FBTTtBQUN2QixrQkFBTSxVQUFVO0FBQ2hCLHdCQUFZO0FBQUcsdUJBQVc7QUFBQSxxQkFDbkIsVUFBVSxLQUFNO0FBQ3ZCLGtCQUFNLFVBQVU7QUFDaEIsd0JBQVk7QUFBRyx1QkFBVztBQUFBLGlCQUN2QjtBQUNILG1CQUFPLEtBQUs7QUFBQTtBQUFBLGVBRWI7QUFDSCxjQUFJLFlBQVksR0FBRztBQUNmLGtCQUFPLE9BQU8sSUFBTSxVQUFVO0FBQzlCO0FBQWE7QUFDYixnQkFBSSxjQUFjLEdBQUc7QUFFakIsa0JBQUksYUFBYSxLQUFLLE1BQU0sT0FBUSxNQUFNO0FBQ3RDLHVCQUFPLEtBQUs7QUFBQSx1QkFDUCxhQUFhLEtBQUssTUFBTTtBQUM3Qix1QkFBTyxLQUFLO0FBQUE7QUFHWix1QkFBTyxPQUFPLGFBQWE7QUFBQTtBQUFBLGlCQUVoQztBQUNILG1CQUFPLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFJeEIsV0FBSyxNQUFNO0FBQUssV0FBSyxZQUFZO0FBQVcsV0FBSyxXQUFXO0FBQzVELGFBQU87QUFBQTtBQUdYLHlCQUFxQixVQUFVLE1BQU0sV0FBVztBQUM1QyxVQUFJLE1BQU07QUFDVixVQUFJLEtBQUssWUFBWTtBQUNqQixlQUFPLEtBQUs7QUFDaEIsYUFBTztBQUFBO0FBQUE7QUFBQTs7O0FDMUxYO0FBQUE7QUFBQTtBQUNBLFFBQUksVUFBUyxnQkFBd0I7QUFNckMsWUFBUSxVQUFVO0FBQ2xCLDRCQUF3QjtBQUFBO0FBR3hCLGlCQUFhLFVBQVUsVUFBVTtBQUNqQyxpQkFBYSxVQUFVLFVBQVU7QUFDakMsaUJBQWEsVUFBVSxXQUFXO0FBS2xDLDhCQUEwQjtBQUFBO0FBRzFCLG1CQUFlLFVBQVUsUUFBUSxTQUFTLEtBQUs7QUFDM0MsVUFBSSxNQUFNLFFBQU8sS0FBSyxLQUFLO0FBQzNCLGVBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRLEtBQUssR0FBRztBQUNwQyxZQUFJLE1BQU0sSUFBSTtBQUFJLFlBQUksS0FBSyxJQUFJLElBQUU7QUFBSSxZQUFJLElBQUUsS0FBSztBQUFBO0FBRXBELGFBQU87QUFBQTtBQUdYLG1CQUFlLFVBQVUsTUFBTSxXQUFXO0FBQUE7QUFNMUMsOEJBQTBCO0FBQ3RCLFdBQUssZUFBZTtBQUFBO0FBR3hCLG1CQUFlLFVBQVUsUUFBUSxTQUFTLEtBQUs7QUFDM0MsVUFBSSxJQUFJLFVBQVU7QUFDZCxlQUFPO0FBRVgsVUFBSSxPQUFPLFFBQU8sTUFBTSxJQUFJLFNBQVMsSUFDakMsSUFBSSxHQUFHLElBQUk7QUFFZixVQUFJLEtBQUssaUJBQWlCLElBQUk7QUFDMUIsYUFBSyxLQUFLLElBQUk7QUFDZCxhQUFLLEtBQUssS0FBSztBQUNmLFlBQUk7QUFBRyxZQUFJO0FBQUE7QUFHZixhQUFPLElBQUksSUFBSSxTQUFPLEdBQUcsS0FBSyxHQUFHLEtBQUksR0FBRztBQUNwQyxhQUFLLEtBQUssSUFBSSxJQUFFO0FBQ2hCLGFBQUssSUFBRSxLQUFLLElBQUk7QUFBQTtBQUdwQixXQUFLLGVBQWdCLEtBQUssSUFBSSxTQUFPLElBQUssSUFBSSxJQUFJLFNBQU8sS0FBSztBQUU5RCxhQUFPLEtBQUssTUFBTSxHQUFHLEdBQUcsU0FBUztBQUFBO0FBR3JDLG1CQUFlLFVBQVUsTUFBTSxXQUFXO0FBQUE7QUFZMUMsWUFBUSxRQUFRO0FBQ2hCLHdCQUFvQixjQUFjLE9BQU87QUFDckMsV0FBSyxRQUFRO0FBQUE7QUFHakIsZUFBVyxVQUFVLFVBQVU7QUFDL0IsZUFBVyxVQUFVLFVBQVU7QUFLL0IsMEJBQXNCLFNBQVMsT0FBTztBQUNsQyxnQkFBVSxXQUFXO0FBQ3JCLFVBQUksUUFBUSxXQUFXO0FBQ25CLGdCQUFRLFNBQVM7QUFDckIsV0FBSyxVQUFVLE1BQU0sTUFBTSxXQUFXLFlBQVk7QUFBQTtBQUd0RCxpQkFBYSxVQUFVLFFBQVEsU0FBUyxLQUFLO0FBQ3pDLGFBQU8sS0FBSyxRQUFRLE1BQU07QUFBQTtBQUc5QixpQkFBYSxVQUFVLE1BQU0sV0FBVztBQUNwQyxhQUFPLEtBQUssUUFBUTtBQUFBO0FBTXhCLDBCQUFzQixTQUFTLE9BQU87QUFDbEMsV0FBSyxVQUFVO0FBQ2YsV0FBSyxlQUFlO0FBQ3BCLFdBQUssa0JBQWtCO0FBRXZCLFdBQUssVUFBVSxXQUFXO0FBQzFCLFdBQUssUUFBUSxNQUFNO0FBQUE7QUFHdkIsaUJBQWEsVUFBVSxRQUFRLFNBQVMsS0FBSztBQUN6QyxVQUFJLENBQUMsS0FBSyxTQUFTO0FBRWYsYUFBSyxhQUFhLEtBQUs7QUFDdkIsYUFBSyxtQkFBbUIsSUFBSTtBQUU1QixZQUFJLEtBQUssa0JBQWtCO0FBQ3ZCLGlCQUFPO0FBR1gsWUFBSSxNQUFNLFFBQU8sT0FBTyxLQUFLLGVBQ3pCLFdBQVcsZUFBZSxLQUFLLEtBQUssUUFBUTtBQUNoRCxhQUFLLFVBQVUsS0FBSyxNQUFNLFdBQVcsVUFBVSxLQUFLO0FBQ3BELGFBQUssYUFBYSxTQUFTLEtBQUssa0JBQWtCO0FBQUE7QUFHdEQsYUFBTyxLQUFLLFFBQVEsTUFBTTtBQUFBO0FBRzlCLGlCQUFhLFVBQVUsTUFBTSxXQUFXO0FBQ3BDLFVBQUksQ0FBQyxLQUFLLFNBQVM7QUFDZixZQUFJLE1BQU0sUUFBTyxPQUFPLEtBQUssZUFDekIsV0FBVyxlQUFlLEtBQUssS0FBSyxRQUFRO0FBQ2hELGFBQUssVUFBVSxLQUFLLE1BQU0sV0FBVyxVQUFVLEtBQUs7QUFFcEQsWUFBSSxNQUFNLEtBQUssUUFBUSxNQUFNLE1BQ3pCLFFBQVEsS0FBSyxRQUFRO0FBRXpCLGVBQU8sUUFBUyxNQUFNLFFBQVM7QUFBQTtBQUVuQyxhQUFPLEtBQUssUUFBUTtBQUFBO0FBR3hCLDRCQUF3QixLQUFLLGlCQUFpQjtBQUMxQyxVQUFJLE1BQU0sbUJBQW1CO0FBRTdCLFVBQUksSUFBSSxVQUFVLEdBQUc7QUFFakIsWUFBSSxJQUFJLE1BQU0sT0FBUSxJQUFJLE1BQU07QUFDNUIsZ0JBQU07QUFBQSxpQkFDRCxJQUFJLE1BQU0sT0FBUSxJQUFJLE1BQU07QUFDakMsZ0JBQU07QUFBQSxhQUNMO0FBSUQsY0FBSSxlQUFlLEdBQUcsZUFBZSxHQUNqQyxPQUFPLEtBQUssSUFBSSxJQUFJLFNBQVUsSUFBSSxTQUFTLEdBQUk7QUFFbkQsbUJBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUc7QUFDOUIsZ0JBQUksSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFFLE9BQU87QUFBRztBQUNwQyxnQkFBSSxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUUsT0FBTztBQUFHO0FBQUE7QUFHeEMsY0FBSSxlQUFlO0FBQ2Ysa0JBQU07QUFBQSxtQkFDRCxlQUFlO0FBQ3BCLGtCQUFNO0FBQUE7QUFBQTtBQUlsQixhQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUM3S1g7QUFBQTtBQUFBO0FBQ0EsUUFBSSxVQUFTLGdCQUF3QjtBQUtyQyxZQUFRLE9BQU87QUFDZixZQUFRLGdCQUFnQjtBQUN4Qix1QkFBbUIsY0FBYyxPQUFPO0FBQ3BDLFdBQUssUUFBUTtBQUFBO0FBR2pCLGNBQVUsVUFBVSxVQUFVO0FBQzlCLGNBQVUsVUFBVSxVQUFVO0FBQzlCLGNBQVUsVUFBVSxXQUFXO0FBSy9CLFFBQUksaUJBQWlCO0FBRXJCLHlCQUFxQixTQUFTLE9BQU87QUFDakMsV0FBSyxRQUFRLE1BQU07QUFBQTtBQUd2QixnQkFBWSxVQUFVLFFBQVEsU0FBUyxLQUFLO0FBR3hDLGFBQU8sUUFBTyxLQUFLLElBQUksUUFBUSxnQkFBZ0IsU0FBUyxPQUFPO0FBQzNELGVBQU8sTUFBTyxXQUFVLE1BQU0sS0FDMUIsS0FBSyxNQUFNLE9BQU8sT0FBTyxZQUFZLFNBQVMsVUFBVSxRQUFRLE9BQU8sT0FDckU7QUFBQSxRQUNSLEtBQUs7QUFBQTtBQUdYLGdCQUFZLFVBQVUsTUFBTSxXQUFXO0FBQUE7QUFNdkMseUJBQXFCLFNBQVMsT0FBTztBQUNqQyxXQUFLLFFBQVEsTUFBTTtBQUNuQixXQUFLLFdBQVc7QUFDaEIsV0FBSyxjQUFjO0FBQUE7QUFHdkIsUUFBSSxjQUFjO0FBQ2xCLFFBQUksY0FBYztBQUNsQixTQUFTLElBQUksR0FBRyxJQUFJLEtBQUs7QUFDckIsa0JBQVksS0FBSyxZQUFZLEtBQUssT0FBTyxhQUFhO0FBRGpEO0FBR1QsUUFBSSxXQUFXLElBQUksV0FBVztBQUE5QixRQUNJLFlBQVksSUFBSSxXQUFXO0FBRC9CLFFBRUksVUFBVSxJQUFJLFdBQVc7QUFFN0IsZ0JBQVksVUFBVSxRQUFRLFNBQVMsS0FBSztBQUN4QyxVQUFJLE1BQU0sSUFBSSxRQUFRLEdBQ2xCLFdBQVcsS0FBSyxVQUNoQixjQUFjLEtBQUs7QUFJdkIsZUFBUyxLQUFJLEdBQUcsS0FBSSxJQUFJLFFBQVEsTUFBSztBQUNqQyxZQUFJLENBQUMsVUFBVTtBQUVYLGNBQUksSUFBSSxPQUFNLFVBQVU7QUFDcEIsbUJBQU8sS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLE9BQU8sS0FBSTtBQUM5QyxvQkFBUSxLQUFFO0FBQ1YsdUJBQVc7QUFBQTtBQUFBLGVBRVo7QUFDSCxjQUFJLENBQUMsWUFBWSxJQUFJLE1BQUs7QUFDdEIsZ0JBQUksTUFBSyxTQUFTLElBQUksT0FBTSxXQUFXO0FBQ25DLHFCQUFPO0FBQUEsbUJBQ0o7QUFDSCxrQkFBSSxTQUFTLGNBQWMsSUFBSSxNQUFNLE9BQU8sSUFBRztBQUMvQyxxQkFBTyxLQUFLLE1BQU0sT0FBTyxRQUFPLEtBQUssUUFBUSxXQUFXO0FBQUE7QUFHNUQsZ0JBQUksSUFBSSxPQUFNO0FBQ1Y7QUFFSixvQkFBUSxLQUFFO0FBQ1YsdUJBQVc7QUFDWCwwQkFBYztBQUFBO0FBQUE7QUFBQTtBQUsxQixVQUFJLENBQUMsVUFBVTtBQUNYLGVBQU8sS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLFFBQVE7QUFBQSxhQUN4QztBQUNILFlBQUksU0FBUyxjQUFjLElBQUksTUFBTSxPQUFPO0FBRTVDLFlBQUksZUFBZSxPQUFPLFNBQVUsT0FBTyxTQUFTO0FBQ3BELHNCQUFjLE9BQU8sTUFBTTtBQUMzQixpQkFBUyxPQUFPLE1BQU0sR0FBRztBQUV6QixlQUFPLEtBQUssTUFBTSxPQUFPLFFBQU8sS0FBSyxRQUFRLFdBQVc7QUFBQTtBQUc1RCxXQUFLLFdBQVc7QUFDaEIsV0FBSyxjQUFjO0FBRW5CLGFBQU87QUFBQTtBQUdYLGdCQUFZLFVBQVUsTUFBTSxXQUFXO0FBQ25DLFVBQUksTUFBTTtBQUNWLFVBQUksS0FBSyxZQUFZLEtBQUssWUFBWSxTQUFTO0FBQzNDLGNBQU0sS0FBSyxNQUFNLE9BQU8sUUFBTyxLQUFLLEtBQUssYUFBYSxXQUFXO0FBRXJFLFdBQUssV0FBVztBQUNoQixXQUFLLGNBQWM7QUFDbkIsYUFBTztBQUFBO0FBZ0JYLFlBQVEsV0FBVztBQUNuQiwyQkFBdUIsY0FBYyxPQUFPO0FBQ3hDLFdBQUssUUFBUTtBQUFBO0FBR2pCLGtCQUFjLFVBQVUsVUFBVTtBQUNsQyxrQkFBYyxVQUFVLFVBQVU7QUFDbEMsa0JBQWMsVUFBVSxXQUFXO0FBS25DLDZCQUF5QixTQUFTLE9BQU87QUFDckMsV0FBSyxRQUFRLE1BQU07QUFDbkIsV0FBSyxXQUFXO0FBQ2hCLFdBQUssY0FBYyxRQUFPLE1BQU07QUFDaEMsV0FBSyxpQkFBaUI7QUFBQTtBQUcxQixvQkFBZ0IsVUFBVSxRQUFRLFNBQVMsS0FBSztBQUM1QyxVQUFJLFdBQVcsS0FBSyxVQUNoQixjQUFjLEtBQUssYUFDbkIsaUJBQWlCLEtBQUssZ0JBQ3RCLE1BQU0sUUFBTyxNQUFNLElBQUksU0FBTyxJQUFJLEtBQUssU0FBUztBQUVwRCxlQUFTLEtBQUksR0FBRyxLQUFJLElBQUksUUFBUSxNQUFLO0FBQ2pDLFlBQUksUUFBUSxJQUFJLFdBQVc7QUFDM0IsWUFBSSxNQUFRLFNBQVMsU0FBUyxLQUFNO0FBQ2hDLGNBQUksVUFBVTtBQUNWLGdCQUFJLGlCQUFpQixHQUFHO0FBQ3BCLHdCQUFVLElBQUksTUFBTSxZQUFZLE1BQU0sR0FBRyxnQkFBZ0IsU0FBUyxVQUFVLFFBQVEsT0FBTyxLQUFLLFFBQVEsT0FBTyxLQUFLO0FBQ3BILCtCQUFpQjtBQUFBO0FBR3JCLGdCQUFJLFlBQVk7QUFDaEIsdUJBQVc7QUFBQTtBQUdmLGNBQUksQ0FBQyxVQUFVO0FBQ1gsZ0JBQUksWUFBWTtBQUVoQixnQkFBSSxVQUFVO0FBQ1Ysa0JBQUksWUFBWTtBQUFBO0FBQUEsZUFHckI7QUFDSCxjQUFJLENBQUMsVUFBVTtBQUNYLGdCQUFJLFlBQVk7QUFDaEIsdUJBQVc7QUFBQTtBQUVmLGNBQUksVUFBVTtBQUNWLHdCQUFZLG9CQUFvQixTQUFTO0FBQ3pDLHdCQUFZLG9CQUFvQixRQUFRO0FBRXhDLGdCQUFJLGtCQUFrQixZQUFZLFFBQVE7QUFDdEMsd0JBQVUsSUFBSSxNQUFNLFlBQVksU0FBUyxVQUFVLFFBQVEsT0FBTyxNQUFNO0FBQ3hFLCtCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTWpDLFdBQUssV0FBVztBQUNoQixXQUFLLGlCQUFpQjtBQUV0QixhQUFPLElBQUksTUFBTSxHQUFHO0FBQUE7QUFHeEIsb0JBQWdCLFVBQVUsTUFBTSxXQUFXO0FBQ3ZDLFVBQUksTUFBTSxRQUFPLE1BQU0sS0FBSyxTQUFTO0FBQ3JDLFVBQUksS0FBSyxVQUFVO0FBQ2YsWUFBSSxLQUFLLGlCQUFpQixHQUFHO0FBQ3pCLG9CQUFVLElBQUksTUFBTSxLQUFLLFlBQVksTUFBTSxHQUFHLEtBQUssZ0JBQWdCLFNBQVMsVUFBVSxRQUFRLE9BQU8sS0FBSyxRQUFRLE9BQU8sS0FBSztBQUM5SCxlQUFLLGlCQUFpQjtBQUFBO0FBRzFCLFlBQUksWUFBWTtBQUNoQixhQUFLLFdBQVc7QUFBQTtBQUdwQixhQUFPLElBQUksTUFBTSxHQUFHO0FBQUE7QUFNeEIsNkJBQXlCLFNBQVMsT0FBTztBQUNyQyxXQUFLLFFBQVEsTUFBTTtBQUNuQixXQUFLLFdBQVc7QUFDaEIsV0FBSyxjQUFjO0FBQUE7QUFHdkIsUUFBSSxrQkFBa0IsWUFBWTtBQUNsQyxvQkFBZ0IsSUFBSSxXQUFXLE1BQU07QUFFckMsb0JBQWdCLFVBQVUsUUFBUSxTQUFTLEtBQUs7QUFDNUMsVUFBSSxNQUFNLElBQUksUUFBUSxHQUNsQixXQUFXLEtBQUssVUFDaEIsY0FBYyxLQUFLO0FBS3ZCLGVBQVMsS0FBSSxHQUFHLEtBQUksSUFBSSxRQUFRLE1BQUs7QUFDakMsWUFBSSxDQUFDLFVBQVU7QUFFWCxjQUFJLElBQUksT0FBTSxTQUFTO0FBQ25CLG1CQUFPLEtBQUssTUFBTSxPQUFPLElBQUksTUFBTSxPQUFPLEtBQUk7QUFDOUMsb0JBQVEsS0FBRTtBQUNWLHVCQUFXO0FBQUE7QUFBQSxlQUVaO0FBQ0gsY0FBSSxDQUFDLGdCQUFnQixJQUFJLE1BQUs7QUFDMUIsZ0JBQUksTUFBSyxTQUFTLElBQUksT0FBTSxXQUFXO0FBQ25DLHFCQUFPO0FBQUEsbUJBQ0o7QUFDSCxrQkFBSSxTQUFTLGNBQWMsSUFBSSxNQUFNLE9BQU8sSUFBRyxXQUFXLFFBQVEsTUFBTTtBQUN4RSxxQkFBTyxLQUFLLE1BQU0sT0FBTyxRQUFPLEtBQUssUUFBUSxXQUFXO0FBQUE7QUFHNUQsZ0JBQUksSUFBSSxPQUFNO0FBQ1Y7QUFFSixvQkFBUSxLQUFFO0FBQ1YsdUJBQVc7QUFDWCwwQkFBYztBQUFBO0FBQUE7QUFBQTtBQUsxQixVQUFJLENBQUMsVUFBVTtBQUNYLGVBQU8sS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLFFBQVE7QUFBQSxhQUN4QztBQUNILFlBQUksU0FBUyxjQUFjLElBQUksTUFBTSxPQUFPLFdBQVcsUUFBUSxNQUFNO0FBRXJFLFlBQUksZUFBZSxPQUFPLFNBQVUsT0FBTyxTQUFTO0FBQ3BELHNCQUFjLE9BQU8sTUFBTTtBQUMzQixpQkFBUyxPQUFPLE1BQU0sR0FBRztBQUV6QixlQUFPLEtBQUssTUFBTSxPQUFPLFFBQU8sS0FBSyxRQUFRLFdBQVc7QUFBQTtBQUc1RCxXQUFLLFdBQVc7QUFDaEIsV0FBSyxjQUFjO0FBRW5CLGFBQU87QUFBQTtBQUdYLG9CQUFnQixVQUFVLE1BQU0sV0FBVztBQUN2QyxVQUFJLE1BQU07QUFDVixVQUFJLEtBQUssWUFBWSxLQUFLLFlBQVksU0FBUztBQUMzQyxjQUFNLEtBQUssTUFBTSxPQUFPLFFBQU8sS0FBSyxLQUFLLGFBQWEsV0FBVztBQUVyRSxXQUFLLFdBQVc7QUFDaEIsV0FBSyxjQUFjO0FBQ25CLGFBQU87QUFBQTtBQUFBO0FBQUE7OztBQzlSWDtBQUFBO0FBQUE7QUFDQSxRQUFJLFVBQVMsZ0JBQXdCO0FBS3JDLFlBQVEsUUFBUTtBQUNoQix1QkFBbUIsY0FBYyxPQUFPO0FBQ3BDLFVBQUksQ0FBQztBQUNELGNBQU0sSUFBSSxNQUFNO0FBR3BCLFVBQUksQ0FBQyxhQUFhLFNBQVUsYUFBYSxNQUFNLFdBQVcsT0FBTyxhQUFhLE1BQU0sV0FBVztBQUMzRixjQUFNLElBQUksTUFBTSxlQUFhLGFBQWEsT0FBSztBQUVuRCxVQUFJLGFBQWEsTUFBTSxXQUFXLEtBQUs7QUFDbkMsWUFBSSxjQUFjO0FBQ2xCLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUs7QUFDckIseUJBQWUsT0FBTyxhQUFhO0FBQ3ZDLHFCQUFhLFFBQVEsY0FBYyxhQUFhO0FBQUE7QUFHcEQsV0FBSyxZQUFZLFFBQU8sS0FBSyxhQUFhLE9BQU87QUFHakQsVUFBSSxZQUFZLFFBQU8sTUFBTSxPQUFPLE1BQU0sc0JBQXNCLFdBQVc7QUFFM0UsZUFBUyxJQUFJLEdBQUcsSUFBSSxhQUFhLE1BQU0sUUFBUTtBQUMzQyxrQkFBVSxhQUFhLE1BQU0sV0FBVyxNQUFNO0FBRWxELFdBQUssWUFBWTtBQUFBO0FBR3JCLGNBQVUsVUFBVSxVQUFVO0FBQzlCLGNBQVUsVUFBVSxVQUFVO0FBRzlCLHlCQUFxQixTQUFTLE9BQU87QUFDakMsV0FBSyxZQUFZLE1BQU07QUFBQTtBQUczQixnQkFBWSxVQUFVLFFBQVEsU0FBUyxLQUFLO0FBQ3hDLFVBQUksTUFBTSxRQUFPLE1BQU0sSUFBSTtBQUMzQixlQUFTLElBQUksR0FBRyxJQUFJLElBQUksUUFBUTtBQUM1QixZQUFJLEtBQUssS0FBSyxVQUFVLElBQUksV0FBVztBQUUzQyxhQUFPO0FBQUE7QUFHWCxnQkFBWSxVQUFVLE1BQU0sV0FBVztBQUFBO0FBSXZDLHlCQUFxQixTQUFTLE9BQU87QUFDakMsV0FBSyxZQUFZLE1BQU07QUFBQTtBQUczQixnQkFBWSxVQUFVLFFBQVEsU0FBUyxLQUFLO0FBRXhDLFVBQUksWUFBWSxLQUFLO0FBQ3JCLFVBQUksU0FBUyxRQUFPLE1BQU0sSUFBSSxTQUFPO0FBQ3JDLFVBQUksT0FBTyxHQUFHLE9BQU87QUFDckIsZUFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNqQyxlQUFPLElBQUksS0FBRztBQUFHLGVBQU8sSUFBRTtBQUMxQixlQUFPLFFBQVEsVUFBVTtBQUN6QixlQUFPLE9BQUssS0FBSyxVQUFVLE9BQUs7QUFBQTtBQUVwQyxhQUFPLE9BQU8sU0FBUztBQUFBO0FBRzNCLGdCQUFZLFVBQVUsTUFBTSxXQUFXO0FBQUE7QUFBQTtBQUFBOzs7QUN0RXZDO0FBQUE7QUFBQTtBQUlBLFlBQU8sVUFBVTtBQUFBLE1BRWIsU0FBUztBQUFBLE1BQ1QsZUFBZTtBQUFBLFFBQ1gsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFHYixPQUFPO0FBQUEsTUFDUCxVQUFVO0FBQUEsTUFDVixTQUFTO0FBQUEsUUFDTCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUdiLE9BQU87QUFBQSxRQUNILFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BSWIsYUFBYTtBQUFBLE1BQ2IsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BQ1gsZUFBZTtBQUFBLE1BQ2YsZUFBZTtBQUFBLE1BQ2YsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osYUFBYTtBQUFBLE1BQ2IsTUFBTTtBQUFBLE1BRU4sVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BRVgsZUFBZTtBQUFBLE1BQ2YsZUFBZTtBQUFBLE1BQ2YsZUFBZTtBQUFBLE1BQ2YsZUFBZTtBQUFBLE1BQ2Ysc0JBQXNCO0FBQUEsTUFDdEIsb0JBQW9CO0FBQUEsTUFDcEIsbUJBQW9CO0FBQUEsTUFDcEIsb0JBQW9CO0FBQUEsTUFDcEIsZUFBZTtBQUFBLE1BQ2YsZUFBZTtBQUFBLE1BRWYsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BRVAsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BRVosU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BRVYsWUFBWTtBQUFBLE1BRVosVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BRVgsU0FBVTtBQUFBLE1BQ1YsVUFBVztBQUFBLE1BQ1gsV0FBWTtBQUFBLE1BQ1osV0FBWTtBQUFBLE1BRVosVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLE1BRVosUUFBUTtBQUFBLE1BQ1IsU0FBUztBQUFBLE1BRVQsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLE1BRWIsV0FBVztBQUFBLE1BQ1gsZUFBZTtBQUFBLE1BQ2YsZUFBZTtBQUFBLE1BRWYsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BRVQsb0JBQW9CO0FBQUEsTUFDcEIsaUJBQWlCO0FBQUEsTUFDakIsdUJBQXVCO0FBQUEsTUFDdkIsWUFBWTtBQUFBLE1BQ1osc0JBQXNCO0FBQUEsTUFDdEIsUUFBUTtBQUFBLE1BRVIsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsY0FBYztBQUFBLE1BRWQsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLE1BRVgsZ0JBQWdCO0FBQUEsTUFFaEIsWUFBWTtBQUFBLE1BQ1osYUFBYTtBQUFBLE1BRWIsWUFBWTtBQUFBLE1BQ1osTUFBTTtBQUFBLE1BRU4scUJBQXFCO0FBQUEsTUFDckIsa0JBQWtCO0FBQUEsTUFDbEIsTUFBTTtBQUFBLE1BRU4sY0FBYztBQUFBLE1BQ2QsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BRVgsT0FBTztBQUFBLE1BQ1AsZUFBZTtBQUFBO0FBQUE7QUFBQTs7O0FDM0tuQjtBQUFBO0FBQUE7QUFHQSxZQUFPLFVBQVU7QUFBQSxNQUNmLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULGNBQWM7QUFBQSxRQUNaLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLE1BQ1QsZUFBZTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsUUFDYixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFVBQVU7QUFBQSxNQUNWLGVBQWU7QUFBQSxRQUNiLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsUUFDYixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFVBQVU7QUFBQSxNQUNWLGVBQWU7QUFBQSxRQUNiLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsUUFDYixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFVBQVU7QUFBQSxNQUNWLGVBQWU7QUFBQSxRQUNiLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxZQUFZO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFlBQVk7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxZQUFZO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFlBQVk7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxZQUFZO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFlBQVk7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLFFBQ1gsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLGFBQWE7QUFBQSxRQUNYLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLFFBQ1gsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLGFBQWE7QUFBQSxRQUNYLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osVUFBVTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLGFBQWE7QUFBQSxNQUNiLFVBQVU7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLGFBQWE7QUFBQSxNQUNiLFVBQVU7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLGFBQWE7QUFBQSxNQUNiLGVBQWU7QUFBQSxRQUNiLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsZUFBZTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxZQUFZO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLGNBQWM7QUFBQSxRQUNaLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxjQUFjO0FBQUEsUUFDWixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxRQUNULFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsY0FBYztBQUFBLFFBQ1osUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxjQUFjO0FBQUEsUUFDWixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFFBQVE7QUFBQSxRQUNOLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsbUJBQW1CO0FBQUEsUUFDakIsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxjQUFjO0FBQUEsUUFDWixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxZQUFZO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFlBQVk7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxhQUFhO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUE7QUFBQTtB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QUFNLEtBQUs7QUFDWCxlQUFPO0FBRVgsVUFBSSxJQUFJLEdBQUcsSUFBSSxNQUFNO0FBQ3JCLGFBQU8sSUFBSSxJQUFFLEdBQUc7QUFDWixZQUFJLE1BQU0sSUFBSSxLQUFLLE1BQU8sS0FBRSxJQUFFLEtBQUc7QUFDakMsWUFBSSxNQUFNLFFBQVE7QUFDZCxjQUFJO0FBQUE7QUFFSixjQUFJO0FBQUE7QUFFWixhQUFPO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1UVQ7QUFBQTtBQVdBLFlBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ1hqQjtBQUFBO0FBT0E7QUFPQSxRQUFJLEtBQUs7QUFDVCxRQUFJLFVBQVUsUUFBUSxRQUFRO0FBTzlCLFFBQUksc0JBQXNCO0FBQzFCLFFBQUksbUJBQW1CO0FBT3ZCLFlBQVEsVUFBVTtBQUNsQixZQUFRLFdBQVcsRUFBRSxRQUFRO0FBQzdCLFlBQVEsY0FBYztBQUN0QixZQUFRLFlBQVk7QUFDcEIsWUFBUSxhQUFhLE9BQU8sT0FBTztBQUNuQyxZQUFRLFNBQVM7QUFDakIsWUFBUSxRQUFRLE9BQU8sT0FBTztBQUc5QixpQkFBYSxRQUFRLFlBQVksUUFBUTtBQVN6QyxxQkFBa0IsTUFBTTtBQUN0QixVQUFJLENBQUMsUUFBUSxPQUFPLFNBQVMsVUFBVTtBQUNyQyxlQUFPO0FBQUE7QUFJVCxVQUFJLFFBQVEsb0JBQW9CLEtBQUs7QUFDckMsVUFBSSxRQUFPLFNBQVMsR0FBRyxNQUFNLEdBQUc7QUFFaEMsVUFBSSxTQUFRLE1BQUssU0FBUztBQUN4QixlQUFPLE1BQUs7QUFBQTtBQUlkLFVBQUksU0FBUyxpQkFBaUIsS0FBSyxNQUFNLEtBQUs7QUFDNUMsZUFBTztBQUFBO0FBR1QsYUFBTztBQUFBO0FBVVQseUJBQXNCLEtBQUs7QUFFekIsVUFBSSxDQUFDLE9BQU8sT0FBTyxRQUFRLFVBQVU7QUFDbkMsZUFBTztBQUFBO0FBR1QsVUFBSSxRQUFPLElBQUksUUFBUSxTQUFTLEtBQzVCLFFBQVEsT0FBTyxPQUNmO0FBRUosVUFBSSxDQUFDLE9BQU07QUFDVCxlQUFPO0FBQUE7QUFJVCxVQUFJLE1BQUssUUFBUSxlQUFlLElBQUk7QUFDbEMsWUFBSSxXQUFVLFFBQVEsUUFBUTtBQUM5QixZQUFJO0FBQVMsbUJBQVEsZUFBZSxTQUFRO0FBQUE7QUFHOUMsYUFBTztBQUFBO0FBVVQsdUJBQW9CLE1BQU07QUFDeEIsVUFBSSxDQUFDLFFBQVEsT0FBTyxTQUFTLFVBQVU7QUFDckMsZUFBTztBQUFBO0FBSVQsVUFBSSxRQUFRLG9CQUFvQixLQUFLO0FBR3JDLFVBQUksT0FBTyxTQUFTLFFBQVEsV0FBVyxNQUFNLEdBQUc7QUFFaEQsVUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVE7QUFDekIsZUFBTztBQUFBO0FBR1QsYUFBTyxLQUFLO0FBQUE7QUFVZCxxQkFBaUIsTUFBTTtBQUNyQixVQUFJLENBQUMsUUFBUSxPQUFPLFNBQVMsVUFBVTtBQUNyQyxlQUFPO0FBQUE7QUFJVCxVQUFJLGFBQVksUUFBUSxPQUFPLE1BQzVCLGNBQ0EsT0FBTztBQUVWLFVBQUksQ0FBQyxZQUFXO0FBQ2QsZUFBTztBQUFBO0FBR1QsYUFBTyxRQUFRLE1BQU0sZUFBYztBQUFBO0FBUXJDLDBCQUF1QixZQUFZLE9BQU87QUFFeEMsVUFBSSxhQUFhLENBQUMsU0FBUyxVQUFVLFFBQVc7QUFFaEQsYUFBTyxLQUFLLElBQUksUUFBUSx5QkFBMEIsTUFBTTtBQUN0RCxZQUFJLFFBQU8sR0FBRztBQUNkLFlBQUksT0FBTyxNQUFLO0FBRWhCLFlBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxRQUFRO0FBQ3pCO0FBQUE7QUFJRixtQkFBVyxRQUFRO0FBR25CLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ3BDLGNBQUksYUFBWSxLQUFLO0FBRXJCLGNBQUksTUFBTSxhQUFZO0FBQ3BCLGdCQUFJLE9BQU8sV0FBVyxRQUFRLEdBQUcsTUFBTSxhQUFZO0FBQ25ELGdCQUFJLEtBQUssV0FBVyxRQUFRLE1BQUs7QUFFakMsZ0JBQUksTUFBTSxnQkFBZSw4QkFDdEIsUUFBTyxNQUFPLFNBQVMsTUFBTSxNQUFNLFlBQVcsT0FBTyxHQUFHLFFBQVEsaUJBQWtCO0FBRW5GO0FBQUE7QUFBQTtBQUtKLGdCQUFNLGNBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUN4THpCO0FBQUE7QUFPQTtBQU9BLFFBQUksUUFBUTtBQUNaLFFBQUksUUFBTztBQU9YLFlBQU8sVUFBVTtBQUNqQixZQUFPLFFBQVEsS0FBSztBQUNwQixZQUFPLFFBQVEsVUFBVTtBQUN6QixZQUFPLFFBQVEsWUFBWTtBQUMzQixZQUFPLFFBQVEsUUFBUTtBQWdCdkIsb0JBQWlCLE9BQU8sUUFBUTtBQUM5QixVQUFJO0FBQ0osVUFBSSxRQUFRO0FBR1osVUFBSSxNQUFNLGlCQUFpQjtBQUczQixVQUFJLENBQUMsS0FBSztBQUNSLGVBQU87QUFBQTtBQUlULFVBQUksU0FBUyxDQUFDLE1BQU0sUUFBUSxRQUFRO0FBQ2xDLGdCQUFRLElBQUksTUFBTSxVQUFVLFNBQVM7QUFDckMsYUFBSyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNqQyxnQkFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBO0FBQUE7QUFLN0IsVUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLFFBQVE7QUFDM0IsZUFBTztBQUFBO0FBR1QsVUFBSTtBQUNKLFdBQUssSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDakMsWUFBSSxVQUFVLFVBQVUsT0FBTyxNQUFNLEtBQUssTUFBTTtBQUM5QyxpQkFBTyxLQUFLLE9BQU8sT0FBTyxLQUFLLFFBQVEsU0FBUyxLQUM1QyxNQUNBO0FBQUE7QUFBQTtBQUtSLGFBQU87QUFBQTtBQWNULHFCQUFrQixLQUFLO0FBQ3JCLGFBQU8sSUFBSSxRQUFRLHlCQUF5QixVQUMxQyxDQUFDLE1BQU0sSUFBSSxRQUFRO0FBQUE7QUE2QnZCLDJCQUF3QixLQUFLLFFBQVE7QUFDbkMsVUFBSSxRQUFRO0FBR1osVUFBSSxDQUFDLFFBQVEsTUFBTTtBQUNqQixlQUFPO0FBQUE7QUFJVCxVQUFJLFVBQVUsU0FBUyxHQUFHO0FBQ3hCLGdCQUFRLElBQUksTUFBTSxVQUFVLFNBQVM7QUFDckMsaUJBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDckMsZ0JBQU0sS0FBSyxVQUFVLElBQUk7QUFBQTtBQUFBO0FBSzdCLFVBQUksUUFBUSxJQUFJLFFBQVE7QUFFeEIsYUFBTyxPQUFPLE9BQU87QUFBQTtBQW1CdkIsdUJBQW9CLE1BQU07QUFDeEIsVUFBSSxPQUFPLFNBQVMsVUFBVTtBQUU1QixlQUFPO0FBQUE7QUFHVCxjQUFRO0FBQUEsYUFDRDtBQUNILGlCQUFPO0FBQUEsYUFDSjtBQUNILGlCQUFPO0FBQUE7QUFHWCxVQUFJLEtBQUssT0FBTyxLQUFLO0FBRW5CLGVBQU8sUUFBUTtBQUFBO0FBR2pCLGFBQU8sS0FBSyxRQUFRLFNBQVMsS0FDekIsTUFBSyxPQUFPLFFBQ1o7QUFBQTtBQWNOLHVCQUFvQixVQUFVLFFBQVE7QUFFcEMsVUFBSSxhQUFhLE9BQU87QUFDdEIsZUFBTztBQUFBO0FBSVQsVUFBSSxjQUFjLE9BQU8sTUFBTTtBQUMvQixVQUFJLGdCQUFnQixTQUFTLE1BQU07QUFHbkMsVUFBSSxZQUFZLFdBQVcsS0FBSyxjQUFjLFdBQVcsR0FBRztBQUMxRCxlQUFPO0FBQUE7QUFJVCxVQUFJLGNBQWMsT0FBTyxPQUFPLGNBQWMsT0FBTyxZQUFZLElBQUk7QUFDbkUsZUFBTztBQUFBO0FBSVQsVUFBSSxjQUFjLEdBQUcsT0FBTyxHQUFHLE9BQU8sTUFBTTtBQUMxQyxlQUFPLGNBQWMsR0FBRyxVQUFVLFlBQVksR0FBRyxTQUFTLEtBQ3hELGNBQWMsR0FBRyxPQUFPLE9BQU8sWUFBWSxHQUFHLE9BQU8sSUFBSSxjQUFjLEdBQUc7QUFBQTtBQUk5RSxVQUFJLGNBQWMsT0FBTyxPQUFPLGNBQWMsT0FBTyxZQUFZLElBQUk7QUFDbkUsZUFBTztBQUFBO0FBR1QsYUFBTztBQUFBO0FBV1QsMkJBQXdCLE9BQU87QUFFN0IsVUFBSSxPQUFPLE1BQU0sTUFBTTtBQUd2QixXQUFLLGFBQWE7QUFHbEIsYUFBTyxNQUFNLE9BQU87QUFBQTtBQVd0Qiw4QkFBMkIsT0FBTztBQUNoQyxVQUFJLENBQUMsT0FBTztBQUNWLGVBQU87QUFBQTtBQUdULFVBQUk7QUFDRixlQUFPLGNBQWM7QUFBQSxlQUNkLEtBQVA7QUFDQSxlQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ3ZRWDtBQUFBO0FBT0E7QUFPQSxRQUFJLFFBQVE7QUFDWixRQUFJLGNBQWM7QUFDbEIsUUFBSSxjQUFjO0FBQ2xCLFFBQUksUUFBUSxjQUFpQjtBQUM3QixRQUFJLE9BQU87QUFDWCxRQUFJLFNBQVM7QUFNYixZQUFPLFVBQVU7QUFjakIsUUFBSSxvQkFBb0I7QUFVeEIsa0JBQWUsU0FBUztBQUN0QixVQUFJLE9BQU8sV0FBVztBQUV0QixVQUFJLFFBQVEsT0FBTyxLQUFLLFVBQVUsV0FDOUIsTUFBTSxNQUFNLEtBQUssU0FBUyxXQUMxQixLQUFLO0FBQ1QsVUFBSSxVQUFVLEtBQUssWUFBWTtBQUMvQixVQUFJLFVBQVUsS0FBSztBQUNuQixVQUFJLFNBQVMsS0FBSyxXQUFXO0FBQzdCLFVBQUksT0FBTyxLQUFLLFFBQVE7QUFDeEIsVUFBSSxTQUFTLEtBQUssVUFBVTtBQUU1QixVQUFJLFdBQVcsU0FBUyxPQUFPLFdBQVcsWUFBWTtBQUNwRCxjQUFNLElBQUksVUFBVTtBQUFBO0FBSXRCLFVBQUksY0FBYyxPQUFPLFNBQVMsYUFDOUIsWUFBWSxRQUNaO0FBRUoscUJBQWdCLE1BQU07QUFDcEIsWUFBSSxLQUFLLFdBQVcsR0FBRztBQUdyQixpQkFBTztBQUFBO0FBR1QsWUFBSSxRQUFRO0FBQ1YsY0FBSSxRQUFRLFVBQVU7QUFFdEIsY0FBSSxVQUFVLE9BQU8sVUFBVSxLQUFLO0FBQ2xDLGtCQUFNO0FBQ04sa0JBQU0sd0JBQXdCLE1BQU07QUFBQTtBQUFBO0FBSXhDLFlBQUk7QUFDRixnQkFBTTtBQUNOLGlCQUFPLEtBQUssTUFBTSxNQUFNO0FBQUEsaUJBQ2pCLEdBQVA7QUFDQSxnQkFBTSx5QkFBeUIsR0FBRztBQUFBLFlBQ2hDLFNBQVMsRUFBRTtBQUFBLFlBQ1gsT0FBTyxFQUFFO0FBQUE7QUFBQTtBQUFBO0FBS2YsYUFBTyxvQkFBcUIsS0FBSyxLQUFLLE1BQU07QUFDMUMsWUFBSSxJQUFJLE9BQU87QUFDYixnQkFBTTtBQUNOO0FBQ0E7QUFBQTtBQUdGLFlBQUksT0FBTyxJQUFJLFFBQVE7QUFHdkIsWUFBSSxDQUFDLE9BQU8sUUFBUSxNQUFNO0FBQ3hCLGdCQUFNO0FBQ047QUFDQTtBQUFBO0FBR0YsY0FBTSxtQkFBbUIsSUFBSSxRQUFRO0FBR3JDLFlBQUksQ0FBQyxZQUFZLE1BQU07QUFDckIsZ0JBQU07QUFDTjtBQUNBO0FBQUE7QUFJRixZQUFJLFVBQVUsV0FBVyxRQUFRO0FBQ2pDLFlBQUksUUFBUSxNQUFNLEdBQUcsT0FBTyxRQUFRO0FBQ2xDLGdCQUFNO0FBQ04sZUFBSyxZQUFZLEtBQUssMEJBQTBCLFFBQVEsZ0JBQWdCLEtBQUs7QUFBQSxZQUMzRTtBQUFBLFlBQ0EsTUFBTTtBQUFBO0FBRVI7QUFBQTtBQUlGLGFBQUssS0FBSyxLQUFLLE1BQU0sT0FBTyxPQUFPO0FBQUEsVUFDakMsVUFBVTtBQUFBLFVBQ1Y7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBO0FBQUE7QUFBQTtBQWNOLHFDQUFrQyxLQUFLLE1BQU07QUFDM0MsVUFBSSxRQUFRLElBQUksUUFBUTtBQUN4QixVQUFJLFVBQVUsVUFBVSxLQUNwQixJQUFJLFVBQVUsR0FBRyxTQUFTLE1BQzFCO0FBRUosVUFBSTtBQUNGLGFBQUssTUFBTTtBQUFxQyxjQUFNLElBQUksWUFBWTtBQUFBLGVBQy9ELEdBQVA7QUFDQSxlQUFPLHlCQUF5QixHQUFHO0FBQUEsVUFDakMsU0FBUyxFQUFFLFFBQVEsUUFBUSxLQUFLO0FBQUEsVUFDaEMsT0FBTyxFQUFFO0FBQUE7QUFBQTtBQUFBO0FBYWYsdUJBQW9CLEtBQUs7QUFDdkIsVUFBSSxRQUFRLGtCQUFrQixLQUFLO0FBRW5DLGFBQU8sUUFDSCxNQUFNLEtBQ047QUFBQTtBQVVOLHdCQUFxQixLQUFLO0FBQ3hCLFVBQUk7QUFDRixlQUFRLGFBQVksTUFBTSxLQUFLLFdBQVcsV0FBVyxJQUFJO0FBQUEsZUFDbEQsR0FBUDtBQUNBLGVBQU87QUFBQTtBQUFBO0FBWVgsc0NBQW1DLE9BQU8sS0FBSztBQUM3QyxVQUFJLE9BQU8sT0FBTyxvQkFBb0I7QUFFdEMsZUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUNwQyxZQUFJLE1BQU0sS0FBSztBQUNmLFlBQUksUUFBUSxXQUFXLFFBQVEsV0FBVztBQUN4QyxpQkFBTyxNQUFNO0FBQUE7QUFBQTtBQUtqQixZQUFNLFFBQVEsSUFBSSxNQUFNLFFBQVEsTUFBTSxTQUFTLElBQUk7QUFDbkQsWUFBTSxVQUFVLElBQUk7QUFFcEIsYUFBTztBQUFBO0FBVVQseUJBQXNCLE1BQU07QUFDMUIsYUFBTyxtQkFBb0IsS0FBSztBQUM5QixlQUFPLFFBQVEsT0FBTyxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ3pPL0I7QUFBQTtBQU1BO0FBTUEsUUFBSSxRQUFRO0FBQ1osUUFBSSxRQUFRLGNBQWlCO0FBQzdCLFFBQUksT0FBTztBQUNYLFFBQUksU0FBUztBQU1iLFlBQU8sVUFBVTtBQVVqQixpQkFBYyxTQUFTO0FBQ3JCLFVBQUksT0FBTyxXQUFXO0FBRXRCLFVBQUksVUFBVSxLQUFLLFlBQVk7QUFDL0IsVUFBSSxRQUFRLE9BQU8sS0FBSyxVQUFVLFdBQzlCLE1BQU0sTUFBTSxLQUFLLFNBQVMsV0FDMUIsS0FBSztBQUNULFVBQUksT0FBTyxLQUFLLFFBQVE7QUFDeEIsVUFBSSxTQUFTLEtBQUssVUFBVTtBQUU1QixVQUFJLFdBQVcsU0FBUyxPQUFPLFdBQVcsWUFBWTtBQUNwRCxjQUFNLElBQUksVUFBVTtBQUFBO0FBSXRCLFVBQUksY0FBYyxPQUFPLFNBQVMsYUFDOUIsWUFBWSxRQUNaO0FBRUoscUJBQWdCLEtBQUs7QUFDbkIsZUFBTztBQUFBO0FBR1QsYUFBTyxtQkFBb0IsS0FBSyxLQUFLLE1BQU07QUFDekMsWUFBSSxJQUFJLE9BQU87QUFDYixnQkFBTTtBQUNOO0FBQ0E7QUFBQTtBQUdGLFlBQUksT0FBTyxJQUFJLFFBQVE7QUFHdkIsWUFBSSxDQUFDLE9BQU8sUUFBUSxNQUFNO0FBQ3hCLGdCQUFNO0FBQ047QUFDQTtBQUFBO0FBR0YsY0FBTSxtQkFBbUIsSUFBSSxRQUFRO0FBR3JDLFlBQUksQ0FBQyxZQUFZLE1BQU07QUFDckIsZ0JBQU07QUFDTjtBQUNBO0FBQUE7QUFJRixhQUFLLEtBQUssS0FBSyxNQUFNLE9BQU8sT0FBTztBQUFBLFVBQ2pDLFVBQVU7QUFBQSxVQUNWO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFZTix5QkFBc0IsTUFBTTtBQUMxQixhQUFPLG1CQUFvQixLQUFLO0FBQzlCLGVBQU8sUUFBUSxPQUFPLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDbEcvQjtBQUFBO0FBTUE7QUFNQSxRQUFJLFFBQVE7QUFDWixRQUFJLGNBQWM7QUFDbEIsUUFBSSxRQUFRLGNBQWlCO0FBQzdCLFFBQUksT0FBTztBQUNYLFFBQUksU0FBUztBQU1iLFlBQU8sVUFBVTtBQVVqQixrQkFBZSxTQUFTO0FBQ3RCLFVBQUksT0FBTyxXQUFXO0FBRXRCLFVBQUksaUJBQWlCLEtBQUssa0JBQWtCO0FBQzVDLFVBQUksVUFBVSxLQUFLLFlBQVk7QUFDL0IsVUFBSSxRQUFRLE9BQU8sS0FBSyxVQUFVLFdBQzlCLE1BQU0sTUFBTSxLQUFLLFNBQVMsV0FDMUIsS0FBSztBQUNULFVBQUksT0FBTyxLQUFLLFFBQVE7QUFDeEIsVUFBSSxTQUFTLEtBQUssVUFBVTtBQUU1QixVQUFJLFdBQVcsU0FBUyxPQUFPLFdBQVcsWUFBWTtBQUNwRCxjQUFNLElBQUksVUFBVTtBQUFBO0FBSXRCLFVBQUksY0FBYyxPQUFPLFNBQVMsYUFDOUIsWUFBWSxRQUNaO0FBRUoscUJBQWdCLEtBQUs7QUFDbkIsZUFBTztBQUFBO0FBR1QsYUFBTyxvQkFBcUIsS0FBSyxLQUFLLE1BQU07QUFDMUMsWUFBSSxJQUFJLE9BQU87QUFDYixnQkFBTTtBQUNOO0FBQ0E7QUFBQTtBQUdGLFlBQUksT0FBTyxJQUFJLFFBQVE7QUFHdkIsWUFBSSxDQUFDLE9BQU8sUUFBUSxNQUFNO0FBQ3hCLGdCQUFNO0FBQ047QUFDQTtBQUFBO0FBR0YsY0FBTSxtQkFBbUIsSUFBSSxRQUFRO0FBR3JDLFlBQUksQ0FBQyxZQUFZLE1BQU07QUFDckIsZ0JBQU07QUFDTjtBQUNBO0FBQUE7QUFJRixZQUFJLFVBQVUsV0FBVyxRQUFRO0FBR2pDLGFBQUssS0FBSyxLQUFLLE1BQU0sT0FBTyxPQUFPO0FBQUEsVUFDakMsVUFBVTtBQUFBLFVBQ1Y7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBO0FBQUE7QUFBQTtBQVlOLHdCQUFxQixLQUFLO0FBQ3hCLFVBQUk7QUFDRixlQUFRLGFBQVksTUFBTSxLQUFLLFdBQVcsV0FBVyxJQUFJO0FBQUEsZUFDbEQsR0FBUDtBQUNBLGVBQU87QUFBQTtBQUFBO0FBV1gseUJBQXNCLE1BQU07QUFDMUIsYUFBTyxtQkFBb0IsS0FBSztBQUM5QixlQUFPLFFBQVEsT0FBTyxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ3RIL0I7QUFBQTtBQUFBO0FBR0EsWUFBTyxVQUFVLHNCQUFzQjtBQUN0QyxVQUFJLE9BQU8sV0FBVyxjQUFjLE9BQU8sT0FBTywwQkFBMEIsWUFBWTtBQUFFLGVBQU87QUFBQTtBQUNqRyxVQUFJLE9BQU8sT0FBTyxhQUFhLFVBQVU7QUFBRSxlQUFPO0FBQUE7QUFFbEQsVUFBSSxNQUFNO0FBQ1YsVUFBSSxNQUFNLE9BQU87QUFDakIsVUFBSSxTQUFTLE9BQU87QUFDcEIsVUFBSSxPQUFPLFFBQVEsVUFBVTtBQUFFLGVBQU87QUFBQTtBQUV0QyxVQUFJLE9BQU8sVUFBVSxTQUFTLEtBQUssU0FBUyxtQkFBbUI7QUFBRSxlQUFPO0FBQUE7QUFDeEUsVUFBSSxPQUFPLFVBQVUsU0FBUyxLQUFLLFlBQVksbUJBQW1CO0FBQUUsZUFBTztBQUFBO0FBVTNFLFVBQUksU0FBUztBQUNiLFVBQUksT0FBTztBQUNYLFdBQUssT0FBTyxLQUFLO0FBQUUsZUFBTztBQUFBO0FBQzFCLFVBQUksT0FBTyxPQUFPLFNBQVMsY0FBYyxPQUFPLEtBQUssS0FBSyxXQUFXLEdBQUc7QUFBRSxlQUFPO0FBQUE7QUFFakYsVUFBSSxPQUFPLE9BQU8sd0JBQXdCLGNBQWMsT0FBTyxvQkFBb0IsS0FBSyxXQUFXLEdBQUc7QUFBRSxlQUFPO0FBQUE7QUFFL0csVUFBSSxPQUFPLE9BQU8sc0JBQXNCO0FBQ3hDLFVBQUksS0FBSyxXQUFXLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFBRSxlQUFPO0FBQUE7QUFFbkQsVUFBSSxDQUFDLE9BQU8sVUFBVSxxQkFBcUIsS0FBSyxLQUFLLE1BQU07QUFBRSxlQUFPO0FBQUE7QUFFcEUsVUFBSSxPQUFPLE9BQU8sNkJBQTZCLFlBQVk7QUFDMUQsWUFBSSxhQUFhLE9BQU8seUJBQXlCLEtBQUs7QUFDdEQsWUFBSSxXQUFXLFVBQVUsVUFBVSxXQUFXLGVBQWUsTUFBTTtBQUFFLGlCQUFPO0FBQUE7QUFBQTtBQUc3RSxhQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUN4Q1I7QUFBQTtBQUFBO0FBRUEsUUFBSSxhQUFhLE9BQU8sV0FBVyxlQUFlO0FBQ2xELFFBQUksZ0JBQWdCO0FBRXBCLFlBQU8sVUFBVSw0QkFBNEI7QUFDNUMsVUFBSSxPQUFPLGVBQWUsWUFBWTtBQUFFLGVBQU87QUFBQTtBQUMvQyxVQUFJLE9BQU8sV0FBVyxZQUFZO0FBQUUsZUFBTztBQUFBO0FBQzNDLFVBQUksT0FBTyxXQUFXLFdBQVcsVUFBVTtBQUFFLGVBQU87QUFBQTtBQUNwRCxVQUFJLE9BQU8sT0FBTyxXQUFXLFVBQVU7QUFBRSxlQUFPO0FBQUE7QUFFaEQsYUFBTztBQUFBO0FBQUE7QUFBQTs7O0FDWFI7QUFBQTtBQUFBO0FBRUEsUUFBSSxPQUFPO0FBQUEsTUFDVixLQUFLO0FBQUE7QUFHTixRQUFJLFVBQVU7QUFFZCxZQUFPLFVBQVUsb0JBQW9CO0FBQ3BDLGFBQU8sRUFBRSxXQUFXLE9BQU8sUUFBUSxLQUFLLE9BQU8sQ0FBRSxHQUFFLFdBQVcsa0JBQWtCO0FBQUE7QUFBQTtBQUFBOzs7QUNUakY7QUFBQTtBQUFBO0FBSUEsUUFBSSxnQkFBZ0I7QUFDcEIsUUFBSSxRQUFRLE1BQU0sVUFBVTtBQUM1QixRQUFJLFFBQVEsT0FBTyxVQUFVO0FBQzdCLFFBQUksV0FBVztBQUVmLFlBQU8sVUFBVSxjQUFjLE1BQU07QUFDakMsVUFBSSxTQUFTO0FBQ2IsVUFBSSxPQUFPLFdBQVcsY0FBYyxNQUFNLEtBQUssWUFBWSxVQUFVO0FBQ2pFLGNBQU0sSUFBSSxVQUFVLGdCQUFnQjtBQUFBO0FBRXhDLFVBQUksT0FBTyxNQUFNLEtBQUssV0FBVztBQUVqQyxVQUFJO0FBQ0osVUFBSSxTQUFTLFdBQVk7QUFDckIsWUFBSSxnQkFBZ0IsT0FBTztBQUN2QixjQUFJLFNBQVMsT0FBTyxNQUNoQixNQUNBLEtBQUssT0FBTyxNQUFNLEtBQUs7QUFFM0IsY0FBSSxPQUFPLFlBQVksUUFBUTtBQUMzQixtQkFBTztBQUFBO0FBRVgsaUJBQU87QUFBQSxlQUNKO0FBQ0gsaUJBQU8sT0FBTyxNQUNWLE1BQ0EsS0FBSyxPQUFPLE1BQU0sS0FBSztBQUFBO0FBQUE7QUFLbkMsVUFBSSxjQUFjLEtBQUssSUFBSSxHQUFHLE9BQU8sU0FBUyxLQUFLO0FBQ25ELFVBQUksWUFBWTtBQUNoQixlQUFTLElBQUksR0FBRyxJQUFJLGFBQWEsS0FBSztBQUNsQyxrQkFBVSxLQUFLLE1BQU07QUFBQTtBQUd6QixjQUFRLFNBQVMsVUFBVSxzQkFBc0IsVUFBVSxLQUFLLE9BQU8sNkNBQTZDO0FBRXBILFVBQUksT0FBTyxXQUFXO0FBQ2xCLFlBQUksUUFBUSxrQkFBaUI7QUFBQTtBQUM3QixjQUFNLFlBQVksT0FBTztBQUN6QixjQUFNLFlBQVksSUFBSTtBQUN0QixjQUFNLFlBQVk7QUFBQTtBQUd0QixhQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUNsRFg7QUFBQTtBQUFBO0FBRUEsUUFBSSxpQkFBaUI7QUFFckIsWUFBTyxVQUFVLFNBQVMsVUFBVSxRQUFRO0FBQUE7QUFBQTs7O0FDSjVDO0FBQUE7QUFBQTtBQUVBLFFBQUksT0FBTztBQUVYLFlBQU8sVUFBVSxLQUFLLEtBQUssU0FBUyxNQUFNLE9BQU8sVUFBVTtBQUFBO0FBQUE7OztBQ0ozRDtBQUFBO0FBQUE7QUFFQSxRQUFJO0FBRUosUUFBSSxlQUFlO0FBQ25CLFFBQUksWUFBWTtBQUNoQixRQUFJLGFBQWE7QUFHakIsUUFBSSx3QkFBd0IsU0FBVSxrQkFBa0I7QUFDdkQsVUFBSTtBQUNILGVBQU8sVUFBVSwyQkFBMkIsbUJBQW1CO0FBQUEsZUFDdkQsR0FBUDtBQUFBO0FBQUE7QUFHSCxRQUFJLFFBQVEsT0FBTztBQUNuQixRQUFJLE9BQU87QUFDVixVQUFJO0FBQ0gsY0FBTSxJQUFJO0FBQUEsZUFDRixHQUFQO0FBQ0QsZ0JBQVE7QUFBQTtBQUFBO0FBSVYsUUFBSSxpQkFBaUIsV0FBWTtBQUNoQyxZQUFNLElBQUk7QUFBQTtBQUVYLFFBQUksaUJBQWlCLFFBQ2pCLFdBQVk7QUFDZCxVQUFJO0FBRUgsa0JBQVU7QUFDVixlQUFPO0FBQUEsZUFDQyxjQUFQO0FBQ0QsWUFBSTtBQUVILGlCQUFPLE1BQU0sV0FBVyxVQUFVO0FBQUEsaUJBQzFCLFlBQVA7QUFDRCxpQkFBTztBQUFBO0FBQUE7QUFBQSxVQUlSO0FBRUgsUUFBSSxhQUFhO0FBQ2pCLFFBQUksV0FBVztBQUVmLFFBQUksV0FBVyxPQUFPLGtCQUNyQixZQUNHLFNBQVUsR0FBRztBQUFFLGFBQU8sRUFBRTtBQUFBLFFBQ3hCO0FBR0osUUFBSSxZQUFZO0FBRWhCLFFBQUksYUFBYSxPQUFPLGVBQWUsZUFBZSxDQUFDLFdBQVcsYUFBWSxTQUFTO0FBRXZGLFFBQUksYUFBYTtBQUFBLE1BQ2hCLG9CQUFvQixPQUFPLG1CQUFtQixjQUFjLGFBQVk7QUFBQSxNQUN4RSxXQUFXO0FBQUEsTUFDWCxpQkFBaUIsT0FBTyxnQkFBZ0IsY0FBYyxhQUFZO0FBQUEsTUFDbEUsNEJBQTRCLGNBQWMsV0FBVyxTQUFTLEdBQUcsT0FBTyxlQUFlO0FBQUEsTUFDdkYsb0NBQW9DO0FBQUEsTUFDcEMsbUJBQW1CO0FBQUEsTUFDbkIsb0JBQW9CO0FBQUEsTUFDcEIsNEJBQTRCO0FBQUEsTUFDNUIsNEJBQTRCO0FBQUEsTUFDNUIsYUFBYSxPQUFPLFlBQVksY0FBYyxhQUFZO0FBQUEsTUFDMUQsWUFBWSxPQUFPLFdBQVcsY0FBYyxhQUFZO0FBQUEsTUFDeEQsbUJBQW1CLE9BQU8sa0JBQWtCLGNBQWMsYUFBWTtBQUFBLE1BQ3RFLG9CQUFvQixPQUFPLG1CQUFtQixjQUFjLGFBQVk7QUFBQSxNQUN4RSxhQUFhO0FBQUEsTUFDYixjQUFjLE9BQU8sYUFBYSxjQUFjLGFBQVk7QUFBQSxNQUM1RCxVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsTUFDZix3QkFBd0I7QUFBQSxNQUN4QixlQUFlO0FBQUEsTUFDZix3QkFBd0I7QUFBQSxNQUN4QixXQUFXO0FBQUEsTUFDWCxVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsTUFDZixrQkFBa0IsT0FBTyxpQkFBaUIsY0FBYyxhQUFZO0FBQUEsTUFDcEUsa0JBQWtCLE9BQU8saUJBQWlCLGNBQWMsYUFBWTtBQUFBLE1BQ3BFLDBCQUEwQixPQUFPLHlCQUF5QixjQUFjLGFBQVk7QUFBQSxNQUNwRixjQUFjO0FBQUEsTUFDZCx1QkFBdUI7QUFBQSxNQUN2QixlQUFlLE9BQU8sY0FBYyxjQUFjLGFBQVk7QUFBQSxNQUM5RCxnQkFBZ0IsT0FBTyxlQUFlLGNBQWMsYUFBWTtBQUFBLE1BQ2hFLGdCQUFnQixPQUFPLGVBQWUsY0FBYyxhQUFZO0FBQUEsTUFDaEUsY0FBYztBQUFBLE1BQ2QsV0FBVztBQUFBLE1BQ1gsdUJBQXVCLGNBQWMsV0FBVyxTQUFTLFNBQVMsR0FBRyxPQUFPLGdCQUFnQjtBQUFBLE1BQzVGLFVBQVUsT0FBTyxTQUFTLFdBQVcsT0FBTztBQUFBLE1BQzVDLFNBQVMsT0FBTyxRQUFRLGNBQWMsYUFBWTtBQUFBLE1BQ2xELDBCQUEwQixPQUFPLFFBQVEsZUFBZSxDQUFDLGNBQWMsQ0FBQyxXQUFXLGFBQVksU0FBUyxJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ3pILFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLGdCQUFnQjtBQUFBLE1BQ2hCLGNBQWM7QUFBQSxNQUNkLGFBQWEsT0FBTyxZQUFZLGNBQWMsYUFBWTtBQUFBLE1BQzFELFdBQVcsT0FBTyxVQUFVLGNBQWMsYUFBWTtBQUFBLE1BQ3RELGdCQUFnQjtBQUFBLE1BQ2hCLG9CQUFvQjtBQUFBLE1BQ3BCLGFBQWEsT0FBTyxZQUFZLGNBQWMsYUFBWTtBQUFBLE1BQzFELFlBQVk7QUFBQSxNQUNaLFNBQVMsT0FBTyxRQUFRLGNBQWMsYUFBWTtBQUFBLE1BQ2xELDBCQUEwQixPQUFPLFFBQVEsZUFBZSxDQUFDLGNBQWMsQ0FBQyxXQUFXLGFBQVksU0FBUyxJQUFJLE1BQU0sT0FBTztBQUFBLE1BQ3pILHVCQUF1QixPQUFPLHNCQUFzQixjQUFjLGFBQVk7QUFBQSxNQUM5RSxZQUFZO0FBQUEsTUFDWiw2QkFBNkIsY0FBYyxXQUFXLFNBQVMsR0FBRyxPQUFPLGVBQWU7QUFBQSxNQUN4RixZQUFZLGFBQWEsU0FBUztBQUFBLE1BQ2xDLGlCQUFpQjtBQUFBLE1BQ2pCLG9CQUFvQjtBQUFBLE1BQ3BCLGdCQUFnQjtBQUFBLE1BQ2hCLGVBQWU7QUFBQSxNQUNmLGdCQUFnQixPQUFPLGVBQWUsY0FBYyxhQUFZO0FBQUEsTUFDaEUsdUJBQXVCLE9BQU8sc0JBQXNCLGNBQWMsYUFBWTtBQUFBLE1BQzlFLGlCQUFpQixPQUFPLGdCQUFnQixjQUFjLGFBQVk7QUFBQSxNQUNsRSxpQkFBaUIsT0FBTyxnQkFBZ0IsY0FBYyxhQUFZO0FBQUEsTUFDbEUsY0FBYztBQUFBLE1BQ2QsYUFBYSxPQUFPLFlBQVksY0FBYyxhQUFZO0FBQUEsTUFDMUQsYUFBYSxPQUFPLFlBQVksY0FBYyxhQUFZO0FBQUEsTUFDMUQsYUFBYSxPQUFPLFlBQVksY0FBYyxhQUFZO0FBQUE7QUFHM0QsUUFBSSxVQUFVO0FBQ2IsVUFBSTtBQUNILGFBQUs7QUFBQSxlQUNHLEdBQVA7QUFFRyxxQkFBYSxTQUFTLFNBQVM7QUFDbkMsbUJBQVcsdUJBQXVCO0FBQUE7QUFBQTtBQUQ5QjtBQUtOLFFBQUksU0FBUyxpQkFBZ0IsTUFBTTtBQUNsQyxVQUFJO0FBQ0osVUFBSSxTQUFTLG1CQUFtQjtBQUMvQixnQkFBUSxzQkFBc0I7QUFBQSxpQkFDcEIsU0FBUyx1QkFBdUI7QUFDMUMsZ0JBQVEsc0JBQXNCO0FBQUEsaUJBQ3BCLFNBQVMsNEJBQTRCO0FBQy9DLGdCQUFRLHNCQUFzQjtBQUFBLGlCQUNwQixTQUFTLG9CQUFvQjtBQUN2QyxZQUFJLEtBQUssUUFBTztBQUNoQixZQUFJLElBQUk7QUFDUCxrQkFBUSxHQUFHO0FBQUE7QUFBQSxpQkFFRixTQUFTLDRCQUE0QjtBQUMvQyxZQUFJLE1BQU0sUUFBTztBQUNqQixZQUFJLE9BQU8sVUFBVTtBQUNwQixrQkFBUSxTQUFTLElBQUk7QUFBQTtBQUFBO0FBSXZCLGlCQUFXLFFBQVE7QUFFbkIsYUFBTztBQUFBO0FBR1IsUUFBSSxpQkFBaUI7QUFBQSxNQUNwQiwwQkFBMEIsQ0FBQyxlQUFlO0FBQUEsTUFDMUMsb0JBQW9CLENBQUMsU0FBUztBQUFBLE1BQzlCLHdCQUF3QixDQUFDLFNBQVMsYUFBYTtBQUFBLE1BQy9DLHdCQUF3QixDQUFDLFNBQVMsYUFBYTtBQUFBLE1BQy9DLHFCQUFxQixDQUFDLFNBQVMsYUFBYTtBQUFBLE1BQzVDLHVCQUF1QixDQUFDLFNBQVMsYUFBYTtBQUFBLE1BQzlDLDRCQUE0QixDQUFDLGlCQUFpQjtBQUFBLE1BQzlDLG9CQUFvQixDQUFDLDBCQUEwQjtBQUFBLE1BQy9DLDZCQUE2QixDQUFDLDBCQUEwQixhQUFhO0FBQUEsTUFDckUsc0JBQXNCLENBQUMsV0FBVztBQUFBLE1BQ2xDLHVCQUF1QixDQUFDLFlBQVk7QUFBQSxNQUNwQyxtQkFBbUIsQ0FBQyxRQUFRO0FBQUEsTUFDNUIsb0JBQW9CLENBQUMsU0FBUztBQUFBLE1BQzlCLHdCQUF3QixDQUFDLGFBQWE7QUFBQSxNQUN0QywyQkFBMkIsQ0FBQyxnQkFBZ0I7QUFBQSxNQUM1QywyQkFBMkIsQ0FBQyxnQkFBZ0I7QUFBQSxNQUM1Qyx1QkFBdUIsQ0FBQyxZQUFZO0FBQUEsTUFDcEMsZUFBZSxDQUFDLHFCQUFxQjtBQUFBLE1BQ3JDLHdCQUF3QixDQUFDLHFCQUFxQixhQUFhO0FBQUEsTUFDM0Qsd0JBQXdCLENBQUMsYUFBYTtBQUFBLE1BQ3RDLHlCQUF5QixDQUFDLGNBQWM7QUFBQSxNQUN4Qyx5QkFBeUIsQ0FBQyxjQUFjO0FBQUEsTUFDeEMsZUFBZSxDQUFDLFFBQVE7QUFBQSxNQUN4QixtQkFBbUIsQ0FBQyxRQUFRO0FBQUEsTUFDNUIsa0JBQWtCLENBQUMsT0FBTztBQUFBLE1BQzFCLHFCQUFxQixDQUFDLFVBQVU7QUFBQSxNQUNoQyxxQkFBcUIsQ0FBQyxVQUFVO0FBQUEsTUFDaEMsdUJBQXVCLENBQUMsVUFBVSxhQUFhO0FBQUEsTUFDL0Msc0JBQXNCLENBQUMsVUFBVSxhQUFhO0FBQUEsTUFDOUMsc0JBQXNCLENBQUMsV0FBVztBQUFBLE1BQ2xDLHVCQUF1QixDQUFDLFdBQVcsYUFBYTtBQUFBLE1BQ2hELGlCQUFpQixDQUFDLFdBQVc7QUFBQSxNQUM3QixvQkFBb0IsQ0FBQyxXQUFXO0FBQUEsTUFDaEMscUJBQXFCLENBQUMsV0FBVztBQUFBLE1BQ2pDLHlCQUF5QixDQUFDLGNBQWM7QUFBQSxNQUN4Qyw2QkFBNkIsQ0FBQyxrQkFBa0I7QUFBQSxNQUNoRCxxQkFBcUIsQ0FBQyxVQUFVO0FBQUEsTUFDaEMsa0JBQWtCLENBQUMsT0FBTztBQUFBLE1BQzFCLGdDQUFnQyxDQUFDLHFCQUFxQjtBQUFBLE1BQ3RELHFCQUFxQixDQUFDLFVBQVU7QUFBQSxNQUNoQyxxQkFBcUIsQ0FBQyxVQUFVO0FBQUEsTUFDaEMsMEJBQTBCLENBQUMsZUFBZTtBQUFBLE1BQzFDLHlCQUF5QixDQUFDLGNBQWM7QUFBQSxNQUN4Qyx3QkFBd0IsQ0FBQyxhQUFhO0FBQUEsTUFDdEMseUJBQXlCLENBQUMsY0FBYztBQUFBLE1BQ3hDLGdDQUFnQyxDQUFDLHFCQUFxQjtBQUFBLE1BQ3RELDBCQUEwQixDQUFDLGVBQWU7QUFBQSxNQUMxQywwQkFBMEIsQ0FBQyxlQUFlO0FBQUEsTUFDMUMsdUJBQXVCLENBQUMsWUFBWTtBQUFBLE1BQ3BDLHNCQUFzQixDQUFDLFdBQVc7QUFBQSxNQUNsQyxzQkFBc0IsQ0FBQyxXQUFXO0FBQUE7QUFHbkMsUUFBSSxPQUFPO0FBQ1gsUUFBSSxTQUFTO0FBQ2IsUUFBSSxVQUFVLEtBQUssS0FBSyxTQUFTLE1BQU0sTUFBTSxVQUFVO0FBQ3ZELFFBQUksZUFBZSxLQUFLLEtBQUssU0FBUyxPQUFPLE1BQU0sVUFBVTtBQUM3RCxRQUFJLFdBQVcsS0FBSyxLQUFLLFNBQVMsTUFBTSxPQUFPLFVBQVU7QUFDekQsUUFBSSxZQUFZLEtBQUssS0FBSyxTQUFTLE1BQU0sT0FBTyxVQUFVO0FBQzFELFFBQUksUUFBUSxLQUFLLEtBQUssU0FBUyxNQUFNLE9BQU8sVUFBVTtBQUd0RCxRQUFJLGFBQWE7QUFDakIsUUFBSSxlQUFlO0FBQ25CLFFBQUksZUFBZSx1QkFBc0IsUUFBUTtBQUNoRCxVQUFJLFFBQVEsVUFBVSxRQUFRLEdBQUc7QUFDakMsVUFBSSxPQUFPLFVBQVUsUUFBUTtBQUM3QixVQUFJLFVBQVUsT0FBTyxTQUFTLEtBQUs7QUFDbEMsY0FBTSxJQUFJLGFBQWE7QUFBQSxpQkFDYixTQUFTLE9BQU8sVUFBVSxLQUFLO0FBQ3pDLGNBQU0sSUFBSSxhQUFhO0FBQUE7QUFFeEIsVUFBSSxTQUFTO0FBQ2IsZUFBUyxRQUFRLFlBQVksU0FBVSxPQUFPLFFBQVEsT0FBTyxXQUFXO0FBQ3ZFLGVBQU8sT0FBTyxVQUFVLFFBQVEsU0FBUyxXQUFXLGNBQWMsUUFBUSxVQUFVO0FBQUE7QUFFckYsYUFBTztBQUFBO0FBSVIsUUFBSSxtQkFBbUIsMkJBQTBCLE1BQU0sY0FBYztBQUNwRSxVQUFJLGdCQUFnQjtBQUNwQixVQUFJO0FBQ0osVUFBSSxPQUFPLGdCQUFnQixnQkFBZ0I7QUFDMUMsZ0JBQVEsZUFBZTtBQUN2Qix3QkFBZ0IsTUFBTSxNQUFNLEtBQUs7QUFBQTtBQUdsQyxVQUFJLE9BQU8sWUFBWSxnQkFBZ0I7QUFDdEMsWUFBSSxRQUFRLFdBQVc7QUFDdkIsWUFBSSxVQUFVLFdBQVc7QUFDeEIsa0JBQVEsT0FBTztBQUFBO0FBRWhCLFlBQUksT0FBTyxVQUFVLGVBQWUsQ0FBQyxjQUFjO0FBQ2xELGdCQUFNLElBQUksV0FBVyxlQUFlLE9BQU87QUFBQTtBQUc1QyxlQUFPO0FBQUEsVUFDTjtBQUFBLFVBQ0EsTUFBTTtBQUFBLFVBQ047QUFBQTtBQUFBO0FBSUYsWUFBTSxJQUFJLGFBQWEsZUFBZSxPQUFPO0FBQUE7QUFHOUMsWUFBTyxVQUFVLHNCQUFzQixNQUFNLGNBQWM7QUFDMUQsVUFBSSxPQUFPLFNBQVMsWUFBWSxLQUFLLFdBQVcsR0FBRztBQUNsRCxjQUFNLElBQUksV0FBVztBQUFBO0FBRXRCLFVBQUksVUFBVSxTQUFTLEtBQUssT0FBTyxpQkFBaUIsV0FBVztBQUM5RCxjQUFNLElBQUksV0FBVztBQUFBO0FBR3RCLFVBQUksTUFBTSxlQUFlLFVBQVUsTUFBTTtBQUN4QyxjQUFNLElBQUksYUFBYTtBQUFBO0FBRXhCLFVBQUksUUFBUSxhQUFhO0FBQ3pCLFVBQUksb0JBQW9CLE1BQU0sU0FBUyxJQUFJLE1BQU0sS0FBSztBQUV0RCxVQUFJLFlBQVksaUJBQWlCLE1BQU0sb0JBQW9CLEtBQUs7QUFDaEUsVUFBSSxvQkFBb0IsVUFBVTtBQUNsQyxVQUFJLFFBQVEsVUFBVTtBQUN0QixVQUFJLHFCQUFxQjtBQUV6QixVQUFJLFFBQVEsVUFBVTtBQUN0QixVQUFJLE9BQU87QUFDViw0QkFBb0IsTUFBTTtBQUMxQixxQkFBYSxPQUFPLFFBQVEsQ0FBQyxHQUFHLElBQUk7QUFBQTtBQUdyQyxlQUFTLElBQUksR0FBRyxRQUFRLE1BQU0sSUFBSSxNQUFNLFFBQVEsS0FBSyxHQUFHO0FBQ3ZELFlBQUksT0FBTyxNQUFNO0FBQ2pCLFlBQUksUUFBUSxVQUFVLE1BQU0sR0FBRztBQUMvQixZQUFJLE9BQU8sVUFBVSxNQUFNO0FBQzNCLFlBRUcsV0FBVSxPQUFPLFVBQVUsT0FBTyxVQUFVLE9BQ3pDLFVBQVMsT0FBTyxTQUFTLE9BQU8sU0FBUyxTQUUzQyxVQUFVLE1BQ1o7QUFDRCxnQkFBTSxJQUFJLGFBQWE7QUFBQTtBQUV4QixZQUFJLFNBQVMsaUJBQWlCLENBQUMsT0FBTztBQUNyQywrQkFBcUI7QUFBQTtBQUd0Qiw2QkFBcUIsTUFBTTtBQUMzQiw0QkFBb0IsTUFBTSxvQkFBb0I7QUFFOUMsWUFBSSxPQUFPLFlBQVksb0JBQW9CO0FBQzFDLGtCQUFRLFdBQVc7QUFBQSxtQkFDVCxTQUFTLE1BQU07QUFDekIsY0FBSSxDQUFFLFNBQVEsUUFBUTtBQUNyQixnQkFBSSxDQUFDLGNBQWM7QUFDbEIsb0JBQU0sSUFBSSxXQUFXLHdCQUF3QixPQUFPO0FBQUE7QUFFckQsbUJBQU87QUFBQTtBQUVSLGNBQUksU0FBVSxJQUFJLEtBQU0sTUFBTSxRQUFRO0FBQ3JDLGdCQUFJLE9BQU8sTUFBTSxPQUFPO0FBQ3hCLG9CQUFRLENBQUMsQ0FBQztBQVNWLGdCQUFJLFNBQVMsU0FBUyxRQUFRLENBQUUsb0JBQW1CLEtBQUssTUFBTTtBQUM3RCxzQkFBUSxLQUFLO0FBQUEsbUJBQ1A7QUFDTixzQkFBUSxNQUFNO0FBQUE7QUFBQSxpQkFFVDtBQUNOLG9CQUFRLE9BQU8sT0FBTztBQUN0QixvQkFBUSxNQUFNO0FBQUE7QUFHZixjQUFJLFNBQVMsQ0FBQyxvQkFBb0I7QUFDakMsdUJBQVcscUJBQXFCO0FBQUE7QUFBQTtBQUFBO0FBSW5DLGFBQU87QUFBQTtBQUFBO0FBQUE7OztBQzdWUjtBQUFBO0FBQUE7QUFFQSxRQUFJLE9BQU87QUFDWCxRQUFJLGVBQWU7QUFFbkIsUUFBSSxTQUFTLGFBQWE7QUFDMUIsUUFBSSxRQUFRLGFBQWE7QUFDekIsUUFBSSxnQkFBZ0IsYUFBYSxtQkFBbUIsU0FBUyxLQUFLLEtBQUssT0FBTztBQUU5RSxRQUFJLFFBQVEsYUFBYSxxQ0FBcUM7QUFDOUQsUUFBSSxrQkFBa0IsYUFBYSwyQkFBMkI7QUFDOUQsUUFBSSxPQUFPLGFBQWE7QUFFeEIsUUFBSSxpQkFBaUI7QUFDcEIsVUFBSTtBQUNILHdCQUFnQixJQUFJLEtBQUssRUFBRSxPQUFPO0FBQUEsZUFDMUIsR0FBUDtBQUVELDBCQUFrQjtBQUFBO0FBQUE7QUFJcEIsWUFBTyxVQUFVLGtCQUFrQixrQkFBa0I7QUFDcEQsVUFBSSxPQUFPLGNBQWMsTUFBTSxPQUFPO0FBQ3RDLFVBQUksU0FBUyxpQkFBaUI7QUFDN0IsWUFBSSxPQUFPLE1BQU0sTUFBTTtBQUN2QixZQUFJLEtBQUssY0FBYztBQUV0QiwwQkFDQyxNQUNBLFVBQ0EsRUFBRSxPQUFPLElBQUksS0FBSyxHQUFHLGlCQUFpQixTQUFVLFdBQVUsU0FBUztBQUFBO0FBQUE7QUFJdEUsYUFBTztBQUFBO0FBR1IsUUFBSSxZQUFZLHNCQUFxQjtBQUNwQyxhQUFPLGNBQWMsTUFBTSxRQUFRO0FBQUE7QUFHcEMsUUFBSSxpQkFBaUI7QUFDcEIsc0JBQWdCLFFBQU8sU0FBUyxTQUFTLEVBQUUsT0FBTztBQUFBLFdBQzVDO0FBQ04sY0FBTyxRQUFRLFFBQVE7QUFBQTtBQUFBO0FBQUE7OztBQzdDeEI7QUFBQTtBQUFBO0FBRUEsUUFBSSxlQUFlO0FBRW5CLFFBQUksV0FBVztBQUVmLFFBQUksV0FBVyxTQUFTLGFBQWE7QUFFckMsWUFBTyxVQUFVLDRCQUE0QixNQUFNLGNBQWM7QUFDaEUsVUFBSSxZQUFZLGFBQWEsTUFBTSxDQUFDLENBQUM7QUFDckMsVUFBSSxPQUFPLGNBQWMsY0FBYyxTQUFTLE1BQU0saUJBQWlCLElBQUk7QUFDMUUsZUFBTyxTQUFTO0FBQUE7QUFFakIsYUFBTztBQUFBO0FBQUE7QUFBQTs7O0FDYlI7QUFBQTtBQUFBLFlBQU8sVUFBVSxRQUFRLFFBQVE7QUFBQTtBQUFBOzs7QUNBakM7QUFBQTtBQUFBLFFBQUksU0FBUyxPQUFPLFFBQVEsY0FBYyxJQUFJO0FBQzlDLFFBQUksb0JBQW9CLE9BQU8sNEJBQTRCLFNBQVMsT0FBTyx5QkFBeUIsSUFBSSxXQUFXLFVBQVU7QUFDN0gsUUFBSSxVQUFVLFVBQVUscUJBQXFCLE9BQU8sa0JBQWtCLFFBQVEsYUFBYSxrQkFBa0IsTUFBTTtBQUNuSCxRQUFJLGFBQWEsVUFBVSxJQUFJLFVBQVU7QUFDekMsUUFBSSxTQUFTLE9BQU8sUUFBUSxjQUFjLElBQUk7QUFDOUMsUUFBSSxvQkFBb0IsT0FBTyw0QkFBNEIsU0FBUyxPQUFPLHlCQUF5QixJQUFJLFdBQVcsVUFBVTtBQUM3SCxRQUFJLFVBQVUsVUFBVSxxQkFBcUIsT0FBTyxrQkFBa0IsUUFBUSxhQUFhLGtCQUFrQixNQUFNO0FBQ25ILFFBQUksYUFBYSxVQUFVLElBQUksVUFBVTtBQUN6QyxRQUFJLGFBQWEsT0FBTyxZQUFZLGNBQWMsUUFBUTtBQUMxRCxRQUFJLGFBQWEsYUFBYSxRQUFRLFVBQVUsTUFBTTtBQUN0RCxRQUFJLGFBQWEsT0FBTyxZQUFZLGNBQWMsUUFBUTtBQUMxRCxRQUFJLGFBQWEsYUFBYSxRQUFRLFVBQVUsTUFBTTtBQUN0RCxRQUFJLGFBQWEsT0FBTyxZQUFZLGNBQWMsUUFBUTtBQUMxRCxRQUFJLGVBQWUsYUFBYSxRQUFRLFVBQVUsUUFBUTtBQUMxRCxRQUFJLGlCQUFpQixRQUFRLFVBQVU7QUFDdkMsUUFBSSxpQkFBaUIsT0FBTyxVQUFVO0FBQ3RDLFFBQUksbUJBQW1CLFNBQVMsVUFBVTtBQUMxQyxRQUFJLFNBQVMsT0FBTyxVQUFVO0FBQzlCLFFBQUksU0FBUyxPQUFPLFVBQVU7QUFDOUIsUUFBSSxXQUFXLE9BQU8sVUFBVTtBQUNoQyxRQUFJLGVBQWUsT0FBTyxVQUFVO0FBQ3BDLFFBQUksZUFBZSxPQUFPLFVBQVU7QUFDcEMsUUFBSSxRQUFRLE9BQU8sVUFBVTtBQUM3QixRQUFJLFVBQVUsTUFBTSxVQUFVO0FBQzlCLFFBQUksUUFBUSxNQUFNLFVBQVU7QUFDNUIsUUFBSSxZQUFZLE1BQU0sVUFBVTtBQUNoQyxRQUFJLFNBQVMsS0FBSztBQUNsQixRQUFJLGdCQUFnQixPQUFPLFdBQVcsYUFBYSxPQUFPLFVBQVUsVUFBVTtBQUM5RSxRQUFJLE9BQU8sT0FBTztBQUNsQixRQUFJLGNBQWMsT0FBTyxXQUFXLGNBQWMsT0FBTyxPQUFPLGFBQWEsV0FBVyxPQUFPLFVBQVUsV0FBVztBQUNwSCxRQUFJLG9CQUFvQixPQUFPLFdBQVcsY0FBYyxPQUFPLE9BQU8sYUFBYTtBQUVuRixRQUFJLGNBQWMsT0FBTyxXQUFXLGNBQWMsT0FBTyxlQUFnQixRQUFPLE9BQU8sZ0JBQWdCLG9CQUFvQixXQUFXLFlBQ2hJLE9BQU8sY0FDUDtBQUNOLFFBQUksZUFBZSxPQUFPLFVBQVU7QUFFcEMsUUFBSSxNQUFPLFFBQU8sWUFBWSxhQUFhLFFBQVEsaUJBQWlCLE9BQU8sbUJBQ3ZFLElBQUcsY0FBYyxNQUFNLFlBQ2pCLFNBQVUsR0FBRztBQUNYLGFBQU8sRUFBRTtBQUFBLFFBRVg7QUFHVixpQ0FBNkIsS0FBSyxLQUFLO0FBQ25DLFVBQ0ksUUFBUSxZQUNMLFFBQVEsYUFDUixRQUFRLE9BQ1AsT0FBTyxNQUFNLFFBQVMsTUFBTSxPQUM3QixNQUFNLEtBQUssS0FBSyxNQUNyQjtBQUNFLGVBQU87QUFBQTtBQUVYLFVBQUksV0FBVztBQUNmLFVBQUksT0FBTyxRQUFRLFVBQVU7QUFDekIsWUFBSSxNQUFNLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLE9BQU87QUFDM0MsWUFBSSxRQUFRLEtBQUs7QUFDYixjQUFJLFNBQVMsT0FBTztBQUNwQixjQUFJLE1BQU0sT0FBTyxLQUFLLEtBQUssT0FBTyxTQUFTO0FBQzNDLGlCQUFPLFNBQVMsS0FBSyxRQUFRLFVBQVUsU0FBUyxNQUFNLFNBQVMsS0FBSyxTQUFTLEtBQUssS0FBSyxlQUFlLFFBQVEsTUFBTTtBQUFBO0FBQUE7QUFHNUgsYUFBTyxTQUFTLEtBQUssS0FBSyxVQUFVO0FBQUE7QUFHeEMsUUFBSSxjQUFjO0FBQ2xCLFFBQUksZ0JBQWdCLFlBQVk7QUFDaEMsUUFBSSxnQkFBZ0IsU0FBUyxpQkFBaUIsZ0JBQWdCO0FBRTlELFlBQU8sVUFBVSxrQkFBa0IsS0FBSyxTQUFTLE9BQU8sTUFBTTtBQUMxRCxVQUFJLE9BQU8sV0FBVztBQUV0QixVQUFJLElBQUksTUFBTSxpQkFBa0IsTUFBSyxlQUFlLFlBQVksS0FBSyxlQUFlLFdBQVc7QUFDM0YsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUV4QixVQUNJLElBQUksTUFBTSxzQkFBdUIsUUFBTyxLQUFLLG9CQUFvQixXQUMzRCxLQUFLLGtCQUFrQixLQUFLLEtBQUssb0JBQW9CLFdBQ3JELEtBQUssb0JBQW9CLE9BRWpDO0FBQ0UsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUV4QixVQUFJLGdCQUFnQixJQUFJLE1BQU0sbUJBQW1CLEtBQUssZ0JBQWdCO0FBQ3RFLFVBQUksT0FBTyxrQkFBa0IsYUFBYSxrQkFBa0IsVUFBVTtBQUNsRSxjQUFNLElBQUksVUFBVTtBQUFBO0FBR3hCLFVBQ0ksSUFBSSxNQUFNLGFBQ1AsS0FBSyxXQUFXLFFBQ2hCLEtBQUssV0FBVyxPQUNoQixDQUFFLFVBQVMsS0FBSyxRQUFRLFFBQVEsS0FBSyxVQUFVLEtBQUssU0FBUyxJQUNsRTtBQUNFLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFFeEIsVUFBSSxJQUFJLE1BQU0sdUJBQXVCLE9BQU8sS0FBSyxxQkFBcUIsV0FBVztBQUM3RSxjQUFNLElBQUksVUFBVTtBQUFBO0FBRXhCLFVBQUksbUJBQW1CLEtBQUs7QUFFNUIsVUFBSSxPQUFPLFFBQVEsYUFBYTtBQUM1QixlQUFPO0FBQUE7QUFFWCxVQUFJLFFBQVEsTUFBTTtBQUNkLGVBQU87QUFBQTtBQUVYLFVBQUksT0FBTyxRQUFRLFdBQVc7QUFDMUIsZUFBTyxNQUFNLFNBQVM7QUFBQTtBQUcxQixVQUFJLE9BQU8sUUFBUSxVQUFVO0FBQ3pCLGVBQU8sY0FBYyxLQUFLO0FBQUE7QUFFOUIsVUFBSSxPQUFPLFFBQVEsVUFBVTtBQUN6QixZQUFJLFFBQVEsR0FBRztBQUNYLGlCQUFPLFdBQVcsTUFBTSxJQUFJLE1BQU07QUFBQTtBQUV0QyxZQUFJLE1BQU0sT0FBTztBQUNqQixlQUFPLG1CQUFtQixvQkFBb0IsS0FBSyxPQUFPO0FBQUE7QUFFOUQsVUFBSSxPQUFPLFFBQVEsVUFBVTtBQUN6QixZQUFJLFlBQVksT0FBTyxPQUFPO0FBQzlCLGVBQU8sbUJBQW1CLG9CQUFvQixLQUFLLGFBQWE7QUFBQTtBQUdwRSxVQUFJLFdBQVcsT0FBTyxLQUFLLFVBQVUsY0FBYyxJQUFJLEtBQUs7QUFDNUQsVUFBSSxPQUFPLFVBQVUsYUFBYTtBQUFFLGdCQUFRO0FBQUE7QUFDNUMsVUFBSSxTQUFTLFlBQVksV0FBVyxLQUFLLE9BQU8sUUFBUSxVQUFVO0FBQzlELGVBQU8sUUFBUSxPQUFPLFlBQVk7QUFBQTtBQUd0QyxVQUFJLFNBQVMsVUFBVSxNQUFNO0FBRTdCLFVBQUksT0FBTyxTQUFTLGFBQWE7QUFDN0IsZUFBTztBQUFBLGlCQUNBLFFBQVEsTUFBTSxRQUFRLEdBQUc7QUFDaEMsZUFBTztBQUFBO0FBR1gsdUJBQWlCLE9BQU8sTUFBTSxVQUFVO0FBQ3BDLFlBQUksTUFBTTtBQUNOLGlCQUFPLFVBQVUsS0FBSztBQUN0QixlQUFLLEtBQUs7QUFBQTtBQUVkLFlBQUksVUFBVTtBQUNWLGNBQUksVUFBVTtBQUFBLFlBQ1YsT0FBTyxLQUFLO0FBQUE7QUFFaEIsY0FBSSxJQUFJLE1BQU0sZUFBZTtBQUN6QixvQkFBUSxhQUFhLEtBQUs7QUFBQTtBQUU5QixpQkFBTyxTQUFTLE9BQU8sU0FBUyxRQUFRLEdBQUc7QUFBQTtBQUUvQyxlQUFPLFNBQVMsT0FBTyxNQUFNLFFBQVEsR0FBRztBQUFBO0FBRzVDLFVBQUksT0FBTyxRQUFRLGNBQWMsQ0FBQyxTQUFTLE1BQU07QUFDN0MsWUFBSSxPQUFPLE9BQU87QUFDbEIsWUFBSSxPQUFPLFdBQVcsS0FBSztBQUMzQixlQUFPLGNBQWUsUUFBTyxPQUFPLE9BQU8sa0JBQWtCLE1BQU8sTUFBSyxTQUFTLElBQUksUUFBUSxNQUFNLEtBQUssTUFBTSxRQUFRLE9BQU87QUFBQTtBQUVsSSxVQUFJLFNBQVMsTUFBTTtBQUNmLFlBQUksWUFBWSxvQkFBb0IsU0FBUyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsUUFBUSxZQUFZLEtBQUs7QUFDbEgsZUFBTyxPQUFPLFFBQVEsWUFBWSxDQUFDLG9CQUFvQixVQUFVLGFBQWE7QUFBQTtBQUVsRixVQUFJLFVBQVUsTUFBTTtBQUNoQixZQUFJLElBQUksTUFBTSxhQUFhLEtBQUssT0FBTyxJQUFJO0FBQzNDLFlBQUksUUFBUSxJQUFJLGNBQWM7QUFDOUIsaUJBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDbkMsZUFBSyxNQUFNLE1BQU0sR0FBRyxPQUFPLE1BQU0sV0FBVyxNQUFNLE1BQU0sR0FBRyxRQUFRLFVBQVU7QUFBQTtBQUVqRixhQUFLO0FBQ0wsWUFBSSxJQUFJLGNBQWMsSUFBSSxXQUFXLFFBQVE7QUFBRSxlQUFLO0FBQUE7QUFDcEQsYUFBSyxPQUFPLGFBQWEsS0FBSyxPQUFPLElBQUksYUFBYTtBQUN0RCxlQUFPO0FBQUE7QUFFWCxVQUFJLFFBQVEsTUFBTTtBQUNkLFlBQUksSUFBSSxXQUFXLEdBQUc7QUFBRSxpQkFBTztBQUFBO0FBQy9CLFlBQUksS0FBSyxXQUFXLEtBQUs7QUFDekIsWUFBSSxVQUFVLENBQUMsaUJBQWlCLEtBQUs7QUFDakMsaUJBQU8sTUFBTSxhQUFhLElBQUksVUFBVTtBQUFBO0FBRTVDLGVBQU8sT0FBTyxNQUFNLEtBQUssSUFBSSxRQUFRO0FBQUE7QUFFekMsVUFBSSxRQUFRLE1BQU07QUFDZCxZQUFJLFFBQVEsV0FBVyxLQUFLO0FBQzVCLFlBQUksQ0FBRSxZQUFXLE1BQU0sY0FBYyxXQUFXLE9BQU8sQ0FBQyxhQUFhLEtBQUssS0FBSyxVQUFVO0FBQ3JGLGlCQUFPLFFBQVEsT0FBTyxPQUFPLE9BQU8sTUFBTSxLQUFLLFFBQVEsS0FBSyxjQUFjLFFBQVEsSUFBSSxRQUFRLFFBQVEsUUFBUTtBQUFBO0FBRWxILFlBQUksTUFBTSxXQUFXLEdBQUc7QUFBRSxpQkFBTyxNQUFNLE9BQU8sT0FBTztBQUFBO0FBQ3JELGVBQU8sUUFBUSxPQUFPLE9BQU8sT0FBTyxNQUFNLEtBQUssT0FBTyxRQUFRO0FBQUE7QUFFbEUsVUFBSSxPQUFPLFFBQVEsWUFBWSxlQUFlO0FBQzFDLFlBQUksaUJBQWlCLE9BQU8sSUFBSSxtQkFBbUIsY0FBYyxhQUFhO0FBQzFFLGlCQUFPLFlBQVksS0FBSyxFQUFFLE9BQU8sV0FBVztBQUFBLG1CQUNyQyxrQkFBa0IsWUFBWSxPQUFPLElBQUksWUFBWSxZQUFZO0FBQ3hFLGlCQUFPLElBQUk7QUFBQTtBQUFBO0FBR25CLFVBQUksTUFBTSxNQUFNO0FBQ1osWUFBSSxXQUFXO0FBQ2YsWUFBSSxZQUFZO0FBQ1oscUJBQVcsS0FBSyxLQUFLLFNBQVUsT0FBTyxLQUFLO0FBQ3ZDLHFCQUFTLEtBQUssUUFBUSxLQUFLLEtBQUssUUFBUSxTQUFTLFFBQVEsT0FBTztBQUFBO0FBQUE7QUFHeEUsZUFBTyxhQUFhLE9BQU8sUUFBUSxLQUFLLE1BQU0sVUFBVTtBQUFBO0FBRTVELFVBQUksTUFBTSxNQUFNO0FBQ1osWUFBSSxXQUFXO0FBQ2YsWUFBSSxZQUFZO0FBQ1oscUJBQVcsS0FBSyxLQUFLLFNBQVUsT0FBTztBQUNsQyxxQkFBUyxLQUFLLFFBQVEsT0FBTztBQUFBO0FBQUE7QUFHckMsZUFBTyxhQUFhLE9BQU8sUUFBUSxLQUFLLE1BQU0sVUFBVTtBQUFBO0FBRTVELFVBQUksVUFBVSxNQUFNO0FBQ2hCLGVBQU8saUJBQWlCO0FBQUE7QUFFNUIsVUFBSSxVQUFVLE1BQU07QUFDaEIsZUFBTyxpQkFBaUI7QUFBQTtBQUU1QixVQUFJLFVBQVUsTUFBTTtBQUNoQixlQUFPLGlCQUFpQjtBQUFBO0FBRTVCLFVBQUksU0FBUyxNQUFNO0FBQ2YsZUFBTyxVQUFVLFFBQVEsT0FBTztBQUFBO0FBRXBDLFVBQUksU0FBUyxNQUFNO0FBQ2YsZUFBTyxVQUFVLFFBQVEsY0FBYyxLQUFLO0FBQUE7QUFFaEQsVUFBSSxVQUFVLE1BQU07QUFDaEIsZUFBTyxVQUFVLGVBQWUsS0FBSztBQUFBO0FBRXpDLFVBQUksU0FBUyxNQUFNO0FBQ2YsZUFBTyxVQUFVLFFBQVEsT0FBTztBQUFBO0FBRXBDLFVBQUksQ0FBQyxPQUFPLFFBQVEsQ0FBQyxTQUFTLE1BQU07QUFDaEMsWUFBSSxLQUFLLFdBQVcsS0FBSztBQUN6QixZQUFJLGdCQUFnQixNQUFNLElBQUksU0FBUyxPQUFPLFlBQVksZUFBZSxVQUFVLElBQUksZ0JBQWdCO0FBQ3ZHLFlBQUksV0FBVyxlQUFlLFNBQVMsS0FBSztBQUM1QyxZQUFJLFlBQVksQ0FBQyxpQkFBaUIsZUFBZSxPQUFPLFNBQVMsT0FBTyxlQUFlLE1BQU0sT0FBTyxLQUFLLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxXQUFXO0FBQ3BKLFlBQUksaUJBQWlCLGlCQUFpQixPQUFPLElBQUksZ0JBQWdCLGFBQWEsS0FBSyxJQUFJLFlBQVksT0FBTyxJQUFJLFlBQVksT0FBTyxNQUFNO0FBQ3ZJLFlBQUksTUFBTSxpQkFBa0IsY0FBYSxXQUFXLE1BQU0sTUFBTSxLQUFLLFFBQVEsS0FBSyxJQUFJLGFBQWEsSUFBSSxZQUFZLEtBQUssUUFBUSxPQUFPO0FBQ3ZJLFlBQUksR0FBRyxXQUFXLEdBQUc7QUFBRSxpQkFBTyxNQUFNO0FBQUE7QUFDcEMsWUFBSSxRQUFRO0FBQ1IsaUJBQU8sTUFBTSxNQUFNLGFBQWEsSUFBSSxVQUFVO0FBQUE7QUFFbEQsZUFBTyxNQUFNLE9BQU8sTUFBTSxLQUFLLElBQUksUUFBUTtBQUFBO0FBRS9DLGFBQU8sT0FBTztBQUFBO0FBR2xCLHdCQUFvQixHQUFHLGNBQWMsTUFBTTtBQUN2QyxVQUFJLFlBQWEsTUFBSyxjQUFjLGtCQUFrQixXQUFXLE1BQU07QUFDdkUsYUFBTyxZQUFZLElBQUk7QUFBQTtBQUczQixtQkFBZSxHQUFHO0FBQ2QsYUFBTyxTQUFTLEtBQUssT0FBTyxJQUFJLE1BQU07QUFBQTtBQUcxQyxxQkFBaUIsS0FBSztBQUFFLGFBQU8sTUFBTSxTQUFTLG9CQUFxQixFQUFDLGVBQWUsQ0FBRSxRQUFPLFFBQVEsWUFBWSxlQUFlO0FBQUE7QUFDL0gsb0JBQWdCLEtBQUs7QUFBRSxhQUFPLE1BQU0sU0FBUyxtQkFBb0IsRUFBQyxlQUFlLENBQUUsUUFBTyxRQUFRLFlBQVksZUFBZTtBQUFBO0FBQzdILHNCQUFrQixLQUFLO0FBQUUsYUFBTyxNQUFNLFNBQVMscUJBQXNCLEVBQUMsZUFBZSxDQUFFLFFBQU8sUUFBUSxZQUFZLGVBQWU7QUFBQTtBQUNqSSxxQkFBaUIsS0FBSztBQUFFLGFBQU8sTUFBTSxTQUFTLG9CQUFxQixFQUFDLGVBQWUsQ0FBRSxRQUFPLFFBQVEsWUFBWSxlQUFlO0FBQUE7QUFDL0gsc0JBQWtCLEtBQUs7QUFBRSxhQUFPLE1BQU0sU0FBUyxxQkFBc0IsRUFBQyxlQUFlLENBQUUsUUFBTyxRQUFRLFlBQVksZUFBZTtBQUFBO0FBQ2pJLHNCQUFrQixLQUFLO0FBQUUsYUFBTyxNQUFNLFNBQVMscUJBQXNCLEVBQUMsZUFBZSxDQUFFLFFBQU8sUUFBUSxZQUFZLGVBQWU7QUFBQTtBQUNqSSx1QkFBbUIsS0FBSztBQUFFLGFBQU8sTUFBTSxTQUFTLHNCQUF1QixFQUFDLGVBQWUsQ0FBRSxRQUFPLFFBQVEsWUFBWSxlQUFlO0FBQUE7QUFHbkksc0JBQWtCLEtBQUs7QUFDbkIsVUFBSSxtQkFBbUI7QUFDbkIsZUFBTyxPQUFPLE9BQU8sUUFBUSxZQUFZLGVBQWU7QUFBQTtBQUU1RCxVQUFJLE9BQU8sUUFBUSxVQUFVO0FBQ3pCLGVBQU87QUFBQTtBQUVYLFVBQUksQ0FBQyxPQUFPLE9BQU8sUUFBUSxZQUFZLENBQUMsYUFBYTtBQUNqRCxlQUFPO0FBQUE7QUFFWCxVQUFJO0FBQ0Esb0JBQVksS0FBSztBQUNqQixlQUFPO0FBQUEsZUFDRixHQUFQO0FBQUE7QUFDRixhQUFPO0FBQUE7QUFHWCxzQkFBa0IsS0FBSztBQUNuQixVQUFJLENBQUMsT0FBTyxPQUFPLFFBQVEsWUFBWSxDQUFDLGVBQWU7QUFDbkQsZUFBTztBQUFBO0FBRVgsVUFBSTtBQUNBLHNCQUFjLEtBQUs7QUFDbkIsZUFBTztBQUFBLGVBQ0YsR0FBUDtBQUFBO0FBQ0YsYUFBTztBQUFBO0FBR1gsUUFBSSxTQUFTLE9BQU8sVUFBVSxrQkFBa0IsU0FBVSxLQUFLO0FBQUUsYUFBTyxPQUFPO0FBQUE7QUFDL0UsaUJBQWEsS0FBSyxLQUFLO0FBQ25CLGFBQU8sT0FBTyxLQUFLLEtBQUs7QUFBQTtBQUc1QixtQkFBZSxLQUFLO0FBQ2hCLGFBQU8sZUFBZSxLQUFLO0FBQUE7QUFHL0Isb0JBQWdCLEdBQUc7QUFDZixVQUFJLEVBQUUsTUFBTTtBQUFFLGVBQU8sRUFBRTtBQUFBO0FBQ3ZCLFVBQUksSUFBSSxPQUFPLEtBQUssaUJBQWlCLEtBQUssSUFBSTtBQUM5QyxVQUFJLEdBQUc7QUFBRSxlQUFPLEVBQUU7QUFBQTtBQUNsQixhQUFPO0FBQUE7QUFHWCxxQkFBaUIsSUFBSSxHQUFHO0FBQ3BCLFVBQUksR0FBRyxTQUFTO0FBQUUsZUFBTyxHQUFHLFFBQVE7QUFBQTtBQUNwQyxlQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsUUFBUSxJQUFJLEdBQUcsS0FBSztBQUN2QyxZQUFJLEdBQUcsT0FBTyxHQUFHO0FBQUUsaUJBQU87QUFBQTtBQUFBO0FBRTlCLGFBQU87QUFBQTtBQUdYLG1CQUFlLEdBQUc7QUFDZCxVQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssT0FBTyxNQUFNLFVBQVU7QUFDekMsZUFBTztBQUFBO0FBRVgsVUFBSTtBQUNBLGdCQUFRLEtBQUs7QUFDYixZQUFJO0FBQ0Esa0JBQVEsS0FBSztBQUFBLGlCQUNSLEdBQVA7QUFDRSxpQkFBTztBQUFBO0FBRVgsZUFBTyxhQUFhO0FBQUEsZUFDZixHQUFQO0FBQUE7QUFDRixhQUFPO0FBQUE7QUFHWCx1QkFBbUIsR0FBRztBQUNsQixVQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssT0FBTyxNQUFNLFVBQVU7QUFDNUMsZUFBTztBQUFBO0FBRVgsVUFBSTtBQUNBLG1CQUFXLEtBQUssR0FBRztBQUNuQixZQUFJO0FBQ0EscUJBQVcsS0FBSyxHQUFHO0FBQUEsaUJBQ2QsR0FBUDtBQUNFLGlCQUFPO0FBQUE7QUFFWCxlQUFPLGFBQWE7QUFBQSxlQUNmLEdBQVA7QUFBQTtBQUNGLGFBQU87QUFBQTtBQUdYLHVCQUFtQixHQUFHO0FBQ2xCLFVBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLE9BQU8sTUFBTSxVQUFVO0FBQzlDLGVBQU87QUFBQTtBQUVYLFVBQUk7QUFDQSxxQkFBYSxLQUFLO0FBQ2xCLGVBQU87QUFBQSxlQUNGLEdBQVA7QUFBQTtBQUNGLGFBQU87QUFBQTtBQUdYLG1CQUFlLEdBQUc7QUFDZCxVQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssT0FBTyxNQUFNLFVBQVU7QUFDekMsZUFBTztBQUFBO0FBRVgsVUFBSTtBQUNBLGdCQUFRLEtBQUs7QUFDYixZQUFJO0FBQ0Esa0JBQVEsS0FBSztBQUFBLGlCQUNSLEdBQVA7QUFDRSxpQkFBTztBQUFBO0FBRVgsZUFBTyxhQUFhO0FBQUEsZUFDZixHQUFQO0FBQUE7QUFDRixhQUFPO0FBQUE7QUFHWCx1QkFBbUIsR0FBRztBQUNsQixVQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssT0FBTyxNQUFNLFVBQVU7QUFDNUMsZUFBTztBQUFBO0FBRVgsVUFBSTtBQUNBLG1CQUFXLEtBQUssR0FBRztBQUNuQixZQUFJO0FBQ0EscUJBQVcsS0FBSyxHQUFHO0FBQUEsaUJBQ2QsR0FBUDtBQUNFLGlCQUFPO0FBQUE7QUFFWCxlQUFPLGFBQWE7QUFBQSxlQUNmLEdBQVA7QUFBQTtBQUNGLGFBQU87QUFBQTtBQUdYLHVCQUFtQixHQUFHO0FBQ2xCLFVBQUksQ0FBQyxLQUFLLE9BQU8sTUFBTSxVQUFVO0FBQUUsZUFBTztBQUFBO0FBQzFDLFVBQUksT0FBTyxnQkFBZ0IsZUFBZSxhQUFhLGFBQWE7QUFDaEUsZUFBTztBQUFBO0FBRVgsYUFBTyxPQUFPLEVBQUUsYUFBYSxZQUFZLE9BQU8sRUFBRSxpQkFBaUI7QUFBQTtBQUd2RSwyQkFBdUIsS0FBSyxNQUFNO0FBQzlCLFVBQUksSUFBSSxTQUFTLEtBQUssaUJBQWlCO0FBQ25DLFlBQUksWUFBWSxJQUFJLFNBQVMsS0FBSztBQUNsQyxZQUFJLFVBQVUsU0FBUyxZQUFZLG9CQUFxQixhQUFZLElBQUksTUFBTTtBQUM5RSxlQUFPLGNBQWMsT0FBTyxLQUFLLEtBQUssR0FBRyxLQUFLLGtCQUFrQixRQUFRO0FBQUE7QUFHNUUsVUFBSSxJQUFJLFNBQVMsS0FBSyxTQUFTLEtBQUssS0FBSyxZQUFZLFNBQVMsZ0JBQWdCO0FBQzlFLGFBQU8sV0FBVyxHQUFHLFVBQVU7QUFBQTtBQUduQyxxQkFBaUIsR0FBRztBQUNoQixVQUFJLElBQUksRUFBRSxXQUFXO0FBQ3JCLFVBQUksSUFBSTtBQUFBLFFBQ0osR0FBRztBQUFBLFFBQ0gsR0FBRztBQUFBLFFBQ0gsSUFBSTtBQUFBLFFBQ0osSUFBSTtBQUFBLFFBQ0osSUFBSTtBQUFBLFFBQ047QUFDRixVQUFJLEdBQUc7QUFBRSxlQUFPLE9BQU87QUFBQTtBQUN2QixhQUFPLFFBQVMsS0FBSSxLQUFPLE1BQU0sTUFBTSxhQUFhLEtBQUssRUFBRSxTQUFTO0FBQUE7QUFHeEUsdUJBQW1CLEtBQUs7QUFDcEIsYUFBTyxZQUFZLE1BQU07QUFBQTtBQUc3Qiw4QkFBMEIsTUFBTTtBQUM1QixhQUFPLE9BQU87QUFBQTtBQUdsQiwwQkFBc0IsTUFBTSxNQUFNLFNBQVMsUUFBUTtBQUMvQyxVQUFJLGdCQUFnQixTQUFTLGFBQWEsU0FBUyxVQUFVLE1BQU0sS0FBSyxTQUFTO0FBQ2pGLGFBQU8sT0FBTyxPQUFPLE9BQU8sUUFBUSxnQkFBZ0I7QUFBQTtBQUd4RCw4QkFBMEIsSUFBSTtBQUMxQixlQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsUUFBUSxLQUFLO0FBQ2hDLFlBQUksUUFBUSxHQUFHLElBQUksU0FBUyxHQUFHO0FBQzNCLGlCQUFPO0FBQUE7QUFBQTtBQUdmLGFBQU87QUFBQTtBQUdYLHVCQUFtQixNQUFNLE9BQU87QUFDNUIsVUFBSTtBQUNKLFVBQUksS0FBSyxXQUFXLEtBQU07QUFDdEIscUJBQWE7QUFBQSxpQkFDTixPQUFPLEtBQUssV0FBVyxZQUFZLEtBQUssU0FBUyxHQUFHO0FBQzNELHFCQUFhLE1BQU0sS0FBSyxNQUFNLEtBQUssU0FBUyxJQUFJO0FBQUEsYUFDN0M7QUFDSCxlQUFPO0FBQUE7QUFFWCxhQUFPO0FBQUEsUUFDSCxNQUFNO0FBQUEsUUFDTixNQUFNLE1BQU0sS0FBSyxNQUFNLFFBQVEsSUFBSTtBQUFBO0FBQUE7QUFJM0MsMEJBQXNCLElBQUksUUFBUTtBQUM5QixVQUFJLEdBQUcsV0FBVyxHQUFHO0FBQUUsZUFBTztBQUFBO0FBQzlCLFVBQUksYUFBYSxPQUFPLE9BQU8sT0FBTyxPQUFPO0FBQzdDLGFBQU8sYUFBYSxNQUFNLEtBQUssSUFBSSxNQUFNLGNBQWMsT0FBTyxPQUFPO0FBQUE7QUFHekUsd0JBQW9CLEtBQUssU0FBUztBQUM5QixVQUFJLFFBQVEsUUFBUTtBQUNwQixVQUFJLEtBQUs7QUFDVCxVQUFJLE9BQU87QUFDUCxXQUFHLFNBQVMsSUFBSTtBQUNoQixpQkFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNqQyxhQUFHLEtBQUssSUFBSSxLQUFLLEtBQUssUUFBUSxJQUFJLElBQUksT0FBTztBQUFBO0FBQUE7QUFHckQsVUFBSSxPQUFPLE9BQU8sU0FBUyxhQUFhLEtBQUssT0FBTztBQUNwRCxVQUFJO0FBQ0osVUFBSSxtQkFBbUI7QUFDbkIsaUJBQVM7QUFDVCxpQkFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUNsQyxpQkFBTyxNQUFNLEtBQUssTUFBTSxLQUFLO0FBQUE7QUFBQTtBQUlyQyxlQUFTLE9BQU8sS0FBSztBQUNqQixZQUFJLENBQUMsSUFBSSxLQUFLLE1BQU07QUFBRTtBQUFBO0FBQ3RCLFlBQUksU0FBUyxPQUFPLE9BQU8sVUFBVSxPQUFPLE1BQU0sSUFBSSxRQUFRO0FBQUU7QUFBQTtBQUNoRSxZQUFJLHFCQUFxQixPQUFPLE1BQU0sZ0JBQWdCLFFBQVE7QUFFMUQ7QUFBQSxtQkFDTyxNQUFNLEtBQUssVUFBVSxNQUFNO0FBQ2xDLGFBQUcsS0FBSyxRQUFRLEtBQUssT0FBTyxPQUFPLFFBQVEsSUFBSSxNQUFNO0FBQUEsZUFDbEQ7QUFDSCxhQUFHLEtBQUssTUFBTSxPQUFPLFFBQVEsSUFBSSxNQUFNO0FBQUE7QUFBQTtBQUcvQyxVQUFJLE9BQU8sU0FBUyxZQUFZO0FBQzVCLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ2xDLGNBQUksYUFBYSxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ2pDLGVBQUcsS0FBSyxNQUFNLFFBQVEsS0FBSyxNQUFNLFFBQVEsUUFBUSxJQUFJLEtBQUssS0FBSztBQUFBO0FBQUE7QUFBQTtBQUkzRSxhQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUNsZ0JYO0FBQUE7QUFBQTtBQUVBLFFBQUksZUFBZTtBQUNuQixRQUFJLFlBQVk7QUFDaEIsUUFBSSxVQUFVO0FBRWQsUUFBSSxhQUFhLGFBQWE7QUFDOUIsUUFBSSxXQUFXLGFBQWEsYUFBYTtBQUN6QyxRQUFJLE9BQU8sYUFBYSxTQUFTO0FBRWpDLFFBQUksY0FBYyxVQUFVLHlCQUF5QjtBQUNyRCxRQUFJLGNBQWMsVUFBVSx5QkFBeUI7QUFDckQsUUFBSSxjQUFjLFVBQVUseUJBQXlCO0FBQ3JELFFBQUksVUFBVSxVQUFVLHFCQUFxQjtBQUM3QyxRQUFJLFVBQVUsVUFBVSxxQkFBcUI7QUFDN0MsUUFBSSxVQUFVLFVBQVUscUJBQXFCO0FBVTdDLFFBQUksY0FBYyxTQUFVLE1BQU0sS0FBSztBQUN0QyxlQUFTLE9BQU8sTUFBTSxNQUFPLFFBQU8sS0FBSyxVQUFVLE1BQU0sT0FBTyxNQUFNO0FBQ3JFLFlBQUksS0FBSyxRQUFRLEtBQUs7QUFDckIsZUFBSyxPQUFPLEtBQUs7QUFDakIsZUFBSyxPQUFPLEtBQUs7QUFDakIsZUFBSyxPQUFPO0FBQ1osaUJBQU87QUFBQTtBQUFBO0FBQUE7QUFLVixRQUFJLFVBQVUsU0FBVSxTQUFTLEtBQUs7QUFDckMsVUFBSSxPQUFPLFlBQVksU0FBUztBQUNoQyxhQUFPLFFBQVEsS0FBSztBQUFBO0FBRXJCLFFBQUksVUFBVSxTQUFVLFNBQVMsS0FBSyxPQUFPO0FBQzVDLFVBQUksT0FBTyxZQUFZLFNBQVM7QUFDaEMsVUFBSSxNQUFNO0FBQ1QsYUFBSyxRQUFRO0FBQUEsYUFDUDtBQUVOLGdCQUFRLE9BQU87QUFBQSxVQUNkO0FBQUEsVUFDQSxNQUFNLFFBQVE7QUFBQSxVQUNkO0FBQUE7QUFBQTtBQUFBO0FBSUgsUUFBSSxVQUFVLFNBQVUsU0FBUyxLQUFLO0FBQ3JDLGFBQU8sQ0FBQyxDQUFDLFlBQVksU0FBUztBQUFBO0FBRy9CLFlBQU8sVUFBVSwwQkFBMEI7QUFDMUMsVUFBSTtBQUNKLFVBQUk7QUFDSixVQUFJO0FBQ0osVUFBSSxVQUFVO0FBQUEsUUFDYixRQUFRLFNBQVUsS0FBSztBQUN0QixjQUFJLENBQUMsUUFBUSxJQUFJLE1BQU07QUFDdEIsa0JBQU0sSUFBSSxXQUFXLG1DQUFtQyxRQUFRO0FBQUE7QUFBQTtBQUFBLFFBR2xFLEtBQUssU0FBVSxLQUFLO0FBQ25CLGNBQUksWUFBWSxPQUFRLFFBQU8sUUFBUSxZQUFZLE9BQU8sUUFBUSxhQUFhO0FBQzlFLGdCQUFJLEtBQUs7QUFDUixxQkFBTyxZQUFZLEtBQUs7QUFBQTtBQUFBLHFCQUVmLE1BQU07QUFDaEIsZ0JBQUksSUFBSTtBQUNQLHFCQUFPLFFBQVEsSUFBSTtBQUFBO0FBQUEsaUJBRWQ7QUFDTixnQkFBSSxJQUFJO0FBQ1AscUJBQU8sUUFBUSxJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFJdEIsS0FBSyxTQUFVLEtBQUs7QUFDbkIsY0FBSSxZQUFZLE9BQVEsUUFBTyxRQUFRLFlBQVksT0FBTyxRQUFRLGFBQWE7QUFDOUUsZ0JBQUksS0FBSztBQUNSLHFCQUFPLFlBQVksS0FBSztBQUFBO0FBQUEscUJBRWYsTUFBTTtBQUNoQixnQkFBSSxJQUFJO0FBQ1AscUJBQU8sUUFBUSxJQUFJO0FBQUE7QUFBQSxpQkFFZDtBQUNOLGdCQUFJLElBQUk7QUFDUCxxQkFBTyxRQUFRLElBQUk7QUFBQTtBQUFBO0FBR3JCLGlCQUFPO0FBQUE7QUFBQSxRQUVSLEtBQUssU0FBVSxLQUFLLE9BQU87QUFDMUIsY0FBSSxZQUFZLE9BQVEsUUFBTyxRQUFRLFlBQVksT0FBTyxRQUFRLGFBQWE7QUFDOUUsZ0JBQUksQ0FBQyxLQUFLO0FBQ1Qsb0JBQU0sSUFBSTtBQUFBO0FBRVgsd0JBQVksS0FBSyxLQUFLO0FBQUEscUJBQ1osTUFBTTtBQUNoQixnQkFBSSxDQUFDLElBQUk7QUFDUixtQkFBSyxJQUFJO0FBQUE7QUFFVixvQkFBUSxJQUFJLEtBQUs7QUFBQSxpQkFDWDtBQUNOLGdCQUFJLENBQUMsSUFBSTtBQU1SLG1CQUFLLEVBQUUsS0FBSyxJQUFJLE1BQU07QUFBQTtBQUV2QixvQkFBUSxJQUFJLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFJcEIsYUFBTztBQUFBO0FBQUE7QUFBQTs7O0FDMUhSO0FBQUE7QUFBQTtBQUVBLFFBQUksVUFBVSxPQUFPLFVBQVU7QUFDL0IsUUFBSSxrQkFBa0I7QUFFdEIsUUFBSSxTQUFTO0FBQUEsTUFDVCxTQUFTO0FBQUEsTUFDVCxTQUFTO0FBQUE7QUFHYixZQUFPLFVBQVU7QUFBQSxNQUNiLFdBQVcsT0FBTztBQUFBLE1BQ2xCLFlBQVk7QUFBQSxRQUNSLFNBQVMsU0FBVSxPQUFPO0FBQ3RCLGlCQUFPLFFBQVEsS0FBSyxPQUFPLGlCQUFpQjtBQUFBO0FBQUEsUUFFaEQsU0FBUyxTQUFVLE9BQU87QUFDdEIsaUJBQU8sT0FBTztBQUFBO0FBQUE7QUFBQSxNQUd0QixTQUFTLE9BQU87QUFBQSxNQUNoQixTQUFTLE9BQU87QUFBQTtBQUFBO0FBQUE7OztBQ3JCcEI7QUFBQTtBQUFBO0FBRUEsUUFBSSxVQUFVO0FBRWQsUUFBSSxNQUFNLE9BQU8sVUFBVTtBQUMzQixRQUFJLFVBQVUsTUFBTTtBQUVwQixRQUFJLFdBQVksV0FBWTtBQUN4QixVQUFJLFFBQVE7QUFDWixlQUFTLElBQUksR0FBRyxJQUFJLEtBQUssRUFBRSxHQUFHO0FBQzFCLGNBQU0sS0FBSyxNQUFRLE1BQUksS0FBSyxNQUFNLE1BQU0sRUFBRSxTQUFTLEtBQUs7QUFBQTtBQUc1RCxhQUFPO0FBQUE7QUFHWCxRQUFJLGVBQWUsdUJBQXNCLE9BQU87QUFDNUMsYUFBTyxNQUFNLFNBQVMsR0FBRztBQUNyQixZQUFJLE9BQU8sTUFBTTtBQUNqQixZQUFJLE1BQU0sS0FBSyxJQUFJLEtBQUs7QUFFeEIsWUFBSSxRQUFRLE1BQU07QUFDZCxjQUFJLFlBQVk7QUFFaEIsbUJBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRLEVBQUUsR0FBRztBQUNqQyxnQkFBSSxPQUFPLElBQUksT0FBTyxhQUFhO0FBQy9CLHdCQUFVLEtBQUssSUFBSTtBQUFBO0FBQUE7QUFJM0IsZUFBSyxJQUFJLEtBQUssUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUtsQyxRQUFJLGdCQUFnQix3QkFBdUIsUUFBUSxTQUFTO0FBQ3hELFVBQUksTUFBTSxXQUFXLFFBQVEsZUFBZSxPQUFPLE9BQU8sUUFBUTtBQUNsRSxlQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxFQUFFLEdBQUc7QUFDcEMsWUFBSSxPQUFPLE9BQU8sT0FBTyxhQUFhO0FBQ2xDLGNBQUksS0FBSyxPQUFPO0FBQUE7QUFBQTtBQUl4QixhQUFPO0FBQUE7QUFHWCxRQUFJLFFBQVEsZ0JBQWUsUUFBUSxRQUFRLFNBQVM7QUFFaEQsVUFBSSxDQUFDLFFBQVE7QUFDVCxlQUFPO0FBQUE7QUFHWCxVQUFJLE9BQU8sV0FBVyxVQUFVO0FBQzVCLFlBQUksUUFBUSxTQUFTO0FBQ2pCLGlCQUFPLEtBQUs7QUFBQSxtQkFDTCxVQUFVLE9BQU8sV0FBVyxVQUFVO0FBQzdDLGNBQUssV0FBWSxTQUFRLGdCQUFnQixRQUFRLG9CQUFxQixDQUFDLElBQUksS0FBSyxPQUFPLFdBQVcsU0FBUztBQUN2RyxtQkFBTyxVQUFVO0FBQUE7QUFBQSxlQUVsQjtBQUNILGlCQUFPLENBQUMsUUFBUTtBQUFBO0FBR3BCLGVBQU87QUFBQTtBQUdYLFVBQUksQ0FBQyxVQUFVLE9BQU8sV0FBVyxVQUFVO0FBQ3ZDLGVBQU8sQ0FBQyxRQUFRLE9BQU87QUFBQTtBQUczQixVQUFJLGNBQWM7QUFDbEIsVUFBSSxRQUFRLFdBQVcsQ0FBQyxRQUFRLFNBQVM7QUFDckMsc0JBQWMsY0FBYyxRQUFRO0FBQUE7QUFHeEMsVUFBSSxRQUFRLFdBQVcsUUFBUSxTQUFTO0FBQ3BDLGVBQU8sUUFBUSxTQUFVLE1BQU0sR0FBRztBQUM5QixjQUFJLElBQUksS0FBSyxRQUFRLElBQUk7QUFDckIsZ0JBQUksYUFBYSxPQUFPO0FBQ3hCLGdCQUFJLGNBQWMsT0FBTyxlQUFlLFlBQVksUUFBUSxPQUFPLFNBQVMsVUFBVTtBQUNsRixxQkFBTyxLQUFLLE9BQU0sWUFBWSxNQUFNO0FBQUEsbUJBQ2pDO0FBQ0gscUJBQU8sS0FBSztBQUFBO0FBQUEsaUJBRWI7QUFDSCxtQkFBTyxLQUFLO0FBQUE7QUFBQTtBQUdwQixlQUFPO0FBQUE7QUFHWCxhQUFPLE9BQU8sS0FBSyxRQUFRLE9BQU8sU0FBVSxLQUFLLEtBQUs7QUFDbEQsWUFBSSxRQUFRLE9BQU87QUFFbkIsWUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNO0FBQ3BCLGNBQUksT0FBTyxPQUFNLElBQUksTUFBTSxPQUFPO0FBQUEsZUFDL0I7QUFDSCxjQUFJLE9BQU87QUFBQTtBQUVmLGVBQU87QUFBQSxTQUNSO0FBQUE7QUFHUCxRQUFJLFNBQVMsNEJBQTRCLFFBQVEsUUFBUTtBQUNyRCxhQUFPLE9BQU8sS0FBSyxRQUFRLE9BQU8sU0FBVSxLQUFLLEtBQUs7QUFDbEQsWUFBSSxPQUFPLE9BQU87QUFDbEIsZUFBTztBQUFBLFNBQ1I7QUFBQTtBQUdQLFFBQUksU0FBUyxTQUFVLEtBQUssU0FBUyxTQUFTO0FBQzFDLFVBQUksaUJBQWlCLElBQUksUUFBUSxPQUFPO0FBQ3hDLFVBQUksWUFBWSxjQUFjO0FBRTFCLGVBQU8sZUFBZSxRQUFRLGtCQUFrQjtBQUFBO0FBR3BELFVBQUk7QUFDQSxlQUFPLG1CQUFtQjtBQUFBLGVBQ3JCLEdBQVA7QUFDRSxlQUFPO0FBQUE7QUFBQTtBQUlmLFFBQUksU0FBUyxpQkFBZ0IsS0FBSyxnQkFBZ0IsU0FBUyxNQUFNLFFBQVE7QUFHckUsVUFBSSxJQUFJLFdBQVcsR0FBRztBQUNsQixlQUFPO0FBQUE7QUFHWCxVQUFJLFNBQVM7QUFDYixVQUFJLE9BQU8sUUFBUSxVQUFVO0FBQ3pCLGlCQUFTLE9BQU8sVUFBVSxTQUFTLEtBQUs7QUFBQSxpQkFDakMsT0FBTyxRQUFRLFVBQVU7QUFDaEMsaUJBQVMsT0FBTztBQUFBO0FBR3BCLFVBQUksWUFBWSxjQUFjO0FBQzFCLGVBQU8sT0FBTyxRQUFRLFFBQVEsbUJBQW1CLFNBQVUsSUFBSTtBQUMzRCxpQkFBTyxXQUFXLFNBQVMsR0FBRyxNQUFNLElBQUksTUFBTTtBQUFBO0FBQUE7QUFJdEQsVUFBSSxNQUFNO0FBQ1YsZUFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsRUFBRSxHQUFHO0FBQ3BDLFlBQUksSUFBSSxPQUFPLFdBQVc7QUFFMUIsWUFDSSxNQUFNLE1BQ0gsTUFBTSxNQUNOLE1BQU0sTUFDTixNQUFNLE9BQ0wsS0FBSyxNQUFRLEtBQUssTUFDbEIsS0FBSyxNQUFRLEtBQUssTUFDbEIsS0FBSyxNQUFRLEtBQUssT0FDbEIsV0FBVyxRQUFRLFdBQVksT0FBTSxNQUFRLE1BQU0sS0FDekQ7QUFDRSxpQkFBTyxPQUFPLE9BQU87QUFDckI7QUFBQTtBQUdKLFlBQUksSUFBSSxLQUFNO0FBQ1YsZ0JBQU0sTUFBTSxTQUFTO0FBQ3JCO0FBQUE7QUFHSixZQUFJLElBQUksTUFBTztBQUNYLGdCQUFNLE1BQU8sVUFBUyxNQUFRLEtBQUssS0FBTSxTQUFTLE1BQVEsSUFBSTtBQUM5RDtBQUFBO0FBR0osWUFBSSxJQUFJLFNBQVUsS0FBSyxPQUFRO0FBQzNCLGdCQUFNLE1BQU8sVUFBUyxNQUFRLEtBQUssTUFBTyxTQUFTLE1BQVMsS0FBSyxJQUFLLE1BQVMsU0FBUyxNQUFRLElBQUk7QUFDcEc7QUFBQTtBQUdKLGFBQUs7QUFDTCxZQUFJLFFBQWEsTUFBSSxTQUFVLEtBQU8sT0FBTyxXQUFXLEtBQUs7QUFFN0QsZUFBTyxTQUFTLE1BQVEsS0FBSyxNQUN2QixTQUFTLE1BQVMsS0FBSyxLQUFNLE1BQzdCLFNBQVMsTUFBUyxLQUFLLElBQUssTUFDNUIsU0FBUyxNQUFRLElBQUk7QUFBQTtBQUcvQixhQUFPO0FBQUE7QUFHWCxRQUFJLFVBQVUsa0JBQWlCLE9BQU87QUFDbEMsVUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxTQUFTLE1BQU07QUFDeEMsVUFBSSxPQUFPO0FBRVgsZUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsRUFBRSxHQUFHO0FBQ25DLFlBQUksT0FBTyxNQUFNO0FBQ2pCLFlBQUksTUFBTSxLQUFLLElBQUksS0FBSztBQUV4QixZQUFJLE9BQU8sT0FBTyxLQUFLO0FBQ3ZCLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxFQUFFLEdBQUc7QUFDbEMsY0FBSSxNQUFNLEtBQUs7QUFDZixjQUFJLE1BQU0sSUFBSTtBQUNkLGNBQUksT0FBTyxRQUFRLFlBQVksUUFBUSxRQUFRLEtBQUssUUFBUSxTQUFTLElBQUk7QUFDckUsa0JBQU0sS0FBSyxFQUFFLEtBQVUsTUFBTTtBQUM3QixpQkFBSyxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBS3RCLG1CQUFhO0FBRWIsYUFBTztBQUFBO0FBR1gsUUFBSSxXQUFXLG1CQUFrQixLQUFLO0FBQ2xDLGFBQU8sT0FBTyxVQUFVLFNBQVMsS0FBSyxTQUFTO0FBQUE7QUFHbkQsUUFBSSxXQUFXLG1CQUFrQixLQUFLO0FBQ2xDLFVBQUksQ0FBQyxPQUFPLE9BQU8sUUFBUSxVQUFVO0FBQ2pDLGVBQU87QUFBQTtBQUdYLGFBQU8sQ0FBQyxDQUFFLEtBQUksZUFBZSxJQUFJLFlBQVksWUFBWSxJQUFJLFlBQVksU0FBUztBQUFBO0FBR3RGLFFBQUksVUFBVSxrQkFBaUIsR0FBRyxHQUFHO0FBQ2pDLGFBQU8sR0FBRyxPQUFPLEdBQUc7QUFBQTtBQUd4QixRQUFJLFdBQVcsbUJBQWtCLEtBQUssSUFBSTtBQUN0QyxVQUFJLFFBQVEsTUFBTTtBQUNkLFlBQUksU0FBUztBQUNiLGlCQUFTLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxLQUFLLEdBQUc7QUFDcEMsaUJBQU8sS0FBSyxHQUFHLElBQUk7QUFBQTtBQUV2QixlQUFPO0FBQUE7QUFFWCxhQUFPLEdBQUc7QUFBQTtBQUdkLFlBQU8sVUFBVTtBQUFBLE1BQ2I7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQTtBQUFBO0FBQUE7OztBQzFQSjtBQUFBO0FBQUE7QUFFQSxRQUFJLGlCQUFpQjtBQUNyQixRQUFJLFFBQVE7QUFDWixRQUFJLFVBQVU7QUFDZCxRQUFJLE1BQU0sT0FBTyxVQUFVO0FBRTNCLFFBQUksd0JBQXdCO0FBQUEsTUFDeEIsVUFBVSxrQkFBa0IsUUFBUTtBQUNoQyxlQUFPLFNBQVM7QUFBQTtBQUFBLE1BRXBCLE9BQU87QUFBQSxNQUNQLFNBQVMsaUJBQWlCLFFBQVEsS0FBSztBQUNuQyxlQUFPLFNBQVMsTUFBTSxNQUFNO0FBQUE7QUFBQSxNQUVoQyxRQUFRLGdCQUFnQixRQUFRO0FBQzVCLGVBQU87QUFBQTtBQUFBO0FBSWYsUUFBSSxVQUFVLE1BQU07QUFDcEIsUUFBSSxRQUFRLE9BQU8sVUFBVTtBQUM3QixRQUFJLE9BQU8sTUFBTSxVQUFVO0FBQzNCLFFBQUksY0FBYyxTQUFVLEtBQUssY0FBYztBQUMzQyxXQUFLLE1BQU0sS0FBSyxRQUFRLGdCQUFnQixlQUFlLENBQUM7QUFBQTtBQUc1RCxRQUFJLFFBQVEsS0FBSyxVQUFVO0FBRTNCLFFBQUksZ0JBQWdCLFFBQVE7QUFDNUIsUUFBSSxXQUFXO0FBQUEsTUFDWCxnQkFBZ0I7QUFBQSxNQUNoQixXQUFXO0FBQUEsTUFDWCxTQUFTO0FBQUEsTUFDVCxpQkFBaUI7QUFBQSxNQUNqQixXQUFXO0FBQUEsTUFDWCxRQUFRO0FBQUEsTUFDUixTQUFTLE1BQU07QUFBQSxNQUNmLGtCQUFrQjtBQUFBLE1BQ2xCLFFBQVE7QUFBQSxNQUNSLFdBQVcsUUFBUSxXQUFXO0FBQUEsTUFFOUIsU0FBUztBQUFBLE1BQ1QsZUFBZSx1QkFBdUIsTUFBTTtBQUN4QyxlQUFPLE1BQU0sS0FBSztBQUFBO0FBQUEsTUFFdEIsV0FBVztBQUFBLE1BQ1gsb0JBQW9CO0FBQUE7QUFHeEIsUUFBSSx3QkFBd0IsZ0NBQStCLEdBQUc7QUFDMUQsYUFBTyxPQUFPLE1BQU0sWUFDYixPQUFPLE1BQU0sWUFDYixPQUFPLE1BQU0sYUFDYixPQUFPLE1BQU0sWUFDYixPQUFPLE1BQU07QUFBQTtBQUd4QixRQUFJLFdBQVc7QUFFZixRQUFJLFlBQVksb0JBQ1osUUFDQSxRQUNBLHFCQUNBLGdCQUNBLG9CQUNBLFdBQ0EsU0FDQSxRQUNBLE1BQ0EsV0FDQSxlQUNBLFFBQ0EsV0FDQSxrQkFDQSxTQUNBLGFBQ0Y7QUFDRSxVQUFJLE1BQU07QUFFVixVQUFJLFFBQVE7QUFDWixVQUFJLE9BQU87QUFDWCxVQUFJLFdBQVc7QUFDZixhQUFRLFNBQVEsTUFBTSxJQUFJLGVBQWUsVUFBa0IsQ0FBQyxVQUFVO0FBRWxFLFlBQUksTUFBTSxNQUFNLElBQUk7QUFDcEIsZ0JBQVE7QUFDUixZQUFJLE9BQU8sUUFBUSxhQUFhO0FBQzVCLGNBQUksUUFBUSxNQUFNO0FBQ2Qsa0JBQU0sSUFBSSxXQUFXO0FBQUEsaUJBQ2xCO0FBQ0gsdUJBQVc7QUFBQTtBQUFBO0FBR25CLFlBQUksT0FBTyxNQUFNLElBQUksY0FBYyxhQUFhO0FBQzVDLGlCQUFPO0FBQUE7QUFBQTtBQUlmLFVBQUksT0FBTyxXQUFXLFlBQVk7QUFDOUIsY0FBTSxPQUFPLFFBQVE7QUFBQSxpQkFDZCxlQUFlLE1BQU07QUFDNUIsY0FBTSxjQUFjO0FBQUEsaUJBQ2Isd0JBQXdCLFdBQVcsUUFBUSxNQUFNO0FBQ3hELGNBQU0sTUFBTSxTQUFTLEtBQUssU0FBVSxRQUFPO0FBQ3ZDLGNBQUksa0JBQWlCLE1BQU07QUFDdkIsbUJBQU8sY0FBYztBQUFBO0FBRXpCLGlCQUFPO0FBQUE7QUFBQTtBQUlmLFVBQUksUUFBUSxNQUFNO0FBQ2QsWUFBSSxvQkFBb0I7QUFDcEIsaUJBQU8sV0FBVyxDQUFDLG1CQUFtQixRQUFRLFFBQVEsU0FBUyxTQUFTLFNBQVMsT0FBTyxVQUFVO0FBQUE7QUFHdEcsY0FBTTtBQUFBO0FBR1YsVUFBSSxzQkFBc0IsUUFBUSxNQUFNLFNBQVMsTUFBTTtBQUNuRCxZQUFJLFNBQVM7QUFDVCxjQUFJLFdBQVcsbUJBQW1CLFNBQVMsUUFBUSxRQUFRLFNBQVMsU0FBUyxTQUFTLE9BQU87QUFDN0YsY0FBSSx3QkFBd0IsV0FBVyxrQkFBa0I7QUFDckQsZ0JBQUksY0FBYyxNQUFNLEtBQUssT0FBTyxNQUFNO0FBQzFDLGdCQUFJLGVBQWU7QUFDbkIscUJBQVMsSUFBSSxHQUFHLElBQUksWUFBWSxRQUFRLEVBQUUsR0FBRztBQUN6Qyw4QkFBaUIsT0FBTSxJQUFJLEtBQUssT0FBTyxVQUFVLFFBQVEsWUFBWSxJQUFJLFNBQVMsU0FBUyxTQUFTLFNBQVM7QUFBQTtBQUVqSCxtQkFBTyxDQUFDLFVBQVUsWUFBYSxtQkFBa0IsUUFBUSxRQUFRLFlBQVksV0FBVyxJQUFJLE9BQU8sTUFBTSxNQUFNO0FBQUE7QUFFbkgsaUJBQU8sQ0FBQyxVQUFVLFlBQVksTUFBTSxVQUFVLFFBQVEsS0FBSyxTQUFTLFNBQVMsU0FBUyxTQUFTO0FBQUE7QUFFbkcsZUFBTyxDQUFDLFVBQVUsVUFBVSxNQUFNLFVBQVUsT0FBTztBQUFBO0FBR3ZELFVBQUksU0FBUztBQUViLFVBQUksT0FBTyxRQUFRLGFBQWE7QUFDNUIsZUFBTztBQUFBO0FBR1gsVUFBSTtBQUNKLFVBQUksd0JBQXdCLFdBQVcsUUFBUSxNQUFNO0FBRWpELGtCQUFVLENBQUMsRUFBRSxPQUFPLElBQUksU0FBUyxJQUFJLElBQUksS0FBSyxRQUFRLE9BQU87QUFBQSxpQkFDdEQsUUFBUSxTQUFTO0FBQ3hCLGtCQUFVO0FBQUEsYUFDUDtBQUNILFlBQUksT0FBTyxPQUFPLEtBQUs7QUFDdkIsa0JBQVUsT0FBTyxLQUFLLEtBQUssUUFBUTtBQUFBO0FBR3ZDLFVBQUksaUJBQWlCLGtCQUFrQixRQUFRLFFBQVEsSUFBSSxXQUFXLElBQUksU0FBUyxPQUFPO0FBRTFGLGVBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxRQUFRLEVBQUUsR0FBRztBQUNyQyxZQUFJLE1BQU0sUUFBUTtBQUNsQixZQUFJLFFBQVEsT0FBTyxRQUFRLFlBQVksT0FBTyxJQUFJLFVBQVUsY0FBYyxJQUFJLFFBQVEsSUFBSTtBQUUxRixZQUFJLGFBQWEsVUFBVSxNQUFNO0FBQzdCO0FBQUE7QUFHSixZQUFJLFlBQVksUUFBUSxPQUNsQixPQUFPLHdCQUF3QixhQUFhLG9CQUFvQixnQkFBZ0IsT0FBTyxpQkFDdkYsaUJBQWtCLGFBQVksTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUU1RCxvQkFBWSxJQUFJLFFBQVE7QUFDeEIsWUFBSSxtQkFBbUI7QUFDdkIseUJBQWlCLElBQUksVUFBVTtBQUMvQixvQkFBWSxRQUFRLFdBQ2hCLE9BQ0EsV0FDQSxxQkFDQSxnQkFDQSxvQkFDQSxXQUNBLFNBQ0EsUUFDQSxNQUNBLFdBQ0EsZUFDQSxRQUNBLFdBQ0Esa0JBQ0EsU0FDQTtBQUFBO0FBSVIsYUFBTztBQUFBO0FBR1gsUUFBSSw0QkFBNEIsb0NBQW1DLE1BQU07QUFDckUsVUFBSSxDQUFDLE1BQU07QUFDUCxlQUFPO0FBQUE7QUFHWCxVQUFJLEtBQUssWUFBWSxRQUFRLE9BQU8sS0FBSyxZQUFZLGVBQWUsT0FBTyxLQUFLLFlBQVksWUFBWTtBQUNwRyxjQUFNLElBQUksVUFBVTtBQUFBO0FBR3hCLFVBQUksVUFBVSxLQUFLLFdBQVcsU0FBUztBQUN2QyxVQUFJLE9BQU8sS0FBSyxZQUFZLGVBQWUsS0FBSyxZQUFZLFdBQVcsS0FBSyxZQUFZLGNBQWM7QUFDbEcsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd4QixVQUFJLFNBQVMsUUFBUTtBQUNyQixVQUFJLE9BQU8sS0FBSyxXQUFXLGFBQWE7QUFDcEMsWUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLFlBQVksS0FBSyxTQUFTO0FBQzVDLGdCQUFNLElBQUksVUFBVTtBQUFBO0FBRXhCLGlCQUFTLEtBQUs7QUFBQTtBQUVsQixVQUFJLFlBQVksUUFBUSxXQUFXO0FBRW5DLFVBQUksU0FBUyxTQUFTO0FBQ3RCLFVBQUksT0FBTyxLQUFLLFdBQVcsY0FBYyxRQUFRLEtBQUssU0FBUztBQUMzRCxpQkFBUyxLQUFLO0FBQUE7QUFHbEIsYUFBTztBQUFBLFFBQ0gsZ0JBQWdCLE9BQU8sS0FBSyxtQkFBbUIsWUFBWSxLQUFLLGlCQUFpQixTQUFTO0FBQUEsUUFDMUYsV0FBVyxPQUFPLEtBQUssY0FBYyxjQUFjLFNBQVMsWUFBWSxDQUFDLENBQUMsS0FBSztBQUFBLFFBQy9FO0FBQUEsUUFDQSxpQkFBaUIsT0FBTyxLQUFLLG9CQUFvQixZQUFZLEtBQUssa0JBQWtCLFNBQVM7QUFBQSxRQUM3RixXQUFXLE9BQU8sS0FBSyxjQUFjLGNBQWMsU0FBUyxZQUFZLEtBQUs7QUFBQSxRQUM3RSxRQUFRLE9BQU8sS0FBSyxXQUFXLFlBQVksS0FBSyxTQUFTLFNBQVM7QUFBQSxRQUNsRSxTQUFTLE9BQU8sS0FBSyxZQUFZLGFBQWEsS0FBSyxVQUFVLFNBQVM7QUFBQSxRQUN0RSxrQkFBa0IsT0FBTyxLQUFLLHFCQUFxQixZQUFZLEtBQUssbUJBQW1CLFNBQVM7QUFBQSxRQUNoRztBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQSxlQUFlLE9BQU8sS0FBSyxrQkFBa0IsYUFBYSxLQUFLLGdCQUFnQixTQUFTO0FBQUEsUUFDeEYsV0FBVyxPQUFPLEtBQUssY0FBYyxZQUFZLEtBQUssWUFBWSxTQUFTO0FBQUEsUUFDM0UsTUFBTSxPQUFPLEtBQUssU0FBUyxhQUFhLEtBQUssT0FBTztBQUFBLFFBQ3BELG9CQUFvQixPQUFPLEtBQUssdUJBQXVCLFlBQVksS0FBSyxxQkFBcUIsU0FBUztBQUFBO0FBQUE7QUFJOUcsWUFBTyxVQUFVLFNBQVUsUUFBUSxNQUFNO0FBQ3JDLFVBQUksTUFBTTtBQUNWLFVBQUksVUFBVSwwQkFBMEI7QUFFeEMsVUFBSTtBQUNKLFVBQUk7QUFFSixVQUFJLE9BQU8sUUFBUSxXQUFXLFlBQVk7QUFDdEMsaUJBQVMsUUFBUTtBQUNqQixjQUFNLE9BQU8sSUFBSTtBQUFBLGlCQUNWLFFBQVEsUUFBUSxTQUFTO0FBQ2hDLGlCQUFTLFFBQVE7QUFDakIsa0JBQVU7QUFBQTtBQUdkLFVBQUksT0FBTztBQUVYLFVBQUksT0FBTyxRQUFRLFlBQVksUUFBUSxNQUFNO0FBQ3pDLGVBQU87QUFBQTtBQUdYLFVBQUk7QUFDSixVQUFJLFFBQVEsS0FBSyxlQUFlLHVCQUF1QjtBQUNuRCxzQkFBYyxLQUFLO0FBQUEsaUJBQ1osUUFBUSxhQUFhLE1BQU07QUFDbEMsc0JBQWMsS0FBSyxVQUFVLFlBQVk7QUFBQSxhQUN0QztBQUNILHNCQUFjO0FBQUE7QUFHbEIsVUFBSSxzQkFBc0Isc0JBQXNCO0FBQ2hELFVBQUksUUFBUSxvQkFBb0IsUUFBUSxPQUFPLEtBQUssbUJBQW1CLFdBQVc7QUFDOUUsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUV4QixVQUFJLGlCQUFpQix3QkFBd0IsV0FBVyxRQUFRLEtBQUs7QUFFckUsVUFBSSxDQUFDLFNBQVM7QUFDVixrQkFBVSxPQUFPLEtBQUs7QUFBQTtBQUcxQixVQUFJLFFBQVEsTUFBTTtBQUNkLGdCQUFRLEtBQUssUUFBUTtBQUFBO0FBR3pCLFVBQUksY0FBYztBQUNsQixlQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxFQUFFLEdBQUc7QUFDckMsWUFBSSxNQUFNLFFBQVE7QUFFbEIsWUFBSSxRQUFRLGFBQWEsSUFBSSxTQUFTLE1BQU07QUFDeEM7QUFBQTtBQUVKLG9CQUFZLE1BQU0sVUFDZCxJQUFJLE1BQ0osS0FDQSxxQkFDQSxnQkFDQSxRQUFRLG9CQUNSLFFBQVEsV0FDUixRQUFRLFNBQVMsUUFBUSxVQUFVLE1BQ25DLFFBQVEsUUFDUixRQUFRLE1BQ1IsUUFBUSxXQUNSLFFBQVEsZUFDUixRQUFRLFFBQ1IsUUFBUSxXQUNSLFFBQVEsa0JBQ1IsUUFBUSxTQUNSO0FBQUE7QUFJUixVQUFJLFNBQVMsS0FBSyxLQUFLLFFBQVE7QUFDL0IsVUFBSSxTQUFTLFFBQVEsbUJBQW1CLE9BQU8sTUFBTTtBQUVyRCxVQUFJLFFBQVEsaUJBQWlCO0FBQ3pCLFlBQUksUUFBUSxZQUFZLGNBQWM7QUFFbEMsb0JBQVU7QUFBQSxlQUNQO0FBRUgsb0JBQVU7QUFBQTtBQUFBO0FBSWxCLGFBQU8sT0FBTyxTQUFTLElBQUksU0FBUyxTQUFTO0FBQUE7QUFBQTtBQUFBOzs7QUNwVWpEO0FBQUE7QUFBQTtBQUVBLFFBQUksUUFBUTtBQUVaLFFBQUksTUFBTSxPQUFPLFVBQVU7QUFDM0IsUUFBSSxVQUFVLE1BQU07QUFFcEIsUUFBSSxXQUFXO0FBQUEsTUFDWCxXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxNQUNqQixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsTUFDVCxpQkFBaUI7QUFBQSxNQUNqQixPQUFPO0FBQUEsTUFDUCxTQUFTLE1BQU07QUFBQSxNQUNmLFdBQVc7QUFBQSxNQUNYLE9BQU87QUFBQSxNQUNQLG1CQUFtQjtBQUFBLE1BQ25CLDBCQUEwQjtBQUFBLE1BQzFCLGdCQUFnQjtBQUFBLE1BQ2hCLGFBQWE7QUFBQSxNQUNiLGNBQWM7QUFBQSxNQUNkLG9CQUFvQjtBQUFBO0FBR3hCLFFBQUksMkJBQTJCLFNBQVUsS0FBSztBQUMxQyxhQUFPLElBQUksUUFBUSxhQUFhLFNBQVUsSUFBSSxXQUFXO0FBQ3JELGVBQU8sT0FBTyxhQUFhLFNBQVMsV0FBVztBQUFBO0FBQUE7QUFJdkQsUUFBSSxrQkFBa0IsU0FBVSxLQUFLLFNBQVM7QUFDMUMsVUFBSSxPQUFPLE9BQU8sUUFBUSxZQUFZLFFBQVEsU0FBUyxJQUFJLFFBQVEsT0FBTyxJQUFJO0FBQzFFLGVBQU8sSUFBSSxNQUFNO0FBQUE7QUFHckIsYUFBTztBQUFBO0FBUVgsUUFBSSxjQUFjO0FBR2xCLFFBQUksa0JBQWtCO0FBRXRCLFFBQUksY0FBYyxnQ0FBZ0MsS0FBSyxTQUFTO0FBQzVELFVBQUksTUFBTTtBQUNWLFVBQUksV0FBVyxRQUFRLG9CQUFvQixJQUFJLFFBQVEsT0FBTyxNQUFNO0FBQ3BFLFVBQUksUUFBUSxRQUFRLG1CQUFtQixXQUFXLFNBQVksUUFBUTtBQUN0RSxVQUFJLFFBQVEsU0FBUyxNQUFNLFFBQVEsV0FBVztBQUM5QyxVQUFJLFlBQVk7QUFDaEIsVUFBSTtBQUVKLFVBQUksVUFBVSxRQUFRO0FBQ3RCLFVBQUksUUFBUSxpQkFBaUI7QUFDekIsYUFBSyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsRUFBRSxHQUFHO0FBQy9CLGNBQUksTUFBTSxHQUFHLFFBQVEsYUFBYSxHQUFHO0FBQ2pDLGdCQUFJLE1BQU0sT0FBTyxpQkFBaUI7QUFDOUIsd0JBQVU7QUFBQSx1QkFDSCxNQUFNLE9BQU8sYUFBYTtBQUNqQyx3QkFBVTtBQUFBO0FBRWQsd0JBQVk7QUFDWixnQkFBSSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBS3RCLFdBQUssSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEVBQUUsR0FBRztBQUMvQixZQUFJLE1BQU0sV0FBVztBQUNqQjtBQUFBO0FBRUosWUFBSSxPQUFPLE1BQU07QUFFakIsWUFBSSxtQkFBbUIsS0FBSyxRQUFRO0FBQ3BDLFlBQUksTUFBTSxxQkFBcUIsS0FBSyxLQUFLLFFBQVEsT0FBTyxtQkFBbUI7QUFFM0UsWUFBSSxLQUFLO0FBQ1QsWUFBSSxRQUFRLElBQUk7QUFDWixnQkFBTSxRQUFRLFFBQVEsTUFBTSxTQUFTLFNBQVMsU0FBUztBQUN2RCxnQkFBTSxRQUFRLHFCQUFxQixPQUFPO0FBQUEsZUFDdkM7QUFDSCxnQkFBTSxRQUFRLFFBQVEsS0FBSyxNQUFNLEdBQUcsTUFBTSxTQUFTLFNBQVMsU0FBUztBQUNyRSxnQkFBTSxNQUFNLFNBQ1IsZ0JBQWdCLEtBQUssTUFBTSxNQUFNLElBQUksVUFDckMsU0FBVSxZQUFZO0FBQ2xCLG1CQUFPLFFBQVEsUUFBUSxZQUFZLFNBQVMsU0FBUyxTQUFTO0FBQUE7QUFBQTtBQUsxRSxZQUFJLE9BQU8sUUFBUSw0QkFBNEIsWUFBWSxjQUFjO0FBQ3JFLGdCQUFNLHlCQUF5QjtBQUFBO0FBR25DLFlBQUksS0FBSyxRQUFRLFNBQVMsSUFBSTtBQUMxQixnQkFBTSxRQUFRLE9BQU8sQ0FBQyxPQUFPO0FBQUE7QUFHakMsWUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNO0FBQ3BCLGNBQUksT0FBTyxNQUFNLFFBQVEsSUFBSSxNQUFNO0FBQUEsZUFDaEM7QUFDSCxjQUFJLE9BQU87QUFBQTtBQUFBO0FBSW5CLGFBQU87QUFBQTtBQUdYLFFBQUksY0FBYyxTQUFVLE9BQU8sS0FBSyxTQUFTLGNBQWM7QUFDM0QsVUFBSSxPQUFPLGVBQWUsTUFBTSxnQkFBZ0IsS0FBSztBQUVyRCxlQUFTLElBQUksTUFBTSxTQUFTLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRztBQUN4QyxZQUFJO0FBQ0osWUFBSSxPQUFPLE1BQU07QUFFakIsWUFBSSxTQUFTLFFBQVEsUUFBUSxhQUFhO0FBQ3RDLGdCQUFNLEdBQUcsT0FBTztBQUFBLGVBQ2I7QUFDSCxnQkFBTSxRQUFRLGVBQWUsT0FBTyxPQUFPLFFBQVE7QUFDbkQsY0FBSSxZQUFZLEtBQUssT0FBTyxPQUFPLE9BQU8sS0FBSyxPQUFPLEtBQUssU0FBUyxPQUFPLE1BQU0sS0FBSyxNQUFNLEdBQUcsTUFBTTtBQUNyRyxjQUFJLFFBQVEsU0FBUyxXQUFXO0FBQ2hDLGNBQUksQ0FBQyxRQUFRLGVBQWUsY0FBYyxJQUFJO0FBQzFDLGtCQUFNLEVBQUUsR0FBRztBQUFBLHFCQUVYLENBQUMsTUFBTSxVQUNKLFNBQVMsYUFDVCxPQUFPLFdBQVcsYUFDbEIsU0FBUyxLQUNSLFNBQVEsZUFBZSxTQUFTLFFBQVEsYUFDOUM7QUFDRSxrQkFBTTtBQUNOLGdCQUFJLFNBQVM7QUFBQSxxQkFDTixjQUFjLGFBQWE7QUFDbEMsZ0JBQUksYUFBYTtBQUFBO0FBQUE7QUFJekIsZUFBTztBQUFBO0FBR1gsYUFBTztBQUFBO0FBR1gsUUFBSSxZQUFZLDhCQUE4QixVQUFVLEtBQUssU0FBUyxjQUFjO0FBQ2hGLFVBQUksQ0FBQyxVQUFVO0FBQ1g7QUFBQTtBQUlKLFVBQUksTUFBTSxRQUFRLFlBQVksU0FBUyxRQUFRLGVBQWUsVUFBVTtBQUl4RSxVQUFJLFdBQVc7QUFDZixVQUFJLFFBQVE7QUFJWixVQUFJLFVBQVUsUUFBUSxRQUFRLEtBQUssU0FBUyxLQUFLO0FBQ2pELFVBQUksU0FBUyxVQUFVLElBQUksTUFBTSxHQUFHLFFBQVEsU0FBUztBQUlyRCxVQUFJLE9BQU87QUFDWCxVQUFJLFFBQVE7QUFFUixZQUFJLENBQUMsUUFBUSxnQkFBZ0IsSUFBSSxLQUFLLE9BQU8sV0FBVyxTQUFTO0FBQzdELGNBQUksQ0FBQyxRQUFRLGlCQUFpQjtBQUMxQjtBQUFBO0FBQUE7QUFJUixhQUFLLEtBQUs7QUFBQTtBQUtkLFVBQUksSUFBSTtBQUNSLGFBQU8sUUFBUSxRQUFRLEtBQU0sV0FBVSxNQUFNLEtBQUssVUFBVSxRQUFRLElBQUksUUFBUSxPQUFPO0FBQ25GLGFBQUs7QUFDTCxZQUFJLENBQUMsUUFBUSxnQkFBZ0IsSUFBSSxLQUFLLE9BQU8sV0FBVyxRQUFRLEdBQUcsTUFBTSxHQUFHLE1BQU07QUFDOUUsY0FBSSxDQUFDLFFBQVEsaUJBQWlCO0FBQzFCO0FBQUE7QUFBQTtBQUdSLGFBQUssS0FBSyxRQUFRO0FBQUE7QUFLdEIsVUFBSSxTQUFTO0FBQ1QsYUFBSyxLQUFLLE1BQU0sSUFBSSxNQUFNLFFBQVEsU0FBUztBQUFBO0FBRy9DLGFBQU8sWUFBWSxNQUFNLEtBQUssU0FBUztBQUFBO0FBRzNDLFFBQUksd0JBQXdCLGdDQUErQixNQUFNO0FBQzdELFVBQUksQ0FBQyxNQUFNO0FBQ1AsZUFBTztBQUFBO0FBR1gsVUFBSSxLQUFLLFlBQVksUUFBUSxLQUFLLFlBQVksVUFBYSxPQUFPLEtBQUssWUFBWSxZQUFZO0FBQzNGLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHeEIsVUFBSSxPQUFPLEtBQUssWUFBWSxlQUFlLEtBQUssWUFBWSxXQUFXLEtBQUssWUFBWSxjQUFjO0FBQ2xHLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFFeEIsVUFBSSxVQUFVLE9BQU8sS0FBSyxZQUFZLGNBQWMsU0FBUyxVQUFVLEtBQUs7QUFFNUUsYUFBTztBQUFBLFFBQ0gsV0FBVyxPQUFPLEtBQUssY0FBYyxjQUFjLFNBQVMsWUFBWSxDQUFDLENBQUMsS0FBSztBQUFBLFFBQy9FLGlCQUFpQixPQUFPLEtBQUssb0JBQW9CLFlBQVksS0FBSyxrQkFBa0IsU0FBUztBQUFBLFFBQzdGLGFBQWEsT0FBTyxLQUFLLGdCQUFnQixZQUFZLEtBQUssY0FBYyxTQUFTO0FBQUEsUUFDakYsWUFBWSxPQUFPLEtBQUssZUFBZSxXQUFXLEtBQUssYUFBYSxTQUFTO0FBQUEsUUFDN0U7QUFBQSxRQUNBLGlCQUFpQixPQUFPLEtBQUssb0JBQW9CLFlBQVksS0FBSyxrQkFBa0IsU0FBUztBQUFBLFFBQzdGLE9BQU8sT0FBTyxLQUFLLFVBQVUsWUFBWSxLQUFLLFFBQVEsU0FBUztBQUFBLFFBQy9ELFNBQVMsT0FBTyxLQUFLLFlBQVksYUFBYSxLQUFLLFVBQVUsU0FBUztBQUFBLFFBQ3RFLFdBQVcsT0FBTyxLQUFLLGNBQWMsWUFBWSxNQUFNLFNBQVMsS0FBSyxhQUFhLEtBQUssWUFBWSxTQUFTO0FBQUEsUUFFNUcsT0FBUSxPQUFPLEtBQUssVUFBVSxZQUFZLEtBQUssVUFBVSxRQUFTLENBQUMsS0FBSyxRQUFRLFNBQVM7QUFBQSxRQUN6RixtQkFBbUIsS0FBSyxzQkFBc0I7QUFBQSxRQUM5QywwQkFBMEIsT0FBTyxLQUFLLDZCQUE2QixZQUFZLEtBQUssMkJBQTJCLFNBQVM7QUFBQSxRQUN4SCxnQkFBZ0IsT0FBTyxLQUFLLG1CQUFtQixXQUFXLEtBQUssaUJBQWlCLFNBQVM7QUFBQSxRQUN6RixhQUFhLEtBQUssZ0JBQWdCO0FBQUEsUUFDbEMsY0FBYyxPQUFPLEtBQUssaUJBQWlCLFlBQVksS0FBSyxlQUFlLFNBQVM7QUFBQSxRQUNwRixvQkFBb0IsT0FBTyxLQUFLLHVCQUF1QixZQUFZLEtBQUsscUJBQXFCLFNBQVM7QUFBQTtBQUFBO0FBSTlHLFlBQU8sVUFBVSxTQUFVLEtBQUssTUFBTTtBQUNsQyxVQUFJLFVBQVUsc0JBQXNCO0FBRXBDLFVBQUksUUFBUSxNQUFNLFFBQVEsUUFBUSxPQUFPLFFBQVEsYUFBYTtBQUMxRCxlQUFPLFFBQVEsZUFBZSxPQUFPLE9BQU8sUUFBUTtBQUFBO0FBR3hELFVBQUksVUFBVSxPQUFPLFFBQVEsV0FBVyxZQUFZLEtBQUssV0FBVztBQUNwRSxVQUFJLE1BQU0sUUFBUSxlQUFlLE9BQU8sT0FBTyxRQUFRO0FBSXZELFVBQUksT0FBTyxPQUFPLEtBQUs7QUFDdkIsZUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsRUFBRSxHQUFHO0FBQ2xDLFlBQUksTUFBTSxLQUFLO0FBQ2YsWUFBSSxTQUFTLFVBQVUsS0FBSyxRQUFRLE1BQU0sU0FBUyxPQUFPLFFBQVE7QUFDbEUsY0FBTSxNQUFNLE1BQU0sS0FBSyxRQUFRO0FBQUE7QUFHbkMsVUFBSSxRQUFRLGdCQUFnQixNQUFNO0FBQzlCLGVBQU87QUFBQTtBQUdYLGFBQU8sTUFBTSxRQUFRO0FBQUE7QUFBQTtBQUFBOzs7QUNyUXpCO0FBQUE7QUFBQTtBQUVBLFFBQUksWUFBWTtBQUNoQixRQUFJLFFBQVE7QUFDWixRQUFJLFVBQVU7QUFFZCxZQUFPLFVBQVU7QUFBQSxNQUNiO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQTtBQUFBO0FBQUE7OztBQ1RKO0FBQUE7QUFPQTtBQU9BLFFBQUksUUFBUTtBQUNaLFFBQUksY0FBYztBQUNsQixRQUFJLGNBQWM7QUFDbEIsUUFBSSxRQUFRLGNBQWlCO0FBQzdCLFFBQUksWUFBWSxlQUFnQjtBQUNoQyxRQUFJLE9BQU87QUFDWCxRQUFJLFNBQVM7QUFNYixZQUFPLFVBQVU7QUFNakIsUUFBSSxVQUFVLE9BQU8sT0FBTztBQVU1Qix3QkFBcUIsU0FBUztBQUM1QixVQUFJLE9BQU8sV0FBVztBQUd0QixVQUFJLEtBQUssYUFBYSxRQUFXO0FBQy9CLGtCQUFVO0FBQUE7QUFHWixVQUFJLFdBQVcsS0FBSyxhQUFhO0FBQ2pDLFVBQUksVUFBVSxLQUFLLFlBQVk7QUFDL0IsVUFBSSxRQUFRLE9BQU8sS0FBSyxVQUFVLFdBQzlCLE1BQU0sTUFBTSxLQUFLLFNBQVMsV0FDMUIsS0FBSztBQUNULFVBQUksT0FBTyxLQUFLLFFBQVE7QUFDeEIsVUFBSSxTQUFTLEtBQUssVUFBVTtBQUU1QixVQUFJLFdBQVcsU0FBUyxPQUFPLFdBQVcsWUFBWTtBQUNwRCxjQUFNLElBQUksVUFBVTtBQUFBO0FBSXRCLFVBQUksYUFBYSxXQUNiLGVBQWUsUUFDZixhQUFhO0FBR2pCLFVBQUksY0FBYyxPQUFPLFNBQVMsYUFDOUIsWUFBWSxRQUNaO0FBRUoscUJBQWdCLE1BQU07QUFDcEIsZUFBTyxLQUFLLFNBQ1IsV0FBVyxRQUNYO0FBQUE7QUFHTixhQUFPLDBCQUEyQixLQUFLLEtBQUssTUFBTTtBQUNoRCxZQUFJLElBQUksT0FBTztBQUNiLGdCQUFNO0FBQ047QUFDQTtBQUFBO0FBR0YsWUFBSSxPQUFPLElBQUksUUFBUTtBQUd2QixZQUFJLENBQUMsT0FBTyxRQUFRLE1BQU07QUFDeEIsZ0JBQU07QUFDTjtBQUNBO0FBQUE7QUFHRixjQUFNLG1CQUFtQixJQUFJLFFBQVE7QUFHckMsWUFBSSxDQUFDLFlBQVksTUFBTTtBQUNyQixnQkFBTTtBQUNOO0FBQ0E7QUFBQTtBQUlGLFlBQUksVUFBVSxXQUFXLFFBQVE7QUFDakMsWUFBSSxZQUFZLFNBQVM7QUFDdkIsZ0JBQU07QUFDTixlQUFLLFlBQVksS0FBSywwQkFBMEIsUUFBUSxnQkFBZ0IsS0FBSztBQUFBLFlBQzNFO0FBQUEsWUFDQSxNQUFNO0FBQUE7QUFFUjtBQUFBO0FBSUYsYUFBSyxLQUFLLEtBQUssTUFBTSxPQUFPLE9BQU87QUFBQSxVQUNqQztBQUFBLFVBQ0EsVUFBVTtBQUFBLFVBQ1Y7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBO0FBQUE7QUFBQTtBQVdOLDRCQUF5QixTQUFTO0FBQ2hDLFVBQUksaUJBQWlCLFFBQVEsbUJBQW1CLFNBQzVDLFFBQVEsaUJBQ1I7QUFDSixVQUFJLFFBQVEsT0FBTztBQUVuQixVQUFJLE1BQU0sbUJBQW1CLGlCQUFpQixHQUFHO0FBQy9DLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsVUFBSSxTQUFTLGlCQUFpQjtBQUM1Qix5QkFBaUIsaUJBQWlCO0FBQUE7QUFHcEMsYUFBTyxvQkFBcUIsTUFBTTtBQUNoQyxZQUFJLGFBQWEsZUFBZSxNQUFNO0FBRXRDLFlBQUksZUFBZSxRQUFXO0FBQzVCLGdCQUFNO0FBQ04sZ0JBQU0sWUFBWSxLQUFLLHVCQUF1QjtBQUFBLFlBQzVDLE1BQU07QUFBQTtBQUFBO0FBSVYsWUFBSSxhQUFhLEtBQUssSUFBSSxLQUFLO0FBRS9CLGNBQU07QUFDTixlQUFPLE1BQU0sTUFBTTtBQUFBLFVBQ2pCLGlCQUFpQjtBQUFBLFVBQ2pCO0FBQUEsVUFDQSxPQUFPO0FBQUEsVUFDUDtBQUFBO0FBQUE7QUFBQTtBQVlOLHdCQUFxQixLQUFLO0FBQ3hCLFVBQUk7QUFDRixlQUFRLGFBQVksTUFBTSxLQUFLLFdBQVcsV0FBVyxJQUFJO0FBQUEsZUFDbEQsR0FBUDtBQUNBLGVBQU87QUFBQTtBQUFBO0FBWVgsNEJBQXlCLE1BQU0sT0FBTztBQUNwQyxVQUFJLFFBQVE7QUFDWixVQUFJLFFBQVE7QUFFWixhQUFRLFNBQVEsS0FBSyxRQUFRLEtBQUssWUFBWSxJQUFJO0FBQ2hEO0FBQ0E7QUFFQSxZQUFJLFVBQVUsT0FBTztBQUNuQixpQkFBTztBQUFBO0FBQUE7QUFJWCxhQUFPO0FBQUE7QUFXVCxvQkFBaUIsTUFBTTtBQUNyQixVQUFJLE1BQU0sUUFBUTtBQUVsQixVQUFJLFFBQVEsUUFBVztBQUNyQixlQUFPLElBQUk7QUFBQTtBQUliLGNBQVE7QUFBQSxhQUNEO0FBQ0gsZ0JBQU07QUFDTjtBQUFBLGFBQ0c7QUFDSCxnQkFBTSxRQUFRO0FBQ2Q7QUFBQTtBQUlKLGNBQVEsUUFBUTtBQUVoQixhQUFPLElBQUk7QUFBQTtBQVNiLDBCQUF1QixTQUFTO0FBQzlCLFVBQUksaUJBQWlCLFFBQVEsbUJBQW1CLFNBQzVDLFFBQVEsaUJBQ1I7QUFDSixVQUFJLFFBQVEsT0FBTztBQUVuQixVQUFJLE1BQU0sbUJBQW1CLGlCQUFpQixHQUFHO0FBQy9DLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsVUFBSSxTQUFTLGlCQUFpQjtBQUM1Qix5QkFBaUIsaUJBQWlCO0FBQUE7QUFHcEMsYUFBTyxvQkFBcUIsTUFBTTtBQUNoQyxZQUFJLGFBQWEsZUFBZSxNQUFNO0FBRXRDLFlBQUksZUFBZSxRQUFXO0FBQzVCLGdCQUFNO0FBQ04sZ0JBQU0sWUFBWSxLQUFLLHVCQUF1QjtBQUFBLFlBQzVDLE1BQU07QUFBQTtBQUFBO0FBSVYsY0FBTTtBQUNOLGVBQU8sTUFBTSxNQUFNLFFBQVcsUUFBVyxFQUFFLFNBQVM7QUFBQTtBQUFBO0FBV3hELHlCQUFzQixNQUFNO0FBQzFCLGFBQU8sbUJBQW9CLEtBQUs7QUFDOUIsZUFBTyxRQUFRLE9BQU8sS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUN6Ui9CO0FBQUE7QUFNQTtBQU9BLFFBQUksWUFBWSxlQUFnQjtBQU9oQyxRQUFJLFVBQVUsT0FBTyxPQUFPO0FBZ0I1QixjQUFVLFFBQU8sVUFBVSxVQUFVLFNBQVMsWUFDNUM7QUFPRixXQUFPLGVBQWUsU0FBUyxRQUFRO0FBQUEsTUFDckMsY0FBYztBQUFBLE1BQ2QsWUFBWTtBQUFBLE1BQ1osS0FBSyxtQkFBbUI7QUFBQTtBQVExQixXQUFPLGVBQWUsU0FBUyxPQUFPO0FBQUEsTUFDcEMsY0FBYztBQUFBLE1BQ2QsWUFBWTtBQUFBLE1BQ1osS0FBSyxtQkFBbUI7QUFBQTtBQVExQixXQUFPLGVBQWUsU0FBUyxRQUFRO0FBQUEsTUFDckMsY0FBYztBQUFBLE1BQ2QsWUFBWTtBQUFBLE1BQ1osS0FBSyxtQkFBbUI7QUFBQTtBQVExQixXQUFPLGVBQWUsU0FBUyxjQUFjO0FBQUEsTUFDM0MsY0FBYztBQUFBLE1BQ2QsWUFBWTtBQUFBLE1BQ1osS0FBSyxtQkFBbUI7QUFBQTtBQVkxQix3QkFBcUIsU0FBUztBQUU1QixVQUFJLE9BQU8sT0FBTyxPQUFPLFdBQVcsTUFBTTtBQUFBLFFBQ3hDLE1BQU07QUFBQSxVQUNKLGNBQWM7QUFBQSxVQUNkLFlBQVk7QUFBQSxVQUNaLE9BQU87QUFBQSxVQUNQLFVBQVU7QUFBQTtBQUFBO0FBSWQsVUFBSSxjQUFjLFFBQVEsV0FBVztBQUNyQyxVQUFJLFFBQVEsUUFBUSxLQUFLO0FBRXpCLGFBQU8scUJBQXFCLEtBQUssS0FBSyxNQUFNO0FBQzFDLGNBQU0sS0FBSyxLQUFLLFNBQVUsS0FBSztBQUM3QixjQUFJO0FBQUssbUJBQU8sS0FBSztBQUNyQixzQkFBWSxLQUFLLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFVNUIsZ0NBQTZCLE1BQU07QUFDakMsYUFBTyxnQkFBZ0I7QUFDckIsZUFBTyxXQUFXO0FBQUE7QUFBQTtBQVN0Qix3QkFBcUIsWUFBWTtBQUMvQixVQUFJLFNBQVMsUUFBUTtBQUVyQixVQUFJLFdBQVcsUUFBVztBQUN4QixlQUFPO0FBQUE7QUFJVCxjQUFRO0FBQUEsYUFDRDtBQUNILG1CQUFTO0FBQ1Q7QUFBQSxhQUNHO0FBQ0gsbUJBQVM7QUFDVDtBQUFBLGFBQ0c7QUFDSCxtQkFBUztBQUNUO0FBQUEsYUFDRztBQUNILG1CQUFTO0FBQ1Q7QUFBQTtBQUlKLGFBQVEsUUFBUSxjQUFjO0FBQUE7QUFBQTtBQUFBOzs7QUMxSmhDO0FBQUE7QUFPQTtBQU9BLFlBQU8sVUFBVTtBQU9qQixRQUFJLGlCQUFpQixPQUFPLFVBQVU7QUFZdEMsbUJBQWUsTUFBTSxLQUFLLFVBQVU7QUFDbEMsVUFBSSxDQUFDLE1BQU07QUFDVCxjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksQ0FBQyxLQUFLO0FBQ1IsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixVQUFJLGFBQWEsUUFBVztBQUUxQixtQkFBVztBQUFBO0FBR2IsYUFBTyxvQkFBb0IsS0FBSyxRQUFRLGdDQUFnQyxNQUFNO0FBQzVFLFlBQUksQ0FBQyxZQUFZLGVBQWUsS0FBSyxNQUFNLE9BQU87QUFFaEQ7QUFBQTtBQUlGLFlBQUksYUFBYSxPQUFPLHlCQUF5QixLQUFLO0FBQ3RELGVBQU8sZUFBZSxNQUFNLE1BQU07QUFBQTtBQUdwQyxhQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUMxRFQ7QUFBQTtBQUlBLFFBQUksSUFBSTtBQUNSLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBZ0JaLFlBQU8sVUFBVSxTQUFTLEtBQUssU0FBUztBQUN0QyxnQkFBVSxXQUFXO0FBQ3JCLFVBQUksT0FBTyxPQUFPO0FBQ2xCLFVBQUksU0FBUyxZQUFZLElBQUksU0FBUyxHQUFHO0FBQ3ZDLGVBQU8sTUFBTTtBQUFBLGlCQUNKLFNBQVMsWUFBWSxNQUFNLFNBQVMsT0FBTztBQUNwRCxlQUFPLFFBQVEsT0FBTyxRQUFRLE9BQU8sU0FBUztBQUFBO0FBRWhELFlBQU0sSUFBSSxNQUNSLDBEQUNFLEtBQUssVUFBVTtBQUFBO0FBWXJCLG1CQUFlLEtBQUs7QUFDbEIsWUFBTSxPQUFPO0FBQ2IsVUFBSSxJQUFJLFNBQVMsS0FBSztBQUNwQjtBQUFBO0FBRUYsVUFBSSxRQUFRLHdIQUF3SCxLQUNsSTtBQUVGLFVBQUksQ0FBQyxPQUFPO0FBQ1Y7QUFBQTtBQUVGLFVBQUksSUFBSSxXQUFXLE1BQU07QUFDekIsVUFBSSxPQUFRLE9BQU0sTUFBTSxNQUFNO0FBQzlCLGNBQVE7QUFBQSxhQUNEO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTztBQUFBO0FBRVAsaUJBQU87QUFBQTtBQUFBO0FBWWIsc0JBQWtCLElBQUk7QUFDcEIsVUFBSSxNQUFNLEdBQUc7QUFDWCxlQUFPLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQTtBQUU5QixVQUFJLE1BQU0sR0FBRztBQUNYLGVBQU8sS0FBSyxNQUFNLEtBQUssS0FBSztBQUFBO0FBRTlCLFVBQUksTUFBTSxHQUFHO0FBQ1gsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFFOUIsVUFBSSxNQUFNLEdBQUc7QUFDWCxlQUFPLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQTtBQUU5QixhQUFPLEtBQUs7QUFBQTtBQVdkLHFCQUFpQixJQUFJO0FBQ25CLGFBQU8sT0FBTyxJQUFJLEdBQUcsVUFDbkIsT0FBTyxJQUFJLEdBQUcsV0FDZCxPQUFPLElBQUksR0FBRyxhQUNkLE9BQU8sSUFBSSxHQUFHLGFBQ2QsS0FBSztBQUFBO0FBT1Qsb0JBQWdCLElBQUksR0FBRyxNQUFNO0FBQzNCLFVBQUksS0FBSyxHQUFHO0FBQ1Y7QUFBQTtBQUVGLFVBQUksS0FBSyxJQUFJLEtBQUs7QUFDaEIsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU07QUFBQTtBQUVwQyxhQUFPLEtBQUssS0FBSyxLQUFLLEtBQUssTUFBTSxPQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUN0SjFDO0FBQUE7QUFRQSxjQUFVLFFBQU8sVUFBVSxZQUFZLFFBQVEsWUFBWSxhQUFhO0FBQ3hFLFlBQVEsU0FBUztBQUNqQixZQUFRLFVBQVU7QUFDbEIsWUFBUSxTQUFTO0FBQ2pCLFlBQVEsVUFBVTtBQUNsQixZQUFRLFdBQVc7QUFNbkIsWUFBUSxRQUFRO0FBQ2hCLFlBQVEsUUFBUTtBQVFoQixZQUFRLGFBQWE7QUFNckIsUUFBSTtBQVNKLHlCQUFxQixXQUFXO0FBQzlCLFVBQUksT0FBTyxHQUFHO0FBRWQsV0FBSyxLQUFLLFdBQVc7QUFDbkIsZUFBVSxTQUFRLEtBQUssT0FBUSxVQUFVLFdBQVc7QUFDcEQsZ0JBQVE7QUFBQTtBQUdWLGFBQU8sUUFBUSxPQUFPLEtBQUssSUFBSSxRQUFRLFFBQVEsT0FBTztBQUFBO0FBV3hELHlCQUFxQixXQUFXO0FBRTlCLHVCQUFpQjtBQUVmLFlBQUksQ0FBQyxNQUFNO0FBQVM7QUFFcEIsWUFBSSxPQUFPO0FBR1gsWUFBSSxPQUFPLENBQUMsSUFBSTtBQUNoQixZQUFJLEtBQUssT0FBUSxhQUFZO0FBQzdCLGFBQUssT0FBTztBQUNaLGFBQUssT0FBTztBQUNaLGFBQUssT0FBTztBQUNaLG1CQUFXO0FBR1gsWUFBSSxPQUFPLElBQUksTUFBTSxVQUFVO0FBQy9CLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ3BDLGVBQUssS0FBSyxVQUFVO0FBQUE7QUFHdEIsYUFBSyxLQUFLLFFBQVEsT0FBTyxLQUFLO0FBRTlCLFlBQUksQUFBYSxPQUFPLEtBQUssT0FBekIsVUFBNkI7QUFFL0IsZUFBSyxRQUFRO0FBQUE7QUFJZixZQUFJLFFBQVE7QUFDWixhQUFLLEtBQUssS0FBSyxHQUFHLFFBQVEsaUJBQWlCLFNBQVMsT0FBTyxRQUFRO0FBRWpFLGNBQUksVUFBVTtBQUFNLG1CQUFPO0FBQzNCO0FBQ0EsY0FBSSxZQUFZLFFBQVEsV0FBVztBQUNuQyxjQUFJLEFBQWUsT0FBTyxjQUF0QixZQUFpQztBQUNuQyxnQkFBSSxNQUFNLEtBQUs7QUFDZixvQkFBUSxVQUFVLEtBQUssTUFBTTtBQUc3QixpQkFBSyxPQUFPLE9BQU87QUFDbkI7QUFBQTtBQUVGLGlCQUFPO0FBQUE7QUFJVCxnQkFBUSxXQUFXLEtBQUssTUFBTTtBQUU5QixZQUFJLFFBQVEsTUFBTSxPQUFPLFFBQVEsT0FBTyxRQUFRLElBQUksS0FBSztBQUN6RCxjQUFNLE1BQU0sTUFBTTtBQUFBO0FBR3BCLFlBQU0sWUFBWTtBQUNsQixZQUFNLFVBQVUsUUFBUSxRQUFRO0FBQ2hDLFlBQU0sWUFBWSxRQUFRO0FBQzFCLFlBQU0sUUFBUSxZQUFZO0FBRzFCLFVBQUksQUFBZSxPQUFPLFFBQVEsU0FBOUIsWUFBb0M7QUFDdEMsZ0JBQVEsS0FBSztBQUFBO0FBR2YsYUFBTztBQUFBO0FBV1Qsb0JBQWdCLFlBQVk7QUFDMUIsY0FBUSxLQUFLO0FBRWIsY0FBUSxRQUFRO0FBQ2hCLGNBQVEsUUFBUTtBQUVoQixVQUFJLFFBQVMsUUFBTyxlQUFlLFdBQVcsYUFBYSxJQUFJLE1BQU07QUFDckUsVUFBSSxNQUFNLE1BQU07QUFFaEIsZUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUs7QUFDNUIsWUFBSSxDQUFDLE1BQU07QUFBSTtBQUNmLHFCQUFhLE1BQU0sR0FBRyxRQUFRLE9BQU87QUFDckMsWUFBSSxXQUFXLE9BQU8sS0FBSztBQUN6QixrQkFBUSxNQUFNLEtBQUssSUFBSSxPQUFPLE1BQU0sV0FBVyxPQUFPLEtBQUs7QUFBQSxlQUN0RDtBQUNMLGtCQUFRLE1BQU0sS0FBSyxJQUFJLE9BQU8sTUFBTSxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBV3ZELHVCQUFtQjtBQUNqQixjQUFRLE9BQU87QUFBQTtBQVdqQixxQkFBaUIsTUFBTTtBQUNyQixVQUFJLEdBQUc7QUFDUCxXQUFLLElBQUksR0FBRyxNQUFNLFFBQVEsTUFBTSxRQUFRLElBQUksS0FBSyxLQUFLO0FBQ3BELFlBQUksUUFBUSxNQUFNLEdBQUcsS0FBSyxPQUFPO0FBQy9CLGlCQUFPO0FBQUE7QUFBQTtBQUdYLFdBQUssSUFBSSxHQUFHLE1BQU0sUUFBUSxNQUFNLFFBQVEsSUFBSSxLQUFLLEtBQUs7QUFDcEQsWUFBSSxRQUFRLE1BQU0sR0FBRyxLQUFLLE9BQU87QUFDL0IsaUJBQU87QUFBQTtBQUFBO0FBR1gsYUFBTztBQUFBO0FBV1Qsb0JBQWdCLEtBQUs7QUFDbkIsVUFBSSxlQUFlO0FBQU8sZUFBTyxJQUFJLFNBQVMsSUFBSTtBQUNsRCxhQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUN4TVQ7QUFBQTtBQU1BLGNBQVUsUUFBTyxVQUFVO0FBQzNCLFlBQVEsTUFBTTtBQUNkLFlBQVEsYUFBYTtBQUNyQixZQUFRLE9BQU87QUFDZixZQUFRLE9BQU87QUFDZixZQUFRLFlBQVk7QUFDcEIsWUFBUSxVQUFVLEFBQWUsT0FBTyxVQUF0QixlQUNBLEFBQWUsT0FBTyxPQUFPLFdBQTdCLGNBQ0UsT0FBTyxRQUFRLFFBQ2Y7QUFNcEIsWUFBUSxTQUFTO0FBQUEsTUFDZjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUE7QUFXRix5QkFBcUI7QUFJbkIsVUFBSSxPQUFPLFdBQVcsZUFBZSxPQUFPLFdBQVcsT0FBTyxRQUFRLFNBQVMsWUFBWTtBQUN6RixlQUFPO0FBQUE7QUFLVCxhQUFRLE9BQU8sYUFBYSxlQUFlLFNBQVMsbUJBQW1CLFNBQVMsZ0JBQWdCLFNBQVMsU0FBUyxnQkFBZ0IsTUFBTSxvQkFFckksT0FBTyxXQUFXLGVBQWUsT0FBTyxXQUFZLFFBQU8sUUFBUSxXQUFZLE9BQU8sUUFBUSxhQUFhLE9BQU8sUUFBUSxVQUcxSCxPQUFPLGNBQWMsZUFBZSxVQUFVLGFBQWEsVUFBVSxVQUFVLGNBQWMsTUFBTSxxQkFBcUIsU0FBUyxPQUFPLElBQUksT0FBTyxNQUVuSixPQUFPLGNBQWMsZUFBZSxVQUFVLGFBQWEsVUFBVSxVQUFVLGNBQWMsTUFBTTtBQUFBO0FBT3hHLFlBQVEsV0FBVyxJQUFJLFNBQVMsR0FBRztBQUNqQyxVQUFJO0FBQ0YsZUFBTyxLQUFLLFVBQVU7QUFBQSxlQUNmLEtBQVA7QUFDQSxlQUFPLGlDQUFpQyxJQUFJO0FBQUE7QUFBQTtBQVdoRCx3QkFBb0IsTUFBTTtBQUN4QixVQUFJLGFBQVksS0FBSztBQUVyQixXQUFLLEtBQU0sY0FBWSxPQUFPLE1BQzFCLEtBQUssWUFDSixjQUFZLFFBQVEsT0FDckIsS0FBSyxLQUNKLGNBQVksUUFBUSxPQUNyQixNQUFNLFFBQVEsU0FBUyxLQUFLO0FBRWhDLFVBQUksQ0FBQztBQUFXO0FBRWhCLFVBQUksSUFBSSxZQUFZLEtBQUs7QUFDekIsV0FBSyxPQUFPLEdBQUcsR0FBRyxHQUFHO0FBS3JCLFVBQUksUUFBUTtBQUNaLFVBQUksUUFBUTtBQUNaLFdBQUssR0FBRyxRQUFRLGVBQWUsU0FBUyxPQUFPO0FBQzdDLFlBQUksQUFBUyxVQUFUO0FBQWdCO0FBQ3BCO0FBQ0EsWUFBSSxBQUFTLFVBQVQsTUFBZ0I7QUFHbEIsa0JBQVE7QUFBQTtBQUFBO0FBSVosV0FBSyxPQUFPLE9BQU8sR0FBRztBQUFBO0FBVXhCLG1CQUFlO0FBR2IsYUFBTyxBQUFhLE9BQU8sWUFBcEIsWUFDRixRQUFRLE9BQ1IsU0FBUyxVQUFVLE1BQU0sS0FBSyxRQUFRLEtBQUssU0FBUztBQUFBO0FBVTNELGtCQUFjLFlBQVk7QUFDeEIsVUFBSTtBQUNGLFlBQUksQUFBUSxjQUFSLE1BQW9CO0FBQ3RCLGtCQUFRLFFBQVEsV0FBVztBQUFBLGVBQ3RCO0FBQ0wsa0JBQVEsUUFBUSxRQUFRO0FBQUE7QUFBQSxlQUVwQixHQUFOO0FBQUE7QUFBQTtBQVVKLG9CQUFnQjtBQUNkLFVBQUk7QUFDSixVQUFJO0FBQ0YsWUFBSSxRQUFRLFFBQVE7QUFBQSxlQUNkLEdBQU47QUFBQTtBQUdGLFVBQUksQ0FBQyxLQUFLLE9BQU8sWUFBWSxlQUFlLFNBQVMsU0FBUztBQUM1RCxZQUFJLFFBQVEsSUFBSTtBQUFBO0FBR2xCLGFBQU87QUFBQTtBQU9ULFlBQVEsT0FBTztBQWFmLDRCQUF3QjtBQUN0QixVQUFJO0FBQ0YsZUFBTyxPQUFPO0FBQUEsZUFDUCxHQUFQO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ3ZMSjtBQUFBO0FBSUEsUUFBSSxNQUFNLFFBQVE7QUFDbEIsUUFBSSxPQUFPLFFBQVE7QUFRbkIsY0FBVSxRQUFPLFVBQVU7QUFDM0IsWUFBUSxPQUFPO0FBQ2YsWUFBUSxNQUFNO0FBQ2QsWUFBUSxhQUFhO0FBQ3JCLFlBQVEsT0FBTztBQUNmLFlBQVEsT0FBTztBQUNmLFlBQVEsWUFBWTtBQU1wQixZQUFRLFNBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFRakMsWUFBUSxjQUFjLE9BQU8sS0FBSyxRQUFRLEtBQUssT0FBTyxTQUFVLEtBQUs7QUFDbkUsYUFBTyxXQUFXLEtBQUs7QUFBQSxPQUN0QixPQUFPLFNBQVUsS0FBSyxLQUFLO0FBRTVCLFVBQUksT0FBTyxJQUNSLFVBQVUsR0FDVixjQUNBLFFBQVEsYUFBYSxTQUFVLEdBQUcsR0FBRztBQUFFLGVBQU8sRUFBRTtBQUFBO0FBR25ELFVBQUksTUFBTSxRQUFRLElBQUk7QUFDdEIsVUFBSSwyQkFBMkIsS0FBSztBQUFNLGNBQU07QUFBQSxlQUN2Qyw2QkFBNkIsS0FBSztBQUFNLGNBQU07QUFBQSxlQUM5QyxRQUFRO0FBQVEsY0FBTTtBQUFBO0FBQzFCLGNBQU0sT0FBTztBQUVsQixVQUFJLFFBQVE7QUFDWixhQUFPO0FBQUEsT0FDTjtBQVNILFFBQUksS0FBSyxTQUFTLFFBQVEsSUFBSSxVQUFVLE9BQU87QUFFL0MsUUFBSSxBQUFNLE9BQU4sS0FBWSxBQUFNLE9BQU4sR0FBVTtBQUN4QixXQUFLLFVBQVUsV0FBVTtBQUFBLFNBQUk7QUFBQTtBQUcvQixRQUFJLFNBQVMsQUFBTSxPQUFOLElBQVcsUUFBUSxTQUNuQixBQUFNLE9BQU4sSUFBVyxRQUFRLFNBQ25CLDBCQUEwQjtBQU12Qyx5QkFBcUI7QUFDbkIsYUFBTyxZQUFZLFFBQVEsY0FDdkIsUUFBUSxRQUFRLFlBQVksVUFDNUIsSUFBSSxPQUFPO0FBQUE7QUFPakIsWUFBUSxXQUFXLElBQUksU0FBUyxHQUFHO0FBQ2pDLFdBQUssWUFBWSxTQUFTLEtBQUs7QUFDL0IsYUFBTyxLQUFLLFFBQVEsR0FBRyxLQUFLLGFBQ3pCLE1BQU0sTUFBTSxJQUFJLFNBQVMsS0FBSztBQUM3QixlQUFPLElBQUk7QUFBQSxTQUNWLEtBQUs7QUFBQTtBQU9aLFlBQVEsV0FBVyxJQUFJLFNBQVMsR0FBRztBQUNqQyxXQUFLLFlBQVksU0FBUyxLQUFLO0FBQy9CLGFBQU8sS0FBSyxRQUFRLEdBQUcsS0FBSztBQUFBO0FBUzlCLHdCQUFvQixNQUFNO0FBQ3hCLFVBQUksT0FBTyxLQUFLO0FBQ2hCLFVBQUksYUFBWSxLQUFLO0FBRXJCLFVBQUksWUFBVztBQUNiLFlBQUksSUFBSSxLQUFLO0FBQ2IsWUFBSSxTQUFTLFVBQWUsSUFBSSxRQUFRLE9BQU87QUFFL0MsYUFBSyxLQUFLLFNBQVMsS0FBSyxHQUFHLE1BQU0sTUFBTSxLQUFLLE9BQU87QUFDbkQsYUFBSyxLQUFLLFFBQWEsSUFBSSxPQUFPLFFBQVEsU0FBUyxLQUFLLFFBQVE7QUFBQSxhQUMzRDtBQUNMLGFBQUssS0FBSyxJQUFJLE9BQU8sZ0JBQ2pCLE1BQU0sT0FBTyxNQUFNLEtBQUs7QUFBQTtBQUFBO0FBUWhDLG1CQUFlO0FBQ2IsYUFBTyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sTUFBTSxhQUFhO0FBQUE7QUFVM0Qsa0JBQWMsWUFBWTtBQUN4QixVQUFJLEFBQVEsY0FBUixNQUFvQjtBQUd0QixlQUFPLFFBQVEsSUFBSTtBQUFBLGFBQ2Q7QUFDTCxnQkFBUSxJQUFJLFFBQVE7QUFBQTtBQUFBO0FBV3hCLG9CQUFnQjtBQUNkLGFBQU8sUUFBUSxJQUFJO0FBQUE7QUFVckIsdUNBQW9DLEtBQUk7QUFDdEMsVUFBSTtBQUNKLFVBQUksV0FBVyxRQUFRLFFBQVE7QUFJL0IsY0FBUSxTQUFTLGdCQUFnQjtBQUFBLGFBQzFCO0FBQ0gsb0JBQVMsSUFBSSxJQUFJLFlBQVk7QUFDN0Isa0JBQU8sUUFBUTtBQUlmLGNBQUksUUFBTyxXQUFXLFFBQU8sUUFBUSxPQUFPO0FBQzFDLG9CQUFPLFFBQVE7QUFBQTtBQUVqQjtBQUFBLGFBRUc7QUFDSCxjQUFJLE1BQUssUUFBUTtBQUNqQixvQkFBUyxJQUFJLElBQUcsZ0JBQWdCLEtBQUksRUFBRSxXQUFXO0FBQ2pELGtCQUFPLFFBQVE7QUFDZjtBQUFBLGFBRUc7QUFBQSxhQUNBO0FBQ0gsY0FBSSxNQUFNLFFBQVE7QUFDbEIsb0JBQVMsSUFBSSxJQUFJLE9BQU87QUFBQSxZQUN0QixJQUFJO0FBQUEsWUFDSixVQUFVO0FBQUEsWUFDVixVQUFVO0FBQUE7QUFPWixrQkFBTyxXQUFXO0FBQ2xCLGtCQUFPLE9BQU87QUFDZCxrQkFBTyxRQUFRO0FBSWYsY0FBSSxRQUFPLFdBQVcsUUFBTyxRQUFRLE9BQU87QUFDMUMsb0JBQU8sUUFBUTtBQUFBO0FBRWpCO0FBQUE7QUFJQSxnQkFBTSxJQUFJLE1BQU07QUFBQTtBQUlwQixjQUFPLEtBQUs7QUFFWixjQUFPLFdBQVc7QUFFbEIsYUFBTztBQUFBO0FBVVQsa0JBQWUsT0FBTztBQUNwQixZQUFNLGNBQWM7QUFFcEIsVUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO0FBQy9CLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDcEMsY0FBTSxZQUFZLEtBQUssTUFBTSxRQUFRLFlBQVksS0FBSztBQUFBO0FBQUE7QUFRMUQsWUFBUSxPQUFPO0FBQUE7QUFBQTs7O0FDdlBmO0FBQUE7QUFLQSxRQUFJLE9BQU8sWUFBWSxlQUFlLFFBQVEsU0FBUyxZQUFZO0FBQ2pFLGNBQU8sVUFBVTtBQUFBLFdBQ1o7QUFDTCxjQUFPLFVBQVU7QUFBQTtBQUFBO0FBQUE7OztBQ1JuQjtBQUFBO0FBTUE7QUFPQSxZQUFPLFVBQVU7QUFRakIsUUFBSSxzQkFBc0I7QUFPMUIsUUFBSSxrQ0FBa0M7QUFPdEMsUUFBSSxtQ0FBbUM7QUFvQnZDLHVCQUFvQixLQUFLO0FBQ3ZCLGFBQU8sT0FBTyxLQUNYLFFBQVEsaUNBQWlDLGtDQUN6QyxRQUFRLHFCQUFxQjtBQUFBO0FBQUE7QUFBQTs7O0FDMURsQztBQUFBO0FBUUE7QUFPQSxRQUFJLGtCQUFrQjtBQU90QixZQUFPLFVBQVU7QUFVakIsd0JBQW9CLFFBQVE7QUFDMUIsVUFBSSxNQUFNLEtBQUs7QUFDZixVQUFJLFFBQVEsZ0JBQWdCLEtBQUs7QUFFakMsVUFBSSxDQUFDLE9BQU87QUFDVixlQUFPO0FBQUE7QUFHVCxVQUFJO0FBQ0osVUFBSSxPQUFPO0FBQ1gsVUFBSSxRQUFRO0FBQ1osVUFBSSxZQUFZO0FBRWhCLFdBQUssUUFBUSxNQUFNLE9BQU8sUUFBUSxJQUFJLFFBQVEsU0FBUztBQUNyRCxnQkFBUSxJQUFJLFdBQVc7QUFBQSxlQUNoQjtBQUNILHNCQUFTO0FBQ1Q7QUFBQSxlQUNHO0FBQ0gsc0JBQVM7QUFDVDtBQUFBLGVBQ0c7QUFDSCxzQkFBUztBQUNUO0FBQUEsZUFDRztBQUNILHNCQUFTO0FBQ1Q7QUFBQSxlQUNHO0FBQ0gsc0JBQVM7QUFDVDtBQUFBO0FBRUE7QUFBQTtBQUdKLFlBQUksY0FBYyxPQUFPO0FBQ3ZCLGtCQUFRLElBQUksVUFBVSxXQUFXO0FBQUE7QUFHbkMsb0JBQVksUUFBUTtBQUNwQixnQkFBUTtBQUFBO0FBR1YsYUFBTyxjQUFjLFFBQ2pCLE9BQU8sSUFBSSxVQUFVLFdBQVcsU0FDaEM7QUFBQTtBQUFBO0FBQUE7OztBQzVFTjtBQUFBO0FBT0E7QUFPQSxRQUFJLE1BQU0sUUFBUTtBQUNsQixRQUFJLFFBQVEsSUFBSTtBQUNoQixRQUFJLE1BQU0sSUFBSTtBQU9kLFlBQU8sVUFBVTtBQUNqQixZQUFPLFFBQVEsV0FBVztBQVUxQixzQkFBbUIsS0FBSztBQUN0QixVQUFJLE9BQU0sSUFBSTtBQUVkLFVBQUksU0FBUSxRQUFXO0FBRXJCLGVBQU87QUFBQTtBQUdULFVBQUksU0FBUyxJQUFJO0FBRWpCLFVBQUksTUFBTSxNQUFLLFNBQVM7QUFFdEIsZUFBTztBQUFBO0FBSVQsZUFBUyxVQUFVO0FBQ25CLGFBQU8sT0FBTztBQUVkLGFBQVEsSUFBSSxhQUFhO0FBQUE7QUFXM0IseUJBQXNCLEtBQUs7QUFDekIsVUFBSSxPQUFNLElBQUk7QUFFZCxVQUFJLE9BQU8sU0FBUSxVQUFVO0FBRTNCLGVBQU8sU0FBUztBQUFBO0FBR2xCLFVBQUksU0FBUyxJQUFJO0FBRWpCLFVBQUksTUFBTSxNQUFLLFNBQVM7QUFFdEIsZUFBTztBQUFBO0FBSVQsZUFBUyxVQUFVO0FBQ25CLGFBQU8sT0FBTztBQUVkLGFBQVEsSUFBSSxxQkFBcUI7QUFBQTtBQVduQyx1QkFBb0IsS0FBSztBQUN2QixVQUFJLE9BQU8sUUFBUSxZQUFZLElBQUksV0FBVyxPQUFPLElBQWM7QUFDakUsZUFBTyxNQUFNO0FBQUE7QUFHZixVQUFJLFdBQVc7QUFDZixVQUFJLFFBQVE7QUFDWixVQUFJLFNBQVM7QUFLYixlQUFTLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQ25DLGdCQUFRLElBQUksV0FBVztBQUFBLGVBQ2hCO0FBQ0gsZ0JBQUksV0FBVyxNQUFNO0FBQ25CLHlCQUFXLElBQUksVUFBVSxHQUFHO0FBQzVCLHNCQUFRLElBQUksVUFBVSxJQUFJO0FBQzFCLHVCQUFTLElBQUksVUFBVTtBQUFBO0FBRXpCO0FBQUEsZUFDRztBQUFBLGVBQ0E7QUFBQSxlQUNBO0FBQUEsZUFDQTtBQUFBLGVBQ0E7QUFBQSxlQUNBO0FBQUEsZUFDQTtBQUFBLGVBQ0E7QUFDSCxtQkFBTyxNQUFNO0FBQUE7QUFBQTtBQUluQixVQUFJLE9BQU0sUUFBUSxTQUNkLElBQUksUUFDSjtBQUVKLFdBQUksT0FBTztBQUNYLFdBQUksT0FBTztBQUNYLFdBQUksV0FBVztBQUVmLFVBQUksV0FBVyxNQUFNO0FBQ25CLGFBQUksUUFBUTtBQUNaLGFBQUksU0FBUztBQUFBO0FBR2YsYUFBTztBQUFBO0FBWVQsbUJBQWdCLE1BQUssV0FBVztBQUM5QixhQUFPLE9BQU8sY0FBYyxZQUMxQixjQUFjLFFBQ2IsU0FBUSxVQUFhLHFCQUFxQixRQUMzQyxVQUFVLFNBQVM7QUFBQTtBQUFBO0FBQUE7OztBQzVKdkI7QUFBQTtBQU1BO0FBT0EsUUFBSSxRQUFRLGVBQWlCO0FBQzdCLFFBQUksWUFBWTtBQUNoQixRQUFJLGFBQWE7QUFDakIsUUFBSSxhQUFhO0FBQ2pCLFFBQUksV0FBVztBQUNmLFFBQUksV0FBVztBQUNmLFFBQUksU0FBUztBQU9iLFFBQUksc0JBQXNCO0FBQzFCLFFBQUksaUJBQWlCO0FBR3JCLFFBQUksUUFBUSxPQUFPLGlCQUFpQixhQUNoQyxlQUNBLFNBQVUsSUFBSTtBQUFFLGNBQVEsU0FBUyxHQUFHLEtBQUssTUFBTSxJQUFJO0FBQUE7QUFDdkQsUUFBSSxhQUFhLFdBQVc7QUFTNUIsZ0NBQTZCLFNBQVM7QUFDcEMsVUFBSSxPQUFPLFdBQVcsU0FDbkIsUUFBUSxnQkFBZ0IsUUFDeEIsUUFBUSxxQkFBcUI7QUFFaEMsYUFBTyxvSEFPSyxPQUFPO0FBQUE7QUFVckIsWUFBTyxVQUFVO0FBWWpCLDBCQUF1QixLQUFLLEtBQUssU0FBUztBQUN4QyxVQUFJLE9BQU8sV0FBVztBQUd0QixVQUFJLE1BQU0sS0FBSyxPQUFPLFFBQVEsSUFBSSxZQUFZO0FBRzlDLFVBQUksVUFBVSxLQUFLO0FBRW5CLGFBQU8sU0FBVSxLQUFLO0FBQ3BCLFlBQUk7QUFDSixZQUFJO0FBQ0osWUFBSTtBQUdKLFlBQUksQ0FBQyxPQUFPLFlBQVksTUFBTTtBQUM1QixnQkFBTTtBQUNOO0FBQUE7QUFJRixZQUFJLEtBQUs7QUFFUCxtQkFBUyxtQkFBbUI7QUFFNUIsY0FBSSxXQUFXLFFBQVc7QUFFeEIscUJBQVMsc0JBQXNCO0FBQUEsaUJBQzFCO0FBRUwsc0JBQVUsZ0JBQWdCO0FBQUE7QUFJNUIsZ0JBQU0sZ0JBQWdCLEtBQUssUUFBUTtBQUFBLGVBQzlCO0FBRUwsbUJBQVM7QUFDVCxnQkFBTSxZQUFZLElBQUksU0FBUyxNQUFNLFVBQVUsZ0JBQWdCO0FBQUE7QUFHakUsY0FBTSxjQUFjO0FBR3BCLFlBQUksT0FBTyxTQUFTO0FBQ2xCLGdCQUFNLFNBQVMsS0FBSyxLQUFLO0FBQUE7QUFJM0IsWUFBSSxZQUFZLE1BQU07QUFDcEIsZ0JBQU0sZ0NBQWdDO0FBQ3RDLGNBQUksT0FBTztBQUNYO0FBQUE7QUFJRixhQUFLLEtBQUssS0FBSyxRQUFRLFNBQVM7QUFBQTtBQUFBO0FBWXBDLDZCQUEwQixLQUFLO0FBQzdCLFVBQUksQ0FBQyxJQUFJLFdBQVcsT0FBTyxJQUFJLFlBQVksVUFBVTtBQUNuRCxlQUFPO0FBQUE7QUFHVCxVQUFJLFVBQVUsT0FBTyxPQUFPO0FBQzVCLFVBQUksT0FBTyxPQUFPLEtBQUssSUFBSTtBQUUzQixlQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ3BDLFlBQUksTUFBTSxLQUFLO0FBQ2YsZ0JBQVEsT0FBTyxJQUFJLFFBQVE7QUFBQTtBQUc3QixhQUFPO0FBQUE7QUFhVCw2QkFBMEIsS0FBSyxRQUFRLEtBQUs7QUFDMUMsVUFBSTtBQUVKLFVBQUksUUFBUSxjQUFjO0FBRXhCLGNBQU0sSUFBSTtBQUdWLFlBQUksQ0FBQyxPQUFPLE9BQU8sSUFBSSxhQUFhLFlBQVk7QUFDOUMsZ0JBQU0sSUFBSTtBQUFBO0FBQUE7QUFJZCxhQUFPLE9BQU8sU0FBUyxRQUFRO0FBQUE7QUFXakMsZ0NBQTZCLEtBQUs7QUFFaEMsVUFBSSxPQUFPLElBQUksV0FBVyxZQUFZLElBQUksVUFBVSxPQUFPLElBQUksU0FBUyxLQUFLO0FBQzNFLGVBQU8sSUFBSTtBQUFBO0FBSWIsVUFBSSxPQUFPLElBQUksZUFBZSxZQUFZLElBQUksY0FBYyxPQUFPLElBQUksYUFBYSxLQUFLO0FBQ3ZGLGVBQU8sSUFBSTtBQUFBO0FBR2IsYUFBTztBQUFBO0FBY1QsNkJBQTBCLEtBQUs7QUFDN0IsVUFBSTtBQUNGLGVBQU8sU0FBUyxTQUFTLEtBQUs7QUFBQSxlQUN2QixHQUFQO0FBQ0EsZUFBTztBQUFBO0FBQUE7QUFZWCxtQ0FBZ0MsS0FBSztBQUNuQyxVQUFJLFNBQVMsSUFBSTtBQUdqQixVQUFJLE9BQU8sV0FBVyxZQUFZLFNBQVMsT0FBTyxTQUFTLEtBQUs7QUFDOUQsaUJBQVM7QUFBQTtBQUdYLGFBQU87QUFBQTtBQVdULHlCQUFzQixLQUFLO0FBQ3pCLGFBQU8sT0FBTyxJQUFJLGdCQUFnQixZQUM5QixRQUFRLElBQUksV0FDWixJQUFJO0FBQUE7QUFjVixrQkFBZSxLQUFLLEtBQUssUUFBUSxTQUFTLFNBQVM7QUFDakQsdUJBQWtCO0FBRWhCLFlBQUksT0FBTyxtQkFBbUI7QUFHOUIsWUFBSSxhQUFhO0FBQ2pCLFlBQUksZ0JBQWdCLFNBQVMsUUFBUTtBQUdyQyxZQUFJLGFBQWE7QUFDakIsWUFBSSxhQUFhO0FBQ2pCLFlBQUksYUFBYTtBQUdqQixtQkFBVyxLQUFLO0FBR2hCLFlBQUksVUFBVSwyQkFBMkI7QUFDekMsWUFBSSxVQUFVLDBCQUEwQjtBQUd4QyxZQUFJLFVBQVUsZ0JBQWdCO0FBQzlCLFlBQUksVUFBVSxrQkFBa0IsT0FBTyxXQUFXLE1BQU07QUFFeEQsWUFBSSxJQUFJLFdBQVcsUUFBUTtBQUN6QixjQUFJO0FBQ0o7QUFBQTtBQUdGLFlBQUksSUFBSSxNQUFNO0FBQUE7QUFHaEIsVUFBSSxXQUFXLE1BQU07QUFDbkI7QUFDQTtBQUFBO0FBSUYsYUFBTztBQUdQLGlCQUFXLEtBQUs7QUFDaEIsVUFBSTtBQUFBO0FBV04sd0JBQXFCLEtBQUssU0FBUztBQUNqQyxVQUFJLENBQUMsU0FBUztBQUNaO0FBQUE7QUFHRixVQUFJLE9BQU8sT0FBTyxLQUFLO0FBQ3ZCLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDcEMsWUFBSSxNQUFNLEtBQUs7QUFDZixZQUFJLFVBQVUsS0FBSyxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQzdVL0I7QUFBQTtBQUlBLFFBQUksSUFBSTtBQUNSLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBZ0JaLFlBQU8sVUFBVSxTQUFTLEtBQUssU0FBUztBQUN0QyxnQkFBVSxXQUFXO0FBQ3JCLFVBQUksT0FBTyxPQUFPO0FBQ2xCLFVBQUksU0FBUyxZQUFZLElBQUksU0FBUyxHQUFHO0FBQ3ZDLGVBQU8sTUFBTTtBQUFBLGlCQUNKLFNBQVMsWUFBWSxNQUFNLFNBQVMsT0FBTztBQUNwRCxlQUFPLFFBQVEsT0FBTyxRQUFRLE9BQU8sU0FBUztBQUFBO0FBRWhELFlBQU0sSUFBSSxNQUNSLDBEQUNFLEtBQUssVUFBVTtBQUFBO0FBWXJCLG1CQUFlLEtBQUs7QUFDbEIsWUFBTSxPQUFPO0FBQ2IsVUFBSSxJQUFJLFNBQVMsS0FBSztBQUNwQjtBQUFBO0FBRUYsVUFBSSxRQUFRLHdIQUF3SCxLQUNsSTtBQUVGLFVBQUksQ0FBQyxPQUFPO0FBQ1Y7QUFBQTtBQUVGLFVBQUksSUFBSSxXQUFXLE1BQU07QUFDekIsVUFBSSxPQUFRLE9BQU0sTUFBTSxNQUFNO0FBQzlCLGNBQVE7QUFBQSxhQUNEO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTztBQUFBO0FBRVAsaUJBQU87QUFBQTtBQUFBO0FBWWIsc0JBQWtCLElBQUk7QUFDcEIsVUFBSSxNQUFNLEdBQUc7QUFDWCxlQUFPLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQTtBQUU5QixVQUFJLE1BQU0sR0FBRztBQUNYLGVBQU8sS0FBSyxNQUFNLEtBQUssS0FBSztBQUFBO0FBRTlCLFVBQUksTUFBTSxHQUFHO0FBQ1gsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFFOUIsVUFBSSxNQUFNLEdBQUc7QUFDWCxlQUFPLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQTtBQUU5QixhQUFPLEtBQUs7QUFBQTtBQVdkLHFCQUFpQixJQUFJO0FBQ25CLGFBQU8sT0FBTyxJQUFJLEdBQUcsVUFDbkIsT0FBTyxJQUFJLEdBQUcsV0FDZCxPQUFPLElBQUksR0FBRyxhQUNkLE9BQU8sSUFBSSxHQUFHLGFBQ2QsS0FBSztBQUFBO0FBT1Qsb0JBQWdCLElBQUksR0FBRyxNQUFNO0FBQzNCLFVBQUksS0FBSyxHQUFHO0FBQ1Y7QUFBQTtBQUVGLFVBQUksS0FBSyxJQUFJLEtBQUs7QUFDaEIsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLLE1BQU07QUFBQTtBQUVwQyxhQUFPLEtBQUssS0FBSyxLQUFLLEtBQUssTUFBTSxPQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUN0SjFDO0FBQUE7QUFRQSxjQUFVLFFBQU8sVUFBVSxZQUFZLFFBQVEsWUFBWSxhQUFhO0FBQ3hFLFlBQVEsU0FBUztBQUNqQixZQUFRLFVBQVU7QUFDbEIsWUFBUSxTQUFTO0FBQ2pCLFlBQVEsVUFBVTtBQUNsQixZQUFRLFdBQVc7QUFNbkIsWUFBUSxRQUFRO0FBQ2hCLFlBQVEsUUFBUTtBQVFoQixZQUFRLGFBQWE7QUFNckIsUUFBSTtBQVNKLHlCQUFxQixXQUFXO0FBQzlCLFVBQUksT0FBTyxHQUFHO0FBRWQsV0FBSyxLQUFLLFdBQVc7QUFDbkIsZUFBVSxTQUFRLEtBQUssT0FBUSxVQUFVLFdBQVc7QUFDcEQsZ0JBQVE7QUFBQTtBQUdWLGFBQU8sUUFBUSxPQUFPLEtBQUssSUFBSSxRQUFRLFFBQVEsT0FBTztBQUFBO0FBV3hELHlCQUFxQixXQUFXO0FBRTlCLHVCQUFpQjtBQUVmLFlBQUksQ0FBQyxNQUFNO0FBQVM7QUFFcEIsWUFBSSxPQUFPO0FBR1gsWUFBSSxPQUFPLENBQUMsSUFBSTtBQUNoQixZQUFJLEtBQUssT0FBUSxhQUFZO0FBQzdCLGFBQUssT0FBTztBQUNaLGFBQUssT0FBTztBQUNaLGFBQUssT0FBTztBQUNaLG1CQUFXO0FBR1gsWUFBSSxPQUFPLElBQUksTUFBTSxVQUFVO0FBQy9CLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ3BDLGVBQUssS0FBSyxVQUFVO0FBQUE7QUFHdEIsYUFBSyxLQUFLLFFBQVEsT0FBTyxLQUFLO0FBRTlCLFlBQUksQUFBYSxPQUFPLEtBQUssT0FBekIsVUFBNkI7QUFFL0IsZUFBSyxRQUFRO0FBQUE7QUFJZixZQUFJLFFBQVE7QUFDWixhQUFLLEtBQUssS0FBSyxHQUFHLFFBQVEsaUJBQWlCLFNBQVMsT0FBTyxRQUFRO0FBRWpFLGNBQUksVUFBVTtBQUFNLG1CQUFPO0FBQzNCO0FBQ0EsY0FBSSxZQUFZLFFBQVEsV0FBVztBQUNuQyxjQUFJLEFBQWUsT0FBTyxjQUF0QixZQUFpQztBQUNuQyxnQkFBSSxNQUFNLEtBQUs7QUFDZixvQkFBUSxVQUFVLEtBQUssTUFBTTtBQUc3QixpQkFBSyxPQUFPLE9BQU87QUFDbkI7QUFBQTtBQUVGLGlCQUFPO0FBQUE7QUFJVCxnQkFBUSxXQUFXLEtBQUssTUFBTTtBQUU5QixZQUFJLFFBQVEsTUFBTSxPQUFPLFFBQVEsT0FBTyxRQUFRLElBQUksS0FBSztBQUN6RCxjQUFNLE1BQU0sTUFBTTtBQUFBO0FBR3BCLFlBQU0sWUFBWTtBQUNsQixZQUFNLFVBQVUsUUFBUSxRQUFRO0FBQ2hDLFlBQU0sWUFBWSxRQUFRO0FBQzFCLFlBQU0sUUFBUSxZQUFZO0FBRzFCLFVBQUksQUFBZSxPQUFPLFFBQVEsU0FBOUIsWUFBb0M7QUFDdEMsZ0JBQVEsS0FBSztBQUFBO0FBR2YsYUFBTztBQUFBO0FBV1Qsb0JBQWdCLFlBQVk7QUFDMUIsY0FBUSxLQUFLO0FBRWIsY0FBUSxRQUFRO0FBQ2hCLGNBQVEsUUFBUTtBQUVoQixVQUFJLFFBQVMsUUFBTyxlQUFlLFdBQVcsYUFBYSxJQUFJLE1BQU07QUFDckUsVUFBSSxNQUFNLE1BQU07QUFFaEIsZUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLEtBQUs7QUFDNUIsWUFBSSxDQUFDLE1BQU07QUFBSTtBQUNmLHFCQUFhLE1BQU0sR0FBRyxRQUFRLE9BQU87QUFDckMsWUFBSSxXQUFXLE9BQU8sS0FBSztBQUN6QixrQkFBUSxNQUFNLEtBQUssSUFBSSxPQUFPLE1BQU0sV0FBVyxPQUFPLEtBQUs7QUFBQSxlQUN0RDtBQUNMLGtCQUFRLE1BQU0sS0FBSyxJQUFJLE9BQU8sTUFBTSxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBV3ZELHVCQUFtQjtBQUNqQixjQUFRLE9BQU87QUFBQTtBQVdqQixxQkFBaUIsTUFBTTtBQUNyQixVQUFJLEdBQUc7QUFDUCxXQUFLLElBQUksR0FBRyxNQUFNLFFBQVEsTUFBTSxRQUFRLElBQUksS0FBSyxLQUFLO0FBQ3BELFlBQUksUUFBUSxNQUFNLEdBQUcsS0FBSyxPQUFPO0FBQy9CLGlCQUFPO0FBQUE7QUFBQTtBQUdYLFdBQUssSUFBSSxHQUFHLE1BQU0sUUFBUSxNQUFNLFFBQVEsSUFBSSxLQUFLLEtBQUs7QUFDcEQsWUFBSSxRQUFRLE1BQU0sR0FBRyxLQUFLLE9BQU87QUFDL0IsaUJBQU87QUFBQTtBQUFBO0FBR1gsYUFBTztBQUFBO0FBV1Qsb0JBQWdCLEtBQUs7QUFDbkIsVUFBSSxlQUFlO0FBQU8sZUFBTyxJQUFJLFNBQVMsSUFBSTtBQUNsRCxhQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUN4TVQ7QUFBQTtBQU1BLGNBQVUsUUFBTyxVQUFVO0FBQzNCLFlBQVEsTUFBTTtBQUNkLFlBQVEsYUFBYTtBQUNyQixZQUFRLE9BQU87QUFDZixZQUFRLE9BQU87QUFDZixZQUFRLFlBQVk7QUFDcEIsWUFBUSxVQUFVLEFBQWUsT0FBTyxVQUF0QixlQUNBLEFBQWUsT0FBTyxPQUFPLFdBQTdCLGNBQ0UsT0FBTyxRQUFRLFFBQ2Y7QUFNcEIsWUFBUSxTQUFTO0FBQUEsTUFDZjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUE7QUFXRix5QkFBcUI7QUFJbkIsVUFBSSxPQUFPLFdBQVcsZUFBZSxPQUFPLFdBQVcsT0FBTyxRQUFRLFNBQVMsWUFBWTtBQUN6RixlQUFPO0FBQUE7QUFLVCxhQUFRLE9BQU8sYUFBYSxlQUFlLFNBQVMsbUJBQW1CLFNBQVMsZ0JBQWdCLFNBQVMsU0FBUyxnQkFBZ0IsTUFBTSxvQkFFckksT0FBTyxXQUFXLGVBQWUsT0FBTyxXQUFZLFFBQU8sUUFBUSxXQUFZLE9BQU8sUUFBUSxhQUFhLE9BQU8sUUFBUSxVQUcxSCxPQUFPLGNBQWMsZUFBZSxVQUFVLGFBQWEsVUFBVSxVQUFVLGNBQWMsTUFBTSxxQkFBcUIsU0FBUyxPQUFPLElBQUksT0FBTyxNQUVuSixPQUFPLGNBQWMsZUFBZSxVQUFVLGFBQWEsVUFBVSxVQUFVLGNBQWMsTUFBTTtBQUFBO0FBT3hHLFlBQVEsV0FBVyxJQUFJLFNBQVMsR0FBRztBQUNqQyxVQUFJO0FBQ0YsZUFBTyxLQUFLLFVBQVU7QUFBQSxlQUNmLEtBQVA7QUFDQSxlQUFPLGlDQUFpQyxJQUFJO0FBQUE7QUFBQTtBQVdoRCx3QkFBb0IsTUFBTTtBQUN4QixVQUFJLGFBQVksS0FBSztBQUVyQixXQUFLLEtBQU0sY0FBWSxPQUFPLE1BQzFCLEtBQUssWUFDSixjQUFZLFFBQVEsT0FDckIsS0FBSyxLQUNKLGNBQVksUUFBUSxPQUNyQixNQUFNLFFBQVEsU0FBUyxLQUFLO0FBRWhDLFVBQUksQ0FBQztBQUFXO0FBRWhCLFVBQUksSUFBSSxZQUFZLEtBQUs7QUFDekIsV0FBSyxPQUFPLEdBQUcsR0FBRyxHQUFHO0FBS3JCLFVBQUksUUFBUTtBQUNaLFVBQUksUUFBUTtBQUNaLFdBQUssR0FBRyxRQUFRLGVBQWUsU0FBUyxPQUFPO0FBQzdDLFlBQUksQUFBUyxVQUFUO0FBQWdCO0FBQ3BCO0FBQ0EsWUFBSSxBQUFTLFVBQVQsTUFBZ0I7QUFHbEIsa0JBQVE7QUFBQTtBQUFBO0FBSVosV0FBSyxPQUFPLE9BQU8sR0FBRztBQUFBO0FBVXhCLG1CQUFlO0FBR2IsYUFBTyxBQUFhLE9BQU8sWUFBcEIsWUFDRixRQUFRLE9BQ1IsU0FBUyxVQUFVLE1BQU0sS0FBSyxRQUFRLEtBQUssU0FBUztBQUFBO0FBVTNELGtCQUFjLFlBQVk7QUFDeEIsVUFBSTtBQUNGLFlBQUksQUFBUSxjQUFSLE1BQW9CO0FBQ3RCLGtCQUFRLFFBQVEsV0FBVztBQUFBLGVBQ3RCO0FBQ0wsa0JBQVEsUUFBUSxRQUFRO0FBQUE7QUFBQSxlQUVwQixHQUFOO0FBQUE7QUFBQTtBQVVKLG9CQUFnQjtBQUNkLFVBQUk7QUFDSixVQUFJO0FBQ0YsWUFBSSxRQUFRLFFBQVE7QUFBQSxlQUNkLEdBQU47QUFBQTtBQUdGLFVBQUksQ0FBQyxLQUFLLE9BQU8sWUFBWSxlQUFlLFNBQVMsU0FBUztBQUM1RCxZQUFJLFFBQVEsSUFBSTtBQUFBO0FBR2xCLGFBQU87QUFBQTtBQU9ULFlBQVEsT0FBTztBQWFmLDRCQUF3QjtBQUN0QixVQUFJO0FBQ0YsZUFBTyxPQUFPO0FBQUEsZUFDUCxHQUFQO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ3ZMSjtBQUFBO0FBSUEsUUFBSSxNQUFNLFFBQVE7QUFDbEIsUUFBSSxPQUFPLFFBQVE7QUFRbkIsY0FBVSxRQUFPLFVBQVU7QUFDM0IsWUFBUSxPQUFPO0FBQ2YsWUFBUSxNQUFNO0FBQ2QsWUFBUSxhQUFhO0FBQ3JCLFlBQVEsT0FBTztBQUNmLFlBQVEsT0FBTztBQUNmLFlBQVEsWUFBWTtBQU1wQixZQUFRLFNBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFRakMsWUFBUSxjQUFjLE9BQU8sS0FBSyxRQUFRLEtBQUssT0FBTyxTQUFVLEtBQUs7QUFDbkUsYUFBTyxXQUFXLEtBQUs7QUFBQSxPQUN0QixPQUFPLFNBQVUsS0FBSyxLQUFLO0FBRTVCLFVBQUksT0FBTyxJQUNSLFVBQVUsR0FDVixjQUNBLFFBQVEsYUFBYSxTQUFVLEdBQUcsR0FBRztBQUFFLGVBQU8sRUFBRTtBQUFBO0FBR25ELFVBQUksTUFBTSxRQUFRLElBQUk7QUFDdEIsVUFBSSwyQkFBMkIsS0FBSztBQUFNLGNBQU07QUFBQSxlQUN2Qyw2QkFBNkIsS0FBSztBQUFNLGNBQU07QUFBQSxlQUM5QyxRQUFRO0FBQVEsY0FBTTtBQUFBO0FBQzFCLGNBQU0sT0FBTztBQUVsQixVQUFJLFFBQVE7QUFDWixhQUFPO0FBQUEsT0FDTjtBQVNILFFBQUksS0FBSyxTQUFTLFFBQVEsSUFBSSxVQUFVLE9BQU87QUFFL0MsUUFBSSxBQUFNLE9BQU4sS0FBWSxBQUFNLE9BQU4sR0FBVTtBQUN4QixXQUFLLFVBQVUsV0FBVTtBQUFBLFNBQUk7QUFBQTtBQUcvQixRQUFJLFNBQVMsQUFBTSxPQUFOLElBQVcsUUFBUSxTQUNuQixBQUFNLE9BQU4sSUFBVyxRQUFRLFNBQ25CLDBCQUEwQjtBQU12Qyx5QkFBcUI7QUFDbkIsYUFBTyxZQUFZLFFBQVEsY0FDdkIsUUFBUSxRQUFRLFlBQVksVUFDNUIsSUFBSSxPQUFPO0FBQUE7QUFPakIsWUFBUSxXQUFXLElBQUksU0FBUyxHQUFHO0FBQ2pDLFdBQUssWUFBWSxTQUFTLEtBQUs7QUFDL0IsYUFBTyxLQUFLLFFBQVEsR0FBRyxLQUFLLGFBQ3pCLE1BQU0sTUFBTSxJQUFJLFNBQVMsS0FBSztBQUM3QixlQUFPLElBQUk7QUFBQSxTQUNWLEtBQUs7QUFBQTtBQU9aLFlBQVEsV0FBVyxJQUFJLFNBQVMsR0FBRztBQUNqQyxXQUFLLFlBQVksU0FBUyxLQUFLO0FBQy9CLGFBQU8sS0FBSyxRQUFRLEdBQUcsS0FBSztBQUFBO0FBUzlCLHdCQUFvQixNQUFNO0FBQ3hCLFVBQUksT0FBTyxLQUFLO0FBQ2hCLFVBQUksYUFBWSxLQUFLO0FBRXJCLFVBQUksWUFBVztBQUNiLFlBQUksSUFBSSxLQUFLO0FBQ2IsWUFBSSxTQUFTLFVBQWUsSUFBSSxRQUFRLE9BQU87QUFFL0MsYUFBSyxLQUFLLFNBQVMsS0FBSyxHQUFHLE1BQU0sTUFBTSxLQUFLLE9BQU87QUFDbkQsYUFBSyxLQUFLLFFBQWEsSUFBSSxPQUFPLFFBQVEsU0FBUyxLQUFLLFFBQVE7QUFBQSxhQUMzRDtBQUNMLGFBQUssS0FBSyxJQUFJLE9BQU8sZ0JBQ2pCLE1BQU0sT0FBTyxNQUFNLEtBQUs7QUFBQTtBQUFBO0FBUWhDLG1CQUFlO0FBQ2IsYUFBTyxPQUFPLE1BQU0sS0FBSyxPQUFPLE1BQU0sTUFBTSxhQUFhO0FBQUE7QUFVM0Qsa0JBQWMsWUFBWTtBQUN4QixVQUFJLEFBQVEsY0FBUixNQUFvQjtBQUd0QixlQUFPLFFBQVEsSUFBSTtBQUFBLGFBQ2Q7QUFDTCxnQkFBUSxJQUFJLFFBQVE7QUFBQTtBQUFBO0FBV3hCLG9CQUFnQjtBQUNkLGFBQU8sUUFBUSxJQUFJO0FBQUE7QUFVckIsdUNBQW9DLEtBQUk7QUFDdEMsVUFBSTtBQUNKLFVBQUksV0FBVyxRQUFRLFFBQVE7QUFJL0IsY0FBUSxTQUFTLGdCQUFnQjtBQUFBLGFBQzFCO0FBQ0gsb0JBQVMsSUFBSSxJQUFJLFlBQVk7QUFDN0Isa0JBQU8sUUFBUTtBQUlmLGNBQUksUUFBTyxXQUFXLFFBQU8sUUFBUSxPQUFPO0FBQzFDLG9CQUFPLFFBQVE7QUFBQTtBQUVqQjtBQUFBLGFBRUc7QUFDSCxjQUFJLE1BQUssUUFBUTtBQUNqQixvQkFBUyxJQUFJLElBQUcsZ0JBQWdCLEtBQUksRUFBRSxXQUFXO0FBQ2pELGtCQUFPLFFBQVE7QUFDZjtBQUFBLGFBRUc7QUFBQSxhQUNBO0FBQ0gsY0FBSSxNQUFNLFFBQVE7QUFDbEIsb0JBQVMsSUFBSSxJQUFJLE9BQU87QUFBQSxZQUN0QixJQUFJO0FBQUEsWUFDSixVQUFVO0FBQUEsWUFDVixVQUFVO0FBQUE7QUFPWixrQkFBTyxXQUFXO0FBQ2xCLGtCQUFPLE9BQU87QUFDZCxrQkFBTyxRQUFRO0FBSWYsY0FBSSxRQUFPLFdBQVcsUUFBTyxRQUFRLE9BQU87QUFDMUMsb0JBQU8sUUFBUTtBQUFBO0FBRWpCO0FBQUE7QUFJQSxnQkFBTSxJQUFJLE1BQU07QUFBQTtBQUlwQixjQUFPLEtBQUs7QUFFWixjQUFPLFdBQVc7QUFFbEIsYUFBTztBQUFBO0FBVVQsa0JBQWUsT0FBTztBQUNwQixZQUFNLGNBQWM7QUFFcEIsVUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO0FBQy9CLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDcEMsY0FBTSxZQUFZLEtBQUssTUFBTSxRQUFRLFlBQVksS0FBSztBQUFBO0FBQUE7QUFRMUQsWUFBUSxPQUFPO0FBQUE7QUFBQTs7O0FDdlBmO0FBQUE7QUFLQSxRQUFJLE9BQU8sWUFBWSxlQUFlLFFBQVEsU0FBUyxZQUFZO0FBQ2pFLGNBQU8sVUFBVTtBQUFBLFdBQ1o7QUFDTCxjQUFPLFVBQVU7QUFBQTtBQUFBO0FBQUE7OztBQ1JuQjtBQUFBO0FBQUE7QUFLQSxZQUFPLFVBQVU7QUFVakIsOEJBQTJCLE9BQU8sUUFBUSxPQUFPO0FBQy9DLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDckMsWUFBSSxRQUFRLE1BQU07QUFFbEIsWUFBSSxRQUFRLEtBQUssTUFBTSxRQUFRLFFBQVE7QUFDckMsMkJBQWlCLE9BQU8sUUFBUSxRQUFRO0FBQUEsZUFDbkM7QUFDTCxpQkFBTyxLQUFLO0FBQUE7QUFBQTtBQUloQixhQUFPO0FBQUE7QUFVVCw0QkFBeUIsT0FBTyxRQUFRO0FBQ3RDLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDckMsWUFBSSxRQUFRLE1BQU07QUFFbEIsWUFBSSxNQUFNLFFBQVEsUUFBUTtBQUN4Qix5QkFBZSxPQUFPO0FBQUEsZUFDakI7QUFDTCxpQkFBTyxLQUFLO0FBQUE7QUFBQTtBQUloQixhQUFPO0FBQUE7QUFVVCwwQkFBdUIsT0FBTyxPQUFPO0FBQ25DLFVBQUksU0FBUyxNQUFNO0FBQ2pCLGVBQU8sZUFBZSxPQUFPO0FBQUE7QUFHL0IsYUFBTyxpQkFBaUIsT0FBTyxJQUFJO0FBQUE7QUFBQTtBQUFBOzs7QUM5RHJDO0FBQUE7QUFJQSxZQUFPLFVBQVU7QUFLakIsUUFBSSx3QkFBd0I7QUFrQjVCLDBCQUFzQixNQUFNLE1BQU0sU0FBUztBQUN6QyxnQkFBVSxXQUFXO0FBQ3JCLGFBQU8sUUFBUTtBQUNmLFVBQUksU0FBUyxRQUFRO0FBQ3JCLFVBQUksTUFBTSxRQUFRLFFBQVE7QUFDMUIsVUFBSSxRQUFRLFFBQVEsWUFBWSxLQUFLO0FBQ3JDLFVBQUksY0FBYztBQUNsQixVQUFJLGFBQWEsS0FBSztBQUN0QixVQUFJLElBQUk7QUFDUixVQUFJLE9BQU87QUFDWCxVQUFJO0FBRUosVUFBSSxnQkFBZ0IsUUFBUTtBQUMxQixlQUFPLElBQUksc0JBQXNCLEtBQUssS0FBSyxTQUFTO0FBQ2xELGVBQUssS0FBSztBQUFBLFlBQ1IsTUFBTTtBQUFBLFlBQ04sVUFBVTtBQUFBLFlBQ1YsUUFBUSxFQUFFO0FBQUE7QUFBQTtBQUlkLGVBQU87QUFBQTtBQUdULFVBQUksTUFBTSxRQUFRLE9BQU87QUFJdkIsZUFBTyxLQUFLLElBQUksU0FBVSxPQUFPO0FBQy9CLGlCQUFPLGFBQWEsT0FBTyxNQUFNLFNBQVM7QUFBQTtBQUc1QyxlQUFPLElBQUksT0FBTyxRQUFRLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFBQTtBQUdsRCxhQUFRLE9BQU0sT0FBUSxVQUFTLEtBQUssS0FBSyxLQUFLLFNBQVMsT0FBTyxNQUFNLE1BQU0sT0FDdkUsUUFBUSxTQUFTLFFBQ2pCLFFBQVEsYUFBYSxRQUNyQixRQUFRLDZDQUE2QyxTQUFVLE9BQU8sT0FBTyxRQUFRLEtBQUssU0FBUyxNQUFNLFVBQVUsUUFBUTtBQUMxSCxnQkFBUSxTQUFTO0FBQ2pCLGlCQUFTLFVBQVU7QUFDbkIsa0JBQVUsV0FBVyxXQUFXLFNBQVM7QUFDekMsbUJBQVcsWUFBWTtBQUV2QixhQUFLLEtBQUs7QUFBQSxVQUNSLE1BQU07QUFBQSxVQUNOLFVBQVUsQ0FBQyxDQUFDO0FBQUEsVUFDWixRQUFRLFNBQVM7QUFBQTtBQUduQixZQUFJLFNBQVMsS0FDUixZQUFXLEtBQUssU0FDakIsUUFDQSxTQUFVLFlBQVcsUUFBUSxNQUFNLFVBQ2xDLFFBQU8sYUFBYSxTQUFTLFlBQVksTUFDMUMsTUFDQTtBQUVKLHVCQUFlLE9BQU8sU0FBUyxNQUFNO0FBRXJDLGVBQU87QUFBQSxTQUVSLFFBQVEsT0FBTyxTQUFVLE1BQU0sUUFBTztBQUNyQyxZQUFJLE1BQU0sS0FBSztBQUVmLGVBQU8sUUFBUSxjQUFjLEtBQUssS0FBSyxTQUFTLFFBQU87QUFDckQsZUFBSyxLQUFLLFVBQVU7QUFBQTtBQUd0QixlQUFPO0FBQUE7QUFJWCxhQUFPLElBQUksc0JBQXNCLEtBQUssT0FBTztBQUMzQyxZQUFJLGNBQWM7QUFDbEIsWUFBSSxRQUFRLEVBQUU7QUFFZCxlQUFPLEtBQUssT0FBTyxFQUFFLFdBQVcsTUFBTTtBQUNwQztBQUFBO0FBSUYsWUFBSSxjQUFjLE1BQU0sR0FBRztBQUN6QjtBQUFBO0FBR0YsWUFBSSxhQUFhLE1BQU0sS0FBSyxVQUFVLEtBQUssYUFBYSxHQUFHLFNBQVMsRUFBRSxPQUFPO0FBQzNFLGVBQUssT0FBTyxhQUFhLEdBQUcsR0FBRztBQUFBLFlBQzdCLE1BQU07QUFBQSxZQUNOLFVBQVU7QUFBQSxZQUNWLFFBQVEsRUFBRTtBQUFBO0FBQUE7QUFJZDtBQUFBO0FBSUYsY0FBUyxNQUFNLE1BQU8sS0FBSyxLQUFLLFNBQVMsT0FBTyxNQUFNLEtBQUs7QUFFM0QsYUFBTyxJQUFJLE9BQU8sTUFBTTtBQUFBO0FBQUE7QUFBQTs7O0FDL0gxQjtBQUFBO0FBUUE7QUFPQSxRQUFJLGFBQWE7QUFDakIsUUFBSSxRQUFRLGVBQWlCO0FBTzdCLFFBQUksaUJBQWlCLE9BQU8sVUFBVTtBQU90QyxZQUFPLFVBQVU7QUFFakIsbUJBQWUsTUFBTSxTQUFTLElBQUk7QUFDaEMsVUFBSSxDQUFFLGlCQUFnQixRQUFRO0FBQzVCLGVBQU8sSUFBSSxNQUFNLE1BQU0sU0FBUztBQUFBO0FBR2xDLFlBQU0sVUFBVTtBQUNoQixVQUFJLE9BQU8sV0FBVztBQUV0QixXQUFLLFNBQVM7QUFDZCxXQUFLLE9BQU8sR0FBRyxRQUFRO0FBQ3ZCLFdBQUssU0FBUztBQUNkLFdBQUssT0FBTztBQUNaLFdBQUssU0FBUyxXQUFXLE1BQU0sS0FBSyxPQUFPLElBQUk7QUFHL0MsV0FBSyxPQUFPLFlBQVksU0FBUztBQUNqQyxXQUFLLE9BQU8sYUFBYSxTQUFTLE9BQU8sS0FBSyxRQUFRO0FBQUE7QUFheEQsVUFBTSxVQUFVLGVBQWUsc0JBQXNCLE9BQU8sS0FBSyxLQUFLLE1BQU07QUFDMUUsVUFBSSxLQUFLLEtBQUs7QUFFZCxVQUFJLEdBQUcsV0FBVyxHQUFHO0FBRW5CLGVBQU8sS0FBSztBQUFBO0FBR2QsVUFBSTtBQUNGLFdBQUcsT0FBTyxLQUFLLEtBQUs7QUFBQSxlQUNiLEtBQVA7QUFDQSxhQUFLO0FBQUE7QUFBQTtBQWFULFVBQU0sVUFBVSxpQkFBaUIsZ0JBQWdCLEtBQUssS0FBSyxNQUFNO0FBQy9ELFVBQUksS0FBSyxLQUFLO0FBRWQsVUFBSSxHQUFHLFNBQVMsR0FBRztBQUVqQixlQUFPO0FBQUE7QUFHVCxVQUFJO0FBQ0YsV0FBRyxLQUFLLEtBQUs7QUFBQSxlQUNOLEtBQVA7QUFDQSxhQUFLO0FBQUE7QUFBQTtBQWFULFVBQU0sVUFBVSxRQUFRLGVBQWUsTUFBTTtBQUMzQyxVQUFJO0FBRUosVUFBSSxRQUFRLE1BQU07QUFFaEIsWUFBSSxLQUFLLE9BQU8sWUFBWTtBQUMxQixlQUFLLFNBQVM7QUFDZCxlQUFLLE9BQU87QUFDWixpQkFBTztBQUFBO0FBSVQsWUFBSSxLQUFLLE9BQU8sV0FBVztBQUN6QixlQUFLLFNBQVMsRUFBQyxLQUFLLGFBQWE7QUFDakMsZUFBSyxPQUFPO0FBQ1osaUJBQU87QUFBQTtBQUlULGlCQUFRLEtBQUssT0FBTyxLQUFLO0FBQUE7QUFHM0IsVUFBSSxDQUFDLFFBQU87QUFDVixhQUFLLFNBQVM7QUFDZCxhQUFLLE9BQU87QUFDWixlQUFPO0FBQUE7QUFJVCxXQUFLLFNBQVM7QUFDZCxXQUFLLE9BQU8sT0FBTTtBQUVsQixVQUFJLE9BQU8sS0FBSztBQUNoQixVQUFJLFNBQVMsS0FBSztBQUVsQixlQUFTLElBQUksR0FBRyxJQUFJLE9BQU0sUUFBUSxLQUFLO0FBQ3JDLFlBQUksTUFBTSxLQUFLLElBQUk7QUFDbkIsWUFBSSxPQUFPLElBQUk7QUFDZixZQUFJLE1BQU0sYUFBYSxPQUFNO0FBRTdCLFlBQUksUUFBUSxVQUFhLENBQUUsZUFBZSxLQUFLLFFBQVEsT0FBUTtBQUM3RCxpQkFBTyxRQUFRO0FBQUE7QUFBQTtBQUluQixhQUFPO0FBQUE7QUFXVCwwQkFBc0IsS0FBSztBQUN6QixVQUFJLE9BQU8sUUFBUSxZQUFZLElBQUksV0FBVyxHQUFHO0FBQy9DLGVBQU87QUFBQTtBQUdULFVBQUk7QUFDRixlQUFPLG1CQUFtQjtBQUFBLGVBQ25CLEtBQVA7QUFDQSxZQUFJLGVBQWUsVUFBVTtBQUMzQixjQUFJLFVBQVUsNkJBQThCLE1BQU07QUFDbEQsY0FBSSxTQUFTLElBQUksYUFBYTtBQUFBO0FBR2hDLGNBQU07QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDbExWO0FBQUE7QUFPQTtBQU9BLFFBQUksUUFBTyxRQUFRO0FBT25CLFlBQU8sVUFBVSwyQkFBMkI7QUFPNUMscUNBQWlDO0FBQy9CLGFBQU8sTUFBSyxXQUFXLE1BQUssUUFBUSxJQUFJLHlCQUF5QixRQUFRO0FBQ3ZFLGVBQU8sT0FBTztBQUFBO0FBQUE7QUFTbEIsbUNBQStCO0FBQzdCLGFBQU87QUFBQSxRQUNMO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNsRUo7QUFBQTtBQVFBO0FBT0EsUUFBSSxRQUFRLGVBQWlCO0FBQzdCLFFBQUksVUFBVTtBQUNkLFFBQUksUUFBUTtBQUNaLFFBQUksVUFBVTtBQU9kLFFBQUksUUFBUSxNQUFNLFVBQVU7QUFDNUIsUUFBSSxXQUFXLE9BQU8sVUFBVTtBQU9oQyxZQUFPLFVBQVU7QUFTakIsbUJBQWUsTUFBTTtBQUNuQixXQUFLLE9BQU87QUFDWixXQUFLLFFBQVE7QUFFYixZQUFNLFVBQVU7QUFHaEIsV0FBSyxVQUFVO0FBQUE7QUFRakIsVUFBTSxVQUFVLGtCQUFrQix5QkFBeUIsUUFBUTtBQUNqRSxVQUFJLEtBQUssUUFBUSxNQUFNO0FBQ3JCLGVBQU87QUFBQTtBQUdULFVBQUksT0FBTyxPQUFPO0FBRWxCLFVBQUksU0FBUyxVQUFVLENBQUMsS0FBSyxRQUFRLFNBQVM7QUFDNUMsZUFBTztBQUFBO0FBR1QsYUFBTyxRQUFRLEtBQUssUUFBUTtBQUFBO0FBUTlCLFVBQU0sVUFBVSxXQUFXLG9CQUFvQjtBQUM3QyxVQUFJLFdBQVUsT0FBTyxLQUFLLEtBQUs7QUFHL0IsVUFBSSxLQUFLLFFBQVEsT0FBTyxDQUFDLEtBQUssUUFBUSxNQUFNO0FBQzFDLGlCQUFRLEtBQUs7QUFBQTtBQUdmLGVBQVMsSUFBSSxHQUFHLElBQUksU0FBUSxRQUFRLEtBQUs7QUFFdkMsaUJBQVEsS0FBSyxTQUFRLEdBQUc7QUFBQTtBQUcxQixhQUFPO0FBQUE7QUFRVCxVQUFNLFVBQVUsV0FBVyxrQkFBa0IsS0FBSyxLQUFLLE1BQU07QUFDM0QsVUFBSSxNQUFNO0FBQ1YsVUFBSSxRQUFRLEtBQUs7QUFDakIsVUFBSSxPQUFPO0FBRVgsVUFBSSxNQUFNLFdBQVcsR0FBRztBQUN0QixlQUFPO0FBQUE7QUFHVCxVQUFJLFNBQVMsSUFBSSxPQUFPO0FBQ3hCLFVBQUksV0FBVyxVQUFVLENBQUMsS0FBSyxRQUFRLFNBQVM7QUFDOUMsaUJBQVM7QUFBQTtBQUdYLFVBQUksUUFBUTtBQUVaO0FBRUEsb0JBQWMsS0FBSztBQUVqQixZQUFJLE9BQU8sUUFBUSxTQUFTO0FBQzFCLGlCQUFPO0FBQUE7QUFJVCxZQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLGlCQUFPLEtBQUs7QUFBQTtBQUlkLFlBQUksRUFBRSxPQUFPLEtBQUs7QUFDaEIsaUJBQU8sYUFBYSxNQUFNO0FBQUE7QUFHNUIsWUFBSSxRQUFRLE1BQU07QUFHbEIsWUFBSSxDQUFDLE9BQU87QUFDVixpQkFBTyxLQUFLO0FBQUE7QUFHZCxZQUFJLE1BQU0sVUFBVSxNQUFNLFdBQVcsUUFBUTtBQUMzQyxlQUFLO0FBQUEsbUJBQ0ksS0FBSztBQUNkLGdCQUFNLGFBQWEsS0FBSyxLQUFLLEtBQUs7QUFBQSxlQUM3QjtBQUNMLGdCQUFNLGVBQWUsS0FBSyxLQUFLO0FBQUE7QUFHakMsZUFBTztBQUFBO0FBQUE7QUFnQ1gsVUFBTSxVQUFVLE1BQU0sZUFBZTtBQUNuQyxVQUFJLFVBQVUsUUFBUSxNQUFNLEtBQUs7QUFFakMsZUFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUN2QyxZQUFJLFNBQVMsUUFBUTtBQUVyQixZQUFJLE9BQU8sV0FBVyxZQUFZO0FBQ2hDLGNBQUksT0FBTyxTQUFTLEtBQUs7QUFDekIsY0FBSSxNQUFNLHdEQUF3RDtBQUNsRSxnQkFBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixZQUFJLFFBQVEsTUFBTSxLQUFLLElBQUk7QUFDM0IsY0FBTSxTQUFTO0FBRWYsYUFBSyxRQUFRLE9BQU87QUFDcEIsYUFBSyxNQUFNLEtBQUs7QUFBQTtBQUdsQixhQUFPO0FBQUE7QUFHVCxZQUFRLFFBQVEsU0FBUyxRQUFPO0FBQzlCLFlBQU0sVUFBVSxVQUFVLFdBQVU7QUFDbEMsWUFBSSxVQUFVLFFBQVEsTUFBTSxLQUFLO0FBRWpDLGlCQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3ZDLGNBQUksU0FBUyxRQUFRO0FBRXJCLGNBQUksT0FBTyxXQUFXLFlBQVk7QUFDaEMsZ0JBQUksT0FBTyxTQUFTLEtBQUs7QUFDekIsZ0JBQUksTUFBTSxXQUFXLFNBQVMsK0NBQStDO0FBQzdFLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGdCQUFNLFNBQVMsUUFBUSxLQUFLO0FBRTVCLGNBQUksUUFBUSxNQUFNLEtBQUssSUFBSTtBQUMzQixnQkFBTSxTQUFTO0FBRWYsZUFBSyxRQUFRLFVBQVU7QUFDdkIsZUFBSyxNQUFNLEtBQUs7QUFBQTtBQUdsQixlQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQzlOWDtBQUFBO0FBZUEsY0FBVSxRQUFPLFVBQVUsU0FBUyxHQUFHLEdBQUU7QUFDdkMsVUFBSSxLQUFLLEdBQUc7QUFDVixpQkFBUyxPQUFPLEdBQUc7QUFDakIsWUFBRSxPQUFPLEVBQUU7QUFBQTtBQUFBO0FBR2YsYUFBTztBQUFBO0FBQUE7QUFBQTs7O0FDckJUO0FBQUE7QUFRQTtBQU9BLFFBQUksUUFBUTtBQUNaLFFBQUksUUFBUTtBQUNaLFFBQUksVUFBVTtBQUNkLFFBQUksUUFBUTtBQUNaLFFBQUksUUFBUSxlQUFpQjtBQUM3QixRQUFJLFlBQVksZUFBZ0I7QUFDaEMsUUFBSSxVQUFVO0FBQ2QsUUFBSSxXQUFXO0FBQ2YsUUFBSSxpQkFBaUI7QUFPckIsUUFBSSxlQUFlO0FBQ25CLFFBQUksUUFBUSxNQUFNLFVBQVU7QUFDNUIsUUFBSSxXQUFXLE9BQU8sVUFBVTtBQVVoQyxRQUFJLFFBQVEsUUFBTyxVQUFVLFNBQVMsU0FBUztBQUM3QyxVQUFJLE9BQU8sV0FBVztBQUV0QixzQkFBZ0IsS0FBSyxLQUFLLE1BQU07QUFDOUIsZUFBTyxPQUFPLEtBQUssS0FBSztBQUFBO0FBSTFCLHFCQUFlLFFBQVE7QUFFdkIsYUFBTyxTQUFTO0FBQ2hCLGFBQU8sVUFBVTtBQUNqQixhQUFPLGdCQUFnQixLQUFLO0FBQzVCLGFBQU8sY0FBYyxLQUFLO0FBQzFCLGFBQU8sU0FBUyxLQUFLO0FBQ3JCLGFBQU8sUUFBUTtBQUVmLGFBQU87QUFBQTtBQXFDVCxVQUFNLFFBQVEsZUFBZSxNQUFNLElBQUk7QUFFckMsVUFBSSxPQUFPLFNBQVMsWUFBWTtBQUM5QixrQkFBVTtBQUNWLGFBQUssUUFBUSxLQUFLO0FBQ2xCO0FBQUE7QUFJRixVQUFJLFNBQVMsS0FBSztBQUNsQixVQUFJLE1BQU0sT0FBTztBQUNqQixVQUFJO0FBRUosVUFBSSxLQUFLLE9BQU8sS0FBSztBQUNuQixrQkFBVSxrQkFBa0IsS0FBSyxVQUFVLFFBQVEsNkJBQTZCLEtBQUssVUFBVSxLQUFLLE1BQU0sTUFBTTtBQUNoSCxlQUFPLEtBQUssTUFBTTtBQUFBO0FBR3BCLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLEdBQUc7QUFDNUIsWUFBSSxNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUs7QUFDN0IsZUFBSztBQUFBO0FBQUE7QUFNVCxVQUFJLEFBQWUsT0FBTyxPQUF0QixZQUEwQjtBQUM1QixjQUFNLElBQUksTUFBTSw4QkFBOEIsT0FBTyxXQUFXO0FBQUE7QUFHbEUsTUFBQyxNQUFLLE9BQU8sUUFBUSxLQUFLLE9BQU8sU0FBUyxJQUFJLEtBQUs7QUFDbkQsYUFBTztBQUFBO0FBUVQsVUFBTSxTQUFTLGdCQUFnQixLQUFLLEtBQUssS0FBSztBQUM1QyxVQUFJLE9BQU87QUFFWCxZQUFNLHFCQUFxQixJQUFJLFFBQVEsSUFBSTtBQUUzQyxVQUFJLE1BQU07QUFDVixVQUFJLFlBQVksYUFBYSxJQUFJLFFBQVE7QUFDekMsVUFBSSxVQUFVO0FBQ2QsVUFBSSxhQUFhO0FBQ2pCLFVBQUksT0FBTztBQUNYLFVBQUksY0FBYztBQUlsQixVQUFJLFVBQVU7QUFHZCxVQUFJLFFBQVEsS0FBSztBQUdqQixVQUFJLGVBQWUsSUFBSTtBQUN2QixVQUFJLFlBQVksSUFBSSxXQUFXO0FBQy9CLFVBQUksT0FBTyxRQUFRLEtBQUssS0FBSyxXQUFXLFFBQVE7QUFHaEQsVUFBSSxPQUFPO0FBR1gsVUFBSSxJQUFJLFdBQVcsV0FBVztBQUM1QixlQUFPLEtBQUssTUFBTSxTQUFTLEtBQUssS0FBSztBQUNuQyxjQUFJLE9BQU8sUUFBUSxXQUFXO0FBQUcsbUJBQU8sSUFBSTtBQUM1Qyw4QkFBb0IsS0FBSyxTQUFTO0FBQUE7QUFBQTtBQUt0QyxVQUFJLFVBQVU7QUFDZCxVQUFJLGNBQWMsSUFBSSxlQUFlLElBQUk7QUFFekM7QUFFQSxvQkFBYyxLQUFLO0FBQ2pCLFlBQUksYUFBYSxRQUFRLFVBQ3JCLE9BQ0E7QUFHSixZQUFJLFlBQVk7QUFDZCxjQUFJLE1BQU0sSUFBSSxJQUFJLE1BQU07QUFDeEIsdUJBQWE7QUFBQTtBQUlmLFlBQUksUUFBUSxXQUFXLEdBQUc7QUFDeEIsY0FBSSxVQUFVO0FBQ2QsY0FBSSxNQUFNLFlBQVksVUFBVSxJQUFJLElBQUksTUFBTSxVQUFVO0FBQ3hELG9CQUFVO0FBQUE7QUFJWixZQUFJLGVBQWUsVUFBVTtBQUMzQix1QkFBYSxNQUFNO0FBQ25CO0FBQUE7QUFJRixZQUFJLE9BQU8sTUFBTSxRQUFRO0FBQ3ZCLHVCQUFhLE1BQU07QUFDbkI7QUFBQTtBQUlGLFlBQUksRUFBRSxPQUFPLEtBQUs7QUFDaEIsaUJBQU8sYUFBYSxNQUFNO0FBQUE7QUFJNUIsWUFBSSxPQUFPLFlBQVk7QUFFdkIsWUFBSSxRQUFRLE1BQU07QUFDaEIsaUJBQU8sS0FBSztBQUFBO0FBSWQsWUFBSTtBQUNKLFlBQUk7QUFDSixZQUFJO0FBRUosZUFBTyxVQUFVLFFBQVEsTUFBTSxNQUFNLFFBQVE7QUFDM0Msa0JBQVEsTUFBTTtBQUNkLGtCQUFRLFdBQVcsT0FBTztBQUMxQixrQkFBUSxNQUFNO0FBRWQsY0FBSSxPQUFPLFVBQVUsV0FBVztBQUU5Qix5QkFBYSxjQUFjO0FBQUE7QUFHN0IsY0FBSSxVQUFVLE1BQU07QUFDbEI7QUFBQTtBQUdGLGNBQUksQ0FBQyxPQUFPO0FBRVY7QUFBQTtBQUdGLGNBQUksWUFBWTtBQUVkLG9CQUFRO0FBQ1I7QUFBQTtBQUdGLGNBQUksU0FBUyxJQUFJO0FBQ2pCLGNBQUksYUFBYSxNQUFNLGdCQUFnQjtBQUd2QyxjQUFJLENBQUMsY0FBYyxXQUFXLFdBQVc7QUFDdkMsMEJBQWMsU0FBUyxNQUFNO0FBQUE7QUFJL0IsY0FBSSxDQUFDLGNBQWMsV0FBVyxRQUFRO0FBQ3BDLG9CQUFRO0FBQUE7QUFBQTtBQUtaLFlBQUksVUFBVSxNQUFNO0FBQ2xCLGlCQUFPLEtBQUs7QUFBQTtBQUlkLFlBQUksT0FBTztBQUNULGNBQUksUUFBUTtBQUFBO0FBSWQsWUFBSSxTQUFTLEtBQUssY0FDZCxZQUFZLE1BQU0sUUFBUSxnQkFDMUIsTUFBTTtBQUNWLFlBQUksWUFBWSxNQUFNO0FBR3RCLGFBQUssZUFBZSxPQUFPLGFBQWEsS0FBSyxLQUFLLFNBQVUsTUFBSztBQUMvRCxjQUFJLE1BQUs7QUFDUCxpQkFBSyxjQUFjO0FBQUEscUJBQ1YsT0FBTztBQUNoQixrQkFBTSxlQUFlLEtBQUssS0FBSztBQUFBLGlCQUMxQjtBQUNMLHdCQUFZLE9BQU8sWUFBWSxXQUFXO0FBQUE7QUFHNUMsaUJBQU87QUFBQTtBQUFBO0FBSVgsMkJBQXFCLE9BQU8sWUFBWSxXQUFXLE1BQU07QUFDdkQsWUFBSSxVQUFVLFdBQVcsR0FBRztBQUUxQixjQUFJLGNBQWMsS0FBSyxNQUFNLEdBQUcsVUFBVSxTQUFTO0FBQ2pELGlCQUFLO0FBQ0w7QUFBQTtBQUlGLGNBQUksSUFBSSxLQUFLLFVBQVU7QUFDdkIsY0FBSSxLQUFLLE1BQU0sT0FBTyxNQUFNO0FBQUssbUJBQU8sS0FBSztBQUk3QyxnQkFBTSxnQ0FBZ0MsV0FBVyxJQUFJO0FBQ3JELG9CQUFVO0FBQ1YsY0FBSSxNQUFNLFlBQVksSUFBSSxJQUFJLE1BQU0sVUFBVSxTQUFTLFFBQVE7QUFHL0QsY0FBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLE9BQU8sS0FBSztBQUNwQyxnQkFBSSxNQUFNLE1BQU0sSUFBSTtBQUNwQix5QkFBYTtBQUFBO0FBSWYsY0FBSSxVQUFVLFlBQWEsU0FBUSxRQUFRLFNBQVMsT0FBTyxNQUN2RCxRQUFRLFVBQVUsR0FBRyxRQUFRLFNBQVMsS0FDdEM7QUFBQTtBQUdOLGNBQU0sY0FBYyxNQUFNLE1BQU0sV0FBVyxJQUFJO0FBRS9DLFlBQUksWUFBWTtBQUNkLGdCQUFNLGFBQWEsWUFBWSxLQUFLLEtBQUs7QUFBQSxlQUNwQztBQUNMLGdCQUFNLGVBQWUsS0FBSyxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBVXJDLFVBQU0saUJBQWlCLHdCQUF3QixPQUFPLFFBQVEsS0FBSyxLQUFLLE1BQU07QUFDNUUsVUFBSSxTQUFTLEtBQUs7QUFHbEIsVUFBSSxPQUFPLE1BQU07QUFHakIsVUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXLEdBQUc7QUFDOUIsZUFBTztBQUFBO0FBR1QsVUFBSSxJQUFJO0FBQ1IsVUFBSTtBQUNKLFVBQUksYUFBYTtBQUNqQixVQUFJO0FBQ0osVUFBSTtBQUNKLFVBQUk7QUFDSixVQUFJO0FBSUoscUJBQWUsS0FBSztBQUNsQixZQUFJLEtBQUs7QUFDUCxpQkFBTyxLQUFLO0FBQUE7QUFHZCxZQUFJLEtBQUssS0FBSyxRQUFTO0FBQ3JCLGlCQUFPO0FBQUE7QUFHVCxxQkFBYTtBQUNiLGNBQU0sS0FBSztBQUNYLGVBQU8sSUFBSTtBQUNYLG1CQUFXLElBQUksT0FBTztBQUN0Qix5QkFBaUIsT0FBTztBQUN4QixzQkFBYyxPQUFPO0FBRXJCLFlBQUksYUFBYSxVQUFhLENBQUMsZ0JBQWdCO0FBQzdDLGlCQUFPO0FBQUE7QUFJVCxZQUFJLGVBQWdCLGFBQVksVUFBVSxZQUNwQyxZQUFZLFNBQVMsWUFBWSxVQUFVLFVBQVc7QUFFMUQsY0FBSSxPQUFPLFFBQVEsWUFBWTtBQUcvQixpQkFBTyxNQUFNLFlBQVk7QUFBQTtBQUczQixlQUFPLFFBQVEsY0FBYztBQUFBLFVBQzNCLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQTtBQUdUO0FBQUE7QUFJRiw2QkFBdUIsS0FBSztBQUMxQixZQUFJLEtBQUssZUFBZTtBQUd4QixvQkFBWSxRQUFRLElBQUksT0FBTyxJQUFJO0FBRW5DLFlBQUksS0FBSztBQUVQLHNCQUFZLFFBQVE7QUFDcEIsZ0JBQU07QUFDTjtBQUFBO0FBR0YsWUFBSSxDQUFDO0FBQUksaUJBQU87QUFFaEIsWUFBSTtBQUNGLGFBQUcsS0FBSyxLQUFLLGVBQWUsVUFBVSxJQUFJO0FBQUEsaUJBQ25DLEdBQVA7QUFDQSx3QkFBYztBQUFBO0FBQUE7QUFJbEI7QUFBQTtBQWtCRixVQUFNLE1BQU0sYUFBYSxJQUFJO0FBQzNCLFVBQUksU0FBUztBQUNiLFVBQUksT0FBTztBQUlYLFVBQUksT0FBTyxPQUFPLFlBQVk7QUFDNUIsWUFBSSxNQUFNO0FBRVYsZUFBTyxNQUFNLFFBQVEsUUFBUSxJQUFJLFdBQVcsR0FBRztBQUM3QyxnQkFBTSxJQUFJO0FBQUE7QUFJWixZQUFJLE9BQU8sUUFBUSxZQUFZO0FBQzdCLG1CQUFTO0FBQ1QsaUJBQU87QUFBQTtBQUFBO0FBSVgsVUFBSSxZQUFZLFFBQVEsTUFBTSxLQUFLLFdBQVc7QUFFOUMsVUFBSSxVQUFVLFdBQVcsR0FBRztBQUMxQixjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLGVBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7QUFDekMsWUFBSSxLQUFLLFVBQVU7QUFFbkIsWUFBSSxPQUFPLE9BQU8sWUFBWTtBQUM1QixnQkFBTSxJQUFJLFVBQVUsMkRBQTJELFFBQVE7QUFBQTtBQUl6RixjQUFNLGFBQWEsTUFBTSxHQUFHLFFBQVE7QUFFcEMsWUFBSSxRQUFRLElBQUksTUFBTSxNQUFNO0FBQUEsVUFDMUIsV0FBVyxLQUFLO0FBQUEsVUFDaEIsUUFBUTtBQUFBLFVBQ1IsS0FBSztBQUFBLFdBQ0o7QUFFSCxjQUFNLFFBQVE7QUFFZCxhQUFLLE1BQU0sS0FBSztBQUFBO0FBR2xCLGFBQU87QUFBQTtBQWdCVCxVQUFNLFFBQVEsZUFBZSxNQUFNO0FBQ2pDLFVBQUksU0FBUSxJQUFJLE1BQU07QUFFdEIsVUFBSSxRQUFRLElBQUksTUFBTSxNQUFNO0FBQUEsUUFDMUIsV0FBVyxLQUFLO0FBQUEsUUFDaEIsUUFBUSxLQUFLO0FBQUEsUUFDYixLQUFLO0FBQUEsU0FDSixPQUFNLFNBQVMsS0FBSztBQUV2QixZQUFNLFFBQVE7QUFFZCxXQUFLLE1BQU0sS0FBSztBQUNoQixhQUFPO0FBQUE7QUFJVCxZQUFRLE9BQU8sT0FBTyxRQUFRLFNBQVMsUUFBTztBQUM1QyxZQUFNLFVBQVUsU0FBUyxNQUFLO0FBQzVCLFlBQUksUUFBUSxLQUFLLE1BQU07QUFDdkIsY0FBTSxRQUFRLE1BQU0sT0FBTyxNQUFNLEtBQUssV0FBVztBQUNqRCxlQUFPO0FBQUE7QUFBQTtBQUtYLDJCQUF1QixNQUFNLFVBQVU7QUFDckMsZUFBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN4QyxZQUFJLFNBQVMsU0FBUztBQUN0QixZQUFJLEtBQUssUUFBUSxZQUFZLElBQUk7QUFDL0IsZUFBSyxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBTWhCLHlCQUFxQixLQUFLO0FBQ3hCLFVBQUk7QUFDRixlQUFPLFNBQVMsS0FBSztBQUFBLGVBQ2QsS0FBUDtBQUNBLGVBQU87QUFBQTtBQUFBO0FBS1gsMEJBQXNCLEtBQUs7QUFDekIsVUFBSSxPQUFPLFFBQVEsWUFBWSxJQUFJLFdBQVcsS0FBSyxJQUFJLE9BQU8sS0FBSztBQUNqRSxlQUFPO0FBQUE7QUFHVCxVQUFJLGNBQWMsSUFBSSxRQUFRO0FBQzlCLFVBQUksYUFBYSxnQkFBZ0IsS0FDN0IsY0FDQSxJQUFJO0FBQ1IsVUFBSSxZQUFZLElBQUksTUFBTSxHQUFHLFlBQVksUUFBUTtBQUVqRCxhQUFPLGNBQWMsS0FDakIsSUFBSSxVQUFVLEdBQUcsSUFBSSxRQUFRLEtBQUssSUFBSSxjQUN0QztBQUFBO0FBSU4scUJBQWlCLEtBQUs7QUFDcEIsVUFBSSxPQUFPLE9BQU87QUFFbEIsVUFBSSxTQUFTLFVBQVU7QUFDckIsZUFBTztBQUFBO0FBSVQsYUFBTyxTQUFTLEtBQUssS0FDbEIsUUFBUSxjQUFjO0FBQUE7QUFXM0Isd0JBQW9CLE9BQU8sTUFBTTtBQUMvQixVQUFJO0FBQ0YsZUFBTyxNQUFNLE1BQU07QUFBQSxlQUNaLEtBQVA7QUFDQSxlQUFPO0FBQUE7QUFBQTtBQUtYLHlCQUFxQixRQUFRLFFBQVE7QUFDbkMsVUFBSSxPQUFPLFdBQVcsWUFBWSxDQUFDLFFBQVE7QUFDekMsZUFBTztBQUFBO0FBSVQsVUFBSSxNQUFNLE1BQU0sSUFBSTtBQUdwQixVQUFJLENBQUUsTUFBSyxXQUFXLENBQUUsTUFBSyxTQUFTO0FBQ3BDLGVBQU8sTUFBTSxLQUFLO0FBQUE7QUFHcEIsVUFBSSxJQUFJO0FBQ1IsVUFBSSxJQUFJO0FBR1IsYUFBTyxLQUFLLFFBQVE7QUFDbEI7QUFBQTtBQUdGLGFBQU8sS0FBSyxRQUFRO0FBQ2xCO0FBQUE7QUFJRixXQUFLLEtBQUssS0FBSyxHQUFHLEtBQUs7QUFDckIsZUFBTyxJQUFJLEtBQUssT0FBTztBQUd2QixZQUFJLElBQUksR0FBRztBQUNULGlCQUFPLE9BQU87QUFBQTtBQUFBO0FBSWxCLGFBQU8sTUFBTSxLQUFLO0FBQUE7QUFJcEIscUJBQWlCLElBQUksS0FBSztBQUN4QixVQUFJLFFBQVEsSUFBSSxNQUFNLFVBQVUsU0FBUztBQUN6QyxVQUFJLE9BQU8sSUFBSSxNQUFNLFVBQVUsU0FBUztBQUV4QyxlQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQ3JDLGNBQU0sS0FBSyxVQUFVLElBQUk7QUFDekIsYUFBSyxLQUFLLElBQUksTUFBTTtBQUFBO0FBR3RCLGFBQU8sV0FBWTtBQUVqQixpQkFBUyxLQUFJLEdBQUcsS0FBSSxNQUFNLFFBQVEsTUFBSztBQUNyQyxjQUFJLE1BQU0sT0FBTSxLQUFLO0FBQUE7QUFHdkIsZUFBTyxHQUFHLE1BQU0sTUFBTTtBQUFBO0FBQUE7QUFLMUIsaUNBQTZCLEtBQUssU0FBUyxNQUFNO0FBQy9DLFVBQUk7QUFDRixZQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ3hCLFlBQUksSUFBSSxTQUFTO0FBQ2pCLFlBQUksS0FBSztBQUFBLGVBQ0YsS0FBUDtBQUNBLGFBQUs7QUFBQTtBQUFBO0FBS1Qsa0JBQWMsS0FBSyxJQUFJO0FBQ3JCLGFBQU8saUJBQWlCO0FBQ3RCLFlBQUksT0FBTyxJQUFJLE1BQU0sVUFBVSxTQUFTO0FBRXhDLGFBQUssS0FBSztBQUNWLGlCQUFTLElBQUksR0FBRyxNQUFNLFVBQVUsUUFBUSxJQUFJLEtBQUssS0FBSztBQUNwRCxlQUFLLElBQUksS0FBSyxVQUFVO0FBQUE7QUFHMUIsV0FBRyxNQUFNLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDOXBCbkI7QUFBQTtBQVFBO0FBT0EsUUFBSSxpQkFBaUI7QUFZckIsWUFBUSxPQUFPLFNBQVMsS0FBSTtBQUMxQixhQUFPLHFCQUFxQixLQUFLLEtBQUssTUFBSztBQUN6QyxZQUFJLElBQUksUUFBUTtBQUFpQixjQUFJLFVBQVUsZ0JBQWdCO0FBQy9ELFlBQUksTUFBTTtBQUNWLFlBQUksTUFBTTtBQUNWLFlBQUksT0FBTztBQUVYLHVCQUFlLEtBQUssSUFBSTtBQUN4Qix1QkFBZSxLQUFLLElBQUk7QUFFeEIsWUFBSSxTQUFTLElBQUksVUFBVSxPQUFPLE9BQU87QUFFekM7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDdkNKO0FBQUE7QUFRQTtBQU1BLFFBQUksUUFBUTtBQUNaLFFBQUksV0FBVztBQUNmLFFBQUksS0FBSztBQVFULFlBQU8sVUFBVSxlQUFlLFNBQVM7QUFDdkMsVUFBSSxPQUFPLE1BQU0sSUFBSTtBQUNyQixVQUFJLGFBQWEsR0FBRztBQUVwQixVQUFJLE9BQU8sWUFBWSxZQUFZO0FBQ2pDLHFCQUFhO0FBQ2IsZUFBTztBQUFBO0FBR1QsVUFBSSxTQUFTLFVBQWEsS0FBSyxvQkFBb0IsUUFBVztBQUU1RCxhQUFLLGtCQUFrQjtBQUFBO0FBR3pCLGFBQU8sZ0JBQWUsS0FBSyxLQUFLLE1BQUs7QUFDbkMsWUFBSSxDQUFDLElBQUksT0FBTztBQUNkLGNBQUksTUFBTSxTQUFTLEtBQUs7QUFDeEIsY0FBSSxRQUFRLFdBQVcsS0FBSztBQUFBO0FBRzlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQzVDSjtBQUFBO0FBUUE7QUFPQSxRQUFJLFFBQVEsZUFBaUI7QUFDN0IsUUFBSSxPQUFPLFFBQVE7QUFDbkIsUUFBSSxNQUFLLFFBQVE7QUFPakIsUUFBSSxVQUFVLEtBQUs7QUFDbkIsUUFBSSxXQUFXLEtBQUs7QUFDcEIsUUFBSSxVQUFVLEtBQUs7QUFDbkIsUUFBSSxPQUFPLEtBQUs7QUFDaEIsUUFBSSxVQUFVLEtBQUs7QUFPbkIsWUFBTyxVQUFVO0FBZ0JqQixrQkFBYyxNQUFNLFNBQVM7QUFDM0IsVUFBSSxPQUFPLFdBQVc7QUFFdEIsV0FBSyxnQkFBZ0IsS0FBSztBQUMxQixXQUFLLE1BQU0sUUFBUTtBQUNuQixXQUFLLE9BQU87QUFDWixXQUFLLE9BQU8sS0FBSztBQUVqQixVQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsS0FBSyxlQUFlO0FBQ3BDLGNBQU0sSUFBSSxNQUFNO0FBQUE7QUFHbEIsVUFBSSxXQUFXO0FBRWYsVUFBSSxDQUFDLEtBQUssS0FBSztBQUViLGFBQUssTUFBTSxLQUFLLGNBQWMsT0FBTyxNQUNqQyxNQUFNLEtBQUssZ0JBQ1gsS0FBSztBQUVULG9CQUFZLEtBQUs7QUFBQTtBQUduQixVQUFJLENBQUMsS0FBSyxRQUFRLEtBQUssTUFBTTtBQUUzQixZQUFJLE1BQU0sS0FBSyxJQUFJLE1BQU07QUFDekIsY0FBTSxnQkFBZ0I7QUFHdEIsWUFBSSxLQUFLLFFBQVEsS0FBSztBQUV0QixZQUFJLE9BQU8sT0FBTyxZQUFZO0FBQzVCLGdCQUFNLElBQUksTUFBTSxhQUFhLE1BQU07QUFBQTtBQUdyQyxhQUFLLFFBQVEsS0FBSyxPQUFPO0FBQUE7QUFJM0IsV0FBSyxTQUFTLEtBQUssUUFBUSxLQUFLO0FBR2hDLFdBQUssT0FBTyxLQUFLLE9BQU87QUFBQTtBQVUxQixTQUFLLFVBQVUsU0FBUyxpQkFBZ0IsTUFBTTtBQUM1QyxVQUFJO0FBQ0osVUFBSSxRQUFRLEdBQUcsT0FBTyxLQUFLO0FBRTNCLFlBQU0sZUFBZTtBQUVyQixlQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sVUFBVSxDQUFDLE9BQU0sS0FBSztBQUM5QyxZQUFJLE9BQU8sTUFBTTtBQUdqQixZQUFJLE1BQU0sUUFBUSxNQUFNO0FBQ3hCLFlBQUksTUFBTSxRQUFRO0FBQ2xCLFlBQUksT0FBTyxTQUFTO0FBR3BCLGdCQUFPLEtBQUssUUFBUSxLQUFLO0FBQUE7QUFHM0IsYUFBTztBQUFBO0FBV1QsU0FBSyxVQUFVLFNBQVMsZ0JBQWdCLFNBQVMsVUFBVTtBQUN6RCxZQUFNLGVBQWUsS0FBSztBQUMxQixXQUFLLE9BQU8sS0FBSyxNQUFNLFNBQVM7QUFBQTtBQVdsQyxTQUFLLFVBQVUsVUFBVSxrQkFBaUIsS0FBSyxNQUFNO0FBQ25ELFVBQUksTUFBTSxLQUFLO0FBR2YsVUFBSSxRQUFPLEtBQUssS0FBSztBQUNyQixVQUFJLE9BQU8sUUFBUTtBQUVuQixVQUFJLFFBQVEsS0FBSyxVQUFVO0FBQ3pCLGVBQU87QUFBQTtBQUlULGNBQU8sS0FBSyxLQUFLLFNBQVMsTUFBTSxNQUFNLFVBQVU7QUFDaEQsYUFBTyxRQUFRO0FBRWYsVUFBSSxRQUFRLEtBQUssVUFBVTtBQUN6QixlQUFPO0FBQUE7QUFBQTtBQVlYLHFCQUFpQixPQUFNO0FBQ3JCLFlBQU0sYUFBYTtBQUVuQixVQUFJO0FBQ0YsZUFBTyxJQUFHLFNBQVM7QUFBQSxlQUNaLEdBQVA7QUFDQSxlQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ25MWDtBQUFBO0FBRUEsUUFBSSxTQUFTLFFBQVE7QUFDckIsUUFBSSxVQUFTLE9BQU87QUFHcEIsdUJBQW9CLEtBQUssS0FBSztBQUM1QixlQUFTLE9BQU8sS0FBSztBQUNuQixZQUFJLE9BQU8sSUFBSTtBQUFBO0FBQUE7QUFHbkIsUUFBSSxRQUFPLFFBQVEsUUFBTyxTQUFTLFFBQU8sZUFBZSxRQUFPLGlCQUFpQjtBQUMvRSxjQUFPLFVBQVU7QUFBQSxXQUNaO0FBRUwsZ0JBQVUsUUFBUTtBQUNsQixjQUFRLFNBQVM7QUFBQTtBQUduQix3QkFBcUIsS0FBSyxrQkFBa0IsUUFBUTtBQUNsRCxhQUFPLFFBQU8sS0FBSyxrQkFBa0I7QUFBQTtBQUd2QyxlQUFXLFlBQVksT0FBTyxPQUFPLFFBQU87QUFHNUMsY0FBVSxTQUFRO0FBRWxCLGVBQVcsT0FBTyxTQUFVLEtBQUssa0JBQWtCLFFBQVE7QUFDekQsVUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixjQUFNLElBQUksVUFBVTtBQUFBO0FBRXRCLGFBQU8sUUFBTyxLQUFLLGtCQUFrQjtBQUFBO0FBR3ZDLGVBQVcsUUFBUSxTQUFVLE1BQU0sTUFBTSxVQUFVO0FBQ2pELFVBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUV0QixVQUFJLE1BQU0sUUFBTztBQUNqQixVQUFJLFNBQVMsUUFBVztBQUN0QixZQUFJLE9BQU8sYUFBYSxVQUFVO0FBQ2hDLGNBQUksS0FBSyxNQUFNO0FBQUEsZUFDVjtBQUNMLGNBQUksS0FBSztBQUFBO0FBQUEsYUFFTjtBQUNMLFlBQUksS0FBSztBQUFBO0FBRVgsYUFBTztBQUFBO0FBR1QsZUFBVyxjQUFjLFNBQVUsTUFBTTtBQUN2QyxVQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFFdEIsYUFBTyxRQUFPO0FBQUE7QUFHaEIsZUFBVyxrQkFBa0IsU0FBVSxNQUFNO0FBQzNDLFVBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUV0QixhQUFPLE9BQU8sV0FBVztBQUFBO0FBQUE7QUFBQTs7O0FDL0QzQjtBQUFBO0FBTUE7QUFPQSxZQUFPLFVBQVU7QUFDakIsWUFBTyxRQUFRLFFBQVE7QUFPdkIsUUFBSSxXQUFXLFFBQVEsUUFBUTtBQUMvQixRQUFJLFVBQVMsc0JBQXVCO0FBT3BDLFFBQUksOEJBQThCO0FBT2xDLFFBQUksb0JBQW9CO0FBQ3hCLFFBQUksNEJBQTRCO0FBT2hDLFFBQUksb0JBQW9CO0FBVXhCLFFBQUksY0FBYztBQU9sQixRQUFJLGVBQWU7QUEyQm5CLFFBQUksZUFBZTtBQUNuQixRQUFJLGNBQWM7QUFDbEIsUUFBSSxlQUFlO0FBd0JuQixRQUFJLG1CQUFtQjtBQWdCdkIsUUFBSSwwQkFBMEI7QUFhOUIsZ0NBQTZCLFVBQVUsU0FBUztBQUM5QyxVQUFJLE9BQU8sV0FBVztBQUd0QixVQUFJLE9BQU8sS0FBSyxRQUFRO0FBR3hCLFVBQUksU0FBUyxhQUFhLFVBQVUsS0FBSztBQUd6QyxhQUFPLE9BQU8sSUFBSSxtQkFBbUIsTUFBTTtBQUFBO0FBWTdDLDBCQUF1QixVQUFVLFVBQVU7QUFDekMsVUFBSSxhQUFhLFFBQVc7QUFDMUI7QUFBQTtBQUdGLFVBQUksU0FBUztBQUViLFVBQUksT0FBTyxhQUFhLFVBQVU7QUFDaEMsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUl0QixVQUFJLGFBQWEsUUFBVztBQUMxQixtQkFBVztBQUFBO0FBR2IsVUFBSSxPQUFPLGFBQWEsWUFBWSxPQUFPLGFBQWEsV0FBVztBQUNqRSxjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksT0FBTyxhQUFhLFlBQVksa0JBQWtCLEtBQUssV0FBVztBQUNwRSxjQUFNLElBQUksVUFBVTtBQUFBO0FBSXRCLFVBQUksT0FBTyxTQUFTO0FBR3BCLFVBQUksaUJBQWlCLFlBQVksS0FBSztBQUd0QyxVQUFJLGVBQWUsT0FBTyxhQUFhLFdBQ25DLFlBQVksVUFBVSxRQUN0QixTQUFTO0FBQ2IsVUFBSSxjQUFjLE9BQU8saUJBQWlCLFlBQVksaUJBQWlCO0FBR3ZFLFVBQUksZUFBZSxDQUFDLGtCQUFrQixrQkFBa0IsS0FBSyxPQUFPO0FBQ2xFLGVBQU8sZUFBZTtBQUFBO0FBSXhCLFVBQUksa0JBQWtCLGFBQWE7QUFDakMsZUFBTyxXQUFXLGNBQ2QsZUFDQTtBQUFBO0FBR04sYUFBTztBQUFBO0FBYVQsb0JBQWlCLEtBQUs7QUFDcEIsVUFBSSxhQUFhLElBQUk7QUFDckIsVUFBSSxPQUFPLElBQUk7QUFFZixVQUFJLENBQUMsUUFBUSxPQUFPLFNBQVMsWUFBWSxDQUFDLGFBQWEsS0FBSyxPQUFPO0FBQ2pFLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFJdEIsVUFBSSxTQUFTLE9BQU8sTUFBTTtBQUcxQixVQUFJLGNBQWMsT0FBTyxlQUFlLFVBQVU7QUFDaEQsWUFBSTtBQUNKLFlBQUksU0FBUyxPQUFPLEtBQUssWUFBWTtBQUVyQyxpQkFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsS0FBSztBQUN0QyxrQkFBUSxPQUFPO0FBRWYsY0FBSSxNQUFNLE1BQU0sT0FBTyxRQUFRLE1BQzNCLFFBQVEsV0FBVyxVQUNuQixRQUFRLFdBQVc7QUFFdkIsb0JBQVUsT0FBTyxRQUFRLE1BQU07QUFBQTtBQUFBO0FBSW5DLGFBQU87QUFBQTtBQVdULHlCQUFzQixLQUFLO0FBQ3pCLFVBQUksUUFBUSxpQkFBaUIsS0FBSztBQUVsQyxVQUFJLENBQUMsT0FBTztBQUNWLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsVUFBSSxVQUFVLE1BQU0sR0FBRztBQUN2QixVQUFJLFVBQVUsTUFBTTtBQUNwQixVQUFJO0FBR0osVUFBSSxTQUFTLFFBQVEsUUFBUSwyQkFBMkI7QUFFeEQsY0FBUTtBQUFBLGFBQ0Q7QUFDSCxrQkFBUSxVQUFVO0FBQ2xCO0FBQUEsYUFDRztBQUNILGtCQUFRLFFBQU8sS0FBSyxRQUFRLFVBQVUsU0FBUztBQUMvQztBQUFBO0FBRUEsZ0JBQU0sSUFBSSxVQUFVO0FBQUE7QUFHeEIsYUFBTztBQUFBO0FBV1QsdUJBQW9CLEtBQUs7QUFFdkIsYUFBTyxPQUFPLEtBQUssUUFBUSxtQkFBbUI7QUFBQTtBQVdoRCxtQkFBZ0IsUUFBUTtBQUN0QixVQUFJLENBQUMsVUFBVSxPQUFPLFdBQVcsVUFBVTtBQUN6QyxjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksUUFBUSx3QkFBd0IsS0FBSztBQUV6QyxVQUFJLENBQUMsT0FBTztBQUNWLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFJdEIsVUFBSSxRQUFRLE1BQU0sR0FBRztBQUNyQixVQUFJLE9BQU8sTUFBTSxHQUFHO0FBRXBCLFVBQUk7QUFDSixVQUFJLFFBQVE7QUFDWixVQUFJLFNBQVM7QUFDYixVQUFJO0FBR0osY0FBUSxhQUFhLFlBQVksTUFBTSxHQUFHLE9BQU8sUUFBUSxNQUNyRCxRQUFRLElBQ1I7QUFHSixhQUFRLFFBQVEsYUFBYSxLQUFLLFNBQVU7QUFDMUMsWUFBSSxNQUFNLFVBQVUsT0FBTztBQUN6QixnQkFBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixpQkFBUyxNQUFNLEdBQUc7QUFDbEIsY0FBTSxNQUFNLEdBQUc7QUFDZixnQkFBUSxNQUFNO0FBRWQsWUFBSSxNQUFNLFFBQVEsU0FBUyxJQUFJO0FBQzdCLGdCQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLGNBQU0sS0FBSztBQUVYLFlBQUksSUFBSSxRQUFRLE9BQU8sTUFBTSxJQUFJLFFBQVE7QUFFdkMsZ0JBQU0sSUFBSSxNQUFNLEdBQUc7QUFDbkIsa0JBQVEsWUFBWTtBQUdwQixpQkFBTyxPQUFPO0FBQ2Q7QUFBQTtBQUdGLFlBQUksT0FBTyxPQUFPLFNBQVMsVUFBVTtBQUNuQztBQUFBO0FBR0YsWUFBSSxNQUFNLE9BQU8sS0FBSztBQUVwQixrQkFBUSxNQUNMLE9BQU8sR0FBRyxNQUFNLFNBQVMsR0FDekIsUUFBUSxhQUFhO0FBQUE7QUFHMUIsZUFBTyxPQUFPO0FBQUE7QUFHaEIsVUFBSSxVQUFVLE1BQU0sVUFBVSxPQUFPLFFBQVE7QUFDM0MsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixhQUFPLElBQUksbUJBQW1CLE1BQU07QUFBQTtBQVl0QyxxQkFBa0IsS0FBSyxLQUFLO0FBQzFCLGFBQU8sT0FBTyxhQUFhLFNBQVMsS0FBSztBQUFBO0FBVzNDLHFCQUFrQixNQUFNO0FBQ3RCLGFBQU8sTUFBTSxPQUFPLE1BQ2pCLFdBQVcsR0FDWCxTQUFTLElBQ1Q7QUFBQTtBQVdMLHFCQUFrQixLQUFLO0FBQ3JCLFVBQUksTUFBTSxPQUFPO0FBRWpCLGFBQU8sTUFBTSxJQUFJLFFBQVEsY0FBYyxVQUFVO0FBQUE7QUFXbkQscUJBQWtCLEtBQUs7QUFDckIsVUFBSSxNQUFNLE9BQU87QUFHakIsVUFBSSxVQUFVLG1CQUFtQixLQUM5QixRQUFRLDZCQUE2QjtBQUV4QyxhQUFPLFlBQWM7QUFBQTtBQVl2QixnQ0FBNkIsTUFBTSxZQUFZO0FBQzdDLFdBQUssT0FBTztBQUNaLFdBQUssYUFBYTtBQUFBO0FBQUE7QUFBQTs7O0FDeGNwQjtBQUFBO0FBSUEsUUFBSSxJQUFJO0FBQ1IsUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFnQlosWUFBTyxVQUFVLFNBQVMsS0FBSyxTQUFTO0FBQ3RDLGdCQUFVLFdBQVc7QUFDckIsVUFBSSxPQUFPLE9BQU87QUFDbEIsVUFBSSxTQUFTLFlBQVksSUFBSSxTQUFTLEdBQUc7QUFDdkMsZUFBTyxNQUFNO0FBQUEsaUJBQ0osU0FBUyxZQUFZLE1BQU0sU0FBUyxPQUFPO0FBQ3BELGVBQU8sUUFBUSxPQUFPLFFBQVEsT0FBTyxTQUFTO0FBQUE7QUFFaEQsWUFBTSxJQUFJLE1BQ1IsMERBQ0UsS0FBSyxVQUFVO0FBQUE7QUFZckIsbUJBQWUsS0FBSztBQUNsQixZQUFNLE9BQU87QUFDYixVQUFJLElBQUksU0FBUyxLQUFLO0FBQ3BCO0FBQUE7QUFFRixVQUFJLFFBQVEsd0hBQXdILEtBQ2xJO0FBRUYsVUFBSSxDQUFDLE9BQU87QUFDVjtBQUFBO0FBRUYsVUFBSSxJQUFJLFdBQVcsTUFBTTtBQUN6QixVQUFJLE9BQVEsT0FBTSxNQUFNLE1BQU07QUFDOUIsY0FBUTtBQUFBLGFBQ0Q7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQ0gsaUJBQU8sSUFBSTtBQUFBLGFBQ1I7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPO0FBQUE7QUFFUCxpQkFBTztBQUFBO0FBQUE7QUFZYixzQkFBa0IsSUFBSTtBQUNwQixVQUFJLE1BQU0sR0FBRztBQUNYLGVBQU8sS0FBSyxNQUFNLEtBQUssS0FBSztBQUFBO0FBRTlCLFVBQUksTUFBTSxHQUFHO0FBQ1gsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFFOUIsVUFBSSxNQUFNLEdBQUc7QUFDWCxlQUFPLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQTtBQUU5QixVQUFJLE1BQU0sR0FBRztBQUNYLGVBQU8sS0FBSyxNQUFNLEtBQUssS0FBSztBQUFBO0FBRTlCLGFBQU8sS0FBSztBQUFBO0FBV2QscUJBQWlCLElBQUk7QUFDbkIsYUFBTyxPQUFPLElBQUksR0FBRyxVQUNuQixPQUFPLElBQUksR0FBRyxXQUNkLE9BQU8sSUFBSSxHQUFHLGFBQ2QsT0FBTyxJQUFJLEdBQUcsYUFDZCxLQUFLO0FBQUE7QUFPVCxvQkFBZ0IsSUFBSSxHQUFHLE1BQU07QUFDM0IsVUFBSSxLQUFLLEdBQUc7QUFDVjtBQUFBO0FBRUYsVUFBSSxLQUFLLElBQUksS0FBSztBQUNoQixlQUFPLEtBQUssTUFBTSxLQUFLLEtBQUssTUFBTTtBQUFBO0FBRXBDLGFBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxNQUFNLE9BQU87QUFBQTtBQUFBO0FBQUE7OztBQ3RKMUM7QUFBQTtBQVFBLGNBQVUsUUFBTyxVQUFVLFlBQVksUUFBUSxZQUFZLGFBQWE7QUFDeEUsWUFBUSxTQUFTO0FBQ2pCLFlBQVEsVUFBVTtBQUNsQixZQUFRLFNBQVM7QUFDakIsWUFBUSxVQUFVO0FBQ2xCLFlBQVEsV0FBVztBQU1uQixZQUFRLFFBQVE7QUFDaEIsWUFBUSxRQUFRO0FBUWhCLFlBQVEsYUFBYTtBQU1yQixRQUFJO0FBU0oseUJBQXFCLFdBQVc7QUFDOUIsVUFBSSxPQUFPLEdBQUc7QUFFZCxXQUFLLEtBQUssV0FBVztBQUNuQixlQUFVLFNBQVEsS0FBSyxPQUFRLFVBQVUsV0FBVztBQUNwRCxnQkFBUTtBQUFBO0FBR1YsYUFBTyxRQUFRLE9BQU8sS0FBSyxJQUFJLFFBQVEsUUFBUSxPQUFPO0FBQUE7QUFXeEQseUJBQXFCLFdBQVc7QUFFOUIsdUJBQWlCO0FBRWYsWUFBSSxDQUFDLE1BQU07QUFBUztBQUVwQixZQUFJLE9BQU87QUFHWCxZQUFJLE9BQU8sQ0FBQyxJQUFJO0FBQ2hCLFlBQUksS0FBSyxPQUFRLGFBQVk7QUFDN0IsYUFBSyxPQUFPO0FBQ1osYUFBSyxPQUFPO0FBQ1osYUFBSyxPQUFPO0FBQ1osbUJBQVc7QUFHWCxZQUFJLE9BQU8sSUFBSSxNQUFNLFVBQVU7QUFDL0IsaUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDcEMsZUFBSyxLQUFLLFVBQVU7QUFBQTtBQUd0QixhQUFLLEtBQUssUUFBUSxPQUFPLEtBQUs7QUFFOUIsWUFBSSxBQUFhLE9BQU8sS0FBSyxPQUF6QixVQUE2QjtBQUUvQixlQUFLLFFBQVE7QUFBQTtBQUlmLFlBQUksUUFBUTtBQUNaLGFBQUssS0FBSyxLQUFLLEdBQUcsUUFBUSxpQkFBaUIsU0FBUyxPQUFPLFFBQVE7QUFFakUsY0FBSSxVQUFVO0FBQU0sbUJBQU87QUFDM0I7QUFDQSxjQUFJLFlBQVksUUFBUSxXQUFXO0FBQ25DLGNBQUksQUFBZSxPQUFPLGNBQXRCLFlBQWlDO0FBQ25DLGdCQUFJLE1BQU0sS0FBSztBQUNmLG9CQUFRLFVBQVUsS0FBSyxNQUFNO0FBRzdCLGlCQUFLLE9BQU8sT0FBTztBQUNuQjtBQUFBO0FBRUYsaUJBQU87QUFBQTtBQUlULGdCQUFRLFdBQVcsS0FBSyxNQUFNO0FBRTlCLFlBQUksUUFBUSxNQUFNLE9BQU8sUUFBUSxPQUFPLFFBQVEsSUFBSSxLQUFLO0FBQ3pELGNBQU0sTUFBTSxNQUFNO0FBQUE7QUFHcEIsWUFBTSxZQUFZO0FBQ2xCLFlBQU0sVUFBVSxRQUFRLFFBQVE7QUFDaEMsWUFBTSxZQUFZLFFBQVE7QUFDMUIsWUFBTSxRQUFRLFlBQVk7QUFHMUIsVUFBSSxBQUFlLE9BQU8sUUFBUSxTQUE5QixZQUFvQztBQUN0QyxnQkFBUSxLQUFLO0FBQUE7QUFHZixhQUFPO0FBQUE7QUFXVCxvQkFBZ0IsWUFBWTtBQUMxQixjQUFRLEtBQUs7QUFFYixjQUFRLFFBQVE7QUFDaEIsY0FBUSxRQUFRO0FBRWhCLFVBQUksUUFBUyxRQUFPLGVBQWUsV0FBVyxhQUFhLElBQUksTUFBTTtBQUNyRSxVQUFJLE1BQU0sTUFBTTtBQUVoQixlQUFTLElBQUksR0FBRyxJQUFJLEtBQUssS0FBSztBQUM1QixZQUFJLENBQUMsTUFBTTtBQUFJO0FBQ2YscUJBQWEsTUFBTSxHQUFHLFFBQVEsT0FBTztBQUNyQyxZQUFJLFdBQVcsT0FBTyxLQUFLO0FBQ3pCLGtCQUFRLE1BQU0sS0FBSyxJQUFJLE9BQU8sTUFBTSxXQUFXLE9BQU8sS0FBSztBQUFBLGVBQ3REO0FBQ0wsa0JBQVEsTUFBTSxLQUFLLElBQUksT0FBTyxNQUFNLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFXdkQsdUJBQW1CO0FBQ2pCLGNBQVEsT0FBTztBQUFBO0FBV2pCLHFCQUFpQixNQUFNO0FBQ3JCLFVBQUksR0FBRztBQUNQLFdBQUssSUFBSSxHQUFHLE1BQU0sUUFBUSxNQUFNLFFBQVEsSUFBSSxLQUFLLEtBQUs7QUFDcEQsWUFBSSxRQUFRLE1BQU0sR0FBRyxLQUFLLE9BQU87QUFDL0IsaUJBQU87QUFBQTtBQUFBO0FBR1gsV0FBSyxJQUFJLEdBQUcsTUFBTSxRQUFRLE1BQU0sUUFBUSxJQUFJLEtBQUssS0FBSztBQUNwRCxZQUFJLFFBQVEsTUFBTSxHQUFHLEtBQUssT0FBTztBQUMvQixpQkFBTztBQUFBO0FBQUE7QUFHWCxhQUFPO0FBQUE7QUFXVCxvQkFBZ0IsS0FBSztBQUNuQixVQUFJLGVBQWU7QUFBTyxlQUFPLElBQUksU0FBUyxJQUFJO0FBQ2xELGFBQU87QUFBQTtBQUFBO0FBQUE7OztBQ3hNVDtBQUFBO0FBTUEsY0FBVSxRQUFPLFVBQVU7QUFDM0IsWUFBUSxNQUFNO0FBQ2QsWUFBUSxhQUFhO0FBQ3JCLFlBQVEsT0FBTztBQUNmLFlBQVEsT0FBTztBQUNmLFlBQVEsWUFBWTtBQUNwQixZQUFRLFVBQVUsQUFBZSxPQUFPLFVBQXRCLGVBQ0EsQUFBZSxPQUFPLE9BQU8sV0FBN0IsY0FDRSxPQUFPLFFBQVEsUUFDZjtBQU1wQixZQUFRLFNBQVM7QUFBQSxNQUNmO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQTtBQVdGLHlCQUFxQjtBQUluQixVQUFJLE9BQU8sV0FBVyxlQUFlLE9BQU8sV0FBVyxPQUFPLFFBQVEsU0FBUyxZQUFZO0FBQ3pGLGVBQU87QUFBQTtBQUtULGFBQVEsT0FBTyxhQUFhLGVBQWUsU0FBUyxtQkFBbUIsU0FBUyxnQkFBZ0IsU0FBUyxTQUFTLGdCQUFnQixNQUFNLG9CQUVySSxPQUFPLFdBQVcsZUFBZSxPQUFPLFdBQVksUUFBTyxRQUFRLFdBQVksT0FBTyxRQUFRLGFBQWEsT0FBTyxRQUFRLFVBRzFILE9BQU8sY0FBYyxlQUFlLFVBQVUsYUFBYSxVQUFVLFVBQVUsY0FBYyxNQUFNLHFCQUFxQixTQUFTLE9BQU8sSUFBSSxPQUFPLE1BRW5KLE9BQU8sY0FBYyxlQUFlLFVBQVUsYUFBYSxVQUFVLFVBQVUsY0FBYyxNQUFNO0FBQUE7QUFPeEcsWUFBUSxXQUFXLElBQUksU0FBUyxHQUFHO0FBQ2pDLFVBQUk7QUFDRixlQUFPLEtBQUssVUFBVTtBQUFBLGVBQ2YsS0FBUDtBQUNBLGVBQU8saUNBQWlDLElBQUk7QUFBQTtBQUFBO0FBV2hELHdCQUFvQixNQUFNO0FBQ3hCLFVBQUksYUFBWSxLQUFLO0FBRXJCLFdBQUssS0FBTSxjQUFZLE9BQU8sTUFDMUIsS0FBSyxZQUNKLGNBQVksUUFBUSxPQUNyQixLQUFLLEtBQ0osY0FBWSxRQUFRLE9BQ3JCLE1BQU0sUUFBUSxTQUFTLEtBQUs7QUFFaEMsVUFBSSxDQUFDO0FBQVc7QUFFaEIsVUFBSSxJQUFJLFlBQVksS0FBSztBQUN6QixXQUFLLE9BQU8sR0FBRyxHQUFHLEdBQUc7QUFLckIsVUFBSSxRQUFRO0FBQ1osVUFBSSxRQUFRO0FBQ1osV0FBSyxHQUFHLFFBQVEsZUFBZSxTQUFTLE9BQU87QUFDN0MsWUFBSSxBQUFTLFVBQVQ7QUFBZ0I7QUFDcEI7QUFDQSxZQUFJLEFBQVMsVUFBVCxNQUFnQjtBQUdsQixrQkFBUTtBQUFBO0FBQUE7QUFJWixXQUFLLE9BQU8sT0FBTyxHQUFHO0FBQUE7QUFVeEIsbUJBQWU7QUFHYixhQUFPLEFBQWEsT0FBTyxZQUFwQixZQUNGLFFBQVEsT0FDUixTQUFTLFVBQVUsTUFBTSxLQUFLLFFBQVEsS0FBSyxTQUFTO0FBQUE7QUFVM0Qsa0JBQWMsWUFBWTtBQUN4QixVQUFJO0FBQ0YsWUFBSSxBQUFRLGNBQVIsTUFBb0I7QUFDdEIsa0JBQVEsUUFBUSxXQUFXO0FBQUEsZUFDdEI7QUFDTCxrQkFBUSxRQUFRLFFBQVE7QUFBQTtBQUFBLGVBRXBCLEdBQU47QUFBQTtBQUFBO0FBVUosb0JBQWdCO0FBQ2QsVUFBSTtBQUNKLFVBQUk7QUFDRixZQUFJLFFBQVEsUUFBUTtBQUFBLGVBQ2QsR0FBTjtBQUFBO0FBR0YsVUFBSSxDQUFDLEtBQUssT0FBTyxZQUFZLGVBQWUsU0FBUyxTQUFTO0FBQzVELFlBQUksUUFBUSxJQUFJO0FBQUE7QUFHbEIsYUFBTztBQUFBO0FBT1QsWUFBUSxPQUFPO0FBYWYsNEJBQXdCO0FBQ3RCLFVBQUk7QUFDRixlQUFPLE9BQU87QUFBQSxlQUNQLEdBQVA7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDdkxKO0FBQUE7QUFJQSxRQUFJLE1BQU0sUUFBUTtBQUNsQixRQUFJLE9BQU8sUUFBUTtBQVFuQixjQUFVLFFBQU8sVUFBVTtBQUMzQixZQUFRLE9BQU87QUFDZixZQUFRLE1BQU07QUFDZCxZQUFRLGFBQWE7QUFDckIsWUFBUSxPQUFPO0FBQ2YsWUFBUSxPQUFPO0FBQ2YsWUFBUSxZQUFZO0FBTXBCLFlBQVEsU0FBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztBQVFqQyxZQUFRLGNBQWMsT0FBTyxLQUFLLFFBQVEsS0FBSyxPQUFPLFNBQVUsS0FBSztBQUNuRSxhQUFPLFdBQVcsS0FBSztBQUFBLE9BQ3RCLE9BQU8sU0FBVSxLQUFLLEtBQUs7QUFFNUIsVUFBSSxPQUFPLElBQ1IsVUFBVSxHQUNWLGNBQ0EsUUFBUSxhQUFhLFNBQVUsR0FBRyxHQUFHO0FBQUUsZUFBTyxFQUFFO0FBQUE7QUFHbkQsVUFBSSxNQUFNLFFBQVEsSUFBSTtBQUN0QixVQUFJLDJCQUEyQixLQUFLO0FBQU0sY0FBTTtBQUFBLGVBQ3ZDLDZCQUE2QixLQUFLO0FBQU0sY0FBTTtBQUFBLGVBQzlDLFFBQVE7QUFBUSxjQUFNO0FBQUE7QUFDMUIsY0FBTSxPQUFPO0FBRWxCLFVBQUksUUFBUTtBQUNaLGFBQU87QUFBQSxPQUNOO0FBU0gsUUFBSSxLQUFLLFNBQVMsUUFBUSxJQUFJLFVBQVUsT0FBTztBQUUvQyxRQUFJLEFBQU0sT0FBTixLQUFZLEFBQU0sT0FBTixHQUFVO0FBQ3hCLFdBQUssVUFBVSxXQUFVO0FBQUEsU0FBSTtBQUFBO0FBRy9CLFFBQUksU0FBUyxBQUFNLE9BQU4sSUFBVyxRQUFRLFNBQ25CLEFBQU0sT0FBTixJQUFXLFFBQVEsU0FDbkIsMEJBQTBCO0FBTXZDLHlCQUFxQjtBQUNuQixhQUFPLFlBQVksUUFBUSxjQUN2QixRQUFRLFFBQVEsWUFBWSxVQUM1QixJQUFJLE9BQU87QUFBQTtBQU9qQixZQUFRLFdBQVcsSUFBSSxTQUFTLEdBQUc7QUFDakMsV0FBSyxZQUFZLFNBQVMsS0FBSztBQUMvQixhQUFPLEtBQUssUUFBUSxHQUFHLEtBQUssYUFDekIsTUFBTSxNQUFNLElBQUksU0FBUyxLQUFLO0FBQzdCLGVBQU8sSUFBSTtBQUFBLFNBQ1YsS0FBSztBQUFBO0FBT1osWUFBUSxXQUFXLElBQUksU0FBUyxHQUFHO0FBQ2pDLFdBQUssWUFBWSxTQUFTLEtBQUs7QUFDL0IsYUFBTyxLQUFLLFFBQVEsR0FBRyxLQUFLO0FBQUE7QUFTOUIsd0JBQW9CLE1BQU07QUFDeEIsVUFBSSxPQUFPLEtBQUs7QUFDaEIsVUFBSSxhQUFZLEtBQUs7QUFFckIsVUFBSSxZQUFXO0FBQ2IsWUFBSSxJQUFJLEtBQUs7QUFDYixZQUFJLFNBQVMsVUFBZSxJQUFJLFFBQVEsT0FBTztBQUUvQyxhQUFLLEtBQUssU0FBUyxLQUFLLEdBQUcsTUFBTSxNQUFNLEtBQUssT0FBTztBQUNuRCxhQUFLLEtBQUssUUFBYSxJQUFJLE9BQU8sUUFBUSxTQUFTLEtBQUssUUFBUTtBQUFBLGFBQzNEO0FBQ0wsYUFBSyxLQUFLLElBQUksT0FBTyxnQkFDakIsTUFBTSxPQUFPLE1BQU0sS0FBSztBQUFBO0FBQUE7QUFRaEMsbUJBQWU7QUFDYixhQUFPLE9BQU8sTUFBTSxLQUFLLE9BQU8sTUFBTSxNQUFNLGFBQWE7QUFBQTtBQVUzRCxrQkFBYyxZQUFZO0FBQ3hCLFVBQUksQUFBUSxjQUFSLE1BQW9CO0FBR3RCLGVBQU8sUUFBUSxJQUFJO0FBQUEsYUFDZDtBQUNMLGdCQUFRLElBQUksUUFBUTtBQUFBO0FBQUE7QUFXeEIsb0JBQWdCO0FBQ2QsYUFBTyxRQUFRLElBQUk7QUFBQTtBQVVyQix1Q0FBb0MsS0FBSTtBQUN0QyxVQUFJO0FBQ0osVUFBSSxXQUFXLFFBQVEsUUFBUTtBQUkvQixjQUFRLFNBQVMsZ0JBQWdCO0FBQUEsYUFDMUI7QUFDSCxvQkFBUyxJQUFJLElBQUksWUFBWTtBQUM3QixrQkFBTyxRQUFRO0FBSWYsY0FBSSxRQUFPLFdBQVcsUUFBTyxRQUFRLE9BQU87QUFDMUMsb0JBQU8sUUFBUTtBQUFBO0FBRWpCO0FBQUEsYUFFRztBQUNILGNBQUksTUFBSyxRQUFRO0FBQ2pCLG9CQUFTLElBQUksSUFBRyxnQkFBZ0IsS0FBSSxFQUFFLFdBQVc7QUFDakQsa0JBQU8sUUFBUTtBQUNmO0FBQUEsYUFFRztBQUFBLGFBQ0E7QUFDSCxjQUFJLE1BQU0sUUFBUTtBQUNsQixvQkFBUyxJQUFJLElBQUksT0FBTztBQUFBLFlBQ3RCLElBQUk7QUFBQSxZQUNKLFVBQVU7QUFBQSxZQUNWLFVBQVU7QUFBQTtBQU9aLGtCQUFPLFdBQVc7QUFDbEIsa0JBQU8sT0FBTztBQUNkLGtCQUFPLFFBQVE7QUFJZixjQUFJLFFBQU8sV0FBVyxRQUFPLFFBQVEsT0FBTztBQUMxQyxvQkFBTyxRQUFRO0FBQUE7QUFFakI7QUFBQTtBQUlBLGdCQUFNLElBQUksTUFBTTtBQUFBO0FBSXBCLGNBQU8sS0FBSztBQUVaLGNBQU8sV0FBVztBQUVsQixhQUFPO0FBQUE7QUFVVCxrQkFBZSxPQUFPO0FBQ3BCLFlBQU0sY0FBYztBQUVwQixVQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVE7QUFDL0IsZUFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUNwQyxjQUFNLFlBQVksS0FBSyxNQUFNLFFBQVEsWUFBWSxLQUFLO0FBQUE7QUFBQTtBQVExRCxZQUFRLE9BQU87QUFBQTtBQUFBOzs7QUN2UGY7QUFBQTtBQUtBLFFBQUksT0FBTyxZQUFZLGVBQWUsUUFBUSxTQUFTLFlBQVk7QUFDakUsY0FBTyxVQUFVO0FBQUEsV0FDWjtBQUNMLGNBQU8sVUFBVTtBQUFBO0FBQUE7QUFBQTs7O0FDUm5CO0FBQUE7QUFNQTtBQU9BLFlBQU8sVUFBVTtBQU9qQixRQUFJLFNBQVMsUUFBUTtBQUNyQixRQUFJLFFBQVEsUUFBUSxNQUFNO0FBTzFCLFFBQUksV0FBVyxPQUFPLFVBQVU7QUFVaEMsdUJBQW9CLFFBQVE7QUFDMUIsVUFBSSxPQUFPLFdBQVcsR0FBRztBQUV2QixlQUFPO0FBQUE7QUFJVCxVQUFJLE9BQU8sT0FDUixXQUFXLFFBQ1gsT0FBTyxRQUFRLFFBQ2YsT0FBTyxVQUNQLFVBQVUsR0FBRztBQUdoQixVQUFJLE1BQU0sT0FBTyxXQUFXLFdBQ3hCLE9BQU8sV0FBVyxRQUFRLFVBQzFCLE9BQU87QUFFWCxhQUFPLE1BQU0sSUFBSSxTQUFTLE1BQU0sTUFBTSxPQUFPO0FBQUE7QUFhL0Msa0JBQWUsUUFBUSxTQUFTO0FBQzlCLFVBQUksVUFBVSxNQUFNO0FBQ2xCLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFJdEIsVUFBSSxVQUFVLFFBQVE7QUFDdEIsVUFBSSxPQUFPLFdBQVcsT0FBTyxRQUFRLFNBQVMsWUFDMUMsUUFBUSxPQUNSO0FBR0osVUFBSSxDQUFDLFdBQVcsT0FBTyxXQUFXLFlBQVksQ0FBQyxPQUFPLFNBQVMsU0FBUztBQUN0RSxjQUFNLElBQUksVUFBVTtBQUFBO0FBSXRCLFVBQUksTUFBTSxVQUNOLFFBQVEsVUFDUixVQUFVO0FBRWQsYUFBTyxPQUNILE9BQU8sTUFDUDtBQUFBO0FBV04scUJBQWtCLEtBQUs7QUFFckIsVUFBSSxPQUFPLFVBQVUsY0FBYyxlQUFlLE9BQU87QUFDdkQsZUFBTztBQUFBO0FBSVQsYUFBTyxPQUFPLE9BQU8sUUFBUSxZQUMzQixXQUFXLE9BQU8sU0FBUyxLQUFLLElBQUksV0FBVyxtQkFDL0MsV0FBVyxPQUFPLFNBQVMsS0FBSyxJQUFJLFdBQVcsbUJBQy9DLFNBQVMsT0FBTyxPQUFPLElBQUksUUFBUSxZQUNuQyxVQUFVLE9BQU8sT0FBTyxJQUFJLFNBQVM7QUFBQTtBQVd6QyxxQkFBa0IsTUFBTTtBQUN0QixVQUFJLFFBQVEsS0FBSyxNQUFNLFVBQVUsU0FBUztBQUMxQyxVQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7QUFFOUIsYUFBTyxNQUFNLE9BQU8sTUFBTSxRQUFRO0FBQUE7QUFBQTtBQUFBOzs7QUNqSXBDO0FBQUE7QUFPQTtBQU9BLFFBQUksZ0NBQWdDO0FBT3BDLFlBQU8sVUFBVTtBQVdqQixtQkFBZ0IsWUFBWSxZQUFZO0FBRXRDLFVBQUksZ0JBQWdCLFdBQVc7QUFDL0IsVUFBSSxZQUFZLFdBQVc7QUFHM0IsVUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVc7QUFDaEMsZUFBTztBQUFBO0FBTVQsVUFBSSxlQUFlLFdBQVc7QUFDOUIsVUFBSSxnQkFBZ0IsOEJBQThCLEtBQUssZUFBZTtBQUNwRSxlQUFPO0FBQUE7QUFJVCxVQUFJLGFBQWEsY0FBYyxLQUFLO0FBQ2xDLFlBQUksT0FBTyxXQUFXO0FBRXRCLFlBQUksQ0FBQyxNQUFNO0FBQ1QsaUJBQU87QUFBQTtBQUdULFlBQUksWUFBWTtBQUNoQixZQUFJLFVBQVUsZUFBZTtBQUM3QixpQkFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUN2QyxjQUFJLFFBQVEsUUFBUTtBQUNwQixjQUFJLFVBQVUsUUFBUSxVQUFVLE9BQU8sUUFBUSxPQUFPLFVBQVUsTUFBTTtBQUNwRSx3QkFBWTtBQUNaO0FBQUE7QUFBQTtBQUlKLFlBQUksV0FBVztBQUNiLGlCQUFPO0FBQUE7QUFBQTtBQUtYLFVBQUksZUFBZTtBQUNqQixZQUFJLGVBQWUsV0FBVztBQUM5QixZQUFJLGdCQUFnQixDQUFDLGdCQUFnQixDQUFFLGVBQWMsaUJBQWlCLGNBQWM7QUFFcEYsWUFBSSxlQUFlO0FBQ2pCLGlCQUFPO0FBQUE7QUFBQTtBQUlYLGFBQU87QUFBQTtBQVVULDJCQUF3QixNQUFNO0FBQzVCLFVBQUksWUFBWSxRQUFRLEtBQUssTUFBTTtBQUduQyxhQUFPLE9BQU8sY0FBYyxXQUN4QixZQUNBO0FBQUE7QUFVTiw0QkFBeUIsS0FBSztBQUM1QixVQUFJLE1BQU07QUFDVixVQUFJLE9BQU87QUFDWCxVQUFJLFFBQVE7QUFHWixlQUFTLElBQUksR0FBRyxNQUFNLElBQUksUUFBUSxJQUFJLEtBQUssS0FBSztBQUM5QyxnQkFBUSxJQUFJLFdBQVc7QUFBQSxlQUNoQjtBQUNILGdCQUFJLFVBQVUsS0FBSztBQUNqQixzQkFBUSxNQUFNLElBQUk7QUFBQTtBQUVwQjtBQUFBLGVBQ0c7QUFDSCxpQkFBSyxLQUFLLElBQUksVUFBVSxPQUFPO0FBQy9CLG9CQUFRLE1BQU0sSUFBSTtBQUNsQjtBQUFBO0FBRUEsa0JBQU0sSUFBSTtBQUNWO0FBQUE7QUFBQTtBQUtOLFdBQUssS0FBSyxJQUFJLFVBQVUsT0FBTztBQUUvQixhQUFPO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7O0FDdklUO0FBQUE7QUFBQSxRQUFJLE9BQU8sUUFBUTtBQUNuQixRQUFJLE1BQUssUUFBUTtBQUVqQixvQkFBZ0I7QUFFZCxXQUFLLFFBQVEsT0FBTyxPQUFPO0FBRzNCLFdBQUssYUFBYSxPQUFPLE9BQU87QUFBQTtBQVlsQyxTQUFLLFVBQVUsU0FBUyxTQUFVLEtBQUs7QUFDckMsZUFBUyxRQUFRLEtBQUs7QUFDcEIsWUFBSSxPQUFPLElBQUk7QUFDZixpQkFBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFFBQVEsS0FBSztBQUNwQyxjQUFJLFFBQVEsSUFBSSxjQUFjLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFDakQsb0JBQVEsS0FBTSxNQUFLLFlBQVksWUFBWSxRQUFRLFFBQVEsS0FBSyxjQUFjLEtBQUssS0FBSywyQkFDdEYsS0FBSyxNQUFNLEtBQUssTUFBTSxTQUFTO0FBQUE7QUFHbkMsZUFBSyxNQUFNLEtBQUssTUFBTTtBQUFBO0FBSXhCLFlBQUksQ0FBQyxLQUFLLFdBQVcsT0FBTztBQUMxQixlQUFLLFdBQVcsUUFBUSxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBYW5DLFNBQUssVUFBVSxPQUFPLFNBQVMsTUFBTTtBQUNuQyxXQUFLLFdBQVc7QUFFaEIsVUFBSSxNQUFNLElBQ04sVUFBVSxJQUFHLGFBQWEsTUFBTSxVQUNoQyxRQUFRLFFBQVEsTUFBTTtBQUUxQixZQUFNLFFBQVEsU0FBUyxNQUFNO0FBRTNCLFlBQUksU0FBUyxLQUFLLFFBQVEscUJBQXFCLElBQUksTUFBTTtBQUN6RCxZQUFJLE9BQU8sV0FBVztBQUFBO0FBR3hCLFdBQUssT0FBTztBQUVaLFdBQUssV0FBVztBQUFBO0FBTWxCLFNBQUssVUFBVSxTQUFTLFNBQVMsT0FBTSxVQUFVO0FBQy9DLFVBQUksTUFBTSxNQUFLLFFBQVEsZUFBZSxJQUFJO0FBRTFDLGFBQU8sS0FBSyxNQUFNLFFBQVEsWUFBWSxLQUFLO0FBQUE7QUFNN0MsU0FBSyxVQUFVLFlBQVksU0FBUyxVQUFVO0FBQzVDLFVBQUksT0FBTyxTQUFTLE1BQU0sMkJBQTJCLEdBQUc7QUFDeEQsYUFBTyxLQUFLLFdBQVc7QUFBQTtBQUl6QixRQUFJLFFBQU8sSUFBSTtBQUdmLFVBQUssT0FBTztBQUdaLFVBQUssZUFBZSxNQUFLLE9BQU87QUFNaEMsVUFBSyxPQUFPO0FBS1osVUFBSyxXQUFXO0FBQUEsTUFDZCxRQUFRLFNBQVMsVUFBVSxVQUFVO0FBRW5DLGVBQVEsMENBQTJDLEtBQUssWUFBWSxVQUFVO0FBQUE7QUFBQTtBQUlsRixZQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUMzR2pCO0FBQUE7QUFJQSxRQUFJLElBQUk7QUFDUixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBZ0JaLFlBQU8sVUFBVSxTQUFVLEtBQUssU0FBUztBQUN2QyxnQkFBVSxXQUFXO0FBQ3JCLFVBQUksT0FBTyxPQUFPO0FBQ2xCLFVBQUksU0FBUyxZQUFZLElBQUksU0FBUyxHQUFHO0FBQ3ZDLGVBQU8sTUFBTTtBQUFBLGlCQUNKLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFDN0MsZUFBTyxRQUFRLE9BQU8sUUFBUSxPQUFPLFNBQVM7QUFBQTtBQUVoRCxZQUFNLElBQUksTUFDUiwwREFDRSxLQUFLLFVBQVU7QUFBQTtBQVlyQixtQkFBZSxLQUFLO0FBQ2xCLFlBQU0sT0FBTztBQUNiLFVBQUksSUFBSSxTQUFTLEtBQUs7QUFDcEI7QUFBQTtBQUVGLFVBQUksUUFBUSxtSUFBbUksS0FDN0k7QUFFRixVQUFJLENBQUMsT0FBTztBQUNWO0FBQUE7QUFFRixVQUFJLElBQUksV0FBVyxNQUFNO0FBQ3pCLFVBQUksT0FBUSxPQUFNLE1BQU0sTUFBTTtBQUM5QixjQUFRO0FBQUEsYUFDRDtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQ0gsaUJBQU8sSUFBSTtBQUFBLGFBQ1I7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPO0FBQUE7QUFFUCxpQkFBTztBQUFBO0FBQUE7QUFZYixzQkFBa0IsSUFBSTtBQUNwQixVQUFJLFFBQVEsS0FBSyxJQUFJO0FBQ3JCLFVBQUksU0FBUyxHQUFHO0FBQ2QsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFFOUIsVUFBSSxTQUFTLEdBQUc7QUFDZCxlQUFPLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQTtBQUU5QixVQUFJLFNBQVMsR0FBRztBQUNkLGVBQU8sS0FBSyxNQUFNLEtBQUssS0FBSztBQUFBO0FBRTlCLFVBQUksU0FBUyxHQUFHO0FBQ2QsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFFOUIsYUFBTyxLQUFLO0FBQUE7QUFXZCxxQkFBaUIsSUFBSTtBQUNuQixVQUFJLFFBQVEsS0FBSyxJQUFJO0FBQ3JCLFVBQUksU0FBUyxHQUFHO0FBQ2QsZUFBTyxPQUFPLElBQUksT0FBTyxHQUFHO0FBQUE7QUFFOUIsVUFBSSxTQUFTLEdBQUc7QUFDZCxlQUFPLE9BQU8sSUFBSSxPQUFPLEdBQUc7QUFBQTtBQUU5QixVQUFJLFNBQVMsR0FBRztBQUNkLGVBQU8sT0FBTyxJQUFJLE9BQU8sR0FBRztBQUFBO0FBRTlCLFVBQUksU0FBUyxHQUFHO0FBQ2QsZUFBTyxPQUFPLElBQUksT0FBTyxHQUFHO0FBQUE7QUFFOUIsYUFBTyxLQUFLO0FBQUE7QUFPZCxvQkFBZ0IsSUFBSSxPQUFPLEdBQUcsTUFBTTtBQUNsQyxVQUFJLFdBQVcsU0FBUyxJQUFJO0FBQzVCLGFBQU8sS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLE9BQVEsWUFBVyxNQUFNO0FBQUE7QUFBQTtBQUFBOzs7QUNoSzdEO0FBQUE7QUFPQTtBQU9BLFlBQU8sVUFBVTtBQVlqQix5QkFBc0IsTUFBTSxLQUFLLFNBQVM7QUFDeEMsVUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksUUFBUSxJQUFJLFFBQVE7QUFFeEIsVUFBSSxVQUFVLElBQUk7QUFDaEIsZUFBTztBQUFBO0FBSVQsVUFBSSxNQUFNLElBQUksTUFBTSxRQUFRLEdBQUcsTUFBTTtBQUNyQyxVQUFJLFNBQVM7QUFHYixhQUFPLE9BQU8sSUFBSSxNQUFNLEdBQUc7QUFHM0IsZUFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNuQyxZQUFJLFFBQVEsSUFBSSxHQUFHLE1BQU07QUFDekIsWUFBSSxRQUFRLFNBQVMsTUFBTSxJQUFJO0FBQy9CLFlBQUksTUFBTSxTQUFTLE1BQU0sSUFBSTtBQUc3QixZQUFJLE1BQU0sUUFBUTtBQUNoQixrQkFBUSxPQUFPO0FBQ2YsZ0JBQU0sT0FBTztBQUFBLG1CQUVKLE1BQU0sTUFBTTtBQUNyQixnQkFBTSxPQUFPO0FBQUE7QUFJZixZQUFJLE1BQU0sT0FBTyxHQUFHO0FBQ2xCLGdCQUFNLE9BQU87QUFBQTtBQUlmLFlBQUksTUFBTSxVQUFVLE1BQU0sUUFBUSxRQUFRLE9BQU8sUUFBUSxHQUFHO0FBQzFEO0FBQUE7QUFJRixlQUFPLEtBQUs7QUFBQSxVQUNWO0FBQUEsVUFDQTtBQUFBO0FBQUE7QUFJSixVQUFJLE9BQU8sU0FBUyxHQUFHO0FBRXJCLGVBQU87QUFBQTtBQUdULGFBQU8sV0FBVyxRQUFRLFVBQ3RCLGNBQWMsVUFDZDtBQUFBO0FBUU4sMkJBQXdCLFFBQVE7QUFDOUIsVUFBSSxVQUFVLE9BQU8sSUFBSSxjQUFjLEtBQUs7QUFFNUMsZUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksUUFBUSxRQUFRLEtBQUs7QUFDOUMsWUFBSSxRQUFRLFFBQVE7QUFDcEIsWUFBSSxVQUFVLFFBQVE7QUFFdEIsWUFBSSxNQUFNLFFBQVEsUUFBUSxNQUFNLEdBQUc7QUFFakMsa0JBQVEsRUFBRSxLQUFLO0FBQUEsbUJBQ04sTUFBTSxNQUFNLFFBQVEsS0FBSztBQUVsQyxrQkFBUSxNQUFNLE1BQU07QUFDcEIsa0JBQVEsUUFBUSxLQUFLLElBQUksUUFBUSxPQUFPLE1BQU07QUFBQTtBQUFBO0FBS2xELGNBQVEsU0FBUyxJQUFJO0FBR3JCLFVBQUksV0FBVyxRQUFRLEtBQUssa0JBQWtCLElBQUk7QUFHbEQsZUFBUyxPQUFPLE9BQU87QUFFdkIsYUFBTztBQUFBO0FBUVQsMEJBQXVCLE9BQU8sT0FBTztBQUNuQyxhQUFPO0FBQUEsUUFDTCxPQUFPLE1BQU07QUFBQSxRQUNiLEtBQUssTUFBTTtBQUFBLFFBQ1g7QUFBQTtBQUFBO0FBU0osNkJBQTBCLE9BQU87QUFDL0IsYUFBTztBQUFBLFFBQ0wsT0FBTyxNQUFNO0FBQUEsUUFDYixLQUFLLE1BQU07QUFBQTtBQUFBO0FBU2YsOEJBQTJCLEdBQUcsR0FBRztBQUMvQixhQUFPLEVBQUUsUUFBUSxFQUFFO0FBQUE7QUFRckIsOEJBQTJCLEdBQUcsR0FBRztBQUMvQixhQUFPLEVBQUUsUUFBUSxFQUFFO0FBQUE7QUFBQTtBQUFBOzs7QUNoS3JCO0FBQUE7QUFPQTtBQU9BLFFBQUksY0FBYztBQUNsQixRQUFJLFFBQVEsZUFBaUI7QUFDN0IsUUFBSSxZQUFZLGVBQWdCO0FBQ2hDLFFBQUksVUFBVTtBQUNkLFFBQUksWUFBWTtBQUNoQixRQUFJLGFBQWE7QUFDakIsUUFBSSxPQUFPO0FBQ1gsUUFBSSxRQUFRO0FBQ1osUUFBSSxNQUFLLFFBQVE7QUFDakIsUUFBSSxRQUFPO0FBQ1gsUUFBSSxLQUFLO0FBQ1QsUUFBSSxhQUFhO0FBQ2pCLFFBQUksYUFBYTtBQUNqQixRQUFJLE9BQU8sUUFBUTtBQUNuQixRQUFJLFdBQVc7QUFDZixRQUFJLFNBQVMsUUFBUTtBQUNyQixRQUFJLE9BQU8sUUFBUTtBQU9uQixRQUFJLFVBQVUsS0FBSztBQUNuQixRQUFJLE9BQU8sS0FBSztBQUNoQixRQUFJLFlBQVksS0FBSztBQUNyQixRQUFJLFVBQVUsS0FBSztBQUNuQixRQUFJLE1BQU0sS0FBSztBQU9mLFFBQUkscUJBQXFCO0FBT3pCLFFBQUksYUFBYSxLQUFLLEtBQUssS0FBSyxNQUFNO0FBT3RDLFFBQUksaUJBQWlCO0FBT3JCLFlBQU8sVUFBVTtBQUNqQixZQUFPLFFBQVEsT0FBTztBQVl0QixrQkFBZSxLQUFLLE9BQU0sU0FBUztBQUNqQyxhQUFPLElBQUksV0FBVyxLQUFLLE9BQU07QUFBQTtBQVluQyx3QkFBcUIsS0FBSyxPQUFNLFNBQVM7QUFDdkMsYUFBTyxLQUFLO0FBRVosVUFBSSxPQUFPLFdBQVc7QUFFdEIsV0FBSyxVQUFVO0FBQ2YsV0FBSyxPQUFPO0FBQ1osV0FBSyxNQUFNO0FBRVgsV0FBSyxnQkFBZ0IsS0FBSyxpQkFBaUIsU0FDdkMsUUFBUSxLQUFLLGdCQUNiO0FBRUosV0FBSyxnQkFBZ0IsS0FBSyxpQkFBaUIsU0FDdkMsUUFBUSxLQUFLLGdCQUNiO0FBRUosV0FBSyxRQUFRLEtBQUssU0FBUyxTQUN2QixRQUFRLEtBQUssUUFDYjtBQUVKLFdBQUssWUFBWSxLQUFLLGFBQWEsU0FDL0IsS0FBSyxXQUNMO0FBRUosVUFBSSxLQUFLLGNBQWMsWUFBWSxLQUFLLGNBQWMsV0FBVyxLQUFLLGNBQWMsUUFBUTtBQUMxRixjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFdBQUssVUFBVSxRQUFRLEtBQUs7QUFFNUIsVUFBSSxLQUFLLFdBQVcsUUFBVztBQUM3QixrQkFBVSw0QkFBOEIsTUFBSyxVQUFVLFVBQVUsWUFBWTtBQUFBO0FBSS9FLFVBQUksS0FBSyxhQUFhLFFBQVc7QUFDL0IsYUFBSyxZQUFZO0FBQUE7QUFHbkIsV0FBSyxjQUFjLEtBQUssZUFBZSxTQUNuQyxjQUFjLEtBQUssWUFBWSx1QkFDL0I7QUFFSixXQUFLLGFBQWEsS0FBSyxjQUFjLFNBQ2pDLFFBQVEsS0FBSyxhQUNiO0FBRUosV0FBSyxTQUFTLEtBQUssVUFBVSxTQUN6QixjQUFjLEtBQUssT0FBTyxrQkFDMUIsQ0FBQztBQUVMLFdBQUssZ0JBQWdCLEtBQUssaUJBQWlCLFNBQ3ZDLFFBQVEsS0FBSyxnQkFDYjtBQUVKLFdBQUssVUFBVSxLQUFLLFVBQVUsS0FBSztBQUNuQyxXQUFLLFVBQVUsT0FBTyxLQUFLLFlBQVksV0FDbkMsR0FBRyxLQUFLLFdBQ1IsT0FBTyxLQUFLO0FBQ2hCLFdBQUssVUFBVSxDQUFDLE1BQU0sS0FBSyxXQUN2QixLQUFLLElBQUksS0FBSyxJQUFJLEdBQUcsS0FBSyxVQUFVLGNBQ3BDO0FBRUosV0FBSyxRQUFRLEtBQUssT0FDZCxRQUFRLEtBQUssUUFDYjtBQUVKLFVBQUksQ0FBQyxLQUFLLFNBQVMsS0FBSyxNQUFNO0FBQzVCLGFBQUssS0FBSyxLQUFLO0FBQUE7QUFBQTtBQVFuQixTQUFLLFNBQVMsWUFBWTtBQVUxQixlQUFXLFVBQVUsT0FBTyxVQUFVLFNBQVMsZUFBZSxLQUFLO0FBQ2pFLFdBQUssUUFBUSxRQUFRO0FBQ3JCLFlBQU0sV0FBVyxLQUFLO0FBQ3RCLGFBQU87QUFBQSxPQUNOO0FBVUgsZUFBVyxVQUFVLFNBQVMsVUFBVSxTQUFTLGdCQUFpQixLQUFLO0FBQ3JFLFdBQUssVUFBVSxRQUFRO0FBQ3ZCLFdBQUssWUFBWTtBQUNqQixZQUFNLGFBQWEsS0FBSztBQUN4QixhQUFPO0FBQUEsT0FDTjtBQVdILGVBQVcsVUFBVSxRQUFRLFVBQVUsU0FBUyxlQUFnQixPQUFPO0FBQ3JFLFVBQUksU0FBUSxDQUFDLFFBQVEsS0FBSyxjQUFjLE9BQU87QUFDL0MsWUFBTSxZQUFZO0FBQ2xCLFdBQUssU0FBUztBQUNkLGFBQU87QUFBQSxPQUNOO0FBVUgsZUFBVyxVQUFVLE9BQU8sY0FBZSxPQUFNO0FBQy9DLFdBQUssUUFBUSxRQUFRLE9BQU87QUFDNUIsWUFBTSxXQUFXLEtBQUs7QUFDdEIsYUFBTztBQUFBO0FBR1QsZUFBVyxVQUFVLE9BQU8sVUFBVSxTQUFTLFdBQVcsVUFBVSxNQUNsRTtBQUVGLGVBQVcsVUFBVSxPQUFPLFVBQVUsU0FBUyxXQUFXLFVBQVUsTUFDbEU7QUFVRixlQUFXLFVBQVUsU0FBUyxVQUFVLFNBQVMsZ0JBQWlCLFFBQVE7QUFDeEUsV0FBSyxVQUFVLE9BQU8sV0FBVyxXQUM3QixHQUFHLFVBQ0gsT0FBTztBQUNYLFdBQUssVUFBVSxDQUFDLE1BQU0sS0FBSyxXQUN2QixLQUFLLElBQUksS0FBSyxJQUFJLEdBQUcsS0FBSyxVQUFVLGNBQ3BDO0FBQ0osWUFBTSxjQUFjLEtBQUs7QUFDekIsYUFBTztBQUFBLE9BQ047QUFVSCxlQUFXLFVBQVUsUUFBUSxlQUFnQixRQUFRLEtBQUs7QUFFeEQsVUFBSSxhQUFhLE1BQU0sVUFBVTtBQUMvQixlQUFPLEtBQUssS0FBSyxTQUFTLGdCQUFnQixRQUFRO0FBQUE7QUFHcEQsVUFBSSxNQUFNLEtBQUs7QUFDZixVQUFJLE1BQU0sU0FBUyxRQUFRLFdBQVcsT0FBTztBQUM3QyxVQUFJLE1BQU0sbUJBQW1CLFNBQVMsV0FBVztBQUdqRCxtQkFBYTtBQUdiLFVBQUksT0FBTyxJQUFJLFNBQVM7QUFDdEIsbUJBQVcsS0FBSyxJQUFJO0FBQUE7QUFJdEIsVUFBSSxhQUFhO0FBQ2pCLFVBQUksVUFBVSxnQkFBZ0I7QUFDOUIsVUFBSSxVQUFVLGtCQUFrQixPQUFPLFdBQVc7QUFDbEQsVUFBSSxVQUFVLDJCQUEyQjtBQUN6QyxVQUFJLFVBQVUsMEJBQTBCO0FBQ3hDLFVBQUksSUFBSTtBQUFBO0FBVVYsZUFBVyxVQUFVLG1CQUFtQiw0QkFBNkI7QUFDbkUsYUFBTyxLQUFLLEtBQUssS0FBSyxLQUFLLFNBQVMsT0FBTztBQUFBO0FBVTdDLGVBQVcsVUFBVSxtQkFBbUIsNEJBQTZCO0FBQ25FLGFBQU8sS0FBSyxJQUFJLFFBQVEsZUFDdEIsS0FBSyxJQUFJLFFBQVEsMEJBQ2pCLEtBQUssSUFBSSxRQUFRLG9CQUNqQixLQUFLLElBQUksUUFBUTtBQUFBO0FBVXJCLGVBQVcsVUFBVSx3QkFBd0IsaUNBQWtDO0FBQzdFLFVBQUksTUFBTSxLQUFLO0FBQ2YsVUFBSSxNQUFNLEtBQUs7QUFHZixVQUFJLFFBQVEsSUFBSSxRQUFRO0FBQ3hCLFVBQUksT0FBTztBQUNULFlBQUksUUFBTyxJQUFJLFVBQVU7QUFDekIsZUFBTyxDQUFDLFNBQVMsVUFBVSxPQUFPLGVBQWUsT0FBTyxNQUFNLFNBQVUsUUFBTztBQUM3RSxpQkFBTyxXQUFVLFNBQVEsV0FBVSxPQUFPLFNBQVEsT0FBTyxXQUFVO0FBQUE7QUFBQTtBQUt2RSxVQUFJLGtCQUFrQixjQUFjLElBQUksUUFBUTtBQUNoRCxVQUFJLENBQUMsTUFBTSxrQkFBa0I7QUFDM0IsWUFBSSxlQUFlLGNBQWMsSUFBSSxVQUFVO0FBQy9DLGVBQU8sTUFBTSxpQkFBaUIsZUFBZTtBQUFBO0FBRy9DLGFBQU87QUFBQTtBQVNULGVBQVcsVUFBVSw0QkFBNEIscUNBQXNDO0FBQ3JGLFVBQUksTUFBTSxLQUFLO0FBRWYsVUFBSSxhQUFhO0FBQ2pCLFVBQUksYUFBYTtBQUNqQixVQUFJLGFBQWE7QUFDakIsVUFBSSxhQUFhO0FBQ2pCLFVBQUksYUFBYTtBQUFBO0FBU25CLGVBQVcsVUFBVSxjQUFjLHVCQUF3QjtBQUN6RCxVQUFJLE1BQU0sS0FBSztBQUNmLFlBQU07QUFDTixXQUFLO0FBQ0wsVUFBSSxhQUFhO0FBQ2pCLFVBQUk7QUFBQTtBQVNOLGVBQVcsVUFBVSxxQkFBcUIsOEJBQStCO0FBQ3ZFLFVBQUksTUFBTSxJQUFJLE1BQU07QUFDcEIsWUFBTTtBQUNOLFdBQUssTUFBTSxLQUFLO0FBQUE7QUFXbEIsZUFBVyxVQUFVLGFBQWEsc0JBQXVCO0FBQ3ZELFVBQUksYUFBYSxLQUFLLElBQUk7QUFDMUIsYUFBUSxjQUFjLE9BQU8sYUFBYSxPQUN4QyxlQUFlO0FBQUE7QUFVbkIsZUFBVyxVQUFVLGNBQWMscUJBQXNCLE9BQU87QUFDOUQsY0FBUSxNQUFNO0FBQUEsYUFDUDtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQ0gsZUFBSyxNQUFNLEtBQUs7QUFDaEI7QUFBQTtBQUVBLGVBQUssTUFBTSxLQUFLO0FBQ2hCO0FBQUE7QUFBQTtBQVdOLGVBQVcsVUFBVSxVQUFVLG1CQUFvQjtBQUNqRCxhQUFPLE1BQU0sS0FBSyxJQUFJLFNBQVM7QUFBQSxRQUM3QixNQUFNLEtBQUssSUFBSSxVQUFVO0FBQUEsUUFDekIsaUJBQWlCLEtBQUssSUFBSSxVQUFVO0FBQUE7QUFBQTtBQVd4QyxlQUFXLFVBQVUsZUFBZSx3QkFBeUI7QUFDM0QsVUFBSSxVQUFVLEtBQUssSUFBSSxRQUFRO0FBRS9CLFVBQUksQ0FBQyxTQUFTO0FBQ1osZUFBTztBQUFBO0FBSVQsVUFBSSxRQUFRLFFBQVEsU0FBUyxJQUFJO0FBQy9CLFlBQUksUUFBTyxLQUFLLElBQUksVUFBVTtBQUM5QixlQUFPLFFBQVEsU0FBUSxRQUFRLFFBQVEsV0FBVTtBQUFBO0FBSW5ELFVBQUksZUFBZSxLQUFLLElBQUksVUFBVTtBQUN0QyxhQUFPLGNBQWMsaUJBQWlCLGNBQWM7QUFBQTtBQVV0RCxlQUFXLFVBQVUsV0FBVyxrQkFBbUIsT0FBTTtBQUN2RCxVQUFJLE1BQU0sS0FBSztBQUVmLFVBQUksYUFBYSxNQUFNLGNBQWM7QUFDbkMsYUFBSyxLQUFLLGFBQWEsS0FBSztBQUM1QjtBQUFBO0FBR0YsVUFBSSxLQUFLLG9CQUFvQjtBQUMzQixhQUFLLE1BQU07QUFDWDtBQUFBO0FBR0YsVUFBSSxNQUFNLFVBQVUsdUJBQXVCLEtBQUssT0FBTztBQUN2RCxVQUFJLE1BQU0sbUJBQW1CLGVBQWUsNkJBQTZCLFdBQVcsT0FBTyxPQUN6RixXQUFXLE9BQU87QUFHcEIsVUFBSSxhQUFhO0FBQ2pCLFVBQUksVUFBVSxnQkFBZ0I7QUFDOUIsVUFBSSxVQUFVLGtCQUFrQixPQUFPLFdBQVc7QUFDbEQsVUFBSSxVQUFVLDJCQUEyQjtBQUN6QyxVQUFJLFVBQVUsMEJBQTBCO0FBQ3hDLFVBQUksVUFBVSxZQUFZO0FBQzFCLFVBQUksSUFBSTtBQUFBO0FBV1YsZUFBVyxVQUFVLE9BQU8sY0FBZSxLQUFLO0FBRTlDLFVBQUksT0FBTyxLQUFLO0FBR2hCLFdBQUssTUFBTTtBQUdYLFVBQUksUUFBTyxPQUFPLEtBQUs7QUFDdkIsVUFBSSxVQUFTLElBQUk7QUFDZixhQUFLLE1BQU07QUFDWCxlQUFPO0FBQUE7QUFJVCxVQUFJLENBQUMsTUFBSyxRQUFRLE9BQU87QUFDdkIsYUFBSyxNQUFNO0FBQ1gsZUFBTztBQUFBO0FBR1QsVUFBSTtBQUNKLFVBQUksU0FBUyxNQUFNO0FBRWpCLFlBQUksT0FBTTtBQUNSLGtCQUFPLFVBQVUsTUFBTSxNQUFNO0FBQUE7QUFJL0IsWUFBSSxlQUFlLEtBQUssUUFBTztBQUM3QixnQkFBTSx1QkFBdUI7QUFDN0IsZUFBSyxNQUFNO0FBQ1gsaUJBQU87QUFBQTtBQUlULGdCQUFRLE1BQUssTUFBTTtBQUduQixnQkFBTyxVQUFVLEtBQUssTUFBTTtBQUFBLGFBQ3ZCO0FBRUwsWUFBSSxlQUFlLEtBQUssUUFBTztBQUM3QixnQkFBTSx1QkFBdUI7QUFDN0IsZUFBSyxNQUFNO0FBQ1gsaUJBQU87QUFBQTtBQUlULGdCQUFRLFVBQVUsT0FBTSxNQUFNO0FBRzlCLGdCQUFPLFFBQVE7QUFBQTtBQUlqQixVQUFJLGdCQUFnQixRQUFRO0FBQzFCLFlBQUksU0FBUyxLQUFLO0FBR2xCLFlBQUksV0FBVyxRQUFXO0FBQ3hCLG1CQUFTLE1BQU0sTUFBTSxTQUFTLEdBQUcsT0FBTyxNQUNuQyxLQUFLLFVBQVUsVUFBVSxXQUMxQjtBQUFBO0FBR04sY0FBTSxtQkFBbUIsUUFBUTtBQUNqQyxnQkFBUTtBQUFBLGVBQ0Q7QUFDSDtBQUFBLGVBQ0c7QUFDSCxpQkFBSyxNQUFNO0FBQ1gsbUJBQU87QUFBQSxlQUNKO0FBQUE7QUFFSCxpQkFBSyxNQUFNO0FBQ1gsbUJBQU87QUFBQTtBQUFBO0FBS2IsVUFBSSxLQUFLLE9BQU8sVUFBVSxLQUFLLG9CQUFvQjtBQUNqRCxhQUFLLFVBQVU7QUFDZixlQUFPO0FBQUE7QUFHVCxXQUFLLFNBQVM7QUFDZCxhQUFPO0FBQUE7QUFVVCxlQUFXLFVBQVUsT0FBTyxlQUFlLE9BQU0sTUFBTTtBQUNyRCxVQUFJLE1BQU0sS0FBSztBQUNmLFVBQUksVUFBVSxLQUFLO0FBQ25CLFVBQUksT0FBTztBQUNYLFVBQUksTUFBTSxLQUFLO0FBQ2YsVUFBSSxNQUFNLEtBQUs7QUFDZixVQUFJLFNBQVMsSUFBSSxRQUFRO0FBQ3pCLFVBQUksU0FBUyxRQUFRLFNBQVM7QUFFOUIsVUFBSSxZQUFZLE1BQU07QUFFcEIsYUFBSztBQUNMO0FBQUE7QUFHRixZQUFNLGFBQWE7QUFHbkIsV0FBSyxVQUFVLE9BQU07QUFHckIsV0FBSyxLQUFLO0FBR1YsVUFBSSxLQUFLLG9CQUFvQjtBQUMzQixZQUFJLEtBQUsseUJBQXlCO0FBQ2hDLGVBQUssTUFBTTtBQUNYO0FBQUE7QUFHRixZQUFJLEtBQUssZ0JBQWdCLEtBQUssV0FBVztBQUN2QyxlQUFLO0FBQ0w7QUFBQTtBQUFBO0FBS0osWUFBTSxLQUFLLElBQUksR0FBRyxNQUFNO0FBQ3hCLFVBQUksUUFBUSxRQUFRLFFBQVc7QUFDN0IsWUFBSSxRQUFRLFFBQVEsTUFBTSxTQUFTO0FBQ25DLFlBQUksTUFBTTtBQUFPLGdCQUFNO0FBQUE7QUFJekIsVUFBSSxLQUFLLGlCQUFpQixtQkFBbUIsS0FBSyxTQUFTO0FBRXpELGlCQUFTLFdBQVcsS0FBSyxRQUFRO0FBQUEsVUFDL0IsU0FBUztBQUFBO0FBSVgsWUFBSSxDQUFDLEtBQUssZ0JBQWdCO0FBQ3hCLGdCQUFNO0FBQ04sbUJBQVM7QUFBQTtBQUlYLFlBQUksV0FBVyxJQUFJO0FBQ2pCLGdCQUFNO0FBR04sY0FBSSxVQUFVLGlCQUFpQixhQUFhLFNBQVM7QUFHckQsaUJBQU8sS0FBSyxNQUFNLEtBQUs7QUFBQSxZQUNyQixTQUFTLEVBQUUsaUJBQWlCLElBQUksVUFBVTtBQUFBO0FBQUE7QUFLOUMsWUFBSSxXQUFXLE1BQU0sT0FBTyxXQUFXLEdBQUc7QUFDeEMsZ0JBQU0sWUFBWTtBQUdsQixjQUFJLGFBQWE7QUFDakIsY0FBSSxVQUFVLGlCQUFpQixhQUFhLFNBQVMsS0FBSyxPQUFPO0FBR2pFLG9CQUFVLE9BQU8sR0FBRztBQUNwQixnQkFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLEdBQUcsUUFBUTtBQUFBO0FBQUE7QUFLNUMsZUFBUyxRQUFRLFNBQVM7QUFDeEIsYUFBSyxRQUFRLFFBQVE7QUFBQTtBQUl2QixXQUFLLFFBQVE7QUFDYixXQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsU0FBUyxNQUFNO0FBRzNDLFVBQUksVUFBVSxrQkFBa0I7QUFHaEMsVUFBSSxJQUFJLFdBQVcsUUFBUTtBQUN6QixZQUFJO0FBQ0o7QUFBQTtBQUdGLFdBQUssT0FBTyxPQUFNO0FBQUE7QUFTcEIsZUFBVyxVQUFVLFdBQVcsa0JBQW1CLE9BQU07QUFDdkQsVUFBSSxJQUFJO0FBQ1IsVUFBSSxPQUFPO0FBRVgsWUFBTSxhQUFhO0FBQ25CLFVBQUcsS0FBSyxPQUFNLGdCQUFpQixLQUFLLE1BQU07QUFDeEMsWUFBSSxPQUFPLElBQUksU0FBUyxZQUFZLENBQUMsUUFBUSxVQUFTLE1BQUssTUFBSyxTQUFTLE9BQU8sS0FBSztBQUVuRixpQkFBTyxLQUFLO0FBQUE7QUFFZCxZQUFJO0FBQUssaUJBQU8sS0FBSyxZQUFZO0FBQ2pDLFlBQUksS0FBSztBQUFlLGlCQUFPLEtBQUssU0FBUztBQUM3QyxhQUFLLEtBQUssUUFBUSxPQUFNO0FBQ3hCLGFBQUssS0FBSyxPQUFNO0FBQUE7QUFHbEIsb0JBQWUsS0FBSztBQUNsQixZQUFJLEtBQUssWUFBWSxVQUFVLEdBQUc7QUFDaEMsaUJBQU8sTUFDSCxLQUFLLFlBQVksT0FDakIsS0FBSyxNQUFNO0FBQUE7QUFHakIsWUFBSSxJQUFJLFFBQU8sTUFBTSxLQUFLLFlBQVk7QUFFdEMsY0FBTSxhQUFhO0FBQ25CLFlBQUcsS0FBSyxHQUFHLFNBQVUsTUFBSyxNQUFNO0FBQzlCLGNBQUk7QUFBSyxtQkFBTyxLQUFLO0FBQ3JCLGNBQUksS0FBSztBQUFlLG1CQUFPO0FBQy9CLGVBQUssS0FBSyxRQUFRLEdBQUc7QUFDckIsZUFBSyxLQUFLLEdBQUc7QUFBQTtBQUFBO0FBQUE7QUFXbkIsZUFBVyxVQUFVLFlBQVksbUJBQW9CLE9BQU07QUFDekQsVUFBSSxJQUFJO0FBQ1IsVUFBSSxPQUFPO0FBRVgsb0JBQWUsS0FBSztBQUNsQixZQUFJLEVBQUUsS0FBSyxLQUFLLE9BQU8sUUFBUTtBQUM3QixjQUFJO0FBQUssbUJBQU8sS0FBSyxZQUFZO0FBQ2pDLGlCQUFPLEtBQUssTUFBTTtBQUFBO0FBR3BCLFlBQUksSUFBSSxLQUFLLE9BQU0sS0FBSyxPQUFPO0FBRS9CLGNBQU0sYUFBYTtBQUNuQixZQUFHLEtBQUssR0FBRyxTQUFVLE1BQUssTUFBTTtBQUM5QixjQUFJO0FBQUssbUJBQU8sS0FBSztBQUNyQixjQUFJLEtBQUs7QUFBZSxtQkFBTztBQUMvQixlQUFLLEtBQUssUUFBUSxHQUFHO0FBQ3JCLGVBQUssS0FBSyxHQUFHO0FBQUE7QUFBQTtBQUlqQjtBQUFBO0FBV0YsZUFBVyxVQUFVLFNBQVMsZ0JBQWlCLE9BQU0sU0FBUztBQUM1RCxVQUFJLE9BQU87QUFDWCxVQUFJLE1BQU0sS0FBSztBQUdmLFVBQUksVUFBUyxJQUFHLGlCQUFpQixPQUFNO0FBQ3ZDLFdBQUssS0FBSyxVQUFVO0FBQ3BCLGNBQU8sS0FBSztBQUdaLHlCQUFvQjtBQUNsQixnQkFBUSxTQUFRO0FBQUE7QUFJbEIsaUJBQVcsS0FBSztBQUdoQixjQUFPLEdBQUcsU0FBUyxpQkFBa0IsS0FBSztBQUV4QztBQUdBLGFBQUssWUFBWTtBQUFBO0FBSW5CLGNBQU8sR0FBRyxPQUFPLGlCQUFrQjtBQUNqQyxhQUFLLEtBQUs7QUFBQTtBQUFBO0FBWWQsZUFBVyxVQUFVLE9BQU8sY0FBZSxPQUFNO0FBQy9DLFVBQUksTUFBTSxLQUFLO0FBRWYsVUFBSSxJQUFJLFVBQVU7QUFBaUI7QUFFbkMsVUFBSSxRQUFPLE1BQUssT0FBTztBQUV2QixVQUFJLENBQUMsT0FBTTtBQUNULGNBQU07QUFDTjtBQUFBO0FBR0YsVUFBSSxVQUFVLE1BQUssU0FBUyxPQUFPO0FBRW5DLFlBQU0sbUJBQW1CO0FBQ3pCLFVBQUksVUFBVSxnQkFBZ0IsUUFBUSxXQUFVLGVBQWUsVUFBVTtBQUFBO0FBWTNFLGVBQVcsVUFBVSxZQUFZLG1CQUFvQixPQUFNLE1BQU07QUFDL0QsVUFBSSxNQUFNLEtBQUs7QUFFZixXQUFLLEtBQUssV0FBVyxLQUFLLE9BQU07QUFFaEMsVUFBSSxLQUFLLGlCQUFpQixDQUFDLElBQUksVUFBVSxrQkFBa0I7QUFDekQsY0FBTTtBQUNOLFlBQUksVUFBVSxpQkFBaUI7QUFBQTtBQUdqQyxVQUFJLEtBQUssaUJBQWlCLENBQUMsSUFBSSxVQUFVLGtCQUFrQjtBQUN6RCxZQUFJLGVBQWUscUJBQXFCLEtBQUssTUFBTSxLQUFLLFVBQVU7QUFFbEUsWUFBSSxLQUFLLFlBQVk7QUFDbkIsMEJBQWdCO0FBQUE7QUFHbEIsY0FBTSxvQkFBb0I7QUFDMUIsWUFBSSxVQUFVLGlCQUFpQjtBQUFBO0FBR2pDLFVBQUksS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLFVBQVUsa0JBQWtCO0FBQ3pELFlBQUksV0FBVyxLQUFLLE1BQU07QUFDMUIsY0FBTSxlQUFlO0FBQ3JCLFlBQUksVUFBVSxpQkFBaUI7QUFBQTtBQUdqQyxVQUFJLEtBQUssU0FBUyxDQUFDLElBQUksVUFBVSxTQUFTO0FBQ3hDLFlBQUksTUFBTSxLQUFLO0FBQ2YsY0FBTSxXQUFXO0FBQ2pCLFlBQUksVUFBVSxRQUFRO0FBQUE7QUFBQTtBQVcxQiwwQkFBdUIsS0FBSztBQUMxQixVQUFJLFVBQVUsZUFBZTtBQUU3QixlQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3ZDLFlBQUksYUFBYSxRQUFRO0FBQUE7QUFBQTtBQVU3QixvQ0FBaUMsS0FBSztBQUNwQyxlQUFTLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxLQUFLO0FBQ25DLFlBQUksSUFBSSxPQUFPLEtBQUs7QUFDbEI7QUFBQTtBQUFBO0FBSUosYUFBTyxJQUFJLElBQ1AsTUFBTSxJQUFJLE9BQU8sS0FDakI7QUFBQTtBQVNOLDZCQUEwQixPQUFPO0FBQy9CLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDckMsWUFBSSxPQUFPLE1BQU07QUFDakIsWUFBSSxLQUFLLFNBQVMsS0FBSyxLQUFLLE9BQU8sS0FBSztBQUN0QyxpQkFBTztBQUFBO0FBQUE7QUFJWCxhQUFPO0FBQUE7QUFXVCwwQkFBdUIsTUFBTSxNQUFNLE9BQU87QUFDeEMsYUFBTyxPQUFPLE1BQU8sU0FBUSxNQUFNLFFBQVEsTUFBTSxNQUFNLE1BQU0sT0FBTyxNQUFNO0FBQUE7QUFXNUUsZ0NBQTZCLE9BQU8sTUFBTTtBQUN4QyxhQUFPLCtFQUlPLFFBQVEscUNBR1YsT0FBTztBQUFBO0FBYXJCLDZCQUEwQixRQUFRLEtBQUs7QUFDckMsVUFBSSxDQUFDLEtBQUs7QUFDUixlQUFPLFlBQVk7QUFBQTtBQUdyQixhQUFPLGVBQWUsUUFDbEIsWUFBWSxRQUFRLEtBQUssRUFBRSxRQUFRLFdBQ25DLFlBQVksUUFBUTtBQUFBO0FBYTFCLG9CQUFpQixPQUFNO0FBQ3JCLFVBQUk7QUFDRixlQUFPLG1CQUFtQjtBQUFBLGVBQ25CLEtBQVA7QUFDQSxlQUFPO0FBQUE7QUFBQTtBQVlYLDRCQUF5QixLQUFLO0FBQzVCLGFBQU8sT0FBTyxJQUFJLG1CQUFtQixhQUNqQyxPQUFPLEtBQUssSUFBSSxZQUFZLE1BQzVCLElBQUk7QUFBQTtBQWVWLDBCQUF1QixTQUFTLE1BQU07QUFDcEMsVUFBSSxRQUFRLE9BQU8sUUFBUSxrQkFBa0IsYUFDekMsUUFBUSxVQUFVLE1BQU0sU0FDeEIsUUFBUSxjQUFjO0FBRTFCLGFBQU8sUUFBUTtBQUFBO0FBV2pCLHlCQUFzQixLQUFLO0FBQ3pCLGFBQU8sT0FBTyxJQUFJLGdCQUFnQixZQUM5QixRQUFRLElBQUksV0FDWixJQUFJO0FBQUE7QUFXViwyQkFBd0IsS0FBSyxNQUFNO0FBQ2pDLFVBQUksT0FBTyxHQUFHLE9BQU8sT0FBTztBQUU1QixlQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ3BDLFlBQUksT0FBTyxLQUFLLE9BQU8sVUFBVTtBQUMvQixnQkFBTSxJQUFJLFVBQVUsT0FBTztBQUFBO0FBQUE7QUFJL0IsYUFBTztBQUFBO0FBVVQsMkJBQXdCLE1BQU07QUFDNUIsVUFBSSxZQUFZLFFBQVEsS0FBSyxNQUFNO0FBRW5DLGFBQU8sT0FBTyxjQUFjLFdBQ3hCLFlBQ0E7QUFBQTtBQVVOLDRCQUF5QixLQUFLO0FBQzVCLFVBQUksTUFBTTtBQUNWLFVBQUksT0FBTztBQUNYLFVBQUksUUFBUTtBQUdaLGVBQVMsSUFBSSxHQUFHLE1BQU0sSUFBSSxRQUFRLElBQUksS0FBSyxLQUFLO0FBQzlDLGdCQUFRLElBQUksV0FBVztBQUFBLGVBQ2hCO0FBQ0gsZ0JBQUksVUFBVSxLQUFLO0FBQ2pCLHNCQUFRLE1BQU0sSUFBSTtBQUFBO0FBRXBCO0FBQUEsZUFDRztBQUNILGdCQUFJLFVBQVUsS0FBSztBQUNqQixtQkFBSyxLQUFLLElBQUksVUFBVSxPQUFPO0FBQUE7QUFFakMsb0JBQVEsTUFBTSxJQUFJO0FBQ2xCO0FBQUE7QUFFQSxrQkFBTSxJQUFJO0FBQ1Y7QUFBQTtBQUFBO0FBS04sVUFBSSxVQUFVLEtBQUs7QUFDakIsYUFBSyxLQUFLLElBQUksVUFBVSxPQUFPO0FBQUE7QUFHakMsYUFBTztBQUFBO0FBV1Qsd0JBQXFCLEtBQUssU0FBUztBQUNqQyxVQUFJLE9BQU8sT0FBTyxLQUFLO0FBRXZCLGVBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDcEMsWUFBSSxNQUFNLEtBQUs7QUFDZixZQUFJLFVBQVUsS0FBSyxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ3BuQy9CO0FBQUE7QUFNQTtBQU9BLFlBQU8sVUFBVTtBQVVqQix1QkFBb0IsS0FBSztBQUN2QixVQUFJLENBQUMsS0FBSztBQUNSLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFJdEIsVUFBSSxhQUFhLE1BQU0sSUFBSSxRQUFRLHNCQUFzQjtBQUN6RCxVQUFJLGFBQWEsY0FBYztBQUMvQixVQUFJLFFBQVEsQ0FBQyxZQUFZLE9BQU87QUFHaEMsYUFBTztBQUFBO0FBV1QsMkJBQXdCLEtBQUs7QUFDM0IsYUFBTyxJQUFJLFNBQ1AsSUFBSSxPQUFPLGdCQUNYLElBQUksV0FBVztBQUFBO0FBVXJCLG1CQUFnQixRQUFRO0FBQ3RCLFVBQUksTUFBTSxPQUFPO0FBQ2pCLFVBQUksT0FBTztBQUNYLFVBQUksUUFBUSxPQUFPO0FBR25CLGVBQVMsSUFBSSxPQUFPLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUMzQyxnQkFBUSxPQUFPLFdBQVc7QUFBQSxlQUNuQjtBQUNILGdCQUFJLFVBQVUsS0FBSztBQUNqQixzQkFBUSxNQUFNO0FBQUE7QUFFaEI7QUFBQSxlQUNHO0FBQ0gsZ0JBQUksVUFBVSxLQUFLO0FBQ2pCLG1CQUFLLEtBQUssT0FBTyxVQUFVLE9BQU87QUFBQTtBQUVwQyxvQkFBUSxNQUFNO0FBQ2Q7QUFBQTtBQUVBLG9CQUFRO0FBQ1I7QUFBQTtBQUFBO0FBS04sVUFBSSxVQUFVLEtBQUs7QUFDakIsYUFBSyxLQUFLLE9BQU8sVUFBVSxPQUFPO0FBQUE7QUFHcEMsYUFBTztBQUFBO0FBQUE7QUFBQTs7O0FDeEZUO0FBQUE7QUFBQSxJQUFDLFlBQVc7QUFDVixVQUFJLFlBQVksUUFBUSxVQUFVLGFBQWEsVUFBVSxhQUFhLFdBQVcsTUFBTTtBQUV2RixlQUFTO0FBRVQsYUFBTztBQUVQLFVBQUssT0FBTyxZQUFXLGVBQWUsWUFBVyxRQUFTLFFBQU8sU0FBUztBQUN4RSxnQkFBTyxVQUFVO0FBQUEsYUFDWjtBQUNMLGFBQUssWUFBWTtBQUFBO0FBR25CLGtCQUFZLFNBQVMsT0FBTyxRQUFRLFVBQVUsVUFBVTtBQUN0RCxZQUFJLE1BQU07QUFDVixZQUFJLE1BQU0sV0FBVyxPQUFPLFFBQVE7QUFDbEMsZ0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFFbEIsZUFBTztBQUNQLGVBQU8sV0FBVyxHQUFHO0FBQ25CLGtCQUFRLFdBQVc7QUFDbkIsY0FBSSxRQUFRLEdBQUc7QUFDYixvQkFBUTtBQUFBO0FBRVYsY0FBSSxNQUFNLFNBQVMsVUFBVSxPQUFPLFNBQVMsT0FBTztBQUNsRCxtQkFBTztBQUFBO0FBRVQsc0JBQVk7QUFDWixrQkFBUTtBQUFBO0FBRVYsZUFBTztBQUFBO0FBR1QsYUFBTyxjQUFjLFNBQVMsU0FBUyxXQUFXLGFBQWE7QUFDN0QsWUFBSSxHQUFHLEtBQUssV0FBVyxjQUFjO0FBQ3JDLFlBQUksZUFBZSxNQUFNO0FBQ3ZCLHdCQUFjO0FBQUE7QUFFaEIsYUFBSyxhQUFhLFdBQVc7QUFDM0IseUJBQWUsVUFBVTtBQUN6QixjQUFJLGFBQWEsTUFBTSxDQUFFLGNBQWEsY0FBYyxRQUFRO0FBQzFELDJCQUFlLENBQUM7QUFBQTtBQUVsQixlQUFLLElBQUksR0FBRyxNQUFNLGFBQWEsUUFBUSxJQUFJLEtBQUssS0FBSztBQUNuRCxxQkFBUyxhQUFhO0FBQ3RCLGdCQUFJLFFBQVEsV0FBVyxPQUFPLEdBQUcsUUFBUTtBQUN2QyxrQkFBSSxRQUFRLE1BQU0sTUFBTSxTQUFTLFNBQVM7QUFDeEMsdUJBQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtmLGVBQU87QUFBQTtBQUdULGFBQU8sT0FBUSxXQUFXO0FBQ3hCLHNCQUFjLFFBQVE7QUFDcEIsY0FBSSxHQUFHLEtBQUs7QUFDWixjQUFJLE9BQU8sV0FBVyxHQUFHO0FBQ3ZCLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBRWxCLGVBQUssSUFBSSxHQUFHLE1BQU0sT0FBTyxRQUFRLElBQUksS0FBSyxLQUFLO0FBQzdDLG9CQUFRLE9BQU87QUFDZixnQkFBSSxDQUFHLE1BQUssU0FBUyxTQUFTLE1BQU87QUFDbkMsb0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFBQTtBQUdwQixlQUFLLFNBQVM7QUFBQTtBQUdoQixhQUFLLFVBQVUsT0FBTyxXQUFXO0FBQy9CLGlCQUFPO0FBQUE7QUFHVCxhQUFLLFVBQVUsV0FBVyxXQUFXO0FBQ25DLGlCQUFPLEtBQUssT0FBTyxLQUFLO0FBQUE7QUFHMUIsYUFBSyxVQUFVLHFCQUFxQixXQUFXO0FBQzdDLGlCQUFPLEtBQUs7QUFBQTtBQUdkLGFBQUssVUFBVSxjQUFjLFdBQVc7QUFDdEMsaUJBQU8sS0FBSyxPQUFPLE1BQU07QUFBQTtBQUczQixhQUFLLFVBQVUsUUFBUSxTQUFTLE9BQU8sV0FBVztBQUNoRCxjQUFJO0FBQ0osY0FBSSxjQUFjLFFBQVE7QUFDeEIsa0JBQU0sT0FBTyxRQUFRLElBQUksSUFBSSxZQUFZLElBQUk7QUFBQTtBQUUvQyxjQUFJLE1BQU0sV0FBVyxRQUFRO0FBQzNCLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBRWxCLGlCQUFPLFVBQVUsS0FBSyxRQUFRLE1BQU0sUUFBUSxHQUFHO0FBQUE7QUFHakQsYUFBSyxVQUFVLGdCQUFnQjtBQUFBLFVBQzdCLGFBQWEsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUs7QUFBQSxVQUN2QyxXQUFXLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxPQUFPO0FBQUEsVUFDN0MsV0FBVyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSztBQUFBLFVBQ3ZDLFdBQVcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxHQUFHLEtBQUs7QUFBQSxVQUN6QyxVQUFVLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLO0FBQUEsVUFDdEMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLElBQUksR0FBRyxLQUFLO0FBQUEsVUFDOUMsV0FBVyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEdBQUcsS0FBSztBQUFBLFVBQ3hHLFVBQVUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUs7QUFBQTtBQUcvTSxhQUFLLFVBQVUsUUFBUSxXQUFXO0FBQ2hDLGlCQUFPLE9BQU8sWUFBWSxNQUFNLEtBQUs7QUFBQTtBQUd2QyxhQUFLLFVBQVUsc0JBQXNCLFdBQVc7QUFDOUMsaUJBQU8sT0FBTyxLQUFLLE1BQU0sWUFBYSxLQUFLO0FBQUE7QUFHN0MsYUFBSyxVQUFVLDZCQUE2QixXQUFXO0FBQ3JELGNBQUksTUFBTSxHQUFHLEdBQUcsT0FBTyxNQUFNLE9BQU87QUFDcEMsc0JBQVk7QUFBQSxZQUNWLEdBQUc7QUFBQSxZQUNILEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQTtBQUVQLGlCQUFPO0FBQ1AsaUJBQU87QUFDUCxlQUFLLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEtBQUssSUFBSTtBQUNuQyxvQkFBUSxLQUFLLE9BQU87QUFDcEIsZ0JBQUksU0FBUyxXQUFXO0FBQ3RCLHNCQUFRLFVBQVU7QUFDbEIsa0JBQUksUUFBUSxVQUFVLEdBQUc7QUFDdkIsdUJBQU87QUFBQTtBQUVULGtCQUFJLFVBQVUsR0FBRztBQUNmLHVCQUFPO0FBQUE7QUFFVCxzQkFBUTtBQUFBLG1CQUNIO0FBQ0wscUJBQU87QUFBQTtBQUFBO0FBR1gsaUJBQU8sS0FBSztBQUFBO0FBR2QsZUFBTztBQUFBO0FBSVQsaUJBQVc7QUFFWCxvQkFBYztBQUFBLFFBQ1osV0FBVyxJQUFJLE9BQU8sTUFBTSxXQUFXLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxXQUFXLEtBQUs7QUFBQSxRQUNyRyxXQUFXLElBQUksT0FBTyxNQUFNLFdBQVcsS0FBSztBQUFBO0FBRzlDLGFBQU8sS0FBSyxTQUFTLFNBQVMsUUFBUTtBQUNwQyxZQUFJLE9BQU8sY0FBYyxNQUFNLE9BQU87QUFDdEMsdUJBQWUsU0FBUyxTQUFRO0FBQzlCLGNBQUksUUFBTyxPQUFPLE9BQU8sUUFBTyxPQUFPLEtBQUs7QUFDMUMsbUJBQU8sU0FBUyxTQUFRO0FBQUEsaUJBQ25CO0FBQ0wsbUJBQU8sU0FBUztBQUFBO0FBQUE7QUFHcEIsWUFBSSxRQUFRLE9BQU8sTUFBTSxZQUFZLFlBQVk7QUFDL0MsaUJBQVEsV0FBVztBQUNqQixnQkFBSSxHQUFHLEtBQUssS0FBSztBQUNqQixrQkFBTSxNQUFNLE1BQU0sR0FBRztBQUNyQixzQkFBVTtBQUNWLGlCQUFLLElBQUksR0FBRyxNQUFNLElBQUksUUFBUSxJQUFJLEtBQUssS0FBSztBQUMxQyxxQkFBTyxJQUFJO0FBQ1gsc0JBQVEsS0FBSyxhQUFhO0FBQUE7QUFFNUIsbUJBQU87QUFBQTtBQUFBLG1CQUVBLFFBQVEsT0FBTyxNQUFNLFlBQVksWUFBWTtBQUN0RCxrQkFBUSxhQUFhLE1BQU07QUFDM0IsY0FBSSxRQUFRLGNBQWMsUUFBUSxHQUFHO0FBQ25DLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBRWxCLGlCQUFTLFdBQVc7QUFDbEIsZ0JBQUksR0FBRztBQUNQLHNCQUFVO0FBQ1YsaUJBQUssUUFBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLFFBQVEsS0FBSyxHQUFHO0FBQzNDLHNCQUFRLEtBQU0sU0FBUyxRQUFTO0FBQUE7QUFFbEMsbUJBQU87QUFBQSxjQUNIO0FBQUEsZUFDRDtBQUNMLGlCQUFPO0FBQUE7QUFBQTtBQUlYLGFBQU8sT0FBUSxXQUFXO0FBQ3hCLHNCQUFjLE9BQU8sUUFBUTtBQUMzQixjQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTTtBQUN4QixjQUFJLE1BQU0sV0FBVyxJQUFJO0FBQ3ZCLGlCQUFLLFFBQVE7QUFDYixpQkFBSyxJQUFJLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxLQUFLLEdBQUc7QUFDbkMsbUJBQUssTUFBTSxLQUFNLE1BQU0sTUFBTSxJQUFLLE1BQU0sSUFBSTtBQUFBO0FBQUEscUJBRXJDLE1BQU0sV0FBVyxHQUFHO0FBQzdCLGlCQUFLLFFBQVE7QUFBQSxpQkFDUjtBQUNMLGtCQUFNLElBQUksTUFBTTtBQUFBO0FBRWxCLGdCQUFNLEtBQUs7QUFDWCxlQUFLLElBQUksR0FBRyxNQUFNLElBQUksUUFBUSxJQUFJLEtBQUssS0FBSztBQUMxQyxtQkFBTyxJQUFJO0FBQ1gsZ0JBQUksQ0FBRyxNQUFLLFFBQVEsUUFBUSxRQUFVO0FBQ3BDLG9CQUFNLElBQUksTUFBTTtBQUFBO0FBQUE7QUFHcEIsY0FBSSxRQUFRO0FBQ1YsaUJBQUssU0FBUztBQUFBO0FBQUE7QUFJbEIsYUFBSyxVQUFVLE9BQU8sV0FBVztBQUMvQixpQkFBTztBQUFBO0FBR1QsYUFBSyxVQUFVLFdBQVcsV0FBVztBQUNuQyxpQkFBTyxLQUFLLHFCQUFxQixRQUFRLG9CQUFvQjtBQUFBO0FBRy9ELGFBQUssVUFBVSxrQkFBa0IsV0FBVztBQUMxQyxjQUFJLGdCQUFnQixpQkFBaUIsT0FBTyxPQUFPO0FBQ25ELGtCQUFRO0FBQ1IsbUJBQVMsS0FBSztBQUNkLDJCQUFpQjtBQUNqQiw0QkFBa0I7QUFDbEIsaUJBQVEsUUFBUSxNQUFNLEtBQUssU0FBVTtBQUNuQyxnQkFBSSxNQUFNLEdBQUcsU0FBUyxpQkFBaUI7QUFDckMsK0JBQWlCLE1BQU07QUFDdkIsZ0NBQWtCLE1BQU0sR0FBRztBQUFBO0FBQUE7QUFHL0IsY0FBSSxrQkFBa0IsR0FBRztBQUN2QixtQkFBTztBQUFBO0FBRVQsaUJBQU8sT0FBTyxVQUFVLEdBQUcsa0JBQWtCLE9BQU8sT0FBTyxVQUFVLGlCQUFpQjtBQUFBO0FBR3hGLGFBQUssVUFBVSxjQUFjLFdBQVc7QUFDdEMsY0FBSSxPQUFPLEdBQUcsS0FBSyxNQUFNO0FBQ3pCLGtCQUFRO0FBQ1IsZ0JBQU0sS0FBSztBQUNYLGVBQUssSUFBSSxHQUFHLE1BQU0sSUFBSSxRQUFRLElBQUksS0FBSyxLQUFLO0FBQzFDLG1CQUFPLElBQUk7QUFDWCxrQkFBTSxLQUFLLFFBQVE7QUFDbkIsa0JBQU0sS0FBSyxPQUFPO0FBQUE7QUFFcEIsaUJBQU87QUFBQTtBQUdULGFBQUssVUFBVSxxQkFBcUIsV0FBVztBQUM3QyxjQUFJLE1BQU0sTUFBTTtBQUNoQixpQkFBUyxXQUFXO0FBQ2xCLGdCQUFJLEdBQUcsS0FBSyxLQUFLO0FBQ2pCLGtCQUFNLEtBQUs7QUFDWCxzQkFBVTtBQUNWLGlCQUFLLElBQUksR0FBRyxNQUFNLElBQUksUUFBUSxJQUFJLEtBQUssS0FBSztBQUMxQyxxQkFBTyxJQUFJO0FBQ1gsc0JBQVEsS0FBSyxLQUFLLFNBQVM7QUFBQTtBQUU3QixtQkFBTztBQUFBLFlBQ04sS0FBSyxNQUFPLEtBQUs7QUFDcEIsbUJBQVM7QUFDVCxjQUFJLEtBQUssUUFBUTtBQUNmLHFCQUFTLE1BQU0sS0FBSztBQUFBO0FBRXRCLGlCQUFPLE9BQU87QUFBQTtBQUdoQixhQUFLLFVBQVUsc0JBQXNCLFdBQVc7QUFDOUMsY0FBSSxNQUFNLE1BQU07QUFDaEIsaUJBQVMsV0FBVztBQUNsQixnQkFBSSxHQUFHLEtBQUssS0FBSztBQUNqQixrQkFBTSxLQUFLO0FBQ1gsc0JBQVU7QUFDVixpQkFBSyxJQUFJLEdBQUcsTUFBTSxJQUFJLFFBQVEsSUFBSSxLQUFLLEtBQUs7QUFDMUMscUJBQU8sSUFBSTtBQUNYLHNCQUFRLEtBQUssS0FBSyxTQUFTLElBQUksU0FBUyxHQUFHO0FBQUE7QUFFN0MsbUJBQU87QUFBQSxZQUNOLEtBQUssTUFBTyxLQUFLO0FBQ3BCLG1CQUFTO0FBQ1QsY0FBSSxLQUFLLFFBQVE7QUFDZixxQkFBUyxNQUFNLEtBQUs7QUFBQTtBQUV0QixpQkFBTyxPQUFPO0FBQUE7QUFHaEIsYUFBSyxVQUFVLFFBQVEsU0FBUyxPQUFPLFdBQVc7QUFDaEQsY0FBSTtBQUNKLGNBQUksY0FBYyxRQUFRO0FBQ3hCLGtCQUFNLE9BQU8sUUFBUSxJQUFJLElBQUksWUFBWSxJQUFJO0FBQUE7QUFFL0MsY0FBSSxNQUFNLFdBQVcsUUFBUTtBQUMzQixrQkFBTSxJQUFJLE1BQU07QUFBQTtBQUVsQixpQkFBTyxVQUFVLEtBQUssT0FBTyxNQUFNLE9BQU8sSUFBSTtBQUFBO0FBR2hELGFBQUssVUFBVSxnQkFBZ0I7QUFBQSxVQUM3QixhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLO0FBQUEsVUFDbEQsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQVEsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSztBQUFBLFVBQ3JELFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUs7QUFBQSxVQUNyRCxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLO0FBQUEsVUFDL0MsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQVEsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSztBQUFBLFVBQ3ZELFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsT0FBUSxHQUFHLEtBQUs7QUFBQSxVQUN0RCxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFRLEdBQUcsR0FBRyxLQUFLO0FBQUEsVUFDbkQsU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQU0sT0FBUSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSztBQUFBLFVBQ3RELFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUs7QUFBQSxVQUNsRCxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBUSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLO0FBQUEsVUFDbEQsVUFBVSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBUSxNQUFPLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLO0FBQUE7QUFHM0QsYUFBSyxVQUFVLFFBQVEsV0FBVztBQUNoQyxpQkFBTyxPQUFPLFlBQVksTUFBTSxLQUFLO0FBQUE7QUFHdkMsYUFBSyxVQUFVLHNCQUFzQixXQUFXO0FBQzlDLGlCQUFPLEtBQUssWUFBWTtBQUFBO0FBRzFCLGFBQUssVUFBVSxnQkFBZ0IsV0FBVztBQUN4QyxjQUFJLE1BQU0sS0FBSztBQUNmLGNBQUksQ0FBQyxLQUFLLHVCQUF1QjtBQUMvQixrQkFBTSxJQUFJLE1BQU07QUFBQTtBQUVsQixnQkFBTSxLQUFLLE1BQU0sTUFBTSxLQUFLLE9BQU8sSUFBSSxJQUFJLE1BQU0sSUFBSTtBQUNyRCxpQkFBTyxJQUFJLE9BQU8sS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLEtBQU0sT0FBTyxHQUFHLE1BQU07QUFBQTtBQUdsRSxhQUFLLFVBQVUsNkJBQTZCLFdBQVc7QUFDckQsY0FBSSxNQUFNLEdBQUcsR0FBRyxNQUFNLE1BQU0sT0FBTztBQUNuQyxzQkFBWTtBQUFBLFlBQ1YsR0FBRztBQUFBLFlBQ0gsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBO0FBRVQsaUJBQU87QUFDUCxpQkFBTztBQUNQLGVBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksS0FBSyxJQUFJO0FBQ25DLG1CQUFPLEtBQUssTUFBTTtBQUNsQixnQkFBSSxRQUFRLFdBQVc7QUFDckIsc0JBQVEsVUFBVTtBQUNsQixrQkFBSSxRQUFRLFVBQVUsR0FBRztBQUN2Qix1QkFBTztBQUFBO0FBRVQsa0JBQUksVUFBVSxJQUFJO0FBQ2hCLHVCQUFPO0FBQUE7QUFFVCxzQkFBUTtBQUFBLG1CQUNIO0FBQ0wscUJBQU87QUFBQTtBQUFBO0FBR1gsaUJBQU8sTUFBTTtBQUFBO0FBR2YsZUFBTztBQUFBO0FBSVQsaUJBQVc7QUFFWCxrQkFBWTtBQUVaLG9CQUFjO0FBQUEsUUFDWixXQUFXLElBQUksT0FBTyxXQUFXO0FBQUEsUUFDakMsVUFBVSxJQUFJLE9BQU8sWUFBWSxXQUFXLHlCQUF5QixZQUFZLE9BQU87QUFBQSxRQUN4RixjQUFjLElBQUksT0FBUSxVQUFVLFdBQVcsZ0JBQWdCLFdBQVcsUUFBVSxZQUFXLFFBQVEsV0FBVyxRQUFRLFdBQVcsUUFBUSxZQUFhLE9BQU0sWUFBWSxRQUFRO0FBQUE7QUFHdEwsbUJBQWEsU0FBUyxRQUFRLE9BQU87QUFDbkMsWUFBSSxZQUFZLFdBQVcsTUFBTSxhQUFhLGtCQUFrQjtBQUNoRSxZQUFJLE9BQU8sUUFBUSxVQUFVLE9BQU8sWUFBWSxPQUFPO0FBQ3JELGlCQUFPO0FBQUE7QUFFVCxpQkFBVSxRQUFPLE1BQU0sWUFBWSxpQkFBaUIsSUFBSTtBQUN4RCxZQUFJLFFBQVE7QUFDVixtQkFBUyxPQUFPLFVBQVU7QUFDMUIsbUJBQVMsT0FBTyxRQUFRLFFBQVE7QUFBQTtBQUVsQyxxQkFBYTtBQUNiLG9CQUFZO0FBQ1osZUFBUSxhQUFZLE9BQU8sUUFBUSxLQUFLLFlBQVksT0FBTyxHQUFHO0FBQzVEO0FBQUE7QUFFRixZQUFJLE9BQU8sT0FBTyxHQUFHLE9BQU8sTUFBTTtBQUNoQztBQUFBO0FBRUYsWUFBSSxPQUFPLE9BQU8sSUFBSSxPQUFPLE1BQU07QUFDakM7QUFBQTtBQUVGLFlBQUksYUFBYSxPQUFPO0FBQ3RCLGlCQUFPO0FBQUE7QUFFVCwyQkFBbUIsUUFBUTtBQUMzQixzQkFBYztBQUNkLGVBQU8sb0JBQW9CO0FBQ3pCLHlCQUFlO0FBQUE7QUFFakIsaUJBQVMsT0FBTyxRQUFRLE1BQU07QUFDOUIsWUFBSSxPQUFPLE9BQU8sS0FBSztBQUNyQixtQkFBUyxPQUFPLE1BQU07QUFBQTtBQUV4QixZQUFJLE9BQU8sT0FBTyxTQUFTLE9BQU8sS0FBSztBQUNyQyxtQkFBUyxPQUFPLE1BQU0sR0FBRztBQUFBO0FBRTNCLGdCQUFTLFdBQVc7QUFDbEIsY0FBSSxHQUFHLEtBQUssS0FBSztBQUNqQixnQkFBTSxPQUFPLE1BQU07QUFDbkIsb0JBQVU7QUFDVixlQUFLLElBQUksR0FBRyxNQUFNLElBQUksUUFBUSxJQUFJLEtBQUssS0FBSztBQUMxQyxtQkFBTyxJQUFJO0FBQ1gsb0JBQVEsS0FBSyxTQUFTLE1BQU07QUFBQTtBQUU5QixpQkFBTztBQUFBO0FBRVQsZUFBTztBQUFBLFVBQ0w7QUFBQSxVQUNBO0FBQUE7QUFBQTtBQUlKLGFBQU8sS0FBSyxTQUFTLFNBQVMsUUFBUTtBQUNwQyxZQUFJLE1BQU0sR0FBRyxLQUFLLE9BQU8sT0FBTyxRQUFRO0FBQ3hDLFlBQUksWUFBWSxVQUFVLEtBQUssU0FBUztBQUN0QyxpQkFBTyxXQUFXLFFBQVE7QUFBQSxtQkFDakIsUUFBUSxPQUFPLE1BQU0sWUFBWSxrQkFBa0I7QUFDNUQsbUJBQVMsTUFBTSxNQUFNO0FBQ3JCLGlCQUFPLFdBQVcsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLFFBQVE7QUFDbEQsY0FBSSxLQUFLLE9BQU87QUFDZCxxQkFBUyxDQUFDLFNBQVMsTUFBTSxLQUFLLFNBQVMsTUFBTSxLQUFLLFNBQVMsTUFBTSxLQUFLLFNBQVMsTUFBTTtBQUNyRixpQkFBSyxJQUFJLEdBQUcsTUFBTSxPQUFPLFFBQVEsSUFBSSxLQUFLLEtBQUs7QUFDN0Msc0JBQVEsT0FBTztBQUNmLGtCQUFJLENBQUcsTUFBSyxTQUFTLFNBQVMsTUFBTztBQUNuQyx1QkFBTztBQUFBO0FBQUE7QUFHWCxpQkFBSyxNQUFNLEtBQUssT0FBTyxNQUFNLElBQUksT0FBTztBQUN4QyxpQkFBSyxNQUFNLEtBQUssT0FBTyxNQUFNLElBQUksT0FBTztBQUN4QyxtQkFBTztBQUFBLGNBQ0wsT0FBTyxLQUFLO0FBQUEsY0FDWixRQUFRLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFJbkIsZUFBTztBQUFBO0FBR1QsYUFBTyxLQUFLLFNBQVMsT0FBTyxLQUFLLFNBQVMsU0FBUyxRQUFRO0FBQ3pELGVBQU8sS0FBSyxPQUFPLFlBQVk7QUFBQTtBQUdqQyxhQUFPLEtBQUssVUFBVSxTQUFTLFFBQVE7QUFDckMsWUFBSTtBQUNKLFlBQUk7QUFDRixjQUFJLEtBQUssS0FBSyxPQUFPO0FBQ3JCLGlCQUFPO0FBQUEsaUJBQ0EsUUFBUDtBQUNBLGNBQUk7QUFDSixpQkFBTztBQUFBO0FBQUE7QUFJWCxhQUFPLEtBQUsseUJBQXlCLFNBQVMsUUFBUTtBQUNwRCxZQUFJLE9BQU8sS0FBSyxRQUFRLFdBQVcsT0FBTyxNQUFNLHNDQUFzQztBQUNwRixpQkFBTztBQUFBLGVBQ0Y7QUFDTCxpQkFBTztBQUFBO0FBQUE7QUFJWCxhQUFPLEtBQUssVUFBVSxTQUFTLFFBQVE7QUFDckMsWUFBSSxNQUFNO0FBQ1YsWUFBSSxPQUFPLFdBQVcsWUFBWSxPQUFPLFFBQVEsU0FBUyxJQUFJO0FBQzVELGlCQUFPO0FBQUE7QUFFVCxZQUFJO0FBQ0YsaUJBQU8sS0FBSyxPQUFPO0FBQ25CLGNBQUksS0FBSyxLQUFLLE9BQU8sS0FBSztBQUMxQixpQkFBTztBQUFBLGlCQUNBLFFBQVA7QUFDQSxjQUFJO0FBQ0osaUJBQU87QUFBQTtBQUFBO0FBSVgsYUFBTyxLQUFLLFFBQVEsU0FBUyxRQUFRO0FBQ25DLFlBQUk7QUFDSixnQkFBUSxLQUFLLE9BQU87QUFDcEIsWUFBSSxVQUFVLE1BQU07QUFDbEIsZ0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFFbEIsZUFBTyxJQUFJLEtBQUs7QUFBQTtBQUdsQixhQUFPLEtBQUssUUFBUSxTQUFTLFFBQVE7QUFDbkMsWUFBSTtBQUNKLGVBQU8sS0FBSyxPQUFPO0FBQ25CLFlBQUksS0FBSyxVQUFVLE1BQU07QUFDdkIsZ0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFFbEIsZUFBTyxJQUFJLEtBQUssS0FBSyxPQUFPLEtBQUs7QUFBQTtBQUduQyxhQUFPLEtBQUssWUFBWSxTQUFTLFFBQVE7QUFDdkMsWUFBSSxZQUFZLE9BQU87QUFDdkIsWUFBSSxRQUFRLE9BQU8sTUFBTSxrQkFBa0I7QUFDekMsdUJBQWEsU0FBUyxNQUFNO0FBQzVCLGNBQUksY0FBYyxLQUFLLGNBQWMsSUFBSTtBQUN2QyxxQkFBUyxDQUFDLEtBQUssTUFBTSxNQUFNLEtBQUs7QUFDaEMsbUJBQU8sZUFBZSxRQUFRLFlBQVk7QUFBQSxjQUN4QyxPQUFPLFdBQVc7QUFDaEIsdUJBQU8sS0FBSyxLQUFLO0FBQUE7QUFBQTtBQUdyQixtQkFBTztBQUFBO0FBQUE7QUFHWCxjQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGFBQU8sS0FBSyw2QkFBNkIsU0FBUyxRQUFRO0FBQ3hELFlBQUksa0JBQWtCLEdBQUc7QUFDekIsaUJBQVMsU0FBUztBQUNsQixZQUFJLFNBQVMsS0FBSyxTQUFTLElBQUk7QUFDN0IsZ0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFFbEIsaUJBQVMsQ0FBQyxHQUFHLEdBQUcsR0FBRztBQUNuQixZQUFJO0FBQ0osMkJBQW1CLEtBQUssTUFBTSxTQUFTO0FBQ3ZDLGVBQU8sSUFBSSxrQkFBa0I7QUFDM0IsaUJBQU8sS0FBSztBQUNaO0FBQUE7QUFFRixZQUFJLG1CQUFtQixHQUFHO0FBQ3hCLGlCQUFPLG9CQUFvQixLQUFLLElBQUksR0FBRyxTQUFTLEtBQUssS0FBSyxJQUFLLFNBQVM7QUFBQTtBQUUxRSxlQUFPLElBQUksS0FBSztBQUFBO0FBR2xCLGFBQU8sS0FBSywyQkFBMkIsU0FBUyxRQUFRO0FBQ3RELFlBQUksTUFBTSxPQUFPLEdBQUcsbUJBQW1CLFFBQVE7QUFDL0MsWUFBSTtBQUNGLGlCQUFPLEtBQUssVUFBVTtBQUN0Qiw4QkFBb0IsS0FBSyxHQUFHO0FBQzVCLDZCQUFtQixLQUFLLDJCQUEyQixLQUFLLElBQUk7QUFDNUQsbUJBQVM7QUFDVCxjQUFJO0FBQ0osaUJBQU8sSUFBSSxHQUFHO0FBQ1osbUJBQU8sS0FBSyxTQUFTLGtCQUFrQixJQUFJLE1BQU0sU0FBUyxpQkFBaUIsSUFBSSxNQUFNO0FBQ3JGO0FBQUE7QUFFRixpQkFBTyxJQUFJLEtBQUs7QUFBQSxpQkFDVCxRQUFQO0FBQ0Esa0JBQVE7QUFDUixnQkFBTSxJQUFJLE1BQU07QUFBQTtBQUFBO0FBSXBCLGFBQU8sS0FBSyx5QkFBeUIsU0FBUyxRQUFRO0FBQ3BELFlBQUksTUFBTSxPQUFPLEdBQUcsbUJBQW1CLFFBQVE7QUFDL0MsWUFBSTtBQUNGLGlCQUFPLEtBQUssVUFBVTtBQUN0Qiw4QkFBb0IsS0FBSyxHQUFHO0FBQzVCLDZCQUFtQixLQUFLLDJCQUEyQixLQUFLLElBQUk7QUFDNUQsbUJBQVM7QUFDVCxjQUFJO0FBQ0osaUJBQU8sSUFBSSxHQUFHO0FBQ1osbUJBQU8sS0FBSyxTQUFTLGtCQUFrQixJQUFJLE1BQU0sU0FBUyxpQkFBaUIsSUFBSTtBQUMvRTtBQUFBO0FBRUYsaUJBQU8sSUFBSSxLQUFLO0FBQUEsaUJBQ1QsUUFBUDtBQUNBLGtCQUFRO0FBQ1IsZ0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFBQTtBQUlwQixhQUFPLEtBQUssWUFBWSxTQUFTLFFBQVE7QUFDdkMsWUFBSSxZQUFZLE9BQU87QUFDdkIsWUFBSSxRQUFRLE9BQU8sTUFBTSxrQkFBa0I7QUFDekMsdUJBQWEsU0FBUyxNQUFNO0FBQzVCLGNBQUksY0FBYyxLQUFLLGNBQWMsS0FBSztBQUN4QyxxQkFBUyxDQUFDLEtBQUssTUFBTSxNQUFNLEtBQUs7QUFDaEMsbUJBQU8sZUFBZSxRQUFRLFlBQVk7QUFBQSxjQUN4QyxPQUFPLFdBQVc7QUFDaEIsdUJBQU8sS0FBSyxLQUFLO0FBQUE7QUFBQTtBQUdyQixtQkFBTztBQUFBO0FBQUE7QUFHWCxjQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLGFBQU8sVUFBVSxTQUFTLFFBQVE7QUFDaEMsZUFBTyxPQUFPLEtBQUssUUFBUSxXQUFXLE9BQU8sS0FBSyxRQUFRO0FBQUE7QUFHNUQsYUFBTyxRQUFRLFNBQVMsUUFBUTtBQUM5QixZQUFJLE9BQU8sS0FBSyxRQUFRLFNBQVM7QUFDL0IsaUJBQU8sT0FBTyxLQUFLLE1BQU07QUFBQSxtQkFDaEIsT0FBTyxLQUFLLFFBQVEsU0FBUztBQUN0QyxpQkFBTyxPQUFPLEtBQUssTUFBTTtBQUFBLGVBQ3BCO0FBQ0wsZ0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFBQTtBQUlwQixhQUFPLFlBQVksU0FBUyxRQUFRO0FBQ2xDLFlBQUk7QUFDSixZQUFJO0FBQ0YsaUJBQU8sT0FBTyxLQUFLLFVBQVU7QUFBQSxpQkFDdEIsUUFBUDtBQUNBLGNBQUk7QUFDSixjQUFJO0FBQ0YsbUJBQU8sT0FBTyxLQUFLLFVBQVU7QUFBQSxtQkFDdEIsU0FBUDtBQUNBLGdCQUFJO0FBQ0osa0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBS3RCLGFBQU8sZ0JBQWdCLFNBQVMsT0FBTztBQUNyQyxZQUFJO0FBQ0osaUJBQVMsTUFBTTtBQUNmLFlBQUksV0FBVyxHQUFHO0FBQ2hCLGlCQUFPLElBQUksT0FBTyxLQUFLO0FBQUEsbUJBQ2QsV0FBVyxJQUFJO0FBQ3hCLGlCQUFPLElBQUksT0FBTyxLQUFLO0FBQUEsZUFDbEI7QUFDTCxnQkFBTSxJQUFJLE1BQU07QUFBQTtBQUFBO0FBSXBCLGFBQU8sVUFBVSxTQUFTLFFBQVE7QUFDaEMsWUFBSTtBQUNKLGVBQU8sS0FBSyxNQUFNO0FBQ2xCLFlBQUksS0FBSyxXQUFXLFVBQVUsS0FBSyx1QkFBdUI7QUFDeEQsaUJBQU8sS0FBSztBQUFBLGVBQ1A7QUFDTCxpQkFBTztBQUFBO0FBQUE7QUFBQSxPQUlWLEtBQUs7QUFBQTtBQUFBOzs7QUNocUJSO0FBQUE7QUFNQTtBQU9BLFlBQU8sVUFBVTtBQUNqQixZQUFPLFFBQVEsTUFBTTtBQUNyQixZQUFPLFFBQVEsVUFBVTtBQU96QixRQUFJLFlBQVk7QUFDaEIsUUFBSSxTQUFTO0FBT2IsUUFBSSxlQUFlO0FBQ25CLFFBQUksT0FBTyxPQUFPO0FBQ2xCLFFBQUksVUFBVSxPQUFPO0FBT3JCLFFBQUksWUFBWTtBQUFBLE1BQ2QsV0FBVyxDQUFDLGtCQUFrQjtBQUFBLE1BQzlCLFVBQVUsQ0FBQyxlQUFlO0FBQUEsTUFDMUIsYUFBYSxDQUFDLGNBQWMsaUJBQWlCLGtCQUFrQjtBQUFBO0FBWWpFLHNCQUFtQixLQUFLLE9BQU87QUFFN0IsVUFBSSxRQUFRLFVBQVU7QUFFdEIsVUFBSSxDQUFDLE9BQU87QUFFVixlQUFPO0FBQUE7QUFHVCxVQUFJLE9BQU8sVUFBVSxZQUFZO0FBQy9CLGdCQUFRLFFBQVE7QUFBQTtBQUdsQixlQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sU0FBUyxHQUFHLEtBQUs7QUFDekMsWUFBSSxNQUFNLE1BQU0sSUFBSTtBQUFJO0FBRXhCLGNBQU0sU0FBUyxJQUFJO0FBQUE7QUFHckIsYUFBTztBQUFBO0FBVVQscUJBQWtCLEtBQUs7QUFDckIsVUFBSSxDQUFDLEtBQUs7QUFDUixjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUk7QUFFSixVQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLGdCQUFRLENBQUM7QUFBQSxpQkFDQSxNQUFNLFFBQVEsTUFBTTtBQUM3QixnQkFBUSxJQUFJO0FBQUEsYUFDUDtBQUNMLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsZUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUNyQyxjQUFNLE1BQU07QUFFWixZQUFJLENBQUMsT0FBTyxVQUFVLGVBQWUsS0FBSyxXQUFXLE1BQU07QUFDekQ7QUFBQTtBQUlGLGNBQU0sVUFBVTtBQUNoQixjQUFNLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxHQUFHLE9BQU87QUFDeEMsYUFBSyxJQUFJLFNBQVM7QUFBQTtBQUdwQixhQUFPLGFBQWEsb0JBQW9CO0FBQUE7QUFVMUMsaUNBQThCLEtBQUs7QUFDakMsVUFBSSxlQUFlLElBQUksTUFBTSxJQUFJO0FBRWpDLGVBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRLEtBQUs7QUFDbkMscUJBQWEsS0FBSyxnQkFBZ0IsSUFBSTtBQUFBO0FBR3hDLGFBQU87QUFBQTtBQVVULDBCQUF1QixjQUFjO0FBRW5DLFVBQUksTUFBTSxhQUFhO0FBQ3ZCLGFBQU8sUUFBUSxJQUNYLFlBQ0EsUUFBUSxJQUNOLFlBQVksYUFBYSxNQUN6QixXQUFXO0FBQUE7QUFVbkIsNkJBQTBCLE1BQU07QUFDOUIsVUFBSSxNQUFNLEtBQUssWUFBWTtBQUMzQixVQUFJLE1BQU0sUUFBUSxLQUNkLEtBQUssVUFBVSxHQUFHLE9BQ2xCO0FBRUosVUFBSSxDQUFDLEtBQUssTUFBTTtBQUNkLGNBQU0sSUFBSSxVQUFVLHlCQUF5QjtBQUFBO0FBRy9DLFVBQUksS0FBSyxRQUFRO0FBRWpCLFVBQUksUUFBUSxNQUFNLEdBQUcsV0FBVyxVQUFVLEdBQUcsdUJBQXVCO0FBRWxFLGFBQUssR0FBRztBQUFBO0FBR1YsVUFBSSxNQUFNLEdBQUcsV0FBVyxTQUNwQixNQUNBO0FBRUosVUFBSSxRQUFRLFFBQVEsS0FDaEIsS0FBSyxVQUFVLE1BQU0sR0FBRyxLQUFLLFVBQzdCO0FBRUosVUFBSSxVQUFVLE1BQU07QUFDbEIsZ0JBQVE7QUFBQSxpQkFDQyxhQUFhLEtBQUssUUFBUTtBQUNuQyxnQkFBUSxTQUFTLE9BQU87QUFBQSxpQkFDZixHQUFHLFdBQVcsVUFBVSxLQUFLLFFBQVE7QUFDOUMsZ0JBQVEsYUFBYTtBQUFBLGFBQ2hCO0FBQ0wsZ0JBQVE7QUFBQTtBQUdWLFVBQUksU0FBUyxLQUFLLFFBQVEsS0FBSztBQUM3QixjQUFNLElBQUksVUFBVSwrQkFBK0I7QUFBQTtBQUdyRCxhQUFPLENBQUMsSUFBSTtBQUFBO0FBVWQsMEJBQXVCLFNBQVM7QUFDOUIsVUFBSSxLQUFLLFFBQVE7QUFDakIsVUFBSSxPQUFPLEdBQUc7QUFFZCxhQUFPLFNBQVMsU0FDWixHQUFHLCtCQUNIO0FBQUE7QUFXTix1QkFBb0IsS0FBSyxPQUFPO0FBQzlCLFVBQUksQ0FBQyxLQUFLO0FBQ1IsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixVQUFJLENBQUMsT0FBTztBQUNWLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsVUFBSSxRQUFRLFNBQVMsS0FBSztBQUMxQixVQUFJLE9BQU8sTUFBTSxNQUFNLFNBQVM7QUFFaEMsYUFBTztBQUFBO0FBU1QseUJBQXNCO0FBQ3BCLGFBQU87QUFBQTtBQVVULHdCQUFxQixTQUFTO0FBQzVCLGFBQU8sZUFBZ0IsTUFBTTtBQUMzQixZQUFJLENBQUMsS0FBSztBQUFPLGlCQUFPO0FBRXhCLFlBQUksS0FBSyxRQUFRO0FBQ2pCLFlBQUk7QUFDSixZQUFJLE9BQU8sR0FBRztBQUVkLGlCQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQ3ZDLGNBQUksU0FBUyxRQUFRO0FBQ3JCLGNBQUksV0FBVyxPQUFPO0FBQ3RCLGNBQUksYUFBYSxTQUFTO0FBQzFCLGNBQUksY0FBYyxPQUFPO0FBQ3pCLGNBQUksVUFBVTtBQUVkLGNBQUksU0FBUyxZQUFZO0FBQ3ZCLGdCQUFJLGVBQWUsVUFBVSxDQUFDLEdBQUcsdUJBQXVCO0FBRXREO0FBQUE7QUFHRixnQkFBSSxDQUFDLFFBQVE7QUFFWCx1QkFBUyxlQUFlLFNBQ3BCLEdBQUcsa0JBQ0gsR0FBRztBQUFBO0FBR1Qsc0JBQVU7QUFBQTtBQUdaLGNBQUksUUFBUSxNQUFNLFVBQVUsY0FBYztBQUN4QyxtQkFBTztBQUFBO0FBQUE7QUFJWCxlQUFPO0FBQUE7QUFBQTtBQVdYLHlCQUFzQixRQUFRO0FBQzVCLFVBQUksV0FBVyxPQUFPO0FBQ3RCLFVBQUksYUFBYSxTQUFTO0FBQzFCLFVBQUksZUFBZSxlQUFlO0FBQ2xDLFVBQUksY0FBYyxPQUFPO0FBRXpCLGFBQU8sZUFBZ0IsTUFBTTtBQUMzQixZQUFJLENBQUMsS0FBSztBQUFPLGlCQUFPO0FBRXhCLFlBQUksS0FBSyxRQUFRO0FBQ2pCLFlBQUksT0FBTyxHQUFHO0FBRWQsWUFBSSxTQUFTLFlBQVk7QUFDdkIsY0FBSSxnQkFBZ0IsQ0FBQyxHQUFHLHVCQUF1QjtBQUU3QyxtQkFBTztBQUFBO0FBSVQsZUFBSyxlQUNELEdBQUcsa0JBQ0gsR0FBRztBQUFBO0FBR1QsZUFBTyxHQUFHLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNwVTlCO0FBQUE7QUFPQTtBQU9BLFFBQUksVUFBUyxzQkFBdUI7QUFDcEMsUUFBSSxxQkFBcUI7QUFDekIsUUFBSSxjQUFjO0FBQ2xCLFFBQUksWUFBWSxlQUFnQjtBQUNoQyxRQUFJLFVBQVU7QUFDZCxRQUFJLFFBQU8sZUFBZ0I7QUFDM0IsUUFBSSxPQUFPO0FBQ1gsUUFBSSxZQUFZO0FBQ2hCLFFBQUksS0FBSztBQUNULFFBQUksY0FBYyxRQUFRO0FBVzFCLFlBQVEsT0FBTyxvQkFBb0IsRUFBRSxNQUFNO0FBVzNDLFlBQVEsUUFBUSxvQkFBb0IsRUFBRSxNQUFNO0FBVTVDLFlBQVEsYUFBYSxTQUFTLE1BQUs7QUFDakMsVUFBSSxBQUFRLEtBQUssT0FBYjtBQUFpQixlQUFPO0FBQzVCLFVBQUksQUFBUSxLQUFLLE9BQWIsT0FBb0IsQ0FBUyxLQUFLLE9BQWQsUUFBb0IsQUFBUSxLQUFLLE9BQWI7QUFBa0IsZUFBTztBQUNyRSxVQUFJLEFBQVcsS0FBSyxVQUFVLEdBQUcsT0FBN0I7QUFBaUMsZUFBTztBQUFBO0FBVzlDLFlBQVEsVUFBVSxVQUFVLFNBQVMsU0FDbkM7QUFVRixZQUFRLGdCQUFnQixTQUFTLE1BQUs7QUFDcEMsYUFBTyxDQUFDLEtBQUssUUFBUSxPQUNqQixhQUFhLFFBQ2IsRUFBRSxPQUFPLE1BQUssT0FBTyxPQUFPLFFBQVE7QUFBQTtBQVcxQyxZQUFRLGlCQUFpQixTQUFTLE9BQU07QUFDdEMsVUFBSSxNQUFNO0FBRVYsZUFBUyxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsRUFBRSxHQUFHO0FBQ3JDLFlBQUksS0FBSyxRQUFRLGNBQWMsTUFBTTtBQUFBO0FBR3ZDLGFBQU87QUFBQTtBQVlULFlBQVEscUJBQXFCLFVBQVUsU0FBUyxvQkFDOUM7QUFhRiwwQkFBc0IsS0FBSyxPQUFPO0FBQ2hDLFVBQUksUUFBUSxJQUFJLE1BQU07QUFDdEIsVUFBSSxNQUFNLEVBQUUsT0FBTyxNQUFNLElBQUksU0FBUyxHQUFHLFFBQVEsSUFBSSxlQUFlO0FBRXBFLGVBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEVBQUUsR0FBRztBQUNyQyxZQUFJLE1BQU0sTUFBTSxHQUFHLE1BQU07QUFDekIsWUFBSSxBQUFRLElBQUksT0FBWixLQUFnQjtBQUNsQixjQUFJLFVBQVUsV0FBVyxJQUFJO0FBQUEsZUFDeEI7QUFDTCxjQUFJLE9BQU8sSUFBSSxNQUFNLElBQUk7QUFBQTtBQUFBO0FBSTdCLGFBQU87QUFBQTtBQVdULFlBQVEsY0FBYyxTQUFTLEtBQUs7QUFDbEMsVUFBSTtBQUVKLFVBQUksT0FBTyxRQUFRLFlBQVk7QUFDN0IsZUFBTztBQUFBO0FBR1QsY0FBUTtBQUFBLGFBQ0Q7QUFBQSxhQUNBO0FBQ0gsZUFBSyxRQUFRO0FBQ2I7QUFBQSxhQUNHO0FBQ0g7QUFBQSxhQUNHO0FBQ0gsZUFBSyxRQUFRO0FBQ2I7QUFBQTtBQUVBLGdCQUFNLElBQUksVUFBVSxzQ0FBc0M7QUFBQTtBQUc5RCxhQUFPO0FBQUE7QUFXVCxZQUFRLHFCQUFxQiw0QkFBNEIsS0FBSztBQUM1RCxVQUFJO0FBRUosVUFBSSxPQUFPLFFBQVEsWUFBWTtBQUM3QixlQUFPO0FBQUE7QUFHVCxjQUFRO0FBQUEsYUFDRDtBQUFBLGFBQ0E7QUFDSCxlQUFLLFlBQVk7QUFDakI7QUFBQSxhQUNHO0FBQ0gsZUFBSztBQUNMO0FBQUEsYUFDRztBQUNILGVBQUs7QUFDTDtBQUFBO0FBRUEsZ0JBQU0sSUFBSSxVQUFVLDhDQUE4QztBQUFBO0FBR3RFLGFBQU87QUFBQTtBQVdULFlBQVEsZUFBZSxTQUFTLEtBQUs7QUFDbkMsVUFBSSxPQUFPLFFBQVE7QUFBWSxlQUFPO0FBRXRDLFVBQUksUUFBUSxNQUFNO0FBRWhCLGVBQU8sV0FBVTtBQUFFLGlCQUFPO0FBQUE7QUFBQTtBQUc1QixVQUFJLE9BQU8sUUFBUSxVQUFVO0FBRTNCLGVBQU8sU0FBUyxHQUFHLEdBQUU7QUFBRSxpQkFBTyxJQUFJO0FBQUE7QUFBQTtBQUdwQyxVQUFJLE9BQU8sUUFBUSxVQUFVO0FBRTNCLGNBQU0sSUFBSSxNQUFNLEtBQ2IsSUFBSSxTQUFVLEdBQUc7QUFBRSxpQkFBTyxFQUFFO0FBQUE7QUFBQTtBQUdqQyxhQUFPLFVBQVUsUUFBUSxPQUFPO0FBQUE7QUFZbEMsWUFBUSxhQUFhLG9CQUFvQixNQUFNLFNBQVM7QUFDdEQsVUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTO0FBQ3JCLGVBQU87QUFBQTtBQUlULFVBQUksU0FBUyxZQUFZLE1BQU07QUFHL0IsYUFBTyxXQUFXLFVBQVU7QUFHNUIsYUFBTyxZQUFZLE9BQU87QUFBQTtBQVk1QixpQ0FBOEIsU0FBUztBQUNyQyxhQUFPLHNCQUF1QixNQUFNLFVBQVU7QUFDNUMsWUFBSSxNQUFNLENBQUMsUUFBTyxTQUFTLFFBQ3ZCLFFBQU8sS0FBSyxNQUFNLFlBQ2xCO0FBRUosZUFBTyxLQUFLLEtBQUs7QUFBQTtBQUFBO0FBV3JCLHNDQUFrQyxLQUFLO0FBQ3JDLGFBQU8sR0FBRyxNQUFNLEtBQUs7QUFBQSxRQUNuQixpQkFBaUI7QUFBQTtBQUFBO0FBV3JCLHlCQUFxQjtBQUNuQixhQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUM5U1Q7QUFBQTtBQVFBO0FBT0EsUUFBSSxlQUFlO0FBQ25CLFFBQUksU0FBUztBQUNiLFFBQUksVUFBVTtBQUNkLFFBQUksYUFBYTtBQUNqQixRQUFJLFFBQVE7QUFDWixRQUFJLFFBQVEsZUFBaUI7QUFDN0IsUUFBSSxPQUFPO0FBQ1gsUUFBSSxRQUFPLFFBQVE7QUFDbkIsUUFBSSxjQUFjLGlCQUFtQjtBQUNyQyxRQUFJLHFCQUFxQixpQkFBbUI7QUFDNUMsUUFBSSxlQUFlLGlCQUFtQjtBQUN0QyxRQUFJLFlBQVksZUFBZ0I7QUFDaEMsUUFBSSxVQUFVO0FBQ2QsUUFBSSxRQUFRO0FBQ1osUUFBSSxVQUFVLFFBQVEsUUFBUTtBQUM5QixRQUFJLGlCQUFpQjtBQU9yQixRQUFJLGlCQUFpQixPQUFPLFVBQVU7QUFDdEMsUUFBSSxRQUFRLE1BQU0sVUFBVTtBQU01QixRQUFJLE1BQU0sVUFBVSxRQUFPLFVBQVU7QUFPckMsUUFBSSwwQkFBMEI7QUFZOUIsUUFBSSxPQUFPLGdCQUFnQjtBQUN6QixXQUFLLFFBQVE7QUFDYixXQUFLLFVBQVU7QUFDZixXQUFLLFdBQVc7QUFFaEIsV0FBSztBQUFBO0FBUVAsUUFBSSx1QkFBdUIsZ0NBQWdDO0FBQ3pELFVBQUksTUFBTSxRQUFRLElBQUksWUFBWTtBQUdsQyxXQUFLLE9BQU87QUFDWixXQUFLLElBQUksUUFBUTtBQUNqQixXQUFLLElBQUksT0FBTztBQUNoQixXQUFLLElBQUksZ0JBQWdCO0FBQ3pCLFdBQUssSUFBSSxvQkFBb0I7QUFDN0IsV0FBSyxJQUFJLGVBQWU7QUFHeEIsYUFBTyxlQUFlLEtBQUssVUFBVSx5QkFBeUI7QUFBQSxRQUM1RCxjQUFjO0FBQUEsUUFDZCxPQUFPO0FBQUE7QUFHVCxZQUFNLHNCQUFzQjtBQUU1QixXQUFLLEdBQUcsU0FBUyxpQkFBaUIsUUFBUTtBQUV4QyxZQUFJLEtBQUssU0FBUyw2QkFBNkIsUUFDMUMsT0FBTyxPQUFPLFNBQVMsc0JBQXNCLFlBQVk7QUFDNUQsaUJBQU8sS0FBSyxTQUFTO0FBQ3JCLGlCQUFPLEtBQUssU0FBUztBQUFBO0FBSXZCLHVCQUFlLEtBQUssU0FBUyxPQUFPO0FBQ3BDLHVCQUFlLEtBQUssVUFBVSxPQUFPO0FBQ3JDLHVCQUFlLEtBQUssU0FBUyxPQUFPO0FBQ3BDLHVCQUFlLEtBQUssVUFBVSxPQUFPO0FBQUE7QUFJdkMsV0FBSyxTQUFTLE9BQU8sT0FBTztBQUc1QixXQUFLLFlBQVk7QUFHakIsV0FBSyxPQUFPLFdBQVcsS0FBSztBQUc1QixXQUFLLElBQUksUUFBUTtBQUNqQixXQUFLLElBQUksU0FBUyxRQUFRO0FBQzFCLFdBQUssSUFBSSx1QkFBdUI7QUFFaEMsVUFBSSxRQUFRLGNBQWM7QUFDeEIsYUFBSyxPQUFPO0FBQUE7QUFHZCxhQUFPLGVBQWUsTUFBTSxVQUFVO0FBQUEsUUFDcEMsS0FBSyxXQUFXO0FBQ2QsZ0JBQU0sSUFBSSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBYXRCLFFBQUksYUFBYSxzQkFBc0I7QUFDckMsVUFBSSxDQUFDLEtBQUssU0FBUztBQUNqQixhQUFLLFVBQVUsSUFBSSxPQUFPO0FBQUEsVUFDeEIsZUFBZSxLQUFLLFFBQVE7QUFBQSxVQUM1QixRQUFRLEtBQUssUUFBUTtBQUFBO0FBR3ZCLGFBQUssUUFBUSxJQUFJLE1BQU0sS0FBSyxJQUFJO0FBQ2hDLGFBQUssUUFBUSxJQUFJLFdBQVcsS0FBSztBQUFBO0FBQUE7QUFhckMsUUFBSSxTQUFTLGdCQUFnQixLQUFLLEtBQUssVUFBVTtBQUMvQyxVQUFJLFNBQVMsS0FBSztBQUdsQixVQUFJLE9BQU8sWUFBWSxhQUFhLEtBQUssS0FBSztBQUFBLFFBQzVDLEtBQUssS0FBSyxJQUFJO0FBQUEsUUFDZCxTQUFTLFNBQVMsS0FBSztBQUFBO0FBSXpCLFVBQUksQ0FBQyxRQUFRO0FBQ1gsY0FBTTtBQUNOO0FBQ0E7QUFBQTtBQUdGLGFBQU8sT0FBTyxLQUFLLEtBQUs7QUFBQTtBQWExQixRQUFJLE1BQU0sYUFBYSxJQUFJO0FBQ3pCLFVBQUksU0FBUztBQUNiLFVBQUksT0FBTztBQUlYLFVBQUksT0FBTyxPQUFPLFlBQVk7QUFDNUIsWUFBSSxNQUFNO0FBRVYsZUFBTyxNQUFNLFFBQVEsUUFBUSxJQUFJLFdBQVcsR0FBRztBQUM3QyxnQkFBTSxJQUFJO0FBQUE7QUFJWixZQUFJLE9BQU8sUUFBUSxZQUFZO0FBQzdCLG1CQUFTO0FBQ1QsaUJBQU87QUFBQTtBQUFBO0FBSVgsVUFBSSxNQUFNLFFBQVEsTUFBTSxLQUFLLFdBQVc7QUFFeEMsVUFBSSxJQUFJLFdBQVcsR0FBRztBQUNwQixjQUFNLElBQUksVUFBVTtBQUFBO0FBSXRCLFdBQUs7QUFDTCxVQUFJLFNBQVMsS0FBSztBQUVsQixVQUFJLFFBQVEsU0FBVSxLQUFJO0FBRXhCLFlBQUksQ0FBQyxPQUFNLENBQUMsSUFBRyxVQUFVLENBQUMsSUFBRyxLQUFLO0FBQ2hDLGlCQUFPLE9BQU8sSUFBSSxNQUFNO0FBQUE7QUFHMUIsY0FBTSxxQkFBcUI7QUFDM0IsWUFBRyxZQUFZO0FBQ2YsWUFBRyxTQUFTO0FBR1osZUFBTyxJQUFJLE1BQU0scUJBQXFCLEtBQUssS0FBSyxNQUFNO0FBQ3BELGNBQUksT0FBTyxJQUFJO0FBQ2YsY0FBRyxPQUFPLEtBQUssS0FBSyxTQUFVLEtBQUs7QUFDakMsMkJBQWUsS0FBSyxLQUFLO0FBQ3pCLDJCQUFlLEtBQUssS0FBSztBQUN6QixpQkFBSztBQUFBO0FBQUE7QUFLVCxZQUFHLEtBQUssU0FBUztBQUFBLFNBQ2hCO0FBRUgsYUFBTztBQUFBO0FBYVQsUUFBSSxRQUFRLGVBQWUsTUFBTTtBQUMvQixXQUFLO0FBQ0wsYUFBTyxLQUFLLFFBQVEsTUFBTTtBQUFBO0FBcUM1QixRQUFJLFNBQVMsZ0JBQWdCLEtBQUssSUFBSTtBQUNwQyxVQUFJLE9BQU8sT0FBTyxZQUFZO0FBQzVCLGNBQU0sSUFBSSxNQUFNO0FBQUE7QUFJbEIsVUFBSSxZQUFZLElBQUksT0FBTyxNQUN2QixNQUFNLE1BQ047QUFHSixXQUFLLFFBQVEsYUFBYTtBQUUxQixhQUFPO0FBQUE7QUFlVCxRQUFJLFFBQVEsZUFBZSxNQUFNLElBQUk7QUFDbkMsV0FBSztBQUVMLFVBQUksTUFBTSxRQUFRLE9BQU87QUFDdkIsaUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDcEMsZUFBSyxNQUFNLEtBQUssSUFBSTtBQUFBO0FBR3RCLGVBQU87QUFBQTtBQUdULFdBQUssUUFBUSxNQUFNLE1BQU07QUFFekIsYUFBTztBQUFBO0FBa0JULFFBQUksTUFBTSxhQUFhLFNBQVMsS0FBSztBQUNuQyxVQUFJLFVBQVUsV0FBVyxHQUFHO0FBRTFCLFlBQUksV0FBVyxLQUFLO0FBRXBCLGVBQU8sWUFBWSxhQUFhLE9BQU8sV0FBVztBQUNoRCxjQUFJLGVBQWUsS0FBSyxVQUFVLFVBQVU7QUFDMUMsbUJBQU8sU0FBUztBQUFBO0FBR2xCLHFCQUFXLE9BQU8sZUFBZTtBQUFBO0FBR25DLGVBQU87QUFBQTtBQUdULFlBQU0sa0JBQWtCLFNBQVM7QUFHakMsV0FBSyxTQUFTLFdBQVc7QUFHekIsY0FBUTtBQUFBLGFBQ0Q7QUFDSCxlQUFLLElBQUksV0FBVyxZQUFZO0FBQ2hDO0FBQUEsYUFDRztBQUNILGVBQUssSUFBSSxtQkFBbUIsbUJBQW1CO0FBQy9DO0FBQUEsYUFDRztBQUNILGVBQUssSUFBSSxrQkFBa0IsYUFBYTtBQUd4QyxpQkFBTyxlQUFlLEtBQUssVUFBVSx5QkFBeUI7QUFBQSxZQUM1RCxjQUFjO0FBQUEsWUFDZCxPQUFPO0FBQUE7QUFHVDtBQUFBO0FBR0osYUFBTztBQUFBO0FBaUJULFFBQUksT0FBTyxnQkFBZ0I7QUFDekIsYUFBTyxLQUFLLFNBQ1IsS0FBSyxPQUFPLFNBQVMsS0FBSyxZQUMxQjtBQUFBO0FBa0JOLFFBQUksVUFBVSxpQkFBaUIsU0FBUztBQUN0QyxhQUFPLFFBQVEsS0FBSyxJQUFJO0FBQUE7QUFrQjFCLFFBQUksV0FBVyxrQkFBa0IsU0FBUztBQUN4QyxhQUFPLENBQUMsS0FBSyxJQUFJO0FBQUE7QUFXbkIsUUFBSSxTQUFTLGdCQUFnQixTQUFTO0FBQ3BDLGFBQU8sS0FBSyxJQUFJLFNBQVM7QUFBQTtBQVczQixRQUFJLFVBQVUsaUJBQWlCLFNBQVM7QUFDdEMsYUFBTyxLQUFLLElBQUksU0FBUztBQUFBO0FBTzNCLFlBQVEsUUFBUSxTQUFTLFFBQU87QUFDOUIsVUFBSSxVQUFVLFNBQVMsTUFBSztBQUMxQixZQUFJLFdBQVcsU0FBUyxVQUFVLFdBQVcsR0FBRztBQUU5QyxpQkFBTyxLQUFLLElBQUk7QUFBQTtBQUdsQixhQUFLO0FBRUwsWUFBSSxRQUFRLEtBQUssUUFBUSxNQUFNO0FBQy9CLGNBQU0sUUFBUSxNQUFNLE9BQU8sTUFBTSxLQUFLLFdBQVc7QUFDakQsZUFBTztBQUFBO0FBQUE7QUFjWCxRQUFJLE1BQU0sYUFBYSxNQUFNO0FBQzNCLFdBQUs7QUFFTCxVQUFJLFFBQVEsS0FBSyxRQUFRLE1BQU07QUFDL0IsVUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXO0FBRWpDLGVBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxRQUFRLEtBQUs7QUFDdkMsY0FBTSxRQUFRLElBQUksTUFBTSxPQUFPO0FBQUE7QUFHakMsYUFBTztBQUFBO0FBS1QsUUFBSSxNQUFNLFVBQVUsU0FBUyxJQUFJLFFBQVE7QUFtQnpDLFFBQUksU0FBUyxnQkFBZ0IsTUFBTSxTQUFTLFVBQVU7QUFDcEQsVUFBSSxRQUFRLEtBQUs7QUFDakIsVUFBSSxPQUFPO0FBQ1gsVUFBSSxVQUFVLEtBQUs7QUFDbkIsVUFBSSxPQUFPO0FBQ1gsVUFBSSxnQkFBZ0I7QUFDcEIsVUFBSTtBQUdKLFVBQUksT0FBTyxZQUFZLFlBQVk7QUFDakMsZUFBTztBQUNQLGVBQU87QUFBQTtBQUlULFlBQU0sZUFBZSxLQUFLO0FBRzFCLFVBQUksS0FBSyxTQUFTO0FBQ2hCLGNBQU0sZUFBZSxLQUFLO0FBQUE7QUFJNUIsWUFBTSxlQUFlO0FBR3JCLFVBQUksY0FBYyxTQUFTLE1BQU07QUFDL0Isc0JBQWMsUUFBUSxLQUFLLFFBQVE7QUFBQTtBQUlyQyxVQUFJLGNBQWMsT0FBTztBQUN2QixlQUFPLE1BQU07QUFBQTtBQUlmLFVBQUksQ0FBQyxNQUFNO0FBQ1QsWUFBSSxRQUFPLEtBQUssSUFBSTtBQUVwQixlQUFPLElBQUksTUFBSyxNQUFNO0FBQUEsVUFDcEIsZUFBZSxLQUFLLElBQUk7QUFBQSxVQUN4QixNQUFNLEtBQUssSUFBSTtBQUFBLFVBQ2Y7QUFBQTtBQUdGLFlBQUksQ0FBQyxLQUFLLE1BQU07QUFDZCxjQUFJLE9BQU8sTUFBTSxRQUFRLEtBQUssU0FBUyxLQUFLLEtBQUssU0FBUyxJQUN0RCxrQkFBa0IsS0FBSyxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssVUFBVSxXQUFXLEtBQUssS0FBSyxLQUFLLEtBQUssU0FBUyxLQUFLLE1BQ3JHLGdCQUFnQixLQUFLLE9BQU87QUFDaEMsY0FBSSxNQUFNLElBQUksTUFBTSw0QkFBNEIsT0FBTyxnQkFBZ0I7QUFDdkUsY0FBSSxPQUFPO0FBQ1gsaUJBQU8sS0FBSztBQUFBO0FBSWQsWUFBSSxjQUFjLE9BQU87QUFDdkIsZ0JBQU0sUUFBUTtBQUFBO0FBQUE7QUFLbEIsZ0JBQVUsTUFBTSxlQUFlO0FBQUE7QUF3QmpDLFFBQUksU0FBUyxrQkFBa0I7QUFDN0IsVUFBSSxVQUFTLE1BQUssYUFBYTtBQUMvQixhQUFPLFFBQU8sT0FBTyxNQUFNLFNBQVE7QUFBQTtBQVVyQyxzQkFBa0IsS0FBSztBQUVyQixVQUFJLEtBQUssSUFBSSxXQUFXO0FBQVEsZ0JBQVEsTUFBTSxJQUFJLFNBQVMsSUFBSTtBQUFBO0FBUWpFLHVCQUFtQixNQUFNLFNBQVMsVUFBVTtBQUMxQyxVQUFJO0FBQ0YsYUFBSyxPQUFPLFNBQVM7QUFBQSxlQUNkLEtBQVA7QUFDQSxpQkFBUztBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNscEJiO0FBQUE7QUFRQTtBQU9BLFlBQU8sVUFBVTtBQUNqQixZQUFPLFFBQVEsb0JBQW9CO0FBT25DLFFBQUksc0JBQXNCO0FBTzFCLGdDQUE0QixRQUFRO0FBQ2xDLFVBQUksVUFBVSxPQUFPLE1BQU07QUFFM0IsZUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksUUFBUSxRQUFRLEtBQUs7QUFDOUMsWUFBSSxVQUFVLGFBQWEsUUFBUSxHQUFHLFFBQVE7QUFFOUMsWUFBSSxTQUFTO0FBQ1gsa0JBQVEsT0FBTztBQUFBO0FBQUE7QUFLbkIsY0FBUSxTQUFTO0FBRWpCLGFBQU87QUFBQTtBQVFULDBCQUFzQixLQUFLLEdBQUc7QUFDNUIsVUFBSSxRQUFRLG9CQUFvQixLQUFLO0FBQ3JDLFVBQUksQ0FBQztBQUFPLGVBQU87QUFFbkIsVUFBSSxVQUFVLE1BQU07QUFDcEIsVUFBSSxJQUFJO0FBQ1IsVUFBSSxNQUFNLElBQUk7QUFDWixZQUFJLFNBQVMsTUFBTSxHQUFHLE1BQU07QUFDNUIsaUJBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEtBQUs7QUFDdEMsY0FBSSxJQUFJLE9BQU8sR0FBRyxPQUFPLE1BQU07QUFDL0IsY0FBSSxFQUFFLE9BQU8sS0FBSztBQUNoQixnQkFBSSxXQUFXLEVBQUU7QUFDakI7QUFBQTtBQUFBO0FBQUE7QUFLTixhQUFPO0FBQUEsUUFDTDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUE7QUFBQTtBQVNKLGdDQUE0QixTQUFTLFVBQVUsT0FBTztBQUNwRCxVQUFJLFdBQVcsRUFBQyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUc7QUFFaEMsZUFBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN4QyxZQUFJLE9BQU8sUUFBUSxTQUFTLFNBQVMsSUFBSTtBQUV6QyxZQUFJLFFBQVMsVUFBUyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssR0FBRztBQUNuRixxQkFBVztBQUFBO0FBQUE7QUFJZixhQUFPO0FBQUE7QUFRVCxxQkFBaUIsU0FBUyxNQUFNLE9BQU87QUFDckMsVUFBSSxJQUFJO0FBQ1IsVUFBRyxLQUFLLFFBQVEsa0JBQWtCLFFBQVEsZUFBYztBQUN0RCxhQUFLO0FBQUEsaUJBQ0ksS0FBSyxZQUFZLEtBQU07QUFDaEMsZUFBTztBQUFBO0FBR1QsYUFBTztBQUFBLFFBQ0wsR0FBRztBQUFBLFFBQ0gsR0FBRyxLQUFLO0FBQUEsUUFDUixHQUFHLEtBQUs7QUFBQSxRQUNSO0FBQUE7QUFBQTtBQVNKLCtCQUEyQixRQUFRLFVBQVU7QUFFM0MsVUFBSSxVQUFVLG1CQUFtQixXQUFXLFNBQVksTUFBTSxVQUFVO0FBRXhFLFVBQUksQ0FBQyxVQUFVO0FBRWIsZUFBTyxRQUNKLE9BQU8sV0FDUCxLQUFLLGNBQ0wsSUFBSTtBQUFBO0FBR1QsVUFBSSxhQUFhLFNBQVMsSUFBSSxxQkFBcUIsTUFBTSxPQUFPO0FBQzlELGVBQU8sbUJBQW1CLE1BQU0sU0FBUztBQUFBO0FBSTNDLGFBQU8sV0FBVyxPQUFPLFdBQVcsS0FBSyxjQUFjLElBQUksb0JBQW9CLFVBQVU7QUFDdkYsZUFBTyxTQUFTLFdBQVcsUUFBUTtBQUFBO0FBQUE7QUFTdkMsMEJBQXNCLEdBQUcsR0FBRztBQUMxQixhQUFRLEVBQUUsSUFBSSxFQUFFLEtBQU8sRUFBRSxJQUFJLEVBQUUsS0FBTyxFQUFFLElBQUksRUFBRSxLQUFPLEVBQUUsSUFBSSxFQUFFLEtBQU07QUFBQTtBQVFyRSw0QkFBd0IsTUFBTTtBQUM1QixhQUFPLEtBQUs7QUFBQTtBQVFkLHVCQUFtQixNQUFNO0FBQ3ZCLGFBQU8sS0FBSyxJQUFJO0FBQUE7QUFBQTtBQUFBOzs7QUN2S2xCO0FBQUE7QUFRQTtBQU9BLFlBQU8sVUFBVTtBQUNqQixZQUFPLFFBQVEscUJBQXFCO0FBT3BDLFFBQUksdUJBQXVCO0FBTzNCLGlDQUE2QixRQUFRO0FBQ25DLFVBQUksVUFBVSxPQUFPLE1BQU07QUFDM0IsVUFBSSxjQUFjO0FBQ2xCLFVBQUksYUFBYTtBQUVqQixlQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUM5QyxZQUFJLFdBQVcsY0FBYyxRQUFRLEdBQUcsUUFBUTtBQUVoRCxZQUFJLFVBQVU7QUFDWixrQkFBUSxPQUFPO0FBQ2Ysd0JBQWMsZUFBZSxRQUFRLFlBQVk7QUFDakQsdUJBQWEsS0FBSyxJQUFJLFlBQVksU0FBUyxLQUFLO0FBQUE7QUFBQTtBQUlwRCxVQUFJLENBQUMsYUFBYTtBQUtoQixnQkFBUSxPQUFPO0FBQUEsVUFDYixVQUFVO0FBQUEsVUFDVixHQUFHO0FBQUEsVUFDSDtBQUFBO0FBQUE7QUFLSixjQUFRLFNBQVM7QUFFakIsYUFBTztBQUFBO0FBUVQsMkJBQXVCLEtBQUssR0FBRztBQUM3QixVQUFJLFFBQVEscUJBQXFCLEtBQUs7QUFDdEMsVUFBSSxDQUFDO0FBQU8sZUFBTztBQUVuQixVQUFJLFdBQVcsTUFBTTtBQUNyQixVQUFJLElBQUk7QUFDUixVQUFJLE1BQU0sSUFBSTtBQUNaLFlBQUksU0FBUyxNQUFNLEdBQUcsTUFBTTtBQUM1QixpQkFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsS0FBSztBQUN0QyxjQUFJLElBQUksT0FBTyxHQUFHLE9BQU8sTUFBTTtBQUMvQixjQUFJLEVBQUUsT0FBTyxLQUFLO0FBQ2hCLGdCQUFJLFdBQVcsRUFBRTtBQUNqQjtBQUFBO0FBQUE7QUFBQTtBQUtOLGFBQU87QUFBQSxRQUNMO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQTtBQUFBO0FBU0osaUNBQTZCLFVBQVUsVUFBVSxPQUFPO0FBQ3RELFVBQUksV0FBVyxFQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRztBQUVoQyxlQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxLQUFLO0FBQ3hDLFlBQUksT0FBTyxRQUFRLFVBQVUsU0FBUyxJQUFJO0FBRTFDLFlBQUksUUFBUyxVQUFTLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxHQUFHO0FBQ25GLHFCQUFXO0FBQUE7QUFBQTtBQUlmLGFBQU87QUFBQTtBQVFULHFCQUFpQixVQUFVLE1BQU0sT0FBTztBQUN0QyxVQUFJLElBQUk7QUFDUixVQUFHLEtBQUssU0FBUyxrQkFBa0IsU0FBUyxlQUFjO0FBQ3hELGFBQUs7QUFBQSxpQkFDSSxLQUFLLGFBQWEsS0FBTTtBQUNqQyxlQUFPO0FBQUE7QUFHVCxhQUFPO0FBQUEsUUFDTCxHQUFHO0FBQUEsUUFDSCxHQUFHLEtBQUs7QUFBQSxRQUNSLEdBQUcsS0FBSztBQUFBLFFBQ1I7QUFBQTtBQUFBO0FBU0osZ0NBQTRCLFFBQVEsVUFBVTtBQUM1QyxVQUFJLFVBQVUsb0JBQW9CLFVBQVU7QUFFNUMsVUFBSSxDQUFDLFVBQVU7QUFFYixlQUFPLFFBQ0osT0FBTyxXQUNQLEtBQUssY0FDTCxJQUFJO0FBQUE7QUFHVCxVQUFJLGFBQWEsU0FBUyxJQUFJLHFCQUFxQixNQUFNLE9BQU87QUFDOUQsZUFBTyxvQkFBb0IsTUFBTSxTQUFTO0FBQUE7QUFJNUMsYUFBTyxXQUFXLE9BQU8sV0FBVyxLQUFLLGNBQWMsSUFBSSxxQkFBcUIsVUFBVTtBQUN4RixlQUFPLFNBQVMsV0FBVyxRQUFRO0FBQUE7QUFBQTtBQVN2QywwQkFBc0IsR0FBRyxHQUFHO0FBQzFCLGFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBTyxFQUFFLElBQUksRUFBRSxLQUFPLEVBQUUsSUFBSSxFQUFFLEtBQU8sRUFBRSxJQUFJLEVBQUUsS0FBTTtBQUFBO0FBUXJFLDZCQUF5QixNQUFNO0FBQzdCLGFBQU8sS0FBSztBQUFBO0FBUWQsdUJBQW1CLE1BQU07QUFDdkIsYUFBTyxLQUFLLElBQUk7QUFBQTtBQUFBO0FBQUE7OztBQ3RMbEI7QUFBQTtBQVFBO0FBT0EsWUFBTyxVQUFVO0FBQ2pCLFlBQU8sUUFBUSxxQkFBcUI7QUFPcEMsUUFBSSx1QkFBdUI7QUFPM0IsaUNBQTZCLFFBQVE7QUFDbkMsVUFBSSxVQUFVLE9BQU8sTUFBTTtBQUUzQixlQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUM5QyxZQUFJLFdBQVcsY0FBYyxRQUFRLEdBQUcsUUFBUTtBQUVoRCxZQUFJLFVBQVU7QUFDWixrQkFBUSxPQUFPO0FBQUE7QUFBQTtBQUtuQixjQUFRLFNBQVM7QUFFakIsYUFBTztBQUFBO0FBUVQsMkJBQXVCLEtBQUssR0FBRztBQUM3QixVQUFJLFFBQVEscUJBQXFCLEtBQUs7QUFDdEMsVUFBSSxDQUFDO0FBQU8sZUFBTztBQUVuQixVQUFJLFNBQVMsTUFBTTtBQUNuQixVQUFJLFNBQVMsTUFBTTtBQUNuQixVQUFJLE9BQU87QUFFWCxVQUFJO0FBQVEsZ0JBQVEsTUFBTTtBQUUxQixVQUFJLElBQUk7QUFDUixVQUFJLE1BQU0sSUFBSTtBQUNaLFlBQUksU0FBUyxNQUFNLEdBQUcsTUFBTTtBQUM1QixpQkFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsS0FBSztBQUN0QyxjQUFJLElBQUksT0FBTyxHQUFHLE1BQU07QUFDeEIsY0FBSSxFQUFFLE9BQU87QUFBSyxnQkFBSSxXQUFXLEVBQUU7QUFBQTtBQUFBO0FBSXZDLGFBQU87QUFBQSxRQUNMO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBO0FBQUE7QUFTSixpQ0FBNkIsVUFBVSxVQUFVLE9BQU87QUFDdEQsVUFBSSxXQUFXLEVBQUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHO0FBRWhDLGVBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7QUFDeEMsWUFBSSxPQUFPLFFBQVEsVUFBVSxTQUFTLElBQUk7QUFFMUMsWUFBSSxRQUFTLFVBQVMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEdBQUc7QUFDbkYscUJBQVc7QUFBQTtBQUFBO0FBSWYsYUFBTztBQUFBO0FBUVQscUJBQWlCLFVBQVUsTUFBTSxPQUFPO0FBQ3RDLFVBQUksSUFBSSxjQUFjO0FBQ3RCLFVBQUksQ0FBQztBQUFHLGVBQU87QUFDZixVQUFJLElBQUk7QUFDUixVQUFHLEtBQUssS0FBSyxrQkFBa0IsRUFBRSxLQUFLLGVBQWM7QUFDbEQsYUFBSztBQUFBLGlCQUNJLEtBQUssT0FBTyxrQkFBa0IsRUFBRSxLQUFLLGVBQWU7QUFDN0QsYUFBSztBQUFBLGlCQUNJLEtBQUssS0FBSyxrQkFBa0IsRUFBRSxPQUFPLGVBQWU7QUFDN0QsYUFBSztBQUFBLGlCQUNJLEtBQUssU0FBUyxLQUFNO0FBQzdCLGVBQU87QUFBQTtBQUdULGFBQU87QUFBQSxRQUNMLEdBQUc7QUFBQSxRQUNILEdBQUcsS0FBSztBQUFBLFFBQ1IsR0FBRyxLQUFLO0FBQUEsUUFDUjtBQUFBO0FBQUE7QUFTSixnQ0FBNEIsUUFBUSxVQUFVO0FBRTVDLFVBQUksVUFBVSxvQkFBb0IsV0FBVyxTQUFZLE1BQU0sVUFBVTtBQUV6RSxVQUFJLENBQUMsVUFBVTtBQUViLGVBQU8sUUFDSixPQUFPLFdBQ1AsS0FBSyxjQUNMLElBQUk7QUFBQTtBQUdULFVBQUksYUFBYSxTQUFTLElBQUkscUJBQXFCLE1BQU0sT0FBTztBQUM5RCxlQUFPLG9CQUFvQixNQUFNLFNBQVM7QUFBQTtBQUk1QyxhQUFPLFdBQVcsT0FBTyxXQUFXLEtBQUssY0FBYyxJQUFJLHFCQUFxQixVQUFVO0FBQ3hGLGVBQU8sU0FBUyxXQUFXLFFBQVE7QUFBQTtBQUFBO0FBU3ZDLDBCQUFzQixHQUFHLEdBQUc7QUFDMUIsYUFBUSxFQUFFLElBQUksRUFBRSxLQUFPLEVBQUUsSUFBSSxFQUFFLEtBQU8sRUFBRSxJQUFJLEVBQUUsS0FBTyxFQUFFLElBQUksRUFBRSxLQUFNO0FBQUE7QUFRckUsNkJBQXlCLE1BQU07QUFDN0IsYUFBTyxLQUFLO0FBQUE7QUFRZCx1QkFBbUIsTUFBTTtBQUN2QixhQUFPLEtBQUssSUFBSTtBQUFBO0FBQUE7QUFBQTs7O0FDakxsQjtBQUFBO0FBUUE7QUFPQSxZQUFPLFVBQVU7QUFDakIsWUFBTyxRQUFRLHNCQUFzQjtBQU9yQyxRQUFJLHdCQUF3QjtBQU81Qix5QkFBcUIsUUFBUTtBQUMzQixVQUFJLFVBQVUsZ0JBQWdCO0FBRTlCLGVBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLFFBQVEsUUFBUSxLQUFLO0FBQzlDLFlBQUksWUFBWSxlQUFlLFFBQVEsR0FBRyxRQUFRO0FBRWxELFlBQUksV0FBVztBQUNiLGtCQUFRLE9BQU87QUFBQTtBQUFBO0FBS25CLGNBQVEsU0FBUztBQUVqQixhQUFPO0FBQUE7QUFRVCw0QkFBd0IsS0FBSyxHQUFHO0FBQzlCLFVBQUksUUFBUSxzQkFBc0IsS0FBSztBQUN2QyxVQUFJLENBQUM7QUFBTyxlQUFPO0FBRW5CLFVBQUksU0FBUyxPQUFPLE9BQU87QUFDM0IsVUFBSSxJQUFJO0FBQ1IsVUFBSSxVQUFVLE1BQU07QUFDcEIsVUFBSSxPQUFPLE1BQU07QUFFakIsVUFBSSxNQUFNLElBQUk7QUFDWixZQUFJLE9BQU8sZ0JBQWdCLE1BQU0sSUFBSSxJQUFJO0FBRXpDLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ3BDLGNBQUksT0FBTyxLQUFLO0FBQ2hCLGNBQUksTUFBTSxLQUFLLEdBQUc7QUFDbEIsY0FBSSxNQUFNLEtBQUs7QUFHZixjQUFJLFFBQVEsT0FBTyxJQUFJLE9BQU8sT0FBTyxJQUFJLElBQUksU0FBUyxPQUFPLE1BQ3pELElBQUksT0FBTyxHQUFHLElBQUksU0FBUyxLQUMzQjtBQUVKLGNBQUksUUFBUSxLQUFLO0FBQ2YsZ0JBQUksV0FBVztBQUNmO0FBQUE7QUFJRixpQkFBTyxPQUFPO0FBQUE7QUFBQTtBQUlsQixhQUFPO0FBQUEsUUFDTDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQTtBQUFBO0FBU0osa0NBQThCLE1BQU0sVUFBVSxPQUFPO0FBQ25ELFVBQUksV0FBVyxFQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRztBQUVoQyxlQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxLQUFLO0FBQ3hDLFlBQUksT0FBTyxRQUFRLE1BQU0sU0FBUyxJQUFJO0FBRXRDLFlBQUksUUFBUyxVQUFTLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxHQUFHO0FBQ25GLHFCQUFXO0FBQUE7QUFBQTtBQUlmLGFBQU87QUFBQTtBQVFULHFCQUFpQixNQUFNLE1BQU0sT0FBTztBQUNsQyxVQUFJLElBQUksZUFBZTtBQUN2QixVQUFJLElBQUk7QUFFUixVQUFJLENBQUMsR0FBRztBQUNOLGVBQU87QUFBQTtBQUdULFVBQUcsS0FBSyxLQUFLLGlCQUFpQixFQUFFLEtBQUssZUFBZTtBQUNsRCxhQUFLO0FBQUEsaUJBQ0csS0FBSyxRQUFRLEtBQUs7QUFDMUIsZUFBTztBQUFBO0FBR1QsVUFBRyxLQUFLLFFBQVEsaUJBQWlCLEVBQUUsUUFBUSxlQUFlO0FBQ3hELGFBQUs7QUFBQSxpQkFDRyxLQUFLLFdBQVcsS0FBSztBQUM3QixlQUFPO0FBQUE7QUFHVCxVQUFJLE9BQU8sT0FBTyxLQUFLLEtBQUs7QUFDNUIsVUFBSSxLQUFLLFNBQVMsR0FBRztBQUNuQixZQUFJLEtBQUssTUFBTSxTQUFVLEdBQUc7QUFDMUIsaUJBQU8sS0FBSyxPQUFPLE1BQU0sT0FBUSxNQUFLLE9BQU8sTUFBTSxJQUFJLGlCQUFrQixHQUFFLE9BQU8sTUFBTSxJQUFJO0FBQUEsWUFDMUY7QUFDRixlQUFLO0FBQUEsZUFDQTtBQUNMLGlCQUFPO0FBQUE7QUFBQTtBQUlYLGFBQU87QUFBQSxRQUNMLEdBQUc7QUFBQSxRQUNILEdBQUcsS0FBSztBQUFBLFFBQ1IsR0FBRyxLQUFLO0FBQUEsUUFDUjtBQUFBO0FBQUE7QUFTSixpQ0FBNkIsUUFBUSxVQUFVO0FBRTdDLFVBQUksVUFBVSxZQUFZLFdBQVcsU0FBWSxRQUFRLFVBQVU7QUFFbkUsVUFBSSxDQUFDLFVBQVU7QUFFYixlQUFPLFFBQ0osT0FBTyxXQUNQLEtBQUssY0FDTCxJQUFJO0FBQUE7QUFHVCxVQUFJLGFBQWEsU0FBUyxJQUFJLHFCQUFxQixNQUFNLE9BQU87QUFDOUQsZUFBTyxxQkFBcUIsTUFBTSxTQUFTO0FBQUE7QUFJN0MsYUFBTyxXQUFXLE9BQU8sV0FBVyxLQUFLLGNBQWMsSUFBSSxpQkFBaUIsVUFBVTtBQUNwRixlQUFPLFNBQVMsV0FBVyxRQUFRO0FBQUE7QUFBQTtBQVN2QywwQkFBc0IsR0FBRyxHQUFHO0FBQzFCLGFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBTyxFQUFFLElBQUksRUFBRSxLQUFPLEVBQUUsSUFBSSxFQUFFLEtBQU8sRUFBRSxJQUFJLEVBQUUsS0FBTTtBQUFBO0FBUXJFLHlCQUFxQixNQUFNO0FBQ3pCLGFBQU8sS0FBSyxPQUFPLE1BQU0sS0FBSztBQUFBO0FBUWhDLHVCQUFtQixNQUFNO0FBQ3ZCLGFBQU8sS0FBSyxJQUFJO0FBQUE7QUFRbEIsd0JBQW9CLFFBQVE7QUFDMUIsVUFBSSxRQUFRO0FBQ1osVUFBSSxRQUFRO0FBRVosYUFBUSxTQUFRLE9BQU8sUUFBUSxLQUFLLFlBQVksSUFBSTtBQUNsRDtBQUNBO0FBQUE7QUFHRixhQUFPO0FBQUE7QUFRVCwrQkFBMkIsS0FBSztBQUM5QixVQUFJLFFBQVEsSUFBSSxRQUFRO0FBQ3hCLFVBQUk7QUFDSixVQUFJO0FBRUosVUFBSSxVQUFVLElBQUk7QUFDaEIsY0FBTTtBQUFBLGFBQ0Q7QUFDTCxjQUFNLElBQUksT0FBTyxHQUFHO0FBQ3BCLGNBQU0sSUFBSSxPQUFPLFFBQVE7QUFBQTtBQUczQixhQUFPLENBQUMsS0FBSztBQUFBO0FBUWYsNkJBQXlCLFFBQVE7QUFDL0IsVUFBSSxVQUFVLE9BQU8sTUFBTTtBQUUzQixlQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUM5QyxZQUFJLFdBQVcsUUFBUSxNQUFNLEtBQUssR0FBRztBQUNuQyxrQkFBUSxFQUFFLEtBQUssUUFBUTtBQUFBLGVBQ2xCO0FBQ0wsa0JBQVEsTUFBTSxNQUFNLFFBQVE7QUFBQTtBQUFBO0FBS2hDLGNBQVEsU0FBUyxJQUFJO0FBRXJCLGFBQU87QUFBQTtBQVFULDZCQUF5QixLQUFLO0FBQzVCLFVBQUksYUFBYSxJQUFJLE1BQU07QUFFM0IsZUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksV0FBVyxRQUFRLEtBQUs7QUFDakQsWUFBSSxXQUFXLFdBQVcsTUFBTSxLQUFLLEdBQUc7QUFDdEMscUJBQVcsRUFBRSxLQUFLLFdBQVc7QUFBQSxlQUN4QjtBQUNMLHFCQUFXLE1BQU0sTUFBTSxXQUFXO0FBQUE7QUFBQTtBQUt0QyxpQkFBVyxTQUFTLElBQUk7QUFFeEIsZUFBUyxJQUFJLEdBQUcsSUFBSSxXQUFXLFFBQVEsS0FBSztBQUMxQyxtQkFBVyxLQUFLLFdBQVcsR0FBRztBQUFBO0FBR2hDLGFBQU87QUFBQTtBQUFBO0FBQUE7OztBQ3BTVDtBQUFBO0FBUUE7QUFFQSxRQUFJLG9CQUFvQjtBQUN4QixRQUFJLHFCQUFxQjtBQUN6QixRQUFJLHFCQUFxQjtBQUN6QixRQUFJLHNCQUFzQjtBQU8xQixZQUFPLFVBQVU7QUFDakIsWUFBTyxRQUFRLGFBQWE7QUFRNUIsd0JBQW9CLFNBQVM7QUFDM0IsVUFBSSxDQUFFLGlCQUFnQixhQUFhO0FBQ2pDLGVBQU8sSUFBSSxXQUFXO0FBQUE7QUFHeEIsV0FBSyxVQUFVO0FBQUE7QUFHakIsZUFBVyxVQUFVLFVBQVUsaUJBQWlCLFdBQVc7QUFDekQsVUFBSSxNQUFNLEtBQUssU0FBUztBQUN4QixhQUFPLE9BQU8sSUFBSTtBQUFBO0FBR3BCLGVBQVcsVUFBVSxXQUFXLGtCQUFrQixXQUFXO0FBQzNELGFBQU8sa0JBQWtCLEtBQUssUUFBUSxRQUFRLG1CQUFtQjtBQUFBO0FBR25FLGVBQVcsVUFBVSxXQUFXLGtCQUFrQixXQUFXO0FBQzNELFVBQUksTUFBTSxLQUFLLFVBQVU7QUFDekIsYUFBTyxPQUFPLElBQUk7QUFBQTtBQUdwQixlQUFXLFVBQVUsWUFBWSxtQkFBbUIsV0FBVztBQUM3RCxhQUFPLG1CQUFtQixLQUFLLFFBQVEsUUFBUSxvQkFBb0I7QUFBQTtBQUdyRSxlQUFXLFVBQVUsV0FBVyxrQkFBa0IsV0FBVztBQUMzRCxVQUFJLE1BQU0sS0FBSyxVQUFVO0FBQ3pCLGFBQU8sT0FBTyxJQUFJO0FBQUE7QUFHcEIsZUFBVyxVQUFVLFlBQVksbUJBQW1CLFdBQVc7QUFDN0QsYUFBTyxtQkFBbUIsS0FBSyxRQUFRLFFBQVEsb0JBQW9CO0FBQUE7QUFHckUsZUFBVyxVQUFVLFlBQVksbUJBQW1CLFdBQVc7QUFDN0QsVUFBSSxNQUFNLEtBQUssV0FBVztBQUMxQixhQUFPLE9BQU8sSUFBSTtBQUFBO0FBR3BCLGVBQVcsVUFBVSxhQUFhLG9CQUFvQixXQUFXO0FBQy9ELGFBQU8sb0JBQW9CLEtBQUssUUFBUSxRQUFRLFFBQVE7QUFBQTtBQUkxRCxlQUFXLFVBQVUsbUJBQW1CLFdBQVcsVUFBVTtBQUM3RCxlQUFXLFVBQVUsb0JBQW9CLFdBQVcsVUFBVTtBQUM5RCxlQUFXLFVBQVUsb0JBQW9CLFdBQVcsVUFBVTtBQUM5RCxlQUFXLFVBQVUscUJBQXFCLFdBQVcsVUFBVTtBQUMvRCxlQUFXLFVBQVUsb0JBQW9CLFdBQVcsVUFBVTtBQUM5RCxlQUFXLFVBQVUscUJBQXFCLFdBQVcsVUFBVTtBQUMvRCxlQUFXLFVBQVUscUJBQXFCLFdBQVcsVUFBVTtBQUMvRCxlQUFXLFVBQVUsc0JBQXNCLFdBQVcsVUFBVTtBQUFBO0FBQUE7OztBQ2pGaEU7QUFBQTtBQU9BO0FBT0EsUUFBSSxhQUFhO0FBQ2pCLFFBQUksUUFBTztBQU9YLFlBQU8sVUFBVTtBQVNqQixxQkFBa0IsS0FBSztBQUNyQixVQUFJLENBQUUsaUJBQWdCLFVBQVU7QUFDOUIsZUFBTyxJQUFJLFFBQVE7QUFBQTtBQUdyQixXQUFLLFVBQVUsSUFBSTtBQUNuQixXQUFLLGFBQWEsSUFBSSxXQUFXO0FBQUE7QUE0Q25DLFlBQVEsVUFBVSxPQUNsQixRQUFRLFVBQVUsUUFBUSxTQUFVLFFBQVE7QUFDMUMsVUFBSSxRQUFRO0FBR1osVUFBSSxTQUFTLENBQUMsTUFBTSxRQUFRLFFBQVE7QUFDbEMsZ0JBQVEsSUFBSSxNQUFNLFVBQVU7QUFDNUIsaUJBQVMsSUFBSSxHQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFDckMsZ0JBQU0sS0FBSyxVQUFVO0FBQUE7QUFBQTtBQUt6QixVQUFJLENBQUMsU0FBUyxNQUFNLFdBQVcsR0FBRztBQUNoQyxlQUFPLEtBQUssV0FBVztBQUFBO0FBSXpCLFVBQUksQ0FBQyxLQUFLLFFBQVEsUUFBUTtBQUN4QixlQUFPLE1BQU07QUFBQTtBQUdmLFVBQUksUUFBUSxNQUFNLElBQUk7QUFDdEIsVUFBSSxVQUFVLEtBQUssV0FBVyxXQUFXLE1BQU0sT0FBTztBQUN0RCxVQUFJLFFBQVEsUUFBUTtBQUVwQixhQUFPLFFBQ0gsTUFBTSxNQUFNLFFBQVEsVUFDcEI7QUFBQTtBQWdCTixZQUFRLFVBQVUsV0FDbEIsUUFBUSxVQUFVLFlBQVksU0FBVSxZQUFZO0FBQ2xELFVBQUksWUFBWTtBQUdoQixVQUFJLGFBQWEsQ0FBQyxNQUFNLFFBQVEsWUFBWTtBQUMxQyxvQkFBWSxJQUFJLE1BQU0sVUFBVTtBQUNoQyxpQkFBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsS0FBSztBQUN6QyxvQkFBVSxLQUFLLFVBQVU7QUFBQTtBQUFBO0FBSzdCLFVBQUksQ0FBQyxhQUFhLFVBQVUsV0FBVyxHQUFHO0FBQ3hDLGVBQU8sS0FBSyxXQUFXO0FBQUE7QUFHekIsYUFBTyxLQUFLLFdBQVcsVUFBVSxXQUFXLE1BQU07QUFBQTtBQWdCcEQsWUFBUSxVQUFVLFVBQ2xCLFFBQVEsVUFBVSxXQUFXLFNBQVUsV0FBVztBQUNoRCxVQUFJLFdBQVc7QUFHZixVQUFJLFlBQVksQ0FBQyxNQUFNLFFBQVEsV0FBVztBQUN4QyxtQkFBVyxJQUFJLE1BQU0sVUFBVTtBQUMvQixpQkFBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN4QyxtQkFBUyxLQUFLLFVBQVU7QUFBQTtBQUFBO0FBSzVCLFVBQUksQ0FBQyxZQUFZLFNBQVMsV0FBVyxHQUFHO0FBQ3RDLGVBQU8sS0FBSyxXQUFXO0FBQUE7QUFHekIsYUFBTyxLQUFLLFdBQVcsU0FBUyxVQUFVLE1BQU07QUFBQTtBQWdCbEQsWUFBUSxVQUFVLE9BQ2xCLFFBQVEsVUFBVSxRQUNsQixRQUFRLFVBQVUsV0FDbEIsUUFBUSxVQUFVLFlBQVksU0FBVSxZQUFZO0FBQ2xELFVBQUksWUFBWTtBQUdoQixVQUFJLGFBQWEsQ0FBQyxNQUFNLFFBQVEsWUFBWTtBQUMxQyxvQkFBWSxJQUFJLE1BQU0sVUFBVTtBQUNoQyxpQkFBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsS0FBSztBQUN6QyxvQkFBVSxLQUFLLFVBQVU7QUFBQTtBQUFBO0FBSzdCLFVBQUksQ0FBQyxhQUFhLFVBQVUsV0FBVyxHQUFHO0FBQ3hDLGVBQU8sS0FBSyxXQUFXO0FBQUE7QUFHekIsYUFBTyxLQUFLLFdBQVcsVUFBVSxXQUFXLE1BQU07QUFBQTtBQVdwRCx1QkFBb0IsTUFBTTtBQUN4QixhQUFPLEtBQUssUUFBUSxTQUFTLEtBQ3pCLE1BQUssT0FBTyxRQUNaO0FBQUE7QUFXTix1QkFBb0IsTUFBTTtBQUN4QixhQUFPLE9BQU8sU0FBUztBQUFBO0FBQUE7QUFBQTs7O0FDNU96QjtBQUFBO0FBUUE7QUFPQSxRQUFJLFVBQVU7QUFDZCxRQUFJLFlBQVksZUFBZ0I7QUFDaEMsUUFBSSxPQUFPLFFBQVEsT0FBTztBQUMxQixRQUFJLFNBQVM7QUFDYixRQUFJLFFBQU8sUUFBUTtBQUNuQixRQUFJLFFBQVE7QUFDWixRQUFJLGFBQWE7QUFDakIsUUFBSSxRQUFRO0FBQ1osUUFBSSxZQUFZO0FBT2hCLFFBQUksTUFBTSxPQUFPLE9BQU8sTUFBSyxnQkFBZ0I7QUFPN0MsWUFBTyxVQUFVO0FBMEJqQixRQUFJLE1BQ0osSUFBSSxTQUFTLGdCQUFnQixNQUFNO0FBQ2pDLFVBQUksQ0FBQyxNQUFNO0FBQ1QsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixVQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsVUFBSSxLQUFLLEtBQUs7QUFFZCxjQUFRO0FBQUEsYUFDRDtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxLQUFLLFFBQVEsWUFDZixLQUFLLFFBQVE7QUFBQTtBQUVsQixpQkFBTyxLQUFLLFFBQVE7QUFBQTtBQUFBO0FBa0QxQixRQUFJLFVBQVUsV0FBVTtBQUN0QixVQUFJLFNBQVMsUUFBUTtBQUNyQixhQUFPLE9BQU8sTUFBTSxNQUFNLFFBQVE7QUFBQTtBQVdwQyxRQUFJLG1CQUFtQixXQUFVO0FBQy9CLFVBQUksU0FBUyxRQUFRO0FBQ3JCLGFBQU8sT0FBTyxVQUFVLE1BQU0sUUFBUTtBQUFBO0FBR3hDLFFBQUksa0JBQWtCLFVBQVUsU0FBUyxJQUFJLGtCQUMzQztBQVdGLFFBQUksa0JBQWtCLFdBQVU7QUFDOUIsVUFBSSxTQUFTLFFBQVE7QUFDckIsYUFBTyxPQUFPLFNBQVMsTUFBTSxRQUFRO0FBQUE7QUFHdkMsUUFBSSxpQkFBaUIsVUFBVSxTQUFTLElBQUksaUJBQzFDO0FBV0YsUUFBSSxtQkFBbUIsV0FBVTtBQUMvQixVQUFJLFNBQVMsUUFBUTtBQUNyQixhQUFPLE9BQU8sVUFBVSxNQUFNLFFBQVE7QUFBQTtBQUd4QyxRQUFJLGtCQUFrQixVQUFVLFNBQVMsSUFBSSxrQkFDM0M7QUEyQkYsUUFBSSxRQUFRLGVBQWUsTUFBTSxTQUFTO0FBQ3hDLFVBQUksU0FBUSxLQUFLLElBQUk7QUFDckIsVUFBSSxDQUFDO0FBQU87QUFDWixhQUFPLFdBQVcsTUFBTSxRQUFPO0FBQUE7QUFvQmpDLFFBQUksUUFBUSxlQUFlLE1BQU0sY0FBYztBQUM3QyxVQUFJLFNBQVMsS0FBSyxVQUFVO0FBQzVCLFVBQUksT0FBTyxLQUFLLFFBQVE7QUFDeEIsVUFBSSxRQUFRLEtBQUssU0FBUztBQUUxQixVQUFJLE9BQU8sVUFBVSxXQUFXLElBQzVCLFNBQ0E7QUFDSixnQkFBVSxlQUFlLE9BQU87QUFFaEMsVUFBSSxBQUFRLE9BQU8sU0FBZixRQUF3QixPQUFPLGVBQWU7QUFBTyxlQUFPLE9BQU87QUFDdkUsVUFBSSxBQUFRLEtBQUssU0FBYjtBQUFvQixlQUFPLEtBQUs7QUFDcEMsVUFBSSxBQUFRLE1BQU0sU0FBZDtBQUFxQixlQUFPLE1BQU07QUFFdEMsYUFBTztBQUFBO0FBNkJULFFBQUksS0FBSyxZQUFZLE9BQU87QUFDMUIsVUFBSSxNQUFNO0FBR1YsVUFBSSxDQUFDLE1BQU0sUUFBUSxRQUFRO0FBQ3pCLGNBQU0sSUFBSSxNQUFNLFVBQVU7QUFDMUIsaUJBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRLEtBQUs7QUFDbkMsY0FBSSxLQUFLLFVBQVU7QUFBQTtBQUFBO0FBSXZCLGFBQU8sT0FBTyxNQUFNO0FBQUE7QUFpQnRCLGlCQUFhLEtBQUssWUFBWSxvQkFBbUI7QUFDL0MsVUFBSSxRQUFRLEtBQUssV0FBVyxZQUN4QixVQUNBO0FBQ0osVUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJO0FBRXpCLFVBQUksQ0FBQyxNQUFNLEtBQUssV0FBVyxlQUFlLElBQUk7QUFDNUMsZUFBTztBQUFBO0FBS1QsVUFBSSxTQUFTLEtBQUssSUFBSSx3QkFBd0I7QUFDOUMsVUFBSSxRQUFRLE9BQU8sUUFBUTtBQUUzQixhQUFPLFVBQVUsS0FDYixPQUFPLFVBQVUsR0FBRyxPQUFPLFNBQzNCLE9BQU87QUFBQTtBQVliLGlCQUFhLEtBQUssVUFBVSxrQkFBaUI7QUFDM0MsYUFBTyxLQUFLLGFBQWE7QUFBQTtBQWEzQixpQkFBYSxLQUFLLE1BQU0sY0FBYTtBQUNuQyxVQUFJLFFBQVEsS0FBSyxJQUFJLElBQUk7QUFDekIsYUFBTyxVQUFVLE1BQU07QUFBQTtBQWV6QixpQkFBYSxLQUFLLE9BQU8sZUFBZTtBQUN0QyxVQUFJLFFBQVEsS0FBSyxJQUFJLElBQUk7QUFDekIsVUFBSSxRQUFRLFVBQVUsSUFBSSxNQUFNO0FBSWhDLFlBQU0sVUFBVTtBQUVoQixhQUFPO0FBQUE7QUFrQlQsaUJBQWEsS0FBSyxjQUFjLHNCQUFzQjtBQUNwRCxVQUFJLFdBQVcsS0FBSztBQUVwQixVQUFJLENBQUM7QUFBVSxlQUFPO0FBRXRCLFVBQUksU0FBUyxLQUFLLElBQUksSUFBSTtBQUMxQixVQUFJLGNBQWEsQ0FBQyxLQUFLLFlBQ25CLFNBQVMsTUFBTSxLQUFLLFlBQ3BCLENBQUM7QUFFTCxhQUFPLFlBQVcsTUFBTTtBQUFBO0FBVTFCLGlCQUFhLEtBQUssUUFBUSxnQkFBZ0I7QUFDeEMsYUFBTyxNQUFNLE1BQU07QUFBQTtBQWNyQixpQkFBYSxLQUFLLFlBQVksb0JBQW1CO0FBQy9DLFVBQUksUUFBUSxLQUFLLElBQUksSUFBSTtBQUN6QixVQUFJLE9BQU8sS0FBSyxJQUFJO0FBRXBCLFVBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFdBQVcsZUFBZSxJQUFJO0FBQ3JELGVBQU8sS0FBSyxJQUFJO0FBQUEsaUJBQ1AsS0FBSyxRQUFRLFNBQVMsSUFBSTtBQUduQyxlQUFPLEtBQUssVUFBVSxHQUFHLEtBQUssUUFBUSxNQUFNO0FBQUE7QUFHOUMsVUFBSSxDQUFDO0FBQU07QUFHWCxVQUFJLFNBQVMsS0FBSyxPQUFPLE1BQ3JCLEtBQUssUUFBUSxPQUFPLElBQ3BCO0FBQ0osVUFBSSxRQUFRLEtBQUssUUFBUSxLQUFLO0FBRTlCLGFBQU8sVUFBVSxLQUNiLEtBQUssVUFBVSxHQUFHLFNBQ2xCO0FBQUE7QUFLTixpQkFBYSxLQUFLLFFBQVEsVUFBVSxTQUFTLGdCQUFlO0FBQzFELGFBQU8sS0FBSztBQUFBLE9BQ1g7QUFXSCxpQkFBYSxLQUFLLFNBQVMsV0FBVTtBQUNuQyxVQUFJLFNBQVMsS0FBSztBQUNsQixVQUFJLE1BQU0sS0FBSztBQUNmLFVBQUksU0FBUyxJQUFJO0FBR2pCLFVBQUksQUFBVSxXQUFWLFNBQW9CLEFBQVcsV0FBWDtBQUFtQixlQUFPO0FBR2xELFVBQUssVUFBVSxPQUFPLFNBQVMsT0FBUSxBQUFRLFdBQVIsS0FBZ0I7QUFDckQsZUFBTyxNQUFNLEtBQUssU0FBUztBQUFBLFVBQ3pCLFFBQVEsSUFBSSxJQUFJO0FBQUEsVUFDaEIsaUJBQWlCLElBQUksSUFBSTtBQUFBO0FBQUE7QUFJN0IsYUFBTztBQUFBO0FBWVQsaUJBQWEsS0FBSyxTQUFTLGlCQUFnQjtBQUN6QyxhQUFPLENBQUMsS0FBSztBQUFBO0FBVWYsaUJBQWEsS0FBSyxPQUFPLGVBQWM7QUFDckMsVUFBSSxNQUFNLEtBQUssSUFBSSx1QkFBdUI7QUFDMUMsYUFBTyxJQUFJLGtCQUFrQjtBQUFBO0FBVy9CLDBCQUFzQixLQUFLLE1BQU0sUUFBUTtBQUN2QyxhQUFPLGVBQWUsS0FBSyxNQUFNO0FBQUEsUUFDL0IsY0FBYztBQUFBLFFBQ2QsWUFBWTtBQUFBLFFBQ1osS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUMxZ0JUO0FBQUE7QUFJQSxRQUFJLFNBQVMsUUFBUTtBQVdyQixZQUFRLE9BQU8sU0FBUyxLQUFLLFFBQU87QUFDbEMsVUFBSSxBQUFZLE9BQU8sT0FBbkI7QUFBd0IsY0FBTSxJQUFJLFVBQVU7QUFDaEQsVUFBSSxBQUFZLE9BQU8sVUFBbkI7QUFBMkIsY0FBTSxJQUFJLFVBQVU7QUFDbkQsYUFBTyxNQUFNLE1BQU0sT0FDaEIsV0FBVyxVQUFVLFFBQ3JCLE9BQU8sS0FDUCxPQUFPLFVBQ1AsUUFBUSxRQUFRO0FBQUE7QUFhckIsWUFBUSxTQUFTLFNBQVMsS0FBSyxRQUFPO0FBQ3BDLFVBQUksQUFBWSxPQUFPLE9BQW5CO0FBQXdCLGNBQU0sSUFBSSxVQUFVO0FBQ2hELFVBQUksQUFBWSxPQUFPLFVBQW5CO0FBQTJCLGNBQU0sSUFBSSxVQUFVO0FBQ25ELFVBQUksTUFBTSxJQUFJLE1BQU0sR0FBRyxJQUFJLFlBQVksT0FDbkMsTUFBTSxRQUFRLEtBQUssS0FBSztBQUU1QixhQUFPLEtBQUssUUFBUSxLQUFLLE9BQU8sTUFBTTtBQUFBO0FBT3hDLGtCQUFjLEtBQUk7QUFDaEIsYUFBTyxPQUFPLFdBQVcsUUFBUSxPQUFPLEtBQUssT0FBTztBQUFBO0FBQUE7QUFBQTs7O0FDakR0RDtBQUFBO0FBT0E7QUFPQSxZQUFRLFFBQVE7QUFDaEIsWUFBUSxZQUFZO0FBT3BCLFFBQUksYUFBYSxPQUFPLFVBQVU7QUFVbEMsUUFBSSxxQkFBcUI7QUFjekIsbUJBQWUsS0FBSyxTQUFTO0FBQzNCLFVBQUksT0FBTyxRQUFRLFVBQVU7QUFDM0IsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixVQUFJLE1BQU07QUFDVixVQUFJLE1BQU0sV0FBVztBQUNyQixVQUFJLE1BQU0sSUFBSSxVQUFVO0FBRXhCLFVBQUksUUFBUTtBQUNaLGFBQU8sUUFBUSxJQUFJLFFBQVE7QUFDekIsWUFBSSxRQUFRLElBQUksUUFBUSxLQUFLO0FBRzdCLFlBQUksVUFBVSxJQUFJO0FBQ2hCO0FBQUE7QUFHRixZQUFJLFNBQVMsSUFBSSxRQUFRLEtBQUs7QUFFOUIsWUFBSSxXQUFXLElBQUk7QUFDakIsbUJBQVMsSUFBSTtBQUFBLG1CQUNKLFNBQVMsT0FBTztBQUV6QixrQkFBUSxJQUFJLFlBQVksS0FBSyxRQUFRLEtBQUs7QUFDMUM7QUFBQTtBQUdGLFlBQUksTUFBTSxJQUFJLE1BQU0sT0FBTyxPQUFPO0FBR2xDLFlBQUksQUFBYyxJQUFJLFNBQWxCLFFBQXdCO0FBQzFCLGNBQUksTUFBTSxJQUFJLE1BQU0sUUFBUSxHQUFHLFFBQVE7QUFHdkMsY0FBSSxJQUFJLFdBQVcsT0FBTyxJQUFNO0FBQzlCLGtCQUFNLElBQUksTUFBTSxHQUFHO0FBQUE7QUFHckIsY0FBSSxPQUFPLFVBQVUsS0FBSztBQUFBO0FBRzVCLGdCQUFRLFNBQVM7QUFBQTtBQUduQixhQUFPO0FBQUE7QUFtQlQsdUJBQW1CLE1BQU0sS0FBSyxTQUFTO0FBQ3JDLFVBQUksTUFBTSxXQUFXO0FBQ3JCLFVBQUksTUFBTSxJQUFJLFVBQVU7QUFFeEIsVUFBSSxPQUFPLFFBQVEsWUFBWTtBQUM3QixjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksQ0FBQyxtQkFBbUIsS0FBSyxPQUFPO0FBQ2xDLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsVUFBSSxRQUFRLElBQUk7QUFFaEIsVUFBSSxTQUFTLENBQUMsbUJBQW1CLEtBQUssUUFBUTtBQUM1QyxjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksTUFBTSxPQUFPLE1BQU07QUFFdkIsVUFBSSxBQUFRLElBQUksVUFBWixNQUFvQjtBQUN0QixZQUFJLFNBQVMsSUFBSSxTQUFTO0FBRTFCLFlBQUksTUFBTSxXQUFXLENBQUMsU0FBUyxTQUFTO0FBQ3RDLGdCQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLGVBQU8sZUFBZSxLQUFLLE1BQU07QUFBQTtBQUduQyxVQUFJLElBQUksUUFBUTtBQUNkLFlBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLFNBQVM7QUFDeEMsZ0JBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsZUFBTyxjQUFjLElBQUk7QUFBQTtBQUczQixVQUFJLElBQUksTUFBTTtBQUNaLFlBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLE9BQU87QUFDdEMsZ0JBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsZUFBTyxZQUFZLElBQUk7QUFBQTtBQUd6QixVQUFJLElBQUksU0FBUztBQUNmLFlBQUksVUFBVSxJQUFJO0FBRWxCLFlBQUksQ0FBQyxPQUFPLFlBQVksTUFBTSxRQUFRLFlBQVk7QUFDaEQsZ0JBQU0sSUFBSSxVQUFVO0FBQUE7QUFHdEIsZUFBTyxlQUFlLFFBQVE7QUFBQTtBQUdoQyxVQUFJLElBQUksVUFBVTtBQUNoQixlQUFPO0FBQUE7QUFHVCxVQUFJLElBQUksUUFBUTtBQUNkLGVBQU87QUFBQTtBQUdULFVBQUksSUFBSSxVQUFVO0FBQ2hCLFlBQUksV0FBVyxPQUFPLElBQUksYUFBYSxXQUNuQyxJQUFJLFNBQVMsZ0JBQ2IsSUFBSTtBQUVSLGdCQUFRO0FBQUEsZUFDRDtBQUNILG1CQUFPO0FBQ1A7QUFBQSxlQUNHO0FBQ0gsbUJBQU87QUFDUDtBQUFBLGVBQ0c7QUFDSCxtQkFBTztBQUNQO0FBQUE7QUFFQSxrQkFBTSxJQUFJLFVBQVU7QUFBQTtBQUFBO0FBSTFCLFVBQUksSUFBSSxVQUFVO0FBQ2hCLFlBQUksV0FBVyxPQUFPLElBQUksYUFBYSxXQUNuQyxJQUFJLFNBQVMsZ0JBQWdCLElBQUk7QUFFckMsZ0JBQVE7QUFBQSxlQUNEO0FBQ0gsbUJBQU87QUFDUDtBQUFBLGVBQ0c7QUFDSCxtQkFBTztBQUNQO0FBQUEsZUFDRztBQUNILG1CQUFPO0FBQ1A7QUFBQSxlQUNHO0FBQ0gsbUJBQU87QUFDUDtBQUFBO0FBRUEsa0JBQU0sSUFBSSxVQUFVO0FBQUE7QUFBQTtBQUkxQixhQUFPO0FBQUE7QUFVVCxvQkFBaUIsS0FBSztBQUNwQixhQUFPLElBQUksUUFBUSxTQUFTLEtBQ3hCLG1CQUFtQixPQUNuQjtBQUFBO0FBVU4sb0JBQWlCLEtBQUs7QUFDcEIsYUFBTyxtQkFBbUI7QUFBQTtBQVU1QixvQkFBaUIsS0FBSztBQUNwQixhQUFPLFdBQVcsS0FBSyxTQUFTLG1CQUM5QixlQUFlO0FBQUE7QUFXbkIsdUJBQW1CLEtBQUssU0FBUTtBQUM5QixVQUFJO0FBQ0YsZUFBTyxRQUFPO0FBQUEsZUFDUCxHQUFQO0FBQ0EsZUFBTztBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUMzUVg7QUFBQTtBQU1BO0FBTUEsWUFBTyxVQUFVO0FBQ2pCLFlBQU8sUUFBUSxTQUFTO0FBYXhCLFFBQUksb0JBQW9CO0FBV3hCLG9CQUFpQixRQUFRLE9BQU87QUFDOUIsVUFBSSxPQUFPLFdBQVcsVUFBVTtBQUM5QixjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksQ0FBQyxPQUFPO0FBQ1YsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUl0QixVQUFJLFNBQVMsQ0FBQyxNQUFNLFFBQVEsU0FDeEIsTUFBTSxPQUFPLFVBQ2I7QUFHSixlQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ3RDLFlBQUksQ0FBQyxrQkFBa0IsS0FBSyxPQUFPLEtBQUs7QUFDdEMsZ0JBQU0sSUFBSSxVQUFVO0FBQUE7QUFBQTtBQUt4QixVQUFJLFdBQVcsS0FBSztBQUNsQixlQUFPO0FBQUE7QUFJVCxVQUFJLE1BQU07QUFDVixVQUFJLE9BQU8sTUFBTSxPQUFPO0FBR3hCLFVBQUksT0FBTyxRQUFRLFNBQVMsTUFBTSxLQUFLLFFBQVEsU0FBUyxJQUFJO0FBQzFELGVBQU87QUFBQTtBQUdULGVBQVMsSUFBSSxHQUFHLElBQUksT0FBTyxRQUFRLEtBQUs7QUFDdEMsWUFBSSxNQUFNLE9BQU8sR0FBRztBQUdwQixZQUFJLEtBQUssUUFBUSxTQUFTLElBQUk7QUFDNUIsZUFBSyxLQUFLO0FBQ1YsZ0JBQU0sTUFDRixNQUFNLE9BQU8sT0FBTyxLQUNwQixPQUFPO0FBQUE7QUFBQTtBQUlmLGFBQU87QUFBQTtBQVdULG1CQUFnQixRQUFRO0FBQ3RCLFVBQUksTUFBTTtBQUNWLFVBQUksT0FBTztBQUNYLFVBQUksUUFBUTtBQUdaLGVBQVMsSUFBSSxHQUFHLE1BQU0sT0FBTyxRQUFRLElBQUksS0FBSyxLQUFLO0FBQ2pELGdCQUFRLE9BQU8sV0FBVztBQUFBLGVBQ25CO0FBQ0gsZ0JBQUksVUFBVSxLQUFLO0FBQ2pCLHNCQUFRLE1BQU0sSUFBSTtBQUFBO0FBRXBCO0FBQUEsZUFDRztBQUNILGlCQUFLLEtBQUssT0FBTyxVQUFVLE9BQU87QUFDbEMsb0JBQVEsTUFBTSxJQUFJO0FBQ2xCO0FBQUE7QUFFQSxrQkFBTSxJQUFJO0FBQ1Y7QUFBQTtBQUFBO0FBS04sV0FBSyxLQUFLLE9BQU8sVUFBVSxPQUFPO0FBRWxDLGFBQU87QUFBQTtBQVdULGtCQUFlLEtBQUssT0FBTztBQUN6QixVQUFJLENBQUMsT0FBTyxDQUFDLElBQUksYUFBYSxDQUFDLElBQUksV0FBVztBQUU1QyxjQUFNLElBQUksVUFBVTtBQUFBO0FBSXRCLFVBQUksTUFBTSxJQUFJLFVBQVUsV0FBVztBQUNuQyxVQUFJLFNBQVMsTUFBTSxRQUFRLE9BQ3ZCLElBQUksS0FBSyxRQUNULE9BQU87QUFHWCxVQUFLLE1BQU0sT0FBTyxRQUFRLFFBQVM7QUFDakMsWUFBSSxVQUFVLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDbEoxQjtBQUFBO0FBT0E7QUFPQSxRQUFJLFVBQVMsc0JBQXVCO0FBQ3BDLFFBQUkscUJBQXFCO0FBQ3pCLFFBQUksY0FBYztBQUNsQixRQUFJLFlBQVksZUFBZ0I7QUFDaEMsUUFBSSxZQUFZO0FBQ2hCLFFBQUksYUFBYTtBQUNqQixRQUFJLFFBQU8sUUFBUTtBQUNuQixRQUFJLGFBQWEsaUJBQW1CO0FBQ3BDLFFBQUksYUFBYTtBQUNqQixRQUFJLE9BQU8sUUFBUTtBQUNuQixRQUFJLFdBQVc7QUFDZixRQUFJLFFBQVE7QUFDWixRQUFJLE9BQU8sMkJBQTRCO0FBQ3ZDLFFBQUksZ0JBQWdCLGlCQUFtQjtBQUN2QyxRQUFJLGlCQUFpQixpQkFBbUI7QUFDeEMsUUFBSSxhQUFhLGlCQUFtQjtBQUNwQyxRQUFJLFNBQVM7QUFDYixRQUFJLE9BQU87QUFDWCxRQUFJLFVBQVUsS0FBSztBQUNuQixRQUFJLFFBQU8sS0FBSztBQUNoQixRQUFJLFVBQVUsS0FBSztBQUNuQixRQUFJLE9BQU87QUFPWCxRQUFJLE1BQU0sT0FBTyxPQUFPLE1BQUssZUFBZTtBQU81QyxZQUFPLFVBQVU7QUFPakIsUUFBSSxnQkFBZ0I7QUFVcEIsUUFBSSxTQUFTLGdCQUFnQixNQUFNO0FBQ2pDLFVBQUssUUFBTyxTQUFTLFlBQVksS0FBSyxNQUFNLFVBQVUsU0FBUyxPQUFPLE1BQU0sT0FBTyxLQUFNO0FBQ3ZGLGtCQUFVLGdCQUFnQixLQUFLLFVBQVUsUUFBUSx1QkFBdUIsS0FBSyxNQUFNLFFBQVE7QUFBQTtBQUU3RixXQUFLLGFBQWE7QUFDbEIsYUFBTztBQUFBO0FBa0JULFFBQUksUUFBUSxTQUFTLE9BQU07QUFDekIsVUFBSSxPQUFPLEtBQUssSUFBSSxXQUFXO0FBQy9CLFVBQUk7QUFBTSxnQkFBUTtBQUNsQixhQUFPLEtBQUssSUFBSSxRQUFRLE9BQU8sT0FBTyxLQUFLLE9BQU8sSUFBSSxTQUFTLEtBQUk7QUFDakUsZUFBTyxNQUFNLE1BQU0sT0FBTyxhQUFhLE1BQU07QUFBQSxTQUM1QyxLQUFLO0FBQUE7QUFnQlYsUUFBSSxPQUFPLGVBQWMsTUFBTTtBQUM3QixVQUFJLFFBQVE7QUFDWixVQUFJO0FBQ0osVUFBSSxNQUFNLEtBQUs7QUFDZixVQUFJO0FBR0osVUFBSSxNQUFNLEtBQUs7QUFHZixVQUFJLFVBQVUsV0FBVyxHQUFHO0FBRTFCLFlBQUksT0FBTyxVQUFVLE9BQU8sWUFBWSxPQUFPLFVBQVUsT0FBTyxVQUFVO0FBQ3hFLG9CQUFVO0FBQ1YsZUFBSyxhQUFhLFVBQVU7QUFBQSxlQUN2QjtBQUNMLG9CQUFVO0FBQ1YsZUFBSyxhQUFhLFVBQVU7QUFDNUIsa0JBQVEsVUFBVTtBQUFBO0FBQUE7QUFLdEIsVUFBSSxPQUFPLFVBQVUsWUFBWSxVQUFVLFdBQVcsR0FBRztBQUV2RCxZQUFJLENBQUMsS0FBSyxJQUFJLGlCQUFpQjtBQUM3QixlQUFLLEtBQUs7QUFBQTtBQUdaLGtCQUFVO0FBQ1YsYUFBSyxhQUFhO0FBQ2xCLGdCQUFRLFNBQVMsUUFBUTtBQUFBO0FBRzNCLGNBQVEsT0FBTztBQUFBLGFBRVI7QUFDSCxjQUFJLENBQUMsS0FBSyxJQUFJLGlCQUFpQjtBQUM3QixpQkFBSyxLQUFLO0FBQUE7QUFFWjtBQUFBLGFBQ0c7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGNBQUksVUFBVSxNQUFNO0FBQ2xCLG9CQUFRO0FBQUEscUJBQ0MsUUFBTyxTQUFTLFFBQVE7QUFDakMsZ0JBQUksQ0FBQyxLQUFLLElBQUksaUJBQWlCO0FBQzdCLG1CQUFLLEtBQUs7QUFBQTtBQUFBLGlCQUVQO0FBQ0wsbUJBQU8sS0FBSyxLQUFLO0FBQUE7QUFFbkI7QUFBQTtBQUlKLFVBQUksT0FBTyxVQUFVLFVBQVU7QUFDN0IsbUJBQVc7QUFDWCxlQUFPLEtBQUssSUFBSTtBQUdoQixZQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLGVBQUssSUFBSSxnQkFBZ0IsV0FBVyxNQUFNO0FBQUE7QUFBQTtBQUs5QyxVQUFJLFNBQVMsSUFBSSxJQUFJO0FBQ3JCLFVBQUksZUFBZSxDQUFDLEtBQUssSUFBSSxXQUFXLE9BQU8sV0FBVztBQUcxRCxVQUFJO0FBQ0osVUFBSSxVQUFVLFFBQVc7QUFDdkIsWUFBSSxRQUFPLFNBQVMsUUFBUTtBQUUxQixnQkFBTSxNQUFNO0FBQUEsbUJBQ0gsQ0FBQyxnQkFBZ0IsTUFBTSxTQUFTLEtBQU07QUFFL0MsZ0JBQU0sUUFBTyxXQUFXLE9BQU87QUFBQSxlQUMxQjtBQUVMLGtCQUFRLFFBQU8sS0FBSyxPQUFPO0FBQzNCLHFCQUFXO0FBQ1gsZ0JBQU0sTUFBTTtBQUFBO0FBR2QsYUFBSyxJQUFJLGtCQUFrQjtBQUFBO0FBSTdCLFVBQUk7QUFDSixVQUFJLGdCQUFnQixRQUFRLFFBQVc7QUFDckMsWUFBSyxPQUFPLE9BQU8sT0FBTyxXQUFZO0FBQ3BDLGVBQUssSUFBSSxRQUFRO0FBQUE7QUFBQTtBQUtyQixVQUFJLElBQUk7QUFBTyxhQUFLLGFBQWE7QUFHakMsVUFBSSxBQUFRLEtBQUssZUFBYixPQUEyQixBQUFRLEtBQUssZUFBYixLQUF5QjtBQUN0RCxhQUFLLGFBQWE7QUFDbEIsYUFBSyxhQUFhO0FBQ2xCLGFBQUssYUFBYTtBQUNsQixnQkFBUTtBQUFBO0FBSVYsVUFBSSxLQUFLLGVBQWUsS0FBSztBQUMzQixhQUFLLElBQUksa0JBQWtCO0FBQzNCLGFBQUssYUFBYTtBQUNsQixnQkFBUTtBQUFBO0FBR1YsVUFBSSxJQUFJLFdBQVcsUUFBUTtBQUV6QixhQUFLO0FBQUEsYUFDQTtBQUVMLGFBQUssSUFBSSxPQUFPO0FBQUE7QUFHbEIsYUFBTztBQUFBO0FBZVQsUUFBSSxPQUFPLGNBQWMsS0FBSztBQUM1QixVQUFJLE1BQU07QUFHVixVQUFJLFVBQVUsV0FBVyxHQUFHO0FBRTFCLFlBQUksT0FBTyxVQUFVLE9BQU8sVUFBVTtBQUNwQyxvQkFBVTtBQUNWLGVBQUssYUFBYSxVQUFVO0FBQUEsZUFDdkI7QUFDTCxvQkFBVTtBQUNWLGVBQUssYUFBYSxVQUFVO0FBQzVCLGdCQUFNLFVBQVU7QUFBQTtBQUFBO0FBS3BCLFVBQUksTUFBTSxLQUFLO0FBQ2YsVUFBSSxVQUFTLElBQUksSUFBSTtBQUNyQixVQUFJLFdBQVcsSUFBSSxJQUFJO0FBQ3ZCLFVBQUksU0FBUyxJQUFJLElBQUk7QUFDckIsVUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLFFBQVE7QUFHNUMsVUFBSSxDQUFDLEtBQUssSUFBSSxpQkFBaUI7QUFDN0IsYUFBSyxJQUFJLGdCQUFnQjtBQUFBO0FBRzNCLGFBQU8sS0FBSyxLQUFLO0FBQUE7QUFlbkIsUUFBSSxRQUFRLGVBQWUsS0FBSztBQUM5QixVQUFJLE1BQU07QUFHVixVQUFJLFVBQVUsV0FBVyxHQUFHO0FBRTFCLFlBQUksT0FBTyxVQUFVLE9BQU8sVUFBVTtBQUNwQyxvQkFBVTtBQUNWLGVBQUssYUFBYSxVQUFVO0FBQUEsZUFDdkI7QUFDTCxvQkFBVTtBQUNWLGVBQUssYUFBYSxVQUFVO0FBQzVCLGdCQUFNLFVBQVU7QUFBQTtBQUFBO0FBS3BCLFVBQUksTUFBTSxLQUFLO0FBQ2YsVUFBSSxVQUFTLElBQUksSUFBSTtBQUNyQixVQUFJLFdBQVcsSUFBSSxJQUFJO0FBQ3ZCLFVBQUksU0FBUyxJQUFJLElBQUk7QUFDckIsVUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLFFBQVE7QUFDNUMsVUFBSSxXQUFXLEtBQUssSUFBSSxNQUFNLElBQUksSUFBSTtBQUd0QyxVQUFJLENBQUMsS0FBSyxJQUFJLGlCQUFpQjtBQUM3QixhQUFLLElBQUksMEJBQTBCO0FBQ25DLGFBQUssSUFBSSxnQkFBZ0I7QUFBQTtBQUkzQixVQUFJLE1BQU0sUUFBUSxXQUFXO0FBQzNCLG1CQUFXLFNBQVM7QUFBQTtBQUl0QixVQUFJLE9BQU8sYUFBYSxZQUFZLFNBQVMsV0FBVyxHQUFHO0FBQ3pELGFBQUssSUFBSSwwQkFBMEI7QUFDbkMsYUFBSyxJQUFJLGdCQUFnQjtBQUd6QixtQkFBVyxTQUFTLFFBQVEsZ0JBQWdCO0FBRTVDLFlBQUksU0FBUyxRQUFXO0FBRXRCLGlCQUFPO0FBQUEsbUJBQ0UsT0FBTyxTQUFTLFVBQVU7QUFFbkMsaUJBQU8sS0FDSixRQUFRLFdBQVcsV0FDbkIsUUFBUSxXQUFXO0FBQUE7QUFLeEIsZUFBTyxpQkFBaUIsV0FBVyx3QkFBMEIsV0FBVyxNQUFNLE9BQU87QUFBQTtBQUd2RixhQUFPLEtBQUssS0FBSztBQUFBO0FBa0JuQixRQUFJLGFBQWEsb0JBQW9CLFlBQVk7QUFDL0MsVUFBSSxPQUFPLFNBQVMsUUFBUSxlQUFlLE9BQU87QUFFbEQsV0FBSyxhQUFhO0FBQ2xCLFdBQUssS0FBSztBQUVWLGFBQU8sS0FBSyxLQUFLO0FBQUE7QUE0Q25CLFFBQUksV0FBVyxrQkFBa0IsT0FBTSxTQUFTLFVBQVU7QUFDeEQsVUFBSSxPQUFPO0FBQ1gsVUFBSSxNQUFNLEtBQUs7QUFDZixVQUFJLE9BQU07QUFDVixVQUFJLE9BQU8sSUFBSTtBQUNmLFVBQUksT0FBTyxXQUFXO0FBRXRCLFVBQUksQ0FBQyxPQUFNO0FBQ1QsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixVQUFJLE9BQU8sVUFBUyxVQUFVO0FBQzVCLGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFJdEIsVUFBSSxPQUFPLFlBQVksWUFBWTtBQUNqQyxlQUFPO0FBQ1AsZUFBTztBQUFBO0FBR1QsVUFBSSxDQUFDLEtBQUssUUFBUSxDQUFDLFdBQVcsUUFBTztBQUNuQyxjQUFNLElBQUksVUFBVTtBQUFBO0FBSXRCLFVBQUksV0FBVyxVQUFVO0FBQ3pCLFVBQUksT0FBTyxLQUFLLEtBQUssVUFBVTtBQUcvQixlQUFTLE1BQUssTUFBTSxNQUFNLFNBQVUsS0FBSztBQUN2QyxZQUFJO0FBQU0saUJBQU8sS0FBSztBQUN0QixZQUFJLE9BQU8sSUFBSSxTQUFTO0FBQVUsaUJBQU87QUFHekMsWUFBSSxPQUFPLElBQUksU0FBUyxrQkFBa0IsSUFBSSxZQUFZLFNBQVM7QUFDakUsZUFBSztBQUFBO0FBQUE7QUFBQTtBQThDWCxRQUFJLFdBQVcsU0FBVSxPQUFNLFNBQVMsVUFBVTtBQUNoRCxVQUFJLE9BQU87QUFDWCxVQUFJLE1BQU0sS0FBSztBQUNmLFVBQUksT0FBTTtBQUNWLFVBQUksT0FBTyxJQUFJO0FBQ2YsVUFBSSxPQUFPLFdBQVc7QUFHdEIsVUFBSSxPQUFPLFlBQVksWUFBWTtBQUNqQyxlQUFPO0FBQ1AsZUFBTztBQUFBO0FBSVQsVUFBSSxPQUFPLEtBQUssS0FBSyxPQUFNO0FBRzNCLGVBQVMsTUFBSyxNQUFNLE1BQU0sU0FBVSxLQUFLO0FBQ3ZDLFlBQUk7QUFBTSxpQkFBTyxLQUFLO0FBQ3RCLFlBQUksT0FBTyxJQUFJLFNBQVM7QUFBVSxpQkFBTztBQUd6QyxZQUFJLE9BQU8sSUFBSSxTQUFTLGtCQUFrQixJQUFJLFlBQVksU0FBUztBQUNqRSxlQUFLO0FBQUE7QUFBQTtBQUFBO0FBS1gsUUFBSSxXQUFXLFVBQVUsU0FBUyxJQUFJLFVBQ3BDO0FBb0JGLFFBQUksV0FBVyxrQkFBbUIsT0FBTSxVQUFVLFNBQVMsVUFBVTtBQUNuRSxVQUFJLE9BQU87QUFDWCxVQUFJLE9BQU87QUFDWCxVQUFJLE9BQU8sV0FBVztBQUd0QixVQUFJLE9BQU8sYUFBYSxZQUFZO0FBQ2xDLGVBQU87QUFDUCxlQUFPO0FBQ1AsZUFBTztBQUFBLGlCQUNFLE9BQU8sWUFBWSxZQUFZO0FBQ3hDLGVBQU87QUFDUCxlQUFPO0FBQUE7QUFJVCxVQUFJLE9BQU8sYUFBYSxZQUNyQixRQUFPLFlBQVksY0FBYyxZQUFZLFNBQVk7QUFDMUQsZUFBTztBQUNQLGVBQU87QUFBQTtBQUlULFVBQUksVUFBVTtBQUFBLFFBQ1osdUJBQXVCLG1CQUFtQixRQUFRO0FBQUE7QUFJcEQsVUFBSSxRQUFRLEtBQUssU0FBUztBQUN4QixZQUFJLE9BQU8sT0FBTyxLQUFLLEtBQUs7QUFDNUIsaUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDcEMsY0FBSSxNQUFNLEtBQUs7QUFDZixjQUFJLElBQUksa0JBQWtCLHVCQUF1QjtBQUMvQyxvQkFBUSxPQUFPLEtBQUssUUFBUTtBQUFBO0FBQUE7QUFBQTtBQU1sQyxhQUFPLE9BQU8sT0FBTztBQUNyQixXQUFLLFVBQVU7QUFHZixVQUFJLFdBQVcsQ0FBQyxLQUFLLE9BQ2pCLFFBQVEsU0FDUjtBQUdKLGFBQU8sS0FBSyxTQUFTLFVBQVUsTUFBTTtBQUFBO0FBb0J2QyxRQUFJLGNBQ0osSUFBSSxPQUFPLHFCQUFxQixNQUFNO0FBQ3BDLFVBQUksS0FBSyxLQUFLLFFBQVEsU0FBUyxLQUMzQixNQUFLLE9BQU8sUUFDWjtBQUVKLGFBQU8sS0FBSyxJQUFJLGdCQUFnQjtBQUFBO0FBNERsQyxRQUFJLFNBQVMsU0FBUyxLQUFJO0FBQ3hCLFVBQUksTUFBTSxLQUFLO0FBQ2YsVUFBSSxPQUFPLElBQUk7QUFFZixVQUFJLE9BQU8sT0FBTyxLQUFLLEtBQ3BCLE9BQU8sU0FBVSxHQUFHO0FBQUUsZUFBTyxNQUFNO0FBQUE7QUFFdEMsVUFBSSxNQUFNLEtBQUssU0FBUyxJQUNwQixJQUFJLFFBQVEsUUFDWjtBQUVKLFdBQUssS0FBSztBQUVWLFVBQUksS0FBSztBQUNQLGFBQUssSUFBSSxnQkFBZ0IsY0FBYyxLQUFLO0FBQzVDLFlBQUksS0FBSyxLQUFLLE1BQU07QUFBQSxpQkFDWCxJQUFJLFNBQVM7QUFDdEIsWUFBSSxRQUFRLEtBQUssTUFBTTtBQUFBLGFBQ2xCO0FBQ0wsYUFBSyxZQUFZLEtBQUs7QUFBQSxVQUNwQixPQUFPLGVBQWUsTUFBTSxJQUFJLFNBQVUsR0FBRztBQUFFLG1CQUFPLEVBQUU7QUFBQTtBQUFBO0FBQUE7QUFJNUQsYUFBTztBQUFBO0FBV1QsUUFBSSxhQUFhLG9CQUFvQixVQUFVO0FBQzdDLFVBQUksVUFBVTtBQUNaLGFBQUssS0FBSyxRQUFRO0FBQUE7QUFHcEIsV0FBSyxJQUFJLHVCQUF1QixtQkFBbUI7QUFFbkQsYUFBTztBQUFBO0FBa0JULFFBQUksU0FBUyxnQkFBZ0IsT0FBTyxLQUFLO0FBQ3ZDLFVBQUksT0FBTyxLQUFLLElBQUk7QUFDcEIsVUFBSSxRQUFRO0FBRVosVUFBSSxNQUFNO0FBRVIsZ0JBQVEsTUFBTSxRQUFRLFFBQVEsS0FBSyxPQUFPLE9BQ3RDLE1BQU0sUUFBUSxPQUFPLENBQUMsTUFBTSxPQUFPLE9BQ2pDLENBQUMsTUFBTTtBQUFBO0FBR2YsYUFBTyxLQUFLLElBQUksT0FBTztBQUFBO0FBcUJ6QixRQUFJLE1BQ0osSUFBSSxTQUFTLGdCQUFnQixPQUFPLEtBQUs7QUFDdkMsVUFBSSxVQUFVLFdBQVcsR0FBRztBQUMxQixZQUFJLFFBQVEsTUFBTSxRQUFRLE9BQ3RCLElBQUksSUFBSSxVQUNSLE9BQU87QUFHWCxZQUFJLE1BQU0sa0JBQWtCLGdCQUFnQjtBQUMxQyxjQUFJLE1BQU0sUUFBUSxRQUFRO0FBQ3hCLGtCQUFNLElBQUksVUFBVTtBQUFBO0FBRXRCLGNBQUksQ0FBQyxjQUFjLEtBQUssUUFBUTtBQUM5QixnQkFBSSxVQUFVLE1BQUssU0FBUyxPQUFPLE1BQU0sTUFBTSxLQUFLO0FBQ3BELGdCQUFJO0FBQVMsdUJBQVMsZUFBZSxRQUFRO0FBQUE7QUFBQTtBQUlqRCxhQUFLLFVBQVUsT0FBTztBQUFBLGFBQ2pCO0FBQ0wsaUJBQVMsT0FBTyxPQUFPO0FBQ3JCLGVBQUssSUFBSSxLQUFLLE1BQU07QUFBQTtBQUFBO0FBR3hCLGFBQU87QUFBQTtBQVdULFFBQUksTUFBTSxTQUFTLE9BQU07QUFDdkIsYUFBTyxLQUFLLFVBQVU7QUFBQTtBQVl4QixRQUFJLGNBQWMscUJBQXFCLE1BQU0sU0FBUztBQUNwRCxVQUFJLE9BQU8sTUFBTSxFQUFFLFNBQVMsSUFBSSxLQUFLLElBQUksTUFBTSxPQUFPO0FBRXRELGFBQU8sS0FBSyxPQUFPLE1BQU0sSUFBSTtBQUFBO0FBMkIvQixRQUFJLFNBQVMsU0FBVSxNQUFNLE9BQU8sU0FBUztBQUMzQyxVQUFJLE9BQU8sTUFBTSxJQUFJO0FBQ3JCLFVBQUksU0FBUyxLQUFLLElBQUk7QUFDdEIsVUFBSSxTQUFTLEtBQUs7QUFFbEIsVUFBSSxVQUFVLENBQUMsUUFBUTtBQUNyQixjQUFNLElBQUksTUFBTTtBQUFBO0FBR2xCLFVBQUksTUFBTSxPQUFPLFVBQVUsV0FDdkIsT0FBTyxLQUFLLFVBQVUsU0FDdEIsT0FBTztBQUVYLFVBQUksUUFBUTtBQUNWLGNBQU0sT0FBTyxLQUFLLEtBQUs7QUFBQTtBQUd6QixVQUFJLEtBQUssVUFBVSxNQUFNO0FBQ3ZCLFlBQUksU0FBUyxLQUFLLFNBQVM7QUFFM0IsWUFBSSxDQUFDLE1BQU0sU0FBUztBQUNsQixlQUFLLFVBQVUsSUFBSSxLQUFLLEtBQUssUUFBUTtBQUNyQyxlQUFLLFNBQVMsS0FBSyxNQUFNLFNBQVM7QUFBQTtBQUFBO0FBSXRDLFVBQUksS0FBSyxRQUFRLE1BQU07QUFDckIsYUFBSyxPQUFPO0FBQUE7QUFHZCxXQUFLLE9BQU8sY0FBYyxPQUFPLFVBQVUsTUFBTSxPQUFPLE1BQU07QUFFOUQsYUFBTztBQUFBO0FBb0JULFFBQUksV0FBVyxrQkFBa0IsS0FBSztBQUNwQyxVQUFJLE1BQU07QUFHVixVQUFJLFFBQVEsUUFBUTtBQUNsQixjQUFNLEtBQUssSUFBSSxJQUFJLGVBQWU7QUFBQTtBQUlwQyxhQUFPLEtBQUssSUFBSSxZQUFZLFVBQVU7QUFBQTtBQXFCeEMsUUFBSSxXQUFXLGtCQUFrQixLQUFLO0FBQ3BDLFVBQUksVUFBVTtBQUNkLFVBQUk7QUFDSixVQUFJLFNBQVM7QUFHYixVQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLFlBQUksT0FBTyxVQUFVLE9BQU8sVUFBVTtBQUNwQyxtQkFBUyxVQUFVO0FBQ25CLG9CQUFVLFVBQVU7QUFBQSxlQUNmO0FBQ0wsb0JBQVU7QUFDVixtQkFBUyxVQUFVO0FBQUE7QUFBQTtBQUt2QixnQkFBVSxLQUFLLFNBQVMsU0FBUyxJQUFJO0FBR3JDLFdBQUssT0FBTztBQUFBLFFBQ1YsTUFBTSxXQUFVO0FBQ2QsaUJBQU8sU0FBUyxRQUFRLFVBQVUsc0JBQXNCO0FBQUE7QUFBQSxRQUcxRCxNQUFNLFdBQVU7QUFDZCxjQUFJLElBQUksV0FBVztBQUNuQixpQkFBTyxRQUFRLFNBQVMsUUFBUSxVQUFVLCtCQUErQixJQUFJLE9BQU8sSUFBSTtBQUFBO0FBQUEsUUFHMUYsU0FBUyxXQUFVO0FBQ2pCLGlCQUFPO0FBQUE7QUFBQTtBQUtYLFdBQUssYUFBYTtBQUNsQixXQUFLLElBQUksa0JBQWtCLFFBQU8sV0FBVztBQUU3QyxVQUFJLEtBQUssSUFBSSxXQUFXLFFBQVE7QUFDOUIsYUFBSztBQUFBLGFBQ0E7QUFDTCxhQUFLLElBQUk7QUFBQTtBQUFBO0FBYWIsUUFBSSxPQUFPLFNBQVMsT0FBTTtBQUV4QixVQUFJLENBQUMsU0FBVSxNQUFNLFFBQVEsVUFBVSxDQUFDLE1BQU0sUUFBUztBQUNyRCxrQkFBVTtBQUNWLGVBQU87QUFBQTtBQUdULFdBQUssTUFBTTtBQUVYLGFBQU87QUFBQTtBQWdCVCxRQUFJLFNBQVMsZ0JBQWdCLE1BQU0sU0FBUyxVQUFVO0FBQ3BELFVBQUksTUFBTSxLQUFLLElBQUk7QUFDbkIsVUFBSSxPQUFPO0FBQ1gsVUFBSSxPQUFPLFdBQVc7QUFDdEIsVUFBSSxNQUFNLEtBQUs7QUFDZixVQUFJLE9BQU87QUFHWCxVQUFJLE9BQU8sWUFBWSxZQUFZO0FBQ2pDLGVBQU87QUFDUCxlQUFPO0FBQUE7QUFJVCxXQUFLLFVBQVUsS0FBSztBQUdwQixhQUFPLFFBQVEsU0FBVSxLQUFLLEtBQUs7QUFDakMsWUFBSTtBQUFLLGlCQUFPLElBQUksS0FBSztBQUN6QixhQUFLLEtBQUs7QUFBQTtBQUlaLFVBQUksT0FBTyxNQUFNLE1BQU07QUFBQTtBQUl6QixzQkFBa0IsTUFBSyxNQUFNLFNBQVMsVUFBVTtBQUM5QyxVQUFJLE9BQU87QUFDWCxVQUFJO0FBR0osMkJBQXFCO0FBQ25CLFlBQUk7QUFBTTtBQUNWLGVBQU87QUFFUCxZQUFJLE1BQU0sSUFBSSxNQUFNO0FBQ3BCLFlBQUksT0FBTztBQUNYLGlCQUFTO0FBQUE7QUFJWCw2QkFBdUI7QUFDckIsWUFBSTtBQUFNO0FBQ1YsZUFBTztBQUVQLFlBQUksTUFBTSxJQUFJLE1BQU07QUFDcEIsWUFBSSxPQUFPO0FBQ1gsaUJBQVM7QUFBQTtBQUlYLHVCQUFpQixLQUFLO0FBQ3BCLFlBQUk7QUFBTTtBQUNWLGVBQU87QUFDUCxpQkFBUztBQUFBO0FBSVgsdUJBQWlCO0FBQ2YsWUFBSTtBQUFNO0FBQ1YsZUFBTztBQUNQO0FBQUE7QUFJRix3QkFBa0I7QUFDaEIsb0JBQVk7QUFBQTtBQUlkLHdCQUFrQixLQUFLO0FBQ3JCLFlBQUksT0FBTyxJQUFJLFNBQVM7QUFBYyxpQkFBTztBQUM3QyxZQUFJO0FBQUssaUJBQU8sUUFBUTtBQUN4QixZQUFJO0FBQU07QUFFVixxQkFBYSxXQUFZO0FBQ3ZCLGNBQUksY0FBYyxTQUFTLENBQUMsTUFBTTtBQUNoQztBQUNBO0FBQUE7QUFHRixjQUFJO0FBQU07QUFDVixpQkFBTztBQUNQO0FBQUE7QUFBQTtBQUtKLDBCQUFvQjtBQUNsQixvQkFBWTtBQUFBO0FBR2QsV0FBSyxHQUFHLGFBQWE7QUFDckIsV0FBSyxHQUFHLE9BQU87QUFDZixXQUFLLEdBQUcsU0FBUztBQUNqQixXQUFLLEdBQUcsUUFBUTtBQUNoQixXQUFLLEdBQUcsVUFBVTtBQUNsQixpQkFBVyxNQUFLO0FBRWhCLFVBQUksUUFBUSxTQUFTO0FBRW5CLGFBQUssR0FBRyxXQUFXLGlCQUFpQixNQUFLO0FBQ3ZDLGNBQUksTUFBTSxRQUFRO0FBQ2xCLGNBQUksT0FBTyxPQUFPLEtBQUs7QUFFdkIsbUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDcEMsZ0JBQUksSUFBSSxLQUFLO0FBQ2IsaUJBQUksVUFBVSxHQUFHLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFNM0IsV0FBSyxLQUFLO0FBQUE7QUFlWix1QkFBb0IsT0FBTyxVQUFVLFFBQVEsU0FBUTtBQUduRCxVQUFJLE9BQU8sWUFBWSxTQUNuQixLQUFLLFVBQVUsT0FBTyxVQUFVLFVBQ2hDLEtBQUssVUFBVTtBQUVuQixVQUFJLFdBQVUsT0FBTyxTQUFTLFVBQVU7QUFDdEMsZUFBTyxLQUFLLFFBQVEsVUFBVSxTQUFVLEdBQUc7QUFDekMsa0JBQVEsRUFBRSxXQUFXO0FBQUEsaUJBQ2Q7QUFDSCxxQkFBTztBQUFBLGlCQUNKO0FBQ0gscUJBQU87QUFBQSxpQkFDSjtBQUNILHFCQUFPO0FBQUE7QUFHUCxxQkFBTztBQUFBO0FBQUE7QUFBQTtBQUtmLGFBQU87QUFBQTtBQUFBO0FBQUE7OztBQy9vQ1Q7QUFBQTtBQVFBO0FBT0EsUUFBSSxZQUFZO0FBQ2hCLFFBQUksYUFBYTtBQUNqQixRQUFJLFdBQVc7QUFDZixRQUFJLFVBQVUsUUFBUSxRQUFRO0FBQzlCLFFBQUksT0FBTztBQUNYLFFBQUksTUFBTSxRQUFRO0FBT2xCLFlBQU8sVUFBVTtBQUNqQixZQUFPLFFBQVEsT0FBTyxLQUFLO0FBUzNCLHlCQUFzQixNQUFNLFNBQVM7QUFDbkMsVUFBSSxDQUFDLE1BQU07QUFDVCxjQUFNLElBQUksVUFBVTtBQUFBO0FBR3RCLFVBQUksT0FBTyxTQUFTLFVBQVU7QUFDNUIsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUl0QixVQUFJLE9BQU8sT0FBTyxPQUFPLFdBQVc7QUFHcEMsVUFBSSxjQUFjLEtBQUssZ0JBQWdCO0FBR3ZDLFVBQUksV0FBVyxLQUFLLGFBQWE7QUFHakMsVUFBSSxhQUFhLEtBQUs7QUFFdEIsVUFBSSxjQUFjLE9BQU8sZUFBZSxZQUFZO0FBQ2xELGNBQU0sSUFBSSxVQUFVO0FBQUE7QUFJdEIsV0FBSyxTQUFTLEtBQUssVUFBVSxLQUFLLFVBQVU7QUFDNUMsV0FBSyxPQUFPLFFBQVE7QUFHcEIsVUFBSSxjQUFjLFdBQ2Qsb0NBQ0E7QUFFSixhQUFPLHNCQUFzQixLQUFLLEtBQUssTUFBTTtBQUMzQyxZQUFJLElBQUksV0FBVyxTQUFTLElBQUksV0FBVyxRQUFRO0FBQ2pELGNBQUksYUFBYTtBQUNmLG1CQUFPO0FBQUE7QUFJVCxjQUFJLGFBQWE7QUFDakIsY0FBSSxVQUFVLFNBQVM7QUFDdkIsY0FBSSxVQUFVLGtCQUFrQjtBQUNoQyxjQUFJO0FBQ0o7QUFBQTtBQUdGLFlBQUksZUFBZSxDQUFDO0FBQ3BCLFlBQUksY0FBYyxTQUFTLFNBQVM7QUFDcEMsWUFBSSxPQUFPLFNBQVMsS0FBSztBQUd6QixZQUFJLFNBQVMsT0FBTyxZQUFZLFNBQVMsT0FBTyxRQUFRLEtBQUs7QUFDM0QsaUJBQU87QUFBQTtBQUlULFlBQUksU0FBUyxLQUFLLEtBQUssTUFBTTtBQUc3QixlQUFPLEdBQUcsYUFBYTtBQUd2QixZQUFJLFlBQVk7QUFDZCxpQkFBTyxHQUFHLFdBQVc7QUFBQTtBQUl2QixZQUFJLGFBQWE7QUFDZixpQkFBTyxHQUFHLFFBQVEsa0JBQW1CO0FBRW5DLDJCQUFlO0FBQUE7QUFBQTtBQUtuQixlQUFPLEdBQUcsU0FBUyxlQUFnQixLQUFLO0FBQ3RDLGNBQUksZ0JBQWdCLENBQUUsS0FBSSxhQUFhLE1BQU07QUFDM0MsaUJBQUs7QUFDTDtBQUFBO0FBR0Y7QUFBQTtBQUlGLGVBQU8sS0FBSztBQUFBO0FBQUE7QUFRaEIsb0NBQWlDLEtBQUs7QUFDcEMsZUFBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNuQyxZQUFJLElBQUksV0FBVyxPQUFPLElBQWM7QUFDdEM7QUFBQTtBQUFBO0FBSUosYUFBTyxJQUFJLElBQ1AsTUFBTSxJQUFJLE9BQU8sS0FDakI7QUFBQTtBQVdOLGdDQUE2QixPQUFPLE1BQU07QUFDeEMsYUFBTywrRUFJTyxRQUFRLHFDQUdWLE9BQU87QUFBQTtBQVVyQiwrQ0FBNEM7QUFDMUMsYUFBTyxvQkFBcUI7QUFDMUIsYUFBSyxNQUFNO0FBQUE7QUFBQTtBQVNmLCtDQUE0QztBQUMxQyxhQUFPLGtCQUFtQixLQUFLO0FBQzdCLFlBQUksS0FBSyxvQkFBb0I7QUFDM0IsZUFBSyxNQUFNO0FBQ1g7QUFBQTtBQUlGLFlBQUksY0FBYyxTQUFTLFNBQVMsS0FBSztBQUd6QyxvQkFBWSxPQUFPO0FBQ25CLG9CQUFZLFdBQVcsdUJBQXVCLFlBQVksV0FBVztBQUdyRSxZQUFJLE1BQU0sVUFBVSxJQUFJLE9BQU87QUFDL0IsWUFBSSxNQUFNLG1CQUFtQixlQUFlLDZCQUE2QixXQUFXLE9BQU8sT0FDekYsV0FBVyxPQUFPO0FBR3BCLFlBQUksYUFBYTtBQUNqQixZQUFJLFVBQVUsZ0JBQWdCO0FBQzlCLFlBQUksVUFBVSxrQkFBa0IsT0FBTyxXQUFXO0FBQ2xELFlBQUksVUFBVSwyQkFBMkI7QUFDekMsWUFBSSxVQUFVLDBCQUEwQjtBQUN4QyxZQUFJLFVBQVUsWUFBWTtBQUMxQixZQUFJLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDL01aO0FBQUE7QUFRQTtBQU1BLFFBQUksYUFBYTtBQUNqQixRQUFJLGVBQWUsUUFBUSxVQUFVO0FBQ3JDLFFBQUksUUFBUTtBQUNaLFFBQUksUUFBUTtBQUNaLFFBQUksUUFBUTtBQUNaLFFBQUksU0FBUztBQUNiLFFBQUksTUFBTTtBQUNWLFFBQUksTUFBTTtBQU1WLGNBQVUsUUFBTyxVQUFVO0FBUzNCLGlDQUE2QjtBQUMzQixVQUFJLE1BQU0sU0FBUyxNQUFLLE1BQUssTUFBTTtBQUNqQyxZQUFJLE9BQU8sTUFBSyxNQUFLO0FBQUE7QUFHdkIsWUFBTSxLQUFLLGFBQWEsV0FBVztBQUNuQyxZQUFNLEtBQUssT0FBTztBQUdsQixVQUFJLFVBQVUsT0FBTyxPQUFPLEtBQUs7QUFBQSxRQUMvQixLQUFLLEVBQUUsY0FBYyxNQUFNLFlBQVksTUFBTSxVQUFVLE1BQU0sT0FBTztBQUFBO0FBSXRFLFVBQUksV0FBVyxPQUFPLE9BQU8sS0FBSztBQUFBLFFBQ2hDLEtBQUssRUFBRSxjQUFjLE1BQU0sWUFBWSxNQUFNLFVBQVUsTUFBTSxPQUFPO0FBQUE7QUFHdEUsVUFBSTtBQUNKLGFBQU87QUFBQTtBQU9ULFlBQVEsY0FBYztBQUN0QixZQUFRLFVBQVU7QUFDbEIsWUFBUSxXQUFXO0FBTW5CLFlBQVEsUUFBUTtBQUNoQixZQUFRLFNBQVM7QUFNakIsWUFBUSxPQUFPLFdBQVc7QUFDMUIsWUFBUSxRQUFRO0FBQ2hCLFlBQVEsTUFBTSxXQUFXO0FBQ3pCLFlBQVEsU0FBUztBQUNqQixZQUFRLE9BQU8sV0FBVztBQUMxQixZQUFRLGFBQWEsV0FBVztBQU1oQyxRQUFJLHFCQUFxQjtBQUFBLE1BQ3ZCO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBO0FBR0YsdUJBQW1CLFFBQVEsU0FBVSxNQUFNO0FBQ3pDLGFBQU8sZUFBZSxTQUFTLE1BQU07QUFBQSxRQUNuQyxLQUFLLFdBQVk7QUFDZixnQkFBTSxJQUFJLE1BQU0sMkJBQTJCLE9BQU87QUFBQTtBQUFBLFFBRXBELGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDakhsQjtBQUFBO0FBUUE7QUFFQSxZQUFPLFVBQVU7QUFBQTtBQUFBOzs7QUNWakI7QUFBQTtBQUFDLFlBQU8sVUFBVSxDQUFDLFlBQVk7QUFDM0IsZUFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFFBQVEsS0FBSztBQUVyQyxZQUFJLFFBQVEsT0FBTyxVQUFLO0FBQ3BCLGlCQUFPO0FBQUE7QUFBQTtBQUdmLGFBQU87QUFBQTtBQUFBO0FBQUE7OztBQ1BYO0FBQUE7QUFBQyxRQUFNLE9BQU87QUFFZCxRQUFNLGNBQWM7QUFBQSxNQUNoQixPQUFPLElBQUksT0FBTyxZQUFZO0FBQUEsTUFDOUIsV0FBVyxJQUFJLE9BQU8sV0FBVztBQUFBLE1BQ2pDLFFBQVEsSUFBSSxPQUFPLDJCQUEyQjtBQUFBLE1BQzlDLFdBQVcsSUFBSSxPQUFPLHNCQUFzQjtBQUFBLE1BQzVDLFVBQVUsSUFBSSxPQUFPLE9BQU87QUFBQSxNQUM1QixTQUFTLElBQUksT0FBTyxTQUFTO0FBQUEsTUFDN0IsUUFBUSxJQUFJLE9BQU8sU0FBUztBQUFBLE1BQzVCLFlBQVksSUFBSSxPQUFPLFNBQVM7QUFBQSxNQUNoQyxTQUFTLElBQUksT0FBTyxnQ0FBZ0M7QUFBQSxNQUNwRCxRQUFRLElBQUksT0FBTyxXQUFXO0FBQUEsTUFDOUIsU0FBUyxJQUFJLE9BQU8sV0FBVztBQUFBLE1BQy9CLFFBQVEsSUFBSSxPQUFPLGNBQWM7QUFBQSxNQUNqQyxXQUFXLElBQUksT0FBTyxPQUFPO0FBQUEsTUFDN0IsU0FBUyxJQUFJLE9BQU8sU0FBUztBQUFBLE1BQzdCLE9BQU8sSUFBSSxPQUFPLFNBQVM7QUFBQSxNQUMzQixTQUFTLElBQUksT0FBTyxPQUFPO0FBQUEsTUFDM0Isa0JBQWtCLElBQUksT0FBTyxnQkFBZ0I7QUFBQSxNQUM3QyxVQUFVLElBQUksT0FBTyw0QkFBNEI7QUFBQSxNQUNqRCxXQUFXLElBQUksT0FBTyxPQUFPO0FBQUEsTUFDN0Isb0JBQW9CLElBQUksT0FBTyxTQUFTO0FBQUEsTUFDeEMsU0FBUyxJQUFJLE9BQU8sU0FBUztBQUFBLE1BQzdCLFlBQVksSUFBSSxPQUFPLGdCQUFnQjtBQUFBLE1BQ3ZDLFNBQVMsSUFBSSxPQUFPLE9BQU87QUFBQSxNQUMzQixPQUFPLElBQUksT0FBTyxPQUFPO0FBQUEsTUFDekIsTUFBTSxJQUFJLE9BQU8sT0FBTztBQUFBLE1BQ3hCLFlBQVksSUFBSSxPQUFPLFdBQVc7QUFBQTtBQUd0QyxRQUFNLGtCQUFrQjtBQUFBLE1BQ3BCLFFBQVEsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQy9CLE9BQU8sRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQzlCLFdBQVcsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ2xDLFVBQVUsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ2pDLFFBQVEsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQy9CLFdBQVcsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ2xDLFVBQVUsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ2pDLFdBQVcsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ2xDLFNBQVMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ2hDLFFBQVEsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQy9CLFlBQVksRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ25DLFNBQVMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ2hDLFFBQVEsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQy9CLFNBQVMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ2hDLFFBQVEsRUFBRSxLQUFLLFFBQVUsTUFBTTtBQUFBLE1BQy9CLFdBQVcsRUFBRSxLQUFLLFFBQVUsTUFBTTtBQUFBLE1BQ2xDLFNBQVMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ2hDLE9BQU8sRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQzlCLFNBQVMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLE1BQ2hDLGtCQUFrQixFQUFFLEtBQUssU0FBVSxNQUFNO0FBQUEsTUFDekMsVUFBVSxFQUFFLEtBQUssU0FBVSxNQUFNO0FBQUEsTUFDakMsV0FBVyxFQUFFLEtBQUssU0FBVSxNQUFNO0FBQUEsTUFDbEMsb0JBQW9CLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQSxNQUMzQyxPQUFPLEVBQUUsS0FBSyxRQUFVLE1BQU07QUFBQSxNQUM5QixTQUFTLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQSxNQUNoQyxRQUFRLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQSxNQUMvQixZQUFZLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQSxNQUNuQyxTQUFTLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQSxNQUNoQyxPQUFPLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQSxNQUM5QixNQUFNLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQSxNQUM3QixZQUFZLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQTtBQUd2QyxZQUFPLFVBQVU7QUFBQSxNQUNiO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLElBQUksT0FBTyxPQUFPO0FBQUEsUUFDNUIsVUFBVSxJQUFJLE9BQU8sT0FBTztBQUFBLFFBQzVCLFVBQVU7QUFBQSxRQUNWLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLE1BRWxDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVO0FBQUEsUUFDVixjQUFjLGdCQUFnQjtBQUFBLFFBQzlCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxNQUVsQztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsSUFBSSxPQUFPLGFBQWE7QUFBQSxRQUNsQyxVQUFVLElBQUksT0FBTyxhQUFhO0FBQUEsUUFDbEMsVUFBVTtBQUFBLFFBQ1YsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVU7QUFBQSxRQUNWLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLE1BRWxDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVO0FBQUEsUUFDVixjQUFjLGdCQUFnQjtBQUFBLFFBQzlCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxNQUVsQztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsSUFBSSxPQUFPLE9BQU87QUFBQSxRQUM1QixVQUFVLElBQUksT0FBTyxPQUFPO0FBQUEsUUFDNUIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxFQUFFLEtBQUssU0FBVSxNQUFNO0FBQUEsUUFDckMsY0FBYyxFQUFFLEtBQUssU0FBVSxNQUFNO0FBQUE7QUFBQSxNQUV6QztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxJQUFJLE9BQU8sV0FBVztBQUFBLFFBQ2hDLFVBQVUsSUFBSSxPQUFPLFdBQVc7QUFBQSxRQUNoQyxVQUFVO0FBQUEsUUFDVixjQUFjLGdCQUFnQjtBQUFBLFFBQzlCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxNQUVsQztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxJQUFJLE9BQU8sY0FBYztBQUFBLFFBQ25DLFVBQVUsSUFBSSxPQUFPLG9CQUFvQjtBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUNWLGNBQWMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLFFBQ3JDLGNBQWMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBO0FBQUEsTUFFekM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVU7QUFBQSxRQUNWLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLE1BRWxDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVO0FBQUEsUUFDVixjQUFjLGdCQUFnQjtBQUFBLFFBQzlCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxNQUVsQztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVU7QUFBQSxRQUNWLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLE1BRWxDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVO0FBQUEsUUFDVixjQUFjLGdCQUFnQjtBQUFBLFFBQzlCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxNQUVsQztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVU7QUFBQSxRQUNWLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLE1BRWxDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVO0FBQUEsUUFDVixjQUFjLGdCQUFnQjtBQUFBLFFBQzlCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxNQUVsQztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVU7QUFBQSxRQUNWLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLE1BRWxDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVO0FBQUEsUUFDVixjQUFjLGdCQUFnQjtBQUFBLFFBQzlCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxNQUVsQztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVU7QUFBQSxRQUNWLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLE1BRWxDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVO0FBQUEsUUFDVixjQUFjLGdCQUFnQjtBQUFBLFFBQzlCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxNQUVsQztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsSUFBSSxPQUFPLFNBQVM7QUFBQSxRQUM5QixVQUFVLElBQUksT0FBTyxTQUFTO0FBQUEsUUFDOUIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVU7QUFBQSxRQUNWLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLE1BRWxDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLElBQUksT0FBTyxPQUFPO0FBQUEsUUFDNUIsVUFBVSxJQUFJLE9BQU8sT0FBTztBQUFBLFFBQzVCLFVBQVU7QUFBQSxRQUNWLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLE1BRWxDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLElBQUksT0FBTyxPQUFPO0FBQUEsUUFDNUIsVUFBVSxJQUFJLE9BQU8sT0FBTztBQUFBLFFBQzVCLFVBQVU7QUFBQSxRQUNWLGNBQWMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLFFBQ3JDLGNBQWMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBO0FBQUEsTUFFekM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsSUFBSSxPQUFPLE9BQU87QUFBQSxRQUM1QixVQUFVLElBQUksT0FBTyxPQUFPO0FBQUEsUUFDNUIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxFQUFFLEtBQUssU0FBVSxNQUFNO0FBQUEsUUFDckMsY0FBYyxFQUFFLEtBQUssUUFBVSxNQUFNO0FBQUE7QUFBQSxNQUV6QztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVTtBQUFBLFFBQ1YsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsSUFBSSxPQUFPLEtBQUs7QUFBQSxRQUMxQixVQUFVLElBQUksT0FBTyxZQUFZO0FBQUEsUUFDakMsVUFBVTtBQUFBLFFBQ1YsY0FBYyxFQUFFLEtBQUssU0FBVSxNQUFNO0FBQUEsUUFDckMsY0FBYyxFQUFFLEtBQUssU0FBVSxNQUFNO0FBQUE7QUFBQSxNQUV6QztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxJQUFJLE9BQU8sS0FBSztBQUFBLFFBQzFCLFVBQVUsSUFBSSxPQUFPLE1BQU07QUFBQSxRQUMzQixVQUFVO0FBQUEsUUFDVixjQUFjLEVBQUUsS0FBSyxVQUFVLE1BQU07QUFBQSxRQUNyQyxjQUFjLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQTtBQUFBLE1BRXpDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLElBQUksT0FBTyxLQUFLO0FBQUEsUUFDMUIsVUFBVSxJQUFJLE9BQU8sV0FBVztBQUFBLFFBQ2hDLFVBQVU7QUFBQSxRQUNWLGNBQWMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBLFFBQ3JDLGNBQWMsRUFBRSxLQUFLLFNBQVUsTUFBTTtBQUFBO0FBQUEsTUFFekM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsSUFBSSxPQUFPLEtBQUs7QUFBQSxRQUMxQixVQUFVLElBQUksT0FBTyxnQkFBZ0I7QUFBQSxRQUNyQyxVQUFVO0FBQUEsUUFDVixjQUFjLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQSxRQUNyQyxjQUFjLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQTtBQUFBLE1BRXpDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLElBQUksT0FBTyxvQkFBb0I7QUFBQSxRQUN6QyxVQUFVLElBQUksT0FBTyxxQkFBcUI7QUFBQSxRQUMxQyxVQUFVO0FBQUEsUUFDVixjQUFjLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQSxRQUNyQyxjQUFjLEVBQUUsS0FBSyxTQUFVLE1BQU07QUFBQTtBQUFBLE1BSXpDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVLFlBQVk7QUFBQSxRQUN0QixjQUFjLGdCQUFnQjtBQUFBLFFBQzlCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxNQUVsQztBQUFBLFFBQ0ksTUFBTTtBQUFBLFFBQ04sT0FBTztBQUFBLFFBQ1AsVUFBVSxZQUFZO0FBQUEsUUFDdEIsVUFBVSxZQUFZO0FBQUEsUUFDdEIsY0FBYyxnQkFBZ0I7QUFBQSxRQUM5QixjQUFjLGdCQUFnQjtBQUFBO0FBQUEsTUFFbEM7QUFBQSxRQUNJLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLFVBQVUsWUFBWTtBQUFBLFFBQ3RCLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLE1BRWxDO0FBQUEsUUFDSSxNQUFNO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxVQUFVLFlBQVk7QUFBQSxRQUN0QixVQUFVLFlBQVk7QUFBQSxRQUN0QixjQUFjLGdCQUFnQjtBQUFBLFFBQzlCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ3RhdEM7QUFBQTtBQUFBLFFBQU0sY0FBYztBQUVwQixZQUFPLFVBQVUsQ0FBQyxNQUFNLGFBQWE7QUFDbkMsWUFBTSxpQkFBaUI7QUFHdkIsa0JBQVksUUFBUSxDQUFDLFFBQVE7QUFDM0IsY0FBTSxpQkFBaUI7QUFDdkIsZUFBTyxLQUFLLEtBQUssUUFBUSxDQUFDLFFBQVE7QUFDaEMsY0FBSSxRQUFRLFNBQVM7QUFDbkIsMkJBQWUsT0FBTyxJQUFJO0FBQUEsaUJBQ3JCO0FBQ0wsMkJBQWUsUUFBUTtBQUFBO0FBQUE7QUFHM0IsdUJBQWUsS0FBSztBQUFBO0FBR3RCLFlBQU0sUUFBUSxXQUFXLGFBQWE7QUFHdEMscUJBQWUsUUFBUSxDQUFDLFNBQVM7QUFDL0IsWUFBSSxLQUFLLFFBQVE7QUFDZixnQkFBTSxVQUFVLEtBQUssUUFBUSxNQUFNLEtBQUs7QUFFeEMsY0FBSTtBQUFTLGlCQUFLLFFBQVEsUUFBUTtBQUFBO0FBQUE7QUFJdEMsYUFBTztBQUFBO0FBQUE7QUFBQTs7O0FDN0JUO0FBQUE7QUFBQSxZQUFPLFVBQVUsQ0FBQyxNQUFNLGFBQWE7QUFDbkMsWUFBTSxZQUFZLElBQUksT0FDcEIsNERBQ0E7QUFFRixZQUFNLGtCQUFrQixLQUFLLFFBQVEsUUFBUSxXQUFXLElBQUk7QUFDNUQsWUFBTSxVQUFVLEtBQUs7QUFDckIsWUFBTSxNQUFNLEtBQUs7QUFFakIsWUFBTSxpQkFBaUIsUUFBUSxPQUFPLENBQUMsS0FBSyxRQUFRO0FBQ2xELFlBQUksSUFBSSxTQUFTLFNBQVM7QUFBVSxpQkFBTztBQUMzQyxZQUFJLElBQUksU0FBUyxTQUFTO0FBQVUsaUJBQU87QUFFM0MsZUFBTyxJQUFJLFNBQVMsSUFBSSxRQUFRLE1BQU07QUFBQTtBQUd4QyxZQUFNLGdCQUNKLFFBQVEsS0FBSyxRQUFTLGdCQUFlLFFBQVEsUUFBUSxLQUFLO0FBQzVELFlBQU0scUJBQXFCLFFBQVEsS0FBSyxRQUFRO0FBRWhELFVBQUksYUFBYTtBQUNqQixVQUFJLGFBQWE7QUFDakIsWUFBTSxhQUFhO0FBRW5CLFVBQUksU0FBUyxhQUFhLFdBQVcsU0FBUyxhQUFhLFlBQVk7QUFDckUscUJBQWEsUUFBUSxLQUFLLGVBQ3RCLFFBQVEsS0FBSyxhQUFhLE1BQU0sYUFDaEM7QUFDSixxQkFBYSxRQUFRLEtBQUssZUFDckIsU0FBUSxLQUFLLGFBQWEsTUFBTSxRQUFRLEtBQUssYUFBYSxRQUFRLElBQ25FO0FBQUEsYUFDQztBQUNMLHFCQUFhLFFBQVEsS0FBSyxlQUN0QixRQUFRLEtBQUssYUFBYSxNQUFNLGFBQ2hDO0FBQ0oscUJBQWEsUUFBUSxLQUFLLGVBQ3JCLFNBQVEsS0FBSyxhQUFhLE1BQU0sUUFBUSxLQUFLLGFBQWEsUUFBUSxJQUNuRTtBQUFBO0FBR04sVUFBSTtBQUVKLFVBQUksQ0FBQyxjQUFjLENBQUMsWUFBWTtBQUM5QiwwQkFBa0I7QUFBQSxpQkFDVCxzQkFBc0IsWUFBWTtBQUMzQywwQkFBa0I7QUFBQSxpQkFDVCxxQkFBcUIsWUFBWTtBQUMxQyxjQUFNLFFBQVEsYUFBYTtBQUMzQixjQUFNLFVBQVUscUJBQXFCO0FBQ3JDLGNBQU0sNEJBQTRCLFVBQVU7QUFDNUMsY0FBTSxrQkFBbUIsS0FBSSxpQkFBaUI7QUFDOUMsMEJBQWtCLE9BQVEsaUJBQWdCLGlCQUFpQixRQUFRO0FBQUEsYUFDOUQ7QUFDTCwwQkFBa0IsT0FDZixpQkFBaUIsc0JBQXFCLGFBQWEsUUFBUTtBQUFBO0FBSWhFLGFBQU87QUFBQTtBQUFBO0FBQUE7OztBQzFEVDtBQUFBO0FBQUEsWUFBTyxVQUFVO0FBQUEsTUFDZjtBQUFBLFFBQ0UsVUFBVTtBQUFBLFFBQ1YsT0FBTyxJQUFJLE9BQU87QUFBQTtBQUFBLE1BRXBCO0FBQUEsUUFDRSxVQUFVO0FBQUEsUUFDVixPQUFPLElBQUksT0FBTztBQUFBO0FBQUEsTUFFcEI7QUFBQSxRQUNFLFVBQVU7QUFBQSxRQUNWLE9BQU8sSUFBSSxPQUFPO0FBQUE7QUFBQSxNQUVwQjtBQUFBLFFBQ0UsVUFBVTtBQUFBLFFBQ1YsT0FBTyxJQUFJLE9BQU87QUFBQTtBQUFBLE1BRXBCO0FBQUEsUUFDRSxVQUFVO0FBQUEsUUFDVixPQUFPLElBQUksT0FBTztBQUFBO0FBQUEsTUFFcEI7QUFBQSxRQUNFLFVBQVU7QUFBQSxRQUNWLE9BQU8sSUFBSSxPQUFPO0FBQUE7QUFBQSxNQUVwQjtBQUFBLFFBQ0UsVUFBVTtBQUFBLFFBQ1YsT0FBTyxJQUFJLE9BQU87QUFBQTtBQUFBLE1BRXBCO0FBQUEsUUFDRSxVQUFVO0FBQUEsUUFDVixPQUFPLElBQUksT0FBTztBQUFBO0FBQUEsTUFFcEI7QUFBQSxRQUNFLFVBQVU7QUFBQSxRQUNWLE9BQU8sSUFBSSxPQUFPO0FBQUE7QUFBQSxNQUVwQjtBQUFBLFFBQ0UsVUFBVTtBQUFBLFFBQ1YsT0FBTyxJQUFJLE9BQU87QUFBQTtBQUFBLE1BRXBCO0FBQUEsUUFDRSxVQUFVO0FBQUEsUUFDVixPQUFPLElBQUksT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUMzQ3RCO0FBQUE7QUFBQSxRQUFNLGtCQUFrQjtBQUN4QixRQUFNLDJCQUEyQjtBQUNqQyxRQUFNLHNCQUFzQjtBQUU1QixZQUFPLFVBQVUsQ0FBQyxNQUFNLGFBQWE7QUFDbkMsV0FBSyxjQUFjLGdCQUFnQixNQUFNLFNBQVM7QUFFbEQsZUFBUyxXQUFXLEtBQUssWUFBWSxPQUFPLENBQUMsS0FBSyxRQUNoRCxJQUFJLFFBQVEsSUFBSSxRQUFRLE1BQU0sS0FDOUI7QUFHRixXQUFLLE1BQU0sS0FBSyxZQUFZLFVBQzFCLENBQUMsU0FBUyxLQUFLLFNBQVMsU0FBUztBQUluQyxVQUFJLENBQUMsU0FBUyxVQUFVO0FBQ3RCLGlCQUFTLFdBQVcsS0FBSyxZQUFZLEtBQUssS0FBSztBQUFBO0FBR2pELFlBQU0sZUFBZSx5QkFBeUIsTUFBTTtBQUVwRCxVQUFJLFNBQVMsV0FBVyxVQUFVO0FBQ2hDLGlCQUFTLFdBQVcsV0FBVztBQUFBLGFBQzFCO0FBQ0wsaUJBQVMsV0FBVyxXQUFXO0FBQy9CLGlCQUFTLFdBQVcsV0FBVztBQUFBO0FBSWpDLFVBQUksQ0FBQyxLQUFLLFlBQVksS0FBSyxLQUFLLE9BQU87QUFDckMsaUJBQVMsV0FBVztBQUNwQixpQkFBUyxXQUFXLFdBQVc7QUFFL0IsWUFBSSxDQUFDLG9CQUFvQixLQUFLLFNBQU8sSUFBSSxhQUFhLFNBQVMsV0FBVztBQUN4RSxtQkFBUyxXQUFXO0FBQ3BCLG1CQUFTLFdBQVcsV0FBVztBQUFBO0FBQUE7QUFJbkMsYUFBTztBQUFBO0FBQUE7QUFBQTs7O0FDekNUO0FBQUE7QUFBQSxRQUFNLGlCQUFpQjtBQUV2QixZQUFPLFVBQVUsQ0FBQyxlQUFlO0FBQy9CLGlCQUFXLFdBQVcsZ0JBQWdCO0FBQ3BDLFlBQUksUUFBUSxNQUFNLEtBQUs7QUFBYSxpQkFBTyxRQUFRO0FBQUE7QUFHckQsYUFBTztBQUFBO0FBQUE7QUFBQTs7O0FDUFQ7QUFBQTtBQUFBLFFBQU0sTUFBSyxRQUFRO0FBQ25CLFFBQU0sV0FBVztBQUNqQixRQUFNLGlCQUFpQjtBQUN2QixRQUFNLHFCQUFxQjtBQUUzQixZQUFPLFVBQVUsQ0FBQyxhQUFhO0FBQzdCLGFBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3RDLFlBQUksVUFBVTtBQUNkLGNBQU0sV0FBVztBQUFBLFVBQ2YsVUFBVTtBQUFBLFVBQ1YsVUFBVTtBQUFBLFVBQ1YsWUFBWTtBQUFBLFlBQ1YsVUFBVTtBQUFBLFlBQ1YsVUFBVTtBQUFBO0FBQUE7QUFHZCxjQUFNLE9BQU87QUFHYixjQUFNLGFBQWEsSUFBRyxpQkFBaUIsVUFBVSxFQUFFLE9BQU8sR0FBRyxLQUFLO0FBRWxFLG1CQUFXLEdBQUcsUUFBUSxTQUFVLFFBQVE7QUFDdEMsb0JBQVU7QUFDVixnQkFBTSxhQUFhLElBQUksV0FBVztBQUNsQyxnQkFBTSxjQUFjLFdBQVcsS0FBSztBQUNwQyxnQkFBTSxnQkFBZ0IsbUJBQW1CO0FBRXpDLGNBQUksZUFBZTtBQUNqQixxQkFBUyxXQUFXO0FBQ3BCLHFCQUFTLFdBQVcsV0FBVztBQUcvQixnQkFBSSxTQUFTLGFBQWEsV0FBVyxTQUFTLGFBQWEsWUFBWTtBQUNyRSxrQkFBRyxTQUFTLFVBQVUsU0FBUyxVQUFVLENBQUMsS0FBSyxlQUFlO0FBQzVELG9CQUFJO0FBQUsseUJBQU87QUFDaEIscUJBQUssVUFBVTtBQUNmLHdCQUFRLGVBQWUsTUFBTTtBQUFBO0FBQUEsbUJBSTFCO0FBQ0wsa0JBQUksU0FBUyxhQUFhLFlBQVk7QUFDcEMseUJBQVMsV0FBVztBQUNwQix5QkFBUyxXQUFXLFdBQVc7QUFBQTtBQUVqQyxzQkFBUTtBQUFBO0FBQUEsaUJBRUw7QUFDTCxnQkFBRyxTQUFTLFVBQVUsU0FBUyxDQUFDLEtBQUssZUFBZTtBQUNsRCxrQkFBSTtBQUFLLHVCQUFPO0FBRWhCLG9CQUFNLE9BQU8sU0FBUztBQUV0QixrQkFBSSxNQUFNO0FBQ1IseUJBQVMsV0FBVztBQUNwQix5QkFBUyxXQUFXLFdBQVc7QUFBQTtBQUdqQyxrQkFBSSxNQUFNO0FBQ1IscUJBQUssVUFBVTtBQUNmLHdCQUFRLGVBQWUsTUFBTTtBQUFBLHFCQUN4QjtBQUNMLG9CQUFHLFNBQVMsVUFBVSxVQUFVLENBQUMsTUFBSyxlQUFlO0FBQ25ELHNCQUFJO0FBQUssMkJBQU87QUFFaEIsdUJBQUssVUFBVTtBQUNmLDBCQUFRLGVBQWUsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNdkMsbUJBQVcsR0FBRyxPQUFPLFdBQVk7QUFDL0IsY0FBRztBQUFTLG9CQUFRO0FBQUE7QUFHdEIsbUJBQVcsR0FBRyxTQUFTLFNBQVUsS0FBSztBQUNwQyxpQkFBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQzdFYjtBQUFBO0FBQUE7QUFFQSxRQUFJLE1BQU0sT0FBTyxVQUFVO0FBQTNCLFFBQ0ksU0FBUztBQVNiLHNCQUFrQjtBQUFBO0FBU2xCLFFBQUksT0FBTyxRQUFRO0FBQ2pCLGFBQU8sWUFBWSxPQUFPLE9BQU87QUFNakMsVUFBSSxDQUFDLElBQUksU0FBUztBQUFXLGlCQUFTO0FBQUE7QUFZeEMsZ0JBQVksSUFBSSxTQUFTLE1BQU07QUFDN0IsV0FBSyxLQUFLO0FBQ1YsV0FBSyxVQUFVO0FBQ2YsV0FBSyxPQUFPLFFBQVE7QUFBQTtBQWN0Qix5QkFBcUIsU0FBUyxPQUFPLElBQUksU0FBUyxNQUFNO0FBQ3RELFVBQUksT0FBTyxPQUFPLFlBQVk7QUFDNUIsY0FBTSxJQUFJLFVBQVU7QUFBQTtBQUd0QixVQUFJLFdBQVcsSUFBSSxHQUFHLElBQUksV0FBVyxTQUFTLE9BQzFDLE1BQU0sU0FBUyxTQUFTLFFBQVE7QUFFcEMsVUFBSSxDQUFDLFFBQVEsUUFBUTtBQUFNLGdCQUFRLFFBQVEsT0FBTyxVQUFVLFFBQVE7QUFBQSxlQUMzRCxDQUFDLFFBQVEsUUFBUSxLQUFLO0FBQUksZ0JBQVEsUUFBUSxLQUFLLEtBQUs7QUFBQTtBQUN4RCxnQkFBUSxRQUFRLE9BQU8sQ0FBQyxRQUFRLFFBQVEsTUFBTTtBQUVuRCxhQUFPO0FBQUE7QUFVVCx3QkFBb0IsU0FBUyxLQUFLO0FBQ2hDLFVBQUksRUFBRSxRQUFRLGlCQUFpQjtBQUFHLGdCQUFRLFVBQVUsSUFBSTtBQUFBO0FBQ25ELGVBQU8sUUFBUSxRQUFRO0FBQUE7QUFVOUIsNEJBQXdCO0FBQ3RCLFdBQUssVUFBVSxJQUFJO0FBQ25CLFdBQUssZUFBZTtBQUFBO0FBVXRCLGlCQUFhLFVBQVUsYUFBYSxzQkFBc0I7QUFDeEQsVUFBSSxRQUFRLElBQ1IsUUFDQTtBQUVKLFVBQUksS0FBSyxpQkFBaUI7QUFBRyxlQUFPO0FBRXBDLFdBQUssUUFBUyxTQUFTLEtBQUssU0FBVTtBQUNwQyxZQUFJLElBQUksS0FBSyxRQUFRO0FBQU8sZ0JBQU0sS0FBSyxTQUFTLEtBQUssTUFBTSxLQUFLO0FBQUE7QUFHbEUsVUFBSSxPQUFPLHVCQUF1QjtBQUNoQyxlQUFPLE1BQU0sT0FBTyxPQUFPLHNCQUFzQjtBQUFBO0FBR25ELGFBQU87QUFBQTtBQVVULGlCQUFhLFVBQVUsWUFBWSxtQkFBbUIsT0FBTztBQUMzRCxVQUFJLE1BQU0sU0FBUyxTQUFTLFFBQVEsT0FDaEMsV0FBVyxLQUFLLFFBQVE7QUFFNUIsVUFBSSxDQUFDO0FBQVUsZUFBTztBQUN0QixVQUFJLFNBQVM7QUFBSSxlQUFPLENBQUMsU0FBUztBQUVsQyxlQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsUUFBUSxLQUFLLElBQUksTUFBTSxJQUFJLElBQUksR0FBRyxLQUFLO0FBQ2xFLFdBQUcsS0FBSyxTQUFTLEdBQUc7QUFBQTtBQUd0QixhQUFPO0FBQUE7QUFVVCxpQkFBYSxVQUFVLGdCQUFnQix1QkFBdUIsT0FBTztBQUNuRSxVQUFJLE1BQU0sU0FBUyxTQUFTLFFBQVEsT0FDaEMsWUFBWSxLQUFLLFFBQVE7QUFFN0IsVUFBSSxDQUFDO0FBQVcsZUFBTztBQUN2QixVQUFJLFVBQVU7QUFBSSxlQUFPO0FBQ3pCLGFBQU8sVUFBVTtBQUFBO0FBVW5CLGlCQUFhLFVBQVUsT0FBTyxjQUFjLE9BQU8sSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJO0FBQ3JFLFVBQUksTUFBTSxTQUFTLFNBQVMsUUFBUTtBQUVwQyxVQUFJLENBQUMsS0FBSyxRQUFRO0FBQU0sZUFBTztBQUUvQixVQUFJLFlBQVksS0FBSyxRQUFRLE1BQ3pCLE1BQU0sVUFBVSxRQUNoQixNQUNBO0FBRUosVUFBSSxVQUFVLElBQUk7QUFDaEIsWUFBSSxVQUFVO0FBQU0sZUFBSyxlQUFlLE9BQU8sVUFBVSxJQUFJLFFBQVc7QUFFeEUsZ0JBQVE7QUFBQSxlQUNEO0FBQUcsbUJBQU8sVUFBVSxHQUFHLEtBQUssVUFBVSxVQUFVO0FBQUEsZUFDaEQ7QUFBRyxtQkFBTyxVQUFVLEdBQUcsS0FBSyxVQUFVLFNBQVMsS0FBSztBQUFBLGVBQ3BEO0FBQUcsbUJBQU8sVUFBVSxHQUFHLEtBQUssVUFBVSxTQUFTLElBQUksS0FBSztBQUFBLGVBQ3hEO0FBQUcsbUJBQU8sVUFBVSxHQUFHLEtBQUssVUFBVSxTQUFTLElBQUksSUFBSSxLQUFLO0FBQUEsZUFDNUQ7QUFBRyxtQkFBTyxVQUFVLEdBQUcsS0FBSyxVQUFVLFNBQVMsSUFBSSxJQUFJLElBQUksS0FBSztBQUFBLGVBQ2hFO0FBQUcsbUJBQU8sVUFBVSxHQUFHLEtBQUssVUFBVSxTQUFTLElBQUksSUFBSSxJQUFJLElBQUksS0FBSztBQUFBO0FBRzNFLGFBQUssSUFBSSxHQUFHLE9BQU8sSUFBSSxNQUFNLE1BQUssSUFBSSxJQUFJLEtBQUssS0FBSztBQUNsRCxlQUFLLElBQUksS0FBSyxVQUFVO0FBQUE7QUFHMUIsa0JBQVUsR0FBRyxNQUFNLFVBQVUsU0FBUztBQUFBLGFBQ2pDO0FBQ0wsWUFBSSxTQUFTLFVBQVUsUUFDbkI7QUFFSixhQUFLLElBQUksR0FBRyxJQUFJLFFBQVEsS0FBSztBQUMzQixjQUFJLFVBQVUsR0FBRztBQUFNLGlCQUFLLGVBQWUsT0FBTyxVQUFVLEdBQUcsSUFBSSxRQUFXO0FBRTlFLGtCQUFRO0FBQUEsaUJBQ0Q7QUFBRyx3QkFBVSxHQUFHLEdBQUcsS0FBSyxVQUFVLEdBQUc7QUFBVTtBQUFBLGlCQUMvQztBQUFHLHdCQUFVLEdBQUcsR0FBRyxLQUFLLFVBQVUsR0FBRyxTQUFTO0FBQUs7QUFBQSxpQkFDbkQ7QUFBRyx3QkFBVSxHQUFHLEdBQUcsS0FBSyxVQUFVLEdBQUcsU0FBUyxJQUFJO0FBQUs7QUFBQSxpQkFDdkQ7QUFBRyx3QkFBVSxHQUFHLEdBQUcsS0FBSyxVQUFVLEdBQUcsU0FBUyxJQUFJLElBQUk7QUFBSztBQUFBO0FBRTlELGtCQUFJLENBQUM7QUFBTSxxQkFBSyxJQUFJLEdBQUcsT0FBTyxJQUFJLE1BQU0sTUFBSyxJQUFJLElBQUksS0FBSyxLQUFLO0FBQzdELHVCQUFLLElBQUksS0FBSyxVQUFVO0FBQUE7QUFHMUIsd0JBQVUsR0FBRyxHQUFHLE1BQU0sVUFBVSxHQUFHLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFLcEQsYUFBTztBQUFBO0FBWVQsaUJBQWEsVUFBVSxLQUFLLFlBQVksT0FBTyxJQUFJLFNBQVM7QUFDMUQsYUFBTyxZQUFZLE1BQU0sT0FBTyxJQUFJLFNBQVM7QUFBQTtBQVkvQyxpQkFBYSxVQUFVLE9BQU8sY0FBYyxPQUFPLElBQUksU0FBUztBQUM5RCxhQUFPLFlBQVksTUFBTSxPQUFPLElBQUksU0FBUztBQUFBO0FBYS9DLGlCQUFhLFVBQVUsaUJBQWlCLHdCQUF3QixPQUFPLElBQUksU0FBUyxNQUFNO0FBQ3hGLFVBQUksTUFBTSxTQUFTLFNBQVMsUUFBUTtBQUVwQyxVQUFJLENBQUMsS0FBSyxRQUFRO0FBQU0sZUFBTztBQUMvQixVQUFJLENBQUMsSUFBSTtBQUNQLG1CQUFXLE1BQU07QUFDakIsZUFBTztBQUFBO0FBR1QsVUFBSSxZQUFZLEtBQUssUUFBUTtBQUU3QixVQUFJLFVBQVUsSUFBSTtBQUNoQixZQUNFLFVBQVUsT0FBTyxNQUNoQixFQUFDLFFBQVEsVUFBVSxTQUNuQixFQUFDLFdBQVcsVUFBVSxZQUFZLFVBQ25DO0FBQ0EscUJBQVcsTUFBTTtBQUFBO0FBQUEsYUFFZDtBQUNMLGlCQUFTLElBQUksR0FBRyxTQUFTLElBQUksU0FBUyxVQUFVLFFBQVEsSUFBSSxRQUFRLEtBQUs7QUFDdkUsY0FDRSxVQUFVLEdBQUcsT0FBTyxNQUNuQixRQUFRLENBQUMsVUFBVSxHQUFHLFFBQ3RCLFdBQVcsVUFBVSxHQUFHLFlBQVksU0FDckM7QUFDQSxtQkFBTyxLQUFLLFVBQVU7QUFBQTtBQUFBO0FBTzFCLFlBQUksT0FBTztBQUFRLGVBQUssUUFBUSxPQUFPLE9BQU8sV0FBVyxJQUFJLE9BQU8sS0FBSztBQUFBO0FBQ3BFLHFCQUFXLE1BQU07QUFBQTtBQUd4QixhQUFPO0FBQUE7QUFVVCxpQkFBYSxVQUFVLHFCQUFxQiw0QkFBNEIsT0FBTztBQUM3RSxVQUFJO0FBRUosVUFBSSxPQUFPO0FBQ1QsY0FBTSxTQUFTLFNBQVMsUUFBUTtBQUNoQyxZQUFJLEtBQUssUUFBUTtBQUFNLHFCQUFXLE1BQU07QUFBQSxhQUNuQztBQUNMLGFBQUssVUFBVSxJQUFJO0FBQ25CLGFBQUssZUFBZTtBQUFBO0FBR3RCLGFBQU87QUFBQTtBQU1ULGlCQUFhLFVBQVUsTUFBTSxhQUFhLFVBQVU7QUFDcEQsaUJBQWEsVUFBVSxjQUFjLGFBQWEsVUFBVTtBQUs1RCxpQkFBYSxXQUFXO0FBS3hCLGlCQUFhLGVBQWU7QUFLNUIsUUFBSSxBQUFnQixPQUFPLFlBQXZCLGFBQStCO0FBQ2pDLGNBQU8sVUFBVTtBQUFBO0FBQUE7QUFBQTs7O0FDOVVuQjtBQUFBO0FBQUE7QUFXQSxZQUFPLFVBQVUsa0JBQWtCLE1BQU0sVUFBVTtBQUNqRCxpQkFBVyxTQUFTLE1BQU0sS0FBSztBQUMvQixhQUFPLENBQUM7QUFFUixVQUFJLENBQUM7QUFBTSxlQUFPO0FBRWxCLGNBQVE7QUFBQSxhQUNEO0FBQUEsYUFDQTtBQUNMLGlCQUFPLFNBQVM7QUFBQSxhQUVYO0FBQUEsYUFDQTtBQUNMLGlCQUFPLFNBQVM7QUFBQSxhQUVYO0FBQ0wsaUJBQU8sU0FBUztBQUFBLGFBRVg7QUFDTCxpQkFBTyxTQUFTO0FBQUEsYUFFWDtBQUNMLGlCQUFPO0FBQUE7QUFHVCxhQUFPLFNBQVM7QUFBQTtBQUFBO0FBQUE7OztBQ3BDbEI7QUFBQTtBQUFBLFFBQUksU0FBVztBQUFmLFFBQ0ksTUFBVyxRQUFRO0FBRHZCLFFBRUksU0FBVyxRQUFRLFFBQVE7QUFGL0IsUUFHSSxXQUFXO0FBRWYsUUFBSSxnQkFBZ0I7QUFBcEIsUUFDSSxRQUFRO0FBS1osV0FBTyxRQUFRO0FBcUJmLFdBQU8sZ0JBQWdCLFNBQVMsVUFBVSxTQUFTLEtBQUssU0FBUztBQUMvRCxlQUFTLE9BQU8sUUFBUSxXQUFXLFVBQVUsUUFDNUIsT0FBTSxLQUFLLFFBQVEsV0FBVyxVQUFVLFlBQVksTUFBTTtBQUUzRTtBQUFBLFFBQUM7QUFBQSxRQUFRO0FBQUEsUUFBWTtBQUFBLFFBQWM7QUFBQSxRQUFPO0FBQUEsUUFDeEM7QUFBQSxRQUFjO0FBQUEsUUFBUTtBQUFBLFFBQU07QUFBQSxRQUFXO0FBQUEsUUFBa0IsUUFDekQsU0FBUyxHQUFHO0FBQUUsaUJBQVMsS0FBSyxRQUFRLFdBQVcsVUFBVTtBQUFBO0FBRzNELGVBQVMsU0FBUyxRQUFRLFVBQVUsSUFBSTtBQUN4QyxlQUFTLFVBQVUsT0FBTyxJQUFJLElBQUk7QUFFbEMsVUFBSSxRQUFRLFNBQVE7QUFDbEIsZUFBTyxTQUFTLFNBQVMsUUFBUTtBQUFBO0FBR25DLFVBQUksUUFBUSxNQUFNO0FBQ2hCLGlCQUFTLE9BQU8sUUFBUTtBQUFBO0FBRzFCLFVBQUksUUFBUSxJQUFJO0FBQ1osaUJBQVMsS0FBSyxRQUFRO0FBQUE7QUFHMUIsVUFBSSxNQUFNLEtBQUssUUFBUSxXQUFXLFVBQVUsV0FBVztBQUNyRCxpQkFBUyxxQkFBc0IsT0FBTyxRQUFRLFdBQVcsY0FBZSxPQUFPLFFBQVE7QUFBQTtBQUl6RixlQUFTLFFBQVEsUUFBUSxTQUFTO0FBQ2xDLGVBQVMsZUFBZSxRQUFRO0FBTWhDLFVBQUksQ0FBQyxTQUFTLE9BQU87QUFDbkIsaUJBQVMsVUFBVSxTQUFTLFdBQVc7QUFDdkMsWUFBSSxPQUFPLFNBQVMsUUFBUSxlQUFlLFlBQ3BDLENBQUMsY0FBYyxLQUFLLFNBQVMsUUFBUSxhQUN2QztBQUFFLG1CQUFTLFFBQVEsYUFBYTtBQUFBO0FBQUE7QUFLdkMsVUFBSSxTQUFTLFFBQVEsV0FBVztBQUNoQyxVQUFJLGFBQWEsVUFBVSxRQUFRLGdCQUFnQixRQUM5QyxPQUFPLFFBQVEsS0FDaEI7QUFLSixVQUFJLGVBQWUsQ0FBQyxRQUFRLFVBQ3ZCLElBQUksTUFBTSxJQUFJLEtBQUssUUFBUSxLQUM1QixJQUFJO0FBT1IscUJBQWUsQ0FBQyxRQUFRLGFBQWEsZUFBZTtBQUVwRCxlQUFTLE9BQU8sT0FBTyxRQUFRLFlBQVk7QUFFM0MsVUFBSSxRQUFRLGNBQWM7QUFDeEIsaUJBQVMsUUFBUSxPQUNmLFNBQVMsU0FBUyxNQUFNLFFBQVEsV0FBVyxVQUFVLGFBQWEsQ0FBQyxRQUFRLFNBQVMsUUFDaEYsU0FBUyxPQUFPLE1BQU0sU0FBUyxPQUMvQixTQUFTO0FBQUE7QUFFakIsYUFBTztBQUFBO0FBb0JULFdBQU8sY0FBYyxTQUFTLFFBQVE7QUFDcEMsYUFBTyxXQUFXO0FBQ2xCLGFBQU8sV0FBVztBQUVsQixhQUFPLGFBQWEsTUFBTTtBQUUxQixhQUFPO0FBQUE7QUFZVCxXQUFPLFVBQVUsU0FBUyxLQUFLO0FBQzdCLFVBQUksTUFBTSxJQUFJLFFBQVEsT0FBTyxJQUFJLFFBQVEsS0FBSyxNQUFNLFlBQVk7QUFFaEUsYUFBTyxNQUNMLElBQUksS0FDSixPQUFPLHVCQUF1QixPQUFPLFFBQVE7QUFBQTtBQVlqRCxXQUFPLHlCQUF5QixTQUFTLEtBQUs7QUFDNUMsYUFBTyxRQUFRLElBQUksV0FBVyxhQUFhLElBQUksV0FBVztBQUFBO0FBVzVELFdBQU8sVUFBVSxXQUFXO0FBSTFCLFVBQUksT0FBTyxNQUFNLFVBQVUsTUFBTSxLQUFLLFlBQ2xDLFlBQVksS0FBSyxTQUFTLEdBQzFCLE9BQU8sS0FBSyxZQUNaLFdBQVcsS0FBSyxNQUFNLE1BQ3RCO0FBRUosV0FBSyxhQUFhLFNBQVM7QUFNM0IsZ0JBQVU7QUFBQSxRQUNSLEtBQUssT0FBTyxTQUFTLEtBQUssS0FDckIsUUFBUSxRQUFRLEtBQ2hCLFFBQVEsVUFBVSxXQUNsQixRQUFRLFdBQVc7QUFBQTtBQU8xQixjQUFRLEtBQUssTUFBTSxTQUFTO0FBRTVCLGFBQU8sUUFBUSxLQUFLO0FBQUE7QUFZdEIsV0FBTyx3QkFBd0IsK0JBQStCLFFBQVEsUUFBUSxVQUFVO0FBQ3RGLFVBQUksTUFBTSxRQUFRLFNBQVM7QUFDekIsZUFBTyxPQUFPLElBQUksU0FBVSxlQUFlO0FBQ3pDLGlCQUFPLHNCQUFzQixlQUFlLFFBQVE7QUFBQTtBQUFBO0FBR3hELGFBQU8sT0FBTyxRQUFRLElBQUksT0FBTyxXQUFXLFdBQVcsYUFBYSxNQUFNLFNBQVMsT0FBTyxRQUFRLGVBQWU7QUFDL0csWUFBSTtBQUNKLFlBQUksaUJBQWlCLFFBQVE7QUFDM0IscUJBQVcsT0FBTztBQUFBLG1CQUNULE9BQU8sUUFBUTtBQUN4QixxQkFBVyxPQUFPO0FBQUEsZUFDYjtBQUVMLGlCQUFPO0FBQUE7QUFFVCxZQUFJLFVBQVU7QUFFWixpQkFBTyxTQUFTO0FBQUEsZUFDWDtBQUVMLGlCQUFPO0FBQUE7QUFBQTtBQUFBO0FBWWIscUJBQWlCLE1BQU07QUFDckIsYUFBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7QUFBQTtBQUFBO0FBQUE7OztBQ3RQekI7QUFBQTtBQUFBLFFBQUksTUFBUyxRQUFRO0FBQXJCLFFBQ0ksU0FBUztBQUdiLFFBQUksZ0JBQWdCO0FBRXBCLEFBUUEsWUFBTyxVQUFVO0FBQUEsTUFXZixlQUFlLHVCQUF1QixLQUFLLEtBQUssVUFBVTtBQUN4RCxZQUFJLElBQUksZ0JBQWdCLE9BQU87QUFDN0IsaUJBQU8sU0FBUyxRQUFRO0FBQUE7QUFBQTtBQUFBLE1BYzVCLGVBQWUsdUJBQXVCLEtBQUssS0FBSyxVQUFVO0FBQ3hELFlBQUksSUFBSSxnQkFBZ0IsT0FBTztBQUM3QixtQkFBUyxRQUFRLGFBQWEsSUFBSSxRQUFRLGNBQWM7QUFBQSxtQkFDL0MsSUFBSSxnQkFBZ0IsU0FBUyxDQUFDLFNBQVMsUUFBUSxZQUFZO0FBQ3BFLG1CQUFTLFFBQVEsYUFBYSxJQUFJLFFBQVEsY0FBYztBQUFBO0FBQUE7QUFBQSxNQUk1RCx3QkFBd0IsZ0NBQWdDLEtBQUssS0FBSyxVQUFVLFNBQVM7QUFDbkYsWUFBSyxTQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsb0JBQ3BELFNBQVMsUUFBUSxlQUNqQixjQUFjLEtBQUssU0FBUyxhQUFhO0FBQzlDLGNBQUksU0FBUyxJQUFJLE1BQU0sUUFBUTtBQUMvQixjQUFJLElBQUksSUFBSSxNQUFNLFNBQVMsUUFBUTtBQUduQyxjQUFJLE9BQU8sUUFBUSxFQUFFLE1BQU07QUFDekI7QUFBQTtBQUdGLGNBQUksUUFBUSxhQUFhO0FBQ3ZCLGNBQUUsT0FBTyxRQUFRO0FBQUEscUJBQ1IsUUFBUSxhQUFhO0FBQzlCLGNBQUUsT0FBTyxJQUFJLFFBQVE7QUFBQTtBQUV2QixjQUFJLFFBQVEsaUJBQWlCO0FBQzNCLGNBQUUsV0FBVyxRQUFRO0FBQUE7QUFHdkIsbUJBQVMsUUFBUSxjQUFjLEVBQUU7QUFBQTtBQUFBO0FBQUEsTUFjckMsY0FBYyxzQkFBc0IsS0FBSyxLQUFLLFVBQVUsU0FBUztBQUMvRCxZQUFJLDRCQUE0QixRQUFRLHFCQUNwQywwQkFBMEIsUUFBUSxtQkFDbEMsd0JBQXdCLFFBQVEsdUJBQ2hDLGlCQUNBLFlBQVksU0FBUyxNQUFLLFFBQVE7QUFDaEMsY0FBSSxVQUFVO0FBQVc7QUFDekIsY0FBSSw2QkFBNkIsS0FBSSxrQkFBa0IsY0FBYztBQUNuRSxxQkFBUyxPQUFPLHNCQUFzQixRQUFRLDJCQUEyQjtBQUFBO0FBRTNFLGNBQUksMkJBQTJCLEtBQUksa0JBQWtCLGNBQWM7QUFDakUscUJBQVMsT0FBTyxzQkFBc0IsUUFBUSx5QkFBeUI7QUFBQTtBQUV6RSxjQUFJLFVBQVUsT0FBTyxNQUFLLFFBQVE7QUFBQTtBQUd4QyxZQUFJLE9BQU8sOEJBQThCLFVBQVU7QUFDakQsc0NBQTRCLEVBQUUsS0FBSztBQUFBO0FBR3JDLFlBQUksT0FBTyw0QkFBNEIsVUFBVTtBQUMvQyxvQ0FBMEIsRUFBRSxLQUFLO0FBQUE7QUFLbkMsWUFBSSx5QkFBeUIsU0FBUyxjQUFjLFFBQVc7QUFDN0QsNEJBQWtCO0FBQ2xCLG1CQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsV0FBVyxRQUFRLEtBQUssR0FBRztBQUN0RCxnQkFBSSxNQUFNLFNBQVMsV0FBVztBQUM5Qiw0QkFBZ0IsSUFBSSxpQkFBaUI7QUFBQTtBQUFBO0FBSXpDLGVBQU8sS0FBSyxTQUFTLFNBQVMsUUFBUSxTQUFTLE1BQUs7QUFDbEQsY0FBSSxTQUFTLFNBQVMsUUFBUTtBQUM5QixjQUFJLHlCQUF5QixpQkFBaUI7QUFDNUMsbUJBQU0sZ0JBQWdCLFNBQVE7QUFBQTtBQUVoQyxvQkFBVSxNQUFLO0FBQUE7QUFBQTtBQUFBLE1BYW5CLGlCQUFpQix5QkFBeUIsS0FBSyxLQUFLLFVBQVU7QUFFNUQsWUFBRyxTQUFTLGVBQWU7QUFDekIsY0FBSSxhQUFhLFNBQVM7QUFDMUIsY0FBSSxnQkFBZ0IsU0FBUztBQUFBLGVBQ3hCO0FBQ0wsY0FBSSxhQUFhLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUM5SWhDO0FBQUE7QUFJQSxRQUFJLElBQUk7QUFDUixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBZ0JaLFlBQU8sVUFBVSxTQUFTLEtBQUssU0FBUztBQUN0QyxnQkFBVSxXQUFXO0FBQ3JCLFVBQUksT0FBTyxPQUFPO0FBQ2xCLFVBQUksU0FBUyxZQUFZLElBQUksU0FBUyxHQUFHO0FBQ3ZDLGVBQU8sTUFBTTtBQUFBLGlCQUNKLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFDN0MsZUFBTyxRQUFRLE9BQU8sUUFBUSxPQUFPLFNBQVM7QUFBQTtBQUVoRCxZQUFNLElBQUksTUFDUiwwREFDRSxLQUFLLFVBQVU7QUFBQTtBQVlyQixtQkFBZSxLQUFLO0FBQ2xCLFlBQU0sT0FBTztBQUNiLFVBQUksSUFBSSxTQUFTLEtBQUs7QUFDcEI7QUFBQTtBQUVGLFVBQUksUUFBUSxtSUFBbUksS0FDN0k7QUFFRixVQUFJLENBQUMsT0FBTztBQUNWO0FBQUE7QUFFRixVQUFJLElBQUksV0FBVyxNQUFNO0FBQ3pCLFVBQUksT0FBUSxPQUFNLE1BQU0sTUFBTTtBQUM5QixjQUFRO0FBQUEsYUFDRDtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFDSCxpQkFBTyxJQUFJO0FBQUEsYUFDUjtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQ0gsaUJBQU8sSUFBSTtBQUFBLGFBQ1I7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPLElBQUk7QUFBQSxhQUNSO0FBQUEsYUFDQTtBQUFBLGFBQ0E7QUFBQSxhQUNBO0FBQUEsYUFDQTtBQUNILGlCQUFPO0FBQUE7QUFFUCxpQkFBTztBQUFBO0FBQUE7QUFZYixzQkFBa0IsSUFBSTtBQUNwQixVQUFJLFFBQVEsS0FBSyxJQUFJO0FBQ3JCLFVBQUksU0FBUyxHQUFHO0FBQ2QsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFFOUIsVUFBSSxTQUFTLEdBQUc7QUFDZCxlQUFPLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQTtBQUU5QixVQUFJLFNBQVMsR0FBRztBQUNkLGVBQU8sS0FBSyxNQUFNLEtBQUssS0FBSztBQUFBO0FBRTlCLFVBQUksU0FBUyxHQUFHO0FBQ2QsZUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUE7QUFFOUIsYUFBTyxLQUFLO0FBQUE7QUFXZCxxQkFBaUIsSUFBSTtBQUNuQixVQUFJLFFBQVEsS0FBSyxJQUFJO0FBQ3JCLFVBQUksU0FBUyxHQUFHO0FBQ2QsZUFBTyxPQUFPLElBQUksT0FBTyxHQUFHO0FBQUE7QUFFOUIsVUFBSSxTQUFTLEdBQUc7QUFDZCxlQUFPLE9BQU8sSUFBSSxPQUFPLEdBQUc7QUFBQTtBQUU5QixVQUFJLFNBQVMsR0FBRztBQUNkLGVBQU8sT0FBTyxJQUFJLE9BQU8sR0FBRztBQUFBO0FBRTlCLFVBQUksU0FBUyxHQUFHO0FBQ2QsZUFBTyxPQUFPLElBQUksT0FBTyxHQUFHO0FBQUE7QUFFOUIsYUFBTyxLQUFLO0FBQUE7QUFPZCxvQkFBZ0IsSUFBSSxPQUFPLEdBQUcsTUFBTTtBQUNsQyxVQUFJLFdBQVcsU0FBUyxJQUFJO0FBQzVCLGFBQU8sS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNLE9BQVEsWUFBVyxNQUFNO0FBQUE7QUFBQTtBQUFBOzs7QUNoSzdEO0FBQUE7QUFNQSxtQkFBZSxLQUFLO0FBQ25CLGtCQUFZLFFBQVE7QUFDcEIsa0JBQVksVUFBVTtBQUN0QixrQkFBWSxTQUFTO0FBQ3JCLGtCQUFZLFVBQVU7QUFDdEIsa0JBQVksU0FBUztBQUNyQixrQkFBWSxVQUFVO0FBQ3RCLGtCQUFZLFdBQVc7QUFDdkIsa0JBQVksVUFBVTtBQUV0QixhQUFPLEtBQUssS0FBSyxRQUFRLFNBQU87QUFDL0Isb0JBQVksT0FBTyxJQUFJO0FBQUE7QUFPeEIsa0JBQVksUUFBUTtBQUNwQixrQkFBWSxRQUFRO0FBT3BCLGtCQUFZLGFBQWE7QUFRekIsMkJBQXFCLFdBQVc7QUFDL0IsWUFBSSxPQUFPO0FBRVgsaUJBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7QUFDMUMsaUJBQVMsU0FBUSxLQUFLLE9BQVEsVUFBVSxXQUFXO0FBQ25ELGtCQUFRO0FBQUE7QUFHVCxlQUFPLFlBQVksT0FBTyxLQUFLLElBQUksUUFBUSxZQUFZLE9BQU87QUFBQTtBQUUvRCxrQkFBWSxjQUFjO0FBUzFCLDJCQUFxQixXQUFXO0FBQy9CLFlBQUk7QUFDSixZQUFJLGlCQUFpQjtBQUNyQixZQUFJO0FBQ0osWUFBSTtBQUVKLDBCQUFrQixNQUFNO0FBRXZCLGNBQUksQ0FBQyxNQUFNLFNBQVM7QUFDbkI7QUFBQTtBQUdELGdCQUFNLE9BQU87QUFHYixnQkFBTSxPQUFPLE9BQU8sSUFBSTtBQUN4QixnQkFBTSxLQUFLLE9BQVEsYUFBWTtBQUMvQixlQUFLLE9BQU87QUFDWixlQUFLLE9BQU87QUFDWixlQUFLLE9BQU87QUFDWixxQkFBVztBQUVYLGVBQUssS0FBSyxZQUFZLE9BQU8sS0FBSztBQUVsQyxjQUFJLE9BQU8sS0FBSyxPQUFPLFVBQVU7QUFFaEMsaUJBQUssUUFBUTtBQUFBO0FBSWQsY0FBSSxRQUFRO0FBQ1osZUFBSyxLQUFLLEtBQUssR0FBRyxRQUFRLGlCQUFpQixDQUFDLE9BQU8sV0FBVztBQUU3RCxnQkFBSSxVQUFVLE1BQU07QUFDbkIscUJBQU87QUFBQTtBQUVSO0FBQ0Esa0JBQU0sWUFBWSxZQUFZLFdBQVc7QUFDekMsZ0JBQUksT0FBTyxjQUFjLFlBQVk7QUFDcEMsb0JBQU0sTUFBTSxLQUFLO0FBQ2pCLHNCQUFRLFVBQVUsS0FBSyxNQUFNO0FBRzdCLG1CQUFLLE9BQU8sT0FBTztBQUNuQjtBQUFBO0FBRUQsbUJBQU87QUFBQTtBQUlSLHNCQUFZLFdBQVcsS0FBSyxNQUFNO0FBRWxDLGdCQUFNLFFBQVEsS0FBSyxPQUFPLFlBQVk7QUFDdEMsZ0JBQU0sTUFBTSxNQUFNO0FBQUE7QUFHbkIsY0FBTSxZQUFZO0FBQ2xCLGNBQU0sWUFBWSxZQUFZO0FBQzlCLGNBQU0sUUFBUSxZQUFZLFlBQVk7QUFDdEMsY0FBTSxTQUFTO0FBQ2YsY0FBTSxVQUFVLFlBQVk7QUFFNUIsZUFBTyxlQUFlLE9BQU8sV0FBVztBQUFBLFVBQ3ZDLFlBQVk7QUFBQSxVQUNaLGNBQWM7QUFBQSxVQUNkLEtBQUssTUFBTTtBQUNWLGdCQUFJLG1CQUFtQixNQUFNO0FBQzVCLHFCQUFPO0FBQUE7QUFFUixnQkFBSSxvQkFBb0IsWUFBWSxZQUFZO0FBQy9DLGdDQUFrQixZQUFZO0FBQzlCLDZCQUFlLFlBQVksUUFBUTtBQUFBO0FBR3BDLG1CQUFPO0FBQUE7QUFBQSxVQUVSLEtBQUssT0FBSztBQUNULDZCQUFpQjtBQUFBO0FBQUE7QUFLbkIsWUFBSSxPQUFPLFlBQVksU0FBUyxZQUFZO0FBQzNDLHNCQUFZLEtBQUs7QUFBQTtBQUdsQixlQUFPO0FBQUE7QUFHUixzQkFBZ0IsV0FBVyxXQUFXO0FBQ3JDLGNBQU0sV0FBVyxZQUFZLEtBQUssWUFBYSxRQUFPLGNBQWMsY0FBYyxNQUFNLGFBQWE7QUFDckcsaUJBQVMsTUFBTSxLQUFLO0FBQ3BCLGVBQU87QUFBQTtBQVVSLHNCQUFnQixZQUFZO0FBQzNCLG9CQUFZLEtBQUs7QUFDakIsb0JBQVksYUFBYTtBQUV6QixvQkFBWSxRQUFRO0FBQ3BCLG9CQUFZLFFBQVE7QUFFcEIsWUFBSTtBQUNKLGNBQU0sUUFBUyxRQUFPLGVBQWUsV0FBVyxhQUFhLElBQUksTUFBTTtBQUN2RSxjQUFNLE1BQU0sTUFBTTtBQUVsQixhQUFLLElBQUksR0FBRyxJQUFJLEtBQUssS0FBSztBQUN6QixjQUFJLENBQUMsTUFBTSxJQUFJO0FBRWQ7QUFBQTtBQUdELHVCQUFhLE1BQU0sR0FBRyxRQUFRLE9BQU87QUFFckMsY0FBSSxXQUFXLE9BQU8sS0FBSztBQUMxQix3QkFBWSxNQUFNLEtBQUssSUFBSSxPQUFPLE1BQU0sV0FBVyxNQUFNLEtBQUs7QUFBQSxpQkFDeEQ7QUFDTix3QkFBWSxNQUFNLEtBQUssSUFBSSxPQUFPLE1BQU0sYUFBYTtBQUFBO0FBQUE7QUFBQTtBQVd4RCx5QkFBbUI7QUFDbEIsY0FBTSxhQUFhO0FBQUEsVUFDbEIsR0FBRyxZQUFZLE1BQU0sSUFBSTtBQUFBLFVBQ3pCLEdBQUcsWUFBWSxNQUFNLElBQUksYUFBYSxJQUFJLGVBQWEsTUFBTTtBQUFBLFVBQzVELEtBQUs7QUFDUCxvQkFBWSxPQUFPO0FBQ25CLGVBQU87QUFBQTtBQVVSLHVCQUFpQixNQUFNO0FBQ3RCLFlBQUksS0FBSyxLQUFLLFNBQVMsT0FBTyxLQUFLO0FBQ2xDLGlCQUFPO0FBQUE7QUFHUixZQUFJO0FBQ0osWUFBSTtBQUVKLGFBQUssSUFBSSxHQUFHLE1BQU0sWUFBWSxNQUFNLFFBQVEsSUFBSSxLQUFLLEtBQUs7QUFDekQsY0FBSSxZQUFZLE1BQU0sR0FBRyxLQUFLLE9BQU87QUFDcEMsbUJBQU87QUFBQTtBQUFBO0FBSVQsYUFBSyxJQUFJLEdBQUcsTUFBTSxZQUFZLE1BQU0sUUFBUSxJQUFJLEtBQUssS0FBSztBQUN6RCxjQUFJLFlBQVksTUFBTSxHQUFHLEtBQUssT0FBTztBQUNwQyxtQkFBTztBQUFBO0FBQUE7QUFJVCxlQUFPO0FBQUE7QUFVUiwyQkFBcUIsUUFBUTtBQUM1QixlQUFPLE9BQU8sV0FDWixVQUFVLEdBQUcsT0FBTyxXQUFXLFNBQVMsR0FDeEMsUUFBUSxXQUFXO0FBQUE7QUFVdEIsc0JBQWdCLEtBQUs7QUFDcEIsWUFBSSxlQUFlLE9BQU87QUFDekIsaUJBQU8sSUFBSSxTQUFTLElBQUk7QUFBQTtBQUV6QixlQUFPO0FBQUE7QUFPUix5QkFBbUI7QUFDbEIsZ0JBQVEsS0FBSztBQUFBO0FBR2Qsa0JBQVksT0FBTyxZQUFZO0FBRS9CLGFBQU87QUFBQTtBQUdSLFlBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ2pSakI7QUFBQTtBQU1BLFlBQVEsYUFBYTtBQUNyQixZQUFRLE9BQU87QUFDZixZQUFRLE9BQU87QUFDZixZQUFRLFlBQVk7QUFDcEIsWUFBUSxVQUFVO0FBQ2xCLFlBQVEsVUFBVyxPQUFNO0FBQ3hCLFVBQUksU0FBUztBQUViLGFBQU8sTUFBTTtBQUNaLFlBQUksQ0FBQyxRQUFRO0FBQ1osbUJBQVM7QUFDVCxrQkFBUSxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBU2hCLFlBQVEsU0FBUztBQUFBLE1BQ2hCO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUE7QUFZRCx5QkFBcUI7QUFJcEIsVUFBSSxPQUFPLFdBQVcsZUFBZSxPQUFPLFdBQVksUUFBTyxRQUFRLFNBQVMsY0FBYyxPQUFPLFFBQVEsU0FBUztBQUNySCxlQUFPO0FBQUE7QUFJUixVQUFJLE9BQU8sY0FBYyxlQUFlLFVBQVUsYUFBYSxVQUFVLFVBQVUsY0FBYyxNQUFNLDBCQUEwQjtBQUNoSSxlQUFPO0FBQUE7QUFLUixhQUFRLE9BQU8sYUFBYSxlQUFlLFNBQVMsbUJBQW1CLFNBQVMsZ0JBQWdCLFNBQVMsU0FBUyxnQkFBZ0IsTUFBTSxvQkFFdEksT0FBTyxXQUFXLGVBQWUsT0FBTyxXQUFZLFFBQU8sUUFBUSxXQUFZLE9BQU8sUUFBUSxhQUFhLE9BQU8sUUFBUSxVQUcxSCxPQUFPLGNBQWMsZUFBZSxVQUFVLGFBQWEsVUFBVSxVQUFVLGNBQWMsTUFBTSxxQkFBcUIsU0FBUyxPQUFPLElBQUksT0FBTyxNQUVuSixPQUFPLGNBQWMsZUFBZSxVQUFVLGFBQWEsVUFBVSxVQUFVLGNBQWMsTUFBTTtBQUFBO0FBU3RHLHdCQUFvQixNQUFNO0FBQ3pCLFdBQUssS0FBTSxNQUFLLFlBQVksT0FBTyxNQUNsQyxLQUFLLFlBQ0osTUFBSyxZQUFZLFFBQVEsT0FDMUIsS0FBSyxLQUNKLE1BQUssWUFBWSxRQUFRLE9BQzFCLE1BQU0sUUFBTyxRQUFRLFNBQVMsS0FBSztBQUVwQyxVQUFJLENBQUMsS0FBSyxXQUFXO0FBQ3BCO0FBQUE7QUFHRCxZQUFNLElBQUksWUFBWSxLQUFLO0FBQzNCLFdBQUssT0FBTyxHQUFHLEdBQUcsR0FBRztBQUtyQixVQUFJLFFBQVE7QUFDWixVQUFJLFFBQVE7QUFDWixXQUFLLEdBQUcsUUFBUSxlQUFlLFdBQVM7QUFDdkMsWUFBSSxVQUFVLE1BQU07QUFDbkI7QUFBQTtBQUVEO0FBQ0EsWUFBSSxVQUFVLE1BQU07QUFHbkIsa0JBQVE7QUFBQTtBQUFBO0FBSVYsV0FBSyxPQUFPLE9BQU8sR0FBRztBQUFBO0FBV3ZCLFlBQVEsTUFBTSxRQUFRLFNBQVMsUUFBUSxPQUFRLE9BQU07QUFBQTtBQVFyRCxrQkFBYyxZQUFZO0FBQ3pCLFVBQUk7QUFDSCxZQUFJLFlBQVk7QUFDZixrQkFBUSxRQUFRLFFBQVEsU0FBUztBQUFBLGVBQzNCO0FBQ04sa0JBQVEsUUFBUSxXQUFXO0FBQUE7QUFBQSxlQUVwQixPQUFQO0FBQUE7QUFBQTtBQVlILG9CQUFnQjtBQUNmLFVBQUk7QUFDSixVQUFJO0FBQ0gsWUFBSSxRQUFRLFFBQVEsUUFBUTtBQUFBLGVBQ3BCLE9BQVA7QUFBQTtBQU1GLFVBQUksQ0FBQyxLQUFLLE9BQU8sWUFBWSxlQUFlLFNBQVMsU0FBUztBQUM3RCxZQUFJLFFBQVEsSUFBSTtBQUFBO0FBR2pCLGFBQU87QUFBQTtBQWNSLDRCQUF3QjtBQUN2QixVQUFJO0FBR0gsZUFBTztBQUFBLGVBQ0MsT0FBUDtBQUFBO0FBQUE7QUFNSCxZQUFPLFVBQVUsa0JBQW9CO0FBRXJDLFFBQU0sRUFBQyxlQUFjLFFBQU87QUFNNUIsZUFBVyxJQUFJLFNBQVUsR0FBRztBQUMzQixVQUFJO0FBQ0gsZUFBTyxLQUFLLFVBQVU7QUFBQSxlQUNkLE9BQVA7QUFDRCxlQUFPLGlDQUFpQyxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQzFRaEQ7QUFBQTtBQUFBO0FBRUEsWUFBTyxVQUFVLENBQUMsTUFBTSxPQUFPLFFBQVEsU0FBUztBQUMvQyxZQUFNLFNBQVMsS0FBSyxXQUFXLE9BQU8sS0FBTSxLQUFLLFdBQVcsSUFBSSxNQUFNO0FBQ3RFLFlBQU0sV0FBVyxLQUFLLFFBQVEsU0FBUztBQUN2QyxZQUFNLHFCQUFxQixLQUFLLFFBQVE7QUFDeEMsYUFBTyxhQUFhLE1BQU8sd0JBQXVCLE1BQU0sV0FBVztBQUFBO0FBQUE7QUFBQTs7O0FDTnBFO0FBQUE7QUFBQTtBQUNBLFFBQU0sS0FBSyxRQUFRO0FBQ25CLFFBQU0sTUFBTSxRQUFRO0FBQ3BCLFFBQU0sVUFBVTtBQUVoQixRQUFNLEVBQUMsUUFBTztBQUVkLFFBQUk7QUFDSixRQUFJLFFBQVEsZUFDWCxRQUFRLGdCQUNSLFFBQVEsa0JBQ1IsUUFBUSxnQkFBZ0I7QUFDeEIsbUJBQWE7QUFBQSxlQUNILFFBQVEsWUFDbEIsUUFBUSxhQUNSLFFBQVEsaUJBQ1IsUUFBUSxpQkFBaUI7QUFDekIsbUJBQWE7QUFBQTtBQUdkLFFBQUksaUJBQWlCLEtBQUs7QUFDekIsVUFBSSxJQUFJLGdCQUFnQixRQUFRO0FBQy9CLHFCQUFhO0FBQUEsaUJBQ0gsSUFBSSxnQkFBZ0IsU0FBUztBQUN2QyxxQkFBYTtBQUFBLGFBQ1A7QUFDTixxQkFBYSxJQUFJLFlBQVksV0FBVyxJQUFJLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxhQUFhLEtBQUs7QUFBQTtBQUFBO0FBSTFGLDRCQUF3QixPQUFPO0FBQzlCLFVBQUksVUFBVSxHQUFHO0FBQ2hCLGVBQU87QUFBQTtBQUdSLGFBQU87QUFBQSxRQUNOO0FBQUEsUUFDQSxVQUFVO0FBQUEsUUFDVixRQUFRLFNBQVM7QUFBQSxRQUNqQixRQUFRLFNBQVM7QUFBQTtBQUFBO0FBSW5CLDJCQUF1QixZQUFZLGFBQWE7QUFDL0MsVUFBSSxlQUFlLEdBQUc7QUFDckIsZUFBTztBQUFBO0FBR1IsVUFBSSxRQUFRLGdCQUNYLFFBQVEsaUJBQ1IsUUFBUSxvQkFBb0I7QUFDNUIsZUFBTztBQUFBO0FBR1IsVUFBSSxRQUFRLGNBQWM7QUFDekIsZUFBTztBQUFBO0FBR1IsVUFBSSxjQUFjLENBQUMsZUFBZSxlQUFlLFFBQVc7QUFDM0QsZUFBTztBQUFBO0FBR1IsWUFBTSxNQUFNLGNBQWM7QUFFMUIsVUFBSSxJQUFJLFNBQVMsUUFBUTtBQUN4QixlQUFPO0FBQUE7QUFHUixVQUFJLFFBQVEsYUFBYSxTQUFTO0FBR2pDLGNBQU0sWUFBWSxHQUFHLFVBQVUsTUFBTTtBQUNyQyxZQUNDLE9BQU8sVUFBVSxPQUFPLE1BQ3hCLE9BQU8sVUFBVSxPQUFPLE9BQ3ZCO0FBQ0QsaUJBQU8sT0FBTyxVQUFVLE9BQU8sUUFBUSxJQUFJO0FBQUE7QUFHNUMsZUFBTztBQUFBO0FBR1IsVUFBSSxRQUFRLEtBQUs7QUFDaEIsWUFBSSxDQUFDLFVBQVUsWUFBWSxZQUFZLGFBQWEsa0JBQWtCLGFBQWEsS0FBSyxVQUFRLFFBQVEsUUFBUSxJQUFJLFlBQVksWUFBWTtBQUMzSSxpQkFBTztBQUFBO0FBR1IsZUFBTztBQUFBO0FBR1IsVUFBSSxzQkFBc0IsS0FBSztBQUM5QixlQUFPLGdDQUFnQyxLQUFLLElBQUksb0JBQW9CLElBQUk7QUFBQTtBQUd6RSxVQUFJLElBQUksY0FBYyxhQUFhO0FBQ2xDLGVBQU87QUFBQTtBQUdSLFVBQUksa0JBQWtCLEtBQUs7QUFDMUIsY0FBTSxVQUFVLFNBQVUsS0FBSSx3QkFBd0IsSUFBSSxNQUFNLEtBQUssSUFBSTtBQUV6RSxnQkFBUSxJQUFJO0FBQUEsZUFDTjtBQUNKLG1CQUFPLFdBQVcsSUFBSSxJQUFJO0FBQUEsZUFDdEI7QUFDSixtQkFBTztBQUFBO0FBQUE7QUFLVixVQUFJLGlCQUFpQixLQUFLLElBQUksT0FBTztBQUNwQyxlQUFPO0FBQUE7QUFHUixVQUFJLDhEQUE4RCxLQUFLLElBQUksT0FBTztBQUNqRixlQUFPO0FBQUE7QUFHUixVQUFJLGVBQWUsS0FBSztBQUN2QixlQUFPO0FBQUE7QUFHUixhQUFPO0FBQUE7QUFHUiw2QkFBeUIsUUFBUTtBQUNoQyxZQUFNLFFBQVEsY0FBYyxRQUFRLFVBQVUsT0FBTztBQUNyRCxhQUFPLGVBQWU7QUFBQTtBQUd2QixZQUFPLFVBQVU7QUFBQSxNQUNoQixlQUFlO0FBQUEsTUFDZixRQUFRLGVBQWUsY0FBYyxNQUFNLElBQUksT0FBTztBQUFBLE1BQ3RELFFBQVEsZUFBZSxjQUFjLE1BQU0sSUFBSSxPQUFPO0FBQUE7QUFBQTtBQUFBOzs7QUNySXZEO0FBQUE7QUFJQSxRQUFNLE1BQU0sUUFBUTtBQUNwQixRQUFNLE9BQU8sUUFBUTtBQU1yQixZQUFRLE9BQU87QUFDZixZQUFRLE1BQU07QUFDZCxZQUFRLGFBQWE7QUFDckIsWUFBUSxPQUFPO0FBQ2YsWUFBUSxPQUFPO0FBQ2YsWUFBUSxZQUFZO0FBQ3BCLFlBQVEsVUFBVSxLQUFLLFVBQ3RCLE1BQU07QUFBQSxPQUNOO0FBT0QsWUFBUSxTQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBRWpDLFFBQUk7QUFHSCxZQUFNLGdCQUFnQjtBQUV0QixVQUFJLGlCQUFrQixlQUFjLFVBQVUsZUFBZSxTQUFTLEdBQUc7QUFDeEUsZ0JBQVEsU0FBUztBQUFBLFVBQ2hCO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUE7QUFBQTtBQUFBLGFBR00sT0FBUDtBQUFBO0FBVUYsWUFB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 +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbG9hZC1zY3JpcHQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RlZXBtZXJnZS9kaXN0L2Nqcy5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BhdHRlcm5zLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1wbGF5ZXIvbGF6eS9wbGF5ZXJzL1lvdVR1YmUuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BsYXllcnMvU291bmRDbG91ZC5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGxheWVycy9WaW1lby5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGxheWVycy9GYWNlYm9vay5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGxheWVycy9TdHJlYW1hYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1wbGF5ZXIvbGF6eS9wbGF5ZXJzL1dpc3RpYS5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGxheWVycy9Ud2l0Y2guanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BsYXllcnMvRGFpbHlNb3Rpb24uanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BsYXllcnMvTWl4Y2xvdWQuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BsYXllcnMvVmlkeWFyZC5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGxheWVycy9LYWx0dXJhLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1wbGF5ZXIvbGF6eS9wbGF5ZXJzL0ZpbGVQbGF5ZXIuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3BsYXllcnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21lbW9pemUtb25lL2Rpc3QvbWVtb2l6ZS1vbmUuY2pzLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1mYXN0LWNvbXBhcmUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1pcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCAibm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbGliL2hhcy5qcyIsICJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsICJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsICJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanMiLCAibm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L3Byb3BzLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1wbGF5ZXIvbGF6eS9QbGF5ZXIuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L1ByZXZpZXcuanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LXBsYXllci9sYXp5L1JlYWN0UGxheWVyLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1wbGF5ZXIvbGF6eS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMiLCAibm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyIsICJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2xpZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9kZXBkL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9ieXRlcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY29udGVudC10eXBlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zZXRwcm90b3R5cGVvZi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc3RhdHVzZXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCAibm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzLmpzIiwgIm5vZGVfbW9kdWxlcy90b2lkZW50aWZpZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtZXJyb3JzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2JvZHktcGFyc2VyL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvZGVidWcuanMiLCAibm9kZV9tb2R1bGVzL2JvZHktcGFyc2VyL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvYm9keS1wYXJzZXIvbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9ub2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kZXN0cm95L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zYWZlci1idWZmZXIvc2FmZXIuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvbGliL2JvbS1oYW5kbGluZy5qcyIsICJub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvaW50ZXJuYWwuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL3V0ZjE2LmpzIiwgIm5vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy91dGY3LmpzIiwgIm5vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy9zYmNzLWNvZGVjLmpzIiwgIm5vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy9zYmNzLWRhdGEuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL3NiY3MtZGF0YS1nZW5lcmF0ZWQuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL2RiY3MtY29kZWMuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL2RiY3MtZGF0YS5qcyIsICJub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvbGliL3N0cmVhbXMuanMiLCAibm9kZV9tb2R1bGVzL2ljb252LWxpdGUvbGliL2V4dGVuZC1ub2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9pY29udi1saXRlL2xpYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdW5waXBlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9yYXctYm9keS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZWUtZmlyc3QvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL29uLWZpbmlzaGVkL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvcmVhZC5qcyIsICJub2RlX21vZHVsZXMvbWVkaWEtdHlwZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21pbWUtZGIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21pbWUtdHlwZXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3R5cGUtaXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2JvZHktcGFyc2VyL2xpYi90eXBlcy9qc29uLmpzIiwgIm5vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvdHlwZXMvcmF3LmpzIiwgIm5vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvdHlwZXMvdGV4dC5qcyIsICJub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvc2hhbXMuanMiLCAibm9kZV9tb2R1bGVzL2hhcy1zeW1ib2xzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9oYXMtcHJvdG8vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW1wbGVtZW50YXRpb24uanMiLCAibm9kZV9tb2R1bGVzL2Z1bmN0aW9uLWJpbmQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2hhcy9zcmMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2dldC1pbnRyaW5zaWMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NhbGwtYmluZC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcyIsICJub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvdXRpbC5pbnNwZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9vYmplY3QtaW5zcGVjdC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc2lkZS1jaGFubmVsL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qcyIsICJub2RlX21vZHVsZXMvcXMvbGliL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwgIm5vZGVfbW9kdWxlcy9xcy9saWIvcGFyc2UuanMiLCAibm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYm9keS1wYXJzZXIvbGliL3R5cGVzL3VybGVuY29kZWQuanMiLCAibm9kZV9tb2R1bGVzL2JvZHktcGFyc2VyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9tZXJnZS1kZXNjcmlwdG9ycy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmluYWxoYW5kbGVyL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmluYWxoYW5kbGVyL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvZGVidWcuanMiLCAibm9kZV9tb2R1bGVzL2ZpbmFsaGFuZGxlci9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCAibm9kZV9tb2R1bGVzL2ZpbmFsaGFuZGxlci9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL2ZpbmFsaGFuZGxlci9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9lbmNvZGV1cmwvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2VzY2FwZS1odG1sL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9wYXJzZXVybC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmluYWxoYW5kbGVyL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2RlYnVnLmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL2V4cHJlc3Mvbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYXJyYXktZmxhdHRlbi9hcnJheS1mbGF0dGVuLmpzIiwgIm5vZGVfbW9kdWxlcy9wYXRoLXRvLXJlZ2V4cC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvcm91dGVyL2xheWVyLmpzIiwgIm5vZGVfbW9kdWxlcy9tZXRob2RzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9yb3V0ZXIvcm91dGUuanMiLCAibm9kZV9tb2R1bGVzL3V0aWxzLW1lcmdlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9yb3V0ZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL21pZGRsZXdhcmUvaW5pdC5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvbWlkZGxld2FyZS9xdWVyeS5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvdmlldy5qcyIsICJub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NvbnRlbnQtZGlzcG9zaXRpb24vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3NlbmQvbm9kZV9tb2R1bGVzL2RlYnVnL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc2VuZC9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2RlYnVnLmpzIiwgIm5vZGVfbW9kdWxlcy9zZW5kL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICJub2RlX21vZHVsZXMvc2VuZC9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL3NlbmQvbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXRhZy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZnJlc2gvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL21pbWUvbWltZS5qcyIsICJub2RlX21vZHVsZXMvc2VuZC9ub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3JhbmdlLXBhcnNlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvc2VuZC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZm9yd2FyZGVkL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9pcGFkZHIuanMvbGliL2lwYWRkci5qcyIsICJub2RlX21vZHVsZXMvcHJveHktYWRkci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL2FwcGxpY2F0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9uZWdvdGlhdG9yL2xpYi9jaGFyc2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9uZWdvdGlhdG9yL2xpYi9lbmNvZGluZy5qcyIsICJub2RlX21vZHVsZXMvbmVnb3RpYXRvci9saWIvbGFuZ3VhZ2UuanMiLCAibm9kZV9tb2R1bGVzL25lZ290aWF0b3IvbGliL21lZGlhVHlwZS5qcyIsICJub2RlX21vZHVsZXMvbmVnb3RpYXRvci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYWNjZXB0cy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvcmVxdWVzdC5qcyIsICJub2RlX21vZHVsZXMvY29va2llLXNpZ25hdHVyZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY29va2llL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy92YXJ5L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9yZXNwb25zZS5qcyIsICJub2RlX21vZHVsZXMvc2VydmUtc3RhdGljL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9leHByZXNzLmpzIiwgIm5vZGVfbW9kdWxlcy9leHByZXNzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kZXRlY3QtZmlsZS1lbmNvZGluZy1hbmQtbGFuZ3VhZ2Uvc3JjL2NvbXBvbmVudHMvY2hlY2tVVEYuanMiLCAibm9kZV9tb2R1bGVzL2RldGVjdC1maWxlLWVuY29kaW5nLWFuZC1sYW5ndWFnZS9zcmMvY29uZmlnL2xhbmd1YWdlT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9kZXRlY3QtZmlsZS1lbmNvZGluZy1hbmQtbGFuZ3VhZ2Uvc3JjL2NvbXBvbmVudHMvcHJvY2Vzc2luZy1jb250ZW50L2NvdW50QWxsTWF0Y2hlcy5qcyIsICJub2RlX21vZHVsZXMvZGV0ZWN0LWZpbGUtZW5jb2RpbmctYW5kLWxhbmd1YWdlL3NyYy9jb21wb25lbnRzL3Byb2Nlc3NpbmctY29udGVudC9jYWxjdWxhdGVDb25maWRlbmNlU2NvcmUuanMiLCAibm9kZV9tb2R1bGVzL2RldGVjdC1maWxlLWVuY29kaW5nLWFuZC1sYW5ndWFnZS9zcmMvY29uZmlnL2J5dGVPcmRlck1hcmtPYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2RldGVjdC1maWxlLWVuY29kaW5nLWFuZC1sYW5ndWFnZS9zcmMvY29tcG9uZW50cy9wcm9jZXNzQ29udGVudC5qcyIsICJub2RlX21vZHVsZXMvZGV0ZWN0LWZpbGUtZW5jb2RpbmctYW5kLWxhbmd1YWdlL3NyYy9jb21wb25lbnRzL2NoZWNrQnl0ZU9yZGVyTWFyay5qcyIsICJub2RlX21vZHVsZXMvZGV0ZWN0LWZpbGUtZW5jb2RpbmctYW5kLWxhbmd1YWdlL3NyYy9pbmRleC1ub2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9yZXF1aXJlcy1wb3J0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5L2xpYi9odHRwLXByb3h5L2NvbW1vbi5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS9saWIvaHR0cC1wcm94eS9wYXNzZXMvd2ViLW91dGdvaW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsICJub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCAibm9kZV9tb2R1bGVzL2hhcy1mbGFnL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9zdXBwb3J0cy1jb2xvci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanMiLCAibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZm9sbG93LXJlZGlyZWN0cy9kZWJ1Zy5qcyIsICJub2RlX21vZHVsZXMvZm9sbG93LXJlZGlyZWN0cy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS9saWIvaHR0cC1wcm94eS9wYXNzZXMvd2ViLWluY29taW5nLmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5L2xpYi9odHRwLXByb3h5L3Bhc3Nlcy93cy1pbmNvbWluZy5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS9saWIvaHR0cC1wcm94eS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS9saWIvaHR0cC1wcm94eS5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9lcnJvcnMuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtcHJveHktbWlkZGxld2FyZS9kaXN0L2xvZ2dlci5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS1taWRkbGV3YXJlL2Rpc3QvY29uZmlnLWZhY3RvcnkuanMiLCAibm9kZV9tb2R1bGVzL2lzLWV4dGdsb2IvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2lzLWdsb2IvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvc3RyaW5naWZ5LmpzIiwgIm5vZGVfbW9kdWxlcy9pcy1udW1iZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3RvLXJlZ2V4LXJhbmdlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9maWxsLXJhbmdlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9icmFjZXMvbGliL2NvbXBpbGUuanMiLCAibm9kZV9tb2R1bGVzL2JyYWNlcy9saWIvZXhwYW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9icmFjZXMvbGliL2NvbnN0YW50cy5qcyIsICJub2RlX21vZHVsZXMvYnJhY2VzL2xpYi9wYXJzZS5qcyIsICJub2RlX21vZHVsZXMvYnJhY2VzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL2NvbnN0YW50cy5qcyIsICJub2RlX21vZHVsZXMvcGljb21hdGNoL2xpYi91dGlscy5qcyIsICJub2RlX21vZHVsZXMvcGljb21hdGNoL2xpYi9zY2FuLmpzIiwgIm5vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9waWNvbWF0Y2gvbGliL3BpY29tYXRjaC5qcyIsICJub2RlX21vZHVsZXMvcGljb21hdGNoL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9taWNyb21hdGNoL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9jb250ZXh0LW1hdGNoZXIuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtcHJveHktbWlkZGxld2FyZS9kaXN0L19oYW5kbGVycy5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS1taWRkbGV3YXJlL2Rpc3QvcGF0aC1yZXdyaXRlci5qcyIsICJub2RlX21vZHVsZXMvaHR0cC1wcm94eS1taWRkbGV3YXJlL2Rpc3Qvcm91dGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9odHRwLXByb3h5LW1pZGRsZXdhcmUuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtcHJveHktbWlkZGxld2FyZS9kaXN0L2hhbmRsZXJzL3Jlc3BvbnNlLWludGVyY2VwdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9oYW5kbGVycy9maXgtcmVxdWVzdC1ib2R5LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9oYW5kbGVycy9wdWJsaWMuanMiLCAibm9kZV9tb2R1bGVzL2h0dHAtcHJveHktbWlkZGxld2FyZS9kaXN0L2hhbmRsZXJzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LW1pZGRsZXdhcmUvZGlzdC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMveG1sL2xpYi9lc2NhcGVGb3JYTUwuanMiLCAibm9kZV9tb2R1bGVzL3htbC9saWIveG1sLmpzIiwgIm1haW4udHMiLCAidmlldy9WaWRlb1ZpZXcudHN4IiwgInZpZXcvVmlkZW9Db250YWluZXIudHN4IiwgInNldHRpbmdzLnRzIiwgImhhbmRsZXJzL3NlcnZlci50cyIsICJoYW5kbGVycy9iaWxpYmlsaS50cyIsICJoYW5kbGVycy9taXNjLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4ndXNlIHN0cmljdCc7dmFyIGw9U3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIiksbj1TeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLHA9U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLHE9U3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpLHI9U3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLHQ9U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpLHU9U3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIiksdj1TeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksdz1TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIikseD1TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKSx5PVN5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpLHo9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIEEoYSl7aWYobnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYSlyZXR1cm4gbnVsbDthPXomJmFbel18fGFbXCJAQGl0ZXJhdG9yXCJdO3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhP2E6bnVsbH1cbnZhciBCPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxDPU9iamVjdC5hc3NpZ24sRD17fTtmdW5jdGlvbiBFKGEsYixlKXt0aGlzLnByb3BzPWE7dGhpcy5jb250ZXh0PWI7dGhpcy5yZWZzPUQ7dGhpcy51cGRhdGVyPWV8fEJ9RS5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fTtcbkUucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGEsYil7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBhJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSYmbnVsbCE9YSl0aHJvdyBFcnJvcihcInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLlwiKTt0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsYSxiLFwic2V0U3RhdGVcIil9O0UucHJvdG90eXBlLmZvcmNlVXBkYXRlPWZ1bmN0aW9uKGEpe3RoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcyxhLFwiZm9yY2VVcGRhdGVcIil9O2Z1bmN0aW9uIEYoKXt9Ri5wcm90b3R5cGU9RS5wcm90b3R5cGU7ZnVuY3Rpb24gRyhhLGIsZSl7dGhpcy5wcm9wcz1hO3RoaXMuY29udGV4dD1iO3RoaXMucmVmcz1EO3RoaXMudXBkYXRlcj1lfHxCfXZhciBIPUcucHJvdG90eXBlPW5ldyBGO1xuSC5jb25zdHJ1Y3Rvcj1HO0MoSCxFLnByb3RvdHlwZSk7SC5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgST1BcnJheS5pc0FycmF5LEo9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxLPXtjdXJyZW50Om51bGx9LEw9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIE0oYSxiLGUpe3ZhciBkLGM9e30saz1udWxsLGg9bnVsbDtpZihudWxsIT1iKWZvcihkIGluIHZvaWQgMCE9PWIucmVmJiYoaD1iLnJlZiksdm9pZCAwIT09Yi5rZXkmJihrPVwiXCIrYi5rZXkpLGIpSi5jYWxsKGIsZCkmJiFMLmhhc093blByb3BlcnR5KGQpJiYoY1tkXT1iW2RdKTt2YXIgZz1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWcpYy5jaGlsZHJlbj1lO2Vsc2UgaWYoMTxnKXtmb3IodmFyIGY9QXJyYXkoZyksbT0wO208ZzttKyspZlttXT1hcmd1bWVudHNbbSsyXTtjLmNoaWxkcmVuPWZ9aWYoYSYmYS5kZWZhdWx0UHJvcHMpZm9yKGQgaW4gZz1hLmRlZmF1bHRQcm9wcyxnKXZvaWQgMD09PWNbZF0mJihjW2RdPWdbZF0pO3JldHVybnskJHR5cGVvZjpsLHR5cGU6YSxrZXk6ayxyZWY6aCxwcm9wczpjLF9vd25lcjpLLmN1cnJlbnR9fVxuZnVuY3Rpb24gTihhLGIpe3JldHVybnskJHR5cGVvZjpsLHR5cGU6YS50eXBlLGtleTpiLHJlZjphLnJlZixwcm9wczphLnByb3BzLF9vd25lcjphLl9vd25lcn19ZnVuY3Rpb24gTyhhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09bH1mdW5jdGlvbiBlc2NhcGUoYSl7dmFyIGI9e1wiPVwiOlwiPTBcIixcIjpcIjpcIj0yXCJ9O3JldHVyblwiJFwiK2EucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfSl9dmFyIFA9L1xcLysvZztmdW5jdGlvbiBRKGEsYil7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmbnVsbCE9YS5rZXk/ZXNjYXBlKFwiXCIrYS5rZXkpOmIudG9TdHJpbmcoMzYpfVxuZnVuY3Rpb24gUihhLGIsZSxkLGMpe3ZhciBrPXR5cGVvZiBhO2lmKFwidW5kZWZpbmVkXCI9PT1rfHxcImJvb2xlYW5cIj09PWspYT1udWxsO3ZhciBoPSExO2lmKG51bGw9PT1hKWg9ITA7ZWxzZSBzd2l0Y2goayl7Y2FzZSBcInN0cmluZ1wiOmNhc2UgXCJudW1iZXJcIjpoPSEwO2JyZWFrO2Nhc2UgXCJvYmplY3RcIjpzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSBsOmNhc2UgbjpoPSEwfX1pZihoKXJldHVybiBoPWEsYz1jKGgpLGE9XCJcIj09PWQ/XCIuXCIrUShoLDApOmQsSShjKT8oZT1cIlwiLG51bGwhPWEmJihlPWEucmVwbGFjZShQLFwiJCYvXCIpK1wiL1wiKSxSKGMsYixlLFwiXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGF9KSk6bnVsbCE9YyYmKE8oYykmJihjPU4oYyxlKyghYy5rZXl8fGgmJmgua2V5PT09Yy5rZXk/XCJcIjooXCJcIitjLmtleSkucmVwbGFjZShQLFwiJCYvXCIpK1wiL1wiKSthKSksYi5wdXNoKGMpKSwxO2g9MDtkPVwiXCI9PT1kP1wiLlwiOmQrXCI6XCI7aWYoSShhKSlmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl7az1cbmFbZ107dmFyIGY9ZCtRKGssZyk7aCs9UihrLGIsZSxmLGMpfWVsc2UgaWYoZj1BKGEpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmKWZvcihhPWYuY2FsbChhKSxnPTA7IShrPWEubmV4dCgpKS5kb25lOylrPWsudmFsdWUsZj1kK1EoayxnKyspLGgrPVIoayxiLGUsZixjKTtlbHNlIGlmKFwib2JqZWN0XCI9PT1rKXRocm93IGI9U3RyaW5nKGEpLEVycm9yKFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIisoXCJbb2JqZWN0IE9iamVjdF1cIj09PWI/XCJvYmplY3Qgd2l0aCBrZXlzIHtcIitPYmplY3Qua2V5cyhhKS5qb2luKFwiLCBcIikrXCJ9XCI6YikrXCIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuXCIpO3JldHVybiBofVxuZnVuY3Rpb24gUyhhLGIsZSl7aWYobnVsbD09YSlyZXR1cm4gYTt2YXIgZD1bXSxjPTA7UihhLGQsXCJcIixcIlwiLGZ1bmN0aW9uKGEpe3JldHVybiBiLmNhbGwoZSxhLGMrKyl9KTtyZXR1cm4gZH1mdW5jdGlvbiBUKGEpe2lmKC0xPT09YS5fc3RhdHVzKXt2YXIgYj1hLl9yZXN1bHQ7Yj1iKCk7Yi50aGVuKGZ1bmN0aW9uKGIpe2lmKDA9PT1hLl9zdGF0dXN8fC0xPT09YS5fc3RhdHVzKWEuX3N0YXR1cz0xLGEuX3Jlc3VsdD1ifSxmdW5jdGlvbihiKXtpZigwPT09YS5fc3RhdHVzfHwtMT09PWEuX3N0YXR1cylhLl9zdGF0dXM9MixhLl9yZXN1bHQ9Yn0pOy0xPT09YS5fc3RhdHVzJiYoYS5fc3RhdHVzPTAsYS5fcmVzdWx0PWIpfWlmKDE9PT1hLl9zdGF0dXMpcmV0dXJuIGEuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IGEuX3Jlc3VsdDt9XG52YXIgVT17Y3VycmVudDpudWxsfSxWPXt0cmFuc2l0aW9uOm51bGx9LFc9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6VSxSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzpWLFJlYWN0Q3VycmVudE93bmVyOkt9O2V4cG9ydHMuQ2hpbGRyZW49e21hcDpTLGZvckVhY2g6ZnVuY3Rpb24oYSxiLGUpe1MoYSxmdW5jdGlvbigpe2IuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlKX0sY291bnQ6ZnVuY3Rpb24oYSl7dmFyIGI9MDtTKGEsZnVuY3Rpb24oKXtiKyt9KTtyZXR1cm4gYn0sdG9BcnJheTpmdW5jdGlvbihhKXtyZXR1cm4gUyhhLGZ1bmN0aW9uKGEpe3JldHVybiBhfSl8fFtdfSxvbmx5OmZ1bmN0aW9uKGEpe2lmKCFPKGEpKXRocm93IEVycm9yKFwiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuXCIpO3JldHVybiBhfX07ZXhwb3J0cy5Db21wb25lbnQ9RTtleHBvcnRzLkZyYWdtZW50PXA7XG5leHBvcnRzLlByb2ZpbGVyPXI7ZXhwb3J0cy5QdXJlQ29tcG9uZW50PUc7ZXhwb3J0cy5TdHJpY3RNb2RlPXE7ZXhwb3J0cy5TdXNwZW5zZT13O2V4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9VztcbmV4cG9ydHMuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGEsYixlKXtpZihudWxsPT09YXx8dm9pZCAwPT09YSl0aHJvdyBFcnJvcihcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiK2ErXCIuXCIpO3ZhciBkPUMoe30sYS5wcm9wcyksYz1hLmtleSxrPWEucmVmLGg9YS5fb3duZXI7aWYobnVsbCE9Yil7dm9pZCAwIT09Yi5yZWYmJihrPWIucmVmLGg9Sy5jdXJyZW50KTt2b2lkIDAhPT1iLmtleSYmKGM9XCJcIitiLmtleSk7aWYoYS50eXBlJiZhLnR5cGUuZGVmYXVsdFByb3BzKXZhciBnPWEudHlwZS5kZWZhdWx0UHJvcHM7Zm9yKGYgaW4gYilKLmNhbGwoYixmKSYmIUwuaGFzT3duUHJvcGVydHkoZikmJihkW2ZdPXZvaWQgMD09PWJbZl0mJnZvaWQgMCE9PWc/Z1tmXTpiW2ZdKX12YXIgZj1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWYpZC5jaGlsZHJlbj1lO2Vsc2UgaWYoMTxmKXtnPUFycmF5KGYpO1xuZm9yKHZhciBtPTA7bTxmO20rKylnW21dPWFyZ3VtZW50c1ttKzJdO2QuY2hpbGRyZW49Z31yZXR1cm57JCR0eXBlb2Y6bCx0eXBlOmEudHlwZSxrZXk6YyxyZWY6ayxwcm9wczpkLF9vd25lcjpofX07ZXhwb3J0cy5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGEpe2E9eyQkdHlwZW9mOnUsX2N1cnJlbnRWYWx1ZTphLF9jdXJyZW50VmFsdWUyOmEsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsLF9kZWZhdWx0VmFsdWU6bnVsbCxfZ2xvYmFsTmFtZTpudWxsfTthLlByb3ZpZGVyPXskJHR5cGVvZjp0LF9jb250ZXh0OmF9O3JldHVybiBhLkNvbnN1bWVyPWF9O2V4cG9ydHMuY3JlYXRlRWxlbWVudD1NO2V4cG9ydHMuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihhKXt2YXIgYj1NLmJpbmQobnVsbCxhKTtiLnR5cGU9YTtyZXR1cm4gYn07ZXhwb3J0cy5jcmVhdGVSZWY9ZnVuY3Rpb24oKXtyZXR1cm57Y3VycmVudDpudWxsfX07XG5leHBvcnRzLmZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJueyQkdHlwZW9mOnYscmVuZGVyOmF9fTtleHBvcnRzLmlzVmFsaWRFbGVtZW50PU87ZXhwb3J0cy5sYXp5PWZ1bmN0aW9uKGEpe3JldHVybnskJHR5cGVvZjp5LF9wYXlsb2FkOntfc3RhdHVzOi0xLF9yZXN1bHQ6YX0sX2luaXQ6VH19O2V4cG9ydHMubWVtbz1mdW5jdGlvbihhLGIpe3JldHVybnskJHR5cGVvZjp4LHR5cGU6YSxjb21wYXJlOnZvaWQgMD09PWI/bnVsbDpifX07ZXhwb3J0cy5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oYSl7dmFyIGI9Vi50cmFuc2l0aW9uO1YudHJhbnNpdGlvbj17fTt0cnl7YSgpfWZpbmFsbHl7Vi50cmFuc2l0aW9uPWJ9fTtleHBvcnRzLnVuc3RhYmxlX2FjdD1mdW5jdGlvbigpe3Rocm93IEVycm9yKFwiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC5cIik7fTtcbmV4cG9ydHMudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUNhbGxiYWNrKGEsYil9O2V4cG9ydHMudXNlQ29udGV4dD1mdW5jdGlvbihhKXtyZXR1cm4gVS5jdXJyZW50LnVzZUNvbnRleHQoYSl9O2V4cG9ydHMudXNlRGVidWdWYWx1ZT1mdW5jdGlvbigpe307ZXhwb3J0cy51c2VEZWZlcnJlZFZhbHVlPWZ1bmN0aW9uKGEpe3JldHVybiBVLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShhKX07ZXhwb3J0cy51c2VFZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUVmZmVjdChhLGIpfTtleHBvcnRzLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIFUuY3VycmVudC51c2VJZCgpfTtleHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oYSxiLGUpe3JldHVybiBVLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShhLGIsZSl9O1xuZXhwb3J0cy51c2VJbnNlcnRpb25FZmZlY3Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChhLGIpfTtleHBvcnRzLnVzZUxheW91dEVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBVLmN1cnJlbnQudXNlTGF5b3V0RWZmZWN0KGEsYil9O2V4cG9ydHMudXNlTWVtbz1mdW5jdGlvbihhLGIpe3JldHVybiBVLmN1cnJlbnQudXNlTWVtbyhhLGIpfTtleHBvcnRzLnVzZVJlZHVjZXI9ZnVuY3Rpb24oYSxiLGUpe3JldHVybiBVLmN1cnJlbnQudXNlUmVkdWNlcihhLGIsZSl9O2V4cG9ydHMudXNlUmVmPWZ1bmN0aW9uKGEpe3JldHVybiBVLmN1cnJlbnQudXNlUmVmKGEpfTtleHBvcnRzLnVzZVN0YXRlPWZ1bmN0aW9uKGEpe3JldHVybiBVLmN1cnJlbnQudXNlU3RhdGUoYSl9O2V4cG9ydHMudXNlU3luY0V4dGVybmFsU3RvcmU9ZnVuY3Rpb24oYSxiLGUpe3JldHVybiBVLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUoYSxiLGUpfTtcbmV4cG9ydHMudXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiBVLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtleHBvcnRzLnZlcnNpb249XCIxOC4xLjBcIjtcbiIsICIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBSZWFjdFZlcnNpb24gPSAnMTguMS4wJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cbnZhciBlbmFibGVDYWNoZUVsZW1lbnQgPSBmYWxzZTtcbnZhciBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyA9IGZhbHNlOyAvLyBObyBrbm93biBidWdzLCBidXQgbmVlZHMgcGVyZm9ybWFuY2UgdGVzdGluZ1xuXG52YXIgZW5hYmxlTGVnYWN5SGlkZGVuID0gZmFsc2U7IC8vIEVuYWJsZXMgdW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgZmVhdHVyZSBpbiBGaWJlclxuLy8gc3R1ZmYuIEludGVuZGVkIHRvIGVuYWJsZSBSZWFjdCBjb3JlIG1lbWJlcnMgdG8gbW9yZSBlYXNpbHkgZGVidWcgc2NoZWR1bGluZ1xuLy8gaXNzdWVzIGluIERFViBidWlsZHMuXG5cbnZhciBlbmFibGVEZWJ1Z1RyYWNpbmcgPSBmYWxzZTsgLy8gVHJhY2sgd2hpY2ggRmliZXIocykgc2NoZWR1bGUgcmVuZGVyIHdvcmsuXG5cbi8vIEFUVEVOVElPTlxuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5wb3J0YWwnKTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3QucHJvZmlsZXInKTtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKTtcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3QubGF6eScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9ICBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBkaXNwYXRjaGVyLlxuICovXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGJhdGNoJ3MgY29uZmlndXJhdGlvbiBzdWNoIGFzIGhvdyBsb25nIGFuIHVwZGF0ZVxuICogc2hvdWxkIHN1c3BlbmQgZm9yIGlmIGl0IG5lZWRzIHRvLlxuICovXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcgPSB7XG4gIHRyYW5zaXRpb246IG51bGxcbn07XG5cbnZhciBSZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IHtcbiAgY3VycmVudDogbnVsbCxcbiAgLy8gVXNlZCB0byByZXByb2R1Y2UgYmVoYXZpb3Igb2YgYGJhdGNoZWRVcGRhdGVzYCBpbiBsZWdhY3kgbW9kZS5cbiAgaXNCYXRjaGluZ0xlZ2FjeTogZmFsc2UsXG4gIGRpZFNjaGVkdWxlTGVnYWN5VXBkYXRlOiBmYWxzZVxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xudmFyIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBudWxsO1xuZnVuY3Rpb24gc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKSB7XG4gIHtcbiAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gIH1cbn1cblxue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZSA9IGZ1bmN0aW9uIChzdGFjaykge1xuICAgIHtcbiAgICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgICB9XG4gIH07IC8vIFN0YWNrIGltcGxlbWVudGF0aW9uIGluamVjdGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyLlxuXG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhY2sgPSAnJzsgLy8gQWRkIGFuIGV4dHJhIHRvcCBmcmFtZSB3aGlsZSBhbiBlbGVtZW50IGlzIGJlaW5nIHZhbGlkYXRlZFxuXG4gICAgaWYgKGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUpIHtcbiAgICAgIHN0YWNrICs9IGN1cnJlbnRFeHRyYVN0YWNrRnJhbWU7XG4gICAgfSAvLyBEZWxlZ2F0ZSB0byB0aGUgaW5qZWN0ZWQgcmVuZGVyZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cblxuXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcblxuICAgIGlmIChpbXBsKSB7XG4gICAgICBzdGFjayArPSBpbXBsKCkgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyXG59O1xuXG57XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRBY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlO1xufVxuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cblxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICB2YXIgX2NvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnO1xuICAgIHZhciB3YXJuaW5nS2V5ID0gY29tcG9uZW50TmFtZSArIFwiLlwiICsgY2FsbGVyTmFtZTtcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlcnJvcihcIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuIFwiICsgJ1RoaXMgaXMgYSBuby1vcCwgYnV0IGl0IG1pZ2h0IGluZGljYXRlIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uICcgKyAnSW5zdGVhZCwgYXNzaWduIHRvIGB0aGlzLnN0YXRlYCBkaXJlY3RseSBvciBkZWZpbmUgYSBgc3RhdGUgPSB7fTtgICcgKyAnY2xhc3MgcHJvcGVydHkgd2l0aCB0aGUgZGVzaXJlZCBzdGF0ZSBpbiB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gdHJ1ZTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xuXG5cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG52YXIgYXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbkNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gIGlmICh0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGFydGlhbFN0YXRlICE9PSAnZnVuY3Rpb24nICYmIHBhcnRpYWxTdGF0ZSAhPSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhICcgKyAnZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLicpO1xuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbmFzc2lnbihwdXJlQ29tcG9uZW50UHJvdG90eXBlLCBDb21wb25lbnQucHJvdG90eXBlKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxuLypcbiAqIFRoZSBgJycgKyB2YWx1ZWAgcGF0dGVybiAodXNlZCBpbiBpbiBwZXJmLXNlbnNpdGl2ZSBjb2RlKSB0aHJvd3MgZm9yIFN5bWJvbFxuICogYW5kIFRlbXBvcmFsLiogdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMjA2NC5cbiAqXG4gKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHdpbGwgdGhyb3cgYW4gZWFzaWVyLXRvLXVuZGVyc3RhbmQsXG4gKiBlYXNpZXItdG8tZGVidWcgZXhjZXB0aW9uIHdpdGggYSBjbGVhciBlcnJvcnMgbWVzc2FnZSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlXG4gKiBwcm9ibGVtLiAoSW5zdGVhZCBvZiBhIGNvbmZ1c2luZyBleGNlcHRpb24gdGhyb3duIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBgdmFsdWVgIG9iamVjdCkuXG4gKi9cbi8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5mdW5jdGlvbiB0eXBlTmFtZSh2YWx1ZSkge1xuICB7XG4gICAgLy8gdG9TdHJpbmdUYWcgaXMgbmVlZGVkIGZvciBuYW1lc3BhY2VkIHR5cGVzIGxpa2UgVGVtcG9yYWwuSW5zdGFudFxuICAgIHZhciBoYXNUb1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLnRvU3RyaW5nVGFnO1xuICAgIHZhciB0eXBlID0gaGFzVG9TdHJpbmdUYWcgJiYgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8ICdPYmplY3QnO1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59IC8vICRGbG93Rml4TWUgb25seSBjYWxsZWQgaW4gREVWLCBzbyB2b2lkIHJldHVybiBpcyBub3QgcG9zc2libGUuXG5cblxuZnVuY3Rpb24gd2lsbENvZXJjaW9uVGhyb3codmFsdWUpIHtcbiAge1xuICAgIHRyeSB7XG4gICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgLy8gSWYgeW91IGVuZGVkIHVwIGhlcmUgYnkgZm9sbG93aW5nIGFuIGV4Y2VwdGlvbiBjYWxsIHN0YWNrLCBoZXJlJ3Mgd2hhdCdzXG4gIC8vIGhhcHBlbmVkOiB5b3Ugc3VwcGxpZWQgYW4gb2JqZWN0IG9yIHN5bWJvbCB2YWx1ZSB0byBSZWFjdCAoYXMgYSBwcm9wLCBrZXksXG4gIC8vIERPTSBhdHRyaWJ1dGUsIENTUyBwcm9wZXJ0eSwgc3RyaW5nIHJlZiwgZXRjLikgYW5kIHdoZW4gUmVhY3QgdHJpZWQgdG9cbiAgLy8gY29lcmNlIGl0IHRvIGEgc3RyaW5nIHVzaW5nIGAnJyArIHZhbHVlYCwgYW4gZXhjZXB0aW9uIHdhcyB0aHJvd24uXG4gIC8vXG4gIC8vIFRoZSBtb3N0IGNvbW1vbiB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgdGhpcyBleGNlcHRpb24gYXJlIGBTeW1ib2xgIGluc3RhbmNlc1xuICAvLyBhbmQgVGVtcG9yYWwgb2JqZWN0cyBsaWtlIGBUZW1wb3JhbC5JbnN0YW50YC4gQnV0IGFueSBvYmplY3QgdGhhdCBoYXMgYVxuICAvLyBgdmFsdWVPZmAgb3IgYFtTeW1ib2wudG9QcmltaXRpdmVdYCBtZXRob2QgdGhhdCB0aHJvd3Mgd2lsbCBhbHNvIGNhdXNlIHRoaXNcbiAgLy8gZXhjZXB0aW9uLiAoTGlicmFyeSBhdXRob3JzIGRvIHRoaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHVzaW5nIGJ1aWx0LWluXG4gIC8vIG51bWVyaWMgb3BlcmF0b3JzIGxpa2UgYCtgIG9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGxpa2UgYD49YCBiZWNhdXNlIGN1c3RvbVxuICAvLyBtZXRob2RzIGFyZSBuZWVkZWQgdG8gcGVyZm9ybSBhY2N1cmF0ZSBhcml0aG1ldGljIG9yIGNvbXBhcmlzb24uKVxuICAvL1xuICAvLyBUbyBmaXggdGhlIHByb2JsZW0sIGNvZXJjZSB0aGlzIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmcgYmVmb3JlXG4gIC8vIHBhc3NpbmcgaXQgdG8gUmVhY3QuIFRoZSBtb3N0IHJlbGlhYmxlIHdheSBpcyB1c3VhbGx5IGBTdHJpbmcodmFsdWUpYC5cbiAgLy9cbiAgLy8gVG8gZmluZCB3aGljaCB2YWx1ZSBpcyB0aHJvd2luZywgY2hlY2sgdGhlIGJyb3dzZXIgb3IgZGVidWdnZXIgY29uc29sZS5cbiAgLy8gQmVmb3JlIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24sIHRoZXJlIHNob3VsZCBiZSBgY29uc29sZS5lcnJvcmAgb3V0cHV0XG4gIC8vIHRoYXQgc2hvd3MgdGhlIHR5cGUgKFN5bWJvbCwgVGVtcG9yYWwuUGxhaW5EYXRlLCBldGMuKSB0aGF0IGNhdXNlZCB0aGVcbiAgLy8gcHJvYmxlbSBhbmQgaG93IHRoYXQgdHlwZSB3YXMgdXNlZDoga2V5LCBhdHJyaWJ1dGUsIGlucHV0IHZhbHVlIHByb3AsIGV0Yy5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBjb25zb2xlIG91dHB1dCBhbHNvIHNob3dzIHRoZSBjb21wb25lbnQgYW5kIGl0c1xuICAvLyBhbmNlc3RvciBjb21wb25lbnRzIHdoZXJlIHRoZSBleGNlcHRpb24gaGFwcGVuZWQuXG4gIC8vXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biwgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgY29uZmlnLl9fc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gY29uZmlnLl9fc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjcmVhdGVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gIHZhciBwcm9wcyA9IHt9O1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG5cbiAgICAgIHtcbiAgICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KTtcbiAgICAgIH1cblxuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIiArIGVsZW1lbnQgKyBcIi5cIik7XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBhc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAge1xuICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuXG5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0ga2V5LnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcblxuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgZWxlbWVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IEEgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEtleShlbGVtZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJiBlbGVtZW50ICE9PSBudWxsICYmIGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICB7XG4gICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXNjYXBlKCcnICsgZWxlbWVudC5rZXkpO1xuICB9IC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG5cblxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgc3dpdGNoIChjaGlsZHJlbi4kJHR5cGVvZikge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgIHZhciBfY2hpbGQgPSBjaGlsZHJlbjtcbiAgICB2YXIgbWFwcGVkQ2hpbGQgPSBjYWxsYmFjayhfY2hpbGQpOyAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3M6XG5cbiAgICB2YXIgY2hpbGRLZXkgPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0RWxlbWVudEtleShfY2hpbGQsIDApIDogbmFtZVNvRmFyO1xuXG4gICAgaWYgKGlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgICB2YXIgZXNjYXBlZENoaWxkS2V5ID0gJyc7XG5cbiAgICAgIGlmIChjaGlsZEtleSAhPSBudWxsKSB7XG4gICAgICAgIGVzY2FwZWRDaGlsZEtleSA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShjaGlsZEtleSkgKyAnLyc7XG4gICAgICB9XG5cbiAgICAgIG1hcEludG9BcnJheShtYXBwZWRDaGlsZCwgYXJyYXksIGVzY2FwZWRDaGlsZEtleSwgJycsIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBUaGUgYGlmYCBzdGF0ZW1lbnQgaGVyZSBwcmV2ZW50cyBhdXRvLWRpc2FibGluZyBvZiB0aGUgc2FmZVxuICAgICAgICAgIC8vIGNvZXJjaW9uIEVTTGludCBydWxlLCBzbyB3ZSBtdXN0IG1hbnVhbGx5IGRpc2FibGUgaXQgYmVsb3cuXG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgICAgaWYgKG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpKSB7XG4gICAgICAgICAgICBjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1hcHBlZENoaWxkLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAgICBlc2NhcGVkUHJlZml4ICsgKCAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgbWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkgPyAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIGV4aXN0aW5nIGVsZW1lbnQncyBrZXkgY2FuIGJlIGEgbnVtYmVyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoJycgKyBtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgICAgfVxuXG4gICAgICBhcnJheS5wdXNoKG1hcHBlZENoaWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cblxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGl0ZXJhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGl0ZXJhYmxlQ2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgICAgd2FybignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlQ2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaWkgPSAwO1xuXG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKSB7XG4gIC8vIFRPRE86IFNlY29uZCBhcmd1bWVudCB1c2VkIHRvIGJlIGFuIG9wdGlvbmFsIGBjYWxjdWxhdGVDaGFuZ2VkQml0c2BcbiAgLy8gZnVuY3Rpb24uIFdhcm4gdG8gcmVzZXJ2ZSBmb3IgZnV0dXJlIHVzZT9cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsLFxuICAgIC8vIEFkZCB0aGVzZSB0byB1c2Ugc2FtZSBoaWRkZW4gY2xhc3MgaW4gVk0gYXMgU2VydmVyQ29udGV4dFxuICAgIF9kZWZhdWx0VmFsdWU6IG51bGwsXG4gICAgX2dsb2JhbE5hbWU6IG51bGxcbiAgfTtcbiAgY29udGV4dC5Qcm92aWRlciA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfUFJPVklERVJfVFlQRSxcbiAgICBfY29udGV4dDogY29udGV4dFxuICB9O1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IGZhbHNlO1xuXG4gIHtcbiAgICAvLyBBIHNlcGFyYXRlIG9iamVjdCwgYnV0IHByb3hpZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBvYmplY3QgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5XG4gICAgLy8gd2FybiBmb3IgdGhlIGluY29ycmVjdCB1c2FnZSBvZiBDb250ZXh0IGFzIGEgQ29uc3VtZXIuXG4gICAgdmFyIENvbnN1bWVyID0ge1xuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0XG4gICAgfTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbm90IHNldHRpbmcgYSB2YWx1ZSwgd2hpY2ggaXMgaW50ZW50aW9uYWwgaGVyZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ29uc3VtZXIsIHtcbiAgICAgIFByb3ZpZGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Qcm92aWRlcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX1Byb3ZpZGVyKSB7XG4gICAgICAgICAgY29udGV4dC5Qcm92aWRlciA9IF9Qcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IF9jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlMjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlMjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZTIpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfdGhyZWFkQ291bnQ6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3RocmVhZENvdW50O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfdGhyZWFkQ291bnQpIHtcbiAgICAgICAgICBjb250ZXh0Ll90aHJlYWRDb3VudCA9IF90aHJlYWRDb3VudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIENvbnN1bWVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Db25zdW1lcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Db25zdW1lcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlOYW1lOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpc3BsYXlOYW1lO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIpIHtcbiAgICAgICAgICAgIHdhcm4oJ1NldHRpbmcgYGRpc3BsYXlOYW1lYCBvbiBDb250ZXh0LkNvbnN1bWVyIGhhcyBubyBlZmZlY3QuICcgKyBcIllvdSBzaG91bGQgc2V0IGl0IGRpcmVjdGx5IG9uIHRoZSBjb250ZXh0IHdpdGggQ29udGV4dC5kaXNwbGF5TmFtZSA9ICclcycuXCIsIGRpc3BsYXlOYW1lKTtcblxuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pOyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBtaXNzaW5nIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgZGVmaW5lUHJvcGVydHlcblxuICAgIGNvbnRleHQuQ29uc3VtZXIgPSBDb25zdW1lcjtcbiAgfVxuXG4gIHtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBudWxsO1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlcjIgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbnZhciBVbmluaXRpYWxpemVkID0gLTE7XG52YXIgUGVuZGluZyA9IDA7XG52YXIgUmVzb2x2ZWQgPSAxO1xudmFyIFJlamVjdGVkID0gMjtcblxuZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgIHZhciB0aGVuYWJsZSA9IGN0b3IoKTsgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAvLyBUaGlzIG1pZ2h0IHRocm93IGVpdGhlciBiZWNhdXNlIGl0J3MgbWlzc2luZyBvciB0aHJvd3MuIElmIHNvLCB3ZSB0cmVhdCBpdFxuICAgIC8vIGFzIHN0aWxsIHVuaW5pdGlhbGl6ZWQgYW5kIHRyeSBhZ2FpbiBuZXh0IHRpbWUuIFdoaWNoIGlzIHRoZSBzYW1lIGFzIHdoYXRcbiAgICAvLyBoYXBwZW5zIGlmIHRoZSBjdG9yIG9yIGFueSB3cmFwcGVycyBwcm9jZXNzaW5nIHRoZSBjdG9yIHRocm93cy4gVGhpcyBtaWdodFxuICAgIC8vIGVuZCB1cCBmaXhpbmcgaXQgaWYgdGhlIHJlc29sdXRpb24gd2FzIGEgY29uY3VycmVuY3kgYnVnLlxuXG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZXNvbHZlZC5fc3RhdHVzID0gUmVzb2x2ZWQ7XG4gICAgICAgIHJlc29sdmVkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3Q7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nIHx8IHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZWplY3RlZC5fc3RhdHVzID0gUmVqZWN0ZWQ7XG4gICAgICAgIHJlamVjdGVkLl9yZXN1bHQgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIC8vIEluIGNhc2UsIHdlJ3JlIHN0aWxsIHVuaW5pdGlhbGl6ZWQsIHRoZW4gd2UncmUgd2FpdGluZyBmb3IgdGhlIHRoZW5hYmxlXG4gICAgICAvLyB0byByZXNvbHZlLiBTZXQgaXQgYXMgcGVuZGluZyBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICB2YXIgcGVuZGluZyA9IHBheWxvYWQ7XG4gICAgICBwZW5kaW5nLl9zdGF0dXMgPSBQZW5kaW5nO1xuICAgICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUmVzb2x2ZWQpIHtcbiAgICB2YXIgbW9kdWxlT2JqZWN0ID0gcGF5bG9hZC5fcmVzdWx0O1xuXG4gICAge1xuICAgICAgaWYgKG1vZHVsZU9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXAnICsgJ29ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2NvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXAnICsgXCJvcnQoJy4vTXlDb21wb25lbnQnKSlcXG5cXG5cIiArICdEaWQgeW91IGFjY2lkZW50YWxseSBwdXQgY3VybHkgYnJhY2VzIGFyb3VuZCB0aGUgaW1wb3J0PycsIG1vZHVsZU9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKCEoJ2RlZmF1bHQnIGluIG1vZHVsZU9iamVjdCkpIHtcbiAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcCcgKyAnb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb2R1bGVPYmplY3QuZGVmYXVsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBwYXlsb2FkLl9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBwYXlsb2FkID0ge1xuICAgIC8vIFdlIHVzZSB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC5cbiAgICBfc3RhdHVzOiBVbmluaXRpYWxpemVkLFxuICAgIF9yZXN1bHQ6IGN0b3JcbiAgfTtcbiAgdmFyIGxhenlUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9MQVpZX1RZUEUsXG4gICAgX3BheWxvYWQ6IHBheWxvYWQsXG4gICAgX2luaXQ6IGxhenlJbml0aWFsaXplclxuICB9O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICB2YXIgcHJvcFR5cGVzOyAvLyAkRmxvd0ZpeE1lXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsYXp5VHlwZSwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9wcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3RGVmYXVsdFByb3BzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYGRlZmF1bHRQcm9wc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIGRlZmF1bHRQcm9wcyA9IG5ld0RlZmF1bHRQcm9wczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAnZGVmYXVsdFByb3BzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvcFR5cGVzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BUeXBlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJvcFR5cGVzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIHByb3BUeXBlcyA9IG5ld1Byb3BUeXBlczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAncHJvcFR5cGVzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbGF6eVR5cGU7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSZWYocmVuZGVyKSB7XG4gIHtcbiAgICBpZiAocmVuZGVyICE9IG51bGwgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCAnICsgJ2NvbXBvbmVudC4gSW5zdGVhZCBvZiBmb3J3YXJkUmVmKG1lbW8oLi4uKSksIHVzZSAnICsgJ21lbW8oZm9yd2FyZFJlZiguLi4pKS4nKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuJywgcmVuZGVyID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHJlbmRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZW5kZXIubGVuZ3RoICE9PSAwICYmIHJlbmRlci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBhY2NlcHQgZXhhY3RseSB0d28gcGFyYW1ldGVyczogcHJvcHMgYW5kIHJlZi4gJXMnLCByZW5kZXIubGVuZ3RoID09PSAxID8gJ0RpZCB5b3UgZm9yZ2V0IHRvIHVzZSB0aGUgcmVmIHBhcmFtZXRlcj8nIDogJ0FueSBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyICE9IG51bGwpIHtcbiAgICAgIGlmIChyZW5kZXIuZGVmYXVsdFByb3BzICE9IG51bGwgfHwgcmVuZGVyLnByb3BUeXBlcyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgZG8gbm90IHN1cHBvcnQgcHJvcFR5cGVzIG9yIGRlZmF1bHRQcm9wcy4gJyArICdEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIGEgUmVhY3QgY29tcG9uZW50PycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICByZW5kZXI6IHJlbmRlclxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0LmZvcndhcmRSZWYoKHByb3BzLCByZWYpID0+IHsuLi59KTtcbiAgICAgICAgLy8gVGhpcyBraW5kIG9mIGlubmVyIGZ1bmN0aW9uIGlzIG5vdCB1c2VkIGVsc2V3aGVyZSBzbyB0aGUgc2lkZSBlZmZlY3QgaXMgb2theS5cblxuICAgICAgICBpZiAoIXJlbmRlci5uYW1lICYmICFyZW5kZXIuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbnZhciBSRUFDVF9NT0RVTEVfUkVGRVJFTkNFO1xuXG57XG4gIFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKCdyZWFjdC5tb2R1bGUucmVmZXJlbmNlJyk7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCBlbmFibGVEZWJ1Z1RyYWNpbmcgIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgZW5hYmxlTGVnYWN5SGlkZGVuICB8fCB0eXBlID09PSBSRUFDVF9PRkZTQ1JFRU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSAgfHwgZW5hYmxlQ2FjaGVFbGVtZW50ICB8fCBlbmFibGVUcmFuc2l0aW9uVHJhY2luZyApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gVGhpcyBuZWVkcyB0byBpbmNsdWRlIGFsbCBwb3NzaWJsZSBtb2R1bGUgcmVmZXJlbmNlIG9iamVjdFxuICAgIC8vIHR5cGVzIHN1cHBvcnRlZCBieSBhbnkgRmxpZ2h0IGNvbmZpZ3VyYXRpb24gYW55d2hlcmUgc2luY2VcbiAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIEZsaWdodCBidWlsZCB0aGlzIHdpbGwgZW5kIHVwIGJlaW5nIHVzZWRcbiAgICAvLyB3aXRoLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01PRFVMRV9SRUZFUkVOQ0UgfHwgdHlwZS5nZXRNb2R1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7IC8vIFRoZSBpbm5lciBjb21wb25lbnQgc2hvdWxkbid0IGluaGVyaXQgdGhpcyBkaXNwbGF5IG5hbWUgaW4gbW9zdCBjYXNlcyxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IG1heSBiZSB1c2VkIGVsc2V3aGVyZS5cbiAgICAgICAgLy8gQnV0IGl0J3MgbmljZSBmb3IgYW5vbnltb3VzIGZ1bmN0aW9ucyB0byBpbmhlcml0IHRoZSBuYW1lLFxuICAgICAgICAvLyBzbyB0aGF0IG91ciBjb21wb25lbnQtc3RhY2sgZ2VuZXJhdGlvbiBsb2dpYyB3aWxsIGRpc3BsYXkgdGhlaXIgZnJhbWVzLlxuICAgICAgICAvLyBBbiBhbm9ueW1vdXMgZnVuY3Rpb24gZ2VuZXJhbGx5IHN1Z2dlc3RzIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFJlYWN0Lm1lbW8oKHByb3BzKSA9PiB7Li4ufSk7XG4gICAgICAgIC8vIFRoaXMga2luZCBvZiBpbm5lciBmdW5jdGlvbiBpcyBub3QgdXNlZCBlbHNld2hlcmUgc28gdGhlIHNpZGUgZWZmZWN0IGlzIG9rYXkuXG5cbiAgICAgICAgaWYgKCF0eXBlLm5hbWUgJiYgIXR5cGUuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICB0eXBlLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7XG5cbiAge1xuICAgIGlmIChkaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvcicgKyAnIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4nICsgJzIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4nICsgJzMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG4nICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLicpO1xuICAgIH1cbiAgfSAvLyBXaWxsIHJlc3VsdCBpbiBhIG51bGwgYWNjZXNzIGVycm9yIGlmIGFjY2Vzc2VkIG91dHNpZGUgcmVuZGVyIHBoYXNlLiBXZVxuICAvLyBpbnRlbnRpb25hbGx5IGRvbid0IHRocm93IG91ciBvd24gZXJyb3IgYmVjYXVzZSB0aGlzIGlzIGluIGEgaG90IHBhdGguXG4gIC8vIEFsc28gaGVscHMgZW5zdXJlIHRoaXMgaXMgaW5saW5lZC5cblxuXG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuZnVuY3Rpb24gdXNlQ29udGV4dChDb250ZXh0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZWFsQ29udGV4dCA9IENvbnRleHQuX2NvbnRleHQ7IC8vIERvbid0IGRlZHVwbGljYXRlIGJlY2F1c2UgdGhpcyBsZWdpdGltYXRlbHkgY2F1c2VzIGJ1Z3NcbiAgICAgIC8vIGFuZCBub2JvZHkgc2hvdWxkIGJlIHVzaW5nIHRoaXMgaW4gZXhpc3RpbmcgY29kZS5cblxuICAgICAgaWYgKHJlYWxDb250ZXh0LkNvbnN1bWVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Db25zdW1lcikgaXMgbm90IHN1cHBvcnRlZCwgbWF5IGNhdXNlIGJ1Z3MsIGFuZCB3aWxsIGJlICcgKyAncmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9IGVsc2UgaWYgKHJlYWxDb250ZXh0LlByb3ZpZGVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Qcm92aWRlcikgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ29udGV4dChDb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59XG5mdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xufVxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VNZW1vKGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZU1lbW8oY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gIHtcbiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICB9XG59XG5mdW5jdGlvbiB1c2VUcmFuc2l0aW9uKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVRyYW5zaXRpb24oKTtcbn1cbmZ1bmN0aW9uIHVzZURlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUlkKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUlkKCk7XG59XG5mdW5jdGlvbiB1c2VTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbn1cblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpOyAvLyBJZiBvdXIgY29tcG9uZW50IGZyYW1lIGlzIGxhYmVsZWQgXCI8YW5vbnltb3VzPlwiXG4gICAgICAgICAgICAgICAgLy8gYnV0IHdlIGhhdmUgYSB1c2VyLXByb3ZpZGVkIFwiZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgIC8vIHNwbGljZSBpdCBpbiB0byBtYWtlIHRoZSBzdGFjayBtb3JlIHJlYWRhYmxlLlxuXG5cbiAgICAgICAgICAgICAgICBpZiAoZm4uZGlzcGxheU5hbWUgJiYgX2ZyYW1lLmluY2x1ZGVzKCc8YW5vbnltb3VzPicpKSB7XG4gICAgICAgICAgICAgICAgICBfZnJhbWUgPSBfZnJhbWUucmVwbGFjZSgnPGFub255bW91cz4nLCBmbi5kaXNwbGF5TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChoYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMoZWxlbWVudFByb3BzKSB7XG4gIGlmIChlbGVtZW50UHJvcHMgIT09IG51bGwgJiYgZWxlbWVudFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oZWxlbWVudFByb3BzLl9fc291cmNlKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG5cblxudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICBpZiAoIWluZm8pIHtcbiAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZm87XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IHRydWU7IC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG5cbiAgICAgIHZhciBfbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIF9uYW1lIHx8ICdVbmtub3duJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhdHlwZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGEgZnJhZ21lbnQsIHZhbGlkYXRlIHRoYXQgaXQgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2l0aCBmcmFnbWVudCBwcm9wc1xuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHtcbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKHByb3BzKTtcblxuICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNjb3BlLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb247XG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSB7fTtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgc2NvcGUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG5cbiAgICB7XG4gICAgICBpZiAocHJldlRyYW5zaXRpb24gPT09IG51bGwgJiYgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRGaWJlcnNDb3VudCA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZWRGaWJlcnNDb3VudCA+IDEwKSB7XG4gICAgICAgICAgd2FybignRGV0ZWN0ZWQgYSBsYXJnZSBudW1iZXIgb2YgdXBkYXRlcyBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLiAnICsgJ0lmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuICcgKyAnT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gZmFsc2U7XG52YXIgZW5xdWV1ZVRhc2tJbXBsID0gbnVsbDtcbmZ1bmN0aW9uIGVucXVldWVUYXNrKHRhc2spIHtcbiAgaWYgKGVucXVldWVUYXNrSW1wbCA9PT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICAvLyByZWFkIHJlcXVpcmUgb2ZmIHRoZSBtb2R1bGUgb2JqZWN0IHRvIGdldCBhcm91bmQgdGhlIGJ1bmRsZXJzLlxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0aGVtIHRvIGRldGVjdCBhIHJlcXVpcmUgYW5kIGJ1bmRsZSBhIE5vZGUgcG9seWZpbGwuXG4gICAgICB2YXIgcmVxdWlyZVN0cmluZyA9ICgncmVxdWlyZScgKyBNYXRoLnJhbmRvbSgpKS5zbGljZSgwLCA3KTtcbiAgICAgIHZhciBub2RlUmVxdWlyZSA9IG1vZHVsZSAmJiBtb2R1bGVbcmVxdWlyZVN0cmluZ107IC8vIGFzc3VtaW5nIHdlJ3JlIGluIG5vZGUsIGxldCdzIHRyeSB0byBnZXQgbm9kZSdzXG4gICAgICAvLyB2ZXJzaW9uIG9mIHNldEltbWVkaWF0ZSwgYnlwYXNzaW5nIGZha2UgdGltZXJzIGlmIGFueS5cblxuICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gbm9kZVJlcXVpcmUuY2FsbChtb2R1bGUsICd0aW1lcnMnKS5zZXRJbW1lZGlhdGU7XG4gICAgfSBjYXRjaCAoX2Vycikge1xuICAgICAgLy8gd2UncmUgaW4gYSBicm93c2VyXG4gICAgICAvLyB3ZSBjYW4ndCB1c2UgcmVndWxhciB0aW1lcnMgYmVjYXVzZSB0aGV5IG1heSBzdGlsbCBiZSBmYWtlZFxuICAgICAgLy8gc28gd2UgdHJ5IE1lc3NhZ2VDaGFubmVsK3Bvc3RNZXNzYWdlIGluc3RlYWRcbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBlcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ2hhbm5lbCBpbXBsZW1lbnRhdGlvbiwgJyArICdzbyBlbnF1ZXVpbmcgdGFza3MgdmlhIGF3YWl0IGFjdChhc3luYyAoKSA9PiAuLi4pIHdpbGwgZmFpbC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZSBhdCBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzICcgKyAnaWYgeW91IGVuY291bnRlciB0aGlzIHdhcm5pbmcuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbiAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZW5xdWV1ZVRhc2tJbXBsKHRhc2spO1xufVxuXG52YXIgYWN0U2NvcGVEZXB0aCA9IDA7XG52YXIgZGlkV2Fybk5vQXdhaXRBY3QgPSBmYWxzZTtcbmZ1bmN0aW9uIGFjdChjYWxsYmFjaykge1xuICB7XG4gICAgLy8gYGFjdGAgY2FsbHMgY2FuIGJlIG5lc3RlZCwgc28gd2UgdHJhY2sgdGhlIGRlcHRoLiBUaGlzIHJlcHJlc2VudHMgdGhlXG4gICAgLy8gbnVtYmVyIG9mIGBhY3RgIHNjb3BlcyBvbiB0aGUgc3RhY2suXG4gICAgdmFyIHByZXZBY3RTY29wZURlcHRoID0gYWN0U2NvcGVEZXB0aDtcbiAgICBhY3RTY29wZURlcHRoKys7XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgb3V0ZXJtb3N0IGBhY3RgIHNjb3BlLiBJbml0aWFsaXplIHRoZSBxdWV1ZS4gVGhlIHJlY29uY2lsZXJcbiAgICAgIC8vIHdpbGwgZGV0ZWN0IHRoZSBxdWV1ZSBhbmQgdXNlIGl0IGluc3RlYWQgb2YgU2NoZWR1bGVyLlxuICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgIH1cblxuICAgIHZhciBwcmV2SXNCYXRjaGluZ0xlZ2FjeSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmlzQmF0Y2hpbmdMZWdhY3k7XG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2VkIHRvIHJlcHJvZHVjZSBiZWhhdmlvciBvZiBgYmF0Y2hlZFVwZGF0ZXNgIGluIGxlZ2FjeSBtb2RlLiBPbmx5XG4gICAgICAvLyBzZXQgdG8gYHRydWVgIHdoaWxlIHRoZSBnaXZlbiBjYWxsYmFjayBpcyBleGVjdXRlZCwgbm90IGZvciB1cGRhdGVzXG4gICAgICAvLyB0cmlnZ2VyZWQgZHVyaW5nIGFuIGFzeW5jIGV2ZW50LCBiZWNhdXNlIHRoaXMgaXMgaG93IHRoZSBsZWdhY3lcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIGBhY3RgIGJlaGF2ZWQuXG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdCA9IGNhbGxiYWNrKCk7IC8vIFJlcGxpY2F0ZSBiZWhhdmlvciBvZiBvcmlnaW5hbCBgYWN0YCBpbXBsZW1lbnRhdGlvbiBpbiBsZWdhY3kgbW9kZSxcbiAgICAgIC8vIHdoaWNoIGZsdXNoZWQgdXBkYXRlcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgc2NvcGUgZnVuY3Rpb24gZXhpdHMsIGV2ZW5cbiAgICAgIC8vIGlmIGl0J3MgYW4gYXN5bmMgZnVuY3Rpb24uXG5cbiAgICAgIGlmICghcHJldklzQmF0Y2hpbmdMZWdhY3kgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUuZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGUpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgICAgICBpZiAocXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5pc0JhdGNoaW5nTGVnYWN5ID0gcHJldklzQmF0Y2hpbmdMZWdhY3k7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0aGVuYWJsZVJlc3VsdCA9IHJlc3VsdDsgLy8gVGhlIGNhbGxiYWNrIGlzIGFuIGFzeW5jIGZ1bmN0aW9uIChpLmUuIHJldHVybmVkIGEgcHJvbWlzZSkuIFdhaXRcbiAgICAgIC8vIGZvciBpdCB0byByZXNvbHZlIGJlZm9yZSBleGl0aW5nIHRoZSBjdXJyZW50IHNjb3BlLlxuXG4gICAgICB2YXIgd2FzQXdhaXRlZCA9IGZhbHNlO1xuICAgICAgdmFyIHRoZW5hYmxlID0ge1xuICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgd2FzQXdhaXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhlbmFibGVSZXN1bHQudGhlbihmdW5jdGlvbiAocmV0dXJuVmFsdWUpIHtcbiAgICAgICAgICAgIHBvcEFjdFNjb3BlKHByZXZBY3RTY29wZURlcHRoKTtcblxuICAgICAgICAgICAgaWYgKGFjdFNjb3BlRGVwdGggPT09IDApIHtcbiAgICAgICAgICAgICAgLy8gV2UndmUgZXhpdGVkIHRoZSBvdXRlcm1vc3QgYWN0IHNjb3BlLiBSZWN1cnNpdmVseSBmbHVzaCB0aGVcbiAgICAgICAgICAgICAgLy8gcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIHRocmV3IGFuIGVycm9yLlxuICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAge1xuICAgICAgICBpZiAoIWRpZFdhcm5Ob0F3YWl0QWN0ICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge30pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF3YXNBd2FpdGVkKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBlcnJvcignWW91IGNhbGxlZCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aXRob3V0IGF3YWl0LiAnICsgJ1RoaXMgY291bGQgbGVhZCB0byB1bmV4cGVjdGVkIHRlc3RpbmcgYmVoYXZpb3VyLCAnICsgJ2ludGVybGVhdmluZyBtdWx0aXBsZSBhY3QgY2FsbHMgYW5kIG1peGluZyB0aGVpciAnICsgJ3Njb3Blcy4gJyArICdZb3Ugc2hvdWxkIC0gYXdhaXQgYWN0KGFzeW5jICgpID0+IC4uLik7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcmV0dXJuVmFsdWUgPSByZXN1bHQ7IC8vIFRoZSBjYWxsYmFjayBpcyBub3QgYW4gYXN5bmMgZnVuY3Rpb24uIEV4aXQgdGhlIGN1cnJlbnQgc2NvcGVcbiAgICAgIC8vIGltbWVkaWF0ZWx5LCB3aXRob3V0IGF3YWl0aW5nLlxuXG4gICAgICBwb3BBY3RTY29wZShwcmV2QWN0U2NvcGVEZXB0aCk7XG5cbiAgICAgIGlmIChhY3RTY29wZURlcHRoID09PSAwKSB7XG4gICAgICAgIC8vIEV4aXRpbmcgdGhlIG91dGVybW9zdCBhY3Qgc2NvcGUuIEZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF9xdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQ7XG5cbiAgICAgICAgaWYgKF9xdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZsdXNoQWN0UXVldWUoX3F1ZXVlKTtcbiAgICAgICAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZS5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSAvLyBSZXR1cm4gYSB0aGVuYWJsZS4gSWYgdGhlIHVzZXIgYXdhaXRzIGl0LCB3ZSdsbCBmbHVzaCBhZ2FpbiBpblxuICAgICAgICAvLyBjYXNlIGFkZGl0aW9uYWwgd29yayB3YXMgc2NoZWR1bGVkIGJ5IGEgbWljcm90YXNrLlxuXG5cbiAgICAgICAgdmFyIF90aGVuYWJsZSA9IHtcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAvLyBDb25maXJtIHdlIGhhdmVuJ3QgcmUtZW50ZXJlZCBhbm90aGVyIGBhY3RgIHNjb3BlLCBpbiBjYXNlXG4gICAgICAgICAgICAvLyB0aGUgdXNlciBkb2VzIHNvbWV0aGluZyB3ZWlyZCBsaWtlIGF3YWl0IHRoZSB0aGVuYWJsZVxuICAgICAgICAgICAgLy8gbXVsdGlwbGUgdGltZXMuXG4gICAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbHVzaCB0aGUgcXVldWUgdW50aWwgdGhlcmUncyBubyByZW1haW5pbmcgd29yay5cbiAgICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IFtdO1xuICAgICAgICAgICAgICByZWN1cnNpdmVseUZsdXNoQXN5bmNBY3RXb3JrKHJldHVyblZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luY2Ugd2UncmUgaW5zaWRlIGEgbmVzdGVkIGBhY3RgIHNjb3BlLCB0aGUgcmV0dXJuZWQgdGhlbmFibGVcbiAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmVzb2x2ZXMuIFRoZSBvdXRlciBzY29wZSB3aWxsIGZsdXNoIHRoZSBxdWV1ZS5cbiAgICAgICAgdmFyIF90aGVuYWJsZTIgPSB7XG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gX3RoZW5hYmxlMjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQWN0U2NvcGUocHJldkFjdFNjb3BlRGVwdGgpIHtcbiAge1xuICAgIGlmIChwcmV2QWN0U2NvcGVEZXB0aCAhPT0gYWN0U2NvcGVEZXB0aCAtIDEpIHtcbiAgICAgIGVycm9yKCdZb3Ugc2VlbSB0byBoYXZlIG92ZXJsYXBwaW5nIGFjdCgpIGNhbGxzLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnQmUgc3VyZSB0byBhd2FpdCBwcmV2aW91cyBhY3QoKSBjYWxscyBiZWZvcmUgbWFraW5nIGEgbmV3IG9uZS4gJyk7XG4gICAgfVxuXG4gICAgYWN0U2NvcGVEZXB0aCA9IHByZXZBY3RTY29wZURlcHRoO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCkge1xuICB7XG4gICAgdmFyIHF1ZXVlID0gUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudDtcblxuICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZmx1c2hBY3RRdWV1ZShxdWV1ZSk7XG4gICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBObyBhZGRpdGlvbmFsIHdvcmsgd2FzIHNjaGVkdWxlZC4gRmluaXNoLlxuICAgICAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gS2VlcCBmbHVzaGluZyB3b3JrIHVudGlsIHRoZXJlJ3Mgbm9uZSBsZWZ0LlxuICAgICAgICAgICAgcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZShyZXR1cm5WYWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBpc0ZsdXNoaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQWN0UXVldWUocXVldWUpIHtcbiAge1xuICAgIGlmICghaXNGbHVzaGluZykge1xuICAgICAgLy8gUHJldmVudCByZS1lbnRyYW5jZS5cbiAgICAgIGlzRmx1c2hpbmcgPSB0cnVlO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKHRydWUpO1xuICAgICAgICAgIH0gd2hpbGUgKGNhbGxiYWNrICE9PSBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBzb21ldGhpbmcgdGhyb3dzLCBsZWF2ZSB0aGUgcmVtYWluaW5nIGNhbGxiYWNrcyBvbiB0aGUgcXVldWUuXG4gICAgICAgIHF1ZXVlID0gcXVldWUuc2xpY2UoaSArIDEpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbmV4cG9ydHMuUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG5leHBvcnRzLlN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBSZWFjdFNoYXJlZEludGVybmFscztcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeTtcbmV4cG9ydHMuY3JlYXRlUmVmID0gY3JlYXRlUmVmO1xuZXhwb3J0cy5mb3J3YXJkUmVmID0gZm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnQgPSBpc1ZhbGlkRWxlbWVudDtcbmV4cG9ydHMubGF6eSA9IGxhenk7XG5leHBvcnRzLm1lbW8gPSBtZW1vO1xuZXhwb3J0cy5zdGFydFRyYW5zaXRpb24gPSBzdGFydFRyYW5zaXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2FjdCA9IGFjdDtcbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSB1c2VDYWxsYmFjaztcbmV4cG9ydHMudXNlQ29udGV4dCA9IHVzZUNvbnRleHQ7XG5leHBvcnRzLnVzZURlYnVnVmFsdWUgPSB1c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VEZWZlcnJlZFZhbHVlID0gdXNlRGVmZXJyZWRWYWx1ZTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0O1xuZXhwb3J0cy51c2VJZCA9IHVzZUlkO1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gdXNlSW1wZXJhdGl2ZUhhbmRsZTtcbmV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0ID0gdXNlSW5zZXJ0aW9uRWZmZWN0O1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3QgPSB1c2VMYXlvdXRFZmZlY3Q7XG5leHBvcnRzLnVzZU1lbW8gPSB1c2VNZW1vO1xuZXhwb3J0cy51c2VSZWR1Y2VyID0gdXNlUmVkdWNlcjtcbmV4cG9ydHMudXNlUmVmID0gdXNlUmVmO1xuZXhwb3J0cy51c2VTdGF0ZSA9IHVzZVN0YXRlO1xuZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlO1xuZXhwb3J0cy51c2VUcmFuc2l0aW9uID0gdXNlVHJhbnNpdGlvbjtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgICAgICAgICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG5pZiAoXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgIFxuICB9KSgpO1xufVxuIiwgIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwgIlxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBsb2FkIChzcmMsIG9wdHMsIGNiKSB7XG4gIHZhciBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuXG4gIGlmICh0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gb3B0c1xuICAgIG9wdHMgPSB7fVxuICB9XG5cbiAgb3B0cyA9IG9wdHMgfHwge31cbiAgY2IgPSBjYiB8fCBmdW5jdGlvbigpIHt9XG5cbiAgc2NyaXB0LnR5cGUgPSBvcHRzLnR5cGUgfHwgJ3RleHQvamF2YXNjcmlwdCdcbiAgc2NyaXB0LmNoYXJzZXQgPSBvcHRzLmNoYXJzZXQgfHwgJ3V0ZjgnO1xuICBzY3JpcHQuYXN5bmMgPSAnYXN5bmMnIGluIG9wdHMgPyAhIW9wdHMuYXN5bmMgOiB0cnVlXG4gIHNjcmlwdC5zcmMgPSBzcmNcblxuICBpZiAob3B0cy5hdHRycykge1xuICAgIHNldEF0dHJpYnV0ZXMoc2NyaXB0LCBvcHRzLmF0dHJzKVxuICB9XG5cbiAgaWYgKG9wdHMudGV4dCkge1xuICAgIHNjcmlwdC50ZXh0ID0gJycgKyBvcHRzLnRleHRcbiAgfVxuXG4gIHZhciBvbmVuZCA9ICdvbmxvYWQnIGluIHNjcmlwdCA/IHN0ZE9uRW5kIDogaWVPbkVuZFxuICBvbmVuZChzY3JpcHQsIGNiKVxuXG4gIC8vIHNvbWUgZ29vZCBsZWdhY3kgYnJvd3NlcnMgKGZpcmVmb3gpIGZhaWwgdGhlICdpbicgZGV0ZWN0aW9uIGFib3ZlXG4gIC8vIHNvIGFzIGEgZmFsbGJhY2sgd2UgYWx3YXlzIHNldCBvbmxvYWRcbiAgLy8gb2xkIElFIHdpbGwgaWdub3JlIHRoaXMgYW5kIG5ldyBJRSB3aWxsIHNldCBvbmxvYWRcbiAgaWYgKCFzY3JpcHQub25sb2FkKSB7XG4gICAgc3RkT25FbmQoc2NyaXB0LCBjYik7XG4gIH1cblxuICBoZWFkLmFwcGVuZENoaWxkKHNjcmlwdClcbn1cblxuZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhzY3JpcHQsIGF0dHJzKSB7XG4gIGZvciAodmFyIGF0dHIgaW4gYXR0cnMpIHtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJzW2F0dHJdKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGRPbkVuZCAoc2NyaXB0LCBjYikge1xuICBzY3JpcHQub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub25lcnJvciA9IHRoaXMub25sb2FkID0gbnVsbFxuICAgIGNiKG51bGwsIHNjcmlwdClcbiAgfVxuICBzY3JpcHQub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyB0aGlzLm9ubG9hZCA9IG51bGwgaGVyZSBpcyBuZWNlc3NhcnlcbiAgICAvLyBiZWNhdXNlIGV2ZW4gSUU5IHdvcmtzIG5vdCBsaWtlIG90aGVyc1xuICAgIHRoaXMub25lcnJvciA9IHRoaXMub25sb2FkID0gbnVsbFxuICAgIGNiKG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgJyArIHRoaXMuc3JjKSwgc2NyaXB0KVxuICB9XG59XG5cbmZ1bmN0aW9uIGllT25FbmQgKHNjcmlwdCwgY2IpIHtcbiAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9ICdjb21wbGV0ZScgJiYgdGhpcy5yZWFkeVN0YXRlICE9ICdsb2FkZWQnKSByZXR1cm5cbiAgICB0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGxcbiAgICBjYihudWxsLCBzY3JpcHQpIC8vIHRoZXJlIGlzIG5vIHdheSB0byBjYXRjaCBsb2FkaW5nIGVycm9ycyBpbiBJRThcbiAgfVxufVxuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGlzTWVyZ2VhYmxlT2JqZWN0ID0gZnVuY3Rpb24gaXNNZXJnZWFibGVPYmplY3QodmFsdWUpIHtcblx0cmV0dXJuIGlzTm9uTnVsbE9iamVjdCh2YWx1ZSlcblx0XHQmJiAhaXNTcGVjaWFsKHZhbHVlKVxufTtcblxuZnVuY3Rpb24gaXNOb25OdWxsT2JqZWN0KHZhbHVlKSB7XG5cdHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbn1cblxuZnVuY3Rpb24gaXNTcGVjaWFsKHZhbHVlKSB7XG5cdHZhciBzdHJpbmdWYWx1ZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cblx0cmV0dXJuIHN0cmluZ1ZhbHVlID09PSAnW29iamVjdCBSZWdFeHBdJ1xuXHRcdHx8IHN0cmluZ1ZhbHVlID09PSAnW29iamVjdCBEYXRlXSdcblx0XHR8fCBpc1JlYWN0RWxlbWVudCh2YWx1ZSlcbn1cblxuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iL2I1YWM5NjNmYjc5MWQxMjk4ZTdmMzk2MjM2MzgzYmM5NTVmOTE2YzEvc3JjL2lzb21vcnBoaWMvY2xhc3NpYy9lbGVtZW50L1JlYWN0RWxlbWVudC5qcyNMMjEtTDI1XG52YXIgY2FuVXNlU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGNhblVzZVN5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcblxuZnVuY3Rpb24gaXNSZWFjdEVsZW1lbnQodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcbn1cblxuZnVuY3Rpb24gZW1wdHlUYXJnZXQodmFsKSB7XG5cdHJldHVybiBBcnJheS5pc0FycmF5KHZhbCkgPyBbXSA6IHt9XG59XG5cbmZ1bmN0aW9uIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHZhbHVlLCBvcHRpb25zKSB7XG5cdHJldHVybiAob3B0aW9ucy5jbG9uZSAhPT0gZmFsc2UgJiYgb3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCh2YWx1ZSkpXG5cdFx0PyBkZWVwbWVyZ2UoZW1wdHlUYXJnZXQodmFsdWUpLCB2YWx1ZSwgb3B0aW9ucylcblx0XHQ6IHZhbHVlXG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdHJldHVybiB0YXJnZXQuY29uY2F0KHNvdXJjZSkubWFwKGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRyZXR1cm4gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoZWxlbWVudCwgb3B0aW9ucylcblx0fSlcbn1cblxuZnVuY3Rpb24gZ2V0TWVyZ2VGdW5jdGlvbihrZXksIG9wdGlvbnMpIHtcblx0aWYgKCFvcHRpb25zLmN1c3RvbU1lcmdlKSB7XG5cdFx0cmV0dXJuIGRlZXBtZXJnZVxuXHR9XG5cdHZhciBjdXN0b21NZXJnZSA9IG9wdGlvbnMuY3VzdG9tTWVyZ2Uoa2V5KTtcblx0cmV0dXJuIHR5cGVvZiBjdXN0b21NZXJnZSA9PT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbU1lcmdlIDogZGVlcG1lcmdlXG59XG5cbmZ1bmN0aW9uIGdldEVudW1lcmFibGVPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSB7XG5cdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzXG5cdFx0PyBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkuZmlsdGVyKGZ1bmN0aW9uKHN5bWJvbCkge1xuXHRcdFx0cmV0dXJuIHRhcmdldC5wcm9wZXJ0eUlzRW51bWVyYWJsZShzeW1ib2wpXG5cdFx0fSlcblx0XHQ6IFtdXG59XG5cbmZ1bmN0aW9uIGdldEtleXModGFyZ2V0KSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyh0YXJnZXQpLmNvbmNhdChnZXRFbnVtZXJhYmxlT3duUHJvcGVydHlTeW1ib2xzKHRhcmdldCkpXG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5SXNPbk9iamVjdChvYmplY3QsIHByb3BlcnR5KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHByb3BlcnR5IGluIG9iamVjdFxuXHR9IGNhdGNoKF8pIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG4vLyBQcm90ZWN0cyBmcm9tIHByb3RvdHlwZSBwb2lzb25pbmcgYW5kIHVuZXhwZWN0ZWQgbWVyZ2luZyB1cCB0aGUgcHJvdG90eXBlIGNoYWluLlxuZnVuY3Rpb24gcHJvcGVydHlJc1Vuc2FmZSh0YXJnZXQsIGtleSkge1xuXHRyZXR1cm4gcHJvcGVydHlJc09uT2JqZWN0KHRhcmdldCwga2V5KSAvLyBQcm9wZXJ0aWVzIGFyZSBzYWZlIHRvIG1lcmdlIGlmIHRoZXkgZG9uJ3QgZXhpc3QgaW4gdGhlIHRhcmdldCB5ZXQsXG5cdFx0JiYgIShPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkgLy8gdW5zYWZlIGlmIHRoZXkgZXhpc3QgdXAgdGhlIHByb3RvdHlwZSBjaGFpbixcblx0XHRcdCYmIE9iamVjdC5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHRhcmdldCwga2V5KSkgLy8gYW5kIGFsc28gdW5zYWZlIGlmIHRoZXkncmUgbm9uZW51bWVyYWJsZS5cbn1cblxuZnVuY3Rpb24gbWVyZ2VPYmplY3QodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0dmFyIGRlc3RpbmF0aW9uID0ge307XG5cdGlmIChvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldCkpIHtcblx0XHRnZXRLZXlzKHRhcmdldCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2tleV0gPSBjbG9uZVVubGVzc090aGVyd2lzZVNwZWNpZmllZCh0YXJnZXRba2V5XSwgb3B0aW9ucyk7XG5cdFx0fSk7XG5cdH1cblx0Z2V0S2V5cyhzb3VyY2UpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG5cdFx0aWYgKHByb3BlcnR5SXNVbnNhZmUodGFyZ2V0LCBrZXkpKSB7XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cblx0XHRpZiAocHJvcGVydHlJc09uT2JqZWN0KHRhcmdldCwga2V5KSAmJiBvcHRpb25zLmlzTWVyZ2VhYmxlT2JqZWN0KHNvdXJjZVtrZXldKSkge1xuXHRcdFx0ZGVzdGluYXRpb25ba2V5XSA9IGdldE1lcmdlRnVuY3Rpb24oa2V5LCBvcHRpb25zKSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdGlvbnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZXN0aW5hdGlvbltrZXldID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoc291cmNlW2tleV0sIG9wdGlvbnMpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBkZWVwbWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdG9wdGlvbnMuYXJyYXlNZXJnZSA9IG9wdGlvbnMuYXJyYXlNZXJnZSB8fCBkZWZhdWx0QXJyYXlNZXJnZTtcblx0b3B0aW9ucy5pc01lcmdlYWJsZU9iamVjdCA9IG9wdGlvbnMuaXNNZXJnZWFibGVPYmplY3QgfHwgaXNNZXJnZWFibGVPYmplY3Q7XG5cdC8vIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkIGlzIGFkZGVkIHRvIGBvcHRpb25zYCBzbyB0aGF0IGN1c3RvbSBhcnJheU1lcmdlKClcblx0Ly8gaW1wbGVtZW50YXRpb25zIGNhbiB1c2UgaXQuIFRoZSBjYWxsZXIgbWF5IG5vdCByZXBsYWNlIGl0LlxuXHRvcHRpb25zLmNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkID0gY2xvbmVVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQ7XG5cblx0dmFyIHNvdXJjZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHNvdXJjZSk7XG5cdHZhciB0YXJnZXRJc0FycmF5ID0gQXJyYXkuaXNBcnJheSh0YXJnZXQpO1xuXHR2YXIgc291cmNlQW5kVGFyZ2V0VHlwZXNNYXRjaCA9IHNvdXJjZUlzQXJyYXkgPT09IHRhcmdldElzQXJyYXk7XG5cblx0aWYgKCFzb3VyY2VBbmRUYXJnZXRUeXBlc01hdGNoKSB7XG5cdFx0cmV0dXJuIGNsb25lVW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKHNvdXJjZSwgb3B0aW9ucylcblx0fSBlbHNlIGlmIChzb3VyY2VJc0FycmF5KSB7XG5cdFx0cmV0dXJuIG9wdGlvbnMuYXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucylcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbWVyZ2VPYmplY3QodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpXG5cdH1cbn1cblxuZGVlcG1lcmdlLmFsbCA9IGZ1bmN0aW9uIGRlZXBtZXJnZUFsbChhcnJheSwgb3B0aW9ucykge1xuXHRpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXknKVxuXHR9XG5cblx0cmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbihwcmV2LCBuZXh0KSB7XG5cdFx0cmV0dXJuIGRlZXBtZXJnZShwcmV2LCBuZXh0LCBvcHRpb25zKVxuXHR9LCB7fSlcbn07XG5cbnZhciBkZWVwbWVyZ2VfMSA9IGRlZXBtZXJnZTtcblxubW9kdWxlLmV4cG9ydHMgPSBkZWVwbWVyZ2VfMTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucGFyc2VTdGFydFRpbWUgPSBwYXJzZVN0YXJ0VGltZTtcbmV4cG9ydHMucGFyc2VFbmRUaW1lID0gcGFyc2VFbmRUaW1lO1xuZXhwb3J0cy5yYW5kb21TdHJpbmcgPSByYW5kb21TdHJpbmc7XG5leHBvcnRzLnF1ZXJ5U3RyaW5nID0gcXVlcnlTdHJpbmc7XG5leHBvcnRzLmdldFNESyA9IGdldFNESztcbmV4cG9ydHMuZ2V0Q29uZmlnID0gZ2V0Q29uZmlnO1xuZXhwb3J0cy5vbWl0ID0gb21pdDtcbmV4cG9ydHMuY2FsbFBsYXllciA9IGNhbGxQbGF5ZXI7XG5leHBvcnRzLmlzTWVkaWFTdHJlYW0gPSBpc01lZGlhU3RyZWFtO1xuZXhwb3J0cy5pc0Jsb2JVcmwgPSBpc0Jsb2JVcmw7XG5leHBvcnRzLnN1cHBvcnRzV2ViS2l0UHJlc2VudGF0aW9uTW9kZSA9IHN1cHBvcnRzV2ViS2l0UHJlc2VudGF0aW9uTW9kZTtcblxudmFyIF9sb2FkU2NyaXB0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwibG9hZC1zY3JpcHRcIikpO1xuXG52YXIgX2RlZXBtZXJnZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImRlZXBtZXJnZVwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG52YXIgTUFUQ0hfU1RBUlRfUVVFUlkgPSAvWz8mI10oPzpzdGFydHx0KT0oWzAtOWhtc10rKS87XG52YXIgTUFUQ0hfRU5EX1FVRVJZID0gL1s/JiNdZW5kPShbMC05aG1zXSspLztcbnZhciBNQVRDSF9TVEFSVF9TVEFNUCA9IC8oXFxkKykoaHxtfHMpL2c7XG52YXIgTUFUQ0hfTlVNRVJJQyA9IC9eXFxkKyQvOyAvLyBQYXJzZSBZb3VUdWJlIFVSTCBmb3IgYSBzdGFydCB0aW1lIHBhcmFtLCBpZSA/dD0xaDE0bTMwc1xuLy8gYW5kIHJldHVybiB0aGUgc3RhcnQgdGltZSBpbiBzZWNvbmRzXG5cbmZ1bmN0aW9uIHBhcnNlVGltZVBhcmFtKHVybCwgcGF0dGVybikge1xuICBpZiAodXJsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIG1hdGNoID0gdXJsLm1hdGNoKHBhdHRlcm4pO1xuXG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBzdGFtcCA9IG1hdGNoWzFdO1xuXG4gICAgaWYgKHN0YW1wLm1hdGNoKE1BVENIX1NUQVJUX1NUQU1QKSkge1xuICAgICAgcmV0dXJuIHBhcnNlVGltZVN0cmluZyhzdGFtcCk7XG4gICAgfVxuXG4gICAgaWYgKE1BVENIX05VTUVSSUMudGVzdChzdGFtcCkpIHtcbiAgICAgIHJldHVybiBwYXJzZUludChzdGFtcCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VUaW1lU3RyaW5nKHN0YW1wKSB7XG4gIHZhciBzZWNvbmRzID0gMDtcbiAgdmFyIGFycmF5ID0gTUFUQ0hfU1RBUlRfU1RBTVAuZXhlYyhzdGFtcCk7XG5cbiAgd2hpbGUgKGFycmF5ICE9PSBudWxsKSB7XG4gICAgdmFyIF9hcnJheSA9IGFycmF5LFxuICAgICAgICBfYXJyYXkyID0gX3NsaWNlZFRvQXJyYXkoX2FycmF5LCAzKSxcbiAgICAgICAgY291bnQgPSBfYXJyYXkyWzFdLFxuICAgICAgICBwZXJpb2QgPSBfYXJyYXkyWzJdO1xuXG4gICAgaWYgKHBlcmlvZCA9PT0gJ2gnKSBzZWNvbmRzICs9IHBhcnNlSW50KGNvdW50LCAxMCkgKiA2MCAqIDYwO1xuICAgIGlmIChwZXJpb2QgPT09ICdtJykgc2Vjb25kcyArPSBwYXJzZUludChjb3VudCwgMTApICogNjA7XG4gICAgaWYgKHBlcmlvZCA9PT0gJ3MnKSBzZWNvbmRzICs9IHBhcnNlSW50KGNvdW50LCAxMCk7XG4gICAgYXJyYXkgPSBNQVRDSF9TVEFSVF9TVEFNUC5leGVjKHN0YW1wKTtcbiAgfVxuXG4gIHJldHVybiBzZWNvbmRzO1xufVxuXG5mdW5jdGlvbiBwYXJzZVN0YXJ0VGltZSh1cmwpIHtcbiAgcmV0dXJuIHBhcnNlVGltZVBhcmFtKHVybCwgTUFUQ0hfU1RBUlRfUVVFUlkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVuZFRpbWUodXJsKSB7XG4gIHJldHVybiBwYXJzZVRpbWVQYXJhbSh1cmwsIE1BVENIX0VORF9RVUVSWSk7XG59IC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM4NjIyNTQ1XG5cblxuZnVuY3Rpb24gcmFuZG9tU3RyaW5nKCkge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDUpO1xufVxuXG5mdW5jdGlvbiBxdWVyeVN0cmluZyhvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gXCJcIi5jb25jYXQoa2V5LCBcIj1cIikuY29uY2F0KG9iamVjdFtrZXldKTtcbiAgfSkuam9pbignJicpO1xufVxuXG5mdW5jdGlvbiBnZXRHbG9iYWwoa2V5KSB7XG4gIGlmICh3aW5kb3dba2V5XSkge1xuICAgIHJldHVybiB3aW5kb3dba2V5XTtcbiAgfVxuXG4gIGlmICh3aW5kb3cuZXhwb3J0cyAmJiB3aW5kb3cuZXhwb3J0c1trZXldKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5leHBvcnRzW2tleV07XG4gIH1cblxuICBpZiAod2luZG93Lm1vZHVsZSAmJiB3aW5kb3cubW9kdWxlLmV4cG9ydHMgJiYgd2luZG93Lm1vZHVsZS5leHBvcnRzW2tleV0pIHtcbiAgICByZXR1cm4gd2luZG93Lm1vZHVsZS5leHBvcnRzW2tleV07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gVXRpbCBmdW5jdGlvbiB0byBsb2FkIGFuIGV4dGVybmFsIFNES1xuLy8gb3IgcmV0dXJuIHRoZSBTREsgaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWRcblxuXG52YXIgcmVxdWVzdHMgPSB7fTtcblxuZnVuY3Rpb24gZ2V0U0RLKHVybCwgc2RrR2xvYmFsKSB7XG4gIHZhciBzZGtSZWFkeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgdmFyIGlzTG9hZGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIHZhciBmZXRjaFNjcmlwdCA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogX2xvYWRTY3JpcHRbXCJkZWZhdWx0XCJdO1xuICB2YXIgZXhpc3RpbmdHbG9iYWwgPSBnZXRHbG9iYWwoc2RrR2xvYmFsKTtcblxuICBpZiAoZXhpc3RpbmdHbG9iYWwgJiYgaXNMb2FkZWQoZXhpc3RpbmdHbG9iYWwpKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShleGlzdGluZ0dsb2JhbCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIC8vIElmIHdlIGFyZSBhbHJlYWR5IGxvYWRpbmcgdGhlIFNESywgYWRkIHRoZSByZXNvbHZlIGFuZCByZWplY3RcbiAgICAvLyBmdW5jdGlvbnMgdG8gdGhlIGV4aXN0aW5nIGFycmF5IG9mIHJlcXVlc3RzXG4gICAgaWYgKHJlcXVlc3RzW3VybF0pIHtcbiAgICAgIHJlcXVlc3RzW3VybF0ucHVzaCh7XG4gICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgIHJlamVjdDogcmVqZWN0XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXF1ZXN0c1t1cmxdID0gW3tcbiAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICByZWplY3Q6IHJlamVjdFxuICAgIH1dO1xuXG4gICAgdmFyIG9uTG9hZGVkID0gZnVuY3Rpb24gb25Mb2FkZWQoc2RrKSB7XG4gICAgICAvLyBXaGVuIGxvYWRlZCwgcmVzb2x2ZSBhbGwgcGVuZGluZyByZXF1ZXN0IHByb21pc2VzXG4gICAgICByZXF1ZXN0c1t1cmxdLmZvckVhY2goZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3QucmVzb2x2ZShzZGspO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmIChzZGtSZWFkeSkge1xuICAgICAgdmFyIHByZXZpb3VzT25SZWFkeSA9IHdpbmRvd1tzZGtSZWFkeV07XG5cbiAgICAgIHdpbmRvd1tzZGtSZWFkeV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChwcmV2aW91c09uUmVhZHkpIHByZXZpb3VzT25SZWFkeSgpO1xuICAgICAgICBvbkxvYWRlZChnZXRHbG9iYWwoc2RrR2xvYmFsKSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZldGNoU2NyaXB0KHVybCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICAvLyBMb2FkaW5nIHRoZSBTREsgZmFpbGVkIFx1MjAxMyByZWplY3QgYWxsIHJlcXVlc3RzIGFuZFxuICAgICAgICAvLyByZXNldCB0aGUgYXJyYXkgb2YgcmVxdWVzdHMgZm9yIHRoaXMgU0RLXG4gICAgICAgIHJlcXVlc3RzW3VybF0uZm9yRWFjaChmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybiByZXF1ZXN0LnJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxdWVzdHNbdXJsXSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCFzZGtSZWFkeSkge1xuICAgICAgICBvbkxvYWRlZChnZXRHbG9iYWwoc2RrR2xvYmFsKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRDb25maWcocHJvcHMsIGRlZmF1bHRQcm9wcykge1xuICByZXR1cm4gKDAsIF9kZWVwbWVyZ2VbXCJkZWZhdWx0XCJdKShkZWZhdWx0UHJvcHMuY29uZmlnLCBwcm9wcy5jb25maWcpO1xufVxuXG5mdW5jdGlvbiBvbWl0KG9iamVjdCkge1xuICB2YXIgX3JlZjtcblxuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJyYXlzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcnJheXNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgdmFyIG9taXRLZXlzID0gKF9yZWYgPSBbXSkuY29uY2F0LmFwcGx5KF9yZWYsIGFycmF5cyk7XG5cbiAgdmFyIG91dHB1dCA9IHt9O1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG5cbiAgZm9yICh2YXIgX2kyID0gMCwgX2tleXMgPSBrZXlzOyBfaTIgPCBfa2V5cy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIGtleSA9IF9rZXlzW19pMl07XG5cbiAgICBpZiAob21pdEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgb3V0cHV0W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiBjYWxsUGxheWVyKG1ldGhvZCkge1xuICB2YXIgX3RoaXMkcGxheWVyO1xuXG4gIC8vIFV0aWwgbWV0aG9kIGZvciBjYWxsaW5nIGEgbWV0aG9kIG9uIHRoaXMucGxheWVyXG4gIC8vIGJ1dCBndWFyZCBhZ2FpbnN0IGVycm9ycyBhbmQgY29uc29sZS53YXJuIGluc3RlYWRcbiAgaWYgKCF0aGlzLnBsYXllciB8fCAhdGhpcy5wbGF5ZXJbbWV0aG9kXSkge1xuICAgIHZhciBtZXNzYWdlID0gXCJSZWFjdFBsYXllcjogXCIuY29uY2F0KHRoaXMuY29uc3RydWN0b3IuZGlzcGxheU5hbWUsIFwiIHBsYXllciBjb3VsZCBub3QgY2FsbCAlY1wiKS5jb25jYXQobWV0aG9kLCBcIiVjIFxcdTIwMTMgXCIpO1xuXG4gICAgaWYgKCF0aGlzLnBsYXllcikge1xuICAgICAgbWVzc2FnZSArPSAnVGhlIHBsYXllciB3YXMgbm90IGF2YWlsYWJsZSc7XG4gICAgfSBlbHNlIGlmICghdGhpcy5wbGF5ZXJbbWV0aG9kXSkge1xuICAgICAgbWVzc2FnZSArPSAnVGhlIG1ldGhvZCB3YXMgbm90IGF2YWlsYWJsZSc7XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UsICdmb250LXdlaWdodDogYm9sZCcsICcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuXG4gIHJldHVybiAoX3RoaXMkcGxheWVyID0gdGhpcy5wbGF5ZXIpW21ldGhvZF0uYXBwbHkoX3RoaXMkcGxheWVyLCBhcmdzKTtcbn1cblxuZnVuY3Rpb24gaXNNZWRpYVN0cmVhbSh1cmwpIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuTWVkaWFTdHJlYW0gIT09ICd1bmRlZmluZWQnICYmIHVybCBpbnN0YW5jZW9mIHdpbmRvdy5NZWRpYVN0cmVhbTtcbn1cblxuZnVuY3Rpb24gaXNCbG9iVXJsKHVybCkge1xuICByZXR1cm4gL15ibG9iOi8udGVzdCh1cmwpO1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c1dlYktpdFByZXNlbnRhdGlvbk1vZGUoKSB7XG4gIHZhciB2aWRlbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgLy8gQ2hlY2sgaWYgU2FmYXJpIHN1cHBvcnRzIFBpUCwgYW5kIGlzIG5vdCBvbiBtb2JpbGUgKG90aGVyIHRoYW4gaVBhZClcbiAgLy8gaVBob25lIHNhZmFyaSBhcHBlYXJzIHRvIFwic3VwcG9ydFwiIFBpUCB0aHJvdWdoIHRoZSBjaGVjaywgaG93ZXZlciBQaVAgZG9lcyBub3QgZnVuY3Rpb25cbiAgdmFyIG5vdE1vYmlsZSA9IC9pUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA9PT0gZmFsc2U7XG4gIHJldHVybiB2aWRlby53ZWJraXRTdXBwb3J0c1ByZXNlbnRhdGlvbk1vZGUgJiYgdHlwZW9mIHZpZGVvLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUgPT09ICdmdW5jdGlvbicgJiYgbm90TW9iaWxlO1xufSIsICJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuY2FuUGxheSA9IGV4cG9ydHMuRkxWX0VYVEVOU0lPTlMgPSBleHBvcnRzLkRBU0hfRVhURU5TSU9OUyA9IGV4cG9ydHMuSExTX0VYVEVOU0lPTlMgPSBleHBvcnRzLlZJREVPX0VYVEVOU0lPTlMgPSBleHBvcnRzLkFVRElPX0VYVEVOU0lPTlMgPSBleHBvcnRzLk1BVENIX1VSTF9LQUxUVVJBID0gZXhwb3J0cy5NQVRDSF9VUkxfVklEWUFSRCA9IGV4cG9ydHMuTUFUQ0hfVVJMX01JWENMT1VEID0gZXhwb3J0cy5NQVRDSF9VUkxfREFJTFlNT1RJT04gPSBleHBvcnRzLk1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTCA9IGV4cG9ydHMuTUFUQ0hfVVJMX1RXSVRDSF9WSURFTyA9IGV4cG9ydHMuTUFUQ0hfVVJMX1dJU1RJQSA9IGV4cG9ydHMuTUFUQ0hfVVJMX1NUUkVBTUFCTEUgPSBleHBvcnRzLk1BVENIX1VSTF9GQUNFQk9PS19XQVRDSCA9IGV4cG9ydHMuTUFUQ0hfVVJMX0ZBQ0VCT09LID0gZXhwb3J0cy5NQVRDSF9VUkxfVklNRU8gPSBleHBvcnRzLk1BVENIX1VSTF9TT1VORENMT1VEID0gZXhwb3J0cy5NQVRDSF9VUkxfWU9VVFVCRSA9IHZvaWQgMDtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG52YXIgTUFUQ0hfVVJMX1lPVVRVQkUgPSAvKD86eW91dHVcXC5iZVxcL3x5b3V0dWJlKD86LW5vY29va2llKT9cXC5jb21cXC8oPzplbWJlZFxcL3x2XFwvfHdhdGNoXFwvfHdhdGNoXFw/dj18d2F0Y2hcXD8uKyZ2PXxzaG9ydHNcXC8pKSgoXFx3fC0pezExfSl8eW91dHViZVxcLmNvbVxcL3BsYXlsaXN0XFw/bGlzdD18eW91dHViZVxcLmNvbVxcL3VzZXJcXC8vO1xuZXhwb3J0cy5NQVRDSF9VUkxfWU9VVFVCRSA9IE1BVENIX1VSTF9ZT1VUVUJFO1xudmFyIE1BVENIX1VSTF9TT1VORENMT1VEID0gLyg/OnNvdW5kY2xvdWRcXC5jb218c25kXFwuc2MpXFwvW14uXSskLztcbmV4cG9ydHMuTUFUQ0hfVVJMX1NPVU5EQ0xPVUQgPSBNQVRDSF9VUkxfU09VTkRDTE9VRDtcbnZhciBNQVRDSF9VUkxfVklNRU8gPSAvdmltZW9cXC5jb21cXC8oPyFwcm9ncmVzc2l2ZV9yZWRpcmVjdCkuKy87XG5leHBvcnRzLk1BVENIX1VSTF9WSU1FTyA9IE1BVENIX1VSTF9WSU1FTztcbnZhciBNQVRDSF9VUkxfRkFDRUJPT0sgPSAvXmh0dHBzPzpcXC9cXC8od3d3XFwuKT9mYWNlYm9va1xcLmNvbS4qXFwvKHZpZGVvKHMpP3x3YXRjaHxzdG9yeSkoXFwucGhwP3xcXC8pLiskLztcbmV4cG9ydHMuTUFUQ0hfVVJMX0ZBQ0VCT09LID0gTUFUQ0hfVVJMX0ZBQ0VCT09LO1xudmFyIE1BVENIX1VSTF9GQUNFQk9PS19XQVRDSCA9IC9eaHR0cHM/OlxcL1xcL2ZiXFwud2F0Y2hcXC8uKyQvO1xuZXhwb3J0cy5NQVRDSF9VUkxfRkFDRUJPT0tfV0FUQ0ggPSBNQVRDSF9VUkxfRkFDRUJPT0tfV0FUQ0g7XG52YXIgTUFUQ0hfVVJMX1NUUkVBTUFCTEUgPSAvc3RyZWFtYWJsZVxcLmNvbVxcLyhbYS16MC05XSspJC87XG5leHBvcnRzLk1BVENIX1VSTF9TVFJFQU1BQkxFID0gTUFUQ0hfVVJMX1NUUkVBTUFCTEU7XG52YXIgTUFUQ0hfVVJMX1dJU1RJQSA9IC8oPzp3aXN0aWFcXC4oPzpjb218bmV0KXx3aVxcLnN0KVxcLyg/Om1lZGlhc3xlbWJlZClcXC8oPzppZnJhbWVcXC8pPyguKikkLztcbmV4cG9ydHMuTUFUQ0hfVVJMX1dJU1RJQSA9IE1BVENIX1VSTF9XSVNUSUE7XG52YXIgTUFUQ0hfVVJMX1RXSVRDSF9WSURFTyA9IC8oPzp3d3dcXC58Z29cXC4pP3R3aXRjaFxcLnR2XFwvdmlkZW9zXFwvKFxcZCspKCR8XFw/KS87XG5leHBvcnRzLk1BVENIX1VSTF9UV0lUQ0hfVklERU8gPSBNQVRDSF9VUkxfVFdJVENIX1ZJREVPO1xudmFyIE1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTCA9IC8oPzp3d3dcXC58Z29cXC4pP3R3aXRjaFxcLnR2XFwvKFthLXpBLVowLTlfXSspKCR8XFw/KS87XG5leHBvcnRzLk1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTCA9IE1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTDtcbnZhciBNQVRDSF9VUkxfREFJTFlNT1RJT04gPSAvXig/Oig/Omh0dHBzPyk6KT8oPzpcXC9cXC8pPyg/Ond3d1xcLik/KD86KD86ZGFpbHltb3Rpb25cXC5jb20oPzpcXC9lbWJlZCk/XFwvdmlkZW8pfGRhaVxcLmx5KVxcLyhbYS16QS1aMC05XSspKD86X1tcXHdfLV0rKT8kLztcbmV4cG9ydHMuTUFUQ0hfVVJMX0RBSUxZTU9USU9OID0gTUFUQ0hfVVJMX0RBSUxZTU9USU9OO1xudmFyIE1BVENIX1VSTF9NSVhDTE9VRCA9IC9taXhjbG91ZFxcLmNvbVxcLyhbXi9dK1xcL1teL10rKS87XG5leHBvcnRzLk1BVENIX1VSTF9NSVhDTE9VRCA9IE1BVENIX1VSTF9NSVhDTE9VRDtcbnZhciBNQVRDSF9VUkxfVklEWUFSRCA9IC92aWR5YXJkLmNvbVxcLyg/OndhdGNoXFwvKT8oW2EtekEtWjAtOS1fXSspLztcbmV4cG9ydHMuTUFUQ0hfVVJMX1ZJRFlBUkQgPSBNQVRDSF9VUkxfVklEWUFSRDtcbnZhciBNQVRDSF9VUkxfS0FMVFVSQSA9IC9eaHR0cHM/OlxcL1xcL1thLXpBLVpdK1xcLmthbHR1cmEuKGNvbXxvcmcpXFwvcFxcLyhbMC05XSspXFwvc3BcXC8oWzAtOV0rKTAwXFwvZW1iZWRJZnJhbWVKc1xcL3VpY29uZl9pZFxcLyhbMC05XSspXFwvcGFydG5lcl9pZFxcLyhbMC05XSspKC4qKWVudHJ5X2lkLihbYS16QS1aMC05LV9dLiopJC87XG5leHBvcnRzLk1BVENIX1VSTF9LQUxUVVJBID0gTUFUQ0hfVVJMX0tBTFRVUkE7XG52YXIgQVVESU9fRVhURU5TSU9OUyA9IC9cXC4obTRhfG00YnxtcDRhfG1wZ2F8bXAyfG1wMmF8bXAzfG0yYXxtM2F8d2F2fHdlYmF8YWFjfG9nYXxzcHgpKCR8XFw/KS9pO1xuZXhwb3J0cy5BVURJT19FWFRFTlNJT05TID0gQVVESU9fRVhURU5TSU9OUztcbnZhciBWSURFT19FWFRFTlNJT05TID0gL1xcLihtcDR8b2dbZ3ZdfHdlYm18bW92fG00dikoI3Q9WyxcXGQrXSspPygkfFxcPykvaTtcbmV4cG9ydHMuVklERU9fRVhURU5TSU9OUyA9IFZJREVPX0VYVEVOU0lPTlM7XG52YXIgSExTX0VYVEVOU0lPTlMgPSAvXFwuKG0zdTgpKCR8XFw/KS9pO1xuZXhwb3J0cy5ITFNfRVhURU5TSU9OUyA9IEhMU19FWFRFTlNJT05TO1xudmFyIERBU0hfRVhURU5TSU9OUyA9IC9cXC4obXBkKSgkfFxcPykvaTtcbmV4cG9ydHMuREFTSF9FWFRFTlNJT05TID0gREFTSF9FWFRFTlNJT05TO1xudmFyIEZMVl9FWFRFTlNJT05TID0gL1xcLihmbHYpKCR8XFw/KS9pO1xuZXhwb3J0cy5GTFZfRVhURU5TSU9OUyA9IEZMVl9FWFRFTlNJT05TO1xuXG52YXIgY2FuUGxheUZpbGUgPSBmdW5jdGlvbiBjYW5QbGF5RmlsZSh1cmwpIHtcbiAgaWYgKHVybCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgdmFyIF9pdGVyYXRvciA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKHVybCksXG4gICAgICAgIF9zdGVwO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoX2l0ZXJhdG9yLnMoKTsgIShfc3RlcCA9IF9pdGVyYXRvci5uKCkpLmRvbmU7KSB7XG4gICAgICAgIHZhciBpdGVtID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBjYW5QbGF5RmlsZShpdGVtKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhblBsYXlGaWxlKGl0ZW0uc3JjKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfaXRlcmF0b3IuZShlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBfaXRlcmF0b3IuZigpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgoMCwgX3V0aWxzLmlzTWVkaWFTdHJlYW0pKHVybCkgfHwgKDAsIF91dGlscy5pc0Jsb2JVcmwpKHVybCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBBVURJT19FWFRFTlNJT05TLnRlc3QodXJsKSB8fCBWSURFT19FWFRFTlNJT05TLnRlc3QodXJsKSB8fCBITFNfRVhURU5TSU9OUy50ZXN0KHVybCkgfHwgREFTSF9FWFRFTlNJT05TLnRlc3QodXJsKSB8fCBGTFZfRVhURU5TSU9OUy50ZXN0KHVybCk7XG59O1xuXG52YXIgY2FuUGxheSA9IHtcbiAgeW91dHViZTogZnVuY3Rpb24geW91dHViZSh1cmwpIHtcbiAgICBpZiAodXJsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiB1cmwuZXZlcnkoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIE1BVENIX1VSTF9ZT1VUVUJFLnRlc3QoaXRlbSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gTUFUQ0hfVVJMX1lPVVRVQkUudGVzdCh1cmwpO1xuICB9LFxuICBzb3VuZGNsb3VkOiBmdW5jdGlvbiBzb3VuZGNsb3VkKHVybCkge1xuICAgIHJldHVybiBNQVRDSF9VUkxfU09VTkRDTE9VRC50ZXN0KHVybCkgJiYgIUFVRElPX0VYVEVOU0lPTlMudGVzdCh1cmwpO1xuICB9LFxuICB2aW1lbzogZnVuY3Rpb24gdmltZW8odXJsKSB7XG4gICAgcmV0dXJuIE1BVENIX1VSTF9WSU1FTy50ZXN0KHVybCkgJiYgIVZJREVPX0VYVEVOU0lPTlMudGVzdCh1cmwpICYmICFITFNfRVhURU5TSU9OUy50ZXN0KHVybCk7XG4gIH0sXG4gIGZhY2Vib29rOiBmdW5jdGlvbiBmYWNlYm9vayh1cmwpIHtcbiAgICByZXR1cm4gTUFUQ0hfVVJMX0ZBQ0VCT09LLnRlc3QodXJsKSB8fCBNQVRDSF9VUkxfRkFDRUJPT0tfV0FUQ0gudGVzdCh1cmwpO1xuICB9LFxuICBzdHJlYW1hYmxlOiBmdW5jdGlvbiBzdHJlYW1hYmxlKHVybCkge1xuICAgIHJldHVybiBNQVRDSF9VUkxfU1RSRUFNQUJMRS50ZXN0KHVybCk7XG4gIH0sXG4gIHdpc3RpYTogZnVuY3Rpb24gd2lzdGlhKHVybCkge1xuICAgIHJldHVybiBNQVRDSF9VUkxfV0lTVElBLnRlc3QodXJsKTtcbiAgfSxcbiAgdHdpdGNoOiBmdW5jdGlvbiB0d2l0Y2godXJsKSB7XG4gICAgcmV0dXJuIE1BVENIX1VSTF9UV0lUQ0hfVklERU8udGVzdCh1cmwpIHx8IE1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTC50ZXN0KHVybCk7XG4gIH0sXG4gIGRhaWx5bW90aW9uOiBmdW5jdGlvbiBkYWlseW1vdGlvbih1cmwpIHtcbiAgICByZXR1cm4gTUFUQ0hfVVJMX0RBSUxZTU9USU9OLnRlc3QodXJsKTtcbiAgfSxcbiAgbWl4Y2xvdWQ6IGZ1bmN0aW9uIG1peGNsb3VkKHVybCkge1xuICAgIHJldHVybiBNQVRDSF9VUkxfTUlYQ0xPVUQudGVzdCh1cmwpO1xuICB9LFxuICB2aWR5YXJkOiBmdW5jdGlvbiB2aWR5YXJkKHVybCkge1xuICAgIHJldHVybiBNQVRDSF9VUkxfVklEWUFSRC50ZXN0KHVybCk7XG4gIH0sXG4gIGthbHR1cmE6IGZ1bmN0aW9uIGthbHR1cmEodXJsKSB7XG4gICAgcmV0dXJuIE1BVENIX1VSTF9LQUxUVVJBLnRlc3QodXJsKTtcbiAgfSxcbiAgZmlsZTogY2FuUGxheUZpbGVcbn07XG5leHBvcnRzLmNhblBsYXkgPSBjYW5QbGF5OyIsICJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuXG52YXIgX3BhdHRlcm5zID0gcmVxdWlyZShcIi4uL3BhdHRlcm5zXCIpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTsgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyByZXR1cm4gY2FjaGU7IH07IHJldHVybiBjYWNoZTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBcImRlZmF1bHRcIjogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqW1wiZGVmYXVsdFwiXSA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxudmFyIFNES19VUkwgPSAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7XG52YXIgU0RLX0dMT0JBTCA9ICdZVCc7XG52YXIgU0RLX0dMT0JBTF9SRUFEWSA9ICdvbllvdVR1YmVJZnJhbWVBUElSZWFkeSc7XG52YXIgTUFUQ0hfUExBWUxJU1QgPSAvWz8mXSg/Omxpc3R8Y2hhbm5lbCk9KFthLXpBLVowLTlfLV0rKS87XG52YXIgTUFUQ0hfVVNFUl9VUExPQURTID0gL3VzZXJcXC8oW2EtekEtWjAtOV8tXSspXFwvPy87XG52YXIgTUFUQ0hfTk9DT09LSUUgPSAveW91dHViZS1ub2Nvb2tpZVxcLmNvbS87XG52YXIgTk9DT09LSUVfSE9TVCA9ICdodHRwczovL3d3dy55b3V0dWJlLW5vY29va2llLmNvbSc7XG5cbnZhciBZb3VUdWJlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhZb3VUdWJlLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFlvdVR1YmUpO1xuXG4gIGZ1bmN0aW9uIFlvdVR1YmUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFlvdVR1YmUpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwYXJzZVBsYXlsaXN0XCIsIGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgIGlmICh1cmwgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpc3RUeXBlOiAncGxheWxpc3QnLFxuICAgICAgICAgIHBsYXlsaXN0OiB1cmwubWFwKF90aGlzLmdldElEKS5qb2luKCcsJylcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKE1BVENIX1BMQVlMSVNULnRlc3QodXJsKSkge1xuICAgICAgICB2YXIgX3VybCRtYXRjaCA9IHVybC5tYXRjaChNQVRDSF9QTEFZTElTVCksXG4gICAgICAgICAgICBfdXJsJG1hdGNoMiA9IF9zbGljZWRUb0FycmF5KF91cmwkbWF0Y2gsIDIpLFxuICAgICAgICAgICAgcGxheWxpc3RJZCA9IF91cmwkbWF0Y2gyWzFdO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGlzdFR5cGU6ICdwbGF5bGlzdCcsXG4gICAgICAgICAgbGlzdDogcGxheWxpc3RJZC5yZXBsYWNlKC9eVUMvLCAnVVUnKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoTUFUQ0hfVVNFUl9VUExPQURTLnRlc3QodXJsKSkge1xuICAgICAgICB2YXIgX3VybCRtYXRjaDMgPSB1cmwubWF0Y2goTUFUQ0hfVVNFUl9VUExPQURTKSxcbiAgICAgICAgICAgIF91cmwkbWF0Y2g0ID0gX3NsaWNlZFRvQXJyYXkoX3VybCRtYXRjaDMsIDIpLFxuICAgICAgICAgICAgdXNlcm5hbWUgPSBfdXJsJG1hdGNoNFsxXTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpc3RUeXBlOiAndXNlcl91cGxvYWRzJyxcbiAgICAgICAgICBsaXN0OiB1c2VybmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge307XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25TdGF0ZUNoYW5nZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIHZhciBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uUGxheSA9IF90aGlzJHByb3BzLm9uUGxheSxcbiAgICAgICAgICBvblBhdXNlID0gX3RoaXMkcHJvcHMub25QYXVzZSxcbiAgICAgICAgICBvbkJ1ZmZlciA9IF90aGlzJHByb3BzLm9uQnVmZmVyLFxuICAgICAgICAgIG9uQnVmZmVyRW5kID0gX3RoaXMkcHJvcHMub25CdWZmZXJFbmQsXG4gICAgICAgICAgb25FbmRlZCA9IF90aGlzJHByb3BzLm9uRW5kZWQsXG4gICAgICAgICAgb25SZWFkeSA9IF90aGlzJHByb3BzLm9uUmVhZHksXG4gICAgICAgICAgbG9vcCA9IF90aGlzJHByb3BzLmxvb3AsXG4gICAgICAgICAgX3RoaXMkcHJvcHMkY29uZmlnID0gX3RoaXMkcHJvcHMuY29uZmlnLFxuICAgICAgICAgIHBsYXllclZhcnMgPSBfdGhpcyRwcm9wcyRjb25maWcucGxheWVyVmFycyxcbiAgICAgICAgICBvblVuc3RhcnRlZCA9IF90aGlzJHByb3BzJGNvbmZpZy5vblVuc3RhcnRlZDtcbiAgICAgIHZhciBfd2luZG93JFNES19HTE9CQUwkUGwgPSB3aW5kb3dbU0RLX0dMT0JBTF0uUGxheWVyU3RhdGUsXG4gICAgICAgICAgVU5TVEFSVEVEID0gX3dpbmRvdyRTREtfR0xPQkFMJFBsLlVOU1RBUlRFRCxcbiAgICAgICAgICBQTEFZSU5HID0gX3dpbmRvdyRTREtfR0xPQkFMJFBsLlBMQVlJTkcsXG4gICAgICAgICAgUEFVU0VEID0gX3dpbmRvdyRTREtfR0xPQkFMJFBsLlBBVVNFRCxcbiAgICAgICAgICBCVUZGRVJJTkcgPSBfd2luZG93JFNES19HTE9CQUwkUGwuQlVGRkVSSU5HLFxuICAgICAgICAgIEVOREVEID0gX3dpbmRvdyRTREtfR0xPQkFMJFBsLkVOREVELFxuICAgICAgICAgIENVRUQgPSBfd2luZG93JFNES19HTE9CQUwkUGwuQ1VFRDtcbiAgICAgIGlmIChkYXRhID09PSBVTlNUQVJURUQpIG9uVW5zdGFydGVkKCk7XG5cbiAgICAgIGlmIChkYXRhID09PSBQTEFZSU5HKSB7XG4gICAgICAgIG9uUGxheSgpO1xuICAgICAgICBvbkJ1ZmZlckVuZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSA9PT0gUEFVU0VEKSBvblBhdXNlKCk7XG4gICAgICBpZiAoZGF0YSA9PT0gQlVGRkVSSU5HKSBvbkJ1ZmZlcigpO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gRU5ERUQpIHtcbiAgICAgICAgdmFyIGlzUGxheWxpc3QgPSAhIV90aGlzLmNhbGxQbGF5ZXIoJ2dldFBsYXlsaXN0Jyk7IC8vIE9ubHkgbG9vcCBtYW51YWxseSBpZiBub3QgcGxheWluZyBhIHBsYXlsaXN0XG5cbiAgICAgICAgaWYgKGxvb3AgJiYgIWlzUGxheWxpc3QpIHtcbiAgICAgICAgICBpZiAocGxheWVyVmFycy5zdGFydCkge1xuICAgICAgICAgICAgX3RoaXMuc2Vla1RvKHBsYXllclZhcnMuc3RhcnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5wbGF5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgb25FbmRlZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YSA9PT0gQ1VFRCkgb25SZWFkeSgpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm11dGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuY2FsbFBsYXllcignbXV0ZScpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVubXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCd1bk11dGUnKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJyZWZcIiwgZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgICAgX3RoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFlvdVR1YmUsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0SURcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SUQodXJsKSB7XG4gICAgICBpZiAoIXVybCB8fCB1cmwgaW5zdGFuY2VvZiBBcnJheSB8fCBNQVRDSF9QTEFZTElTVC50ZXN0KHVybCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cmwubWF0Y2goX3BhdHRlcm5zLk1BVENIX1VSTF9ZT1VUVUJFKVsxXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCwgaXNSZWFkeSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHBsYXlpbmcgPSBfdGhpcyRwcm9wczIucGxheWluZyxcbiAgICAgICAgICBtdXRlZCA9IF90aGlzJHByb3BzMi5tdXRlZCxcbiAgICAgICAgICBwbGF5c2lubGluZSA9IF90aGlzJHByb3BzMi5wbGF5c2lubGluZSxcbiAgICAgICAgICBjb250cm9scyA9IF90aGlzJHByb3BzMi5jb250cm9scyxcbiAgICAgICAgICBsb29wID0gX3RoaXMkcHJvcHMyLmxvb3AsXG4gICAgICAgICAgY29uZmlnID0gX3RoaXMkcHJvcHMyLmNvbmZpZyxcbiAgICAgICAgICBfb25FcnJvciA9IF90aGlzJHByb3BzMi5vbkVycm9yO1xuICAgICAgdmFyIHBsYXllclZhcnMgPSBjb25maWcucGxheWVyVmFycyxcbiAgICAgICAgICBlbWJlZE9wdGlvbnMgPSBjb25maWcuZW1iZWRPcHRpb25zO1xuICAgICAgdmFyIGlkID0gdGhpcy5nZXRJRCh1cmwpO1xuXG4gICAgICBpZiAoaXNSZWFkeSkge1xuICAgICAgICBpZiAoTUFUQ0hfUExBWUxJU1QudGVzdCh1cmwpIHx8IE1BVENIX1VTRVJfVVBMT0FEUy50ZXN0KHVybCkgfHwgdXJsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICB0aGlzLnBsYXllci5sb2FkUGxheWxpc3QodGhpcy5wYXJzZVBsYXlsaXN0KHVybCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxheWVyLmN1ZVZpZGVvQnlJZCh7XG4gICAgICAgICAgdmlkZW9JZDogaWQsXG4gICAgICAgICAgc3RhcnRTZWNvbmRzOiAoMCwgX3V0aWxzLnBhcnNlU3RhcnRUaW1lKSh1cmwpIHx8IHBsYXllclZhcnMuc3RhcnQsXG4gICAgICAgICAgZW5kU2Vjb25kczogKDAsIF91dGlscy5wYXJzZUVuZFRpbWUpKHVybCkgfHwgcGxheWVyVmFycy5lbmRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgKDAsIF91dGlscy5nZXRTREspKFNES19VUkwsIFNES19HTE9CQUwsIFNES19HTE9CQUxfUkVBRFksIGZ1bmN0aW9uIChZVCkge1xuICAgICAgICByZXR1cm4gWVQubG9hZGVkO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoWVQpIHtcbiAgICAgICAgaWYgKCFfdGhpczIuY29udGFpbmVyKSByZXR1cm47XG4gICAgICAgIF90aGlzMi5wbGF5ZXIgPSBuZXcgWVQuUGxheWVyKF90aGlzMi5jb250YWluZXIsIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgdmlkZW9JZDogaWQsXG4gICAgICAgICAgcGxheWVyVmFyczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICAgIGF1dG9wbGF5OiBwbGF5aW5nID8gMSA6IDAsXG4gICAgICAgICAgICBtdXRlOiBtdXRlZCA/IDEgOiAwLFxuICAgICAgICAgICAgY29udHJvbHM6IGNvbnRyb2xzID8gMSA6IDAsXG4gICAgICAgICAgICBzdGFydDogKDAsIF91dGlscy5wYXJzZVN0YXJ0VGltZSkodXJsKSxcbiAgICAgICAgICAgIGVuZDogKDAsIF91dGlscy5wYXJzZUVuZFRpbWUpKHVybCksXG4gICAgICAgICAgICBvcmlnaW46IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sXG4gICAgICAgICAgICBwbGF5c2lubGluZTogcGxheXNpbmxpbmUgPyAxIDogMFxuICAgICAgICAgIH0sIF90aGlzMi5wYXJzZVBsYXlsaXN0KHVybCkpLCBwbGF5ZXJWYXJzKSxcbiAgICAgICAgICBldmVudHM6IHtcbiAgICAgICAgICAgIG9uUmVhZHk6IGZ1bmN0aW9uIG9uUmVhZHkoKSB7XG4gICAgICAgICAgICAgIGlmIChsb29wKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLnBsYXllci5zZXRMb29wKHRydWUpOyAvLyBFbmFibGUgcGxheWxpc3QgbG9vcGluZ1xuXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfdGhpczIucHJvcHMub25SZWFkeSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uUGxheWJhY2tSYXRlQ2hhbmdlOiBmdW5jdGlvbiBvblBsYXliYWNrUmF0ZUNoYW5nZShldmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLnByb3BzLm9uUGxheWJhY2tSYXRlQ2hhbmdlKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uU3RhdGVDaGFuZ2U6IF90aGlzMi5vblN0YXRlQ2hhbmdlLFxuICAgICAgICAgICAgb25FcnJvcjogZnVuY3Rpb24gb25FcnJvcihldmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gX29uRXJyb3IoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBob3N0OiBNQVRDSF9OT0NPT0tJRS50ZXN0KHVybCkgPyBOT0NPT0tJRV9IT1NUIDogdW5kZWZpbmVkXG4gICAgICAgIH0sIGVtYmVkT3B0aW9ucykpO1xuICAgICAgfSwgX29uRXJyb3IpO1xuXG4gICAgICBpZiAoZW1iZWRPcHRpb25zLmV2ZW50cykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VzaW5nIGBlbWJlZE9wdGlvbnMuZXZlbnRzYCB3aWxsIGxpa2VseSBicmVhayB0aGluZ3MuIFVzZSBSZWFjdFBsYXllclx1MjAxOXMgY2FsbGJhY2sgcHJvcHMgaW5zdGVhZCwgZWcgb25SZWFkeSwgb25QbGF5LCBvblBhdXNlJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheVZpZGVvJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwYXVzZVZpZGVvJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyh0aGlzLmNhbGxQbGF5ZXIoJ2dldElmcmFtZScpKSkgcmV0dXJuO1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzdG9wVmlkZW8nKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2Vla1RvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlZWtUbyhhbW91bnQpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2Vla1RvJywgYW1vdW50KTtcblxuICAgICAgaWYgKCF0aGlzLnByb3BzLnBsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGZyYWN0aW9uKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldFZvbHVtZScsIGZyYWN0aW9uICogMTAwKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UGxheWJhY2tSYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBsYXliYWNrUmF0ZShyYXRlKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldFBsYXliYWNrUmF0ZScsIHJhdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRMb29wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldExvb3AobG9vcCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRMb29wJywgbG9vcCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbFBsYXllcignZ2V0RHVyYXRpb24nKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsUGxheWVyKCdnZXRDdXJyZW50VGltZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsUGxheWVyKCdnZXRWaWRlb0xvYWRlZEZyYWN0aW9uJykgKiB0aGlzLmdldER1cmF0aW9uKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgZGlzcGxheSA9IHRoaXMucHJvcHMuZGlzcGxheTtcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgIGRpc3BsYXk6IGRpc3BsYXlcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5yZWZcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gWW91VHViZTtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gWW91VHViZTtcblxuX2RlZmluZVByb3BlcnR5KFlvdVR1YmUsIFwiZGlzcGxheU5hbWVcIiwgJ1lvdVR1YmUnKTtcblxuX2RlZmluZVByb3BlcnR5KFlvdVR1YmUsIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS55b3V0dWJlKTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcblxudmFyIF9wYXR0ZXJucyA9IHJlcXVpcmUoXCIuLi9wYXR0ZXJuc1wiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBTREtfVVJMID0gJ2h0dHBzOi8vdy5zb3VuZGNsb3VkLmNvbS9wbGF5ZXIvYXBpLmpzJztcbnZhciBTREtfR0xPQkFMID0gJ1NDJztcblxudmFyIFNvdW5kQ2xvdWQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFNvdW5kQ2xvdWQsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU291bmRDbG91ZCk7XG5cbiAgZnVuY3Rpb24gU291bmRDbG91ZCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU291bmRDbG91ZCk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImNhbGxQbGF5ZXJcIiwgX3V0aWxzLmNhbGxQbGF5ZXIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImR1cmF0aW9uXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImN1cnJlbnRUaW1lXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImZyYWN0aW9uTG9hZGVkXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm11dGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuc2V0Vm9sdW1lKDApO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVubXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMudm9sdW1lICE9PSBudWxsKSB7XG4gICAgICAgIF90aGlzLnNldFZvbHVtZShfdGhpcy5wcm9wcy52b2x1bWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlZlwiLCBmdW5jdGlvbiAoaWZyYW1lKSB7XG4gICAgICBfdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU291bmRDbG91ZCwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnByb3BzLm9uTW91bnQgJiYgdGhpcy5wcm9wcy5vbk1vdW50KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsLCBpc1JlYWR5KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgKDAsIF91dGlscy5nZXRTREspKFNES19VUkwsIFNES19HTE9CQUwpLnRoZW4oZnVuY3Rpb24gKFNDKSB7XG4gICAgICAgIGlmICghX3RoaXMyLmlmcmFtZSkgcmV0dXJuO1xuICAgICAgICB2YXIgX1NDJFdpZGdldCRFdmVudHMgPSBTQy5XaWRnZXQuRXZlbnRzLFxuICAgICAgICAgICAgUExBWSA9IF9TQyRXaWRnZXQkRXZlbnRzLlBMQVksXG4gICAgICAgICAgICBQTEFZX1BST0dSRVNTID0gX1NDJFdpZGdldCRFdmVudHMuUExBWV9QUk9HUkVTUyxcbiAgICAgICAgICAgIFBBVVNFID0gX1NDJFdpZGdldCRFdmVudHMuUEFVU0UsXG4gICAgICAgICAgICBGSU5JU0ggPSBfU0MkV2lkZ2V0JEV2ZW50cy5GSU5JU0gsXG4gICAgICAgICAgICBFUlJPUiA9IF9TQyRXaWRnZXQkRXZlbnRzLkVSUk9SO1xuXG4gICAgICAgIGlmICghaXNSZWFkeSkge1xuICAgICAgICAgIF90aGlzMi5wbGF5ZXIgPSBTQy5XaWRnZXQoX3RoaXMyLmlmcmFtZSk7XG5cbiAgICAgICAgICBfdGhpczIucGxheWVyLmJpbmQoUExBWSwgX3RoaXMyLnByb3BzLm9uUGxheSk7XG5cbiAgICAgICAgICBfdGhpczIucGxheWVyLmJpbmQoUEFVU0UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZW1haW5pbmcgPSBfdGhpczIuZHVyYXRpb24gLSBfdGhpczIuY3VycmVudFRpbWU7XG5cbiAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAwLjA1KSB7XG4gICAgICAgICAgICAgIC8vIFByZXZlbnQgb25QYXVzZSBmaXJpbmcgcmlnaHQgYmVmb3JlIG9uRW5kZWRcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpczIucHJvcHMub25QYXVzZSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMyLnBsYXllci5iaW5kKFBMQVlfUFJPR1JFU1MsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBfdGhpczIuY3VycmVudFRpbWUgPSBlLmN1cnJlbnRQb3NpdGlvbiAvIDEwMDA7XG4gICAgICAgICAgICBfdGhpczIuZnJhY3Rpb25Mb2FkZWQgPSBlLmxvYWRlZFByb2dyZXNzO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMyLnBsYXllci5iaW5kKEZJTklTSCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5wcm9wcy5vbkVuZGVkKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBfdGhpczIucGxheWVyLmJpbmQoRVJST1IsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyLnByb3BzLm9uRXJyb3IoZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczIucGxheWVyLmxvYWQodXJsLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMi5wcm9wcy5jb25maWcub3B0aW9ucyksIHt9LCB7XG4gICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgICAgICAgX3RoaXMyLnBsYXllci5nZXREdXJhdGlvbihmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgX3RoaXMyLmR1cmF0aW9uID0gZHVyYXRpb24gLyAxMDAwO1xuXG4gICAgICAgICAgICAgIF90aGlzMi5wcm9wcy5vblJlYWR5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwbGF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BsYXknKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BhdXNlJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHsvLyBOb3RoaW5nIHRvIGRvXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlZWtUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZWVrVG8oc2Vjb25kcykge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZWVrVG8nLCBzZWNvbmRzICogMTAwMCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFZvbHVtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWb2x1bWUoZnJhY3Rpb24pIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2V0Vm9sdW1lJywgZnJhY3Rpb24gKiAxMDApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VGltZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcmFjdGlvbkxvYWRlZCAqIHRoaXMuZHVyYXRpb247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgZGlzcGxheSA9IHRoaXMucHJvcHMuZGlzcGxheTtcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgIGRpc3BsYXk6IGRpc3BsYXlcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImlmcmFtZVwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHNyYzogXCJodHRwczovL3cuc291bmRjbG91ZC5jb20vcGxheWVyLz91cmw9XCIuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLnByb3BzLnVybCkpLFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGZyYW1lQm9yZGVyOiAwLFxuICAgICAgICBhbGxvdzogXCJhdXRvcGxheVwiXG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU291bmRDbG91ZDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gU291bmRDbG91ZDtcblxuX2RlZmluZVByb3BlcnR5KFNvdW5kQ2xvdWQsIFwiZGlzcGxheU5hbWVcIiwgJ1NvdW5kQ2xvdWQnKTtcblxuX2RlZmluZVByb3BlcnR5KFNvdW5kQ2xvdWQsIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS5zb3VuZGNsb3VkKTtcblxuX2RlZmluZVByb3BlcnR5KFNvdW5kQ2xvdWQsIFwibG9vcE9uRW5kZWRcIiwgdHJ1ZSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgU0RLX1VSTCA9ICdodHRwczovL3BsYXllci52aW1lby5jb20vYXBpL3BsYXllci5qcyc7XG52YXIgU0RLX0dMT0JBTCA9ICdWaW1lbyc7XG5cbnZhciBWaW1lbyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVmltZW8sIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoVmltZW8pO1xuXG4gIGZ1bmN0aW9uIFZpbWVvKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBWaW1lbyk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImNhbGxQbGF5ZXJcIiwgX3V0aWxzLmNhbGxQbGF5ZXIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImR1cmF0aW9uXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImN1cnJlbnRUaW1lXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInNlY29uZHNMb2FkZWRcIiwgbnVsbCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRWb2x1bWUoMCk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5wcm9wcy52b2x1bWUgIT09IG51bGwpIHtcbiAgICAgICAgX3RoaXMuc2V0Vm9sdW1lKF90aGlzLnByb3BzLnZvbHVtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicmVmXCIsIGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICAgIF90aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB9KTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhWaW1lbywgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnByb3BzLm9uTW91bnQgJiYgdGhpcy5wcm9wcy5vbk1vdW50KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdGhpcy5kdXJhdGlvbiA9IG51bGw7XG4gICAgICAoMCwgX3V0aWxzLmdldFNESykoU0RLX1VSTCwgU0RLX0dMT0JBTCkudGhlbihmdW5jdGlvbiAoVmltZW8pIHtcbiAgICAgICAgaWYgKCFfdGhpczIuY29udGFpbmVyKSByZXR1cm47XG4gICAgICAgIHZhciBfdGhpczIkcHJvcHMkY29uZmlnID0gX3RoaXMyLnByb3BzLmNvbmZpZyxcbiAgICAgICAgICAgIHBsYXllck9wdGlvbnMgPSBfdGhpczIkcHJvcHMkY29uZmlnLnBsYXllck9wdGlvbnMsXG4gICAgICAgICAgICB0aXRsZSA9IF90aGlzMiRwcm9wcyRjb25maWcudGl0bGU7XG4gICAgICAgIF90aGlzMi5wbGF5ZXIgPSBuZXcgVmltZW8uUGxheWVyKF90aGlzMi5jb250YWluZXIsIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgIGF1dG9wbGF5OiBfdGhpczIucHJvcHMucGxheWluZyxcbiAgICAgICAgICBtdXRlZDogX3RoaXMyLnByb3BzLm11dGVkLFxuICAgICAgICAgIGxvb3A6IF90aGlzMi5wcm9wcy5sb29wLFxuICAgICAgICAgIHBsYXlzaW5saW5lOiBfdGhpczIucHJvcHMucGxheXNpbmxpbmUsXG4gICAgICAgICAgY29udHJvbHM6IF90aGlzMi5wcm9wcy5jb250cm9sc1xuICAgICAgICB9LCBwbGF5ZXJPcHRpb25zKSk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBpZnJhbWUgPSBfdGhpczIuY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO1xuXG4gICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG5cbiAgICAgICAgICBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgIGlmcmFtZS50aXRsZSA9IHRpdGxlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlbXCJjYXRjaFwiXShfdGhpczIucHJvcHMub25FcnJvcik7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5vbignbG9hZGVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMi5wcm9wcy5vblJlYWR5KCk7XG5cbiAgICAgICAgICBfdGhpczIucmVmcmVzaER1cmF0aW9uKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3BsYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLnByb3BzLm9uUGxheSgpO1xuXG4gICAgICAgICAgX3RoaXMyLnJlZnJlc2hEdXJhdGlvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdwYXVzZScsIF90aGlzMi5wcm9wcy5vblBhdXNlKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdzZWVrZWQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczIucHJvcHMub25TZWVrKGUuc2Vjb25kcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ2VuZGVkJywgX3RoaXMyLnByb3BzLm9uRW5kZWQpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ2Vycm9yJywgX3RoaXMyLnByb3BzLm9uRXJyb3IpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3RpbWV1cGRhdGUnLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgIHZhciBzZWNvbmRzID0gX3JlZi5zZWNvbmRzO1xuICAgICAgICAgIF90aGlzMi5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3Byb2dyZXNzJywgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIHNlY29uZHMgPSBfcmVmMi5zZWNvbmRzO1xuICAgICAgICAgIF90aGlzMi5zZWNvbmRzTG9hZGVkID0gc2Vjb25kcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5vbignYnVmZmVyc3RhcnQnLCBfdGhpczIucHJvcHMub25CdWZmZXIpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ2J1ZmZlcmVuZCcsIF90aGlzMi5wcm9wcy5vbkJ1ZmZlckVuZCk7XG4gICAgICB9LCB0aGlzLnByb3BzLm9uRXJyb3IpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZWZyZXNoRHVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVmcmVzaER1cmF0aW9uKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHRoaXMucGxheWVyLmdldER1cmF0aW9uKCkudGhlbihmdW5jdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgX3RoaXMzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdmFyIHByb21pc2UgPSB0aGlzLmNhbGxQbGF5ZXIoJ3BsYXknKTtcblxuICAgICAgaWYgKHByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZVtcImNhdGNoXCJdKHRoaXMucHJvcHMub25FcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwYXVzZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3VubG9hZCcpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKHNlY29uZHMpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2V0Q3VycmVudFRpbWUnLCBzZWNvbmRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vm9sdW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZvbHVtZShmcmFjdGlvbikge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRWb2x1bWUnLCBmcmFjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldExvb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TG9vcChsb29wKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldExvb3AnLCBsb29wKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UGxheWJhY2tSYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBsYXliYWNrUmF0ZShyYXRlKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldFBsYXliYWNrUmF0ZScsIHJhdGUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VGltZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWNvbmRzTG9hZGVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIGRpc3BsYXkgPSB0aGlzLnByb3BzLmRpc3BsYXk7XG4gICAgICB2YXIgc3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgIGRpc3BsYXk6IGRpc3BsYXlcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGtleTogdGhpcy5wcm9wcy51cmwsXG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFZpbWVvO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBWaW1lbztcblxuX2RlZmluZVByb3BlcnR5KFZpbWVvLCBcImRpc3BsYXlOYW1lXCIsICdWaW1lbycpO1xuXG5fZGVmaW5lUHJvcGVydHkoVmltZW8sIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS52aW1lbyk7XG5cbl9kZWZpbmVQcm9wZXJ0eShWaW1lbywgXCJmb3JjZUxvYWRcIiwgdHJ1ZSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBTREtfVVJMID0gJ2h0dHBzOi8vY29ubmVjdC5mYWNlYm9vay5uZXQvZW5fVVMvc2RrLmpzJztcbnZhciBTREtfR0xPQkFMID0gJ0ZCJztcbnZhciBTREtfR0xPQkFMX1JFQURZID0gJ2ZiQXN5bmNJbml0JztcbnZhciBQTEFZRVJfSURfUFJFRklYID0gJ2ZhY2Vib29rLXBsYXllci0nO1xuXG52YXIgRmFjZWJvb2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKEZhY2Vib29rLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEZhY2Vib29rKTtcblxuICBmdW5jdGlvbiBGYWNlYm9vaygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmFjZWJvb2spO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwbGF5ZXJJRFwiLCBfdGhpcy5wcm9wcy5jb25maWcucGxheWVySWQgfHwgXCJcIi5jb25jYXQoUExBWUVSX0lEX1BSRUZJWCkuY29uY2F0KCgwLCBfdXRpbHMucmFuZG9tU3RyaW5nKSgpKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCdtdXRlJyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNhbGxQbGF5ZXIoJ3VubXV0ZScpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZhY2Vib29rLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMucHJvcHMub25Nb3VudCAmJiB0aGlzLnByb3BzLm9uTW91bnQodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZCh1cmwsIGlzUmVhZHkpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAoaXNSZWFkeSkge1xuICAgICAgICAoMCwgX3V0aWxzLmdldFNESykoU0RLX1VSTCwgU0RLX0dMT0JBTCwgU0RLX0dMT0JBTF9SRUFEWSkudGhlbihmdW5jdGlvbiAoRkIpIHtcbiAgICAgICAgICByZXR1cm4gRkIuWEZCTUwucGFyc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgKDAsIF91dGlscy5nZXRTREspKFNES19VUkwsIFNES19HTE9CQUwsIFNES19HTE9CQUxfUkVBRFkpLnRoZW4oZnVuY3Rpb24gKEZCKSB7XG4gICAgICAgIEZCLmluaXQoe1xuICAgICAgICAgIGFwcElkOiBfdGhpczIucHJvcHMuY29uZmlnLmFwcElkLFxuICAgICAgICAgIHhmYm1sOiB0cnVlLFxuICAgICAgICAgIHZlcnNpb246IF90aGlzMi5wcm9wcy5jb25maWcudmVyc2lvblxuICAgICAgICB9KTtcbiAgICAgICAgRkIuRXZlbnQuc3Vic2NyaWJlKCd4ZmJtbC5yZW5kZXInLCBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAgICAgLy8gSGVyZSB3ZSBrbm93IHRoZSBTREsgaGFzIGxvYWRlZCwgZXZlbiBpZiBvblJlYWR5L29uUGxheVxuICAgICAgICAgIC8vIGlzIG5vdCBjYWxsZWQgZHVlIHRvIGEgdmlkZW8gdGhhdCBjYW5ub3QgYmUgZW1iZWRkZWRcbiAgICAgICAgICBfdGhpczIucHJvcHMub25Mb2FkZWQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIEZCLkV2ZW50LnN1YnNjcmliZSgneGZibWwucmVhZHknLCBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAgICAgaWYgKG1zZy50eXBlID09PSAndmlkZW8nICYmIG1zZy5pZCA9PT0gX3RoaXMyLnBsYXllcklEKSB7XG4gICAgICAgICAgICBfdGhpczIucGxheWVyID0gbXNnLmluc3RhbmNlO1xuXG4gICAgICAgICAgICBfdGhpczIucGxheWVyLnN1YnNjcmliZSgnc3RhcnRlZFBsYXlpbmcnLCBfdGhpczIucHJvcHMub25QbGF5KTtcblxuICAgICAgICAgICAgX3RoaXMyLnBsYXllci5zdWJzY3JpYmUoJ3BhdXNlZCcsIF90aGlzMi5wcm9wcy5vblBhdXNlKTtcblxuICAgICAgICAgICAgX3RoaXMyLnBsYXllci5zdWJzY3JpYmUoJ2ZpbmlzaGVkUGxheWluZycsIF90aGlzMi5wcm9wcy5vbkVuZGVkKTtcblxuICAgICAgICAgICAgX3RoaXMyLnBsYXllci5zdWJzY3JpYmUoJ3N0YXJ0ZWRCdWZmZXJpbmcnLCBfdGhpczIucHJvcHMub25CdWZmZXIpO1xuXG4gICAgICAgICAgICBfdGhpczIucGxheWVyLnN1YnNjcmliZSgnZmluaXNoZWRCdWZmZXJpbmcnLCBfdGhpczIucHJvcHMub25CdWZmZXJFbmQpO1xuXG4gICAgICAgICAgICBfdGhpczIucGxheWVyLnN1YnNjcmliZSgnZXJyb3InLCBfdGhpczIucHJvcHMub25FcnJvcik7XG5cbiAgICAgICAgICAgIGlmIChfdGhpczIucHJvcHMubXV0ZWQpIHtcbiAgICAgICAgICAgICAgX3RoaXMyLmNhbGxQbGF5ZXIoJ211dGUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIF90aGlzMi5jYWxsUGxheWVyKCd1bm11dGUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3RoaXMyLnByb3BzLm9uUmVhZHkoKTsgLy8gRm9yIHNvbWUgcmVhc29uIEZhY2Vib29rIGhhdmUgYWRkZWQgYHZpc2liaWxpdHk6IGhpZGRlbmBcbiAgICAgICAgICAgIC8vIHRvIHRoZSBpZnJhbWUgd2hlbiBhdXRvcGxheSBmYWlscywgc28gaGVyZSB3ZSBzZXQgaXQgYmFja1xuXG5cbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKF90aGlzMi5wbGF5ZXJJRCkucXVlcnlTZWxlY3RvcignaWZyYW1lJykuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGF1c2UnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkgey8vIE5vdGhpbmcgdG8gZG9cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2Vla1RvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlZWtUbyhzZWNvbmRzKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NlZWsnLCBzZWNvbmRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vm9sdW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZvbHVtZShmcmFjdGlvbikge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRWb2x1bWUnLCBmcmFjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbFBsYXllcignZ2V0RHVyYXRpb24nKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsUGxheWVyKCdnZXRDdXJyZW50UG9zaXRpb24nKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2Vjb25kc0xvYWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTZWNvbmRzTG9hZGVkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMucHJvcHMuY29uZmlnLmF0dHJpYnV0ZXM7XG4gICAgICB2YXIgc3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIGlkOiB0aGlzLnBsYXllcklELFxuICAgICAgICBjbGFzc05hbWU6IFwiZmItdmlkZW9cIixcbiAgICAgICAgXCJkYXRhLWhyZWZcIjogdGhpcy5wcm9wcy51cmwsXG4gICAgICAgIFwiZGF0YS1hdXRvcGxheVwiOiB0aGlzLnByb3BzLnBsYXlpbmcgPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgICBcImRhdGEtYWxsb3dmdWxsc2NyZWVuXCI6IFwidHJ1ZVwiLFxuICAgICAgICBcImRhdGEtY29udHJvbHNcIjogdGhpcy5wcm9wcy5jb250cm9scyA/ICd0cnVlJyA6ICdmYWxzZSdcbiAgICAgIH0sIGF0dHJpYnV0ZXMpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRmFjZWJvb2s7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEZhY2Vib29rO1xuXG5fZGVmaW5lUHJvcGVydHkoRmFjZWJvb2ssIFwiZGlzcGxheU5hbWVcIiwgJ0ZhY2Vib29rJyk7XG5cbl9kZWZpbmVQcm9wZXJ0eShGYWNlYm9vaywgXCJjYW5QbGF5XCIsIF9wYXR0ZXJucy5jYW5QbGF5LmZhY2Vib29rKTtcblxuX2RlZmluZVByb3BlcnR5KEZhY2Vib29rLCBcImxvb3BPbkVuZGVkXCIsIHRydWUpOyIsICJcInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiOyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IH0gcmV0dXJuIF90eXBlb2Yob2JqKTsgfVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB2b2lkIDA7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuXG52YXIgX3BhdHRlcm5zID0gcmVxdWlyZShcIi4uL3BhdHRlcm5zXCIpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTsgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyByZXR1cm4gY2FjaGU7IH07IHJldHVybiBjYWNoZTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBcImRlZmF1bHRcIjogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqW1wiZGVmYXVsdFwiXSA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgU0RLX1VSTCA9ICdodHRwczovL2Nkbi5lbWJlZC5seS9wbGF5ZXItMC4xLjAubWluLmpzJztcbnZhciBTREtfR0xPQkFMID0gJ3BsYXllcmpzJztcblxudmFyIFN0cmVhbWFibGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFN0cmVhbWFibGUsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoU3RyZWFtYWJsZSk7XG5cbiAgZnVuY3Rpb24gU3RyZWFtYWJsZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3RyZWFtYWJsZSk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoYXJncykpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImNhbGxQbGF5ZXJcIiwgX3V0aWxzLmNhbGxQbGF5ZXIpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImR1cmF0aW9uXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImN1cnJlbnRUaW1lXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInNlY29uZHNMb2FkZWRcIiwgbnVsbCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCdtdXRlJyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNhbGxQbGF5ZXIoJ3VubXV0ZScpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlZlwiLCBmdW5jdGlvbiAoaWZyYW1lKSB7XG4gICAgICBfdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU3RyZWFtYWJsZSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnByb3BzLm9uTW91bnQgJiYgdGhpcy5wcm9wcy5vbk1vdW50KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgKDAsIF91dGlscy5nZXRTREspKFNES19VUkwsIFNES19HTE9CQUwpLnRoZW4oZnVuY3Rpb24gKHBsYXllcmpzKSB7XG4gICAgICAgIGlmICghX3RoaXMyLmlmcmFtZSkgcmV0dXJuO1xuICAgICAgICBfdGhpczIucGxheWVyID0gbmV3IHBsYXllcmpzLlBsYXllcihfdGhpczIuaWZyYW1lKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLnNldExvb3AoX3RoaXMyLnByb3BzLmxvb3ApO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3JlYWR5JywgX3RoaXMyLnByb3BzLm9uUmVhZHkpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3BsYXknLCBfdGhpczIucHJvcHMub25QbGF5KTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdwYXVzZScsIF90aGlzMi5wcm9wcy5vblBhdXNlKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdzZWVrZWQnLCBfdGhpczIucHJvcHMub25TZWVrKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdlbmRlZCcsIF90aGlzMi5wcm9wcy5vbkVuZGVkKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCdlcnJvcicsIF90aGlzMi5wcm9wcy5vbkVycm9yKTtcblxuICAgICAgICBfdGhpczIucGxheWVyLm9uKCd0aW1ldXBkYXRlJywgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgICB2YXIgZHVyYXRpb24gPSBfcmVmLmR1cmF0aW9uLFxuICAgICAgICAgICAgICBzZWNvbmRzID0gX3JlZi5zZWNvbmRzO1xuICAgICAgICAgIF90aGlzMi5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuICAgICAgICAgIF90aGlzMi5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ2J1ZmZlcmVkJywgZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgdmFyIHBlcmNlbnQgPSBfcmVmMi5wZXJjZW50O1xuXG4gICAgICAgICAgaWYgKF90aGlzMi5kdXJhdGlvbikge1xuICAgICAgICAgICAgX3RoaXMyLnNlY29uZHNMb2FkZWQgPSBfdGhpczIuZHVyYXRpb24gKiBwZXJjZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF90aGlzMi5wcm9wcy5tdXRlZCkge1xuICAgICAgICAgIF90aGlzMi5wbGF5ZXIubXV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzLnByb3BzLm9uRXJyb3IpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwbGF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BsYXknKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BhdXNlJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHsvLyBOb3RoaW5nIHRvIGRvXG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlZWtUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZWVrVG8oc2Vjb25kcykge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRDdXJyZW50VGltZScsIHNlY29uZHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGZyYWN0aW9uKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldFZvbHVtZScsIGZyYWN0aW9uICogMTAwKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0TG9vcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRMb29wKGxvb3ApIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2V0TG9vcCcsIGxvb3ApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmR1cmF0aW9uO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VGltZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWNvbmRzTG9hZGVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIGlkID0gdGhpcy5wcm9wcy51cmwubWF0Y2goX3BhdHRlcm5zLk1BVENIX1VSTF9TVFJFQU1BQkxFKVsxXTtcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImlmcmFtZVwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHNyYzogXCJodHRwczovL3N0cmVhbWFibGUuY29tL28vXCIuY29uY2F0KGlkKSxcbiAgICAgICAgZnJhbWVCb3JkZXI6IFwiMFwiLFxuICAgICAgICBzY3JvbGxpbmc6IFwibm9cIixcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBhbGxvdzogXCJlbmNyeXB0ZWQtbWVkaWE7IGF1dG9wbGF5OyBmdWxsc2NyZWVuO1wiXG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3RyZWFtYWJsZTtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gU3RyZWFtYWJsZTtcblxuX2RlZmluZVByb3BlcnR5KFN0cmVhbWFibGUsIFwiZGlzcGxheU5hbWVcIiwgJ1N0cmVhbWFibGUnKTtcblxuX2RlZmluZVByb3BlcnR5KFN0cmVhbWFibGUsIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS5zdHJlYW1hYmxlKTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcblxudmFyIF9wYXR0ZXJucyA9IHJlcXVpcmUoXCIuLi9wYXR0ZXJuc1wiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBTREtfVVJMID0gJ2h0dHBzOi8vZmFzdC53aXN0aWEuY29tL2Fzc2V0cy9leHRlcm5hbC9FLXYxLmpzJztcbnZhciBTREtfR0xPQkFMID0gJ1dpc3RpYSc7XG52YXIgUExBWUVSX0lEX1BSRUZJWCA9ICd3aXN0aWEtcGxheWVyLSc7XG5cbnZhciBXaXN0aWEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFdpc3RpYSwgX0NvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihXaXN0aWEpO1xuXG4gIGZ1bmN0aW9uIFdpc3RpYSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2lzdGlhKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBfYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIF9hcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KF9hcmdzKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiY2FsbFBsYXllclwiLCBfdXRpbHMuY2FsbFBsYXllcik7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicGxheWVySURcIiwgX3RoaXMucHJvcHMuY29uZmlnLnBsYXllcklkIHx8IFwiXCIuY29uY2F0KFBMQVlFUl9JRF9QUkVGSVgpLmNvbmNhdCgoMCwgX3V0aWxzLnJhbmRvbVN0cmluZykoKSkpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uUGxheVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM7XG5cbiAgICAgIHJldHVybiAoX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcykub25QbGF5LmFwcGx5KF90aGlzJHByb3BzLCBhcmd1bWVudHMpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uUGF1c2VcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMjtcblxuICAgICAgcmV0dXJuIChfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcykub25QYXVzZS5hcHBseShfdGhpcyRwcm9wczIsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25TZWVrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczM7XG5cbiAgICAgIHJldHVybiAoX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMpLm9uU2Vlay5hcHBseShfdGhpcyRwcm9wczMsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25FbmRlZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0O1xuXG4gICAgICByZXR1cm4gKF90aGlzJHByb3BzNCA9IF90aGlzLnByb3BzKS5vbkVuZGVkLmFwcGx5KF90aGlzJHByb3BzNCwgYXJndW1lbnRzKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblBsYXliYWNrUmF0ZUNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1O1xuXG4gICAgICByZXR1cm4gKF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzKS5vblBsYXliYWNrUmF0ZUNoYW5nZS5hcHBseShfdGhpcyRwcm9wczUsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCdtdXRlJyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNhbGxQbGF5ZXIoJ3VubXV0ZScpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFdpc3RpYSwgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnByb3BzLm9uTW91bnQgJiYgdGhpcy5wcm9wcy5vbk1vdW50KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIF90aGlzJHByb3BzNiA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzNi5wbGF5aW5nLFxuICAgICAgICAgIG11dGVkID0gX3RoaXMkcHJvcHM2Lm11dGVkLFxuICAgICAgICAgIGNvbnRyb2xzID0gX3RoaXMkcHJvcHM2LmNvbnRyb2xzLFxuICAgICAgICAgIF9vblJlYWR5ID0gX3RoaXMkcHJvcHM2Lm9uUmVhZHksXG4gICAgICAgICAgY29uZmlnID0gX3RoaXMkcHJvcHM2LmNvbmZpZyxcbiAgICAgICAgICBvbkVycm9yID0gX3RoaXMkcHJvcHM2Lm9uRXJyb3I7XG4gICAgICAoMCwgX3V0aWxzLmdldFNESykoU0RLX1VSTCwgU0RLX0dMT0JBTCkudGhlbihmdW5jdGlvbiAoV2lzdGlhKSB7XG4gICAgICAgIGlmIChjb25maWcuY3VzdG9tQ29udHJvbHMpIHtcbiAgICAgICAgICBjb25maWcuY3VzdG9tQ29udHJvbHMuZm9yRWFjaChmdW5jdGlvbiAoY29udHJvbCkge1xuICAgICAgICAgICAgcmV0dXJuIFdpc3RpYS5kZWZpbmVDb250cm9sKGNvbnRyb2wpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgd2luZG93Ll93cSA9IHdpbmRvdy5fd3EgfHwgW107XG5cbiAgICAgICAgd2luZG93Ll93cS5wdXNoKHtcbiAgICAgICAgICBpZDogX3RoaXMyLnBsYXllcklELFxuICAgICAgICAgIG9wdGlvbnM6IF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgICAgYXV0b1BsYXk6IHBsYXlpbmcsXG4gICAgICAgICAgICBzaWxlbnRBdXRvUGxheTogJ2FsbG93JyxcbiAgICAgICAgICAgIG11dGVkOiBtdXRlZCxcbiAgICAgICAgICAgIGNvbnRyb2xzVmlzaWJsZU9uTG9hZDogY29udHJvbHMsXG4gICAgICAgICAgICBmdWxsc2NyZWVuQnV0dG9uOiBjb250cm9scyxcbiAgICAgICAgICAgIHBsYXliYXI6IGNvbnRyb2xzLFxuICAgICAgICAgICAgcGxheWJhY2tSYXRlQ29udHJvbDogY29udHJvbHMsXG4gICAgICAgICAgICBxdWFsaXR5Q29udHJvbDogY29udHJvbHMsXG4gICAgICAgICAgICB2b2x1bWVDb250cm9sOiBjb250cm9scyxcbiAgICAgICAgICAgIHNldHRpbmdzQ29udHJvbDogY29udHJvbHMsXG4gICAgICAgICAgICBzbWFsbFBsYXlCdXR0b246IGNvbnRyb2xzXG4gICAgICAgICAgfSwgY29uZmlnLm9wdGlvbnMpLFxuICAgICAgICAgIG9uUmVhZHk6IGZ1bmN0aW9uIG9uUmVhZHkocGxheWVyKSB7XG4gICAgICAgICAgICBfdGhpczIucGxheWVyID0gcGxheWVyO1xuXG4gICAgICAgICAgICBfdGhpczIudW5iaW5kKCk7XG5cbiAgICAgICAgICAgIF90aGlzMi5wbGF5ZXIuYmluZCgncGxheScsIF90aGlzMi5vblBsYXkpO1xuXG4gICAgICAgICAgICBfdGhpczIucGxheWVyLmJpbmQoJ3BhdXNlJywgX3RoaXMyLm9uUGF1c2UpO1xuXG4gICAgICAgICAgICBfdGhpczIucGxheWVyLmJpbmQoJ3NlZWsnLCBfdGhpczIub25TZWVrKTtcblxuICAgICAgICAgICAgX3RoaXMyLnBsYXllci5iaW5kKCdlbmQnLCBfdGhpczIub25FbmRlZCk7XG5cbiAgICAgICAgICAgIF90aGlzMi5wbGF5ZXIuYmluZCgncGxheWJhY2tyYXRlY2hhbmdlJywgX3RoaXMyLm9uUGxheWJhY2tSYXRlQ2hhbmdlKTtcblxuICAgICAgICAgICAgX29uUmVhZHkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgb25FcnJvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVuYmluZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bmJpbmQoKSB7XG4gICAgICB0aGlzLnBsYXllci51bmJpbmQoJ3BsYXknLCB0aGlzLm9uUGxheSk7XG4gICAgICB0aGlzLnBsYXllci51bmJpbmQoJ3BhdXNlJywgdGhpcy5vblBhdXNlKTtcbiAgICAgIHRoaXMucGxheWVyLnVuYmluZCgnc2VlaycsIHRoaXMub25TZWVrKTtcbiAgICAgIHRoaXMucGxheWVyLnVuYmluZCgnZW5kJywgdGhpcy5vbkVuZGVkKTtcbiAgICAgIHRoaXMucGxheWVyLnVuYmluZCgncGxheWJhY2tyYXRlY2hhbmdlJywgdGhpcy5vblBsYXliYWNrUmF0ZUNoYW5nZSk7XG4gICAgfSAvLyBQcm94eSBtZXRob2RzIHRvIHByZXZlbnQgbGlzdGVuZXIgbGVha3NcblxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGF1c2UnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgdGhpcy51bmJpbmQoKTtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncmVtb3ZlJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlZWtUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZWVrVG8oc2Vjb25kcykge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCd0aW1lJywgc2Vjb25kcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFZvbHVtZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWb2x1bWUoZnJhY3Rpb24pIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigndm9sdW1lJywgZnJhY3Rpb24pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRQbGF5YmFja1JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UGxheWJhY2tSYXRlKHJhdGUpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheWJhY2tSYXRlJywgcmF0ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbFBsYXllcignZHVyYXRpb24nKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsUGxheWVyKCd0aW1lJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNlY29uZHNMb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2Vjb25kc0xvYWRlZCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHVybCA9IHRoaXMucHJvcHMudXJsO1xuICAgICAgdmFyIHZpZGVvSUQgPSB1cmwgJiYgdXJsLm1hdGNoKF9wYXR0ZXJucy5NQVRDSF9VUkxfV0lTVElBKVsxXTtcbiAgICAgIHZhciBjbGFzc05hbWUgPSBcIndpc3RpYV9lbWJlZCB3aXN0aWFfYXN5bmNfXCIuY29uY2F0KHZpZGVvSUQpO1xuICAgICAgdmFyIHN0eWxlID0ge1xuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgaWQ6IHRoaXMucGxheWVySUQsXG4gICAgICAgIGtleTogdmlkZW9JRCxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFdpc3RpYTtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gV2lzdGlhO1xuXG5fZGVmaW5lUHJvcGVydHkoV2lzdGlhLCBcImRpc3BsYXlOYW1lXCIsICdXaXN0aWEnKTtcblxuX2RlZmluZVByb3BlcnR5KFdpc3RpYSwgXCJjYW5QbGF5XCIsIF9wYXR0ZXJucy5jYW5QbGF5Lndpc3RpYSk7XG5cbl9kZWZpbmVQcm9wZXJ0eShXaXN0aWEsIFwibG9vcE9uRW5kZWRcIiwgdHJ1ZSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgU0RLX1VSTCA9ICdodHRwczovL3BsYXllci50d2l0Y2gudHYvanMvZW1iZWQvdjEuanMnO1xudmFyIFNES19HTE9CQUwgPSAnVHdpdGNoJztcbnZhciBQTEFZRVJfSURfUFJFRklYID0gJ3R3aXRjaC1wbGF5ZXItJztcblxudmFyIFR3aXRjaCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoVHdpdGNoLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFR3aXRjaCk7XG5cbiAgZnVuY3Rpb24gVHdpdGNoKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUd2l0Y2gpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwbGF5ZXJJRFwiLCBfdGhpcy5wcm9wcy5jb25maWcucGxheWVySWQgfHwgXCJcIi5jb25jYXQoUExBWUVSX0lEX1BSRUZJWCkuY29uY2F0KCgwLCBfdXRpbHMucmFuZG9tU3RyaW5nKSgpKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCdzZXRNdXRlZCcsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVubXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCdzZXRNdXRlZCcsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUd2l0Y2gsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCwgaXNSZWFkeSkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcGxheXNpbmxpbmUgPSBfdGhpcyRwcm9wcy5wbGF5c2lubGluZSxcbiAgICAgICAgICBvbkVycm9yID0gX3RoaXMkcHJvcHMub25FcnJvcixcbiAgICAgICAgICBjb25maWcgPSBfdGhpcyRwcm9wcy5jb25maWcsXG4gICAgICAgICAgY29udHJvbHMgPSBfdGhpcyRwcm9wcy5jb250cm9scztcblxuICAgICAgdmFyIGlzQ2hhbm5lbCA9IF9wYXR0ZXJucy5NQVRDSF9VUkxfVFdJVENIX0NIQU5ORUwudGVzdCh1cmwpO1xuXG4gICAgICB2YXIgaWQgPSBpc0NoYW5uZWwgPyB1cmwubWF0Y2goX3BhdHRlcm5zLk1BVENIX1VSTF9UV0lUQ0hfQ0hBTk5FTClbMV0gOiB1cmwubWF0Y2goX3BhdHRlcm5zLk1BVENIX1VSTF9UV0lUQ0hfVklERU8pWzFdO1xuXG4gICAgICBpZiAoaXNSZWFkeSkge1xuICAgICAgICBpZiAoaXNDaGFubmVsKSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIuc2V0Q2hhbm5lbChpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIuc2V0VmlkZW8oJ3YnICsgaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAoMCwgX3V0aWxzLmdldFNESykoU0RLX1VSTCwgU0RLX0dMT0JBTCkudGhlbihmdW5jdGlvbiAoVHdpdGNoKSB7XG4gICAgICAgIF90aGlzMi5wbGF5ZXIgPSBuZXcgVHdpdGNoLlBsYXllcihfdGhpczIucGxheWVySUQsIF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHZpZGVvOiBpc0NoYW5uZWwgPyAnJyA6IGlkLFxuICAgICAgICAgIGNoYW5uZWw6IGlzQ2hhbm5lbCA/IGlkIDogJycsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBwbGF5c2lubGluZTogcGxheXNpbmxpbmUsXG4gICAgICAgICAgYXV0b3BsYXk6IF90aGlzMi5wcm9wcy5wbGF5aW5nLFxuICAgICAgICAgIG11dGVkOiBfdGhpczIucHJvcHMubXV0ZWQsXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0Nvb2tQZXRlL3JlYWN0LXBsYXllci9pc3N1ZXMvNzMzI2lzc3VlY29tbWVudC01NDkwODU4NTlcbiAgICAgICAgICBjb250cm9sczogaXNDaGFubmVsID8gdHJ1ZSA6IGNvbnRyb2xzLFxuICAgICAgICAgIHRpbWU6ICgwLCBfdXRpbHMucGFyc2VTdGFydFRpbWUpKHVybClcbiAgICAgICAgfSwgY29uZmlnLm9wdGlvbnMpKTtcbiAgICAgICAgdmFyIF9Ud2l0Y2gkUGxheWVyID0gVHdpdGNoLlBsYXllcixcbiAgICAgICAgICAgIFJFQURZID0gX1R3aXRjaCRQbGF5ZXIuUkVBRFksXG4gICAgICAgICAgICBQTEFZSU5HID0gX1R3aXRjaCRQbGF5ZXIuUExBWUlORyxcbiAgICAgICAgICAgIFBBVVNFID0gX1R3aXRjaCRQbGF5ZXIuUEFVU0UsXG4gICAgICAgICAgICBFTkRFRCA9IF9Ud2l0Y2gkUGxheWVyLkVOREVELFxuICAgICAgICAgICAgT05MSU5FID0gX1R3aXRjaCRQbGF5ZXIuT05MSU5FLFxuICAgICAgICAgICAgT0ZGTElORSA9IF9Ud2l0Y2gkUGxheWVyLk9GRkxJTkUsXG4gICAgICAgICAgICBTRUVLID0gX1R3aXRjaCRQbGF5ZXIuU0VFSztcblxuICAgICAgICBfdGhpczIucGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoUkVBRFksIF90aGlzMi5wcm9wcy5vblJlYWR5KTtcblxuICAgICAgICBfdGhpczIucGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoUExBWUlORywgX3RoaXMyLnByb3BzLm9uUGxheSk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5hZGRFdmVudExpc3RlbmVyKFBBVVNFLCBfdGhpczIucHJvcHMub25QYXVzZSk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5hZGRFdmVudExpc3RlbmVyKEVOREVELCBfdGhpczIucHJvcHMub25FbmRlZCk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5hZGRFdmVudExpc3RlbmVyKFNFRUssIF90aGlzMi5wcm9wcy5vblNlZWspOyAvLyBQcmV2ZW50IHdlaXJkIGlzTG9hZGluZyBiZWhhdmlvdXIgd2hlbiBzdHJlYW1zIGFyZSBvZmZsaW5lXG5cblxuICAgICAgICBfdGhpczIucGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoT05MSU5FLCBfdGhpczIucHJvcHMub25Mb2FkZWQpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcihPRkZMSU5FLCBfdGhpczIucHJvcHMub25Mb2FkZWQpO1xuICAgICAgfSwgb25FcnJvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGF1c2UnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwYXVzZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKHNlY29uZHMpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2VlaycsIHNlY29uZHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGZyYWN0aW9uKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldFZvbHVtZScsIGZyYWN0aW9uKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RHVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RHVyYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWxsUGxheWVyKCdnZXREdXJhdGlvbicpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VGltZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbGxQbGF5ZXIoJ2dldEN1cnJlbnRUaW1lJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNlY29uZHNMb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2Vjb25kc0xvYWRlZCgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHN0eWxlID0ge1xuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgc3R5bGU6IHN0eWxlLFxuICAgICAgICBpZDogdGhpcy5wbGF5ZXJJRFxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFR3aXRjaDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gVHdpdGNoO1xuXG5fZGVmaW5lUHJvcGVydHkoVHdpdGNoLCBcImRpc3BsYXlOYW1lXCIsICdUd2l0Y2gnKTtcblxuX2RlZmluZVByb3BlcnR5KFR3aXRjaCwgXCJjYW5QbGF5XCIsIF9wYXR0ZXJucy5jYW5QbGF5LnR3aXRjaCk7XG5cbl9kZWZpbmVQcm9wZXJ0eShUd2l0Y2gsIFwibG9vcE9uRW5kZWRcIiwgdHJ1ZSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHsgcmV0dXJuIF9hcnJheVdpdGhIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgeyBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKF9kKSB0aHJvdyBfZTsgfSB9IHJldHVybiBfYXJyOyB9XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgU0RLX1VSTCA9ICdodHRwczovL2FwaS5kbWNkbi5uZXQvYWxsLmpzJztcbnZhciBTREtfR0xPQkFMID0gJ0RNJztcbnZhciBTREtfR0xPQkFMX1JFQURZID0gJ2RtQXN5bmNJbml0JztcblxudmFyIERhaWx5TW90aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhEYWlseU1vdGlvbiwgX0NvbXBvbmVudCk7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihEYWlseU1vdGlvbik7XG5cbiAgZnVuY3Rpb24gRGFpbHlNb3Rpb24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERhaWx5TW90aW9uKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChhcmdzKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiY2FsbFBsYXllclwiLCBfdXRpbHMuY2FsbFBsYXllcik7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25EdXJhdGlvbkNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZHVyYXRpb24gPSBfdGhpcy5nZXREdXJhdGlvbigpO1xuXG4gICAgICBfdGhpcy5wcm9wcy5vbkR1cmF0aW9uKGR1cmF0aW9uKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJtdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNhbGxQbGF5ZXIoJ3NldE11dGVkJywgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmNhbGxQbGF5ZXIoJ3NldE11dGVkJywgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlZlwiLCBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgICBfdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRGFpbHlNb3Rpb24sIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgY29udHJvbHMgPSBfdGhpcyRwcm9wcy5jb250cm9scyxcbiAgICAgICAgICBjb25maWcgPSBfdGhpcyRwcm9wcy5jb25maWcsXG4gICAgICAgICAgb25FcnJvciA9IF90aGlzJHByb3BzLm9uRXJyb3IsXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzLnBsYXlpbmc7XG5cbiAgICAgIHZhciBfdXJsJG1hdGNoID0gdXJsLm1hdGNoKF9wYXR0ZXJucy5NQVRDSF9VUkxfREFJTFlNT1RJT04pLFxuICAgICAgICAgIF91cmwkbWF0Y2gyID0gX3NsaWNlZFRvQXJyYXkoX3VybCRtYXRjaCwgMiksXG4gICAgICAgICAgaWQgPSBfdXJsJG1hdGNoMlsxXTtcblxuICAgICAgaWYgKHRoaXMucGxheWVyKSB7XG4gICAgICAgIHRoaXMucGxheWVyLmxvYWQoaWQsIHtcbiAgICAgICAgICBzdGFydDogKDAsIF91dGlscy5wYXJzZVN0YXJ0VGltZSkodXJsKSxcbiAgICAgICAgICBhdXRvcGxheTogcGxheWluZ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAoMCwgX3V0aWxzLmdldFNESykoU0RLX1VSTCwgU0RLX0dMT0JBTCwgU0RLX0dMT0JBTF9SRUFEWSwgZnVuY3Rpb24gKERNKSB7XG4gICAgICAgIHJldHVybiBETS5wbGF5ZXI7XG4gICAgICB9KS50aGVuKGZ1bmN0aW9uIChETSkge1xuICAgICAgICBpZiAoIV90aGlzMi5jb250YWluZXIpIHJldHVybjtcbiAgICAgICAgdmFyIFBsYXllciA9IERNLnBsYXllcjtcbiAgICAgICAgX3RoaXMyLnBsYXllciA9IG5ldyBQbGF5ZXIoX3RoaXMyLmNvbnRhaW5lciwge1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgdmlkZW86IGlkLFxuICAgICAgICAgIHBhcmFtczogX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgICBjb250cm9sczogY29udHJvbHMsXG4gICAgICAgICAgICBhdXRvcGxheTogX3RoaXMyLnByb3BzLnBsYXlpbmcsXG4gICAgICAgICAgICBtdXRlOiBfdGhpczIucHJvcHMubXV0ZWQsXG4gICAgICAgICAgICBzdGFydDogKDAsIF91dGlscy5wYXJzZVN0YXJ0VGltZSkodXJsKSxcbiAgICAgICAgICAgIG9yaWdpbjogd2luZG93LmxvY2F0aW9uLm9yaWdpblxuICAgICAgICAgIH0sIGNvbmZpZy5wYXJhbXMpLFxuICAgICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICAgYXBpcmVhZHk6IF90aGlzMi5wcm9wcy5vblJlYWR5LFxuICAgICAgICAgICAgc2Vla2VkOiBmdW5jdGlvbiBzZWVrZWQoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczIucHJvcHMub25TZWVrKF90aGlzMi5wbGF5ZXIuY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZpZGVvX2VuZDogX3RoaXMyLnByb3BzLm9uRW5kZWQsXG4gICAgICAgICAgICBkdXJhdGlvbmNoYW5nZTogX3RoaXMyLm9uRHVyYXRpb25DaGFuZ2UsXG4gICAgICAgICAgICBwYXVzZTogX3RoaXMyLnByb3BzLm9uUGF1c2UsXG4gICAgICAgICAgICBwbGF5aW5nOiBfdGhpczIucHJvcHMub25QbGF5LFxuICAgICAgICAgICAgd2FpdGluZzogX3RoaXMyLnByb3BzLm9uQnVmZmVyLFxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIGVycm9yKGV2ZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgb25FcnJvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGxheScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcigncGF1c2UnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkgey8vIE5vdGhpbmcgdG8gZG9cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2Vla1RvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNlZWtUbyhzZWNvbmRzKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NlZWsnLCBzZWNvbmRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vm9sdW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZvbHVtZShmcmFjdGlvbikge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRWb2x1bWUnLCBmcmFjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmR1cmF0aW9uIHx8IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEN1cnJlbnRUaW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMucGxheWVyLmN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuYnVmZmVyZWRUaW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIGRpc3BsYXkgPSB0aGlzLnByb3BzLmRpc3BsYXk7XG4gICAgICB2YXIgc3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICBkaXNwbGF5OiBkaXNwbGF5XG4gICAgICB9O1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICByZWY6IHRoaXMucmVmXG4gICAgICB9KSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERhaWx5TW90aW9uO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBEYWlseU1vdGlvbjtcblxuX2RlZmluZVByb3BlcnR5KERhaWx5TW90aW9uLCBcImRpc3BsYXlOYW1lXCIsICdEYWlseU1vdGlvbicpO1xuXG5fZGVmaW5lUHJvcGVydHkoRGFpbHlNb3Rpb24sIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS5kYWlseW1vdGlvbik7XG5cbl9kZWZpbmVQcm9wZXJ0eShEYWlseU1vdGlvbiwgXCJsb29wT25FbmRlZFwiLCB0cnVlKTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcblxudmFyIF9wYXR0ZXJucyA9IHJlcXVpcmUoXCIuLi9wYXR0ZXJuc1wiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGlmIChlbnVtZXJhYmxlT25seSkgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pOyBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307IGlmIChpICUgMikgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pOyB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7IH0gZWxzZSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBTREtfVVJMID0gJ2h0dHBzOi8vd2lkZ2V0Lm1peGNsb3VkLmNvbS9tZWRpYS9qcy93aWRnZXRBcGkuanMnO1xudmFyIFNES19HTE9CQUwgPSAnTWl4Y2xvdWQnO1xuXG52YXIgTWl4Y2xvdWQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE1peGNsb3VkLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKE1peGNsb3VkKTtcblxuICBmdW5jdGlvbiBNaXhjbG91ZCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWl4Y2xvdWQpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJkdXJhdGlvblwiLCBudWxsKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjdXJyZW50VGltZVwiLCBudWxsKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzZWNvbmRzTG9hZGVkXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm11dGVcIiwgZnVuY3Rpb24gKCkgey8vIE5vIHZvbHVtZSBzdXBwb3J0XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwidW5tdXRlXCIsIGZ1bmN0aW9uICgpIHsvLyBObyB2b2x1bWUgc3VwcG9ydFxuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlZlwiLCBmdW5jdGlvbiAoaWZyYW1lKSB7XG4gICAgICBfdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoTWl4Y2xvdWQsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICgwLCBfdXRpbHMuZ2V0U0RLKShTREtfVVJMLCBTREtfR0xPQkFMKS50aGVuKGZ1bmN0aW9uIChNaXhjbG91ZCkge1xuICAgICAgICBfdGhpczIucGxheWVyID0gTWl4Y2xvdWQuUGxheWVyV2lkZ2V0KF90aGlzMi5pZnJhbWUpO1xuXG4gICAgICAgIF90aGlzMi5wbGF5ZXIucmVhZHkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLnBsYXllci5ldmVudHMucGxheS5vbihfdGhpczIucHJvcHMub25QbGF5KTtcblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIuZXZlbnRzLnBhdXNlLm9uKF90aGlzMi5wcm9wcy5vblBhdXNlKTtcblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIuZXZlbnRzLmVuZGVkLm9uKF90aGlzMi5wcm9wcy5vbkVuZGVkKTtcblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIuZXZlbnRzLmVycm9yLm9uKF90aGlzMi5wcm9wcy5lcnJvcik7XG5cbiAgICAgICAgICBfdGhpczIucGxheWVyLmV2ZW50cy5wcm9ncmVzcy5vbihmdW5jdGlvbiAoc2Vjb25kcywgZHVyYXRpb24pIHtcbiAgICAgICAgICAgIF90aGlzMi5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgICAgICBfdGhpczIuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMi5wcm9wcy5vblJlYWR5KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgdGhpcy5wcm9wcy5vbkVycm9yKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwbGF5Jyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwYXVzZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3AoKSB7Ly8gTm90aGluZyB0byBkb1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKHNlY29uZHMpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2VlaycsIHNlY29uZHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGZyYWN0aW9uKSB7Ly8gTm8gdm9sdW1lIHN1cHBvcnRcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RHVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RHVyYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdXJhdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGltZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2Vjb25kc0xvYWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTZWNvbmRzTG9hZGVkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgIHVybCA9IF90aGlzJHByb3BzLnVybCxcbiAgICAgICAgICBjb25maWcgPSBfdGhpcyRwcm9wcy5jb25maWc7XG4gICAgICB2YXIgaWQgPSB1cmwubWF0Y2goX3BhdHRlcm5zLk1BVENIX1VSTF9NSVhDTE9VRClbMV07XG4gICAgICB2YXIgc3R5bGUgPSB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgICAgdmFyIHF1ZXJ5ID0gKDAsIF91dGlscy5xdWVyeVN0cmluZykoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBjb25maWcub3B0aW9ucyksIHt9LCB7XG4gICAgICAgIGZlZWQ6IFwiL1wiLmNvbmNhdChpZCwgXCIvXCIpXG4gICAgICB9KSk7IC8vIFdlIGhhdmUgdG8gZ2l2ZSB0aGUgaWZyYW1lIGEga2V5IGhlcmUgdG8gcHJldmVudCBhXG4gICAgICAvLyB3ZWlyZCBkaWFsb2cgYXBwZWFyaW5nIHdoZW4gbG9hZGluZyBhIG5ldyB0cmFja1xuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImlmcmFtZVwiLCB7XG4gICAgICAgIGtleTogaWQsXG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgc3JjOiBcImh0dHBzOi8vd3d3Lm1peGNsb3VkLmNvbS93aWRnZXQvaWZyYW1lLz9cIi5jb25jYXQocXVlcnkpLFxuICAgICAgICBmcmFtZUJvcmRlcjogXCIwXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBNaXhjbG91ZDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gTWl4Y2xvdWQ7XG5cbl9kZWZpbmVQcm9wZXJ0eShNaXhjbG91ZCwgXCJkaXNwbGF5TmFtZVwiLCAnTWl4Y2xvdWQnKTtcblxuX2RlZmluZVByb3BlcnR5KE1peGNsb3VkLCBcImNhblBsYXlcIiwgX3BhdHRlcm5zLmNhblBsYXkubWl4Y2xvdWQpO1xuXG5fZGVmaW5lUHJvcGVydHkoTWl4Y2xvdWQsIFwibG9vcE9uRW5kZWRcIiwgdHJ1ZSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgU0RLX1VSTCA9ICdodHRwczovL3BsYXkudmlkeWFyZC5jb20vZW1iZWQvdjQuanMnO1xudmFyIFNES19HTE9CQUwgPSAnVmlkeWFyZFY0JztcbnZhciBTREtfR0xPQkFMX1JFQURZID0gJ29uVmlkeWFyZEFQSSc7XG5cbnZhciBWaWR5YXJkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhWaWR5YXJkLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFZpZHlhcmQpO1xuXG4gIGZ1bmN0aW9uIFZpZHlhcmQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFZpZHlhcmQpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJtdXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldFZvbHVtZSgwKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJ1bm11dGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLnByb3BzLnZvbHVtZSAhPT0gbnVsbCkge1xuICAgICAgICBfdGhpcy5zZXRWb2x1bWUoX3RoaXMucHJvcHMudm9sdW1lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJyZWZcIiwgZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgICAgX3RoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFZpZHlhcmQsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzLnBsYXlpbmcsXG4gICAgICAgICAgY29uZmlnID0gX3RoaXMkcHJvcHMuY29uZmlnLFxuICAgICAgICAgIG9uRXJyb3IgPSBfdGhpcyRwcm9wcy5vbkVycm9yLFxuICAgICAgICAgIG9uRHVyYXRpb24gPSBfdGhpcyRwcm9wcy5vbkR1cmF0aW9uO1xuICAgICAgdmFyIGlkID0gdXJsICYmIHVybC5tYXRjaChfcGF0dGVybnMuTUFUQ0hfVVJMX1ZJRFlBUkQpWzFdO1xuXG4gICAgICBpZiAodGhpcy5wbGF5ZXIpIHtcbiAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICB9XG5cbiAgICAgICgwLCBfdXRpbHMuZ2V0U0RLKShTREtfVVJMLCBTREtfR0xPQkFMLCBTREtfR0xPQkFMX1JFQURZKS50aGVuKGZ1bmN0aW9uIChWaWR5YXJkKSB7XG4gICAgICAgIGlmICghX3RoaXMyLmNvbnRhaW5lcikgcmV0dXJuO1xuICAgICAgICBWaWR5YXJkLmFwaS5hZGRSZWFkeUxpc3RlbmVyKGZ1bmN0aW9uIChkYXRhLCBwbGF5ZXIpIHtcbiAgICAgICAgICBpZiAoX3RoaXMyLnBsYXllcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIgPSBwbGF5ZXI7XG5cbiAgICAgICAgICBfdGhpczIucGxheWVyLm9uKCdyZWFkeScsIF90aGlzMi5wcm9wcy5vblJlYWR5KTtcblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3BsYXknLCBfdGhpczIucHJvcHMub25QbGF5KTtcblxuICAgICAgICAgIF90aGlzMi5wbGF5ZXIub24oJ3BhdXNlJywgX3RoaXMyLnByb3BzLm9uUGF1c2UpO1xuXG4gICAgICAgICAgX3RoaXMyLnBsYXllci5vbignc2VlaycsIF90aGlzMi5wcm9wcy5vblNlZWspO1xuXG4gICAgICAgICAgX3RoaXMyLnBsYXllci5vbigncGxheWVyQ29tcGxldGUnLCBfdGhpczIucHJvcHMub25FbmRlZCk7XG4gICAgICAgIH0sIGlkKTtcbiAgICAgICAgVmlkeWFyZC5hcGkucmVuZGVyUGxheWVyKF9vYmplY3RTcHJlYWQoe1xuICAgICAgICAgIHV1aWQ6IGlkLFxuICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMyLmNvbnRhaW5lcixcbiAgICAgICAgICBhdXRvcGxheTogcGxheWluZyA/IDEgOiAwXG4gICAgICAgIH0sIGNvbmZpZy5vcHRpb25zKSk7XG4gICAgICAgIFZpZHlhcmQuYXBpLmdldFBsYXllck1ldGFkYXRhKGlkKS50aGVuKGZ1bmN0aW9uIChtZXRhKSB7XG4gICAgICAgICAgX3RoaXMyLmR1cmF0aW9uID0gbWV0YS5sZW5ndGhfaW5fc2Vjb25kcztcbiAgICAgICAgICBvbkR1cmF0aW9uKG1ldGEubGVuZ3RoX2luX3NlY29uZHMpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIG9uRXJyb3IpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwbGF5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BsYXknKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGF1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3BhdXNlJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHdpbmRvdy5WaWR5YXJkVjQuYXBpLmRlc3Ryb3lQbGF5ZXIodGhpcy5wbGF5ZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKGFtb3VudCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZWVrJywgYW1vdW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vm9sdW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZvbHVtZShmcmFjdGlvbikge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRWb2x1bWUnLCBmcmFjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFBsYXliYWNrUmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQbGF5YmFja1JhdGUocmF0ZSkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRQbGF5YmFja1NwZWVkJywgcmF0ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldER1cmF0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldER1cmF0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZHVyYXRpb247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEN1cnJlbnRUaW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lKCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbFBsYXllcignY3VycmVudFRpbWUnKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2Vjb25kc0xvYWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTZWNvbmRzTG9hZGVkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgZGlzcGxheSA9IHRoaXMucHJvcHMuZGlzcGxheTtcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgIGRpc3BsYXk6IGRpc3BsYXlcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSwgLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5yZWZcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVmlkeWFyZDtcbn0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gVmlkeWFyZDtcblxuX2RlZmluZVByb3BlcnR5KFZpZHlhcmQsIFwiZGlzcGxheU5hbWVcIiwgJ1ZpZHlhcmQnKTtcblxuX2RlZmluZVByb3BlcnR5KFZpZHlhcmQsIFwiY2FuUGxheVwiLCBfcGF0dGVybnMuY2FuUGxheS52aWR5YXJkKTsiLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuLi91dGlsc1wiKTtcblxudmFyIF9wYXR0ZXJucyA9IHJlcXVpcmUoXCIuLi9wYXR0ZXJuc1wiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxudmFyIFNES19VUkwgPSAnaHR0cHM6Ly9jZG4uZW1iZWQubHkvcGxheWVyLTAuMS4wLm1pbi5qcyc7XG52YXIgU0RLX0dMT0JBTCA9ICdwbGF5ZXJqcyc7XG5cbnZhciBLYWx0dXJhID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhLYWx0dXJhLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEthbHR1cmEpO1xuXG4gIGZ1bmN0aW9uIEthbHR1cmEoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEthbHR1cmEpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjYWxsUGxheWVyXCIsIF91dGlscy5jYWxsUGxheWVyKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJkdXJhdGlvblwiLCBudWxsKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJjdXJyZW50VGltZVwiLCBudWxsKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzZWNvbmRzTG9hZGVkXCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm11dGVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuY2FsbFBsYXllcignbXV0ZScpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVubXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5jYWxsUGxheWVyKCd1bm11dGUnKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJyZWZcIiwgZnVuY3Rpb24gKGlmcmFtZSkge1xuICAgICAgX3RoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEthbHR1cmEsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICgwLCBfdXRpbHMuZ2V0U0RLKShTREtfVVJMLCBTREtfR0xPQkFMKS50aGVuKGZ1bmN0aW9uIChwbGF5ZXJqcykge1xuICAgICAgICBpZiAoIV90aGlzMi5pZnJhbWUpIHJldHVybjtcbiAgICAgICAgX3RoaXMyLnBsYXllciA9IG5ldyBwbGF5ZXJqcy5QbGF5ZXIoX3RoaXMyLmlmcmFtZSk7XG5cbiAgICAgICAgX3RoaXMyLnBsYXllci5vbigncmVhZHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQW4gYXJiaXRyYXJ5IHRpbWVvdXQgaXMgcmVxdWlyZWQgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gdGhlIGV2ZW50IGxpc3RlbmVycyB3b25cdTIwMTl0IHdvcmtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMi5wbGF5ZXIuaXNSZWFkeSA9IHRydWU7XG5cbiAgICAgICAgICAgIF90aGlzMi5wbGF5ZXIuc2V0TG9vcChfdGhpczIucHJvcHMubG9vcCk7XG5cbiAgICAgICAgICAgIGlmIChfdGhpczIucHJvcHMubXV0ZWQpIHtcbiAgICAgICAgICAgICAgX3RoaXMyLnBsYXllci5tdXRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF90aGlzMi5hZGRMaXN0ZW5lcnMoX3RoaXMyLnBsYXllciwgX3RoaXMyLnByb3BzKTtcblxuICAgICAgICAgICAgX3RoaXMyLnByb3BzLm9uUmVhZHkoKTtcbiAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9KTtcbiAgICAgIH0sIHRoaXMucHJvcHMub25FcnJvcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImFkZExpc3RlbmVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRMaXN0ZW5lcnMocGxheWVyLCBwcm9wcykge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHBsYXllci5vbigncGxheScsIHByb3BzLm9uUGxheSk7XG4gICAgICBwbGF5ZXIub24oJ3BhdXNlJywgcHJvcHMub25QYXVzZSk7XG4gICAgICBwbGF5ZXIub24oJ2VuZGVkJywgcHJvcHMub25FbmRlZCk7XG4gICAgICBwbGF5ZXIub24oJ2Vycm9yJywgcHJvcHMub25FcnJvcik7XG4gICAgICBwbGF5ZXIub24oJ3RpbWV1cGRhdGUnLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBfcmVmLmR1cmF0aW9uLFxuICAgICAgICAgICAgc2Vjb25kcyA9IF9yZWYuc2Vjb25kcztcbiAgICAgICAgX3RoaXMzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgIF90aGlzMy5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwbGF5Jyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhdXNlKCkge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdwYXVzZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3AoKSB7Ly8gTm90aGluZyB0byBkb1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKHNlY29uZHMpIHtcbiAgICAgIHRoaXMuY2FsbFBsYXllcignc2V0Q3VycmVudFRpbWUnLCBzZWNvbmRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vm9sdW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZvbHVtZShmcmFjdGlvbikge1xuICAgICAgdGhpcy5jYWxsUGxheWVyKCdzZXRWb2x1bWUnLCBmcmFjdGlvbik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldExvb3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0TG9vcChsb29wKSB7XG4gICAgICB0aGlzLmNhbGxQbGF5ZXIoJ3NldExvb3AnLCBsb29wKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0RHVyYXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RHVyYXRpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdXJhdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0Q3VycmVudFRpbWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50VGltZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0U2Vjb25kc0xvYWRlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTZWNvbmRzTG9hZGVkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2Vjb25kc0xvYWRlZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgIH07XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImlmcmFtZVwiLCB7XG4gICAgICAgIHJlZjogdGhpcy5yZWYsXG4gICAgICAgIHNyYzogdGhpcy5wcm9wcy51cmwsXG4gICAgICAgIGZyYW1lQm9yZGVyOiBcIjBcIixcbiAgICAgICAgc2Nyb2xsaW5nOiBcIm5vXCIsXG4gICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgYWxsb3c6IFwiZW5jcnlwdGVkLW1lZGlhOyBhdXRvcGxheTsgZnVsbHNjcmVlbjtcIixcbiAgICAgICAgcmVmZXJyZXJQb2xpY3k6IFwibm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGVcIlxuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEthbHR1cmE7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEthbHR1cmE7XG5cbl9kZWZpbmVQcm9wZXJ0eShLYWx0dXJhLCBcImRpc3BsYXlOYW1lXCIsICdLYWx0dXJhJyk7XG5cbl9kZWZpbmVQcm9wZXJ0eShLYWx0dXJhLCBcImNhblBsYXlcIiwgX3BhdHRlcm5zLmNhblBsYXkua2FsdHVyYSk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKFwiLi4vdXRpbHNcIik7XG5cbnZhciBfcGF0dGVybnMgPSByZXF1aXJlKFwiLi4vcGF0dGVybnNcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsgaWYgKGtleSBpbiBvYmopIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7IHZhbHVlOiB2YWx1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9KTsgfSBlbHNlIHsgb2JqW2tleV0gPSB2YWx1ZTsgfSByZXR1cm4gb2JqOyB9XG5cbnZhciBIQVNfTkFWSUdBVE9SID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgSVNfSVBBRF9QUk8gPSBIQVNfTkFWSUdBVE9SICYmIG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxO1xudmFyIElTX0lPUyA9IEhBU19OQVZJR0FUT1IgJiYgKC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IElTX0lQQURfUFJPKSAmJiAhd2luZG93Lk1TU3RyZWFtO1xudmFyIEhMU19TREtfVVJMID0gJ2h0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vaGxzLmpzQFZFUlNJT04vZGlzdC9obHMubWluLmpzJztcbnZhciBITFNfR0xPQkFMID0gJ0hscyc7XG52YXIgREFTSF9TREtfVVJMID0gJ2h0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2Rhc2hqcy9WRVJTSU9OL2Rhc2guYWxsLm1pbi5qcyc7XG52YXIgREFTSF9HTE9CQUwgPSAnZGFzaGpzJztcbnZhciBGTFZfU0RLX1VSTCA9ICdodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Zsdi5qc0BWRVJTSU9OL2Rpc3QvZmx2Lm1pbi5qcyc7XG52YXIgRkxWX0dMT0JBTCA9ICdmbHZqcyc7XG52YXIgTUFUQ0hfRFJPUEJPWF9VUkwgPSAvd3d3XFwuZHJvcGJveFxcLmNvbVxcLy4rLztcbnZhciBNQVRDSF9DTE9VREZMQVJFX1NUUkVBTSA9IC9odHRwczpcXC9cXC93YXRjaFxcLmNsb3VkZmxhcmVzdHJlYW1cXC5jb21cXC8oW2EtejAtOV0rKS87XG52YXIgUkVQTEFDRV9DTE9VREZMQVJFX1NUUkVBTSA9ICdodHRwczovL3ZpZGVvZGVsaXZlcnkubmV0L3tpZH0vbWFuaWZlc3QvdmlkZW8ubTN1OCc7XG5cbnZhciBGaWxlUGxheWVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhGaWxlUGxheWVyLCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKEZpbGVQbGF5ZXIpO1xuXG4gIGZ1bmN0aW9uIEZpbGVQbGF5ZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZpbGVQbGF5ZXIpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF9hcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgX2FyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfc3VwZXIuY2FsbC5hcHBseShfc3VwZXIsIFt0aGlzXS5jb25jYXQoX2FyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblJlYWR5XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcztcblxuICAgICAgcmV0dXJuIChfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzKS5vblJlYWR5LmFwcGx5KF90aGlzJHByb3BzLCBhcmd1bWVudHMpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uUGxheVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyO1xuXG4gICAgICByZXR1cm4gKF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzKS5vblBsYXkuYXBwbHkoX3RoaXMkcHJvcHMyLCBhcmd1bWVudHMpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uQnVmZmVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczM7XG5cbiAgICAgIHJldHVybiAoX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMpLm9uQnVmZmVyLmFwcGx5KF90aGlzJHByb3BzMywgYXJndW1lbnRzKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkJ1ZmZlckVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0O1xuXG4gICAgICByZXR1cm4gKF90aGlzJHByb3BzNCA9IF90aGlzLnByb3BzKS5vbkJ1ZmZlckVuZC5hcHBseShfdGhpcyRwcm9wczQsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25QYXVzZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1O1xuXG4gICAgICByZXR1cm4gKF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzKS5vblBhdXNlLmFwcGx5KF90aGlzJHByb3BzNSwgYXJndW1lbnRzKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvbkVuZGVkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczY7XG5cbiAgICAgIHJldHVybiAoX3RoaXMkcHJvcHM2ID0gX3RoaXMucHJvcHMpLm9uRW5kZWQuYXBwbHkoX3RoaXMkcHJvcHM2LCBhcmd1bWVudHMpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uRXJyb3JcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNztcblxuICAgICAgcmV0dXJuIChfdGhpcyRwcm9wczcgPSBfdGhpcy5wcm9wcykub25FcnJvci5hcHBseShfdGhpcyRwcm9wczcsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25QbGF5QmFja1JhdGVDaGFuZ2VcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICByZXR1cm4gX3RoaXMucHJvcHMub25QbGF5YmFja1JhdGVDaGFuZ2UoZXZlbnQudGFyZ2V0LnBsYXliYWNrUmF0ZSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25FbmFibGVQSVBcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzODtcblxuICAgICAgcmV0dXJuIChfdGhpcyRwcm9wczggPSBfdGhpcy5wcm9wcykub25FbmFibGVQSVAuYXBwbHkoX3RoaXMkcHJvcHM4LCBhcmd1bWVudHMpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm9uRGlzYWJsZVBJUFwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzOSA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uRGlzYWJsZVBJUCA9IF90aGlzJHByb3BzOS5vbkRpc2FibGVQSVAsXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzOS5wbGF5aW5nO1xuICAgICAgb25EaXNhYmxlUElQKGUpO1xuXG4gICAgICBpZiAocGxheWluZykge1xuICAgICAgICBfdGhpcy5wbGF5KCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25QcmVzZW50YXRpb25Nb2RlQ2hhbmdlXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoX3RoaXMucGxheWVyICYmICgwLCBfdXRpbHMuc3VwcG9ydHNXZWJLaXRQcmVzZW50YXRpb25Nb2RlKShfdGhpcy5wbGF5ZXIpKSB7XG4gICAgICAgIHZhciB3ZWJraXRQcmVzZW50YXRpb25Nb2RlID0gX3RoaXMucGxheWVyLndlYmtpdFByZXNlbnRhdGlvbk1vZGU7XG5cbiAgICAgICAgaWYgKHdlYmtpdFByZXNlbnRhdGlvbk1vZGUgPT09ICdwaWN0dXJlLWluLXBpY3R1cmUnKSB7XG4gICAgICAgICAgX3RoaXMub25FbmFibGVQSVAoZSk7XG4gICAgICAgIH0gZWxzZSBpZiAod2Via2l0UHJlc2VudGF0aW9uTW9kZSA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICBfdGhpcy5vbkRpc2FibGVQSVAoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJvblNlZWtcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLnByb3BzLm9uU2VlayhlLnRhcmdldC5jdXJyZW50VGltZSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwibXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5wbGF5ZXIubXV0ZWQgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInVubXV0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5wbGF5ZXIubXV0ZWQgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJyZW5kZXJTb3VyY2VFbGVtZW50XCIsIGZ1bmN0aW9uIChzb3VyY2UsIGluZGV4KSB7XG4gICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJzb3VyY2VcIiwge1xuICAgICAgICAgIGtleTogaW5kZXgsXG4gICAgICAgICAgc3JjOiBzb3VyY2VcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFwic291cmNlXCIsIF9leHRlbmRzKHtcbiAgICAgICAga2V5OiBpbmRleFxuICAgICAgfSwgc291cmNlKSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicmVuZGVyVHJhY2tcIiwgZnVuY3Rpb24gKHRyYWNrLCBpbmRleCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoXCJ0cmFja1wiLCBfZXh0ZW5kcyh7XG4gICAgICAgIGtleTogaW5kZXhcbiAgICAgIH0sIHRyYWNrKSk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicmVmXCIsIGZ1bmN0aW9uIChwbGF5ZXIpIHtcbiAgICAgIGlmIChfdGhpcy5wbGF5ZXIpIHtcbiAgICAgICAgLy8gU3RvcmUgcHJldmlvdXMgcGxheWVyIHRvIGJlIHVzZWQgYnkgcmVtb3ZlTGlzdGVuZXJzKClcbiAgICAgICAgX3RoaXMucHJldlBsYXllciA9IF90aGlzLnBsYXllcjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMucGxheWVyID0gcGxheWVyO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEZpbGVQbGF5ZXIsIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5wcm9wcy5vbk1vdW50ICYmIHRoaXMucHJvcHMub25Nb3VudCh0aGlzKTtcbiAgICAgIHRoaXMuYWRkTGlzdGVuZXJzKHRoaXMucGxheWVyKTtcblxuICAgICAgaWYgKElTX0lPUykge1xuICAgICAgICB0aGlzLnBsYXllci5sb2FkKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRVc2VBdWRpbyh0aGlzLnByb3BzKSAhPT0gdGhpcy5zaG91bGRVc2VBdWRpbyhwcmV2UHJvcHMpKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzKHRoaXMucHJldlBsYXllciwgcHJldlByb3BzLnVybCk7XG4gICAgICAgIHRoaXMuYWRkTGlzdGVuZXJzKHRoaXMucGxheWVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucHJvcHMudXJsICE9PSBwcmV2UHJvcHMudXJsICYmICEoMCwgX3V0aWxzLmlzTWVkaWFTdHJlYW0pKHRoaXMucHJvcHMudXJsKSkge1xuICAgICAgICB0aGlzLnBsYXllci5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnRXaWxsVW5tb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzKHRoaXMucGxheWVyKTtcblxuICAgICAgaWYgKHRoaXMuaGxzKSB7XG4gICAgICAgIHRoaXMuaGxzLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkTGlzdGVuZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZExpc3RlbmVycyhwbGF5ZXIpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczEwID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB1cmwgPSBfdGhpcyRwcm9wczEwLnVybCxcbiAgICAgICAgICBwbGF5c2lubGluZSA9IF90aGlzJHByb3BzMTAucGxheXNpbmxpbmU7XG4gICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigncGxheScsIHRoaXMub25QbGF5KTtcbiAgICAgIHBsYXllci5hZGRFdmVudExpc3RlbmVyKCd3YWl0aW5nJywgdGhpcy5vbkJ1ZmZlcik7XG4gICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigncGxheWluZycsIHRoaXMub25CdWZmZXJFbmQpO1xuICAgICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgdGhpcy5vblBhdXNlKTtcbiAgICAgIHBsYXllci5hZGRFdmVudExpc3RlbmVyKCdzZWVrZWQnLCB0aGlzLm9uU2Vlayk7XG4gICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCB0aGlzLm9uRW5kZWQpO1xuICAgICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5vbkVycm9yKTtcbiAgICAgIHBsYXllci5hZGRFdmVudExpc3RlbmVyKCdyYXRlY2hhbmdlJywgdGhpcy5vblBsYXlCYWNrUmF0ZUNoYW5nZSk7XG4gICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignZW50ZXJwaWN0dXJlaW5waWN0dXJlJywgdGhpcy5vbkVuYWJsZVBJUCk7XG4gICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignbGVhdmVwaWN0dXJlaW5waWN0dXJlJywgdGhpcy5vbkRpc2FibGVQSVApO1xuICAgICAgcGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdHByZXNlbnRhdGlvbm1vZGVjaGFuZ2VkJywgdGhpcy5vblByZXNlbnRhdGlvbk1vZGVDaGFuZ2UpO1xuXG4gICAgICBpZiAoIXRoaXMuc2hvdWxkVXNlSExTKHVybCkpIHtcbiAgICAgICAgLy8gb25SZWFkeSBpcyBoYW5kbGVkIGJ5IGhscy5qc1xuICAgICAgICBwbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignY2FucGxheScsIHRoaXMub25SZWFkeSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwbGF5c2lubGluZSkge1xuICAgICAgICBwbGF5ZXIuc2V0QXR0cmlidXRlKCdwbGF5c2lubGluZScsICcnKTtcbiAgICAgICAgcGxheWVyLnNldEF0dHJpYnV0ZSgnd2Via2l0LXBsYXlzaW5saW5lJywgJycpO1xuICAgICAgICBwbGF5ZXIuc2V0QXR0cmlidXRlKCd4NS1wbGF5c2lubGluZScsICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlTGlzdGVuZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVycyhwbGF5ZXIsIHVybCkge1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCB0aGlzLm9uUmVhZHkpO1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXknLCB0aGlzLm9uUGxheSk7XG4gICAgICBwbGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2FpdGluZycsIHRoaXMub25CdWZmZXIpO1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCB0aGlzLm9uQnVmZmVyRW5kKTtcbiAgICAgIHBsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXVzZScsIHRoaXMub25QYXVzZSk7XG4gICAgICBwbGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgdGhpcy5vblNlZWspO1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgdGhpcy5vbkVuZGVkKTtcbiAgICAgIHBsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMub25FcnJvcik7XG4gICAgICBwbGF5ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmF0ZWNoYW5nZScsIHRoaXMub25QbGF5QmFja1JhdGVDaGFuZ2UpO1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VudGVycGljdHVyZWlucGljdHVyZScsIHRoaXMub25FbmFibGVQSVApO1xuICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xlYXZlcGljdHVyZWlucGljdHVyZScsIHRoaXMub25EaXNhYmxlUElQKTtcbiAgICAgIHBsYXllci5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRwcmVzZW50YXRpb25tb2RlY2hhbmdlZCcsIHRoaXMub25QcmVzZW50YXRpb25Nb2RlQ2hhbmdlKTtcblxuICAgICAgaWYgKCF0aGlzLnNob3VsZFVzZUhMUyh1cmwpKSB7XG4gICAgICAgIC8vIG9uUmVhZHkgaXMgaGFuZGxlZCBieSBobHMuanNcbiAgICAgICAgcGxheWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCB0aGlzLm9uUmVhZHkpO1xuICAgICAgfVxuICAgIH0gLy8gUHJveHkgbWV0aG9kcyB0byBwcmV2ZW50IGxpc3RlbmVyIGxlYWtzXG5cbiAgfSwge1xuICAgIGtleTogXCJzaG91bGRVc2VBdWRpb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRVc2VBdWRpbyhwcm9wcykge1xuICAgICAgaWYgKHByb3BzLmNvbmZpZy5mb3JjZVZpZGVvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmNvbmZpZy5hdHRyaWJ1dGVzLnBvc3Rlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFVzZSA8dmlkZW8+IHNvIHRoYXQgcG9zdGVyIGlzIHNob3duXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfcGF0dGVybnMuQVVESU9fRVhURU5TSU9OUy50ZXN0KHByb3BzLnVybCkgfHwgcHJvcHMuY29uZmlnLmZvcmNlQXVkaW87XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZFVzZUhMU1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRVc2VITFModXJsKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5jb25maWcuZm9yY2VITFMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChJU19JT1MpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3BhdHRlcm5zLkhMU19FWFRFTlNJT05TLnRlc3QodXJsKSB8fCBNQVRDSF9DTE9VREZMQVJFX1NUUkVBTS50ZXN0KHVybCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZFVzZURBU0hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkVXNlREFTSCh1cmwpIHtcbiAgICAgIHJldHVybiBfcGF0dGVybnMuREFTSF9FWFRFTlNJT05TLnRlc3QodXJsKSB8fCB0aGlzLnByb3BzLmNvbmZpZy5mb3JjZURBU0g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNob3VsZFVzZUZMVlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRVc2VGTFYodXJsKSB7XG4gICAgICByZXR1cm4gX3BhdHRlcm5zLkZMVl9FWFRFTlNJT05TLnRlc3QodXJsKSB8fCB0aGlzLnByb3BzLmNvbmZpZy5mb3JjZUZMVjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHVybCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wcyRjb25maWcgPSB0aGlzLnByb3BzLmNvbmZpZyxcbiAgICAgICAgICBobHNWZXJzaW9uID0gX3RoaXMkcHJvcHMkY29uZmlnLmhsc1ZlcnNpb24sXG4gICAgICAgICAgaGxzT3B0aW9ucyA9IF90aGlzJHByb3BzJGNvbmZpZy5obHNPcHRpb25zLFxuICAgICAgICAgIGRhc2hWZXJzaW9uID0gX3RoaXMkcHJvcHMkY29uZmlnLmRhc2hWZXJzaW9uLFxuICAgICAgICAgIGZsdlZlcnNpb24gPSBfdGhpcyRwcm9wcyRjb25maWcuZmx2VmVyc2lvbjtcblxuICAgICAgaWYgKHRoaXMuaGxzKSB7XG4gICAgICAgIHRoaXMuaGxzLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGFzaCkge1xuICAgICAgICB0aGlzLmRhc2gucmVzZXQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvdWxkVXNlSExTKHVybCkpIHtcbiAgICAgICAgKDAsIF91dGlscy5nZXRTREspKEhMU19TREtfVVJMLnJlcGxhY2UoJ1ZFUlNJT04nLCBobHNWZXJzaW9uKSwgSExTX0dMT0JBTCkudGhlbihmdW5jdGlvbiAoSGxzKSB7XG4gICAgICAgICAgX3RoaXMyLmhscyA9IG5ldyBIbHMoaGxzT3B0aW9ucyk7XG5cbiAgICAgICAgICBfdGhpczIuaGxzLm9uKEhscy5FdmVudHMuTUFOSUZFU1RfUEFSU0VELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpczIucHJvcHMub25SZWFkeSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMyLmhscy5vbihIbHMuRXZlbnRzLkVSUk9SLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICAgICAgX3RoaXMyLnByb3BzLm9uRXJyb3IoZSwgZGF0YSwgX3RoaXMyLmhscywgSGxzKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChNQVRDSF9DTE9VREZMQVJFX1NUUkVBTS50ZXN0KHVybCkpIHtcbiAgICAgICAgICAgIHZhciBpZCA9IHVybC5tYXRjaChNQVRDSF9DTE9VREZMQVJFX1NUUkVBTSlbMV07XG5cbiAgICAgICAgICAgIF90aGlzMi5obHMubG9hZFNvdXJjZShSRVBMQUNFX0NMT1VERkxBUkVfU1RSRUFNLnJlcGxhY2UoJ3tpZH0nLCBpZCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpczIuaGxzLmxvYWRTb3VyY2UodXJsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczIuaGxzLmF0dGFjaE1lZGlhKF90aGlzMi5wbGF5ZXIpO1xuXG4gICAgICAgICAgX3RoaXMyLnByb3BzLm9uTG9hZGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG91bGRVc2VEQVNIKHVybCkpIHtcbiAgICAgICAgKDAsIF91dGlscy5nZXRTREspKERBU0hfU0RLX1VSTC5yZXBsYWNlKCdWRVJTSU9OJywgZGFzaFZlcnNpb24pLCBEQVNIX0dMT0JBTCkudGhlbihmdW5jdGlvbiAoZGFzaGpzKSB7XG4gICAgICAgICAgX3RoaXMyLmRhc2ggPSBkYXNoanMuTWVkaWFQbGF5ZXIoKS5jcmVhdGUoKTtcblxuICAgICAgICAgIF90aGlzMi5kYXNoLmluaXRpYWxpemUoX3RoaXMyLnBsYXllciwgdXJsLCBfdGhpczIucHJvcHMucGxheWluZyk7XG5cbiAgICAgICAgICBfdGhpczIuZGFzaC5vbignZXJyb3InLCBfdGhpczIucHJvcHMub25FcnJvcik7XG5cbiAgICAgICAgICBpZiAocGFyc2VJbnQoZGFzaFZlcnNpb24pIDwgMykge1xuICAgICAgICAgICAgX3RoaXMyLmRhc2guZ2V0RGVidWcoKS5zZXRMb2dUb0Jyb3dzZXJDb25zb2xlKGZhbHNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMyLmRhc2gudXBkYXRlU2V0dGluZ3Moe1xuICAgICAgICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBkYXNoanMuRGVidWcuTE9HX0xFVkVMX05PTkVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMyLnByb3BzLm9uTG9hZGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG91bGRVc2VGTFYodXJsKSkge1xuICAgICAgICAoMCwgX3V0aWxzLmdldFNESykoRkxWX1NES19VUkwucmVwbGFjZSgnVkVSU0lPTicsIGZsdlZlcnNpb24pLCBGTFZfR0xPQkFMKS50aGVuKGZ1bmN0aW9uIChmbHZqcykge1xuICAgICAgICAgIF90aGlzMi5mbHYgPSBmbHZqcy5jcmVhdGVQbGF5ZXIoe1xuICAgICAgICAgICAgdHlwZTogJ2ZsdicsXG4gICAgICAgICAgICB1cmw6IHVybFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMyLmZsdi5hdHRhY2hNZWRpYUVsZW1lbnQoX3RoaXMyLnBsYXllcik7XG5cbiAgICAgICAgICBfdGhpczIuZmx2Lm9uKGZsdmpzLkV2ZW50cy5FUlJPUiwgZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgICAgIF90aGlzMi5wcm9wcy5vbkVycm9yKGUsIGRhdGEsIF90aGlzMi5mbHYsIGZsdmpzKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMi5mbHYubG9hZCgpO1xuXG4gICAgICAgICAgX3RoaXMyLnByb3BzLm9uTG9hZGVkKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodXJsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIG5ldyB1cmxzICg8c291cmNlPikgb24gYW4gYWxyZWFkeSBsb2FkZWQgdmlkZW8sXG4gICAgICAgIC8vIEhUTUxNZWRpYUVsZW1lbnQubG9hZCgpIGlzIG5lZWRlZCB0byByZXNldCB0aGUgbWVkaWEgZWxlbWVudFxuICAgICAgICAvLyBhbmQgcmVzdGFydCB0aGUgbWVkaWEgcmVzb3VyY2UuIEp1c3QgcmVwbGFjaW5nIGNoaWxkcmVuIHNvdXJjZVxuICAgICAgICAvLyBkb20gbm9kZXMgaXMgbm90IGVub3VnaFxuICAgICAgICB0aGlzLnBsYXllci5sb2FkKCk7XG4gICAgICB9IGVsc2UgaWYgKCgwLCBfdXRpbHMuaXNNZWRpYVN0cmVhbSkodXJsKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucGxheWVyLnNyY09iamVjdCA9IHVybDtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMucGxheWVyLnNyYyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdmFyIHByb21pc2UgPSB0aGlzLnBsYXllci5wbGF5KCk7XG5cbiAgICAgIGlmIChwcm9taXNlKSB7XG4gICAgICAgIHByb21pc2VbXCJjYXRjaFwiXSh0aGlzLnByb3BzLm9uRXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYXVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAgIHRoaXMucGxheWVyLnBhdXNlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHRoaXMucGxheWVyLnJlbW92ZUF0dHJpYnV0ZSgnc3JjJyk7XG5cbiAgICAgIGlmICh0aGlzLmRhc2gpIHtcbiAgICAgICAgdGhpcy5kYXNoLnJlc2V0KCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNlZWtUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZWVrVG8oc2Vjb25kcykge1xuICAgICAgdGhpcy5wbGF5ZXIuY3VycmVudFRpbWUgPSBzZWNvbmRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRWb2x1bWVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vm9sdW1lKGZyYWN0aW9uKSB7XG4gICAgICB0aGlzLnBsYXllci52b2x1bWUgPSBmcmFjdGlvbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZW5hYmxlUElQXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVuYWJsZVBJUCgpIHtcbiAgICAgIGlmICh0aGlzLnBsYXllci5yZXF1ZXN0UGljdHVyZUluUGljdHVyZSAmJiBkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRWxlbWVudCAhPT0gdGhpcy5wbGF5ZXIpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIucmVxdWVzdFBpY3R1cmVJblBpY3R1cmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoKDAsIF91dGlscy5zdXBwb3J0c1dlYktpdFByZXNlbnRhdGlvbk1vZGUpKHRoaXMucGxheWVyKSAmJiB0aGlzLnBsYXllci53ZWJraXRQcmVzZW50YXRpb25Nb2RlICE9PSAncGljdHVyZS1pbi1waWN0dXJlJykge1xuICAgICAgICB0aGlzLnBsYXllci53ZWJraXRTZXRQcmVzZW50YXRpb25Nb2RlKCdwaWN0dXJlLWluLXBpY3R1cmUnKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzYWJsZVBJUFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNhYmxlUElQKCkge1xuICAgICAgaWYgKGRvY3VtZW50LmV4aXRQaWN0dXJlSW5QaWN0dXJlICYmIGRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbGVtZW50ID09PSB0aGlzLnBsYXllcikge1xuICAgICAgICBkb2N1bWVudC5leGl0UGljdHVyZUluUGljdHVyZSgpO1xuICAgICAgfSBlbHNlIGlmICgoMCwgX3V0aWxzLnN1cHBvcnRzV2ViS2l0UHJlc2VudGF0aW9uTW9kZSkodGhpcy5wbGF5ZXIpICYmIHRoaXMucGxheWVyLndlYmtpdFByZXNlbnRhdGlvbk1vZGUgIT09ICdpbmxpbmUnKSB7XG4gICAgICAgIHRoaXMucGxheWVyLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUoJ2lubGluZScpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRQbGF5YmFja1JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UGxheWJhY2tSYXRlKHJhdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMucGxheWVyLnBsYXliYWNrUmF0ZSA9IHJhdGU7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnByb3BzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5wbGF5ZXIpIHJldHVybiBudWxsO1xuICAgICAgdmFyIF90aGlzJHBsYXllciA9IHRoaXMucGxheWVyLFxuICAgICAgICAgIGR1cmF0aW9uID0gX3RoaXMkcGxheWVyLmR1cmF0aW9uLFxuICAgICAgICAgIHNlZWthYmxlID0gX3RoaXMkcGxheWVyLnNlZWthYmxlOyAvLyBvbiBpT1MsIGxpdmUgc3RyZWFtcyByZXR1cm4gSW5maW5pdHkgZm9yIHRoZSBkdXJhdGlvblxuICAgICAgLy8gc28gaW5zdGVhZCB3ZSB1c2UgdGhlIGVuZCBvZiB0aGUgc2Vla2FibGUgdGltZXJhbmdlXG5cbiAgICAgIGlmIChkdXJhdGlvbiA9PT0gSW5maW5pdHkgJiYgc2Vla2FibGUubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gc2Vla2FibGUuZW5kKHNlZWthYmxlLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZHVyYXRpb247XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldEN1cnJlbnRUaW1lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lKCkge1xuICAgICAgaWYgKCF0aGlzLnBsYXllcikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuY3VycmVudFRpbWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNlY29uZHNMb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U2Vjb25kc0xvYWRlZCgpIHtcbiAgICAgIGlmICghdGhpcy5wbGF5ZXIpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGJ1ZmZlcmVkID0gdGhpcy5wbGF5ZXIuYnVmZmVyZWQ7XG5cbiAgICAgIGlmIChidWZmZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBlbmQgPSBidWZmZXJlZC5lbmQoYnVmZmVyZWQubGVuZ3RoIC0gMSk7XG4gICAgICB2YXIgZHVyYXRpb24gPSB0aGlzLmdldER1cmF0aW9uKCk7XG5cbiAgICAgIGlmIChlbmQgPiBkdXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbmQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFNvdXJjZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRTb3VyY2UodXJsKSB7XG4gICAgICB2YXIgdXNlSExTID0gdGhpcy5zaG91bGRVc2VITFModXJsKTtcbiAgICAgIHZhciB1c2VEQVNIID0gdGhpcy5zaG91bGRVc2VEQVNIKHVybCk7XG4gICAgICB2YXIgdXNlRkxWID0gdGhpcy5zaG91bGRVc2VGTFYodXJsKTtcblxuICAgICAgaWYgKHVybCBpbnN0YW5jZW9mIEFycmF5IHx8ICgwLCBfdXRpbHMuaXNNZWRpYVN0cmVhbSkodXJsKSB8fCB1c2VITFMgfHwgdXNlREFTSCB8fCB1c2VGTFYpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKE1BVENIX0RST1BCT1hfVVJMLnRlc3QodXJsKSkge1xuICAgICAgICByZXR1cm4gdXJsLnJlcGxhY2UoJ3d3dy5kcm9wYm94LmNvbScsICdkbC5kcm9wYm94dXNlcmNvbnRlbnQuY29tJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMxMSA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgdXJsID0gX3RoaXMkcHJvcHMxMS51cmwsXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzMTEucGxheWluZyxcbiAgICAgICAgICBsb29wID0gX3RoaXMkcHJvcHMxMS5sb29wLFxuICAgICAgICAgIGNvbnRyb2xzID0gX3RoaXMkcHJvcHMxMS5jb250cm9scyxcbiAgICAgICAgICBtdXRlZCA9IF90aGlzJHByb3BzMTEubXV0ZWQsXG4gICAgICAgICAgY29uZmlnID0gX3RoaXMkcHJvcHMxMS5jb25maWcsXG4gICAgICAgICAgd2lkdGggPSBfdGhpcyRwcm9wczExLndpZHRoLFxuICAgICAgICAgIGhlaWdodCA9IF90aGlzJHByb3BzMTEuaGVpZ2h0O1xuICAgICAgdmFyIHVzZUF1ZGlvID0gdGhpcy5zaG91bGRVc2VBdWRpbyh0aGlzLnByb3BzKTtcbiAgICAgIHZhciBFbGVtZW50ID0gdXNlQXVkaW8gPyAnYXVkaW8nIDogJ3ZpZGVvJztcbiAgICAgIHZhciBzdHlsZSA9IHtcbiAgICAgICAgd2lkdGg6IHdpZHRoID09PSAnYXV0bycgPyB3aWR0aCA6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiBoZWlnaHQgPT09ICdhdXRvJyA/IGhlaWdodCA6ICcxMDAlJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KEVsZW1lbnQsIF9leHRlbmRzKHtcbiAgICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgICAgc3JjOiB0aGlzLmdldFNvdXJjZSh1cmwpLFxuICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgIHByZWxvYWQ6IFwiYXV0b1wiLFxuICAgICAgICBhdXRvUGxheTogcGxheWluZyB8fCB1bmRlZmluZWQsXG4gICAgICAgIGNvbnRyb2xzOiBjb250cm9scyxcbiAgICAgICAgbXV0ZWQ6IG11dGVkLFxuICAgICAgICBsb29wOiBsb29wXG4gICAgICB9LCBjb25maWcuYXR0cmlidXRlcyksIHVybCBpbnN0YW5jZW9mIEFycmF5ICYmIHVybC5tYXAodGhpcy5yZW5kZXJTb3VyY2VFbGVtZW50KSwgY29uZmlnLnRyYWNrcy5tYXAodGhpcy5yZW5kZXJUcmFjaykpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGaWxlUGxheWVyO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBGaWxlUGxheWVyO1xuXG5fZGVmaW5lUHJvcGVydHkoRmlsZVBsYXllciwgXCJkaXNwbGF5TmFtZVwiLCAnRmlsZVBsYXllcicpO1xuXG5fZGVmaW5lUHJvcGVydHkoRmlsZVBsYXllciwgXCJjYW5QbGF5XCIsIF9wYXR0ZXJucy5jYW5QbGF5LmZpbGUpOyIsICJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZShcIi4uL3V0aWxzXCIpO1xuXG52YXIgX3BhdHRlcm5zID0gcmVxdWlyZShcIi4uL3BhdHRlcm5zXCIpO1xuXG52YXIgX2RlZmF1bHQgPSBbe1xuICBrZXk6ICd5b3V0dWJlJyxcbiAgbmFtZTogJ1lvdVR1YmUnLFxuICBjYW5QbGF5OiBfcGF0dGVybnMuY2FuUGxheS55b3V0dWJlLFxuICBsYXp5UGxheWVyOiAvKiNfX1BVUkVfXyovKDAsIF9yZWFjdC5sYXp5KShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGltcG9ydChcbiAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiAncmVhY3RQbGF5ZXJZb3VUdWJlJyAqL1xuICAgICcuL1lvdVR1YmUnKTtcbiAgfSlcbn0sIHtcbiAga2V5OiAnc291bmRjbG91ZCcsXG4gIG5hbWU6ICdTb3VuZENsb3VkJyxcbiAgY2FuUGxheTogX3BhdHRlcm5zLmNhblBsYXkuc291bmRjbG91ZCxcbiAgbGF6eVBsYXllcjogLyojX19QVVJFX18qLygwLCBfcmVhY3QubGF6eSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpbXBvcnQoXG4gICAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyU291bmRDbG91ZCcgKi9cbiAgICAnLi9Tb3VuZENsb3VkJyk7XG4gIH0pXG59LCB7XG4gIGtleTogJ3ZpbWVvJyxcbiAgbmFtZTogJ1ZpbWVvJyxcbiAgY2FuUGxheTogX3BhdHRlcm5zLmNhblBsYXkudmltZW8sXG4gIGxhenlQbGF5ZXI6IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8qIHdlYnBhY2tDaHVua05hbWU6ICdyZWFjdFBsYXllclZpbWVvJyAqL1xuICAgICcuL1ZpbWVvJyk7XG4gIH0pXG59LCB7XG4gIGtleTogJ2ZhY2Vib29rJyxcbiAgbmFtZTogJ0ZhY2Vib29rJyxcbiAgY2FuUGxheTogX3BhdHRlcm5zLmNhblBsYXkuZmFjZWJvb2ssXG4gIGxhenlQbGF5ZXI6IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8qIHdlYnBhY2tDaHVua05hbWU6ICdyZWFjdFBsYXllckZhY2Vib29rJyAqL1xuICAgICcuL0ZhY2Vib29rJyk7XG4gIH0pXG59LCB7XG4gIGtleTogJ3N0cmVhbWFibGUnLFxuICBuYW1lOiAnU3RyZWFtYWJsZScsXG4gIGNhblBsYXk6IF9wYXR0ZXJucy5jYW5QbGF5LnN0cmVhbWFibGUsXG4gIGxhenlQbGF5ZXI6IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8qIHdlYnBhY2tDaHVua05hbWU6ICdyZWFjdFBsYXllclN0cmVhbWFibGUnICovXG4gICAgJy4vU3RyZWFtYWJsZScpO1xuICB9KVxufSwge1xuICBrZXk6ICd3aXN0aWEnLFxuICBuYW1lOiAnV2lzdGlhJyxcbiAgY2FuUGxheTogX3BhdHRlcm5zLmNhblBsYXkud2lzdGlhLFxuICBsYXp5UGxheWVyOiAvKiNfX1BVUkVfXyovKDAsIF9yZWFjdC5sYXp5KShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGltcG9ydChcbiAgICAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiAncmVhY3RQbGF5ZXJXaXN0aWEnICovXG4gICAgJy4vV2lzdGlhJyk7XG4gIH0pXG59LCB7XG4gIGtleTogJ3R3aXRjaCcsXG4gIG5hbWU6ICdUd2l0Y2gnLFxuICBjYW5QbGF5OiBfcGF0dGVybnMuY2FuUGxheS50d2l0Y2gsXG4gIGxhenlQbGF5ZXI6IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8qIHdlYnBhY2tDaHVua05hbWU6ICdyZWFjdFBsYXllclR3aXRjaCcgKi9cbiAgICAnLi9Ud2l0Y2gnKTtcbiAgfSlcbn0sIHtcbiAga2V5OiAnZGFpbHltb3Rpb24nLFxuICBuYW1lOiAnRGFpbHlNb3Rpb24nLFxuICBjYW5QbGF5OiBfcGF0dGVybnMuY2FuUGxheS5kYWlseW1vdGlvbixcbiAgbGF6eVBsYXllcjogLyojX19QVVJFX18qLygwLCBfcmVhY3QubGF6eSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpbXBvcnQoXG4gICAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyRGFpbHlNb3Rpb24nICovXG4gICAgJy4vRGFpbHlNb3Rpb24nKTtcbiAgfSlcbn0sIHtcbiAga2V5OiAnbWl4Y2xvdWQnLFxuICBuYW1lOiAnTWl4Y2xvdWQnLFxuICBjYW5QbGF5OiBfcGF0dGVybnMuY2FuUGxheS5taXhjbG91ZCxcbiAgbGF6eVBsYXllcjogLyojX19QVVJFX18qLygwLCBfcmVhY3QubGF6eSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpbXBvcnQoXG4gICAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyTWl4Y2xvdWQnICovXG4gICAgJy4vTWl4Y2xvdWQnKTtcbiAgfSlcbn0sIHtcbiAga2V5OiAndmlkeWFyZCcsXG4gIG5hbWU6ICdWaWR5YXJkJyxcbiAgY2FuUGxheTogX3BhdHRlcm5zLmNhblBsYXkudmlkeWFyZCxcbiAgbGF6eVBsYXllcjogLyojX19QVVJFX18qLygwLCBfcmVhY3QubGF6eSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpbXBvcnQoXG4gICAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyVmlkeWFyZCcgKi9cbiAgICAnLi9WaWR5YXJkJyk7XG4gIH0pXG59LCB7XG4gIGtleTogJ2thbHR1cmEnLFxuICBuYW1lOiAnS2FsdHVyYScsXG4gIGNhblBsYXk6IF9wYXR0ZXJucy5jYW5QbGF5LmthbHR1cmEsXG4gIGxhenlQbGF5ZXI6IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaW1wb3J0KFxuICAgIC8qIHdlYnBhY2tDaHVua05hbWU6ICdyZWFjdFBsYXllckthbHR1cmEnICovXG4gICAgJy4vS2FsdHVyYScpO1xuICB9KVxufSwge1xuICBrZXk6ICdmaWxlJyxcbiAgbmFtZTogJ0ZpbGVQbGF5ZXInLFxuICBjYW5QbGF5OiBfcGF0dGVybnMuY2FuUGxheS5maWxlLFxuICBjYW5FbmFibGVQSVA6IGZ1bmN0aW9uIGNhbkVuYWJsZVBJUCh1cmwpIHtcbiAgICByZXR1cm4gX3BhdHRlcm5zLmNhblBsYXkuZmlsZSh1cmwpICYmIChkb2N1bWVudC5waWN0dXJlSW5QaWN0dXJlRW5hYmxlZCB8fCAoMCwgX3V0aWxzLnN1cHBvcnRzV2ViS2l0UHJlc2VudGF0aW9uTW9kZSkoKSkgJiYgIV9wYXR0ZXJucy5BVURJT19FWFRFTlNJT05TLnRlc3QodXJsKTtcbiAgfSxcbiAgbGF6eVBsYXllcjogLyojX19QVVJFX18qLygwLCBfcmVhY3QubGF6eSkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpbXBvcnQoXG4gICAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyRmlsZVBsYXllcicgKi9cbiAgICAnLi9GaWxlUGxheWVyJyk7XG4gIH0pXG59XTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwgIid1c2Ugc3RyaWN0JztcblxudmFyIHNhZmVJc05hTiA9IE51bWJlci5pc05hTiB8fFxuICAgIGZ1bmN0aW9uIHBvbnlmaWxsKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSB2YWx1ZTtcbiAgICB9O1xuZnVuY3Rpb24gaXNFcXVhbChmaXJzdCwgc2Vjb25kKSB7XG4gICAgaWYgKGZpcnN0ID09PSBzZWNvbmQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzYWZlSXNOYU4oZmlyc3QpICYmIHNhZmVJc05hTihzZWNvbmQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBhcmVJbnB1dHNFcXVhbChuZXdJbnB1dHMsIGxhc3RJbnB1dHMpIHtcbiAgICBpZiAobmV3SW5wdXRzLmxlbmd0aCAhPT0gbGFzdElucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0lucHV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWlzRXF1YWwobmV3SW5wdXRzW2ldLCBsYXN0SW5wdXRzW2ldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtZW1vaXplT25lKHJlc3VsdEZuLCBpc0VxdWFsKSB7XG4gICAgaWYgKGlzRXF1YWwgPT09IHZvaWQgMCkgeyBpc0VxdWFsID0gYXJlSW5wdXRzRXF1YWw7IH1cbiAgICB2YXIgbGFzdFRoaXM7XG4gICAgdmFyIGxhc3RBcmdzID0gW107XG4gICAgdmFyIGxhc3RSZXN1bHQ7XG4gICAgdmFyIGNhbGxlZE9uY2UgPSBmYWxzZTtcbiAgICBmdW5jdGlvbiBtZW1vaXplZCgpIHtcbiAgICAgICAgdmFyIG5ld0FyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG5ld0FyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsbGVkT25jZSAmJiBsYXN0VGhpcyA9PT0gdGhpcyAmJiBpc0VxdWFsKG5ld0FyZ3MsIGxhc3RBcmdzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFJlc3VsdCA9IHJlc3VsdEZuLmFwcGx5KHRoaXMsIG5ld0FyZ3MpO1xuICAgICAgICBjYWxsZWRPbmNlID0gdHJ1ZTtcbiAgICAgICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgICAgICBsYXN0QXJncyA9IG5ld0FyZ3M7XG4gICAgICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWVtb2l6ZU9uZTtcbiIsICIvKiBnbG9iYWwgTWFwOnJlYWRvbmx5LCBTZXQ6cmVhZG9ubHksIEFycmF5QnVmZmVyOnJlYWRvbmx5ICovXG5cbnZhciBoYXNFbGVtZW50VHlwZSA9IHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJztcbnZhciBoYXNNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nO1xudmFyIGhhc1NldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbic7XG52YXIgaGFzQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgISFBcnJheUJ1ZmZlci5pc1ZpZXc7XG5cbi8vIE5vdGU6IFdlICoqZG9uJ3QqKiBuZWVkIGBlbnZIYXNCaWdJbnQ2NEFycmF5YCBpbiBmZGUgZXM2L2luZGV4LmpzXG5cbmZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgLy8gU1RBUlQ6IGZhc3QtZGVlcC1lcXVhbCBlczYvaW5kZXguanMgMy4xLjFcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFNUQVJUOiBNb2RpZmljYXRpb25zOlxuICAgIC8vIDEuIEV4dHJhIGBoYXM8VHlwZT4gJiZgIGhlbHBlcnMgaW4gaW5pdGlhbCBjb25kaXRpb24gYWxsb3cgZXM2IGNvZGVcbiAgICAvLyAgICB0byBjby1leGlzdCB3aXRoIGVzNS5cbiAgICAvLyAyLiBSZXBsYWNlIGBmb3Igb2ZgIHdpdGggZXM1IGNvbXBsaWFudCBpdGVyYXRpb24gdXNpbmcgYGZvcmAuXG4gICAgLy8gICAgQmFzaWNhbGx5LCB0YWtlOlxuICAgIC8vXG4gICAgLy8gICAgYGBganNcbiAgICAvLyAgICBmb3IgKGkgb2YgYS5lbnRyaWVzKCkpXG4gICAgLy8gICAgICBpZiAoIWIuaGFzKGlbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgYGBgXG4gICAgLy9cbiAgICAvLyAgICAuLi4gYW5kIGNvbnZlcnQgdG86XG4gICAgLy9cbiAgICAvLyAgICBgYGBqc1xuICAgIC8vICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgLy8gICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAvLyAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICBgYGBcbiAgICAvL1xuICAgIC8vICAgICoqTm90ZSoqOiBgaWAgYWNjZXNzIHN3aXRjaGVzIHRvIGBpLnZhbHVlYC5cbiAgICB2YXIgaXQ7XG4gICAgaWYgKGhhc01hcCAmJiAoYSBpbnN0YW5jZW9mIE1hcCkgJiYgKGIgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFlcXVhbChpLnZhbHVlWzFdLCBiLmdldChpLnZhbHVlWzBdKSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChoYXNTZXQgJiYgKGEgaW5zdGFuY2VvZiBTZXQpICYmIChiIGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIEVORDogTW9kaWZpY2F0aW9uc1xuXG4gICAgaWYgKGhhc0FycmF5QnVmZmVyICYmIEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYikpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGEuY29uc3RydWN0b3IgPT09IFJlZ0V4cCkgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICAgIGlmIChhLnZhbHVlT2YgIT09IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZikgcmV0dXJuIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTtcbiAgICBpZiAoYS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykgcmV0dXJuIGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBFTkQ6IGZhc3QtZGVlcC1lcXVhbFxuXG4gICAgLy8gU1RBUlQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuICAgIC8vIGN1c3RvbSBoYW5kbGluZyBmb3IgRE9NIGVsZW1lbnRzXG4gICAgaWYgKGhhc0VsZW1lbnRUeXBlICYmIGEgaW5zdGFuY2VvZiBFbGVtZW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIFJlYWN0L1ByZWFjdFxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgaWYgKChrZXlzW2ldID09PSAnX293bmVyJyB8fCBrZXlzW2ldID09PSAnX192JyB8fCBrZXlzW2ldID09PSAnX19vJykgJiYgYS4kJHR5cGVvZikge1xuICAgICAgICAvLyBSZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBSZWFjdCBlbGVtZW50cycgX293bmVyXG4gICAgICAgIC8vIFByZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBQcmVhY3QgZWxlbWVudHMnIF9fdiBhbmQgX19vXG4gICAgICAgIC8vICAgIF9fdiA9ICRfb3JpZ2luYWwgLyAkX3Zub2RlXG4gICAgICAgIC8vICAgIF9fbyA9ICRfb3duZXJcbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBjb250YWluIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIGFyZSBub3QgbmVlZGVkIHdoZW5cbiAgICAgICAgLy8gY29tcGFyaW5nIHRoZSBhY3R1YWwgZWxlbWVudHMgKGFuZCBub3QgdGhlaXIgb3duZXJzKVxuICAgICAgICAvLyAuJCR0eXBlb2YgYW5kIC5fc3RvcmUgb24ganVzdCByZWFzb25hYmxlIG1hcmtlcnMgb2YgZWxlbWVudHNcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWxsIG90aGVyIHByb3BlcnRpZXMgc2hvdWxkIGJlIHRyYXZlcnNlZCBhcyB1c3VhbFxuICAgICAgaWYgKCFlcXVhbChhW2tleXNbaV1dLCBiW2tleXNbaV1dKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBFTkQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuXG4gICAgLy8gU1RBUlQ6IGZhc3QtZGVlcC1lcXVhbFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbn1cbi8vIGVuZCBmYXN0LWRlZXAtZXF1YWxcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXF1YWwoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCgoZXJyb3IubWVzc2FnZSB8fCAnJykubWF0Y2goL3N0YWNrfHJlY3Vyc2lvbi9pKSkpIHtcbiAgICAgIC8vIHdhcm4gb24gY2lyY3VsYXIgcmVmZXJlbmNlcywgZG9uJ3QgY3Jhc2hcbiAgICAgIC8vIGJyb3dzZXJzIGdpdmUgdGhpcyBkaWZmZXJlbnQgZXJyb3JzIG5hbWUgYW5kIG1lc3NhZ2VzOlxuICAgICAgLy8gY2hyb21lL3NhZmFyaTogXCJSYW5nZUVycm9yXCIsIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIlxuICAgICAgLy8gZmlyZWZveDogXCJJbnRlcm5hbEVycm9yXCIsIHRvbyBtdWNoIHJlY3Vyc2lvblwiXG4gICAgICAvLyBlZGdlOiBcIkVycm9yXCIsIFwiT3V0IG9mIHN0YWNrIHNwYWNlXCJcbiAgICAgIGNvbnNvbGUud2FybigncmVhY3QtZmFzdC1jb21wYXJlIGNhbm5vdCBoYW5kbGUgY2lyY3VsYXIgcmVmcycpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBzb21lIG90aGVyIGVycm9yLiB3ZSBzaG91bGQgZGVmaW5pdGVseSBrbm93IGFib3V0IHRoZXNlXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLCAiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgYj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLGM9Yj9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMyxkPWI/U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTo2MDEwNixlPWI/U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpOjYwMTA3LGY9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik6NjAxMDgsZz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTo2MDExNCxoPWI/U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpOjYwMTA5LGs9Yj9TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTo2MDExMCxsPWI/U3ltYm9sLmZvcihcInJlYWN0LmFzeW5jX21vZGVcIik6NjAxMTEsbT1iP1N5bWJvbC5mb3IoXCJyZWFjdC5jb25jdXJyZW50X21vZGVcIik6NjAxMTEsbj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTo2MDExMixwPWI/U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpOjYwMTEzLHE9Yj9cblN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpOjYwMTIwLHI9Yj9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSx0PWI/U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik6NjAxMTYsdj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5ibG9ja1wiKTo2MDEyMSx3PWI/U3ltYm9sLmZvcihcInJlYWN0LmZ1bmRhbWVudGFsXCIpOjYwMTE3LHg9Yj9TeW1ib2wuZm9yKFwicmVhY3QucmVzcG9uZGVyXCIpOjYwMTE4LHk9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc2NvcGVcIik6NjAxMTk7XG5mdW5jdGlvbiB6KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciB1PWEuJCR0eXBlb2Y7c3dpdGNoKHUpe2Nhc2UgYzpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBsOmNhc2UgbTpjYXNlIGU6Y2FzZSBnOmNhc2UgZjpjYXNlIHA6cmV0dXJuIGE7ZGVmYXVsdDpzd2l0Y2goYT1hJiZhLiQkdHlwZW9mLGEpe2Nhc2UgazpjYXNlIG46Y2FzZSB0OmNhc2UgcjpjYXNlIGg6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gdX19Y2FzZSBkOnJldHVybiB1fX19ZnVuY3Rpb24gQShhKXtyZXR1cm4geihhKT09PW19ZXhwb3J0cy5Bc3luY01vZGU9bDtleHBvcnRzLkNvbmN1cnJlbnRNb2RlPW07ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aztleHBvcnRzLkNvbnRleHRQcm92aWRlcj1oO2V4cG9ydHMuRWxlbWVudD1jO2V4cG9ydHMuRm9yd2FyZFJlZj1uO2V4cG9ydHMuRnJhZ21lbnQ9ZTtleHBvcnRzLkxhenk9dDtleHBvcnRzLk1lbW89cjtleHBvcnRzLlBvcnRhbD1kO1xuZXhwb3J0cy5Qcm9maWxlcj1nO2V4cG9ydHMuU3RyaWN0TW9kZT1mO2V4cG9ydHMuU3VzcGVuc2U9cDtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBBKGEpfHx6KGEpPT09bH07ZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlPUE7ZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lcj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWt9O2V4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ofTtleHBvcnRzLmlzRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09Y307ZXhwb3J0cy5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ufTtleHBvcnRzLmlzRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1lfTtleHBvcnRzLmlzTGF6eT1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PXR9O1xuZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1yfTtleHBvcnRzLmlzUG9ydGFsPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09ZH07ZXhwb3J0cy5pc1Byb2ZpbGVyPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09Z307ZXhwb3J0cy5pc1N0cmljdE1vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1mfTtleHBvcnRzLmlzU3VzcGVuc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1wfTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1lfHxhPT09bXx8YT09PWd8fGE9PT1mfHxhPT09cHx8YT09PXF8fFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJihhLiQkdHlwZW9mPT09dHx8YS4kJHR5cGVvZj09PXJ8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09a3x8YS4kJHR5cGVvZj09PW58fGEuJCR0eXBlb2Y9PT13fHxhLiQkdHlwZW9mPT09eHx8YS4kJHR5cGVvZj09PXl8fGEuJCR0eXBlb2Y9PT12KX07ZXhwb3J0cy50eXBlT2Y9ejtcbiIsICIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsICIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0O1xuIiwgIm1vZHVsZS5leHBvcnRzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB2YXIgaGFzID0gcmVxdWlyZSgnLi9saWIvaGFzJyk7XG5cbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHsgLyoqLyB9XG4gIH07XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKFxuICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgICAgICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICtcbiAgICAgICAgICAgICAgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICBsb2NhdGlvbiArICcgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgKyB0eXBlb2YgZXJyb3IgKyAnLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgKHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldHMgd2FybmluZyBjYWNoZSB3aGVuIHRlc3RpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzO1xuIiwgIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vbGliL2hhcycpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgnLi9jaGVja1Byb3BUeXBlcycpO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGwoKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICAgKlxuICAgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAgICpcbiAgICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAgICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAgICogICAgICAgLi4uXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gICAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gICAqXG4gICAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAgICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAgICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAgICpcbiAgICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICAgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICAgKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gICAqICAgICB9LFxuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICAgKlxuICAgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAgICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gICAqXG4gICAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAgICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICAgKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICAgKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gICAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgKiAgICAgICAgICApO1xuICAgKiAgICAgICAgfVxuICAgKiAgICAgIH1cbiAgICogICAgfSxcbiAgICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gICAqICB9KTtcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gICAgYmlnaW50OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYmlnaW50JyksXG4gICAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICAgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gICAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gICAgZWxlbWVudFR5cGU6IGNyZWF0ZUVsZW1lbnRUeXBlVHlwZUNoZWNrZXIoKSxcbiAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIsXG4gICAgZXhhY3Q6IGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAqL1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSovXG4gIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gICAgfVxuICB9XG4gIC8qZXNsaW50LWVuYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuXG4gIC8qKlxuICAgKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsXG4gICAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIsIHdlIGRvbid0IHVzZSByZWFsXG4gICAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW1cbiAgICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdFxuICAgKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuXG4gICAqL1xuICBmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UsIGRhdGEpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuZGF0YSA9IGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YToge307XG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG4gIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cbiAgUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlID0ge307XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPSAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1R5cGUoaXNSZXF1aXJlZCwgcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgIHByb3BGdWxsTmFtZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgICAgaWYgKHNlY3JldCAhPT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgICAgaWYgKHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgICAgICAgICAvLyBOZXcgYmVoYXZpb3Igb25seSBmb3IgdXNlcnMgb2YgYHByb3AtdHlwZXNgIHBhY2thZ2VcbiAgICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgJ1VzZSBgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKClgIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAgICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICAgICAgICApO1xuICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE9sZCBiZWhhdmlvciBmb3IgcGVvcGxlIHVzaW5nIFJlYWN0LlByb3BUeXBlc1xuICAgICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldICYmXG4gICAgICAgICAgICAvLyBBdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZSBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIG5vdCBhY3Rpb25hYmxlIGV4Y2VwdCBmb3IgbGliIGF1dGhvcnNcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50IDwgM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgICAnWW91IGFyZSBtYW51YWxseSBjYWxsaW5nIGEgUmVhY3QuUHJvcFR5cGVzIHZhbGlkYXRpb24gJyArXG4gICAgICAgICAgICAgICdmdW5jdGlvbiBmb3IgdGhlIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgcHJvcCBvbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgK1xuICAgICAgICAgICAgICAnYW5kIHdpbGwgdGhyb3cgaW4gdGhlIHN0YW5kYWxvbmUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgICAnWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAnICtcbiAgICAgICAgICAgICAgJ2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyAnICsgJ2ZvciBkZXRhaWxzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhblxuICAgICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJyksXG4gICAgICAgICAge2V4cGVjdGVkVHlwZTogZXhwZWN0ZWRUeXBlfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBhcnJheS4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycgKyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIVJlYWN0SXMuaXNWYWxpZEVsZW1lbnRUeXBlKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50IHR5cGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICAgIHZhciBleHBlY3RlZENsYXNzTmFtZSA9IGV4cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgYWN0dWFsQ2xhc3NOYW1lICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdpbnN0YW5jZSBvZiBgJyArIGV4cGVjdGVkQ2xhc3NOYW1lICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LCBnb3QgJyArIGFyZ3VtZW50cy5sZW5ndGggKyAnIGFyZ3VtZW50cy4gJyArXG4gICAgICAgICAgICAnQSBjb21tb24gbWlzdGFrZSBpcyB0byB3cml0ZSBvbmVPZih4LCB5LCB6KSBpbnN0ZWFkIG9mIG9uZU9mKFt4LCB5LCB6XSkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMsIGZ1bmN0aW9uIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIFN0cmluZyhwcm9wVmFsdWUpICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBvZiAnICsgdmFsdWVzU3RyaW5nICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIG9iamVjdC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7XG4gICAgICAgIGlmIChoYXMocHJvcFZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVVbmlvblR5cGVDaGVja2VyKGFycmF5T2ZUeXBlQ2hlY2tlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUuIEV4cGVjdGVkIGFuIGFycmF5IG9mIGNoZWNrIGZ1bmN0aW9ucywgYnV0ICcgK1xuICAgICAgICAgICdyZWNlaXZlZCAnICsgZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKGNoZWNrZXIpICsgJyBhdCBpbmRleCAnICsgaSArICcuJ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBleHBlY3RlZFR5cGVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgICB2YXIgY2hlY2tlclJlc3VsdCA9IGNoZWNrZXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChjaGVja2VyUmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tlclJlc3VsdC5kYXRhICYmIGhhcyhjaGVja2VyUmVzdWx0LmRhdGEsICdleHBlY3RlZFR5cGUnKSkge1xuICAgICAgICAgIGV4cGVjdGVkVHlwZXMucHVzaChjaGVja2VyUmVzdWx0LmRhdGEuZXhwZWN0ZWRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGV4cGVjdGVkVHlwZXNNZXNzYWdlID0gKGV4cGVjdGVkVHlwZXMubGVuZ3RoID4gMCkgPyAnLCBleHBlY3RlZCBvbmUgb2YgdHlwZSBbJyArIGV4cGVjdGVkVHlwZXMuam9pbignLCAnKSArICddJzogJyc7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgJyArIGV4cGVjdGVkVHlwZXNNZXNzYWdlICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghaXNOb2RlKHByb3BzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZhbGlkVmFsaWRhdG9yRXJyb3IoY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwga2V5LCB0eXBlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKFxuICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXkgKyAnYCBpcyBpbnZhbGlkOyAnICtcbiAgICAgICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGUgKyAnYC4nXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFZhbGlkYXRvckVycm9yKGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIGtleSwgZ2V0UHJlY2lzZVR5cGUoY2hlY2tlcikpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0cmljdFNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgYWxsIGtleXMgaW4gY2FzZSBzb21lIGFyZSByZXF1aXJlZCBidXQgbWlzc2luZyBmcm9tIHByb3BzLlxuICAgICAgdmFyIGFsbEtleXMgPSBhc3NpZ24oe30sIHByb3BzW3Byb3BOYW1lXSwgc2hhcGVUeXBlcyk7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gYWxsS2V5cykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKGhhcyhzaGFwZVR5cGVzLCBrZXkpICYmIHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGludmFsaWRWYWxpZGF0b3JFcnJvcihjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBrZXksIGdldFByZWNpc2VUeXBlKGNoZWNrZXIpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgICAnSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Aga2V5IGAnICsga2V5ICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJyArXG4gICAgICAgICAgICAnXFxuQmFkIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KHByb3BzW3Byb3BOYW1lXSwgbnVsbCwgJyAgJykgK1xuICAgICAgICAgICAgJ1xcblZhbGlkIGtleXM6ICcgKyBKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhzaGFwZVR5cGVzKSwgbnVsbCwgJyAgJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlcnJvciA9IGNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gIXByb3BWYWx1ZTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgLy8gTmF0aXZlIFN5bWJvbC5cbiAgICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBmYWxzeSB2YWx1ZSBjYW4ndCBiZSBhIFN5bWJvbFxuICAgIGlmICghcHJvcFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSA9PT0gJ1N5bWJvbCdcbiAgICBpZiAocHJvcFZhbHVlWydAQHRvU3RyaW5nVGFnJ10gPT09ICdTeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3Igbm9uLXNwZWMgY29tcGxpYW50IFN5bWJvbHMgd2hpY2ggYXJlIHBvbHlmaWxsZWQuXG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgcHJvcFZhbHVlIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFcXVpdmFsZW50IG9mIGB0eXBlb2ZgIGJ1dCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFycmF5IGFuZCByZWdleHAuXG4gIGZ1bmN0aW9uIGdldFByb3BUeXBlKHByb3BWYWx1ZSkge1xuICAgIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgfVxuICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIC8vIE9sZCB3ZWJraXRzIChhdCBsZWFzdCB1bnRpbCBBbmRyb2lkIDQuMCkgcmV0dXJuICdmdW5jdGlvbicgcmF0aGVyIHRoYW5cbiAgICAgIC8vICdvYmplY3QnIGZvciB0eXBlb2YgYSBSZWdFeHAuIFdlJ2xsIG5vcm1hbGl6ZSB0aGlzIGhlcmUgc28gdGhhdCAvYmxhL1xuICAgICAgLy8gcGFzc2VzIFByb3BUeXBlcy5vYmplY3QuXG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSkge1xuICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBUaGlzIGhhbmRsZXMgbW9yZSB0eXBlcyB0aGFuIGBnZXRQcm9wVHlwZWAuIE9ubHkgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gIC8vIFNlZSBgY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXJgLlxuICBmdW5jdGlvbiBnZXRQcmVjaXNlVHlwZShwcm9wVmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJycgKyBwcm9wVmFsdWU7XG4gICAgfVxuICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgaWYgKHByb3BUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuICdkYXRlJztcbiAgICAgIH0gZWxzZSBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHJldHVybiAncmVnZXhwJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHBvc3RmaXhlZCB0byBhIHdhcm5pbmcgYWJvdXQgYW4gaW52YWxpZCB0eXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgXCJ1bmRlZmluZWRcIiBvciBcIm9mIHR5cGUgYXJyYXlcIlxuICBmdW5jdGlvbiBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcodmFsdWUpIHtcbiAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiAnYW4gJyArIHR5cGU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgY2FzZSAncmVnZXhwJzpcbiAgICAgICAgcmV0dXJuICdhICcgKyB0eXBlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJucyBjbGFzcyBuYW1lIG9mIHRoZSBvYmplY3QsIGlmIGFueS5cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NOYW1lKHByb3BWYWx1ZSkge1xuICAgIGlmICghcHJvcFZhbHVlLmNvbnN0cnVjdG9yIHx8ICFwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgcmV0dXJuIEFOT05ZTU9VUztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbiAgUmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMgPSBjaGVja1Byb3BUeXBlcztcbiAgUmVhY3RQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBjaGVja1Byb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZTtcbiAgUmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzID0gUmVhY3RQcm9wVHlwZXM7XG5cbiAgcmV0dXJuIFJlYWN0UHJvcFR5cGVzO1xufTtcbiIsICIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHt9XG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uV2l0aFJlc2V0KCkge31cbmVtcHR5RnVuY3Rpb25XaXRoUmVzZXQucmVzZXRXYXJuaW5nQ2FjaGUgPSBlbXB0eUZ1bmN0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiBzaGltKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgaWYgKHNlY3JldCA9PT0gUmVhY3RQcm9wVHlwZXNTZWNyZXQpIHtcbiAgICAgIC8vIEl0IGlzIHN0aWxsIHNhZmUgd2hlbiBjYWxsZWQgZnJvbSBSZWFjdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICdVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICk7XG4gICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgdGhyb3cgZXJyO1xuICB9O1xuICBzaGltLmlzUmVxdWlyZWQgPSBzaGltO1xuICBmdW5jdGlvbiBnZXRTaGltKCkge1xuICAgIHJldHVybiBzaGltO1xuICB9O1xuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IHNoaW0sXG4gICAgYmlnaW50OiBzaGltLFxuICAgIGJvb2w6IHNoaW0sXG4gICAgZnVuYzogc2hpbSxcbiAgICBudW1iZXI6IHNoaW0sXG4gICAgb2JqZWN0OiBzaGltLFxuICAgIHN0cmluZzogc2hpbSxcbiAgICBzeW1ib2w6IHNoaW0sXG5cbiAgICBhbnk6IHNoaW0sXG4gICAgYXJyYXlPZjogZ2V0U2hpbSxcbiAgICBlbGVtZW50OiBzaGltLFxuICAgIGVsZW1lbnRUeXBlOiBzaGltLFxuICAgIGluc3RhbmNlT2Y6IGdldFNoaW0sXG4gICAgbm9kZTogc2hpbSxcbiAgICBvYmplY3RPZjogZ2V0U2hpbSxcbiAgICBvbmVPZjogZ2V0U2hpbSxcbiAgICBvbmVPZlR5cGU6IGdldFNoaW0sXG4gICAgc2hhcGU6IGdldFNoaW0sXG4gICAgZXhhY3Q6IGdldFNoaW0sXG5cbiAgICBjaGVja1Byb3BUeXBlczogZW1wdHlGdW5jdGlvbldpdGhSZXNldCxcbiAgICByZXNldFdhcm5pbmdDYWNoZTogZW1wdHlGdW5jdGlvblxuICB9O1xuXG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCAiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0UHJvcHMgPSBleHBvcnRzLnByb3BUeXBlcyA9IHZvaWQgMDtcblxudmFyIF9wcm9wVHlwZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbnZhciBzdHJpbmcgPSBfcHJvcFR5cGVzW1wiZGVmYXVsdFwiXS5zdHJpbmcsXG4gICAgYm9vbCA9IF9wcm9wVHlwZXNbXCJkZWZhdWx0XCJdLmJvb2wsXG4gICAgbnVtYmVyID0gX3Byb3BUeXBlc1tcImRlZmF1bHRcIl0ubnVtYmVyLFxuICAgIGFycmF5ID0gX3Byb3BUeXBlc1tcImRlZmF1bHRcIl0uYXJyYXksXG4gICAgb25lT2ZUeXBlID0gX3Byb3BUeXBlc1tcImRlZmF1bHRcIl0ub25lT2ZUeXBlLFxuICAgIHNoYXBlID0gX3Byb3BUeXBlc1tcImRlZmF1bHRcIl0uc2hhcGUsXG4gICAgb2JqZWN0ID0gX3Byb3BUeXBlc1tcImRlZmF1bHRcIl0ub2JqZWN0LFxuICAgIGZ1bmMgPSBfcHJvcFR5cGVzW1wiZGVmYXVsdFwiXS5mdW5jLFxuICAgIG5vZGUgPSBfcHJvcFR5cGVzW1wiZGVmYXVsdFwiXS5ub2RlO1xudmFyIHByb3BUeXBlcyA9IHtcbiAgdXJsOiBvbmVPZlR5cGUoW3N0cmluZywgYXJyYXksIG9iamVjdF0pLFxuICBwbGF5aW5nOiBib29sLFxuICBsb29wOiBib29sLFxuICBjb250cm9sczogYm9vbCxcbiAgdm9sdW1lOiBudW1iZXIsXG4gIG11dGVkOiBib29sLFxuICBwbGF5YmFja1JhdGU6IG51bWJlcixcbiAgd2lkdGg6IG9uZU9mVHlwZShbc3RyaW5nLCBudW1iZXJdKSxcbiAgaGVpZ2h0OiBvbmVPZlR5cGUoW3N0cmluZywgbnVtYmVyXSksXG4gIHN0eWxlOiBvYmplY3QsXG4gIHByb2dyZXNzSW50ZXJ2YWw6IG51bWJlcixcbiAgcGxheXNpbmxpbmU6IGJvb2wsXG4gIHBpcDogYm9vbCxcbiAgc3RvcE9uVW5tb3VudDogYm9vbCxcbiAgbGlnaHQ6IG9uZU9mVHlwZShbYm9vbCwgc3RyaW5nXSksXG4gIHBsYXlJY29uOiBub2RlLFxuICBwcmV2aWV3VGFiSW5kZXg6IG51bWJlcixcbiAgZmFsbGJhY2s6IG5vZGUsXG4gIG9FbWJlZFVybDogc3RyaW5nLFxuICB3cmFwcGVyOiBvbmVPZlR5cGUoW3N0cmluZywgZnVuYywgc2hhcGUoe1xuICAgIHJlbmRlcjogZnVuYy5pc1JlcXVpcmVkXG4gIH0pXSksXG4gIGNvbmZpZzogc2hhcGUoe1xuICAgIHNvdW5kY2xvdWQ6IHNoYXBlKHtcbiAgICAgIG9wdGlvbnM6IG9iamVjdFxuICAgIH0pLFxuICAgIHlvdXR1YmU6IHNoYXBlKHtcbiAgICAgIHBsYXllclZhcnM6IG9iamVjdCxcbiAgICAgIGVtYmVkT3B0aW9uczogb2JqZWN0LFxuICAgICAgb25VbnN0YXJ0ZWQ6IGZ1bmNcbiAgICB9KSxcbiAgICBmYWNlYm9vazogc2hhcGUoe1xuICAgICAgYXBwSWQ6IHN0cmluZyxcbiAgICAgIHZlcnNpb246IHN0cmluZyxcbiAgICAgIHBsYXllcklkOiBzdHJpbmcsXG4gICAgICBhdHRyaWJ1dGVzOiBvYmplY3RcbiAgICB9KSxcbiAgICBkYWlseW1vdGlvbjogc2hhcGUoe1xuICAgICAgcGFyYW1zOiBvYmplY3RcbiAgICB9KSxcbiAgICB2aW1lbzogc2hhcGUoe1xuICAgICAgcGxheWVyT3B0aW9uczogb2JqZWN0LFxuICAgICAgdGl0bGU6IHN0cmluZ1xuICAgIH0pLFxuICAgIGZpbGU6IHNoYXBlKHtcbiAgICAgIGF0dHJpYnV0ZXM6IG9iamVjdCxcbiAgICAgIHRyYWNrczogYXJyYXksXG4gICAgICBmb3JjZVZpZGVvOiBib29sLFxuICAgICAgZm9yY2VBdWRpbzogYm9vbCxcbiAgICAgIGZvcmNlSExTOiBib29sLFxuICAgICAgZm9yY2VEQVNIOiBib29sLFxuICAgICAgZm9yY2VGTFY6IGJvb2wsXG4gICAgICBobHNPcHRpb25zOiBvYmplY3QsXG4gICAgICBobHNWZXJzaW9uOiBzdHJpbmcsXG4gICAgICBkYXNoVmVyc2lvbjogc3RyaW5nLFxuICAgICAgZmx2VmVyc2lvbjogc3RyaW5nXG4gICAgfSksXG4gICAgd2lzdGlhOiBzaGFwZSh7XG4gICAgICBvcHRpb25zOiBvYmplY3QsXG4gICAgICBwbGF5ZXJJZDogc3RyaW5nLFxuICAgICAgY3VzdG9tQ29udHJvbHM6IGFycmF5XG4gICAgfSksXG4gICAgbWl4Y2xvdWQ6IHNoYXBlKHtcbiAgICAgIG9wdGlvbnM6IG9iamVjdFxuICAgIH0pLFxuICAgIHR3aXRjaDogc2hhcGUoe1xuICAgICAgb3B0aW9uczogb2JqZWN0LFxuICAgICAgcGxheWVySWQ6IHN0cmluZ1xuICAgIH0pLFxuICAgIHZpZHlhcmQ6IHNoYXBlKHtcbiAgICAgIG9wdGlvbnM6IG9iamVjdFxuICAgIH0pXG4gIH0pLFxuICBvblJlYWR5OiBmdW5jLFxuICBvblN0YXJ0OiBmdW5jLFxuICBvblBsYXk6IGZ1bmMsXG4gIG9uUGF1c2U6IGZ1bmMsXG4gIG9uQnVmZmVyOiBmdW5jLFxuICBvbkJ1ZmZlckVuZDogZnVuYyxcbiAgb25FbmRlZDogZnVuYyxcbiAgb25FcnJvcjogZnVuYyxcbiAgb25EdXJhdGlvbjogZnVuYyxcbiAgb25TZWVrOiBmdW5jLFxuICBvblBsYXliYWNrUmF0ZUNoYW5nZTogZnVuYyxcbiAgb25Qcm9ncmVzczogZnVuYyxcbiAgb25DbGlja1ByZXZpZXc6IGZ1bmMsXG4gIG9uRW5hYmxlUElQOiBmdW5jLFxuICBvbkRpc2FibGVQSVA6IGZ1bmNcbn07XG5leHBvcnRzLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIHBsYXlpbmc6IGZhbHNlLFxuICBsb29wOiBmYWxzZSxcbiAgY29udHJvbHM6IGZhbHNlLFxuICB2b2x1bWU6IG51bGwsXG4gIG11dGVkOiBmYWxzZSxcbiAgcGxheWJhY2tSYXRlOiAxLFxuICB3aWR0aDogJzY0MHB4JyxcbiAgaGVpZ2h0OiAnMzYwcHgnLFxuICBzdHlsZToge30sXG4gIHByb2dyZXNzSW50ZXJ2YWw6IDEwMDAsXG4gIHBsYXlzaW5saW5lOiBmYWxzZSxcbiAgcGlwOiBmYWxzZSxcbiAgc3RvcE9uVW5tb3VudDogdHJ1ZSxcbiAgbGlnaHQ6IGZhbHNlLFxuICBmYWxsYmFjazogbnVsbCxcbiAgd3JhcHBlcjogJ2RpdicsXG4gIHByZXZpZXdUYWJJbmRleDogMCxcbiAgb0VtYmVkVXJsOiAnaHR0cHM6Ly9ub2VtYmVkLmNvbS9lbWJlZD91cmw9e3VybH0nLFxuICBjb25maWc6IHtcbiAgICBzb3VuZGNsb3VkOiB7XG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHZpc3VhbDogdHJ1ZSxcbiAgICAgICAgLy8gVW5kb2N1bWVudGVkLCBidXQgbWFrZXMgcGxheWVyIGZpbGwgY29udGFpbmVyIGFuZCBsb29rIGJldHRlclxuICAgICAgICBidXlpbmc6IGZhbHNlLFxuICAgICAgICBsaWtpbmc6IGZhbHNlLFxuICAgICAgICBkb3dubG9hZDogZmFsc2UsXG4gICAgICAgIHNoYXJpbmc6IGZhbHNlLFxuICAgICAgICBzaG93X2NvbW1lbnRzOiBmYWxzZSxcbiAgICAgICAgc2hvd19wbGF5Y291bnQ6IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICB5b3V0dWJlOiB7XG4gICAgICBwbGF5ZXJWYXJzOiB7XG4gICAgICAgIHBsYXlzaW5saW5lOiAxLFxuICAgICAgICBzaG93aW5mbzogMCxcbiAgICAgICAgcmVsOiAwLFxuICAgICAgICBpdl9sb2FkX3BvbGljeTogMyxcbiAgICAgICAgbW9kZXN0YnJhbmRpbmc6IDFcbiAgICAgIH0sXG4gICAgICBlbWJlZE9wdGlvbnM6IHt9LFxuICAgICAgb25VbnN0YXJ0ZWQ6IG5vb3BcbiAgICB9LFxuICAgIGZhY2Vib29rOiB7XG4gICAgICBhcHBJZDogJzEzMDk2OTcyMDU3NzI4MTknLFxuICAgICAgdmVyc2lvbjogJ3YzLjMnLFxuICAgICAgcGxheWVySWQ6IG51bGwsXG4gICAgICBhdHRyaWJ1dGVzOiB7fVxuICAgIH0sXG4gICAgZGFpbHltb3Rpb246IHtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBhcGk6IDEsXG4gICAgICAgICdlbmRzY3JlZW4tZW5hYmxlJzogZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICAgIHZpbWVvOiB7XG4gICAgICBwbGF5ZXJPcHRpb25zOiB7XG4gICAgICAgIGF1dG9wYXVzZTogZmFsc2UsXG4gICAgICAgIGJ5bGluZTogZmFsc2UsXG4gICAgICAgIHBvcnRyYWl0OiBmYWxzZSxcbiAgICAgICAgdGl0bGU6IGZhbHNlXG4gICAgICB9LFxuICAgICAgdGl0bGU6IG51bGxcbiAgICB9LFxuICAgIGZpbGU6IHtcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgdHJhY2tzOiBbXSxcbiAgICAgIGZvcmNlVmlkZW86IGZhbHNlLFxuICAgICAgZm9yY2VBdWRpbzogZmFsc2UsXG4gICAgICBmb3JjZUhMUzogZmFsc2UsXG4gICAgICBmb3JjZURBU0g6IGZhbHNlLFxuICAgICAgZm9yY2VGTFY6IGZhbHNlLFxuICAgICAgaGxzT3B0aW9uczoge30sXG4gICAgICBobHNWZXJzaW9uOiAnMS4xLjQnLFxuICAgICAgZGFzaFZlcnNpb246ICczLjEuMycsXG4gICAgICBmbHZWZXJzaW9uOiAnMS41LjAnXG4gICAgfSxcbiAgICB3aXN0aWE6IHtcbiAgICAgIG9wdGlvbnM6IHt9LFxuICAgICAgcGxheWVySWQ6IG51bGwsXG4gICAgICBjdXN0b21Db250cm9sczogbnVsbFxuICAgIH0sXG4gICAgbWl4Y2xvdWQ6IHtcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgaGlkZV9jb3ZlcjogMVxuICAgICAgfVxuICAgIH0sXG4gICAgdHdpdGNoOiB7XG4gICAgICBvcHRpb25zOiB7fSxcbiAgICAgIHBsYXllcklkOiBudWxsXG4gICAgfSxcbiAgICB2aWR5YXJkOiB7XG4gICAgICBvcHRpb25zOiB7fVxuICAgIH1cbiAgfSxcbiAgb25SZWFkeTogbm9vcCxcbiAgb25TdGFydDogbm9vcCxcbiAgb25QbGF5OiBub29wLFxuICBvblBhdXNlOiBub29wLFxuICBvbkJ1ZmZlcjogbm9vcCxcbiAgb25CdWZmZXJFbmQ6IG5vb3AsXG4gIG9uRW5kZWQ6IG5vb3AsXG4gIG9uRXJyb3I6IG5vb3AsXG4gIG9uRHVyYXRpb246IG5vb3AsXG4gIG9uU2Vlazogbm9vcCxcbiAgb25QbGF5YmFja1JhdGVDaGFuZ2U6IG5vb3AsXG4gIG9uUHJvZ3Jlc3M6IG5vb3AsXG4gIG9uQ2xpY2tQcmV2aWV3OiBub29wLFxuICBvbkVuYWJsZVBJUDogbm9vcCxcbiAgb25EaXNhYmxlUElQOiBub29wXG59O1xuZXhwb3J0cy5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnZhciBfcmVhY3RGYXN0Q29tcGFyZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0LWZhc3QtY29tcGFyZVwiKSk7XG5cbnZhciBfcHJvcHMgPSByZXF1aXJlKFwiLi9wcm9wc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHsgcmV0dXJuIHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7IGlmIChjYWNoZSkgeyBjYWNoZS5zZXQob2JqLCBuZXdPYmopOyB9IHJldHVybiBuZXdPYmo7IH1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkgeyBpZiAoa2V5IGluIG9iaikgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsgdmFsdWU6IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0pOyB9IGVsc2UgeyBvYmpba2V5XSA9IHZhbHVlOyB9IHJldHVybiBvYmo7IH1cblxudmFyIFNFRUtfT05fUExBWV9FWFBJUlkgPSA1MDAwO1xuXG52YXIgUGxheWVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQbGF5ZXIsIF9Db21wb25lbnQpO1xuXG4gIHZhciBfc3VwZXIgPSBfY3JlYXRlU3VwZXIoUGxheWVyKTtcblxuICBmdW5jdGlvbiBQbGF5ZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYXllcik7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgX2FyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBfYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsLmFwcGx5KF9zdXBlciwgW3RoaXNdLmNvbmNhdChfYXJncykpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcIm1vdW50ZWRcIiwgZmFsc2UpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImlzUmVhZHlcIiwgZmFsc2UpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImlzUGxheWluZ1wiLCBmYWxzZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaXNMb2FkaW5nXCIsIHRydWUpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImxvYWRPblJlYWR5XCIsIG51bGwpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInN0YXJ0T25QbGF5XCIsIHRydWUpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInNlZWtPblBsYXlcIiwgbnVsbCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwib25EdXJhdGlvbkNhbGxlZFwiLCBmYWxzZSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlUGxheWVyTW91bnRcIiwgZnVuY3Rpb24gKHBsYXllcikge1xuICAgICAgaWYgKF90aGlzLnBsYXllcikgcmV0dXJuOyAvLyBQcmV2ZW50IGxvYWRpbmcgdHdpY2UgaW4gc3RyaWN0IG1vZGVcblxuICAgICAgX3RoaXMucGxheWVyID0gcGxheWVyO1xuXG4gICAgICBfdGhpcy5wbGF5ZXIubG9hZChfdGhpcy5wcm9wcy51cmwpO1xuXG4gICAgICBfdGhpcy5wcm9ncmVzcygpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldEludGVybmFsUGxheWVyXCIsIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmICghX3RoaXMucGxheWVyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBfdGhpcy5wbGF5ZXJba2V5XTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJwcm9ncmVzc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMucHJvcHMudXJsICYmIF90aGlzLnBsYXllciAmJiBfdGhpcy5pc1JlYWR5KSB7XG4gICAgICAgIHZhciBwbGF5ZWRTZWNvbmRzID0gX3RoaXMuZ2V0Q3VycmVudFRpbWUoKSB8fCAwO1xuXG4gICAgICAgIHZhciBsb2FkZWRTZWNvbmRzID0gX3RoaXMuZ2V0U2Vjb25kc0xvYWRlZCgpO1xuXG4gICAgICAgIHZhciBkdXJhdGlvbiA9IF90aGlzLmdldER1cmF0aW9uKCk7XG5cbiAgICAgICAgaWYgKGR1cmF0aW9uKSB7XG4gICAgICAgICAgdmFyIHByb2dyZXNzID0ge1xuICAgICAgICAgICAgcGxheWVkU2Vjb25kczogcGxheWVkU2Vjb25kcyxcbiAgICAgICAgICAgIHBsYXllZDogcGxheWVkU2Vjb25kcyAvIGR1cmF0aW9uXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChsb2FkZWRTZWNvbmRzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9ncmVzcy5sb2FkZWRTZWNvbmRzID0gbG9hZGVkU2Vjb25kcztcbiAgICAgICAgICAgIHByb2dyZXNzLmxvYWRlZCA9IGxvYWRlZFNlY29uZHMgLyBkdXJhdGlvbjtcbiAgICAgICAgICB9IC8vIE9ubHkgY2FsbCBvblByb2dyZXNzIGlmIHZhbHVlcyBoYXZlIGNoYW5nZWRcblxuXG4gICAgICAgICAgaWYgKHByb2dyZXNzLnBsYXllZFNlY29uZHMgIT09IF90aGlzLnByZXZQbGF5ZWQgfHwgcHJvZ3Jlc3MubG9hZGVkU2Vjb25kcyAhPT0gX3RoaXMucHJldkxvYWRlZCkge1xuICAgICAgICAgICAgX3RoaXMucHJvcHMub25Qcm9ncmVzcyhwcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMucHJldlBsYXllZCA9IHByb2dyZXNzLnBsYXllZFNlY29uZHM7XG4gICAgICAgICAgX3RoaXMucHJldkxvYWRlZCA9IHByb2dyZXNzLmxvYWRlZFNlY29uZHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMucHJvZ3Jlc3NUaW1lb3V0ID0gc2V0VGltZW91dChfdGhpcy5wcm9ncmVzcywgX3RoaXMucHJvcHMucHJvZ3Jlc3NGcmVxdWVuY3kgfHwgX3RoaXMucHJvcHMucHJvZ3Jlc3NJbnRlcnZhbCk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5tb3VudGVkKSByZXR1cm47XG4gICAgICBfdGhpcy5pc1JlYWR5ID0gdHJ1ZTtcbiAgICAgIF90aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb25SZWFkeSA9IF90aGlzJHByb3BzLm9uUmVhZHksXG4gICAgICAgICAgcGxheWluZyA9IF90aGlzJHByb3BzLnBsYXlpbmcsXG4gICAgICAgICAgdm9sdW1lID0gX3RoaXMkcHJvcHMudm9sdW1lLFxuICAgICAgICAgIG11dGVkID0gX3RoaXMkcHJvcHMubXV0ZWQ7XG4gICAgICBvblJlYWR5KCk7XG5cbiAgICAgIGlmICghbXV0ZWQgJiYgdm9sdW1lICE9PSBudWxsKSB7XG4gICAgICAgIF90aGlzLnBsYXllci5zZXRWb2x1bWUodm9sdW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLmxvYWRPblJlYWR5KSB7XG4gICAgICAgIF90aGlzLnBsYXllci5sb2FkKF90aGlzLmxvYWRPblJlYWR5LCB0cnVlKTtcblxuICAgICAgICBfdGhpcy5sb2FkT25SZWFkeSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHBsYXlpbmcpIHtcbiAgICAgICAgX3RoaXMucGxheWVyLnBsYXkoKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuaGFuZGxlRHVyYXRpb25DaGVjaygpO1xuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhbmRsZVBsYXlcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcbiAgICAgIF90aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG9uU3RhcnQgPSBfdGhpcyRwcm9wczIub25TdGFydCxcbiAgICAgICAgICBvblBsYXkgPSBfdGhpcyRwcm9wczIub25QbGF5LFxuICAgICAgICAgIHBsYXliYWNrUmF0ZSA9IF90aGlzJHByb3BzMi5wbGF5YmFja1JhdGU7XG5cbiAgICAgIGlmIChfdGhpcy5zdGFydE9uUGxheSkge1xuICAgICAgICBpZiAoX3RoaXMucGxheWVyLnNldFBsYXliYWNrUmF0ZSAmJiBwbGF5YmFja1JhdGUgIT09IDEpIHtcbiAgICAgICAgICBfdGhpcy5wbGF5ZXIuc2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvblN0YXJ0KCk7XG4gICAgICAgIF90aGlzLnN0YXJ0T25QbGF5ID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIG9uUGxheSgpO1xuXG4gICAgICBpZiAoX3RoaXMuc2Vla09uUGxheSkge1xuICAgICAgICBfdGhpcy5zZWVrVG8oX3RoaXMuc2Vla09uUGxheSk7XG5cbiAgICAgICAgX3RoaXMuc2Vla09uUGxheSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmhhbmRsZUR1cmF0aW9uQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJoYW5kbGVQYXVzZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cbiAgICAgIGlmICghX3RoaXMuaXNMb2FkaW5nKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uUGF1c2UoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlRW5kZWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGFjdGl2ZVBsYXllciA9IF90aGlzJHByb3BzMy5hY3RpdmVQbGF5ZXIsXG4gICAgICAgICAgbG9vcCA9IF90aGlzJHByb3BzMy5sb29wLFxuICAgICAgICAgIG9uRW5kZWQgPSBfdGhpcyRwcm9wczMub25FbmRlZDtcblxuICAgICAgaWYgKGFjdGl2ZVBsYXllci5sb29wT25FbmRlZCAmJiBsb29wKSB7XG4gICAgICAgIF90aGlzLnNlZWtUbygwKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFsb29wKSB7XG4gICAgICAgIF90aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICBvbkVuZGVkKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlRXJyb3JcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNDtcblxuICAgICAgX3RoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgIChfdGhpcyRwcm9wczQgPSBfdGhpcy5wcm9wcykub25FcnJvci5hcHBseShfdGhpcyRwcm9wczQsIGFyZ3VtZW50cyk7XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlRHVyYXRpb25DaGVja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjbGVhclRpbWVvdXQoX3RoaXMuZHVyYXRpb25DaGVja1RpbWVvdXQpO1xuXG4gICAgICB2YXIgZHVyYXRpb24gPSBfdGhpcy5nZXREdXJhdGlvbigpO1xuXG4gICAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgICAgaWYgKCFfdGhpcy5vbkR1cmF0aW9uQ2FsbGVkKSB7XG4gICAgICAgICAgX3RoaXMucHJvcHMub25EdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICAgICAgICBfdGhpcy5vbkR1cmF0aW9uQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuZHVyYXRpb25DaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KF90aGlzLmhhbmRsZUR1cmF0aW9uQ2hlY2ssIDEwMCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlTG9hZGVkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNvbWV0aW1lcyB3ZSBrbm93IGxvYWRpbmcgaGFzIHN0b3BwZWQgYnV0IG9uUmVhZHkvb25QbGF5IGFyZSBuZXZlciBjYWxsZWRcbiAgICAgIC8vIHNvIHRoaXMgcHJvdmlkZXMgYSB3YXkgZm9yIHBsYXllcnMgdG8gYXZvaWQgZ2V0dGluZyBzdHVja1xuICAgICAgX3RoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUGxheWVyLCBbe1xuICAgIGtleTogXCJjb21wb25lbnREaWRNb3VudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudFdpbGxVbm1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucHJvZ3Jlc3NUaW1lb3V0KTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmR1cmF0aW9uQ2hlY2tUaW1lb3V0KTtcblxuICAgICAgaWYgKHRoaXMuaXNSZWFkeSAmJiB0aGlzLnByb3BzLnN0b3BPblVubW91bnQpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIuc3RvcCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnBsYXllci5kaXNhYmxlUElQKSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIuZGlzYWJsZVBJUCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubW91bnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzblx1MjAxOXQgYSBwbGF5ZXIgYXZhaWxhYmxlLCBkb25cdTIwMTl0IGRvIGFueXRoaW5nXG4gICAgICBpZiAoIXRoaXMucGxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gSW52b2tlIHBsYXllciBtZXRob2RzIGJhc2VkIG9uIGNoYW5nZWQgcHJvcHNcblxuXG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB1cmwgPSBfdGhpcyRwcm9wczUudXJsLFxuICAgICAgICAgIHBsYXlpbmcgPSBfdGhpcyRwcm9wczUucGxheWluZyxcbiAgICAgICAgICB2b2x1bWUgPSBfdGhpcyRwcm9wczUudm9sdW1lLFxuICAgICAgICAgIG11dGVkID0gX3RoaXMkcHJvcHM1Lm11dGVkLFxuICAgICAgICAgIHBsYXliYWNrUmF0ZSA9IF90aGlzJHByb3BzNS5wbGF5YmFja1JhdGUsXG4gICAgICAgICAgcGlwID0gX3RoaXMkcHJvcHM1LnBpcCxcbiAgICAgICAgICBsb29wID0gX3RoaXMkcHJvcHM1Lmxvb3AsXG4gICAgICAgICAgYWN0aXZlUGxheWVyID0gX3RoaXMkcHJvcHM1LmFjdGl2ZVBsYXllcixcbiAgICAgICAgICBkaXNhYmxlRGVmZXJyZWRMb2FkaW5nID0gX3RoaXMkcHJvcHM1LmRpc2FibGVEZWZlcnJlZExvYWRpbmc7XG5cbiAgICAgIGlmICghKDAsIF9yZWFjdEZhc3RDb21wYXJlW1wiZGVmYXVsdFwiXSkocHJldlByb3BzLnVybCwgdXJsKSkge1xuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmcgJiYgIWFjdGl2ZVBsYXllci5mb3JjZUxvYWQgJiYgIWRpc2FibGVEZWZlcnJlZExvYWRpbmcgJiYgISgwLCBfdXRpbHMuaXNNZWRpYVN0cmVhbSkodXJsKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIlJlYWN0UGxheWVyOiB0aGUgYXR0ZW1wdCB0byBsb2FkIFwiLmNvbmNhdCh1cmwsIFwiIGlzIGJlaW5nIGRlZmVycmVkIHVudGlsIHRoZSBwbGF5ZXIgaGFzIGxvYWRlZFwiKSk7XG4gICAgICAgICAgdGhpcy5sb2FkT25SZWFkeSA9IHVybDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhcnRPblBsYXkgPSB0cnVlO1xuICAgICAgICB0aGlzLm9uRHVyYXRpb25DYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wbGF5ZXIubG9hZCh1cmwsIHRoaXMuaXNSZWFkeSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcHJldlByb3BzLnBsYXlpbmcgJiYgcGxheWluZyAmJiAhdGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIucGxheSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldlByb3BzLnBsYXlpbmcgJiYgIXBsYXlpbmcgJiYgdGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIucGF1c2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwcmV2UHJvcHMucGlwICYmIHBpcCAmJiB0aGlzLnBsYXllci5lbmFibGVQSVApIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIuZW5hYmxlUElQKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2UHJvcHMucGlwICYmICFwaXAgJiYgdGhpcy5wbGF5ZXIuZGlzYWJsZVBJUCkge1xuICAgICAgICB0aGlzLnBsYXllci5kaXNhYmxlUElQKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2UHJvcHMudm9sdW1lICE9PSB2b2x1bWUgJiYgdm9sdW1lICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMucGxheWVyLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldlByb3BzLm11dGVkICE9PSBtdXRlZCkge1xuICAgICAgICBpZiAobXV0ZWQpIHtcbiAgICAgICAgICB0aGlzLnBsYXllci5tdXRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIudW5tdXRlKCk7XG5cbiAgICAgICAgICBpZiAodm9sdW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBTZXQgdm9sdW1lIG5leHQgdGljayB0byBmaXggYSBidWcgd2l0aCBEYWlseU1vdGlvblxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczIucGxheWVyLnNldFZvbHVtZSh2b2x1bWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2UHJvcHMucGxheWJhY2tSYXRlICE9PSBwbGF5YmFja1JhdGUgJiYgdGhpcy5wbGF5ZXIuc2V0UGxheWJhY2tSYXRlKSB7XG4gICAgICAgIHRoaXMucGxheWVyLnNldFBsYXliYWNrUmF0ZShwbGF5YmFja1JhdGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldlByb3BzLmxvb3AgIT09IGxvb3AgJiYgdGhpcy5wbGF5ZXIuc2V0TG9vcCkge1xuICAgICAgICB0aGlzLnBsYXllci5zZXRMb29wKGxvb3ApO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREdXJhdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREdXJhdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5pc1JlYWR5KSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLnBsYXllci5nZXREdXJhdGlvbigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRDdXJyZW50VGltZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDdXJyZW50VGltZSgpIHtcbiAgICAgIGlmICghdGhpcy5pc1JlYWR5KSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLnBsYXllci5nZXRDdXJyZW50VGltZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRTZWNvbmRzTG9hZGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFNlY29uZHNMb2FkZWQoKSB7XG4gICAgICBpZiAoIXRoaXMuaXNSZWFkeSkgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5wbGF5ZXIuZ2V0U2Vjb25kc0xvYWRlZCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWVrVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Vla1RvKGFtb3VudCwgdHlwZSkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIC8vIFdoZW4gc2Vla2luZyBiZWZvcmUgcGxheWVyIGlzIHJlYWR5LCBzdG9yZSB2YWx1ZSBhbmQgc2VlayBsYXRlclxuICAgICAgaWYgKCF0aGlzLmlzUmVhZHkpIHtcbiAgICAgICAgaWYgKGFtb3VudCAhPT0gMCkge1xuICAgICAgICAgIHRoaXMuc2Vla09uUGxheSA9IGFtb3VudDtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMy5zZWVrT25QbGF5ID0gbnVsbDtcbiAgICAgICAgICB9LCBTRUVLX09OX1BMQVlfRVhQSVJZKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGlzRnJhY3Rpb24gPSAhdHlwZSA/IGFtb3VudCA+IDAgJiYgYW1vdW50IDwgMSA6IHR5cGUgPT09ICdmcmFjdGlvbic7XG5cbiAgICAgIGlmIChpc0ZyYWN0aW9uKSB7XG4gICAgICAgIC8vIENvbnZlcnQgZnJhY3Rpb24gdG8gc2Vjb25kcyBiYXNlZCBvbiBkdXJhdGlvblxuICAgICAgICB2YXIgZHVyYXRpb24gPSB0aGlzLnBsYXllci5nZXREdXJhdGlvbigpO1xuXG4gICAgICAgIGlmICghZHVyYXRpb24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1JlYWN0UGxheWVyOiBjb3VsZCBub3Qgc2VlayB1c2luZyBmcmFjdGlvbiBcdTIwMTNcdTAwQTBkdXJhdGlvbiBub3QgeWV0IGF2YWlsYWJsZScpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGxheWVyLnNlZWtUbyhkdXJhdGlvbiAqIGFtb3VudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wbGF5ZXIuc2Vla1RvKGFtb3VudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgUGxheWVyID0gdGhpcy5wcm9wcy5hY3RpdmVQbGF5ZXI7XG5cbiAgICAgIGlmICghUGxheWVyKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChQbGF5ZXIsIF9leHRlbmRzKHt9LCB0aGlzLnByb3BzLCB7XG4gICAgICAgIG9uTW91bnQ6IHRoaXMuaGFuZGxlUGxheWVyTW91bnQsXG4gICAgICAgIG9uUmVhZHk6IHRoaXMuaGFuZGxlUmVhZHksXG4gICAgICAgIG9uUGxheTogdGhpcy5oYW5kbGVQbGF5LFxuICAgICAgICBvblBhdXNlOiB0aGlzLmhhbmRsZVBhdXNlLFxuICAgICAgICBvbkVuZGVkOiB0aGlzLmhhbmRsZUVuZGVkLFxuICAgICAgICBvbkxvYWRlZDogdGhpcy5oYW5kbGVMb2FkZWQsXG4gICAgICAgIG9uRXJyb3I6IHRoaXMuaGFuZGxlRXJyb3JcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUGxheWVyO1xufShfcmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBQbGF5ZXI7XG5cbl9kZWZpbmVQcm9wZXJ0eShQbGF5ZXIsIFwiZGlzcGxheU5hbWVcIiwgJ1BsYXllcicpO1xuXG5fZGVmaW5lUHJvcGVydHkoUGxheWVyLCBcInByb3BUeXBlc1wiLCBfcHJvcHMucHJvcFR5cGVzKTtcblxuX2RlZmluZVByb3BlcnR5KFBsYXllciwgXCJkZWZhdWx0UHJvcHNcIiwgX3Byb3BzLmRlZmF1bHRQcm9wcyk7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHZvaWQgMDtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBpZiAoZW51bWVyYWJsZU9ubHkpIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KTsga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpZiAoaSAlIDIpIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSwgdHJ1ZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KTsgfSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycykgeyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpOyB9IGVsc2UgeyBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgSUNPTl9TSVpFID0gJzY0cHgnO1xudmFyIGNhY2hlID0ge307XG5cbnZhciBQcmV2aWV3ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQcmV2aWV3LCBfQ29tcG9uZW50KTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFByZXZpZXcpO1xuXG4gIGZ1bmN0aW9uIFByZXZpZXcoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByZXZpZXcpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJtb3VudGVkXCIsIGZhbHNlKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzdGF0ZVwiLCB7XG4gICAgICBpbWFnZTogbnVsbFxuICAgIH0pO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhbmRsZUtleVByZXNzXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicgfHwgZS5rZXkgPT09ICcgJykge1xuICAgICAgICBfdGhpcy5wcm9wcy5vbkNsaWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUHJldmlldywgW3tcbiAgICBrZXk6IFwiY29tcG9uZW50RGlkTW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5mZXRjaEltYWdlKHRoaXMucHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjb21wb25lbnREaWRVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICB1cmwgPSBfdGhpcyRwcm9wcy51cmwsXG4gICAgICAgICAgbGlnaHQgPSBfdGhpcyRwcm9wcy5saWdodDtcblxuICAgICAgaWYgKHByZXZQcm9wcy51cmwgIT09IHVybCB8fCBwcmV2UHJvcHMubGlnaHQgIT09IGxpZ2h0KSB7XG4gICAgICAgIHRoaXMuZmV0Y2hJbWFnZSh0aGlzLnByb3BzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmV0Y2hJbWFnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmZXRjaEltYWdlKF9yZWYpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgdXJsID0gX3JlZi51cmwsXG4gICAgICAgICAgbGlnaHQgPSBfcmVmLmxpZ2h0LFxuICAgICAgICAgIG9FbWJlZFVybCA9IF9yZWYub0VtYmVkVXJsO1xuXG4gICAgICBpZiAodHlwZW9mIGxpZ2h0ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBpbWFnZTogbGlnaHRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNhY2hlW3VybF0pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaW1hZ2U6IGNhY2hlW3VybF1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGltYWdlOiBudWxsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB3aW5kb3cuZmV0Y2gob0VtYmVkVXJsLnJlcGxhY2UoJ3t1cmx9JywgdXJsKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEudGh1bWJuYWlsX3VybCAmJiBfdGhpczIubW91bnRlZCkge1xuICAgICAgICAgIHZhciBpbWFnZSA9IGRhdGEudGh1bWJuYWlsX3VybC5yZXBsYWNlKCdoZWlnaHQ9MTAwJywgJ2hlaWdodD00ODAnKTtcblxuICAgICAgICAgIF90aGlzMi5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpbWFnZTogaW1hZ2VcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNhY2hlW3VybF0gPSBpbWFnZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMyLm9uQ2xpY2ssXG4gICAgICAgICAgcGxheUljb24gPSBfdGhpcyRwcm9wczIucGxheUljb24sXG4gICAgICAgICAgcHJldmlld1RhYkluZGV4ID0gX3RoaXMkcHJvcHMyLnByZXZpZXdUYWJJbmRleDtcbiAgICAgIHZhciBpbWFnZSA9IHRoaXMuc3RhdGUuaW1hZ2U7XG4gICAgICB2YXIgZmxleENlbnRlciA9IHtcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInXG4gICAgICB9O1xuICAgICAgdmFyIHN0eWxlcyA9IHtcbiAgICAgICAgcHJldmlldzogX29iamVjdFNwcmVhZCh7XG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6IGltYWdlID8gXCJ1cmwoXCIuY29uY2F0KGltYWdlLCBcIilcIikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgYmFja2dyb3VuZFNpemU6ICdjb3ZlcicsXG4gICAgICAgICAgYmFja2dyb3VuZFBvc2l0aW9uOiAnY2VudGVyJyxcbiAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9LCBmbGV4Q2VudGVyKSxcbiAgICAgICAgc2hhZG93OiBfb2JqZWN0U3ByZWFkKHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAncmFkaWFsLWdyYWRpZW50KHJnYigwLCAwLCAwLCAwLjMpLCByZ2JhKDAsIDAsIDAsIDApIDYwJSknLFxuICAgICAgICAgIGJvcmRlclJhZGl1czogSUNPTl9TSVpFLFxuICAgICAgICAgIHdpZHRoOiBJQ09OX1NJWkUsXG4gICAgICAgICAgaGVpZ2h0OiBJQ09OX1NJWkVcbiAgICAgICAgfSwgZmxleENlbnRlciksXG4gICAgICAgIHBsYXlJY29uOiB7XG4gICAgICAgICAgYm9yZGVyU3R5bGU6ICdzb2xpZCcsXG4gICAgICAgICAgYm9yZGVyV2lkdGg6ICcxNnB4IDAgMTZweCAyNnB4JyxcbiAgICAgICAgICBib3JkZXJDb2xvcjogJ3RyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHdoaXRlJyxcbiAgICAgICAgICBtYXJnaW5MZWZ0OiAnN3B4J1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgZGVmYXVsdFBsYXlJY29uID0gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiBzdHlsZXMuc2hhZG93LFxuICAgICAgICBjbGFzc05hbWU6IFwicmVhY3QtcGxheWVyX19zaGFkb3dcIlxuICAgICAgfSwgLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIHN0eWxlOiBzdHlsZXMucGxheUljb24sXG4gICAgICAgIGNsYXNzTmFtZTogXCJyZWFjdC1wbGF5ZXJfX3BsYXktaWNvblwiXG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgc3R5bGU6IHN0eWxlcy5wcmV2aWV3LFxuICAgICAgICBjbGFzc05hbWU6IFwicmVhY3QtcGxheWVyX19wcmV2aWV3XCIsXG4gICAgICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgICAgIHRhYkluZGV4OiBwcmV2aWV3VGFiSW5kZXgsXG4gICAgICAgIG9uS2V5UHJlc3M6IHRoaXMuaGFuZGxlS2V5UHJlc3NcbiAgICAgIH0sIHBsYXlJY29uIHx8IGRlZmF1bHRQbGF5SWNvbik7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFByZXZpZXc7XG59KF9yZWFjdC5Db21wb25lbnQpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFByZXZpZXc7IiwgIlwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNyZWF0ZVJlYWN0UGxheWVyID0gdm9pZCAwO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9kZWVwbWVyZ2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJkZWVwbWVyZ2VcIikpO1xuXG52YXIgX21lbW9pemVPbmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJtZW1vaXplLW9uZVwiKSk7XG5cbnZhciBfcmVhY3RGYXN0Q29tcGFyZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0LWZhc3QtY29tcGFyZVwiKSk7XG5cbnZhciBfcHJvcHMgPSByZXF1aXJlKFwiLi9wcm9wc1wiKTtcblxudmFyIF91dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG52YXIgX1BsYXllcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL1BsYXllclwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7IGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDsgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTsgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyByZXR1cm4gY2FjaGU7IH07IHJldHVybiBjYWNoZTsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBcImRlZmF1bHRcIjogb2JqIH07IH0gdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7IGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkgeyByZXR1cm4gY2FjaGUuZ2V0KG9iaik7IH0gdmFyIG5ld09iaiA9IHt9OyB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHsgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7IGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTsgfSBlbHNlIHsgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IH0gbmV3T2JqW1wiZGVmYXVsdFwiXSA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgaWYgKGVudW1lcmFibGVPbmx5KSBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSk7IGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTsgaWYgKGkgJSAyKSB7IG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSk7IH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHsgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKTsgfSBlbHNlIHsgb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdXBlcihEZXJpdmVkKSB7IHZhciBoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpOyByZXR1cm4gZnVuY3Rpb24gX2NyZWF0ZVN1cGVySW50ZXJuYWwoKSB7IHZhciBTdXBlciA9IF9nZXRQcm90b3R5cGVPZihEZXJpdmVkKSwgcmVzdWx0OyBpZiAoaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCkgeyB2YXIgTmV3VGFyZ2V0ID0gX2dldFByb3RvdHlwZU9mKHRoaXMpLmNvbnN0cnVjdG9yOyByZXN1bHQgPSBSZWZsZWN0LmNvbnN0cnVjdChTdXBlciwgYXJndW1lbnRzLCBOZXdUYXJnZXQpOyB9IGVsc2UgeyByZXN1bHQgPSBTdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9IHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCByZXN1bHQpOyB9OyB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKGNhbGwgJiYgKF90eXBlb2YoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHsgcmV0dXJuIGNhbGw7IH0gcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7IH1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7IGlmIChzZWxmID09PSB2b2lkIDApIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7IGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTsgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTsgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTsgdHJ5IHsgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH1cblxuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHsgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTsgfTsgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTsgfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG52YXIgUHJldmlldyA9IC8qI19fUFVSRV9fKi8oMCwgX3JlYWN0LmxhenkpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGltcG9ydChcbiAgLyogd2VicGFja0NodW5rTmFtZTogJ3JlYWN0UGxheWVyUHJldmlldycgKi9cbiAgJy4vUHJldmlldycpO1xufSk7XG52YXIgSVNfQlJPV1NFUiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudDtcbnZhciBJU19HTE9CQUwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwud2luZG93ICYmIGdsb2JhbC53aW5kb3cuZG9jdW1lbnQ7XG52YXIgU1VQUE9SVEVEX1BST1BTID0gT2JqZWN0LmtleXMoX3Byb3BzLnByb3BUeXBlcyk7IC8vIFJldHVybiBudWxsIHdoZW4gcmVuZGVyaW5nIG9uIHRoZSBzZXJ2ZXJcbi8vIGFzIFN1c3BlbnNlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0XG5cbnZhciBVbml2ZXJzYWxTdXNwZW5zZSA9IElTX0JST1dTRVIgfHwgSVNfR0xPQkFMID8gX3JlYWN0LlN1c3BlbnNlIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbnVsbDtcbn07XG52YXIgY3VzdG9tUGxheWVycyA9IFtdO1xuXG52YXIgY3JlYXRlUmVhY3RQbGF5ZXIgPSBmdW5jdGlvbiBjcmVhdGVSZWFjdFBsYXllcihwbGF5ZXJzLCBmYWxsYmFjaykge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICByZXR1cm4gX3RlbXAgPSBfY2xhc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHMoUmVhY3RQbGF5ZXIsIF9Db21wb25lbnQpO1xuXG4gICAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihSZWFjdFBsYXllcik7XG5cbiAgICBmdW5jdGlvbiBSZWFjdFBsYXllcigpIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWN0UGxheWVyKTtcblxuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIF90aGlzID0gX3N1cGVyLmNhbGwuYXBwbHkoX3N1cGVyLCBbdGhpc10uY29uY2F0KGFyZ3MpKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInN0YXRlXCIsIHtcbiAgICAgICAgc2hvd1ByZXZpZXc6ICEhX3RoaXMucHJvcHMubGlnaHRcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwicmVmZXJlbmNlc1wiLCB7XG4gICAgICAgIHdyYXBwZXI6IGZ1bmN0aW9uIHdyYXBwZXIoX3dyYXBwZXIpIHtcbiAgICAgICAgICBfdGhpcy53cmFwcGVyID0gX3dyYXBwZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHBsYXllcjogZnVuY3Rpb24gcGxheWVyKF9wbGF5ZXIpIHtcbiAgICAgICAgICBfdGhpcy5wbGF5ZXIgPSBfcGxheWVyO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImhhbmRsZUNsaWNrUHJldmlld1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2hvd1ByZXZpZXc6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzLnByb3BzLm9uQ2xpY2tQcmV2aWV3KGUpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzaG93UHJldmlld1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzaG93UHJldmlldzogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0RHVyYXRpb25cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIV90aGlzLnBsYXllcikgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBfdGhpcy5wbGF5ZXIuZ2V0RHVyYXRpb24oKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0Q3VycmVudFRpbWVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIV90aGlzLnBsYXllcikgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBfdGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0U2Vjb25kc0xvYWRlZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMucGxheWVyKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIF90aGlzLnBsYXllci5nZXRTZWNvbmRzTG9hZGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldEludGVybmFsUGxheWVyXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ3BsYXllcic7XG4gICAgICAgIGlmICghX3RoaXMucGxheWVyKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIF90aGlzLnBsYXllci5nZXRJbnRlcm5hbFBsYXllcihrZXkpO1xuICAgICAgfSk7XG5cbiAgICAgIF9kZWZpbmVQcm9wZXJ0eShfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgXCJzZWVrVG9cIiwgZnVuY3Rpb24gKGZyYWN0aW9uLCB0eXBlKSB7XG4gICAgICAgIGlmICghX3RoaXMucGxheWVyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBfdGhpcy5wbGF5ZXIuc2Vla1RvKGZyYWN0aW9uLCB0eXBlKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiaGFuZGxlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy5wcm9wcy5vblJlYWR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICAgIH0pO1xuXG4gICAgICBfZGVmaW5lUHJvcGVydHkoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksIFwiZ2V0QWN0aXZlUGxheWVyXCIsICgwLCBfbWVtb2l6ZU9uZVtcImRlZmF1bHRcIl0pKGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYXJyID0gW10uY29uY2F0KGN1c3RvbVBsYXllcnMsIF90b0NvbnN1bWFibGVBcnJheShwbGF5ZXJzKSk7IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgcGxheWVyID0gX2FycltfaV07XG5cbiAgICAgICAgICBpZiAocGxheWVyLmNhblBsYXkodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm4gZmFsbGJhY2s7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldENvbmZpZ1wiLCAoMCwgX21lbW9pemVPbmVbXCJkZWZhdWx0XCJdKShmdW5jdGlvbiAodXJsLCBrZXkpIHtcbiAgICAgICAgdmFyIGNvbmZpZyA9IF90aGlzLnByb3BzLmNvbmZpZztcbiAgICAgICAgcmV0dXJuIF9kZWVwbWVyZ2VbXCJkZWZhdWx0XCJdLmFsbChbX3Byb3BzLmRlZmF1bHRQcm9wcy5jb25maWcsIF9wcm9wcy5kZWZhdWx0UHJvcHMuY29uZmlnW2tleV0gfHwge30sIGNvbmZpZywgY29uZmlnW2tleV0gfHwge31dKTtcbiAgICAgIH0pKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcImdldEF0dHJpYnV0ZXNcIiwgKDAsIF9tZW1vaXplT25lW1wiZGVmYXVsdFwiXSkoZnVuY3Rpb24gKHVybCkge1xuICAgICAgICByZXR1cm4gKDAsIF91dGlscy5vbWl0KShfdGhpcy5wcm9wcywgU1VQUE9SVEVEX1BST1BTKTtcbiAgICAgIH0pKTtcblxuICAgICAgX2RlZmluZVByb3BlcnR5KF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBcInJlbmRlckFjdGl2ZVBsYXllclwiLCBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIGlmICghdXJsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICB2YXIgcGxheWVyID0gX3RoaXMuZ2V0QWN0aXZlUGxheWVyKHVybCk7XG5cbiAgICAgICAgaWYgKCFwbGF5ZXIpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHZhciBjb25maWcgPSBfdGhpcy5nZXRDb25maWcodXJsLCBwbGF5ZXIua2V5KTtcblxuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdFtcImRlZmF1bHRcIl0uY3JlYXRlRWxlbWVudChfUGxheWVyM1tcImRlZmF1bHRcIl0sIF9leHRlbmRzKHt9LCBfdGhpcy5wcm9wcywge1xuICAgICAgICAgIGtleTogcGxheWVyLmtleSxcbiAgICAgICAgICByZWY6IF90aGlzLnJlZmVyZW5jZXMucGxheWVyLFxuICAgICAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgICAgIGFjdGl2ZVBsYXllcjogcGxheWVyLmxhenlQbGF5ZXIgfHwgcGxheWVyLFxuICAgICAgICAgIG9uUmVhZHk6IF90aGlzLmhhbmRsZVJlYWR5XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKFJlYWN0UGxheWVyLCBbe1xuICAgICAga2V5OiBcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgICAgICByZXR1cm4gISgwLCBfcmVhY3RGYXN0Q29tcGFyZVtcImRlZmF1bHRcIl0pKHRoaXMucHJvcHMsIG5leHRQcm9wcykgfHwgISgwLCBfcmVhY3RGYXN0Q29tcGFyZVtcImRlZmF1bHRcIl0pKHRoaXMuc3RhdGUsIG5leHRTdGF0ZSk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgICAgdmFyIGxpZ2h0ID0gdGhpcy5wcm9wcy5saWdodDtcblxuICAgICAgICBpZiAoIXByZXZQcm9wcy5saWdodCAmJiBsaWdodCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2hvd1ByZXZpZXc6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2UHJvcHMubGlnaHQgJiYgIWxpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzaG93UHJldmlldzogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJyZW5kZXJQcmV2aWV3XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyUHJldmlldyh1cmwpIHtcbiAgICAgICAgaWYgKCF1cmwpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgbGlnaHQgPSBfdGhpcyRwcm9wcy5saWdodCxcbiAgICAgICAgICAgIHBsYXlJY29uID0gX3RoaXMkcHJvcHMucGxheUljb24sXG4gICAgICAgICAgICBwcmV2aWV3VGFiSW5kZXggPSBfdGhpcyRwcm9wcy5wcmV2aWV3VGFiSW5kZXgsXG4gICAgICAgICAgICBvRW1iZWRVcmwgPSBfdGhpcyRwcm9wcy5vRW1iZWRVcmw7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFByZXZpZXcsIHtcbiAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICBsaWdodDogbGlnaHQsXG4gICAgICAgICAgcGxheUljb246IHBsYXlJY29uLFxuICAgICAgICAgIHByZXZpZXdUYWJJbmRleDogcHJldmlld1RhYkluZGV4LFxuICAgICAgICAgIG9FbWJlZFVybDogb0VtYmVkVXJsLFxuICAgICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tQcmV2aWV3XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJyZW5kZXJcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgdXJsID0gX3RoaXMkcHJvcHMyLnVybCxcbiAgICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMyLnN0eWxlLFxuICAgICAgICAgICAgd2lkdGggPSBfdGhpcyRwcm9wczIud2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQgPSBfdGhpcyRwcm9wczIuaGVpZ2h0LFxuICAgICAgICAgICAgZmFsbGJhY2sgPSBfdGhpcyRwcm9wczIuZmFsbGJhY2ssXG4gICAgICAgICAgICBXcmFwcGVyID0gX3RoaXMkcHJvcHMyLndyYXBwZXI7XG4gICAgICAgIHZhciBzaG93UHJldmlldyA9IHRoaXMuc3RhdGUuc2hvd1ByZXZpZXc7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzKHVybCk7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0W1wiZGVmYXVsdFwiXS5jcmVhdGVFbGVtZW50KFdyYXBwZXIsIF9leHRlbmRzKHtcbiAgICAgICAgICByZWY6IHRoaXMucmVmZXJlbmNlcy53cmFwcGVyLFxuICAgICAgICAgIHN0eWxlOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN0eWxlKSwge30sIHtcbiAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgICAgfSlcbiAgICAgICAgfSwgYXR0cmlidXRlcyksIC8qI19fUFVSRV9fKi9fcmVhY3RbXCJkZWZhdWx0XCJdLmNyZWF0ZUVsZW1lbnQoVW5pdmVyc2FsU3VzcGVuc2UsIHtcbiAgICAgICAgICBmYWxsYmFjazogZmFsbGJhY2tcbiAgICAgICAgfSwgc2hvd1ByZXZpZXcgPyB0aGlzLnJlbmRlclByZXZpZXcodXJsKSA6IHRoaXMucmVuZGVyQWN0aXZlUGxheWVyKHVybCkpKTtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gUmVhY3RQbGF5ZXI7XG4gIH0oX3JlYWN0LkNvbXBvbmVudCksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiZGlzcGxheU5hbWVcIiwgJ1JlYWN0UGxheWVyJyksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwicHJvcFR5cGVzXCIsIF9wcm9wcy5wcm9wVHlwZXMpLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImRlZmF1bHRQcm9wc1wiLCBfcHJvcHMuZGVmYXVsdFByb3BzKSwgX2RlZmluZVByb3BlcnR5KF9jbGFzcywgXCJhZGRDdXN0b21QbGF5ZXJcIiwgZnVuY3Rpb24gKHBsYXllcikge1xuICAgIGN1c3RvbVBsYXllcnMucHVzaChwbGF5ZXIpO1xuICB9KSwgX2RlZmluZVByb3BlcnR5KF9jbGFzcywgXCJyZW1vdmVDdXN0b21QbGF5ZXJzXCIsIGZ1bmN0aW9uICgpIHtcbiAgICBjdXN0b21QbGF5ZXJzLmxlbmd0aCA9IDA7XG4gIH0pLCBfZGVmaW5lUHJvcGVydHkoX2NsYXNzLCBcImNhblBsYXlcIiwgZnVuY3Rpb24gKHVybCkge1xuICAgIGZvciAodmFyIF9pMiA9IDAsIF9hcnIyID0gW10uY29uY2F0KGN1c3RvbVBsYXllcnMsIF90b0NvbnN1bWFibGVBcnJheShwbGF5ZXJzKSk7IF9pMiA8IF9hcnIyLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIHZhciBfUGxheWVyID0gX2FycjJbX2kyXTtcblxuICAgICAgaWYgKF9QbGF5ZXIuY2FuUGxheSh1cmwpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSksIF9kZWZpbmVQcm9wZXJ0eShfY2xhc3MsIFwiY2FuRW5hYmxlUElQXCIsIGZ1bmN0aW9uICh1cmwpIHtcbiAgICBmb3IgKHZhciBfaTMgPSAwLCBfYXJyMyA9IFtdLmNvbmNhdChjdXN0b21QbGF5ZXJzLCBfdG9Db25zdW1hYmxlQXJyYXkocGxheWVycykpOyBfaTMgPCBfYXJyMy5sZW5ndGg7IF9pMysrKSB7XG4gICAgICB2YXIgX1BsYXllcjIgPSBfYXJyM1tfaTNdO1xuXG4gICAgICBpZiAoX1BsYXllcjIuY2FuRW5hYmxlUElQICYmIF9QbGF5ZXIyLmNhbkVuYWJsZVBJUCh1cmwpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSksIF90ZW1wO1xufTtcblxuZXhwb3J0cy5jcmVhdGVSZWFjdFBsYXllciA9IGNyZWF0ZVJlYWN0UGxheWVyOyIsICJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gdm9pZCAwO1xuXG52YXIgX3BsYXllcnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BsYXllcnNcIikpO1xuXG52YXIgX1JlYWN0UGxheWVyID0gcmVxdWlyZShcIi4vUmVhY3RQbGF5ZXJcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG4vLyBGYWxsIGJhY2sgdG8gRmlsZVBsYXllciBpZiBub3RoaW5nIGVsc2UgY2FuIHBsYXkgdGhlIFVSTFxudmFyIGZhbGxiYWNrID0gX3BsYXllcnNbXCJkZWZhdWx0XCJdW19wbGF5ZXJzW1wiZGVmYXVsdFwiXS5sZW5ndGggLSAxXTtcblxudmFyIF9kZWZhdWx0ID0gKDAsIF9SZWFjdFBsYXllci5jcmVhdGVSZWFjdFBsYXllcikoX3BsYXllcnNbXCJkZWZhdWx0XCJdLCBmYWxsYmFjayk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gX2RlZmF1bHQ7IiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4ndXNlIHN0cmljdCc7ZnVuY3Rpb24gZihhLGIpe3ZhciBjPWEubGVuZ3RoO2EucHVzaChiKTthOmZvcig7MDxjOyl7dmFyIGQ9Yy0xPj4+MSxlPWFbZF07aWYoMDxnKGUsYikpYVtkXT1iLGFbY109ZSxjPWQ7ZWxzZSBicmVhayBhfX1mdW5jdGlvbiBoKGEpe3JldHVybiAwPT09YS5sZW5ndGg/bnVsbDphWzBdfWZ1bmN0aW9uIGsoYSl7aWYoMD09PWEubGVuZ3RoKXJldHVybiBudWxsO3ZhciBiPWFbMF0sYz1hLnBvcCgpO2lmKGMhPT1iKXthWzBdPWM7YTpmb3IodmFyIGQ9MCxlPWEubGVuZ3RoLHc9ZT4+PjE7ZDx3Oyl7dmFyIG09MiooZCsxKS0xLEM9YVttXSxuPW0rMSx4PWFbbl07aWYoMD5nKEMsYykpbjxlJiYwPmcoeCxDKT8oYVtkXT14LGFbbl09YyxkPW4pOihhW2RdPUMsYVttXT1jLGQ9bSk7ZWxzZSBpZihuPGUmJjA+Zyh4LGMpKWFbZF09eCxhW25dPWMsZD1uO2Vsc2UgYnJlYWsgYX19cmV0dXJuIGJ9XG5mdW5jdGlvbiBnKGEsYil7dmFyIGM9YS5zb3J0SW5kZXgtYi5zb3J0SW5kZXg7cmV0dXJuIDAhPT1jP2M6YS5pZC1iLmlkfWlmKFwib2JqZWN0XCI9PT10eXBlb2YgcGVyZm9ybWFuY2UmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBwZXJmb3JtYW5jZS5ub3cpe3ZhciBsPXBlcmZvcm1hbmNlO2V4cG9ydHMudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIGwubm93KCl9fWVsc2V7dmFyIHA9RGF0ZSxxPXAubm93KCk7ZXhwb3J0cy51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gcC5ub3coKS1xfX12YXIgcj1bXSx0PVtdLHU9MSx2PW51bGwseT0zLHo9ITEsQT0hMSxCPSExLEQ9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDpudWxsLEU9XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6bnVsbCxGPVwidW5kZWZpbmVkXCIhPT10eXBlb2Ygc2V0SW1tZWRpYXRlP3NldEltbWVkaWF0ZTpudWxsO1xuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBuYXZpZ2F0b3ImJnZvaWQgMCE9PW5hdmlnYXRvci5zY2hlZHVsaW5nJiZ2b2lkIDAhPT1uYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZyk7ZnVuY3Rpb24gRyhhKXtmb3IodmFyIGI9aCh0KTtudWxsIT09Yjspe2lmKG51bGw9PT1iLmNhbGxiYWNrKWsodCk7ZWxzZSBpZihiLnN0YXJ0VGltZTw9YSlrKHQpLGIuc29ydEluZGV4PWIuZXhwaXJhdGlvblRpbWUsZihyLGIpO2Vsc2UgYnJlYWs7Yj1oKHQpfX1mdW5jdGlvbiBIKGEpe0I9ITE7RyhhKTtpZighQSlpZihudWxsIT09aChyKSlBPSEwLEkoSik7ZWxzZXt2YXIgYj1oKHQpO251bGwhPT1iJiZLKEgsYi5zdGFydFRpbWUtYSl9fVxuZnVuY3Rpb24gSihhLGIpe0E9ITE7QiYmKEI9ITEsRShMKSxMPS0xKTt6PSEwO3ZhciBjPXk7dHJ5e0coYik7Zm9yKHY9aChyKTtudWxsIT09diYmKCEodi5leHBpcmF0aW9uVGltZT5iKXx8YSYmIU0oKSk7KXt2YXIgZD12LmNhbGxiYWNrO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2LmNhbGxiYWNrPW51bGw7eT12LnByaW9yaXR5TGV2ZWw7dmFyIGU9ZCh2LmV4cGlyYXRpb25UaW1lPD1iKTtiPWV4cG9ydHMudW5zdGFibGVfbm93KCk7XCJmdW5jdGlvblwiPT09dHlwZW9mIGU/di5jYWxsYmFjaz1lOnY9PT1oKHIpJiZrKHIpO0coYil9ZWxzZSBrKHIpO3Y9aChyKX1pZihudWxsIT09dil2YXIgdz0hMDtlbHNle3ZhciBtPWgodCk7bnVsbCE9PW0mJksoSCxtLnN0YXJ0VGltZS1iKTt3PSExfXJldHVybiB3fWZpbmFsbHl7dj1udWxsLHk9Yyx6PSExfX12YXIgTj0hMSxPPW51bGwsTD0tMSxQPTUsUT0tMTtcbmZ1bmN0aW9uIE0oKXtyZXR1cm4gZXhwb3J0cy51bnN0YWJsZV9ub3coKS1RPFA/ITE6ITB9ZnVuY3Rpb24gUigpe2lmKG51bGwhPT1PKXt2YXIgYT1leHBvcnRzLnVuc3RhYmxlX25vdygpO1E9YTt2YXIgYj0hMDt0cnl7Yj1PKCEwLGEpfWZpbmFsbHl7Yj9TKCk6KE49ITEsTz1udWxsKX19ZWxzZSBOPSExfXZhciBTO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBGKVM9ZnVuY3Rpb24oKXtGKFIpfTtlbHNlIGlmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgTWVzc2FnZUNoYW5uZWwpe3ZhciBUPW5ldyBNZXNzYWdlQ2hhbm5lbCxVPVQucG9ydDI7VC5wb3J0MS5vbm1lc3NhZ2U9UjtTPWZ1bmN0aW9uKCl7VS5wb3N0TWVzc2FnZShudWxsKX19ZWxzZSBTPWZ1bmN0aW9uKCl7RChSLDApfTtmdW5jdGlvbiBJKGEpe089YTtOfHwoTj0hMCxTKCkpfWZ1bmN0aW9uIEsoYSxiKXtMPUQoZnVuY3Rpb24oKXthKGV4cG9ydHMudW5zdGFibGVfbm93KCkpfSxiKX1cbmV4cG9ydHMudW5zdGFibGVfSWRsZVByaW9yaXR5PTU7ZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eT0xO2V4cG9ydHMudW5zdGFibGVfTG93UHJpb3JpdHk9NDtleHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5PTM7ZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmc9bnVsbDtleHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5PTI7ZXhwb3J0cy51bnN0YWJsZV9jYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihhKXthLmNhbGxiYWNrPW51bGx9O2V4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb249ZnVuY3Rpb24oKXtBfHx6fHwoQT0hMCxJKEopKX07XG5leHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGEpezA+YXx8MTI1PGE/Y29uc29sZS5lcnJvcihcImZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCBmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZFwiKTpQPTA8YT9NYXRoLmZsb29yKDFFMy9hKTo1fTtleHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIHl9O2V4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gaChyKX07ZXhwb3J0cy51bnN0YWJsZV9uZXh0PWZ1bmN0aW9uKGEpe3N3aXRjaCh5KXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgYj0zO2JyZWFrO2RlZmF1bHQ6Yj15fXZhciBjPXk7eT1iO3RyeXtyZXR1cm4gYSgpfWZpbmFsbHl7eT1jfX07ZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbj1mdW5jdGlvbigpe307XG5leHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludD1mdW5jdGlvbigpe307ZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpicmVhaztkZWZhdWx0OmE9M312YXIgYz15O3k9YTt0cnl7cmV0dXJuIGIoKX1maW5hbGx5e3k9Y319O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1leHBvcnRzLnVuc3RhYmxlX25vdygpO1wib2JqZWN0XCI9PT10eXBlb2YgYyYmbnVsbCE9PWM/KGM9Yy5kZWxheSxjPVwibnVtYmVyXCI9PT10eXBlb2YgYyYmMDxjP2QrYzpkKTpjPWQ7c3dpdGNoKGEpe2Nhc2UgMTp2YXIgZT0tMTticmVhaztjYXNlIDI6ZT0yNTA7YnJlYWs7Y2FzZSA1OmU9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6ZT0xRTQ7YnJlYWs7ZGVmYXVsdDplPTVFM31lPWMrZTthPXtpZDp1KyssY2FsbGJhY2s6Yixwcmlvcml0eUxldmVsOmEsc3RhcnRUaW1lOmMsZXhwaXJhdGlvblRpbWU6ZSxzb3J0SW5kZXg6LTF9O2M+ZD8oYS5zb3J0SW5kZXg9YyxmKHQsYSksbnVsbD09PWgocikmJmE9PT1oKHQpJiYoQj8oRShMKSxMPS0xKTpCPSEwLEsoSCxjLWQpKSk6KGEuc29ydEluZGV4PWUsZihyLGEpLEF8fHp8fChBPSEwLEkoSikpKTtyZXR1cm4gYX07XG5leHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkPU07ZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7dmFyIGI9eTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz15O3k9Yjt0cnl7cmV0dXJuIGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7eT1jfX19O1xuIiwgIi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHNjaGVkdWxlci5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgPT09XG4gICAgJ2Z1bmN0aW9uJ1xuKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQobmV3IEVycm9yKCkpO1xufVxuICAgICAgICAgIHZhciBlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgPSBmYWxzZTtcbnZhciBlbmFibGVQcm9maWxpbmcgPSBmYWxzZTtcbnZhciBmcmFtZVlpZWxkTXMgPSA1O1xuXG5mdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgdmFyIGluZGV4ID0gaGVhcC5sZW5ndGg7XG4gIGhlYXAucHVzaChub2RlKTtcbiAgc2lmdFVwKGhlYXAsIG5vZGUsIGluZGV4KTtcbn1cbmZ1bmN0aW9uIHBlZWsoaGVhcCkge1xuICByZXR1cm4gaGVhcC5sZW5ndGggPT09IDAgPyBudWxsIDogaGVhcFswXTtcbn1cbmZ1bmN0aW9uIHBvcChoZWFwKSB7XG4gIGlmIChoZWFwLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGZpcnN0ID0gaGVhcFswXTtcbiAgdmFyIGxhc3QgPSBoZWFwLnBvcCgpO1xuXG4gIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgIGhlYXBbMF0gPSBsYXN0O1xuICAgIHNpZnREb3duKGhlYXAsIGxhc3QsIDApO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG5mdW5jdGlvbiBzaWZ0VXAoaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuXG4gIHdoaWxlIChpbmRleCA+IDApIHtcbiAgICB2YXIgcGFyZW50SW5kZXggPSBpbmRleCAtIDEgPj4+IDE7XG4gICAgdmFyIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuXG4gICAgaWYgKGNvbXBhcmUocGFyZW50LCBub2RlKSA+IDApIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgbGFyZ2VyLiBTd2FwIHBvc2l0aW9ucy5cbiAgICAgIGhlYXBbcGFyZW50SW5kZXhdID0gbm9kZTtcbiAgICAgIGhlYXBbaW5kZXhdID0gcGFyZW50O1xuICAgICAgaW5kZXggPSBwYXJlbnRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzaWZ0RG93bihoZWFwLCBub2RlLCBpKSB7XG4gIHZhciBpbmRleCA9IGk7XG4gIHZhciBsZW5ndGggPSBoZWFwLmxlbmd0aDtcbiAgdmFyIGhhbGZMZW5ndGggPSBsZW5ndGggPj4+IDE7XG5cbiAgd2hpbGUgKGluZGV4IDwgaGFsZkxlbmd0aCkge1xuICAgIHZhciBsZWZ0SW5kZXggPSAoaW5kZXggKyAxKSAqIDIgLSAxO1xuICAgIHZhciBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdO1xuICAgIHZhciByaWdodEluZGV4ID0gbGVmdEluZGV4ICsgMTtcbiAgICB2YXIgcmlnaHQgPSBoZWFwW3JpZ2h0SW5kZXhdOyAvLyBJZiB0aGUgbGVmdCBvciByaWdodCBub2RlIGlzIHNtYWxsZXIsIHN3YXAgd2l0aCB0aGUgc21hbGxlciBvZiB0aG9zZS5cblxuICAgIGlmIChjb21wYXJlKGxlZnQsIG5vZGUpIDwgMCkge1xuICAgICAgaWYgKHJpZ2h0SW5kZXggPCBsZW5ndGggJiYgY29tcGFyZShyaWdodCwgbGVmdCkgPCAwKSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFwW2luZGV4XSA9IGxlZnQ7XG4gICAgICAgIGhlYXBbbGVmdEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gbGVmdEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmlnaHRJbmRleCA8IGxlbmd0aCAmJiBjb21wYXJlKHJpZ2h0LCBub2RlKSA8IDApIHtcbiAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBjaGlsZCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgLy8gQ29tcGFyZSBzb3J0IGluZGV4IGZpcnN0LCB0aGVuIHRhc2sgaWQuXG4gIHZhciBkaWZmID0gYS5zb3J0SW5kZXggLSBiLnNvcnRJbmRleDtcbiAgcmV0dXJuIGRpZmYgIT09IDAgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG59XG5cbi8vIFRPRE86IFVzZSBzeW1ib2xzP1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gMTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSAzO1xudmFyIExvd1ByaW9yaXR5ID0gNDtcbnZhciBJZGxlUHJpb3JpdHkgPSA1O1xuXG5mdW5jdGlvbiBtYXJrVGFza0Vycm9yZWQodGFzaywgbXMpIHtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG5cbnZhciBoYXNQZXJmb3JtYW5jZU5vdyA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJztcblxuaWYgKGhhc1BlcmZvcm1hbmNlTm93KSB7XG4gIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgbG9jYWxEYXRlID0gRGF0ZTtcbiAgdmFyIGluaXRpYWxUaW1lID0gbG9jYWxEYXRlLm5vdygpO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbERhdGUubm93KCkgLSBpbml0aWFsVGltZTtcbiAgfTtcbn0gLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxuXG5cbnZhciBtYXhTaWduZWQzMUJpdEludCA9IDEwNzM3NDE4MjM7IC8vIFRpbWVzIG91dCBpbW1lZGlhdGVseVxuXG52YXIgSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQgPSAtMTsgLy8gRXZlbnR1YWxseSB0aW1lcyBvdXRcblxudmFyIFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVCA9IDI1MDtcbnZhciBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVCA9IDUwMDA7XG52YXIgTE9XX1BSSU9SSVRZX1RJTUVPVVQgPSAxMDAwMDsgLy8gTmV2ZXIgdGltZXMgb3V0XG5cbnZhciBJRExFX1BSSU9SSVRZX1RJTUVPVVQgPSBtYXhTaWduZWQzMUJpdEludDsgLy8gVGFza3MgYXJlIHN0b3JlZCBvbiBhIG1pbiBoZWFwXG5cbnZhciB0YXNrUXVldWUgPSBbXTtcbnZhciB0aW1lclF1ZXVlID0gW107IC8vIEluY3JlbWVudGluZyBpZCBjb3VudGVyLiBVc2VkIHRvIG1haW50YWluIGluc2VydGlvbiBvcmRlci5cblxudmFyIHRhc2tJZENvdW50ZXIgPSAxOyAvLyBQYXVzaW5nIHRoZSBzY2hlZHVsZXIgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG52YXIgY3VycmVudFRhc2sgPSBudWxsO1xudmFyIGN1cnJlbnRQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7IC8vIFRoaXMgaXMgc2V0IHdoaWxlIHBlcmZvcm1pbmcgd29yaywgdG8gcHJldmVudCByZS1lbnRyYW5jZS5cblxudmFyIGlzUGVyZm9ybWluZ1dvcmsgPSBmYWxzZTtcbnZhciBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xudmFyIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTsgLy8gQ2FwdHVyZSBsb2NhbCByZWZlcmVuY2VzIHRvIG5hdGl2ZSBBUElzLCBpbiBjYXNlIGEgcG9seWZpbGwgb3ZlcnJpZGVzIHRoZW0uXG5cbnZhciBsb2NhbFNldFRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiBudWxsO1xudmFyIGxvY2FsQ2xlYXJUaW1lb3V0ID0gdHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IGNsZWFyVGltZW91dCA6IG51bGw7XG52YXIgbG9jYWxTZXRJbW1lZGlhdGUgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlICE9PSAndW5kZWZpbmVkJyA/IHNldEltbWVkaWF0ZSA6IG51bGw7IC8vIElFIGFuZCBOb2RlLmpzICsganNkb21cblxudmFyIGlzSW5wdXRQZW5kaW5nID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnNjaGVkdWxpbmcgIT09IHVuZGVmaW5lZCAmJiBuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyAhPT0gdW5kZWZpbmVkID8gbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZykgOiBudWxsO1xuXG5mdW5jdGlvbiBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKSB7XG4gIC8vIENoZWNrIGZvciB0YXNrcyB0aGF0IGFyZSBubyBsb25nZXIgZGVsYXllZCBhbmQgYWRkIHRoZW0gdG8gdGhlIHF1ZXVlLlxuICB2YXIgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gIHdoaWxlICh0aW1lciAhPT0gbnVsbCkge1xuICAgIGlmICh0aW1lci5jYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGltZXIgd2FzIGNhbmNlbGxlZC5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKHRpbWVyLnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGltZXIgZmlyZWQuIFRyYW5zZmVyIHRvIHRoZSB0YXNrIHF1ZXVlLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgICAgdGltZXIuc29ydEluZGV4ID0gdGltZXIuZXhwaXJhdGlvblRpbWU7XG4gICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1haW5pbmcgdGltZXJzIGFyZSBwZW5kaW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUaW1lb3V0KGN1cnJlbnRUaW1lKSB7XG4gIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCkge1xuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgIT09IG51bGwpIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoV29yayhoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuXG5cbiAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgIC8vIFdlIHNjaGVkdWxlZCBhIHRpbWVvdXQgYnV0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC4gQ2FuY2VsIGl0LlxuICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICB9XG5cbiAgaXNQZXJmb3JtaW5nV29yayA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIGlmIChlbmFibGVQcm9maWxpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICAgICAgICAgIG1hcmtUYXNrRXJyb3JlZChjdXJyZW50VGFzaywgY3VycmVudFRpbWUpO1xuICAgICAgICAgIGN1cnJlbnRUYXNrLmlzUXVldWVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2F0Y2ggaW4gcHJvZCBjb2RlIHBhdGguXG4gICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VGFzayA9IG51bGw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGluaXRpYWxUaW1lO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG5cbiAgd2hpbGUgKGN1cnJlbnRUYXNrICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICkpIHtcbiAgICBpZiAoY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPiBjdXJyZW50VGltZSAmJiAoIWhhc1RpbWVSZW1haW5pbmcgfHwgc2hvdWxkWWllbGRUb0hvc3QoKSkpIHtcbiAgICAgIC8vIFRoaXMgY3VycmVudFRhc2sgaGFzbid0IGV4cGlyZWQsIGFuZCB3ZSd2ZSByZWFjaGVkIHRoZSBkZWFkbGluZS5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBjYWxsYmFjayA9IGN1cnJlbnRUYXNrLmNhbGxiYWNrO1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50VGFzay5wcmlvcml0eUxldmVsO1xuICAgICAgdmFyIGRpZFVzZXJDYWxsYmFja1RpbWVvdXQgPSBjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA8PSBjdXJyZW50VGltZTtcblxuICAgICAgdmFyIGNvbnRpbnVhdGlvbkNhbGxiYWNrID0gY2FsbGJhY2soZGlkVXNlckNhbGxiYWNrVGltZW91dCk7XG4gICAgICBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGludWF0aW9uQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUYXNrID09PSBwZWVrKHRhc2tRdWV1ZSkpIHtcbiAgICAgICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG4gIH0gLy8gUmV0dXJuIHdoZXRoZXIgdGhlcmUncyBhZGRpdGlvbmFsIHdvcmtcblxuXG4gIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBmaXJzdFRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcblxuICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX25leHQoZXZlbnRIYW5kbGVyKSB7XG4gIHZhciBwcmlvcml0eUxldmVsO1xuXG4gIHN3aXRjaCAoY3VycmVudFByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICAgIC8vIFNoaWZ0IGRvd24gdG8gbm9ybWFsIHByaW9yaXR5XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBBbnl0aGluZyBsb3dlciB0aGFuIG5vcm1hbCBwcmlvcml0eSBzaG91bGQgcmVtYWluIGF0IHRoZSBjdXJyZW50IGxldmVsLlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV93cmFwQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgdmFyIHBhcmVudFByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGlzIGlzIGEgZm9yayBvZiBydW5XaXRoUHJpb3JpdHksIGlubGluZWQgZm9yIHBlcmZvcm1hbmNlLlxuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHBhcmVudFByaW9yaXR5TGV2ZWw7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhwcmlvcml0eUxldmVsLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICB2YXIgc3RhcnRUaW1lO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyAhPT0gbnVsbCkge1xuICAgIHZhciBkZWxheSA9IG9wdGlvbnMuZGVsYXk7XG5cbiAgICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lICsgZGVsYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0O1xuXG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSU1NRURJQVRFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJRExFX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gTE9XX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIHRpbWVvdXQgPSBOT1JNQUxfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIGV4cGlyYXRpb25UaW1lID0gc3RhcnRUaW1lICsgdGltZW91dDtcbiAgdmFyIG5ld1Rhc2sgPSB7XG4gICAgaWQ6IHRhc2tJZENvdW50ZXIrKyxcbiAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICBleHBpcmF0aW9uVGltZTogZXhwaXJhdGlvblRpbWUsXG4gICAgc29ydEluZGV4OiAtMVxuICB9O1xuXG4gIGlmIChzdGFydFRpbWUgPiBjdXJyZW50VGltZSkge1xuICAgIC8vIFRoaXMgaXMgYSBkZWxheWVkIHRhc2suXG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBzdGFydFRpbWU7XG4gICAgcHVzaCh0aW1lclF1ZXVlLCBuZXdUYXNrKTtcblxuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgPT09IG51bGwgJiYgbmV3VGFzayA9PT0gcGVlayh0aW1lclF1ZXVlKSkge1xuICAgICAgLy8gQWxsIHRhc2tzIGFyZSBkZWxheWVkLCBhbmQgdGhpcyBpcyB0aGUgdGFzayB3aXRoIHRoZSBlYXJsaWVzdCBkZWxheS5cbiAgICAgIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgICAgIC8vIENhbmNlbCBhbiBleGlzdGluZyB0aW1lb3V0LlxuICAgICAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IHRydWU7XG4gICAgICB9IC8vIFNjaGVkdWxlIGEgdGltZW91dC5cblxuXG4gICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IGV4cGlyYXRpb25UaW1lO1xuICAgIHB1c2godGFza1F1ZXVlLCBuZXdUYXNrKTtcbiAgICAvLyB3YWl0IHVudGlsIHRoZSBuZXh0IHRpbWUgd2UgeWllbGQuXG5cblxuICAgIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3VGFzaztcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcGF1c2VFeGVjdXRpb24oKSB7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uKCkge1xuXG4gIGlmICghaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgJiYgIWlzUGVyZm9ybWluZ1dvcmspIHtcbiAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlKCkge1xuICByZXR1cm4gcGVlayh0YXNrUXVldWUpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjayh0YXNrKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHlvdSBjYW4ndCByZW1vdmUgYXJiaXRyYXJ5IG5vZGVzIGZyb20gYW5cbiAgLy8gYXJyYXkgYmFzZWQgaGVhcCwgb25seSB0aGUgZmlyc3Qgb25lLilcblxuXG4gIHRhc2suY2FsbGJhY2sgPSBudWxsO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRQcmlvcml0eUxldmVsO1xufVxuXG52YXIgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbnZhciBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xudmFyIHRhc2tUaW1lb3V0SUQgPSAtMTsgLy8gU2NoZWR1bGVyIHBlcmlvZGljYWxseSB5aWVsZHMgaW4gY2FzZSB0aGVyZSBpcyBvdGhlciB3b3JrIG9uIHRoZSBtYWluXG4vLyB0aHJlYWQsIGxpa2UgdXNlciBldmVudHMuIEJ5IGRlZmF1bHQsIGl0IHlpZWxkcyBtdWx0aXBsZSB0aW1lcyBwZXIgZnJhbWUuXG4vLyBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGFsaWduIHdpdGggZnJhbWUgYm91bmRhcmllcywgc2luY2UgbW9zdCB0YXNrcyBkb24ndFxuLy8gbmVlZCB0byBiZSBmcmFtZSBhbGlnbmVkOyBmb3IgdGhvc2UgdGhhdCBkbywgdXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cblxudmFyIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG52YXIgc3RhcnRUaW1lID0gLTE7XG5cbmZ1bmN0aW9uIHNob3VsZFlpZWxkVG9Ib3N0KCkge1xuICB2YXIgdGltZUVsYXBzZWQgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpIC0gc3RhcnRUaW1lO1xuXG4gIGlmICh0aW1lRWxhcHNlZCA8IGZyYW1lSW50ZXJ2YWwpIHtcbiAgICAvLyBUaGUgbWFpbiB0aHJlYWQgaGFzIG9ubHkgYmVlbiBibG9ja2VkIGZvciBhIHJlYWxseSBzaG9ydCBhbW91bnQgb2YgdGltZTtcbiAgICAvLyBzbWFsbGVyIHRoYW4gYSBzaW5nbGUgZnJhbWUuIERvbid0IHlpZWxkIHlldC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGhlIG1haW4gdGhyZWFkIGhhcyBiZWVuIGJsb2NrZWQgZm9yIGEgbm9uLW5lZ2xpZ2libGUgYW1vdW50IG9mIHRpbWUuIFdlXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFBhaW50KCkge1xuXG59XG5cbmZ1bmN0aW9uIGZvcmNlRnJhbWVSYXRlKGZwcykge1xuICBpZiAoZnBzIDwgMCB8fCBmcHMgPiAxMjUpIHtcbiAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICBjb25zb2xlWydlcnJvciddKCdmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgJyArICdmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChmcHMgPiAwKSB7XG4gICAgZnJhbWVJbnRlcnZhbCA9IE1hdGguZmxvb3IoMTAwMCAvIGZwcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzZXQgdGhlIGZyYW1lcmF0ZVxuICAgIGZyYW1lSW50ZXJ2YWwgPSBmcmFtZVlpZWxkTXM7XG4gIH1cbn1cblxudmFyIHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHNjaGVkdWxlZEhvc3RDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7IC8vIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IHRpbWUgc28gd2UgY2FuIG1lYXN1cmUgaG93IGxvbmcgdGhlIG1haW4gdGhyZWFkXG4gICAgLy8gaGFzIGJlZW4gYmxvY2tlZC5cblxuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgIHZhciBoYXNUaW1lUmVtYWluaW5nID0gdHJ1ZTsgLy8gSWYgYSBzY2hlZHVsZXIgdGFzayB0aHJvd3MsIGV4aXQgdGhlIGN1cnJlbnQgYnJvd3NlciB0YXNrIHNvIHRoZVxuICAgIC8vIGVycm9yIGNhbiBiZSBvYnNlcnZlZC5cbiAgICAvL1xuICAgIC8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGEgdHJ5LWNhdGNoLCBzaW5jZSB0aGF0IG1ha2VzIHNvbWUgZGVidWdnaW5nXG4gICAgLy8gdGVjaG5pcXVlcyBoYXJkZXIuIEluc3RlYWQsIGlmIGBzY2hlZHVsZWRIb3N0Q2FsbGJhY2tgIGVycm9ycywgdGhlblxuICAgIC8vIGBoYXNNb3JlV29ya2Agd2lsbCByZW1haW4gdHJ1ZSwgYW5kIHdlJ2xsIGNvbnRpbnVlIHRoZSB3b3JrIGxvb3AuXG5cbiAgICB2YXIgaGFzTW9yZVdvcmsgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGhhc01vcmVXb3JrID0gc2NoZWR1bGVkSG9zdENhbGxiYWNrKGhhc1RpbWVSZW1haW5pbmcsIGN1cnJlbnRUaW1lKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGhhc01vcmVXb3JrKSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSB3b3JrLCBzY2hlZHVsZSB0aGUgbmV4dCBtZXNzYWdlIGV2ZW50IGF0IHRoZSBlbmRcbiAgICAgICAgLy8gb2YgdGhlIHByZWNlZGluZyBvbmUuXG4gICAgICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICAgICAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICB9IC8vIFlpZWxkaW5nIHRvIHRoZSBicm93c2VyIHdpbGwgZ2l2ZSBpdCBhIGNoYW5jZSB0byBwYWludCwgc28gd2UgY2FuXG59O1xuXG52YXIgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbmlmICh0eXBlb2YgbG9jYWxTZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gTm9kZS5qcyBhbmQgb2xkIElFLlxuICAvLyBUaGVyZSdzIGEgZmV3IHJlYXNvbnMgZm9yIHdoeSB3ZSBwcmVmZXIgc2V0SW1tZWRpYXRlLlxuICAvL1xuICAvLyBVbmxpa2UgTWVzc2FnZUNoYW5uZWwsIGl0IGRvZXNuJ3QgcHJldmVudCBhIE5vZGUuanMgcHJvY2VzcyBmcm9tIGV4aXRpbmcuXG4gIC8vIChFdmVuIHRob3VnaCB0aGlzIGlzIGEgRE9NIGZvcmsgb2YgdGhlIFNjaGVkdWxlciwgeW91IGNvdWxkIGdldCBoZXJlXG4gIC8vIHdpdGggYSBtaXggb2YgTm9kZS5qcyAxNSssIHdoaWNoIGhhcyBhIE1lc3NhZ2VDaGFubmVsLCBhbmQganNkb20uKVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIwNzU2XG4gIC8vXG4gIC8vIEJ1dCBhbHNvLCBpdCBydW5zIGVhcmxpZXIgd2hpY2ggaXMgdGhlIHNlbWFudGljIHdlIHdhbnQuXG4gIC8vIElmIG90aGVyIGJyb3dzZXJzIGV2ZXIgaW1wbGVtZW50IGl0LCBpdCdzIGJldHRlciB0byB1c2UgaXQuXG4gIC8vIEFsdGhvdWdoIGJvdGggb2YgdGhlc2Ugd291bGQgYmUgaW5mZXJpb3IgdG8gbmF0aXZlIHNjaGVkdWxpbmcuXG4gIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGxvY2FsU2V0SW1tZWRpYXRlKHBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSk7XG4gIH07XG59IGVsc2UgaWYgKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy8gRE9NIGFuZCBXb3JrZXIgZW52aXJvbm1lbnRzLlxuICAvLyBXZSBwcmVmZXIgTWVzc2FnZUNoYW5uZWwgYmVjYXVzZSBvZiB0aGUgNG1zIHNldFRpbWVvdXQgY2xhbXBpbmcuXG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbiAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcG9ydC5wb3N0TWVzc2FnZShudWxsKTtcbiAgfTtcbn0gZWxzZSB7XG4gIC8vIFdlIHNob3VsZCBvbmx5IGZhbGxiYWNrIGhlcmUgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBsb2NhbFNldFRpbWVvdXQocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lLCAwKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RDYWxsYmFjayhjYWxsYmFjaykge1xuICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICBpZiAoIWlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSB0cnVlO1xuICAgIHNjaGVkdWxlUGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdEhvc3RUaW1lb3V0KGNhbGxiYWNrLCBtcykge1xuICB0YXNrVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBjYWxsYmFjayhleHBvcnRzLnVuc3RhYmxlX25vdygpKTtcbiAgfSwgbXMpO1xufVxuXG5mdW5jdGlvbiBjYW5jZWxIb3N0VGltZW91dCgpIHtcbiAgbG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCk7XG4gIHRhc2tUaW1lb3V0SUQgPSAtMTtcbn1cblxudmFyIHVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHJlcXVlc3RQYWludDtcbnZhciB1bnN0YWJsZV9Qcm9maWxpbmcgPSAgbnVsbDtcblxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5ID0gTG93UHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZyA9IHVuc3RhYmxlX1Byb2ZpbGluZztcbmV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb24gPSB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfZm9yY2VGcmFtZVJhdGUgPSBmb3JjZUZyYW1lUmF0ZTtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUgPSB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZTtcbmV4cG9ydHMudW5zdGFibGVfbmV4dCA9IHVuc3RhYmxlX25leHQ7XG5leHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uID0gdW5zdGFibGVfcGF1c2VFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHVuc3RhYmxlX3JlcXVlc3RQYWludDtcbmV4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5ID0gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrID0gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfc2hvdWxkWWllbGQgPSBzaG91bGRZaWVsZFRvSG9zdDtcbmV4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrID0gdW5zdGFibGVfd3JhcENhbGxiYWNrO1xuICAgICAgICAgIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbmlmIChcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKG5ldyBFcnJvcigpKTtcbn1cbiAgICAgICAgXG4gIH0pKCk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuLypcbiBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiovXG4ndXNlIHN0cmljdCc7dmFyIGFhPXJlcXVpcmUoXCJyZWFjdFwiKSxiYT1yZXF1aXJlKFwic2NoZWR1bGVyXCIpO2Z1bmN0aW9uIHAoYSl7Zm9yKHZhciBiPVwiaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9XCIrYSxjPTE7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyliKz1cIiZhcmdzW109XCIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tjXSk7cmV0dXJuXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjXCIrYStcIjsgdmlzaXQgXCIrYitcIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuXCJ9dmFyIGRhPW5ldyBTZXQsZWE9e307ZnVuY3Rpb24gZmEoYSxiKXtoYShhLGIpO2hhKGErXCJDYXB0dXJlXCIsYil9XG5mdW5jdGlvbiBoYShhLGIpe2VhW2FdPWI7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylkYS5hZGQoYlthXSl9XG52YXIgaWE9IShcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvd3x8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3cuZG9jdW1lbnR8fFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpLGphPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksa2E9L15bOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRdWzpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDBdKiQvLGxhPVxue30sbWE9e307ZnVuY3Rpb24gbmEoYSl7aWYoamEuY2FsbChtYSxhKSlyZXR1cm4hMDtpZihqYS5jYWxsKGxhLGEpKXJldHVybiExO2lmKGthLnRlc3QoYSkpcmV0dXJuIG1hW2FdPSEwO2xhW2FdPSEwO3JldHVybiExfWZ1bmN0aW9uIG9hKGEsYixjLGQpe2lmKG51bGwhPT1jJiYwPT09Yy50eXBlKXJldHVybiExO3N3aXRjaCh0eXBlb2YgYil7Y2FzZSBcImZ1bmN0aW9uXCI6Y2FzZSBcInN5bWJvbFwiOnJldHVybiEwO2Nhc2UgXCJib29sZWFuXCI6aWYoZClyZXR1cm4hMTtpZihudWxsIT09YylyZXR1cm4hYy5hY2NlcHRzQm9vbGVhbnM7YT1hLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw1KTtyZXR1cm5cImRhdGEtXCIhPT1hJiZcImFyaWEtXCIhPT1hO2RlZmF1bHQ6cmV0dXJuITF9fVxuZnVuY3Rpb24gcGEoYSxiLGMsZCl7aWYobnVsbD09PWJ8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYnx8b2EoYSxiLGMsZCkpcmV0dXJuITA7aWYoZClyZXR1cm4hMTtpZihudWxsIT09Yylzd2l0Y2goYy50eXBlKXtjYXNlIDM6cmV0dXJuIWI7Y2FzZSA0OnJldHVybiExPT09YjtjYXNlIDU6cmV0dXJuIGlzTmFOKGIpO2Nhc2UgNjpyZXR1cm4gaXNOYU4oYil8fDE+Yn1yZXR1cm4hMX1mdW5jdGlvbiB0KGEsYixjLGQsZSxmLGcpe3RoaXMuYWNjZXB0c0Jvb2xlYW5zPTI9PT1ifHwzPT09Ynx8ND09PWI7dGhpcy5hdHRyaWJ1dGVOYW1lPWQ7dGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2U9ZTt0aGlzLm11c3RVc2VQcm9wZXJ0eT1jO3RoaXMucHJvcGVydHlOYW1lPWE7dGhpcy50eXBlPWI7dGhpcy5zYW5pdGl6ZVVSTD1mO3RoaXMucmVtb3ZlRW1wdHlTdHJpbmc9Z312YXIgej17fTtcblwiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDAsITEsYSxudWxsLCExLCExKX0pO1tbXCJhY2NlcHRDaGFyc2V0XCIsXCJhY2NlcHQtY2hhcnNldFwiXSxbXCJjbGFzc05hbWVcIixcImNsYXNzXCJdLFtcImh0bWxGb3JcIixcImZvclwiXSxbXCJodHRwRXF1aXZcIixcImh0dHAtZXF1aXZcIl1dLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YVswXTt6W2JdPW5ldyB0KGIsMSwhMSxhWzFdLG51bGwsITEsITEpfSk7W1wiY29udGVudEVkaXRhYmxlXCIsXCJkcmFnZ2FibGVcIixcInNwZWxsQ2hlY2tcIixcInZhbHVlXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDIsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7XG5bXCJhdXRvUmV2ZXJzZVwiLFwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFwiLFwiZm9jdXNhYmxlXCIsXCJwcmVzZXJ2ZUFscGhhXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDIsITEsYSxudWxsLCExLCExKX0pO1wiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHQoYSwzLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO1xuW1wiY2hlY2tlZFwiLFwibXVsdGlwbGVcIixcIm11dGVkXCIsXCJzZWxlY3RlZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHQoYSwzLCEwLGEsbnVsbCwhMSwhMSl9KTtbXCJjYXB0dXJlXCIsXCJkb3dubG9hZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3pbYV09bmV3IHQoYSw0LCExLGEsbnVsbCwhMSwhMSl9KTtbXCJjb2xzXCIsXCJyb3dzXCIsXCJzaXplXCIsXCJzcGFuXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDYsITEsYSxudWxsLCExLCExKX0pO1tcInJvd1NwYW5cIixcInN0YXJ0XCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDUsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7dmFyIHFhPS9bXFwtOl0oW2Etel0pL2c7ZnVuY3Rpb24gcmEoYSl7cmV0dXJuIGFbMV0udG9VcHBlckNhc2UoKX1cblwiYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHRcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UocWEsXG5yYSk7eltiXT1uZXcgdChiLDEsITEsYSxudWxsLCExLCExKX0pO1wieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKHFhLHJhKTt6W2JdPW5ldyB0KGIsMSwhMSxhLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCExLCExKX0pO1tcInhtbDpiYXNlXCIsXCJ4bWw6bGFuZ1wiLFwieG1sOnNwYWNlXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKHFhLHJhKTt6W2JdPW5ldyB0KGIsMSwhMSxhLFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsITEsITEpfSk7W1widGFiSW5kZXhcIixcImNyb3NzT3JpZ2luXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDEsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7XG56LnhsaW5rSHJlZj1uZXcgdChcInhsaW5rSHJlZlwiLDEsITEsXCJ4bGluazpocmVmXCIsXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsITAsITEpO1tcInNyY1wiLFwiaHJlZlwiLFwiYWN0aW9uXCIsXCJmb3JtQWN0aW9uXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7elthXT1uZXcgdChhLDEsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITAsITApfSk7XG5mdW5jdGlvbiBzYShhLGIsYyxkKXt2YXIgZT16Lmhhc093blByb3BlcnR5KGIpP3pbYl06bnVsbDtpZihudWxsIT09ZT8wIT09ZS50eXBlOmR8fCEoMjxiLmxlbmd0aCl8fFwib1wiIT09YlswXSYmXCJPXCIhPT1iWzBdfHxcIm5cIiE9PWJbMV0mJlwiTlwiIT09YlsxXSlwYShiLGMsZSxkKSYmKGM9bnVsbCksZHx8bnVsbD09PWU/bmEoYikmJihudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTphLnNldEF0dHJpYnV0ZShiLFwiXCIrYykpOmUubXVzdFVzZVByb3BlcnR5P2FbZS5wcm9wZXJ0eU5hbWVdPW51bGw9PT1jPzM9PT1lLnR5cGU/ITE6XCJcIjpjOihiPWUuYXR0cmlidXRlTmFtZSxkPWUuYXR0cmlidXRlTmFtZXNwYWNlLG51bGw9PT1jP2EucmVtb3ZlQXR0cmlidXRlKGIpOihlPWUudHlwZSxjPTM9PT1lfHw0PT09ZSYmITA9PT1jP1wiXCI6XCJcIitjLGQ/YS5zZXRBdHRyaWJ1dGVOUyhkLGIsYyk6YS5zZXRBdHRyaWJ1dGUoYixjKSkpfVxudmFyIHRhPWFhLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELHVhPVN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpLHZhPVN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIiksd2E9U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLHhhPVN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKSx6YT1TeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIiksQWE9U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpLEJhPVN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpLENhPVN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxEYT1TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIiksRWE9U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIiksRmE9U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIiksR2E9U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik7U3ltYm9sLmZvcihcInJlYWN0LnNjb3BlXCIpO1N5bWJvbC5mb3IoXCJyZWFjdC5kZWJ1Z190cmFjZV9tb2RlXCIpO1xudmFyIEhhPVN5bWJvbC5mb3IoXCJyZWFjdC5vZmZzY3JlZW5cIik7U3ltYm9sLmZvcihcInJlYWN0LmxlZ2FjeV9oaWRkZW5cIik7U3ltYm9sLmZvcihcInJlYWN0LmNhY2hlXCIpO1N5bWJvbC5mb3IoXCJyZWFjdC50cmFjaW5nX21hcmtlclwiKTt2YXIgSWE9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIEphKGEpe2lmKG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGEpcmV0dXJuIG51bGw7YT1JYSYmYVtJYV18fGFbXCJAQGl0ZXJhdG9yXCJdO3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhP2E6bnVsbH12YXIgQT1PYmplY3QuYXNzaWduLEthO2Z1bmN0aW9uIExhKGEpe2lmKHZvaWQgMD09PUthKXRyeXt0aHJvdyBFcnJvcigpO31jYXRjaChjKXt2YXIgYj1jLnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO0thPWImJmJbMV18fFwiXCJ9cmV0dXJuXCJcXG5cIitLYSthfXZhciBNYT0hMTtcbmZ1bmN0aW9uIE5hKGEsYil7aWYoIWF8fE1hKXJldHVyblwiXCI7TWE9ITA7dmFyIGM9RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9dm9pZCAwO3RyeXtpZihiKWlmKGI9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpO30sT2JqZWN0LmRlZmluZVByb3BlcnR5KGIucHJvdG90eXBlLFwicHJvcHNcIix7c2V0OmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKTt9fSksXCJvYmplY3RcIj09PXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KGIsW10pfWNhdGNoKGwpe3ZhciBkPWx9UmVmbGVjdC5jb25zdHJ1Y3QoYSxbXSxiKX1lbHNle3RyeXtiLmNhbGwoKX1jYXRjaChsKXtkPWx9YS5jYWxsKGIucHJvdG90eXBlKX1lbHNle3RyeXt0aHJvdyBFcnJvcigpO31jYXRjaChsKXtkPWx9YSgpfX1jYXRjaChsKXtpZihsJiZkJiZcInN0cmluZ1wiPT09dHlwZW9mIGwuc3RhY2spe2Zvcih2YXIgZT1sLnN0YWNrLnNwbGl0KFwiXFxuXCIpLFxuZj1kLnN0YWNrLnNwbGl0KFwiXFxuXCIpLGc9ZS5sZW5ndGgtMSxoPWYubGVuZ3RoLTE7MTw9ZyYmMDw9aCYmZVtnXSE9PWZbaF07KWgtLTtmb3IoOzE8PWcmJjA8PWg7Zy0tLGgtLSlpZihlW2ddIT09ZltoXSl7aWYoMSE9PWd8fDEhPT1oKXtkbyBpZihnLS0saC0tLDA+aHx8ZVtnXSE9PWZbaF0pe3ZhciBrPVwiXFxuXCIrZVtnXS5yZXBsYWNlKFwiIGF0IG5ldyBcIixcIiBhdCBcIik7YS5kaXNwbGF5TmFtZSYmay5pbmNsdWRlcyhcIjxhbm9ueW1vdXM+XCIpJiYoaz1rLnJlcGxhY2UoXCI8YW5vbnltb3VzPlwiLGEuZGlzcGxheU5hbWUpKTtyZXR1cm4ga313aGlsZSgxPD1nJiYwPD1oKX1icmVha319fWZpbmFsbHl7TWE9ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9Y31yZXR1cm4oYT1hP2EuZGlzcGxheU5hbWV8fGEubmFtZTpcIlwiKT9MYShhKTpcIlwifVxuZnVuY3Rpb24gT2EoYSl7c3dpdGNoKGEudGFnKXtjYXNlIDU6cmV0dXJuIExhKGEudHlwZSk7Y2FzZSAxNjpyZXR1cm4gTGEoXCJMYXp5XCIpO2Nhc2UgMTM6cmV0dXJuIExhKFwiU3VzcGVuc2VcIik7Y2FzZSAxOTpyZXR1cm4gTGEoXCJTdXNwZW5zZUxpc3RcIik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiBhPU5hKGEudHlwZSwhMSksYTtjYXNlIDExOnJldHVybiBhPU5hKGEudHlwZS5yZW5kZXIsITEpLGE7Y2FzZSAxOnJldHVybiBhPU5hKGEudHlwZSwhMCksYTtkZWZhdWx0OnJldHVyblwiXCJ9fVxuZnVuY3Rpb24gUGEoYSl7aWYobnVsbD09YSlyZXR1cm4gbnVsbDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gYS5kaXNwbGF5TmFtZXx8YS5uYW1lfHxudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtzd2l0Y2goYSl7Y2FzZSB3YTpyZXR1cm5cIkZyYWdtZW50XCI7Y2FzZSB2YTpyZXR1cm5cIlBvcnRhbFwiO2Nhc2UgemE6cmV0dXJuXCJQcm9maWxlclwiO2Nhc2UgeGE6cmV0dXJuXCJTdHJpY3RNb2RlXCI7Y2FzZSBEYTpyZXR1cm5cIlN1c3BlbnNlXCI7Y2FzZSBFYTpyZXR1cm5cIlN1c3BlbnNlTGlzdFwifWlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSlzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSBCYTpyZXR1cm4oYS5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLkNvbnN1bWVyXCI7Y2FzZSBBYTpyZXR1cm4oYS5fY29udGV4dC5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLlByb3ZpZGVyXCI7Y2FzZSBDYTp2YXIgYj1hLnJlbmRlcjthPWEuZGlzcGxheU5hbWU7YXx8KGE9Yi5kaXNwbGF5TmFtZXx8XG5iLm5hbWV8fFwiXCIsYT1cIlwiIT09YT9cIkZvcndhcmRSZWYoXCIrYStcIilcIjpcIkZvcndhcmRSZWZcIik7cmV0dXJuIGE7Y2FzZSBGYTpyZXR1cm4gYj1hLmRpc3BsYXlOYW1lfHxudWxsLG51bGwhPT1iP2I6UGEoYS50eXBlKXx8XCJNZW1vXCI7Y2FzZSBHYTpiPWEuX3BheWxvYWQ7YT1hLl9pbml0O3RyeXtyZXR1cm4gUGEoYShiKSl9Y2F0Y2goYyl7fX1yZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIFFhKGEpe3ZhciBiPWEudHlwZTtzd2l0Y2goYS50YWcpe2Nhc2UgMjQ6cmV0dXJuXCJDYWNoZVwiO2Nhc2UgOTpyZXR1cm4oYi5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLkNvbnN1bWVyXCI7Y2FzZSAxMDpyZXR1cm4oYi5fY29udGV4dC5kaXNwbGF5TmFtZXx8XCJDb250ZXh0XCIpK1wiLlByb3ZpZGVyXCI7Y2FzZSAxODpyZXR1cm5cIkRlaHlkcmF0ZWRGcmFnbWVudFwiO2Nhc2UgMTE6cmV0dXJuIGE9Yi5yZW5kZXIsYT1hLmRpc3BsYXlOYW1lfHxhLm5hbWV8fFwiXCIsYi5kaXNwbGF5TmFtZXx8KFwiXCIhPT1hP1wiRm9yd2FyZFJlZihcIithK1wiKVwiOlwiRm9yd2FyZFJlZlwiKTtjYXNlIDc6cmV0dXJuXCJGcmFnbWVudFwiO2Nhc2UgNTpyZXR1cm4gYjtjYXNlIDQ6cmV0dXJuXCJQb3J0YWxcIjtjYXNlIDM6cmV0dXJuXCJSb290XCI7Y2FzZSA2OnJldHVyblwiVGV4dFwiO2Nhc2UgMTY6cmV0dXJuIFBhKGIpO2Nhc2UgODpyZXR1cm4gYj09PXhhP1wiU3RyaWN0TW9kZVwiOlwiTW9kZVwiO2Nhc2UgMjI6cmV0dXJuXCJPZmZzY3JlZW5cIjtcbmNhc2UgMTI6cmV0dXJuXCJQcm9maWxlclwiO2Nhc2UgMjE6cmV0dXJuXCJTY29wZVwiO2Nhc2UgMTM6cmV0dXJuXCJTdXNwZW5zZVwiO2Nhc2UgMTk6cmV0dXJuXCJTdXNwZW5zZUxpc3RcIjtjYXNlIDI1OnJldHVyblwiVHJhY2luZ01hcmtlclwiO2Nhc2UgMTpjYXNlIDA6Y2FzZSAxNzpjYXNlIDI6Y2FzZSAxNDpjYXNlIDE1OmlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKXJldHVybiBiLmRpc3BsYXlOYW1lfHxiLm5hbWV8fG51bGw7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBiKXJldHVybiBifXJldHVybiBudWxsfWZ1bmN0aW9uIFJhKGEpe3N3aXRjaCh0eXBlb2YgYSl7Y2FzZSBcImJvb2xlYW5cIjpjYXNlIFwibnVtYmVyXCI6Y2FzZSBcInN0cmluZ1wiOmNhc2UgXCJ1bmRlZmluZWRcIjpyZXR1cm4gYTtjYXNlIFwib2JqZWN0XCI6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1cbmZ1bmN0aW9uIFNhKGEpe3ZhciBiPWEudHlwZTtyZXR1cm4oYT1hLm5vZGVOYW1lKSYmXCJpbnB1dFwiPT09YS50b0xvd2VyQ2FzZSgpJiYoXCJjaGVja2JveFwiPT09Ynx8XCJyYWRpb1wiPT09Yil9XG5mdW5jdGlvbiBUYShhKXt2YXIgYj1TYShhKT9cImNoZWNrZWRcIjpcInZhbHVlXCIsYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEuY29uc3RydWN0b3IucHJvdG90eXBlLGIpLGQ9XCJcIithW2JdO2lmKCFhLmhhc093blByb3BlcnR5KGIpJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIGMmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLmdldCYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGMuc2V0KXt2YXIgZT1jLmdldCxmPWMuc2V0O09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYSl7ZD1cIlwiK2E7Zi5jYWxsKHRoaXMsYSl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7ZW51bWVyYWJsZTpjLmVudW1lcmFibGV9KTtyZXR1cm57Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZH0sc2V0VmFsdWU6ZnVuY3Rpb24oYSl7ZD1cIlwiK2F9LHN0b3BUcmFja2luZzpmdW5jdGlvbigpe2EuX3ZhbHVlVHJhY2tlcj1cbm51bGw7ZGVsZXRlIGFbYl19fX19ZnVuY3Rpb24gVWEoYSl7YS5fdmFsdWVUcmFja2VyfHwoYS5fdmFsdWVUcmFja2VyPVRhKGEpKX1mdW5jdGlvbiBWYShhKXtpZighYSlyZXR1cm4hMTt2YXIgYj1hLl92YWx1ZVRyYWNrZXI7aWYoIWIpcmV0dXJuITA7dmFyIGM9Yi5nZXRWYWx1ZSgpO3ZhciBkPVwiXCI7YSYmKGQ9U2EoYSk/YS5jaGVja2VkP1widHJ1ZVwiOlwiZmFsc2VcIjphLnZhbHVlKTthPWQ7cmV0dXJuIGEhPT1jPyhiLnNldFZhbHVlKGEpLCEwKTohMX1mdW5jdGlvbiBXYShhKXthPWF8fChcInVuZGVmaW5lZFwiIT09dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50OnZvaWQgMCk7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBhKXJldHVybiBudWxsO3RyeXtyZXR1cm4gYS5hY3RpdmVFbGVtZW50fHxhLmJvZHl9Y2F0Y2goYil7cmV0dXJuIGEuYm9keX19XG5mdW5jdGlvbiBYYShhLGIpe3ZhciBjPWIuY2hlY2tlZDtyZXR1cm4gQSh7fSxiLHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTp2b2lkIDAsY2hlY2tlZDpudWxsIT1jP2M6YS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gWWEoYSxiKXt2YXIgYz1udWxsPT1iLmRlZmF1bHRWYWx1ZT9cIlwiOmIuZGVmYXVsdFZhbHVlLGQ9bnVsbCE9Yi5jaGVja2VkP2IuY2hlY2tlZDpiLmRlZmF1bHRDaGVja2VkO2M9UmEobnVsbCE9Yi52YWx1ZT9iLnZhbHVlOmMpO2EuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbENoZWNrZWQ6ZCxpbml0aWFsVmFsdWU6Yyxjb250cm9sbGVkOlwiY2hlY2tib3hcIj09PWIudHlwZXx8XCJyYWRpb1wiPT09Yi50eXBlP251bGwhPWIuY2hlY2tlZDpudWxsIT1iLnZhbHVlfX1mdW5jdGlvbiBaYShhLGIpe2I9Yi5jaGVja2VkO251bGwhPWImJnNhKGEsXCJjaGVja2VkXCIsYiwhMSl9XG5mdW5jdGlvbiAkYShhLGIpe1phKGEsYik7dmFyIGM9UmEoYi52YWx1ZSksZD1iLnR5cGU7aWYobnVsbCE9YylpZihcIm51bWJlclwiPT09ZCl7aWYoMD09PWMmJlwiXCI9PT1hLnZhbHVlfHxhLnZhbHVlIT1jKWEudmFsdWU9XCJcIitjfWVsc2UgYS52YWx1ZSE9PVwiXCIrYyYmKGEudmFsdWU9XCJcIitjKTtlbHNlIGlmKFwic3VibWl0XCI9PT1kfHxcInJlc2V0XCI9PT1kKXthLnJlbW92ZUF0dHJpYnV0ZShcInZhbHVlXCIpO3JldHVybn1iLmhhc093blByb3BlcnR5KFwidmFsdWVcIik/YmIoYSxiLnR5cGUsYyk6Yi5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSYmYmIoYSxiLnR5cGUsUmEoYi5kZWZhdWx0VmFsdWUpKTtudWxsPT1iLmNoZWNrZWQmJm51bGwhPWIuZGVmYXVsdENoZWNrZWQmJihhLmRlZmF1bHRDaGVja2VkPSEhYi5kZWZhdWx0Q2hlY2tlZCl9XG5mdW5jdGlvbiBjYihhLGIsYyl7aWYoYi5oYXNPd25Qcm9wZXJ0eShcInZhbHVlXCIpfHxiLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpKXt2YXIgZD1iLnR5cGU7aWYoIShcInN1Ym1pdFwiIT09ZCYmXCJyZXNldFwiIT09ZHx8dm9pZCAwIT09Yi52YWx1ZSYmbnVsbCE9PWIudmFsdWUpKXJldHVybjtiPVwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTtjfHxiPT09YS52YWx1ZXx8KGEudmFsdWU9Yik7YS5kZWZhdWx0VmFsdWU9Yn1jPWEubmFtZTtcIlwiIT09YyYmKGEubmFtZT1cIlwiKTthLmRlZmF1bHRDaGVja2VkPSEhYS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkO1wiXCIhPT1jJiYoYS5uYW1lPWMpfVxuZnVuY3Rpb24gYmIoYSxiLGMpe2lmKFwibnVtYmVyXCIhPT1ifHxXYShhLm93bmVyRG9jdW1lbnQpIT09YSludWxsPT1jP2EuZGVmYXVsdFZhbHVlPVwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTphLmRlZmF1bHRWYWx1ZSE9PVwiXCIrYyYmKGEuZGVmYXVsdFZhbHVlPVwiXCIrYyl9dmFyIGRiPUFycmF5LmlzQXJyYXk7XG5mdW5jdGlvbiBlYihhLGIsYyxkKXthPWEub3B0aW9ucztpZihiKXtiPXt9O2Zvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKWJbXCIkXCIrY1tlXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyllPWIuaGFzT3duUHJvcGVydHkoXCIkXCIrYVtjXS52YWx1ZSksYVtjXS5zZWxlY3RlZCE9PWUmJihhW2NdLnNlbGVjdGVkPWUpLGUmJmQmJihhW2NdLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtjPVwiXCIrUmEoYyk7Yj1udWxsO2ZvcihlPTA7ZTxhLmxlbmd0aDtlKyspe2lmKGFbZV0udmFsdWU9PT1jKXthW2VdLnNlbGVjdGVkPSEwO2QmJihhW2VdLmRlZmF1bHRTZWxlY3RlZD0hMCk7cmV0dXJufW51bGwhPT1ifHxhW2VdLmRpc2FibGVkfHwoYj1hW2VdKX1udWxsIT09YiYmKGIuc2VsZWN0ZWQ9ITApfX1cbmZ1bmN0aW9uIGZiKGEsYil7aWYobnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCl0aHJvdyBFcnJvcihwKDkxKSk7cmV0dXJuIEEoe30sYix7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46XCJcIithLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlfSl9ZnVuY3Rpb24gZ2IoYSxiKXt2YXIgYz1iLnZhbHVlO2lmKG51bGw9PWMpe2M9Yi5jaGlsZHJlbjtiPWIuZGVmYXVsdFZhbHVlO2lmKG51bGwhPWMpe2lmKG51bGwhPWIpdGhyb3cgRXJyb3IocCg5MikpO2lmKGRiKGMpKXtpZigxPGMubGVuZ3RoKXRocm93IEVycm9yKHAoOTMpKTtjPWNbMF19Yj1jfW51bGw9PWImJihiPVwiXCIpO2M9Yn1hLl93cmFwcGVyU3RhdGU9e2luaXRpYWxWYWx1ZTpSYShjKX19XG5mdW5jdGlvbiBoYihhLGIpe3ZhciBjPVJhKGIudmFsdWUpLGQ9UmEoYi5kZWZhdWx0VmFsdWUpO251bGwhPWMmJihjPVwiXCIrYyxjIT09YS52YWx1ZSYmKGEudmFsdWU9YyksbnVsbD09Yi5kZWZhdWx0VmFsdWUmJmEuZGVmYXVsdFZhbHVlIT09YyYmKGEuZGVmYXVsdFZhbHVlPWMpKTtudWxsIT1kJiYoYS5kZWZhdWx0VmFsdWU9XCJcIitkKX1mdW5jdGlvbiBpYihhKXt2YXIgYj1hLnRleHRDb250ZW50O2I9PT1hLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlJiZcIlwiIT09YiYmbnVsbCE9PWImJihhLnZhbHVlPWIpfWZ1bmN0aW9uIGpiKGEpe3N3aXRjaChhKXtjYXNlIFwic3ZnXCI6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO2Nhc2UgXCJtYXRoXCI6cmV0dXJuXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCI7ZGVmYXVsdDpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIn19XG5mdW5jdGlvbiBrYihhLGIpe3JldHVybiBudWxsPT1hfHxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj09PWE/amIoYik6XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPT09YSYmXCJmb3JlaWduT2JqZWN0XCI9PT1iP1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiOmF9XG52YXIgbGIsbWI9ZnVuY3Rpb24oYSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBNU0FwcCYmTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24/ZnVuY3Rpb24oYixjLGQsZSl7TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gYShiLGMsZCxlKX0pfTphfShmdW5jdGlvbihhLGIpe2lmKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiE9PWEubmFtZXNwYWNlVVJJfHxcImlubmVySFRNTFwiaW4gYSlhLmlubmVySFRNTD1iO2Vsc2V7bGI9bGJ8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7bGIuaW5uZXJIVE1MPVwiPHN2Zz5cIitiLnZhbHVlT2YoKS50b1N0cmluZygpK1wiPC9zdmc+XCI7Zm9yKGI9bGIuZmlyc3RDaGlsZDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IoO2IuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChiLmZpcnN0Q2hpbGQpfX0pO1xuZnVuY3Rpb24gbmIoYSxiKXtpZihiKXt2YXIgYz1hLmZpcnN0Q2hpbGQ7aWYoYyYmYz09PWEubGFzdENoaWxkJiYzPT09Yy5ub2RlVHlwZSl7Yy5ub2RlVmFsdWU9YjtyZXR1cm59fWEudGV4dENvbnRlbnQ9Yn1cbnZhciBvYj17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYXNwZWN0UmF0aW86ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxjb2x1bW5zOiEwLGZsZXg6ITAsZmxleEdyb3c6ITAsZmxleFBvc2l0aXZlOiEwLGZsZXhTaHJpbms6ITAsZmxleE5lZ2F0aXZlOiEwLGZsZXhPcmRlcjohMCxncmlkQXJlYTohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1NwYW46ITAsZ3JpZFJvd1N0YXJ0OiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3BhbjohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZm9udFdlaWdodDohMCxsaW5lQ2xhbXA6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsdGFiU2l6ZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLFxuem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxwYj1bXCJXZWJraXRcIixcIm1zXCIsXCJNb3pcIixcIk9cIl07T2JqZWN0LmtleXMob2IpLmZvckVhY2goZnVuY3Rpb24oYSl7cGIuZm9yRWFjaChmdW5jdGlvbihiKXtiPWIrYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnN1YnN0cmluZygxKTtvYltiXT1vYlthXX0pfSk7ZnVuY3Rpb24gcWIoYSxiLGMpe3JldHVybiBudWxsPT1ifHxcImJvb2xlYW5cIj09PXR5cGVvZiBifHxcIlwiPT09Yj9cIlwiOmN8fFwibnVtYmVyXCIhPT10eXBlb2YgYnx8MD09PWJ8fG9iLmhhc093blByb3BlcnR5KGEpJiZvYlthXT8oXCJcIitiKS50cmltKCk6YitcInB4XCJ9XG5mdW5jdGlvbiByYihhLGIpe2E9YS5zdHlsZTtmb3IodmFyIGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD0wPT09Yy5pbmRleE9mKFwiLS1cIiksZT1xYihjLGJbY10sZCk7XCJmbG9hdFwiPT09YyYmKGM9XCJjc3NGbG9hdFwiKTtkP2Euc2V0UHJvcGVydHkoYyxlKTphW2NdPWV9fXZhciBzYj1BKHttZW51aXRlbTohMH0se2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0pO1xuZnVuY3Rpb24gdGIoYSxiKXtpZihiKXtpZihzYlthXSYmKG51bGwhPWIuY2hpbGRyZW58fG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHAoMTM3LGEpKTtpZihudWxsIT1iLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKXtpZihudWxsIT1iLmNoaWxkcmVuKXRocm93IEVycm9yKHAoNjApKTtpZihcIm9iamVjdFwiIT09dHlwZW9mIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUx8fCEoXCJfX2h0bWxcImluIGIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHAoNjEpKTt9aWYobnVsbCE9Yi5zdHlsZSYmXCJvYmplY3RcIiE9PXR5cGVvZiBiLnN0eWxlKXRocm93IEVycm9yKHAoNjIpKTt9fVxuZnVuY3Rpb24gdWIoYSxiKXtpZigtMT09PWEuaW5kZXhPZihcIi1cIikpcmV0dXJuXCJzdHJpbmdcIj09PXR5cGVvZiBiLmlzO3N3aXRjaChhKXtjYXNlIFwiYW5ub3RhdGlvbi14bWxcIjpjYXNlIFwiY29sb3ItcHJvZmlsZVwiOmNhc2UgXCJmb250LWZhY2VcIjpjYXNlIFwiZm9udC1mYWNlLXNyY1wiOmNhc2UgXCJmb250LWZhY2UtdXJpXCI6Y2FzZSBcImZvbnQtZmFjZS1mb3JtYXRcIjpjYXNlIFwiZm9udC1mYWNlLW5hbWVcIjpjYXNlIFwibWlzc2luZy1nbHlwaFwiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fXZhciB2Yj1udWxsO2Z1bmN0aW9uIHdiKGEpe2E9YS50YXJnZXR8fGEuc3JjRWxlbWVudHx8d2luZG93O2EuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJihhPWEuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpO3JldHVybiAzPT09YS5ub2RlVHlwZT9hLnBhcmVudE5vZGU6YX12YXIgeGI9bnVsbCx5Yj1udWxsLHpiPW51bGw7XG5mdW5jdGlvbiBBYihhKXtpZihhPUJiKGEpKXtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgeGIpdGhyb3cgRXJyb3IocCgyODApKTt2YXIgYj1hLnN0YXRlTm9kZTtiJiYoYj1DYihiKSx4YihhLnN0YXRlTm9kZSxhLnR5cGUsYikpfX1mdW5jdGlvbiBEYihhKXt5Yj96Yj96Yi5wdXNoKGEpOnpiPVthXTp5Yj1hfWZ1bmN0aW9uIEViKCl7aWYoeWIpe3ZhciBhPXliLGI9emI7emI9eWI9bnVsbDtBYihhKTtpZihiKWZvcihhPTA7YTxiLmxlbmd0aDthKyspQWIoYlthXSl9fWZ1bmN0aW9uIEZiKGEsYil7cmV0dXJuIGEoYil9ZnVuY3Rpb24gR2IoKXt9dmFyIEhiPSExO2Z1bmN0aW9uIEliKGEsYixjKXtpZihIYilyZXR1cm4gYShiLGMpO0hiPSEwO3RyeXtyZXR1cm4gRmIoYSxiLGMpfWZpbmFsbHl7aWYoSGI9ITEsbnVsbCE9PXlifHxudWxsIT09emIpR2IoKSxFYigpfX1cbmZ1bmN0aW9uIEpiKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7aWYobnVsbD09PWMpcmV0dXJuIG51bGw7dmFyIGQ9Q2IoYyk7aWYobnVsbD09PWQpcmV0dXJuIG51bGw7Yz1kW2JdO2E6c3dpdGNoKGIpe2Nhc2UgXCJvbkNsaWNrXCI6Y2FzZSBcIm9uQ2xpY2tDYXB0dXJlXCI6Y2FzZSBcIm9uRG91YmxlQ2xpY2tcIjpjYXNlIFwib25Eb3VibGVDbGlja0NhcHR1cmVcIjpjYXNlIFwib25Nb3VzZURvd25cIjpjYXNlIFwib25Nb3VzZURvd25DYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VNb3ZlXCI6Y2FzZSBcIm9uTW91c2VNb3ZlQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlVXBcIjpjYXNlIFwib25Nb3VzZVVwQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlRW50ZXJcIjooZD0hZC5kaXNhYmxlZCl8fChhPWEudHlwZSxkPSEoXCJidXR0b25cIj09PWF8fFwiaW5wdXRcIj09PWF8fFwic2VsZWN0XCI9PT1hfHxcInRleHRhcmVhXCI9PT1hKSk7YT0hZDticmVhayBhO2RlZmF1bHQ6YT0hMX1pZihhKXJldHVybiBudWxsO2lmKGMmJlwiZnVuY3Rpb25cIiE9PVxudHlwZW9mIGMpdGhyb3cgRXJyb3IocCgyMzEsYix0eXBlb2YgYykpO3JldHVybiBjfXZhciBLYj0hMTtpZihpYSl0cnl7dmFyIExiPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShMYixcInBhc3NpdmVcIix7Z2V0OmZ1bmN0aW9uKCl7S2I9ITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsTGIsTGIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwidGVzdFwiLExiLExiKX1jYXRjaChhKXtLYj0hMX1mdW5jdGlvbiBNYihhLGIsYyxkLGUsZixnLGgsayl7dmFyIGw9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO3RyeXtiLmFwcGx5KGMsbCl9Y2F0Y2gobil7dGhpcy5vbkVycm9yKG4pfX12YXIgTmI9ITEsT2I9bnVsbCxQYj0hMSxRYj1udWxsLFJiPXtvbkVycm9yOmZ1bmN0aW9uKGEpe05iPSEwO09iPWF9fTtmdW5jdGlvbiBTYihhLGIsYyxkLGUsZixnLGgsayl7TmI9ITE7T2I9bnVsbDtNYi5hcHBseShSYixhcmd1bWVudHMpfVxuZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYsZyxoLGspe1NiLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihOYil7aWYoTmIpe3ZhciBsPU9iO05iPSExO09iPW51bGx9ZWxzZSB0aHJvdyBFcnJvcihwKDE5OCkpO1BifHwoUGI9ITAsUWI9bCl9fWZ1bmN0aW9uIFViKGEpe3ZhciBiPWEsYz1hO2lmKGEuYWx0ZXJuYXRlKWZvcig7Yi5yZXR1cm47KWI9Yi5yZXR1cm47ZWxzZXthPWI7ZG8gYj1hLDAhPT0oYi5mbGFncyY0MDk4KSYmKGM9Yi5yZXR1cm4pLGE9Yi5yZXR1cm47d2hpbGUoYSl9cmV0dXJuIDM9PT1iLnRhZz9jOm51bGx9ZnVuY3Rpb24gVmIoYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9YS5tZW1vaXplZFN0YXRlO251bGw9PT1iJiYoYT1hLmFsdGVybmF0ZSxudWxsIT09YSYmKGI9YS5tZW1vaXplZFN0YXRlKSk7aWYobnVsbCE9PWIpcmV0dXJuIGIuZGVoeWRyYXRlZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBXYihhKXtpZihVYihhKSE9PWEpdGhyb3cgRXJyb3IocCgxODgpKTt9XG5mdW5jdGlvbiBYYihhKXt2YXIgYj1hLmFsdGVybmF0ZTtpZighYil7Yj1VYihhKTtpZihudWxsPT09Yil0aHJvdyBFcnJvcihwKDE4OCkpO3JldHVybiBiIT09YT9udWxsOmF9Zm9yKHZhciBjPWEsZD1iOzspe3ZhciBlPWMucmV0dXJuO2lmKG51bGw9PT1lKWJyZWFrO3ZhciBmPWUuYWx0ZXJuYXRlO2lmKG51bGw9PT1mKXtkPWUucmV0dXJuO2lmKG51bGwhPT1kKXtjPWQ7Y29udGludWV9YnJlYWt9aWYoZS5jaGlsZD09PWYuY2hpbGQpe2ZvcihmPWUuY2hpbGQ7Zjspe2lmKGY9PT1jKXJldHVybiBXYihlKSxhO2lmKGY9PT1kKXJldHVybiBXYihlKSxiO2Y9Zi5zaWJsaW5nfXRocm93IEVycm9yKHAoMTg4KSk7fWlmKGMucmV0dXJuIT09ZC5yZXR1cm4pYz1lLGQ9ZjtlbHNle2Zvcih2YXIgZz0hMSxoPWUuY2hpbGQ7aDspe2lmKGg9PT1jKXtnPSEwO2M9ZTtkPWY7YnJlYWt9aWYoaD09PWQpe2c9ITA7ZD1lO2M9ZjticmVha31oPWguc2libGluZ31pZighZyl7Zm9yKGg9Zi5jaGlsZDtoOyl7aWYoaD09PVxuYyl7Zz0hMDtjPWY7ZD1lO2JyZWFrfWlmKGg9PT1kKXtnPSEwO2Q9ZjtjPWU7YnJlYWt9aD1oLnNpYmxpbmd9aWYoIWcpdGhyb3cgRXJyb3IocCgxODkpKTt9fWlmKGMuYWx0ZXJuYXRlIT09ZCl0aHJvdyBFcnJvcihwKDE5MCkpO31pZigzIT09Yy50YWcpdGhyb3cgRXJyb3IocCgxODgpKTtyZXR1cm4gYy5zdGF0ZU5vZGUuY3VycmVudD09PWM/YTpifWZ1bmN0aW9uIFliKGEpe2E9WGIoYSk7cmV0dXJuIG51bGwhPT1hP1piKGEpOm51bGx9ZnVuY3Rpb24gWmIoYSl7aWYoNT09PWEudGFnfHw2PT09YS50YWcpcmV0dXJuIGE7Zm9yKGE9YS5jaGlsZDtudWxsIT09YTspe3ZhciBiPVpiKGEpO2lmKG51bGwhPT1iKXJldHVybiBiO2E9YS5zaWJsaW5nfXJldHVybiBudWxsfVxudmFyICRiPWJhLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssYWM9YmEudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2ssYmM9YmEudW5zdGFibGVfc2hvdWxkWWllbGQsY2M9YmEudW5zdGFibGVfcmVxdWVzdFBhaW50LEI9YmEudW5zdGFibGVfbm93LGRjPWJhLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLGVjPWJhLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LGZjPWJhLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5LGdjPWJhLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LGhjPWJhLnVuc3RhYmxlX0xvd1ByaW9yaXR5LGljPWJhLnVuc3RhYmxlX0lkbGVQcmlvcml0eSxqYz1udWxsLGtjPW51bGw7ZnVuY3Rpb24gbGMoYSl7aWYoa2MmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBrYy5vbkNvbW1pdEZpYmVyUm9vdCl0cnl7a2Mub25Db21taXRGaWJlclJvb3QoamMsYSx2b2lkIDAsMTI4PT09KGEuY3VycmVudC5mbGFncyYxMjgpKX1jYXRjaChiKXt9fVxudmFyIG5jPU1hdGguY2x6MzI/TWF0aC5jbHozMjptYyxvYz1NYXRoLmxvZyxwYz1NYXRoLkxOMjtmdW5jdGlvbiBtYyhhKXthPj4+PTA7cmV0dXJuIDA9PT1hPzMyOjMxLShvYyhhKS9wY3wwKXwwfXZhciBxYz02NCxyYz00MTk0MzA0O1xuZnVuY3Rpb24gc2MoYSl7c3dpdGNoKGEmLWEpe2Nhc2UgMTpyZXR1cm4gMTtjYXNlIDI6cmV0dXJuIDI7Y2FzZSA0OnJldHVybiA0O2Nhc2UgODpyZXR1cm4gODtjYXNlIDE2OnJldHVybiAxNjtjYXNlIDMyOnJldHVybiAzMjtjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiBhJjQxOTQyNDA7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4gYSYxMzAwMjM0MjQ7Y2FzZSAxMzQyMTc3Mjg6cmV0dXJuIDEzNDIxNzcyODtjYXNlIDI2ODQzNTQ1NjpyZXR1cm4gMjY4NDM1NDU2O2Nhc2UgNTM2ODcwOTEyOnJldHVybiA1MzY4NzA5MTI7Y2FzZSAxMDczNzQxODI0OnJldHVybiAxMDczNzQxODI0O1xuZGVmYXVsdDpyZXR1cm4gYX19ZnVuY3Rpb24gdGMoYSxiKXt2YXIgYz1hLnBlbmRpbmdMYW5lcztpZigwPT09YylyZXR1cm4gMDt2YXIgZD0wLGU9YS5zdXNwZW5kZWRMYW5lcyxmPWEucGluZ2VkTGFuZXMsZz1jJjI2ODQzNTQ1NTtpZigwIT09Zyl7dmFyIGg9ZyZ+ZTswIT09aD9kPXNjKGgpOihmJj1nLDAhPT1mJiYoZD1zYyhmKSkpfWVsc2UgZz1jJn5lLDAhPT1nP2Q9c2MoZyk6MCE9PWYmJihkPXNjKGYpKTtpZigwPT09ZClyZXR1cm4gMDtpZigwIT09YiYmYiE9PWQmJjA9PT0oYiZlKSYmKGU9ZCYtZCxmPWImLWIsZT49Znx8MTY9PT1lJiYwIT09KGYmNDE5NDI0MCkpKXJldHVybiBiOzAhPT0oZCY0KSYmKGR8PWMmMTYpO2I9YS5lbnRhbmdsZWRMYW5lcztpZigwIT09Yilmb3IoYT1hLmVudGFuZ2xlbWVudHMsYiY9ZDswPGI7KWM9MzEtbmMoYiksZT0xPDxjLGR8PWFbY10sYiY9fmU7cmV0dXJuIGR9XG5mdW5jdGlvbiB1YyhhLGIpe3N3aXRjaChhKXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpyZXR1cm4gYisyNTA7Y2FzZSA4OmNhc2UgMTY6Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiBiKzVFMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybi0xO2Nhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1cbmZ1bmN0aW9uIHZjKGEsYil7Zm9yKHZhciBjPWEuc3VzcGVuZGVkTGFuZXMsZD1hLnBpbmdlZExhbmVzLGU9YS5leHBpcmF0aW9uVGltZXMsZj1hLnBlbmRpbmdMYW5lczswPGY7KXt2YXIgZz0zMS1uYyhmKSxoPTE8PGcsaz1lW2ddO2lmKC0xPT09ayl7aWYoMD09PShoJmMpfHwwIT09KGgmZCkpZVtnXT11YyhoLGIpfWVsc2Ugazw9YiYmKGEuZXhwaXJlZExhbmVzfD1oKTtmJj1+aH19ZnVuY3Rpb24gd2MoYSl7YT1hLnBlbmRpbmdMYW5lcyYtMTA3Mzc0MTgyNTtyZXR1cm4gMCE9PWE/YTphJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIHhjKCl7dmFyIGE9cWM7cWM8PD0xOzA9PT0ocWMmNDE5NDI0MCkmJihxYz02NCk7cmV0dXJuIGF9ZnVuY3Rpb24geWMoYSl7Zm9yKHZhciBiPVtdLGM9MDszMT5jO2MrKyliLnB1c2goYSk7cmV0dXJuIGJ9XG5mdW5jdGlvbiB6YyhhLGIsYyl7YS5wZW5kaW5nTGFuZXN8PWI7NTM2ODcwOTEyIT09YiYmKGEuc3VzcGVuZGVkTGFuZXM9MCxhLnBpbmdlZExhbmVzPTApO2E9YS5ldmVudFRpbWVzO2I9MzEtbmMoYik7YVtiXT1jfWZ1bmN0aW9uIEFjKGEsYil7dmFyIGM9YS5wZW5kaW5nTGFuZXMmfmI7YS5wZW5kaW5nTGFuZXM9YjthLnN1c3BlbmRlZExhbmVzPTA7YS5waW5nZWRMYW5lcz0wO2EuZXhwaXJlZExhbmVzJj1iO2EubXV0YWJsZVJlYWRMYW5lcyY9YjthLmVudGFuZ2xlZExhbmVzJj1iO2I9YS5lbnRhbmdsZW1lbnRzO3ZhciBkPWEuZXZlbnRUaW1lcztmb3IoYT1hLmV4cGlyYXRpb25UaW1lczswPGM7KXt2YXIgZT0zMS1uYyhjKSxmPTE8PGU7YltlXT0wO2RbZV09LTE7YVtlXT0tMTtjJj1+Zn19XG5mdW5jdGlvbiBCYyhhLGIpe3ZhciBjPWEuZW50YW5nbGVkTGFuZXN8PWI7Zm9yKGE9YS5lbnRhbmdsZW1lbnRzO2M7KXt2YXIgZD0zMS1uYyhjKSxlPTE8PGQ7ZSZifGFbZF0mYiYmKGFbZF18PWIpO2MmPX5lfX12YXIgQz0wO2Z1bmN0aW9uIENjKGEpe2EmPS1hO3JldHVybiAxPGE/NDxhPzAhPT0oYSYyNjg0MzU0NTUpPzE2OjUzNjg3MDkxMjo0OjF9dmFyIERjLEVjLEZjLEdjLEhjLEljPSExLEpjPVtdLEtjPW51bGwsTGM9bnVsbCxNYz1udWxsLE5jPW5ldyBNYXAsT2M9bmV3IE1hcCxQYz1bXSxRYz1cIm1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldCBzdWJtaXRcIi5zcGxpdChcIiBcIik7XG5mdW5jdGlvbiBSYyhhLGIpe3N3aXRjaChhKXtjYXNlIFwiZm9jdXNpblwiOmNhc2UgXCJmb2N1c291dFwiOktjPW51bGw7YnJlYWs7Y2FzZSBcImRyYWdlbnRlclwiOmNhc2UgXCJkcmFnbGVhdmVcIjpMYz1udWxsO2JyZWFrO2Nhc2UgXCJtb3VzZW92ZXJcIjpjYXNlIFwibW91c2VvdXRcIjpNYz1udWxsO2JyZWFrO2Nhc2UgXCJwb2ludGVyb3ZlclwiOmNhc2UgXCJwb2ludGVyb3V0XCI6TmMuZGVsZXRlKGIucG9pbnRlcklkKTticmVhaztjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpjYXNlIFwibG9zdHBvaW50ZXJjYXB0dXJlXCI6T2MuZGVsZXRlKGIucG9pbnRlcklkKX19XG5mdW5jdGlvbiBTYyhhLGIsYyxkLGUsZil7aWYobnVsbD09PWF8fGEubmF0aXZlRXZlbnQhPT1mKXJldHVybiBhPXtibG9ja2VkT246Yixkb21FdmVudE5hbWU6YyxldmVudFN5c3RlbUZsYWdzOmQsbmF0aXZlRXZlbnQ6Zix0YXJnZXRDb250YWluZXJzOltlXX0sbnVsbCE9PWImJihiPUJiKGIpLG51bGwhPT1iJiZFYyhiKSksYTthLmV2ZW50U3lzdGVtRmxhZ3N8PWQ7Yj1hLnRhcmdldENvbnRhaW5lcnM7bnVsbCE9PWUmJi0xPT09Yi5pbmRleE9mKGUpJiZiLnB1c2goZSk7cmV0dXJuIGF9XG5mdW5jdGlvbiBUYyhhLGIsYyxkLGUpe3N3aXRjaChiKXtjYXNlIFwiZm9jdXNpblwiOnJldHVybiBLYz1TYyhLYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJkcmFnZW50ZXJcIjpyZXR1cm4gTGM9U2MoTGMsYSxiLGMsZCxlKSwhMDtjYXNlIFwibW91c2VvdmVyXCI6cmV0dXJuIE1jPVNjKE1jLGEsYixjLGQsZSksITA7Y2FzZSBcInBvaW50ZXJvdmVyXCI6dmFyIGY9ZS5wb2ludGVySWQ7TmMuc2V0KGYsU2MoTmMuZ2V0KGYpfHxudWxsLGEsYixjLGQsZSkpO3JldHVybiEwO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOnJldHVybiBmPWUucG9pbnRlcklkLE9jLnNldChmLFNjKE9jLmdldChmKXx8bnVsbCxhLGIsYyxkLGUpKSwhMH1yZXR1cm4hMX1cbmZ1bmN0aW9uIFVjKGEpe3ZhciBiPVZjKGEudGFyZ2V0KTtpZihudWxsIT09Yil7dmFyIGM9VWIoYik7aWYobnVsbCE9PWMpaWYoYj1jLnRhZywxMz09PWIpe2lmKGI9VmIoYyksbnVsbCE9PWIpe2EuYmxvY2tlZE9uPWI7SGMoYS5wcmlvcml0eSxmdW5jdGlvbigpe0ZjKGMpfSk7cmV0dXJufX1lbHNlIGlmKDM9PT1iJiZjLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXthLmJsb2NrZWRPbj0zPT09Yy50YWc/Yy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO3JldHVybn19YS5ibG9ja2VkT249bnVsbH1cbmZ1bmN0aW9uIFdjKGEpe2lmKG51bGwhPT1hLmJsb2NrZWRPbilyZXR1cm4hMTtmb3IodmFyIGI9YS50YXJnZXRDb250YWluZXJzOzA8Yi5sZW5ndGg7KXt2YXIgYz1YYyhhLmRvbUV2ZW50TmFtZSxhLmV2ZW50U3lzdGVtRmxhZ3MsYlswXSxhLm5hdGl2ZUV2ZW50KTtpZihudWxsPT09Yyl7Yz1hLm5hdGl2ZUV2ZW50O3ZhciBkPW5ldyBjLmNvbnN0cnVjdG9yKGMudHlwZSxjKTt2Yj1kO2MudGFyZ2V0LmRpc3BhdGNoRXZlbnQoZCk7dmI9bnVsbH1lbHNlIHJldHVybiBiPUJiKGMpLG51bGwhPT1iJiZFYyhiKSxhLmJsb2NrZWRPbj1jLCExO2Iuc2hpZnQoKX1yZXR1cm4hMH1mdW5jdGlvbiBZYyhhLGIsYyl7V2MoYSkmJmMuZGVsZXRlKGIpfWZ1bmN0aW9uIFpjKCl7SWM9ITE7bnVsbCE9PUtjJiZXYyhLYykmJihLYz1udWxsKTtudWxsIT09TGMmJldjKExjKSYmKExjPW51bGwpO251bGwhPT1NYyYmV2MoTWMpJiYoTWM9bnVsbCk7TmMuZm9yRWFjaChZYyk7T2MuZm9yRWFjaChZYyl9XG5mdW5jdGlvbiAkYyhhLGIpe2EuYmxvY2tlZE9uPT09YiYmKGEuYmxvY2tlZE9uPW51bGwsSWN8fChJYz0hMCxiYS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKGJhLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFpjKSkpfVxuZnVuY3Rpb24gYWQoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gJGMoYixhKX1pZigwPEpjLmxlbmd0aCl7JGMoSmNbMF0sYSk7Zm9yKHZhciBjPTE7YzxKYy5sZW5ndGg7YysrKXt2YXIgZD1KY1tjXTtkLmJsb2NrZWRPbj09PWEmJihkLmJsb2NrZWRPbj1udWxsKX19bnVsbCE9PUtjJiYkYyhLYyxhKTtudWxsIT09TGMmJiRjKExjLGEpO251bGwhPT1NYyYmJGMoTWMsYSk7TmMuZm9yRWFjaChiKTtPYy5mb3JFYWNoKGIpO2ZvcihjPTA7YzxQYy5sZW5ndGg7YysrKWQ9UGNbY10sZC5ibG9ja2VkT249PT1hJiYoZC5ibG9ja2VkT249bnVsbCk7Zm9yKDswPFBjLmxlbmd0aCYmKGM9UGNbMF0sbnVsbD09PWMuYmxvY2tlZE9uKTspVWMoYyksbnVsbD09PWMuYmxvY2tlZE9uJiZQYy5zaGlmdCgpfXZhciBiZD10YS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxjZD0hMDtcbmZ1bmN0aW9uIGRkKGEsYixjLGQpe3ZhciBlPUMsZj1iZC50cmFuc2l0aW9uO2JkLnRyYW5zaXRpb249bnVsbDt0cnl7Qz0xLGVkKGEsYixjLGQpfWZpbmFsbHl7Qz1lLGJkLnRyYW5zaXRpb249Zn19ZnVuY3Rpb24gZmQoYSxiLGMsZCl7dmFyIGU9QyxmPWJkLnRyYW5zaXRpb247YmQudHJhbnNpdGlvbj1udWxsO3RyeXtDPTQsZWQoYSxiLGMsZCl9ZmluYWxseXtDPWUsYmQudHJhbnNpdGlvbj1mfX1cbmZ1bmN0aW9uIGVkKGEsYixjLGQpe2lmKGNkKXt2YXIgZT1YYyhhLGIsYyxkKTtpZihudWxsPT09ZSlnZChhLGIsZCxoZCxjKSxSYyhhLGQpO2Vsc2UgaWYoVGMoZSxhLGIsYyxkKSlkLnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoUmMoYSxkKSxiJjQmJi0xPFFjLmluZGV4T2YoYSkpe2Zvcig7bnVsbCE9PWU7KXt2YXIgZj1CYihlKTtudWxsIT09ZiYmRGMoZik7Zj1YYyhhLGIsYyxkKTtudWxsPT09ZiYmZ2QoYSxiLGQsaGQsYyk7aWYoZj09PWUpYnJlYWs7ZT1mfW51bGwhPT1lJiZkLnN0b3BQcm9wYWdhdGlvbigpfWVsc2UgZ2QoYSxiLGQsbnVsbCxjKX19dmFyIGhkPW51bGw7XG5mdW5jdGlvbiBYYyhhLGIsYyxkKXtoZD1udWxsO2E9d2IoZCk7YT1WYyhhKTtpZihudWxsIT09YSlpZihiPVViKGEpLG51bGw9PT1iKWE9bnVsbDtlbHNlIGlmKGM9Yi50YWcsMTM9PT1jKXthPVZiKGIpO2lmKG51bGwhPT1hKXJldHVybiBhO2E9bnVsbH1lbHNlIGlmKDM9PT1jKXtpZihiLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiAzPT09Yi50YWc/Yi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO2E9bnVsbH1lbHNlIGIhPT1hJiYoYT1udWxsKTtoZD1hO3JldHVybiBudWxsfVxuZnVuY3Rpb24gaWQoYSl7c3dpdGNoKGEpe2Nhc2UgXCJjYW5jZWxcIjpjYXNlIFwiY2xpY2tcIjpjYXNlIFwiY2xvc2VcIjpjYXNlIFwiY29udGV4dG1lbnVcIjpjYXNlIFwiY29weVwiOmNhc2UgXCJjdXRcIjpjYXNlIFwiYXV4Y2xpY2tcIjpjYXNlIFwiZGJsY2xpY2tcIjpjYXNlIFwiZHJhZ2VuZFwiOmNhc2UgXCJkcmFnc3RhcnRcIjpjYXNlIFwiZHJvcFwiOmNhc2UgXCJmb2N1c2luXCI6Y2FzZSBcImZvY3Vzb3V0XCI6Y2FzZSBcImlucHV0XCI6Y2FzZSBcImludmFsaWRcIjpjYXNlIFwia2V5ZG93blwiOmNhc2UgXCJrZXlwcmVzc1wiOmNhc2UgXCJrZXl1cFwiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwibW91c2V1cFwiOmNhc2UgXCJwYXN0ZVwiOmNhc2UgXCJwYXVzZVwiOmNhc2UgXCJwbGF5XCI6Y2FzZSBcInBvaW50ZXJjYW5jZWxcIjpjYXNlIFwicG9pbnRlcmRvd25cIjpjYXNlIFwicG9pbnRlcnVwXCI6Y2FzZSBcInJhdGVjaGFuZ2VcIjpjYXNlIFwicmVzZXRcIjpjYXNlIFwicmVzaXplXCI6Y2FzZSBcInNlZWtlZFwiOmNhc2UgXCJzdWJtaXRcIjpjYXNlIFwidG91Y2hjYW5jZWxcIjpjYXNlIFwidG91Y2hlbmRcIjpjYXNlIFwidG91Y2hzdGFydFwiOmNhc2UgXCJ2b2x1bWVjaGFuZ2VcIjpjYXNlIFwiY2hhbmdlXCI6Y2FzZSBcInNlbGVjdGlvbmNoYW5nZVwiOmNhc2UgXCJ0ZXh0SW5wdXRcIjpjYXNlIFwiY29tcG9zaXRpb25zdGFydFwiOmNhc2UgXCJjb21wb3NpdGlvbmVuZFwiOmNhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOmNhc2UgXCJiZWZvcmVibHVyXCI6Y2FzZSBcImFmdGVyYmx1clwiOmNhc2UgXCJiZWZvcmVpbnB1dFwiOmNhc2UgXCJibHVyXCI6Y2FzZSBcImZ1bGxzY3JlZW5jaGFuZ2VcIjpjYXNlIFwiZm9jdXNcIjpjYXNlIFwiaGFzaGNoYW5nZVwiOmNhc2UgXCJwb3BzdGF0ZVwiOmNhc2UgXCJzZWxlY3RcIjpjYXNlIFwic2VsZWN0c3RhcnRcIjpyZXR1cm4gMTtjYXNlIFwiZHJhZ1wiOmNhc2UgXCJkcmFnZW50ZXJcIjpjYXNlIFwiZHJhZ2V4aXRcIjpjYXNlIFwiZHJhZ2xlYXZlXCI6Y2FzZSBcImRyYWdvdmVyXCI6Y2FzZSBcIm1vdXNlbW92ZVwiOmNhc2UgXCJtb3VzZW91dFwiOmNhc2UgXCJtb3VzZW92ZXJcIjpjYXNlIFwicG9pbnRlcm1vdmVcIjpjYXNlIFwicG9pbnRlcm91dFwiOmNhc2UgXCJwb2ludGVyb3ZlclwiOmNhc2UgXCJzY3JvbGxcIjpjYXNlIFwidG9nZ2xlXCI6Y2FzZSBcInRvdWNobW92ZVwiOmNhc2UgXCJ3aGVlbFwiOmNhc2UgXCJtb3VzZWVudGVyXCI6Y2FzZSBcIm1vdXNlbGVhdmVcIjpjYXNlIFwicG9pbnRlcmVudGVyXCI6Y2FzZSBcInBvaW50ZXJsZWF2ZVwiOnJldHVybiA0O1xuY2FzZSBcIm1lc3NhZ2VcIjpzd2l0Y2goZGMoKSl7Y2FzZSBlYzpyZXR1cm4gMTtjYXNlIGZjOnJldHVybiA0O2Nhc2UgZ2M6Y2FzZSBoYzpyZXR1cm4gMTY7Y2FzZSBpYzpyZXR1cm4gNTM2ODcwOTEyO2RlZmF1bHQ6cmV0dXJuIDE2fWRlZmF1bHQ6cmV0dXJuIDE2fX12YXIgamQ9bnVsbCxrZD1udWxsLGxkPW51bGw7ZnVuY3Rpb24gbWQoKXtpZihsZClyZXR1cm4gbGQ7dmFyIGEsYj1rZCxjPWIubGVuZ3RoLGQsZT1cInZhbHVlXCJpbiBqZD9qZC52YWx1ZTpqZC50ZXh0Q29udGVudCxmPWUubGVuZ3RoO2ZvcihhPTA7YTxjJiZiW2FdPT09ZVthXTthKyspO3ZhciBnPWMtYTtmb3IoZD0xO2Q8PWcmJmJbYy1kXT09PWVbZi1kXTtkKyspO3JldHVybiBsZD1lLnNsaWNlKGEsMTxkPzEtZDp2b2lkIDApfVxuZnVuY3Rpb24gbmQoYSl7dmFyIGI9YS5rZXlDb2RlO1wiY2hhckNvZGVcImluIGE/KGE9YS5jaGFyQ29kZSwwPT09YSYmMTM9PT1iJiYoYT0xMykpOmE9YjsxMD09PWEmJihhPTEzKTtyZXR1cm4gMzI8PWF8fDEzPT09YT9hOjB9ZnVuY3Rpb24gb2QoKXtyZXR1cm4hMH1mdW5jdGlvbiBwZCgpe3JldHVybiExfVxuZnVuY3Rpb24gcWQoYSl7ZnVuY3Rpb24gYihiLGQsZSxmLGcpe3RoaXMuX3JlYWN0TmFtZT1iO3RoaXMuX3RhcmdldEluc3Q9ZTt0aGlzLnR5cGU9ZDt0aGlzLm5hdGl2ZUV2ZW50PWY7dGhpcy50YXJnZXQ9Zzt0aGlzLmN1cnJlbnRUYXJnZXQ9bnVsbDtmb3IodmFyIGMgaW4gYSlhLmhhc093blByb3BlcnR5KGMpJiYoYj1hW2NdLHRoaXNbY109Yj9iKGYpOmZbY10pO3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPShudWxsIT1mLmRlZmF1bHRQcmV2ZW50ZWQ/Zi5kZWZhdWx0UHJldmVudGVkOiExPT09Zi5yZXR1cm5WYWx1ZSk/b2Q6cGQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1wZDtyZXR1cm4gdGhpc31BKGIucHJvdG90eXBlLHtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMDt2YXIgYT10aGlzLm5hdGl2ZUV2ZW50O2EmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTpcInVua25vd25cIiE9PXR5cGVvZiBhLnJldHVyblZhbHVlJiZcbihhLnJldHVyblZhbHVlPSExKSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1vZCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmF0aXZlRXZlbnQ7YSYmKGEuc3RvcFByb3BhZ2F0aW9uP2Euc3RvcFByb3BhZ2F0aW9uKCk6XCJ1bmtub3duXCIhPT10eXBlb2YgYS5jYW5jZWxCdWJibGUmJihhLmNhbmNlbEJ1YmJsZT0hMCksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1vZCl9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt9LGlzUGVyc2lzdGVudDpvZH0pO3JldHVybiBifVxudmFyIHJkPXtldmVudFBoYXNlOjAsYnViYmxlczowLGNhbmNlbGFibGU6MCx0aW1lU3RhbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOjAsaXNUcnVzdGVkOjB9LHNkPXFkKHJkKSx0ZD1BKHt9LHJkLHt2aWV3OjAsZGV0YWlsOjB9KSx1ZD1xZCh0ZCksdmQsd2QseGQsemQ9QSh7fSx0ZCx7c2NyZWVuWDowLHNjcmVlblk6MCxjbGllbnRYOjAsY2xpZW50WTowLHBhZ2VYOjAscGFnZVk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTp5ZCxidXR0b246MCxidXR0b25zOjAscmVsYXRlZFRhcmdldDpmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YS5yZWxhdGVkVGFyZ2V0P2EuZnJvbUVsZW1lbnQ9PT1hLnNyY0VsZW1lbnQ/YS50b0VsZW1lbnQ6YS5mcm9tRWxlbWVudDphLnJlbGF0ZWRUYXJnZXR9LG1vdmVtZW50WDpmdW5jdGlvbihhKXtpZihcIm1vdmVtZW50WFwiaW5cbmEpcmV0dXJuIGEubW92ZW1lbnRYO2EhPT14ZCYmKHhkJiZcIm1vdXNlbW92ZVwiPT09YS50eXBlPyh2ZD1hLnNjcmVlblgteGQuc2NyZWVuWCx3ZD1hLnNjcmVlblkteGQuc2NyZWVuWSk6d2Q9dmQ9MCx4ZD1hKTtyZXR1cm4gdmR9LG1vdmVtZW50WTpmdW5jdGlvbihhKXtyZXR1cm5cIm1vdmVtZW50WVwiaW4gYT9hLm1vdmVtZW50WTp3ZH19KSxBZD1xZCh6ZCksQmQ9QSh7fSx6ZCx7ZGF0YVRyYW5zZmVyOjB9KSxDZD1xZChCZCksRGQ9QSh7fSx0ZCx7cmVsYXRlZFRhcmdldDowfSksRWQ9cWQoRGQpLEZkPUEoe30scmQse2FuaW1hdGlvbk5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLEdkPXFkKEZkKSxIZD1BKHt9LHJkLHtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGEpe3JldHVyblwiY2xpcGJvYXJkRGF0YVwiaW4gYT9hLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fSksSWQ9cWQoSGQpLEpkPUEoe30scmQse2RhdGE6MH0pLEtkPXFkKEpkKSxMZD17RXNjOlwiRXNjYXBlXCIsXG5TcGFjZWJhcjpcIiBcIixMZWZ0OlwiQXJyb3dMZWZ0XCIsVXA6XCJBcnJvd1VwXCIsUmlnaHQ6XCJBcnJvd1JpZ2h0XCIsRG93bjpcIkFycm93RG93blwiLERlbDpcIkRlbGV0ZVwiLFdpbjpcIk9TXCIsTWVudTpcIkNvbnRleHRNZW51XCIsQXBwczpcIkNvbnRleHRNZW51XCIsU2Nyb2xsOlwiU2Nyb2xsTG9ja1wiLE1velByaW50YWJsZUtleTpcIlVuaWRlbnRpZmllZFwifSxNZD17ODpcIkJhY2tzcGFjZVwiLDk6XCJUYWJcIiwxMjpcIkNsZWFyXCIsMTM6XCJFbnRlclwiLDE2OlwiU2hpZnRcIiwxNzpcIkNvbnRyb2xcIiwxODpcIkFsdFwiLDE5OlwiUGF1c2VcIiwyMDpcIkNhcHNMb2NrXCIsMjc6XCJFc2NhcGVcIiwzMjpcIiBcIiwzMzpcIlBhZ2VVcFwiLDM0OlwiUGFnZURvd25cIiwzNTpcIkVuZFwiLDM2OlwiSG9tZVwiLDM3OlwiQXJyb3dMZWZ0XCIsMzg6XCJBcnJvd1VwXCIsMzk6XCJBcnJvd1JpZ2h0XCIsNDA6XCJBcnJvd0Rvd25cIiw0NTpcIkluc2VydFwiLDQ2OlwiRGVsZXRlXCIsMTEyOlwiRjFcIiwxMTM6XCJGMlwiLDExNDpcIkYzXCIsMTE1OlwiRjRcIiwxMTY6XCJGNVwiLDExNzpcIkY2XCIsMTE4OlwiRjdcIixcbjExOTpcIkY4XCIsMTIwOlwiRjlcIiwxMjE6XCJGMTBcIiwxMjI6XCJGMTFcIiwxMjM6XCJGMTJcIiwxNDQ6XCJOdW1Mb2NrXCIsMTQ1OlwiU2Nyb2xsTG9ja1wiLDIyNDpcIk1ldGFcIn0sTmQ9e0FsdDpcImFsdEtleVwiLENvbnRyb2w6XCJjdHJsS2V5XCIsTWV0YTpcIm1ldGFLZXlcIixTaGlmdDpcInNoaWZ0S2V5XCJ9O2Z1bmN0aW9uIE9kKGEpe3ZhciBiPXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIGIuZ2V0TW9kaWZpZXJTdGF0ZT9iLmdldE1vZGlmaWVyU3RhdGUoYSk6KGE9TmRbYV0pPyEhYlthXTohMX1mdW5jdGlvbiB5ZCgpe3JldHVybiBPZH1cbnZhciBQZD1BKHt9LHRkLHtrZXk6ZnVuY3Rpb24oYSl7aWYoYS5rZXkpe3ZhciBiPUxkW2Eua2V5XXx8YS5rZXk7aWYoXCJVbmlkZW50aWZpZWRcIiE9PWIpcmV0dXJuIGJ9cmV0dXJuXCJrZXlwcmVzc1wiPT09YS50eXBlPyhhPW5kKGEpLDEzPT09YT9cIkVudGVyXCI6U3RyaW5nLmZyb21DaGFyQ29kZShhKSk6XCJrZXlkb3duXCI9PT1hLnR5cGV8fFwia2V5dXBcIj09PWEudHlwZT9NZFthLmtleUNvZGVdfHxcIlVuaWRlbnRpZmllZFwiOlwiXCJ9LGNvZGU6MCxsb2NhdGlvbjowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxyZXBlYXQ6MCxsb2NhbGU6MCxnZXRNb2RpZmllclN0YXRlOnlkLGNoYXJDb2RlOmZ1bmN0aW9uKGEpe3JldHVyblwia2V5cHJlc3NcIj09PWEudHlwZT9uZChhKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGEpe3JldHVyblwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/YS5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKGEpe3JldHVyblwia2V5cHJlc3NcIj09PVxuYS50eXBlP25kKGEpOlwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/YS5rZXlDb2RlOjB9fSksUWQ9cWQoUGQpLFJkPUEoe30semQse3BvaW50ZXJJZDowLHdpZHRoOjAsaGVpZ2h0OjAscHJlc3N1cmU6MCx0YW5nZW50aWFsUHJlc3N1cmU6MCx0aWx0WDowLHRpbHRZOjAsdHdpc3Q6MCxwb2ludGVyVHlwZTowLGlzUHJpbWFyeTowfSksU2Q9cWQoUmQpLFRkPUEoe30sdGQse3RvdWNoZXM6MCx0YXJnZXRUb3VjaGVzOjAsY2hhbmdlZFRvdWNoZXM6MCxhbHRLZXk6MCxtZXRhS2V5OjAsY3RybEtleTowLHNoaWZ0S2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTp5ZH0pLFVkPXFkKFRkKSxWZD1BKHt9LHJkLHtwcm9wZXJ0eU5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLFdkPXFkKFZkKSxYZD1BKHt9LHpkLHtkZWx0YVg6ZnVuY3Rpb24oYSl7cmV0dXJuXCJkZWx0YVhcImluIGE/YS5kZWx0YVg6XCJ3aGVlbERlbHRhWFwiaW4gYT8tYS53aGVlbERlbHRhWDowfSxcbmRlbHRhWTpmdW5jdGlvbihhKXtyZXR1cm5cImRlbHRhWVwiaW4gYT9hLmRlbHRhWTpcIndoZWVsRGVsdGFZXCJpbiBhPy1hLndoZWVsRGVsdGFZOlwid2hlZWxEZWx0YVwiaW4gYT8tYS53aGVlbERlbHRhOjB9LGRlbHRhWjowLGRlbHRhTW9kZTowfSksWWQ9cWQoWGQpLFpkPVs5LDEzLDI3LDMyXSwkZD1pYSYmXCJDb21wb3NpdGlvbkV2ZW50XCJpbiB3aW5kb3csYWU9bnVsbDtpYSYmXCJkb2N1bWVudE1vZGVcImluIGRvY3VtZW50JiYoYWU9ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTt2YXIgYmU9aWEmJlwiVGV4dEV2ZW50XCJpbiB3aW5kb3cmJiFhZSxjZT1pYSYmKCEkZHx8YWUmJjg8YWUmJjExPj1hZSksZGU9U3RyaW5nLmZyb21DaGFyQ29kZSgzMiksZWU9ITE7XG5mdW5jdGlvbiBmZShhLGIpe3N3aXRjaChhKXtjYXNlIFwia2V5dXBcIjpyZXR1cm4tMSE9PVpkLmluZGV4T2YoYi5rZXlDb2RlKTtjYXNlIFwia2V5ZG93blwiOnJldHVybiAyMjkhPT1iLmtleUNvZGU7Y2FzZSBcImtleXByZXNzXCI6Y2FzZSBcIm1vdXNlZG93blwiOmNhc2UgXCJmb2N1c291dFwiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIGdlKGEpe2E9YS5kZXRhaWw7cmV0dXJuXCJvYmplY3RcIj09PXR5cGVvZiBhJiZcImRhdGFcImluIGE/YS5kYXRhOm51bGx9dmFyIGhlPSExO2Z1bmN0aW9uIGllKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOnJldHVybiBnZShiKTtjYXNlIFwia2V5cHJlc3NcIjppZigzMiE9PWIud2hpY2gpcmV0dXJuIG51bGw7ZWU9ITA7cmV0dXJuIGRlO2Nhc2UgXCJ0ZXh0SW5wdXRcIjpyZXR1cm4gYT1iLmRhdGEsYT09PWRlJiZlZT9udWxsOmE7ZGVmYXVsdDpyZXR1cm4gbnVsbH19XG5mdW5jdGlvbiBqZShhLGIpe2lmKGhlKXJldHVyblwiY29tcG9zaXRpb25lbmRcIj09PWF8fCEkZCYmZmUoYSxiKT8oYT1tZCgpLGxkPWtkPWpkPW51bGwsaGU9ITEsYSk6bnVsbDtzd2l0Y2goYSl7Y2FzZSBcInBhc3RlXCI6cmV0dXJuIG51bGw7Y2FzZSBcImtleXByZXNzXCI6aWYoIShiLmN0cmxLZXl8fGIuYWx0S2V5fHxiLm1ldGFLZXkpfHxiLmN0cmxLZXkmJmIuYWx0S2V5KXtpZihiLmNoYXImJjE8Yi5jaGFyLmxlbmd0aClyZXR1cm4gYi5jaGFyO2lmKGIud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYi53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6cmV0dXJuIGNlJiZcImtvXCIhPT1iLmxvY2FsZT9udWxsOmIuZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX1cbnZhciBrZT17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCxcImRhdGV0aW1lLWxvY2FsXCI6ITAsZW1haWw6ITAsbW9udGg6ITAsbnVtYmVyOiEwLHBhc3N3b3JkOiEwLHJhbmdlOiEwLHNlYXJjaDohMCx0ZWw6ITAsdGV4dDohMCx0aW1lOiEwLHVybDohMCx3ZWVrOiEwfTtmdW5jdGlvbiBsZShhKXt2YXIgYj1hJiZhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCJpbnB1dFwiPT09Yj8hIWtlW2EudHlwZV06XCJ0ZXh0YXJlYVwiPT09Yj8hMDohMX1mdW5jdGlvbiBtZShhLGIsYyxkKXtEYihkKTtiPW5lKGIsXCJvbkNoYW5nZVwiKTswPGIubGVuZ3RoJiYoYz1uZXcgc2QoXCJvbkNoYW5nZVwiLFwiY2hhbmdlXCIsbnVsbCxjLGQpLGEucHVzaCh7ZXZlbnQ6YyxsaXN0ZW5lcnM6Yn0pKX12YXIgb2U9bnVsbCxwZT1udWxsO2Z1bmN0aW9uIHFlKGEpe3JlKGEsMCl9ZnVuY3Rpb24gc2UoYSl7dmFyIGI9dGUoYSk7aWYoVmEoYikpcmV0dXJuIGF9XG5mdW5jdGlvbiB1ZShhLGIpe2lmKFwiY2hhbmdlXCI9PT1hKXJldHVybiBifXZhciB2ZT0hMTtpZihpYSl7dmFyIHdlO2lmKGlhKXt2YXIgeGU9XCJvbmlucHV0XCJpbiBkb2N1bWVudDtpZigheGUpe3ZhciB5ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3llLnNldEF0dHJpYnV0ZShcIm9uaW5wdXRcIixcInJldHVybjtcIik7eGU9XCJmdW5jdGlvblwiPT09dHlwZW9mIHllLm9uaW5wdXR9d2U9eGV9ZWxzZSB3ZT0hMTt2ZT13ZSYmKCFkb2N1bWVudC5kb2N1bWVudE1vZGV8fDk8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlKX1mdW5jdGlvbiB6ZSgpe29lJiYob2UuZGV0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsQWUpLHBlPW9lPW51bGwpfWZ1bmN0aW9uIEFlKGEpe2lmKFwidmFsdWVcIj09PWEucHJvcGVydHlOYW1lJiZzZShwZSkpe3ZhciBiPVtdO21lKGIscGUsYSx3YihhKSk7SWIocWUsYil9fVxuZnVuY3Rpb24gQmUoYSxiLGMpe1wiZm9jdXNpblwiPT09YT8oemUoKSxvZT1iLHBlPWMsb2UuYXR0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsQWUpKTpcImZvY3Vzb3V0XCI9PT1hJiZ6ZSgpfWZ1bmN0aW9uIENlKGEpe2lmKFwic2VsZWN0aW9uY2hhbmdlXCI9PT1hfHxcImtleXVwXCI9PT1hfHxcImtleWRvd25cIj09PWEpcmV0dXJuIHNlKHBlKX1mdW5jdGlvbiBEZShhLGIpe2lmKFwiY2xpY2tcIj09PWEpcmV0dXJuIHNlKGIpfWZ1bmN0aW9uIEVlKGEsYil7aWYoXCJpbnB1dFwiPT09YXx8XCJjaGFuZ2VcIj09PWEpcmV0dXJuIHNlKGIpfWZ1bmN0aW9uIEZlKGEsYil7cmV0dXJuIGE9PT1iJiYoMCE9PWF8fDEvYT09PTEvYil8fGEhPT1hJiZiIT09Yn12YXIgR2U9XCJmdW5jdGlvblwiPT09dHlwZW9mIE9iamVjdC5pcz9PYmplY3QuaXM6RmU7XG5mdW5jdGlvbiBIZShhLGIpe2lmKEdlKGEsYikpcmV0dXJuITA7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBhfHxudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBifHxudWxsPT09YilyZXR1cm4hMTt2YXIgYz1PYmplY3Qua2V5cyhhKSxkPU9iamVjdC5rZXlzKGIpO2lmKGMubGVuZ3RoIT09ZC5sZW5ndGgpcmV0dXJuITE7Zm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTtpZighamEuY2FsbChiLGUpfHwhR2UoYVtlXSxiW2VdKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBJZShhKXtmb3IoO2EmJmEuZmlyc3RDaGlsZDspYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9XG5mdW5jdGlvbiBKZShhLGIpe3ZhciBjPUllKGEpO2E9MDtmb3IodmFyIGQ7Yzspe2lmKDM9PT1jLm5vZGVUeXBlKXtkPWErYy50ZXh0Q29udGVudC5sZW5ndGg7aWYoYTw9YiYmZD49YilyZXR1cm57bm9kZTpjLG9mZnNldDpiLWF9O2E9ZH1hOntmb3IoO2M7KXtpZihjLm5leHRTaWJsaW5nKXtjPWMubmV4dFNpYmxpbmc7YnJlYWsgYX1jPWMucGFyZW50Tm9kZX1jPXZvaWQgMH1jPUllKGMpfX1mdW5jdGlvbiBLZShhLGIpe3JldHVybiBhJiZiP2E9PT1iPyEwOmEmJjM9PT1hLm5vZGVUeXBlPyExOmImJjM9PT1iLm5vZGVUeXBlP0tlKGEsYi5wYXJlbnROb2RlKTpcImNvbnRhaW5zXCJpbiBhP2EuY29udGFpbnMoYik6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2KTohMTohMX1cbmZ1bmN0aW9uIExlKCl7Zm9yKHZhciBhPXdpbmRvdyxiPVdhKCk7YiBpbnN0YW5jZW9mIGEuSFRNTElGcmFtZUVsZW1lbnQ7KXt0cnl7dmFyIGM9XCJzdHJpbmdcIj09PXR5cGVvZiBiLmNvbnRlbnRXaW5kb3cubG9jYXRpb24uaHJlZn1jYXRjaChkKXtjPSExfWlmKGMpYT1iLmNvbnRlbnRXaW5kb3c7ZWxzZSBicmVhaztiPVdhKGEuZG9jdW1lbnQpfXJldHVybiBifWZ1bmN0aW9uIE1lKGEpe3ZhciBiPWEmJmEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYiYmKFwiaW5wdXRcIj09PWImJihcInRleHRcIj09PWEudHlwZXx8XCJzZWFyY2hcIj09PWEudHlwZXx8XCJ0ZWxcIj09PWEudHlwZXx8XCJ1cmxcIj09PWEudHlwZXx8XCJwYXNzd29yZFwiPT09YS50eXBlKXx8XCJ0ZXh0YXJlYVwiPT09Ynx8XCJ0cnVlXCI9PT1hLmNvbnRlbnRFZGl0YWJsZSl9XG5mdW5jdGlvbiBOZShhKXt2YXIgYj1MZSgpLGM9YS5mb2N1c2VkRWxlbSxkPWEuc2VsZWN0aW9uUmFuZ2U7aWYoYiE9PWMmJmMmJmMub3duZXJEb2N1bWVudCYmS2UoYy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxjKSl7aWYobnVsbCE9PWQmJk1lKGMpKWlmKGI9ZC5zdGFydCxhPWQuZW5kLHZvaWQgMD09PWEmJihhPWIpLFwic2VsZWN0aW9uU3RhcnRcImluIGMpYy5zZWxlY3Rpb25TdGFydD1iLGMuc2VsZWN0aW9uRW5kPU1hdGgubWluKGEsYy52YWx1ZS5sZW5ndGgpO2Vsc2UgaWYoYT0oYj1jLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmYi5kZWZhdWx0Vmlld3x8d2luZG93LGEuZ2V0U2VsZWN0aW9uKXthPWEuZ2V0U2VsZWN0aW9uKCk7dmFyIGU9Yy50ZXh0Q29udGVudC5sZW5ndGgsZj1NYXRoLm1pbihkLnN0YXJ0LGUpO2Q9dm9pZCAwPT09ZC5lbmQ/ZjpNYXRoLm1pbihkLmVuZCxlKTshYS5leHRlbmQmJmY+ZCYmKGU9ZCxkPWYsZj1lKTtlPUplKGMsZik7dmFyIGc9SmUoYyxcbmQpO2UmJmcmJigxIT09YS5yYW5nZUNvdW50fHxhLmFuY2hvck5vZGUhPT1lLm5vZGV8fGEuYW5jaG9yT2Zmc2V0IT09ZS5vZmZzZXR8fGEuZm9jdXNOb2RlIT09Zy5ub2RlfHxhLmZvY3VzT2Zmc2V0IT09Zy5vZmZzZXQpJiYoYj1iLmNyZWF0ZVJhbmdlKCksYi5zZXRTdGFydChlLm5vZGUsZS5vZmZzZXQpLGEucmVtb3ZlQWxsUmFuZ2VzKCksZj5kPyhhLmFkZFJhbmdlKGIpLGEuZXh0ZW5kKGcubm9kZSxnLm9mZnNldCkpOihiLnNldEVuZChnLm5vZGUsZy5vZmZzZXQpLGEuYWRkUmFuZ2UoYikpKX1iPVtdO2ZvcihhPWM7YT1hLnBhcmVudE5vZGU7KTE9PT1hLm5vZGVUeXBlJiZiLnB1c2goe2VsZW1lbnQ6YSxsZWZ0OmEuc2Nyb2xsTGVmdCx0b3A6YS5zY3JvbGxUb3B9KTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5mb2N1cyYmYy5mb2N1cygpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYT1iW2NdLGEuZWxlbWVudC5zY3JvbGxMZWZ0PWEubGVmdCxhLmVsZW1lbnQuc2Nyb2xsVG9wPWEudG9wfX1cbnZhciBPZT1pYSYmXCJkb2N1bWVudE1vZGVcImluIGRvY3VtZW50JiYxMT49ZG9jdW1lbnQuZG9jdW1lbnRNb2RlLFBlPW51bGwsUWU9bnVsbCxSZT1udWxsLFNlPSExO1xuZnVuY3Rpb24gVGUoYSxiLGMpe3ZhciBkPWMud2luZG93PT09Yz9jLmRvY3VtZW50Ojk9PT1jLm5vZGVUeXBlP2M6Yy5vd25lckRvY3VtZW50O1NlfHxudWxsPT1QZXx8UGUhPT1XYShkKXx8KGQ9UGUsXCJzZWxlY3Rpb25TdGFydFwiaW4gZCYmTWUoZCk/ZD17c3RhcnQ6ZC5zZWxlY3Rpb25TdGFydCxlbmQ6ZC5zZWxlY3Rpb25FbmR9OihkPShkLm93bmVyRG9jdW1lbnQmJmQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKSxkPXthbmNob3JOb2RlOmQuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6ZC5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOmQuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OmQuZm9jdXNPZmZzZXR9KSxSZSYmSGUoUmUsZCl8fChSZT1kLGQ9bmUoUWUsXCJvblNlbGVjdFwiKSwwPGQubGVuZ3RoJiYoYj1uZXcgc2QoXCJvblNlbGVjdFwiLFwic2VsZWN0XCIsbnVsbCxiLGMpLGEucHVzaCh7ZXZlbnQ6YixsaXN0ZW5lcnM6ZH0pLGIudGFyZ2V0PVBlKSkpfVxuZnVuY3Rpb24gVWUoYSxiKXt2YXIgYz17fTtjW2EudG9Mb3dlckNhc2UoKV09Yi50b0xvd2VyQ2FzZSgpO2NbXCJXZWJraXRcIithXT1cIndlYmtpdFwiK2I7Y1tcIk1velwiK2FdPVwibW96XCIrYjtyZXR1cm4gY312YXIgVmU9e2FuaW1hdGlvbmVuZDpVZShcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uRW5kXCIpLGFuaW1hdGlvbml0ZXJhdGlvbjpVZShcIkFuaW1hdGlvblwiLFwiQW5pbWF0aW9uSXRlcmF0aW9uXCIpLGFuaW1hdGlvbnN0YXJ0OlVlKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25TdGFydFwiKSx0cmFuc2l0aW9uZW5kOlVlKFwiVHJhbnNpdGlvblwiLFwiVHJhbnNpdGlvbkVuZFwiKX0sV2U9e30sWGU9e307XG5pYSYmKFhlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikuc3R5bGUsXCJBbmltYXRpb25FdmVudFwiaW4gd2luZG93fHwoZGVsZXRlIFZlLmFuaW1hdGlvbmVuZC5hbmltYXRpb24sZGVsZXRlIFZlLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRlIFZlLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbiksXCJUcmFuc2l0aW9uRXZlbnRcImluIHdpbmRvd3x8ZGVsZXRlIFZlLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gWWUoYSl7aWYoV2VbYV0pcmV0dXJuIFdlW2FdO2lmKCFWZVthXSlyZXR1cm4gYTt2YXIgYj1WZVthXSxjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSYmYyBpbiBYZSlyZXR1cm4gV2VbYV09YltjXTtyZXR1cm4gYX12YXIgWmU9WWUoXCJhbmltYXRpb25lbmRcIiksJGU9WWUoXCJhbmltYXRpb25pdGVyYXRpb25cIiksYWY9WWUoXCJhbmltYXRpb25zdGFydFwiKSxiZj1ZZShcInRyYW5zaXRpb25lbmRcIiksY2Y9bmV3IE1hcCxkZj1cImFib3J0IGF1eENsaWNrIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsXCIuc3BsaXQoXCIgXCIpO1xuZnVuY3Rpb24gZWYoYSxiKXtjZi5zZXQoYSxiKTtmYShiLFthXSl9Zm9yKHZhciBmZj0wO2ZmPGRmLmxlbmd0aDtmZisrKXt2YXIgZ2Y9ZGZbZmZdLGhmPWdmLnRvTG93ZXJDYXNlKCksamY9Z2ZbMF0udG9VcHBlckNhc2UoKStnZi5zbGljZSgxKTtlZihoZixcIm9uXCIramYpfWVmKFplLFwib25BbmltYXRpb25FbmRcIik7ZWYoJGUsXCJvbkFuaW1hdGlvbkl0ZXJhdGlvblwiKTtlZihhZixcIm9uQW5pbWF0aW9uU3RhcnRcIik7ZWYoXCJkYmxjbGlja1wiLFwib25Eb3VibGVDbGlja1wiKTtlZihcImZvY3VzaW5cIixcIm9uRm9jdXNcIik7ZWYoXCJmb2N1c291dFwiLFwib25CbHVyXCIpO2VmKGJmLFwib25UcmFuc2l0aW9uRW5kXCIpO2hhKFwib25Nb3VzZUVudGVyXCIsW1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXSk7aGEoXCJvbk1vdXNlTGVhdmVcIixbXCJtb3VzZW91dFwiLFwibW91c2VvdmVyXCJdKTtoYShcIm9uUG9pbnRlckVudGVyXCIsW1wicG9pbnRlcm91dFwiLFwicG9pbnRlcm92ZXJcIl0pO1xuaGEoXCJvblBvaW50ZXJMZWF2ZVwiLFtcInBvaW50ZXJvdXRcIixcInBvaW50ZXJvdmVyXCJdKTtmYShcIm9uQ2hhbmdlXCIsXCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFwiIFwiKSk7ZmEoXCJvblNlbGVjdFwiLFwiZm9jdXNvdXQgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1c2luIGtleWRvd24ga2V5dXAgbW91c2Vkb3duIG1vdXNldXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXCIgXCIpKTtmYShcIm9uQmVmb3JlSW5wdXRcIixbXCJjb21wb3NpdGlvbmVuZFwiLFwia2V5cHJlc3NcIixcInRleHRJbnB1dFwiLFwicGFzdGVcIl0pO2ZhKFwib25Db21wb3NpdGlvbkVuZFwiLFwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO2ZhKFwib25Db21wb3NpdGlvblN0YXJ0XCIsXCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpKTtcbmZhKFwib25Db21wb3NpdGlvblVwZGF0ZVwiLFwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIikpO3ZhciBrZj1cImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nXCIuc3BsaXQoXCIgXCIpLGxmPW5ldyBTZXQoXCJjYW5jZWwgY2xvc2UgaW52YWxpZCBsb2FkIHNjcm9sbCB0b2dnbGVcIi5zcGxpdChcIiBcIikuY29uY2F0KGtmKSk7XG5mdW5jdGlvbiBtZihhLGIsYyl7dmFyIGQ9YS50eXBlfHxcInVua25vd24tZXZlbnRcIjthLmN1cnJlbnRUYXJnZXQ9YztUYihkLGIsdm9pZCAwLGEpO2EuY3VycmVudFRhcmdldD1udWxsfVxuZnVuY3Rpb24gcmUoYSxiKXtiPTAhPT0oYiY0KTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXSxlPWQuZXZlbnQ7ZD1kLmxpc3RlbmVyczthOnt2YXIgZj12b2lkIDA7aWYoYilmb3IodmFyIGc9ZC5sZW5ndGgtMTswPD1nO2ctLSl7dmFyIGg9ZFtnXSxrPWguaW5zdGFuY2UsbD1oLmN1cnJlbnRUYXJnZXQ7aD1oLmxpc3RlbmVyO2lmKGshPT1mJiZlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgYTttZihlLGgsbCk7Zj1rfWVsc2UgZm9yKGc9MDtnPGQubGVuZ3RoO2crKyl7aD1kW2ddO2s9aC5pbnN0YW5jZTtsPWguY3VycmVudFRhcmdldDtoPWgubGlzdGVuZXI7aWYoayE9PWYmJmUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBhO21mKGUsaCxsKTtmPWt9fX1pZihQYil0aHJvdyBhPVFiLFBiPSExLFFiPW51bGwsYTt9XG5mdW5jdGlvbiBEKGEsYil7dmFyIGM9YltuZl07dm9pZCAwPT09YyYmKGM9YltuZl09bmV3IFNldCk7dmFyIGQ9YStcIl9fYnViYmxlXCI7Yy5oYXMoZCl8fChvZihiLGEsMiwhMSksYy5hZGQoZCkpfWZ1bmN0aW9uIHBmKGEsYixjKXt2YXIgZD0wO2ImJihkfD00KTtvZihjLGEsZCxiKX12YXIgcWY9XCJfcmVhY3RMaXN0ZW5pbmdcIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiByZihhKXtpZighYVtxZl0pe2FbcWZdPSEwO2RhLmZvckVhY2goZnVuY3Rpb24oYil7XCJzZWxlY3Rpb25jaGFuZ2VcIiE9PWImJihsZi5oYXMoYil8fHBmKGIsITEsYSkscGYoYiwhMCxhKSl9KTt2YXIgYj05PT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudDtudWxsPT09Ynx8YltxZl18fChiW3FmXT0hMCxwZihcInNlbGVjdGlvbmNoYW5nZVwiLCExLGIpKX19XG5mdW5jdGlvbiBvZihhLGIsYyxkKXtzd2l0Y2goaWQoYikpe2Nhc2UgMTp2YXIgZT1kZDticmVhaztjYXNlIDQ6ZT1mZDticmVhaztkZWZhdWx0OmU9ZWR9Yz1lLmJpbmQobnVsbCxiLGMsYSk7ZT12b2lkIDA7IUtifHxcInRvdWNoc3RhcnRcIiE9PWImJlwidG91Y2htb3ZlXCIhPT1iJiZcIndoZWVsXCIhPT1ifHwoZT0hMCk7ZD92b2lkIDAhPT1lP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGMse2NhcHR1cmU6ITAscGFzc2l2ZTplfSk6YS5hZGRFdmVudExpc3RlbmVyKGIsYywhMCk6dm9pZCAwIT09ZT9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLHtwYXNzaXZlOmV9KTphLmFkZEV2ZW50TGlzdGVuZXIoYixjLCExKX1cbmZ1bmN0aW9uIGdkKGEsYixjLGQsZSl7dmFyIGY9ZDtpZigwPT09KGImMSkmJjA9PT0oYiYyKSYmbnVsbCE9PWQpYTpmb3IoOzspe2lmKG51bGw9PT1kKXJldHVybjt2YXIgZz1kLnRhZztpZigzPT09Z3x8ND09PWcpe3ZhciBoPWQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87aWYoaD09PWV8fDg9PT1oLm5vZGVUeXBlJiZoLnBhcmVudE5vZGU9PT1lKWJyZWFrO2lmKDQ9PT1nKWZvcihnPWQucmV0dXJuO251bGwhPT1nOyl7dmFyIGs9Zy50YWc7aWYoMz09PWt8fDQ9PT1rKWlmKGs9Zy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxrPT09ZXx8OD09PWsubm9kZVR5cGUmJmsucGFyZW50Tm9kZT09PWUpcmV0dXJuO2c9Zy5yZXR1cm59Zm9yKDtudWxsIT09aDspe2c9VmMoaCk7aWYobnVsbD09PWcpcmV0dXJuO2s9Zy50YWc7aWYoNT09PWt8fDY9PT1rKXtkPWY9Zztjb250aW51ZSBhfWg9aC5wYXJlbnROb2RlfX1kPWQucmV0dXJufUliKGZ1bmN0aW9uKCl7dmFyIGQ9ZixlPXdiKGMpLGc9W107XG5hOnt2YXIgaD1jZi5nZXQoYSk7aWYodm9pZCAwIT09aCl7dmFyIGs9c2QsbT1hO3N3aXRjaChhKXtjYXNlIFwia2V5cHJlc3NcIjppZigwPT09bmQoYykpYnJlYWsgYTtjYXNlIFwia2V5ZG93blwiOmNhc2UgXCJrZXl1cFwiOms9UWQ7YnJlYWs7Y2FzZSBcImZvY3VzaW5cIjptPVwiZm9jdXNcIjtrPUVkO2JyZWFrO2Nhc2UgXCJmb2N1c291dFwiOm09XCJibHVyXCI7az1FZDticmVhaztjYXNlIFwiYmVmb3JlYmx1clwiOmNhc2UgXCJhZnRlcmJsdXJcIjprPUVkO2JyZWFrO2Nhc2UgXCJjbGlja1wiOmlmKDI9PT1jLmJ1dHRvbilicmVhayBhO2Nhc2UgXCJhdXhjbGlja1wiOmNhc2UgXCJkYmxjbGlja1wiOmNhc2UgXCJtb3VzZWRvd25cIjpjYXNlIFwibW91c2Vtb3ZlXCI6Y2FzZSBcIm1vdXNldXBcIjpjYXNlIFwibW91c2VvdXRcIjpjYXNlIFwibW91c2VvdmVyXCI6Y2FzZSBcImNvbnRleHRtZW51XCI6az1BZDticmVhaztjYXNlIFwiZHJhZ1wiOmNhc2UgXCJkcmFnZW5kXCI6Y2FzZSBcImRyYWdlbnRlclwiOmNhc2UgXCJkcmFnZXhpdFwiOmNhc2UgXCJkcmFnbGVhdmVcIjpjYXNlIFwiZHJhZ292ZXJcIjpjYXNlIFwiZHJhZ3N0YXJ0XCI6Y2FzZSBcImRyb3BcIjprPVxuQ2Q7YnJlYWs7Y2FzZSBcInRvdWNoY2FuY2VsXCI6Y2FzZSBcInRvdWNoZW5kXCI6Y2FzZSBcInRvdWNobW92ZVwiOmNhc2UgXCJ0b3VjaHN0YXJ0XCI6az1VZDticmVhaztjYXNlIFplOmNhc2UgJGU6Y2FzZSBhZjprPUdkO2JyZWFrO2Nhc2UgYmY6az1XZDticmVhaztjYXNlIFwic2Nyb2xsXCI6az11ZDticmVhaztjYXNlIFwid2hlZWxcIjprPVlkO2JyZWFrO2Nhc2UgXCJjb3B5XCI6Y2FzZSBcImN1dFwiOmNhc2UgXCJwYXN0ZVwiOms9SWQ7YnJlYWs7Y2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6Y2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJwb2ludGVyY2FuY2VsXCI6Y2FzZSBcInBvaW50ZXJkb3duXCI6Y2FzZSBcInBvaW50ZXJtb3ZlXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpjYXNlIFwicG9pbnRlcm92ZXJcIjpjYXNlIFwicG9pbnRlcnVwXCI6az1TZH12YXIgdz0wIT09KGImNCksSj0hdyYmXCJzY3JvbGxcIj09PWEsdj13P251bGwhPT1oP2grXCJDYXB0dXJlXCI6bnVsbDpoO3c9W107Zm9yKHZhciB4PWQscjtudWxsIT09XG54Oyl7cj14O3ZhciBGPXIuc3RhdGVOb2RlOzU9PT1yLnRhZyYmbnVsbCE9PUYmJihyPUYsbnVsbCE9PXYmJihGPUpiKHgsdiksbnVsbCE9RiYmdy5wdXNoKHNmKHgsRixyKSkpKTtpZihKKWJyZWFrO3g9eC5yZXR1cm59MDx3Lmxlbmd0aCYmKGg9bmV3IGsoaCxtLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmgsbGlzdGVuZXJzOnd9KSl9fWlmKDA9PT0oYiY3KSl7YTp7aD1cIm1vdXNlb3ZlclwiPT09YXx8XCJwb2ludGVyb3ZlclwiPT09YTtrPVwibW91c2VvdXRcIj09PWF8fFwicG9pbnRlcm91dFwiPT09YTtpZihoJiZjIT09dmImJihtPWMucmVsYXRlZFRhcmdldHx8Yy5mcm9tRWxlbWVudCkmJihWYyhtKXx8bVt0Zl0pKWJyZWFrIGE7aWYoa3x8aCl7aD1lLndpbmRvdz09PWU/ZTooaD1lLm93bmVyRG9jdW1lbnQpP2guZGVmYXVsdFZpZXd8fGgucGFyZW50V2luZG93OndpbmRvdztpZihrKXtpZihtPWMucmVsYXRlZFRhcmdldHx8Yy50b0VsZW1lbnQsaz1kLG09bT9WYyhtKTpudWxsLG51bGwhPT1cbm0mJihKPVViKG0pLG0hPT1KfHw1IT09bS50YWcmJjYhPT1tLnRhZykpbT1udWxsfWVsc2Ugaz1udWxsLG09ZDtpZihrIT09bSl7dz1BZDtGPVwib25Nb3VzZUxlYXZlXCI7dj1cIm9uTW91c2VFbnRlclwiO3g9XCJtb3VzZVwiO2lmKFwicG9pbnRlcm91dFwiPT09YXx8XCJwb2ludGVyb3ZlclwiPT09YSl3PVNkLEY9XCJvblBvaW50ZXJMZWF2ZVwiLHY9XCJvblBvaW50ZXJFbnRlclwiLHg9XCJwb2ludGVyXCI7Sj1udWxsPT1rP2g6dGUoayk7cj1udWxsPT1tP2g6dGUobSk7aD1uZXcgdyhGLHgrXCJsZWF2ZVwiLGssYyxlKTtoLnRhcmdldD1KO2gucmVsYXRlZFRhcmdldD1yO0Y9bnVsbDtWYyhlKT09PWQmJih3PW5ldyB3KHYseCtcImVudGVyXCIsbSxjLGUpLHcudGFyZ2V0PXIsdy5yZWxhdGVkVGFyZ2V0PUosRj13KTtKPUY7aWYoayYmbSliOnt3PWs7dj1tO3g9MDtmb3Iocj13O3I7cj11ZihyKSl4Kys7cj0wO2ZvcihGPXY7RjtGPXVmKEYpKXIrKztmb3IoOzA8eC1yOyl3PXVmKHcpLHgtLTtmb3IoOzA8ci14Oyl2PVxudWYodiksci0tO2Zvcig7eC0tOyl7aWYodz09PXZ8fG51bGwhPT12JiZ3PT09di5hbHRlcm5hdGUpYnJlYWsgYjt3PXVmKHcpO3Y9dWYodil9dz1udWxsfWVsc2Ugdz1udWxsO251bGwhPT1rJiZ2ZihnLGgsayx3LCExKTtudWxsIT09bSYmbnVsbCE9PUomJnZmKGcsSixtLHcsITApfX19YTp7aD1kP3RlKGQpOndpbmRvdztrPWgubm9kZU5hbWUmJmgubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihcInNlbGVjdFwiPT09a3x8XCJpbnB1dFwiPT09ayYmXCJmaWxlXCI9PT1oLnR5cGUpdmFyIFo9dWU7ZWxzZSBpZihsZShoKSlpZih2ZSlaPUVlO2Vsc2V7Wj1DZTt2YXIgeWE9QmV9ZWxzZShrPWgubm9kZU5hbWUpJiZcImlucHV0XCI9PT1rLnRvTG93ZXJDYXNlKCkmJihcImNoZWNrYm94XCI9PT1oLnR5cGV8fFwicmFkaW9cIj09PWgudHlwZSkmJihaPURlKTtpZihaJiYoWj1aKGEsZCkpKXttZShnLFosYyxlKTticmVhayBhfXlhJiZ5YShhLGgsZCk7XCJmb2N1c291dFwiPT09YSYmKHlhPWguX3dyYXBwZXJTdGF0ZSkmJlxueWEuY29udHJvbGxlZCYmXCJudW1iZXJcIj09PWgudHlwZSYmYmIoaCxcIm51bWJlclwiLGgudmFsdWUpfXlhPWQ/dGUoZCk6d2luZG93O3N3aXRjaChhKXtjYXNlIFwiZm9jdXNpblwiOmlmKGxlKHlhKXx8XCJ0cnVlXCI9PT15YS5jb250ZW50RWRpdGFibGUpUGU9eWEsUWU9ZCxSZT1udWxsO2JyZWFrO2Nhc2UgXCJmb2N1c291dFwiOlJlPVFlPVBlPW51bGw7YnJlYWs7Y2FzZSBcIm1vdXNlZG93blwiOlNlPSEwO2JyZWFrO2Nhc2UgXCJjb250ZXh0bWVudVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcImRyYWdlbmRcIjpTZT0hMTtUZShnLGMsZSk7YnJlYWs7Y2FzZSBcInNlbGVjdGlvbmNoYW5nZVwiOmlmKE9lKWJyZWFrO2Nhc2UgXCJrZXlkb3duXCI6Y2FzZSBcImtleXVwXCI6VGUoZyxjLGUpfXZhciBhYjtpZigkZCliOntzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjp2YXIgY2E9XCJvbkNvbXBvc2l0aW9uU3RhcnRcIjticmVhayBiO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOmNhPVwib25Db21wb3NpdGlvbkVuZFwiO1xuYnJlYWsgYjtjYXNlIFwiY29tcG9zaXRpb251cGRhdGVcIjpjYT1cIm9uQ29tcG9zaXRpb25VcGRhdGVcIjticmVhayBifWNhPXZvaWQgMH1lbHNlIGhlP2ZlKGEsYykmJihjYT1cIm9uQ29tcG9zaXRpb25FbmRcIik6XCJrZXlkb3duXCI9PT1hJiYyMjk9PT1jLmtleUNvZGUmJihjYT1cIm9uQ29tcG9zaXRpb25TdGFydFwiKTtjYSYmKGNlJiZcImtvXCIhPT1jLmxvY2FsZSYmKGhlfHxcIm9uQ29tcG9zaXRpb25TdGFydFwiIT09Y2E/XCJvbkNvbXBvc2l0aW9uRW5kXCI9PT1jYSYmaGUmJihhYj1tZCgpKTooamQ9ZSxrZD1cInZhbHVlXCJpbiBqZD9qZC52YWx1ZTpqZC50ZXh0Q29udGVudCxoZT0hMCkpLHlhPW5lKGQsY2EpLDA8eWEubGVuZ3RoJiYoY2E9bmV3IEtkKGNhLGEsbnVsbCxjLGUpLGcucHVzaCh7ZXZlbnQ6Y2EsbGlzdGVuZXJzOnlhfSksYWI/Y2EuZGF0YT1hYjooYWI9Z2UoYyksbnVsbCE9PWFiJiYoY2EuZGF0YT1hYikpKSk7aWYoYWI9YmU/aWUoYSxjKTpqZShhLGMpKWQ9bmUoZCxcIm9uQmVmb3JlSW5wdXRcIiksXG4wPGQubGVuZ3RoJiYoZT1uZXcgS2QoXCJvbkJlZm9yZUlucHV0XCIsXCJiZWZvcmVpbnB1dFwiLG51bGwsYyxlKSxnLnB1c2goe2V2ZW50OmUsbGlzdGVuZXJzOmR9KSxlLmRhdGE9YWIpfXJlKGcsYil9KX1mdW5jdGlvbiBzZihhLGIsYyl7cmV0dXJue2luc3RhbmNlOmEsbGlzdGVuZXI6YixjdXJyZW50VGFyZ2V0OmN9fWZ1bmN0aW9uIG5lKGEsYil7Zm9yKHZhciBjPWIrXCJDYXB0dXJlXCIsZD1bXTtudWxsIT09YTspe3ZhciBlPWEsZj1lLnN0YXRlTm9kZTs1PT09ZS50YWcmJm51bGwhPT1mJiYoZT1mLGY9SmIoYSxjKSxudWxsIT1mJiZkLnVuc2hpZnQoc2YoYSxmLGUpKSxmPUpiKGEsYiksbnVsbCE9ZiYmZC5wdXNoKHNmKGEsZixlKSkpO2E9YS5yZXR1cm59cmV0dXJuIGR9ZnVuY3Rpb24gdWYoYSl7aWYobnVsbD09PWEpcmV0dXJuIG51bGw7ZG8gYT1hLnJldHVybjt3aGlsZShhJiY1IT09YS50YWcpO3JldHVybiBhP2E6bnVsbH1cbmZ1bmN0aW9uIHZmKGEsYixjLGQsZSl7Zm9yKHZhciBmPWIuX3JlYWN0TmFtZSxnPVtdO251bGwhPT1jJiZjIT09ZDspe3ZhciBoPWMsaz1oLmFsdGVybmF0ZSxsPWguc3RhdGVOb2RlO2lmKG51bGwhPT1rJiZrPT09ZClicmVhazs1PT09aC50YWcmJm51bGwhPT1sJiYoaD1sLGU/KGs9SmIoYyxmKSxudWxsIT1rJiZnLnVuc2hpZnQoc2YoYyxrLGgpKSk6ZXx8KGs9SmIoYyxmKSxudWxsIT1rJiZnLnB1c2goc2YoYyxrLGgpKSkpO2M9Yy5yZXR1cm59MCE9PWcubGVuZ3RoJiZhLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOmd9KX12YXIgd2Y9L1xcclxcbj8vZyx4Zj0vXFx1MDAwMHxcXHVGRkZEL2c7ZnVuY3Rpb24geWYoYSl7cmV0dXJuKFwic3RyaW5nXCI9PT10eXBlb2YgYT9hOlwiXCIrYSkucmVwbGFjZSh3ZixcIlxcblwiKS5yZXBsYWNlKHhmLFwiXCIpfWZ1bmN0aW9uIHpmKGEsYixjKXtiPXlmKGIpO2lmKHlmKGEpIT09YiYmYyl0aHJvdyBFcnJvcihwKDQyNSkpO31mdW5jdGlvbiBBZigpe31cbnZhciBCZj1udWxsLENmPW51bGw7ZnVuY3Rpb24gRGYoYSxiKXtyZXR1cm5cInRleHRhcmVhXCI9PT1hfHxcIm5vc2NyaXB0XCI9PT1hfHxcInN0cmluZ1wiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwibnVtYmVyXCI9PT10eXBlb2YgYi5jaGlsZHJlbnx8XCJvYmplY3RcIj09PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZudWxsIT09Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWx9XG52YXIgRWY9XCJmdW5jdGlvblwiPT09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDp2b2lkIDAsRmY9XCJmdW5jdGlvblwiPT09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6dm9pZCAwLEdmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBQcm9taXNlP1Byb21pc2U6dm9pZCAwLElmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz9xdWV1ZU1pY3JvdGFzazpcInVuZGVmaW5lZFwiIT09dHlwZW9mIEdmP2Z1bmN0aW9uKGEpe3JldHVybiBHZi5yZXNvbHZlKG51bGwpLnRoZW4oYSkuY2F0Y2goSGYpfTpFZjtmdW5jdGlvbiBIZihhKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYTt9KX1cbmZ1bmN0aW9uIEpmKGEsYil7dmFyIGM9YixkPTA7ZG97dmFyIGU9Yy5uZXh0U2libGluZzthLnJlbW92ZUNoaWxkKGMpO2lmKGUmJjg9PT1lLm5vZGVUeXBlKWlmKGM9ZS5kYXRhLFwiLyRcIj09PWMpe2lmKDA9PT1kKXthLnJlbW92ZUNoaWxkKGUpO2FkKGIpO3JldHVybn1kLS19ZWxzZVwiJFwiIT09YyYmXCIkP1wiIT09YyYmXCIkIVwiIT09Y3x8ZCsrO2M9ZX13aGlsZShjKTthZChiKX1mdW5jdGlvbiBLZihhKXtmb3IoO251bGwhPWE7YT1hLm5leHRTaWJsaW5nKXt2YXIgYj1hLm5vZGVUeXBlO2lmKDE9PT1ifHwzPT09YilicmVhaztpZig4PT09Yil7Yj1hLmRhdGE7aWYoXCIkXCI9PT1ifHxcIiQhXCI9PT1ifHxcIiQ/XCI9PT1iKWJyZWFrO2lmKFwiLyRcIj09PWIpcmV0dXJuIG51bGx9fXJldHVybiBhfVxuZnVuY3Rpb24gTGYoYSl7YT1hLnByZXZpb3VzU2libGluZztmb3IodmFyIGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihcIiRcIj09PWN8fFwiJCFcIj09PWN8fFwiJD9cIj09PWMpe2lmKDA9PT1iKXJldHVybiBhO2ItLX1lbHNlXCIvJFwiPT09YyYmYisrfWE9YS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIE1mPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLE5mPVwiX19yZWFjdEZpYmVyJFwiK01mLE9mPVwiX19yZWFjdFByb3BzJFwiK01mLHRmPVwiX19yZWFjdENvbnRhaW5lciRcIitNZixuZj1cIl9fcmVhY3RFdmVudHMkXCIrTWYsUGY9XCJfX3JlYWN0TGlzdGVuZXJzJFwiK01mLFFmPVwiX19yZWFjdEhhbmRsZXMkXCIrTWY7XG5mdW5jdGlvbiBWYyhhKXt2YXIgYj1hW05mXTtpZihiKXJldHVybiBiO2Zvcih2YXIgYz1hLnBhcmVudE5vZGU7Yzspe2lmKGI9Y1t0Zl18fGNbTmZdKXtjPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1iLmNoaWxkfHxudWxsIT09YyYmbnVsbCE9PWMuY2hpbGQpZm9yKGE9TGYoYSk7bnVsbCE9PWE7KXtpZihjPWFbTmZdKXJldHVybiBjO2E9TGYoYSl9cmV0dXJuIGJ9YT1jO2M9YS5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIEJiKGEpe2E9YVtOZl18fGFbdGZdO3JldHVybiFhfHw1IT09YS50YWcmJjYhPT1hLnRhZyYmMTMhPT1hLnRhZyYmMyE9PWEudGFnP251bGw6YX1mdW5jdGlvbiB0ZShhKXtpZig1PT09YS50YWd8fDY9PT1hLnRhZylyZXR1cm4gYS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IocCgzMykpO31mdW5jdGlvbiBDYihhKXtyZXR1cm4gYVtPZl18fG51bGx9dmFyIFJmPVtdLFNmPS0xO2Z1bmN0aW9uIFRmKGEpe3JldHVybntjdXJyZW50OmF9fVxuZnVuY3Rpb24gRShhKXswPlNmfHwoYS5jdXJyZW50PVJmW1NmXSxSZltTZl09bnVsbCxTZi0tKX1mdW5jdGlvbiBHKGEsYil7U2YrKztSZltTZl09YS5jdXJyZW50O2EuY3VycmVudD1ifXZhciBVZj17fSxIPVRmKFVmKSxWZj1UZighMSksV2Y9VWY7ZnVuY3Rpb24gWGYoYSxiKXt2YXIgYz1hLnR5cGUuY29udGV4dFR5cGVzO2lmKCFjKXJldHVybiBVZjt2YXIgZD1hLnN0YXRlTm9kZTtpZihkJiZkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT1iKXJldHVybiBkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBlPXt9LGY7Zm9yKGYgaW4gYyllW2ZdPWJbZl07ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWIsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1lKTtyZXR1cm4gZX1cbmZ1bmN0aW9uIFlmKGEpe2E9YS5jaGlsZENvbnRleHRUeXBlcztyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWF9ZnVuY3Rpb24gWmYoKXtFKFZmKTtFKEgpfWZ1bmN0aW9uICRmKGEsYixjKXtpZihILmN1cnJlbnQhPT1VZil0aHJvdyBFcnJvcihwKDE2OCkpO0coSCxiKTtHKFZmLGMpfWZ1bmN0aW9uIGFnKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTtiPWIuY2hpbGRDb250ZXh0VHlwZXM7aWYoXCJmdW5jdGlvblwiIT09dHlwZW9mIGQuZ2V0Q2hpbGRDb250ZXh0KXJldHVybiBjO2Q9ZC5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIGUgaW4gZClpZighKGUgaW4gYikpdGhyb3cgRXJyb3IocCgxMDgsUWEoYSl8fFwiVW5rbm93blwiLGUpKTtyZXR1cm4gQSh7fSxjLGQpfVxuZnVuY3Rpb24gYmcoYSl7YT0oYT1hLnN0YXRlTm9kZSkmJmEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHR8fFVmO1dmPUguY3VycmVudDtHKEgsYSk7RyhWZixWZi5jdXJyZW50KTtyZXR1cm4hMH1mdW5jdGlvbiBjZyhhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7aWYoIWQpdGhyb3cgRXJyb3IocCgxNjkpKTtjPyhhPWFnKGEsYixXZiksZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1hLEUoVmYpLEUoSCksRyhILGEpKTpFKFZmKTtHKFZmLGMpfXZhciBkZz1udWxsLGVnPSExLGZnPSExO2Z1bmN0aW9uIGdnKGEpe251bGw9PT1kZz9kZz1bYV06ZGcucHVzaChhKX1mdW5jdGlvbiBoZyhhKXtlZz0hMDtnZyhhKX1cbmZ1bmN0aW9uIGlnKCl7aWYoIWZnJiZudWxsIT09ZGcpe2ZnPSEwO3ZhciBhPTAsYj1DO3RyeXt2YXIgYz1kZztmb3IoQz0xO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZD1jW2FdO2RvIGQ9ZCghMCk7d2hpbGUobnVsbCE9PWQpfWRnPW51bGw7ZWc9ITF9Y2F0Y2goZSl7dGhyb3cgbnVsbCE9PWRnJiYoZGc9ZGcuc2xpY2UoYSsxKSksJGIoZWMsaWcpLGU7fWZpbmFsbHl7Qz1iLGZnPSExfX1yZXR1cm4gbnVsbH12YXIgamc9dGEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7ZnVuY3Rpb24ga2coYSxiKXtpZihhJiZhLmRlZmF1bHRQcm9wcyl7Yj1BKHt9LGIpO2E9YS5kZWZhdWx0UHJvcHM7Zm9yKHZhciBjIGluIGEpdm9pZCAwPT09YltjXSYmKGJbY109YVtjXSk7cmV0dXJuIGJ9cmV0dXJuIGJ9dmFyIGxnPVRmKG51bGwpLG1nPW51bGwsbmc9bnVsbCxvZz1udWxsO2Z1bmN0aW9uIHBnKCl7b2c9bmc9bWc9bnVsbH1cbmZ1bmN0aW9uIHFnKGEpe3ZhciBiPWxnLmN1cnJlbnQ7RShsZyk7YS5fY3VycmVudFZhbHVlPWJ9ZnVuY3Rpb24gcmcoYSxiLGMpe2Zvcig7bnVsbCE9PWE7KXt2YXIgZD1hLmFsdGVybmF0ZTsoYS5jaGlsZExhbmVzJmIpIT09Yj8oYS5jaGlsZExhbmVzfD1iLG51bGwhPT1kJiYoZC5jaGlsZExhbmVzfD1iKSk6bnVsbCE9PWQmJihkLmNoaWxkTGFuZXMmYikhPT1iJiYoZC5jaGlsZExhbmVzfD1iKTtpZihhPT09YylicmVhazthPWEucmV0dXJufX1mdW5jdGlvbiBzZyhhLGIpe21nPWE7b2c9bmc9bnVsbDthPWEuZGVwZW5kZW5jaWVzO251bGwhPT1hJiZudWxsIT09YS5maXJzdENvbnRleHQmJigwIT09KGEubGFuZXMmYikmJih0Zz0hMCksYS5maXJzdENvbnRleHQ9bnVsbCl9XG5mdW5jdGlvbiB1ZyhhKXt2YXIgYj1hLl9jdXJyZW50VmFsdWU7aWYob2chPT1hKWlmKGE9e2NvbnRleHQ6YSxtZW1vaXplZFZhbHVlOmIsbmV4dDpudWxsfSxudWxsPT09bmcpe2lmKG51bGw9PT1tZyl0aHJvdyBFcnJvcihwKDMwOCkpO25nPWE7bWcuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDphfX1lbHNlIG5nPW5nLm5leHQ9YTtyZXR1cm4gYn12YXIgdmc9bnVsbCx3Zz0hMTtmdW5jdGlvbiB4ZyhhKXthLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5tZW1vaXplZFN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpudWxsLGxhc3RCYXNlVXBkYXRlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowfSxlZmZlY3RzOm51bGx9fVxuZnVuY3Rpb24geWcoYSxiKXthPWEudXBkYXRlUXVldWU7Yi51cGRhdGVRdWV1ZT09PWEmJihiLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmEuZmlyc3RCYXNlVXBkYXRlLGxhc3RCYXNlVXBkYXRlOmEubGFzdEJhc2VVcGRhdGUsc2hhcmVkOmEuc2hhcmVkLGVmZmVjdHM6YS5lZmZlY3RzfSl9ZnVuY3Rpb24gemcoYSxiKXtyZXR1cm57ZXZlbnRUaW1lOmEsbGFuZTpiLHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19XG5mdW5jdGlvbiBBZyhhLGIpe3ZhciBjPWEudXBkYXRlUXVldWU7bnVsbCE9PWMmJihjPWMuc2hhcmVkLEJnKGEpPyhhPWMuaW50ZXJsZWF2ZWQsbnVsbD09PWE/KGIubmV4dD1iLG51bGw9PT12Zz92Zz1bY106dmcucHVzaChjKSk6KGIubmV4dD1hLm5leHQsYS5uZXh0PWIpLGMuaW50ZXJsZWF2ZWQ9Yik6KGE9Yy5wZW5kaW5nLG51bGw9PT1hP2IubmV4dD1iOihiLm5leHQ9YS5uZXh0LGEubmV4dD1iKSxjLnBlbmRpbmc9YikpfWZ1bmN0aW9uIENnKGEsYixjKXtiPWIudXBkYXRlUXVldWU7aWYobnVsbCE9PWImJihiPWIuc2hhcmVkLDAhPT0oYyY0MTk0MjQwKSkpe3ZhciBkPWIubGFuZXM7ZCY9YS5wZW5kaW5nTGFuZXM7Y3w9ZDtiLmxhbmVzPWM7QmMoYSxjKX19XG5mdW5jdGlvbiBEZyhhLGIpe3ZhciBjPWEudXBkYXRlUXVldWUsZD1hLmFsdGVybmF0ZTtpZihudWxsIT09ZCYmKGQ9ZC51cGRhdGVRdWV1ZSxjPT09ZCkpe3ZhciBlPW51bGwsZj1udWxsO2M9Yy5maXJzdEJhc2VVcGRhdGU7aWYobnVsbCE9PWMpe2Rve3ZhciBnPXtldmVudFRpbWU6Yy5ldmVudFRpbWUsbGFuZTpjLmxhbmUsdGFnOmMudGFnLHBheWxvYWQ6Yy5wYXlsb2FkLGNhbGxiYWNrOmMuY2FsbGJhY2ssbmV4dDpudWxsfTtudWxsPT09Zj9lPWY9ZzpmPWYubmV4dD1nO2M9Yy5uZXh0fXdoaWxlKG51bGwhPT1jKTtudWxsPT09Zj9lPWY9YjpmPWYubmV4dD1ifWVsc2UgZT1mPWI7Yz17YmFzZVN0YXRlOmQuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLGxhc3RCYXNlVXBkYXRlOmYsc2hhcmVkOmQuc2hhcmVkLGVmZmVjdHM6ZC5lZmZlY3RzfTthLnVwZGF0ZVF1ZXVlPWM7cmV0dXJufWE9Yy5sYXN0QmFzZVVwZGF0ZTtudWxsPT09YT9jLmZpcnN0QmFzZVVwZGF0ZT1iOmEubmV4dD1cbmI7Yy5sYXN0QmFzZVVwZGF0ZT1ifVxuZnVuY3Rpb24gRWcoYSxiLGMsZCl7dmFyIGU9YS51cGRhdGVRdWV1ZTt3Zz0hMTt2YXIgZj1lLmZpcnN0QmFzZVVwZGF0ZSxnPWUubGFzdEJhc2VVcGRhdGUsaD1lLnNoYXJlZC5wZW5kaW5nO2lmKG51bGwhPT1oKXtlLnNoYXJlZC5wZW5kaW5nPW51bGw7dmFyIGs9aCxsPWsubmV4dDtrLm5leHQ9bnVsbDtudWxsPT09Zz9mPWw6Zy5uZXh0PWw7Zz1rO3ZhciBuPWEuYWx0ZXJuYXRlO251bGwhPT1uJiYobj1uLnVwZGF0ZVF1ZXVlLGg9bi5sYXN0QmFzZVVwZGF0ZSxoIT09ZyYmKG51bGw9PT1oP24uZmlyc3RCYXNlVXBkYXRlPWw6aC5uZXh0PWwsbi5sYXN0QmFzZVVwZGF0ZT1rKSl9aWYobnVsbCE9PWYpe3ZhciB1PWUuYmFzZVN0YXRlO2c9MDtuPWw9az1udWxsO2g9Zjtkb3t2YXIgcT1oLmxhbmUseT1oLmV2ZW50VGltZTtpZigoZCZxKT09PXEpe251bGwhPT1uJiYobj1uLm5leHQ9e2V2ZW50VGltZTp5LGxhbmU6MCx0YWc6aC50YWcscGF5bG9hZDpoLnBheWxvYWQsY2FsbGJhY2s6aC5jYWxsYmFjayxcbm5leHQ6bnVsbH0pO2E6e3ZhciBtPWEsdz1oO3E9Yjt5PWM7c3dpdGNoKHcudGFnKXtjYXNlIDE6bT13LnBheWxvYWQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIG0pe3U9bS5jYWxsKHksdSxxKTticmVhayBhfXU9bTticmVhayBhO2Nhc2UgMzptLmZsYWdzPW0uZmxhZ3MmLTY1NTM3fDEyODtjYXNlIDA6bT13LnBheWxvYWQ7cT1cImZ1bmN0aW9uXCI9PT10eXBlb2YgbT9tLmNhbGwoeSx1LHEpOm07aWYobnVsbD09PXF8fHZvaWQgMD09PXEpYnJlYWsgYTt1PUEoe30sdSxxKTticmVhayBhO2Nhc2UgMjp3Zz0hMH19bnVsbCE9PWguY2FsbGJhY2smJjAhPT1oLmxhbmUmJihhLmZsYWdzfD02NCxxPWUuZWZmZWN0cyxudWxsPT09cT9lLmVmZmVjdHM9W2hdOnEucHVzaChoKSl9ZWxzZSB5PXtldmVudFRpbWU6eSxsYW5lOnEsdGFnOmgudGFnLHBheWxvYWQ6aC5wYXlsb2FkLGNhbGxiYWNrOmguY2FsbGJhY2ssbmV4dDpudWxsfSxudWxsPT09bj8obD1uPXksaz11KTpuPW4ubmV4dD15LGd8PXE7XG5oPWgubmV4dDtpZihudWxsPT09aClpZihoPWUuc2hhcmVkLnBlbmRpbmcsbnVsbD09PWgpYnJlYWs7ZWxzZSBxPWgsaD1xLm5leHQscS5uZXh0PW51bGwsZS5sYXN0QmFzZVVwZGF0ZT1xLGUuc2hhcmVkLnBlbmRpbmc9bnVsbH13aGlsZSgxKTtudWxsPT09biYmKGs9dSk7ZS5iYXNlU3RhdGU9aztlLmZpcnN0QmFzZVVwZGF0ZT1sO2UubGFzdEJhc2VVcGRhdGU9bjtiPWUuc2hhcmVkLmludGVybGVhdmVkO2lmKG51bGwhPT1iKXtlPWI7ZG8gZ3w9ZS5sYW5lLGU9ZS5uZXh0O3doaWxlKGUhPT1iKX1lbHNlIG51bGw9PT1mJiYoZS5zaGFyZWQubGFuZXM9MCk7Rmd8PWc7YS5sYW5lcz1nO2EubWVtb2l6ZWRTdGF0ZT11fX1cbmZ1bmN0aW9uIEdnKGEsYixjKXthPWIuZWZmZWN0cztiLmVmZmVjdHM9bnVsbDtpZihudWxsIT09YSlmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdLGU9ZC5jYWxsYmFjaztpZihudWxsIT09ZSl7ZC5jYWxsYmFjaz1udWxsO2Q9YztpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZSl0aHJvdyBFcnJvcihwKDE5MSxlKSk7ZS5jYWxsKGQpfX19dmFyIEhnPShuZXcgYWEuQ29tcG9uZW50KS5yZWZzO2Z1bmN0aW9uIElnKGEsYixjLGQpe2I9YS5tZW1vaXplZFN0YXRlO2M9YyhkLGIpO2M9bnVsbD09PWN8fHZvaWQgMD09PWM/YjpBKHt9LGIsYyk7YS5tZW1vaXplZFN0YXRlPWM7MD09PWEubGFuZXMmJihhLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1jKX1cbnZhciBNZz17aXNNb3VudGVkOmZ1bmN0aW9uKGEpe3JldHVybihhPWEuX3JlYWN0SW50ZXJuYWxzKT9VYihhKT09PWE6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihhLGIsYyl7YT1hLl9yZWFjdEludGVybmFsczt2YXIgZD1KZygpLGU9S2coYSksZj16ZyhkLGUpO2YucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZi5jYWxsYmFjaz1jKTtBZyhhLGYpO2I9TGcoYSxlLGQpO251bGwhPT1iJiZDZyhiLGEsZSl9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oYSxiLGMpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGQ9SmcoKSxlPUtnKGEpLGY9emcoZCxlKTtmLnRhZz0xO2YucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZi5jYWxsYmFjaz1jKTtBZyhhLGYpO2I9TGcoYSxlLGQpO251bGwhPT1iJiZDZyhiLGEsZSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihhLGIpe2E9YS5fcmVhY3RJbnRlcm5hbHM7dmFyIGM9SmcoKSxkPUtnKGEpLGU9emcoYyxcbmQpO2UudGFnPTI7dm9pZCAwIT09YiYmbnVsbCE9PWImJihlLmNhbGxiYWNrPWIpO0FnKGEsZSk7Yj1MZyhhLGQsYyk7bnVsbCE9PWImJkNnKGIsYSxkKX19O2Z1bmN0aW9uIE5nKGEsYixjLGQsZSxmLGcpe2E9YS5zdGF0ZU5vZGU7cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGEuc2hvdWxkQ29tcG9uZW50VXBkYXRlP2Euc2hvdWxkQ29tcG9uZW50VXBkYXRlKGQsZixnKTpiLnByb3RvdHlwZSYmYi5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IUhlKGMsZCl8fCFIZShlLGYpOiEwfVxuZnVuY3Rpb24gT2coYSxiLGMpe3ZhciBkPSExLGU9VWY7dmFyIGY9Yi5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mP2Y9dWcoZik6KGU9WWYoYik/V2Y6SC5jdXJyZW50LGQ9Yi5jb250ZXh0VHlwZXMsZj0oZD1udWxsIT09ZCYmdm9pZCAwIT09ZCk/WGYoYSxlKTpVZik7Yj1uZXcgYihjLGYpO2EubWVtb2l6ZWRTdGF0ZT1udWxsIT09Yi5zdGF0ZSYmdm9pZCAwIT09Yi5zdGF0ZT9iLnN0YXRlOm51bGw7Yi51cGRhdGVyPU1nO2Euc3RhdGVOb2RlPWI7Yi5fcmVhY3RJbnRlcm5hbHM9YTtkJiYoYT1hLnN0YXRlTm9kZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9ZSxhLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWYpO3JldHVybiBifVxuZnVuY3Rpb24gUGcoYSxiLGMsZCl7YT1iLnN0YXRlO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmIuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLGQpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZiLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGMsZCk7Yi5zdGF0ZSE9PWEmJk1nLmVucXVldWVSZXBsYWNlU3RhdGUoYixiLnN0YXRlLG51bGwpfVxuZnVuY3Rpb24gUWcoYSxiLGMsZCl7dmFyIGU9YS5zdGF0ZU5vZGU7ZS5wcm9wcz1jO2Uuc3RhdGU9YS5tZW1vaXplZFN0YXRlO2UucmVmcz1IZzt4ZyhhKTt2YXIgZj1iLmNvbnRleHRUeXBlO1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWY/ZS5jb250ZXh0PXVnKGYpOihmPVlmKGIpP1dmOkguY3VycmVudCxlLmNvbnRleHQ9WGYoYSxmKSk7ZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGU7Zj1iLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcImZ1bmN0aW9uXCI9PT10eXBlb2YgZiYmKElnKGEsYixmLGMpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHN8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnR8fChiPWUuc3RhdGUsXG5cImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnQmJmUuY29tcG9uZW50V2lsbE1vdW50KCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksYiE9PWUuc3RhdGUmJk1nLmVucXVldWVSZXBsYWNlU3RhdGUoZSxlLnN0YXRlLG51bGwpLEVnKGEsYyxlLGQpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnREaWRNb3VudCYmKGEuZmxhZ3N8PTQxOTQzMDgpfXZhciBSZz1bXSxTZz0wLFRnPW51bGwsVWc9MCxWZz1bXSxXZz0wLFhnPW51bGwsWWc9MSxaZz1cIlwiO2Z1bmN0aW9uICRnKGEsYil7UmdbU2crK109VWc7UmdbU2crK109VGc7VGc9YTtVZz1ifVxuZnVuY3Rpb24gYWgoYSxiLGMpe1ZnW1dnKytdPVlnO1ZnW1dnKytdPVpnO1ZnW1dnKytdPVhnO1hnPWE7dmFyIGQ9WWc7YT1aZzt2YXIgZT0zMi1uYyhkKS0xO2QmPX4oMTw8ZSk7Yys9MTt2YXIgZj0zMi1uYyhiKStlO2lmKDMwPGYpe3ZhciBnPWUtZSU1O2Y9KGQmKDE8PGcpLTEpLnRvU3RyaW5nKDMyKTtkPj49ZztlLT1nO1lnPTE8PDMyLW5jKGIpK2V8Yzw8ZXxkO1pnPWYrYX1lbHNlIFlnPTE8PGZ8Yzw8ZXxkLFpnPWF9ZnVuY3Rpb24gYmgoYSl7bnVsbCE9PWEucmV0dXJuJiYoJGcoYSwxKSxhaChhLDEsMCkpfWZ1bmN0aW9uIGNoKGEpe2Zvcig7YT09PVRnOylUZz1SZ1stLVNnXSxSZ1tTZ109bnVsbCxVZz1SZ1stLVNnXSxSZ1tTZ109bnVsbDtmb3IoO2E9PT1YZzspWGc9VmdbLS1XZ10sVmdbV2ddPW51bGwsWmc9VmdbLS1XZ10sVmdbV2ddPW51bGwsWWc9VmdbLS1XZ10sVmdbV2ddPW51bGx9dmFyIGRoPW51bGwsZWg9bnVsbCxJPSExLGZoPW51bGw7XG5mdW5jdGlvbiBnaChhLGIpe3ZhciBjPWhoKDUsbnVsbCxudWxsLDApO2MuZWxlbWVudFR5cGU9XCJERUxFVEVEXCI7Yy5zdGF0ZU5vZGU9YjtjLnJldHVybj1hO2I9YS5kZWxldGlvbnM7bnVsbD09PWI/KGEuZGVsZXRpb25zPVtjXSxhLmZsYWdzfD0xNik6Yi5wdXNoKGMpfVxuZnVuY3Rpb24gaWgoYSxiKXtzd2l0Y2goYS50YWcpe2Nhc2UgNTp2YXIgYz1hLnR5cGU7Yj0xIT09Yi5ub2RlVHlwZXx8Yy50b0xvd2VyQ2FzZSgpIT09Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6YjtyZXR1cm4gbnVsbCE9PWI/KGEuc3RhdGVOb2RlPWIsZGg9YSxlaD1LZihiLmZpcnN0Q2hpbGQpLCEwKTohMTtjYXNlIDY6cmV0dXJuIGI9XCJcIj09PWEucGVuZGluZ1Byb3BzfHwzIT09Yi5ub2RlVHlwZT9udWxsOmIsbnVsbCE9PWI/KGEuc3RhdGVOb2RlPWIsZGg9YSxlaD1udWxsLCEwKTohMTtjYXNlIDEzOnJldHVybiBiPTghPT1iLm5vZGVUeXBlP251bGw6YixudWxsIT09Yj8oYz1udWxsIT09WGc/e2lkOllnLG92ZXJmbG93OlpnfTpudWxsLGEubWVtb2l6ZWRTdGF0ZT17ZGVoeWRyYXRlZDpiLHRyZWVDb250ZXh0OmMscmV0cnlMYW5lOjEwNzM3NDE4MjR9LGM9aGgoMTgsbnVsbCxudWxsLDApLGMuc3RhdGVOb2RlPWIsYy5yZXR1cm49YSxhLmNoaWxkPWMsZGg9YSxlaD1cbm51bGwsITApOiExO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIGpoKGEpe3JldHVybiAwIT09KGEubW9kZSYxKSYmMD09PShhLmZsYWdzJjEyOCl9ZnVuY3Rpb24ga2goYSl7aWYoSSl7dmFyIGI9ZWg7aWYoYil7dmFyIGM9YjtpZighaWgoYSxiKSl7aWYoamgoYSkpdGhyb3cgRXJyb3IocCg0MTgpKTtiPUtmKGMubmV4dFNpYmxpbmcpO3ZhciBkPWRoO2ImJmloKGEsYik/Z2goZCxjKTooYS5mbGFncz1hLmZsYWdzJi00MDk3fDIsST0hMSxkaD1hKX19ZWxzZXtpZihqaChhKSl0aHJvdyBFcnJvcihwKDQxOCkpO2EuZmxhZ3M9YS5mbGFncyYtNDA5N3wyO0k9ITE7ZGg9YX19fWZ1bmN0aW9uIGxoKGEpe2ZvcihhPWEucmV0dXJuO251bGwhPT1hJiY1IT09YS50YWcmJjMhPT1hLnRhZyYmMTMhPT1hLnRhZzspYT1hLnJldHVybjtkaD1hfVxuZnVuY3Rpb24gbWgoYSl7aWYoYSE9PWRoKXJldHVybiExO2lmKCFJKXJldHVybiBsaChhKSxJPSEwLCExO3ZhciBiOyhiPTMhPT1hLnRhZykmJiEoYj01IT09YS50YWcpJiYoYj1hLnR5cGUsYj1cImhlYWRcIiE9PWImJlwiYm9keVwiIT09YiYmIURmKGEudHlwZSxhLm1lbW9pemVkUHJvcHMpKTtpZihiJiYoYj1laCkpe2lmKGpoKGEpKXtmb3IoYT1laDthOylhPUtmKGEubmV4dFNpYmxpbmcpO3Rocm93IEVycm9yKHAoNDE4KSk7fWZvcig7YjspZ2goYSxiKSxiPUtmKGIubmV4dFNpYmxpbmcpfWxoKGEpO2lmKDEzPT09YS50YWcpe2E9YS5tZW1vaXplZFN0YXRlO2E9bnVsbCE9PWE/YS5kZWh5ZHJhdGVkOm51bGw7aWYoIWEpdGhyb3cgRXJyb3IocCgzMTcpKTthOnthPWEubmV4dFNpYmxpbmc7Zm9yKGI9MDthOyl7aWYoOD09PWEubm9kZVR5cGUpe3ZhciBjPWEuZGF0YTtpZihcIi8kXCI9PT1jKXtpZigwPT09Yil7ZWg9S2YoYS5uZXh0U2libGluZyk7YnJlYWsgYX1iLS19ZWxzZVwiJFwiIT09YyYmXG5cIiQhXCIhPT1jJiZcIiQ/XCIhPT1jfHxiKyt9YT1hLm5leHRTaWJsaW5nfWVoPW51bGx9fWVsc2UgZWg9ZGg/S2YoYS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9ZnVuY3Rpb24gbmgoKXtlaD1kaD1udWxsO0k9ITF9ZnVuY3Rpb24gb2goYSl7bnVsbD09PWZoP2ZoPVthXTpmaC5wdXNoKGEpfVxuZnVuY3Rpb24gcGgoYSxiLGMpe2E9Yy5yZWY7aWYobnVsbCE9PWEmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBhJiZcIm9iamVjdFwiIT09dHlwZW9mIGEpe2lmKGMuX293bmVyKXtjPWMuX293bmVyO2lmKGMpe2lmKDEhPT1jLnRhZyl0aHJvdyBFcnJvcihwKDMwOSkpO3ZhciBkPWMuc3RhdGVOb2RlfWlmKCFkKXRocm93IEVycm9yKHAoMTQ3LGEpKTt2YXIgZT1kLGY9XCJcIithO2lmKG51bGwhPT1iJiZudWxsIT09Yi5yZWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBiLnJlZiYmYi5yZWYuX3N0cmluZ1JlZj09PWYpcmV0dXJuIGIucmVmO2I9ZnVuY3Rpb24oYSl7dmFyIGI9ZS5yZWZzO2I9PT1IZyYmKGI9ZS5yZWZzPXt9KTtudWxsPT09YT9kZWxldGUgYltmXTpiW2ZdPWF9O2IuX3N0cmluZ1JlZj1mO3JldHVybiBifWlmKFwic3RyaW5nXCIhPT10eXBlb2YgYSl0aHJvdyBFcnJvcihwKDI4NCkpO2lmKCFjLl9vd25lcil0aHJvdyBFcnJvcihwKDI5MCxhKSk7fXJldHVybiBhfVxuZnVuY3Rpb24gcWgoYSxiKXthPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiKTt0aHJvdyBFcnJvcihwKDMxLFwiW29iamVjdCBPYmplY3RdXCI9PT1hP1wib2JqZWN0IHdpdGgga2V5cyB7XCIrT2JqZWN0LmtleXMoYikuam9pbihcIiwgXCIpK1wifVwiOmEpKTt9ZnVuY3Rpb24gcmgoYSl7dmFyIGI9YS5faW5pdDtyZXR1cm4gYihhLl9wYXlsb2FkKX1cbmZ1bmN0aW9uIHNoKGEpe2Z1bmN0aW9uIGIoYixjKXtpZihhKXt2YXIgZD1iLmRlbGV0aW9ucztudWxsPT09ZD8oYi5kZWxldGlvbnM9W2NdLGIuZmxhZ3N8PTE2KTpkLnB1c2goYyl9fWZ1bmN0aW9uIGMoYyxkKXtpZighYSlyZXR1cm4gbnVsbDtmb3IoO251bGwhPT1kOyliKGMsZCksZD1kLnNpYmxpbmc7cmV0dXJuIG51bGx9ZnVuY3Rpb24gZChhLGIpe2ZvcihhPW5ldyBNYXA7bnVsbCE9PWI7KW51bGwhPT1iLmtleT9hLnNldChiLmtleSxiKTphLnNldChiLmluZGV4LGIpLGI9Yi5zaWJsaW5nO3JldHVybiBhfWZ1bmN0aW9uIGUoYSxiKXthPXRoKGEsYik7YS5pbmRleD0wO2Euc2libGluZz1udWxsO3JldHVybiBhfWZ1bmN0aW9uIGYoYixjLGQpe2IuaW5kZXg9ZDtpZighYSlyZXR1cm4gYi5mbGFnc3w9MTA0ODU3NixjO2Q9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWQpcmV0dXJuIGQ9ZC5pbmRleCxkPGM/KGIuZmxhZ3N8PTIsYyk6ZDtiLmZsYWdzfD0yO3JldHVybiBjfWZ1bmN0aW9uIGcoYil7YSYmXG5udWxsPT09Yi5hbHRlcm5hdGUmJihiLmZsYWdzfD0yKTtyZXR1cm4gYn1mdW5jdGlvbiBoKGEsYixjLGQpe2lmKG51bGw9PT1ifHw2IT09Yi50YWcpcmV0dXJuIGI9dWgoYyxhLm1vZGUsZCksYi5yZXR1cm49YSxiO2I9ZShiLGMpO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gayhhLGIsYyxkKXt2YXIgZj1jLnR5cGU7aWYoZj09PXdhKXJldHVybiBuKGEsYixjLnByb3BzLmNoaWxkcmVuLGQsYy5rZXkpO2lmKG51bGwhPT1iJiYoYi5lbGVtZW50VHlwZT09PWZ8fFwib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWYmJmYuJCR0eXBlb2Y9PT1HYSYmcmgoZik9PT1iLnR5cGUpKXJldHVybiBkPWUoYixjLnByb3BzKSxkLnJlZj1waChhLGIsYyksZC5yZXR1cm49YSxkO2Q9dmgoYy50eXBlLGMua2V5LGMucHJvcHMsbnVsbCxhLm1vZGUsZCk7ZC5yZWY9cGgoYSxiLGMpO2QucmV0dXJuPWE7cmV0dXJuIGR9ZnVuY3Rpb24gbChhLGIsYyxkKXtpZihudWxsPT09Ynx8NCE9PWIudGFnfHxcbmIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8hPT1jLmNvbnRhaW5lckluZm98fGIuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uIT09Yy5pbXBsZW1lbnRhdGlvbilyZXR1cm4gYj13aChjLGEubW9kZSxkKSxiLnJldHVybj1hLGI7Yj1lKGIsYy5jaGlsZHJlbnx8W10pO2IucmV0dXJuPWE7cmV0dXJuIGJ9ZnVuY3Rpb24gbihhLGIsYyxkLGYpe2lmKG51bGw9PT1ifHw3IT09Yi50YWcpcmV0dXJuIGI9eGgoYyxhLm1vZGUsZCxmKSxiLnJldHVybj1hLGI7Yj1lKGIsYyk7Yi5yZXR1cm49YTtyZXR1cm4gYn1mdW5jdGlvbiB1KGEsYixjKXtpZihcInN0cmluZ1wiPT09dHlwZW9mIGImJlwiXCIhPT1ifHxcIm51bWJlclwiPT09dHlwZW9mIGIpcmV0dXJuIGI9dWgoXCJcIitiLGEubW9kZSxjKSxiLnJldHVybj1hLGI7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBiJiZudWxsIT09Yil7c3dpdGNoKGIuJCR0eXBlb2Ype2Nhc2UgdWE6cmV0dXJuIGM9dmgoYi50eXBlLGIua2V5LGIucHJvcHMsbnVsbCxhLm1vZGUsYyksXG5jLnJlZj1waChhLG51bGwsYiksYy5yZXR1cm49YSxjO2Nhc2UgdmE6cmV0dXJuIGI9d2goYixhLm1vZGUsYyksYi5yZXR1cm49YSxiO2Nhc2UgR2E6dmFyIGQ9Yi5faW5pdDtyZXR1cm4gdShhLGQoYi5fcGF5bG9hZCksYyl9aWYoZGIoYil8fEphKGIpKXJldHVybiBiPXhoKGIsYS5tb2RlLGMsbnVsbCksYi5yZXR1cm49YSxiO3FoKGEsYil9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcShhLGIsYyxkKXt2YXIgZT1udWxsIT09Yj9iLmtleTpudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYyYmXCJcIiE9PWN8fFwibnVtYmVyXCI9PT10eXBlb2YgYylyZXR1cm4gbnVsbCE9PWU/bnVsbDpoKGEsYixcIlwiK2MsZCk7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBjJiZudWxsIT09Yyl7c3dpdGNoKGMuJCR0eXBlb2Ype2Nhc2UgdWE6cmV0dXJuIGMua2V5PT09ZT9rKGEsYixjLGQpOm51bGw7Y2FzZSB2YTpyZXR1cm4gYy5rZXk9PT1lP2woYSxiLGMsZCk6bnVsbDtjYXNlIEdhOnJldHVybiBlPWMuX2luaXQscShhLFxuYixlKGMuX3BheWxvYWQpLGQpfWlmKGRiKGMpfHxKYShjKSlyZXR1cm4gbnVsbCE9PWU/bnVsbDpuKGEsYixjLGQsbnVsbCk7cWgoYSxjKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB5KGEsYixjLGQsZSl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBkJiZcIlwiIT09ZHx8XCJudW1iZXJcIj09PXR5cGVvZiBkKXJldHVybiBhPWEuZ2V0KGMpfHxudWxsLGgoYixhLFwiXCIrZCxlKTtpZihcIm9iamVjdFwiPT09dHlwZW9mIGQmJm51bGwhPT1kKXtzd2l0Y2goZC4kJHR5cGVvZil7Y2FzZSB1YTpyZXR1cm4gYT1hLmdldChudWxsPT09ZC5rZXk/YzpkLmtleSl8fG51bGwsayhiLGEsZCxlKTtjYXNlIHZhOnJldHVybiBhPWEuZ2V0KG51bGw9PT1kLmtleT9jOmQua2V5KXx8bnVsbCxsKGIsYSxkLGUpO2Nhc2UgR2E6dmFyIGY9ZC5faW5pdDtyZXR1cm4geShhLGIsYyxmKGQuX3BheWxvYWQpLGUpfWlmKGRiKGQpfHxKYShkKSlyZXR1cm4gYT1hLmdldChjKXx8bnVsbCxuKGIsYSxkLGUsbnVsbCk7cWgoYixkKX1yZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIG0oZSxnLGgsayl7Zm9yKHZhciBsPW51bGwsbj1udWxsLHI9ZyxtPWc9MCx4PW51bGw7bnVsbCE9PXImJm08aC5sZW5ndGg7bSsrKXtyLmluZGV4Pm0/KHg9cixyPW51bGwpOng9ci5zaWJsaW5nO3ZhciB2PXEoZSxyLGhbbV0sayk7aWYobnVsbD09PXYpe251bGw9PT1yJiYocj14KTticmVha31hJiZyJiZudWxsPT09di5hbHRlcm5hdGUmJmIoZSxyKTtnPWYodixnLG0pO251bGw9PT1uP2w9djpuLnNpYmxpbmc9djtuPXY7cj14fWlmKG09PT1oLmxlbmd0aClyZXR1cm4gYyhlLHIpLEkmJiRnKGUsbSksbDtpZihudWxsPT09cil7Zm9yKDttPGgubGVuZ3RoO20rKylyPXUoZSxoW21dLGspLG51bGwhPT1yJiYoZz1mKHIsZyxtKSxudWxsPT09bj9sPXI6bi5zaWJsaW5nPXIsbj1yKTtJJiYkZyhlLG0pO3JldHVybiBsfWZvcihyPWQoZSxyKTttPGgubGVuZ3RoO20rKyl4PXkocixlLG0saFttXSxrKSxudWxsIT09eCYmKGEmJm51bGwhPT14LmFsdGVybmF0ZSYmci5kZWxldGUobnVsbD09PVxueC5rZXk/bTp4LmtleSksZz1mKHgsZyxtKSxudWxsPT09bj9sPXg6bi5zaWJsaW5nPXgsbj14KTthJiZyLmZvckVhY2goZnVuY3Rpb24oYSl7cmV0dXJuIGIoZSxhKX0pO0kmJiRnKGUsbSk7cmV0dXJuIGx9ZnVuY3Rpb24gdyhlLGcsaCxrKXt2YXIgbD1KYShoKTtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgbCl0aHJvdyBFcnJvcihwKDE1MCkpO2g9bC5jYWxsKGgpO2lmKG51bGw9PWgpdGhyb3cgRXJyb3IocCgxNTEpKTtmb3IodmFyIG49bD1udWxsLG09ZyxyPWc9MCx4PW51bGwsdj1oLm5leHQoKTtudWxsIT09bSYmIXYuZG9uZTtyKyssdj1oLm5leHQoKSl7bS5pbmRleD5yPyh4PW0sbT1udWxsKTp4PW0uc2libGluZzt2YXIgdz1xKGUsbSx2LnZhbHVlLGspO2lmKG51bGw9PT13KXtudWxsPT09bSYmKG09eCk7YnJlYWt9YSYmbSYmbnVsbD09PXcuYWx0ZXJuYXRlJiZiKGUsbSk7Zz1mKHcsZyxyKTtudWxsPT09bj9sPXc6bi5zaWJsaW5nPXc7bj13O209eH1pZih2LmRvbmUpcmV0dXJuIGMoZSxcbm0pLEkmJiRnKGUsciksbDtpZihudWxsPT09bSl7Zm9yKDshdi5kb25lO3IrKyx2PWgubmV4dCgpKXY9dShlLHYudmFsdWUsayksbnVsbCE9PXYmJihnPWYodixnLHIpLG51bGw9PT1uP2w9djpuLnNpYmxpbmc9dixuPXYpO0kmJiRnKGUscik7cmV0dXJuIGx9Zm9yKG09ZChlLG0pOyF2LmRvbmU7cisrLHY9aC5uZXh0KCkpdj15KG0sZSxyLHYudmFsdWUsayksbnVsbCE9PXYmJihhJiZudWxsIT09di5hbHRlcm5hdGUmJm0uZGVsZXRlKG51bGw9PT12LmtleT9yOnYua2V5KSxnPWYodixnLHIpLG51bGw9PT1uP2w9djpuLnNpYmxpbmc9dixuPXYpO2EmJm0uZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYihlLGEpfSk7SSYmJGcoZSxyKTtyZXR1cm4gbH1mdW5jdGlvbiBKKGEsZCxmLGgpe1wib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWYmJmYudHlwZT09PXdhJiZudWxsPT09Zi5rZXkmJihmPWYucHJvcHMuY2hpbGRyZW4pO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWYpe3N3aXRjaChmLiQkdHlwZW9mKXtjYXNlIHVhOmE6e2Zvcih2YXIgaz1cbmYua2V5LGw9ZDtudWxsIT09bDspe2lmKGwua2V5PT09ayl7az1mLnR5cGU7aWYoaz09PXdhKXtpZig3PT09bC50YWcpe2MoYSxsLnNpYmxpbmcpO2Q9ZShsLGYucHJvcHMuY2hpbGRyZW4pO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9fWVsc2UgaWYobC5lbGVtZW50VHlwZT09PWt8fFwib2JqZWN0XCI9PT10eXBlb2YgayYmbnVsbCE9PWsmJmsuJCR0eXBlb2Y9PT1HYSYmcmgoayk9PT1sLnR5cGUpe2MoYSxsLnNpYmxpbmcpO2Q9ZShsLGYucHJvcHMpO2QucmVmPXBoKGEsbCxmKTtkLnJldHVybj1hO2E9ZDticmVhayBhfWMoYSxsKTticmVha31lbHNlIGIoYSxsKTtsPWwuc2libGluZ31mLnR5cGU9PT13YT8oZD14aChmLnByb3BzLmNoaWxkcmVuLGEubW9kZSxoLGYua2V5KSxkLnJldHVybj1hLGE9ZCk6KGg9dmgoZi50eXBlLGYua2V5LGYucHJvcHMsbnVsbCxhLm1vZGUsaCksaC5yZWY9cGgoYSxkLGYpLGgucmV0dXJuPWEsYT1oKX1yZXR1cm4gZyhhKTtjYXNlIHZhOmE6e2ZvcihsPWYua2V5O251bGwhPT1cbmQ7KXtpZihkLmtleT09PWwpaWYoND09PWQudGFnJiZkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvPT09Zi5jb250YWluZXJJbmZvJiZkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbj09PWYuaW1wbGVtZW50YXRpb24pe2MoYSxkLnNpYmxpbmcpO2Q9ZShkLGYuY2hpbGRyZW58fFtdKTtkLnJldHVybj1hO2E9ZDticmVhayBhfWVsc2V7YyhhLGQpO2JyZWFrfWVsc2UgYihhLGQpO2Q9ZC5zaWJsaW5nfWQ9d2goZixhLm1vZGUsaCk7ZC5yZXR1cm49YTthPWR9cmV0dXJuIGcoYSk7Y2FzZSBHYTpyZXR1cm4gbD1mLl9pbml0LEooYSxkLGwoZi5fcGF5bG9hZCksaCl9aWYoZGIoZikpcmV0dXJuIG0oYSxkLGYsaCk7aWYoSmEoZikpcmV0dXJuIHcoYSxkLGYsaCk7cWgoYSxmKX1yZXR1cm5cInN0cmluZ1wiPT09dHlwZW9mIGYmJlwiXCIhPT1mfHxcIm51bWJlclwiPT09dHlwZW9mIGY/KGY9XCJcIitmLG51bGwhPT1kJiY2PT09ZC50YWc/KGMoYSxkLnNpYmxpbmcpLGQ9ZShkLGYpLGQucmV0dXJuPWEsYT1kKTpcbihjKGEsZCksZD11aChmLGEubW9kZSxoKSxkLnJldHVybj1hLGE9ZCksZyhhKSk6YyhhLGQpfXJldHVybiBKfXZhciB5aD1zaCghMCksemg9c2goITEpLEFoPXt9LEJoPVRmKEFoKSxDaD1UZihBaCksRGg9VGYoQWgpO2Z1bmN0aW9uIEVoKGEpe2lmKGE9PT1BaCl0aHJvdyBFcnJvcihwKDE3NCkpO3JldHVybiBhfWZ1bmN0aW9uIEZoKGEsYil7RyhEaCxiKTtHKENoLGEpO0coQmgsQWgpO2E9Yi5ub2RlVHlwZTtzd2l0Y2goYSl7Y2FzZSA5OmNhc2UgMTE6Yj0oYj1iLmRvY3VtZW50RWxlbWVudCk/Yi5uYW1lc3BhY2VVUkk6a2IobnVsbCxcIlwiKTticmVhaztkZWZhdWx0OmE9OD09PWE/Yi5wYXJlbnROb2RlOmIsYj1hLm5hbWVzcGFjZVVSSXx8bnVsbCxhPWEudGFnTmFtZSxiPWtiKGIsYSl9RShCaCk7RyhCaCxiKX1mdW5jdGlvbiBHaCgpe0UoQmgpO0UoQ2gpO0UoRGgpfVxuZnVuY3Rpb24gSGgoYSl7RWgoRGguY3VycmVudCk7dmFyIGI9RWgoQmguY3VycmVudCk7dmFyIGM9a2IoYixhLnR5cGUpO2IhPT1jJiYoRyhDaCxhKSxHKEJoLGMpKX1mdW5jdGlvbiBJaChhKXtDaC5jdXJyZW50PT09YSYmKEUoQmgpLEUoQ2gpKX12YXIgSz1UZigwKTtcbmZ1bmN0aW9uIEpoKGEpe2Zvcih2YXIgYj1hO251bGwhPT1iOyl7aWYoMTM9PT1iLnRhZyl7dmFyIGM9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1jJiYoYz1jLmRlaHlkcmF0ZWQsbnVsbD09PWN8fFwiJD9cIj09PWMuZGF0YXx8XCIkIVwiPT09Yy5kYXRhKSlyZXR1cm4gYn1lbHNlIGlmKDE5PT09Yi50YWcmJnZvaWQgMCE9PWIubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlcil7aWYoMCE9PShiLmZsYWdzJjEyOCkpcmV0dXJuIGJ9ZWxzZSBpZihudWxsIT09Yi5jaGlsZCl7Yi5jaGlsZC5yZXR1cm49YjtiPWIuY2hpbGQ7Y29udGludWV9aWYoYj09PWEpYnJlYWs7Zm9yKDtudWxsPT09Yi5zaWJsaW5nOyl7aWYobnVsbD09PWIucmV0dXJufHxiLnJldHVybj09PWEpcmV0dXJuIG51bGw7Yj1iLnJldHVybn1iLnNpYmxpbmcucmV0dXJuPWIucmV0dXJuO2I9Yi5zaWJsaW5nfXJldHVybiBudWxsfXZhciBLaD1bXTtcbmZ1bmN0aW9uIExoKCl7Zm9yKHZhciBhPTA7YTxLaC5sZW5ndGg7YSsrKUtoW2FdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7S2gubGVuZ3RoPTB9dmFyIE1oPXRhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsTmg9dGEuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsT2g9MCxMPW51bGwsTT1udWxsLE49bnVsbCxQaD0hMSxRaD0hMSxSaD0wLFNoPTA7ZnVuY3Rpb24gTygpe3Rocm93IEVycm9yKHAoMzIxKSk7fWZ1bmN0aW9uIFRoKGEsYil7aWYobnVsbD09PWIpcmV0dXJuITE7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aCYmYzxhLmxlbmd0aDtjKyspaWYoIUdlKGFbY10sYltjXSkpcmV0dXJuITE7cmV0dXJuITB9XG5mdW5jdGlvbiBVaChhLGIsYyxkLGUsZil7T2g9ZjtMPWI7Yi5tZW1vaXplZFN0YXRlPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO2IubGFuZXM9MDtNaC5jdXJyZW50PW51bGw9PT1hfHxudWxsPT09YS5tZW1vaXplZFN0YXRlP1ZoOldoO2E9YyhkLGUpO2lmKFFoKXtmPTA7ZG97UWg9ITE7Umg9MDtpZigyNTw9Zil0aHJvdyBFcnJvcihwKDMwMSkpO2YrPTE7Tj1NPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO01oLmN1cnJlbnQ9WGg7YT1jKGQsZSl9d2hpbGUoUWgpfU1oLmN1cnJlbnQ9WWg7Yj1udWxsIT09TSYmbnVsbCE9PU0ubmV4dDtPaD0wO049TT1MPW51bGw7UGg9ITE7aWYoYil0aHJvdyBFcnJvcihwKDMwMCkpO3JldHVybiBhfWZ1bmN0aW9uIFpoKCl7dmFyIGE9MCE9PVJoO1JoPTA7cmV0dXJuIGF9XG5mdW5jdGlvbiAkaCgpe3ZhciBhPXttZW1vaXplZFN0YXRlOm51bGwsYmFzZVN0YXRlOm51bGwsYmFzZVF1ZXVlOm51bGwscXVldWU6bnVsbCxuZXh0Om51bGx9O251bGw9PT1OP0wubWVtb2l6ZWRTdGF0ZT1OPWE6Tj1OLm5leHQ9YTtyZXR1cm4gTn1mdW5jdGlvbiBhaSgpe2lmKG51bGw9PT1NKXt2YXIgYT1MLmFsdGVybmF0ZTthPW51bGwhPT1hP2EubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgYT1NLm5leHQ7dmFyIGI9bnVsbD09PU4/TC5tZW1vaXplZFN0YXRlOk4ubmV4dDtpZihudWxsIT09YilOPWIsTT1hO2Vsc2V7aWYobnVsbD09PWEpdGhyb3cgRXJyb3IocCgzMTApKTtNPWE7YT17bWVtb2l6ZWRTdGF0ZTpNLm1lbW9pemVkU3RhdGUsYmFzZVN0YXRlOk0uYmFzZVN0YXRlLGJhc2VRdWV1ZTpNLmJhc2VRdWV1ZSxxdWV1ZTpNLnF1ZXVlLG5leHQ6bnVsbH07bnVsbD09PU4/TC5tZW1vaXplZFN0YXRlPU49YTpOPU4ubmV4dD1hfXJldHVybiBOfVxuZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYj9iKGEpOmJ9XG5mdW5jdGlvbiBjaShhKXt2YXIgYj1haSgpLGM9Yi5xdWV1ZTtpZihudWxsPT09Yyl0aHJvdyBFcnJvcihwKDMxMSkpO2MubGFzdFJlbmRlcmVkUmVkdWNlcj1hO3ZhciBkPU0sZT1kLmJhc2VRdWV1ZSxmPWMucGVuZGluZztpZihudWxsIT09Zil7aWYobnVsbCE9PWUpe3ZhciBnPWUubmV4dDtlLm5leHQ9Zi5uZXh0O2YubmV4dD1nfWQuYmFzZVF1ZXVlPWU9ZjtjLnBlbmRpbmc9bnVsbH1pZihudWxsIT09ZSl7Zj1lLm5leHQ7ZD1kLmJhc2VTdGF0ZTt2YXIgaD1nPW51bGwsaz1udWxsLGw9Zjtkb3t2YXIgbj1sLmxhbmU7aWYoKE9oJm4pPT09biludWxsIT09ayYmKGs9ay5uZXh0PXtsYW5lOjAsYWN0aW9uOmwuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6bC5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6bC5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLGQ9bC5oYXNFYWdlclN0YXRlP2wuZWFnZXJTdGF0ZTphKGQsbC5hY3Rpb24pO2Vsc2V7dmFyIHU9e2xhbmU6bixhY3Rpb246bC5hY3Rpb24saGFzRWFnZXJTdGF0ZTpsLmhhc0VhZ2VyU3RhdGUsXG5lYWdlclN0YXRlOmwuZWFnZXJTdGF0ZSxuZXh0Om51bGx9O251bGw9PT1rPyhoPWs9dSxnPWQpOms9ay5uZXh0PXU7TC5sYW5lc3w9bjtGZ3w9bn1sPWwubmV4dH13aGlsZShudWxsIT09bCYmbCE9PWYpO251bGw9PT1rP2c9ZDprLm5leHQ9aDtHZShkLGIubWVtb2l6ZWRTdGF0ZSl8fCh0Zz0hMCk7Yi5tZW1vaXplZFN0YXRlPWQ7Yi5iYXNlU3RhdGU9ZztiLmJhc2VRdWV1ZT1rO2MubGFzdFJlbmRlcmVkU3RhdGU9ZH1hPWMuaW50ZXJsZWF2ZWQ7aWYobnVsbCE9PWEpe2U9YTtkbyBmPWUubGFuZSxMLmxhbmVzfD1mLEZnfD1mLGU9ZS5uZXh0O3doaWxlKGUhPT1hKX1lbHNlIG51bGw9PT1lJiYoYy5sYW5lcz0wKTtyZXR1cm5bYi5tZW1vaXplZFN0YXRlLGMuZGlzcGF0Y2hdfVxuZnVuY3Rpb24gZGkoYSl7dmFyIGI9YWkoKSxjPWIucXVldWU7aWYobnVsbD09PWMpdGhyb3cgRXJyb3IocCgzMTEpKTtjLmxhc3RSZW5kZXJlZFJlZHVjZXI9YTt2YXIgZD1jLmRpc3BhdGNoLGU9Yy5wZW5kaW5nLGY9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1lKXtjLnBlbmRpbmc9bnVsbDt2YXIgZz1lPWUubmV4dDtkbyBmPWEoZixnLmFjdGlvbiksZz1nLm5leHQ7d2hpbGUoZyE9PWUpO0dlKGYsYi5tZW1vaXplZFN0YXRlKXx8KHRnPSEwKTtiLm1lbW9pemVkU3RhdGU9ZjtudWxsPT09Yi5iYXNlUXVldWUmJihiLmJhc2VTdGF0ZT1mKTtjLmxhc3RSZW5kZXJlZFN0YXRlPWZ9cmV0dXJuW2YsZF19ZnVuY3Rpb24gZWkoKXt9XG5mdW5jdGlvbiBmaShhLGIpe3ZhciBjPUwsZD1haSgpLGU9YigpLGY9IUdlKGQubWVtb2l6ZWRTdGF0ZSxlKTtmJiYoZC5tZW1vaXplZFN0YXRlPWUsdGc9ITApO2Q9ZC5xdWV1ZTtnaShoaS5iaW5kKG51bGwsYyxkLGEpLFthXSk7aWYoZC5nZXRTbmFwc2hvdCE9PWJ8fGZ8fG51bGwhPT1OJiZOLm1lbW9pemVkU3RhdGUudGFnJjEpe2MuZmxhZ3N8PTIwNDg7aWkoOSxqaS5iaW5kKG51bGwsYyxkLGUsYiksdm9pZCAwLG51bGwpO2lmKG51bGw9PT1QKXRocm93IEVycm9yKHAoMzQ5KSk7MCE9PShPaCYzMCl8fGtpKGMsYixlKX1yZXR1cm4gZX1mdW5jdGlvbiBraShhLGIsYyl7YS5mbGFnc3w9MTYzODQ7YT17Z2V0U25hcHNob3Q6Yix2YWx1ZTpjfTtiPUwudXBkYXRlUXVldWU7bnVsbD09PWI/KGI9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0sTC51cGRhdGVRdWV1ZT1iLGIuc3RvcmVzPVthXSk6KGM9Yi5zdG9yZXMsbnVsbD09PWM/Yi5zdG9yZXM9W2FdOmMucHVzaChhKSl9XG5mdW5jdGlvbiBqaShhLGIsYyxkKXtiLnZhbHVlPWM7Yi5nZXRTbmFwc2hvdD1kO2xpKGIpJiZMZyhhLDEsLTEpfWZ1bmN0aW9uIGhpKGEsYixjKXtyZXR1cm4gYyhmdW5jdGlvbigpe2xpKGIpJiZMZyhhLDEsLTEpfSl9ZnVuY3Rpb24gbGkoYSl7dmFyIGI9YS5nZXRTbmFwc2hvdDthPWEudmFsdWU7dHJ5e3ZhciBjPWIoKTtyZXR1cm4hR2UoYSxjKX1jYXRjaChkKXtyZXR1cm4hMH19ZnVuY3Rpb24gbWkoYSl7dmFyIGI9JGgoKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmKGE9YSgpKTtiLm1lbW9pemVkU3RhdGU9Yi5iYXNlU3RhdGU9YTthPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjpiaSxsYXN0UmVuZGVyZWRTdGF0ZTphfTtiLnF1ZXVlPWE7YT1hLmRpc3BhdGNoPW5pLmJpbmQobnVsbCxMLGEpO3JldHVybltiLm1lbW9pemVkU3RhdGUsYV19XG5mdW5jdGlvbiBpaShhLGIsYyxkKXthPXt0YWc6YSxjcmVhdGU6YixkZXN0cm95OmMsZGVwczpkLG5leHQ6bnVsbH07Yj1MLnVwZGF0ZVF1ZXVlO251bGw9PT1iPyhiPXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LEwudXBkYXRlUXVldWU9YixiLmxhc3RFZmZlY3Q9YS5uZXh0PWEpOihjPWIubGFzdEVmZmVjdCxudWxsPT09Yz9iLmxhc3RFZmZlY3Q9YS5uZXh0PWE6KGQ9Yy5uZXh0LGMubmV4dD1hLGEubmV4dD1kLGIubGFzdEVmZmVjdD1hKSk7cmV0dXJuIGF9ZnVuY3Rpb24gb2koKXtyZXR1cm4gYWkoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIHBpKGEsYixjLGQpe3ZhciBlPSRoKCk7TC5mbGFnc3w9YTtlLm1lbW9pemVkU3RhdGU9aWkoMXxiLGMsdm9pZCAwLHZvaWQgMD09PWQ/bnVsbDpkKX1cbmZ1bmN0aW9uIHFpKGEsYixjLGQpe3ZhciBlPWFpKCk7ZD12b2lkIDA9PT1kP251bGw6ZDt2YXIgZj12b2lkIDA7aWYobnVsbCE9PU0pe3ZhciBnPU0ubWVtb2l6ZWRTdGF0ZTtmPWcuZGVzdHJveTtpZihudWxsIT09ZCYmVGgoZCxnLmRlcHMpKXtlLm1lbW9pemVkU3RhdGU9aWkoYixjLGYsZCk7cmV0dXJufX1MLmZsYWdzfD1hO2UubWVtb2l6ZWRTdGF0ZT1paSgxfGIsYyxmLGQpfWZ1bmN0aW9uIHJpKGEsYil7cmV0dXJuIHBpKDgzOTA2NTYsOCxhLGIpfWZ1bmN0aW9uIGdpKGEsYil7cmV0dXJuIHFpKDIwNDgsOCxhLGIpfWZ1bmN0aW9uIHNpKGEsYil7cmV0dXJuIHFpKDQsMixhLGIpfWZ1bmN0aW9uIHRpKGEsYil7cmV0dXJuIHFpKDQsNCxhLGIpfVxuZnVuY3Rpb24gdWkoYSxiKXtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYilyZXR1cm4gYT1hKCksYihhKSxmdW5jdGlvbigpe2IobnVsbCl9O2lmKG51bGwhPT1iJiZ2b2lkIDAhPT1iKXJldHVybiBhPWEoKSxiLmN1cnJlbnQ9YSxmdW5jdGlvbigpe2IuY3VycmVudD1udWxsfX1mdW5jdGlvbiB2aShhLGIsYyl7Yz1udWxsIT09YyYmdm9pZCAwIT09Yz9jLmNvbmNhdChbYV0pOm51bGw7cmV0dXJuIHFpKDQsNCx1aS5iaW5kKG51bGwsYixhKSxjKX1mdW5jdGlvbiB3aSgpe31mdW5jdGlvbiB4aShhLGIpe3ZhciBjPWFpKCk7Yj12b2lkIDA9PT1iP251bGw6Yjt2YXIgZD1jLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWQmJm51bGwhPT1iJiZUaChiLGRbMV0pKXJldHVybiBkWzBdO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX1cbmZ1bmN0aW9uIHlpKGEsYil7dmFyIGM9YWkoKTtiPXZvaWQgMD09PWI/bnVsbDpiO3ZhciBkPWMubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZCYmbnVsbCE9PWImJlRoKGIsZFsxXSkpcmV0dXJuIGRbMF07YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfWZ1bmN0aW9uIHppKGEsYixjKXtpZigwPT09KE9oJjIxKSlyZXR1cm4gYS5iYXNlU3RhdGUmJihhLmJhc2VTdGF0ZT0hMSx0Zz0hMCksYS5tZW1vaXplZFN0YXRlPWM7R2UoYyxiKXx8KGM9eGMoKSxMLmxhbmVzfD1jLEZnfD1jLGEuYmFzZVN0YXRlPSEwKTtyZXR1cm4gYn1mdW5jdGlvbiBBaShhLGIpe3ZhciBjPUM7Qz0wIT09YyYmND5jP2M6NDthKCEwKTt2YXIgZD1OaC50cmFuc2l0aW9uO05oLnRyYW5zaXRpb249e307dHJ5e2EoITEpLGIoKX1maW5hbGx5e0M9YyxOaC50cmFuc2l0aW9uPWR9fWZ1bmN0aW9uIEJpKCl7cmV0dXJuIGFpKCkubWVtb2l6ZWRTdGF0ZX1cbmZ1bmN0aW9uIENpKGEsYixjKXt2YXIgZD1LZyhhKTtjPXtsYW5lOmQsYWN0aW9uOmMsaGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTtEaShhKT9FaShiLGMpOihGaShhLGIsYyksYz1KZygpLGE9TGcoYSxkLGMpLG51bGwhPT1hJiZHaShhLGIsZCkpfVxuZnVuY3Rpb24gbmkoYSxiLGMpe3ZhciBkPUtnKGEpLGU9e2xhbmU6ZCxhY3Rpb246YyxoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKERpKGEpKUVpKGIsZSk7ZWxzZXtGaShhLGIsZSk7dmFyIGY9YS5hbHRlcm5hdGU7aWYoMD09PWEubGFuZXMmJihudWxsPT09Znx8MD09PWYubGFuZXMpJiYoZj1iLmxhc3RSZW5kZXJlZFJlZHVjZXIsbnVsbCE9PWYpKXRyeXt2YXIgZz1iLmxhc3RSZW5kZXJlZFN0YXRlLGg9ZihnLGMpO2UuaGFzRWFnZXJTdGF0ZT0hMDtlLmVhZ2VyU3RhdGU9aDtpZihHZShoLGcpKXJldHVybn1jYXRjaChrKXt9ZmluYWxseXt9Yz1KZygpO2E9TGcoYSxkLGMpO251bGwhPT1hJiZHaShhLGIsZCl9fWZ1bmN0aW9uIERpKGEpe3ZhciBiPWEuYWx0ZXJuYXRlO3JldHVybiBhPT09THx8bnVsbCE9PWImJmI9PT1MfVxuZnVuY3Rpb24gRWkoYSxiKXtRaD1QaD0hMDt2YXIgYz1hLnBlbmRpbmc7bnVsbD09PWM/Yi5uZXh0PWI6KGIubmV4dD1jLm5leHQsYy5uZXh0PWIpO2EucGVuZGluZz1ifWZ1bmN0aW9uIEZpKGEsYixjKXtCZyhhKT8oYT1iLmludGVybGVhdmVkLG51bGw9PT1hPyhjLm5leHQ9YyxudWxsPT09dmc/dmc9W2JdOnZnLnB1c2goYikpOihjLm5leHQ9YS5uZXh0LGEubmV4dD1jKSxiLmludGVybGVhdmVkPWMpOihhPWIucGVuZGluZyxudWxsPT09YT9jLm5leHQ9YzooYy5uZXh0PWEubmV4dCxhLm5leHQ9YyksYi5wZW5kaW5nPWMpfWZ1bmN0aW9uIEdpKGEsYixjKXtpZigwIT09KGMmNDE5NDI0MCkpe3ZhciBkPWIubGFuZXM7ZCY9YS5wZW5kaW5nTGFuZXM7Y3w9ZDtiLmxhbmVzPWM7QmMoYSxjKX19XG52YXIgWWg9e3JlYWRDb250ZXh0OnVnLHVzZUNhbGxiYWNrOk8sdXNlQ29udGV4dDpPLHVzZUVmZmVjdDpPLHVzZUltcGVyYXRpdmVIYW5kbGU6Tyx1c2VJbnNlcnRpb25FZmZlY3Q6Tyx1c2VMYXlvdXRFZmZlY3Q6Tyx1c2VNZW1vOk8sdXNlUmVkdWNlcjpPLHVzZVJlZjpPLHVzZVN0YXRlOk8sdXNlRGVidWdWYWx1ZTpPLHVzZURlZmVycmVkVmFsdWU6Tyx1c2VUcmFuc2l0aW9uOk8sdXNlTXV0YWJsZVNvdXJjZTpPLHVzZVN5bmNFeHRlcm5hbFN0b3JlOk8sdXNlSWQ6Tyx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LFZoPXtyZWFkQ29udGV4dDp1Zyx1c2VDYWxsYmFjazpmdW5jdGlvbihhLGIpeyRoKCkubWVtb2l6ZWRTdGF0ZT1bYSx2b2lkIDA9PT1iP251bGw6Yl07cmV0dXJuIGF9LHVzZUNvbnRleHQ6dWcsdXNlRWZmZWN0OnJpLHVzZUltcGVyYXRpdmVIYW5kbGU6ZnVuY3Rpb24oYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBwaSg0MTk0MzA4LFxuNCx1aS5iaW5kKG51bGwsYixhKSxjKX0sdXNlTGF5b3V0RWZmZWN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHBpKDQxOTQzMDgsNCxhLGIpfSx1c2VJbnNlcnRpb25FZmZlY3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcGkoNCwyLGEsYil9LHVzZU1lbW86ZnVuY3Rpb24oYSxiKXt2YXIgYz0kaCgpO2I9dm9pZCAwPT09Yj9udWxsOmI7YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfSx1c2VSZWR1Y2VyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0kaCgpO2I9dm9pZCAwIT09Yz9jKGIpOmI7ZC5tZW1vaXplZFN0YXRlPWQuYmFzZVN0YXRlPWI7YT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6YSxsYXN0UmVuZGVyZWRTdGF0ZTpifTtkLnF1ZXVlPWE7YT1hLmRpc3BhdGNoPUNpLmJpbmQobnVsbCxMLGEpO3JldHVybltkLm1lbW9pemVkU3RhdGUsYV19LHVzZVJlZjpmdW5jdGlvbihhKXt2YXIgYj1cbiRoKCk7YT17Y3VycmVudDphfTtyZXR1cm4gYi5tZW1vaXplZFN0YXRlPWF9LHVzZVN0YXRlOm1pLHVzZURlYnVnVmFsdWU6d2ksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gJGgoKS5tZW1vaXplZFN0YXRlPWF9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1taSghMSksYj1hWzBdO2E9QWkuYmluZChudWxsLGFbMV0pOyRoKCkubWVtb2l6ZWRTdGF0ZT1hO3JldHVybltiLGFdfSx1c2VNdXRhYmxlU291cmNlOmZ1bmN0aW9uKCl7fSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9TCxlPSRoKCk7aWYoSSl7aWYodm9pZCAwPT09Yyl0aHJvdyBFcnJvcihwKDQwNykpO2M9YygpfWVsc2V7Yz1iKCk7aWYobnVsbD09PVApdGhyb3cgRXJyb3IocCgzNDkpKTswIT09KE9oJjMwKXx8a2koZCxiLGMpfWUubWVtb2l6ZWRTdGF0ZT1jO3ZhciBmPXt2YWx1ZTpjLGdldFNuYXBzaG90OmJ9O2UucXVldWU9ZjtyaShoaS5iaW5kKG51bGwsZCxcbmYsYSksW2FdKTtkLmZsYWdzfD0yMDQ4O2lpKDksamkuYmluZChudWxsLGQsZixjLGIpLHZvaWQgMCxudWxsKTtyZXR1cm4gY30sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgYT0kaCgpLGI9UC5pZGVudGlmaWVyUHJlZml4O2lmKEkpe3ZhciBjPVpnO3ZhciBkPVlnO2M9KGQmfigxPDwzMi1uYyhkKS0xKSkudG9TdHJpbmcoMzIpK2M7Yj1cIjpcIitiK1wiUlwiK2M7Yz1SaCsrOzA8YyYmKGIrPVwiSFwiK2MudG9TdHJpbmcoMzIpKTtiKz1cIjpcIn1lbHNlIGM9U2grKyxiPVwiOlwiK2IrXCJyXCIrYy50b1N0cmluZygzMikrXCI6XCI7cmV0dXJuIGEubWVtb2l6ZWRTdGF0ZT1ifSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LFdoPXtyZWFkQ29udGV4dDp1Zyx1c2VDYWxsYmFjazp4aSx1c2VDb250ZXh0OnVnLHVzZUVmZmVjdDpnaSx1c2VJbXBlcmF0aXZlSGFuZGxlOnZpLHVzZUluc2VydGlvbkVmZmVjdDpzaSx1c2VMYXlvdXRFZmZlY3Q6dGksdXNlTWVtbzp5aSx1c2VSZWR1Y2VyOmNpLHVzZVJlZjpvaSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjaShiaSl9LFxudXNlRGVidWdWYWx1ZTp3aSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPWFpKCk7cmV0dXJuIHppKGIsTS5tZW1vaXplZFN0YXRlLGEpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9Y2koYmkpWzBdLGI9YWkoKS5tZW1vaXplZFN0YXRlO3JldHVyblthLGJdfSx1c2VNdXRhYmxlU291cmNlOmVpLHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZpLHVzZUlkOkJpLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sWGg9e3JlYWRDb250ZXh0OnVnLHVzZUNhbGxiYWNrOnhpLHVzZUNvbnRleHQ6dWcsdXNlRWZmZWN0OmdpLHVzZUltcGVyYXRpdmVIYW5kbGU6dmksdXNlSW5zZXJ0aW9uRWZmZWN0OnNpLHVzZUxheW91dEVmZmVjdDp0aSx1c2VNZW1vOnlpLHVzZVJlZHVjZXI6ZGksdXNlUmVmOm9pLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGRpKGJpKX0sdXNlRGVidWdWYWx1ZTp3aSx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPWFpKCk7cmV0dXJuIG51bGw9PT1cbk0/Yi5tZW1vaXplZFN0YXRlPWE6emkoYixNLm1lbW9pemVkU3RhdGUsYSl9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1kaShiaSlbMF0sYj1haSgpLm1lbW9pemVkU3RhdGU7cmV0dXJuW2EsYl19LHVzZU11dGFibGVTb3VyY2U6ZWksdXNlU3luY0V4dGVybmFsU3RvcmU6ZmksdXNlSWQ6QmksdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfTtmdW5jdGlvbiBIaShhLGIpe3RyeXt2YXIgYz1cIlwiLGQ9YjtkbyBjKz1PYShkKSxkPWQucmV0dXJuO3doaWxlKGQpO3ZhciBlPWN9Y2F0Y2goZil7ZT1cIlxcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6IFwiK2YubWVzc2FnZStcIlxcblwiK2Yuc3RhY2t9cmV0dXJue3ZhbHVlOmEsc291cmNlOmIsc3RhY2s6ZX19ZnVuY3Rpb24gSWkoYSxiKXt0cnl7Y29uc29sZS5lcnJvcihiLnZhbHVlKX1jYXRjaChjKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgYzt9KX19XG52YXIgSmk9XCJmdW5jdGlvblwiPT09dHlwZW9mIFdlYWtNYXA/V2Vha01hcDpNYXA7ZnVuY3Rpb24gS2koYSxiLGMpe2M9emcoLTEsYyk7Yy50YWc9MztjLnBheWxvYWQ9e2VsZW1lbnQ6bnVsbH07dmFyIGQ9Yi52YWx1ZTtjLmNhbGxiYWNrPWZ1bmN0aW9uKCl7TGl8fChMaT0hMCxNaT1kKTtJaShhLGIpfTtyZXR1cm4gY31cbmZ1bmN0aW9uIE5pKGEsYixjKXtjPXpnKC0xLGMpO2MudGFnPTM7dmFyIGQ9YS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZCl7dmFyIGU9Yi52YWx1ZTtjLnBheWxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZChlKX07Yy5jYWxsYmFjaz1mdW5jdGlvbigpe0lpKGEsYil9fXZhciBmPWEuc3RhdGVOb2RlO251bGwhPT1mJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5jb21wb25lbnREaWRDYXRjaCYmKGMuY2FsbGJhY2s9ZnVuY3Rpb24oKXtJaShhLGIpO1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBkJiYobnVsbD09PU9pP09pPW5ldyBTZXQoW3RoaXNdKTpPaS5hZGQodGhpcykpO3ZhciBjPWIuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaChiLnZhbHVlLHtjb21wb25lbnRTdGFjazpudWxsIT09Yz9jOlwiXCJ9KX0pO3JldHVybiBjfVxuZnVuY3Rpb24gUGkoYSxiLGMpe3ZhciBkPWEucGluZ0NhY2hlO2lmKG51bGw9PT1kKXtkPWEucGluZ0NhY2hlPW5ldyBKaTt2YXIgZT1uZXcgU2V0O2Quc2V0KGIsZSl9ZWxzZSBlPWQuZ2V0KGIpLHZvaWQgMD09PWUmJihlPW5ldyBTZXQsZC5zZXQoYixlKSk7ZS5oYXMoYyl8fChlLmFkZChjKSxhPVFpLmJpbmQobnVsbCxhLGIsYyksYi50aGVuKGEsYSkpfWZ1bmN0aW9uIFJpKGEpe2Rve3ZhciBiO2lmKGI9MTM9PT1hLnRhZyliPWEubWVtb2l6ZWRTdGF0ZSxiPW51bGwhPT1iP251bGwhPT1iLmRlaHlkcmF0ZWQ/ITA6ITE6ITA7aWYoYilyZXR1cm4gYTthPWEucmV0dXJufXdoaWxlKG51bGwhPT1hKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIFNpKGEsYixjLGQsZSl7aWYoMD09PShhLm1vZGUmMSkpcmV0dXJuIGE9PT1iP2EuZmxhZ3N8PTY1NTM2OihhLmZsYWdzfD0xMjgsYy5mbGFnc3w9MTMxMDcyLGMuZmxhZ3MmPS01MjgwNSwxPT09Yy50YWcmJihudWxsPT09Yy5hbHRlcm5hdGU/Yy50YWc9MTc6KGI9emcoLTEsMSksYi50YWc9MixBZyhjLGIpKSksYy5sYW5lc3w9MSksYTthLmZsYWdzfD02NTUzNjthLmxhbmVzPWU7cmV0dXJuIGF9dmFyIFRpLFVpLFZpLFdpO1xuVGk9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yi5jaGlsZDtudWxsIT09Yzspe2lmKDU9PT1jLnRhZ3x8Nj09PWMudGFnKWEuYXBwZW5kQ2hpbGQoYy5zdGF0ZU5vZGUpO2Vsc2UgaWYoNCE9PWMudGFnJiZudWxsIT09Yy5jaGlsZCl7Yy5jaGlsZC5yZXR1cm49YztjPWMuY2hpbGQ7Y29udGludWV9aWYoYz09PWIpYnJlYWs7Zm9yKDtudWxsPT09Yy5zaWJsaW5nOyl7aWYobnVsbD09PWMucmV0dXJufHxjLnJldHVybj09PWIpcmV0dXJuO2M9Yy5yZXR1cm59Yy5zaWJsaW5nLnJldHVybj1jLnJldHVybjtjPWMuc2libGluZ319O1VpPWZ1bmN0aW9uKCl7fTtcblZpPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWEubWVtb2l6ZWRQcm9wcztpZihlIT09ZCl7YT1iLnN0YXRlTm9kZTtFaChCaC5jdXJyZW50KTt2YXIgZj1udWxsO3N3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjplPVhhKGEsZSk7ZD1YYShhLGQpO2Y9W107YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmU9QSh7fSxlLHt2YWx1ZTp2b2lkIDB9KTtkPUEoe30sZCx7dmFsdWU6dm9pZCAwfSk7Zj1bXTticmVhaztjYXNlIFwidGV4dGFyZWFcIjplPWZiKGEsZSk7ZD1mYihhLGQpO2Y9W107YnJlYWs7ZGVmYXVsdDpcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5vbkNsaWNrJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5vbkNsaWNrJiYoYS5vbmNsaWNrPUFmKX10YihjLGQpO3ZhciBnO2M9bnVsbDtmb3IobCBpbiBlKWlmKCFkLmhhc093blByb3BlcnR5KGwpJiZlLmhhc093blByb3BlcnR5KGwpJiZudWxsIT1lW2xdKWlmKFwic3R5bGVcIj09PWwpe3ZhciBoPWVbbF07Zm9yKGcgaW4gaCloLmhhc093blByb3BlcnR5KGcpJiZcbihjfHwoYz17fSksY1tnXT1cIlwiKX1lbHNlXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiIT09bCYmXCJjaGlsZHJlblwiIT09bCYmXCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWwmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1sJiZcImF1dG9Gb2N1c1wiIT09bCYmKGVhLmhhc093blByb3BlcnR5KGwpP2Z8fChmPVtdKTooZj1mfHxbXSkucHVzaChsLG51bGwpKTtmb3IobCBpbiBkKXt2YXIgaz1kW2xdO2g9bnVsbCE9ZT9lW2xdOnZvaWQgMDtpZihkLmhhc093blByb3BlcnR5KGwpJiZrIT09aCYmKG51bGwhPWt8fG51bGwhPWgpKWlmKFwic3R5bGVcIj09PWwpaWYoaCl7Zm9yKGcgaW4gaCkhaC5oYXNPd25Qcm9wZXJ0eShnKXx8ayYmay5oYXNPd25Qcm9wZXJ0eShnKXx8KGN8fChjPXt9KSxjW2ddPVwiXCIpO2ZvcihnIGluIGspay5oYXNPd25Qcm9wZXJ0eShnKSYmaFtnXSE9PWtbZ10mJihjfHwoYz17fSksY1tnXT1rW2ddKX1lbHNlIGN8fChmfHwoZj1bXSksZi5wdXNoKGwsXG5jKSksYz1rO2Vsc2VcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1sPyhrPWs/ay5fX2h0bWw6dm9pZCAwLGg9aD9oLl9faHRtbDp2b2lkIDAsbnVsbCE9ayYmaCE9PWsmJihmPWZ8fFtdKS5wdXNoKGwsaykpOlwiY2hpbGRyZW5cIj09PWw/XCJzdHJpbmdcIiE9PXR5cGVvZiBrJiZcIm51bWJlclwiIT09dHlwZW9mIGt8fChmPWZ8fFtdKS5wdXNoKGwsXCJcIitrKTpcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiIT09bCYmXCJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmdcIiE9PWwmJihlYS5oYXNPd25Qcm9wZXJ0eShsKT8obnVsbCE9ayYmXCJvblNjcm9sbFwiPT09bCYmRChcInNjcm9sbFwiLGEpLGZ8fGg9PT1rfHwoZj1bXSkpOihmPWZ8fFtdKS5wdXNoKGwsaykpfWMmJihmPWZ8fFtdKS5wdXNoKFwic3R5bGVcIixjKTt2YXIgbD1mO2lmKGIudXBkYXRlUXVldWU9bCliLmZsYWdzfD00fX07V2k9ZnVuY3Rpb24oYSxiLGMsZCl7YyE9PWQmJihiLmZsYWdzfD00KX07XG5mdW5jdGlvbiBYaShhLGIpe2lmKCFJKXN3aXRjaChhLnRhaWxNb2RlKXtjYXNlIFwiaGlkZGVuXCI6Yj1hLnRhaWw7Zm9yKHZhciBjPW51bGw7bnVsbCE9PWI7KW51bGwhPT1iLmFsdGVybmF0ZSYmKGM9YiksYj1iLnNpYmxpbmc7bnVsbD09PWM/YS50YWlsPW51bGw6Yy5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSBcImNvbGxhcHNlZFwiOmM9YS50YWlsO2Zvcih2YXIgZD1udWxsO251bGwhPT1jOyludWxsIT09Yy5hbHRlcm5hdGUmJihkPWMpLGM9Yy5zaWJsaW5nO251bGw9PT1kP2J8fG51bGw9PT1hLnRhaWw/YS50YWlsPW51bGw6YS50YWlsLnNpYmxpbmc9bnVsbDpkLnNpYmxpbmc9bnVsbH19XG5mdW5jdGlvbiBRKGEpe3ZhciBiPW51bGwhPT1hLmFsdGVybmF0ZSYmYS5hbHRlcm5hdGUuY2hpbGQ9PT1hLmNoaWxkLGM9MCxkPTA7aWYoYilmb3IodmFyIGU9YS5jaGlsZDtudWxsIT09ZTspY3w9ZS5sYW5lc3xlLmNoaWxkTGFuZXMsZHw9ZS5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQsZHw9ZS5mbGFncyYxNDY4MDA2NCxlLnJldHVybj1hLGU9ZS5zaWJsaW5nO2Vsc2UgZm9yKGU9YS5jaGlsZDtudWxsIT09ZTspY3w9ZS5sYW5lc3xlLmNoaWxkTGFuZXMsZHw9ZS5zdWJ0cmVlRmxhZ3MsZHw9ZS5mbGFncyxlLnJldHVybj1hLGU9ZS5zaWJsaW5nO2Euc3VidHJlZUZsYWdzfD1kO2EuY2hpbGRMYW5lcz1jO3JldHVybiBifVxuZnVuY3Rpb24gWWkoYSxiLGMpe3ZhciBkPWIucGVuZGluZ1Byb3BzO2NoKGIpO3N3aXRjaChiLnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIFEoYiksbnVsbDtjYXNlIDE6cmV0dXJuIFlmKGIudHlwZSkmJlpmKCksUShiKSxudWxsO2Nhc2UgMzpkPWIuc3RhdGVOb2RlO0doKCk7RShWZik7RShIKTtMaCgpO2QucGVuZGluZ0NvbnRleHQmJihkLmNvbnRleHQ9ZC5wZW5kaW5nQ29udGV4dCxkLnBlbmRpbmdDb250ZXh0PW51bGwpO2lmKG51bGw9PT1hfHxudWxsPT09YS5jaGlsZCltaChiKT9iLmZsYWdzfD00Om51bGw9PT1hfHxhLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYwPT09KGIuZmxhZ3MmMjU2KXx8KGIuZmxhZ3N8PTEwMjQsbnVsbCE9PWZoJiYoWmkoZmgpLGZoPW51bGwpKTtVaShhLGIpO1EoYik7cmV0dXJuIG51bGw7Y2FzZSA1OkloKGIpO3ZhciBlPUVoKERoLmN1cnJlbnQpO1xuYz1iLnR5cGU7aWYobnVsbCE9PWEmJm51bGwhPWIuc3RhdGVOb2RlKVZpKGEsYixjLGQsZSksYS5yZWYhPT1iLnJlZiYmKGIuZmxhZ3N8PTUxMixiLmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFkKXtpZihudWxsPT09Yi5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IocCgxNjYpKTtRKGIpO3JldHVybiBudWxsfWE9RWgoQmguY3VycmVudCk7aWYobWgoYikpe2Q9Yi5zdGF0ZU5vZGU7Yz1iLnR5cGU7dmFyIGY9Yi5tZW1vaXplZFByb3BzO2RbTmZdPWI7ZFtPZl09ZjthPTAhPT0oYi5tb2RlJjEpO3N3aXRjaChjKXtjYXNlIFwiZGlhbG9nXCI6RChcImNhbmNlbFwiLGQpO0QoXCJjbG9zZVwiLGQpO2JyZWFrO2Nhc2UgXCJpZnJhbWVcIjpjYXNlIFwib2JqZWN0XCI6Y2FzZSBcImVtYmVkXCI6RChcImxvYWRcIixkKTticmVhaztjYXNlIFwidmlkZW9cIjpjYXNlIFwiYXVkaW9cIjpmb3IoZT0wO2U8a2YubGVuZ3RoO2UrKylEKGtmW2VdLGQpO2JyZWFrO2Nhc2UgXCJzb3VyY2VcIjpEKFwiZXJyb3JcIixkKTticmVhaztjYXNlIFwiaW1nXCI6Y2FzZSBcImltYWdlXCI6Y2FzZSBcImxpbmtcIjpEKFwiZXJyb3JcIixcbmQpO0QoXCJsb2FkXCIsZCk7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpEKFwidG9nZ2xlXCIsZCk7YnJlYWs7Y2FzZSBcImlucHV0XCI6WWEoZCxmKTtEKFwiaW52YWxpZFwiLGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpkLl93cmFwcGVyU3RhdGU9e3dhc011bHRpcGxlOiEhZi5tdWx0aXBsZX07RChcImludmFsaWRcIixkKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpnYihkLGYpLEQoXCJpbnZhbGlkXCIsZCl9dGIoYyxmKTtlPW51bGw7Zm9yKHZhciBnIGluIGYpaWYoZi5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIGg9ZltnXTtcImNoaWxkcmVuXCI9PT1nP1wic3RyaW5nXCI9PT10eXBlb2YgaD9kLnRleHRDb250ZW50IT09aCYmKCEwIT09Zi5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJnpmKGQudGV4dENvbnRlbnQsaCxhKSxlPVtcImNoaWxkcmVuXCIsaF0pOlwibnVtYmVyXCI9PT10eXBlb2YgaCYmZC50ZXh0Q29udGVudCE9PVwiXCIraCYmKCEwIT09Zi5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJnpmKGQudGV4dENvbnRlbnQsXG5oLGEpLGU9W1wiY2hpbGRyZW5cIixcIlwiK2hdKTplYS5oYXNPd25Qcm9wZXJ0eShnKSYmbnVsbCE9aCYmXCJvblNjcm9sbFwiPT09ZyYmRChcInNjcm9sbFwiLGQpfXN3aXRjaChjKXtjYXNlIFwiaW5wdXRcIjpVYShkKTtjYihkLGYsITApO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOlVhKGQpO2liKGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpjYXNlIFwib3B0aW9uXCI6YnJlYWs7ZGVmYXVsdDpcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5vbkNsaWNrJiYoZC5vbmNsaWNrPUFmKX1kPWU7Yi51cGRhdGVRdWV1ZT1kO251bGwhPT1kJiYoYi5mbGFnc3w9NCl9ZWxzZXtnPTk9PT1lLm5vZGVUeXBlP2U6ZS5vd25lckRvY3VtZW50O1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPT09YSYmKGE9amIoYykpO1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPT09YT9cInNjcmlwdFwiPT09Yz8oYT1nLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksYS5pbm5lckhUTUw9XCI8c2NyaXB0PlxceDNjL3NjcmlwdD5cIixhPWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKSk6XG5cInN0cmluZ1wiPT09dHlwZW9mIGQuaXM/YT1nLmNyZWF0ZUVsZW1lbnQoYyx7aXM6ZC5pc30pOihhPWcuY3JlYXRlRWxlbWVudChjKSxcInNlbGVjdFwiPT09YyYmKGc9YSxkLm11bHRpcGxlP2cubXVsdGlwbGU9ITA6ZC5zaXplJiYoZy5zaXplPWQuc2l6ZSkpKTphPWcuY3JlYXRlRWxlbWVudE5TKGEsYyk7YVtOZl09YjthW09mXT1kO1RpKGEsYiwhMSwhMSk7Yi5zdGF0ZU5vZGU9YTthOntnPXViKGMsZCk7c3dpdGNoKGMpe2Nhc2UgXCJkaWFsb2dcIjpEKFwiY2FuY2VsXCIsYSk7RChcImNsb3NlXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJpZnJhbWVcIjpjYXNlIFwib2JqZWN0XCI6Y2FzZSBcImVtYmVkXCI6RChcImxvYWRcIixhKTtlPWQ7YnJlYWs7Y2FzZSBcInZpZGVvXCI6Y2FzZSBcImF1ZGlvXCI6Zm9yKGU9MDtlPGtmLmxlbmd0aDtlKyspRChrZltlXSxhKTtlPWQ7YnJlYWs7Y2FzZSBcInNvdXJjZVwiOkQoXCJlcnJvclwiLGEpO2U9ZDticmVhaztjYXNlIFwiaW1nXCI6Y2FzZSBcImltYWdlXCI6Y2FzZSBcImxpbmtcIjpEKFwiZXJyb3JcIixcbmEpO0QoXCJsb2FkXCIsYSk7ZT1kO2JyZWFrO2Nhc2UgXCJkZXRhaWxzXCI6RChcInRvZ2dsZVwiLGEpO2U9ZDticmVhaztjYXNlIFwiaW5wdXRcIjpZYShhLGQpO2U9WGEoYSxkKTtEKFwiaW52YWxpZFwiLGEpO2JyZWFrO2Nhc2UgXCJvcHRpb25cIjplPWQ7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmEuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFkLm11bHRpcGxlfTtlPUEoe30sZCx7dmFsdWU6dm9pZCAwfSk7RChcImludmFsaWRcIixhKTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpnYihhLGQpO2U9ZmIoYSxkKTtEKFwiaW52YWxpZFwiLGEpO2JyZWFrO2RlZmF1bHQ6ZT1kfXRiKGMsZSk7aD1lO2ZvcihmIGluIGgpaWYoaC5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIGs9aFtmXTtcInN0eWxlXCI9PT1mP3JiKGEsayk6XCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiPT09Zj8oaz1rP2suX19odG1sOnZvaWQgMCxudWxsIT1rJiZtYihhLGspKTpcImNoaWxkcmVuXCI9PT1mP1wic3RyaW5nXCI9PT10eXBlb2Ygaz8oXCJ0ZXh0YXJlYVwiIT09XG5jfHxcIlwiIT09aykmJm5iKGEsayk6XCJudW1iZXJcIj09PXR5cGVvZiBrJiZuYihhLFwiXCIrayk6XCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWYmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1mJiZcImF1dG9Gb2N1c1wiIT09ZiYmKGVhLmhhc093blByb3BlcnR5KGYpP251bGwhPWsmJlwib25TY3JvbGxcIj09PWYmJkQoXCJzY3JvbGxcIixhKTpudWxsIT1rJiZzYShhLGYsayxnKSl9c3dpdGNoKGMpe2Nhc2UgXCJpbnB1dFwiOlVhKGEpO2NiKGEsZCwhMSk7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6VWEoYSk7aWIoYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOm51bGwhPWQudmFsdWUmJmEuc2V0QXR0cmlidXRlKFwidmFsdWVcIixcIlwiK1JhKGQudmFsdWUpKTticmVhaztjYXNlIFwic2VsZWN0XCI6YS5tdWx0aXBsZT0hIWQubXVsdGlwbGU7Zj1kLnZhbHVlO251bGwhPWY/ZWIoYSwhIWQubXVsdGlwbGUsZiwhMSk6bnVsbCE9ZC5kZWZhdWx0VmFsdWUmJmViKGEsISFkLm11bHRpcGxlLGQuZGVmYXVsdFZhbHVlLFxuITApO2JyZWFrO2RlZmF1bHQ6XCJmdW5jdGlvblwiPT09dHlwZW9mIGUub25DbGljayYmKGEub25jbGljaz1BZil9c3dpdGNoKGMpe2Nhc2UgXCJidXR0b25cIjpjYXNlIFwiaW5wdXRcIjpjYXNlIFwic2VsZWN0XCI6Y2FzZSBcInRleHRhcmVhXCI6ZD0hIWQuYXV0b0ZvY3VzO2JyZWFrIGE7Y2FzZSBcImltZ1wiOmQ9ITA7YnJlYWsgYTtkZWZhdWx0OmQ9ITF9fWQmJihiLmZsYWdzfD00KX1udWxsIT09Yi5yZWYmJihiLmZsYWdzfD01MTIsYi5mbGFnc3w9MjA5NzE1Mil9UShiKTtyZXR1cm4gbnVsbDtjYXNlIDY6aWYoYSYmbnVsbCE9Yi5zdGF0ZU5vZGUpV2koYSxiLGEubWVtb2l6ZWRQcm9wcyxkKTtlbHNle2lmKFwic3RyaW5nXCIhPT10eXBlb2YgZCYmbnVsbD09PWIuc3RhdGVOb2RlKXRocm93IEVycm9yKHAoMTY2KSk7Yz1FaChEaC5jdXJyZW50KTtFaChCaC5jdXJyZW50KTtpZihtaChiKSl7ZD1iLnN0YXRlTm9kZTtjPWIubWVtb2l6ZWRQcm9wcztkW05mXT1iO2lmKGY9ZC5ub2RlVmFsdWUhPT1jKWlmKGE9XG5kaCxudWxsIT09YSlzd2l0Y2goYS50YWcpe2Nhc2UgMzp6ZihkLm5vZGVWYWx1ZSxjLDAhPT0oYS5tb2RlJjEpKTticmVhaztjYXNlIDU6ITAhPT1hLm1lbW9pemVkUHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJiZ6ZihkLm5vZGVWYWx1ZSxjLDAhPT0oYS5tb2RlJjEpKX1mJiYoYi5mbGFnc3w9NCl9ZWxzZSBkPSg5PT09Yy5ub2RlVHlwZT9jOmMub3duZXJEb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoZCksZFtOZl09YixiLnN0YXRlTm9kZT1kfVEoYik7cmV0dXJuIG51bGw7Y2FzZSAxMzpFKEspO2Q9Yi5tZW1vaXplZFN0YXRlO2lmKEkmJm51bGwhPT1laCYmMCE9PShiLm1vZGUmMSkmJjA9PT0oYi5mbGFncyYxMjgpKXtmb3IoZD1laDtkOylkPUtmKGQubmV4dFNpYmxpbmcpO25oKCk7Yi5mbGFnc3w9OTg1NjA7cmV0dXJuIGJ9aWYobnVsbCE9PWQmJm51bGwhPT1kLmRlaHlkcmF0ZWQpe2Q9bWgoYik7aWYobnVsbD09PWEpe2lmKCFkKXRocm93IEVycm9yKHAoMzE4KSk7ZD1cbmIubWVtb2l6ZWRTdGF0ZTtkPW51bGwhPT1kP2QuZGVoeWRyYXRlZDpudWxsO2lmKCFkKXRocm93IEVycm9yKHAoMzE3KSk7ZFtOZl09Yn1lbHNlIG5oKCksMD09PShiLmZsYWdzJjEyOCkmJihiLm1lbW9pemVkU3RhdGU9bnVsbCksYi5mbGFnc3w9NDtRKGIpO3JldHVybiBudWxsfW51bGwhPT1maCYmKFppKGZoKSxmaD1udWxsKTtpZigwIT09KGIuZmxhZ3MmMTI4KSlyZXR1cm4gYi5sYW5lcz1jLGI7ZD1udWxsIT09ZDtjPSExO251bGw9PT1hP21oKGIpOmM9bnVsbCE9PWEubWVtb2l6ZWRTdGF0ZTtkIT09YyYmZCYmKGIuY2hpbGQuZmxhZ3N8PTgxOTIsMCE9PShiLm1vZGUmMSkmJihudWxsPT09YXx8MCE9PShLLmN1cnJlbnQmMSk/MD09PVImJihSPTMpOiRpKCkpKTtudWxsIT09Yi51cGRhdGVRdWV1ZSYmKGIuZmxhZ3N8PTQpO1EoYik7cmV0dXJuIG51bGw7Y2FzZSA0OnJldHVybiBHaCgpLFVpKGEsYiksbnVsbD09PWEmJnJmKGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLFEoYiksXG5udWxsO2Nhc2UgMTA6cmV0dXJuIHFnKGIudHlwZS5fY29udGV4dCksUShiKSxudWxsO2Nhc2UgMTc6cmV0dXJuIFlmKGIudHlwZSkmJlpmKCksUShiKSxudWxsO2Nhc2UgMTk6RShLKTtmPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsPT09ZilyZXR1cm4gUShiKSxudWxsO2Q9MCE9PShiLmZsYWdzJjEyOCk7Zz1mLnJlbmRlcmluZztpZihudWxsPT09ZylpZihkKVhpKGYsITEpO2Vsc2V7aWYoMCE9PVJ8fG51bGwhPT1hJiYwIT09KGEuZmxhZ3MmMTI4KSlmb3IoYT1iLmNoaWxkO251bGwhPT1hOyl7Zz1KaChhKTtpZihudWxsIT09Zyl7Yi5mbGFnc3w9MTI4O1hpKGYsITEpO2Q9Zy51cGRhdGVRdWV1ZTtudWxsIT09ZCYmKGIudXBkYXRlUXVldWU9ZCxiLmZsYWdzfD00KTtiLnN1YnRyZWVGbGFncz0wO2Q9Yztmb3IoYz1iLmNoaWxkO251bGwhPT1jOylmPWMsYT1kLGYuZmxhZ3MmPTE0NjgwMDY2LGc9Zi5hbHRlcm5hdGUsbnVsbD09PWc/KGYuY2hpbGRMYW5lcz0wLGYubGFuZXM9YSxmLmNoaWxkPVxubnVsbCxmLnN1YnRyZWVGbGFncz0wLGYubWVtb2l6ZWRQcm9wcz1udWxsLGYubWVtb2l6ZWRTdGF0ZT1udWxsLGYudXBkYXRlUXVldWU9bnVsbCxmLmRlcGVuZGVuY2llcz1udWxsLGYuc3RhdGVOb2RlPW51bGwpOihmLmNoaWxkTGFuZXM9Zy5jaGlsZExhbmVzLGYubGFuZXM9Zy5sYW5lcyxmLmNoaWxkPWcuY2hpbGQsZi5zdWJ0cmVlRmxhZ3M9MCxmLmRlbGV0aW9ucz1udWxsLGYubWVtb2l6ZWRQcm9wcz1nLm1lbW9pemVkUHJvcHMsZi5tZW1vaXplZFN0YXRlPWcubWVtb2l6ZWRTdGF0ZSxmLnVwZGF0ZVF1ZXVlPWcudXBkYXRlUXVldWUsZi50eXBlPWcudHlwZSxhPWcuZGVwZW5kZW5jaWVzLGYuZGVwZW5kZW5jaWVzPW51bGw9PT1hP251bGw6e2xhbmVzOmEubGFuZXMsZmlyc3RDb250ZXh0OmEuZmlyc3RDb250ZXh0fSksYz1jLnNpYmxpbmc7RyhLLEsuY3VycmVudCYxfDIpO3JldHVybiBiLmNoaWxkfWE9YS5zaWJsaW5nfW51bGwhPT1mLnRhaWwmJkIoKT5haiYmKGIuZmxhZ3N8PVxuMTI4LGQ9ITAsWGkoZiwhMSksYi5sYW5lcz00MTk0MzA0KX1lbHNle2lmKCFkKWlmKGE9SmgoZyksbnVsbCE9PWEpe2lmKGIuZmxhZ3N8PTEyOCxkPSEwLGM9YS51cGRhdGVRdWV1ZSxudWxsIT09YyYmKGIudXBkYXRlUXVldWU9YyxiLmZsYWdzfD00KSxYaShmLCEwKSxudWxsPT09Zi50YWlsJiZcImhpZGRlblwiPT09Zi50YWlsTW9kZSYmIWcuYWx0ZXJuYXRlJiYhSSlyZXR1cm4gUShiKSxudWxsfWVsc2UgMipCKCktZi5yZW5kZXJpbmdTdGFydFRpbWU+YWomJjEwNzM3NDE4MjQhPT1jJiYoYi5mbGFnc3w9MTI4LGQ9ITAsWGkoZiwhMSksYi5sYW5lcz00MTk0MzA0KTtmLmlzQmFja3dhcmRzPyhnLnNpYmxpbmc9Yi5jaGlsZCxiLmNoaWxkPWcpOihjPWYubGFzdCxudWxsIT09Yz9jLnNpYmxpbmc9ZzpiLmNoaWxkPWcsZi5sYXN0PWcpfWlmKG51bGwhPT1mLnRhaWwpcmV0dXJuIGI9Zi50YWlsLGYucmVuZGVyaW5nPWIsZi50YWlsPWIuc2libGluZyxmLnJlbmRlcmluZ1N0YXJ0VGltZT1cbkIoKSxiLnNpYmxpbmc9bnVsbCxjPUsuY3VycmVudCxHKEssZD9jJjF8MjpjJjEpLGI7UShiKTtyZXR1cm4gbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIGJqKCksZD1udWxsIT09Yi5tZW1vaXplZFN0YXRlLG51bGwhPT1hJiZudWxsIT09YS5tZW1vaXplZFN0YXRlIT09ZCYmKGIuZmxhZ3N8PTgxOTIpLGQmJjAhPT0oYi5tb2RlJjEpPzAhPT0oY2omMTA3Mzc0MTgyNCkmJihRKGIpLGIuc3VidHJlZUZsYWdzJjYmJihiLmZsYWdzfD04MTkyKSk6UShiKSxudWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7Y2FzZSAyNTpyZXR1cm4gbnVsbH10aHJvdyBFcnJvcihwKDE1NixiLnRhZykpO312YXIgZGo9dGEuUmVhY3RDdXJyZW50T3duZXIsdGc9ITE7ZnVuY3Rpb24gZWooYSxiLGMsZCl7Yi5jaGlsZD1udWxsPT09YT96aChiLG51bGwsYyxkKTp5aChiLGEuY2hpbGQsYyxkKX1cbmZ1bmN0aW9uIGZqKGEsYixjLGQsZSl7Yz1jLnJlbmRlcjt2YXIgZj1iLnJlZjtzZyhiLGUpO2Q9VWgoYSxiLGMsZCxmLGUpO2M9WmgoKTtpZihudWxsIT09YSYmIXRnKXJldHVybiBiLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsYi5mbGFncyY9LTIwNTMsYS5sYW5lcyY9fmUsZ2ooYSxiLGUpO0kmJmMmJmJoKGIpO2IuZmxhZ3N8PTE7ZWooYSxiLGQsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBoaihhLGIsYyxkLGUpe2lmKG51bGw9PT1hKXt2YXIgZj1jLnR5cGU7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGYmJiFpaihmKSYmdm9pZCAwPT09Zi5kZWZhdWx0UHJvcHMmJm51bGw9PT1jLmNvbXBhcmUmJnZvaWQgMD09PWMuZGVmYXVsdFByb3BzKXJldHVybiBiLnRhZz0xNSxiLnR5cGU9ZixqaihhLGIsZixkLGUpO2E9dmgoYy50eXBlLG51bGwsZCxiLGIubW9kZSxlKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9Zj1hLmNoaWxkO2lmKDA9PT0oYS5sYW5lcyZlKSl7dmFyIGc9Zi5tZW1vaXplZFByb3BzO2M9Yy5jb21wYXJlO2M9bnVsbCE9PWM/YzpIZTtpZihjKGcsZCkmJmEucmVmPT09Yi5yZWYpcmV0dXJuIGdqKGEsYixlKX1iLmZsYWdzfD0xO2E9dGgoZixkKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9XG5mdW5jdGlvbiBqaihhLGIsYyxkLGUpe2lmKG51bGwhPT1hKXt2YXIgZj1hLm1lbW9pemVkUHJvcHM7aWYoSGUoZixkKSYmYS5yZWY9PT1iLnJlZilpZih0Zz0hMSxiLnBlbmRpbmdQcm9wcz1kPWYsMCE9PShhLmxhbmVzJmUpKTAhPT0oYS5mbGFncyYxMzEwNzIpJiYodGc9ITApO2Vsc2UgcmV0dXJuIGIubGFuZXM9YS5sYW5lcyxnaihhLGIsZSl9cmV0dXJuIGtqKGEsYixjLGQsZSl9XG5mdW5jdGlvbiBsaihhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHMsZT1kLmNoaWxkcmVuLGY9bnVsbCE9PWE/YS5tZW1vaXplZFN0YXRlOm51bGw7aWYoXCJoaWRkZW5cIj09PWQubW9kZSlpZigwPT09KGIubW9kZSYxKSliLm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LEcobWosY2opLGNqfD1jO2Vsc2UgaWYoMCE9PShjJjEwNzM3NDE4MjQpKWIubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjAsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0sZD1udWxsIT09Zj9mLmJhc2VMYW5lczpjLEcobWosY2opLGNqfD1kO2Vsc2UgcmV0dXJuIGE9bnVsbCE9PWY/Zi5iYXNlTGFuZXN8YzpjLGIubGFuZXM9Yi5jaGlsZExhbmVzPTEwNzM3NDE4MjQsYi5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6YSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxiLnVwZGF0ZVF1ZXVlPW51bGwsRyhtaixjaiksY2p8PWEsbnVsbDtcbmVsc2UgbnVsbCE9PWY/KGQ9Zi5iYXNlTGFuZXN8YyxiLm1lbW9pemVkU3RhdGU9bnVsbCk6ZD1jLEcobWosY2opLGNqfD1kO2VqKGEsYixlLGMpO3JldHVybiBiLmNoaWxkfWZ1bmN0aW9uIG5qKGEsYil7dmFyIGM9Yi5yZWY7aWYobnVsbD09PWEmJm51bGwhPT1jfHxudWxsIT09YSYmYS5yZWYhPT1jKWIuZmxhZ3N8PTUxMixiLmZsYWdzfD0yMDk3MTUyfWZ1bmN0aW9uIGtqKGEsYixjLGQsZSl7dmFyIGY9WWYoYyk/V2Y6SC5jdXJyZW50O2Y9WGYoYixmKTtzZyhiLGUpO2M9VWgoYSxiLGMsZCxmLGUpO2Q9WmgoKTtpZihudWxsIT09YSYmIXRnKXJldHVybiBiLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsYi5mbGFncyY9LTIwNTMsYS5sYW5lcyY9fmUsZ2ooYSxiLGUpO0kmJmQmJmJoKGIpO2IuZmxhZ3N8PTE7ZWooYSxiLGMsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBvaihhLGIsYyxkLGUpe2lmKFlmKGMpKXt2YXIgZj0hMDtiZyhiKX1lbHNlIGY9ITE7c2coYixlKTtpZihudWxsPT09Yi5zdGF0ZU5vZGUpbnVsbCE9PWEmJihhLmFsdGVybmF0ZT1udWxsLGIuYWx0ZXJuYXRlPW51bGwsYi5mbGFnc3w9MiksT2coYixjLGQpLFFnKGIsYyxkLGUpLGQ9ITA7ZWxzZSBpZihudWxsPT09YSl7dmFyIGc9Yi5zdGF0ZU5vZGUsaD1iLm1lbW9pemVkUHJvcHM7Zy5wcm9wcz1oO3ZhciBrPWcuY29udGV4dCxsPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBsJiZudWxsIT09bD9sPXVnKGwpOihsPVlmKGMpP1dmOkguY3VycmVudCxsPVhmKGIsbCkpO3ZhciBuPWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHU9XCJmdW5jdGlvblwiPT09dHlwZW9mIG58fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlO3V8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZcblwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09ZHx8ayE9PWwpJiZQZyhiLGcsZCxsKTt3Zz0hMTt2YXIgcT1iLm1lbW9pemVkU3RhdGU7Zy5zdGF0ZT1xO0VnKGIsZCxnLGUpO2s9Yi5tZW1vaXplZFN0YXRlO2ghPT1kfHxxIT09a3x8VmYuY3VycmVudHx8d2c/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBuJiYoSWcoYixjLG4sZCksaz1iLm1lbW9pemVkU3RhdGUpLChoPXdnfHxOZyhiLGMsaCxkLHEsayxsKSk/KHV8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudHx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxNb3VudCYmZy5jb21wb25lbnRXaWxsTW91bnQoKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZnLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksXCJmdW5jdGlvblwiPT09XG50eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQxOTQzMDgpKTooXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmZsYWdzfD00MTk0MzA4KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9ayksZy5wcm9wcz1kLGcuc3RhdGU9ayxnLmNvbnRleHQ9bCxkPWgpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZmxhZ3N8PTQxOTQzMDgpLGQ9ITEpfWVsc2V7Zz1iLnN0YXRlTm9kZTt5ZyhhLGIpO2g9Yi5tZW1vaXplZFByb3BzO2w9Yi50eXBlPT09Yi5lbGVtZW50VHlwZT9oOmtnKGIudHlwZSxoKTtnLnByb3BzPWw7dT1iLnBlbmRpbmdQcm9wcztxPWcuY29udGV4dDtrPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBrJiZudWxsIT09az9rPXVnKGspOihrPVlmKGMpP1dmOkguY3VycmVudCxrPVhmKGIsaykpO3ZhciB5PWMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhuPVwiZnVuY3Rpb25cIj09PVxudHlwZW9mIHl8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKXx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChoIT09dXx8cSE9PWspJiZQZyhiLGcsZCxrKTt3Zz0hMTtxPWIubWVtb2l6ZWRTdGF0ZTtnLnN0YXRlPXE7RWcoYixkLGcsZSk7dmFyIG09Yi5tZW1vaXplZFN0YXRlO2ghPT11fHxxIT09bXx8VmYuY3VycmVudHx8d2c/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiB5JiYoSWcoYixjLHksZCksbT1iLm1lbW9pemVkU3RhdGUpLChsPXdnfHxOZyhiLGMsbCxkLHEsbSxrKXx8ITEpPyhufHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFVwZGF0ZXx8KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudFdpbGxVcGRhdGUmJlxuZy5jb21wb25lbnRXaWxsVXBkYXRlKGQsbSxrKSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmZy5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShkLG0saykpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZSYmKGIuZmxhZ3N8PTQpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlJiYoYi5mbGFnc3w9MTAyNCkpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnE9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmcT09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZmxhZ3N8PTEwMjQpLGIubWVtb2l6ZWRQcm9wcz1kLGIubWVtb2l6ZWRTdGF0ZT1tKSxnLnByb3BzPWQsZy5zdGF0ZT1tLGcuY29udGV4dD1cbmssZD1sKTooXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlfHxoPT09YS5tZW1vaXplZFByb3BzJiZxPT09YS5tZW1vaXplZFN0YXRlfHwoYi5mbGFnc3w9NCksXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJnE9PT1hLm1lbW9pemVkU3RhdGV8fChiLmZsYWdzfD0xMDI0KSxkPSExKX1yZXR1cm4gcGooYSxiLGMsZCxmLGUpfVxuZnVuY3Rpb24gcGooYSxiLGMsZCxlLGYpe25qKGEsYik7dmFyIGc9MCE9PShiLmZsYWdzJjEyOCk7aWYoIWQmJiFnKXJldHVybiBlJiZjZyhiLGMsITEpLGdqKGEsYixmKTtkPWIuc3RhdGVOb2RlO2RqLmN1cnJlbnQ9Yjt2YXIgaD1nJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I/bnVsbDpkLnJlbmRlcigpO2IuZmxhZ3N8PTE7bnVsbCE9PWEmJmc/KGIuY2hpbGQ9eWgoYixhLmNoaWxkLG51bGwsZiksYi5jaGlsZD15aChiLG51bGwsaCxmKSk6ZWooYSxiLGgsZik7Yi5tZW1vaXplZFN0YXRlPWQuc3RhdGU7ZSYmY2coYixjLCEwKTtyZXR1cm4gYi5jaGlsZH1mdW5jdGlvbiBxaihhKXt2YXIgYj1hLnN0YXRlTm9kZTtiLnBlbmRpbmdDb250ZXh0PyRmKGEsYi5wZW5kaW5nQ29udGV4dCxiLnBlbmRpbmdDb250ZXh0IT09Yi5jb250ZXh0KTpiLmNvbnRleHQmJiRmKGEsYi5jb250ZXh0LCExKTtGaChhLGIuY29udGFpbmVySW5mbyl9XG5mdW5jdGlvbiByaihhLGIsYyxkLGUpe25oKCk7b2goZSk7Yi5mbGFnc3w9MjU2O2VqKGEsYixjLGQpO3JldHVybiBiLmNoaWxkfXZhciBzaj17ZGVoeWRyYXRlZDpudWxsLHRyZWVDb250ZXh0Om51bGwscmV0cnlMYW5lOjB9O2Z1bmN0aW9uIHRqKGEpe3JldHVybntiYXNlTGFuZXM6YSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfX1mdW5jdGlvbiB1aihhLGIpe3JldHVybntiYXNlTGFuZXM6YS5iYXNlTGFuZXN8YixjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczphLnRyYW5zaXRpb25zfX1cbmZ1bmN0aW9uIHZqKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPUsuY3VycmVudCxmPSExLGc9MCE9PShiLmZsYWdzJjEyOCksaDsoaD1nKXx8KGg9bnVsbCE9PWEmJm51bGw9PT1hLm1lbW9pemVkU3RhdGU/ITE6MCE9PShlJjIpKTtpZihoKWY9ITAsYi5mbGFncyY9LTEyOTtlbHNlIGlmKG51bGw9PT1hfHxudWxsIT09YS5tZW1vaXplZFN0YXRlKWV8PTE7RyhLLGUmMSk7aWYobnVsbD09PWEpe2toKGIpO2E9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1hJiYoYT1hLmRlaHlkcmF0ZWQsbnVsbCE9PWEpKXJldHVybiAwPT09KGIubW9kZSYxKT9iLmxhbmVzPTE6XCIkIVwiPT09YS5kYXRhP2IubGFuZXM9ODpiLmxhbmVzPTEwNzM3NDE4MjQsbnVsbDtlPWQuY2hpbGRyZW47YT1kLmZhbGxiYWNrO3JldHVybiBmPyhkPWIubW9kZSxmPWIuY2hpbGQsZT17bW9kZTpcImhpZGRlblwiLGNoaWxkcmVuOmV9LDA9PT0oZCYxKSYmbnVsbCE9PWY/KGYuY2hpbGRMYW5lcz0wLGYucGVuZGluZ1Byb3BzPVxuZSk6Zj13aihlLGQsMCxudWxsKSxhPXhoKGEsZCxjLG51bGwpLGYucmV0dXJuPWIsYS5yZXR1cm49YixmLnNpYmxpbmc9YSxiLmNoaWxkPWYsYi5jaGlsZC5tZW1vaXplZFN0YXRlPXRqKGMpLGIubWVtb2l6ZWRTdGF0ZT1zaixhKTp4aihiLGUpfWU9YS5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1lKXtoPWUuZGVoeWRyYXRlZDtpZihudWxsIT09aCl7aWYoZyl7aWYoYi5mbGFncyYyNTYpcmV0dXJuIGIuZmxhZ3MmPS0yNTcseWooYSxiLGMsRXJyb3IocCg0MjIpKSk7aWYobnVsbCE9PWIubWVtb2l6ZWRTdGF0ZSlyZXR1cm4gYi5jaGlsZD1hLmNoaWxkLGIuZmxhZ3N8PTEyOCxudWxsO2Y9ZC5mYWxsYmFjaztlPWIubW9kZTtkPXdqKHttb2RlOlwidmlzaWJsZVwiLGNoaWxkcmVuOmQuY2hpbGRyZW59LGUsMCxudWxsKTtmPXhoKGYsZSxjLG51bGwpO2YuZmxhZ3N8PTI7ZC5yZXR1cm49YjtmLnJldHVybj1iO2Quc2libGluZz1mO2IuY2hpbGQ9ZDswIT09KGIubW9kZSYxKSYmeWgoYixhLmNoaWxkLFxubnVsbCxjKTtiLmNoaWxkLm1lbW9pemVkU3RhdGU9dGooYyk7Yi5tZW1vaXplZFN0YXRlPXNqO3JldHVybiBmfWlmKDA9PT0oYi5tb2RlJjEpKWI9eWooYSxiLGMsbnVsbCk7ZWxzZSBpZihcIiQhXCI9PT1oLmRhdGEpYj15aihhLGIsYyxFcnJvcihwKDQxOSkpKTtlbHNlIGlmKGQ9MCE9PShjJmEuY2hpbGRMYW5lcyksdGd8fGQpe2Q9UDtpZihudWxsIT09ZCl7c3dpdGNoKGMmLWMpe2Nhc2UgNDpmPTI7YnJlYWs7Y2FzZSAxNjpmPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OmY9MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6Zj1cbjI2ODQzNTQ1NjticmVhaztkZWZhdWx0OmY9MH1kPTAhPT0oZiYoZC5zdXNwZW5kZWRMYW5lc3xjKSk/MDpmOzAhPT1kJiZkIT09ZS5yZXRyeUxhbmUmJihlLnJldHJ5TGFuZT1kLExnKGEsZCwtMSkpfSRpKCk7Yj15aihhLGIsYyxFcnJvcihwKDQyMSkpKX1lbHNlXCIkP1wiPT09aC5kYXRhPyhiLmZsYWdzfD0xMjgsYi5jaGlsZD1hLmNoaWxkLGI9emouYmluZChudWxsLGEpLGguX3JlYWN0UmV0cnk9YixiPW51bGwpOihjPWUudHJlZUNvbnRleHQsZWg9S2YoaC5uZXh0U2libGluZyksZGg9YixJPSEwLGZoPW51bGwsbnVsbCE9PWMmJihWZ1tXZysrXT1ZZyxWZ1tXZysrXT1aZyxWZ1tXZysrXT1YZyxZZz1jLmlkLFpnPWMub3ZlcmZsb3csWGc9YiksYj14aihiLGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuKSxiLmZsYWdzfD00MDk2KTtyZXR1cm4gYn1pZihmKXJldHVybiBkPUFqKGEsYixkLmNoaWxkcmVuLGQuZmFsbGJhY2ssYyksZj1iLmNoaWxkLGU9YS5jaGlsZC5tZW1vaXplZFN0YXRlLFxuZi5tZW1vaXplZFN0YXRlPW51bGw9PT1lP3RqKGMpOnVqKGUsYyksZi5jaGlsZExhbmVzPWEuY2hpbGRMYW5lcyZ+YyxiLm1lbW9pemVkU3RhdGU9c2osZDtjPUJqKGEsYixkLmNoaWxkcmVuLGMpO2IubWVtb2l6ZWRTdGF0ZT1udWxsO3JldHVybiBjfWlmKGYpcmV0dXJuIGQ9QWooYSxiLGQuY2hpbGRyZW4sZC5mYWxsYmFjayxjKSxmPWIuY2hpbGQsZT1hLmNoaWxkLm1lbW9pemVkU3RhdGUsZi5tZW1vaXplZFN0YXRlPW51bGw9PT1lP3RqKGMpOnVqKGUsYyksZi5jaGlsZExhbmVzPWEuY2hpbGRMYW5lcyZ+YyxiLm1lbW9pemVkU3RhdGU9c2osZDtjPUJqKGEsYixkLmNoaWxkcmVuLGMpO2IubWVtb2l6ZWRTdGF0ZT1udWxsO3JldHVybiBjfWZ1bmN0aW9uIHhqKGEsYil7Yj13aih7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjpifSxhLm1vZGUsMCxudWxsKTtiLnJldHVybj1hO3JldHVybiBhLmNoaWxkPWJ9XG5mdW5jdGlvbiBCaihhLGIsYyxkKXt2YXIgZT1hLmNoaWxkO2E9ZS5zaWJsaW5nO2M9dGgoZSx7bW9kZTpcInZpc2libGVcIixjaGlsZHJlbjpjfSk7MD09PShiLm1vZGUmMSkmJihjLmxhbmVzPWQpO2MucmV0dXJuPWI7Yy5zaWJsaW5nPW51bGw7bnVsbCE9PWEmJihkPWIuZGVsZXRpb25zLG51bGw9PT1kPyhiLmRlbGV0aW9ucz1bYV0sYi5mbGFnc3w9MTYpOmQucHVzaChhKSk7cmV0dXJuIGIuY2hpbGQ9Y31cbmZ1bmN0aW9uIEFqKGEsYixjLGQsZSl7dmFyIGY9Yi5tb2RlO2E9YS5jaGlsZDt2YXIgZz1hLnNpYmxpbmcsaD17bW9kZTpcImhpZGRlblwiLGNoaWxkcmVuOmN9OzA9PT0oZiYxKSYmYi5jaGlsZCE9PWE/KGM9Yi5jaGlsZCxjLmNoaWxkTGFuZXM9MCxjLnBlbmRpbmdQcm9wcz1oLGIuZGVsZXRpb25zPW51bGwpOihjPXRoKGEsaCksYy5zdWJ0cmVlRmxhZ3M9YS5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQpO251bGwhPT1nP2Q9dGgoZyxkKTooZD14aChkLGYsZSxudWxsKSxkLmZsYWdzfD0yKTtkLnJldHVybj1iO2MucmV0dXJuPWI7Yy5zaWJsaW5nPWQ7Yi5jaGlsZD1jO3JldHVybiBkfWZ1bmN0aW9uIHlqKGEsYixjLGQpe251bGwhPT1kJiZvaChkKTt5aChiLGEuY2hpbGQsbnVsbCxjKTthPXhqKGIsYi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4pO2EuZmxhZ3N8PTI7Yi5tZW1vaXplZFN0YXRlPW51bGw7cmV0dXJuIGF9XG5mdW5jdGlvbiBDaihhLGIsYyl7YS5sYW5lc3w9Yjt2YXIgZD1hLmFsdGVybmF0ZTtudWxsIT09ZCYmKGQubGFuZXN8PWIpO3JnKGEucmV0dXJuLGIsYyl9ZnVuY3Rpb24gRGooYSxiLGMsZCxlKXt2YXIgZj1hLm1lbW9pemVkU3RhdGU7bnVsbD09PWY/YS5tZW1vaXplZFN0YXRlPXtpc0JhY2t3YXJkczpiLHJlbmRlcmluZzpudWxsLHJlbmRlcmluZ1N0YXJ0VGltZTowLGxhc3Q6ZCx0YWlsOmMsdGFpbE1vZGU6ZX06KGYuaXNCYWNrd2FyZHM9YixmLnJlbmRlcmluZz1udWxsLGYucmVuZGVyaW5nU3RhcnRUaW1lPTAsZi5sYXN0PWQsZi50YWlsPWMsZi50YWlsTW9kZT1lKX1cbmZ1bmN0aW9uIEVqKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPWQucmV2ZWFsT3JkZXIsZj1kLnRhaWw7ZWooYSxiLGQuY2hpbGRyZW4sYyk7ZD1LLmN1cnJlbnQ7aWYoMCE9PShkJjIpKWQ9ZCYxfDIsYi5mbGFnc3w9MTI4O2Vsc2V7aWYobnVsbCE9PWEmJjAhPT0oYS5mbGFncyYxMjgpKWE6Zm9yKGE9Yi5jaGlsZDtudWxsIT09YTspe2lmKDEzPT09YS50YWcpbnVsbCE9PWEubWVtb2l6ZWRTdGF0ZSYmQ2ooYSxjLGIpO2Vsc2UgaWYoMTk9PT1hLnRhZylDaihhLGMsYik7ZWxzZSBpZihudWxsIT09YS5jaGlsZCl7YS5jaGlsZC5yZXR1cm49YTthPWEuY2hpbGQ7Y29udGludWV9aWYoYT09PWIpYnJlYWsgYTtmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fGEucmV0dXJuPT09YilicmVhayBhO2E9YS5yZXR1cm59YS5zaWJsaW5nLnJldHVybj1hLnJldHVybjthPWEuc2libGluZ31kJj0xfUcoSyxkKTtpZigwPT09KGIubW9kZSYxKSliLm1lbW9pemVkU3RhdGU9XG5udWxsO2Vsc2Ugc3dpdGNoKGUpe2Nhc2UgXCJmb3J3YXJkc1wiOmM9Yi5jaGlsZDtmb3IoZT1udWxsO251bGwhPT1jOylhPWMuYWx0ZXJuYXRlLG51bGwhPT1hJiZudWxsPT09SmgoYSkmJihlPWMpLGM9Yy5zaWJsaW5nO2M9ZTtudWxsPT09Yz8oZT1iLmNoaWxkLGIuY2hpbGQ9bnVsbCk6KGU9Yy5zaWJsaW5nLGMuc2libGluZz1udWxsKTtEaihiLCExLGUsYyxmKTticmVhaztjYXNlIFwiYmFja3dhcmRzXCI6Yz1udWxsO2U9Yi5jaGlsZDtmb3IoYi5jaGlsZD1udWxsO251bGwhPT1lOyl7YT1lLmFsdGVybmF0ZTtpZihudWxsIT09YSYmbnVsbD09PUpoKGEpKXtiLmNoaWxkPWU7YnJlYWt9YT1lLnNpYmxpbmc7ZS5zaWJsaW5nPWM7Yz1lO2U9YX1EaihiLCEwLGMsbnVsbCxmKTticmVhaztjYXNlIFwidG9nZXRoZXJcIjpEaihiLCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6Yi5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBnaihhLGIsYyl7bnVsbCE9PWEmJihiLmRlcGVuZGVuY2llcz1hLmRlcGVuZGVuY2llcyk7Rmd8PWIubGFuZXM7aWYoMD09PShjJmIuY2hpbGRMYW5lcykpcmV0dXJuIG51bGw7aWYobnVsbCE9PWEmJmIuY2hpbGQhPT1hLmNoaWxkKXRocm93IEVycm9yKHAoMTUzKSk7aWYobnVsbCE9PWIuY2hpbGQpe2E9Yi5jaGlsZDtjPXRoKGEsYS5wZW5kaW5nUHJvcHMpO2IuY2hpbGQ9Yztmb3IoYy5yZXR1cm49YjtudWxsIT09YS5zaWJsaW5nOylhPWEuc2libGluZyxjPWMuc2libGluZz10aChhLGEucGVuZGluZ1Byb3BzKSxjLnJldHVybj1iO2Muc2libGluZz1udWxsfXJldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gRmooYSxiLGMpe3N3aXRjaChiLnRhZyl7Y2FzZSAzOnFqKGIpO25oKCk7YnJlYWs7Y2FzZSA1OkhoKGIpO2JyZWFrO2Nhc2UgMTpZZihiLnR5cGUpJiZiZyhiKTticmVhaztjYXNlIDQ6RmgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTticmVhaztjYXNlIDEwOnZhciBkPWIudHlwZS5fY29udGV4dCxlPWIubWVtb2l6ZWRQcm9wcy52YWx1ZTtHKGxnLGQuX2N1cnJlbnRWYWx1ZSk7ZC5fY3VycmVudFZhbHVlPWU7YnJlYWs7Y2FzZSAxMzpkPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZCl7aWYobnVsbCE9PWQuZGVoeWRyYXRlZClyZXR1cm4gRyhLLEsuY3VycmVudCYxKSxiLmZsYWdzfD0xMjgsbnVsbDtpZigwIT09KGMmYi5jaGlsZC5jaGlsZExhbmVzKSlyZXR1cm4gdmooYSxiLGMpO0coSyxLLmN1cnJlbnQmMSk7YT1naihhLGIsYyk7cmV0dXJuIG51bGwhPT1hP2Euc2libGluZzpudWxsfUcoSyxLLmN1cnJlbnQmMSk7YnJlYWs7Y2FzZSAxOTpkPTAhPT0oYyZcbmIuY2hpbGRMYW5lcyk7aWYoMCE9PShhLmZsYWdzJjEyOCkpe2lmKGQpcmV0dXJuIEVqKGEsYixjKTtiLmZsYWdzfD0xMjh9ZT1iLm1lbW9pemVkU3RhdGU7bnVsbCE9PWUmJihlLnJlbmRlcmluZz1udWxsLGUudGFpbD1udWxsLGUubGFzdEVmZmVjdD1udWxsKTtHKEssSy5jdXJyZW50KTtpZihkKWJyZWFrO2Vsc2UgcmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBiLmxhbmVzPTAsbGooYSxiLGMpfXJldHVybiBnaihhLGIsYyl9XG5mdW5jdGlvbiBHaihhLGIpe2NoKGIpO3N3aXRjaChiLnRhZyl7Y2FzZSAxOnJldHVybiBZZihiLnR5cGUpJiZaZigpLGE9Yi5mbGFncyxhJjY1NTM2PyhiLmZsYWdzPWEmLTY1NTM3fDEyOCxiKTpudWxsO2Nhc2UgMzpyZXR1cm4gR2goKSxFKFZmKSxFKEgpLExoKCksYT1iLmZsYWdzLDAhPT0oYSY2NTUzNikmJjA9PT0oYSYxMjgpPyhiLmZsYWdzPWEmLTY1NTM3fDEyOCxiKTpudWxsO2Nhc2UgNTpyZXR1cm4gSWgoYiksbnVsbDtjYXNlIDEzOkUoSyk7YT1iLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWEmJm51bGwhPT1hLmRlaHlkcmF0ZWQpe2lmKG51bGw9PT1iLmFsdGVybmF0ZSl0aHJvdyBFcnJvcihwKDM0MCkpO25oKCl9YT1iLmZsYWdzO3JldHVybiBhJjY1NTM2PyhiLmZsYWdzPWEmLTY1NTM3fDEyOCxiKTpudWxsO2Nhc2UgMTk6cmV0dXJuIEUoSyksbnVsbDtjYXNlIDQ6cmV0dXJuIEdoKCksbnVsbDtjYXNlIDEwOnJldHVybiBxZyhiLnR5cGUuX2NvbnRleHQpLG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBiaigpLFxubnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBIaj0hMSxTPSExLElqPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWFrU2V0P1dlYWtTZXQ6U2V0LFQ9bnVsbDtmdW5jdGlvbiBKaihhLGIpe3ZhciBjPWEucmVmO2lmKG51bGwhPT1jKWlmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBjKXRyeXtjKG51bGwpfWNhdGNoKGQpe1UoYSxiLGQpfWVsc2UgYy5jdXJyZW50PW51bGx9ZnVuY3Rpb24gS2ooYSxiLGMpe3RyeXtjKCl9Y2F0Y2goZCl7VShhLGIsZCl9fXZhciBMaj0hMTtcbmZ1bmN0aW9uIE1qKGEsYil7QmY9Y2Q7YT1MZSgpO2lmKE1lKGEpKXtpZihcInNlbGVjdGlvblN0YXJ0XCJpbiBhKXZhciBjPXtzdGFydDphLnNlbGVjdGlvblN0YXJ0LGVuZDphLnNlbGVjdGlvbkVuZH07ZWxzZSBhOntjPShjPWEub3duZXJEb2N1bWVudCkmJmMuZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgZD1jLmdldFNlbGVjdGlvbiYmYy5nZXRTZWxlY3Rpb24oKTtpZihkJiYwIT09ZC5yYW5nZUNvdW50KXtjPWQuYW5jaG9yTm9kZTt2YXIgZT1kLmFuY2hvck9mZnNldCxmPWQuZm9jdXNOb2RlO2Q9ZC5mb2N1c09mZnNldDt0cnl7Yy5ub2RlVHlwZSxmLm5vZGVUeXBlfWNhdGNoKFope2M9bnVsbDticmVhayBhfXZhciBnPTAsaD0tMSxrPS0xLGw9MCxuPTAsdT1hLHE9bnVsbDtiOmZvcig7Oyl7Zm9yKHZhciB5Ozspe3UhPT1jfHwwIT09ZSYmMyE9PXUubm9kZVR5cGV8fChoPWcrZSk7dSE9PWZ8fDAhPT1kJiYzIT09dS5ub2RlVHlwZXx8KGs9ZytkKTszPT09dS5ub2RlVHlwZSYmKGcrPVxudS5ub2RlVmFsdWUubGVuZ3RoKTtpZihudWxsPT09KHk9dS5maXJzdENoaWxkKSlicmVhaztxPXU7dT15fWZvcig7Oyl7aWYodT09PWEpYnJlYWsgYjtxPT09YyYmKytsPT09ZSYmKGg9Zyk7cT09PWYmJisrbj09PWQmJihrPWcpO2lmKG51bGwhPT0oeT11Lm5leHRTaWJsaW5nKSlicmVhazt1PXE7cT11LnBhcmVudE5vZGV9dT15fWM9LTE9PT1ofHwtMT09PWs/bnVsbDp7c3RhcnQ6aCxlbmQ6a319ZWxzZSBjPW51bGx9Yz1jfHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBjPW51bGw7Q2Y9e2ZvY3VzZWRFbGVtOmEsc2VsZWN0aW9uUmFuZ2U6Y307Y2Q9ITE7Zm9yKFQ9YjtudWxsIT09VDspaWYoYj1ULGE9Yi5jaGlsZCwwIT09KGIuc3VidHJlZUZsYWdzJjEwMjgpJiZudWxsIT09YSlhLnJldHVybj1iLFQ9YTtlbHNlIGZvcig7bnVsbCE9PVQ7KXtiPVQ7dHJ5e3ZhciBtPWIuYWx0ZXJuYXRlO2lmKDAhPT0oYi5mbGFncyYxMDI0KSlzd2l0Y2goYi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6YnJlYWs7XG5jYXNlIDE6aWYobnVsbCE9PW0pe3ZhciB3PW0ubWVtb2l6ZWRQcm9wcyxKPW0ubWVtb2l6ZWRTdGF0ZSx2PWIuc3RhdGVOb2RlLHg9di5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShiLmVsZW1lbnRUeXBlPT09Yi50eXBlP3c6a2coYi50eXBlLHcpLEopO3YuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9eH1icmVhaztjYXNlIDM6dmFyIHI9Yi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztpZigxPT09ci5ub2RlVHlwZSlyLnRleHRDb250ZW50PVwiXCI7ZWxzZSBpZig5PT09ci5ub2RlVHlwZSl7dmFyIEY9ci5ib2R5O251bGwhPUYmJihGLnRleHRDb250ZW50PVwiXCIpfWJyZWFrO2Nhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDE2MykpO319Y2F0Y2goWil7VShiLGIucmV0dXJuLFopfWE9Yi5zaWJsaW5nO2lmKG51bGwhPT1hKXthLnJldHVybj1iLnJldHVybjtUPWE7YnJlYWt9VD1iLnJldHVybn1tPUxqO0xqPSExO3JldHVybiBtfVxuZnVuY3Rpb24gTmooYSxiLGMpe3ZhciBkPWIudXBkYXRlUXVldWU7ZD1udWxsIT09ZD9kLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09ZCl7dmFyIGU9ZD1kLm5leHQ7ZG97aWYoKGUudGFnJmEpPT09YSl7dmFyIGY9ZS5kZXN0cm95O2UuZGVzdHJveT12b2lkIDA7dm9pZCAwIT09ZiYmS2ooYixjLGYpfWU9ZS5uZXh0fXdoaWxlKGUhPT1kKX19ZnVuY3Rpb24gT2ooYSxiKXtiPWIudXBkYXRlUXVldWU7Yj1udWxsIT09Yj9iLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09Yil7dmFyIGM9Yj1iLm5leHQ7ZG97aWYoKGMudGFnJmEpPT09YSl7dmFyIGQ9Yy5jcmVhdGU7Yy5kZXN0cm95PWQoKX1jPWMubmV4dH13aGlsZShjIT09Yil9fWZ1bmN0aW9uIFBqKGEpe3ZhciBiPWEucmVmO2lmKG51bGwhPT1iKXt2YXIgYz1hLnN0YXRlTm9kZTtzd2l0Y2goYS50YWcpe2Nhc2UgNTphPWM7YnJlYWs7ZGVmYXVsdDphPWN9XCJmdW5jdGlvblwiPT09dHlwZW9mIGI/YihhKTpiLmN1cnJlbnQ9YX19XG5mdW5jdGlvbiBRaihhKXt2YXIgYj1hLmFsdGVybmF0ZTtudWxsIT09YiYmKGEuYWx0ZXJuYXRlPW51bGwsUWooYikpO2EuY2hpbGQ9bnVsbDthLmRlbGV0aW9ucz1udWxsO2Euc2libGluZz1udWxsOzU9PT1hLnRhZyYmKGI9YS5zdGF0ZU5vZGUsbnVsbCE9PWImJihkZWxldGUgYltOZl0sZGVsZXRlIGJbT2ZdLGRlbGV0ZSBiW25mXSxkZWxldGUgYltQZl0sZGVsZXRlIGJbUWZdKSk7YS5zdGF0ZU5vZGU9bnVsbDthLnJldHVybj1udWxsO2EuZGVwZW5kZW5jaWVzPW51bGw7YS5tZW1vaXplZFByb3BzPW51bGw7YS5tZW1vaXplZFN0YXRlPW51bGw7YS5wZW5kaW5nUHJvcHM9bnVsbDthLnN0YXRlTm9kZT1udWxsO2EudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBSaihhKXtyZXR1cm4gNT09PWEudGFnfHwzPT09YS50YWd8fDQ9PT1hLnRhZ31cbmZ1bmN0aW9uIFNqKGEpe2E6Zm9yKDs7KXtmb3IoO251bGw9PT1hLnNpYmxpbmc7KXtpZihudWxsPT09YS5yZXR1cm58fFJqKGEucmV0dXJuKSlyZXR1cm4gbnVsbDthPWEucmV0dXJufWEuc2libGluZy5yZXR1cm49YS5yZXR1cm47Zm9yKGE9YS5zaWJsaW5nOzUhPT1hLnRhZyYmNiE9PWEudGFnJiYxOCE9PWEudGFnOyl7aWYoYS5mbGFncyYyKWNvbnRpbnVlIGE7aWYobnVsbD09PWEuY2hpbGR8fDQ9PT1hLnRhZyljb250aW51ZSBhO2Vsc2UgYS5jaGlsZC5yZXR1cm49YSxhPWEuY2hpbGR9aWYoIShhLmZsYWdzJjIpKXJldHVybiBhLnN0YXRlTm9kZX19XG5mdW5jdGlvbiBUaihhLGIsYyl7dmFyIGQ9YS50YWc7aWYoNT09PWR8fDY9PT1kKWE9YS5zdGF0ZU5vZGUsYj84PT09Yy5ub2RlVHlwZT9jLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsYik6Yy5pbnNlcnRCZWZvcmUoYSxiKTooOD09PWMubm9kZVR5cGU/KGI9Yy5wYXJlbnROb2RlLGIuaW5zZXJ0QmVmb3JlKGEsYykpOihiPWMsYi5hcHBlbmRDaGlsZChhKSksYz1jLl9yZWFjdFJvb3RDb250YWluZXIsbnVsbCE9PWMmJnZvaWQgMCE9PWN8fG51bGwhPT1iLm9uY2xpY2t8fChiLm9uY2xpY2s9QWYpKTtlbHNlIGlmKDQhPT1kJiYoYT1hLmNoaWxkLG51bGwhPT1hKSlmb3IoVGooYSxiLGMpLGE9YS5zaWJsaW5nO251bGwhPT1hOylUaihhLGIsYyksYT1hLnNpYmxpbmd9XG5mdW5jdGlvbiBVaihhLGIsYyl7dmFyIGQ9YS50YWc7aWYoNT09PWR8fDY9PT1kKWE9YS5zdGF0ZU5vZGUsYj9jLmluc2VydEJlZm9yZShhLGIpOmMuYXBwZW5kQ2hpbGQoYSk7ZWxzZSBpZig0IT09ZCYmKGE9YS5jaGlsZCxudWxsIT09YSkpZm9yKFVqKGEsYixjKSxhPWEuc2libGluZztudWxsIT09YTspVWooYSxiLGMpLGE9YS5zaWJsaW5nfXZhciBWPW51bGwsVmo9ITE7ZnVuY3Rpb24gV2ooYSxiLGMpe2ZvcihjPWMuY2hpbGQ7bnVsbCE9PWM7KVhqKGEsYixjKSxjPWMuc2libGluZ31cbmZ1bmN0aW9uIFhqKGEsYixjKXtpZihrYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGtjLm9uQ29tbWl0RmliZXJVbm1vdW50KXRyeXtrYy5vbkNvbW1pdEZpYmVyVW5tb3VudChqYyxjKX1jYXRjaChoKXt9c3dpdGNoKGMudGFnKXtjYXNlIDU6U3x8SmooYyxiKTtjYXNlIDY6dmFyIGQ9VixlPVZqO1Y9bnVsbDtXaihhLGIsYyk7Vj1kO1ZqPWU7bnVsbCE9PVYmJihWaj8oYT1WLGM9Yy5zdGF0ZU5vZGUsOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpOmEucmVtb3ZlQ2hpbGQoYykpOlYucmVtb3ZlQ2hpbGQoYy5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDE4Om51bGwhPT1WJiYoVmo/KGE9VixjPWMuc3RhdGVOb2RlLDg9PT1hLm5vZGVUeXBlP0pmKGEucGFyZW50Tm9kZSxjKToxPT09YS5ub2RlVHlwZSYmSmYoYSxjKSxhZChhKSk6SmYoVixjLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgNDpkPVY7ZT1WajtWPWMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87Vmo9ITA7XG5XaihhLGIsYyk7Vj1kO1ZqPWU7YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFTJiYoZD1jLnVwZGF0ZVF1ZXVlLG51bGwhPT1kJiYoZD1kLmxhc3RFZmZlY3QsbnVsbCE9PWQpKSl7ZT1kPWQubmV4dDtkb3t2YXIgZj1lLGc9Zi5kZXN0cm95O2Y9Zi50YWc7dm9pZCAwIT09ZyYmKDAhPT0oZiYyKT9LaihjLGIsZyk6MCE9PShmJjQpJiZLaihjLGIsZykpO2U9ZS5uZXh0fXdoaWxlKGUhPT1kKX1XaihhLGIsYyk7YnJlYWs7Y2FzZSAxOmlmKCFTJiYoSmooYyxiKSxkPWMuc3RhdGVOb2RlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLmNvbXBvbmVudFdpbGxVbm1vdW50KSl0cnl7ZC5wcm9wcz1jLm1lbW9pemVkUHJvcHMsZC5zdGF0ZT1jLm1lbW9pemVkU3RhdGUsZC5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKGgpe1UoYyxiLGgpfVdqKGEsYixjKTticmVhaztjYXNlIDIxOldqKGEsYixjKTticmVhaztjYXNlIDIyOmMubW9kZSYxPyhTPShkPVMpfHxudWxsIT09XG5jLm1lbW9pemVkU3RhdGUsV2ooYSxiLGMpLFM9ZCk6V2ooYSxiLGMpO2JyZWFrO2RlZmF1bHQ6V2ooYSxiLGMpfX1mdW5jdGlvbiBZaihhKXt2YXIgYj1hLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1iKXthLnVwZGF0ZVF1ZXVlPW51bGw7dmFyIGM9YS5zdGF0ZU5vZGU7bnVsbD09PWMmJihjPWEuc3RhdGVOb2RlPW5ldyBJaik7Yi5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPVpqLmJpbmQobnVsbCxhLGIpO2MuaGFzKGIpfHwoYy5hZGQoYiksYi50aGVuKGQsZCkpfSl9fVxuZnVuY3Rpb24gYWsoYSxiKXt2YXIgYz1iLmRlbGV0aW9ucztpZihudWxsIT09Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXTt0cnl7dmFyIGY9YSxnPWIsaD1nO2E6Zm9yKDtudWxsIT09aDspe3N3aXRjaChoLnRhZyl7Y2FzZSA1OlY9aC5zdGF0ZU5vZGU7Vmo9ITE7YnJlYWsgYTtjYXNlIDM6Vj1oLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1ZqPSEwO2JyZWFrIGE7Y2FzZSA0OlY9aC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztWaj0hMDticmVhayBhfWg9aC5yZXR1cm59aWYobnVsbD09PVYpdGhyb3cgRXJyb3IocCgxNjApKTtYaihmLGcsZSk7Vj1udWxsO1ZqPSExO3ZhciBrPWUuYWx0ZXJuYXRlO251bGwhPT1rJiYoay5yZXR1cm49bnVsbCk7ZS5yZXR1cm49bnVsbH1jYXRjaChsKXtVKGUsYixsKX19aWYoYi5zdWJ0cmVlRmxhZ3MmMTI4NTQpZm9yKGI9Yi5jaGlsZDtudWxsIT09YjspYmsoYixhKSxiPWIuc2libGluZ31cbmZ1bmN0aW9uIGJrKGEsYil7dmFyIGM9YS5hbHRlcm5hdGUsZD1hLmZsYWdzO3N3aXRjaChhLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmFrKGIsYSk7Y2soYSk7aWYoZCY0KXt0cnl7TmooMyxhLGEucmV0dXJuKSxPaigzLGEpfWNhdGNoKG0pe1UoYSxhLnJldHVybixtKX10cnl7TmooNSxhLGEucmV0dXJuKX1jYXRjaChtKXtVKGEsYS5yZXR1cm4sbSl9fWJyZWFrO2Nhc2UgMTphayhiLGEpO2NrKGEpO2QmNTEyJiZudWxsIT09YyYmSmooYyxjLnJldHVybik7YnJlYWs7Y2FzZSA1OmFrKGIsYSk7Y2soYSk7ZCY1MTImJm51bGwhPT1jJiZKaihjLGMucmV0dXJuKTtpZihhLmZsYWdzJjMyKXt2YXIgZT1hLnN0YXRlTm9kZTt0cnl7bmIoZSxcIlwiKX1jYXRjaChtKXtVKGEsYS5yZXR1cm4sbSl9fWlmKGQmNCYmKGU9YS5zdGF0ZU5vZGUsbnVsbCE9ZSkpe3ZhciBmPWEubWVtb2l6ZWRQcm9wcyxnPW51bGwhPT1jP2MubWVtb2l6ZWRQcm9wczpmLGg9YS50eXBlLGs9YS51cGRhdGVRdWV1ZTtcbmEudXBkYXRlUXVldWU9bnVsbDtpZihudWxsIT09ayl0cnl7XCJpbnB1dFwiPT09aCYmXCJyYWRpb1wiPT09Zi50eXBlJiZudWxsIT1mLm5hbWUmJlphKGUsZik7dWIoaCxnKTt2YXIgbD11YihoLGYpO2ZvcihnPTA7ZzxrLmxlbmd0aDtnKz0yKXt2YXIgbj1rW2ddLHU9a1tnKzFdO1wic3R5bGVcIj09PW4/cmIoZSx1KTpcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1uP21iKGUsdSk6XCJjaGlsZHJlblwiPT09bj9uYihlLHUpOnNhKGUsbix1LGwpfXN3aXRjaChoKXtjYXNlIFwiaW5wdXRcIjokYShlLGYpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOmhiKGUsZik7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOnZhciBxPWUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtlLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9ISFmLm11bHRpcGxlO3ZhciB5PWYudmFsdWU7bnVsbCE9eT9lYihlLCEhZi5tdWx0aXBsZSx5LCExKTpxIT09ISFmLm11bHRpcGxlJiYobnVsbCE9Zi5kZWZhdWx0VmFsdWU/ZWIoZSwhIWYubXVsdGlwbGUsXG5mLmRlZmF1bHRWYWx1ZSwhMCk6ZWIoZSwhIWYubXVsdGlwbGUsZi5tdWx0aXBsZT9bXTpcIlwiLCExKSl9ZVtPZl09Zn1jYXRjaChtKXtVKGEsYS5yZXR1cm4sbSl9fWJyZWFrO2Nhc2UgNjphayhiLGEpO2NrKGEpO2lmKGQmNCl7aWYobnVsbD09PWEuc3RhdGVOb2RlKXRocm93IEVycm9yKHAoMTYyKSk7bD1hLnN0YXRlTm9kZTtuPWEubWVtb2l6ZWRQcm9wczt0cnl7bC5ub2RlVmFsdWU9bn1jYXRjaChtKXtVKGEsYS5yZXR1cm4sbSl9fWJyZWFrO2Nhc2UgMzphayhiLGEpO2NrKGEpO2lmKGQmNCYmbnVsbCE9PWMmJmMubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpdHJ5e2FkKGIuY29udGFpbmVySW5mbyl9Y2F0Y2gobSl7VShhLGEucmV0dXJuLG0pfWJyZWFrO2Nhc2UgNDphayhiLGEpO2NrKGEpO2JyZWFrO2Nhc2UgMTM6YWsoYixhKTtjayhhKTtsPWEuY2hpbGQ7bC5mbGFncyY4MTkyJiZudWxsIT09bC5tZW1vaXplZFN0YXRlJiYobnVsbD09PWwuYWx0ZXJuYXRlfHxudWxsPT09bC5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSkmJlxuKGRrPUIoKSk7ZCY0JiZZaihhKTticmVhaztjYXNlIDIyOmw9bnVsbCE9PWMmJm51bGwhPT1jLm1lbW9pemVkU3RhdGU7YS5tb2RlJjE/KFM9KG49Uyl8fGwsYWsoYixhKSxTPW4pOmFrKGIsYSk7Y2soYSk7aWYoZCY4MTkyKXtuPW51bGwhPT1hLm1lbW9pemVkU3RhdGU7YTpmb3IodT1udWxsLHE9YTs7KXtpZig1PT09cS50YWcpe2lmKG51bGw9PT11KXt1PXE7dHJ5e2U9cS5zdGF0ZU5vZGUsbj8oZj1lLnN0eWxlLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLnNldFByb3BlcnR5P2Yuc2V0UHJvcGVydHkoXCJkaXNwbGF5XCIsXCJub25lXCIsXCJpbXBvcnRhbnRcIik6Zi5kaXNwbGF5PVwibm9uZVwiKTooaD1xLnN0YXRlTm9kZSxrPXEubWVtb2l6ZWRQcm9wcy5zdHlsZSxnPXZvaWQgMCE9PWsmJm51bGwhPT1rJiZrLmhhc093blByb3BlcnR5KFwiZGlzcGxheVwiKT9rLmRpc3BsYXk6bnVsbCxoLnN0eWxlLmRpc3BsYXk9cWIoXCJkaXNwbGF5XCIsZykpfWNhdGNoKG0pe1UoYSxhLnJldHVybixtKX19fWVsc2UgaWYoNj09PVxucS50YWcpe2lmKG51bGw9PT11KXRyeXtxLnN0YXRlTm9kZS5ub2RlVmFsdWU9bj9cIlwiOnEubWVtb2l6ZWRQcm9wc31jYXRjaChtKXtVKGEsYS5yZXR1cm4sbSl9fWVsc2UgaWYoKDIyIT09cS50YWcmJjIzIT09cS50YWd8fG51bGw9PT1xLm1lbW9pemVkU3RhdGV8fHE9PT1hKSYmbnVsbCE9PXEuY2hpbGQpe3EuY2hpbGQucmV0dXJuPXE7cT1xLmNoaWxkO2NvbnRpbnVlfWlmKHE9PT1hKWJyZWFrIGE7Zm9yKDtudWxsPT09cS5zaWJsaW5nOyl7aWYobnVsbD09PXEucmV0dXJufHxxLnJldHVybj09PWEpYnJlYWsgYTt1PT09cSYmKHU9bnVsbCk7cT1xLnJldHVybn11PT09cSYmKHU9bnVsbCk7cS5zaWJsaW5nLnJldHVybj1xLnJldHVybjtxPXEuc2libGluZ31pZihuJiYhbCYmMCE9PShhLm1vZGUmMSkpZm9yKFQ9YSxhPWEuY2hpbGQ7bnVsbCE9PWE7KXtmb3IobD1UPWE7bnVsbCE9PVQ7KXtuPVQ7dT1uLmNoaWxkO3N3aXRjaChuLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1Ok5qKDQsXG5uLG4ucmV0dXJuKTticmVhaztjYXNlIDE6SmoobixuLnJldHVybik7Zj1uLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5jb21wb25lbnRXaWxsVW5tb3VudCl7cT1uO3k9bi5yZXR1cm47dHJ5e2U9cSxmLnByb3BzPWUubWVtb2l6ZWRQcm9wcyxmLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxmLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gobSl7VShxLHksbSl9fWJyZWFrO2Nhc2UgNTpKaihuLG4ucmV0dXJuKTticmVhaztjYXNlIDIyOmlmKG51bGwhPT1uLm1lbW9pemVkU3RhdGUpe2VrKGwpO2NvbnRpbnVlfX1udWxsIT09dT8odS5yZXR1cm49bixUPXUpOmVrKGwpfWE9YS5zaWJsaW5nfX1icmVhaztjYXNlIDE5OmFrKGIsYSk7Y2soYSk7ZCY0JiZZaihhKTticmVhaztjYXNlIDIxOmJyZWFrO2RlZmF1bHQ6YWsoYixhKSxjayhhKX19XG5mdW5jdGlvbiBjayhhKXt2YXIgYj1hLmZsYWdzO2lmKGImMil7dHJ5e2E6e2Zvcih2YXIgYz1hLnJldHVybjtudWxsIT09Yzspe2lmKFJqKGMpKXt2YXIgZD1jO2JyZWFrIGF9Yz1jLnJldHVybn10aHJvdyBFcnJvcihwKDE2MCkpO31zd2l0Y2goZC50YWcpe2Nhc2UgNTp2YXIgZT1kLnN0YXRlTm9kZTtkLmZsYWdzJjMyJiYobmIoZSxcIlwiKSxkLmZsYWdzJj0tMzMpO3ZhciBmPVNqKGEpO1VqKGEsZixlKTticmVhaztjYXNlIDM6Y2FzZSA0OnZhciBnPWQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8saD1TaihhKTtUaihhLGgsZyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDE2MSkpO319Y2F0Y2goayl7VShhLGEucmV0dXJuLGspfWEuZmxhZ3MmPS0zfWImNDA5NiYmKGEuZmxhZ3MmPS00MDk3KX1mdW5jdGlvbiBmayhhLGIsYyl7VD1hO2drKGEsYixjKX1cbmZ1bmN0aW9uIGdrKGEsYixjKXtmb3IodmFyIGQ9MCE9PShhLm1vZGUmMSk7bnVsbCE9PVQ7KXt2YXIgZT1ULGY9ZS5jaGlsZDtpZigyMj09PWUudGFnJiZkKXt2YXIgZz1udWxsIT09ZS5tZW1vaXplZFN0YXRlfHxIajtpZighZyl7dmFyIGg9ZS5hbHRlcm5hdGUsaz1udWxsIT09aCYmbnVsbCE9PWgubWVtb2l6ZWRTdGF0ZXx8UztoPUhqO3ZhciBsPVM7SGo9ZztpZigoUz1rKSYmIWwpZm9yKFQ9ZTtudWxsIT09VDspZz1ULGs9Zy5jaGlsZCwyMj09PWcudGFnJiZudWxsIT09Zy5tZW1vaXplZFN0YXRlP2hrKGUpOm51bGwhPT1rPyhrLnJldHVybj1nLFQ9ayk6aGsoZSk7Zm9yKDtudWxsIT09ZjspVD1mLGdrKGYsYixjKSxmPWYuc2libGluZztUPWU7SGo9aDtTPWx9aWsoYSxiLGMpfWVsc2UgMCE9PShlLnN1YnRyZWVGbGFncyY4NzcyKSYmbnVsbCE9PWY/KGYucmV0dXJuPWUsVD1mKTppayhhLGIsYyl9fVxuZnVuY3Rpb24gaWsoYSl7Zm9yKDtudWxsIT09VDspe3ZhciBiPVQ7aWYoMCE9PShiLmZsYWdzJjg3NzIpKXt2YXIgYz1iLmFsdGVybmF0ZTt0cnl7aWYoMCE9PShiLmZsYWdzJjg3NzIpKXN3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpTfHxPaig1LGIpO2JyZWFrO2Nhc2UgMTp2YXIgZD1iLnN0YXRlTm9kZTtpZihiLmZsYWdzJjQmJiFTKWlmKG51bGw9PT1jKWQuY29tcG9uZW50RGlkTW91bnQoKTtlbHNle3ZhciBlPWIuZWxlbWVudFR5cGU9PT1iLnR5cGU/Yy5tZW1vaXplZFByb3BzOmtnKGIudHlwZSxjLm1lbW9pemVkUHJvcHMpO2QuY29tcG9uZW50RGlkVXBkYXRlKGUsYy5tZW1vaXplZFN0YXRlLGQuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpfXZhciBmPWIudXBkYXRlUXVldWU7bnVsbCE9PWYmJkdnKGIsZixkKTticmVhaztjYXNlIDM6dmFyIGc9Yi51cGRhdGVRdWV1ZTtpZihudWxsIT09Zyl7Yz1udWxsO2lmKG51bGwhPT1iLmNoaWxkKXN3aXRjaChiLmNoaWxkLnRhZyl7Y2FzZSA1OmM9XG5iLmNoaWxkLnN0YXRlTm9kZTticmVhaztjYXNlIDE6Yz1iLmNoaWxkLnN0YXRlTm9kZX1HZyhiLGcsYyl9YnJlYWs7Y2FzZSA1OnZhciBoPWIuc3RhdGVOb2RlO2lmKG51bGw9PT1jJiZiLmZsYWdzJjQpe2M9aDt2YXIgaz1iLm1lbW9pemVkUHJvcHM7c3dpdGNoKGIudHlwZSl7Y2FzZSBcImJ1dHRvblwiOmNhc2UgXCJpbnB1dFwiOmNhc2UgXCJzZWxlY3RcIjpjYXNlIFwidGV4dGFyZWFcIjprLmF1dG9Gb2N1cyYmYy5mb2N1cygpO2JyZWFrO2Nhc2UgXCJpbWdcIjprLnNyYyYmKGMuc3JjPWsuc3JjKX19YnJlYWs7Y2FzZSA2OmJyZWFrO2Nhc2UgNDpicmVhaztjYXNlIDEyOmJyZWFrO2Nhc2UgMTM6aWYobnVsbD09PWIubWVtb2l6ZWRTdGF0ZSl7dmFyIGw9Yi5hbHRlcm5hdGU7aWYobnVsbCE9PWwpe3ZhciBuPWwubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09bil7dmFyIHU9bi5kZWh5ZHJhdGVkO251bGwhPT11JiZhZCh1KX19fWJyZWFrO2Nhc2UgMTk6Y2FzZSAxNzpjYXNlIDIxOmNhc2UgMjI6Y2FzZSAyMzpicmVhaztcbmRlZmF1bHQ6dGhyb3cgRXJyb3IocCgxNjMpKTt9U3x8Yi5mbGFncyY1MTImJlBqKGIpfWNhdGNoKHEpe1UoYixiLnJldHVybixxKX19aWYoYj09PWEpe1Q9bnVsbDticmVha31jPWIuc2libGluZztpZihudWxsIT09Yyl7Yy5yZXR1cm49Yi5yZXR1cm47VD1jO2JyZWFrfVQ9Yi5yZXR1cm59fWZ1bmN0aW9uIGVrKGEpe2Zvcig7bnVsbCE9PVQ7KXt2YXIgYj1UO2lmKGI9PT1hKXtUPW51bGw7YnJlYWt9dmFyIGM9Yi5zaWJsaW5nO2lmKG51bGwhPT1jKXtjLnJldHVybj1iLnJldHVybjtUPWM7YnJlYWt9VD1iLnJldHVybn19XG5mdW5jdGlvbiBoayhhKXtmb3IoO251bGwhPT1UOyl7dmFyIGI9VDt0cnl7c3dpdGNoKGIudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnZhciBjPWIucmV0dXJuO3RyeXtPaig0LGIpfWNhdGNoKGspe1UoYixjLGspfWJyZWFrO2Nhc2UgMTp2YXIgZD1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5jb21wb25lbnREaWRNb3VudCl7dmFyIGU9Yi5yZXR1cm47dHJ5e2QuY29tcG9uZW50RGlkTW91bnQoKX1jYXRjaChrKXtVKGIsZSxrKX19dmFyIGY9Yi5yZXR1cm47dHJ5e1BqKGIpfWNhdGNoKGspe1UoYixmLGspfWJyZWFrO2Nhc2UgNTp2YXIgZz1iLnJldHVybjt0cnl7UGooYil9Y2F0Y2goayl7VShiLGcsayl9fX1jYXRjaChrKXtVKGIsYi5yZXR1cm4sayl9aWYoYj09PWEpe1Q9bnVsbDticmVha312YXIgaD1iLnNpYmxpbmc7aWYobnVsbCE9PWgpe2gucmV0dXJuPWIucmV0dXJuO1Q9aDticmVha31UPWIucmV0dXJufX1cbnZhciBqaz1NYXRoLmNlaWwsa2s9dGEuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixsaz10YS5SZWFjdEN1cnJlbnRPd25lcixtaz10YS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxXPTAsUD1udWxsLFg9bnVsbCxZPTAsY2o9MCxtaj1UZigwKSxSPTAsbms9bnVsbCxGZz0wLG9rPTAscGs9MCxxaz1udWxsLHJrPW51bGwsZGs9MCxhaj1JbmZpbml0eSxzaz1udWxsLExpPSExLE1pPW51bGwsT2k9bnVsbCx0az0hMSx1az1udWxsLHZrPTAsd2s9MCx4az1udWxsLHlrPS0xLHprPTA7ZnVuY3Rpb24gSmcoKXtyZXR1cm4gMCE9PShXJjYpP0IoKTotMSE9PXlrP3lrOnlrPUIoKX1cbmZ1bmN0aW9uIEtnKGEpe2lmKDA9PT0oYS5tb2RlJjEpKXJldHVybiAxO2lmKDAhPT0oVyYyKSYmMCE9PVkpcmV0dXJuIFkmLVk7aWYobnVsbCE9PWpnLnRyYW5zaXRpb24pcmV0dXJuIDA9PT16ayYmKHprPXhjKCkpLHprO2E9QztpZigwIT09YSlyZXR1cm4gYTthPXdpbmRvdy5ldmVudDthPXZvaWQgMD09PWE/MTY6aWQoYS50eXBlKTtyZXR1cm4gYX1mdW5jdGlvbiBMZyhhLGIsYyl7aWYoNTA8d2spdGhyb3cgd2s9MCx4az1udWxsLEVycm9yKHAoMTg1KSk7dmFyIGQ9QWsoYSxiKTtpZihudWxsPT09ZClyZXR1cm4gbnVsbDt6YyhkLGIsYyk7aWYoMD09PShXJjIpfHxkIT09UClkPT09UCYmKDA9PT0oVyYyKSYmKG9rfD1iKSw0PT09UiYmQmsoZCxZKSksQ2soZCxjKSwxPT09YiYmMD09PVcmJjA9PT0oYS5tb2RlJjEpJiYoYWo9QigpKzUwMCxlZyYmaWcoKSk7cmV0dXJuIGR9XG5mdW5jdGlvbiBBayhhLGIpe2EubGFuZXN8PWI7dmFyIGM9YS5hbHRlcm5hdGU7bnVsbCE9PWMmJihjLmxhbmVzfD1iKTtjPWE7Zm9yKGE9YS5yZXR1cm47bnVsbCE9PWE7KWEuY2hpbGRMYW5lc3w9YixjPWEuYWx0ZXJuYXRlLG51bGwhPT1jJiYoYy5jaGlsZExhbmVzfD1iKSxjPWEsYT1hLnJldHVybjtyZXR1cm4gMz09PWMudGFnP2Muc3RhdGVOb2RlOm51bGx9ZnVuY3Rpb24gQmcoYSl7cmV0dXJuKG51bGwhPT1QfHxudWxsIT09dmcpJiYwIT09KGEubW9kZSYxKSYmMD09PShXJjIpfVxuZnVuY3Rpb24gQ2soYSxiKXt2YXIgYz1hLmNhbGxiYWNrTm9kZTt2YyhhLGIpO3ZhciBkPXRjKGEsYT09PVA/WTowKTtpZigwPT09ZCludWxsIT09YyYmYWMoYyksYS5jYWxsYmFja05vZGU9bnVsbCxhLmNhbGxiYWNrUHJpb3JpdHk9MDtlbHNlIGlmKGI9ZCYtZCxhLmNhbGxiYWNrUHJpb3JpdHkhPT1iKXtudWxsIT1jJiZhYyhjKTtpZigxPT09YikwPT09YS50YWc/aGcoRGsuYmluZChudWxsLGEpKTpnZyhEay5iaW5kKG51bGwsYSkpLElmKGZ1bmN0aW9uKCl7MD09PVcmJmlnKCl9KSxjPW51bGw7ZWxzZXtzd2l0Y2goQ2MoZCkpe2Nhc2UgMTpjPWVjO2JyZWFrO2Nhc2UgNDpjPWZjO2JyZWFrO2Nhc2UgMTY6Yz1nYzticmVhaztjYXNlIDUzNjg3MDkxMjpjPWljO2JyZWFrO2RlZmF1bHQ6Yz1nY31jPUVrKGMsRmsuYmluZChudWxsLGEpKX1hLmNhbGxiYWNrUHJpb3JpdHk9YjthLmNhbGxiYWNrTm9kZT1jfX1cbmZ1bmN0aW9uIEZrKGEsYil7eWs9LTE7ems9MDtpZigwIT09KFcmNikpdGhyb3cgRXJyb3IocCgzMjcpKTt2YXIgYz1hLmNhbGxiYWNrTm9kZTtpZihHaygpJiZhLmNhbGxiYWNrTm9kZSE9PWMpcmV0dXJuIG51bGw7dmFyIGQ9dGMoYSxhPT09UD9ZOjApO2lmKDA9PT1kKXJldHVybiBudWxsO2lmKDAhPT0oZCYzMCl8fDAhPT0oZCZhLmV4cGlyZWRMYW5lcyl8fGIpYj1IayhhLGQpO2Vsc2V7Yj1kO3ZhciBlPVc7V3w9Mjt2YXIgZj1JaygpO2lmKFAhPT1hfHxZIT09Yilzaz1udWxsLGFqPUIoKSs1MDAsSmsoYSxiKTtkbyB0cnl7S2soKTticmVha31jYXRjaChoKXtMayhhLGgpfXdoaWxlKDEpO3BnKCk7a2suY3VycmVudD1mO1c9ZTtudWxsIT09WD9iPTA6KFA9bnVsbCxZPTAsYj1SKX1pZigwIT09Yil7Mj09PWImJihlPXdjKGEpLDAhPT1lJiYoZD1lLGI9TWsoYSxlKSkpO2lmKDE9PT1iKXRocm93IGM9bmssSmsoYSwwKSxCayhhLGQpLENrKGEsQigpKSxjO2lmKDY9PT1iKUJrKGEsZCk7XG5lbHNle2U9YS5jdXJyZW50LmFsdGVybmF0ZTtpZigwPT09KGQmMzApJiYhTmsoZSkmJihiPUhrKGEsZCksMj09PWImJihmPXdjKGEpLDAhPT1mJiYoZD1mLGI9TWsoYSxmKSkpLDE9PT1iKSl0aHJvdyBjPW5rLEprKGEsMCksQmsoYSxkKSxDayhhLEIoKSksYzthLmZpbmlzaGVkV29yaz1lO2EuZmluaXNoZWRMYW5lcz1kO3N3aXRjaChiKXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKHAoMzQ1KSk7Y2FzZSAyOk9rKGEscmssc2spO2JyZWFrO2Nhc2UgMzpCayhhLGQpO2lmKChkJjEzMDAyMzQyNCk9PT1kJiYoYj1kays1MDAtQigpLDEwPGIpKXtpZigwIT09dGMoYSwwKSlicmVhaztlPWEuc3VzcGVuZGVkTGFuZXM7aWYoKGUmZCkhPT1kKXtKZygpO2EucGluZ2VkTGFuZXN8PWEuc3VzcGVuZGVkTGFuZXMmZTticmVha31hLnRpbWVvdXRIYW5kbGU9RWYoT2suYmluZChudWxsLGEscmssc2spLGIpO2JyZWFrfU9rKGEscmssc2spO2JyZWFrO2Nhc2UgNDpCayhhLGQpO2lmKChkJjQxOTQyNDApPT09XG5kKWJyZWFrO2I9YS5ldmVudFRpbWVzO2ZvcihlPS0xOzA8ZDspe3ZhciBnPTMxLW5jKGQpO2Y9MTw8ZztnPWJbZ107Zz5lJiYoZT1nKTtkJj1+Zn1kPWU7ZD1CKCktZDtkPSgxMjA+ZD8xMjA6NDgwPmQ/NDgwOjEwODA+ZD8xMDgwOjE5MjA+ZD8xOTIwOjNFMz5kPzNFMzo0MzIwPmQ/NDMyMDoxOTYwKmprKGQvMTk2MCkpLWQ7aWYoMTA8ZCl7YS50aW1lb3V0SGFuZGxlPUVmKE9rLmJpbmQobnVsbCxhLHJrLHNrKSxkKTticmVha31PayhhLHJrLHNrKTticmVhaztjYXNlIDU6T2soYSxyayxzayk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihwKDMyOSkpO319fUNrKGEsQigpKTtyZXR1cm4gYS5jYWxsYmFja05vZGU9PT1jP0ZrLmJpbmQobnVsbCxhKTpudWxsfVxuZnVuY3Rpb24gTWsoYSxiKXt2YXIgYz1xazthLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQmJihKayhhLGIpLmZsYWdzfD0yNTYpO2E9SGsoYSxiKTsyIT09YSYmKGI9cmsscms9YyxudWxsIT09YiYmWmkoYikpO3JldHVybiBhfWZ1bmN0aW9uIFppKGEpe251bGw9PT1yaz9yaz1hOnJrLnB1c2guYXBwbHkocmssYSl9XG5mdW5jdGlvbiBOayhhKXtmb3IodmFyIGI9YTs7KXtpZihiLmZsYWdzJjE2Mzg0KXt2YXIgYz1iLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1jJiYoYz1jLnN0b3JlcyxudWxsIT09YykpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF0sZj1lLmdldFNuYXBzaG90O2U9ZS52YWx1ZTt0cnl7aWYoIUdlKGYoKSxlKSlyZXR1cm4hMX1jYXRjaChnKXtyZXR1cm4hMX19fWM9Yi5jaGlsZDtpZihiLnN1YnRyZWVGbGFncyYxNjM4NCYmbnVsbCE9PWMpYy5yZXR1cm49YixiPWM7ZWxzZXtpZihiPT09YSlicmVhaztmb3IoO251bGw9PT1iLnNpYmxpbmc7KXtpZihudWxsPT09Yi5yZXR1cm58fGIucmV0dXJuPT09YSlyZXR1cm4hMDtiPWIucmV0dXJufWIuc2libGluZy5yZXR1cm49Yi5yZXR1cm47Yj1iLnNpYmxpbmd9fXJldHVybiEwfVxuZnVuY3Rpb24gQmsoYSxiKXtiJj1+cGs7YiY9fm9rO2Euc3VzcGVuZGVkTGFuZXN8PWI7YS5waW5nZWRMYW5lcyY9fmI7Zm9yKGE9YS5leHBpcmF0aW9uVGltZXM7MDxiOyl7dmFyIGM9MzEtbmMoYiksZD0xPDxjO2FbY109LTE7YiY9fmR9fWZ1bmN0aW9uIERrKGEpe2lmKDAhPT0oVyY2KSl0aHJvdyBFcnJvcihwKDMyNykpO0drKCk7dmFyIGI9dGMoYSwwKTtpZigwPT09KGImMSkpcmV0dXJuIENrKGEsQigpKSxudWxsO3ZhciBjPUhrKGEsYik7aWYoMCE9PWEudGFnJiYyPT09Yyl7dmFyIGQ9d2MoYSk7MCE9PWQmJihiPWQsYz1NayhhLGQpKX1pZigxPT09Yyl0aHJvdyBjPW5rLEprKGEsMCksQmsoYSxiKSxDayhhLEIoKSksYztpZig2PT09Yyl0aHJvdyBFcnJvcihwKDM0NSkpO2EuZmluaXNoZWRXb3JrPWEuY3VycmVudC5hbHRlcm5hdGU7YS5maW5pc2hlZExhbmVzPWI7T2soYSxyayxzayk7Q2soYSxCKCkpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gUGsoYSxiKXt2YXIgYz1XO1d8PTE7dHJ5e3JldHVybiBhKGIpfWZpbmFsbHl7Vz1jLDA9PT1XJiYoYWo9QigpKzUwMCxlZyYmaWcoKSl9fWZ1bmN0aW9uIFFrKGEpe251bGwhPT11ayYmMD09PXVrLnRhZyYmMD09PShXJjYpJiZHaygpO3ZhciBiPVc7V3w9MTt2YXIgYz1tay50cmFuc2l0aW9uLGQ9Qzt0cnl7aWYobWsudHJhbnNpdGlvbj1udWxsLEM9MSxhKXJldHVybiBhKCl9ZmluYWxseXtDPWQsbWsudHJhbnNpdGlvbj1jLFc9YiwwPT09KFcmNikmJmlnKCl9fWZ1bmN0aW9uIGJqKCl7Y2o9bWouY3VycmVudDtFKG1qKX1cbmZ1bmN0aW9uIEprKGEsYil7YS5maW5pc2hlZFdvcms9bnVsbDthLmZpbmlzaGVkTGFuZXM9MDt2YXIgYz1hLnRpbWVvdXRIYW5kbGU7LTEhPT1jJiYoYS50aW1lb3V0SGFuZGxlPS0xLEZmKGMpKTtpZihudWxsIT09WClmb3IoYz1YLnJldHVybjtudWxsIT09Yzspe3ZhciBkPWM7Y2goZCk7c3dpdGNoKGQudGFnKXtjYXNlIDE6ZD1kLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7bnVsbCE9PWQmJnZvaWQgMCE9PWQmJlpmKCk7YnJlYWs7Y2FzZSAzOkdoKCk7RShWZik7RShIKTtMaCgpO2JyZWFrO2Nhc2UgNTpJaChkKTticmVhaztjYXNlIDQ6R2goKTticmVhaztjYXNlIDEzOkUoSyk7YnJlYWs7Y2FzZSAxOTpFKEspO2JyZWFrO2Nhc2UgMTA6cWcoZC50eXBlLl9jb250ZXh0KTticmVhaztjYXNlIDIyOmNhc2UgMjM6YmooKX1jPWMucmV0dXJufVA9YTtYPWE9dGgoYS5jdXJyZW50LG51bGwpO1k9Y2o9YjtSPTA7bms9bnVsbDtwaz1vaz1GZz0wO3JrPXFrPW51bGw7aWYobnVsbCE9PXZnKXtmb3IoYj1cbjA7Yjx2Zy5sZW5ndGg7YisrKWlmKGM9dmdbYl0sZD1jLmludGVybGVhdmVkLG51bGwhPT1kKXtjLmludGVybGVhdmVkPW51bGw7dmFyIGU9ZC5uZXh0LGY9Yy5wZW5kaW5nO2lmKG51bGwhPT1mKXt2YXIgZz1mLm5leHQ7Zi5uZXh0PWU7ZC5uZXh0PWd9Yy5wZW5kaW5nPWR9dmc9bnVsbH1yZXR1cm4gYX1cbmZ1bmN0aW9uIExrKGEsYil7ZG97dmFyIGM9WDt0cnl7cGcoKTtNaC5jdXJyZW50PVloO2lmKFBoKXtmb3IodmFyIGQ9TC5tZW1vaXplZFN0YXRlO251bGwhPT1kOyl7dmFyIGU9ZC5xdWV1ZTtudWxsIT09ZSYmKGUucGVuZGluZz1udWxsKTtkPWQubmV4dH1QaD0hMX1PaD0wO049TT1MPW51bGw7UWg9ITE7Umg9MDtsay5jdXJyZW50PW51bGw7aWYobnVsbD09PWN8fG51bGw9PT1jLnJldHVybil7Uj0xO25rPWI7WD1udWxsO2JyZWFrfWE6e3ZhciBmPWEsZz1jLnJldHVybixoPWMsaz1iO2I9WTtoLmZsYWdzfD0zMjc2ODtpZihudWxsIT09ayYmXCJvYmplY3RcIj09PXR5cGVvZiBrJiZcImZ1bmN0aW9uXCI9PT10eXBlb2Ygay50aGVuKXt2YXIgbD1rLG49aCx1PW4udGFnO2lmKDA9PT0obi5tb2RlJjEpJiYoMD09PXV8fDExPT09dXx8MTU9PT11KSl7dmFyIHE9bi5hbHRlcm5hdGU7cT8obi51cGRhdGVRdWV1ZT1xLnVwZGF0ZVF1ZXVlLG4ubWVtb2l6ZWRTdGF0ZT1xLm1lbW9pemVkU3RhdGUsXG5uLmxhbmVzPXEubGFuZXMpOihuLnVwZGF0ZVF1ZXVlPW51bGwsbi5tZW1vaXplZFN0YXRlPW51bGwpfXZhciB5PVJpKGcpO2lmKG51bGwhPT15KXt5LmZsYWdzJj0tMjU3O1NpKHksZyxoLGYsYik7eS5tb2RlJjEmJlBpKGYsbCxiKTtiPXk7az1sO3ZhciBtPWIudXBkYXRlUXVldWU7aWYobnVsbD09PW0pe3ZhciB3PW5ldyBTZXQ7dy5hZGQoayk7Yi51cGRhdGVRdWV1ZT13fWVsc2UgbS5hZGQoayk7YnJlYWsgYX1lbHNle2lmKDA9PT0oYiYxKSl7UGkoZixsLGIpOyRpKCk7YnJlYWsgYX1rPUVycm9yKHAoNDI2KSl9fWVsc2UgaWYoSSYmaC5tb2RlJjEpe3ZhciBKPVJpKGcpO2lmKG51bGwhPT1KKXswPT09KEouZmxhZ3MmNjU1MzYpJiYoSi5mbGFnc3w9MjU2KTtTaShKLGcsaCxmLGIpO29oKGspO2JyZWFrIGF9fWY9azs0IT09UiYmKFI9Mik7bnVsbD09PXFrP3FrPVtmXTpxay5wdXNoKGYpO2s9SGkoayxoKTtoPWc7ZG97c3dpdGNoKGgudGFnKXtjYXNlIDM6aC5mbGFnc3w9NjU1MzY7XG5iJj0tYjtoLmxhbmVzfD1iO3ZhciB2PUtpKGgsayxiKTtEZyhoLHYpO2JyZWFrIGE7Y2FzZSAxOmY9azt2YXIgeD1oLnR5cGUscj1oLnN0YXRlTm9kZTtpZigwPT09KGguZmxhZ3MmMTI4KSYmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiB4LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8bnVsbCE9PXImJlwiZnVuY3Rpb25cIj09PXR5cGVvZiByLmNvbXBvbmVudERpZENhdGNoJiYobnVsbD09PU9pfHwhT2kuaGFzKHIpKSkpe2guZmxhZ3N8PTY1NTM2O2ImPS1iO2gubGFuZXN8PWI7dmFyIEY9TmkoaCxmLGIpO0RnKGgsRik7YnJlYWsgYX19aD1oLnJldHVybn13aGlsZShudWxsIT09aCl9UmsoYyl9Y2F0Y2goWil7Yj1aO1g9PT1jJiZudWxsIT09YyYmKFg9Yz1jLnJldHVybik7Y29udGludWV9YnJlYWt9d2hpbGUoMSl9ZnVuY3Rpb24gSWsoKXt2YXIgYT1ray5jdXJyZW50O2trLmN1cnJlbnQ9WWg7cmV0dXJuIG51bGw9PT1hP1loOmF9XG5mdW5jdGlvbiAkaSgpe2lmKDA9PT1SfHwzPT09Unx8Mj09PVIpUj00O251bGw9PT1QfHwwPT09KEZnJjI2ODQzNTQ1NSkmJjA9PT0ob2smMjY4NDM1NDU1KXx8QmsoUCxZKX1mdW5jdGlvbiBIayhhLGIpe3ZhciBjPVc7V3w9Mjt2YXIgZD1JaygpO2lmKFAhPT1hfHxZIT09Yilzaz1udWxsLEprKGEsYik7ZG8gdHJ5e1NrKCk7YnJlYWt9Y2F0Y2goZSl7TGsoYSxlKX13aGlsZSgxKTtwZygpO1c9Yztray5jdXJyZW50PWQ7aWYobnVsbCE9PVgpdGhyb3cgRXJyb3IocCgyNjEpKTtQPW51bGw7WT0wO3JldHVybiBSfWZ1bmN0aW9uIFNrKCl7Zm9yKDtudWxsIT09WDspVGsoWCl9ZnVuY3Rpb24gS2soKXtmb3IoO251bGwhPT1YJiYhYmMoKTspVGsoWCl9ZnVuY3Rpb24gVGsoYSl7dmFyIGI9VWsoYS5hbHRlcm5hdGUsYSxjaik7YS5tZW1vaXplZFByb3BzPWEucGVuZGluZ1Byb3BzO251bGw9PT1iP1JrKGEpOlg9Yjtsay5jdXJyZW50PW51bGx9XG5mdW5jdGlvbiBSayhhKXt2YXIgYj1hO2Rve3ZhciBjPWIuYWx0ZXJuYXRlO2E9Yi5yZXR1cm47aWYoMD09PShiLmZsYWdzJjMyNzY4KSl7aWYoYz1ZaShjLGIsY2opLG51bGwhPT1jKXtYPWM7cmV0dXJufX1lbHNle2M9R2ooYyxiKTtpZihudWxsIT09Yyl7Yy5mbGFncyY9MzI3Njc7WD1jO3JldHVybn1pZihudWxsIT09YSlhLmZsYWdzfD0zMjc2OCxhLnN1YnRyZWVGbGFncz0wLGEuZGVsZXRpb25zPW51bGw7ZWxzZXtSPTY7WD1udWxsO3JldHVybn19Yj1iLnNpYmxpbmc7aWYobnVsbCE9PWIpe1g9YjtyZXR1cm59WD1iPWF9d2hpbGUobnVsbCE9PWIpOzA9PT1SJiYoUj01KX1mdW5jdGlvbiBPayhhLGIsYyl7dmFyIGQ9QyxlPW1rLnRyYW5zaXRpb247dHJ5e21rLnRyYW5zaXRpb249bnVsbCxDPTEsVmsoYSxiLGMsZCl9ZmluYWxseXttay50cmFuc2l0aW9uPWUsQz1kfXJldHVybiBudWxsfVxuZnVuY3Rpb24gVmsoYSxiLGMsZCl7ZG8gR2soKTt3aGlsZShudWxsIT09dWspO2lmKDAhPT0oVyY2KSl0aHJvdyBFcnJvcihwKDMyNykpO2M9YS5maW5pc2hlZFdvcms7dmFyIGU9YS5maW5pc2hlZExhbmVzO2lmKG51bGw9PT1jKXJldHVybiBudWxsO2EuZmluaXNoZWRXb3JrPW51bGw7YS5maW5pc2hlZExhbmVzPTA7aWYoYz09PWEuY3VycmVudCl0aHJvdyBFcnJvcihwKDE3NykpO2EuY2FsbGJhY2tOb2RlPW51bGw7YS5jYWxsYmFja1ByaW9yaXR5PTA7dmFyIGY9Yy5sYW5lc3xjLmNoaWxkTGFuZXM7QWMoYSxmKTthPT09UCYmKFg9UD1udWxsLFk9MCk7MD09PShjLnN1YnRyZWVGbGFncyYyMDY0KSYmMD09PShjLmZsYWdzJjIwNjQpfHx0a3x8KHRrPSEwLEVrKGdjLGZ1bmN0aW9uKCl7R2soKTtyZXR1cm4gbnVsbH0pKTtmPTAhPT0oYy5mbGFncyYxNTk5MCk7aWYoMCE9PShjLnN1YnRyZWVGbGFncyYxNTk5MCl8fGYpe2Y9bWsudHJhbnNpdGlvbjttay50cmFuc2l0aW9uPW51bGw7XG52YXIgZz1DO0M9MTt2YXIgaD1XO1d8PTQ7bGsuY3VycmVudD1udWxsO01qKGEsYyk7YmsoYyxhKTtOZShDZik7Y2Q9ISFCZjtDZj1CZj1udWxsO2EuY3VycmVudD1jO2ZrKGMsYSxlKTtjYygpO1c9aDtDPWc7bWsudHJhbnNpdGlvbj1mfWVsc2UgYS5jdXJyZW50PWM7dGsmJih0az0hMSx1az1hLHZrPWUpO2Y9YS5wZW5kaW5nTGFuZXM7MD09PWYmJihPaT1udWxsKTtsYyhjLnN0YXRlTm9kZSxkKTtDayhhLEIoKSk7aWYobnVsbCE9PWIpZm9yKGQ9YS5vblJlY292ZXJhYmxlRXJyb3IsYz0wO2M8Yi5sZW5ndGg7YysrKWQoYltjXSk7aWYoTGkpdGhyb3cgTGk9ITEsYT1NaSxNaT1udWxsLGE7MCE9PSh2ayYxKSYmMCE9PWEudGFnJiZHaygpO2Y9YS5wZW5kaW5nTGFuZXM7MCE9PShmJjEpP2E9PT14az93aysrOih3az0wLHhrPWEpOndrPTA7aWcoKTtyZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIEdrKCl7aWYobnVsbCE9PXVrKXt2YXIgYT1DYyh2ayksYj1tay50cmFuc2l0aW9uLGM9Qzt0cnl7bWsudHJhbnNpdGlvbj1udWxsO0M9MTY+YT8xNjphO2lmKG51bGw9PT11ayl2YXIgZD0hMTtlbHNle2E9dWs7dWs9bnVsbDt2az0wO2lmKDAhPT0oVyY2KSl0aHJvdyBFcnJvcihwKDMzMSkpO3ZhciBlPVc7V3w9NDtmb3IoVD1hLmN1cnJlbnQ7bnVsbCE9PVQ7KXt2YXIgZj1ULGc9Zi5jaGlsZDtpZigwIT09KFQuZmxhZ3MmMTYpKXt2YXIgaD1mLmRlbGV0aW9ucztpZihudWxsIT09aCl7Zm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba107Zm9yKFQ9bDtudWxsIT09VDspe3ZhciBuPVQ7c3dpdGNoKG4udGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1Ok5qKDgsbixmKX12YXIgdT1uLmNoaWxkO2lmKG51bGwhPT11KXUucmV0dXJuPW4sVD11O2Vsc2UgZm9yKDtudWxsIT09VDspe249VDt2YXIgcT1uLnNpYmxpbmcseT1uLnJldHVybjtRaihuKTtpZihuPT09XG5sKXtUPW51bGw7YnJlYWt9aWYobnVsbCE9PXEpe3EucmV0dXJuPXk7VD1xO2JyZWFrfVQ9eX19fXZhciBtPWYuYWx0ZXJuYXRlO2lmKG51bGwhPT1tKXt2YXIgdz1tLmNoaWxkO2lmKG51bGwhPT13KXttLmNoaWxkPW51bGw7ZG97dmFyIEo9dy5zaWJsaW5nO3cuc2libGluZz1udWxsO3c9Sn13aGlsZShudWxsIT09dyl9fVQ9Zn19aWYoMCE9PShmLnN1YnRyZWVGbGFncyYyMDY0KSYmbnVsbCE9PWcpZy5yZXR1cm49ZixUPWc7ZWxzZSBiOmZvcig7bnVsbCE9PVQ7KXtmPVQ7aWYoMCE9PShmLmZsYWdzJjIwNDgpKXN3aXRjaChmLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpOaig5LGYsZi5yZXR1cm4pfXZhciB2PWYuc2libGluZztpZihudWxsIT09dil7di5yZXR1cm49Zi5yZXR1cm47VD12O2JyZWFrIGJ9VD1mLnJldHVybn19dmFyIHg9YS5jdXJyZW50O2ZvcihUPXg7bnVsbCE9PVQ7KXtnPVQ7dmFyIHI9Zy5jaGlsZDtpZigwIT09KGcuc3VidHJlZUZsYWdzJjIwNjQpJiZudWxsIT09XG5yKXIucmV0dXJuPWcsVD1yO2Vsc2UgYjpmb3IoZz14O251bGwhPT1UOyl7aD1UO2lmKDAhPT0oaC5mbGFncyYyMDQ4KSl0cnl7c3dpdGNoKGgudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1Ok9qKDksaCl9fWNhdGNoKFope1UoaCxoLnJldHVybixaKX1pZihoPT09Zyl7VD1udWxsO2JyZWFrIGJ9dmFyIEY9aC5zaWJsaW5nO2lmKG51bGwhPT1GKXtGLnJldHVybj1oLnJldHVybjtUPUY7YnJlYWsgYn1UPWgucmV0dXJufX1XPWU7aWcoKTtpZihrYyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGtjLm9uUG9zdENvbW1pdEZpYmVyUm9vdCl0cnl7a2Mub25Qb3N0Q29tbWl0RmliZXJSb290KGpjLGEpfWNhdGNoKFope31kPSEwfXJldHVybiBkfWZpbmFsbHl7Qz1jLG1rLnRyYW5zaXRpb249Yn19cmV0dXJuITF9ZnVuY3Rpb24gV2soYSxiLGMpe2I9SGkoYyxiKTtiPUtpKGEsYiwxKTtBZyhhLGIpO2I9SmcoKTthPUFrKGEsMSk7bnVsbCE9PWEmJih6YyhhLDEsYiksQ2soYSxiKSl9XG5mdW5jdGlvbiBVKGEsYixjKXtpZigzPT09YS50YWcpV2soYSxhLGMpO2Vsc2UgZm9yKDtudWxsIT09Yjspe2lmKDM9PT1iLnRhZyl7V2soYixhLGMpO2JyZWFrfWVsc2UgaWYoMT09PWIudGFnKXt2YXIgZD1iLnN0YXRlTm9kZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcnx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGQuY29tcG9uZW50RGlkQ2F0Y2gmJihudWxsPT09T2l8fCFPaS5oYXMoZCkpKXthPUhpKGMsYSk7YT1OaShiLGEsMSk7QWcoYixhKTthPUpnKCk7Yj1BayhiLDEpO251bGwhPT1iJiYoemMoYiwxLGEpLENrKGIsYSkpO2JyZWFrfX1iPWIucmV0dXJufX1cbmZ1bmN0aW9uIFFpKGEsYixjKXt2YXIgZD1hLnBpbmdDYWNoZTtudWxsIT09ZCYmZC5kZWxldGUoYik7Yj1KZygpO2EucGluZ2VkTGFuZXN8PWEuc3VzcGVuZGVkTGFuZXMmYztQPT09YSYmKFkmYyk9PT1jJiYoND09PVJ8fDM9PT1SJiYoWSYxMzAwMjM0MjQpPT09WSYmNTAwPkIoKS1kaz9KayhhLDApOnBrfD1jKTtDayhhLGIpfWZ1bmN0aW9uIFhrKGEsYil7MD09PWImJigwPT09KGEubW9kZSYxKT9iPTE6KGI9cmMscmM8PD0xLDA9PT0ocmMmMTMwMDIzNDI0KSYmKHJjPTQxOTQzMDQpKSk7dmFyIGM9SmcoKTthPUFrKGEsYik7bnVsbCE9PWEmJih6YyhhLGIsYyksQ2soYSxjKSl9ZnVuY3Rpb24gemooYSl7dmFyIGI9YS5tZW1vaXplZFN0YXRlLGM9MDtudWxsIT09YiYmKGM9Yi5yZXRyeUxhbmUpO1hrKGEsYyl9XG5mdW5jdGlvbiBaaihhLGIpe3ZhciBjPTA7c3dpdGNoKGEudGFnKXtjYXNlIDEzOnZhciBkPWEuc3RhdGVOb2RlO3ZhciBlPWEubWVtb2l6ZWRTdGF0ZTtudWxsIT09ZSYmKGM9ZS5yZXRyeUxhbmUpO2JyZWFrO2Nhc2UgMTk6ZD1hLnN0YXRlTm9kZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHAoMzE0KSk7fW51bGwhPT1kJiZkLmRlbGV0ZShiKTtYayhhLGMpfXZhciBVaztcblVrPWZ1bmN0aW9uKGEsYixjKXtpZihudWxsIT09YSlpZihhLm1lbW9pemVkUHJvcHMhPT1iLnBlbmRpbmdQcm9wc3x8VmYuY3VycmVudCl0Zz0hMDtlbHNle2lmKDA9PT0oYS5sYW5lcyZjKSYmMD09PShiLmZsYWdzJjEyOCkpcmV0dXJuIHRnPSExLEZqKGEsYixjKTt0Zz0wIT09KGEuZmxhZ3MmMTMxMDcyKT8hMDohMX1lbHNlIHRnPSExLEkmJjAhPT0oYi5mbGFncyYxMDQ4NTc2KSYmYWgoYixVZyxiLmluZGV4KTtiLmxhbmVzPTA7c3dpdGNoKGIudGFnKXtjYXNlIDI6dmFyIGQ9Yi50eXBlO251bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpO2E9Yi5wZW5kaW5nUHJvcHM7dmFyIGU9WGYoYixILmN1cnJlbnQpO3NnKGIsYyk7ZT1VaChudWxsLGIsZCxhLGUsYyk7dmFyIGY9WmgoKTtiLmZsYWdzfD0xO1wib2JqZWN0XCI9PT10eXBlb2YgZSYmbnVsbCE9PWUmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLnJlbmRlciYmdm9pZCAwPT09ZS4kJHR5cGVvZj9cbihiLnRhZz0xLGIubWVtb2l6ZWRTdGF0ZT1udWxsLGIudXBkYXRlUXVldWU9bnVsbCxZZihkKT8oZj0hMCxiZyhiKSk6Zj0hMSxiLm1lbW9pemVkU3RhdGU9bnVsbCE9PWUuc3RhdGUmJnZvaWQgMCE9PWUuc3RhdGU/ZS5zdGF0ZTpudWxsLHhnKGIpLGUudXBkYXRlcj1NZyxiLnN0YXRlTm9kZT1lLGUuX3JlYWN0SW50ZXJuYWxzPWIsUWcoYixkLGEsYyksYj1waihudWxsLGIsZCwhMCxmLGMpKTooYi50YWc9MCxJJiZmJiZiaChiKSxlaihudWxsLGIsZSxjKSxiPWIuY2hpbGQpO3JldHVybiBiO2Nhc2UgMTY6ZD1iLmVsZW1lbnRUeXBlO2E6e251bGwhPT1hJiYoYS5hbHRlcm5hdGU9bnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZmxhZ3N8PTIpO2E9Yi5wZW5kaW5nUHJvcHM7ZT1kLl9pbml0O2Q9ZShkLl9wYXlsb2FkKTtiLnR5cGU9ZDtlPWIudGFnPVlrKGQpO2E9a2coZCxhKTtzd2l0Y2goZSl7Y2FzZSAwOmI9a2oobnVsbCxiLGQsYSxjKTticmVhayBhO2Nhc2UgMTpiPW9qKG51bGwsYixcbmQsYSxjKTticmVhayBhO2Nhc2UgMTE6Yj1maihudWxsLGIsZCxhLGMpO2JyZWFrIGE7Y2FzZSAxNDpiPWhqKG51bGwsYixkLGtnKGQudHlwZSxhKSxjKTticmVhayBhfXRocm93IEVycm9yKHAoMzA2LGQsXCJcIikpO31yZXR1cm4gYjtjYXNlIDA6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmtnKGQsZSksa2ooYSxiLGQsZSxjKTtjYXNlIDE6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmtnKGQsZSksb2ooYSxiLGQsZSxjKTtjYXNlIDM6YTp7cWooYik7aWYobnVsbD09PWEpdGhyb3cgRXJyb3IocCgzODcpKTtkPWIucGVuZGluZ1Byb3BzO2Y9Yi5tZW1vaXplZFN0YXRlO2U9Zi5lbGVtZW50O3lnKGEsYik7RWcoYixkLG51bGwsYyk7dmFyIGc9Yi5tZW1vaXplZFN0YXRlO2Q9Zy5lbGVtZW50O2lmKGYuaXNEZWh5ZHJhdGVkKWlmKGY9e2VsZW1lbnQ6ZCxpc0RlaHlkcmF0ZWQ6ITEsXG5jYWNoZTpnLmNhY2hlLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6Zy5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLHRyYW5zaXRpb25zOmcudHJhbnNpdGlvbnN9LGIudXBkYXRlUXVldWUuYmFzZVN0YXRlPWYsYi5tZW1vaXplZFN0YXRlPWYsYi5mbGFncyYyNTYpe2U9RXJyb3IocCg0MjMpKTtiPXJqKGEsYixkLGMsZSk7YnJlYWsgYX1lbHNlIGlmKGQhPT1lKXtlPUVycm9yKHAoNDI0KSk7Yj1yaihhLGIsZCxjLGUpO2JyZWFrIGF9ZWxzZSBmb3IoZWg9S2YoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxkaD1iLEk9ITAsZmg9bnVsbCxjPXpoKGIsbnVsbCxkLGMpLGIuY2hpbGQ9YztjOyljLmZsYWdzPWMuZmxhZ3MmLTN8NDA5NixjPWMuc2libGluZztlbHNle25oKCk7aWYoZD09PWUpe2I9Z2ooYSxiLGMpO2JyZWFrIGF9ZWooYSxiLGQsYyl9Yj1iLmNoaWxkfXJldHVybiBiO2Nhc2UgNTpyZXR1cm4gSGgoYiksbnVsbD09PWEmJmtoKGIpLGQ9Yi50eXBlLGU9XG5iLnBlbmRpbmdQcm9wcyxmPW51bGwhPT1hP2EubWVtb2l6ZWRQcm9wczpudWxsLGc9ZS5jaGlsZHJlbixEZihkLGUpP2c9bnVsbDpudWxsIT09ZiYmRGYoZCxmKSYmKGIuZmxhZ3N8PTMyKSxuaihhLGIpLGVqKGEsYixnLGMpLGIuY2hpbGQ7Y2FzZSA2OnJldHVybiBudWxsPT09YSYma2goYiksbnVsbDtjYXNlIDEzOnJldHVybiB2aihhLGIsYyk7Y2FzZSA0OnJldHVybiBGaChiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLGQ9Yi5wZW5kaW5nUHJvcHMsbnVsbD09PWE/Yi5jaGlsZD15aChiLG51bGwsZCxjKTplaihhLGIsZCxjKSxiLmNoaWxkO2Nhc2UgMTE6cmV0dXJuIGQ9Yi50eXBlLGU9Yi5wZW5kaW5nUHJvcHMsZT1iLmVsZW1lbnRUeXBlPT09ZD9lOmtnKGQsZSksZmooYSxiLGQsZSxjKTtjYXNlIDc6cmV0dXJuIGVqKGEsYixiLnBlbmRpbmdQcm9wcyxjKSxiLmNoaWxkO2Nhc2UgODpyZXR1cm4gZWooYSxiLGIucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGMpLGIuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gZWooYSxcbmIsYi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sYyksYi5jaGlsZDtjYXNlIDEwOmE6e2Q9Yi50eXBlLl9jb250ZXh0O2U9Yi5wZW5kaW5nUHJvcHM7Zj1iLm1lbW9pemVkUHJvcHM7Zz1lLnZhbHVlO0cobGcsZC5fY3VycmVudFZhbHVlKTtkLl9jdXJyZW50VmFsdWU9ZztpZihudWxsIT09ZilpZihHZShmLnZhbHVlLGcpKXtpZihmLmNoaWxkcmVuPT09ZS5jaGlsZHJlbiYmIVZmLmN1cnJlbnQpe2I9Z2ooYSxiLGMpO2JyZWFrIGF9fWVsc2UgZm9yKGY9Yi5jaGlsZCxudWxsIT09ZiYmKGYucmV0dXJuPWIpO251bGwhPT1mOyl7dmFyIGg9Zi5kZXBlbmRlbmNpZXM7aWYobnVsbCE9PWgpe2c9Zi5jaGlsZDtmb3IodmFyIGs9aC5maXJzdENvbnRleHQ7bnVsbCE9PWs7KXtpZihrLmNvbnRleHQ9PT1kKXtpZigxPT09Zi50YWcpe2s9emcoLTEsYyYtYyk7ay50YWc9Mjt2YXIgbD1mLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1sKXtsPWwuc2hhcmVkO3ZhciBuPWwucGVuZGluZztudWxsPT09bj9rLm5leHQ9XG5rOihrLm5leHQ9bi5uZXh0LG4ubmV4dD1rKTtsLnBlbmRpbmc9a319Zi5sYW5lc3w9YztrPWYuYWx0ZXJuYXRlO251bGwhPT1rJiYoay5sYW5lc3w9Yyk7cmcoZi5yZXR1cm4sYyxiKTtoLmxhbmVzfD1jO2JyZWFrfWs9ay5uZXh0fX1lbHNlIGlmKDEwPT09Zi50YWcpZz1mLnR5cGU9PT1iLnR5cGU/bnVsbDpmLmNoaWxkO2Vsc2UgaWYoMTg9PT1mLnRhZyl7Zz1mLnJldHVybjtpZihudWxsPT09Zyl0aHJvdyBFcnJvcihwKDM0MSkpO2cubGFuZXN8PWM7aD1nLmFsdGVybmF0ZTtudWxsIT09aCYmKGgubGFuZXN8PWMpO3JnKGcsYyxiKTtnPWYuc2libGluZ31lbHNlIGc9Zi5jaGlsZDtpZihudWxsIT09ZylnLnJldHVybj1mO2Vsc2UgZm9yKGc9ZjtudWxsIT09Zzspe2lmKGc9PT1iKXtnPW51bGw7YnJlYWt9Zj1nLnNpYmxpbmc7aWYobnVsbCE9PWYpe2YucmV0dXJuPWcucmV0dXJuO2c9ZjticmVha31nPWcucmV0dXJufWY9Z31laihhLGIsZS5jaGlsZHJlbixjKTtiPWIuY2hpbGR9cmV0dXJuIGI7XG5jYXNlIDk6cmV0dXJuIGU9Yi50eXBlLGQ9Yi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sc2coYixjKSxlPXVnKGUpLGQ9ZChlKSxiLmZsYWdzfD0xLGVqKGEsYixkLGMpLGIuY2hpbGQ7Y2FzZSAxNDpyZXR1cm4gZD1iLnR5cGUsZT1rZyhkLGIucGVuZGluZ1Byb3BzKSxlPWtnKGQudHlwZSxlKSxoaihhLGIsZCxlLGMpO2Nhc2UgMTU6cmV0dXJuIGpqKGEsYixiLnR5cGUsYi5wZW5kaW5nUHJvcHMsYyk7Y2FzZSAxNzpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6a2coZCxlKSxudWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmZsYWdzfD0yKSxiLnRhZz0xLFlmKGQpPyhhPSEwLGJnKGIpKTphPSExLHNnKGIsYyksT2coYixkLGUpLFFnKGIsZCxlLGMpLHBqKG51bGwsYixkLCEwLGEsYyk7Y2FzZSAxOTpyZXR1cm4gRWooYSxiLGMpO2Nhc2UgMjI6cmV0dXJuIGxqKGEsYixjKX10aHJvdyBFcnJvcihwKDE1NixcbmIudGFnKSk7fTtmdW5jdGlvbiBFayhhLGIpe3JldHVybiAkYihhLGIpfWZ1bmN0aW9uIFprKGEsYixjLGQpe3RoaXMudGFnPWE7dGhpcy5rZXk9Yzt0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsO3RoaXMuaW5kZXg9MDt0aGlzLnJlZj1udWxsO3RoaXMucGVuZGluZ1Byb3BzPWI7dGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGw7dGhpcy5tb2RlPWQ7dGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wO3RoaXMuZGVsZXRpb25zPW51bGw7dGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MDt0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIGhoKGEsYixjLGQpe3JldHVybiBuZXcgWmsoYSxiLGMsZCl9XG5mdW5jdGlvbiBpaihhKXthPWEucHJvdG90eXBlO3JldHVybiEoIWF8fCFhLmlzUmVhY3RDb21wb25lbnQpfWZ1bmN0aW9uIFlrKGEpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKXJldHVybiBpaihhKT8xOjA7aWYodm9pZCAwIT09YSYmbnVsbCE9PWEpe2E9YS4kJHR5cGVvZjtpZihhPT09Q2EpcmV0dXJuIDExO2lmKGE9PT1GYSlyZXR1cm4gMTR9cmV0dXJuIDJ9XG5mdW5jdGlvbiB0aChhLGIpe3ZhciBjPWEuYWx0ZXJuYXRlO251bGw9PT1jPyhjPWhoKGEudGFnLGIsYS5rZXksYS5tb2RlKSxjLmVsZW1lbnRUeXBlPWEuZWxlbWVudFR5cGUsYy50eXBlPWEudHlwZSxjLnN0YXRlTm9kZT1hLnN0YXRlTm9kZSxjLmFsdGVybmF0ZT1hLGEuYWx0ZXJuYXRlPWMpOihjLnBlbmRpbmdQcm9wcz1iLGMudHlwZT1hLnR5cGUsYy5mbGFncz0wLGMuc3VidHJlZUZsYWdzPTAsYy5kZWxldGlvbnM9bnVsbCk7Yy5mbGFncz1hLmZsYWdzJjE0NjgwMDY0O2MuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXM7Yy5sYW5lcz1hLmxhbmVzO2MuY2hpbGQ9YS5jaGlsZDtjLm1lbW9pemVkUHJvcHM9YS5tZW1vaXplZFByb3BzO2MubWVtb2l6ZWRTdGF0ZT1hLm1lbW9pemVkU3RhdGU7Yy51cGRhdGVRdWV1ZT1hLnVwZGF0ZVF1ZXVlO2I9YS5kZXBlbmRlbmNpZXM7Yy5kZXBlbmRlbmNpZXM9bnVsbD09PWI/bnVsbDp7bGFuZXM6Yi5sYW5lcyxmaXJzdENvbnRleHQ6Yi5maXJzdENvbnRleHR9O1xuYy5zaWJsaW5nPWEuc2libGluZztjLmluZGV4PWEuaW5kZXg7Yy5yZWY9YS5yZWY7cmV0dXJuIGN9XG5mdW5jdGlvbiB2aChhLGIsYyxkLGUsZil7dmFyIGc9MjtkPWE7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGEpaWooYSkmJihnPTEpO2Vsc2UgaWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhKWc9NTtlbHNlIGE6c3dpdGNoKGEpe2Nhc2Ugd2E6cmV0dXJuIHhoKGMuY2hpbGRyZW4sZSxmLGIpO2Nhc2UgeGE6Zz04O2V8PTg7YnJlYWs7Y2FzZSB6YTpyZXR1cm4gYT1oaCgxMixjLGIsZXwyKSxhLmVsZW1lbnRUeXBlPXphLGEubGFuZXM9ZixhO2Nhc2UgRGE6cmV0dXJuIGE9aGgoMTMsYyxiLGUpLGEuZWxlbWVudFR5cGU9RGEsYS5sYW5lcz1mLGE7Y2FzZSBFYTpyZXR1cm4gYT1oaCgxOSxjLGIsZSksYS5lbGVtZW50VHlwZT1FYSxhLmxhbmVzPWYsYTtjYXNlIEhhOnJldHVybiB3aihjLGUsZixiKTtkZWZhdWx0OmlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpc3dpdGNoKGEuJCR0eXBlb2Ype2Nhc2UgQWE6Zz0xMDticmVhayBhO2Nhc2UgQmE6Zz05O2JyZWFrIGE7Y2FzZSBDYTpnPTExO1xuYnJlYWsgYTtjYXNlIEZhOmc9MTQ7YnJlYWsgYTtjYXNlIEdhOmc9MTY7ZD1udWxsO2JyZWFrIGF9dGhyb3cgRXJyb3IocCgxMzAsbnVsbD09YT9hOnR5cGVvZiBhLFwiXCIpKTt9Yj1oaChnLGMsYixlKTtiLmVsZW1lbnRUeXBlPWE7Yi50eXBlPWQ7Yi5sYW5lcz1mO3JldHVybiBifWZ1bmN0aW9uIHhoKGEsYixjLGQpe2E9aGgoNyxhLGQsYik7YS5sYW5lcz1jO3JldHVybiBhfWZ1bmN0aW9uIHdqKGEsYixjLGQpe2E9aGgoMjIsYSxkLGIpO2EuZWxlbWVudFR5cGU9SGE7YS5sYW5lcz1jO2Euc3RhdGVOb2RlPXt9O3JldHVybiBhfWZ1bmN0aW9uIHVoKGEsYixjKXthPWhoKDYsYSxudWxsLGIpO2EubGFuZXM9YztyZXR1cm4gYX1cbmZ1bmN0aW9uIHdoKGEsYixjKXtiPWhoKDQsbnVsbCE9PWEuY2hpbGRyZW4/YS5jaGlsZHJlbjpbXSxhLmtleSxiKTtiLmxhbmVzPWM7Yi5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86YS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmEuaW1wbGVtZW50YXRpb259O3JldHVybiBifVxuZnVuY3Rpb24gJGsoYSxiLGMsZCxlKXt0aGlzLnRhZz1iO3RoaXMuY29udGFpbmVySW5mbz1hO3RoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsO3RoaXMudGltZW91dEhhbmRsZT0tMTt0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsO3RoaXMuY2FsbGJhY2tQcmlvcml0eT0wO3RoaXMuZXZlbnRUaW1lcz15YygwKTt0aGlzLmV4cGlyYXRpb25UaW1lcz15YygtMSk7dGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wO3RoaXMuZW50YW5nbGVtZW50cz15YygwKTt0aGlzLmlkZW50aWZpZXJQcmVmaXg9ZDt0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj1lO3RoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1cbm51bGx9ZnVuY3Rpb24gYWwoYSxiLGMsZCxlLGYsZyxoLGspe2E9bmV3ICRrKGEsYixjLGgsayk7MT09PWI/KGI9MSwhMD09PWYmJihifD04KSk6Yj0wO2Y9aGgoMyxudWxsLG51bGwsYik7YS5jdXJyZW50PWY7Zi5zdGF0ZU5vZGU9YTtmLm1lbW9pemVkU3RhdGU9e2VsZW1lbnQ6ZCxpc0RlaHlkcmF0ZWQ6YyxjYWNoZTpudWxsLHRyYW5zaXRpb25zOm51bGwscGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczpudWxsfTt4ZyhmKTtyZXR1cm4gYX1mdW5jdGlvbiBibChhLGIsYyl7dmFyIGQ9Mzxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOnZhLGtleTpudWxsPT1kP251bGw6XCJcIitkLGNoaWxkcmVuOmEsY29udGFpbmVySW5mbzpiLGltcGxlbWVudGF0aW9uOmN9fVxuZnVuY3Rpb24gY2woYSl7aWYoIWEpcmV0dXJuIFVmO2E9YS5fcmVhY3RJbnRlcm5hbHM7YTp7aWYoVWIoYSkhPT1hfHwxIT09YS50YWcpdGhyb3cgRXJyb3IocCgxNzApKTt2YXIgYj1hO2Rve3N3aXRjaChiLnRhZyl7Y2FzZSAzOmI9Yi5zdGF0ZU5vZGUuY29udGV4dDticmVhayBhO2Nhc2UgMTppZihZZihiLnR5cGUpKXtiPWIuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O2JyZWFrIGF9fWI9Yi5yZXR1cm59d2hpbGUobnVsbCE9PWIpO3Rocm93IEVycm9yKHAoMTcxKSk7fWlmKDE9PT1hLnRhZyl7dmFyIGM9YS50eXBlO2lmKFlmKGMpKXJldHVybiBhZyhhLGMsYil9cmV0dXJuIGJ9XG5mdW5jdGlvbiBkbChhLGIsYyxkLGUsZixnLGgsayl7YT1hbChjLGQsITAsYSxlLGYsZyxoLGspO2EuY29udGV4dD1jbChudWxsKTtjPWEuY3VycmVudDtkPUpnKCk7ZT1LZyhjKTtmPXpnKGQsZSk7Zi5jYWxsYmFjaz12b2lkIDAhPT1iJiZudWxsIT09Yj9iOm51bGw7QWcoYyxmKTthLmN1cnJlbnQubGFuZXM9ZTt6YyhhLGUsZCk7Q2soYSxkKTtyZXR1cm4gYX1mdW5jdGlvbiBlbChhLGIsYyxkKXt2YXIgZT1iLmN1cnJlbnQsZj1KZygpLGc9S2coZSk7Yz1jbChjKTtudWxsPT09Yi5jb250ZXh0P2IuY29udGV4dD1jOmIucGVuZGluZ0NvbnRleHQ9YztiPXpnKGYsZyk7Yi5wYXlsb2FkPXtlbGVtZW50OmF9O2Q9dm9pZCAwPT09ZD9udWxsOmQ7bnVsbCE9PWQmJihiLmNhbGxiYWNrPWQpO0FnKGUsYik7YT1MZyhlLGcsZik7bnVsbCE9PWEmJkNnKGEsZSxnKTtyZXR1cm4gZ31cbmZ1bmN0aW9uIGZsKGEpe2E9YS5jdXJyZW50O2lmKCFhLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChhLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gZ2woYSxiKXthPWEubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YSYmbnVsbCE9PWEuZGVoeWRyYXRlZCl7dmFyIGM9YS5yZXRyeUxhbmU7YS5yZXRyeUxhbmU9MCE9PWMmJmM8Yj9jOmJ9fWZ1bmN0aW9uIGhsKGEsYil7Z2woYSxiKTsoYT1hLmFsdGVybmF0ZSkmJmdsKGEsYil9ZnVuY3Rpb24gaWwoKXtyZXR1cm4gbnVsbH12YXIgamw9XCJmdW5jdGlvblwiPT09dHlwZW9mIHJlcG9ydEVycm9yP3JlcG9ydEVycm9yOmZ1bmN0aW9uKGEpe2NvbnNvbGUuZXJyb3IoYSl9O2Z1bmN0aW9uIGtsKGEpe3RoaXMuX2ludGVybmFsUm9vdD1hfVxubGwucHJvdG90eXBlLnJlbmRlcj1rbC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2ludGVybmFsUm9vdDtpZihudWxsPT09Yil0aHJvdyBFcnJvcihwKDQwOSkpO2VsKGEsYixudWxsLG51bGwpfTtsbC5wcm90b3R5cGUudW5tb3VudD1rbC5wcm90b3R5cGUudW5tb3VudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuX2ludGVybmFsUm9vdDtpZihudWxsIT09YSl7dGhpcy5faW50ZXJuYWxSb290PW51bGw7dmFyIGI9YS5jb250YWluZXJJbmZvO1FrKGZ1bmN0aW9uKCl7ZWwobnVsbCxhLG51bGwsbnVsbCl9KTtiW3RmXT1udWxsfX07ZnVuY3Rpb24gbGwoYSl7dGhpcy5faW50ZXJuYWxSb290PWF9XG5sbC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb249ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9R2MoKTthPXtibG9ja2VkT246bnVsbCx0YXJnZXQ6YSxwcmlvcml0eTpifTtmb3IodmFyIGM9MDtjPFBjLmxlbmd0aCYmMCE9PWImJmI8UGNbY10ucHJpb3JpdHk7YysrKTtQYy5zcGxpY2UoYywwLGEpOzA9PT1jJiZVYyhhKX19O2Z1bmN0aW9uIG1sKGEpe3JldHVybiEoIWF8fDEhPT1hLm5vZGVUeXBlJiY5IT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlKX1mdW5jdGlvbiBubChhKXtyZXR1cm4hKCFhfHwxIT09YS5ub2RlVHlwZSYmOSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZSYmKDghPT1hLm5vZGVUeXBlfHxcIiByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSBcIiE9PWEubm9kZVZhbHVlKSl9ZnVuY3Rpb24gb2woKXt9XG5mdW5jdGlvbiBwbChhLGIsYyxkLGUpe2lmKGUpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2YXIgZj1kO2Q9ZnVuY3Rpb24oKXt2YXIgYT1mbChnKTtmLmNhbGwoYSl9fXZhciBnPWRsKGIsZCxhLDAsbnVsbCwhMSwhMSxcIlwiLG9sKTthLl9yZWFjdFJvb3RDb250YWluZXI9ZzthW3RmXT1nLmN1cnJlbnQ7cmYoOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmEpO1FrKCk7cmV0dXJuIGd9Zm9yKDtlPWEubGFzdENoaWxkOylhLnJlbW92ZUNoaWxkKGUpO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkKXt2YXIgaD1kO2Q9ZnVuY3Rpb24oKXt2YXIgYT1mbChrKTtoLmNhbGwoYSl9fXZhciBrPWFsKGEsMCwhMSxudWxsLG51bGwsITEsITEsXCJcIixvbCk7YS5fcmVhY3RSb290Q29udGFpbmVyPWs7YVt0Zl09ay5jdXJyZW50O3JmKDg9PT1hLm5vZGVUeXBlP2EucGFyZW50Tm9kZTphKTtRayhmdW5jdGlvbigpe2VsKGIsayxjLGQpfSk7cmV0dXJuIGt9XG5mdW5jdGlvbiBxbChhLGIsYyxkLGUpe3ZhciBmPWMuX3JlYWN0Um9vdENvbnRhaW5lcjtpZihmKXt2YXIgZz1mO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlKXt2YXIgaD1lO2U9ZnVuY3Rpb24oKXt2YXIgYT1mbChnKTtoLmNhbGwoYSl9fWVsKGIsZyxhLGUpfWVsc2UgZz1wbChjLGIsYSxlLGQpO3JldHVybiBmbChnKX1EYz1mdW5jdGlvbihhKXtzd2l0Y2goYS50YWcpe2Nhc2UgMzp2YXIgYj1hLnN0YXRlTm9kZTtpZihiLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe3ZhciBjPXNjKGIucGVuZGluZ0xhbmVzKTswIT09YyYmKEJjKGIsY3wxKSxDayhiLEIoKSksMD09PShXJjYpJiYoYWo9QigpKzUwMCxpZygpKSl9YnJlYWs7Y2FzZSAxMzp2YXIgZD1KZygpO1FrKGZ1bmN0aW9uKCl7cmV0dXJuIExnKGEsMSxkKX0pO2hsKGEsMSl9fTtFYz1mdW5jdGlvbihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1KZygpO0xnKGEsMTM0MjE3NzI4LGIpO2hsKGEsMTM0MjE3NzI4KX19O1xuRmM9ZnVuY3Rpb24oYSl7aWYoMTM9PT1hLnRhZyl7dmFyIGI9SmcoKSxjPUtnKGEpO0xnKGEsYyxiKTtobChhLGMpfX07R2M9ZnVuY3Rpb24oKXtyZXR1cm4gQ307SGM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1DO3RyeXtyZXR1cm4gQz1hLGIoKX1maW5hbGx5e0M9Y319O1xueGI9ZnVuY3Rpb24oYSxiLGMpe3N3aXRjaChiKXtjYXNlIFwiaW5wdXRcIjokYShhLGMpO2I9Yy5uYW1lO2lmKFwicmFkaW9cIj09PWMudHlwZSYmbnVsbCE9Yil7Zm9yKGM9YTtjLnBhcmVudE5vZGU7KWM9Yy5wYXJlbnROb2RlO2M9Yy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbbmFtZT1cIitKU09OLnN0cmluZ2lmeShcIlwiK2IpKyddW3R5cGU9XCJyYWRpb1wiXScpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07aWYoZCE9PWEmJmQuZm9ybT09PWEuZm9ybSl7dmFyIGU9Q2IoZCk7aWYoIWUpdGhyb3cgRXJyb3IocCg5MCkpO1ZhKGQpOyRhKGQsZSl9fX1icmVhaztjYXNlIFwidGV4dGFyZWFcIjpoYihhLGMpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpiPWMudmFsdWUsbnVsbCE9YiYmZWIoYSwhIWMubXVsdGlwbGUsYiwhMSl9fTtGYj1QaztHYj1RaztcbnZhciBybD17dXNpbmdDbGllbnRFbnRyeVBvaW50OiExLEV2ZW50czpbQmIsdGUsQ2IsRGIsRWIsUGtdfSxzbD17ZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6VmMsYnVuZGxlVHlwZTowLHZlcnNpb246XCIxOC4xLjBcIixyZW5kZXJlclBhY2thZ2VOYW1lOlwicmVhY3QtZG9tXCJ9O1xudmFyIHRsPXtidW5kbGVUeXBlOnNsLmJ1bmRsZVR5cGUsdmVyc2lvbjpzbC52ZXJzaW9uLHJlbmRlcmVyUGFja2FnZU5hbWU6c2wucmVuZGVyZXJQYWNrYWdlTmFtZSxyZW5kZXJlckNvbmZpZzpzbC5yZW5kZXJlckNvbmZpZyxvdmVycmlkZUhvb2tTdGF0ZTpudWxsLG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aDpudWxsLG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aDpudWxsLG92ZXJyaWRlUHJvcHM6bnVsbCxvdmVycmlkZVByb3BzRGVsZXRlUGF0aDpudWxsLG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoOm51bGwsc2V0RXJyb3JIYW5kbGVyOm51bGwsc2V0U3VzcGVuc2VIYW5kbGVyOm51bGwsc2NoZWR1bGVVcGRhdGU6bnVsbCxjdXJyZW50RGlzcGF0Y2hlclJlZjp0YS5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOmZ1bmN0aW9uKGEpe2E9WWIoYSk7cmV0dXJuIG51bGw9PT1hP251bGw6YS5zdGF0ZU5vZGV9LGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOnNsLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlfHxcbmlsLGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDpudWxsLHNjaGVkdWxlUmVmcmVzaDpudWxsLHNjaGVkdWxlUm9vdDpudWxsLHNldFJlZnJlc2hIYW5kbGVyOm51bGwsZ2V0Q3VycmVudEZpYmVyOm51bGwscmVjb25jaWxlclZlcnNpb246XCIxOC4xLjAtbmV4dC0yMmVkYjlmNzctMjAyMjA0MjZcIn07aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pe3ZhciB1bD1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoIXVsLmlzRGlzYWJsZWQmJnVsLnN1cHBvcnRzRmliZXIpdHJ5e2pjPXVsLmluamVjdCh0bCksa2M9dWx9Y2F0Y2goYSl7fX1leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEPXJsO1xuZXhwb3J0cy5jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oYSxiKXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtpZighbWwoYikpdGhyb3cgRXJyb3IocCgyMDApKTtyZXR1cm4gYmwoYSxiLG51bGwsYyl9O2V4cG9ydHMuY3JlYXRlUm9vdD1mdW5jdGlvbihhLGIpe2lmKCFtbChhKSl0aHJvdyBFcnJvcihwKDI5OSkpO3ZhciBjPSExLGQ9XCJcIixlPWpsO251bGwhPT1iJiZ2b2lkIDAhPT1iJiYoITA9PT1iLnVuc3RhYmxlX3N0cmljdE1vZGUmJihjPSEwKSx2b2lkIDAhPT1iLmlkZW50aWZpZXJQcmVmaXgmJihkPWIuaWRlbnRpZmllclByZWZpeCksdm9pZCAwIT09Yi5vblJlY292ZXJhYmxlRXJyb3ImJihlPWIub25SZWNvdmVyYWJsZUVycm9yKSk7Yj1hbChhLDEsITEsbnVsbCxudWxsLGMsITEsZCxlKTthW3RmXT1iLmN1cnJlbnQ7cmYoOD09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmEpO3JldHVybiBuZXcga2woYil9O1xuZXhwb3J0cy5maW5kRE9NTm9kZT1mdW5jdGlvbihhKXtpZihudWxsPT1hKXJldHVybiBudWxsO2lmKDE9PT1hLm5vZGVUeXBlKXJldHVybiBhO3ZhciBiPWEuX3JlYWN0SW50ZXJuYWxzO2lmKHZvaWQgMD09PWIpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnJlbmRlcil0aHJvdyBFcnJvcihwKDE4OCkpO2E9T2JqZWN0LmtleXMoYSkuam9pbihcIixcIik7dGhyb3cgRXJyb3IocCgyNjgsYSkpO31hPVliKGIpO2E9bnVsbD09PWE/bnVsbDphLnN0YXRlTm9kZTtyZXR1cm4gYX07ZXhwb3J0cy5mbHVzaFN5bmM9ZnVuY3Rpb24oYSl7cmV0dXJuIFFrKGEpfTtleHBvcnRzLmh5ZHJhdGU9ZnVuY3Rpb24oYSxiLGMpe2lmKCFubChiKSl0aHJvdyBFcnJvcihwKDIwMCkpO3JldHVybiBxbChudWxsLGEsYiwhMCxjKX07XG5leHBvcnRzLmh5ZHJhdGVSb290PWZ1bmN0aW9uKGEsYixjKXtpZighbWwoYSkpdGhyb3cgRXJyb3IocCg0MDUpKTt2YXIgZD1udWxsIT1jJiZjLmh5ZHJhdGVkU291cmNlc3x8bnVsbCxlPSExLGY9XCJcIixnPWpsO251bGwhPT1jJiZ2b2lkIDAhPT1jJiYoITA9PT1jLnVuc3RhYmxlX3N0cmljdE1vZGUmJihlPSEwKSx2b2lkIDAhPT1jLmlkZW50aWZpZXJQcmVmaXgmJihmPWMuaWRlbnRpZmllclByZWZpeCksdm9pZCAwIT09Yy5vblJlY292ZXJhYmxlRXJyb3ImJihnPWMub25SZWNvdmVyYWJsZUVycm9yKSk7Yj1kbChiLG51bGwsYSwxLG51bGwhPWM/YzpudWxsLGUsITEsZixnKTthW3RmXT1iLmN1cnJlbnQ7cmYoYSk7aWYoZClmb3IoYT0wO2E8ZC5sZW5ndGg7YSsrKWM9ZFthXSxlPWMuX2dldFZlcnNpb24sZT1lKGMuX3NvdXJjZSksbnVsbD09Yi5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhP2IubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1bYyxlXTpiLm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChjLFxuZSk7cmV0dXJuIG5ldyBsbChiKX07ZXhwb3J0cy5yZW5kZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKCFubChiKSl0aHJvdyBFcnJvcihwKDIwMCkpO3JldHVybiBxbChudWxsLGEsYiwhMSxjKX07ZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlPWZ1bmN0aW9uKGEpe2lmKCFubChhKSl0aHJvdyBFcnJvcihwKDQwKSk7cmV0dXJuIGEuX3JlYWN0Um9vdENvbnRhaW5lcj8oUWsoZnVuY3Rpb24oKXtxbChudWxsLG51bGwsYSwhMSxmdW5jdGlvbigpe2EuX3JlYWN0Um9vdENvbnRhaW5lcj1udWxsO2FbdGZdPW51bGx9KX0pLCEwKTohMX07ZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1QaztcbmV4cG9ydHMudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI9ZnVuY3Rpb24oYSxiLGMsZCl7aWYoIW5sKGMpKXRocm93IEVycm9yKHAoMjAwKSk7aWYobnVsbD09YXx8dm9pZCAwPT09YS5fcmVhY3RJbnRlcm5hbHMpdGhyb3cgRXJyb3IocCgzOCkpO3JldHVybiBxbChhLGIsYywhMSxkKX07ZXhwb3J0cy52ZXJzaW9uPVwiMTguMS4wLW5leHQtMjJlZGI5Zjc3LTIwMjIwNDI2XCI7XG4iLCAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydCA9PT1cbiAgICAnZnVuY3Rpb24nXG4pIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdGFydChuZXcgRXJyb3IoKSk7XG59XG4gICAgICAgICAgdmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBTY2hlZHVsZXIgPSByZXF1aXJlKCdzY2hlZHVsZXInKTtcblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbnZhciBzdXBwcmVzc1dhcm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHNldFN1cHByZXNzV2FybmluZyhuZXdTdXBwcmVzc1dhcm5pbmcpIHtcbiAge1xuICAgIHN1cHByZXNzV2FybmluZyA9IG5ld1N1cHByZXNzV2FybmluZztcbiAgfVxufSAvLyBJbiBERVYsIGNhbGxzIHRvIGNvbnNvbGUud2FybiBhbmQgY29uc29sZS5lcnJvciBnZXQgcmVwbGFjZWRcbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIGlmICghc3VwcHJlc3NXYXJuaW5nKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBpZiAoIXN1cHByZXNzV2FybmluZykge1xuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG5cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxudmFyIEZ1bmN0aW9uQ29tcG9uZW50ID0gMDtcbnZhciBDbGFzc0NvbXBvbmVudCA9IDE7XG52YXIgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCA9IDI7IC8vIEJlZm9yZSB3ZSBrbm93IHdoZXRoZXIgaXQgaXMgZnVuY3Rpb24gb3IgY2xhc3NcblxudmFyIEhvc3RSb290ID0gMzsgLy8gUm9vdCBvZiBhIGhvc3QgdHJlZS4gQ291bGQgYmUgbmVzdGVkIGluc2lkZSBhbm90aGVyIG5vZGUuXG5cbnZhciBIb3N0UG9ydGFsID0gNDsgLy8gQSBzdWJ0cmVlLiBDb3VsZCBiZSBhbiBlbnRyeSBwb2ludCB0byBhIGRpZmZlcmVudCByZW5kZXJlci5cblxudmFyIEhvc3RDb21wb25lbnQgPSA1O1xudmFyIEhvc3RUZXh0ID0gNjtcbnZhciBGcmFnbWVudCA9IDc7XG52YXIgTW9kZSA9IDg7XG52YXIgQ29udGV4dENvbnN1bWVyID0gOTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSAxMDtcbnZhciBGb3J3YXJkUmVmID0gMTE7XG52YXIgUHJvZmlsZXIgPSAxMjtcbnZhciBTdXNwZW5zZUNvbXBvbmVudCA9IDEzO1xudmFyIE1lbW9Db21wb25lbnQgPSAxNDtcbnZhciBTaW1wbGVNZW1vQ29tcG9uZW50ID0gMTU7XG52YXIgTGF6eUNvbXBvbmVudCA9IDE2O1xudmFyIEluY29tcGxldGVDbGFzc0NvbXBvbmVudCA9IDE3O1xudmFyIERlaHlkcmF0ZWRGcmFnbWVudCA9IDE4O1xudmFyIFN1c3BlbnNlTGlzdENvbXBvbmVudCA9IDE5O1xudmFyIFNjb3BlQ29tcG9uZW50ID0gMjE7XG52YXIgT2Zmc2NyZWVuQ29tcG9uZW50ID0gMjI7XG52YXIgTGVnYWN5SGlkZGVuQ29tcG9uZW50ID0gMjM7XG52YXIgQ2FjaGVDb21wb25lbnQgPSAyNDtcbnZhciBUcmFjaW5nTWFya2VyQ29tcG9uZW50ID0gMjU7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBlbmFibGVDbGllbnRSZW5kZXJGYWxsYmFja09uVGV4dE1pc21hdGNoID0gdHJ1ZTsgLy8gVE9ETzogTmVlZCB0byByZXZpZXcgdGhpcyBjb2RlIG9uZSBtb3JlIHRpbWUgYmVmb3JlIGxhbmRpbmdcbi8vIHRoZSByZWFjdC1yZWNvbmNpbGVyIHBhY2thZ2UuXG5cbnZhciBlbmFibGVOZXdSZWNvbmNpbGVyID0gZmFsc2U7IC8vIFN1cHBvcnQgbGVnYWN5IFByaW1lciBzdXBwb3J0IG9uIGludGVybmFsIEZCIHd3d1xuXG52YXIgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiA9IGZhbHNlOyAvLyBGQi1vbmx5IHVzYWdlLiBUaGUgbmV3IEFQSSBoYXMgZGlmZmVyZW50IHNlbWFudGljcy5cblxudmFyIGVuYWJsZUxlZ2FjeUhpZGRlbiA9IGZhbHNlOyAvLyBFbmFibGVzIHVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrIGZlYXR1cmUgaW4gRmliZXJcblxudmFyIGVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2sgPSBmYWxzZTsgLy8gRW5hYmxlcyB1bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayBmZWF0dXJlIGluIEZpenpcbi8vIFJlYWN0IERPTSBDaG9wcGluZyBCbG9ja1xuLy9cbi8vIFNpbWlsYXIgdG8gbWFpbiBDaG9wcGluZyBCbG9jayBidXQgb25seSBmbGFncyByZWxhdGVkIHRvIFJlYWN0IERPTS4gVGhlc2UgYXJlXG4vLyBncm91cGVkIGJlY2F1c2Ugd2Ugd2lsbCBsaWtlbHkgYmF0Y2ggYWxsIG9mIHRoZW0gaW50byBhIHNpbmdsZSBtYWpvciByZWxlYXNlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpc2FibGUgc3VwcG9ydCBmb3IgY29tbWVudCBub2RlcyBhcyBSZWFjdCBET00gY29udGFpbmVycy4gQWxyZWFkeSBkaXNhYmxlZFxuLy8gaW4gb3BlbiBzb3VyY2UsIGJ1dCB3d3cgY29kZWJhc2Ugc3RpbGwgcmVsaWVzIG9uIGl0LiBOZWVkIHRvIHJlbW92ZS5cblxudmFyIGRpc2FibGVDb21tZW50c0FzRE9NQ29udGFpbmVycyA9IHRydWU7IC8vIERpc2FibGUgamF2YXNjcmlwdDogVVJMIHN0cmluZ3MgaW4gaHJlZiBmb3IgWFNTIHByb3RlY3Rpb24uXG4vLyBhbmQgY2xpZW50IHJlbmRlcmluZywgbW9zdGx5IHRvIGFsbG93IEpTWCBhdHRyaWJ1dGVzIHRvIGFwcGx5IHRvIHRoZSBjdXN0b21cbi8vIGVsZW1lbnQncyBvYmplY3QgcHJvcGVydGllcyBpbnN0ZWFkIG9mIG9ubHkgSFRNTCBhdHRyaWJ1dGVzLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTM0N1xuXG52YXIgZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCA9IGZhbHNlOyAvLyBEaXNhYmxlcyBjaGlsZHJlbiBmb3IgPHRleHRhcmVhPiBlbGVtZW50c1xudmFyIHdhcm5BYm91dFN0cmluZ1JlZnMgPSBmYWxzZTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlYnVnZ2luZyBhbmQgRGV2VG9vbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBBZGRzIHVzZXIgdGltaW5nIG1hcmtzIGZvciBlLmcuIHN0YXRlIHVwZGF0ZXMsIHN1c3BlbnNlLCBhbmQgd29yayBsb29wIHN0dWZmLFxuLy8gZm9yIGFuIGV4cGVyaW1lbnRhbCB0aW1lbGluZSB0b29sLlxuXG52YXIgZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyID0gdHJ1ZTsgLy8gSGVscHMgaWRlbnRpZnkgc2lkZSBlZmZlY3RzIGluIHJlbmRlci1waGFzZSBsaWZlY3ljbGUgaG9va3MgYW5kIHNldFN0YXRlXG5cbnZhciBlbmFibGVQcm9maWxlclRpbWVyID0gdHJ1ZTsgLy8gUmVjb3JkIGR1cmF0aW9ucyBmb3IgY29tbWl0IGFuZCBwYXNzaXZlIGVmZmVjdHMgcGhhc2VzLlxuXG52YXIgZW5hYmxlUHJvZmlsZXJDb21taXRIb29rcyA9IHRydWU7IC8vIFBoYXNlIHBhcmFtIHBhc3NlZCB0byBvblJlbmRlciBjYWxsYmFjayBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIGFuIFwidXBkYXRlXCIgYW5kIGEgXCJjYXNjYWRpbmctdXBkYXRlXCIuXG5cbnZhciBhbGxOYXRpdmVFdmVudHMgPSBuZXcgU2V0KCk7XG4vKipcbiAqIE1hcHBpbmcgZnJvbSByZWdpc3RyYXRpb24gbmFtZSB0byBldmVudCBuYW1lXG4gKi9cblxuXG52YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IHt9O1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbixcbiAqIHVzZWQgdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzLiBBdmFpbGFibGVcbiAqIG9ubHkgaW4gdHJ1ZS5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxudmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSAge30gOyAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gdHJ1ZVxuXG5mdW5jdGlvbiByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgJ0NhcHR1cmUnLCBkZXBlbmRlbmNpZXMpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdKSB7XG4gICAgICBlcnJvcignRXZlbnRSZWdpc3RyeTogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgJyArICdyZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuXG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5vbmRibGNsaWNrID0gcmVnaXN0cmF0aW9uTmFtZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5hZGQoZGVwZW5kZW5jaWVzW2ldKTtcbiAgfVxufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qXG4gKiBUaGUgYCcnICsgdmFsdWVgIHBhdHRlcm4gKHVzZWQgaW4gaW4gcGVyZi1zZW5zaXRpdmUgY29kZSkgdGhyb3dzIGZvciBTeW1ib2xcbiAqIGFuZCBUZW1wb3JhbC4qIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMjIwNjQuXG4gKlxuICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB3aWxsIHRocm93IGFuIGVhc2llci10by11bmRlcnN0YW5kLFxuICogZWFzaWVyLXRvLWRlYnVnIGV4Y2VwdGlvbiB3aXRoIGEgY2xlYXIgZXJyb3JzIG1lc3NhZ2UgbWVzc2FnZSBleHBsYWluaW5nIHRoZVxuICogcHJvYmxlbS4gKEluc3RlYWQgb2YgYSBjb25mdXNpbmcgZXhjZXB0aW9uIHRocm93biBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uXG4gKiBvZiB0aGUgYHZhbHVlYCBvYmplY3QpLlxuICovXG4vLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAge1xuICAgIC8vIHRvU3RyaW5nVGFnIGlzIG5lZWRlZCBmb3IgbmFtZXNwYWNlZCB0eXBlcyBsaWtlIFRlbXBvcmFsLkluc3RhbnRcbiAgICB2YXIgaGFzVG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZztcbiAgICB2YXIgdHlwZSA9IGhhc1RvU3RyaW5nVGFnICYmIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZSB8fCAnT2JqZWN0JztcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxufSAvLyAkRmxvd0ZpeE1lIG9ubHkgY2FsbGVkIGluIERFViwgc28gdm9pZCByZXR1cm4gaXMgbm90IHBvc3NpYmxlLlxuXG5cbmZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gIHtcbiAgICB0cnkge1xuICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIC8vIElmIHlvdSBlbmRlZCB1cCBoZXJlIGJ5IGZvbGxvd2luZyBhbiBleGNlcHRpb24gY2FsbCBzdGFjaywgaGVyZSdzIHdoYXQnc1xuICAvLyBoYXBwZW5lZDogeW91IHN1cHBsaWVkIGFuIG9iamVjdCBvciBzeW1ib2wgdmFsdWUgdG8gUmVhY3QgKGFzIGEgcHJvcCwga2V5LFxuICAvLyBET00gYXR0cmlidXRlLCBDU1MgcHJvcGVydHksIHN0cmluZyByZWYsIGV0Yy4pIGFuZCB3aGVuIFJlYWN0IHRyaWVkIHRvXG4gIC8vIGNvZXJjZSBpdCB0byBhIHN0cmluZyB1c2luZyBgJycgKyB2YWx1ZWAsIGFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duLlxuICAvL1xuICAvLyBUaGUgbW9zdCBjb21tb24gdHlwZXMgdGhhdCB3aWxsIGNhdXNlIHRoaXMgZXhjZXB0aW9uIGFyZSBgU3ltYm9sYCBpbnN0YW5jZXNcbiAgLy8gYW5kIFRlbXBvcmFsIG9iamVjdHMgbGlrZSBgVGVtcG9yYWwuSW5zdGFudGAuIEJ1dCBhbnkgb2JqZWN0IHRoYXQgaGFzIGFcbiAgLy8gYHZhbHVlT2ZgIG9yIGBbU3ltYm9sLnRvUHJpbWl0aXZlXWAgbWV0aG9kIHRoYXQgdGhyb3dzIHdpbGwgYWxzbyBjYXVzZSB0aGlzXG4gIC8vIGV4Y2VwdGlvbi4gKExpYnJhcnkgYXV0aG9ycyBkbyB0aGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSB1c2luZyBidWlsdC1pblxuICAvLyBudW1lcmljIG9wZXJhdG9ycyBsaWtlIGArYCBvciBjb21wYXJpc29uIG9wZXJhdG9ycyBsaWtlIGA+PWAgYmVjYXVzZSBjdXN0b21cbiAgLy8gbWV0aG9kcyBhcmUgbmVlZGVkIHRvIHBlcmZvcm0gYWNjdXJhdGUgYXJpdGhtZXRpYyBvciBjb21wYXJpc29uLilcbiAgLy9cbiAgLy8gVG8gZml4IHRoZSBwcm9ibGVtLCBjb2VyY2UgdGhpcyBvYmplY3Qgb3Igc3ltYm9sIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuICAvLyBwYXNzaW5nIGl0IHRvIFJlYWN0LiBUaGUgbW9zdCByZWxpYWJsZSB3YXkgaXMgdXN1YWxseSBgU3RyaW5nKHZhbHVlKWAuXG4gIC8vXG4gIC8vIFRvIGZpbmQgd2hpY2ggdmFsdWUgaXMgdGhyb3dpbmcsIGNoZWNrIHRoZSBicm93c2VyIG9yIGRlYnVnZ2VyIGNvbnNvbGUuXG4gIC8vIEJlZm9yZSB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLCB0aGVyZSBzaG91bGQgYmUgYGNvbnNvbGUuZXJyb3JgIG91dHB1dFxuICAvLyB0aGF0IHNob3dzIHRoZSB0eXBlIChTeW1ib2wsIFRlbXBvcmFsLlBsYWluRGF0ZSwgZXRjLikgdGhhdCBjYXVzZWQgdGhlXG4gIC8vIHByb2JsZW0gYW5kIGhvdyB0aGF0IHR5cGUgd2FzIHVzZWQ6IGtleSwgYXRycmlidXRlLCBpbnB1dCB2YWx1ZSBwcm9wLCBldGMuXG4gIC8vIEluIG1vc3QgY2FzZXMsIHRoaXMgY29uc29sZSBvdXRwdXQgYWxzbyBzaG93cyB0aGUgY29tcG9uZW50IGFuZCBpdHNcbiAgLy8gYW5jZXN0b3IgY29tcG9uZW50cyB3aGVyZSB0aGUgZXhjZXB0aW9uIGhhcHBlbmVkLlxuICAvL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb25cbiAgcmV0dXJuICcnICsgdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGF0dHJpYnV0ZU5hbWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdUaGUgcHJvdmlkZWQgYCVzYCBhdHRyaWJ1dGUgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgYXR0cmlidXRlTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gIHtcbiAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKSB7XG4gICAgICBlcnJvcignVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCB0eXBlTmFtZSh2YWx1ZSkpO1xuXG4gICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTsgLy8gdGhyb3cgKHRvIGhlbHAgY2FsbGVycyBmaW5kIHRyb3VibGVzaG9vdGluZyBjb21tZW50cylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNoZWNrUHJvcFN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIHByb3AgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgcHJvcE5hbWUsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBgJXNgIENTUyBwcm9wZXJ0eSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLicgKyAnIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSBiZWZvcmUgdXNpbmcgaXQgaGVyZS4nLCBwcm9wTmFtZSwgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0h0bWxTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICB7XG4gICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSkge1xuICAgICAgZXJyb3IoJ1RoZSBwcm92aWRlZCBIVE1MIG1hcmt1cCB1c2VzIGEgdmFsdWUgb2YgdW5zdXBwb3J0ZWQgdHlwZSAlcy4nICsgJyBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgYmVmb3JlIHVzaW5nIGl0IGhlcmUuJywgdHlwZU5hbWUodmFsdWUpKTtcblxuICAgICAgcmV0dXJuIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7IC8vIHRocm93ICh0byBoZWxwIGNhbGxlcnMgZmluZCB0cm91Ymxlc2hvb3RpbmcgY29tbWVudHMpXG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAge1xuICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdGb3JtIGZpZWxkIHZhbHVlcyAodmFsdWUsIGNoZWNrZWQsIGRlZmF1bHRWYWx1ZSwgb3IgZGVmYXVsdENoZWNrZWQgcHJvcHMpJyArICcgbXVzdCBiZSBzdHJpbmdzLCBub3QgJXMuJyArICcgVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIGJlZm9yZSB1c2luZyBpdCBoZXJlLicsIHR5cGVOYW1lKHZhbHVlKSk7XG5cbiAgICAgIHJldHVybiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpOyAvLyB0aHJvdyAodG8gaGVscCBjYWxsZXJzIGZpbmQgdHJvdWJsZXNob290aW5nIGNvbW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG4vLyBBIHJlc2VydmVkIGF0dHJpYnV0ZS5cbi8vIEl0IGlzIGhhbmRsZWQgYnkgUmVhY3Qgc2VwYXJhdGVseSBhbmQgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cbnZhciBSRVNFUlZFRCA9IDA7IC8vIEEgc2ltcGxlIHN0cmluZyBhdHRyaWJ1dGUuXG4vLyBBdHRyaWJ1dGVzIHRoYXQgYXJlbid0IGluIHRoZSBmaWx0ZXIgYXJlIHByZXN1bWVkIHRvIGhhdmUgdGhpcyB0eXBlLlxuXG52YXIgU1RSSU5HID0gMTsgLy8gQSBzdHJpbmcgYXR0cmlidXRlIHRoYXQgYWNjZXB0cyBib29sZWFucyBpbiBSZWFjdC4gSW4gSFRNTCwgdGhlc2UgYXJlIGNhbGxlZFxuLy8gXCJlbnVtZXJhdGVkXCIgYXR0cmlidXRlcyB3aXRoIFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIgYXMgcG9zc2libGUgdmFsdWVzLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJ0cnVlXCIgc3RyaW5nLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIHNldCB0byBhIFwiZmFsc2VcIiBzdHJpbmcuXG5cbnZhciBCT09MRUFOSVNIX1NUUklORyA9IDI7IC8vIEEgcmVhbCBib29sZWFuIGF0dHJpYnV0ZS5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBvbWl0dGVkLlxuXG52YXIgQk9PTEVBTiA9IDM7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgZmxhZyBhcyB3ZWxsIGFzIHdpdGggYSB2YWx1ZS5cbi8vIFdoZW4gdHJ1ZSwgaXQgc2hvdWxkIGJlIHByZXNlbnQgKHNldCBlaXRoZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIGl0cyBuYW1lKS5cbi8vIFdoZW4gZmFsc2UsIGl0IHNob3VsZCBiZSBvbWl0dGVkLlxuLy8gRm9yIGFueSBvdGhlciB2YWx1ZSwgc2hvdWxkIGJlIHByZXNlbnQgd2l0aCB0aGF0IHZhbHVlLlxuXG52YXIgT1ZFUkxPQURFRF9CT09MRUFOID0gNDsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgTlVNRVJJQyA9IDU7IC8vIEFuIGF0dHJpYnV0ZSB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtZXJpYyBvciBwYXJzZSBhcyBhIHBvc2l0aXZlIG51bWVyaWMuXG4vLyBXaGVuIGZhbHN5LCBpdCBzaG91bGQgYmUgcmVtb3ZlZC5cblxudmFyIFBPU0lUSVZFX05VTUVSSUMgPSA2O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG52YXIgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiA9IFwiOkEtWl9hLXpcXFxcdTAwQzAtXFxcXHUwMEQ2XFxcXHUwMEQ4LVxcXFx1MDBGNlxcXFx1MDBGOC1cXFxcdTAyRkZcXFxcdTAzNzAtXFxcXHUwMzdEXFxcXHUwMzdGLVxcXFx1MUZGRlxcXFx1MjAwQy1cXFxcdTIwMERcXFxcdTIwNzAtXFxcXHUyMThGXFxcXHUyQzAwLVxcXFx1MkZFRlxcXFx1MzAwMS1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZGRFwiO1xuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuICovXG5cbnZhciBBVFRSSUJVVEVfTkFNRV9DSEFSID0gQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArIFwiXFxcXC0uMC05XFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDBcIjtcbnZhciBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCA9IG5ldyBSZWdFeHAoJ15bJyArIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyAnXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5mdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblxuICB7XG4gICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOiAvLyAkRmxvd0lzc3VlIHN5bWJvbCBpcyBwZXJmZWN0bHkgdmFsaWQgaGVyZVxuXG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICB7XG4gICAgICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZWZpeCA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5cbnJlc2VydmVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBSRVNFUlZFRCwgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIEEgZmV3IFJlYWN0IHN0cmluZyBhdHRyaWJ1dGVzIGhhdmUgYSBkaWZmZXJlbnQgbmFtZS5cbi8vIFRoaXMgaXMgYSBtYXBwaW5nIGZyb20gUmVhY3QgcHJvcCBuYW1lcyB0byB0aGUgYXR0cmlidXRlIG5hbWVzLlxuXG5bWydhY2NlcHRDaGFyc2V0JywgJ2FjY2VwdC1jaGFyc2V0J10sIFsnY2xhc3NOYW1lJywgJ2NsYXNzJ10sIFsnaHRtbEZvcicsICdmb3InXSwgWydodHRwRXF1aXYnLCAnaHR0cC1lcXVpdiddXS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gIHZhciBuYW1lID0gX3JlZlswXSxcbiAgICAgIGF0dHJpYnV0ZU5hbWUgPSBfcmVmWzFdO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IFwidHJ1ZVwiIGFuZCBcImZhbHNlXCIuXG4vLyBJbiBSZWFjdCwgd2UgbGV0IHVzZXJzIHBhc3MgYHRydWVgIGFuZCBgZmFsc2VgIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5XG4vLyB0aGVzZSBhcmVuJ3QgYm9vbGVhbiBhdHRyaWJ1dGVzICh0aGV5IGFyZSBjb2VyY2VkIHRvIHN0cmluZ3MpLlxuXG5bJ2NvbnRlbnRFZGl0YWJsZScsICdkcmFnZ2FibGUnLCAnc3BlbGxDaGVjaycsICd2YWx1ZSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBcImVudW1lcmF0ZWRcIiBTVkcgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cbi8vIFNpbmNlIHRoZXNlIGFyZSBTVkcgYXR0cmlidXRlcywgdGhlaXIgYXR0cmlidXRlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cblxuWydhdXRvUmV2ZXJzZScsICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJywgJ2ZvY3VzYWJsZScsICdwcmVzZXJ2ZUFscGhhJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOSVNIX1NUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBuYW1lLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSBIVE1MIGJvb2xlYW4gYXR0cmlidXRlcy5cblxuWydhbGxvd0Z1bGxTY3JlZW4nLCAnYXN5bmMnLCAvLyBOb3RlOiB0aGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgd3JpdHRlbiB0byB0aGUgRE9NXG4vLyBvbiB0aGUgY2xpZW50IHNpZGUgYmVjYXVzZSB0aGUgYnJvd3NlcnMgYXJlIGluY29uc2lzdGVudC4gSW5zdGVhZCB3ZSBjYWxsIGZvY3VzKCkuXG4nYXV0b0ZvY3VzJywgJ2F1dG9QbGF5JywgJ2NvbnRyb2xzJywgJ2RlZmF1bHQnLCAnZGVmZXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUnLCAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJywgJ2Zvcm1Ob1ZhbGlkYXRlJywgJ2hpZGRlbicsICdsb29wJywgJ25vTW9kdWxlJywgJ25vVmFsaWRhdGUnLCAnb3BlbicsICdwbGF5c0lubGluZScsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdyZXZlcnNlZCcsICdzY29wZWQnLCAnc2VhbWxlc3MnLCAvLyBNaWNyb2RhdGFcbidpdGVtU2NvcGUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGFyZSB0aGUgZmV3IFJlYWN0IHByb3BzIHRoYXQgd2Ugc2V0IGFzIERPTSBwcm9wZXJ0aWVzXG4vLyByYXRoZXIgdGhhbiBhdHRyaWJ1dGVzLiBUaGVzZSBhcmUgYWxsIGJvb2xlYW5zLlxuXG5bJ2NoZWNrZWQnLCAvLyBOb3RlOiBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuLy8gZGlzYWJsZWQgd2l0aCBgcmVtb3ZlQXR0cmlidXRlYC4gV2UgaGF2ZSBzcGVjaWFsIGxvZ2ljIGZvciBoYW5kbGluZyB0aGlzLlxuJ211bHRpcGxlJywgJ211dGVkJywgJ3NlbGVjdGVkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCB0cnVlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgYXJlIFwib3ZlcmxvYWRlZCBib29sZWFuc1wiOiB0aGV5IGJlaGF2ZSBsaWtlXG4vLyBib29sZWFucywgYnV0IGNhbiBhbHNvIGFjY2VwdCBhIHN0cmluZyB2YWx1ZS5cblxuWydjYXB0dXJlJywgJ2Rvd25sb2FkJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBPVkVSTE9BREVEX0JPT0xFQU4sIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXJzLlxuXG5bJ2NvbHMnLCAncm93cycsICdzaXplJywgJ3NwYW4nIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFBPU0lUSVZFX05VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBudW1iZXJzLlxuXG5bJ3Jvd1NwYW4nLCAnc3RhcnQnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIE5VTUVSSUMsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7XG52YXIgQ0FNRUxJWkUgPSAvW1xcLVxcOl0oW2Etel0pL2c7XG5cbnZhciBjYXBpdGFsaXplID0gZnVuY3Rpb24gKHRva2VuKSB7XG4gIHJldHVybiB0b2tlblsxXS50b1VwcGVyQ2FzZSgpO1xufTsgLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIFNWRyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBzcGVjaWFsIGNhc2luZywgbmFtZXNwYWNpbmcsXG4vLyBvciBib29sZWFuIHZhbHVlIGFzc2lnbm1lbnQuIFJlZ3VsYXIgYXR0cmlidXRlcyB0aGF0IGp1c3QgYWNjZXB0IHN0cmluZ3Ncbi8vIGFuZCBoYXZlIHRoZSBzYW1lIG5hbWVzIGFyZSBvbWl0dGVkLCBqdXN0IGxpa2UgaW4gdGhlIEhUTUwgYXR0cmlidXRlIGZpbHRlci5cbi8vIFNvbWUgb2YgdGhlc2UgYXR0cmlidXRlcyBjYW4gYmUgaGFyZCB0byBmaW5kLiBUaGlzIGxpc3Qgd2FzIGNyZWF0ZWQgYnlcbi8vIHNjcmFwaW5nIHRoZSBNRE4gZG9jdW1lbnRhdGlvbi5cblxuXG5bJ2FjY2VudC1oZWlnaHQnLCAnYWxpZ25tZW50LWJhc2VsaW5lJywgJ2FyYWJpYy1mb3JtJywgJ2Jhc2VsaW5lLXNoaWZ0JywgJ2NhcC1oZWlnaHQnLCAnY2xpcC1wYXRoJywgJ2NsaXAtcnVsZScsICdjb2xvci1pbnRlcnBvbGF0aW9uJywgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycycsICdjb2xvci1wcm9maWxlJywgJ2NvbG9yLXJlbmRlcmluZycsICdkb21pbmFudC1iYXNlbGluZScsICdlbmFibGUtYmFja2dyb3VuZCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2Zsb29kLWNvbG9yJywgJ2Zsb29kLW9wYWNpdHknLCAnZm9udC1mYW1pbHknLCAnZm9udC1zaXplJywgJ2ZvbnQtc2l6ZS1hZGp1c3QnLCAnZm9udC1zdHJldGNoJywgJ2ZvbnQtc3R5bGUnLCAnZm9udC12YXJpYW50JywgJ2ZvbnQtd2VpZ2h0JywgJ2dseXBoLW5hbWUnLCAnZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCcsICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCcsICdob3Jpei1hZHYteCcsICdob3Jpei1vcmlnaW4teCcsICdpbWFnZS1yZW5kZXJpbmcnLCAnbGV0dGVyLXNwYWNpbmcnLCAnbGlnaHRpbmctY29sb3InLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdvdmVybGluZS1wb3NpdGlvbicsICdvdmVybGluZS10aGlja25lc3MnLCAncGFpbnQtb3JkZXInLCAncGFub3NlLTEnLCAncG9pbnRlci1ldmVudHMnLCAncmVuZGVyaW5nLWludGVudCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycsICdzdHJva2UtZGFzaGFycmF5JywgJ3N0cm9rZS1kYXNob2Zmc2V0JywgJ3N0cm9rZS1saW5lY2FwJywgJ3N0cm9rZS1saW5lam9pbicsICdzdHJva2UtbWl0ZXJsaW1pdCcsICdzdHJva2Utb3BhY2l0eScsICdzdHJva2Utd2lkdGgnLCAndGV4dC1hbmNob3InLCAndGV4dC1kZWNvcmF0aW9uJywgJ3RleHQtcmVuZGVyaW5nJywgJ3VuZGVybGluZS1wb3NpdGlvbicsICd1bmRlcmxpbmUtdGhpY2tuZXNzJywgJ3VuaWNvZGUtYmlkaScsICd1bmljb2RlLXJhbmdlJywgJ3VuaXRzLXBlci1lbScsICd2LWFscGhhYmV0aWMnLCAndi1oYW5naW5nJywgJ3YtaWRlb2dyYXBoaWMnLCAndi1tYXRoZW1hdGljYWwnLCAndmVjdG9yLWVmZmVjdCcsICd2ZXJ0LWFkdi15JywgJ3ZlcnQtb3JpZ2luLXgnLCAndmVydC1vcmlnaW4teScsICd3b3JkLXNwYWNpbmcnLCAnd3JpdGluZy1tb2RlJywgJ3htbG5zOnhsaW5rJywgJ3gtaGVpZ2h0JyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICB2YXIgbmFtZSA9IGF0dHJpYnV0ZU5hbWUucmVwbGFjZShDQU1FTElaRSwgY2FwaXRhbGl6ZSk7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLCBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeGxpbmsgbmFtZXNwYWNlLlxuXG5bJ3hsaW5rOmFjdHVhdGUnLCAneGxpbms6YXJjcm9sZScsICd4bGluazpyb2xlJywgJ3hsaW5rOnNob3cnLCAneGxpbms6dGl0bGUnLCAneGxpbms6dHlwZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFN0cmluZyBTVkcgYXR0cmlidXRlcyB3aXRoIHRoZSB4bWwgbmFtZXNwYWNlLlxuXG5bJ3htbDpiYXNlJywgJ3htbDpsYW5nJywgJ3htbDpzcGFjZScgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlIGV4aXN0cyBib3RoIGluIEhUTUwgYW5kIFNWRy5cbi8vIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBjYXNlLXNlbnNpdGl2ZSBpbiBTVkcgc28gd2UgY2FuJ3QganVzdCB1c2Vcbi8vIHRoZSBSZWFjdCBuYW1lIGxpa2Ugd2UgZG8gZm9yIGF0dHJpYnV0ZXMgdGhhdCBleGlzdCBvbmx5IGluIEhUTUwuXG5cblsndGFiSW5kZXgnLCAnY3Jvc3NPcmlnaW4nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXR0cmlidXRlcyBhY2NlcHQgVVJMcy4gVGhlc2UgbXVzdCBub3QgYWxsb3cgamF2YXNjcmlwdDogVVJMUy5cbi8vIFRoZXNlIHdpbGwgYWxzbyBuZWVkIHRvIGFjY2VwdCBUcnVzdGVkIFR5cGVzIG9iamVjdCBpbiB0aGUgZnV0dXJlLlxuXG52YXIgeGxpbmtIcmVmID0gJ3hsaW5rSHJlZic7XG5wcm9wZXJ0aWVzW3hsaW5rSHJlZl0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKCd4bGlua0hyZWYnLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbid4bGluazpocmVmJywgJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCB0cnVlLCAvLyBzYW5pdGl6ZVVSTFxuZmFsc2UpO1xuWydzcmMnLCAnaHJlZicsICdhY3Rpb24nLCAnZm9ybUFjdGlvbiddLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgcHJvcGVydGllc1thdHRyaWJ1dGVOYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQoYXR0cmlidXRlTmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbiAgdHJ1ZSk7XG59KTtcblxuLy8gYW5kIGFueSBuZXdsaW5lIG9yIHRhYiBhcmUgZmlsdGVyZWQgb3V0IGFzIGlmIHRoZXkncmUgbm90IHBhcnQgb2YgdGhlIFVSTC5cbi8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jdXJsLXBhcnNpbmdcbi8vIFRhYiBvciBuZXdsaW5lIGFyZSBkZWZpbmVkIGFzIFxcclxcblxcdDpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS10YWItb3ItbmV3bGluZVxuLy8gQSBDMCBjb250cm9sIGlzIGEgY29kZSBwb2ludCBpbiB0aGUgcmFuZ2UgXFx1MDAwMCBOVUxMIHRvIFxcdTAwMUZcbi8vIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkUsIGluY2x1c2l2ZTpcbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjMC1jb250cm9sLW9yLXNwYWNlXG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxudmFyIGlzSmF2YVNjcmlwdFByb3RvY29sID0gL15bXFx1MDAwMC1cXHUwMDFGIF0qaltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSp2W1xcclxcblxcdF0qYVtcXHJcXG5cXHRdKnNbXFxyXFxuXFx0XSpjW1xcclxcblxcdF0qcltcXHJcXG5cXHRdKmlbXFxyXFxuXFx0XSpwW1xcclxcblxcdF0qdFtcXHJcXG5cXHRdKlxcOi9pO1xudmFyIGRpZFdhcm4gPSBmYWxzZTtcblxuZnVuY3Rpb24gc2FuaXRpemVVUkwodXJsKSB7XG4gIHtcbiAgICBpZiAoIWRpZFdhcm4gJiYgaXNKYXZhU2NyaXB0UHJvdG9jb2wudGVzdCh1cmwpKSB7XG4gICAgICBkaWRXYXJuID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ0EgZnV0dXJlIHZlcnNpb24gb2YgUmVhY3Qgd2lsbCBibG9jayBqYXZhc2NyaXB0OiBVUkxzIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4gJyArICdVc2UgZXZlbnQgaGFuZGxlcnMgaW5zdGVhZCBpZiB5b3UgY2FuLiBJZiB5b3UgbmVlZCB0byBnZW5lcmF0ZSB1bnNhZmUgSFRNTCB0cnkgJyArICd1c2luZyBkYW5nZXJvdXNseVNldElubmVySFRNTCBpbnN0ZWFkLiBSZWFjdCB3YXMgcGFzc2VkICVzLicsIEpTT04uc3RyaW5naWZ5KHVybCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLiBPbmx5IHVzZWQgaW4gREVWIGZvciBTU1IgdmFsaWRhdGlvbi5cbiAqIFRoZSBcImV4cGVjdGVkXCIgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuXG4gKiBTb21lIHByb3BlcnRpZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvKSB7XG4gIHtcbiAgICBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG4gICAgICByZXR1cm4gbm9kZVtwcm9wZXJ0eU5hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIHByb3RlY3RzIG11bHRpcGxlIHVzZXMgb2YgYGV4cGVjdGVkYCwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgLy8gcmVhY3QtaW50ZXJuYWwvc2FmZS1zdHJpbmctY29lcmNpb24gcnVsZSBpcyBkaXNhYmxlZCBpbiBzZXZlcmFsIHNwb3RzXG4gICAgICAvLyBiZWxvdy5cbiAgICAgIHtcbiAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICggcHJvcGVydHlJbmZvLnNhbml0aXplVVJMKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgZnVsbHkgZGlzYWJsZWQgamF2YXNjcmlwdDogVVJMcywgYW5kIGlmXG4gICAgICAgIC8vIHRoZSBoeWRyYXRpb24gaXMgc3VjY2Vzc2Z1bCBvZiBhIGphdmFzY3JpcHQ6IFVSTCwgd2VcbiAgICAgICAgLy8gc3RpbGwgd2FudCB0byB3YXJuIG9uIHRoZSBjbGllbnQuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgICBzYW5pdGl6ZVVSTCgnJyArIGV4cGVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgIHZhciBzdHJpbmdWYWx1ZSA9IG51bGw7XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gT1ZFUkxPQURFRF9CT09MRUFOKSB7XG4gICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuXG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09ICcnICsgZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCBleHBlY3RlZCwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgICAgICAvLyBXZSBoYWQgYW4gYXR0cmlidXRlIGJ1dCBzaG91bGRuJ3QgaGF2ZSBoYWQgb25lLCBzbyByZWFkIGl0XG4gICAgICAgICAgLy8gZm9yIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgICAgICAgIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGEgYm9vbGVhbiwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgdmFsdWUgaXNcbiAgICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkLlxuICAgICAgICAgIHJldHVybiBleHBlY3RlZDtcbiAgICAgICAgfSAvLyBFdmVuIGlmIHRoaXMgcHJvcGVydHkgdXNlcyBhIG5hbWVzcGFjZSB3ZSB1c2UgZ2V0QXR0cmlidXRlXG4gICAgICAgIC8vIGJlY2F1c2Ugd2UgYXNzdW1lIGl0cyBuYW1lc3BhY2VkIG5hbWUgaXMgdGhlIHNhbWUgYXMgb3VyIGNvbmZpZy5cbiAgICAgICAgLy8gVG8gdXNlIGdldEF0dHJpYnV0ZU5TIHdlIG5lZWQgdGhlIGxvY2FsIG5hbWUgd2hpY2ggd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAvLyBpbiBvdXIgY29uZmlnIGF0bS5cblxuXG4gICAgICAgIHN0cmluZ1ZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdWYWx1ZSA9PT0gbnVsbCA/IGV4cGVjdGVkIDogc3RyaW5nVmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9zYWZlLXN0cmluZy1jb2VyY2lvblxuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCkge1xuICB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXG4gICAge1xuICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihleHBlY3RlZCwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCB2YWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcblxuICBpZiAoc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICB2YWx1ZSA9IG51bGw7XG4gIH0gLy8gSWYgdGhlIHByb3AgaXNuJ3QgaW4gdGhlIHNwZWNpYWwgbGlzdCwgdHJlYXQgaXQgYXMgYSBzaW1wbGUgYXR0cmlidXRlLlxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAge1xuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cblxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50Jyk7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJyk7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5jb250ZXh0Jyk7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2UnKTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xudmFyIFJFQUNUX01FTU9fVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJyk7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LmxhenknKTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJyk7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gIFN5bWJvbC5mb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG52YXIgUkVBQ1RfQ0FDSEVfVFlQRSA9ICBTeW1ib2wuZm9yKCdyZWFjdC5jYWNoZScpO1xudmFyIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEUgPSAgU3ltYm9sLmZvcigncmVhY3QudHJhY2luZ19tYXJrZXInKTtcbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSAgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCAhZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7IC8vIElmIG91ciBjb21wb25lbnQgZnJhbWUgaXMgbGFiZWxlZCBcIjxhbm9ueW1vdXM+XCJcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgaGF2ZSBhIHVzZXItcHJvdmlkZWQgXCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgLy8gc3BsaWNlIGl0IGluIHRvIG1ha2UgdGhlIHN0YWNrIG1vcmUgcmVhZGFibGUuXG5cblxuICAgICAgICAgICAgICAgIGlmIChmbi5kaXNwbGF5TmFtZSAmJiBfZnJhbWUuaW5jbHVkZXMoJzxhbm9ueW1vdXM+JykpIHtcbiAgICAgICAgICAgICAgICAgIF9mcmFtZSA9IF9mcmFtZS5yZXBsYWNlKCc8YW5vbnltb3VzPicsIGZuLmRpc3BsYXlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUNsYXNzQ29tcG9uZW50RnJhbWUoY3Rvciwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShjdG9yLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlcikge1xuICB2YXIgb3duZXIgPSAgZmliZXIuX2RlYnVnT3duZXIgPyBmaWJlci5fZGVidWdPd25lci50eXBlIDogbnVsbCA7XG4gIHZhciBzb3VyY2UgPSAgZmliZXIuX2RlYnVnU291cmNlIDtcblxuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnTGF6eScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUucmVuZGVyKTtcblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZGVzY3JpYmVDbGFzc0NvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdGFja0J5RmliZXJJbkRldkFuZFByb2Qod29ya0luUHJvZ3Jlc3MpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICBkbyB7XG4gICAgICBpbmZvICs9IGRlc2NyaWJlRmliZXIobm9kZSk7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSk7XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfSBjYXRjaCAoeCkge1xuICAgIHJldHVybiAnXFxuRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogJyArIHgubWVzc2FnZSArICdcXG4nICsgeC5zdGFjaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGRpc3BsYXlOYW1lID0gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lO1xuXG4gIGlmIChkaXNwbGF5TmFtZSkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZTtcbiAgfVxuXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWU7XG59IC8vIEtlZXAgaW4gc3luYyB3aXRoIHJlYWN0LXJlY29uY2lsZXIvZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlclxuXG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufSAvLyBOb3RlIHRoYXQgdGhlIHJlY29uY2lsZXIgcGFja2FnZSBzaG91bGQgZ2VuZXJhbGx5IHByZWZlciB0byB1c2UgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcigpIGluc3RlYWQuXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcblxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHZhciBvdXRlck5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGw7XG5cbiAgICAgICAgaWYgKG91dGVyTmFtZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBvdXRlck5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgJ01lbW8nO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZSQxKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lIHx8IChmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWUpO1xufSAvLyBLZWVwIGluIHN5bmMgd2l0aCBzaGFyZWQvZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlXG5cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUkMSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikge1xuICB2YXIgdGFnID0gZmliZXIudGFnLFxuICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdDYWNoZSc7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZSQxKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUkMShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAgcmV0dXJuICdEZWh5ZHJhdGVkRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lJDEodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAvLyBIb3N0IGNvbXBvbmVudCB0eXBlIGlzIHRoZSBkaXNwbGF5IG5hbWUgKGUuZy4gXCJkaXZcIiwgXCJWaWV3XCIpXG4gICAgICByZXR1cm4gdHlwZTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gJ1Jvb3QnO1xuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiAnVGV4dCc7XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICAvLyBOYW1lIGNvbWVzIGZyb20gdGhlIHR5cGUgaW4gdGhpcyBjYXNlOyB3ZSBkb24ndCBoYXZlIGEgdGFnLlxuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcblxuICAgIGNhc2UgTW9kZTpcbiAgICAgIGlmICh0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFKSB7XG4gICAgICAgIC8vIERvbid0IGJlIGxlc3Mgc3BlY2lmaWMgdGhhbiBzaGFyZWQvZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlXG4gICAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnTW9kZSc7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHJldHVybiAnT2Zmc2NyZWVuJztcblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1Njb3BlJztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAgcmV0dXJuICdUcmFjaW5nTWFya2VyJztcbiAgICAvLyBUaGUgZGlzcGxheSBuYW1lIGZvciB0aGlzIHRhZ3MgY29tZSBmcm9tIHRoZSB1c2VyLXByb3ZpZGVkIHR5cGU6XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xudmFyIGN1cnJlbnQgPSBudWxsO1xudmFyIGlzUmVuZGVyaW5nID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgb3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIHR5cGVvZiBvd25lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldigpIHtcbiAge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSAvLyBTYWZlIGJlY2F1c2UgaWYgY3VycmVudCBmaWJlciBleGlzdHMsIHdlIGFyZSByZWNvbmNpbGluZyxcbiAgICAvLyBhbmQgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgd29yay1pbi1wcm9ncmVzcyB2ZXJzaW9uLlxuXG5cbiAgICByZXR1cm4gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKGN1cnJlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0Q3VycmVudEZpYmVyKCkge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuICAgIGN1cnJlbnQgPSBudWxsO1xuICAgIGlzUmVuZGVyaW5nID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRGaWJlcihmaWJlcikge1xuICB7XG4gICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBmaWJlciA9PT0gbnVsbCA/IG51bGwgOiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2O1xuICAgIGN1cnJlbnQgPSBmaWJlcjtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50RmliZXIoKSB7XG4gIHtcbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNSZW5kZXJpbmcocmVuZGVyaW5nKSB7XG4gIHtcbiAgICBpc1JlbmRlcmluZyA9IHJlbmRlcmluZztcbiAgfVxufVxuXG4vLyBGbG93IGRvZXMgbm90IGFsbG93IHN0cmluZyBjb25jYXRlbmF0aW9uIG9mIG1vc3Qgbm9uLXN0cmluZyB0eXBlcy4gVG8gd29ya1xuLy8gYXJvdW5kIHRoaXMgbGltaXRhdGlvbiwgd2UgdXNlIGFuIG9wYXF1ZSB0eXBlIHRoYXQgY2FuIG9ubHkgYmUgb2J0YWluZWQgYnlcbi8vIHBhc3NpbmcgdGhlIHZhbHVlIHRocm91Z2ggZ2V0VG9TdHJpbmdWYWx1ZSBmaXJzdC5cbmZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIFRoZSBjb2VyY2lvbiBzYWZldHkgY2hlY2sgaXMgcGVyZm9ybWVkIGluIGdldFRvU3RyaW5nVmFsdWUoKS5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3NhZmUtc3RyaW5nLWNvZXJjaW9uXG4gIHJldHVybiAnJyArIHZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkge1xuICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGZ1bmN0aW9uLCBzeW1ib2wgYXJlIGFzc2lnbmVkIGFzIGVtcHR5IHN0cmluZ3NcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG52YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHtcbiAgYnV0dG9uOiB0cnVlLFxuICBjaGVja2JveDogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGhpZGRlbjogdHJ1ZSxcbiAgcmFkaW86IHRydWUsXG4gIHJlc2V0OiB0cnVlLFxuICBzdWJtaXQ6IHRydWVcbn07XG5mdW5jdGlvbiBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKHRhZ05hbWUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoIShoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLm9uSW5wdXQgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMudmFsdWUgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cblxuICAgIGlmICghKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmNoZWNrZWQgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDaGVja2FibGUoZWxlbSkge1xuICB2YXIgdHlwZSA9IGVsZW0udHlwZTtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrZXIobm9kZSkge1xuICByZXR1cm4gbm9kZS5fdmFsdWVUcmFja2VyO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hUcmFja2VyKG5vZGUpIHtcbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZSA9ICcnO1xuXG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmIChpc0NoZWNrYWJsZShub2RlKSkge1xuICAgIHZhbHVlID0gbm9kZS5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRyYWNrVmFsdWVPbk5vZGUobm9kZSkge1xuICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJ2NoZWNrZWQnIDogJ3ZhbHVlJztcbiAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUuY29uc3RydWN0b3IucHJvdG90eXBlLCB2YWx1ZUZpZWxkKTtcblxuICB7XG4gICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKG5vZGVbdmFsdWVGaWVsZF0pO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRWYWx1ZSA9ICcnICsgbm9kZVt2YWx1ZUZpZWxkXTsgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgLy8gYnV0IGl0J3MgYmV0dGVyIHRoZW4gYSBoYXJkIGZhaWx1cmVcbiAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuXG4gIGlmIChub2RlLmhhc093blByb3BlcnR5KHZhbHVlRmllbGQpIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0LFxuICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHtcbiAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgIHNldC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICB9XG4gIH0pOyAvLyBXZSBjb3VsZCd2ZSBwYXNzZWQgdGhpcyB0aGUgZmlyc3QgdGltZVxuICAvLyBidXQgaXQgdHJpZ2dlcnMgYSBidWcgaW4gSUUxMSBhbmQgRWRnZSAxNC8xNS5cbiAgLy8gQ2FsbGluZyBkZWZpbmVQcm9wZXJ0eSgpIGFnYWluIHNob3VsZCBiZSBlcXVpdmFsZW50LlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExNzY4XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5vZGUsIHZhbHVlRmllbGQsIHtcbiAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGVcbiAgfSk7XG4gIHZhciB0cmFja2VyID0ge1xuICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIH0sXG4gICAgc2V0VmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAge1xuICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50VmFsdWUgPSAnJyArIHZhbHVlO1xuICAgIH0sXG4gICAgc3RvcFRyYWNraW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBkZXRhY2hUcmFja2VyKG5vZGUpO1xuICAgICAgZGVsZXRlIG5vZGVbdmFsdWVGaWVsZF07XG4gICAgfVxuICB9O1xuICByZXR1cm4gdHJhY2tlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2sobm9kZSkge1xuICBpZiAoZ2V0VHJhY2tlcihub2RlKSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBUT0RPOiBPbmNlIGl0J3MganVzdCBGaWJlciB3ZSBjYW4gbW92ZSB0aGlzIHRvIG5vZGUuX3dyYXBwZXJTdGF0ZVxuXG5cbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gdHJhY2tWYWx1ZU9uTm9kZShub2RlKTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRyYWNrZXIgPSBnZXRUcmFja2VyKG5vZGUpOyAvLyBpZiB0aGVyZSBpcyBubyB0cmFja2VyIGF0IHRoaXMgcG9pbnQgaXQncyB1bmxpa2VseVxuICAvLyB0aGF0IHRyeWluZyBhZ2FpbiB3aWxsIHN1Y2NlZWRcblxuICBpZiAoIXRyYWNrZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBsYXN0VmFsdWUgPSB0cmFja2VyLmdldFZhbHVlKCk7XG4gIHZhciBuZXh0VmFsdWUgPSBnZXRWYWx1ZUZyb21Ob2RlKG5vZGUpO1xuXG4gIGlmIChuZXh0VmFsdWUgIT09IGxhc3RWYWx1ZSkge1xuICAgIHRyYWNrZXIuc2V0VmFsdWUobmV4dFZhbHVlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudChkb2MpIHtcbiAgZG9jID0gZG9jIHx8ICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiB1bmRlZmluZWQpO1xuXG4gIGlmICh0eXBlb2YgZG9jID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jLmFjdGl2ZUVsZW1lbnQgfHwgZG9jLmJvZHk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZG9jLmJvZHk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gZmFsc2U7XG52YXIgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBpc0NvbnRyb2xsZWQocHJvcHMpIHtcbiAgdmFyIHVzZXNDaGVja2VkID0gcHJvcHMudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wcy50eXBlID09PSAncmFkaW8nO1xuICByZXR1cm4gdXNlc0NoZWNrZWQgPyBwcm9wcy5jaGVja2VkICE9IG51bGwgOiBwcm9wcy52YWx1ZSAhPSBudWxsO1xufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxpbnB1dD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyB0aGVzZSBvcHRpb25hbFxuICogcHJvcHM6IGBjaGVja2VkYCwgYHZhbHVlYCwgYGRlZmF1bHRDaGVja2VkYCwgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICpcbiAqIElmIGBjaGVja2VkYCBvciBgdmFsdWVgIGFyZSBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zXG4gKiB0aGF0IGFmZmVjdCB0aGUgY2hlY2tlZCBzdGF0ZSBvciB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiB0aGV5IGFyZSBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgbm90XG4gKiB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBwcm9wcyBtdXN0IGNoYW5nZSBpbiBvcmRlciBmb3JcbiAqIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCBhcyB1bmNoZWNrZWQgKG9yIGBkZWZhdWx0Q2hlY2tlZGApXG4gKiB3aXRoIGFuIGVtcHR5IHZhbHVlIChvciBgZGVmYXVsdFZhbHVlYCkuXG4gKlxuICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTIvV0QtaHRtbDUtMjAxMjEwMjUvdGhlLWlucHV0LWVsZW1lbnQuaHRtbFxuICovXG5cblxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuICB2YXIgaG9zdFByb3BzID0gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIGRlZmF1bHRDaGVja2VkOiB1bmRlZmluZWQsXG4gICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGVja2VkOiBjaGVja2VkICE9IG51bGwgPyBjaGVja2VkIDogbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkXG4gIH0pO1xuICByZXR1cm4gaG9zdFByb3BzO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZShlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygnaW5wdXQnLCBwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMuY2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQpIHtcbiAgICAgIGVycm9yKCclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCBjaGVja2VkIGFuZCBkZWZhdWx0Q2hlY2tlZCBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgY2hlY2tlZCBwcm9wLCBvciB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdJbnB1dCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycsIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSk7XG5cbiAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgPyAnJyA6IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIGluaXRpYWxDaGVja2VkOiBwcm9wcy5jaGVja2VkICE9IG51bGwgPyBwcm9wcy5jaGVja2VkIDogcHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgaW5pdGlhbFZhbHVlOiBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlICE9IG51bGwgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZSksXG4gICAgY29udHJvbGxlZDogaXNDb250cm9sbGVkKHByb3BzKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlQ2hlY2tlZChlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciBjaGVja2VkID0gcHJvcHMuY2hlY2tlZDtcblxuICBpZiAoY2hlY2tlZCAhPSBudWxsKSB7XG4gICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCAnY2hlY2tlZCcsIGNoZWNrZWQsIGZhbHNlKTtcbiAgfVxufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIHZhciBjb250cm9sbGVkID0gaXNDb250cm9sbGVkKHByb3BzKTtcblxuICAgIGlmICghbm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgY29udHJvbGxlZCAmJiAhZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGFuIHVuY29udHJvbGxlZCBpbnB1dCB0byBiZSBjb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSB1bmRlZmluZWQgdG8gJyArICdhIGRlZmluZWQgdmFsdWUsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLl93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiAhY29udHJvbGxlZCAmJiAhZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCkge1xuICAgICAgZXJyb3IoJ0EgY29tcG9uZW50IGlzIGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCB0byBiZSB1bmNvbnRyb2xsZWQuICcgKyAnVGhpcyBpcyBsaWtlbHkgY2F1c2VkIGJ5IHRoZSB2YWx1ZSBjaGFuZ2luZyBmcm9tIGEgZGVmaW5lZCB0byAnICsgJ3VuZGVmaW5lZCwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ2hlY2tlZChlbGVtZW50LCBwcm9wcyk7XG4gIHZhciB2YWx1ZSA9IGdldFRvU3RyaW5nVmFsdWUocHJvcHMudmFsdWUpO1xuICB2YXIgdHlwZSA9IHByb3BzLnR5cGU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiBub2RlLnZhbHVlID09PSAnJyB8fCAvLyBXZSBleHBsaWNpdGx5IHdhbnQgdG8gY29lcmNlIHRvIG51bWJlciBoZXJlIGlmIHBvc3NpYmxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICBub2RlLnZhbHVlICE9IHZhbHVlKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnZhbHVlICE9PSB0b1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIG5vZGUudmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpIHtcbiAgICAvLyBTdWJtaXQvcmVzZXQgaW5wdXRzIG5lZWQgdGhlIGF0dHJpYnV0ZSByZW1vdmVkIGNvbXBsZXRlbHkgdG8gYXZvaWRcbiAgICAvLyBibGFuay10ZXh0IGJ1dHRvbnMuXG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgY29tZXMgZnJvbSBhIGNhc2NhZGUgb2ZcbiAgICAvLyBwcm9wZXJ0aWVzOlxuICAgIC8vICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eVxuICAgIC8vICAzLiBPdGhlcndpc2UgdGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZVxuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgICAgc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHByb3BzLnR5cGUsIGdldFRvU3RyaW5nVmFsdWUocHJvcHMuZGVmYXVsdFZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIC8vIFdoZW4gc3luY2luZyB0aGUgY2hlY2tlZCBhdHRyaWJ1dGUsIGl0IG9ubHkgY2hhbmdlcyB3aGVuIGl0IG5lZWRzXG4gICAgLy8gdG8gYmUgcmVtb3ZlZCwgc3VjaCBhcyB0cmFuc2l0aW9uaW5nIGZyb20gYSBjaGVja2JveCBpbnRvIGEgdGV4dCBpbnB1dFxuICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyKGVsZW1lbnQsIHByb3BzLCBpc0h5ZHJhdGluZykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7IC8vIERvIG5vdCBhc3NpZ24gdmFsdWUgaWYgaXQgaXMgYWxyZWFkeSBzZXQuIFRoaXMgcHJldmVudHMgdXNlciB0ZXh0IGlucHV0XG4gIC8vIGZyb20gYmVpbmcgbG9zdCBkdXJpbmcgU1NSIGh5ZHJhdGlvbi5cblxuICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykgfHwgcHJvcHMuaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRWYWx1ZScpKSB7XG4gICAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuICAgIHZhciBpc0J1dHRvbiA9IHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCc7IC8vIEF2b2lkIHNldHRpbmcgdmFsdWUgYXR0cmlidXRlIG9uIHN1Ym1pdC9yZXNldCBpbnB1dHMgYXMgaXQgb3ZlcnJpZGVzIHRoZVxuICAgIC8vIGRlZmF1bHQgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIuIFNlZTogIzEyODcyXG5cbiAgICBpZiAoaXNCdXR0b24gJiYgKHByb3BzLnZhbHVlID09PSB1bmRlZmluZWQgfHwgcHJvcHMudmFsdWUgPT09IG51bGwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGluaXRpYWxWYWx1ZSA9IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpOyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAgIC8vIGZyb20gYmVpbmcgbG9zdCBkdXJpbmcgU1NSIGh5ZHJhdGlvbi5cblxuICAgIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAgIHtcbiAgICAgICAgLy8gV2hlbiBzeW5jaW5nIHRoZSB2YWx1ZSBhdHRyaWJ1dGUsIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzaG91bGQgdXNlXG4gICAgICAgIC8vIHRoZSB3cmFwcGVyU3RhdGUuX2luaXRpYWxWYWx1ZSBwcm9wZXJ0eS4gVGhpcyB1c2VzOlxuICAgICAgICAvL1xuICAgICAgICAvLyAgIDEuIFRoZSB2YWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAyLiBUaGUgZGVmYXVsdFZhbHVlIFJlYWN0IHByb3BlcnR5IHdoZW4gcHJlc2VudFxuICAgICAgICAvLyAgIDMuIEFuIGVtcHR5IHN0cmluZ1xuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSBub2RlLnZhbHVlKSB7XG4gICAgICAgICAgbm9kZS52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyBzeW5jaHJvbml6ZWQgdG8gdGhlIHByb3BlcnR5LFxuICAgICAgLy8gc28gd2UgYXNzaWduIGRlZmF1bHRWYWx1ZSB0byB0aGUgc2FtZSB0aGluZyBhcyB0aGUgdmFsdWUgcHJvcGVydHlcbiAgICAgIC8vIGFzc2lnbm1lbnQgc3RlcCBhYm92ZS5cbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIH1cbiAgfSAvLyBOb3JtYWxseSwgd2UnZCBqdXN0IGRvIGBub2RlLmNoZWNrZWQgPSBub2RlLmNoZWNrZWRgIHVwb24gaW5pdGlhbCBtb3VudCwgbGVzcyB0aGlzIGJ1Z1xuICAvLyB0aGlzIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhIGNocm9tZSBidWcgd2hlcmUgc2V0dGluZyBkZWZhdWx0Q2hlY2tlZFxuICAvLyB3aWxsIHNvbWV0aW1lcyBpbmZsdWVuY2UgdGhlIHZhbHVlIG9mIGNoZWNrZWQgKGV2ZW4gYWZ0ZXIgZGV0YWNobWVudCkuXG4gIC8vIFJlZmVyZW5jZTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NjA4NDE2XG4gIC8vIFdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgdW5zZXQgbmFtZSB0byBhdm9pZCBkaXNydXB0aW5nIHJhZGlvIGJ1dHRvbiBncm91cHMuXG5cblxuICB2YXIgbmFtZSA9IG5vZGUubmFtZTtcblxuICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICBub2RlLm5hbWUgPSAnJztcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBib3RoIHRoZSBjaGVja2VkIHByb3BlcnR5IGFuZFxuICAgIC8vIGF0dHJpYnV0ZSBhcmUgYXNzaWduZWQgYXQgdGhlIHNhbWUgdGltZSB1c2luZyBkZWZhdWx0Q2hlY2tlZC4gVGhpcyB1c2VzOlxuICAgIC8vXG4gICAgLy8gICAxLiBUaGUgY2hlY2tlZCBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAvLyAgIDIuIFRoZSBkZWZhdWx0Q2hlY2tlZCBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAvLyAgIDMuIE90aGVyd2lzZSwgZmFsc2VcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gIW5vZGUuZGVmYXVsdENoZWNrZWQ7XG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhbm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkO1xuICB9XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gbmFtZTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZShlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHVwZGF0ZVdyYXBwZXIobm9kZSwgcHJvcHMpO1xuICB1cGRhdGVOYW1lZENvdXNpbnMobm9kZSwgcHJvcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVOYW1lZENvdXNpbnMocm9vdE5vZGUsIHByb3BzKSB7XG4gIHZhciBuYW1lID0gcHJvcHMubmFtZTtcblxuICBpZiAocHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuYW1lICE9IG51bGwpIHtcbiAgICB2YXIgcXVlcnlSb290ID0gcm9vdE5vZGU7XG5cbiAgICB3aGlsZSAocXVlcnlSb290LnBhcmVudE5vZGUpIHtcbiAgICAgIHF1ZXJ5Um9vdCA9IHF1ZXJ5Um9vdC5wYXJlbnROb2RlO1xuICAgIH0gLy8gSWYgYHJvb3ROb2RlLmZvcm1gIHdhcyBub24tbnVsbCwgdGhlbiB3ZSBjb3VsZCB0cnkgYGZvcm0uZWxlbWVudHNgLFxuICAgIC8vIGJ1dCB0aGF0IHNvbWV0aW1lcyBiZWhhdmVzIHN0cmFuZ2VseSBpbiBJRTguIFdlIGNvdWxkIGFsc28gdHJ5IHVzaW5nXG4gICAgLy8gYGZvcm0uZ2V0RWxlbWVudHNCeU5hbWVgLCBidXQgdGhhdCB3aWxsIG9ubHkgcmV0dXJuIGRpcmVjdCBjaGlsZHJlblxuICAgIC8vIGFuZCB3b24ndCBpbmNsdWRlIGlucHV0cyB0aGF0IHVzZSB0aGUgSFRNTDUgYGZvcm09YCBhdHRyaWJ1dGUuIFNpbmNlXG4gICAgLy8gdGhlIGlucHV0IG1pZ2h0IG5vdCBldmVuIGJlIGluIGEgZm9ybS4gSXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gdGhlXG4gICAgLy8gZG9jdW1lbnQuIExldCdzIGp1c3QgdXNlIHRoZSBsb2NhbCBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0XG4gICAgLy8gbWlzcyBhbnl0aGluZy5cblxuXG4gICAge1xuICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihuYW1lLCAnbmFtZScpO1xuICAgIH1cblxuICAgIHZhciBncm91cCA9IHF1ZXJ5Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPScgKyBKU09OLnN0cmluZ2lmeSgnJyArIG5hbWUpICsgJ11bdHlwZT1cInJhZGlvXCJdJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07XG5cbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cblxuXG4gICAgICB2YXIgb3RoZXJQcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUob3RoZXJOb2RlKTtcblxuICAgICAgaWYgKCFvdGhlclByb3BzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVhY3RET01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVhY3QgcmFkaW8gaW5wdXRzIHdpdGggdGhlICcgKyAnc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH0gLy8gV2UgbmVlZCB1cGRhdGUgdGhlIHRyYWNrZWQgdmFsdWUgb24gdGhlIG5hbWVkIGNvdXNpbiBzaW5jZSB0aGUgdmFsdWVcbiAgICAgIC8vIHdhcyBjaGFuZ2VkIGJ1dCB0aGUgaW5wdXQgc2F3IG5vIGV2ZW50IG9yIHZhbHVlIHNldFxuXG5cbiAgICAgIHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKG90aGVyTm9kZSk7IC8vIElmIHRoaXMgaXMgYSBjb250cm9sbGVkIHJhZGlvIGJ1dHRvbiBncm91cCwgZm9yY2luZyB0aGUgaW5wdXQgdGhhdFxuICAgICAgLy8gd2FzIHByZXZpb3VzbHkgY2hlY2tlZCB0byB1cGRhdGUgd2lsbCBjYXVzZSBpdCB0byBiZSBjb21lIHJlLWNoZWNrZWRcbiAgICAgIC8vIGFzIGFwcHJvcHJpYXRlLlxuXG4gICAgICB1cGRhdGVXcmFwcGVyKG90aGVyTm9kZSwgb3RoZXJQcm9wcyk7XG4gICAgfVxuICB9XG59IC8vIEluIENocm9tZSwgYXNzaWduaW5nIGRlZmF1bHRWYWx1ZSB0byBjZXJ0YWluIGlucHV0IHR5cGVzIHRyaWdnZXJzIGlucHV0IHZhbGlkYXRpb24uXG4vLyBGb3IgbnVtYmVyIGlucHV0cywgdGhlIGRpc3BsYXkgdmFsdWUgbG9zZXMgdHJhaWxpbmcgZGVjaW1hbCBwb2ludHMuIEZvciBlbWFpbCBpbnB1dHMsXG4vLyBDaHJvbWUgcmFpc2VzIFwiVGhlIHNwZWNpZmllZCB2YWx1ZSA8eD4gaXMgbm90IGEgdmFsaWQgZW1haWwgYWRkcmVzc1wiLlxuLy9cbi8vIEhlcmUgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZWZhdWx0VmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQsIGF2b2lkaW5nIHRoZXNlIHByb2JsZW1zXG4vLyB3aGVuIHRoZSB1c2VyIGlzIGlucHV0dGluZyB0ZXh0XG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjUzXG5cblxuZnVuY3Rpb24gc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHR5cGUsIHZhbHVlKSB7XG4gIGlmICggLy8gRm9jdXNlZCBudW1iZXIgaW5wdXRzIHN5bmNocm9uaXplIG9uIGJsdXIuIFNlZSBDaGFuZ2VFdmVudFBsdWdpbi5qc1xuICB0eXBlICE9PSAnbnVtYmVyJyB8fCBnZXRBY3RpdmVFbGVtZW50KG5vZGUub3duZXJEb2N1bWVudCkgIT09IG5vZGUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuZGVmYXVsdFZhbHVlICE9PSB0b1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSBmYWxzZTtcbnZhciBkaWRXYXJuSW52YWxpZENoaWxkID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSBmYWxzZTtcbi8qKlxuICogSW1wbGVtZW50cyBhbiA8b3B0aW9uPiBob3N0IGNvbXBvbmVudCB0aGF0IHdhcm5zIHdoZW4gYHNlbGVjdGVkYCBpcyBzZXQuXG4gKi9cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgLy8gSWYgYSB2YWx1ZSBpcyBub3QgcHJvdmlkZWQsIHRoZW4gdGhlIGNoaWxkcmVuIG11c3QgYmUgc2ltcGxlLlxuICAgIGlmIChwcm9wcy52YWx1ZSA9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnb2JqZWN0JyAmJiBwcm9wcy5jaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKHByb3BzLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWRpZFdhcm5JbnZhbGlkQ2hpbGQpIHtcbiAgICAgICAgICAgIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignQ2Fubm90IGluZmVyIHRoZSBvcHRpb24gdmFsdWUgb2YgY29tcGxleCBjaGlsZHJlbi4gJyArICdQYXNzIGEgYHZhbHVlYCBwcm9wIG9yIHVzZSBhIHBsYWluIHN0cmluZyBhcyBjaGlsZHJlbiB0byA8b3B0aW9uPi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgICAgIGlmICghZGlkV2FybkludmFsaWRJbm5lckhUTUwpIHtcbiAgICAgICAgICBkaWRXYXJuSW52YWxpZElubmVySFRNTCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUGFzcyBhIGB2YWx1ZWAgcHJvcCBpZiB5b3Ugc2V0IGRhbmdlcm91c2x5SW5uZXJIVE1MIHNvIFJlYWN0IGtub3dzICcgKyAnd2hpY2ggdmFsdWUgc2hvdWxkIGJlIHNlbGVjdGVkLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSAvLyBUT0RPOiBSZW1vdmUgc3VwcG9ydCBmb3IgYHNlbGVjdGVkYCBpbiA8b3B0aW9uPi5cblxuXG4gICAgaWYgKHByb3BzLnNlbGVjdGVkICE9IG51bGwgJiYgIWRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uKSB7XG4gICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIG9uIDxzZWxlY3Q+IGluc3RlYWQgb2YgJyArICdzZXR0aW5nIGBzZWxlY3RlZGAgb24gPG9wdGlvbj4uJyk7XG5cbiAgICAgIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHBvc3RNb3VudFdyYXBwZXIkMShlbGVtZW50LCBwcm9wcykge1xuICAvLyB2YWx1ZT1cIlwiIHNob3VsZCBtYWtlIGEgdmFsdWUgYXR0cmlidXRlICgjNjIxOSlcbiAgaWYgKHByb3BzLnZhbHVlICE9IG51bGwpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB0b1N0cmluZyhnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKSkpO1xuICB9XG59XG5cbnZhciBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuZnVuY3Rpb24gaXNBcnJheShhKSB7XG4gIHJldHVybiBpc0FycmF5SW1wbChhKTtcbn1cblxudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxO1xuXG57XG4gIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7XG5cbiAgaWYgKG93bmVyTmFtZSkge1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgdmFsdWVQcm9wTmFtZXMgPSBbJ3ZhbHVlJywgJ2RlZmF1bHRWYWx1ZSddO1xuLyoqXG4gKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIGZvciBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqL1xuXG5mdW5jdGlvbiBjaGVja1NlbGVjdFByb3BUeXBlcyhwcm9wcykge1xuICB7XG4gICAgY2hlY2tDb250cm9sbGVkVmFsdWVQcm9wcygnc2VsZWN0JywgcHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZVByb3BOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbaV07XG5cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHByb3BOYW1lSXNBcnJheSA9IGlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFwcm9wTmFtZUlzQXJyYXkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhbiBhcnJheSBpZiAnICsgJ2BtdWx0aXBsZWAgaXMgdHJ1ZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9IGVsc2UgaWYgKCFwcm9wcy5tdWx0aXBsZSAmJiBwcm9wTmFtZUlzQXJyYXkpIHtcbiAgICAgICAgZXJyb3IoJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciAnICsgJ3ZhbHVlIGlmIGBtdWx0aXBsZWAgaXMgZmFsc2UuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVPcHRpb25zKG5vZGUsIG11bHRpcGxlLCBwcm9wVmFsdWUsIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICB2YXIgb3B0aW9ucyA9IG5vZGUub3B0aW9ucztcblxuICBpZiAobXVsdGlwbGUpIHtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZXMgPSBwcm9wVmFsdWU7XG4gICAgdmFyIHNlbGVjdGVkVmFsdWUgPSB7fTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIFByZWZpeCB0byBhdm9pZCBjaGFvcyB3aXRoIHNwZWNpYWwga2V5cy5cbiAgICAgIHNlbGVjdGVkVmFsdWVbJyQnICsgc2VsZWN0ZWRWYWx1ZXNbaV1dID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgb3B0aW9ucy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBzZWxlY3RlZCA9IHNlbGVjdGVkVmFsdWUuaGFzT3duUHJvcGVydHkoJyQnICsgb3B0aW9uc1tfaV0udmFsdWUpO1xuXG4gICAgICBpZiAob3B0aW9uc1tfaV0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbX2ldLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RlZCAmJiBzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRG8gbm90IHNldCBgc2VsZWN0LnZhbHVlYCBhcyBleGFjdCBiZWhhdmlvciBpc24ndCBjb25zaXN0ZW50IGFjcm9zcyBhbGxcbiAgICAvLyBicm93c2VycyBmb3IgYWxsIGNhc2VzLlxuICAgIHZhciBfc2VsZWN0ZWRWYWx1ZSA9IHRvU3RyaW5nKGdldFRvU3RyaW5nVmFsdWUocHJvcFZhbHVlKSk7XG5cbiAgICB2YXIgZGVmYXVsdFNlbGVjdGVkID0gbnVsbDtcblxuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG9wdGlvbnMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgaWYgKG9wdGlvbnNbX2kyXS52YWx1ZSA9PT0gX3NlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgb3B0aW9uc1tfaTJdLnNlbGVjdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gICAgICAgICAgb3B0aW9uc1tfaTJdLmRlZmF1bHRTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWZhdWx0U2VsZWN0ZWQgPT09IG51bGwgJiYgIW9wdGlvbnNbX2kyXS5kaXNhYmxlZCkge1xuICAgICAgICBkZWZhdWx0U2VsZWN0ZWQgPSBvcHRpb25zW19pMl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRTZWxlY3RlZCAhPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdFNlbGVjdGVkLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogSW1wbGVtZW50cyBhIDxzZWxlY3Q+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIG9wdGlvbmFsbHkgc2V0dGluZyB0aGVcbiAqIHByb3BzIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLiBJZiBgbXVsdGlwbGVgIGlzIGZhbHNlLCB0aGUgcHJvcCBtdXN0IGJlIGFcbiAqIHN0cmluZ2FibGUuIElmIGBtdWx0aXBsZWAgaXMgdHJ1ZSwgdGhlIHByb3AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdhYmxlcy5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBjaGFuZ2UgdGhlXG4gKiBzZWxlY3RlZCBvcHRpb24gd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIHJlbmRlcmVkIG9wdGlvbnMuXG4gKlxuICogSWYgaXQgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgb3B0aW9ucyB3aWxsIG5vdFxuICogdXBkYXRlIGluIHJlc3BvbnNlIHRvIHVzZXIgYWN0aW9ucy4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBvcHRpb25zIHRvIHVwZGF0ZS5cbiAqXG4gKiBJZiBgZGVmYXVsdFZhbHVlYCBpcyBwcm92aWRlZCwgYW55IG9wdGlvbnMgd2l0aCB0aGUgc3VwcGxpZWQgdmFsdWVzIHdpbGwgYmVcbiAqIHNlbGVjdGVkLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgcmV0dXJuIGFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIHdhc011bHRpcGxlOiAhIXByb3BzLm11bHRpcGxlXG4gIH07XG5cbiAge1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSkge1xuICAgICAgZXJyb3IoJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgbm9kZS5tdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0VXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB3YXNNdWx0aXBsZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAod2FzTXVsdGlwbGUgIT09ICEhcHJvcHMubXVsdGlwbGUpIHtcbiAgICAvLyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlzIHRvZ2dsZWQuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldmVydCB0aGUgc2VsZWN0IGJhY2sgdG8gaXRzIGRlZmF1bHQgdW5zZWxlY3RlZCBzdGF0ZS5cbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMubXVsdGlwbGUgPyBbXSA6ICcnLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbERlZmF1bHRWYWwgPSBmYWxzZTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHRleHRhcmVhPiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIGB2YWx1ZWAsIGFuZFxuICogYGRlZmF1bHRWYWx1ZWAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB0cmFkaXRpb25hbCBET00gQVBJIGJlY2F1c2UgdmFsdWUgaXNcbiAqIHVzdWFsbHkgc2V0IGFzIFBDREFUQSBjaGlsZHJlbi5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlXG4gKiB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbFxuICogbm90IHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IHZhbHVlLCB0aGUgcHJvcFxuICogYGRlZmF1bHRWYWx1ZWAgaWYgc3BlY2lmaWVkLCBvciB0aGUgY2hpbGRyZW4gY29udGVudCAoZGVwcmVjYXRlZCkuXG4gKi9cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBkb2VzIG5vdCBtYWtlIHNlbnNlIG9uIDx0ZXh0YXJlYT4uJyk7XG4gIH0gLy8gQWx3YXlzIHNldCBjaGlsZHJlbiB0byB0aGUgc2FtZSB0aGluZy4gSW4gSUU5LCB0aGUgc2VsZWN0aW9uIHJhbmdlIHdpbGxcbiAgLy8gZ2V0IHJlc2V0IGlmIGB0ZXh0Q29udGVudGAgaXMgbXV0YXRlZC4gIFdlIGNvdWxkIGFkZCBhIGNoZWNrIGluIHNldFRleHRDb250ZW50XG4gIC8vIHRvIG9ubHkgc2V0IHRoZSB2YWx1ZSBpZi93aGVuIHRoZSB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIG5vZGUgdmFsdWUgKHdoaWNoIHdvdWxkXG4gIC8vIGNvbXBsZXRlbHkgc29sdmUgdGhpcyBJRTkgYnVnKSwgYnV0IFNlYmFzdGlhbitTb3BoaWUgc2VlbWVkIHRvIGxpa2UgdGhpc1xuICAvLyBzb2x1dGlvbi4gVGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4gb3Igb2JqZWN0IHNvIHRoYXQncyB3aHkgaXQncyBmb3JjZWRcbiAgLy8gdG8gYmUgYSBzdHJpbmcuXG5cblxuICB2YXIgaG9zdFByb3BzID0gYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgY2hpbGRyZW46IHRvU3RyaW5nKG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpXG4gIH0pO1xuXG4gIHJldHVybiBob3N0UHJvcHM7XG59XG5mdW5jdGlvbiBpbml0V3JhcHBlclN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCd0ZXh0YXJlYScsIHByb3BzKTtcblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsRGVmYXVsdFZhbCkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGEgdGV4dGFyZWEgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnVGV4dGFyZWEgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHRleHRhcmVhICcgKyAnYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnKTtcblxuICAgICAgZGlkV2FyblZhbERlZmF1bHRWYWwgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpbml0aWFsVmFsdWUgPSBwcm9wcy52YWx1ZTsgLy8gT25seSBib3RoZXIgZmV0Y2hpbmcgZGVmYXVsdCB2YWx1ZSBpZiB3ZSdyZSBnb2luZyB0byB1c2UgaXRcblxuICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuXG4gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignPHRleHRhcmVhPiBjYW4gb25seSBoYXZlIGF0IG1vc3Qgb25lIGNoaWxkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUoaW5pdGlhbFZhbHVlKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSk7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICB2YXIgbmV3VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7IC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG5cbiAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgJiYgbm9kZS5kZWZhdWx0VmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdFxuICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cblxuICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50OyAvLyBPbmx5IHNldCBub2RlLnZhbHVlIGlmIHRleHRDb250ZW50IGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZFxuICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZVxuICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMTUyNS9cblxuICBpZiAodGV4dENvbnRlbnQgPT09IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICBpZiAodGV4dENvbnRlbnQgIT09ICcnICYmIHRleHRDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKTtcbn1cblxudmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xudmFyIE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xudmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOyAvLyBBc3N1bWVzIHRoZXJlIGlzIG5vIHBhcmVudCBuYW1lc3BhY2UuXG5cbmZ1bmN0aW9uIGdldEludHJpbnNpY05hbWVzcGFjZSh0eXBlKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3N2Zyc6XG4gICAgICByZXR1cm4gU1ZHX05BTUVTUEFDRTtcblxuICAgIGNhc2UgJ21hdGgnOlxuICAgICAgcmV0dXJuIE1BVEhfTkFNRVNQQUNFO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0Q2hpbGROYW1lc3BhY2UocGFyZW50TmFtZXNwYWNlLCB0eXBlKSB7XG4gIGlmIChwYXJlbnROYW1lc3BhY2UgPT0gbnVsbCB8fCBwYXJlbnROYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgLy8gTm8gKG9yIGRlZmF1bHQpIHBhcmVudCBuYW1lc3BhY2U6IHBvdGVudGlhbCBlbnRyeSBwb2ludC5cbiAgICByZXR1cm4gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PT0gU1ZHX05BTUVTUEFDRSAmJiB0eXBlID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyBXZSdyZSBsZWF2aW5nIFNWRy5cbiAgICByZXR1cm4gSFRNTF9OQU1FU1BBQ0U7XG4gIH0gLy8gQnkgZGVmYXVsdCwgcGFzcyBuYW1lc3BhY2UgYmVsb3cuXG5cblxuICByZXR1cm4gcGFyZW50TmFtZXNwYWNlO1xufVxuXG4vKiBnbG9iYWxzIE1TQXBwICovXG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gd2hpY2ggaGFzICd1bnNhZmUnIHByaXZpbGVnZXMgKHJlcXVpcmVkIGJ5IHdpbmRvd3M4IGFwcHMpXG4gKi9cbnZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBNU0FwcCAhPT0gJ3VuZGVmaW5lZCcgJiYgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jO1xuICB9XG59O1xuXG52YXIgcmV1c2FibGVTVkdDb250YWluZXI7XG4vKipcbiAqIFNldCB0aGUgaW5uZXJIVE1MIHByb3BlcnR5IG9mIGEgbm9kZVxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcbiAqIEBpbnRlcm5hbFxuICovXG5cbnZhciBzZXRJbm5lckhUTUwgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBodG1sKSB7XG4gIGlmIChub2RlLm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuXG4gICAgaWYgKCEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAgICAgLy8gbmV3IG1hcmt1cCBpbiBhIHRlbXAgbm9kZSBhbmQgdGhlbiBtb3ZlIHRoZSBjaGlsZCBub2RlcyBhY3Jvc3MgaW50b1xuICAgICAgLy8gdGhlIHRhcmdldCBub2RlXG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwudmFsdWVPZigpLnRvU3RyaW5nKCkgKyAnPC9zdmc+JztcbiAgICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xufSk7XG5cbi8qKlxuICogSFRNTCBub2RlVHlwZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqL1xudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xudmFyIERPQ1VNRU5UX05PREUgPSA5O1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXJcbiAqIHRvIHNldCB0aGUgYG5vZGVWYWx1ZWAgb2YgdGhlIFRleHQgbm9kZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBgLnRleHRDb250ZW50YCB3aGljaCB3aWxsIHJlbW92ZSB0aGUgZXhpc3Rpbmcgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkge1xuICBpZiAodGV4dCkge1xuICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59O1xuXG4vLyBMaXN0IGRlcml2ZWQgZnJvbSBHZWNrbyBzb3VyY2UgY29kZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iLzRlNjM4ZWZjNzEvbGF5b3V0L3N0eWxlL3Rlc3QvcHJvcGVydHlfZGF0YWJhc2UuanNcbnZhciBzaG9ydGhhbmRUb0xvbmdoYW5kID0ge1xuICBhbmltYXRpb246IFsnYW5pbWF0aW9uRGVsYXknLCAnYW5pbWF0aW9uRGlyZWN0aW9uJywgJ2FuaW1hdGlvbkR1cmF0aW9uJywgJ2FuaW1hdGlvbkZpbGxNb2RlJywgJ2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50JywgJ2FuaW1hdGlvbk5hbWUnLCAnYW5pbWF0aW9uUGxheVN0YXRlJywgJ2FuaW1hdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIGJhY2tncm91bmQ6IFsnYmFja2dyb3VuZEF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZENsaXAnLCAnYmFja2dyb3VuZENvbG9yJywgJ2JhY2tncm91bmRJbWFnZScsICdiYWNrZ3JvdW5kT3JpZ2luJywgJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWScsICdiYWNrZ3JvdW5kUmVwZWF0JywgJ2JhY2tncm91bmRTaXplJ10sXG4gIGJhY2tncm91bmRQb3NpdGlvbjogWydiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknXSxcbiAgYm9yZGVyOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCcsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJCbG9ja0VuZDogWydib3JkZXJCbG9ja0VuZENvbG9yJywgJ2JvcmRlckJsb2NrRW5kU3R5bGUnLCAnYm9yZGVyQmxvY2tFbmRXaWR0aCddLFxuICBib3JkZXJCbG9ja1N0YXJ0OiBbJ2JvcmRlckJsb2NrU3RhcnRDb2xvcicsICdib3JkZXJCbG9ja1N0YXJ0U3R5bGUnLCAnYm9yZGVyQmxvY2tTdGFydFdpZHRoJ10sXG4gIGJvcmRlckJvdHRvbTogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCddLFxuICBib3JkZXJDb2xvcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJUb3BDb2xvciddLFxuICBib3JkZXJJbWFnZTogWydib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lRW5kOiBbJ2JvcmRlcklubGluZUVuZENvbG9yJywgJ2JvcmRlcklubGluZUVuZFN0eWxlJywgJ2JvcmRlcklubGluZUVuZFdpZHRoJ10sXG4gIGJvcmRlcklubGluZVN0YXJ0OiBbJ2JvcmRlcklubGluZVN0YXJ0Q29sb3InLCAnYm9yZGVySW5saW5lU3RhcnRTdHlsZScsICdib3JkZXJJbmxpbmVTdGFydFdpZHRoJ10sXG4gIGJvcmRlckxlZnQ6IFsnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnXSxcbiAgYm9yZGVyUmFkaXVzOiBbJ2JvcmRlckJvdHRvbUxlZnRSYWRpdXMnLCAnYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMnLCAnYm9yZGVyVG9wTGVmdFJhZGl1cycsICdib3JkZXJUb3BSaWdodFJhZGl1cyddLFxuICBib3JkZXJSaWdodDogWydib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCddLFxuICBib3JkZXJTdHlsZTogWydib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJUb3BTdHlsZSddLFxuICBib3JkZXJUb3A6IFsnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgY29sdW1uUnVsZTogWydjb2x1bW5SdWxlQ29sb3InLCAnY29sdW1uUnVsZVN0eWxlJywgJ2NvbHVtblJ1bGVXaWR0aCddLFxuICBjb2x1bW5zOiBbJ2NvbHVtbkNvdW50JywgJ2NvbHVtbldpZHRoJ10sXG4gIGZsZXg6IFsnZmxleEJhc2lzJywgJ2ZsZXhHcm93JywgJ2ZsZXhTaHJpbmsnXSxcbiAgZmxleEZsb3c6IFsnZmxleERpcmVjdGlvbicsICdmbGV4V3JhcCddLFxuICBmb250OiBbJ2ZvbnRGYW1pbHknLCAnZm9udEZlYXR1cmVTZXR0aW5ncycsICdmb250S2VybmluZycsICdmb250TGFuZ3VhZ2VPdmVycmlkZScsICdmb250U2l6ZScsICdmb250U2l6ZUFkanVzdCcsICdmb250U3RyZXRjaCcsICdmb250U3R5bGUnLCAnZm9udFZhcmlhbnQnLCAnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbicsICdmb250V2VpZ2h0JywgJ2xpbmVIZWlnaHQnXSxcbiAgZm9udFZhcmlhbnQ6IFsnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbiddLFxuICBnYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkOiBbJ2dyaWRBdXRvQ29sdW1ucycsICdncmlkQXV0b0Zsb3cnLCAnZ3JpZEF1dG9Sb3dzJywgJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBncmlkQXJlYTogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCcsICdncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkQ29sdW1uOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0J10sXG4gIGdyaWRDb2x1bW5HYXA6IFsnY29sdW1uR2FwJ10sXG4gIGdyaWRHYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkUm93OiBbJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRSb3dHYXA6IFsncm93R2FwJ10sXG4gIGdyaWRUZW1wbGF0ZTogWydncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgbGlzdFN0eWxlOiBbJ2xpc3RTdHlsZUltYWdlJywgJ2xpc3RTdHlsZVBvc2l0aW9uJywgJ2xpc3RTdHlsZVR5cGUnXSxcbiAgbWFyZ2luOiBbJ21hcmdpbkJvdHRvbScsICdtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0JywgJ21hcmdpblRvcCddLFxuICBtYXJrZXI6IFsnbWFya2VyRW5kJywgJ21hcmtlck1pZCcsICdtYXJrZXJTdGFydCddLFxuICBtYXNrOiBbJ21hc2tDbGlwJywgJ21hc2tDb21wb3NpdGUnLCAnbWFza0ltYWdlJywgJ21hc2tNb2RlJywgJ21hc2tPcmlnaW4nLCAnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJywgJ21hc2tSZXBlYXQnLCAnbWFza1NpemUnXSxcbiAgbWFza1Bvc2l0aW9uOiBbJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWSddLFxuICBvdXRsaW5lOiBbJ291dGxpbmVDb2xvcicsICdvdXRsaW5lU3R5bGUnLCAnb3V0bGluZVdpZHRoJ10sXG4gIG92ZXJmbG93OiBbJ292ZXJmbG93WCcsICdvdmVyZmxvd1knXSxcbiAgcGFkZGluZzogWydwYWRkaW5nQm90dG9tJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nVG9wJ10sXG4gIHBsYWNlQ29udGVudDogWydhbGlnbkNvbnRlbnQnLCAnanVzdGlmeUNvbnRlbnQnXSxcbiAgcGxhY2VJdGVtczogWydhbGlnbkl0ZW1zJywgJ2p1c3RpZnlJdGVtcyddLFxuICBwbGFjZVNlbGY6IFsnYWxpZ25TZWxmJywgJ2p1c3RpZnlTZWxmJ10sXG4gIHRleHREZWNvcmF0aW9uOiBbJ3RleHREZWNvcmF0aW9uQ29sb3InLCAndGV4dERlY29yYXRpb25MaW5lJywgJ3RleHREZWNvcmF0aW9uU3R5bGUnXSxcbiAgdGV4dEVtcGhhc2lzOiBbJ3RleHRFbXBoYXNpc0NvbG9yJywgJ3RleHRFbXBoYXNpc1N0eWxlJ10sXG4gIHRyYW5zaXRpb246IFsndHJhbnNpdGlvbkRlbGF5JywgJ3RyYW5zaXRpb25EdXJhdGlvbicsICd0cmFuc2l0aW9uUHJvcGVydHknLCAndHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIHdvcmRXcmFwOiBbJ292ZXJmbG93V3JhcCddXG59O1xuXG4vKipcbiAqIENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRzIG9mIFwicHhcIi5cbiAqL1xudmFyIGlzVW5pdGxlc3NOdW1iZXIgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBhc3BlY3RSYXRpbzogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgY29sdW1uczogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRBcmVhOiB0cnVlLFxuICBncmlkUm93OiB0cnVlLFxuICBncmlkUm93RW5kOiB0cnVlLFxuICBncmlkUm93U3BhbjogdHJ1ZSxcbiAgZ3JpZFJvd1N0YXJ0OiB0cnVlLFxuICBncmlkQ29sdW1uOiB0cnVlLFxuICBncmlkQ29sdW1uRW5kOiB0cnVlLFxuICBncmlkQ29sdW1uU3BhbjogdHJ1ZSxcbiAgZ3JpZENvbHVtblN0YXJ0OiB0cnVlLFxuICBmb250V2VpZ2h0OiB0cnVlLFxuICBsaW5lQ2xhbXA6IHRydWUsXG4gIGxpbmVIZWlnaHQ6IHRydWUsXG4gIG9wYWNpdHk6IHRydWUsXG4gIG9yZGVyOiB0cnVlLFxuICBvcnBoYW5zOiB0cnVlLFxuICB0YWJTaXplOiB0cnVlLFxuICB3aWRvd3M6IHRydWUsXG4gIHpJbmRleDogdHJ1ZSxcbiAgem9vbTogdHJ1ZSxcbiAgLy8gU1ZHLXJlbGF0ZWQgcHJvcGVydGllc1xuICBmaWxsT3BhY2l0eTogdHJ1ZSxcbiAgZmxvb2RPcGFjaXR5OiB0cnVlLFxuICBzdG9wT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaGFycmF5OiB0cnVlLFxuICBzdHJva2VEYXNob2Zmc2V0OiB0cnVlLFxuICBzdHJva2VNaXRlcmxpbWl0OiB0cnVlLFxuICBzdHJva2VPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VXaWR0aDogdHJ1ZVxufTtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCB2ZW5kb3Itc3BlY2lmaWMgcHJlZml4LCBlZzogV2Via2l0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHN0eWxlIG5hbWUsIGVnOiB0cmFuc2l0aW9uRHVyYXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ30gc3R5bGUgbmFtZSBwcmVmaXhlZCB3aXRoIGBwcmVmaXhgLCBwcm9wZXJseSBjYW1lbENhc2VkLCBlZzpcbiAqIFdlYmtpdFRyYW5zaXRpb25EdXJhdGlvblxuICovXG5cbmZ1bmN0aW9uIHByZWZpeEtleShwcmVmaXgsIGtleSkge1xuICByZXR1cm4gcHJlZml4ICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cmluZygxKTtcbn1cbi8qKlxuICogU3VwcG9ydCBzdHlsZSBuYW1lcyB0aGF0IG1heSBjb21lIHBhc3NlZCBpbiBwcmVmaXhlZCBieSBhZGRpbmcgcGVybXV0YXRpb25zXG4gKiBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cblxuXG52YXIgcHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdtcycsICdNb3onLCAnTyddOyAvLyBVc2luZyBPYmplY3Qua2V5cyBoZXJlLCBvciBlbHNlIHRoZSB2YW5pbGxhIGZvci1pbiBsb29wIG1ha2VzIElFOCBnbyBpbnRvIGFuXG4vLyBpbmZpbml0ZSBsb29wLCBiZWNhdXNlIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIG5ld2x5IGFkZGVkIHByb3BzIHRvby5cblxuT2JqZWN0LmtleXMoaXNVbml0bGVzc051bWJlcikuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBwcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBpc1VuaXRsZXNzTnVtYmVyW3ByZWZpeEtleShwcmVmaXgsIHByb3ApXSA9IGlzVW5pdGxlc3NOdW1iZXJbcHJvcF07XG4gIH0pO1xufSk7XG5cbi8qKlxuICogQ29udmVydCBhIHZhbHVlIGludG8gdGhlIHByb3BlciBjc3Mgd3JpdGFibGUgdmFsdWUuIFRoZSBzdHlsZSBuYW1lIGBuYW1lYFxuICogc2hvdWxkIGJlIGxvZ2ljYWwgKG5vIGh5cGhlbnMpLCBhcyBzcGVjaWZpZWRcbiAqIGluIGBDU1NQcm9wZXJ0eS5pc1VuaXRsZXNzTnVtYmVyYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDU1MgcHJvcGVydHkgbmFtZSBzdWNoIGFzIGB0b3BNYXJnaW5gLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBDU1MgcHJvcGVydHkgdmFsdWUgc3VjaCBhcyBgMTBweGAuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgc3R5bGUgdmFsdWUgd2l0aCBkaW1lbnNpb25zIGFwcGxpZWQuXG4gKi9cblxuZnVuY3Rpb24gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShuYW1lLCB2YWx1ZSwgaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAvLyBOb3RlIHRoYXQgd2UndmUgcmVtb3ZlZCBlc2NhcGVUZXh0Rm9yQnJvd3NlcigpIGNhbGxzIGhlcmUgc2luY2UgdGhlXG4gIC8vIHdob2xlIHN0cmluZyB3aWxsIGJlIGVzY2FwZWQgd2hlbiB0aGUgYXR0cmlidXRlIGlzIGluamVjdGVkIGludG9cbiAgLy8gdGhlIG1hcmt1cC4gSWYgeW91IHByb3ZpZGUgdW5zYWZlIHVzZXIgZGF0YSBoZXJlIHRoZXkgY2FuIGluamVjdFxuICAvLyBhcmJpdHJhcnkgQ1NTIHdoaWNoIG1heSBiZSBwcm9ibGVtYXRpYyAoSSBjb3VsZG4ndCByZXBybyB0aGlzKTpcbiAgLy8gaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9YU1NfRmlsdGVyX0V2YXNpb25fQ2hlYXRfU2hlZXRcbiAgLy8gaHR0cDovL3d3dy50aGVzcGFubmVyLmNvLnVrLzIwMDcvMTEvMjYvdWx0aW1hdGUteHNzLWNzcy1pbmplY3Rpb24vXG4gIC8vIFRoaXMgaXMgbm90IGFuIFhTUyBob2xlIGJ1dCBpbnN0ZWFkIGEgcG90ZW50aWFsIENTUyBpbmplY3Rpb24gaXNzdWVcbiAgLy8gd2hpY2ggaGFzIGxlYWQgdG8gYSBncmVhdGVyIGRpc2N1c3Npb24gYWJvdXQgaG93IHdlJ3JlIGdvaW5nIHRvXG4gIC8vIHRydXN0IFVSTHMgbW92aW5nIGZvcndhcmQuIFNlZSAjMjExNTkwMVxuICB2YXIgaXNFbXB0eSA9IHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xuXG4gIGlmIChpc0VtcHR5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKCFpc0N1c3RvbVByb3BlcnR5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdmFsdWUgIT09IDAgJiYgIShpc1VuaXRsZXNzTnVtYmVyLmhhc093blByb3BlcnR5KG5hbWUpICYmIGlzVW5pdGxlc3NOdW1iZXJbbmFtZV0pKSB7XG4gICAgcmV0dXJuIHZhbHVlICsgJ3B4JzsgLy8gUHJlc3VtZXMgaW1wbGljaXQgJ3B4JyBzdWZmaXggZm9yIHVuaXRsZXNzIG51bWJlcnNcbiAgfVxuXG4gIHtcbiAgICBjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICB9XG5cbiAgcmV0dXJuICgnJyArIHZhbHVlKS50cmltKCk7XG59XG5cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqL1xuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUobmFtZSkge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKHVwcGVyY2FzZVBhdHRlcm4sICctJDEnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkXG4gIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/OndlYmtpdHxtb3p8bylbQS1aXS87XG4gIHZhciBtc1BhdHRlcm4kMSA9IC9eLW1zLS87XG4gIHZhciBoeXBoZW5QYXR0ZXJuID0gLy0oLikvZzsgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG5cbiAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XFxzKiQvO1xuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShoeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCAvLyBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gICAgLy8gKGh0dHA6Ly93d3cuYW5kaXNtaXRoLmNvbS9ibG9nLzIwMTIvMDIvbW9kZXJuaXpyLXByZWZpeGVkLyksIGFuIGAtbXNgIHByZWZpeFxuICAgIC8vIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC5cbiAgICBjYW1lbGl6ZShuYW1lLnJlcGxhY2UobXNQYXR0ZXJuJDEsICdtcy0nKSkpO1xuICB9O1xuXG4gIHZhciB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKFwiU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uLiBcIiArICdUcnkgXCIlczogJXNcIiBpbnN0ZWFkLicsIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5ID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvckluZmluaXR5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgSW5maW5pdHlgIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSQxID0gd2FyblZhbGlkU3R5bGU7XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogVGhpcyBjcmVhdGVzIGEgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgc3R5bGVcbiAqIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgYnkgc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBJdCBieS1wYXNzZXMgd2FybmluZ3MgYW5kXG4gKiBzZWN1cml0eSBjaGVja3Mgc28gaXQncyBub3Qgc2FmZSB0byB1c2UgdGhpcyB2YWx1ZSBmb3IgYW55dGhpbmcgb3RoZXIgdGhhblxuICogY29tcGFyaXNvbi4gSXQgaXMgb25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykge1xuICB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICB2YXIgZGVsaW1pdGVyID0gJyc7XG5cbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGVsaW1pdGVyICsgKGlzQ3VzdG9tUHJvcGVydHkgPyBzdHlsZU5hbWUgOiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKSkgKyAnOic7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpO1xuICAgICAgICBkZWxpbWl0ZXIgPSAnOyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcblxuICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcblxuICAgIHtcbiAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBpc0N1c3RvbVByb3BlcnR5KTtcblxuICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICAgIHN0eWxlTmFtZSA9ICdjc3NGbG9hdCc7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xufVxuLyoqXG4gKiBHaXZlbiB7Y29sb3I6ICdyZWQnLCBvdmVyZmxvdzogJ2hpZGRlbid9IHJldHVybnMge1xuICogICBjb2xvcjogJ2NvbG9yJyxcbiAqICAgb3ZlcmZsb3dYOiAnb3ZlcmZsb3cnLFxuICogICBvdmVyZmxvd1k6ICdvdmVyZmxvdycsXG4gKiB9LiBUaGlzIGNhbiBiZSByZWFkIGFzIFwidGhlIG92ZXJmbG93WSBwcm9wZXJ0eSB3YXMgc2V0IGJ5IHRoZSBvdmVyZmxvd1xuICogc2hvcnRoYW5kXCIuIFRoYXQgaXMsIHRoZSB2YWx1ZXMgYXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGVhY2ggd2FzIGRlcml2ZWQgZnJvbS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZXMpIHtcbiAgdmFyIGV4cGFuZGVkID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgIHZhciBsb25naGFuZHMgPSBzaG9ydGhhbmRUb0xvbmdoYW5kW2tleV0gfHwgW2tleV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdoYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwYW5kZWRbbG9uZ2hhbmRzW2ldXSA9IGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4vKipcbiAqIFdoZW4gbWl4aW5nIHNob3J0aGFuZCBhbmQgbG9uZ2hhbmQgcHJvcGVydHkgbmFtZXMsIHdlIHdhcm4gZHVyaW5nIHVwZGF0ZXMgaWZcbiAqIHdlIGV4cGVjdCBhbiBpbmNvcnJlY3QgcmVzdWx0IHRvIG9jY3VyLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YXJuIGZvcjpcbiAqXG4gKiBVcGRhdGluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBvdmVyd3JpdHRlbik6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2JheicsIGZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonXG4gKiBSZW1vdmluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBsb3N0IHRvbyk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJydcbiAqIFJlbW92aW5nIGEgbG9uZ2hhbmQgcHJvcGVydHkgKHNob3VsZCByZXZlcnQgdG8gc2hvcnRoYW5kOyBkb2Vzbid0KTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnZm9vJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJ1xuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFN0eWxlcykge1xuICB7XG4gICAgaWYgKCFuZXh0U3R5bGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGV4cGFuZGVkVXBkYXRlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZVVwZGF0ZXMpO1xuICAgIHZhciBleHBhbmRlZFN0eWxlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChuZXh0U3R5bGVzKTtcbiAgICB2YXIgd2FybmVkQWJvdXQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbEtleSA9IGV4cGFuZGVkVXBkYXRlc1trZXldO1xuICAgICAgdmFyIGNvcnJlY3RPcmlnaW5hbEtleSA9IGV4cGFuZGVkU3R5bGVzW2tleV07XG5cbiAgICAgIGlmIChjb3JyZWN0T3JpZ2luYWxLZXkgJiYgb3JpZ2luYWxLZXkgIT09IGNvcnJlY3RPcmlnaW5hbEtleSkge1xuICAgICAgICB2YXIgd2FybmluZ0tleSA9IG9yaWdpbmFsS2V5ICsgJywnICsgY29ycmVjdE9yaWdpbmFsS2V5O1xuXG4gICAgICAgIGlmICh3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2FybmVkQWJvdXRbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclcyBhIHN0eWxlIHByb3BlcnR5IGR1cmluZyByZXJlbmRlciAoJXMpIHdoZW4gYSAnICsgJ2NvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gJyArIFwiYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIFwiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIGxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cbnZhciBvbWl0dGVkQ2xvc2VUYWdzID0ge1xuICBhcmVhOiB0cnVlLFxuICBiYXNlOiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgaHI6IHRydWUsXG4gIGltZzogdHJ1ZSxcbiAgaW5wdXQ6IHRydWUsXG4gIGtleWdlbjogdHJ1ZSxcbiAgbGluazogdHJ1ZSxcbiAgbWV0YTogdHJ1ZSxcbiAgcGFyYW06IHRydWUsXG4gIHNvdXJjZTogdHJ1ZSxcbiAgdHJhY2s6IHRydWUsXG4gIHdicjogdHJ1ZSAvLyBOT1RFOiBtZW51aXRlbSdzIGNsb3NlIHRhZyBzaG91bGQgYmUgb21pdHRlZCwgYnV0IHRoYXQgY2F1c2VzIHByb2JsZW1zLlxuXG59O1xuXG4vLyBgb21pdHRlZENsb3NlVGFnc2AgZXhjZXB0IHRoYXQgYG1lbnVpdGVtYCBzaG91bGQgc3RpbGwgaGF2ZSBpdHMgY2xvc2luZyB0YWcuXG5cbnZhciB2b2lkRWxlbWVudFRhZ3MgPSBhc3NpZ24oe1xuICBtZW51aXRlbTogdHJ1ZVxufSwgb21pdHRlZENsb3NlVGFncyk7XG5cbnZhciBIVE1MID0gJ19faHRtbCc7XG5cbmZ1bmN0aW9uIGFzc2VydFZhbGlkUHJvcHModGFnLCBwcm9wcykge1xuICBpZiAoIXByb3BzKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIE5vdGUgdGhlIHVzZSBvZiBgPT1gIHdoaWNoIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWQuXG5cblxuICBpZiAodm9pZEVsZW1lbnRUYWdzW3RhZ10pIHtcbiAgICBpZiAocHJvcHMuY2hpbGRyZW4gIT0gbnVsbCB8fCBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGFnICsgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciBcIiArICd1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT0gbnVsbCkge1xuICAgIGlmIChwcm9wcy5jaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IHNldCBvbmUgb2YgYGNoaWxkcmVuYCBvciBgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT09ICdvYmplY3QnIHx8ICEoSFRNTCBpbiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gJyArICdQbGVhc2UgdmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rhbmdlcm91c2x5LXNldC1pbm5lci1odG1sICcgKyAnZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmICghcHJvcHMuc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nICYmIHByb3BzLmNvbnRlbnRFZGl0YWJsZSAmJiBwcm9wcy5jaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICBlcnJvcignQSBjb21wb25lbnQgaXMgYGNvbnRlbnRFZGl0YWJsZWAgYW5kIGNvbnRhaW5zIGBjaGlsZHJlbmAgbWFuYWdlZCBieSAnICsgJ1JlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhhdCBub25lIG9mICcgKyAndGhvc2Ugbm9kZXMgYXJlIHVuZXhwZWN0ZWRseSBtb2RpZmllZCBvciBkdXBsaWNhdGVkLiBUaGlzIGlzICcgKyAncHJvYmFibHkgbm90IGludGVudGlvbmFsLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5zdHlsZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wcy5zdHlsZSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgJyArIFwibm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArICdlbSd9fSB3aGVuIFwiICsgJ3VzaW5nIEpTWC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0N1c3RvbUNvbXBvbmVudCh0YWdOYW1lLCBwcm9wcykge1xuICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuXG4gICAgLy8gV2UgZG9uJ3QgbWluZCB0aGlzIGxpc3QgdG9vIG11Y2ggYmVjYXVzZSB3ZSBleHBlY3QgaXQgdG8gbmV2ZXIgZ3Jvdy5cbiAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gdHJhY2sgdGhlIG5hbWVzcGFjZSBpbiBhIGZldyBwbGFjZXMgd2hpY2ggaXMgY29udm9sdXRlZC5cbiAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3VzdG9tLWVsZW1lbnRzLWNvcmUtY29uY2VwdHNcbiAgICBjYXNlICdhbm5vdGF0aW9uLXhtbCc6XG4gICAgY2FzZSAnY29sb3ItcHJvZmlsZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlJzpcbiAgICBjYXNlICdmb250LWZhY2Utc3JjJzpcbiAgICBjYXNlICdmb250LWZhY2UtdXJpJzpcbiAgICBjYXNlICdmb250LWZhY2UtZm9ybWF0JzpcbiAgICBjYXNlICdmb250LWZhY2UtbmFtZSc6XG4gICAgY2FzZSAnbWlzc2luZy1nbHlwaCc6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgYWxsb3dlZCBhdHRyaWJ1dGUgbGlzdCwgYmUgc3VyZSB0b1xuLy8gYWxzbyBhZGQgdGhlbSB0byB0aGlzIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3QgbmFtZVxuLy8gd2FybmluZ3MuXG52YXIgcG9zc2libGVTdGFuZGFyZE5hbWVzID0ge1xuICAvLyBIVE1MXG4gIGFjY2VwdDogJ2FjY2VwdCcsXG4gIGFjY2VwdGNoYXJzZXQ6ICdhY2NlcHRDaGFyc2V0JyxcbiAgJ2FjY2VwdC1jaGFyc2V0JzogJ2FjY2VwdENoYXJzZXQnLFxuICBhY2Nlc3NrZXk6ICdhY2Nlc3NLZXknLFxuICBhY3Rpb246ICdhY3Rpb24nLFxuICBhbGxvd2Z1bGxzY3JlZW46ICdhbGxvd0Z1bGxTY3JlZW4nLFxuICBhbHQ6ICdhbHQnLFxuICBhczogJ2FzJyxcbiAgYXN5bmM6ICdhc3luYycsXG4gIGF1dG9jYXBpdGFsaXplOiAnYXV0b0NhcGl0YWxpemUnLFxuICBhdXRvY29tcGxldGU6ICdhdXRvQ29tcGxldGUnLFxuICBhdXRvY29ycmVjdDogJ2F1dG9Db3JyZWN0JyxcbiAgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyxcbiAgYXV0b3BsYXk6ICdhdXRvUGxheScsXG4gIGF1dG9zYXZlOiAnYXV0b1NhdmUnLFxuICBjYXB0dXJlOiAnY2FwdHVyZScsXG4gIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLFxuICBjZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJyxcbiAgY2hhbGxlbmdlOiAnY2hhbGxlbmdlJyxcbiAgY2hhcnNldDogJ2NoYXJTZXQnLFxuICBjaGVja2VkOiAnY2hlY2tlZCcsXG4gIGNoaWxkcmVuOiAnY2hpbGRyZW4nLFxuICBjaXRlOiAnY2l0ZScsXG4gIGNsYXNzOiAnY2xhc3NOYW1lJyxcbiAgY2xhc3NpZDogJ2NsYXNzSUQnLFxuICBjbGFzc25hbWU6ICdjbGFzc05hbWUnLFxuICBjb2xzOiAnY29scycsXG4gIGNvbHNwYW46ICdjb2xTcGFuJyxcbiAgY29udGVudDogJ2NvbnRlbnQnLFxuICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnLFxuICBjb250ZXh0bWVudTogJ2NvbnRleHRNZW51JyxcbiAgY29udHJvbHM6ICdjb250cm9scycsXG4gIGNvbnRyb2xzbGlzdDogJ2NvbnRyb2xzTGlzdCcsXG4gIGNvb3JkczogJ2Nvb3JkcycsXG4gIGNyb3Nzb3JpZ2luOiAnY3Jvc3NPcmlnaW4nLFxuICBkYW5nZXJvdXNseXNldGlubmVyaHRtbDogJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJyxcbiAgZGF0YTogJ2RhdGEnLFxuICBkYXRldGltZTogJ2RhdGVUaW1lJyxcbiAgZGVmYXVsdDogJ2RlZmF1bHQnLFxuICBkZWZhdWx0Y2hlY2tlZDogJ2RlZmF1bHRDaGVja2VkJyxcbiAgZGVmYXVsdHZhbHVlOiAnZGVmYXVsdFZhbHVlJyxcbiAgZGVmZXI6ICdkZWZlcicsXG4gIGRpcjogJ2RpcicsXG4gIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBkaXNhYmxlcGljdHVyZWlucGljdHVyZTogJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJyxcbiAgZGlzYWJsZXJlbW90ZXBsYXliYWNrOiAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJyxcbiAgZG93bmxvYWQ6ICdkb3dubG9hZCcsXG4gIGRyYWdnYWJsZTogJ2RyYWdnYWJsZScsXG4gIGVuY3R5cGU6ICdlbmNUeXBlJyxcbiAgZW50ZXJrZXloaW50OiAnZW50ZXJLZXlIaW50JyxcbiAgZm9yOiAnaHRtbEZvcicsXG4gIGZvcm06ICdmb3JtJyxcbiAgZm9ybW1ldGhvZDogJ2Zvcm1NZXRob2QnLFxuICBmb3JtYWN0aW9uOiAnZm9ybUFjdGlvbicsXG4gIGZvcm1lbmN0eXBlOiAnZm9ybUVuY1R5cGUnLFxuICBmb3Jtbm92YWxpZGF0ZTogJ2Zvcm1Ob1ZhbGlkYXRlJyxcbiAgZm9ybXRhcmdldDogJ2Zvcm1UYXJnZXQnLFxuICBmcmFtZWJvcmRlcjogJ2ZyYW1lQm9yZGVyJyxcbiAgaGVhZGVyczogJ2hlYWRlcnMnLFxuICBoZWlnaHQ6ICdoZWlnaHQnLFxuICBoaWRkZW46ICdoaWRkZW4nLFxuICBoaWdoOiAnaGlnaCcsXG4gIGhyZWY6ICdocmVmJyxcbiAgaHJlZmxhbmc6ICdocmVmTGFuZycsXG4gIGh0bWxmb3I6ICdodG1sRm9yJyxcbiAgaHR0cGVxdWl2OiAnaHR0cEVxdWl2JyxcbiAgJ2h0dHAtZXF1aXYnOiAnaHR0cEVxdWl2JyxcbiAgaWNvbjogJ2ljb24nLFxuICBpZDogJ2lkJyxcbiAgaW1hZ2VzaXplczogJ2ltYWdlU2l6ZXMnLFxuICBpbWFnZXNyY3NldDogJ2ltYWdlU3JjU2V0JyxcbiAgaW5uZXJodG1sOiAnaW5uZXJIVE1MJyxcbiAgaW5wdXRtb2RlOiAnaW5wdXRNb2RlJyxcbiAgaW50ZWdyaXR5OiAnaW50ZWdyaXR5JyxcbiAgaXM6ICdpcycsXG4gIGl0ZW1pZDogJ2l0ZW1JRCcsXG4gIGl0ZW1wcm9wOiAnaXRlbVByb3AnLFxuICBpdGVtcmVmOiAnaXRlbVJlZicsXG4gIGl0ZW1zY29wZTogJ2l0ZW1TY29wZScsXG4gIGl0ZW10eXBlOiAnaXRlbVR5cGUnLFxuICBrZXlwYXJhbXM6ICdrZXlQYXJhbXMnLFxuICBrZXl0eXBlOiAna2V5VHlwZScsXG4gIGtpbmQ6ICdraW5kJyxcbiAgbGFiZWw6ICdsYWJlbCcsXG4gIGxhbmc6ICdsYW5nJyxcbiAgbGlzdDogJ2xpc3QnLFxuICBsb29wOiAnbG9vcCcsXG4gIGxvdzogJ2xvdycsXG4gIG1hbmlmZXN0OiAnbWFuaWZlc3QnLFxuICBtYXJnaW53aWR0aDogJ21hcmdpbldpZHRoJyxcbiAgbWFyZ2luaGVpZ2h0OiAnbWFyZ2luSGVpZ2h0JyxcbiAgbWF4OiAnbWF4JyxcbiAgbWF4bGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgbWVkaWE6ICdtZWRpYScsXG4gIG1lZGlhZ3JvdXA6ICdtZWRpYUdyb3VwJyxcbiAgbWV0aG9kOiAnbWV0aG9kJyxcbiAgbWluOiAnbWluJyxcbiAgbWlubGVuZ3RoOiAnbWluTGVuZ3RoJyxcbiAgbXVsdGlwbGU6ICdtdWx0aXBsZScsXG4gIG11dGVkOiAnbXV0ZWQnLFxuICBuYW1lOiAnbmFtZScsXG4gIG5vbW9kdWxlOiAnbm9Nb2R1bGUnLFxuICBub25jZTogJ25vbmNlJyxcbiAgbm92YWxpZGF0ZTogJ25vVmFsaWRhdGUnLFxuICBvcGVuOiAnb3BlbicsXG4gIG9wdGltdW06ICdvcHRpbXVtJyxcbiAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICBwbGFjZWhvbGRlcjogJ3BsYWNlaG9sZGVyJyxcbiAgcGxheXNpbmxpbmU6ICdwbGF5c0lubGluZScsXG4gIHBvc3RlcjogJ3Bvc3RlcicsXG4gIHByZWxvYWQ6ICdwcmVsb2FkJyxcbiAgcHJvZmlsZTogJ3Byb2ZpbGUnLFxuICByYWRpb2dyb3VwOiAncmFkaW9Hcm91cCcsXG4gIHJlYWRvbmx5OiAncmVhZE9ubHknLFxuICByZWZlcnJlcnBvbGljeTogJ3JlZmVycmVyUG9saWN5JyxcbiAgcmVsOiAncmVsJyxcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIHJldmVyc2VkOiAncmV2ZXJzZWQnLFxuICByb2xlOiAncm9sZScsXG4gIHJvd3M6ICdyb3dzJyxcbiAgcm93c3BhbjogJ3Jvd1NwYW4nLFxuICBzYW5kYm94OiAnc2FuZGJveCcsXG4gIHNjb3BlOiAnc2NvcGUnLFxuICBzY29wZWQ6ICdzY29wZWQnLFxuICBzY3JvbGxpbmc6ICdzY3JvbGxpbmcnLFxuICBzZWFtbGVzczogJ3NlYW1sZXNzJyxcbiAgc2VsZWN0ZWQ6ICdzZWxlY3RlZCcsXG4gIHNoYXBlOiAnc2hhcGUnLFxuICBzaXplOiAnc2l6ZScsXG4gIHNpemVzOiAnc2l6ZXMnLFxuICBzcGFuOiAnc3BhbicsXG4gIHNwZWxsY2hlY2s6ICdzcGVsbENoZWNrJyxcbiAgc3JjOiAnc3JjJyxcbiAgc3JjZG9jOiAnc3JjRG9jJyxcbiAgc3JjbGFuZzogJ3NyY0xhbmcnLFxuICBzcmNzZXQ6ICdzcmNTZXQnLFxuICBzdGFydDogJ3N0YXJ0JyxcbiAgc3RlcDogJ3N0ZXAnLFxuICBzdHlsZTogJ3N0eWxlJyxcbiAgc3VtbWFyeTogJ3N1bW1hcnknLFxuICB0YWJpbmRleDogJ3RhYkluZGV4JyxcbiAgdGFyZ2V0OiAndGFyZ2V0JyxcbiAgdGl0bGU6ICd0aXRsZScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgdXNlbWFwOiAndXNlTWFwJyxcbiAgdmFsdWU6ICd2YWx1ZScsXG4gIHdpZHRoOiAnd2lkdGgnLFxuICB3bW9kZTogJ3dtb2RlJyxcbiAgd3JhcDogJ3dyYXAnLFxuICAvLyBTVkdcbiAgYWJvdXQ6ICdhYm91dCcsXG4gIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsXG4gICdhY2NlbnQtaGVpZ2h0JzogJ2FjY2VudEhlaWdodCcsXG4gIGFjY3VtdWxhdGU6ICdhY2N1bXVsYXRlJyxcbiAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsXG4gIGFsaWdubWVudGJhc2VsaW5lOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJzogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICBhbXBsaXR1ZGU6ICdhbXBsaXR1ZGUnLFxuICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsXG4gICdhcmFiaWMtZm9ybSc6ICdhcmFiaWNGb3JtJyxcbiAgYXNjZW50OiAnYXNjZW50JyxcbiAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGV0eXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9yZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAnYXppbXV0aCcsXG4gIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZWxpbmVzaGlmdDogJ2Jhc2VsaW5lU2hpZnQnLFxuICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsXG4gIGJhc2Vwcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYm94OiAnYmJveCcsXG4gIGJlZ2luOiAnYmVnaW4nLFxuICBiaWFzOiAnYmlhcycsXG4gIGJ5OiAnYnknLFxuICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwaGVpZ2h0OiAnY2FwSGVpZ2h0JyxcbiAgJ2NhcC1oZWlnaHQnOiAnY2FwSGVpZ2h0JyxcbiAgY2xpcDogJ2NsaXAnLFxuICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgJ2NsaXAtcGF0aCc6ICdjbGlwUGF0aCcsXG4gIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY2xpcHJ1bGU6ICdjbGlwUnVsZScsXG4gICdjbGlwLXJ1bGUnOiAnY2xpcFJ1bGUnLFxuICBjb2xvcjogJ2NvbG9yJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICBjb2xvcnByb2ZpbGU6ICdjb2xvclByb2ZpbGUnLFxuICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLFxuICBjb2xvcnJlbmRlcmluZzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgJ2NvbG9yLXJlbmRlcmluZyc6ICdjb2xvclJlbmRlcmluZycsXG4gIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50c3R5bGV0eXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogJ2N1cnNvcicsXG4gIGN4OiAnY3gnLFxuICBjeTogJ2N5JyxcbiAgZDogJ2QnLFxuICBkYXRhdHlwZTogJ2RhdGF0eXBlJyxcbiAgZGVjZWxlcmF0ZTogJ2RlY2VsZXJhdGUnLFxuICBkZXNjZW50OiAnZGVzY2VudCcsXG4gIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogJ2RpcmVjdGlvbicsXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcbiAgZGl2aXNvcjogJ2Rpdmlzb3InLFxuICBkb21pbmFudGJhc2VsaW5lOiAnZG9taW5hbnRCYXNlbGluZScsXG4gICdkb21pbmFudC1iYXNlbGluZSc6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgZHVyOiAnZHVyJyxcbiAgZHg6ICdkeCcsXG4gIGR5OiAnZHknLFxuICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAnZWxldmF0aW9uJyxcbiAgZW5hYmxlYmFja2dyb3VuZDogJ2VuYWJsZUJhY2tncm91bmQnLFxuICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gIGVuZDogJ2VuZCcsXG4gIGV4cG9uZW50OiAnZXhwb25lbnQnLFxuICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6ICdmaWxsJyxcbiAgZmlsbG9wYWNpdHk6ICdmaWxsT3BhY2l0eScsXG4gICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLFxuICBmaWxscnVsZTogJ2ZpbGxSdWxlJyxcbiAgJ2ZpbGwtcnVsZSc6ICdmaWxsUnVsZScsXG4gIGZpbHRlcjogJ2ZpbHRlcicsXG4gIGZpbHRlcnJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlcnVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLFxuICAnZmxvb2Qtb3BhY2l0eSc6ICdmbG9vZE9wYWNpdHknLFxuICBmbG9vZGNvbG9yOiAnZmxvb2RDb2xvcicsXG4gICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJyxcbiAgZm9jdXNhYmxlOiAnZm9jdXNhYmxlJyxcbiAgZm9udGZhbWlseTogJ2ZvbnRGYW1pbHknLFxuICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsXG4gIGZvbnRzaXplOiAnZm9udFNpemUnLFxuICAnZm9udC1zaXplJzogJ2ZvbnRTaXplJyxcbiAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsXG4gICdmb250LXNpemUtYWRqdXN0JzogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgZm9udHN0cmV0Y2g6ICdmb250U3RyZXRjaCcsXG4gICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLFxuICBmb250c3R5bGU6ICdmb250U3R5bGUnLFxuICAnZm9udC1zdHlsZSc6ICdmb250U3R5bGUnLFxuICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JyxcbiAgJ2ZvbnQtdmFyaWFudCc6ICdmb250VmFyaWFudCcsXG4gIGZvbnR3ZWlnaHQ6ICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLFxuICBmb3JtYXQ6ICdmb3JtYXQnLFxuICBmcm9tOiAnZnJvbScsXG4gIGZ4OiAnZngnLFxuICBmeTogJ2Z5JyxcbiAgZzE6ICdnMScsXG4gIGcyOiAnZzInLFxuICBnbHlwaG5hbWU6ICdnbHlwaE5hbWUnLFxuICAnZ2x5cGgtbmFtZSc6ICdnbHlwaE5hbWUnLFxuICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICBnbHlwaG9yaWVudGF0aW9udmVydGljYWw6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50dHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6ICdoYW5naW5nJyxcbiAgaG9yaXphZHZ4OiAnaG9yaXpBZHZYJyxcbiAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsXG4gIGhvcml6b3JpZ2lueDogJ2hvcml6T3JpZ2luWCcsXG4gICdob3Jpei1vcmlnaW4teCc6ICdob3Jpek9yaWdpblgnLFxuICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJyxcbiAgaW1hZ2VyZW5kZXJpbmc6ICdpbWFnZVJlbmRlcmluZycsXG4gICdpbWFnZS1yZW5kZXJpbmcnOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICBpbjI6ICdpbjInLFxuICBpbjogJ2luJyxcbiAgaW5saXN0OiAnaW5saXN0JyxcbiAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JyxcbiAgazE6ICdrMScsXG4gIGsyOiAnazInLFxuICBrMzogJ2szJyxcbiAgazQ6ICdrNCcsXG4gIGs6ICdrJyxcbiAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsdW5pdGxlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAna2VybmluZycsXG4gIGtleXBvaW50czogJ2tleVBvaW50cycsXG4gIGtleXNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlcnNwYWNpbmc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ2xldHRlci1zcGFjaW5nJzogJ2xldHRlclNwYWNpbmcnLFxuICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsXG4gICdsaWdodGluZy1jb2xvcic6ICdsaWdodGluZ0NvbG9yJyxcbiAgbGltaXRpbmdjb25lYW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAnbG9jYWwnLFxuICBtYXJrZXJlbmQ6ICdtYXJrZXJFbmQnLFxuICAnbWFya2VyLWVuZCc6ICdtYXJrZXJFbmQnLFxuICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJtaWQ6ICdtYXJrZXJNaWQnLFxuICAnbWFya2VyLW1pZCc6ICdtYXJrZXJNaWQnLFxuICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JyxcbiAgJ21hcmtlci1zdGFydCc6ICdtYXJrZXJTdGFydCcsXG4gIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogJ21hc2snLFxuICBtYXNrY29udGVudHVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2t1bml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogJ21hdGhlbWF0aWNhbCcsXG4gIG1vZGU6ICdtb2RlJyxcbiAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6ICdvZmZzZXQnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG9wZXJhdG9yOiAnb3BlcmF0b3InLFxuICBvcmRlcjogJ29yZGVyJyxcbiAgb3JpZW50OiAnb3JpZW50JyxcbiAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsXG4gIG9yaWdpbjogJ29yaWdpbicsXG4gIG92ZXJmbG93OiAnb3ZlcmZsb3cnLFxuICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gICdvdmVybGluZS1wb3NpdGlvbic6ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgb3ZlcmxpbmV0aGlja25lc3M6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICBwYWludG9yZGVyOiAncGFpbnRPcmRlcicsXG4gICdwYWludC1vcmRlcic6ICdwYWludE9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZTEnLFxuICAncGFub3NlLTEnOiAncGFub3NlMScsXG4gIHBhdGhsZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJudHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm51bml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJyxcbiAgJ3BvaW50ZXItZXZlbnRzJzogJ3BvaW50ZXJFdmVudHMnLFxuICBwb2ludHM6ICdwb2ludHMnLFxuICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNhdHk6ICdwb2ludHNBdFknLFxuICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICBwcmVmaXg6ICdwcmVmaXgnLFxuICBwcmVzZXJ2ZWFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlYXNwZWN0cmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHByb3BlcnR5OiAncHJvcGVydHknLFxuICByOiAncicsXG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIHJlZng6ICdyZWZYJyxcbiAgcmVmeTogJ3JlZlknLFxuICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICAncmVuZGVyaW5nLWludGVudCc6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRleHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXNvdXJjZTogJ3Jlc291cmNlJyxcbiAgcmVzdGFydDogJ3Jlc3RhcnQnLFxuICByZXN1bHQ6ICdyZXN1bHQnLFxuICByZXN1bHRzOiAncmVzdWx0cycsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJ4OiAncngnLFxuICByeTogJ3J5JyxcbiAgc2NhbGU6ICdzY2FsZScsXG4gIHNlY3VyaXR5OiAnc2VjdXJpdHknLFxuICBzZWVkOiAnc2VlZCcsXG4gIHNoYXBlcmVuZGVyaW5nOiAnc2hhcGVSZW5kZXJpbmcnLFxuICAnc2hhcGUtcmVuZGVyaW5nJzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgc2xvcGU6ICdzbG9wZScsXG4gIHNwYWNpbmc6ICdzcGFjaW5nJyxcbiAgc3BlY3VsYXJjb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAnc3BlZWQnLFxuICBzcHJlYWRtZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkZGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6ICdzdGVtaCcsXG4gIHN0ZW12OiAnc3RlbXYnLFxuICBzdGl0Y2h0aWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcGNvbG9yOiAnc3RvcENvbG9yJyxcbiAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJyxcbiAgc3RvcG9wYWNpdHk6ICdzdG9wT3BhY2l0eScsXG4gICdzdG9wLW9wYWNpdHknOiAnc3RvcE9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbic6ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAnc3RyaW5nJyxcbiAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgc3Ryb2tlZGFzaG9mZnNldDogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gIHN0cm9rZWxpbmVjYXA6ICdzdHJva2VMaW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lY2FwJzogJ3N0cm9rZUxpbmVjYXAnLFxuICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJyxcbiAgJ3N0cm9rZS1saW5lam9pbic6ICdzdHJva2VMaW5lam9pbicsXG4gIHN0cm9rZW1pdGVybGltaXQ6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLFxuICBzdHJva2V3aWR0aDogJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZS13aWR0aCc6ICdzdHJva2VXaWR0aCcsXG4gIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JzogJ3N0cm9rZU9wYWNpdHknLFxuICBzdXBwcmVzc2NvbnRlbnRlZGl0YWJsZXdhcm5pbmc6ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLFxuICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLFxuICBzdXJmYWNlc2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1sYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldHg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0eTogJ3RhcmdldFknLFxuICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsXG4gICd0ZXh0LWFuY2hvcic6ICd0ZXh0QW5jaG9yJyxcbiAgdGV4dGRlY29yYXRpb246ICd0ZXh0RGVjb3JhdGlvbicsXG4gICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLFxuICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRleHRyZW5kZXJpbmc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLFxuICB0bzogJ3RvJyxcbiAgdHJhbnNmb3JtOiAndHJhbnNmb3JtJyxcbiAgdHlwZW9mOiAndHlwZW9mJyxcbiAgdTE6ICd1MScsXG4gIHUyOiAndTInLFxuICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgJ3VuZGVybGluZS1wb3NpdGlvbic6ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gIHVuZGVybGluZXRoaWNrbmVzczogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gIHVuaWNvZGU6ICd1bmljb2RlJyxcbiAgdW5pY29kZWJpZGk6ICd1bmljb2RlQmlkaScsXG4gICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLFxuICB1bmljb2RlcmFuZ2U6ICd1bmljb2RlUmFuZ2UnLFxuICAndW5pY29kZS1yYW5nZSc6ICd1bmljb2RlUmFuZ2UnLFxuICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsXG4gICd1bml0cy1wZXItZW0nOiAndW5pdHNQZXJFbScsXG4gIHVuc2VsZWN0YWJsZTogJ3Vuc2VsZWN0YWJsZScsXG4gIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLFxuICAndi1hbHBoYWJldGljJzogJ3ZBbHBoYWJldGljJyxcbiAgdmFsdWVzOiAndmFsdWVzJyxcbiAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JyxcbiAgJ3ZlY3Rvci1lZmZlY3QnOiAndmVjdG9yRWZmZWN0JyxcbiAgdmVyc2lvbjogJ3ZlcnNpb24nLFxuICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJyxcbiAgJ3ZlcnQtYWR2LXknOiAndmVydEFkdlknLFxuICB2ZXJ0b3JpZ2lueDogJ3ZlcnRPcmlnaW5YJyxcbiAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLFxuICB2ZXJ0b3JpZ2lueTogJ3ZlcnRPcmlnaW5ZJyxcbiAgJ3ZlcnQtb3JpZ2luLXknOiAndmVydE9yaWdpblknLFxuICB2aGFuZ2luZzogJ3ZIYW5naW5nJyxcbiAgJ3YtaGFuZ2luZyc6ICd2SGFuZ2luZycsXG4gIHZpZGVvZ3JhcGhpYzogJ3ZJZGVvZ3JhcGhpYycsXG4gICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsXG4gIHZpZXdib3g6ICd2aWV3Qm94JyxcbiAgdmlld3RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsXG4gIHZtYXRoZW1hdGljYWw6ICd2TWF0aGVtYXRpY2FsJyxcbiAgJ3YtbWF0aGVtYXRpY2FsJzogJ3ZNYXRoZW1hdGljYWwnLFxuICB2b2NhYjogJ3ZvY2FiJyxcbiAgd2lkdGhzOiAnd2lkdGhzJyxcbiAgd29yZHNwYWNpbmc6ICd3b3JkU3BhY2luZycsXG4gICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLFxuICB3cml0aW5nbW9kZTogJ3dyaXRpbmdNb2RlJyxcbiAgJ3dyaXRpbmctbW9kZSc6ICd3cml0aW5nTW9kZScsXG4gIHgxOiAneDEnLFxuICB4MjogJ3gyJyxcbiAgeDogJ3gnLFxuICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhoZWlnaHQ6ICd4SGVpZ2h0JyxcbiAgJ3gtaGVpZ2h0JzogJ3hIZWlnaHQnLFxuICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLFxuICAneGxpbms6YWN0dWF0ZSc6ICd4bGlua0FjdHVhdGUnLFxuICB4bGlua2FyY3JvbGU6ICd4bGlua0FyY3JvbGUnLFxuICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLFxuICB4bGlua2hyZWY6ICd4bGlua0hyZWYnLFxuICAneGxpbms6aHJlZic6ICd4bGlua0hyZWYnLFxuICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLFxuICAneGxpbms6cm9sZSc6ICd4bGlua1JvbGUnLFxuICB4bGlua3Nob3c6ICd4bGlua1Nob3cnLFxuICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLFxuICB4bGlua3RpdGxlOiAneGxpbmtUaXRsZScsXG4gICd4bGluazp0aXRsZSc6ICd4bGlua1RpdGxlJyxcbiAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJyxcbiAgJ3hsaW5rOnR5cGUnOiAneGxpbmtUeXBlJyxcbiAgeG1sYmFzZTogJ3htbEJhc2UnLFxuICAneG1sOmJhc2UnOiAneG1sQmFzZScsXG4gIHhtbGxhbmc6ICd4bWxMYW5nJyxcbiAgJ3htbDpsYW5nJzogJ3htbExhbmcnLFxuICB4bWxuczogJ3htbG5zJyxcbiAgJ3htbDpzcGFjZSc6ICd4bWxTcGFjZScsXG4gIHhtbG5zeGxpbms6ICd4bWxuc1hsaW5rJyxcbiAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLFxuICB4bWxzcGFjZTogJ3htbFNwYWNlJyxcbiAgeTE6ICd5MScsXG4gIHkyOiAneTInLFxuICB5OiAneScsXG4gIHljaGFubmVsc2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogJ3onLFxuICB6b29tYW5kcGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBhcmlhUHJvcGVydGllcyA9IHtcbiAgJ2FyaWEtY3VycmVudCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWRlc2NyaXB0aW9uJzogMCxcbiAgJ2FyaWEtZGV0YWlscyc6IDAsXG4gICdhcmlhLWRpc2FibGVkJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtaGlkZGVuJzogMCxcbiAgLy8gc3RhdGVcbiAgJ2FyaWEtaW52YWxpZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWtleXNob3J0Y3V0cyc6IDAsXG4gICdhcmlhLWxhYmVsJzogMCxcbiAgJ2FyaWEtcm9sZWRlc2NyaXB0aW9uJzogMCxcbiAgLy8gV2lkZ2V0IEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXV0b2NvbXBsZXRlJzogMCxcbiAgJ2FyaWEtY2hlY2tlZCc6IDAsXG4gICdhcmlhLWV4cGFuZGVkJzogMCxcbiAgJ2FyaWEtaGFzcG9wdXAnOiAwLFxuICAnYXJpYS1sZXZlbCc6IDAsXG4gICdhcmlhLW1vZGFsJzogMCxcbiAgJ2FyaWEtbXVsdGlsaW5lJzogMCxcbiAgJ2FyaWEtbXVsdGlzZWxlY3RhYmxlJzogMCxcbiAgJ2FyaWEtb3JpZW50YXRpb24nOiAwLFxuICAnYXJpYS1wbGFjZWhvbGRlcic6IDAsXG4gICdhcmlhLXByZXNzZWQnOiAwLFxuICAnYXJpYS1yZWFkb25seSc6IDAsXG4gICdhcmlhLXJlcXVpcmVkJzogMCxcbiAgJ2FyaWEtc2VsZWN0ZWQnOiAwLFxuICAnYXJpYS1zb3J0JzogMCxcbiAgJ2FyaWEtdmFsdWVtYXgnOiAwLFxuICAnYXJpYS12YWx1ZW1pbic6IDAsXG4gICdhcmlhLXZhbHVlbm93JzogMCxcbiAgJ2FyaWEtdmFsdWV0ZXh0JzogMCxcbiAgLy8gTGl2ZSBSZWdpb24gQXR0cmlidXRlc1xuICAnYXJpYS1hdG9taWMnOiAwLFxuICAnYXJpYS1idXN5JzogMCxcbiAgJ2FyaWEtbGl2ZSc6IDAsXG4gICdhcmlhLXJlbGV2YW50JzogMCxcbiAgLy8gRHJhZy1hbmQtRHJvcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWRyb3BlZmZlY3QnOiAwLFxuICAnYXJpYS1ncmFiYmVkJzogMCxcbiAgLy8gUmVsYXRpb25zaGlwIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCc6IDAsXG4gICdhcmlhLWNvbGNvdW50JzogMCxcbiAgJ2FyaWEtY29saW5kZXgnOiAwLFxuICAnYXJpYS1jb2xzcGFuJzogMCxcbiAgJ2FyaWEtY29udHJvbHMnOiAwLFxuICAnYXJpYS1kZXNjcmliZWRieSc6IDAsXG4gICdhcmlhLWVycm9ybWVzc2FnZSc6IDAsXG4gICdhcmlhLWZsb3d0byc6IDAsXG4gICdhcmlhLWxhYmVsbGVkYnknOiAwLFxuICAnYXJpYS1vd25zJzogMCxcbiAgJ2FyaWEtcG9zaW5zZXQnOiAwLFxuICAnYXJpYS1yb3djb3VudCc6IDAsXG4gICdhcmlhLXJvd2luZGV4JzogMCxcbiAgJ2FyaWEtcm93c3Bhbic6IDAsXG4gICdhcmlhLXNldHNpemUnOiAwXG59O1xuXG52YXIgd2FybmVkUHJvcGVydGllcyA9IHt9O1xudmFyIHJBUklBID0gbmV3IFJlZ0V4cCgnXihhcmlhKS1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgckFSSUFDYW1lbCA9IG5ldyBSZWdFeHAoJ14oYXJpYSlbQS1aXVsnICsgQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0YWdOYW1lLCBuYW1lKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAockFSSUFDYW1lbC50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgYXJpYU5hbWUgPSAnYXJpYS0nICsgbmFtZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIGNvcnJlY3ROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoYXJpYU5hbWUpID8gYXJpYU5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKGNvcnJlY3ROYW1lID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gQVJJQSBhdHRyaWJ1dGVzIGZvbGxvdyB0aGUgcGF0dGVybiBhcmlhLSogYW5kIG11c3QgYmUgbG93ZXJjYXNlLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IGNvcnJlY3ROYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIGNvcnJlY3ROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHtcbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHZhciBpbnZhbGlkUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KHR5cGUsIGtleSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcyk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVOdWxsID0gZmFsc2U7XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgaWYgKHR5cGUgIT09ICdpbnB1dCcgJiYgdHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0eXBlICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnICYmIHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgc3RyaW5nIHRvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgJyArICdmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICB2YXIgd2FybmVkUHJvcGVydGllcyQxID0ge307XG4gIHZhciBFVkVOVF9OQU1FX1JFR0VYID0gL15vbi4vO1xuICB2YXIgSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYID0gL15vblteQS1aXS87XG4gIHZhciByQVJJQSQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKS1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG4gIHZhciByQVJJQUNhbWVsJDEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbiAgdmFsaWRhdGVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gKHRhZ05hbWUsIG5hbWUsIHZhbHVlLCBldmVudFJlZ2lzdHJ5KSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwod2FybmVkUHJvcGVydGllcyQxLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNpbicgfHwgbG93ZXJDYXNlZE5hbWUgPT09ICdvbmZvY3Vzb3V0Jykge1xuICAgICAgZXJyb3IoJ1JlYWN0IHVzZXMgb25Gb2N1cyBhbmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiAnICsgJ0FsbCBSZWFjdCBldmVudHMgYXJlIG5vcm1hbGl6ZWQgdG8gYnViYmxlLCBzbyBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQgJyArICdhcmUgbm90IG5lZWRlZC9zdXBwb3J0ZWQgYnkgUmVhY3QuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IC8vIFdlIGNhbid0IHJlbHkgb24gdGhlIGV2ZW50IHN5c3RlbSBiZWluZyBpbmplY3RlZCBvbiB0aGUgc2VydmVyLlxuXG5cbiAgICBpZiAoZXZlbnRSZWdpc3RyeSAhPSBudWxsKSB7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IGV2ZW50UmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyxcbiAgICAgICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gZXZlbnRSZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdIDogbnVsbDtcblxuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGVycm9yKCdVbmtub3duIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gSXQgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAvLyBJZiBubyBldmVudCBwbHVnaW5zIGhhdmUgYmVlbiBpbmplY3RlZCwgd2UgYXJlIGluIGEgc2VydmVyIGVudmlyb25tZW50LlxuICAgICAgLy8gU28gd2UgY2FuJ3QgdGVsbCBpZiB0aGUgZXZlbnQgbmFtZSBpcyBjb3JyZWN0IGZvciBzdXJlLCBidXQgd2UgY2FuIGZpbHRlclxuICAgICAgLy8gb3V0IGtub3duIGJhZCBvbmVzIGxpa2UgYG9uY2xpY2tgLiBXZSBjYW4ndCBzdWdnZXN0IGEgc3BlY2lmaWMgcmVwbGFjZW1lbnQgdGhvdWdoLlxuICAgICAgaWYgKElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWC50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gJyArICdSZWFjdCBldmVudHMgdXNlIHRoZSBjYW1lbENhc2UgbmFtaW5nIGNvbnZlbnRpb24sIGZvciBleGFtcGxlIGBvbkNsaWNrYC4nLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gTGV0IHRoZSBBUklBIGF0dHJpYnV0ZSBob29rIHZhbGlkYXRlIEFSSUEgYXR0cmlidXRlc1xuXG5cbiAgICBpZiAockFSSUEkMS50ZXN0KG5hbWUpIHx8IHJBUklBQ2FtZWwkMS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdpbm5lcmh0bWwnKSB7XG4gICAgICBlcnJvcignRGlyZWN0bHkgc2V0dGluZyBwcm9wZXJ0eSBgaW5uZXJIVE1MYCBpcyBub3QgcGVybWl0dGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBsb29rdXAgZG9jdW1lbnRhdGlvbiBvbiBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnYXJpYScpIHtcbiAgICAgIGVycm9yKCdUaGUgYGFyaWFgIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBpbiBSZWFjdC4gJyArICdQYXNzIGluZGl2aWR1YWwgYGFyaWEtYCBhdHRyaWJ1dGVzIGluc3RlYWQuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdpcycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYSBgJXNgIGZvciBhIHN0cmluZyBhdHRyaWJ1dGUgYGlzYC4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCB0eXBlb2YgdmFsdWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsdWUpKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgTmFOIGZvciB0aGUgYCVzYCBhdHRyaWJ1dGUuIElmIHRoaXMgaXMgZXhwZWN0ZWQsIGNhc3QgJyArICd0aGUgdmFsdWUgdG8gYSBzdHJpbmcuJywgbmFtZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcGVydHlJbmZvID0gZ2V0UHJvcGVydHlJbmZvKG5hbWUpO1xuICAgIHZhciBpc1Jlc2VydmVkID0gcHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRDsgLy8gS25vd24gYXR0cmlidXRlcyBzaG91bGQgbWF0Y2ggdGhlIGNhc2luZyBzcGVjaWZpZWQgaW4gdGhlIHByb3BlcnR5IGNvbmZpZy5cblxuICAgIGlmIChwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpKSB7XG4gICAgICB2YXIgc3RhbmRhcmROYW1lID0gcG9zc2libGVTdGFuZGFyZE5hbWVzW2xvd2VyQ2FzZWROYW1lXTtcblxuICAgICAgaWYgKHN0YW5kYXJkTmFtZSAhPT0gbmFtZSkge1xuICAgICAgICBlcnJvcignSW52YWxpZCBET00gcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgc3RhbmRhcmROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1Jlc2VydmVkICYmIG5hbWUgIT09IGxvd2VyQ2FzZWROYW1lKSB7XG4gICAgICAvLyBVbmtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIGhhdmUgbG93ZXJjYXNlIGNhc2luZyBzaW5jZSB0aGF0J3MgaG93IHRoZXlcbiAgICAgIC8vIHdpbGwgYmUgY2FzZWQgYW55d2F5IHdpdGggc2VydmVyIHJlbmRlcmluZy5cbiAgICAgIGVycm9yKCdSZWFjdCBkb2VzIG5vdCByZWNvZ25pemUgdGhlIGAlc2AgcHJvcCBvbiBhIERPTSBlbGVtZW50LiBJZiB5b3UgJyArICdpbnRlbnRpb25hbGx5IHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZSBET00gYXMgYSBjdXN0b20gJyArICdhdHRyaWJ1dGUsIHNwZWxsIGl0IGFzIGxvd2VyY2FzZSBgJXNgIGluc3RlYWQuICcgKyAnSWYgeW91IGFjY2lkZW50YWxseSBwYXNzZWQgaXQgZnJvbSBhIHBhcmVudCBjb21wb25lbnQsIHJlbW92ZSAnICsgJ2l0IGZyb20gdGhlIERPTSBlbGVtZW50LicsIG5hbWUsIGxvd2VyQ2FzZWROYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyAmJiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBmYWxzZSkpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBlcnJvcignUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz1cIiVzXCIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LicsIHZhbHVlLCBuYW1lLCBuYW1lLCB2YWx1ZSwgbmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG4nICsgJ0lmIHlvdSB3YW50IHRvIHdyaXRlIGl0IHRvIHRoZSBET00sIHBhc3MgYSBzdHJpbmcgaW5zdGVhZDogJyArICclcz1cIiVzXCIgb3IgJXM9e3ZhbHVlLnRvU3RyaW5nKCl9LlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lLCBuYW1lLCBuYW1lKTtcbiAgICAgIH1cblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gTm93IHRoYXQgd2UndmUgdmFsaWRhdGVkIGNhc2luZywgZG8gbm90IHZhbGlkYXRlXG4gICAgLy8gZGF0YSB0eXBlcyBmb3IgcmVzZXJ2ZWQgcHJvcHNcblxuXG4gICAgaWYgKGlzUmVzZXJ2ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2FybiB3aGVuIGEga25vd24gYXR0cmlidXRlIGlzIGEgYmFkIHR5cGVcblxuXG4gICAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIFdhcm4gd2hlbiBwYXNzaW5nIHRoZSBzdHJpbmdzICdmYWxzZScgb3IgJ3RydWUnIGludG8gYSBib29sZWFuIHByb3BcblxuXG4gICAgaWYgKCh2YWx1ZSA9PT0gJ2ZhbHNlJyB8fCB2YWx1ZSA9PT0gJ3RydWUnKSAmJiBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCB0aGUgc3RyaW5nIGAlc2AgZm9yIHRoZSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiAnICsgJyVzICcgKyAnRGlkIHlvdSBtZWFuICVzPXslc30/JywgdmFsdWUsIG5hbWUsIHZhbHVlID09PSAnZmFsc2UnID8gJ1RoZSBicm93c2VyIHdpbGwgaW50ZXJwcmV0IGl0IGFzIGEgdHJ1dGh5IHZhbHVlLicgOiAnQWx0aG91Z2ggdGhpcyB3b3JrcywgaXQgd2lsbCBub3Qgd29yayBhcyBleHBlY3RlZCBpZiB5b3UgcGFzcyB0aGUgc3RyaW5nIFwiZmFsc2VcIi4nLCBuYW1lLCB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cblxudmFyIHdhcm5Vbmtub3duUHJvcGVydGllcyA9IGZ1bmN0aW9uICh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSkge1xuICB7XG4gICAgdmFyIHVua25vd25Qcm9wcyA9IFtdO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkkMSh0eXBlLCBrZXksIHByb3BzW2tleV0sIGV2ZW50UmVnaXN0cnkpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgdW5rbm93blByb3BzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSB1bmtub3duUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgICB9KS5qb2luKCcsICcpO1xuXG4gICAgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGVycm9yKCdJbnZhbGlkIHZhbHVlIGZvciBwcm9wICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIGl0IGZyb20gdGhlIGVsZW1lbnQsICcgKyAnb3IgcGFzcyBhIHN0cmluZyBvciBudW1iZXIgdmFsdWUgdG8ga2VlcCBpdCBpbiB0aGUgRE9NLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciAnLCB1bmtub3duUHJvcFN0cmluZywgdHlwZSk7XG4gICAgfSBlbHNlIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID4gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWVzIGZvciBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSB0aGVtIGZyb20gdGhlIGVsZW1lbnQsICcgKyAnb3IgcGFzcyBhIHN0cmluZyBvciBudW1iZXIgdmFsdWUgdG8ga2VlcCB0aGVtIGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuVW5rbm93blByb3BlcnRpZXModHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpO1xufVxuXG52YXIgSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgPSAxO1xudmFyIElTX05PTl9ERUxFR0FURUQgPSAxIDw8IDE7XG52YXIgSVNfQ0FQVFVSRV9QSEFTRSA9IDEgPDwgMjtcbi8vIHNldCB0byBMRUdBQ1lfRkJfU1VQUE9SVC4gTEVHQUNZX0ZCX1NVUFBPUlQgb25seSBnZXRzIHNldCB3aGVuXG4vLyB3ZSBjYWxsIHdpbGxEZWZlckxhdGVyRm9yTGVnYWN5RkJTdXBwb3J0LCB0aHVzIG5vdCBiYWlsaW5nIG91dFxuLy8gd2lsbCByZXN1bHQgaW4gZW5kbGVzcyBjeWNsZXMgbGlrZSBhbiBpbmZpbml0ZSBsb29wLlxuLy8gV2UgYWxzbyBkb24ndCB3YW50IHRvIGRlZmVyIGR1cmluZyBldmVudCByZXBsYXlpbmcuXG5cbnZhciBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUyA9IElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFIHwgSVNfTk9OX0RFTEVHQVRFRCB8IElTX0NBUFRVUkVfUEhBU0U7XG5cbi8vIFRoaXMgZXhpc3RzIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBSZWFjdERPTUV2ZW50UmVwbGF5aW5nXG4vLyBhbmQgRE9NUGx1Z2luRXZlbnRTeXN0ZW0uXG52YXIgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHNldFJlcGxheWluZ0V2ZW50KGV2ZW50KSB7XG4gIHtcbiAgICBpZiAoY3VycmVudFJlcGxheWluZ0V2ZW50ICE9PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBiZSBudWxsLiBUaGlzIGVycm9yICcgKyAnaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gZXZlbnQ7XG59XG5mdW5jdGlvbiByZXNldFJlcGxheWluZ0V2ZW50KCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9PT0gbnVsbCkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gbm90IGJlIG51bGwuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsO1xufVxuZnVuY3Rpb24gaXNSZXBsYXlpbmdFdmVudChldmVudCkge1xuICByZXR1cm4gZXZlbnQgPT09IGN1cnJlbnRSZXBsYXlpbmdFdmVudDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBmcm9tIGEgbmF0aXZlIGJyb3dzZXIgZXZlbnQgYnkgYWNjb3VudGluZyBmb3JcbiAqIGluY29uc2lzdGVuY2llcyBpbiBicm93c2VyIERPTSBBUElzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge0RPTUV2ZW50VGFyZ2V0fSBUYXJnZXQgbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICAvLyBGYWxsYmFjayB0byBuYXRpdmVFdmVudC5zcmNFbGVtZW50IGZvciBJRTlcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwNlxuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93OyAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzXG5cbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfSAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLlxuICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbFxuXG5cbiAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7XG59XG5cbnZhciByZXN0b3JlSW1wbCA9IG51bGw7XG52YXIgcmVzdG9yZVRhcmdldCA9IG51bGw7XG52YXIgcmVzdG9yZVF1ZXVlID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFdlIHBlcmZvcm0gdGhpcyB0cmFuc2xhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2VcbiAgLy8gYWx3YXlzIHJlY2VpdmUgdGhlIGNvcnJlY3QgZmliZXIgaGVyZVxuICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0KTtcblxuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAvLyBVbm1vdW50ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIHJlc3RvcmVJbXBsICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oKSBuZWVkcyB0byBiZSBjYWxsZWQgdG8gaGFuZGxlIGEgdGFyZ2V0IGZvciBjb250cm9sbGVkICcgKyAnZXZlbnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgdmFyIHN0YXRlTm9kZSA9IGludGVybmFsSW5zdGFuY2Uuc3RhdGVOb2RlOyAvLyBHdWFyZCBhZ2FpbnN0IEZpYmVyIGJlaW5nIHVubW91bnRlZC5cblxuICBpZiAoc3RhdGVOb2RlKSB7XG4gICAgdmFyIF9wcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUoc3RhdGVOb2RlKTtcblxuICAgIHJlc3RvcmVJbXBsKGludGVybmFsSW5zdGFuY2Uuc3RhdGVOb2RlLCBpbnRlcm5hbEluc3RhbmNlLnR5cGUsIF9wcm9wcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKGltcGwpIHtcbiAgcmVzdG9yZUltcGwgPSBpbXBsO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVN0YXRlUmVzdG9yZSh0YXJnZXQpIHtcbiAgaWYgKHJlc3RvcmVUYXJnZXQpIHtcbiAgICBpZiAocmVzdG9yZVF1ZXVlKSB7XG4gICAgICByZXN0b3JlUXVldWUucHVzaCh0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN0b3JlUXVldWUgPSBbdGFyZ2V0XTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdG9yZVRhcmdldCA9IHRhcmdldDtcbiAgfVxufVxuZnVuY3Rpb24gbmVlZHNTdGF0ZVJlc3RvcmUoKSB7XG4gIHJldHVybiByZXN0b3JlVGFyZ2V0ICE9PSBudWxsIHx8IHJlc3RvcmVRdWV1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTdGF0ZUlmTmVlZGVkKCkge1xuICBpZiAoIXJlc3RvcmVUYXJnZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdGFyZ2V0ID0gcmVzdG9yZVRhcmdldDtcbiAgdmFyIHF1ZXVlZFRhcmdldHMgPSByZXN0b3JlUXVldWU7XG4gIHJlc3RvcmVUYXJnZXQgPSBudWxsO1xuICByZXN0b3JlUXVldWUgPSBudWxsO1xuICByZXN0b3JlU3RhdGVPZlRhcmdldCh0YXJnZXQpO1xuXG4gIGlmIChxdWV1ZWRUYXJnZXRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZWRUYXJnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN0b3JlU3RhdGVPZlRhcmdldChxdWV1ZWRUYXJnZXRzW2ldKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gdGhlIHJlbmRlcmVyLiBTdWNoIGFzIHdoZW4gd2UncmUgZGlzcGF0Y2hpbmcgZXZlbnRzIG9yIGlmIHRoaXJkIHBhcnR5XG4vLyBsaWJyYXJpZXMgbmVlZCB0byBjYWxsIGJhdGNoZWRVcGRhdGVzLiBFdmVudHVhbGx5LCB0aGlzIEFQSSB3aWxsIGdvIGF3YXkgd2hlblxuLy8gZXZlcnl0aGluZyBpcyBiYXRjaGVkIGJ5IGRlZmF1bHQuIFdlJ2xsIHRoZW4gaGF2ZSBhIHNpbWlsYXIgQVBJIHRvIG9wdC1vdXQgb2Zcbi8vIHNjaGVkdWxlZCB3b3JrIGFuZCBpbnN0ZWFkIGRvIHN5bmNocm9ub3VzIHdvcmsuXG4vLyBEZWZhdWx0c1xuXG52YXIgYmF0Y2hlZFVwZGF0ZXNJbXBsID0gZnVuY3Rpb24gKGZuLCBib29ra2VlcGluZykge1xuICByZXR1cm4gZm4oYm9va2tlZXBpbmcpO1xufTtcblxudmFyIGZsdXNoU3luY0ltcGwgPSBmdW5jdGlvbiAoKSB7fTtcblxudmFyIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZpbmlzaEV2ZW50SGFuZGxlcigpIHtcbiAgLy8gSGVyZSB3ZSB3YWl0IHVudGlsIGFsbCB1cGRhdGVzIGhhdmUgcHJvcGFnYXRlZCwgd2hpY2ggaXMgaW1wb3J0YW50XG4gIC8vIHdoZW4gdXNpbmcgY29udHJvbGxlZCBjb21wb25lbnRzIHdpdGhpbiBsYXllcnM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OFxuICAvLyBUaGVuIHdlIHJlc3RvcmUgc3RhdGUgb2YgYW55IGNvbnRyb2xsZWQgY29tcG9uZW50LlxuICB2YXIgY29udHJvbGxlZENvbXBvbmVudHNIYXZlUGVuZGluZ1VwZGF0ZXMgPSBuZWVkc1N0YXRlUmVzdG9yZSgpO1xuXG4gIGlmIChjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcykge1xuICAgIC8vIElmIGEgY29udHJvbGxlZCBldmVudCB3YXMgZmlyZWQsIHdlIG1heSBuZWVkIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mXG4gICAgLy8gdGhlIERPTSBub2RlIGJhY2sgdG8gdGhlIGNvbnRyb2xsZWQgdmFsdWUuIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gUmVhY3RcbiAgICAvLyBiYWlscyBvdXQgb2YgdGhlIHVwZGF0ZSB3aXRob3V0IHRvdWNoaW5nIHRoZSBET00uXG4gICAgLy8gVE9ETzogUmVzdG9yZSBzdGF0ZSBpbiB0aGUgbWljcm90YXNrLCBhZnRlciB0aGUgZGlzY3JldGUgdXBkYXRlcyBmbHVzaCxcbiAgICAvLyBpbnN0ZWFkIG9mIGVhcmx5IGZsdXNoaW5nIHRoZW0gaGVyZS5cbiAgICBmbHVzaFN5bmNJbXBsKCk7XG4gICAgcmVzdG9yZVN0YXRlSWZOZWVkZWQoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyhmbiwgYSwgYikge1xuICBpZiAoaXNJbnNpZGVFdmVudEhhbmRsZXIpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYSwgYik7XG4gIH1cblxuICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYmF0Y2hlZFVwZGF0ZXNJbXBsKGZuLCBhLCBiKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xuICAgIGZpbmlzaEV2ZW50SGFuZGxlcigpO1xuICB9XG59IC8vIFRPRE86IFJlcGxhY2Ugd2l0aCBmbHVzaFN5bmNcbmZ1bmN0aW9uIHNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oX2JhdGNoZWRVcGRhdGVzSW1wbCwgX2Rpc2NyZXRlVXBkYXRlc0ltcGwsIF9mbHVzaFN5bmNJbXBsKSB7XG4gIGJhdGNoZWRVcGRhdGVzSW1wbCA9IF9iYXRjaGVkVXBkYXRlc0ltcGw7XG4gIGZsdXNoU3luY0ltcGwgPSBfZmx1c2hTeW5jSW1wbDtcbn1cblxuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHtcbiAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnO1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmV2ZW50TW91c2VFdmVudChuYW1lLCB0eXBlLCBwcm9wcykge1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdvbkNsaWNrJzpcbiAgICBjYXNlICdvbkNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGljayc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VEb3duJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bkNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZUNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VVcCc6XG4gICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZUVudGVyJzpcbiAgICAgIHJldHVybiAhIShwcm9wcy5kaXNhYmxlZCAmJiBpc0ludGVyYWN0aXZlKHR5cGUpKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAqIEByZXR1cm4gez9mdW5jdGlvbn0gVGhlIHN0b3JlZCBjYWxsYmFjay5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgdmFyIHN0YXRlTm9kZSA9IGluc3Quc3RhdGVOb2RlO1xuXG4gIGlmIChzdGF0ZU5vZGUgPT09IG51bGwpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzIChleDogb25sb2FkIGV2ZW50cyBpbiBpbmNyZW1lbnRhbCBtb2RlKS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUoc3RhdGVOb2RlKTtcblxuICBpZiAocHJvcHMgPT09IG51bGwpIHtcbiAgICAvLyBXb3JrIGluIHByb2dyZXNzLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gcHJvcHNbcmVnaXN0cmF0aW9uTmFtZV07XG5cbiAgaWYgKHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGluc3QudHlwZSwgcHJvcHMpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlzdGVuZXIgJiYgdHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgYFwiICsgcmVnaXN0cmF0aW9uTmFtZSArIFwiYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGBcIiArIHR5cGVvZiBsaXN0ZW5lciArIFwiYCB0eXBlLlwiKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxudmFyIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gZmFsc2U7IC8vIENoZWNrIGlmIGJyb3dzZXIgc3VwcG9ydCBldmVudHMgd2l0aCBwYXNzaXZlIGxpc3RlbmVyc1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXIjU2FmZWx5X2RldGVjdGluZ19vcHRpb25fc3VwcG9ydFxuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHRyeSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7fTsgLy8gJEZsb3dGaXhNZTogSWdub3JlIEZsb3cgY29tcGxhaW5pbmcgYWJvdXQgbmVlZGluZyBhIHZhbHVlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9ucywgJ3Bhc3NpdmUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0Jywgb3B0aW9ucywgb3B0aW9ucyk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZChuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBmdW5jQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG5cbiAgdHJ5IHtcbiAgICBmdW5jLmFwcGx5KGNvbnRleHQsIGZ1bmNBcmdzKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICB9XG59XG5cbnZhciBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gaW52b2tlR3VhcmRlZENhbGxiYWNrUHJvZDtcblxue1xuICAvLyBJbiBERVYgbW9kZSwgd2Ugc3dhcCBvdXQgaW52b2tlR3VhcmRlZENhbGxiYWNrIGZvciBhIHNwZWNpYWwgdmVyc2lvblxuICAvLyB0aGF0IHBsYXlzIG1vcmUgbmljZWx5IHdpdGggdGhlIGJyb3dzZXIncyBEZXZUb29scy4gVGhlIGlkZWEgaXMgdG8gcHJlc2VydmVcbiAgLy8gXCJQYXVzZSBvbiBleGNlcHRpb25zXCIgYmVoYXZpb3IuIEJlY2F1c2UgUmVhY3Qgd3JhcHMgYWxsIHVzZXItcHJvdmlkZWRcbiAgLy8gZnVuY3Rpb25zIGluIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYW5kIHRoZSBwcm9kdWN0aW9uIHZlcnNpb24gb2ZcbiAgLy8gaW52b2tlR3VhcmRlZENhbGxiYWNrIHVzZXMgYSB0cnktY2F0Y2gsIGFsbCB1c2VyIGV4Y2VwdGlvbnMgYXJlIHRyZWF0ZWRcbiAgLy8gbGlrZSBjYXVnaHQgZXhjZXB0aW9ucywgYW5kIHRoZSBEZXZUb29scyB3b24ndCBwYXVzZSB1bmxlc3MgdGhlIGRldmVsb3BlclxuICAvLyB0YWtlcyB0aGUgZXh0cmEgc3RlcCBvZiBlbmFibGluZyBwYXVzZSBvbiBjYXVnaHQgZXhjZXB0aW9ucy4gVGhpcyBpc1xuICAvLyB1bmludHVpdGl2ZSwgdGhvdWdoLCBiZWNhdXNlIGV2ZW4gdGhvdWdoIFJlYWN0IGhhcyBjYXVnaHQgdGhlIGVycm9yLCBmcm9tXG4gIC8vIHRoZSBkZXZlbG9wZXIncyBwZXJzcGVjdGl2ZSwgdGhlIGVycm9yIGlzIHVuY2F1Z2h0LlxuICAvL1xuICAvLyBUbyBwcmVzZXJ2ZSB0aGUgZXhwZWN0ZWQgXCJQYXVzZSBvbiBleGNlcHRpb25zXCIgYmVoYXZpb3IsIHdlIGRvbid0IHVzZSBhXG4gIC8vIHRyeS1jYXRjaCBpbiBERVYuIEluc3RlYWQsIHdlIHN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggYSBmYWtlIGV2ZW50IHRvIGEgZmFrZVxuICAvLyBET00gbm9kZSwgYW5kIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgZnJvbSBpbnNpZGUgYW4gZXZlbnQgaGFuZGxlclxuICAvLyBmb3IgdGhhdCBmYWtlIGV2ZW50LiBJZiB0aGUgY2FsbGJhY2sgdGhyb3dzLCB0aGUgZXJyb3IgaXMgXCJjYXB0dXJlZFwiIHVzaW5nXG4gIC8vIGEgZ2xvYmFsIGV2ZW50IGhhbmRsZXIuIEJ1dCBiZWNhdXNlIHRoZSBlcnJvciBoYXBwZW5zIGluIGEgZGlmZmVyZW50XG4gIC8vIGV2ZW50IGxvb3AgY29udGV4dCwgaXQgZG9lcyBub3QgaW50ZXJydXB0IHRoZSBub3JtYWwgcHJvZ3JhbSBmbG93LlxuICAvLyBFZmZlY3RpdmVseSwgdGhpcyBnaXZlcyB1cyB0cnktY2F0Y2ggYmVoYXZpb3Igd2l0aG91dCBhY3R1YWxseSB1c2luZ1xuICAvLyB0cnktY2F0Y2guIE5lYXQhXG4gIC8vIENoZWNrIHRoYXQgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEFQSXMgd2UgbmVlZCB0byBpbXBsZW1lbnQgb3VyIHNwZWNpYWxcbiAgLy8gREVWIHZlcnNpb24gb2YgaW52b2tlR3VhcmRlZENhbGxiYWNrXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmFrZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyZWFjdCcpO1xuXG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCA9IGZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja0RldihuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgICAvLyBJZiBkb2N1bWVudCBkb2Vzbid0IGV4aXN0IHdlIGtub3cgZm9yIHN1cmUgd2Ugd2lsbCBjcmFzaCBpbiB0aGlzIG1ldGhvZFxuICAgICAgLy8gd2hlbiB3ZSBjYWxsIGRvY3VtZW50LmNyZWF0ZUV2ZW50KCkuIEhvd2V2ZXIgdGhpcyBjYW4gY2F1c2UgY29uZnVzaW5nXG4gICAgICAvLyBlcnJvcnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9jcmVhdGUtcmVhY3QtYXBwL2lzc3Vlcy8zNDgyXG4gICAgICAvLyBTbyB3ZSBwcmVlbXB0aXZlbHkgdGhyb3cgd2l0aCBhIGJldHRlciBtZXNzYWdlIGluc3RlYWQuXG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyB8fCBkb2N1bWVudCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgZG9jdW1lbnRgIGdsb2JhbCB3YXMgZGVmaW5lZCB3aGVuIFJlYWN0IHdhcyBpbml0aWFsaXplZCwgYnV0IGlzIG5vdCAnICsgJ2RlZmluZWQgYW55bW9yZS4gVGhpcyBjYW4gaGFwcGVuIGluIGEgdGVzdCBlbnZpcm9ubWVudCBpZiBhIGNvbXBvbmVudCAnICsgJ3NjaGVkdWxlcyBhbiB1cGRhdGUgZnJvbSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGJ1dCB0aGUgdGVzdCBoYXMgYWxyZWFkeSAnICsgJ2ZpbmlzaGVkIHJ1bm5pbmcuIFRvIHNvbHZlIHRoaXMsIHlvdSBjYW4gZWl0aGVyIHVubW91bnQgdGhlIGNvbXBvbmVudCBhdCAnICsgJ3RoZSBlbmQgb2YgeW91ciB0ZXN0IChhbmQgZW5zdXJlIHRoYXQgYW55IGFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGdldCAnICsgJ2NhbmNlbGVkIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGApLCBvciB5b3UgY2FuIGNoYW5nZSB0aGUgdGVzdCBpdHNlbGYgJyArICd0byBiZSBhc3luY2hyb25vdXMuJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgIHZhciBkaWRDYWxsID0gZmFsc2U7IC8vIEtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgdGhyZXcgYW4gZXJyb3IuIFdlXG4gICAgICAvLyBzZXQgdGhpcyB0byB0cnVlIGF0IHRoZSBiZWdpbm5pbmcsIHRoZW4gc2V0IGl0IHRvIGZhbHNlIHJpZ2h0IGFmdGVyXG4gICAgICAvLyBjYWxsaW5nIHRoZSBmdW5jdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIGVycm9ycywgYGRpZEVycm9yYCB3aWxsIG5ldmVyIGJlXG4gICAgICAvLyBzZXQgdG8gZmFsc2UuIFRoaXMgc3RyYXRlZ3kgd29ya3MgZXZlbiBpZiB0aGUgYnJvd3NlciBpcyBmbGFreSBhbmRcbiAgICAgIC8vIGZhaWxzIHRvIGNhbGwgb3VyIGdsb2JhbCBlcnJvciBoYW5kbGVyLCBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVseSBvblxuICAgICAgLy8gdGhlIGVycm9yIGV2ZW50IGF0IGFsbC5cblxuICAgICAgdmFyIGRpZEVycm9yID0gdHJ1ZTsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHZhbHVlIG9mIHdpbmRvdy5ldmVudCBzbyB0aGF0IHdlIGNhbiByZXNldCBpdFxuICAgICAgLy8gZHVyaW5nIHRoZSBjYWxsYmFjayB0byBsZXQgdXNlciBjb2RlIGFjY2VzcyB3aW5kb3cuZXZlbnQgaW4gdGhlXG4gICAgICAvLyBicm93c2VycyB0aGF0IHN1cHBvcnQgaXQuXG5cbiAgICAgIHZhciB3aW5kb3dFdmVudCA9IHdpbmRvdy5ldmVudDsgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIGRlc2NyaXB0b3Igb2Ygd2luZG93LmV2ZW50IHRvIHJlc3RvcmUgaXQgYWZ0ZXIgZXZlbnRcbiAgICAgIC8vIGRpc3BhdGNoaW5nOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjg4XG5cbiAgICAgIHZhciB3aW5kb3dFdmVudERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2V2ZW50Jyk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlc3RvcmVBZnRlckRpc3BhdGNoKCkge1xuICAgICAgICAvLyBXZSBpbW1lZGlhdGVseSByZW1vdmUgdGhlIGNhbGxiYWNrIGZyb20gZXZlbnQgbGlzdGVuZXJzIHNvIHRoYXRcbiAgICAgICAgLy8gbmVzdGVkIGBpbnZva2VHdWFyZGVkQ2FsbGJhY2tgIGNhbGxzIGRvIG5vdCBjbGFzaC4gT3RoZXJ3aXNlLCBhXG4gICAgICAgIC8vIG5lc3RlZCBjYWxsIHdvdWxkIHRyaWdnZXIgdGhlIGZha2UgZXZlbnQgaGFuZGxlcnMgb2YgYW55IGNhbGwgaGlnaGVyXG4gICAgICAgIC8vIGluIHRoZSBzdGFjay5cbiAgICAgICAgZmFrZU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBjYWxsQ2FsbGJhY2ssIGZhbHNlKTsgLy8gV2UgY2hlY2sgZm9yIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSB0byBwcmV2ZW50IHRoZVxuICAgICAgICAvLyB3aW5kb3cuZXZlbnQgYXNzaWdubWVudCBpbiBib3RoIElFIDw9IDEwIGFzIHRoZXkgdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgLy8gXCJNZW1iZXIgbm90IGZvdW5kXCIgaW4gc3RyaWN0IG1vZGUsIGFuZCBpbiBGaXJlZm94IHdoaWNoIGRvZXMgbm90XG4gICAgICAgIC8vIHN1cHBvcnQgd2luZG93LmV2ZW50LlxuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmV2ZW50ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2V2ZW50JykpIHtcbiAgICAgICAgICB3aW5kb3cuZXZlbnQgPSB3aW5kb3dFdmVudDtcbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYW4gZXZlbnQgaGFuZGxlciBmb3Igb3VyIGZha2UgZXZlbnQuIFdlIHdpbGwgc3luY2hyb25vdXNseVxuICAgICAgLy8gZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQgdXNpbmcgYGRpc3BhdGNoRXZlbnRgLiBJbnNpZGUgdGhlIGhhbmRsZXIsIHdlXG4gICAgICAvLyBjYWxsIHRoZSB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrLlxuXG5cbiAgICAgIHZhciBmdW5jQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMyk7XG5cbiAgICAgIGZ1bmN0aW9uIGNhbGxDYWxsYmFjaygpIHtcbiAgICAgICAgZGlkQ2FsbCA9IHRydWU7XG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICAgICAgICBkaWRFcnJvciA9IGZhbHNlO1xuICAgICAgfSAvLyBDcmVhdGUgYSBnbG9iYWwgZXJyb3IgZXZlbnQgaGFuZGxlci4gV2UgdXNlIHRoaXMgdG8gY2FwdHVyZSB0aGUgdmFsdWVcbiAgICAgIC8vIHRoYXQgd2FzIHRocm93bi4gSXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgZXJyb3IgaGFuZGxlciB3aWxsIGZpcmUgbW9yZVxuICAgICAgLy8gdGhhbiBvbmNlOyBmb3IgZXhhbXBsZSwgaWYgbm9uLVJlYWN0IGNvZGUgYWxzbyBjYWxscyBgZGlzcGF0Y2hFdmVudGBcbiAgICAgIC8vIGFuZCBhIGhhbmRsZXIgZm9yIHRoYXQgZXZlbnQgdGhyb3dzLiBXZSBzaG91bGQgYmUgcmVzaWxpZW50IHRvIG1vc3Qgb2ZcbiAgICAgIC8vIHRob3NlIGNhc2VzLiBFdmVuIGlmIG91ciBlcnJvciBldmVudCBoYW5kbGVyIGZpcmVzIG1vcmUgdGhhbiBvbmNlLCB0aGVcbiAgICAgIC8vIGxhc3QgZXJyb3IgZXZlbnQgaXMgYWx3YXlzIHVzZWQuIElmIHRoZSBjYWxsYmFjayBhY3R1YWxseSBkb2VzIGVycm9yLFxuICAgICAgLy8gd2Uga25vdyB0aGF0IHRoZSBsYXN0IGVycm9yIGV2ZW50IGlzIHRoZSBjb3JyZWN0IG9uZSwgYmVjYXVzZSBpdCdzIG5vdFxuICAgICAgLy8gcG9zc2libGUgZm9yIGFueXRoaW5nIGVsc2UgdG8gaGF2ZSBoYXBwZW5lZCBpbiBiZXR3ZWVuIG91ciBjYWxsYmFja1xuICAgICAgLy8gZXJyb3JpbmcgYW5kIHRoZSBjb2RlIHRoYXQgZm9sbG93cyB0aGUgYGRpc3BhdGNoRXZlbnRgIGNhbGwgYmVsb3cuIElmXG4gICAgICAvLyB0aGUgY2FsbGJhY2sgZG9lc24ndCBlcnJvciwgYnV0IHRoZSBlcnJvciBldmVudCB3YXMgZmlyZWQsIHdlIGtub3cgdG9cbiAgICAgIC8vIGlnbm9yZSBpdCBiZWNhdXNlIGBkaWRFcnJvcmAgd2lsbCBiZSBmYWxzZSwgYXMgZGVzY3JpYmVkIGFib3ZlLlxuXG5cbiAgICAgIHZhciBlcnJvcjsgLy8gVXNlIHRoaXMgdG8gdHJhY2sgd2hldGhlciB0aGUgZXJyb3IgZXZlbnQgaXMgZXZlciBjYWxsZWQuXG5cbiAgICAgIHZhciBkaWRTZXRFcnJvciA9IGZhbHNlO1xuICAgICAgdmFyIGlzQ3Jvc3NPcmlnaW5FcnJvciA9IGZhbHNlO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVXaW5kb3dFcnJvcihldmVudCkge1xuICAgICAgICBlcnJvciA9IGV2ZW50LmVycm9yO1xuICAgICAgICBkaWRTZXRFcnJvciA9IHRydWU7XG5cbiAgICAgICAgaWYgKGVycm9yID09PSBudWxsICYmIGV2ZW50LmNvbG5vID09PSAwICYmIGV2ZW50LmxpbmVubyA9PT0gMCkge1xuICAgICAgICAgIGlzQ3Jvc3NPcmlnaW5FcnJvciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IgaGFuZGxlciBoYXMgcHJldmVudGVkIGRlZmF1bHQuXG4gICAgICAgICAgLy8gQnJvd3NlcnMgc2lsZW5jZSB0aGUgZXJyb3IgcmVwb3J0IGlmIHRoaXMgaGFwcGVucy5cbiAgICAgICAgICAvLyBXZSdsbCByZW1lbWJlciB0aGlzIHRvIGxhdGVyIGRlY2lkZSB3aGV0aGVyIHRvIGxvZyBpdCBvciBub3QuXG4gICAgICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZXJyb3IuX3N1cHByZXNzTG9nZ2luZyA9IHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChpbm5lcikgey8vIElnbm9yZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gQ3JlYXRlIGEgZmFrZSBldmVudCB0eXBlLlxuXG5cbiAgICAgIHZhciBldnRUeXBlID0gXCJyZWFjdC1cIiArIChuYW1lID8gbmFtZSA6ICdpbnZva2VndWFyZGVkY2FsbGJhY2snKTsgLy8gQXR0YWNoIG91ciBldmVudCBoYW5kbGVyc1xuXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBoYW5kbGVXaW5kb3dFcnJvcik7XG4gICAgICBmYWtlTm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBTeW5jaHJvbm91c2x5IGRpc3BhdGNoIG91ciBmYWtlIGV2ZW50LiBJZiB0aGUgdXNlci1wcm92aWRlZCBmdW5jdGlvblxuICAgICAgLy8gZXJyb3JzLCBpdCB3aWxsIHRyaWdnZXIgb3VyIGdsb2JhbCBlcnJvciBoYW5kbGVyLlxuXG4gICAgICBldnQuaW5pdEV2ZW50KGV2dFR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gICAgICBmYWtlTm9kZS5kaXNwYXRjaEV2ZW50KGV2dCk7XG5cbiAgICAgIGlmICh3aW5kb3dFdmVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2V2ZW50Jywgd2luZG93RXZlbnREZXNjcmlwdG9yKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZENhbGwgJiYgZGlkRXJyb3IpIHtcbiAgICAgICAgaWYgKCFkaWRTZXRFcnJvcikge1xuICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBlcnJvcmVkLCBidXQgdGhlIGVycm9yIGV2ZW50IG5ldmVyIGZpcmVkLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0FuIGVycm9yIHdhcyB0aHJvd24gaW5zaWRlIG9uZSBvZiB5b3VyIGNvbXBvbmVudHMsIGJ1dCBSZWFjdCAnICsgXCJkb2Vzbid0IGtub3cgd2hhdCBpdCB3YXMuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBicm93c2VyIFwiICsgJ2ZsYWtpbmVzcy4gUmVhY3QgZG9lcyBpdHMgYmVzdCB0byBwcmVzZXJ2ZSB0aGUgXCJQYXVzZSBvbiAnICsgJ2V4Y2VwdGlvbnNcIiBiZWhhdmlvciBvZiB0aGUgRGV2VG9vbHMsIHdoaWNoIHJlcXVpcmVzIHNvbWUgJyArIFwiREVWLW1vZGUgb25seSB0cmlja3MuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVzZSBkb24ndCB3b3JrIGluIFwiICsgJ3lvdXIgYnJvd3Nlci4gVHJ5IHRyaWdnZXJpbmcgdGhlIGVycm9yIGluIHByb2R1Y3Rpb24gbW9kZSwgJyArICdvciBzd2l0Y2hpbmcgdG8gYSBtb2Rlcm4gYnJvd3Nlci4gSWYgeW91IHN1c3BlY3QgdGhhdCB0aGlzIGlzICcgKyAnYWN0dWFsbHkgYW4gaXNzdWUgd2l0aCBSZWFjdCwgcGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDcm9zc09yaWdpbkVycm9yKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcIkEgY3Jvc3Mtb3JpZ2luIGVycm9yIHdhcyB0aHJvd24uIFJlYWN0IGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gXCIgKyAndGhlIGFjdHVhbCBlcnJvciBvYmplY3QgaW4gZGV2ZWxvcG1lbnQuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jcm9zc29yaWdpbi1lcnJvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICB9IC8vIFJlbW92ZSBvdXIgZXZlbnQgbGlzdGVuZXJzXG5cblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgaGFuZGxlV2luZG93RXJyb3IpO1xuXG4gICAgICBpZiAoIWRpZENhbGwpIHtcbiAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgcmVhbGx5IHdyb25nLCBhbmQgb3VyIGV2ZW50IHdhcyBub3QgZGlzcGF0Y2hlZC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjczNFxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2NTg1XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgcHJvZHVjdGlvbiBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgcmV0dXJuIGludm9rZUd1YXJkZWRDYWxsYmFja1Byb2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbnZhciBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsO1xuXG52YXIgaGFzRXJyb3IgPSBmYWxzZTtcbnZhciBjYXVnaHRFcnJvciA9IG51bGw7IC8vIFVzZWQgYnkgZXZlbnQgc3lzdGVtIHRvIGNhcHR1cmUvcmV0aHJvdyB0aGUgZmlyc3QgZXJyb3IuXG5cbnZhciBoYXNSZXRocm93RXJyb3IgPSBmYWxzZTtcbnZhciByZXRocm93RXJyb3IgPSBudWxsO1xudmFyIHJlcG9ydGVyID0ge1xuICBvbkVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgfVxufTtcbi8qKlxuICogQ2FsbCBhIGZ1bmN0aW9uIHdoaWxlIGd1YXJkaW5nIGFnYWluc3QgZXJyb3JzIHRoYXQgaGFwcGVucyB3aXRoaW4gaXQuXG4gKiBSZXR1cm5zIGFuIGVycm9yIGlmIGl0IHRocm93cywgb3RoZXJ3aXNlIG51bGwuXG4gKlxuICogSW4gcHJvZHVjdGlvbiwgdGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHRyeS1jYXRjaC4gVGhlIHJlYXNvbiB3ZSBkb24ndFxuICogdXNlIGEgdHJ5LWNhdGNoIGRpcmVjdGx5IGlzIHNvIHRoYXQgd2UgY2FuIHN3YXAgb3V0IGEgZGlmZmVyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiBpbiBERVYgbW9kZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcmd1bWVudHMgZm9yIGZ1bmN0aW9uXG4gKi9cblxuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsJDEuYXBwbHkocmVwb3J0ZXIsIGFyZ3VtZW50cyk7XG59XG4vKipcbiAqIFNhbWUgYXMgaW52b2tlR3VhcmRlZENhbGxiYWNrLCBidXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IsIGl0IHN0b3Jlc1xuICogaXQgaW4gYSBnbG9iYWwgc28gaXQgY2FuIGJlIHJldGhyb3duIGJ5IGByZXRocm93Q2F1Z2h0RXJyb3JgIGxhdGVyLlxuICogVE9ETzogU2VlIGlmIGNhdWdodEVycm9yIGFuZCByZXRocm93RXJyb3IgY2FuIGJlIHVuaWZpZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFja0FuZENhdGNoRmlyc3RFcnJvcihuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgIGlmICghaGFzUmV0aHJvd0Vycm9yKSB7XG4gICAgICBoYXNSZXRocm93RXJyb3IgPSB0cnVlO1xuICAgICAgcmV0aHJvd0Vycm9yID0gZXJyb3I7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIER1cmluZyBleGVjdXRpb24gb2YgZ3VhcmRlZCBmdW5jdGlvbnMgd2Ugd2lsbCBjYXB0dXJlIHRoZSBmaXJzdCBlcnJvciB3aGljaFxuICogd2Ugd2lsbCByZXRocm93IHRvIGJlIGhhbmRsZWQgYnkgdGhlIHRvcCBsZXZlbCBlcnJvciBoYW5kbGVyLlxuICovXG5cbmZ1bmN0aW9uIHJldGhyb3dDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc1JldGhyb3dFcnJvcikge1xuICAgIHZhciBlcnJvciA9IHJldGhyb3dFcnJvcjtcbiAgICBoYXNSZXRocm93RXJyb3IgPSBmYWxzZTtcbiAgICByZXRocm93RXJyb3IgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5mdW5jdGlvbiBoYXNDYXVnaHRFcnJvcigpIHtcbiAgcmV0dXJuIGhhc0Vycm9yO1xufVxuZnVuY3Rpb24gY2xlYXJDYXVnaHRFcnJvcigpIHtcbiAgaWYgKGhhc0Vycm9yKSB7XG4gICAgdmFyIGVycm9yID0gY2F1Z2h0RXJyb3I7XG4gICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICBjYXVnaHRFcnJvciA9IG51bGw7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJDYXVnaHRFcnJvciB3YXMgY2FsbGVkIGJ1dCBubyBlcnJvciB3YXMgY2FwdHVyZWQuIFRoaXMgZXJyb3IgJyArICdpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIGBSZWFjdEluc3RhbmNlTWFwYCBtYWludGFpbnMgYSBtYXBwaW5nIGZyb20gYSBwdWJsaWMgZmFjaW5nIHN0YXRlZnVsXG4gKiBpbnN0YW5jZSAoa2V5KSBhbmQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uICh2YWx1ZSkuIFRoaXMgYWxsb3dzIHB1YmxpY1xuICogbWV0aG9kcyB0byBhY2NlcHQgdGhlIHVzZXIgZmFjaW5nIGluc3RhbmNlIGFzIGFuIGFyZ3VtZW50IGFuZCBtYXAgdGhlbSBiYWNrXG4gKiB0byBpbnRlcm5hbCBtZXRob2RzLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG1vZHVsZSBpcyBjdXJyZW50bHkgc2hhcmVkIGFuZCBhc3N1bWVkIHRvIGJlIHN0YXRlbGVzcy5cbiAqIElmIHRoaXMgYmVjb21lcyBhbiBhY3R1YWwgTWFwLCB0aGF0IHdpbGwgYnJlYWsuXG4gKi9cbmZ1bmN0aW9uIGdldChrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHM7XG59XG5mdW5jdGlvbiBoYXMoa2V5KSB7XG4gIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxzICE9PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICBrZXkuX3JlYWN0SW50ZXJuYWxzID0gdmFsdWU7XG59XG5cbi8vIERvbid0IGNoYW5nZSB0aGVzZSB0d28gdmFsdWVzLiBUaGV5J3JlIHVzZWQgYnkgUmVhY3QgRGV2IFRvb2xzLlxudmFyIE5vRmxhZ3MgPVxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgUGVyZm9ybWVkV29yayA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTsgLy8gWW91IGNhbiBjaGFuZ2UgdGhlIHJlc3QgKGFuZCBhZGQgbW9yZSkuXG5cbnZhciBQbGFjZW1lbnQgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yO1xudmFyIFVwZGF0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQ7XG52YXIgQ2hpbGREZWxldGlvbiA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ29udGVudFJlc2V0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgQ2FsbGJhY2sgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgRGlkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIEZvcmNlQ2xpZW50UmVuZGVyID1cbi8qICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBSZWYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7XG52YXIgU25hcHNob3QgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBQYXNzaXZlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG4yMDQ4O1xudmFyIEh5ZHJhdGluZyA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVmlzaWJpbGl0eSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuODE5MjtcbnZhciBTdG9yZUNvbnNpc3RlbmN5ID1cbi8qICAgICAgICAgICAgICovXG4xNjM4NDtcbnZhciBMaWZlY3ljbGVFZmZlY3RNYXNrID0gUGFzc2l2ZSB8IFVwZGF0ZSB8IENhbGxiYWNrIHwgUmVmIHwgU25hcHNob3QgfCBTdG9yZUNvbnNpc3RlbmN5OyAvLyBVbmlvbiBvZiBhbGwgY29tbWl0IGZsYWdzIChmbGFncyB3aXRoIHRoZSBsaWZldGltZSBvZiBhIHBhcnRpY3VsYXIgY29tbWl0KVxuXG52YXIgSG9zdEVmZmVjdE1hc2sgPVxuLyogICAgICAgICAgICAgICAqL1xuMzI3Njc7IC8vIFRoZXNlIGFyZSBub3QgcmVhbGx5IHNpZGUgZWZmZWN0cywgYnV0IHdlIHN0aWxsIHJldXNlIHRoaXMgZmllbGQuXG5cbnZhciBJbmNvbXBsZXRlID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4zMjc2ODtcbnZhciBTaG91bGRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICovXG42NTUzNjtcbnZhciBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlID1cbi8qICovXG4xMzEwNzI7XG52YXIgRm9ya2VkID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTA0ODU3NjsgLy8gU3RhdGljIHRhZ3MgZGVzY3JpYmUgYXNwZWN0cyBvZiBhIGZpYmVyIHRoYXQgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlcixcbi8vIGUuZy4gYSBmaWJlciB1c2VzIGEgcGFzc2l2ZSBlZmZlY3QgKGV2ZW4gaWYgdGhlcmUgYXJlIG5vIHVwZGF0ZXMgb24gdGhpcyBwYXJ0aWN1bGFyIHJlbmRlcikuXG4vLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGVmZXIgbW9yZSB3b3JrIGluIHRoZSB1bm1vdW50IGNhc2UsXG4vLyBzaW5jZSB3ZSBjYW4gZGVmZXIgdHJhdmVyc2luZyB0aGUgdHJlZSBkdXJpbmcgbGF5b3V0IHRvIGxvb2sgZm9yIFBhc3NpdmUgZWZmZWN0cyxcbi8vIGFuZCBpbnN0ZWFkIHJlbHkgb24gdGhlIHN0YXRpYyBmbGFnIGFzIGEgc2lnbmFsIHRoYXQgdGhlcmUgbWF5IGJlIGNsZWFudXAgd29yay5cblxudmFyIFJlZlN0YXRpYyA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjIwOTcxNTI7XG52YXIgTGF5b3V0U3RhdGljID1cbi8qICAgICAgICAgICAgICAgICAqL1xuNDE5NDMwNDtcbnZhciBQYXNzaXZlU3RhdGljID1cbi8qICAgICAgICAgICAgICAgICovXG44Mzg4NjA4OyAvLyBUaGVzZSBmbGFncyBhbGxvdyB1cyB0byB0cmF2ZXJzZSB0byBmaWJlcnMgdGhhdCBoYXZlIGVmZmVjdHMgb24gbW91bnRcbi8vIHdpdGhvdXQgdHJhdmVyc2luZyB0aGUgZW50aXJlIHRyZWUgYWZ0ZXIgZXZlcnkgY29tbWl0IGZvclxuLy8gZG91YmxlIGludm9raW5nXG5cbnZhciBNb3VudExheW91dERldiA9XG4vKiAgICAgICAgICAgICAgICovXG4xNjc3NzIxNjtcbnZhciBNb3VudFBhc3NpdmVEZXYgPVxuLyogICAgICAgICAgICAgICovXG4zMzU1NDQzMjsgLy8gR3JvdXBzIG9mIGZsYWdzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGNvbW1pdCBwaGFzZSB0byBza2lwIG92ZXIgdHJlZXMgdGhhdFxuLy8gZG9uJ3QgY29udGFpbiBlZmZlY3RzLCBieSBjaGVja2luZyBzdWJ0cmVlRmxhZ3MuXG5cbnZhciBCZWZvcmVNdXRhdGlvbk1hc2sgPSAvLyBUT0RPOiBSZW1vdmUgVXBkYXRlIGZsYWcgZnJvbSBiZWZvcmUgbXV0YXRpb24gcGhhc2UgYnkgcmUtbGFuZGluZyBWaXNpYmlsaXR5XG4vLyBmbGFnIGxvZ2ljIChzZWUgIzIwMDQzKVxuVXBkYXRlIHwgU25hcHNob3QgfCAoIDApO1xudmFyIE11dGF0aW9uTWFzayA9IFBsYWNlbWVudCB8IFVwZGF0ZSB8IENoaWxkRGVsZXRpb24gfCBDb250ZW50UmVzZXQgfCBSZWYgfCBIeWRyYXRpbmcgfCBWaXNpYmlsaXR5O1xudmFyIExheW91dE1hc2sgPSBVcGRhdGUgfCBDYWxsYmFjayB8IFJlZiB8IFZpc2liaWxpdHk7IC8vIFRPRE86IFNwbGl0IGludG8gUGFzc2l2ZU1vdW50TWFzayBhbmQgUGFzc2l2ZVVubW91bnRNYXNrXG5cbnZhciBQYXNzaXZlTWFzayA9IFBhc3NpdmUgfCBDaGlsZERlbGV0aW9uOyAvLyBVbmlvbiBvZiB0YWdzIHRoYXQgZG9uJ3QgZ2V0IHJlc2V0IG9uIGNsb25lcy5cbi8vIFRoaXMgYWxsb3dzIGNlcnRhaW4gY29uY2VwdHMgdG8gcGVyc2lzdCB3aXRob3V0IHJlY2FsY3VsYXRpbmcgdGhlbSxcbi8vIGUuZy4gd2hldGhlciBhIHN1YnRyZWUgY29udGFpbnMgcGFzc2l2ZSBlZmZlY3RzIG9yIHBvcnRhbHMuXG5cbnZhciBTdGF0aWNNYXNrID0gTGF5b3V0U3RhdGljIHwgUGFzc2l2ZVN0YXRpYyB8IFJlZlN0YXRpYztcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG5mdW5jdGlvbiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSB7XG4gIHZhciBub2RlID0gZmliZXI7XG4gIHZhciBuZWFyZXN0TW91bnRlZCA9IGZpYmVyO1xuXG4gIGlmICghZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlLCB0aGlzIG1pZ2h0IGJlIGEgbmV3IHRyZWUgdGhhdCBpc24ndCBpbnNlcnRlZFxuICAgIC8vIHlldC4gSWYgaXQgaXMsIHRoZW4gaXQgd2lsbCBoYXZlIGEgcGVuZGluZyBpbnNlcnRpb24gZWZmZWN0IG9uIGl0LlxuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGU7XG5cbiAgICBkbyB7XG4gICAgICBub2RlID0gbmV4dE5vZGU7XG5cbiAgICAgIGlmICgobm9kZS5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbiBvciBpbi1wcm9ncmVzcyBoeWRyYXRpb24uIFRoZSBuZWFyZXN0IHBvc3NpYmxlXG4gICAgICAgIC8vIG1vdW50ZWQgZmliZXIgaXMgdGhlIHBhcmVudCBidXQgd2UgbmVlZCB0byBjb250aW51ZSB0byBmaWd1cmUgb3V0XG4gICAgICAgIC8vIGlmIHRoYXQgb25lIGlzIHN0aWxsIG1vdW50ZWQuXG4gICAgICAgIG5lYXJlc3RNb3VudGVkID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5leHROb2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobmV4dE5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChub2RlLnJldHVybikge1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBUT0RPOiBDaGVjayBpZiB0aGlzIHdhcyBhIG5lc3RlZCBIb3N0Um9vdCB3aGVuIHVzZWQgd2l0aFxuICAgIC8vIHJlbmRlckNvbnRhaW5lckludG9TdWJ0cmVlLlxuICAgIHJldHVybiBuZWFyZXN0TW91bnRlZDtcbiAgfSAvLyBJZiB3ZSBkaWRuJ3QgaGl0IHRoZSByb290LCB0aGF0IG1lYW5zIHRoYXQgd2UncmUgaW4gYW4gZGlzY29ubmVjdGVkIHRyZWVcbiAgLy8gdGhhdCBoYXMgYmVlbiB1bm1vdW50ZWQuXG5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIoZmliZXIpIHtcbiAgaWYgKGZpYmVyLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRDb250YWluZXJGcm9tRmliZXIoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QgPyBmaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA6IG51bGw7XG59XG5mdW5jdGlvbiBpc0ZpYmVyTW91bnRlZChmaWJlcikge1xuICByZXR1cm4gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgPT09IGZpYmVyO1xufVxuZnVuY3Rpb24gaXNNb3VudGVkKGNvbXBvbmVudCkge1xuICB7XG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcblxuICAgIGlmIChvd25lciAhPT0gbnVsbCAmJiBvd25lci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgb3duZXJGaWJlciA9IG93bmVyO1xuICAgICAgdmFyIGluc3RhbmNlID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICghaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgaXNNb3VudGVkIGluc2lkZSBpdHMgcmVuZGVyKCkgZnVuY3Rpb24uICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyRmliZXIpIHx8ICdBIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmaWJlciA9IGdldChjb21wb25lbnQpO1xuXG4gIGlmICghZmliZXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcikgPT09IGZpYmVyO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRJc01vdW50ZWQoZmliZXIpIHtcbiAgaWYgKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpICE9PSBmaWJlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKGZpYmVyKSB7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKCFhbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoZW4gd2Ugb25seSBuZWVkIHRvIGNoZWNrIGlmIGl0IGlzIG1vdW50ZWQuXG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihmaWJlcik7XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gZmliZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmaWJlcjtcbiAgfSAvLyBJZiB3ZSBoYXZlIHR3byBwb3NzaWJsZSBicmFuY2hlcywgd2UnbGwgd2FsayBiYWNrd2FyZHMgdXAgdG8gdGhlIHJvb3RcbiAgLy8gdG8gc2VlIHdoYXQgcGF0aCB0aGUgcm9vdCBwb2ludHMgdG8uIE9uIHRoZSB3YXkgd2UgbWF5IGhpdCBvbmUgb2YgdGhlXG4gIC8vIHNwZWNpYWwgY2FzZXMgYW5kIHdlJ2xsIGRlYWwgd2l0aCB0aGVtLlxuXG5cbiAgdmFyIGEgPSBmaWJlcjtcbiAgdmFyIGIgPSBhbHRlcm5hdGU7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcGFyZW50QSA9IGEucmV0dXJuO1xuXG4gICAgaWYgKHBhcmVudEEgPT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIGF0IHRoZSByb290LlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIHBhcmVudEIgPSBwYXJlbnRBLmFsdGVybmF0ZTtcblxuICAgIGlmIChwYXJlbnRCID09PSBudWxsKSB7XG4gICAgICAvLyBUaGVyZSBpcyBubyBhbHRlcm5hdGUuIFRoaXMgaXMgYW4gdW51c3VhbCBjYXNlLiBDdXJyZW50bHksIGl0IG9ubHlcbiAgICAgIC8vIGhhcHBlbnMgd2hlbiBhIFN1c3BlbnNlIGNvbXBvbmVudCBpcyBoaWRkZW4uIEFuIGV4dHJhIGZyYWdtZW50IGZpYmVyXG4gICAgICAvLyBpcyBpbnNlcnRlZCBpbiBiZXR3ZWVuIHRoZSBTdXNwZW5zZSBmaWJlciBhbmQgaXRzIGNoaWxkcmVuLiBTa2lwXG4gICAgICAvLyBvdmVyIHRoaXMgZXh0cmEgZnJhZ21lbnQgZmliZXIgYW5kIHByb2NlZWQgdG8gdGhlIG5leHQgcGFyZW50LlxuICAgICAgdmFyIG5leHRQYXJlbnQgPSBwYXJlbnRBLnJldHVybjtcblxuICAgICAgaWYgKG5leHRQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgYSA9IGIgPSBuZXh0UGFyZW50O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gLy8gSWYgdGhlcmUncyBubyBwYXJlbnQsIHdlJ3JlIGF0IHRoZSByb290LlxuXG5cbiAgICAgIGJyZWFrO1xuICAgIH0gLy8gSWYgYm90aCBjb3BpZXMgb2YgdGhlIHBhcmVudCBmaWJlciBwb2ludCB0byB0aGUgc2FtZSBjaGlsZCwgd2UgY2FuXG4gICAgLy8gYXNzdW1lIHRoYXQgdGhlIGNoaWxkIGlzIGN1cnJlbnQuIFRoaXMgaGFwcGVucyB3aGVuIHdlIGJhaWxvdXQgb24gbG93XG4gICAgLy8gcHJpb3JpdHk6IHRoZSBiYWlsZWQgb3V0IGZpYmVyJ3MgY2hpbGQgcmV1c2VzIHRoZSBjdXJyZW50IGNoaWxkLlxuXG5cbiAgICBpZiAocGFyZW50QS5jaGlsZCA9PT0gcGFyZW50Qi5jaGlsZCkge1xuICAgICAgdmFyIGNoaWxkID0gcGFyZW50QS5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkKSB7XG4gICAgICAgIGlmIChjaGlsZCA9PT0gYSkge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoaWxkID09PSBiKSB7XG4gICAgICAgICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEIgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgICAgICAgIGFzc2VydElzTW91bnRlZChwYXJlbnRBKTtcbiAgICAgICAgICByZXR1cm4gYWx0ZXJuYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfSAvLyBXZSBzaG91bGQgbmV2ZXIgaGF2ZSBhbiBhbHRlcm5hdGUgZm9yIGFueSBtb3VudGluZyBub2RlLiBTbyB0aGUgb25seVxuICAgICAgLy8gd2F5IHRoaXMgY291bGQgcG9zc2libHkgaGFwcGVuIGlzIGlmIHRoaXMgd2FzIHVubW91bnRlZCwgaWYgYXQgYWxsLlxuXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgIH1cblxuICAgIGlmIChhLnJldHVybiAhPT0gYi5yZXR1cm4pIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlciBvZiBBIGFuZCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgQiBwb2ludCB0byBkaWZmZXJlbnRcbiAgICAgIC8vIGZpYmVycy4gV2UgYXNzdW1lIHRoYXQgcmV0dXJuIHBvaW50ZXJzIG5ldmVyIGNyaXNzLWNyb3NzLCBzbyBBIG11c3RcbiAgICAgIC8vIGJlbG9uZyB0byB0aGUgY2hpbGQgc2V0IG9mIEEucmV0dXJuLCBhbmQgQiBtdXN0IGJlbG9uZyB0byB0aGUgY2hpbGRcbiAgICAgIC8vIHNldCBvZiBCLnJldHVybi5cbiAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgYiA9IHBhcmVudEI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgZmliZXIuIFdlJ2xsIGhhdmUgdG8gdXNlIHRoZVxuICAgICAgLy8gZGVmYXVsdCwgc2xvdyBwYXRoOiBzY2FuIHRoZSBjaGlsZCBzZXRzIG9mIGVhY2ggcGFyZW50IGFsdGVybmF0ZSB0byBzZWVcbiAgICAgIC8vIHdoaWNoIGNoaWxkIGJlbG9uZ3MgdG8gd2hpY2ggc2V0LlxuICAgICAgLy9cbiAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQSdzIGNoaWxkIHNldFxuICAgICAgdmFyIGRpZEZpbmRDaGlsZCA9IGZhbHNlO1xuICAgICAgdmFyIF9jaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEIncyBjaGlsZCBzZXRcbiAgICAgICAgX2NoaWxkID0gcGFyZW50Qi5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkIHdhcyBub3QgZm91bmQgaW4gZWl0aGVyIHBhcmVudCBzZXQuIFRoaXMgaW5kaWNhdGVzIGEgYnVnICcgKyAnaW4gUmVhY3QgcmVsYXRlZCB0byB0aGUgcmV0dXJuIHBvaW50ZXIuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGEuYWx0ZXJuYXRlICE9PSBiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXR1cm4gZmliZXJzIHNob3VsZCBhbHdheXMgYmUgZWFjaCBvdGhlcnMnIGFsdGVybmF0ZXMuIFwiICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9IC8vIElmIHRoZSByb290IGlzIG5vdCBhIGhvc3QgY29udGFpbmVyLCB3ZSdyZSBpbiBhIGRpc2Nvbm5lY3RlZCB0cmVlLiBJLmUuXG4gIC8vIHVubW91bnRlZC5cblxuXG4gIGlmIChhLnRhZyAhPT0gSG9zdFJvb3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIG5vZGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKTtcbiAgfVxuXG4gIGlmIChhLnN0YXRlTm9kZS5jdXJyZW50ID09PSBhKSB7XG4gICAgLy8gV2UndmUgZGV0ZXJtaW5lZCB0aGF0IEEgaXMgdGhlIGN1cnJlbnQgYnJhbmNoLlxuICAgIHJldHVybiBmaWJlcjtcbiAgfSAvLyBPdGhlcndpc2UgQiBoYXMgdG8gYmUgY3VycmVudCBicmFuY2guXG5cblxuICByZXR1cm4gYWx0ZXJuYXRlO1xufVxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXIocGFyZW50KSB7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgocGFyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnRQYXJlbnQgIT09IG51bGwgPyBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwoY3VycmVudFBhcmVudCkgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudEhvc3RGaWJlckltcGwobm9kZSkge1xuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHZhciBtYXRjaCA9IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChjaGlsZCk7XG5cbiAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9XG5cbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG4gIHJldHVybiBjdXJyZW50UGFyZW50ICE9PSBudWxsID8gZmluZEN1cnJlbnRIb3N0RmliZXJXaXRoTm9Qb3J0YWxzSW1wbChjdXJyZW50UGFyZW50KSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwobm9kZSkge1xuICAvLyBOZXh0IHdlJ2xsIGRyaWxsIGRvd24gdGhpcyBjb21wb25lbnQgdG8gZmluZCB0aGUgZmlyc3QgSG9zdENvbXBvbmVudC9UZXh0LlxuICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIGlmIChjaGlsZC50YWcgIT09IEhvc3RQb3J0YWwpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFsc0ltcGwoY2hpbGQpO1xuXG4gICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBUaGlzIG1vZHVsZSBvbmx5IGV4aXN0cyBhcyBhbiBFU00gd3JhcHBlciBhcm91bmQgdGhlIGV4dGVybmFsIENvbW1vbkpTXG52YXIgc2NoZWR1bGVDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrO1xudmFyIGNhbmNlbENhbGxiYWNrID0gU2NoZWR1bGVyLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrO1xudmFyIHNob3VsZFlpZWxkID0gU2NoZWR1bGVyLnVuc3RhYmxlX3Nob3VsZFlpZWxkO1xudmFyIHJlcXVlc3RQYWludCA9IFNjaGVkdWxlci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ7XG52YXIgbm93ID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCA9IFNjaGVkdWxlci51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eTtcbnZhciBOb3JtYWxQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eTtcbnZhciBMb3dQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Mb3dQcmlvcml0eTtcbnZhciBJZGxlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5O1xuLy8gdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0IG9uIHRoZSBzY2hlZHVsZXIsIGJ1dCBpdCAqZG9lcypcbi8vIG9uIHNjaGVkdWxlci91bnN0YWJsZV9tb2NrLCB3aGljaCB3ZSdsbCBuZWVkIGZvciBpbnRlcm5hbCB0ZXN0aW5nXG52YXIgdW5zdGFibGVfeWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV95aWVsZFZhbHVlO1xudmFyIHVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlID0gU2NoZWR1bGVyLnVuc3RhYmxlX3NldERpc2FibGVZaWVsZFZhbHVlO1xuXG52YXIgcmVuZGVyZXJJRCA9IG51bGw7XG52YXIgaW5qZWN0ZWRIb29rID0gbnVsbDtcbnZhciBpbmplY3RlZFByb2ZpbGluZ0hvb2tzID0gbnVsbDtcbnZhciBoYXNMb2dnZWRFcnJvciA9IGZhbHNlO1xudmFyIGlzRGV2VG9vbHNQcmVzZW50ID0gdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCc7XG5mdW5jdGlvbiBpbmplY3RJbnRlcm5hbHMoaW50ZXJuYWxzKSB7XG4gIGlmICh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIE5vIERldlRvb2xzXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGhvb2sgPSBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187XG5cbiAgaWYgKGhvb2suaXNEaXNhYmxlZCkge1xuICAgIC8vIFRoaXMgaXNuJ3QgYSByZWFsIHByb3BlcnR5IG9uIHRoZSBob29rLCBidXQgaXQgY2FuIGJlIHNldCB0byBvcHQgb3V0XG4gICAgLy8gb2YgRGV2VG9vbHMgaW50ZWdyYXRpb24gYW5kIGFzc29jaWF0ZWQgd2FybmluZ3MgYW5kIGxvZ3MuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zODc3XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIWhvb2suc3VwcG9ydHNGaWJlcikge1xuICAgIHtcbiAgICAgIGVycm9yKCdUaGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgUmVhY3QgRGV2VG9vbHMgaXMgdG9vIG9sZCBhbmQgd2lsbCBub3Qgd29yayAnICsgJ3dpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBSZWFjdC4gUGxlYXNlIHVwZGF0ZSBSZWFjdCBEZXZUb29scy4gJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnKTtcbiAgICB9IC8vIERldlRvb2xzIGV4aXN0cywgZXZlbiB0aG91Z2ggaXQgZG9lc24ndCBzdXBwb3J0IEZpYmVyLlxuXG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGVuYWJsZVNjaGVkdWxpbmdQcm9maWxlcikge1xuICAgICAgLy8gQ29uZGl0aW9uYWxseSBpbmplY3QgdGhlc2UgaG9va3Mgb25seSBpZiBUaW1lbGluZSBwcm9maWxlciBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBidWlsZC5cbiAgICAgIC8vIFRoaXMgZ2l2ZXMgRGV2VG9vbHMgYSB3YXkgdG8gZmVhdHVyZSBkZXRlY3QgdGhhdCBpc24ndCB0aWVkIHRvIHZlcnNpb24gbnVtYmVyXG4gICAgICAvLyAoc2luY2UgcHJvZmlsaW5nIGFuZCB0aW1lbGluZSBhcmUgY29udHJvbGxlZCBieSBkaWZmZXJlbnQgZmVhdHVyZSBmbGFncykuXG4gICAgICBpbnRlcm5hbHMgPSBhc3NpZ24oe30sIGludGVybmFscywge1xuICAgICAgICBnZXRMYW5lTGFiZWxNYXA6IGdldExhbmVMYWJlbE1hcCxcbiAgICAgICAgaW5qZWN0UHJvZmlsaW5nSG9va3M6IGluamVjdFByb2ZpbGluZ0hvb2tzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJlcklEID0gaG9vay5pbmplY3QoaW50ZXJuYWxzKTsgLy8gV2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5qZWN0ZWQsIHNvIG5vdyBpdCBpcyBzYWZlIHRvIHNldCB1cCBob29rcy5cblxuICAgIGluamVjdGVkSG9vayA9IGhvb2s7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIENhdGNoIGFsbCBlcnJvcnMgYmVjYXVzZSBpdCBpcyB1bnNhZmUgdG8gdGhyb3cgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGhvb2suY2hlY2tEQ0UpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSByZWFsIERldlRvb2xzLlxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgbGlrZWx5IGEgaG9vayBpbnN0YWxsZWQgYnkgRmFzdCBSZWZyZXNoIHJ1bnRpbWUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBvblNjaGVkdWxlUm9vdChyb290LCBjaGlsZHJlbikge1xuICB7XG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIGNoaWxkcmVuKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoICFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRSb290KHJvb3QsIGV2ZW50UHJpb3JpdHkpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBkaWRFcnJvciA9IChyb290LmN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gRGlkQ2FwdHVyZTtcblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgICAgdmFyIHNjaGVkdWxlclByaW9yaXR5O1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgICAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcm9vdCwgc2NoZWR1bGVyUHJpb3JpdHksIGRpZEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCB1bmRlZmluZWQsIGRpZEVycm9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Qb3N0Q29tbWl0Um9vdChyb290KSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRVbm1vdW50KGZpYmVyKSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQocmVuZGVyZXJJRCwgZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhuZXdJc1N0cmljdE1vZGUpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgdW5zdGFibGVfeWllbGRWYWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gV2UncmUgaW4gYSB0ZXN0IGJlY2F1c2UgU2NoZWR1bGVyLnVuc3RhYmxlX3lpZWxkVmFsdWUgb25seSBleGlzdHNcbiAgICAgIC8vIGluIFNjaGVkdWxlck1vY2suIFRvIHJlZHVjZSB0aGUgbm9pc2UgaW4gc3RyaWN0IG1vZGUgdGVzdHMsXG4gICAgICAvLyBzdXBwcmVzcyB3YXJuaW5ncyBhbmQgZGlzYWJsZSBzY2hlZHVsZXIgeWllbGRpbmcgZHVyaW5nIHRoZSBkb3VibGUgcmVuZGVyXG4gICAgICB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZShuZXdJc1N0cmljdE1vZGUpO1xuICAgICAgc2V0U3VwcHJlc3NXYXJuaW5nKG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgfVxuXG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5zZXRTdHJpY3RNb2RlKHJlbmRlcmVySUQsIG5ld0lzU3RyaWN0TW9kZSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICghaGFzTG9nZ2VkRXJyb3IpIHtcbiAgICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBQcm9maWxlciBBUEkgaG9va3NcblxuZnVuY3Rpb24gaW5qZWN0UHJvZmlsaW5nSG9va3MocHJvZmlsaW5nSG9va3MpIHtcbiAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcyA9IHByb2ZpbGluZ0hvb2tzO1xufVxuXG5mdW5jdGlvbiBnZXRMYW5lTGFiZWxNYXAoKSB7XG4gIHtcbiAgICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICAgIHZhciBsYW5lID0gMTtcblxuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBUb3RhbExhbmVzOyBpbmRleCsrKSB7XG4gICAgICB2YXIgbGFiZWwgPSBnZXRMYWJlbEZvckxhbmUobGFuZSk7XG4gICAgICBtYXAuc2V0KGxhbmUsIGxhYmVsKTtcbiAgICAgIGxhbmUgKj0gMjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tbWl0U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21taXRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZChmaWJlcikge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmliZXIpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RhcnRlZChmaWJlcik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RVbm1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0TW91bnRTdGFydGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmliZXIpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0b3BwZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0YXJ0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0NvbXBvbmVudExheW91dEVmZmVjdFVubW91bnRTdGFydGVkKGZpYmVyKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtDb21wb25lbnRFcnJvcmVkKGZpYmVyLCB0aHJvd25WYWx1ZSwgbGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRFcnJvcmVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRFcnJvcmVkKGZpYmVyLCB0aHJvd25WYWx1ZSwgbGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0NvbXBvbmVudFN1c3BlbmRlZChmaWJlciwgd2FrZWFibGUsIGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrQ29tcG9uZW50U3VzcGVuZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtDb21wb25lbnRTdXNwZW5kZWQoZmliZXIsIHdha2VhYmxlLCBsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya0xheW91dEVmZmVjdHNTdG9wcGVkKCkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0xheW91dEVmZmVjdHNTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtMYXlvdXRFZmZlY3RzU3RvcHBlZCgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcykge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdGFydGVkKGxhbmVzKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUGFzc2l2ZUVmZmVjdHNTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSZW5kZXJTdGFydGVkKGxhbmVzKSB7XG4gIHtcbiAgICBpZiAoaW5qZWN0ZWRQcm9maWxpbmdIb29rcyAhPT0gbnVsbCAmJiB0eXBlb2YgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RhcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyWWllbGRlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJZaWVsZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJZaWVsZGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU3RvcHBlZCgpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdG9wcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtSZW5kZXJTY2hlZHVsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya1JlbmRlclNjaGVkdWxlZChsYW5lKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSkge1xuICB7XG4gICAgaWYgKGluamVjdGVkUHJvZmlsaW5nSG9va3MgIT09IG51bGwgJiYgdHlwZW9mIGluamVjdGVkUHJvZmlsaW5nSG9va3MubWFya0ZvcmNlVXBkYXRlU2NoZWR1bGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpIHtcbiAge1xuICAgIGlmIChpbmplY3RlZFByb2ZpbGluZ0hvb2tzICE9PSBudWxsICYmIHR5cGVvZiBpbmplY3RlZFByb2ZpbGluZ0hvb2tzLm1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaW5qZWN0ZWRQcm9maWxpbmdIb29rcy5tYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgTm9Nb2RlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4wOyAvLyBUT0RPOiBSZW1vdmUgQ29uY3VycmVudE1vZGUgYnkgcmVhZGluZyBmcm9tIHRoZSByb290IHRhZyBpbnN0ZWFkXG5cbnZhciBDb25jdXJyZW50TW9kZSA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgUHJvZmlsZU1vZGUgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yO1xudmFyIFN0cmljdExlZ2FjeU1vZGUgPVxuLyogICAgICAgICAgICAgICAqL1xuODtcbnZhciBTdHJpY3RFZmZlY3RzTW9kZSA9XG4vKiAgICAgICAgICAgICAgKi9cbjE2O1xuXG4vLyBUT0RPOiBUaGlzIGlzIHByZXR0eSB3ZWxsIHN1cHBvcnRlZCBieSBicm93c2Vycy4gTWF5YmUgd2UgY2FuIGRyb3AgaXQuXG52YXIgY2x6MzIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IGNsejMyRmFsbGJhY2s7IC8vIENvdW50IGxlYWRpbmcgemVyb3MuXG4vLyBCYXNlZCBvbjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvY2x6MzJcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG5mdW5jdGlvbiBjbHozMkZhbGxiYWNrKHgpIHtcbiAgdmFyIGFzVWludCA9IHggPj4+IDA7XG5cbiAgaWYgKGFzVWludCA9PT0gMCkge1xuICAgIHJldHVybiAzMjtcbiAgfVxuXG4gIHJldHVybiAzMSAtIChsb2coYXNVaW50KSAvIExOMiB8IDApIHwgMDtcbn1cblxuLy8gSWYgdGhvc2UgdmFsdWVzIGFyZSBjaGFuZ2VkIHRoYXQgcGFja2FnZSBzaG91bGQgYmUgcmVidWlsdCBhbmQgcmVkZXBsb3llZC5cblxudmFyIFRvdGFsTGFuZXMgPSAzMTtcbnZhciBOb0xhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgTm9MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBTeW5jTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xO1xudmFyIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgPVxuLyogICAgKi9cbjI7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZSA9XG4vKiAgICAgICAgICAgICAqL1xuNDtcbnZhciBEZWZhdWx0SHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICovXG44O1xudmFyIERlZmF1bHRMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjE2O1xudmFyIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgICAgICovXG4zMjtcbnZhciBUcmFuc2l0aW9uTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG40MTk0MjQwO1xudmFyIFRyYW5zaXRpb25MYW5lMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG42NDtcbnZhciBUcmFuc2l0aW9uTGFuZTIgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIFRyYW5zaXRpb25MYW5lMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4yNTY7XG52YXIgVHJhbnNpdGlvbkxhbmU0ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUxMjtcbnZhciBUcmFuc2l0aW9uTGFuZTUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBUcmFuc2l0aW9uTGFuZTYgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBUcmFuc2l0aW9uTGFuZTcgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDA5NjtcbnZhciBUcmFuc2l0aW9uTGFuZTggPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuODE5MjtcbnZhciBUcmFuc2l0aW9uTGFuZTkgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTYzODQ7XG52YXIgVHJhbnNpdGlvbkxhbmUxMCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjMyNzY4O1xudmFyIFRyYW5zaXRpb25MYW5lMTEgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG42NTUzNjtcbnZhciBUcmFuc2l0aW9uTGFuZTEyID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTMxMDcyO1xudmFyIFRyYW5zaXRpb25MYW5lMTMgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4yNjIxNDQ7XG52YXIgVHJhbnNpdGlvbkxhbmUxNCA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbjUyNDI4ODtcbnZhciBUcmFuc2l0aW9uTGFuZTE1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTA0ODU3NjtcbnZhciBUcmFuc2l0aW9uTGFuZTE2ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuMjA5NzE1MjtcbnZhciBSZXRyeUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMzAwMjM0MjQ7XG52YXIgUmV0cnlMYW5lMSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjQxOTQzMDQ7XG52YXIgUmV0cnlMYW5lMiA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgzODg2MDg7XG52YXIgUmV0cnlMYW5lMyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjE2Nzc3MjE2O1xudmFyIFJldHJ5TGFuZTQgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4zMzU1NDQzMjtcbnZhciBSZXRyeUxhbmU1ID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuNjcxMDg4NjQ7XG52YXIgU29tZVJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG52YXIgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAqL1xuMTM0MjE3NzI4O1xudmFyIE5vbklkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjI2ODQzNTQ1NTtcbnZhciBJZGxlSHlkcmF0aW9uTGFuZSA9XG4vKiAgICAgICAgICAgICAgICovXG4yNjg0MzU0NTY7XG52YXIgSWRsZUxhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuNTM2ODcwOTEyO1xudmFyIE9mZnNjcmVlbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjEwNzM3NDE4MjQ7IC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGV4cGVyaW1lbnRhbCB0aW1lbGluZSAocmVhY3QtZGV2dG9vbHMtdGltZWxpbmUpXG4vLyBJdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIExhbmVzIHZhbHVlcyBhYm92ZS5cblxuZnVuY3Rpb24gZ2V0TGFiZWxGb3JMYW5lKGxhbmUpIHtcbiAge1xuICAgIGlmIChsYW5lICYgU3luY0xhbmUpIHtcbiAgICAgIHJldHVybiAnU3luYyc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0lucHV0Q29udGludW91c0h5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBJbnB1dENvbnRpbnVvdXNMYW5lKSB7XG4gICAgICByZXR1cm4gJ0lucHV0Q29udGludW91cyc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBEZWZhdWx0SHlkcmF0aW9uTGFuZSkge1xuICAgICAgcmV0dXJuICdEZWZhdWx0SHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIERlZmF1bHRMYW5lKSB7XG4gICAgICByZXR1cm4gJ0RlZmF1bHQnO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnVHJhbnNpdGlvbkh5ZHJhdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpIHtcbiAgICAgIHJldHVybiAnVHJhbnNpdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBSZXRyeUxhbmVzKSB7XG4gICAgICByZXR1cm4gJ1JldHJ5JztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUpIHtcbiAgICAgIHJldHVybiAnU2VsZWN0aXZlSHlkcmF0aW9uJztcbiAgICB9XG5cbiAgICBpZiAobGFuZSAmIElkbGVIeWRyYXRpb25MYW5lKSB7XG4gICAgICByZXR1cm4gJ0lkbGVIeWRyYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChsYW5lICYgSWRsZUxhbmUpIHtcbiAgICAgIHJldHVybiAnSWRsZSc7XG4gICAgfVxuXG4gICAgaWYgKGxhbmUgJiBPZmZzY3JlZW5MYW5lKSB7XG4gICAgICByZXR1cm4gJ09mZnNjcmVlbic7XG4gICAgfVxuICB9XG59XG52YXIgTm9UaW1lc3RhbXAgPSAtMTtcbnZhciBuZXh0VHJhbnNpdGlvbkxhbmUgPSBUcmFuc2l0aW9uTGFuZTE7XG52YXIgbmV4dFJldHJ5TGFuZSA9IFJldHJ5TGFuZTE7XG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gIHN3aXRjaCAoZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcykpIHtcbiAgICBjYXNlIFN5bmNMYW5lOlxuICAgICAgcmV0dXJuIFN5bmNMYW5lO1xuXG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmU6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzTGFuZTtcblxuICAgIGNhc2UgRGVmYXVsdEh5ZHJhdGlvbkxhbmU6XG4gICAgICByZXR1cm4gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIERlZmF1bHRMYW5lOlxuICAgICAgcmV0dXJuIERlZmF1bHRMYW5lO1xuXG4gICAgY2FzZSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTpcbiAgICAgIHJldHVybiBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTtcblxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICAgIHJldHVybiBsYW5lcyAmIFRyYW5zaXRpb25MYW5lcztcblxuICAgIGNhc2UgUmV0cnlMYW5lMTpcbiAgICBjYXNlIFJldHJ5TGFuZTI6XG4gICAgY2FzZSBSZXRyeUxhbmUzOlxuICAgIGNhc2UgUmV0cnlMYW5lNDpcbiAgICBjYXNlIFJldHJ5TGFuZTU6XG4gICAgICByZXR1cm4gbGFuZXMgJiBSZXRyeUxhbmVzO1xuXG4gICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmU7XG5cbiAgICBjYXNlIElkbGVIeWRyYXRpb25MYW5lOlxuICAgICAgcmV0dXJuIElkbGVIeWRyYXRpb25MYW5lO1xuXG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICAgIHJldHVybiBJZGxlTGFuZTtcblxuICAgIGNhc2UgT2Zmc2NyZWVuTGFuZTpcbiAgICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBiZSByZWFjaGFibGUsIGJ1dCBhcyBhIGZhbGxiYWNrLCByZXR1cm4gdGhlIGVudGlyZSBiaXRtYXNrLlxuXG5cbiAgICAgIHJldHVybiBsYW5lcztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROZXh0TGFuZXMocm9vdCwgd2lwTGFuZXMpIHtcbiAgLy8gRWFybHkgYmFpbG91dCBpZiB0aGVyZSdzIG5vIHBlbmRpbmcgd29yayBsZWZ0LlxuICB2YXIgcGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7XG5cbiAgaWYgKHBlbmRpbmdMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIHJldHVybiBOb0xhbmVzO1xuICB9XG5cbiAgdmFyIG5leHRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7IC8vIERvIG5vdCB3b3JrIG9uIGFueSBpZGxlIHdvcmsgdW50aWwgYWxsIHRoZSBub24taWRsZSB3b3JrIGhhcyBmaW5pc2hlZCxcbiAgLy8gZXZlbiBpZiB0aGUgd29yayBpcyBzdXNwZW5kZWQuXG5cbiAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiBOb25JZGxlTGFuZXM7XG5cbiAgaWYgKG5vbklkbGVQZW5kaW5nTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICB2YXIgbm9uSWRsZVVuYmxvY2tlZExhbmVzID0gbm9uSWRsZVBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgIGlmIChub25JZGxlVW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKG5vbklkbGVVbmJsb2NrZWRMYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBub25JZGxlUGluZ2VkTGFuZXMgPSBub25JZGxlUGVuZGluZ0xhbmVzICYgcGluZ2VkTGFuZXM7XG5cbiAgICAgIGlmIChub25JZGxlUGluZ2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVBpbmdlZExhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIHdvcmsgaXMgSWRsZS5cbiAgICB2YXIgdW5ibG9ja2VkTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICBpZiAodW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHVuYmxvY2tlZExhbmVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHBpbmdlZExhbmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobmV4dExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSByZWFjaGFibGUgaWYgd2UncmUgc3VzcGVuZGVkXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgd2FybmluZyBpbiB0aGlzIHBhdGggaWYgYSBmYWxsYmFjayB0aW1lciBpcyBub3Qgc2NoZWR1bGVkLlxuICAgIHJldHVybiBOb0xhbmVzO1xuICB9IC8vIElmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiBhIHJlbmRlciwgc3dpdGNoaW5nIGxhbmVzIHdpbGwgaW50ZXJydXB0XG4gIC8vIGl0IGFuZCB3ZSdsbCBsb3NlIG91ciBwcm9ncmVzcy4gV2Ugc2hvdWxkIG9ubHkgZG8gdGhpcyBpZiB0aGUgbmV3IGxhbmVzIGFyZVxuICAvLyBoaWdoZXIgcHJpb3JpdHkuXG5cblxuICBpZiAod2lwTGFuZXMgIT09IE5vTGFuZXMgJiYgd2lwTGFuZXMgIT09IG5leHRMYW5lcyAmJiAvLyBJZiB3ZSBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHRoZW4gaW50ZXJydXB0aW5nIGlzIGZpbmUuIERvbid0XG4gIC8vIGJvdGhlciB3YWl0aW5nIHVudGlsIHRoZSByb290IGlzIGNvbXBsZXRlLlxuICAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICB2YXIgbmV4dExhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKG5leHRMYW5lcyk7XG4gICAgdmFyIHdpcExhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKHdpcExhbmVzKTtcblxuICAgIGlmICggLy8gVGVzdHMgd2hldGhlciB0aGUgbmV4dCBsYW5lIGlzIGVxdWFsIG9yIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIHdpcFxuICAgIC8vIG9uZS4gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXRzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICAgIG5leHRMYW5lID49IHdpcExhbmUgfHwgLy8gRGVmYXVsdCBwcmlvcml0eSB1cGRhdGVzIHNob3VsZCBub3QgaW50ZXJydXB0IHRyYW5zaXRpb24gdXBkYXRlcy4gVGhlXG4gICAgLy8gb25seSBkaWZmZXJlbmNlIGJldHdlZW4gZGVmYXVsdCB1cGRhdGVzIGFuZCB0cmFuc2l0aW9uIHVwZGF0ZXMgaXMgdGhhdFxuICAgIC8vIGRlZmF1bHQgdXBkYXRlcyBkbyBub3Qgc3VwcG9ydCByZWZyZXNoIHRyYW5zaXRpb25zLlxuICAgIG5leHRMYW5lID09PSBEZWZhdWx0TGFuZSAmJiAod2lwTGFuZSAmIFRyYW5zaXRpb25MYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICAgIC8vIEtlZXAgd29ya2luZyBvbiB0aGUgZXhpc3RpbmcgaW4tcHJvZ3Jlc3MgdHJlZS4gRG8gbm90IGludGVycnVwdC5cbiAgICAgIHJldHVybiB3aXBMYW5lcztcbiAgICB9XG4gIH1cblxuICBpZiAoKG5leHRMYW5lcyAmIElucHV0Q29udGludW91c0xhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgLy8gV2hlbiB1cGRhdGVzIGFyZSBzeW5jIGJ5IGRlZmF1bHQsIHdlIGVudGFuZ2xlIGNvbnRpbnVvdXMgcHJpb3JpdHkgdXBkYXRlc1xuICAgIC8vIGFuZCBkZWZhdWx0IHVwZGF0ZXMsIHNvIHRoZXkgcmVuZGVyIGluIHRoZSBzYW1lIGJhdGNoLiBUaGUgb25seSByZWFzb25cbiAgICAvLyB0aGV5IHVzZSBzZXBhcmF0ZSBsYW5lcyBpcyBiZWNhdXNlIGNvbnRpbnVvdXMgdXBkYXRlcyBzaG91bGQgaW50ZXJydXB0XG4gICAgLy8gdHJhbnNpdGlvbnMsIGJ1dCBkZWZhdWx0IHVwZGF0ZXMgc2hvdWxkIG5vdC5cbiAgICBuZXh0TGFuZXMgfD0gcGVuZGluZ0xhbmVzICYgRGVmYXVsdExhbmU7XG4gIH0gLy8gQ2hlY2sgZm9yIGVudGFuZ2xlZCBsYW5lcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGJhdGNoLlxuICAvL1xuICAvLyBBIGxhbmUgaXMgc2FpZCB0byBiZSBlbnRhbmdsZWQgd2l0aCBhbm90aGVyIHdoZW4gaXQncyBub3QgYWxsb3dlZCB0byByZW5kZXJcbiAgLy8gaW4gYSBiYXRjaCB0aGF0IGRvZXMgbm90IGFsc28gaW5jbHVkZSB0aGUgb3RoZXIgbGFuZS4gVHlwaWNhbGx5IHdlIGRvIHRoaXNcbiAgLy8gd2hlbiBtdWx0aXBsZSB1cGRhdGVzIGhhdmUgdGhlIHNhbWUgc291cmNlLCBhbmQgd2Ugb25seSB3YW50IHRvIHJlc3BvbmQgdG9cbiAgLy8gdGhlIG1vc3QgcmVjZW50IGV2ZW50IGZyb20gdGhhdCBzb3VyY2UuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBhcHBseSBlbnRhbmdsZW1lbnRzICphZnRlciogY2hlY2tpbmcgZm9yIHBhcnRpYWwgd29yayBhYm92ZS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIGEgbGFuZSBpcyBlbnRhbmdsZWQgZHVyaW5nIGFuIGludGVybGVhdmVkIGV2ZW50IHdoaWxlXG4gIC8vIGl0J3MgYWxyZWFkeSByZW5kZXJpbmcsIHdlIHdvbid0IGludGVycnVwdCBpdC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgc2luY2VcbiAgLy8gZW50YW5nbGVtZW50IGlzIHVzdWFsbHkgXCJiZXN0IGVmZm9ydFwiOiB3ZSdsbCB0cnkgb3VyIGJlc3QgdG8gcmVuZGVyIHRoZVxuICAvLyBsYW5lcyBpbiB0aGUgc2FtZSBiYXRjaCwgYnV0IGl0J3Mgbm90IHdvcnRoIHRocm93aW5nIG91dCBwYXJ0aWFsbHlcbiAgLy8gY29tcGxldGVkIHdvcmsgaW4gb3JkZXIgdG8gZG8gaXQuXG4gIC8vIFRPRE86IFJlY29uc2lkZXIgdGhpcy4gVGhlIGNvdW50ZXItYXJndW1lbnQgaXMgdGhhdCB0aGUgcGFydGlhbCB3b3JrXG4gIC8vIHJlcHJlc2VudHMgYW4gaW50ZXJtZWRpYXRlIHN0YXRlLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIHNob3cgdG8gdGhlIHVzZXIuXG4gIC8vIEFuZCBieSBzcGVuZGluZyBleHRyYSB0aW1lIGZpbmlzaGluZyBpdCwgd2UncmUgaW5jcmVhc2luZyB0aGUgYW1vdW50IG9mXG4gIC8vIHRpbWUgaXQgdGFrZXMgdG8gc2hvdyB0aGUgZmluYWwgc3RhdGUsIHdoaWNoIGlzIHdoYXQgdGhleSBhcmUgYWN0dWFsbHlcbiAgLy8gd2FpdGluZyBmb3IuXG4gIC8vXG4gIC8vIEZvciB0aG9zZSBleGNlcHRpb25zIHdoZXJlIGVudGFuZ2xlbWVudCBpcyBzZW1hbnRpY2FsbHkgaW1wb3J0YW50LCBsaWtlXG4gIC8vIHVzZU11dGFibGVTb3VyY2UsIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwYXJ0aWFsIHdvcmsgYXQgdGhlXG4gIC8vIHRpbWUgd2UgYXBwbHkgdGhlIGVudGFuZ2xlbWVudC5cblxuXG4gIHZhciBlbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXM7XG5cbiAgaWYgKGVudGFuZ2xlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gICAgdmFyIGxhbmVzID0gbmV4dExhbmVzICYgZW50YW5nbGVkTGFuZXM7XG5cbiAgICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgIG5leHRMYW5lcyB8PSBlbnRhbmdsZW1lbnRzW2luZGV4XTtcbiAgICAgIGxhbmVzICY9IH5sYW5lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0TGFuZXM7XG59XG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV2ZW50VGltZSA9IGV2ZW50VGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV2ZW50VGltZSA+IG1vc3RSZWNlbnRFdmVudFRpbWUpIHtcbiAgICAgIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBldmVudFRpbWU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cblxuICByZXR1cm4gbW9zdFJlY2VudEV2ZW50VGltZTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKSB7XG4gIHN3aXRjaCAobGFuZSkge1xuICAgIGNhc2UgU3luY0xhbmU6XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZTpcbiAgICAgIC8vIFVzZXIgaW50ZXJhY3Rpb25zIHNob3VsZCBleHBpcmUgc2xpZ2h0bHkgbW9yZSBxdWlja2x5LlxuICAgICAgLy9cbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgc2V0IHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbnN0YW50IGFzIGluIFNjaGVkdWxlci5qcy5cbiAgICAgIC8vIFdoZW4gd2UgbWFkZSBpdCBsYXJnZXIsIGEgcHJvZHVjdCBtZXRyaWMgaW4gd3d3IHJlZ3Jlc3NlZCwgc3VnZ2VzdGluZ1xuICAgICAgLy8gdGhlcmUncyBhIHVzZXIgaW50ZXJhY3Rpb24gdGhhdCdzIGJlaW5nIHN0YXJ2ZWQgYnkgYSBzZXJpZXMgb2ZcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZXMuIElmIHRoYXQgdGhlb3J5IGlzIGNvcnJlY3QsIHRoZSBwcm9wZXIgc29sdXRpb24gaXNcbiAgICAgIC8vIHRvIGZpeCB0aGUgc3RhcnZhdGlvbi4gSG93ZXZlciwgdGhpcyBzY2VuYXJpbyBzdXBwb3J0cyB0aGUgaWRlYSB0aGF0XG4gICAgICAvLyBleHBpcmF0aW9uIHRpbWVzIGFyZSBhbiBpbXBvcnRhbnQgc2FmZWd1YXJkIHdoZW4gc3RhcnZhdGlvblxuICAgICAgLy8gZG9lcyBoYXBwZW4uXG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyAyNTA7XG5cbiAgICBjYXNlIERlZmF1bHRIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgY2FzZSBUcmFuc2l0aW9uSHlkcmF0aW9uTGFuZTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lNzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lODpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lOTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTA6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTExOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMjpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTM6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNTpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTY6XG4gICAgICByZXR1cm4gY3VycmVudFRpbWUgKyA1MDAwO1xuXG4gICAgY2FzZSBSZXRyeUxhbmUxOlxuICAgIGNhc2UgUmV0cnlMYW5lMjpcbiAgICBjYXNlIFJldHJ5TGFuZTM6XG4gICAgY2FzZSBSZXRyeUxhbmU0OlxuICAgIGNhc2UgUmV0cnlMYW5lNTpcbiAgICAgIC8vIFRPRE86IFJldHJpZXMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gZXhwaXJlIGlmIHRoZXkgYXJlIENQVSBib3VuZCBmb3JcbiAgICAgIC8vIHRvbyBsb25nLCBidXQgd2hlbiBJIG1hZGUgdGhpcyBjaGFuZ2UgaXQgY2F1c2VkIGEgc3Bpa2UgaW4gYnJvd3NlclxuICAgICAgLy8gY3Jhc2hlcy4gVGhlcmUgbXVzdCBiZSBzb21lIG90aGVyIHVuZGVybHlpbmcgYnVnOyBub3Qgc3VwZXIgdXJnZW50IGJ1dFxuICAgICAgLy8gaWRlYWxseSBzaG91bGQgZmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4gVW5mb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlXG4gICAgICAvLyBhIHJlcHJvIGZvciB0aGUgY3Jhc2hlcywgb25seSBkZXRlY3RlZCB2aWEgcHJvZHVjdGlvbiBtZXRyaWNzLlxuICAgICAgcmV0dXJuIE5vVGltZXN0YW1wO1xuXG4gICAgY2FzZSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lOlxuICAgIGNhc2UgSWRsZUh5ZHJhdGlvbkxhbmU6XG4gICAgY2FzZSBJZGxlTGFuZTpcbiAgICBjYXNlIE9mZnNjcmVlbkxhbmU6XG4gICAgICAvLyBBbnl0aGluZyBpZGxlIHByaW9yaXR5IG9yIGxvd2VyIHNob3VsZCBuZXZlciBleHBpcmUuXG4gICAgICByZXR1cm4gTm9UaW1lc3RhbXA7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBlcnJvcignU2hvdWxkIGhhdmUgZm91bmQgbWF0Y2hpbmcgbGFuZXMuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOb1RpbWVzdGFtcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB3ZSB5aWVsZC4gV2UgY2FuIG9wdGltaXplIGJ5IHN0b3JpbmdcbiAgLy8gdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZSBvbiB0aGUgcm9vdC4gVGhlbiB1c2UgdGhhdCB0byBxdWlja2x5IGJhaWwgb3V0XG4gIC8vIG9mIHRoaXMgZnVuY3Rpb24uXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBlbmRpbmcgbGFuZXMgYW5kIGNoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlaXJcbiAgLy8gZXhwaXJhdGlvbiB0aW1lLiBJZiBzbywgd2UnbGwgYXNzdW1lIHRoZSB1cGRhdGUgaXMgYmVpbmcgc3RhcnZlZCBhbmQgbWFya1xuICAvLyBpdCBhcyBleHBpcmVkIHRvIGZvcmNlIGl0IHRvIGZpbmlzaC5cblxuICB2YXIgbGFuZXMgPSBwZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV4cGlyYXRpb25UaW1lID09PSBOb1RpbWVzdGFtcCkge1xuICAgICAgLy8gRm91bmQgYSBwZW5kaW5nIGxhbmUgd2l0aCBubyBleHBpcmF0aW9uIHRpbWUuIElmIGl0J3Mgbm90IHN1c3BlbmRlZCwgb3JcbiAgICAgIC8vIGlmIGl0J3MgcGluZ2VkLCBhc3N1bWUgaXQncyBDUFUtYm91bmQuIENvbXB1dGUgYSBuZXcgZXhwaXJhdGlvbiB0aW1lXG4gICAgICAvLyB1c2luZyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgaWYgKChsYW5lICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzIHx8IChsYW5lICYgcGluZ2VkTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIC8vIEFzc3VtZXMgdGltZXN0YW1wcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGxhbmUgZXhwaXJlZFxuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufSAvLyBUaGlzIHJldHVybnMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcGVuZGluZyBsYW5lcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleVxuLy8gYXJlIHN1c3BlbmRlZC5cblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5UGVuZGluZ0xhbmVzKHJvb3QpIHtcbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHJvb3QucGVuZGluZ0xhbmVzKTtcbn1cbmZ1bmN0aW9uIGdldExhbmVzVG9SZXRyeVN5bmNocm9ub3VzbHlPbkVycm9yKHJvb3QpIHtcbiAgdmFyIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gPSByb290LnBlbmRpbmdMYW5lcyAmIH5PZmZzY3JlZW5MYW5lO1xuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuIGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW47XG4gIH1cblxuICBpZiAoZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiAmIE9mZnNjcmVlbkxhbmUpIHtcbiAgICByZXR1cm4gT2Zmc2NyZWVuTGFuZTtcbiAgfVxuXG4gIHJldHVybiBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNTeW5jTGFuZShsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgU3luY0xhbmUpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNOb25JZGxlV29yayhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgTm9uSWRsZUxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFJldHJ5TGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seU5vblVyZ2VudExhbmVzKGxhbmVzKSB7XG4gIHZhciBVcmdlbnRMYW5lcyA9IFN5bmNMYW5lIHwgSW5wdXRDb250aW51b3VzTGFuZSB8IERlZmF1bHRMYW5lO1xuICByZXR1cm4gKGxhbmVzICYgVXJnZW50TGFuZXMpID09PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNPbmx5VHJhbnNpdGlvbnMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFRyYW5zaXRpb25MYW5lcykgPT09IGxhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpIHtcblxuICB2YXIgU3luY0RlZmF1bHRMYW5lcyA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmUgfCBJbnB1dENvbnRpbnVvdXNMYW5lIHwgRGVmYXVsdEh5ZHJhdGlvbkxhbmUgfCBEZWZhdWx0TGFuZTtcbiAgcmV0dXJuIChsYW5lcyAmIFN5bmNEZWZhdWx0TGFuZXMpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNFeHBpcmVkTGFuZShyb290LCBsYW5lcykge1xuICAvLyBUaGlzIGlzIGEgc2VwYXJhdGUgY2hlY2sgZnJvbSBpbmNsdWRlc0Jsb2NraW5nTGFuZSBiZWNhdXNlIGEgbGFuZSBjYW5cbiAgLy8gZXhwaXJlIGFmdGVyIGEgcmVuZGVyIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuXG4gIHJldHVybiAobGFuZXMgJiByb290LmV4cGlyZWRMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBpc1RyYW5zaXRpb25MYW5lKGxhbmUpIHtcbiAgcmV0dXJuIChsYW5lICYgVHJhbnNpdGlvbkxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCkge1xuICAvLyBDeWNsZSB0aHJvdWdoIHRoZSBsYW5lcywgYXNzaWduaW5nIGVhY2ggbmV3IHRyYW5zaXRpb24gdG8gdGhlIG5leHQgbGFuZS5cbiAgLy8gSW4gbW9zdCBjYXNlcywgdGhpcyBtZWFucyBldmVyeSB0cmFuc2l0aW9uIGdldHMgaXRzIG93biBsYW5lLCB1bnRpbCB3ZVxuICAvLyBydW4gb3V0IG9mIGxhbmVzIGFuZCBjeWNsZSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuXG4gIHZhciBsYW5lID0gbmV4dFRyYW5zaXRpb25MYW5lO1xuICBuZXh0VHJhbnNpdGlvbkxhbmUgPDw9IDE7XG5cbiAgaWYgKChuZXh0VHJhbnNpdGlvbkxhbmUgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBOb0xhbmVzKSB7XG4gICAgbmV4dFRyYW5zaXRpb25MYW5lID0gVHJhbnNpdGlvbkxhbmUxO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBjbGFpbU5leHRSZXRyeUxhbmUoKSB7XG4gIHZhciBsYW5lID0gbmV4dFJldHJ5TGFuZTtcbiAgbmV4dFJldHJ5TGFuZSA8PD0gMTtcblxuICBpZiAoKG5leHRSZXRyeUxhbmUgJiBSZXRyeUxhbmVzKSA9PT0gTm9MYW5lcykge1xuICAgIG5leHRSZXRyeUxhbmUgPSBSZXRyeUxhbmUxO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSB7XG4gIHJldHVybiBsYW5lcyAmIC1sYW5lcztcbn1cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lKGxhbmVzKSB7XG4gIC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBnZXRzIGlubGluZWQuIE9ubHkgZXhpc3RzIHNvIHRvIGNvbW11bmljYXRlIHRoYXQgaXRcbiAgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggYml0IGlzIHNlbGVjdGVkOyB5b3UgY2FuIHBpY2sgYW55IGJpdCB3aXRob3V0XG4gIC8vIGFmZmVjdGluZyB0aGUgYWxnb3JpdGhtcyB3aGVyZSBpdHMgdXNlZC4gSGVyZSBJJ20gdXNpbmdcbiAgLy8gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBmZXdlc3Qgb3BlcmF0aW9ucy5cbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKSB7XG4gIHJldHVybiAzMSAtIGNsejMyKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbGFuZVRvSW5kZXgobGFuZSkge1xuICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lKTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNTb21lTGFuZShhLCBiKSB7XG4gIHJldHVybiAoYSAmIGIpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNTdWJzZXRPZkxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiAoc2V0ICYgc3Vic2V0KSA9PT0gc3Vic2V0O1xufVxuZnVuY3Rpb24gbWVyZ2VMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhIHwgYjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiBzZXQgJiB+c3Vic2V0O1xufVxuZnVuY3Rpb24gaW50ZXJzZWN0TGFuZXMoYSwgYikge1xuICByZXR1cm4gYSAmIGI7XG59IC8vIFNlZW1zIHJlZHVuZGFudCwgYnV0IGl0IGNoYW5nZXMgdGhlIHR5cGUgZnJvbSBhIHNpbmdsZSBsYW5lICh1c2VkIGZvclxuLy8gdXBkYXRlcykgdG8gYSBncm91cCBvZiBsYW5lcyAodXNlZCBmb3IgZmx1c2hpbmcgd29yaykuXG5cbmZ1bmN0aW9uIGxhbmVUb0xhbmVzKGxhbmUpIHtcbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBoaWdoZXJQcmlvcml0eUxhbmUoYSwgYikge1xuICAvLyBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlIGJpdCByYW5nZXMgZGVjcmVhc2UgaW4gcHJpb3JpdHkgYXMgeW91IGdvIGxlZnQuXG4gIHJldHVybiBhICE9PSBOb0xhbmUgJiYgYSA8IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUxhbmVNYXAoaW5pdGlhbCkge1xuICAvLyBJbnRlbnRpb25hbGx5IHB1c2hpbmcgb25lIGJ5IG9uZS5cbiAgLy8gaHR0cHM6Ly92OC5kZXYvYmxvZy9lbGVtZW50cy1raW5kcyNhdm9pZC1jcmVhdGluZy1ob2xlc1xuICB2YXIgbGFuZU1hcCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgVG90YWxMYW5lczsgaSsrKSB7XG4gICAgbGFuZU1hcC5wdXNoKGluaXRpYWwpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmVNYXA7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgdXBkYXRlTGFuZSwgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGVuZGluZ0xhbmVzIHw9IHVwZGF0ZUxhbmU7IC8vIElmIHRoZXJlIGFyZSBhbnkgc3VzcGVuZGVkIHRyYW5zaXRpb25zLCBpdCdzIHBvc3NpYmxlIHRoaXMgbmV3IHVwZGF0ZVxuICAvLyBjb3VsZCB1bmJsb2NrIHRoZW0uIENsZWFyIHRoZSBzdXNwZW5kZWQgbGFuZXMgc28gdGhhdCB3ZSBjYW4gdHJ5IHJlbmRlcmluZ1xuICAvLyB0aGVtIGFnYWluLlxuICAvL1xuICAvLyBUT0RPOiBXZSByZWFsbHkgb25seSBuZWVkIHRvIHVuc3VzcGVuZCBvbmx5IGxhbmVzIHRoYXQgYXJlIGluIHRoZVxuICAvLyBgc3VidHJlZUxhbmVzYCBvZiB0aGUgdXBkYXRlZCBmaWJlciwgb3IgdGhlIHVwZGF0ZSBsYW5lcyBvZiB0aGUgcmV0dXJuXG4gIC8vIHBhdGguIFRoaXMgd291bGQgZXhjbHVkZSBzdXNwZW5kZWQgdXBkYXRlcyBpbiBhbiB1bnJlbGF0ZWQgc2libGluZyB0cmVlLFxuICAvLyBzaW5jZSB0aGVyZSdzIG5vIHdheSBmb3IgdGhpcyB1cGRhdGUgdG8gdW5ibG9jayBpdC5cbiAgLy9cbiAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpZiB0aGUgaW5jb21pbmcgdXBkYXRlIGlzIGlkbGUsIGJlY2F1c2Ugd2UgbmV2ZXIgcHJvY2Vzc1xuICAvLyBpZGxlIHVwZGF0ZXMgdW50aWwgYWZ0ZXIgYWxsIHRoZSByZWd1bGFyIHVwZGF0ZXMgaGF2ZSBmaW5pc2hlZDsgdGhlcmUncyBub1xuICAvLyB3YXkgaXQgY291bGQgdW5ibG9jayBhIHRyYW5zaXRpb24uXG5cbiAgaWYgKHVwZGF0ZUxhbmUgIT09IElkbGVMYW5lKSB7XG4gICAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcm9vdC5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgodXBkYXRlTGFuZSk7IC8vIFdlIGNhbiBhbHdheXMgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRpbWVzdGFtcCBiZWNhdXNlIHdlIHByZWZlciB0aGUgbW9zdFxuICAvLyByZWNlbnQgZXZlbnQsIGFuZCB3ZSBhc3N1bWUgdGltZSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG5cbiAgZXZlbnRUaW1lc1tpbmRleF0gPSBldmVudFRpbWU7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICByb290LnN1c3BlbmRlZExhbmVzIHw9IHN1c3BlbmRlZExhbmVzO1xuICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lczsgLy8gVGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIENQVS1ib3VuZC4gQ2xlYXIgdGhlaXIgZXhwaXJhdGlvbiB0aW1lcy5cblxuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7XG4gIHZhciBsYW5lcyA9IHN1c3BlbmRlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcywgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcykge1xuICB2YXIgbm9Mb25nZXJQZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcyAmIH5yZW1haW5pbmdMYW5lcztcbiAgcm9vdC5wZW5kaW5nTGFuZXMgPSByZW1haW5pbmdMYW5lczsgLy8gTGV0J3MgdHJ5IGV2ZXJ5dGhpbmcgYWdhaW5cblxuICByb290LnN1c3BlbmRlZExhbmVzID0gTm9MYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHJvb3QuZXhwaXJlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290Lm11dGFibGVSZWFkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHJvb3QuZW50YW5nbGVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBDbGVhciB0aGUgbGFuZXMgdGhhdCBubyBsb25nZXIgaGF2ZSBwZW5kaW5nIHdvcmtcblxuICB2YXIgbGFuZXMgPSBub0xvbmdlclBlbmRpbmdMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdID0gTm9MYW5lcztcbiAgICBldmVudFRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgZW50YW5nbGVkTGFuZXMpIHtcbiAgLy8gSW4gYWRkaXRpb24gdG8gZW50YW5nbGluZyBlYWNoIG9mIHRoZSBnaXZlbiBsYW5lcyB3aXRoIGVhY2ggb3RoZXIsIHdlIGFsc29cbiAgLy8gaGF2ZSB0byBjb25zaWRlciBfdHJhbnNpdGl2ZV8gZW50YW5nbGVtZW50cy4gRm9yIGVhY2ggbGFuZSB0aGF0IGlzIGFscmVhZHlcbiAgLy8gZW50YW5nbGVkIHdpdGggKmFueSogb2YgdGhlIGdpdmVuIGxhbmVzLCB0aGF0IGxhbmUgaXMgbm93IHRyYW5zaXRpdmVseVxuICAvLyBlbnRhbmdsZWQgd2l0aCAqYWxsKiB0aGUgZ2l2ZW4gbGFuZXMuXG4gIC8vXG4gIC8vIFRyYW5zbGF0ZWQ6IElmIEMgaXMgZW50YW5nbGVkIHdpdGggQSwgdGhlbiBlbnRhbmdsaW5nIEEgd2l0aCBCIGFsc29cbiAgLy8gZW50YW5nbGVzIEMgd2l0aCBCLlxuICAvL1xuICAvLyBJZiB0aGlzIGlzIGhhcmQgdG8gZ3Jhc3AsIGl0IG1pZ2h0IGhlbHAgdG8gaW50ZW50aW9uYWxseSBicmVhayB0aGlzXG4gIC8vIGZ1bmN0aW9uIGFuZCBsb29rIGF0IHRoZSB0ZXN0cyB0aGF0IGZhaWwgaW4gUmVhY3RUcmFuc2l0aW9uLXRlc3QuanMuIFRyeVxuICAvLyBjb21tZW50aW5nIG91dCBvbmUgb2YgdGhlIGNvbmRpdGlvbnMgYmVsb3cuXG4gIHZhciByb290RW50YW5nbGVkTGFuZXMgPSByb290LmVudGFuZ2xlZExhbmVzIHw9IGVudGFuZ2xlZExhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGxhbmVzID0gcm9vdEVudGFuZ2xlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcykge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcblxuICAgIGlmICggLy8gSXMgdGhpcyBvbmUgb2YgdGhlIG5ld2x5IGVudGFuZ2xlZCBsYW5lcz9cbiAgICBsYW5lICYgZW50YW5nbGVkTGFuZXMgfCAvLyBJcyB0aGlzIGxhbmUgdHJhbnNpdGl2ZWx5IGVudGFuZ2xlZCB3aXRoIHRoZSBuZXdseSBlbnRhbmdsZWQgbGFuZXM/XG4gICAgZW50YW5nbGVtZW50c1tpbmRleF0gJiBlbnRhbmdsZWRMYW5lcykge1xuICAgICAgZW50YW5nbGVtZW50c1tpbmRleF0gfD0gZW50YW5nbGVkTGFuZXM7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb24ocm9vdCwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHJlbmRlckxhbmUgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lKHJlbmRlckxhbmVzKTtcbiAgdmFyIGxhbmU7XG5cbiAgc3dpdGNoIChyZW5kZXJMYW5lKSB7XG4gICAgY2FzZSBJbnB1dENvbnRpbnVvdXNMYW5lOlxuICAgICAgbGFuZSA9IElucHV0Q29udGludW91c0h5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRGVmYXVsdExhbmU6XG4gICAgICBsYW5lID0gRGVmYXVsdEh5ZHJhdGlvbkxhbmU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUzOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU0OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU2OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU3OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU4OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmU5OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMDpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTE6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTEyOlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxMzpcbiAgICBjYXNlIFRyYW5zaXRpb25MYW5lMTQ6XG4gICAgY2FzZSBUcmFuc2l0aW9uTGFuZTE1OlxuICAgIGNhc2UgVHJhbnNpdGlvbkxhbmUxNjpcbiAgICBjYXNlIFJldHJ5TGFuZTE6XG4gICAgY2FzZSBSZXRyeUxhbmUyOlxuICAgIGNhc2UgUmV0cnlMYW5lMzpcbiAgICBjYXNlIFJldHJ5TGFuZTQ6XG4gICAgY2FzZSBSZXRyeUxhbmU1OlxuICAgICAgbGFuZSA9IFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIElkbGVMYW5lOlxuICAgICAgbGFuZSA9IElkbGVIeWRyYXRpb25MYW5lO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRXZlcnl0aGluZyBlbHNlIGlzIGFscmVhZHkgZWl0aGVyIGEgaHlkcmF0aW9uIGxhbmUsIG9yIHNob3VsZG4ndFxuICAgICAgLy8gYmUgcmV0cmllZCBhdCBhIGh5ZHJhdGlvbiBsYW5lLlxuICAgICAgbGFuZSA9IE5vTGFuZTtcbiAgICAgIGJyZWFrO1xuICB9IC8vIENoZWNrIGlmIHRoZSBsYW5lIHdlIGNob3NlIGlzIHN1c3BlbmRlZC4gSWYgc28sIHRoYXQgaW5kaWNhdGVzIHRoYXQgd2VcbiAgLy8gYWxyZWFkeSBhdHRlbXB0ZWQgYW5kIGZhaWxlZCB0byBoeWRyYXRlIGF0IHRoYXQgbGV2ZWwuIEFsc28gY2hlY2sgaWYgd2UncmVcbiAgLy8gYWxyZWFkeSByZW5kZXJpbmcgdGhhdCBsYW5lLCB3aGljaCBpcyByYXJlIGJ1dCBjb3VsZCBoYXBwZW4uXG5cblxuICBpZiAoKGxhbmUgJiAocm9vdC5zdXNwZW5kZWRMYW5lcyB8IHJlbmRlckxhbmVzKSkgIT09IE5vTGFuZSkge1xuICAgIC8vIEdpdmUgdXAgdHJ5aW5nIHRvIGh5ZHJhdGUgYW5kIGZhbGwgYmFjayB0byBjbGllbnQgcmVuZGVyLlxuICAgIHJldHVybiBOb0xhbmU7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZXMpIHtcblxuICBpZiAoIWlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXA7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IGxhbmVUb0luZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIHVwZGF0ZXJzID0gcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcFtpbmRleF07XG4gICAgdXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufVxuZnVuY3Rpb24gbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKSB7XG5cbiAgaWYgKCFpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwID0gcm9vdC5wZW5kaW5nVXBkYXRlcnNMYW5lTWFwO1xuICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgdXBkYXRlcnMgPSBwZW5kaW5nVXBkYXRlcnNMYW5lTWFwW2luZGV4XTtcblxuICAgIGlmICh1cGRhdGVycy5zaXplID4gMCkge1xuICAgICAgdXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgICBpZiAoYWx0ZXJuYXRlID09PSBudWxsIHx8ICFtZW1vaXplZFVwZGF0ZXJzLmhhcyhhbHRlcm5hdGUpKSB7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5hZGQoZmliZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25zRm9yTGFuZXMocm9vdCwgbGFuZXMpIHtcbiAge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbnZhciBEaXNjcmV0ZUV2ZW50UHJpb3JpdHkgPSBTeW5jTGFuZTtcbnZhciBDb250aW51b3VzRXZlbnRQcmlvcml0eSA9IElucHV0Q29udGludW91c0xhbmU7XG52YXIgRGVmYXVsdEV2ZW50UHJpb3JpdHkgPSBEZWZhdWx0TGFuZTtcbnZhciBJZGxlRXZlbnRQcmlvcml0eSA9IElkbGVMYW5lO1xudmFyIGN1cnJlbnRVcGRhdGVQcmlvcml0eSA9IE5vTGFuZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpIHtcbiAgcmV0dXJuIGN1cnJlbnRVcGRhdGVQcmlvcml0eTtcbn1cbmZ1bmN0aW9uIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShuZXdQcmlvcml0eSkge1xuICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBuZXdQcmlvcml0eTtcbn1cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eShwcmlvcml0eSwgZm4pIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBjdXJyZW50VXBkYXRlUHJpb3JpdHk7XG5cbiAgdHJ5IHtcbiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBwcmlvcml0eTtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VXBkYXRlUHJpb3JpdHkgPSBwcmV2aW91c1ByaW9yaXR5O1xuICB9XG59XG5mdW5jdGlvbiBoaWdoZXJFdmVudFByaW9yaXR5KGEsIGIpIHtcbiAgcmV0dXJuIGEgIT09IDAgJiYgYSA8IGIgPyBhIDogYjtcbn1cbmZ1bmN0aW9uIGxvd2VyRXZlbnRQcmlvcml0eShhLCBiKSB7XG4gIHJldHVybiBhID09PSAwIHx8IGEgPiBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBpc0hpZ2hlckV2ZW50UHJpb3JpdHkoYSwgYikge1xuICByZXR1cm4gYSAhPT0gMCAmJiBhIDwgYjtcbn1cbmZ1bmN0aW9uIGxhbmVzVG9FdmVudFByaW9yaXR5KGxhbmVzKSB7XG4gIHZhciBsYW5lID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZShsYW5lcyk7XG5cbiAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5LCBsYW5lKSkge1xuICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gIH1cblxuICBpZiAoIWlzSGlnaGVyRXZlbnRQcmlvcml0eShDb250aW51b3VzRXZlbnRQcmlvcml0eSwgbGFuZSkpIHtcbiAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG4gIH1cblxuICBpZiAoaW5jbHVkZXNOb25JZGxlV29yayhsYW5lKSkge1xuICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIHJldHVybiBJZGxlRXZlbnRQcmlvcml0eTtcbn1cblxuLy8gVGhpcyBpcyBpbXBvcnRlZCBieSB0aGUgZXZlbnQgcmVwbGF5aW5nIGltcGxlbWVudGF0aW9uIGluIFJlYWN0IERPTS4gSXQnc1xuLy8gaW4gYSBzZXBhcmF0ZSBmaWxlIHRvIGJyZWFrIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSByZW5kZXJlciBhbmRcbi8vIHRoZSByZWNvbmNpbGVyLlxuZnVuY3Rpb24gaXNSb290RGVoeWRyYXRlZChyb290KSB7XG4gIHZhciBjdXJyZW50U3RhdGUgPSByb290LmN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIGN1cnJlbnRTdGF0ZS5pc0RlaHlkcmF0ZWQ7XG59XG5cbnZhciBfYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uO1xuXG5mdW5jdGlvbiBzZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZm4pIHtcbiAgX2F0dGVtcHRTeW5jaHJvbm91c0h5ZHJhdGlvbiA9IGZuO1xufVxuZnVuY3Rpb24gYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uKGZpYmVyKSB7XG4gIF9hdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpO1xufVxudmFyIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uO1xuZnVuY3Rpb24gc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24gPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5ID0gZm47XG59XG52YXIgZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDE7XG5mdW5jdGlvbiBzZXRHZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoZm4pIHtcbiAgZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5JDEgPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eTtcbmZ1bmN0aW9uIHNldEF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KGZuKSB7XG4gIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5ID0gZm47XG59IC8vIFRPRE86IFVwZ3JhZGUgdGhpcyBkZWZpbml0aW9uIG9uY2Ugd2UncmUgb24gYSBuZXdlciB2ZXJzaW9uIG9mIEZsb3cgdGhhdFxuLy8gaGFzIHRoaXMgZGVmaW5pdGlvbiBidWlsdC1pbi5cblxudmFyIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTsgLy8gVGhlIHF1ZXVlIG9mIGRpc2NyZXRlIGV2ZW50cyB0byBiZSByZXBsYXllZC5cblxudmFyIHF1ZXVlZERpc2NyZXRlRXZlbnRzID0gW107IC8vIEluZGljYXRlcyBpZiBhbnkgY29udGludW91cyBldmVudCB0YXJnZXRzIGFyZSBub24tbnVsbCBmb3IgZWFybHkgYmFpbG91dC5cbi8vIGlmIHRoZSBsYXN0IHRhcmdldCB3YXMgZGVoeWRyYXRlZC5cblxudmFyIHF1ZXVlZEZvY3VzID0gbnVsbDtcbnZhciBxdWV1ZWREcmFnID0gbnVsbDtcbnZhciBxdWV1ZWRNb3VzZSA9IG51bGw7IC8vIEZvciBwb2ludGVyIGV2ZW50cyB0aGVyZSBjYW4gYmUgb25lIGxhdGVzdCBldmVudCBwZXIgcG9pbnRlcklkLlxuXG52YXIgcXVldWVkUG9pbnRlcnMgPSBuZXcgTWFwKCk7XG52YXIgcXVldWVkUG9pbnRlckNhcHR1cmVzID0gbmV3IE1hcCgpOyAvLyBXZSBjb3VsZCBjb25zaWRlciByZXBsYXlpbmcgc2VsZWN0aW9uY2hhbmdlIGFuZCB0b3VjaG1vdmVzIHRvby5cblxudmFyIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cyA9IFtdO1xudmFyIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cyA9IFsnbW91c2Vkb3duJywgJ21vdXNldXAnLCAndG91Y2hjYW5jZWwnLCAndG91Y2hlbmQnLCAndG91Y2hzdGFydCcsICdhdXhjbGljaycsICdkYmxjbGljaycsICdwb2ludGVyY2FuY2VsJywgJ3BvaW50ZXJkb3duJywgJ3BvaW50ZXJ1cCcsICdkcmFnZW5kJywgJ2RyYWdzdGFydCcsICdkcm9wJywgJ2NvbXBvc2l0aW9uZW5kJywgJ2NvbXBvc2l0aW9uc3RhcnQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdpbnB1dCcsICd0ZXh0SW5wdXQnLCAvLyBJbnRlbnRpb25hbGx5IGNhbWVsQ2FzZVxuJ2NvcHknLCAnY3V0JywgJ3Bhc3RlJywgJ2NsaWNrJywgJ2NoYW5nZScsICdjb250ZXh0bWVudScsICdyZXNldCcsICdzdWJtaXQnXTtcbmZ1bmN0aW9uIGlzRGlzY3JldGVFdmVudFRoYXRSZXF1aXJlc0h5ZHJhdGlvbihldmVudFR5cGUpIHtcbiAgcmV0dXJuIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cy5pbmRleE9mKGV2ZW50VHlwZSkgPiAtMTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlUXVldWVkUmVwbGF5YWJsZUV2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiB7XG4gICAgYmxvY2tlZE9uOiBibG9ja2VkT24sXG4gICAgZG9tRXZlbnROYW1lOiBkb21FdmVudE5hbWUsXG4gICAgZXZlbnRTeXN0ZW1GbGFnczogZXZlbnRTeXN0ZW1GbGFncyxcbiAgICBuYXRpdmVFdmVudDogbmF0aXZlRXZlbnQsXG4gICAgdGFyZ2V0Q29udGFpbmVyczogW3RhcmdldENvbnRhaW5lcl1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgcXVldWVkRm9jdXMgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJJZCA9IG5hdGl2ZUV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuZGVsZXRlKHBvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ2xvc3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZGVsZXRlKF9wb2ludGVySWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KGV4aXN0aW5nUXVldWVkRXZlbnQsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChleGlzdGluZ1F1ZXVlZEV2ZW50ID09PSBudWxsIHx8IGV4aXN0aW5nUXVldWVkRXZlbnQubmF0aXZlRXZlbnQgIT09IG5hdGl2ZUV2ZW50KSB7XG4gICAgdmFyIHF1ZXVlZEV2ZW50ID0gY3JlYXRlUXVldWVkUmVwbGF5YWJsZUV2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICAgIGlmIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIHZhciBfZmliZXIyID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShibG9ja2VkT24pO1xuXG4gICAgICBpZiAoX2ZpYmVyMiAhPT0gbnVsbCkge1xuICAgICAgICAvLyBBdHRlbXB0IHRvIGluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGlzIHRhcmdldC5cbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXVlZEV2ZW50O1xuICB9IC8vIElmIHdlIGhhdmUgYWxyZWFkeSBxdWV1ZWQgdGhpcyBleGFjdCBldmVudCwgdGhlbiBpdCdzIGJlY2F1c2VcbiAgLy8gdGhlIGRpZmZlcmVudCBldmVudCBzeXN0ZW1zIGhhdmUgZGlmZmVyZW50IERPTSBldmVudCBsaXN0ZW5lcnMuXG4gIC8vIFdlIGNhbiBhY2N1bXVsYXRlIHRoZSBmbGFncywgYW5kIHRoZSB0YXJnZXRDb250YWluZXJzLCBhbmRcbiAgLy8gc3RvcmUgYSBzaW5nbGUgZXZlbnQgdG8gYmUgcmVwbGF5ZWQuXG5cblxuICBleGlzdGluZ1F1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MgfD0gZXZlbnRTeXN0ZW1GbGFncztcbiAgdmFyIHRhcmdldENvbnRhaW5lcnMgPSBleGlzdGluZ1F1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgaWYgKHRhcmdldENvbnRhaW5lciAhPT0gbnVsbCAmJiB0YXJnZXRDb250YWluZXJzLmluZGV4T2YodGFyZ2V0Q29udGFpbmVyKSA9PT0gLTEpIHtcbiAgICB0YXJnZXRDb250YWluZXJzLnB1c2godGFyZ2V0Q29udGFpbmVyKTtcbiAgfVxuXG4gIHJldHVybiBleGlzdGluZ1F1ZXVlZEV2ZW50O1xufVxuXG5mdW5jdGlvbiBxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRoZXNlIHNldCByZWxhdGVkVGFyZ2V0IHRvIG51bGwgYmVjYXVzZSB0aGUgcmVwbGF5ZWQgZXZlbnQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIHdlXG4gIC8vIG1vdmVkIGZyb20gb3V0c2lkZSB0aGUgd2luZG93IChubyB0YXJnZXQpIG9udG8gdGhlIHRhcmdldCBvbmNlIGl0IGh5ZHJhdGVzLlxuICAvLyBJbnN0ZWFkIG9mIG11dGF0aW5nIHdlIGNvdWxkIGNsb25lIHRoZSBldmVudC5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZvY3VzRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRm9jdXMgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZEZvY3VzLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBmb2N1c0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgZHJhZ0V2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHF1ZXVlZERyYWcgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZERyYWcsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGRyYWdFdmVudCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIG1vdXNlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkTW91c2UgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZE1vdXNlLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBtb3VzZUV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBwb2ludGVyRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIHBvaW50ZXJJZCA9IHBvaW50ZXJFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJzLnNldChwb2ludGVySWQsIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkUG9pbnRlcnMuZ2V0KHBvaW50ZXJJZCkgfHwgbnVsbCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcG9pbnRlckV2ZW50KSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgY2FzZSAnZ290cG9pbnRlcmNhcHR1cmUnOlxuICAgICAge1xuICAgICAgICB2YXIgX3BvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgX3BvaW50ZXJJZDIgPSBfcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLnNldChfcG9pbnRlcklkMiwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZ2V0KF9wb2ludGVySWQyKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBfcG9pbnRlckV2ZW50KSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBDaGVjayBpZiB0aGlzIHRhcmdldCBpcyB1bmJsb2NrZWQuIFJldHVybnMgdHJ1ZSBpZiBpdCdzIHVuYmxvY2tlZC5cblxuZnVuY3Rpb24gYXR0ZW1wdEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHF1ZXVlZFRhcmdldCkge1xuICAvLyBUT0RPOiBUaGlzIGZ1bmN0aW9uIHNoYXJlcyBhIGxvdCBvZiBsb2dpYyB3aXRoIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQuXG4gIC8vIFRyeSB0byB1bmlmeSB0aGVtLiBJdCdzIGEgYml0IHRyaWNreSBzaW5jZSBpdCB3b3VsZCByZXF1aXJlIHR3byByZXR1cm5cbiAgLy8gdmFsdWVzLlxuICB2YXIgdGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHF1ZXVlZFRhcmdldC50YXJnZXQpO1xuXG4gIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXRJbnN0KTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmxvY2tlZCBvbiBoeWRyYXRpbmcgdGhpcyBib3VuZGFyeS5cbiAgICAgICAgICAvLyBJbmNyZWFzZSBpdHMgcHJpb3JpdHkuXG4gICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IGluc3RhbmNlO1xuICAgICAgICAgIGF0dGVtcHRIeWRyYXRpb25BdFByaW9yaXR5KHF1ZXVlZFRhcmdldC5wcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICB2YXIgcm9vdCA9IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBnZXRDb250YWluZXJGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpOyAvLyBXZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBhIHdheSB0byBpbmNyZWFzZSB0aGUgcHJpb3JpdHkgb2ZcbiAgICAgICAgICAvLyBhIHJvb3Qgb3RoZXIgdGhhbiBzeW5jLlxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlRXhwbGljaXRIeWRyYXRpb25UYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgd2lsbCByZWFkIHRoZSBwcmlvcml0eSBpZiBpdCdzIGRpc3BhdGNoZWQgYnkgdGhlIFJlYWN0XG4gIC8vIGV2ZW50IHN5c3RlbSBidXQgbm90IG5hdGl2ZSBldmVudHMuIFNob3VsZCByZWFkIHdpbmRvdy5ldmVudC50eXBlLCBsaWtlXG4gIC8vIHdlIGRvIGZvciB1cGRhdGVzIChnZXRDdXJyZW50RXZlbnRQcmlvcml0eSkuXG4gIHZhciB1cGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSQxKCk7XG4gIHZhciBxdWV1ZWRUYXJnZXQgPSB7XG4gICAgYmxvY2tlZE9uOiBudWxsLFxuICAgIHRhcmdldDogdGFyZ2V0LFxuICAgIHByaW9yaXR5OiB1cGRhdGVQcmlvcml0eVxuICB9O1xuICB2YXIgaSA9IDA7XG5cbiAgZm9yICg7IGkgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBTdG9wIG9uY2Ugd2UgaGl0IHRoZSBmaXJzdCB0YXJnZXQgd2l0aCBsb3dlciBwcmlvcml0eSB0aGFuXG4gICAgaWYgKCFpc0hpZ2hlckV2ZW50UHJpb3JpdHkodXBkYXRlUHJpb3JpdHksIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tpXS5wcmlvcml0eSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5zcGxpY2UoaSwgMCwgcXVldWVkVGFyZ2V0KTtcblxuICBpZiAoaSA9PT0gMCkge1xuICAgIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRXZlbnQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0YXJnZXRDb250YWluZXJzID0gcXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICB3aGlsZSAodGFyZ2V0Q29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHRhcmdldENvbnRhaW5lciA9IHRhcmdldENvbnRhaW5lcnNbMF07XG4gICAgdmFyIG5leHRCbG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KHF1ZXVlZEV2ZW50LmRvbUV2ZW50TmFtZSwgcXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBxdWV1ZWRFdmVudC5uYXRpdmVFdmVudCk7XG5cbiAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB2YXIgbmF0aXZlRXZlbnQgPSBxdWV1ZWRFdmVudC5uYXRpdmVFdmVudDtcbiAgICAgICAgdmFyIG5hdGl2ZUV2ZW50Q2xvbmUgPSBuZXcgbmF0aXZlRXZlbnQuY29uc3RydWN0b3IobmF0aXZlRXZlbnQudHlwZSwgbmF0aXZlRXZlbnQpO1xuICAgICAgICBzZXRSZXBsYXlpbmdFdmVudChuYXRpdmVFdmVudENsb25lKTtcbiAgICAgICAgbmF0aXZlRXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgIHJlc2V0UmVwbGF5aW5nRXZlbnQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC4gVHJ5IGFnYWluIGxhdGVyLlxuICAgICAgdmFyIF9maWJlcjMgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKG5leHRCbG9ja2VkT24pO1xuXG4gICAgICBpZiAoX2ZpYmVyMyAhPT0gbnVsbCkge1xuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIzKTtcbiAgICAgIH1cblxuICAgICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIFRoaXMgdGFyZ2V0IGNvbnRhaW5lciB3YXMgc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQuIFRyeSB0aGUgbmV4dC5cblxuXG4gICAgdGFyZ2V0Q29udGFpbmVycy5zaGlmdCgpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcChxdWV1ZWRFdmVudCwga2V5LCBtYXApIHtcbiAgaWYgKGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRXZlbnQpKSB7XG4gICAgbWFwLmRlbGV0ZShrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxheVVuYmxvY2tlZEV2ZW50cygpIHtcbiAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IGZhbHNlO1xuXG5cbiAgaWYgKHF1ZXVlZEZvY3VzICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRm9jdXMpKSB7XG4gICAgcXVldWVkRm9jdXMgPSBudWxsO1xuICB9XG5cbiAgaWYgKHF1ZXVlZERyYWcgIT09IG51bGwgJiYgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWREcmFnKSkge1xuICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICB9XG5cbiAgaWYgKHF1ZXVlZE1vdXNlICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkTW91c2UpKSB7XG4gICAgcXVldWVkTW91c2UgPSBudWxsO1xuICB9XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXApO1xuICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZm9yRWFjaChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXApO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCkge1xuICBpZiAocXVldWVkRXZlbnQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuXG4gICAgaWYgKCFoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0KSB7XG4gICAgICBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gdHJ1ZTsgLy8gU2NoZWR1bGUgYSBjYWxsYmFjayB0byBhdHRlbXB0IHJlcGxheWluZyBhcyBtYW55IGV2ZW50cyBhcyBhcmVcbiAgICAgIC8vIG5vdyB1bmJsb2NrZWQuIFRoaXMgZmlyc3QgbWlnaHQgbm90IGFjdHVhbGx5IGJlIHVuYmxvY2tlZCB5ZXQuXG4gICAgICAvLyBXZSBjb3VsZCBjaGVjayBpdCBlYXJseSB0byBhdm9pZCBzY2hlZHVsaW5nIGFuIHVubmVjZXNzYXJ5IGNhbGxiYWNrLlxuXG4gICAgICBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksIHJlcGxheVVuYmxvY2tlZEV2ZW50cyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJldHJ5SWZCbG9ja2VkT24odW5ibG9ja2VkKSB7XG4gIC8vIE1hcmsgYW55dGhpbmcgdGhhdCB3YXMgYmxvY2tlZCBvbiB0aGlzIGFzIG5vIGxvbmdlciBibG9ja2VkXG4gIC8vIGFuZCBlbGlnaWJsZSBmb3IgYSByZXBsYXkuXG4gIGlmIChxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERpc2NyZXRlRXZlbnRzWzBdLCB1bmJsb2NrZWQpOyAvLyBUaGlzIGlzIGEgZXhwb25lbnRpYWwgc2VhcmNoIGZvciBlYWNoIGJvdW5kYXJ5IHRoYXQgY29tbWl0cy4gSSB0aGluayBpdCdzXG4gICAgLy8gd29ydGggaXQgYmVjYXVzZSB3ZSBleHBlY3QgdmVyeSBmZXcgZGlzY3JldGUgZXZlbnRzIHRvIHF1ZXVlIHVwIGFuZCBvbmNlXG4gICAgLy8gd2UgYXJlIGFjdHVhbGx5IGZ1bGx5IHVuYmxvY2tlZCBpdCB3aWxsIGJlIGZhc3QgdG8gcmVwbGF5IHRoZW0uXG5cbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHF1ZXVlZERpc2NyZXRlRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVldWVkRXZlbnQgPSBxdWV1ZWREaXNjcmV0ZUV2ZW50c1tpXTtcblxuICAgICAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHF1ZXVlZEZvY3VzICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEZvY3VzLCB1bmJsb2NrZWQpO1xuICB9XG5cbiAgaWYgKHF1ZXVlZERyYWcgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRHJhZywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRNb3VzZSwgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIHZhciB1bmJsb2NrID0gZnVuY3Rpb24gKHF1ZXVlZEV2ZW50KSB7XG4gICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKTtcbiAgfTtcblxuICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKHVuYmxvY2spO1xuICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZm9yRWFjaCh1bmJsb2NrKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLmxlbmd0aDsgX2krKykge1xuICAgIHZhciBxdWV1ZWRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbX2ldO1xuXG4gICAgaWYgKHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIG5leHRFeHBsaWNpdFRhcmdldCA9IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1swXTtcblxuICAgIGlmIChuZXh0RXhwbGljaXRUYXJnZXQuYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBzdGlsbCBibG9ja2VkLlxuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChuZXh0RXhwbGljaXRUYXJnZXQpO1xuXG4gICAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBXZSdyZSB1bmJsb2NrZWQuXG4gICAgICAgIHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZzsgLy8gVE9ETzogY2FuIHdlIHN0b3AgZXhwb3J0aW5nIHRoZXNlP1xuXG52YXIgX2VuYWJsZWQgPSB0cnVlOyAvLyBUaGlzIGlzIGV4cG9ydGVkIGluIEZCIGJ1aWxkcyBmb3IgdXNlIGJ5IGxlZ2FjeSBGQiBsYXllciBpbmZyYS5cbi8vIFdlJ2QgbGlrZSB0byByZW1vdmUgdGhpcyBidXQgaXQncyBub3QgY2xlYXIgaWYgdGhpcyBpcyBzYWZlLlxuXG5mdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgX2VuYWJsZWQgPSAhIWVuYWJsZWQ7XG59XG5mdW5jdGlvbiBpc0VuYWJsZWQoKSB7XG4gIHJldHVybiBfZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBldmVudFByaW9yaXR5ID0gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpO1xuICB2YXIgbGlzdGVuZXJXcmFwcGVyO1xuXG4gIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hDb250aW51b3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgZGVmYXVsdDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBsaXN0ZW5lcldyYXBwZXIuYmluZChudWxsLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcik7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRGlzY3JldGVFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoRGlzY3JldGVFdmVudFByaW9yaXR5KTtcbiAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gIH0gZmluYWxseSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaENvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcbiAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoQ29udGludW91c0V2ZW50UHJpb3JpdHkpO1xuICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIGlmICghX2VuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgZGlzcGF0Y2hFdmVudFdpdGhFbmFibGVDYXB0dXJlUGhhc2VTZWxlY3RpdmVIeWRyYXRpb25XaXRob3V0RGlzY3JldGVFdmVudFJlcGxheShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRXaXRoRW5hYmxlQ2FwdHVyZVBoYXNlU2VsZWN0aXZlSHlkcmF0aW9uV2l0aG91dERpc2NyZXRlRXZlbnRSZXBsYXkoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBibG9ja2VkT24gPSBmaW5kSW5zdGFuY2VCbG9ja2luZ0V2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG5cbiAgaWYgKGJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCByZXR1cm5fdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTtcbiAgICBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSkge1xuICAgIG5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHJldHVybjtcbiAgfSAvLyBXZSBuZWVkIHRvIGNsZWFyIG9ubHkgaWYgd2UgZGlkbid0IHF1ZXVlIGJlY2F1c2VcbiAgLy8gcXVldWVpbmcgaXMgYWNjdW11bGF0aXZlLlxuXG5cbiAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UgJiYgaXNEaXNjcmV0ZUV2ZW50VGhhdFJlcXVpcmVzSHlkcmF0aW9uKGRvbUV2ZW50TmFtZSkpIHtcbiAgICB3aGlsZSAoYmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICB2YXIgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChmaWJlciAhPT0gbnVsbCkge1xuICAgICAgICBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oZmliZXIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV4dEJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICAgICAgaWYgKG5leHRCbG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHJldHVybl90YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dEJsb2NrZWRPbiA9PT0gYmxvY2tlZE9uKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBibG9ja2VkT24gPSBuZXh0QmxvY2tlZE9uO1xuICAgIH1cblxuICAgIGlmIChibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIG5hdGl2ZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSAvLyBUaGlzIGlzIG5vdCByZXBsYXlhYmxlIHNvIHdlJ2xsIGludm9rZSBpdCBidXQgd2l0aG91dCBhIHRhcmdldCxcbiAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgc3lzdGVtIG5lZWRzIHRvIHRyYWNlIGl0LlxuXG5cbiAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIG51bGwsIHRhcmdldENvbnRhaW5lcik7XG59XG5cbnZhciByZXR1cm5fdGFyZ2V0SW5zdCA9IG51bGw7IC8vIFJldHVybnMgYSBTdXNwZW5zZUluc3RhbmNlIG9yIENvbnRhaW5lciBpZiBpdCdzIGJsb2NrZWQuXG4vLyBUaGUgcmV0dXJuX3RhcmdldEluc3QgZmllbGQgYWJvdmUgaXMgY29uY2VwdHVhbGx5IHBhcnQgb2YgdGhlIHJldHVybiB2YWx1ZS5cblxuZnVuY3Rpb24gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVE9ETzogV2FybiBpZiBfZW5hYmxlZCBpcyBmYWxzZS5cbiAgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsO1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCk7XG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXRJbnN0KTtcblxuICAgIGlmIChuZWFyZXN0TW91bnRlZCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB0cmVlIGhhcyBiZWVuIHVubW91bnRlZCBhbHJlYWR5LiBEaXNwYXRjaCB3aXRob3V0IGEgdGFyZ2V0LlxuICAgICAgdGFyZ2V0SW5zdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0YWcgPSBuZWFyZXN0TW91bnRlZC50YWc7XG5cbiAgICAgIGlmICh0YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFF1ZXVlIHRoZSBldmVudCB0byBiZSByZXBsYXllZCBsYXRlci4gQWJvcnQgZGlzcGF0Y2hpbmcgc2luY2Ugd2VcbiAgICAgICAgICAvLyBkb24ndCB3YW50IHRoaXMgZXZlbnQgZGlzcGF0Y2hlZCB0d2ljZSB0aHJvdWdoIHRoZSBldmVudCBzeXN0ZW0uXG4gICAgICAgICAgLy8gVE9ETzogSWYgdGhpcyBpcyB0aGUgZmlyc3QgZGlzY3JldGUgZXZlbnQgaW4gdGhlIHF1ZXVlLiBTY2hlZHVsZSBhbiBpbmNyZWFzZWRcbiAgICAgICAgICAvLyBwcmlvcml0eSBmb3IgdGhpcyBib3VuZGFyeS5cbiAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgIH0gLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBzb21ldGhpbmcgd2VudCB3cm9uZyBidXQgdG8gYXZvaWQgYmxvY2tpbmdcbiAgICAgICAgLy8gdGhlIHdob2xlIHN5c3RlbSwgZGlzcGF0Y2ggdGhlIGV2ZW50IHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICAgIC8vIFRPRE86IFdhcm4uXG5cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAodGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICB2YXIgcm9vdCA9IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoaXNSb290RGVoeWRyYXRlZChyb290KSkge1xuICAgICAgICAgIC8vIElmIHRoaXMgaGFwcGVucyBkdXJpbmcgYSByZXBsYXkgc29tZXRoaW5nIHdlbnQgd3JvbmcgYW5kIGl0IG1pZ2h0IGJsb2NrXG4gICAgICAgICAgLy8gdGhlIHdob2xlIHN5c3RlbS5cbiAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChuZWFyZXN0TW91bnRlZCAhPT0gdGFyZ2V0SW5zdCkge1xuICAgICAgICAvLyBJZiB3ZSBnZXQgYW4gZXZlbnQgKGV4OiBpbWcgb25sb2FkKSBiZWZvcmUgY29tbWl0dGluZyB0aGF0XG4gICAgICAgIC8vIGNvbXBvbmVudCdzIG1vdW50LCBpZ25vcmUgaXQgZm9yIG5vdyAodGhhdCBpcywgdHJlYXQgaXQgYXMgaWYgaXQgd2FzIGFuXG4gICAgICAgIC8vIGV2ZW50IG9uIGEgbm9uLVJlYWN0IHRyZWUpLiBXZSBtaWdodCBhbHNvIGNvbnNpZGVyIHF1ZXVlaW5nIGV2ZW50cyBhbmRcbiAgICAgICAgLy8gZGlzcGF0Y2hpbmcgdGhlbSBhZnRlciB0aGUgbW91bnQuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDsgLy8gV2UncmUgbm90IGJsb2NrZWQgb24gYW55dGhpbmcuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIC8vIFVzZWQgYnkgU2ltcGxlRXZlbnRQbHVnaW46XG4gICAgY2FzZSAnY2FuY2VsJzpcbiAgICBjYXNlICdjbGljayc6XG4gICAgY2FzZSAnY2xvc2UnOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICBjYXNlICdjb3B5JzpcbiAgICBjYXNlICdjdXQnOlxuICAgIGNhc2UgJ2F1eGNsaWNrJzpcbiAgICBjYXNlICdkYmxjbGljayc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgY2FzZSAnZHJhZ3N0YXJ0JzpcbiAgICBjYXNlICdkcm9wJzpcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ2ludmFsaWQnOlxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdrZXl1cCc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdtb3VzZXVwJzpcbiAgICBjYXNlICdwYXN0ZSc6XG4gICAgY2FzZSAncGF1c2UnOlxuICAgIGNhc2UgJ3BsYXknOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVydXAnOlxuICAgIGNhc2UgJ3JhdGVjaGFuZ2UnOlxuICAgIGNhc2UgJ3Jlc2V0JzpcbiAgICBjYXNlICdyZXNpemUnOlxuICAgIGNhc2UgJ3NlZWtlZCc6XG4gICAgY2FzZSAnc3VibWl0JzpcbiAgICBjYXNlICd0b3VjaGNhbmNlbCc6XG4gICAgY2FzZSAndG91Y2hlbmQnOlxuICAgIGNhc2UgJ3RvdWNoc3RhcnQnOlxuICAgIGNhc2UgJ3ZvbHVtZWNoYW5nZSc6IC8vIFVzZWQgYnkgcG9seWZpbGxzOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnY2hhbmdlJzpcbiAgICBjYXNlICdzZWxlY3Rpb25jaGFuZ2UnOlxuICAgIGNhc2UgJ3RleHRJbnB1dCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgY2FzZSAnY29tcG9zaXRpb25lbmQnOlxuICAgIGNhc2UgJ2NvbXBvc2l0aW9udXBkYXRlJzogLy8gT25seSBlbmFibGVDcmVhdGVFdmVudEhhbmRsZUFQSTpcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6IC8vIE5vdCB1c2VkIGJ5IFJlYWN0IGJ1dCBjb3VsZCBiZSBieSB1c2VyIGNvZGU6XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlICdiZWZvcmVpbnB1dCc6XG4gICAgY2FzZSAnYmx1cic6XG4gICAgY2FzZSAnZnVsbHNjcmVlbmNoYW5nZSc6XG4gICAgY2FzZSAnZm9jdXMnOlxuICAgIGNhc2UgJ2hhc2hjaGFuZ2UnOlxuICAgIGNhc2UgJ3BvcHN0YXRlJzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3NlbGVjdHN0YXJ0JzpcbiAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG5cbiAgICBjYXNlICdkcmFnJzpcbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdleGl0JzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJtb3ZlJzpcbiAgICBjYXNlICdwb2ludGVyb3V0JzpcbiAgICBjYXNlICdwb2ludGVyb3Zlcic6XG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICBjYXNlICd0b2dnbGUnOlxuICAgIGNhc2UgJ3RvdWNobW92ZSc6XG4gICAgY2FzZSAnd2hlZWwnOiAvLyBOb3QgdXNlZCBieSBSZWFjdCBidXQgY291bGQgYmUgYnkgdXNlciBjb2RlOlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSAnbW91c2VlbnRlcic6XG4gICAgY2FzZSAnbW91c2VsZWF2ZSc6XG4gICAgY2FzZSAncG9pbnRlcmVudGVyJzpcbiAgICBjYXNlICdwb2ludGVybGVhdmUnOlxuICAgICAgcmV0dXJuIENvbnRpbnVvdXNFdmVudFByaW9yaXR5O1xuXG4gICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIG1pZ2h0IGJlIGluIHRoZSBTY2hlZHVsZXIgY2FsbGJhY2suXG4gICAgICAgIC8vIEV2ZW50dWFsbHkgdGhpcyBtZWNoYW5pc20gd2lsbCBiZSByZXBsYWNlZCBieSBhIGNoZWNrXG4gICAgICAgIC8vIG9mIHRoZSBjdXJyZW50IHByaW9yaXR5IG9uIHRoZSBuYXRpdmUgc2NoZWR1bGVyLlxuICAgICAgICB2YXIgc2NoZWR1bGVyUHJpb3JpdHkgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpO1xuXG4gICAgICAgIHN3aXRjaCAoc2NoZWR1bGVyUHJpb3JpdHkpIHtcbiAgICAgICAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgICAgICAgICAgcmV0dXJuIERpc2NyZXRlRXZlbnRQcmlvcml0eTtcblxuICAgICAgICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgTG93U2NoZWR1bGVyUHJpb3JpdHksIHNvbWVob3cuIE1heWJlIHRoZSBzYW1lIGxhbmUgYXMgaHlkcmF0aW9uLlxuICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuXG4gICAgICAgICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICAgICAgICByZXR1cm4gSWRsZUV2ZW50UHJpb3JpdHk7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBUaGVzZSB2YXJpYWJsZXMgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGV4dCBjb250ZW50IG9mIGEgdGFyZ2V0IG5vZGUsXG4gKiBhbGxvd2luZyBjb21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIElkZW50aWZ5IHRoZSBub2RlIHdoZXJlIHNlbGVjdGlvbiBjdXJyZW50bHkgYmVnaW5zLCB0aGVuIG9ic2VydmVcbiAqIGJvdGggaXRzIHRleHQgY29udGVudCBhbmQgaXRzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlXG4gKiBicm93c2VyIG1heSBuYXRpdmVseSByZXBsYWNlIHRoZSB0YXJnZXQgbm9kZSBkdXJpbmcgY29tcG9zaXRpb24sIHdlIGNhblxuICogdXNlIGl0cyBwb3NpdGlvbiB0byBmaW5kIGl0cyByZXBsYWNlbWVudC5cbiAqXG4gKlxuICovXG52YXIgcm9vdCA9IG51bGw7XG52YXIgc3RhcnRUZXh0ID0gbnVsbDtcbnZhciBmYWxsYmFja1RleHQgPSBudWxsO1xuZnVuY3Rpb24gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCkge1xuICByb290ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIHN0YXJ0VGV4dCA9IGdldFRleHQoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgcm9vdCA9IG51bGw7XG4gIHN0YXJ0VGV4dCA9IG51bGw7XG4gIGZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5mdW5jdGlvbiBnZXREYXRhKCkge1xuICBpZiAoZmFsbGJhY2tUZXh0KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgfVxuXG4gIHZhciBzdGFydDtcbiAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQ7XG4gIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICB2YXIgZW5kO1xuICB2YXIgZW5kVmFsdWUgPSBnZXRUZXh0KCk7XG4gIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG5cbiAgZm9yIChlbmQgPSAxOyBlbmQgPD0gbWluRW5kOyBlbmQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSAhPT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICBmYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTtcbiAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHQoKSB7XG4gIGlmICgndmFsdWUnIGluIHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByb290LnRleHRDb250ZW50O1xufVxuXG4vKipcbiAqIGBjaGFyQ29kZWAgcmVwcmVzZW50cyB0aGUgYWN0dWFsIFwiY2hhcmFjdGVyIGNvZGVcIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aFxuICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhhdCBjb3JyZXNwb25kIHRvIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQgYGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuXG4gKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLFxuICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXplZCBgY2hhckNvZGVgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjaGFyQ29kZTtcbiAgdmFyIGtleUNvZGUgPSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuXG4gIGlmICgnY2hhckNvZGUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgY2hhckNvZGUgPSBuYXRpdmVFdmVudC5jaGFyQ29kZTsgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLlxuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfSAvLyBJRSBhbmQgRWRnZSAob24gV2luZG93cykgYW5kIENocm9tZSAvIFNhZmFyaSAob24gV2luZG93cyBhbmQgTGludXgpXG4gIC8vIHJlcG9ydCBFbnRlciBhcyBjaGFyQ29kZSAxMCB3aGVuIGN0cmwgaXMgcHJlc3NlZC5cblxuXG4gIGlmIChjaGFyQ29kZSA9PT0gMTApIHtcbiAgICBjaGFyQ29kZSA9IDEzO1xuICB9IC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuXG5cbiAgaWYgKGNoYXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykge1xuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYSBmYWN0b3J5IHNvIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuZWQgY29uc3RydWN0b3JzLlxuLy8gSWYgd2UgaGFkIGEgc2luZ2xlIGNvbnN0cnVjdG9yLCBpdCB3b3VsZCBiZSBtZWdhbW9ycGhpYyBhbmQgZW5naW5lcyB3b3VsZCBkZW9wdC5cblxuXG5mdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHtcbiAgLyoqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgYXJlIGRpc3BhdGNoZWQgYnkgZXZlbnQgcGx1Z2lucywgdHlwaWNhbGx5IGluIHJlc3BvbnNlIHRvIGFcbiAgICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci5cbiAgICpcbiAgICogVGhlc2Ugc3lzdGVtcyBzaG91bGQgZ2VuZXJhbGx5IHVzZSBwb29saW5nIHRvIHJlZHVjZSB0aGUgZnJlcXVlbmN5IG9mIGdhcmJhZ2VcbiAgICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlXG4gICAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAgICogbmVlZCBhIHBlcnNpc3RlZCBldmVudCBzaG91bGQgaW52b2tlIGBwZXJzaXN0YC5cbiAgICpcbiAgICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICAgKiBub3JtYWxpemluZyBicm93c2VyIHF1aXJrcy4gU3ViY2xhc3NlcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBpbXBsZW1lbnQgYVxuICAgKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuXG4gICAqL1xuICBmdW5jdGlvbiBTeW50aGV0aWNCYXNlRXZlbnQocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICAgIHRoaXMudHlwZSA9IHJlYWN0RXZlbnRUeXBlO1xuICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW19wcm9wTmFtZV07XG5cbiAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2ZUV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W19wcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkIDogbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IGZhbHNlO1xuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhc3NpZ24oU3ludGhldGljQmFzZUV2ZW50LnByb3RvdHlwZSwge1xuICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcblxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyAkRmxvd0ZpeE1lIC0gZmxvdyBpcyBub3QgYXdhcmUgb2YgYHVua25vd25gIGluIElFXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5yZXR1cm5WYWx1ZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcbiAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyAkRmxvd0ZpeE1lIC0gZmxvdyBpcyBub3QgYXdhcmUgb2YgYHVua25vd25gIGluIElFXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBldmVudC5jYW5jZWxCdWJibGUgIT09ICd1bmtub3duJykge1xuICAgICAgICAvLyBUaGUgQ2hhbmdlRXZlbnRQbHVnaW4gcmVnaXN0ZXJzIGEgXCJwcm9wZXJ0eWNoYW5nZVwiIGV2ZW50IGZvclxuICAgICAgICAvLyBJRS4gVGhpcyBldmVudCBkb2VzIG5vdCBzdXBwb3J0IGJ1YmJsaW5nIG9yIGNhbmNlbGxpbmcsIGFuZFxuICAgICAgICAvLyBhbnkgcmVmZXJlbmNlcyB0byBjYW5jZWxCdWJibGUgdGhyb3cgXCJNZW1iZXIgbm90IGZvdW5kXCIuICBBXG4gICAgICAgIC8vIHR5cGVvZiBjaGVjayBvZiBcInVua25vd25cIiBjaXJjdW12ZW50cyB0aGlzIGlzc3VlIChhbmQgaXMgYWxzb1xuICAgICAgICAvLyBJRSBzcGVjaWZpYykuXG4gICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2UgcmVsZWFzZSBhbGwgZGlzcGF0Y2hlZCBgU3ludGhldGljRXZlbnRgcyBhZnRlciBlYWNoIGV2ZW50IGxvb3AsIGFkZGluZ1xuICAgICAqIHRoZW0gYmFjayBpbnRvIHRoZSBwb29sLiBUaGlzIGFsbG93cyBhIHdheSB0byBob2xkIG9udG8gYSByZWZlcmVuY2UgdGhhdFxuICAgICAqIHdvbid0IGJlIGFkZGVkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKi9cbiAgICBwZXJzaXN0OiBmdW5jdGlvbiAoKSB7Ly8gTW9kZXJuIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGlzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBpc1BlcnNpc3RlbnQ6IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlXG4gIH0pO1xuICByZXR1cm4gU3ludGhldGljQmFzZUV2ZW50O1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgZXZlbnRQaGFzZTogMCxcbiAgYnViYmxlczogMCxcbiAgY2FuY2VsYWJsZTogMCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IDAsXG4gIGlzVHJ1c3RlZDogMFxufTtcbnZhciBTeW50aGV0aWNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIFVJRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIHZpZXc6IDAsXG4gIGRldGFpbDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVUlFdmVudEludGVyZmFjZSk7XG52YXIgbGFzdE1vdmVtZW50WDtcbnZhciBsYXN0TW92ZW1lbnRZO1xudmFyIGxhc3RNb3VzZUV2ZW50O1xuXG5mdW5jdGlvbiB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZShldmVudCkge1xuICBpZiAoZXZlbnQgIT09IGxhc3RNb3VzZUV2ZW50KSB7XG4gICAgaWYgKGxhc3RNb3VzZUV2ZW50ICYmIGV2ZW50LnR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gZXZlbnQuc2NyZWVuWCAtIGxhc3RNb3VzZUV2ZW50LnNjcmVlblg7XG4gICAgICBsYXN0TW92ZW1lbnRZID0gZXZlbnQuc2NyZWVuWSAtIGxhc3RNb3VzZUV2ZW50LnNjcmVlblk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhc3RNb3ZlbWVudFggPSAwO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IDA7XG4gICAgfVxuXG4gICAgbGFzdE1vdXNlRXZlbnQgPSBldmVudDtcbiAgfVxufVxuLyoqXG4gKiBAaW50ZXJmYWNlIE1vdXNlRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIE1vdXNlRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgc2NyZWVuWDogMCxcbiAgc2NyZWVuWTogMCxcbiAgY2xpZW50WDogMCxcbiAgY2xpZW50WTogMCxcbiAgcGFnZVg6IDAsXG4gIHBhZ2VZOiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gIGJ1dHRvbjogMCxcbiAgYnV0dG9uczogMCxcbiAgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnJlbGF0ZWRUYXJnZXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC5zcmNFbGVtZW50ID8gZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQ7XG4gICAgcmV0dXJuIGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gIH0sXG4gIG1vdmVtZW50WDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKCdtb3ZlbWVudFgnIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gZXZlbnQubW92ZW1lbnRYO1xuICAgIH1cblxuICAgIHVwZGF0ZU1vdXNlTW92ZW1lbnRQb2x5ZmlsbFN0YXRlKGV2ZW50KTtcbiAgICByZXR1cm4gbGFzdE1vdmVtZW50WDtcbiAgfSxcbiAgbW92ZW1lbnRZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WScgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFk7XG4gICAgfSAvLyBEb24ndCBuZWVkIHRvIGNhbGwgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoKSBoZXJlXG4gICAgLy8gYmVjYXVzZSBpdCdzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbHJlYWR5IHJ1biB3aGVuIG1vdmVtZW50WFxuICAgIC8vIHdhcyBjb3BpZWQuXG5cblxuICAgIHJldHVybiBsYXN0TW92ZW1lbnRZO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChNb3VzZUV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBEcmFnRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBEcmFnRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YVRyYW5zZmVyOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0RyYWdFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KERyYWdFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIEZvY3VzRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgcmVsYXRlZFRhcmdldDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNGb2N1c0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRm9jdXNFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1hbmltYXRpb25zLyNBbmltYXRpb25FdmVudC1pbnRlcmZhY2VcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0FuaW1hdGlvbkV2ZW50XG4gKi9cblxudmFyIEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBhbmltYXRpb25OYW1lOiAwLFxuICBlbGFwc2VkVGltZTogMCxcbiAgcHNldWRvRWxlbWVudDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNBbmltYXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jbGlwYm9hcmQtYXBpcy9cbiAqL1xuXG52YXIgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xuXG52YXIgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YTogMFxufSk7XG5cbnZhciBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDVcbiAqICAgICAgLyNldmVudHMtaW5wdXRldmVudHNcbiAqL1xuLy8gSGFwcGVucyB0byBzaGFyZSB0aGUgc2FtZSBsaXN0IGZvciBub3cuXG5cbnZhciBTeW50aGV0aWNJbnB1dEV2ZW50ID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudDtcbi8qKlxuICogTm9ybWFsaXphdGlvbiBvZiBkZXByZWNhdGVkIEhUTUw1IGBrZXlgIHZhbHVlc1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xuXG52YXIgbm9ybWFsaXplS2V5ID0ge1xuICBFc2M6ICdFc2NhcGUnLFxuICBTcGFjZWJhcjogJyAnLFxuICBMZWZ0OiAnQXJyb3dMZWZ0JyxcbiAgVXA6ICdBcnJvd1VwJyxcbiAgUmlnaHQ6ICdBcnJvd1JpZ2h0JyxcbiAgRG93bjogJ0Fycm93RG93bicsXG4gIERlbDogJ0RlbGV0ZScsXG4gIFdpbjogJ09TJyxcbiAgTWVudTogJ0NvbnRleHRNZW51JyxcbiAgQXBwczogJ0NvbnRleHRNZW51JyxcbiAgU2Nyb2xsOiAnU2Nyb2xsTG9jaycsXG4gIE1velByaW50YWJsZUtleTogJ1VuaWRlbnRpZmllZCdcbn07XG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbGVnYWN5IGBrZXlDb2RlYCB0byBIVE1MNSBga2V5YFxuICogT25seSBzcGVjaWFsIGtleXMgc3VwcG9ydGVkLCBhbGwgb3RoZXJzIGRlcGVuZCBvbiBrZXlib2FyZCBsYXlvdXQgb3IgYnJvd3NlclxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudCNLZXlfbmFtZXNcbiAqL1xuXG52YXIgdHJhbnNsYXRlVG9LZXkgPSB7XG4gICc4JzogJ0JhY2tzcGFjZScsXG4gICc5JzogJ1RhYicsXG4gICcxMic6ICdDbGVhcicsXG4gICcxMyc6ICdFbnRlcicsXG4gICcxNic6ICdTaGlmdCcsXG4gICcxNyc6ICdDb250cm9sJyxcbiAgJzE4JzogJ0FsdCcsXG4gICcxOSc6ICdQYXVzZScsXG4gICcyMCc6ICdDYXBzTG9jaycsXG4gICcyNyc6ICdFc2NhcGUnLFxuICAnMzInOiAnICcsXG4gICczMyc6ICdQYWdlVXAnLFxuICAnMzQnOiAnUGFnZURvd24nLFxuICAnMzUnOiAnRW5kJyxcbiAgJzM2JzogJ0hvbWUnLFxuICAnMzcnOiAnQXJyb3dMZWZ0JyxcbiAgJzM4JzogJ0Fycm93VXAnLFxuICAnMzknOiAnQXJyb3dSaWdodCcsXG4gICc0MCc6ICdBcnJvd0Rvd24nLFxuICAnNDUnOiAnSW5zZXJ0JyxcbiAgJzQ2JzogJ0RlbGV0ZScsXG4gICcxMTInOiAnRjEnLFxuICAnMTEzJzogJ0YyJyxcbiAgJzExNCc6ICdGMycsXG4gICcxMTUnOiAnRjQnLFxuICAnMTE2JzogJ0Y1JyxcbiAgJzExNyc6ICdGNicsXG4gICcxMTgnOiAnRjcnLFxuICAnMTE5JzogJ0Y4JyxcbiAgJzEyMCc6ICdGOScsXG4gICcxMjEnOiAnRjEwJyxcbiAgJzEyMic6ICdGMTEnLFxuICAnMTIzJzogJ0YxMicsXG4gICcxNDQnOiAnTnVtTG9jaycsXG4gICcxNDUnOiAnU2Nyb2xsTG9jaycsXG4gICcyMjQnOiAnTWV0YSdcbn07XG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBga2V5YCBwcm9wZXJ0eS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudEtleShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQua2V5KSB7XG4gICAgLy8gTm9ybWFsaXplIGluY29uc2lzdGVudCB2YWx1ZXMgcmVwb3J0ZWQgYnkgYnJvd3NlcnMgZHVlIHRvXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIG9mIGEgd29ya2luZyBkcmFmdCBzcGVjaWZpY2F0aW9uLlxuICAgIC8vIEZpcmVGb3ggaW1wbGVtZW50cyBga2V5YCBidXQgcmV0dXJucyBgTW96UHJpbnRhYmxlS2V5YCBmb3IgYWxsXG4gICAgLy8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgKG5vcm1hbGl6ZWQgdG8gYFVuaWRlbnRpZmllZGApLCBpZ25vcmUgaXQuXG4gICAgdmFyIGtleSA9IG5vcm1hbGl6ZUtleVtuYXRpdmVFdmVudC5rZXldIHx8IG5hdGl2ZUV2ZW50LmtleTtcblxuICAgIGlmIChrZXkgIT09ICdVbmlkZW50aWZpZWQnKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfSAvLyBCcm93c2VyIGRvZXMgbm90IGltcGxlbWVudCBga2V5YCwgcG9seWZpbGwgYXMgbXVjaCBvZiBpdCBhcyB3ZSBjYW4uXG5cblxuICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgIHZhciBjaGFyQ29kZSA9IGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpOyAvLyBUaGUgZW50ZXIta2V5IGlzIHRlY2huaWNhbGx5IGJvdGggcHJpbnRhYmxlIGFuZCBub24tcHJpbnRhYmxlIGFuZCBjYW5cbiAgICAvLyB0aHVzIGJlIGNhcHR1cmVkIGJ5IGBrZXlwcmVzc2AsIG5vIG90aGVyIG5vbi1wcmludGFibGUga2V5IHNob3VsZC5cblxuICAgIHJldHVybiBjaGFyQ29kZSA9PT0gMTMgPyAnRW50ZXInIDogU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gIH1cblxuICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAvLyBXaGlsZSB1c2VyIGtleWJvYXJkIGxheW91dCBkZXRlcm1pbmVzIHRoZSBhY3R1YWwgbWVhbmluZyBvZiBlYWNoXG4gICAgLy8gYGtleUNvZGVgIHZhbHVlLCBhbG1vc3QgYWxsIGZ1bmN0aW9uIGtleXMgaGF2ZSBhIHVuaXZlcnNhbCB2YWx1ZS5cbiAgICByZXR1cm4gdHJhbnNsYXRlVG9LZXlbbmF0aXZlRXZlbnQua2V5Q29kZV0gfHwgJ1VuaWRlbnRpZmllZCc7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbW9kaWZpZXIga2V5IHRvIHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IGluIHRoZSBldmVudC5cbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNrZXlzLU1vZGlmaWVyc1xuICovXG5cblxudmFyIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICBBbHQ6ICdhbHRLZXknLFxuICBDb250cm9sOiAnY3RybEtleScsXG4gIE1ldGE6ICdtZXRhS2V5JyxcbiAgU2hpZnQ6ICdzaGlmdEtleSdcbn07IC8vIE9sZGVyIGJyb3dzZXJzIChTYWZhcmkgPD0gMTAsIGlPUyBTYWZhcmkgPD0gMTAuMikgZG8gbm90IHN1cHBvcnRcbi8vIGdldE1vZGlmaWVyU3RhdGUuIElmIGdldE1vZGlmaWVyU3RhdGUgaXMgbm90IHN1cHBvcnRlZCwgd2UgbWFwIGl0IHRvIGEgc2V0IG9mXG4vLyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50LiBJbiB0aGlzIGNhc2UsIExvY2sta2V5cyBhcmUgbm90IHN1cHBvcnRlZC5cblxuZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHtcbiAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gdGhpcztcbiAgdmFyIG5hdGl2ZUV2ZW50ID0gc3ludGhldGljRXZlbnQubmF0aXZlRXZlbnQ7XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUpIHtcbiAgICByZXR1cm4gbmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShrZXlBcmcpO1xuICB9XG5cbiAgdmFyIGtleVByb3AgPSBtb2RpZmllcktleVRvUHJvcFtrZXlBcmddO1xuICByZXR1cm4ga2V5UHJvcCA/ICEhbmF0aXZlRXZlbnRba2V5UHJvcF0gOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRNb2RpZmllclN0YXRlKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBtb2RpZmllclN0YXRlR2V0dGVyO1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEtleWJvYXJkRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cblxudmFyIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAga2V5OiBnZXRFdmVudEtleSxcbiAgY29kZTogMCxcbiAgbG9jYXRpb246IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIHJlcGVhdDogMCxcbiAgbG9jYWxlOiAwLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gIC8vIExlZ2FjeSBJbnRlcmZhY2VcbiAgY2hhckNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBjaGFyQ29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleVByZXNzIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHRoZSBhY3R1YWwgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAgICAvLyBLZXlQcmVzcyBpcyBkZXByZWNhdGVkLCBidXQgaXRzIHJlcGxhY2VtZW50IGlzIG5vdCB5ZXQgZmluYWwgYW5kIG5vdFxuICAgIC8vIGltcGxlbWVudGVkIGluIGFueSBtYWpvciBicm93c2VyLiBPbmx5IEtleVByZXNzIGhhcyBjaGFyQ29kZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9LFxuICBrZXlDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBga2V5Q29kZWAgaXMgdGhlIHJlc3VsdCBvZiBhIEtleURvd24vVXAgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gcGh5c2ljYWwga2V5Ym9hcmQga2V5LlxuICAgIC8vIFRoZSBhY3R1YWwgbWVhbmluZyBvZiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdXNlcnMnIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZC4gQXNzdW1pbmcgdGhhdCBpdCBpcyBhIFVTIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHByb3ZpZGVzIGEgc3VycHJpc2luZ2x5IGFjY3VyYXRlIG1hcHBpbmcgZm9yIFVTIGFuZCBFdXJvcGVhbiB1c2Vycy5cbiAgICAvLyBEdWUgdG8gdGhpcywgaXQgaXMgbGVmdCB0byB0aGUgdXNlciB0byBpbXBsZW1lbnQgYXQgdGhpcyB0aW1lLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIHdoaWNoOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgd2hpY2hgIGlzIGFuIGFsaWFzIGZvciBlaXRoZXIgYGtleUNvZGVgIG9yIGBjaGFyQ29kZWAgZGVwZW5kaW5nIG9uIHRoZVxuICAgIC8vIHR5cGUgb2YgdGhlIGV2ZW50LlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxufSk7XG5cbnZhciBTeW50aGV0aWNLZXlib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoS2V5Ym9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgUG9pbnRlckV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3BvaW50ZXJldmVudHMvXG4gKi9cblxudmFyIFBvaW50ZXJFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBwb2ludGVySWQ6IDAsXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIHByZXNzdXJlOiAwLFxuICB0YW5nZW50aWFsUHJlc3N1cmU6IDAsXG4gIHRpbHRYOiAwLFxuICB0aWx0WTogMCxcbiAgdHdpc3Q6IDAsXG4gIHBvaW50ZXJUeXBlOiAwLFxuICBpc1ByaW1hcnk6IDBcbn0pO1xuXG52YXIgU3ludGhldGljUG9pbnRlckV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoUG9pbnRlckV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xuXG52YXIgVG91Y2hFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICB0b3VjaGVzOiAwLFxuICB0YXJnZXRUb3VjaGVzOiAwLFxuICBjaGFuZ2VkVG91Y2hlczogMCxcbiAgYWx0S2V5OiAwLFxuICBtZXRhS2V5OiAwLFxuICBjdHJsS2V5OiAwLFxuICBzaGlmdEtleTogMCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlXG59KTtcblxudmFyIFN5bnRoZXRpY1RvdWNoRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUb3VjaEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtdHJhbnNpdGlvbnMtMjAwOTAzMjAvI3RyYW5zaXRpb24tZXZlbnRzLVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVHJhbnNpdGlvbkV2ZW50XG4gKi9cblxudmFyIFRyYW5zaXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgcHJvcGVydHlOYW1lOiAwLFxuICBlbGFwc2VkVGltZTogMCxcbiAgcHNldWRvRWxlbWVudDogMFxufSk7XG5cbnZhciBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIFdoZWVsRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG5cbnZhciBXaGVlbEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRlbHRhWDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFYYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKHJpZ2h0IGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVgnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDtcbiAgfSxcbiAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFZJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhYCBmb3IgSUU8OSBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YSA6IDA7XG4gIH0sXG4gIGRlbHRhWjogMCxcbiAgLy8gQnJvd3NlcnMgd2l0aG91dCBcImRlbHRhTW9kZVwiIGlzIHJlcG9ydGluZyBpbiByYXcgd2hlZWwgZGVsdGEgd2hlcmUgb25lXG4gIC8vIG5vdGNoIG9uIHRoZSBzY3JvbGwgaXMgYWx3YXlzICsvLSAxMjAsIHJvdWdobHkgZXF1aXZhbGVudCB0byBwaXhlbHMuXG4gIC8vIEEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIERPTV9ERUxUQV9MSU5FICgxKSBpcyA1JSBvZiB2aWV3cG9ydCBzaXplIG9yXG4gIC8vIH40MCBwaXhlbHMsIGZvciBET01fREVMVEFfU0NSRUVOICgyKSBpdCBpcyA4Ny41JSBvZiB2aWV3cG9ydCBzaXplLlxuICBkZWx0YU1vZGU6IDBcbn0pO1xuXG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFdoZWVsRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxuXG52YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTtcbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG52YXIgZG9jdW1lbnRNb2RlID0gbnVsbDtcblxuaWYgKGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59IC8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG5cblxudmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID0gY2FuVXNlRE9NICYmICdUZXh0RXZlbnQnIGluIHdpbmRvdyAmJiAhZG9jdW1lbnRNb2RlOyAvLyBJbiBJRTkrLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NpdGlvbiBldmVudHMsIGJ1dCB0aGUgZGF0YSBzdXBwbGllZFxuLy8gYnkgdGhlIG5hdGl2ZSBjb21wb3NpdGlvbmVuZCBldmVudCBtYXkgYmUgaW5jb3JyZWN0LiBKYXBhbmVzZSBpZGVvZ3JhcGhpY1xuLy8gc3BhY2VzLCBmb3IgaW5zdGFuY2UgKFxcdTMwMDApIGFyZSBub3QgcmVjb3JkZWQgY29ycmVjdGx5LlxuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBjYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkJlZm9yZUlucHV0JywgWydjb21wb3NpdGlvbmVuZCcsICdrZXlwcmVzcycsICd0ZXh0SW5wdXQnLCAncGFzdGUnXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvbkVuZCcsIFsnY29tcG9zaXRpb25lbmQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblN0YXJ0JywgWydjb21wb3NpdGlvbnN0YXJ0JywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25VcGRhdGUnLCBbJ2NvbXBvc2l0aW9udXBkYXRlJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xufSAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuXG5cblxudmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTtcbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cblxuZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIChuYXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5tZXRhS2V5KSAmJiAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdyLCBhbmQgaXMgbm90IGEgY29tbWFuZC5cbiAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25TdGFydCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25FbmQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uVXBkYXRlJztcbiAgfVxufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXRcbiAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tFWUNPREU7XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgICAgLy8gRXhwZWN0IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlclxuICAgICAgLy8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuXG4gICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsXG4gKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGluIHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXNcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZlbnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluXG4gKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9zdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG5cbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBkZXRhaWwpIHtcbiAgICByZXR1cm4gZGV0YWlsLmRhdGE7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSBjb21wb3NpdGlvbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IEtvcmVhbiBJTUUuXG4gKiBPdXIgZmFsbGJhY2sgbW9kZSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBJRSdzIEtvcmVhbiBJTUUsXG4gKiBzbyBqdXN0IHVzZSBuYXRpdmUgY29tcG9zaXRpb24gZXZlbnRzIHdoZW4gS29yZWFuIElNRSBpcyB1c2VkLlxuICogQWx0aG91Z2ggQ29tcG9zaXRpb25FdmVudC5sb2NhbGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCxcbiAqIGl0IGlzIGF2YWlsYWJsZSBpbiBJRSwgd2hlcmUgb3VyIGZhbGxiYWNrIG1vZGUgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuXG5mdW5jdGlvbiBpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuYXRpdmVFdmVudC5sb2NhbGUgPT09ICdrbyc7XG59IC8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS5cblxuXG52YXIgaXNDb21wb3NpbmcgPSBmYWxzZTtcbi8qKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LlxuICovXG5cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpO1xuICB9IGVsc2UgaWYgKCFpc0NvbXBvc2luZykge1xuICAgIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25TdGFydCc7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uRW5kJztcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgY29tcG9zaXRpb24gaXMgc3RvcmVkIHN0YXRpY2FsbHkgYW5kIG11c3Qgbm90IGJlXG4gICAgLy8gb3ZlcndyaXR0ZW4gd2hpbGUgY29tcG9zaXRpb24gY29udGludWVzLlxuICAgIGlmICghaXNDb21wb3NpbmcgJiYgZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvblN0YXJ0Jykge1xuICAgICAgaXNDb21wb3NpbmcgPSBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25FbmQnKSB7XG4gICAgICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgZXZlbnRUeXBlKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljQ29tcG9zaXRpb25FdmVudChldmVudFR5cGUsIGRvbUV2ZW50TmFtZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcblxuICAgIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LlxuICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS5cbiAgICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjdXN0b21EYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChjdXN0b21EYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcblxuICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSO1xuXG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTsgLy8gSWYgaXQncyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWVcbiAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28gd2UgbmVlZCB0byBpZ25vcmUgaXQuXG5cbiAgICAgIGlmIChjaGFycyA9PT0gU1BBQ0VCQVJfQ0hBUiAmJiBoYXNTcGFjZUtleXByZXNzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hhcnM7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRm9yIG90aGVyIG5hdGl2ZSBldmVudCB0eXBlcywgZG8gbm90aGluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2UgZm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcgYSBmYWxsYmFjayB0byBkbyBzbyxcbiAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LlxuICAvLyBJZiBjb21wb3NpdGlvbiBldmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdFxuICAvLyBjb21wb3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuXG4gIGlmIChpc0NvbXBvc2luZykge1xuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICdjb21wb3NpdGlvbmVuZCcgfHwgIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiYgaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICB2YXIgY2hhcnMgPSBnZXREYXRhKCk7XG4gICAgICByZXNldCgpO1xuICAgICAgaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dFxuICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQgbm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkgZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlclxuICAgICAgICogd2lsbCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczpcbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuXG4gICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlzIG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3JcbiAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRpb24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS5cbiAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpc1xuICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm9cbiAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICovXG4gICAgICBpZiAoIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAvLyBJRSBmaXJlcyB0aGUgYGtleXByZXNzYCBldmVudCB3aGVuIGEgdXNlciB0eXBlcyBhbiBlbW9qaSB2aWFcbiAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5XG4gICAgICAgIC8vIGhvbGRzIGFuIGVtb2ppIGNoYXJhY3RlciBsaWtlIGBcXHVEODNEXFx1REUwQWAuICBCZWNhdXNlIGl0cyBsZW5ndGhcbiAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS5cbiAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UsIHdlIGRpcmVjdGx5IHJldHVybiB0aGUgYGNoYXJgIHByb3BlcnR5IGluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXNpbmcgYHdoaWNoYC5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAobmF0aXZlRXZlbnQud2hpY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRXh0cmFjdCBhIFN5bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRpdmVcbiAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLlxuICpcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gLy8gSWYgbm8gY2hhcmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZFxuICAvLyBiZSBmaXJlZC5cblxuXG4gIGlmICghY2hhcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgJ29uQmVmb3JlSW5wdXQnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljSW5wdXRFdmVudCgnb25CZWZvcmVJbnB1dCcsICdiZWZvcmVpbnB1dCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gICAgZXZlbnQuZGF0YSA9IGNoYXJzO1xuICB9XG59XG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogTk9URTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1Y2ggYXMgYGNoYW5nZWAsXG4gKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC5cbiAqXG4gKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5nLiBcImNsaWNrXCIuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuXG4gKiBAaW50ZXJuYWxcbiAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuICovXG5cbmZ1bmN0aW9uIGlzRXZlbnRTdXBwb3J0ZWQoZXZlbnROYW1lU3VmZml4KSB7XG4gIGlmICghY2FuVXNlRE9NKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudE5hbWVTdWZmaXg7XG4gIHZhciBpc1N1cHBvcnRlZCA9IChldmVudE5hbWUgaW4gZG9jdW1lbnQpO1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDEoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25DaGFuZ2UnLCBbJ2NoYW5nZScsICdjbGljaycsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2lucHV0JywgJ2tleWRvd24nLCAna2V5dXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIHRhcmdldCkge1xuICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuXG4gIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KTtcbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhpbnN0LCAnb25DaGFuZ2UnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uQ2hhbmdlJywgJ2NoYW5nZScsIG51bGwsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEZvciBJRSBzaGltc1xuICovXG5cblxudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICdmaWxlJztcbn1cblxuZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkpOyAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cblxuICBiYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsIGRpc3BhdGNoUXVldWUpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZGlzcGF0Y2hRdWV1ZSkge1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCAwKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpO1xuXG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGlucHV0YCBldmVudFxuICovXG5cblxudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIC8vIElFOSBjbGFpbXMgdG8gc3VwcG9ydCB0aGUgaW5wdXQgZXZlbnQgYnV0IGZhaWxzIHRvIHRyaWdnZXIgaXQgd2hlblxuICAvLyBkZWxldGluZyB0ZXh0LCBzbyB3ZSBpZ25vcmUgaXRzIGlucHV0IGV2ZW50cy5cbiAgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gaXNFdmVudFN1cHBvcnRlZCgnaW5wdXQnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA5KTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50bHktdHJhY2tlZCBlbGVtZW50LFxuICogaWYgYW55IGV4aXN0cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eUNoYW5nZShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICE9PSAndmFsdWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCkpIHtcbiAgICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3VzaW4nKSB7XG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn0gLy8gRm9yIElFOCBhbmQgSUU5LlxuXG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdzZWxlY3Rpb25jaGFuZ2UnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleXVwJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJykge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpO1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cblxuXG5mdW5jdGlvbiBzaG91bGRVc2VDbGlja0V2ZW50KGVsZW0pIHtcbiAgLy8gVXNlIHRoZSBgY2xpY2tgIGV2ZW50IHRvIGRldGVjdCBjaGFuZ2VzIHRvIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMuXG4gIC8vIFRoaXMgYXBwcm9hY2ggd29ya3MgYWNyb3NzIGFsbCBicm93c2Vycywgd2hlcmVhcyBgY2hhbmdlYCBkb2VzIG5vdCBmaXJlXG4gIC8vIHVudGlsIGBibHVyYCBpbiBJRTguXG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjbGljaycpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdpbnB1dCcgfHwgZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZTtcblxuICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5jb250cm9sbGVkIHx8IG5vZGUudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCAnbnVtYmVyJywgbm9kZS52YWx1ZSk7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25DaGFuZ2VgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBjaGFuZ2UgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhpcyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvXG4gKiBjaGFuZ2UgdGhlIGVsZW1lbnQncyB2YWx1ZSB3aXRob3V0IHNlZWluZyBhIGZsaWNrZXIuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gc2VsZWN0XG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICB2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsIGhhbmRsZUV2ZW50RnVuYztcblxuICBpZiAoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDtcbiAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBpZiAoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2hvdWxkVXNlQ2xpY2tFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gIH1cblxuICBpZiAoZ2V0VGFyZ2V0SW5zdEZ1bmMpIHtcbiAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAoaW5zdCkge1xuICAgICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhbmRsZUV2ZW50RnVuYykge1xuICAgIGhhbmRsZUV2ZW50RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpO1xuICB9IC8vIFdoZW4gYmx1cnJpbmcsIHNldCB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBudW1iZXIgaW5wdXRzXG5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cih0YXJnZXROb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQyKCkge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlRW50ZXInLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUxlYXZlJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckVudGVyJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJMZWF2ZScsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbn1cbi8qKlxuICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAqIHdlIGRvIG5vdCBleHRyYWN0IGR1cGxpY2F0ZSBldmVudHMuIEhvd2V2ZXIsIG1vdmluZyB0aGUgbW91c2UgaW50byB0aGVcbiAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBpc092ZXJFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3ZlcicgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInO1xuICB2YXIgaXNPdXRFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JztcblxuICBpZiAoaXNPdmVyRXZlbnQgJiYgIWlzUmVwbGF5aW5nRXZlbnQobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhbiBvdmVyIGV2ZW50IHdpdGggYSB0YXJnZXQsIHdlIG1pZ2h0IGhhdmUgYWxyZWFkeSBkaXNwYXRjaGVkXG4gICAgLy8gdGhlIGV2ZW50IGluIHRoZSBvdXQgZXZlbnQgb2YgdGhlIG90aGVyIHRhcmdldC4gSWYgdGhpcyBpcyByZXBsYXllZCxcbiAgICAvLyB0aGVuIGl0J3MgYmVjYXVzZSB3ZSBjb3VsZG4ndCBkaXNwYXRjaCBhZ2FpbnN0IHRoaXMgdGFyZ2V0IHByZXZpb3VzbHlcbiAgICAvLyBzbyB3ZSBoYXZlIHRvIGRvIGl0IG5vdyBpbnN0ZWFkLlxuICAgIHZhciByZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC5mcm9tRWxlbWVudDtcblxuICAgIGlmIChyZWxhdGVkKSB7XG4gICAgICAvLyBJZiB0aGUgcmVsYXRlZCBub2RlIGlzIG1hbmFnZWQgYnkgUmVhY3QsIHdlIGNhbiBhc3N1bWUgdGhhdCB3ZSBoYXZlXG4gICAgICAvLyBhbHJlYWR5IGRpc3BhdGNoZWQgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnRzIGR1cmluZyBpdHMgbW91c2VvdXQuXG4gICAgICBpZiAoZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVsYXRlZCkgfHwgaXNDb250YWluZXJNYXJrZWRBc1Jvb3QocmVsYXRlZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghaXNPdXRFdmVudCAmJiAhaXNPdmVyRXZlbnQpIHtcbiAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIG9yIHBvaW50ZXIgaW4gb3Igb3V0IC0gaWdub3JpbmcuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHdpbjsgLy8gVE9ETzogd2h5IGlzIHRoaXMgbnVsbGFibGUgaW4gdGhlIHR5cGVzIGJ1dCB3ZSByZWFkIGZyb20gaXQ/XG5cbiAgaWYgKG5hdGl2ZUV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICAvLyBgbmF0aXZlRXZlbnRUYXJnZXRgIGlzIHByb2JhYmx5IGEgd2luZG93IG9iamVjdC5cbiAgICB3aW4gPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3duZXJEb2N1bWVudGAgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBpbiBJRTguXG4gICAgdmFyIGRvYyA9IG5hdGl2ZUV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG5cbiAgICBpZiAoZG9jKSB7XG4gICAgICB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgd2luID0gd2luZG93O1xuICAgIH1cbiAgfVxuXG4gIHZhciBmcm9tO1xuICB2YXIgdG87XG5cbiAgaWYgKGlzT3V0RXZlbnQpIHtcbiAgICB2YXIgX3JlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnRvRWxlbWVudDtcblxuICAgIGZyb20gPSB0YXJnZXRJbnN0O1xuICAgIHRvID0gX3JlbGF0ZWQgPyBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShfcmVsYXRlZCkgOiBudWxsO1xuXG4gICAgaWYgKHRvICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRvKTtcblxuICAgICAgaWYgKHRvICE9PSBuZWFyZXN0TW91bnRlZCB8fCB0by50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgdG8udGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgICB0byA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE1vdmluZyB0byBhIG5vZGUgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cuXG4gICAgZnJvbSA9IG51bGw7XG4gICAgdG8gPSB0YXJnZXRJbnN0O1xuICB9XG5cbiAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgLy8gTm90aGluZyBwZXJ0YWlucyB0byBvdXIgbWFuYWdlZCBjb21wb25lbnRzLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICB2YXIgbGVhdmVFdmVudFR5cGUgPSAnb25Nb3VzZUxlYXZlJztcbiAgdmFyIGVudGVyRXZlbnRUeXBlID0gJ29uTW91c2VFbnRlcic7XG4gIHZhciBldmVudFR5cGVQcmVmaXggPSAnbW91c2UnO1xuXG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3ZlcicpIHtcbiAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgbGVhdmVFdmVudFR5cGUgPSAnb25Qb2ludGVyTGVhdmUnO1xuICAgIGVudGVyRXZlbnRUeXBlID0gJ29uUG9pbnRlckVudGVyJztcbiAgICBldmVudFR5cGVQcmVmaXggPSAncG9pbnRlcic7XG4gIH1cblxuICB2YXIgZnJvbU5vZGUgPSBmcm9tID09IG51bGwgPyB3aW4gOiBnZXROb2RlRnJvbUluc3RhbmNlKGZyb20pO1xuICB2YXIgdG9Ob2RlID0gdG8gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UodG8pO1xuICB2YXIgbGVhdmUgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKGxlYXZlRXZlbnRUeXBlLCBldmVudFR5cGVQcmVmaXggKyAnbGVhdmUnLCBmcm9tLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBsZWF2ZS50YXJnZXQgPSBmcm9tTm9kZTtcbiAgbGVhdmUucmVsYXRlZFRhcmdldCA9IHRvTm9kZTtcbiAgdmFyIGVudGVyID0gbnVsbDsgLy8gV2Ugc2hvdWxkIG9ubHkgcHJvY2VzcyB0aGlzIG5hdGl2ZUV2ZW50IGlmIHdlIGFyZSBwcm9jZXNzaW5nXG4gIC8vIHRoZSBmaXJzdCBhbmNlc3Rvci4gTmV4dCB0aW1lLCB3ZSB3aWxsIGlnbm9yZSB0aGUgZXZlbnQuXG5cbiAgdmFyIG5hdGl2ZVRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKG5hdGl2ZVRhcmdldEluc3QgPT09IHRhcmdldEluc3QpIHtcbiAgICB2YXIgZW50ZXJFdmVudCA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IoZW50ZXJFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdlbnRlcicsIHRvLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGVudGVyRXZlbnQudGFyZ2V0ID0gdG9Ob2RlO1xuICAgIGVudGVyRXZlbnQucmVsYXRlZFRhcmdldCA9IGZyb21Ob2RlO1xuICAgIGVudGVyID0gZW50ZXJFdmVudDtcbiAgfVxuXG4gIGFjY3VtdWxhdGVFbnRlckxlYXZlVHdvUGhhc2VMaXN0ZW5lcnMoZGlzcGF0Y2hRdWV1ZSwgbGVhdmUsIGVudGVyLCBmcm9tLCB0byk7XG59XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgcmV0dXJuIHggPT09IHkgJiYgKHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5KSB8fCB4ICE9PSB4ICYmIHkgIT09IHkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgO1xufVxuXG52YXIgb2JqZWN0SXMgPSB0eXBlb2YgT2JqZWN0LmlzID09PSAnZnVuY3Rpb24nID8gT2JqZWN0LmlzIDogaXM7XG5cbi8qKlxuICogUGVyZm9ybXMgZXF1YWxpdHkgYnkgaXRlcmF0aW5nIHRocm91Z2gga2V5cyBvbiBhbiBvYmplY3QgYW5kIHJldHVybmluZyBmYWxzZVxuICogd2hlbiBhbnkga2V5IGhhcyB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBzdHJpY3RseSBlcXVhbCBiZXR3ZWVuIHRoZSBhcmd1bWVudHMuXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgdmFsdWVzIG9mIGFsbCBrZXlzIGFyZSBzdHJpY3RseSBlcXVhbC5cbiAqL1xuXG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAob2JqZWN0SXMob2JqQSwgb2JqQikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cblxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY3VycmVudEtleSA9IGtleXNBW2ldO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGN1cnJlbnRLZXkpIHx8ICFvYmplY3RJcyhvYmpBW2N1cnJlbnRLZXldLCBvYmpCW2N1cnJlbnRLZXldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFueSBub2RlIHJldHVybiB0aGUgZmlyc3QgbGVhZiBub2RlIHdpdGhvdXQgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cbmZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZVxuICogRE9NIGlmIGEgbm9kZSdzIHNpYmxpbmdzIGhhdmUgYmVlbiBleGhhdXN0ZWQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cblxuZnVuY3Rpb24gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChyb290LCBvZmZzZXQpIHtcbiAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgdmFyIG5vZGVTdGFydCA9IDA7XG4gIHZhciBub2RlRW5kID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGdldE9mZnNldHMob3V0ZXJOb2RlKSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gb3V0ZXJOb2RlLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBvd25lckRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbiAmJiB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0OyAvLyBJbiBGaXJlZm94LCBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgY2FuIGJlIFwiYW5vbnltb3VzIGRpdnNcIiwgZS5nLiB0aGVcbiAgLy8gdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPVwibnVtYmVyXCI+LiBBbm9ueW1vdXMgZGl2cyBkbyBub3Qgc2VlbSB0b1xuICAvLyBleHBvc2UgcHJvcGVydGllcywgdHJpZ2dlcmluZyBhIFwiUGVybWlzc2lvbiBkZW5pZWQgZXJyb3JcIiBpZiBhbnkgb2YgaXRzXG4gIC8vIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgb25seSBzZWVtaW5nbHkgcG9zc2libGUgd2F5IHRvIGF2b2lkIGVycm9yaW5nXG4gIC8vIGlzIHRvIGFjY2VzcyBhIHByb3BlcnR5IHRoYXQgdHlwaWNhbGx5IHdvcmtzIGZvciBub24tYW5vbnltb3VzIGRpdnMgYW5kXG4gIC8vIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZVxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDg0MjdcblxuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGFuY2hvck5vZGUubm9kZVR5cGU7XG4gICAgZm9jdXNOb2RlLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCk7XG59XG4vKipcbiAqIFJldHVybnMge3N0YXJ0LCBlbmR9IHdoZXJlIGBzdGFydGAgaXMgdGhlIGNoYXJhY3Rlci9jb2RlcG9pbnQgaW5kZXggb2ZcbiAqIChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpIHdpdGhpbiB0aGUgdGV4dENvbnRlbnQgb2YgYG91dGVyTm9kZWAsIGFuZFxuICogYGVuZGAgaXMgdGhlIGluZGV4IG9mIChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KS5cbiAqXG4gKiBSZXR1cm5zIG51bGwgaWYgeW91IHBhc3MgaW4gZ2FyYmFnZSBpbnB1dCBidXQgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgY3Jhc2guXG4gKlxuICogRXhwb3J0ZWQgb25seSBmb3IgdGVzdGluZy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIGluZGV4V2l0aGluQW5jaG9yID0gMDtcbiAgdmFyIGluZGV4V2l0aGluRm9jdXMgPSAwO1xuICB2YXIgbm9kZSA9IG91dGVyTm9kZTtcbiAgdmFyIHBhcmVudE5vZGUgPSBudWxsO1xuXG4gIG91dGVyOiB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBuZXh0ID0gbnVsbDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gYW5jaG9yTm9kZSAmJiAoYW5jaG9yT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGggKyBhbmNob3JPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmb2N1c05vZGUgJiYgKGZvY3VzT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgICAgbGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBmaXJzdCBjaGlsZCBgbmV4dGAuXG5cblxuICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICBub2RlID0gbmV4dDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG91dGVyTm9kZSkge1xuICAgICAgICAvLyBJZiBgb3V0ZXJOb2RlYCBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgYWx3YXlzIHRoZSBzZWNvbmQgdGltZSB2aXNpdGluZ1xuICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgc2VsZWN0aW9uIGlzIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBib3RoIGVxdWFsIHRvIHRoaXMgbm9kZVxuICAgICAgICAvLyBhbmQgYm90aCBvZmZzZXRzIDAsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBoYXZlIGhhbmRsZWQgYWJvdmUuXG4gICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gYW5jaG9yTm9kZSAmJiArK2luZGV4V2l0aGluQW5jaG9yID09PSBhbmNob3JPZmZzZXQpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBmb2N1c05vZGUgJiYgKytpbmRleFdpdGhpbkZvY3VzID09PSBmb2N1c09mZnNldCkge1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUubmV4dFNpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gcGFyZW50Tm9kZTtcbiAgICAgIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIG5leHQgc2libGluZyBgbmV4dGAuXG5cblxuICAgIG5vZGUgPSBuZXh0O1xuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAoV291bGQgaGFwcGVuIGlmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYXJlbid0XG4gICAgLy8gYWN0dWFsbHkgaW5zaWRlIHRoZSBwYXNzZWQtaW4gbm9kZS4pXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBlbmQ6IGVuZFxuICB9O1xufVxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cblxuZnVuY3Rpb24gc2V0T2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBkb2MgJiYgZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgLy8gRWRnZSBmYWlscyB3aXRoIFwiT2JqZWN0IGV4cGVjdGVkXCIgaW4gc29tZSBzY2VuYXJpb3MuXG4gIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsXG4gIC8vIGZhaWxzIHdoZW4gcGFzdGluZyAxMDArIGl0ZW1zKVxuXG4gIGlmICghd2luLmdldFNlbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gIHZhciBsZW5ndGggPSBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpOyAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDEgJiYgc2VsZWN0aW9uLmFuY2hvck5vZGUgPT09IHN0YXJ0TWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmFuY2hvck9mZnNldCA9PT0gc3RhcnRNYXJrZXIub2Zmc2V0ICYmIHNlbGVjdGlvbi5mb2N1c05vZGUgPT09IGVuZE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5mb2N1c09mZnNldCA9PT0gZW5kTWFya2VyLm9mZnNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RleHROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIGNvbnRhaW5zTm9kZShub2RlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luRnJhbWUoaWZyYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXNzaW5nIHRoZSBjb250ZW50RG9jdW1lbnQgb2YgYSBIVE1MSWZyYW1lRWxlbWVudCBjYW4gY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAvLyB0byB0aHJvdywgZS5nLiBpZiBpdCBoYXMgYSBjcm9zcy1vcmlnaW4gc3JjIGF0dHJpYnV0ZS5cbiAgICAvLyBTYWZhcmkgd2lsbCBzaG93IGFuIGVycm9yIGluIHRoZSBjb25zb2xlIHdoZW4gdGhlIGFjY2VzcyByZXN1bHRzIGluIFwiQmxvY2tlZCBhIGZyYW1lIHdpdGggb3JpZ2luXCIuIGUuZzpcbiAgICAvLyBpZnJhbWUuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIC8vIEEgc2FmZXR5IHdheSBpcyB0byBhY2Nlc3Mgb25lIG9mIHRoZSBjcm9zcyBvcmlnaW4gcHJvcGVydGllczogV2luZG93IG9yIExvY2F0aW9uXG4gICAgLy8gV2hpY2ggbWlnaHQgcmVzdWx0IGluIFwiU2VjdXJpdHlFcnJvclwiIERPTSBFeGNlcHRpb24gYW5kIGl0IGlzIGNvbXBhdGlibGUgdG8gU2FmYXJpLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Jyb3dzZXJzLmh0bWwjaW50ZWdyYXRpb24td2l0aC1pZGxcbiAgICByZXR1cm4gdHlwZW9mIGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWYgPT09ICdzdHJpbmcnO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudERlZXAoKSB7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuXG4gIHdoaWxlIChlbGVtZW50IGluc3RhbmNlb2Ygd2luLkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgaWYgKGlzU2FtZU9yaWdpbkZyYW1lKGVsZW1lbnQpKSB7XG4gICAgICB3aW4gPSBlbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KHdpbi5kb2N1bWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG5cbi8qKlxuICogQGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogd2UgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBzZWxlY3Rpb25cbiAqIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG8tbm90LWFwcGx5LCBsb29raW5nIGF0IGBzZWxlY3Rpb25TdGFydGBcbiAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLlxuICovXG5cblxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAndGV4dCcgfHwgZWxlbS50eXBlID09PSAnc2VhcmNoJyB8fCBlbGVtLnR5cGUgPT09ICd0ZWwnIHx8IGVsZW0udHlwZSA9PT0gJ3VybCcgfHwgZWxlbS50eXBlID09PSAncGFzc3dvcmQnKSB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKTtcbn1cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCkge1xuICB2YXIgZm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICByZXR1cm4ge1xuICAgIGZvY3VzZWRFbGVtOiBmb2N1c2VkRWxlbSxcbiAgICBzZWxlY3Rpb25SYW5nZTogaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3VzZWRFbGVtKSA/IGdldFNlbGVjdGlvbihmb2N1c2VkRWxlbSkgOiBudWxsXG4gIH07XG59XG4vKipcbiAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICogcmVzdG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBjb3VsZCByZW1vdmUgZG9tXG4gKiBub2RlcyBhbmQgcGxhY2UgdGhlbSBiYWNrIGluLCByZXN1bHRpbmcgaW4gZm9jdXMgYmVpbmcgbG9zdC5cbiAqL1xuXG5mdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG5cbiAgaWYgKGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgIGlmIChwcmlvclNlbGVjdGlvblJhbmdlICE9PSBudWxsICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgc2V0U2VsZWN0aW9uKHByaW9yRm9jdXNlZEVsZW0sIHByaW9yU2VsZWN0aW9uUmFuZ2UpO1xuICAgIH0gLy8gRm9jdXNpbmcgYSBub2RlIGNhbiBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2hpY2ggaXMgdW5kZXNpcmFibGVcblxuXG4gICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgIHZhciBhbmNlc3RvciA9IHByaW9yRm9jdXNlZEVsZW07XG5cbiAgICB3aGlsZSAoYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAoYW5jZXN0b3Iubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICBhbmNlc3RvcnMucHVzaCh7XG4gICAgICAgICAgZWxlbWVudDogYW5jZXN0b3IsXG4gICAgICAgICAgbGVmdDogYW5jZXN0b3Iuc2Nyb2xsTGVmdCxcbiAgICAgICAgICB0b3A6IGFuY2VzdG9yLnNjcm9sbFRvcFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuY2VzdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSBhbmNlc3RvcnNbaV07XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxUb3AgPSBpbmZvLnRvcDtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3VzZWQgdGV4dGFyZWEsIGlucHV0IG9yXG4gKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0XG4gKiAtQHJldHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24oaW5wdXQpIHtcbiAgdmFyIHNlbGVjdGlvbjtcblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0ge1xuICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIENvbnRlbnQgZWRpdGFibGUgb3Igb2xkIElFIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IGdldE9mZnNldHMoaW5wdXQpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGlvbiB8fCB7XG4gICAgc3RhcnQ6IDAsXG4gICAgZW5kOiAwXG4gIH07XG59XG4vKipcbiAqIEBzZXRTZWxlY3Rpb246IFNldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSB0ZXh0YXJlYSBvciBpbnB1dCBhbmQgZm9jdXNlc1xuICogdGhlIGlucHV0LlxuICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYVxuICogLUBvZmZzZXRzICAgT2JqZWN0IG9mIHNhbWUgZm9ybSB0aGF0IGlzIHJldHVybmVkIGZyb20gZ2V0KlxuICovXG5cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykge1xuICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH1cblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICB9XG59XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uU2VsZWN0JywgWydmb2N1c291dCcsICdjb250ZXh0bWVudScsICdkcmFnZW5kJywgJ2ZvY3VzaW4nLCAna2V5ZG93bicsICdrZXl1cCcsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbnZhciBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xudmFyIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xudmFyIG1vdXNlRG93biA9IGZhbHNlO1xuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKG5vZGUpIHtcbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gbm9kZSAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgd2luID0gbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5jaG9yTm9kZTogc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldDogc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgfTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0YXJnZXQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldERvY3VtZW50KGV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBldmVudFRhcmdldC53aW5kb3cgPT09IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQuZG9jdW1lbnQgOiBldmVudFRhcmdldC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IGV2ZW50VGFyZ2V0IDogZXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbn1cbi8qKlxuICogUG9sbCBzZWxlY3Rpb24gdG8gc2VlIHdoZXRoZXIgaXQncyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gKiBAcmV0dXJuIHs/U3ludGhldGljRXZlbnR9XG4gKi9cblxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCQxID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCQxICE9PSBnZXRBY3RpdmVFbGVtZW50KGRvYykpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuXG5cbiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24kMShhY3RpdmVFbGVtZW50JDEpO1xuXG4gIGlmICghbGFzdFNlbGVjdGlvbiB8fCAhc2hhbGxvd0VxdWFsKGxhc3RTZWxlY3Rpb24sIGN1cnJlbnRTZWxlY3Rpb24pKSB7XG4gICAgbGFzdFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhhY3RpdmVFbGVtZW50SW5zdCQxLCAnb25TZWxlY3QnKTtcblxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvblNlbGVjdCcsICdzZWxlY3QnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgICBldmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50JDE7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gY29udGVudEVkaXRhYmxlXG4gKlxuICogVGhpcyBkaWZmZXJzIGZyb20gbmF0aXZlIGJyb3dzZXIgaW1wbGVtZW50YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy5cbiAqIC0gRmlyZXMgZm9yIGNvbGxhcHNlZCBzZWxlY3Rpb24uXG4gKiAtIEZpcmVzIGFmdGVyIHVzZXIgaW5wdXQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgLy8gVHJhY2sgdGhlIGlucHV0IG5vZGUgdGhhdCBoYXMgZm9jdXMuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpIHx8IHRhcmdldE5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpIHtcbiAgICAgICAgYWN0aXZlRWxlbWVudCQxID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgYWN0aXZlRWxlbWVudEluc3QkMSA9IHRhcmdldEluc3Q7XG4gICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGw7XG4gICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbDtcbiAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgYnJlYWs7XG4gICAgLy8gRG9uJ3QgZmlyZSB0aGUgZXZlbnQgd2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcuIFRoaXMgbWF0Y2hlcyB0aGVcbiAgICAvLyBzZW1hbnRpY3Mgb2YgdGhlIG5hdGl2ZSBzZWxlY3QgZXZlbnQuXG5cbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgICAgbW91c2VEb3duID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY29udGV4dG1lbnUnOlxuICAgIGNhc2UgJ21vdXNldXAnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgICAgbW91c2VEb3duID0gZmFsc2U7XG4gICAgICBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgYnJlYWs7XG4gICAgLy8gQ2hyb21lIGFuZCBJRSBmaXJlIG5vbi1zdGFuZGFyZCBldmVudCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIChhbmRcbiAgICAvLyBzb21ldGltZXMgd2hlbiBpdCBoYXNuJ3QpLiBJRSdzIGV2ZW50IGZpcmVzIG91dCBvZiBvcmRlciB3aXRoIHJlc3BlY3RcbiAgICAvLyB0byBrZXkgYW5kIGlucHV0IGV2ZW50cyBvbiBkZWxldGlvbiwgc28gd2UgZGlzY2FyZCBpdC5cbiAgICAvL1xuICAgIC8vIEZpcmVmb3ggZG9lc24ndCBzdXBwb3J0IHNlbGVjdGlvbmNoYW5nZSwgc28gY2hlY2sgc2VsZWN0aW9uIHN0YXR1c1xuICAgIC8vIGFmdGVyIGVhY2gga2V5IGVudHJ5LiBUaGUgc2VsZWN0aW9uIGNoYW5nZXMgYWZ0ZXIga2V5ZG93biBhbmQgYmVmb3JlXG4gICAgLy8ga2V5dXAsIGJ1dCB3ZSBjaGVjayBvbiBrZXlkb3duIGFzIHdlbGwgaW4gdGhlIGNhc2Ugb2YgaG9sZGluZyBkb3duIGFcbiAgICAvLyBrZXksIHdoZW4gbXVsdGlwbGUga2V5ZG93biBldmVudHMgYXJlIGZpcmVkIGJ1dCBvbmx5IG9uZSBrZXl1cCBpcy5cbiAgICAvLyBUaGlzIGlzIGFsc28gb3VyIGFwcHJvYWNoIGZvciBJRSBoYW5kbGluZywgZm9yIHRoZSByZWFzb24gYWJvdmUuXG5cbiAgICBjYXNlICdzZWxlY3Rpb25jaGFuZ2UnOlxuICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIG1hcHBpbmcgb2Ygc3RhbmRhcmQgdmVuZG9yIHByZWZpeGVzIHVzaW5nIHRoZSBkZWZpbmVkIHN0eWxlIHByb3BlcnR5IGFuZCBldmVudCBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVByb3BcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gbWFrZVByZWZpeE1hcChzdHlsZVByb3AsIGV2ZW50TmFtZSkge1xuICB2YXIgcHJlZml4ZXMgPSB7fTtcbiAgcHJlZml4ZXNbc3R5bGVQcm9wLnRvTG93ZXJDYXNlKCldID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHByZWZpeGVzWydXZWJraXQnICsgc3R5bGVQcm9wXSA9ICd3ZWJraXQnICsgZXZlbnROYW1lO1xuICBwcmVmaXhlc1snTW96JyArIHN0eWxlUHJvcF0gPSAnbW96JyArIGV2ZW50TmFtZTtcbiAgcmV0dXJuIHByZWZpeGVzO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cblxuXG52YXIgdmVuZG9yUHJlZml4ZXMgPSB7XG4gIGFuaW1hdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkVuZCcpLFxuICBhbmltYXRpb25pdGVyYXRpb246IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25JdGVyYXRpb24nKSxcbiAgYW5pbWF0aW9uc3RhcnQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25TdGFydCcpLFxuICB0cmFuc2l0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdUcmFuc2l0aW9uJywgJ1RyYW5zaXRpb25FbmQnKVxufTtcbi8qKlxuICogRXZlbnQgbmFtZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBkZXRlY3RlZCBhbmQgcHJlZml4ZWQgKGlmIGFwcGxpY2FibGUpLlxuICovXG5cbnZhciBwcmVmaXhlZEV2ZW50TmFtZXMgPSB7fTtcbi8qKlxuICogRWxlbWVudCB0byBjaGVjayBmb3IgcHJlZml4ZXMgb24uXG4gKi9cblxudmFyIHN0eWxlID0ge307XG4vKipcbiAqIEJvb3RzdHJhcCBpZiBhIERPTSBleGlzdHMuXG4gKi9cblxuaWYgKGNhblVzZURPTSkge1xuICBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLnN0eWxlOyAvLyBPbiBzb21lIHBsYXRmb3JtcywgaW4gcGFydGljdWxhciBzb21lIHJlbGVhc2VzIG9mIEFuZHJvaWQgNC54LFxuICAvLyB0aGUgdW4tcHJlZml4ZWQgXCJhbmltYXRpb25cIiBhbmQgXCJ0cmFuc2l0aW9uXCIgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBvbiB0aGVcbiAgLy8gc3R5bGUgb2JqZWN0IGJ1dCB0aGUgZXZlbnRzIHRoYXQgZmlyZSB3aWxsIHN0aWxsIGJlIHByZWZpeGVkLCBzbyB3ZSBuZWVkXG4gIC8vIHRvIGNoZWNrIGlmIHRoZSB1bi1wcmVmaXhlZCBldmVudHMgYXJlIHVzYWJsZSwgYW5kIGlmIG5vdCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYXAuXG5cbiAgaWYgKCEoJ0FuaW1hdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbmVuZC5hbmltYXRpb247XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb247XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbjtcbiAgfSAvLyBTYW1lIGFzIGFib3ZlXG5cblxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxufVxuLyoqXG4gKiBBdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdmVuZG9yIHByZWZpeGVkIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICBpZiAocHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0pIHtcbiAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV07XG4gIH0gZWxzZSBpZiAoIXZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV0pIHtcbiAgICByZXR1cm4gZXZlbnROYW1lO1xuICB9XG5cbiAgdmFyIHByZWZpeE1hcCA9IHZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV07XG5cbiAgZm9yICh2YXIgc3R5bGVQcm9wIGluIHByZWZpeE1hcCkge1xuICAgIGlmIChwcmVmaXhNYXAuaGFzT3duUHJvcGVydHkoc3R5bGVQcm9wKSAmJiBzdHlsZVByb3AgaW4gc3R5bGUpIHtcbiAgICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSA9IHByZWZpeE1hcFtzdHlsZVByb3BdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBldmVudE5hbWU7XG59XG5cbnZhciBBTklNQVRJT05fRU5EID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbmVuZCcpO1xudmFyIEFOSU1BVElPTl9JVEVSQVRJT04gPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uaXRlcmF0aW9uJyk7XG52YXIgQU5JTUFUSU9OX1NUQVJUID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbnN0YXJ0Jyk7XG52YXIgVFJBTlNJVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcpO1xuXG52YXIgdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMgPSBuZXcgTWFwKCk7IC8vIE5PVEU6IENhcGl0YWxpemF0aW9uIGlzIGltcG9ydGFudCBpbiB0aGlzIGxpc3QhXG4vL1xuLy8gRS5nLiBpdCBuZWVkcyBcInBvaW50ZXJEb3duXCIsIG5vdCBcInBvaW50ZXJkb3duXCIuXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2UgZGVyaXZlIGJvdGggUmVhY3QgbmFtZSAoXCJvblBvaW50ZXJEb3duXCIpXG4vLyBhbmQgRE9NIG5hbWUgKFwicG9pbnRlcmRvd25cIikgZnJvbSB0aGUgc2FtZSBsaXN0LlxuLy9cbi8vIEV4Y2VwdGlvbnMgdGhhdCBkb24ndCBtYXRjaCB0aGlzIGNvbnZlbnRpb24gYXJlIGxpc3RlZCBzZXBhcmF0ZWx5LlxuLy9cbi8vIHByZXR0aWVyLWlnbm9yZVxuXG52YXIgc2ltcGxlRXZlbnRQbHVnaW5FdmVudHMgPSBbJ2Fib3J0JywgJ2F1eENsaWNrJywgJ2NhbmNlbCcsICdjYW5QbGF5JywgJ2NhblBsYXlUaHJvdWdoJywgJ2NsaWNrJywgJ2Nsb3NlJywgJ2NvbnRleHRNZW51JywgJ2NvcHknLCAnY3V0JywgJ2RyYWcnLCAnZHJhZ0VuZCcsICdkcmFnRW50ZXInLCAnZHJhZ0V4aXQnLCAnZHJhZ0xlYXZlJywgJ2RyYWdPdmVyJywgJ2RyYWdTdGFydCcsICdkcm9wJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2dvdFBvaW50ZXJDYXB0dXJlJywgJ2lucHV0JywgJ2ludmFsaWQnLCAna2V5RG93bicsICdrZXlQcmVzcycsICdrZXlVcCcsICdsb2FkJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZFN0YXJ0JywgJ2xvc3RQb2ludGVyQ2FwdHVyZScsICdtb3VzZURvd24nLCAnbW91c2VNb3ZlJywgJ21vdXNlT3V0JywgJ21vdXNlT3ZlcicsICdtb3VzZVVwJywgJ3Bhc3RlJywgJ3BhdXNlJywgJ3BsYXknLCAncGxheWluZycsICdwb2ludGVyQ2FuY2VsJywgJ3BvaW50ZXJEb3duJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJPdXQnLCAncG9pbnRlck92ZXInLCAncG9pbnRlclVwJywgJ3Byb2dyZXNzJywgJ3JhdGVDaGFuZ2UnLCAncmVzZXQnLCAncmVzaXplJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VibWl0JywgJ3N1c3BlbmQnLCAndGltZVVwZGF0ZScsICd0b3VjaENhbmNlbCcsICd0b3VjaEVuZCcsICd0b3VjaFN0YXJ0JywgJ3ZvbHVtZUNoYW5nZScsICdzY3JvbGwnLCAndG9nZ2xlJywgJ3RvdWNoTW92ZScsICd3YWl0aW5nJywgJ3doZWVsJ107XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCByZWFjdE5hbWUpIHtcbiAgdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuc2V0KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKTtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlYWN0TmFtZSwgW2RvbUV2ZW50TmFtZV0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZUV2ZW50cygpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaW1wbGVFdmVudFBsdWdpbkV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBldmVudE5hbWUgPSBzaW1wbGVFdmVudFBsdWdpbkV2ZW50c1tpXTtcbiAgICB2YXIgZG9tRXZlbnROYW1lID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudE5hbWVbMF0udG9VcHBlckNhc2UoKSArIGV2ZW50TmFtZS5zbGljZSgxKTtcbiAgICByZWdpc3RlclNpbXBsZUV2ZW50KGRvbUV2ZW50TmFtZSwgJ29uJyArIGNhcGl0YWxpemVkRXZlbnQpO1xuICB9IC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgZXZlbnQgbmFtZXMgZG9uJ3QgbWF0Y2guXG5cblxuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9FTkQsICdvbkFuaW1hdGlvbkVuZCcpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9JVEVSQVRJT04sICdvbkFuaW1hdGlvbkl0ZXJhdGlvbicpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KEFOSU1BVElPTl9TVEFSVCwgJ29uQW5pbWF0aW9uU3RhcnQnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZGJsY2xpY2snLCAnb25Eb3VibGVDbGljaycpO1xuICByZWdpc3RlclNpbXBsZUV2ZW50KCdmb2N1c2luJywgJ29uRm9jdXMnKTtcbiAgcmVnaXN0ZXJTaW1wbGVFdmVudCgnZm9jdXNvdXQnLCAnb25CbHVyJyk7XG4gIHJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9FTkQsICdvblRyYW5zaXRpb25FbmQnKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ0KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIHJlYWN0TmFtZSA9IHRvcExldmVsRXZlbnRzVG9SZWFjdE5hbWVzLmdldChkb21FdmVudE5hbWUpO1xuXG4gIGlmIChyZWFjdE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNFdmVudDtcbiAgdmFyIHJlYWN0RXZlbnRUeXBlID0gZG9tRXZlbnROYW1lO1xuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEga2V5cHJlc3MgZXZlbnQgZm9yIGZ1bmN0aW9uIGtleXMgdG9vLiBUaGlzIHJlbW92ZXNcbiAgICAgIC8vIHRoZSB1bndhbnRlZCBrZXlwcmVzcyBldmVudHMuIEVudGVyIGlzIGhvd2V2ZXIgYm90aCBwcmludGFibGUgYW5kXG4gICAgICAvLyBub24tcHJpbnRhYmxlLiBPbmUgd291bGQgZXhwZWN0IFRhYiB0byBiZSBhcyB3ZWxsIChidXQgaXQgaXNuJ3QpLlxuICAgICAgaWYgKGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgcmVhY3RFdmVudFR5cGUgPSAnZm9jdXMnO1xuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgcmVhY3RFdmVudFR5cGUgPSAnYmx1cic7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdiZWZvcmVibHVyJzpcbiAgICBjYXNlICdhZnRlcmJsdXInOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY2xpY2snOlxuICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEgY2xpY2sgZXZlbnQgb24gcmlnaHQgbW91c2UgY2xpY2tzLiBUaGlzIHJlbW92ZXMgdGhlXG4gICAgICAvLyB1bndhbnRlZCBjbGljayBldmVudHMuXG4gICAgICBpZiAobmF0aXZlRXZlbnQuYnV0dG9uID09PSAyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ2F1eGNsaWNrJzpcbiAgICBjYXNlICdkYmxjbGljayc6XG4gICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICBjYXNlICdtb3VzZW1vdmUnOlxuICAgIGNhc2UgJ21vdXNldXAnOiAvLyBUT0RPOiBEaXNhYmxlZCBlbGVtZW50cyBzaG91bGQgbm90IHJlc3BvbmQgdG8gbW91c2UgZXZlbnRzXG5cbiAgICAvKiBmYWxscyB0aHJvdWdoICovXG5cbiAgICBjYXNlICdtb3VzZW91dCc6XG4gICAgY2FzZSAnbW91c2VvdmVyJzpcbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkcmFnJzpcbiAgICBjYXNlICdkcmFnZW5kJzpcbiAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgIGNhc2UgJ2RyYWdleGl0JzpcbiAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICBjYXNlICdkcmFnc3RhcnQnOlxuICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRHJhZ0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0b3VjaGNhbmNlbCc6XG4gICAgY2FzZSAndG91Y2hlbmQnOlxuICAgIGNhc2UgJ3RvdWNobW92ZSc6XG4gICAgY2FzZSAndG91Y2hzdGFydCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUb3VjaEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEFOSU1BVElPTl9FTkQ6XG4gICAgY2FzZSBBTklNQVRJT05fSVRFUkFUSU9OOlxuICAgIGNhc2UgQU5JTUFUSU9OX1NUQVJUOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQW5pbWF0aW9uRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgVFJBTlNJVElPTl9FTkQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3Njcm9sbCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNVSUV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd3aGVlbCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNXaGVlbEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb3B5JzpcbiAgICBjYXNlICdjdXQnOlxuICAgIGNhc2UgJ3Bhc3RlJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdwb2ludGVyY2FuY2VsJzpcbiAgICBjYXNlICdwb2ludGVyZG93bic6XG4gICAgY2FzZSAncG9pbnRlcm1vdmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICBjYXNlICdwb2ludGVydXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljUG9pbnRlckV2ZW50O1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgaW5DYXB0dXJlUGhhc2UgPSAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0NBUFRVUkVfUEhBU0UpICE9PSAwO1xuXG4gIHtcbiAgICAvLyBTb21lIGV2ZW50cyBkb24ndCBidWJibGUgaW4gdGhlIGJyb3dzZXIuXG4gICAgLy8gSW4gdGhlIHBhc3QsIFJlYWN0IGhhcyBhbHdheXMgYnViYmxlZCB0aGVtLCBidXQgdGhpcyBjYW4gYmUgc3VycHJpc2luZy5cbiAgICAvLyBXZSdyZSBnb2luZyB0byB0cnkgYWxpZ25pbmcgY2xvc2VyIHRvIHRoZSBicm93c2VyIGJlaGF2aW9yIGJ5IG5vdCBidWJibGluZ1xuICAgIC8vIHRoZW0gaW4gUmVhY3QgZWl0aGVyLiBXZSdsbCBzdGFydCBieSBub3QgYnViYmxpbmcgb25TY3JvbGwsIGFuZCB0aGVuIGV4cGFuZC5cbiAgICB2YXIgYWNjdW11bGF0ZVRhcmdldE9ubHkgPSAhaW5DYXB0dXJlUGhhc2UgJiYgLy8gVE9ETzogaWRlYWxseSwgd2UnZCBldmVudHVhbGx5IGFkZCBhbGwgZXZlbnRzIGZyb21cbiAgICAvLyBub25EZWxlZ2F0ZWRFdmVudHMgbGlzdCBpbiBET01QbHVnaW5FdmVudFN5c3RlbS5cbiAgICAvLyBUaGVuIHdlIGNhbiByZW1vdmUgdGhpcyBzcGVjaWFsIGxpc3QuXG4gICAgLy8gVGhpcyBpcyBhIGJyZWFraW5nIGNoYW5nZSB0aGF0IGNhbiB3YWl0IHVudGlsIFJlYWN0IDE4LlxuICAgIGRvbUV2ZW50TmFtZSA9PT0gJ3Njcm9sbCc7XG5cbiAgICB2YXIgX2xpc3RlbmVycyA9IGFjY3VtdWxhdGVTaW5nbGVQaGFzZUxpc3RlbmVycyh0YXJnZXRJbnN0LCByZWFjdE5hbWUsIG5hdGl2ZUV2ZW50LnR5cGUsIGluQ2FwdHVyZVBoYXNlLCBhY2N1bXVsYXRlVGFyZ2V0T25seSk7XG5cbiAgICBpZiAoX2xpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGNyZWF0ZSBldmVudCBsYXppbHkuXG4gICAgICB2YXIgX2V2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihyZWFjdE5hbWUsIHJlYWN0RXZlbnRUeXBlLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogX2V2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IF9saXN0ZW5lcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiByZW1vdmUgdG9wLWxldmVsIHNpZGUgZWZmZWN0LlxucmVnaXN0ZXJTaW1wbGVFdmVudHMoKTtcbnJlZ2lzdGVyRXZlbnRzJDIoKTtcbnJlZ2lzdGVyRXZlbnRzJDEoKTtcbnJlZ2lzdGVyRXZlbnRzJDMoKTtcbnJlZ2lzdGVyRXZlbnRzKCk7XG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkNShkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIC8vIFRPRE86IHdlIHNob3VsZCByZW1vdmUgdGhlIGNvbmNlcHQgb2YgYSBcIlNpbXBsZUV2ZW50UGx1Z2luXCIuXG4gIC8vIFRoaXMgaXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGV2ZW50IHN5c3RlbS4gQWxsXG4gIC8vIHRoZSBvdGhlciBwbHVnaW5zIGFyZSBlc3NlbnRpYWxseSBwb2x5ZmlsbHMuIFNvIHRoZSBwbHVnaW5cbiAgLy8gc2hvdWxkIHByb2JhYmx5IGJlIGlubGluZWQgc29tZXdoZXJlIGFuZCBoYXZlIGl0cyBsb2dpY1xuICAvLyBiZSBjb3JlIHRoZSB0byBldmVudCBzeXN0ZW0uIFRoaXMgd291bGQgcG90ZW50aWFsbHkgYWxsb3dcbiAgLy8gdXMgdG8gc2hpcCBidWlsZHMgb2YgUmVhY3Qgd2l0aG91dCB0aGUgcG9seWZpbGxlZCBwbHVnaW5zIGJlbG93LlxuICBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICB2YXIgc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucyA9IChldmVudFN5c3RlbUZsYWdzICYgU0hPVUxEX05PVF9QUk9DRVNTX1BPTFlGSUxMX0VWRU5UX1BMVUdJTlMpID09PSAwOyAvLyBXZSBkb24ndCBwcm9jZXNzIHRoZXNlIGV2ZW50cyB1bmxlc3Mgd2UgYXJlIGluIHRoZVxuICAvLyBldmVudCdzIG5hdGl2ZSBcImJ1YmJsZVwiIHBoYXNlLCB3aGljaCBtZWFucyB0aGF0IHdlJ3JlXG4gIC8vIG5vdCBpbiB0aGUgY2FwdHVyZSBwaGFzZS4gVGhhdCdzIGJlY2F1c2Ugd2UgZW11bGF0ZVxuICAvLyB0aGUgY2FwdHVyZSBwaGFzZSBoZXJlIHN0aWxsLiBUaGlzIGlzIGEgdHJhZGUtb2ZmLFxuICAvLyBiZWNhdXNlIGluIGFuIGlkZWFsIHdvcmxkIHdlIHdvdWxkIG5vdCBlbXVsYXRlIGFuZCB1c2VcbiAgLy8gdGhlIHBoYXNlcyBwcm9wZXJseSwgbGlrZSB3ZSBkbyB3aXRoIHRoZSBTaW1wbGVFdmVudFxuICAvLyBwbHVnaW4uIEhvd2V2ZXIsIHRoZSBwbHVnaW5zIGJlbG93IGVpdGhlciBleHBlY3RcbiAgLy8gZW11bGF0aW9uIChFbnRlckxlYXZlKSBvciB1c2Ugc3RhdGUgbG9jYWxpemVkIHRvIHRoYXRcbiAgLy8gcGx1Z2luIChCZWZvcmVJbnB1dCwgQ2hhbmdlLCBTZWxlY3QpLiBUaGUgc3RhdGUgaW5cbiAgLy8gdGhlc2UgbW9kdWxlcyBjb21wbGljYXRlcyB0aGluZ3MsIGFzIHlvdSdsbCBlc3NlbnRpYWxseVxuICAvLyBnZXQgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhcHR1cmUgcGhhc2UgZXZlbnQgbWlnaHQgY2hhbmdlXG4gIC8vIHN0YXRlLCBvbmx5IGZvciB0aGUgZm9sbG93aW5nIGJ1YmJsZSBldmVudCB0byBjb21lIGluXG4gIC8vIGxhdGVyIGFuZCBub3QgdHJpZ2dlciBhbnl0aGluZyBhcyB0aGUgc3RhdGUgbm93XG4gIC8vIGludmFsaWRhdGVzIHRoZSBoZXVyaXN0aWNzIG9mIHRoZSBldmVudCBwbHVnaW4uIFdlXG4gIC8vIGNvdWxkIGFsdGVyIGFsbCB0aGVzZSBwbHVnaW5zIHRvIHdvcmsgaW4gc3VjaCB3YXlzLCBidXRcbiAgLy8gdGhhdCBtaWdodCBjYXVzZSBvdGhlciB1bmtub3duIHNpZGUtZWZmZWN0cyB0aGF0IHdlXG4gIC8vIGNhbid0IGZvcmVzZWUgcmlnaHQgbm93LlxuXG4gIGlmIChzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zKSB7XG4gICAgZXh0cmFjdEV2ZW50cyQyKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMkMyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZXh0cmFjdEV2ZW50cyhkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIH1cbn0gLy8gTGlzdCBvZiBldmVudHMgdGhhdCBuZWVkIHRvIGJlIGluZGl2aWR1YWxseSBhdHRhY2hlZCB0byBtZWRpYSBlbGVtZW50cy5cblxuXG52YXIgbWVkaWFFdmVudFR5cGVzID0gWydhYm9ydCcsICdjYW5wbGF5JywgJ2NhbnBsYXl0aHJvdWdoJywgJ2R1cmF0aW9uY2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2xvYWRlZGRhdGEnLCAnbG9hZGVkbWV0YWRhdGEnLCAnbG9hZHN0YXJ0JywgJ3BhdXNlJywgJ3BsYXknLCAncGxheWluZycsICdwcm9ncmVzcycsICdyYXRlY2hhbmdlJywgJ3Jlc2l6ZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAndGltZXVwZGF0ZScsICd2b2x1bWVjaGFuZ2UnLCAnd2FpdGluZyddOyAvLyBXZSBzaG91bGQgbm90IGRlbGVnYXRlIHRoZXNlIGV2ZW50cyB0byB0aGUgY29udGFpbmVyLCBidXQgcmF0aGVyXG4vLyBzZXQgdGhlbSBvbiB0aGUgYWN0dWFsIHRhcmdldCBlbGVtZW50IGl0c2VsZi4gVGhpcyBpcyBwcmltYXJpbHlcbi8vIGJlY2F1c2UgdGhlc2UgZXZlbnRzIGRvIG5vdCBjb25zaXN0ZW50bHkgYnViYmxlIGluIHRoZSBET00uXG5cbnZhciBub25EZWxlZ2F0ZWRFdmVudHMgPSBuZXcgU2V0KFsnY2FuY2VsJywgJ2Nsb3NlJywgJ2ludmFsaWQnLCAnbG9hZCcsICdzY3JvbGwnLCAndG9nZ2xlJ10uY29uY2F0KG1lZGlhRXZlbnRUeXBlcykpO1xuXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCAndW5rbm93bi1ldmVudCc7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IodHlwZSwgbGlzdGVuZXIsIHVuZGVmaW5lZCwgZXZlbnQpO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGRpc3BhdGNoTGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcHJldmlvdXNJbnN0YW5jZTtcblxuICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICBmb3IgKHZhciBpID0gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IGRpc3BhdGNoTGlzdGVuZXJzW2ldLFxuICAgICAgICAgIGluc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuaW5zdGFuY2UsXG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKGluc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRfaSA9IGRpc3BhdGNoTGlzdGVuZXJzW19pXSxcbiAgICAgICAgICBfaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuaW5zdGFuY2UsXG4gICAgICAgICAgX2N1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBfbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kubGlzdGVuZXI7XG5cbiAgICAgIGlmIChfaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgX2xpc3RlbmVyLCBfY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gX2luc3RhbmNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaFF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldLFxuICAgICAgICBldmVudCA9IF9kaXNwYXRjaFF1ZXVlJGkuZXZlbnQsXG4gICAgICAgIGxpc3RlbmVycyA9IF9kaXNwYXRjaFF1ZXVlJGkubGlzdGVuZXJzO1xuICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBsaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKTsgLy8gIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICB9IC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuXG5cbiAgcmV0aHJvd0NhdWdodEVycm9yKCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKTtcbn1cblxuZnVuY3Rpb24gbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEVsZW1lbnQpIHtcbiAge1xuICAgIGlmICghbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpKSB7XG4gICAgICBlcnJvcignRGlkIG5vdCBleHBlY3QgYSBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCkgY2FsbCBmb3IgXCIlc1wiLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGRvbUV2ZW50TmFtZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIgPSBmYWxzZTtcbiAgdmFyIGxpc3RlbmVyU2V0ID0gZ2V0RXZlbnRMaXN0ZW5lclNldCh0YXJnZXRFbGVtZW50KTtcbiAgdmFyIGxpc3RlbmVyU2V0S2V5ID0gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcblxuICBpZiAoIWxpc3RlbmVyU2V0LmhhcyhsaXN0ZW5lclNldEtleSkpIHtcbiAgICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBkb21FdmVudE5hbWUsIElTX05PTl9ERUxFR0FURUQsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyLCB0YXJnZXQpIHtcbiAge1xuICAgIGlmIChub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkgJiYgIWlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBhIGxpc3RlblRvTmF0aXZlRXZlbnQoKSBjYWxsIGZvciBcIiVzXCIgaW4gdGhlIGJ1YmJsZSBwaGFzZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBkb21FdmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBldmVudFN5c3RlbUZsYWdzID0gMDtcblxuICBpZiAoaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcikge1xuICAgIGV2ZW50U3lzdGVtRmxhZ3MgfD0gSVNfQ0FQVFVSRV9QSEFTRTtcbiAgfVxuXG4gIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldCwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcbn0gLy8gVGhpcyBpcyBvbmx5IHVzZWQgYnkgY3JlYXRlRXZlbnRIYW5kbGUgd2hlbiB0aGVcbnZhciBsaXN0ZW5pbmdNYXJrZXIgPSAnX3JlYWN0TGlzdGVuaW5nJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgaWYgKCFyb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSA9IHRydWU7XG4gICAgYWxsTmF0aXZlRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGRvbUV2ZW50TmFtZSkge1xuICAgICAgLy8gV2UgaGFuZGxlIHNlbGVjdGlvbmNoYW5nZSBzZXBhcmF0ZWx5IGJlY2F1c2UgaXRcbiAgICAgIC8vIGRvZXNuJ3QgYnViYmxlIGFuZCBuZWVkcyB0byBiZSBvbiB0aGUgZG9jdW1lbnQuXG4gICAgICBpZiAoZG9tRXZlbnROYW1lICE9PSAnc2VsZWN0aW9uY2hhbmdlJykge1xuICAgICAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoZG9tRXZlbnROYW1lLCBmYWxzZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIHRydWUsIHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckVsZW1lbnQgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xuXG4gICAgaWYgKG93bmVyRG9jdW1lbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQgYWxzbyBuZWVkcyBkZWR1cGxpY2F0aW9uXG4gICAgICAvLyBidXQgaXQgaXMgYXR0YWNoZWQgdG8gdGhlIGRvY3VtZW50LlxuICAgICAgaWYgKCFvd25lckRvY3VtZW50W2xpc3RlbmluZ01hcmtlcl0pIHtcbiAgICAgICAgb3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudCgnc2VsZWN0aW9uY2hhbmdlJywgZmFsc2UsIG93bmVyRG9jdW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciwgaXNEZWZlcnJlZExpc3RlbmVyRm9yTGVnYWN5RkJTdXBwb3J0KSB7XG4gIHZhciBsaXN0ZW5lciA9IGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKTsgLy8gSWYgcGFzc2l2ZSBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCwgdGhlbiB0aGUgZXZlbnQgd2lsbCBiZVxuICAvLyBhY3RpdmUgYW5kIG5vdCBwYXNzaXZlLlxuXG4gIHZhciBpc1Bhc3NpdmVMaXN0ZW5lciA9IHVuZGVmaW5lZDtcblxuICBpZiAocGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQpIHtcbiAgICAvLyBCcm93c2VycyBpbnRyb2R1Y2VkIGFuIGludGVydmVudGlvbiwgbWFraW5nIHRoZXNlIGV2ZW50c1xuICAgIC8vIHBhc3NpdmUgYnkgZGVmYXVsdCBvbiBkb2N1bWVudC4gUmVhY3QgZG9lc24ndCBiaW5kIHRoZW1cbiAgICAvLyB0byBkb2N1bWVudCBhbnltb3JlLCBidXQgY2hhbmdpbmcgdGhpcyBub3cgd291bGQgdW5kb1xuICAgIC8vIHRoZSBwZXJmb3JtYW5jZSB3aW5zIGZyb20gdGhlIGNoYW5nZS4gU28gd2UgZW11bGF0ZVxuICAgIC8vIHRoZSBleGlzdGluZyBiZWhhdmlvciBtYW51YWxseSBvbiB0aGUgcm9vdHMgbm93LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTk2NTFcbiAgICBpZiAoZG9tRXZlbnROYW1lID09PSAndG91Y2hzdGFydCcgfHwgZG9tRXZlbnROYW1lID09PSAndG91Y2htb3ZlJyB8fCBkb21FdmVudE5hbWUgPT09ICd3aGVlbCcpIHtcbiAgICAgIGlzUGFzc2l2ZUxpc3RlbmVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB0YXJnZXRDb250YWluZXIgPSAgdGFyZ2V0Q29udGFpbmVyO1xuICB2YXIgdW5zdWJzY3JpYmVMaXN0ZW5lcjsgLy8gV2hlbiBsZWdhY3lGQlN1cHBvcnQgaXMgZW5hYmxlZCwgaXQncyBmb3Igd2hlbiB3ZVxuXG5cbiAgaWYgKGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpIHtcbiAgICBpZiAoaXNQYXNzaXZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lciwgaXNQYXNzaXZlTGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudEJ1YmJsZUxpc3RlbmVyV2l0aFBhc3NpdmVGbGFnKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lciwgaXNQYXNzaXZlTGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcih0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc01hdGNoaW5nUm9vdENvbnRhaW5lcihncmFuZENvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHJldHVybiBncmFuZENvbnRhaW5lciA9PT0gdGFyZ2V0Q29udGFpbmVyIHx8IGdyYW5kQ29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgJiYgZ3JhbmRDb250YWluZXIucGFyZW50Tm9kZSA9PT0gdGFyZ2V0Q29udGFpbmVyO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBhbmNlc3Rvckluc3QgPSB0YXJnZXRJbnN0O1xuXG4gIGlmICgoZXZlbnRTeXN0ZW1GbGFncyAmIElTX0VWRU5UX0hBTkRMRV9OT05fTUFOQUdFRF9OT0RFKSA9PT0gMCAmJiAoZXZlbnRTeXN0ZW1GbGFncyAmIElTX05PTl9ERUxFR0FURUQpID09PSAwKSB7XG4gICAgdmFyIHRhcmdldENvbnRhaW5lck5vZGUgPSB0YXJnZXRDb250YWluZXI7IC8vIElmIHdlIGFyZSB1c2luZyB0aGUgbGVnYWN5IEZCIHN1cHBvcnQgZmxhZywgd2VcblxuICAgIGlmICh0YXJnZXRJbnN0ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgYmVsb3cgbG9naWMgYXR0ZW1wdHMgdG8gd29yayBvdXQgaWYgd2UgbmVlZCB0byBjaGFuZ2VcbiAgICAgIC8vIHRoZSB0YXJnZXQgZmliZXIgdG8gYSBkaWZmZXJlbnQgYW5jZXN0b3IuIFdlIGhhZCBzaW1pbGFyIGxvZ2ljXG4gICAgICAvLyBpbiB0aGUgbGVnYWN5IGV2ZW50IHN5c3RlbSwgZXhjZXB0IHRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuXG4gICAgICAvLyBzeXN0ZW1zIGlzIHRoYXQgdGhlIG1vZGVybiBldmVudCBzeXN0ZW0gbm93IGhhcyBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgLy8gYXR0YWNoZWQgdG8gZWFjaCBSZWFjdCBSb290IGFuZCBSZWFjdCBQb3J0YWwgUm9vdC4gVG9nZXRoZXIsXG4gICAgICAvLyB0aGUgRE9NIG5vZGVzIHJlcHJlc2VudGluZyB0aGVzZSByb290cyBhcmUgdGhlIFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gVG8gZmlndXJlIG91dCB3aGljaCBhbmNlc3RvciBpbnN0YW5jZSB3ZSBzaG91bGQgdXNlLCB3ZSB0cmF2ZXJzZVxuICAgICAgLy8gdXAgdGhlIGZpYmVyIHRyZWUgZnJvbSB0aGUgdGFyZ2V0IGluc3RhbmNlIGFuZCBhdHRlbXB0IHRvIGZpbmRcbiAgICAgIC8vIHJvb3QgYm91bmRhcmllcyB0aGF0IG1hdGNoIHRoYXQgb2Ygb3VyIGN1cnJlbnQgXCJyb290Q29udGFpbmVyXCIuXG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoYXQgXCJyb290Q29udGFpbmVyXCIsIHdlIGZpbmQgdGhlIHBhcmVudCBmaWJlclxuICAgICAgLy8gc3ViLXRyZWUgZm9yIHRoYXQgcm9vdCBhbmQgbWFrZSB0aGF0IG91ciBhbmNlc3RvciBpbnN0YW5jZS5cbiAgICAgIHZhciBub2RlID0gdGFyZ2V0SW5zdDtcblxuICAgICAgbWFpbkxvb3A6IHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5vZGVUYWcgPSBub2RlLnRhZztcblxuICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFJvb3QgfHwgbm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgIHZhciBjb250YWluZXIgPSBub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGNvbnRhaW5lciwgdGFyZ2V0Q29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChub2RlVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAvLyBUaGUgdGFyZ2V0IGlzIGEgcG9ydGFsLCBidXQgaXQncyBub3QgdGhlIHJvb3RDb250YWluZXIgd2UncmUgbG9va2luZyBmb3IuXG4gICAgICAgICAgICAvLyBOb3JtYWxseSBwb3J0YWxzIGhhbmRsZSB0aGVpciBvd24gZXZlbnRzIGFsbCB0aGUgd2F5IGRvd24gdG8gdGhlIHJvb3QuXG4gICAgICAgICAgICAvLyBTbyB3ZSBzaG91bGQgYmUgYWJsZSB0byBzdG9wIG5vdy4gSG93ZXZlciwgd2UgZG9uJ3Qga25vdyBpZiB0aGlzIHBvcnRhbFxuICAgICAgICAgICAgLy8gd2FzIHBhcnQgb2YgKm91ciogcm9vdC5cbiAgICAgICAgICAgIHZhciBncmFuZE5vZGUgPSBub2RlLnJldHVybjtcblxuICAgICAgICAgICAgd2hpbGUgKGdyYW5kTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICB2YXIgZ3JhbmRUYWcgPSBncmFuZE5vZGUudGFnO1xuXG4gICAgICAgICAgICAgIGlmIChncmFuZFRhZyA9PT0gSG9zdFJvb3QgfHwgZ3JhbmRUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgZ3JhbmRDb250YWluZXIgPSBncmFuZE5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yIGFuZCB3ZSBmb3VuZCBpdCBhc1xuICAgICAgICAgICAgICAgICAgLy8gYSBwYXJlbnQgb2YgdGhlIFBvcnRhbC4gVGhhdCBtZWFucyB3ZSBjYW4gaWdub3JlIGl0IGJlY2F1c2UgdGhlXG4gICAgICAgICAgICAgICAgICAvLyBQb3J0YWwgd2lsbCBidWJibGUgdGhyb3VnaCB0byB1cy5cbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBncmFuZE5vZGUgPSBncmFuZE5vZGUucmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gTm93IHdlIG5lZWQgdG8gZmluZCBpdCdzIGNvcnJlc3BvbmRpbmcgaG9zdCBmaWJlciBpbiB0aGUgb3RoZXJcbiAgICAgICAgICAvLyB0cmVlLiBUbyBkbyB0aGlzIHdlIGNhbiB1c2UgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUsIGJ1dCB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgZmliZXIgaXMgYSBob3N0IGluc3RhbmNlLCBvdGhlcndpc2VcbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHRyYXZlcnNlIHVwIHRocm91Z2ggdGhlIERPTSB0aWxsIHdlIGZpbmQgdGhlIGNvcnJlY3RcbiAgICAgICAgICAvLyBub2RlIHRoYXQgaXMgZnJvbSB0aGUgb3RoZXIgdHJlZS5cblxuXG4gICAgICAgICAgd2hpbGUgKGNvbnRhaW5lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5vZGUgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShjb250YWluZXIpO1xuXG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnROb2RlLnRhZztcblxuICAgICAgICAgICAgaWYgKHBhcmVudFRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBwYXJlbnRUYWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgICAgICAgIG5vZGUgPSBhbmNlc3Rvckluc3QgPSBwYXJlbnROb2RlO1xuICAgICAgICAgICAgICBjb250aW51ZSBtYWluTG9vcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIGFuY2VzdG9ySW5zdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICByZXR1cm4ge1xuICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICBsaXN0ZW5lcjogbGlzdGVuZXIsXG4gICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnRUeXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHksIG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjYXB0dXJlTmFtZSA9IHJlYWN0TmFtZSAhPT0gbnVsbCA/IHJlYWN0TmFtZSArICdDYXB0dXJlJyA6IG51bGw7XG4gIHZhciByZWFjdEV2ZW50TmFtZSA9IGluQ2FwdHVyZVBoYXNlID8gY2FwdHVyZU5hbWUgOiByZWFjdE5hbWU7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0RmliZXI7XG4gIHZhciBsYXN0SG9zdENvbXBvbmVudCA9IG51bGw7IC8vIEFjY3VtdWxhdGUgYWxsIGluc3RhbmNlcyBhbmQgbGlzdGVuZXJzIHZpYSB0aGUgdGFyZ2V0IC0+IHJvb3QgcGF0aC5cblxuICB3aGlsZSAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICB2YXIgX2luc3RhbmNlMiA9IGluc3RhbmNlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2UyLnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlMi50YWc7IC8vIEhhbmRsZSBsaXN0ZW5lcnMgdGhhdCBhcmUgb24gSG9zdENvbXBvbmVudHMgKGkuZS4gPGRpdj4pXG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgbGFzdEhvc3RDb21wb25lbnQgPSBzdGF0ZU5vZGU7IC8vIGNyZWF0ZUV2ZW50SGFuZGxlIGxpc3RlbmVyc1xuXG5cbiAgICAgIGlmIChyZWFjdEV2ZW50TmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVhY3RFdmVudE5hbWUpO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgbGlzdGVuZXIsIGxhc3RIb3N0Q29tcG9uZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIElmIHdlIGFyZSBvbmx5IGFjY3VtdWxhdGluZyBldmVudHMgZm9yIHRoZSB0YXJnZXQsIHRoZW4gd2UgZG9uJ3RcbiAgICAvLyBjb250aW51ZSB0byBwcm9wYWdhdGUgdGhyb3VnaCB0aGUgUmVhY3QgZmliZXIgdHJlZSB0byBmaW5kIG90aGVyXG4gICAgLy8gbGlzdGVuZXJzLlxuXG5cbiAgICBpZiAoYWNjdW11bGF0ZVRhcmdldE9ubHkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gLy8gSWYgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIG9uQmVmb3JlQmx1ciBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIHRha2VcblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVycztcbn0gLy8gV2Ugc2hvdWxkIG9ubHkgdXNlIHRoaXMgZnVuY3Rpb24gZm9yOlxuLy8gLSBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXG4vLyAtIENoYW5nZUV2ZW50UGx1Z2luXG4vLyAtIFNlbGVjdEV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoZXNlIHBsdWdpbnNcbi8vIGluIHRoZSBidWJibGUgcGhhc2UsIHNvIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSB0d29cbi8vIHBoYXNlIGV2ZW50IGxpc3RlbmVycyAodmlhIGVtdWxhdGlvbikuXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyh0YXJnZXRGaWJlciwgcmVhY3ROYW1lKSB7XG4gIHZhciBjYXB0dXJlTmFtZSA9IHJlYWN0TmFtZSArICdDYXB0dXJlJztcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UzID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTMuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UzLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudFRhcmdldCA9IHN0YXRlTm9kZTtcbiAgICAgIHZhciBjYXB0dXJlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZU5hbWUpO1xuXG4gICAgICBpZiAoY2FwdHVyZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgY2FwdHVyZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBidWJibGVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdE5hbWUpO1xuXG4gICAgICBpZiAoYnViYmxlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVycztcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50KGluc3QpIHtcbiAgaWYgKGluc3QgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGRvIHtcbiAgICBpbnN0ID0gaW5zdC5yZXR1cm47IC8vIFRPRE86IElmIHRoaXMgaXMgYSBIb3N0Um9vdCB3ZSBtaWdodCB3YW50IHRvIGJhaWwgb3V0LlxuICAgIC8vIFRoYXQgaXMgZGVwZW5kaW5nIG9uIGlmIHdlIHdhbnQgbmVzdGVkIHN1YnRyZWVzIChsYXllcnMpIHRvIGJ1YmJsZVxuICAgIC8vIGV2ZW50cyB0byB0aGVpciBwYXJlbnQuIFdlIGNvdWxkIGFsc28gZ28gdGhyb3VnaCBwYXJlbnROb2RlIG9uIHRoZVxuICAgIC8vIGhvc3Qgbm9kZSBidXQgdGhhdCB3b3VsZG4ndCB3b3JrIGZvciBSZWFjdCBOYXRpdmUgYW5kIGRvZXNuJ3QgbGV0IHVzXG4gICAgLy8gZG8gdGhlIHBvcnRhbCBmZWF0dXJlLlxuICB9IHdoaWxlIChpbnN0ICYmIGluc3QudGFnICE9PSBIb3N0Q29tcG9uZW50KTtcblxuICBpZiAoaW5zdCkge1xuICAgIHJldHVybiBpbnN0O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIFJldHVybiB0aGUgbG93ZXN0IGNvbW1vbiBhbmNlc3RvciBvZiBBIGFuZCBCLCBvciBudWxsIGlmIHRoZXkgYXJlIGluXG4gKiBkaWZmZXJlbnQgdHJlZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRMb3dlc3RDb21tb25BbmNlc3RvcihpbnN0QSwgaW5zdEIpIHtcbiAgdmFyIG5vZGVBID0gaW5zdEE7XG4gIHZhciBub2RlQiA9IGluc3RCO1xuICB2YXIgZGVwdGhBID0gMDtcblxuICBmb3IgKHZhciB0ZW1wQSA9IG5vZGVBOyB0ZW1wQTsgdGVtcEEgPSBnZXRQYXJlbnQodGVtcEEpKSB7XG4gICAgZGVwdGhBKys7XG4gIH1cblxuICB2YXIgZGVwdGhCID0gMDtcblxuICBmb3IgKHZhciB0ZW1wQiA9IG5vZGVCOyB0ZW1wQjsgdGVtcEIgPSBnZXRQYXJlbnQodGVtcEIpKSB7XG4gICAgZGVwdGhCKys7XG4gIH0gLy8gSWYgQSBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuXG5cbiAgd2hpbGUgKGRlcHRoQSAtIGRlcHRoQiA+IDApIHtcbiAgICBub2RlQSA9IGdldFBhcmVudChub2RlQSk7XG4gICAgZGVwdGhBLS07XG4gIH0gLy8gSWYgQiBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuXG5cbiAgd2hpbGUgKGRlcHRoQiAtIGRlcHRoQSA+IDApIHtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gICAgZGVwdGhCLS07XG4gIH0gLy8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG5cblxuICB2YXIgZGVwdGggPSBkZXB0aEE7XG5cbiAgd2hpbGUgKGRlcHRoLS0pIHtcbiAgICBpZiAobm9kZUEgPT09IG5vZGVCIHx8IG5vZGVCICE9PSBudWxsICYmIG5vZGVBID09PSBub2RlQi5hbHRlcm5hdGUpIHtcbiAgICAgIHJldHVybiBub2RlQTtcbiAgICB9XG5cbiAgICBub2RlQSA9IGdldFBhcmVudChub2RlQSk7XG4gICAgbm9kZUIgPSBnZXRQYXJlbnQobm9kZUIpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZXZlbnQsIHRhcmdldCwgY29tbW9uLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IGV2ZW50Ll9yZWFjdE5hbWU7XG4gIHZhciBsaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIGluc3RhbmNlID0gdGFyZ2V0O1xuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIGlmIChpbnN0YW5jZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgX2luc3RhbmNlNCA9IGluc3RhbmNlLFxuICAgICAgICBhbHRlcm5hdGUgPSBfaW5zdGFuY2U0LmFsdGVybmF0ZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlNC5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTQudGFnO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGNvbW1vbikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuXG4gICAgICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWdpc3RyYXRpb25OYW1lKTtcblxuICAgICAgICBpZiAoY2FwdHVyZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaW5DYXB0dXJlUGhhc2UpIHtcbiAgICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgbGlzdGVuZXJzLnB1c2goY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcihpbnN0YW5jZSwgYnViYmxlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICB9XG5cbiAgaWYgKGxpc3RlbmVycy5sZW5ndGggIT09IDApIHtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcbiAgfVxufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEVudGVyTGVhdmVFdmVudFBsdWdpblxuLy8gVGhpcyBpcyBiZWNhdXNlIHdlIG9ubHkgcHJvY2VzcyB0aGlzIHBsdWdpblxuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzLlxuXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlVHdvUGhhc2VMaXN0ZW5lcnMoZGlzcGF0Y2hRdWV1ZSwgbGVhdmVFdmVudCwgZW50ZXJFdmVudCwgZnJvbSwgdG8pIHtcbiAgdmFyIGNvbW1vbiA9IGZyb20gJiYgdG8gPyBnZXRMb3dlc3RDb21tb25BbmNlc3Rvcihmcm9tLCB0bykgOiBudWxsO1xuXG4gIGlmIChmcm9tICE9PSBudWxsKSB7XG4gICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBmcm9tLCBjb21tb24sIGZhbHNlKTtcbiAgfVxuXG4gIGlmICh0byAhPT0gbnVsbCAmJiBlbnRlckV2ZW50ICE9PSBudWxsKSB7XG4gICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBlbnRlckV2ZW50LCB0bywgY29tbW9uLCB0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBjYXB0dXJlKSB7XG4gIHJldHVybiBkb21FdmVudE5hbWUgKyBcIl9fXCIgKyAoY2FwdHVyZSA/ICdjYXB0dXJlJyA6ICdidWJibGUnKTtcbn1cblxudmFyIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gZmFsc2U7XG52YXIgREFOR0VST1VTTFlfU0VUX0lOTkVSX0hUTUwgPSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnO1xudmFyIFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyA9ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnO1xudmFyIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HID0gJ3N1cHByZXNzSHlkcmF0aW9uV2FybmluZyc7XG52YXIgQVVUT0ZPQ1VTID0gJ2F1dG9Gb2N1cyc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIFNUWUxFID0gJ3N0eWxlJztcbnZhciBIVE1MJDEgPSAnX19odG1sJztcbnZhciB3YXJuZWRVbmtub3duVGFncztcbnZhciB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50O1xudmFyIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZTtcbnZhciB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzO1xudmFyIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcjtcbnZhciBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nO1xudmFyIG5vcm1hbGl6ZUhUTUw7XG5cbntcbiAgd2FybmVkVW5rbm93blRhZ3MgPSB7XG4gICAgLy8gVGhlcmUgYXJlIHdvcmtpbmcgcG9seWZpbGxzIGZvciA8ZGlhbG9nPi4gTGV0IHBlb3BsZSB1c2UgaXQuXG4gICAgZGlhbG9nOiB0cnVlLFxuICAgIC8vIEVsZWN0cm9uIHNoaXBzIGEgY3VzdG9tIDx3ZWJ2aWV3PiB0YWcgdG8gZGlzcGxheSBleHRlcm5hbCB3ZWIgY29udGVudCBpblxuICAgIC8vIGFuIGlzb2xhdGVkIGZyYW1lIGFuZCBwcm9jZXNzLlxuICAgIC8vIFRoaXMgdGFnIGlzIG5vdCBwcmVzZW50IGluIG5vbiBFbGVjdHJvbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBKU0RvbSB3aGljaFxuICAgIC8vIGlzIG9mdGVuIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gICAgLy8gQHNlZSBodHRwczovL2VsZWN0cm9uanMub3JnL2RvY3MvYXBpL3dlYnZpZXctdGFnXG4gICAgd2VidmlldzogdHJ1ZVxuICB9O1xuXG4gIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQgPSBmdW5jdGlvbiAodHlwZSwgcHJvcHMpIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXModHlwZSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlUHJvcGVydGllcyQxKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcywge1xuICAgICAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llczogcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyxcbiAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNcbiAgICB9KTtcbiAgfTsgLy8gSUUgMTEgcGFyc2VzICYgbm9ybWFsaXplcyB0aGUgc3R5bGUgYXR0cmlidXRlIGFzIG9wcG9zZWQgdG8gb3RoZXJcbiAgLy8gYnJvd3NlcnMuIEl0IGFkZHMgc3BhY2VzIGFuZCBzb3J0cyB0aGUgcHJvcGVydGllcyBpbiBzb21lXG4gIC8vIG5vbi1hbHBoYWJldGljYWwgb3JkZXIuIEhhbmRsaW5nIHRoYXQgd291bGQgcmVxdWlyZSBzb3J0aW5nIENTU1xuICAvLyBwcm9wZXJ0aWVzIGluIHRoZSBjbGllbnQgJiBzZXJ2ZXIgdmVyc2lvbnMgb3IgYXBwbHlpbmdcbiAgLy8gYGV4cGVjdGVkU3R5bGVgIHRvIGEgdGVtcG9yYXJ5IERPTSBub2RlIHRvIHJlYWQgaXRzIGBzdHlsZWAgYXR0cmlidXRlXG4gIC8vIG5vcm1hbGl6ZWQuIFNpbmNlIGl0IG9ubHkgYWZmZWN0cyBJRSwgd2UncmUgc2tpcHBpbmcgc3R5bGUgd2FybmluZ3NcbiAgLy8gaW4gdGhhdCBicm93c2VyIGNvbXBsZXRlbHkgaW4gZmF2b3Igb2YgZG9pbmcgYWxsIHRoYXQgd29yay5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTE4MDdcblxuXG4gIGNhbkRpZmZTdHlsZUZvckh5ZHJhdGlvbldhcm5pbmcgPSBjYW5Vc2VET00gJiYgIWRvY3VtZW50LmRvY3VtZW50TW9kZTtcblxuICB3YXJuRm9yUHJvcERpZmZlcmVuY2UgPSBmdW5jdGlvbiAocHJvcE5hbWUsIHNlcnZlclZhbHVlLCBjbGllbnRWYWx1ZSkge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBub3JtYWxpemVkQ2xpZW50VmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VmFsdWUpO1xuICAgIHZhciBub3JtYWxpemVkU2VydmVyVmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVmFsdWUpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSA9PT0gbm9ybWFsaXplZENsaWVudFZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1Byb3AgYCVzYCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6ICVzIENsaWVudDogJXMnLCBwcm9wTmFtZSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZFNlcnZlclZhbHVlKSwgSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplZENsaWVudFZhbHVlKSk7XG4gIH07XG5cbiAgd2FybkZvckV4dHJhQXR0cmlidXRlcyA9IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lcykge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcbiAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICBhdHRyaWJ1dGVOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICBuYW1lcy5wdXNoKG5hbWUpO1xuICAgIH0pO1xuXG4gICAgZXJyb3IoJ0V4dHJhIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2VydmVyOiAlcycsIG5hbWVzKTtcbiAgfTtcblxuICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAocmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHtcbiAgICBpZiAobGlzdGVuZXIgPT09IGZhbHNlKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBgZmFsc2VgLlxcblxcbicgKyAnSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sICcgKyAncGFzcyAlcz17Y29uZGl0aW9uID8gdmFsdWUgOiB1bmRlZmluZWR9IGluc3RlYWQuJywgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYCVzYCB0eXBlLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcik7XG4gICAgfVxuICB9OyAvLyBQYXJzZSB0aGUgSFRNTCBhbmQgcmVhZCBpdCBiYWNrIHRvIG5vcm1hbGl6ZSB0aGUgSFRNTCBzdHJpbmcgc28gdGhhdCBpdFxuICAvLyBjYW4gYmUgdXNlZCBmb3IgY29tcGFyaXNvbi5cblxuXG4gIG5vcm1hbGl6ZUhUTUwgPSBmdW5jdGlvbiAocGFyZW50LCBodG1sKSB7XG4gICAgLy8gV2UgY291bGQgaGF2ZSBjcmVhdGVkIGEgc2VwYXJhdGUgZG9jdW1lbnQgaGVyZSB0byBhdm9pZFxuICAgIC8vIHJlLWluaXRpYWxpemluZyBjdXN0b20gZWxlbWVudHMgaWYgdGhleSBleGlzdC4gQnV0IHRoaXMgYnJlYWtzXG4gICAgLy8gaG93IDxub3NjcmlwdD4gaXMgYmVpbmcgaGFuZGxlZC4gU28gd2UgdXNlIHRoZSBzYW1lIGRvY3VtZW50LlxuICAgIC8vIFNlZSB0aGUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xMTE1Ny5cbiAgICB2YXIgdGVzdEVsZW1lbnQgPSBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSA/IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50LnRhZ05hbWUpIDogcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHBhcmVudC5uYW1lc3BhY2VVUkksIHBhcmVudC50YWdOYW1lKTtcbiAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0ZXN0RWxlbWVudC5pbm5lckhUTUw7XG4gIH07XG59IC8vIEhUTUwgcGFyc2luZyBub3JtYWxpemVzIENSIGFuZCBDUkxGIHRvIExGLlxuLy8gSXQgYWxzbyBjYW4gdHVybiBcXHUwMDAwIGludG8gXFx1RkZGRCBpbnNpZGUgYXR0cmlidXRlcy5cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zaW5nbGUtcGFnZS5odG1sI3ByZXByb2Nlc3NpbmctdGhlLWlucHV0LXN0cmVhbVxuLy8gSWYgd2UgaGF2ZSBhIG1pc21hdGNoLCBpdCBtaWdodCBiZSBjYXVzZWQgYnkgdGhhdC5cbi8vIFdlIHdpbGwgc3RpbGwgcGF0Y2ggdXAgaW4gdGhpcyBjYXNlIGJ1dCBub3QgZmlyZSB0aGUgd2FybmluZy5cblxuXG52YXIgTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYID0gL1xcclxcbj8vZztcbnZhciBOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVggPSAvXFx1MDAwMHxcXHVGRkZEL2c7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShtYXJrdXApIHtcbiAge1xuICAgIGNoZWNrSHRtbFN0cmluZ0NvZXJjaW9uKG1hcmt1cCk7XG4gIH1cblxuICB2YXIgbWFya3VwU3RyaW5nID0gdHlwZW9mIG1hcmt1cCA9PT0gJ3N0cmluZycgPyBtYXJrdXAgOiAnJyArIG1hcmt1cDtcbiAgcmV0dXJuIG1hcmt1cFN0cmluZy5yZXBsYWNlKE5PUk1BTElaRV9ORVdMSU5FU19SRUdFWCwgJ1xcbicpLnJlcGxhY2UoTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYLCAnJyk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChzZXJ2ZXJUZXh0LCBjbGllbnRUZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KSB7XG4gIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgdmFyIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0ID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclRleHQpO1xuXG4gIGlmIChub3JtYWxpemVkU2VydmVyVGV4dCA9PT0gbm9ybWFsaXplZENsaWVudFRleHQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2hvdWxkV2FybkRldikge1xuICAgIHtcbiAgICAgIGlmICghZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUZXh0IGNvbnRlbnQgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiBcIiVzXCIgQ2xpZW50OiBcIiVzXCInLCBub3JtYWxpemVkU2VydmVyVGV4dCwgbm9ybWFsaXplZENsaWVudFRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpc0NvbmN1cnJlbnRNb2RlICYmIGVuYWJsZUNsaWVudFJlbmRlckZhbGxiYWNrT25UZXh0TWlzbWF0Y2gpIHtcbiAgICAvLyBJbiBjb25jdXJyZW50IHJvb3RzLCB3ZSB0aHJvdyB3aGVuIHRoZXJlJ3MgYSB0ZXh0IG1pc21hdGNoIGFuZCByZXZlcnQgdG9cbiAgICAvLyBjbGllbnQgcmVuZGVyaW5nLCB1cCB0byB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RleHQgY29udGVudCBkb2VzIG5vdCBtYXRjaCBzZXJ2ZXItcmVuZGVyZWQgSFRNTC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgcmV0dXJuIHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gcm9vdENvbnRhaW5lckVsZW1lbnQgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xufVxuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQobm9kZSkge1xuICAvLyBNb2JpbGUgU2FmYXJpIGRvZXMgbm90IGZpcmUgcHJvcGVybHkgYnViYmxlIGNsaWNrIGV2ZW50cyBvblxuICAvLyBub24taW50ZXJhY3RpdmUgZWxlbWVudHMsIHdoaWNoIG1lYW5zIGRlbGVnYXRlZCBjbGljayBsaXN0ZW5lcnMgZG8gbm90XG4gIC8vIGZpcmUuIFRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGJ1ZyBpbnZvbHZlcyBhdHRhY2hpbmcgYW4gZW1wdHkgY2xpY2tcbiAgLy8gbGlzdGVuZXIgb24gdGhlIHRhcmdldCBub2RlLlxuICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWxcbiAgLy8gSnVzdCBzZXQgaXQgdXNpbmcgdGhlIG9uY2xpY2sgcHJvcGVydHkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIG1hbmFnZSBhbnlcbiAgLy8gYm9va2tlZXBpbmcgZm9yIGl0LiBOb3Qgc3VyZSBpZiB3ZSBuZWVkIHRvIGNsZWFyIGl0IHdoZW4gdGhlIGxpc3RlbmVyIGlzXG4gIC8vIHJlbW92ZWQuXG4gIC8vIFRPRE86IE9ubHkgZG8gdGhpcyBmb3IgdGhlIHJlbGV2YW50IFNhZmFyaXMgbWF5YmU/XG4gIG5vZGUub25jbGljayA9IG5vb3A7XG59XG5cbmZ1bmN0aW9uIHNldEluaXRpYWxET01Qcm9wZXJ0aWVzKHRhZywgZG9tRWxlbWVudCwgcm9vdENvbnRhaW5lckVsZW1lbnQsIG5leHRQcm9wcywgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgZm9yICh2YXIgcHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICBpZiAoIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cblxuXG4gICAgICBzZXRWYWx1ZUZvclN0eWxlcyhkb21FbGVtZW50LCBuZXh0UHJvcCk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgbmV4dEh0bWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEF2b2lkIHNldHRpbmcgaW5pdGlhbCB0ZXh0Q29udGVudCB3aGVuIHRoZSB0ZXh0IGlzIGVtcHR5LiBJbiBJRTExIHNldHRpbmdcbiAgICAgICAgLy8gdGV4dENvbnRlbnQgb24gYSA8dGV4dGFyZWE+IHdpbGwgY2F1c2UgdGhlIHBsYWNlaG9sZGVyIHRvIG5vdFxuICAgICAgICAvLyBzaG93IHdpdGhpbiB0aGUgPHRleHRhcmVhPiB1bnRpbCBpdCBoYXMgYmVlbiBmb2N1c2VkIGFuZCBibHVycmVkIGFnYWluLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzY3MzEjaXNzdWVjb21tZW50LTI1NDg3NDU1M1xuICAgICAgICB2YXIgY2FuU2V0VGV4dENvbnRlbnQgPSB0YWcgIT09ICd0ZXh0YXJlYScgfHwgbmV4dFByb3AgIT09ICcnO1xuXG4gICAgICAgIGlmIChjYW5TZXRUZXh0Q29udGVudCkge1xuICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IEFVVE9GT0NVUykgOyBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIG5leHRQcm9wLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURPTVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgd2FzQ3VzdG9tQ29tcG9uZW50VGFnLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAvLyBUT0RPOiBIYW5kbGUgd2FzQ3VzdG9tQ29tcG9uZW50VGFnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdXBkYXRlUGF5bG9hZC5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBwcm9wS2V5ID0gdXBkYXRlUGF5bG9hZFtpXTtcbiAgICB2YXIgcHJvcFZhbHVlID0gdXBkYXRlUGF5bG9hZFtpICsgMV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgc2V0SW5uZXJIVE1MKGRvbUVsZW1lbnQsIHByb3BWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBwcm9wVmFsdWUsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQsIHBhcmVudE5hbWVzcGFjZSkge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWc7IC8vIFdlIGNyZWF0ZSB0YWdzIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlaXIgcGFyZW50IGNvbnRhaW5lciwgZXhjZXB0IEhUTUxcbiAgLy8gdGFncyBnZXQgbm8gbmFtZXNwYWNlLlxuXG4gIHZhciBvd25lckRvY3VtZW50ID0gZ2V0T3duZXJEb2N1bWVudEZyb21Sb290Q29udGFpbmVyKHJvb3RDb250YWluZXJFbGVtZW50KTtcbiAgdmFyIGRvbUVsZW1lbnQ7XG4gIHZhciBuYW1lc3BhY2VVUkkgPSBwYXJlbnROYW1lc3BhY2U7XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICBuYW1lc3BhY2VVUkkgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgIHtcbiAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpOyAvLyBTaG91bGQgdGhpcyBjaGVjayBiZSBnYXRlZCBieSBwYXJlbnQgbmFtZXNwYWNlPyBOb3Qgc3VyZSB3ZSB3YW50IHRvXG4gICAgICAvLyBhbGxvdyA8U1ZHPiBvciA8bUFUSD4uXG5cbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgdHlwZSAhPT0gdHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGVycm9yKCc8JXMgLz4gaXMgdXNpbmcgaW5jb3JyZWN0IGNhc2luZy4gJyArICdVc2UgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cywgJyArICdvciBsb3dlcmNhc2UgZm9yIEhUTUwgZWxlbWVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdzY3JpcHQnKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAvLyBzZXQgdG8gdHJ1ZSBhbmQgaXQgZG9lcyBub3QgZXhlY3V0ZVxuICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHNjcmlwdD48JyArICcvc2NyaXB0Pic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCBhIHNjcmlwdCBlbGVtZW50LlxuXG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkO1xuICAgICAgZG9tRWxlbWVudCA9IGRpdi5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50c1xuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlLCB7XG4gICAgICAgIGlzOiBwcm9wcy5pc1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjYXVzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNjg5NlxuICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MFxuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsgLy8gTm9ybWFsbHkgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgaW4gYHNldEluaXRpYWxET01Qcm9wZXJ0aWVzYCwgaG93ZXZlciB0aGUgYG11bHRpcGxlYCBhbmQgYHNpemVgXG4gICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHM6XG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBkb2VzIG5vdCBzY3JvbGwgdG8gdGhlIGNvcnJlY3Qgb3B0aW9uIGJlY2F1c2Ugc2luZ3VsYXJcbiAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyXG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBzZXQgdGhlIGZpcnN0IGl0ZW0gYXMgc2VsZWN0ZWQgZGVzcGl0ZSB0aGUgYHNpemVgIGF0dHJpYnV0ZSAjMTQyMzlcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMjIyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBkb21FbGVtZW50O1xuXG4gICAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAgIG5vZGUubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnNpemUpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGEgc2l6ZSBncmVhdGVyIHRoYW4gMSBjYXVzZXMgYSBzZWxlY3QgdG8gYmVoYXZlIGxpa2UgYG11bHRpcGxlPXRydWVgLCB3aGVyZVxuICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgbm8gb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIGEgc2VsZWN0IGluIFwic2luZ2xlIHNlbGVjdGlvbiBtb2RlXCIuXG4gICAgICAgICAgbm9kZS5zaXplID0gcHJvcHMuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0eXBlKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgaWYgKCFpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9tRWxlbWVudCkgPT09ICdbb2JqZWN0IEhUTUxVbmtub3duRWxlbWVudF0nICYmICFoYXNPd25Qcm9wZXJ0eS5jYWxsKHdhcm5lZFVua25vd25UYWdzLCB0eXBlKSkge1xuICAgICAgICB3YXJuZWRVbmtub3duVGFnc1t0eXBlXSA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJ1RoZSB0YWcgPCVzPiBpcyB1bnJlY29nbml6ZWQgaW4gdGhpcyBicm93c2VyLiAnICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBSZWFjdCBjb21wb25lbnQsIHN0YXJ0IGl0cyBuYW1lIHdpdGggJyArICdhbiB1cHBlcmNhc2UgbGV0dGVyLicsIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkb21FbGVtZW50O1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG59XG5mdW5jdGlvbiBzZXRJbml0aWFsUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHJhd1Byb3BzLCByb290Q29udGFpbmVyRWxlbWVudCkge1xuICB2YXIgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTtcblxuICB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgdmFyIHByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2NhbmNlbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2xvc2UnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdlbWJlZCc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgbG9hZCBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGVycm9yIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBlcnJvciBhbmQgbG9hZCBldmVudHMuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCBwcm9wcyk7XG4gIHNldEluaXRpYWxET01Qcm9wZXJ0aWVzKHRhZywgZG9tRWxlbWVudCwgcm9vdENvbnRhaW5lckVsZW1lbnQsIHByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZyk7XG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyKGRvbUVsZW1lbnQsIHJhd1Byb3BzLCBmYWxzZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDIoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiBwcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxufSAvLyBDYWxjdWxhdGUgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvIG9iamVjdHMuXG5cbmZ1bmN0aW9uIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB1cGRhdGVQYXlsb2FkID0gbnVsbDtcbiAgdmFyIGxhc3RQcm9wcztcbiAgdmFyIG5leHRQcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBsYXN0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBsYXN0UmF3UHJvcHMpO1xuICAgICAgbmV4dFByb3BzID0gZ2V0SG9zdFByb3BzJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBsYXN0UHJvcHMgPSBsYXN0UmF3UHJvcHM7XG4gICAgICBuZXh0UHJvcHMgPSBuZXh0UmF3UHJvcHM7XG5cbiAgICAgIGlmICh0eXBlb2YgbGFzdFByb3BzLm9uQ2xpY2sgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG5leHRQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCBuZXh0UHJvcHMpO1xuICB2YXIgcHJvcEtleTtcbiAgdmFyIHN0eWxlTmFtZTtcbiAgdmFyIHN0eWxlVXBkYXRlcyA9IG51bGw7XG5cbiAgZm9yIChwcm9wS2V5IGluIGxhc3RQcm9wcykge1xuICAgIGlmIChuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgIWxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBsYXN0UHJvcHNbcHJvcEtleV0gPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB2YXIgbGFzdFN0eWxlID0gbGFzdFByb3BzW3Byb3BLZXldO1xuXG4gICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHtcbiAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MIHx8IHByb3BLZXkgPT09IENISUxEUkVOKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBBVVRPRk9DVVMpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgIC8vIHRoYXQgdGhlIFwiY3VycmVudFwiIGZpYmVyIHBvaW50ZXIgZ2V0cyB1cGRhdGVkIHNvIHdlIG5lZWQgYSBjb21taXRcbiAgICAgIC8vIHRvIHVwZGF0ZSB0aGlzIGVsZW1lbnQuXG4gICAgICBpZiAoIXVwZGF0ZVBheWxvYWQpIHtcbiAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgYWxsIG90aGVyIGRlbGV0ZWQgcHJvcGVydGllcyB3ZSBhZGQgaXQgdG8gdGhlIHF1ZXVlLiBXZSB1c2VcbiAgICAgIC8vIHRoZSBhbGxvd2VkIHByb3BlcnR5IGxpc3QgaW4gdGhlIGNvbW1pdCBwaGFzZSBpbnN0ZWFkLlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAocHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG4gICAgdmFyIGxhc3RQcm9wID0gbGFzdFByb3BzICE9IG51bGwgPyBsYXN0UHJvcHNbcHJvcEtleV0gOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBuZXh0UHJvcCA9PT0gbGFzdFByb3AgfHwgbmV4dFByb3AgPT0gbnVsbCAmJiBsYXN0UHJvcCA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0UHJvcCkge1xuICAgICAgICAvLyBVbnNldCBzdHlsZXMgb24gYGxhc3RQcm9wYCBidXQgbm90IG9uIGBuZXh0UHJvcGAuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RQcm9wKSB7XG4gICAgICAgICAgaWYgKGxhc3RQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgKCFuZXh0UHJvcCB8fCAhbmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkpIHtcbiAgICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgbGFzdFByb3BgLlxuXG5cbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAobmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiBsYXN0UHJvcFtzdHlsZU5hbWVdICE9PSBuZXh0UHJvcFtzdHlsZU5hbWVdKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSBuZXh0UHJvcFtzdHlsZU5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmVsaWVzIG9uIGB1cGRhdGVTdHlsZXNCeUlEYCBub3QgbXV0YXRpbmcgYHN0eWxlVXBkYXRlc2AuXG4gICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZC5wdXNoKHByb3BLZXksIHN0eWxlVXBkYXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZVVwZGF0ZXMgPSBuZXh0UHJvcDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgbGFzdEh0bWwgPSBsYXN0UHJvcCA/IGxhc3RQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChsYXN0SHRtbCAhPT0gbmV4dEh0bWwpIHtcbiAgICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgbmV4dEh0bWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICAodXBkYXRlUGF5bG9hZCA9IHVwZGF0ZVBheWxvYWQgfHwgW10pLnB1c2gocHJvcEtleSwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgLy8gV2UgZWFnZXJseSBsaXN0ZW4gdG8gdGhpcyBldmVuIHRob3VnaCB3ZSBoYXZlbid0IGNvbW1pdHRlZCB5ZXQuXG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkICYmIGxhc3RQcm9wICE9PSBuZXh0UHJvcCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLiBJZiBhbnkgbGlzdGVuZXIgdXBkYXRlcyB3ZSBuZWVkIHRvIGVuc3VyZVxuICAgICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBwcm9wcyBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAgIC8vIHRvIHVwZGF0ZSB0aGlzIGVsZW1lbnQuXG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFueSBvdGhlciBwcm9wZXJ0eSB3ZSBhbHdheXMgYWRkIGl0IHRvIHRoZSBxdWV1ZSBhbmQgdGhlbiB3ZVxuICAgICAgLy8gZmlsdGVyIGl0IG91dCB1c2luZyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGR1cmluZyB0aGUgY29tbWl0LlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAge1xuICAgICAgdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFByb3BzW1NUWUxFXSk7XG4gICAgfVxuXG4gICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKFNUWUxFLCBzdHlsZVVwZGF0ZXMpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMpIHtcbiAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS5cbiAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiB1cGRhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY2hlY2tlZC5cbiAgLy8gV2hlbiBhIGNoZWNrZWQgcmFkaW8gdHJpZXMgdG8gY2hhbmdlIG5hbWUsIGJyb3dzZXIgbWFrZXMgYW5vdGhlciByYWRpbydzIGNoZWNrZWQgZmFsc2UuXG4gIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZUNoZWNrZWQoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB3YXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIGxhc3RSYXdQcm9wcyk7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYuXG5cbiAgdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wc1xuICAvLyBjaGFuZ2VkLlxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVXBkYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCBpbnB1dHMgKmFmdGVyKiB1cGRhdGluZyBwcm9wcy4gVGhpcyBoYXMgdG9cbiAgICAgIC8vIGhhcHBlbiBhZnRlciBgdXBkYXRlRE9NUHJvcGVydGllc2AuIE90aGVyd2lzZSBIVE1MNSBpbnB1dCB2YWxpZGF0aW9uc1xuICAgICAgLy8gcmFpc2Ugd2FybmluZ3MgYW5kIHByZXZlbnQgdGhlIG5ldyB2YWx1ZSBmcm9tIGJlaW5nIGFzc2lnbmVkLlxuICAgICAgdXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1cGRhdGVXcmFwcGVyJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkge1xuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICghcG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV0gfHwgbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQsIGlzQ29uY3VycmVudE1vZGUsIHNob3VsZFdhcm5EZXYpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnO1xuICB2YXIgZXh0cmFBdHRyaWJ1dGVOYW1lcztcblxuICB7XG4gICAgaXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIHJhd1Byb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcmF3UHJvcHMpO1xuICB9IC8vIFRPRE86IE1ha2Ugc3VyZSB0aGF0IHdlIGNoZWNrIGlzTW91bnRlZCBiZWZvcmUgZmlyaW5nIGFueSBvZiB0aGVzZSBldmVudHMuXG5cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICBjYXNlICdlbWJlZCc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgbG9hZCBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgYWxsIHRoZSBtZWRpYSBldmVudHMuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1lZGlhRXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1tpXSwgZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBlcnJvciBhbmQgbG9hZCBldmVudHMuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnbG9hZCcsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSB0b2dnbGUgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCd0b2dnbGUnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGFzc2VydFZhbGlkUHJvcHModGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIGV4dHJhQXR0cmlidXRlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBkb21FbGVtZW50LmF0dHJpYnV0ZXM7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXR0cmlidXRlcy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBuYW1lID0gYXR0cmlidXRlc1tfaV0ubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgLy8gQ29udHJvbGxlZCBhdHRyaWJ1dGVzIGFyZSBub3QgdmFsaWRhdGVkXG4gICAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTA2NzYuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlc1tfaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuXG4gIGZvciAodmFyIHByb3BLZXkgaW4gcmF3UHJvcHMpIHtcbiAgICBpZiAoIXJhd1Byb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSByYXdQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXNcbiAgICAgIC8vIG1pZ2h0IG1hdGNoIGFkZGl0aW9uYWwgSFRNTCB0aGF0IGlzIGhpZGRlbiB3aGVuIHdlIHJlYWQgaXQgdXNpbmdcbiAgICAgIC8vIHRleHRDb250ZW50LiBFLmcuIFwiZm9vXCIgd2lsbCBtYXRjaCBcImY8c3Bhbj5vbzwvc3Bhbj5cIiBidXQgdGhhdCBzdGlsbFxuICAgICAgLy8gc2F0aXNmaWVzIG91ciByZXF1aXJlbWVudC4gT3VyIHJlcXVpcmVtZW50IGlzIG5vdCB0byBwcm9kdWNlIHBlcmZlY3RcbiAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQnc1xuICAgICAgLy8gb2sgbm90IHRvIGlmIHRoZSB2aXNpYmxlIGNvbnRlbnQgaXMgc3RpbGwgZW5vdWdoIHRvIGluZGljYXRlIHdoYXRcbiAgICAgIC8vIGV2ZW4gbGlzdGVuZXJzIHRoZXNlIG5vZGVzIG1pZ2h0IGJlIHdpcmVkIHVwIHRvLlxuICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC5cbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgZG9tRWxlbWVudC5maXJzdENoaWxkLm5vZGVWYWx1ZSB0byBjb21wYXJlP1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKHJhd1Byb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGRvbUVsZW1lbnQudGV4dENvbnRlbnQsIG5leHRQcm9wLCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVQYXlsb2FkID0gW0NISUxEUkVOLCBuZXh0UHJvcF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG5leHRQcm9wID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoZG9tRWxlbWVudC50ZXh0Q29udGVudCAhPT0gJycgKyBuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChyYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dChkb21FbGVtZW50LnRleHRDb250ZW50LCBuZXh0UHJvcCwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtDSElMRFJFTiwgJycgKyBuZXh0UHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNob3VsZFdhcm5EZXYgJiYgdHJ1ZSAmJiAvLyBDb252aW5jZSBGbG93IHdlJ3ZlIGNhbGN1bGF0ZWQgaXQgKGl0J3MgREVWLW9ubHkgaW4gdGhpcyBtZXRob2QuKVxuICAgIHR5cGVvZiBpc0N1c3RvbUNvbXBvbmVudFRhZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBwcm9wZXJ0aWVzIGNvcnJlc3BvbmQgdG8gdGhlaXIgZXhwZWN0ZWQgdmFsdWVzLlxuICAgICAgdmFyIHNlcnZlclZhbHVlID0gdm9pZCAwO1xuICAgICAgdmFyIHByb3BlcnR5SW5mbyA9IGlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIGVuYWJsZUN1c3RvbUVsZW1lbnRQcm9wZXJ0eVN1cHBvcnQgPyBudWxsIDogZ2V0UHJvcGVydHlJbmZvKHByb3BLZXkpO1xuXG4gICAgICBpZiAocmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddID09PSB0cnVlKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IFNVUFBSRVNTX0NPTlRFTlRfRURJVEFCTEVfV0FSTklORyB8fCBwcm9wS2V5ID09PSBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyB8fCAvLyBDb250cm9sbGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCB2YWxpZGF0ZWRcbiAgICAgIC8vIFRPRE86IE9ubHkgaWdub3JlIHRoZW0gb24gY29udHJvbGxlZCB0YWdzLlxuICAgICAgcHJvcEtleSA9PT0gJ3ZhbHVlJyB8fCBwcm9wS2V5ID09PSAnY2hlY2tlZCcgfHwgcHJvcEtleSA9PT0gJ3NlbGVjdGVkJykgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgICB2YXIgc2VydmVySFRNTCA9IGRvbUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRIVE1MID0gbm9ybWFsaXplSFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRIVE1MICE9PSBzZXJ2ZXJIVE1MKSB7XG4gICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVySFRNTCwgZXhwZWN0ZWRIVE1MKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShwcm9wS2V5KTtcblxuICAgICAgICBpZiAoY2FuRGlmZlN0eWxlRm9ySHlkcmF0aW9uV2FybmluZykge1xuICAgICAgICAgIHZhciBleHBlY3RlZFN0eWxlID0gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKG5leHRQcm9wKTtcbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuXG4gICAgICAgICAgaWYgKGV4cGVjdGVkU3R5bGUgIT09IHNlcnZlclZhbHVlKSB7XG4gICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIGV4cGVjdGVkU3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZyAmJiAhZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JBdHRyaWJ1dGUoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3ApO1xuXG4gICAgICAgIGlmIChuZXh0UHJvcCAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghc2hvdWxkSWdub3JlQXR0cmlidXRlKHByb3BLZXksIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpICYmICFzaG91bGRSZW1vdmVBdHRyaWJ1dGUocHJvcEtleSwgbmV4dFByb3AsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgICAgIHZhciBpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgICBzZXJ2ZXJWYWx1ZSA9IGdldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIHByb3BlcnR5SW5mbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIG93bk5hbWVzcGFjZSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICAgICAgICAgIGlmIChvd25OYW1lc3BhY2UgPT09IEhUTUxfTkFNRVNQQUNFKSB7XG4gICAgICAgICAgICBvd25OYW1lc3BhY2UgPSBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodGFnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3duTmFtZXNwYWNlID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BLZXkpO1xuXG4gICAgICAgICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBudWxsICYmIHN0YW5kYXJkTmFtZSAhPT0gcHJvcEtleSkge1xuICAgICAgICAgICAgICAvLyBJZiBhbiBTVkcgcHJvcCBpcyBzdXBwbGllZCB3aXRoIGJhZCBjYXNpbmcsIGl0IHdpbGxcbiAgICAgICAgICAgICAgLy8gYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBmcm9tIEhUTUwsIGJ1dCB3aWxsIHByb2R1Y2UgYSBtaXNtYXRjaFxuICAgICAgICAgICAgICAvLyAoYW5kIHdvdWxkIGJlIGluY29ycmVjdGx5IHJlbmRlcmVkIG9uIHRoZSBjbGllbnQpLlxuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBhbHJlYWR5IHdhcm4gYWJvdXQgYmFkIGNhc2luZyBlbHNld2hlcmUuXG4gICAgICAgICAgICAgIC8vIFNvIHdlJ2xsIHNraXAgdGhlIG1pc2xlYWRpbmcgZXh0cmEgbWlzbWF0Y2ggd2FybmluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICAgIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IHRydWU7IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShzdGFuZGFyZE5hbWUpO1xuICAgICAgICAgICAgfSAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cblxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZG9udFdhcm5DdXN0b21FbGVtZW50ID0gZW5hYmxlQ3VzdG9tRWxlbWVudFByb3BlcnR5U3VwcG9ydCAgO1xuXG4gICAgICAgIGlmICghZG9udFdhcm5DdXN0b21FbGVtZW50ICYmIG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSAmJiAhaXNNaXNtYXRjaER1ZVRvQmFkQ2FzaW5nKSB7XG4gICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIHNlcnZlclZhbHVlLCBuZXh0UHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKHNob3VsZFdhcm5EZXYpIHtcbiAgICAgIGlmICggLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5zaXplID4gMCAmJiByYXdQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklOR10gIT09IHRydWUpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzKGV4dHJhQXR0cmlidXRlTmFtZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlcihkb21FbGVtZW50LCByYXdQcm9wcywgdHJ1ZSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMyhkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgLy8gRm9yIGlucHV0IGFuZCB0ZXh0YXJlYSB3ZSBjdXJyZW50IGFsd2F5cyBzZXQgdGhlIHZhbHVlIHByb3BlcnR5IGF0XG4gICAgICAvLyBwb3N0IG1vdW50IHRvIGZvcmNlIGl0IHRvIGRpdmVyZ2UgZnJvbSBhdHRyaWJ1dGVzLiBIb3dldmVyLCBmb3JcbiAgICAgIC8vIG9wdGlvbiBhbmQgc2VsZWN0IHdlIGRvbid0IHF1aXRlIGRvIHRoZSBzYW1lIHRoaW5nIGFuZCBzZWxlY3RcbiAgICAgIC8vIGlzIG5vdCByZXNpbGllbnQgdG8gdGhlIERPTSBzdGF0ZSBjaGFuZ2luZyBzbyB3ZSBkb24ndCBkbyB0aGF0IGhlcmUuXG4gICAgICAvLyBUT0RPOiBDb25zaWRlciBub3QgZG9pbmcgdGhpcyBmb3IgaW5wdXQgYW5kIHRleHRhcmVhLlxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKHR5cGVvZiByYXdQcm9wcy5vbkNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVQYXlsb2FkO1xufVxuZnVuY3Rpb24gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgaXNEaWZmZXJlbnQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWUgIT09IHRleHQ7XG4gIHJldHVybiBpc0RpZmZlcmVudDtcbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgPCVzPiBpbiA8JXM+LicsIGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIHRoZSB0ZXh0IG5vZGUgXCIlc1wiIGluIDwlcz4uJywgY2hpbGQubm9kZVZhbHVlLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdGFnLCBwcm9wcykge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyA8JXM+IGluIDwlcz4uJywgdGFnLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgICAvLyBXZSBleHBlY3QgdG8gaW5zZXJ0IGVtcHR5IHRleHQgbm9kZXMgc2luY2UgdGhleSdyZSBub3QgcmVwcmVzZW50ZWQgaW5cbiAgICAgIC8vIHRoZSBIVE1MLlxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlIGlmIHdlIGNhbiBqdXN0IGF2b2lkIGluc2VydGluZyBlbXB0eVxuICAgICAgLy8gdGV4dCBub2Rlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIHRleHQgbm9kZSBmb3IgXCIlc1wiIGluIDwlcz4uJywgdGV4dCwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGRvbUVsZW1lbnQsIHRhZywgcHJvcHMpIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKCkge307XG5cbnZhciB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gVGhpcyB2YWxpZGF0aW9uIGNvZGUgd2FzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIEhUTUw1IHBhcnNpbmcgc3BlYzpcbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBjYXRjaCBhbGwgaW52YWxpZCBuZXN0aW5nLCBub3IgZG9lcyBpdCB0cnkgdG8gKGFzIGl0J3NcbiAgLy8gbm90IGNsZWFyIHdoYXQgcHJhY3RpY2FsIGJlbmVmaXQgZG9pbmcgc28gcHJvdmlkZXMpOyBpbnN0ZWFkLCB3ZSB3YXJuIG9ubHlcbiAgLy8gZm9yIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgd2lsbCBnaXZlIGEgcGFyc2UgdHJlZSBkaWZmZXJpbmcgZnJvbSB3aGF0IFJlYWN0XG4gIC8vIGludGVuZGVkLiBGb3IgZXhhbXBsZSwgPGI+PGRpdj48L2Rpdj48L2I+IGlzIGludmFsaWQgYnV0IHdlIGRvbid0IHdhcm5cbiAgLy8gYmVjYXVzZSBpdCBzdGlsbCBwYXJzZXMgY29ycmVjdGx5OyB3ZSBkbyB3YXJuIGZvciBvdGhlciBjYXNlcyBsaWtlIG5lc3RlZFxuICAvLyA8cD4gdGFncyB3aGVyZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBpbXBsaWNpdGx5IGNsb3NlcyB0aGVcbiAgLy8gZmlyc3QsIGNhdXNpbmcgYSBjb25mdXNpbmcgbWVzcy5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG5cbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJywgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludFxuICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmVcbiAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdlciB3YXJuaW5nc1xuICAnZm9yZWlnbk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLWJ1dHRvbi1zY29wZVxuXG4gIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3BlVGFncy5jb25jYXQoWydidXR0b24nXSk7IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2dlbmVyYXRlLWltcGxpZWQtZW5kLXRhZ3NcblxuICB2YXIgaW1wbGllZEVuZFRhZ3MgPSBbJ2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91cCcsICdwJywgJ3JwJywgJ3J0J107XG4gIHZhciBlbXB0eUFuY2VzdG9ySW5mbyA9IHtcbiAgICBjdXJyZW50OiBudWxsLFxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcbiAgICBsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsXG4gIH07XG5cbiAgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcpIHtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gYXNzaWduKHt9LCBvbGRJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvKTtcblxuICAgIHZhciBpbmZvID0ge1xuICAgICAgdGFnOiB0YWdcbiAgICB9O1xuXG4gICAgaWYgKGluU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChidXR0b25TY29wZVRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gbnVsbDtcbiAgICB9IC8vIFNlZSBydWxlcyBmb3IgJ2xpJywgJ2RkJywgJ2R0JyBzdGFydCB0YWdzIGluXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuXG5cbiAgICBpZiAoc3BlY2lhbFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSAmJiB0YWcgIT09ICdhZGRyZXNzJyAmJiB0YWcgIT09ICdkaXYnICYmIHRhZyAhPT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgIH1cblxuICAgIGFuY2VzdG9ySW5mby5jdXJyZW50ID0gaW5mbztcblxuICAgIGlmICh0YWcgPT09ICdmb3JtJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmZvcm1UYWcgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdhJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYnV0dG9uJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdub2JyJykge1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2xpJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdkZCcgfHwgdGFnID09PSAnZHQnKSB7XG4gICAgICBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNlc3RvckluZm87XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgaXNUYWdWYWxpZFdpdGhQYXJlbnQgPSBmdW5jdGlvbiAodGFnLCBwYXJlbnRUYWcpIHtcbiAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgd2UncmUgaW4gYW4gdW51c3VhbCBwYXJzaW5nIG1vZGUuLi5cbiAgICBzd2l0Y2ggKHBhcmVudFRhZykge1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluc2VsZWN0XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICdvcHRncm91cCcgfHwgdGFnID09PSAnI3RleHQnO1xuXG4gICAgICBjYXNlICdvcHRncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nLCBzZWVpbmcgYW4gPG9wdGlvbj4gZG9lc24ndCBtZWFuIHdlJ3JlIGluIGEgPHNlbGVjdD5cbiAgICAgIC8vIGJ1dFxuXG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnI3RleHQnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGRcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNhcHRpb25cbiAgICAgIC8vIE5vIHNwZWNpYWwgYmVoYXZpb3Igc2luY2UgdGhlc2UgcnVsZXMgZmFsbCBiYWNrIHRvIFwiaW4gYm9keVwiIG1vZGUgZm9yXG4gICAgICAvLyBhbGwgZXhjZXB0IHNwZWNpYWwgdGFibGUgbm9kZXMgd2hpY2ggY2F1c2UgYmFkIHBhcnNpbmcgYmVoYXZpb3IgYW55d2F5LlxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludHJcblxuICAgICAgY2FzZSAndHInOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndGgnIHx8IHRhZyA9PT0gJ3RkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50Ym9keVxuXG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0cicgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY29sZ3JvdXBcblxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY29sJyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50YWJsZVxuXG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjYXB0aW9uJyB8fCB0YWcgPT09ICdjb2xncm91cCcgfHwgdGFnID09PSAndGJvZHknIHx8IHRhZyA9PT0gJ3Rmb290JyB8fCB0YWcgPT09ICd0aGVhZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluaGVhZFxuXG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2Jhc2UnIHx8IHRhZyA9PT0gJ2Jhc2Vmb250JyB8fCB0YWcgPT09ICdiZ3NvdW5kJyB8fCB0YWcgPT09ICdsaW5rJyB8fCB0YWcgPT09ICdtZXRhJyB8fCB0YWcgPT09ICd0aXRsZScgfHwgdGFnID09PSAnbm9zY3JpcHQnIHx8IHRhZyA9PT0gJ25vZnJhbWVzJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3MuaHRtbCN0aGUtaHRtbC1lbGVtZW50XG5cbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaGVhZCcgfHwgdGFnID09PSAnYm9keScgfHwgdGFnID09PSAnZnJhbWVzZXQnO1xuXG4gICAgICBjYXNlICdmcmFtZXNldCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdmcmFtZSc7XG5cbiAgICAgIGNhc2UgJyNkb2N1bWVudCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdodG1sJztcbiAgICB9IC8vIFByb2JhYmx5IGluIHRoZSBcImluIGJvZHlcIiBwYXJzaW5nIG1vZGUsIHNvIHdlIG91dGxhdyBvbmx5IHRhZyBjb21ib3NcbiAgICAvLyB3aGVyZSB0aGUgcGFyc2luZyBydWxlcyBjYXVzZSBpbXBsaWNpdCBvcGVucyBvciBjbG9zZXMgdG8gYmUgYWRkZWQuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuXG5cbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnICE9PSAnaDEnICYmIHBhcmVudFRhZyAhPT0gJ2gyJyAmJiBwYXJlbnRUYWcgIT09ICdoMycgJiYgcGFyZW50VGFnICE9PSAnaDQnICYmIHBhcmVudFRhZyAhPT0gJ2g1JyAmJiBwYXJlbnRUYWcgIT09ICdoNic7XG5cbiAgICAgIGNhc2UgJ3JwJzpcbiAgICAgIGNhc2UgJ3J0JzpcbiAgICAgICAgcmV0dXJuIGltcGxpZWRFbmRUYWdzLmluZGV4T2YocGFyZW50VGFnKSA9PT0gLTE7XG5cbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgY2FzZSAnY2FwdGlvbic6XG4gICAgICBjYXNlICdjb2wnOlxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgY2FzZSAnZnJhbWUnOlxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgIGNhc2UgJ3Rib2R5JzpcbiAgICAgIGNhc2UgJ3RkJzpcbiAgICAgIGNhc2UgJ3Rmb290JzpcbiAgICAgIGNhc2UgJ3RoJzpcbiAgICAgIGNhc2UgJ3RoZWFkJzpcbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgLy8gVGhlc2UgdGFncyBhcmUgb25seSB2YWxpZCB3aXRoIGEgZmV3IHBhcmVudHMgdGhhdCBoYXZlIHNwZWNpYWwgY2hpbGRcbiAgICAgICAgLy8gcGFyc2luZyBydWxlcyAtLSBpZiB3ZSdyZSBkb3duIGhlcmUsIHRoZW4gbm9uZSBvZiB0aG9zZSBtYXRjaGVkIGFuZFxuICAgICAgICAvLyBzbyB3ZSBhbGxvdyBpdCBvbmx5IGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgcGFyZW50IGlzLCBhcyBhbGwgb3RoZXJcbiAgICAgICAgLy8gY2FzZXMgYXJlIGludmFsaWQuXG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgPT0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cblxuXG4gIHZhciBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnID0gZnVuY3Rpb24gKHRhZywgYW5jZXN0b3JJbmZvKSB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2FkZHJlc3MnOlxuICAgICAgY2FzZSAnYXJ0aWNsZSc6XG4gICAgICBjYXNlICdhc2lkZSc6XG4gICAgICBjYXNlICdibG9ja3F1b3RlJzpcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBjYXNlICdkaXInOlxuICAgICAgY2FzZSAnZGl2JzpcbiAgICAgIGNhc2UgJ2RsJzpcbiAgICAgIGNhc2UgJ2ZpZWxkc2V0JzpcbiAgICAgIGNhc2UgJ2ZpZ2NhcHRpb24nOlxuICAgICAgY2FzZSAnZmlndXJlJzpcbiAgICAgIGNhc2UgJ2Zvb3Rlcic6XG4gICAgICBjYXNlICdoZWFkZXInOlxuICAgICAgY2FzZSAnaGdyb3VwJzpcbiAgICAgIGNhc2UgJ21haW4nOlxuICAgICAgY2FzZSAnbWVudSc6XG4gICAgICBjYXNlICduYXYnOlxuICAgICAgY2FzZSAnb2wnOlxuICAgICAgY2FzZSAncCc6XG4gICAgICBjYXNlICdzZWN0aW9uJzpcbiAgICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgY2FzZSAndWwnOlxuICAgICAgY2FzZSAncHJlJzpcbiAgICAgIGNhc2UgJ2xpc3RpbmcnOlxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgY2FzZSAnaHInOlxuICAgICAgY2FzZSAneG1wJzpcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZm9ybVRhZyB8fCBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2xpJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdkZCc6XG4gICAgICBjYXNlICdkdCc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIC8vIFNwZWMgc2F5cyBzb21ldGhpbmcgYWJvdXQgc3RvcmluZyBhIGxpc3Qgb2YgbWFya2VycywgYnV0IGl0IHNvdW5kc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoaXMgY2hlY2suXG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ25vYnInOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHZhciBkaWRXYXJuJDEgPSB7fTtcblxuICB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoY2hpbGRUYWcsIGNoaWxkVGV4dCwgYW5jZXN0b3JJbmZvKSB7XG4gICAgYW5jZXN0b3JJbmZvID0gYW5jZXN0b3JJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvO1xuICAgIHZhciBwYXJlbnRJbmZvID0gYW5jZXN0b3JJbmZvLmN1cnJlbnQ7XG4gICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudEluZm8gJiYgcGFyZW50SW5mby50YWc7XG5cbiAgICBpZiAoY2hpbGRUZXh0ICE9IG51bGwpIHtcbiAgICAgIGlmIChjaGlsZFRhZyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3Rpbmc6IHdoZW4gY2hpbGRUZXh0IGlzIHBhc3NlZCwgY2hpbGRUYWcgc2hvdWxkIGJlIG51bGwnKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGRUYWcgPSAnI3RleHQnO1xuICAgIH1cblxuICAgIHZhciBpbnZhbGlkUGFyZW50ID0gaXNUYWdWYWxpZFdpdGhQYXJlbnQoY2hpbGRUYWcsIHBhcmVudFRhZykgPyBudWxsIDogcGFyZW50SW5mbztcbiAgICB2YXIgaW52YWxpZEFuY2VzdG9yID0gaW52YWxpZFBhcmVudCA/IG51bGwgOiBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnKGNoaWxkVGFnLCBhbmNlc3RvckluZm8pO1xuICAgIHZhciBpbnZhbGlkUGFyZW50T3JBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgfHwgaW52YWxpZEFuY2VzdG9yO1xuXG4gICAgaWYgKCFpbnZhbGlkUGFyZW50T3JBbmNlc3Rvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBhbmNlc3RvclRhZyA9IGludmFsaWRQYXJlbnRPckFuY2VzdG9yLnRhZztcbiAgICB2YXIgd2FybktleSA9ICEhaW52YWxpZFBhcmVudCArICd8JyArIGNoaWxkVGFnICsgJ3wnICsgYW5jZXN0b3JUYWc7XG5cbiAgICBpZiAoZGlkV2FybiQxW3dhcm5LZXldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybiQxW3dhcm5LZXldID0gdHJ1ZTtcbiAgICB2YXIgdGFnRGlzcGxheU5hbWUgPSBjaGlsZFRhZztcbiAgICB2YXIgd2hpdGVzcGFjZUluZm8gPSAnJztcblxuICAgIGlmIChjaGlsZFRhZyA9PT0gJyN0ZXh0Jykge1xuICAgICAgaWYgKC9cXFMvLnRlc3QoY2hpbGRUZXh0KSkge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdUZXh0IG5vZGVzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhZ0Rpc3BsYXlOYW1lID0gJ1doaXRlc3BhY2UgdGV4dCBub2Rlcyc7XG4gICAgICAgIHdoaXRlc3BhY2VJbmZvID0gXCIgTWFrZSBzdXJlIHlvdSBkb24ndCBoYXZlIGFueSBleHRyYSB3aGl0ZXNwYWNlIGJldHdlZW4gdGFncyBvbiBcIiArICdlYWNoIGxpbmUgb2YgeW91ciBzb3VyY2UgY29kZS4nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0YWdEaXNwbGF5TmFtZSA9ICc8JyArIGNoaWxkVGFnICsgJz4nO1xuICAgIH1cblxuICAgIGlmIChpbnZhbGlkUGFyZW50KSB7XG4gICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICBpZiAoYW5jZXN0b3JUYWcgPT09ICd0YWJsZScgJiYgY2hpbGRUYWcgPT09ICd0cicpIHtcbiAgICAgICAgaW5mbyArPSAnIEFkZCBhIDx0Ym9keT4sIDx0aGVhZD4gb3IgPHRmb290PiB0byB5b3VyIGNvZGUgdG8gbWF0Y2ggdGhlIERPTSB0cmVlIGdlbmVyYXRlZCBieSAnICsgJ3RoZSBicm93c2VyLic7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKCd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGNoaWxkIG9mIDwlcz4uJXMlcycsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZywgd2hpdGVzcGFjZUluZm8sIGluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBkZXNjZW5kYW50IG9mICcgKyAnPCVzPi4nLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcpO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDEgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBTVVNQRU5TRV9TVEFSVF9EQVRBID0gJyQnO1xudmFyIFNVU1BFTlNFX0VORF9EQVRBID0gJy8kJztcbnZhciBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgPSAnJD8nO1xudmFyIFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgPSAnJCEnO1xudmFyIFNUWUxFJDEgPSAnc3R5bGUnO1xudmFyIGV2ZW50c0VuYWJsZWQgPSBudWxsO1xudmFyIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gbnVsbDtcbmZ1bmN0aW9uIGdldFJvb3RIb3N0Q29udGV4dChyb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgdmFyIHR5cGU7XG4gIHZhciBuYW1lc3BhY2U7XG4gIHZhciBub2RlVHlwZSA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5ub2RlVHlwZTtcblxuICBzd2l0Y2ggKG5vZGVUeXBlKSB7XG4gICAgY2FzZSBET0NVTUVOVF9OT0RFOlxuICAgIGNhc2UgRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpcbiAgICAgIHtcbiAgICAgICAgdHlwZSA9IG5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFID8gJyNkb2N1bWVudCcgOiAnI2ZyYWdtZW50JztcbiAgICAgICAgdmFyIHJvb3QgPSByb290Q29udGFpbmVySW5zdGFuY2UuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBuYW1lc3BhY2UgPSByb290ID8gcm9vdC5uYW1lc3BhY2VVUkkgOiBnZXRDaGlsZE5hbWVzcGFjZShudWxsLCAnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IG5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyByb290Q29udGFpbmVySW5zdGFuY2UucGFyZW50Tm9kZSA6IHJvb3RDb250YWluZXJJbnN0YW5jZTtcbiAgICAgICAgdmFyIG93bk5hbWVzcGFjZSA9IGNvbnRhaW5lci5uYW1lc3BhY2VVUkkgfHwgbnVsbDtcbiAgICAgICAgdHlwZSA9IGNvbnRhaW5lci50YWdOYW1lO1xuICAgICAgICBuYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShvd25OYW1lc3BhY2UsIHR5cGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxuXG4gIHtcbiAgICB2YXIgdmFsaWRhdGVkVGFnID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBhbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKG51bGwsIHZhbGlkYXRlZFRhZyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgYW5jZXN0b3JJbmZvOiBhbmNlc3RvckluZm9cbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZEhvc3RDb250ZXh0KHBhcmVudEhvc3RDb250ZXh0LCB0eXBlLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAge1xuICAgIHZhciBwYXJlbnRIb3N0Q29udGV4dERldiA9IHBhcmVudEhvc3RDb250ZXh0O1xuICAgIHZhciBuYW1lc3BhY2UgPSBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnRIb3N0Q29udGV4dERldi5uYW1lc3BhY2UsIHR5cGUpO1xuICAgIHZhciBhbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKHBhcmVudEhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgYW5jZXN0b3JJbmZvOiBhbmNlc3RvckluZm9cbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBwcmVwYXJlRm9yQ29tbWl0KGNvbnRhaW5lckluZm8pIHtcbiAgZXZlbnRzRW5hYmxlZCA9IGlzRW5hYmxlZCgpO1xuICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCk7XG4gIHZhciBhY3RpdmVJbnN0YW5jZSA9IG51bGw7XG5cbiAgc2V0RW5hYmxlZChmYWxzZSk7XG4gIHJldHVybiBhY3RpdmVJbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHJlc2V0QWZ0ZXJDb21taXQoY29udGFpbmVySW5mbykge1xuICByZXN0b3JlU2VsZWN0aW9uKHNlbGVjdGlvbkluZm9ybWF0aW9uKTtcbiAgc2V0RW5hYmxlZChldmVudHNFbmFibGVkKTtcbiAgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gbnVsbDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIHZhciBwYXJlbnROYW1lc3BhY2U7XG5cbiAge1xuICAgIC8vIFRPRE86IHRha2UgbmFtZXNwYWNlIGludG8gYWNjb3VudCB3aGVuIHZhbGlkYXRpbmcuXG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgdmFsaWRhdGVET01OZXN0aW5nKHR5cGUsIG51bGwsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSB7XG4gICAgICB2YXIgc3RyaW5nID0gJycgKyBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBvd25BbmNlc3RvckluZm8gPSB1cGRhdGVkQW5jZXN0b3JJbmZvKGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbywgdHlwZSk7XG4gICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgc3RyaW5nLCBvd25BbmNlc3RvckluZm8pO1xuICAgIH1cblxuICAgIHBhcmVudE5hbWVzcGFjZSA9IGhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZTtcbiAgfVxuXG4gIHZhciBkb21FbGVtZW50ID0gY3JlYXRlRWxlbWVudCh0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBwYXJlbnROYW1lc3BhY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBkb21FbGVtZW50KTtcbiAgdXBkYXRlRmliZXJQcm9wcyhkb21FbGVtZW50LCBwcm9wcyk7XG4gIHJldHVybiBkb21FbGVtZW50O1xufVxuZnVuY3Rpb24gYXBwZW5kSW5pdGlhbENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbihkb21FbGVtZW50LCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICBzZXRJbml0aWFsUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdidXR0b24nOlxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJldHVybiAhIXByb3BzLmF1dG9Gb2N1cztcblxuICAgIGNhc2UgJ2ltZyc6XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHByZXBhcmVVcGRhdGUoZG9tRWxlbWVudCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcblxuICAgIGlmICh0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gIT09IHR5cGVvZiBvbGRQcm9wcy5jaGlsZHJlbiAmJiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3UHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHN0cmluZyA9ICcnICsgbmV3UHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgb3duQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbyhob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHN0cmluZywgb3duQW5jZXN0b3JJbmZvKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIHByb3BzKSB7XG4gIHJldHVybiB0eXBlID09PSAndGV4dGFyZWEnIHx8IHR5cGUgPT09ICdub3NjcmlwdCcgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdudW1iZXInIHx8IHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgIT09IG51bGwgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sICE9IG51bGw7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0SW5zdGFuY2UodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG4gICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIHRleHQsIGhvc3RDb250ZXh0RGV2LmFuY2VzdG9ySW5mbyk7XG4gIH1cblxuICB2YXIgdGV4dE5vZGUgPSBjcmVhdGVUZXh0Tm9kZSh0ZXh0LCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0Tm9kZSk7XG4gIHJldHVybiB0ZXh0Tm9kZTtcbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCkge1xuICB2YXIgY3VycmVudEV2ZW50ID0gd2luZG93LmV2ZW50O1xuXG4gIGlmIChjdXJyZW50RXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBEZWZhdWx0RXZlbnRQcmlvcml0eTtcbiAgfVxuXG4gIHJldHVybiBnZXRFdmVudFByaW9yaXR5KGN1cnJlbnRFdmVudC50eXBlKTtcbn1cbi8vIGlmIGEgY29tcG9uZW50IGp1c3QgaW1wb3J0cyBSZWFjdERPTSAoZS5nLiBmb3IgZmluZERPTU5vZGUpLlxuLy8gU29tZSBlbnZpcm9ubWVudHMgbWlnaHQgbm90IGhhdmUgc2V0VGltZW91dCBvciBjbGVhclRpbWVvdXQuXG5cbnZhciBzY2hlZHVsZVRpbWVvdXQgPSB0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgY2FuY2VsVGltZW91dCA9IHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBjbGVhclRpbWVvdXQgOiB1bmRlZmluZWQ7XG52YXIgbm9UaW1lb3V0ID0gLTE7XG52YXIgbG9jYWxQcm9taXNlID0gdHlwZW9mIFByb21pc2UgPT09ICdmdW5jdGlvbicgPyBQcm9taXNlIDogdW5kZWZpbmVkOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgc2NoZWR1bGVNaWNyb3Rhc2sgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IHR5cGVvZiBsb2NhbFByb21pc2UgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHJldHVybiBsb2NhbFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKGNhbGxiYWNrKS5jYXRjaChoYW5kbGVFcnJvckluTmV4dFRpY2spO1xufSA6IHNjaGVkdWxlVGltZW91dDsgLy8gVE9ETzogRGV0ZXJtaW5lIHRoZSBiZXN0IGZhbGxiYWNrIGhlcmUuXG5cbmZ1bmN0aW9uIGhhbmRsZUVycm9ySW5OZXh0VGljayhlcnJvcikge1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG59IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNvbW1pdE1vdW50KGRvbUVsZW1lbnQsIHR5cGUsIG5ld1Byb3BzLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIC8vIERlc3BpdGUgdGhlIG5hbWluZyB0aGF0IG1pZ2h0IGltcGx5IG90aGVyd2lzZSwgdGhpcyBtZXRob2Qgb25seVxuICAvLyBmaXJlcyBpZiB0aGVyZSBpcyBhbiBgVXBkYXRlYCBlZmZlY3Qgc2NoZWR1bGVkIGR1cmluZyBtb3VudGluZy5cbiAgLy8gVGhpcyBoYXBwZW5zIGlmIGBmaW5hbGl6ZUluaXRpYWxDaGlsZHJlbmAgcmV0dXJucyBgdHJ1ZWAgKHdoaWNoIGl0XG4gIC8vIGRvZXMgdG8gaW1wbGVtZW50IHRoZSBgYXV0b0ZvY3VzYCBhdHRyaWJ1dGUgb24gdGhlIGNsaWVudCkuIEJ1dFxuICAvLyB0aGVyZSBhcmUgYWxzbyBvdGhlciBjYXNlcyB3aGVuIHRoaXMgbWlnaHQgaGFwcGVuIChzdWNoIGFzIHBhdGNoaW5nXG4gIC8vIHVwIHRleHQgY29udGVudCBkdXJpbmcgaHlkcmF0aW9uIG1pc21hdGNoKS4gU28gd2UnbGwgY2hlY2sgdGhpcyBhZ2Fpbi5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnYnV0dG9uJzpcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICBpZiAobmV3UHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgIGRvbUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuXG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIHtcbiAgICAgICAgaWYgKG5ld1Byb3BzLnNyYykge1xuICAgICAgICAgIGRvbUVsZW1lbnQuc3JjID0gbmV3UHJvcHMuc3JjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGUoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBpbnRlcm5hbEluc3RhbmNlSGFuZGxlKSB7XG4gIC8vIEFwcGx5IHRoZSBkaWZmIHRvIHRoZSBET00gbm9kZS5cbiAgdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpOyAvLyBVcGRhdGUgdGhlIHByb3BzIGhhbmRsZSBzbyB0aGF0IHdlIGtub3cgd2hpY2ggcHJvcHMgYXJlIHRoZSBvbmVzIHdpdGhcbiAgLy8gd2l0aCBjdXJyZW50IGV2ZW50IGhhbmRsZXJzLlxuXG4gIHVwZGF0ZUZpYmVyUHJvcHMoZG9tRWxlbWVudCwgbmV3UHJvcHMpO1xufVxuZnVuY3Rpb24gcmVzZXRUZXh0Q29udGVudChkb21FbGVtZW50KSB7XG4gIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsICcnKTtcbn1cbmZ1bmN0aW9uIGNvbW1pdFRleHRVcGRhdGUodGV4dEluc3RhbmNlLCBvbGRUZXh0LCBuZXdUZXh0KSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSBuZXdUZXh0O1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkVG9Db250YWluZXIoY29udGFpbmVyLCBjaGlsZCkge1xuICB2YXIgcGFyZW50Tm9kZTtcblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBwYXJlbnROb2RlID0gY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGNvbnRhaW5lcik7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lcjtcbiAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgfSAvLyBUaGlzIGNvbnRhaW5lciBtaWdodCBiZSB1c2VkIGZvciBhIHBvcnRhbC5cbiAgLy8gSWYgc29tZXRoaW5nIGluc2lkZSBhIHBvcnRhbCBpcyBjbGlja2VkLCB0aGF0IGNsaWNrIHNob3VsZCBidWJibGVcbiAgLy8gdGhyb3VnaCB0aGUgUmVhY3QgdHJlZS4gSG93ZXZlciwgb24gTW9iaWxlIFNhZmFyaSB0aGUgY2xpY2sgd291bGRcbiAgLy8gbmV2ZXIgYnViYmxlIHRocm91Z2ggdGhlICpET00qIHRyZWUgdW5sZXNzIGFuIGFuY2VzdG9yIHdpdGggb25jbGlja1xuICAvLyBldmVudCBleGlzdHMuIFNvIHdlIHdvdWxkbid0IHNlZSBpdCBhbmQgZGlzcGF0Y2ggaXQuXG4gIC8vIFRoaXMgaXMgd2h5IHdlIGVuc3VyZSB0aGF0IG5vbiBSZWFjdCByb290IGNvbnRhaW5lcnMgaGF2ZSBpbmxpbmUgb25jbGlja1xuICAvLyBkZWZpbmVkLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExOTE4XG5cblxuICB2YXIgcmVhY3RSb290Q29udGFpbmVyID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgaWYgKChyZWFjdFJvb3RDb250YWluZXIgPT09IG51bGwgfHwgcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQpICYmIHBhcmVudE5vZGUub25jbGljayA9PT0gbnVsbCkge1xuICAgIC8vIFRPRE86IFRoaXMgY2FzdCBtYXkgbm90IGJlIHNvdW5kIGZvciBTVkcsIE1hdGhNTCBvciBjdXN0b20gZWxlbWVudHMuXG4gICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQocGFyZW50Tm9kZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnRJbnN0YW5jZSwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xufVxuZnVuY3Rpb24gaW5zZXJ0SW5Db250YWluZXJCZWZvcmUoY29udGFpbmVyLCBjaGlsZCwgYmVmb3JlQ2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBiZWZvcmVDaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiByZW1vdmVDaGlsZEZyb21Db250YWluZXIoY29udGFpbmVyLCBjaGlsZCkge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICBjb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgfVxufVxuZnVuY3Rpb24gY2xlYXJTdXNwZW5zZUJvdW5kYXJ5KHBhcmVudEluc3RhbmNlLCBzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZTsgLy8gRGVsZXRlIGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICBkbyB7XG4gICAgdmFyIG5leHROb2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChub2RlKTtcblxuICAgIGlmIChuZXh0Tm9kZSAmJiBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5leHROb2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChuZXh0Tm9kZSk7IC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cblxuICAgICAgICAgIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBuZXh0Tm9kZTtcbiAgfSB3aGlsZSAobm9kZSk7IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuXG5cbiAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIGNsZWFyU3VzcGVuc2VCb3VuZGFyeUZyb21Db250YWluZXIoY29udGFpbmVyLCBzdXNwZW5zZUluc3RhbmNlKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShjb250YWluZXIucGFyZW50Tm9kZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG4gIH0gZWxzZSBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjbGVhclN1c3BlbnNlQm91bmRhcnkoY29udGFpbmVyLCBzdXNwZW5zZUluc3RhbmNlKTtcbiAgfSAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG5cblxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBoaWRlSW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgLy8gVE9ETzogRG9lcyB0aGlzIHdvcmsgZm9yIGFsbCBlbGVtZW50IHR5cGVzPyBXaGF0IGFib3V0IE1hdGhNTD8gU2hvdWxkIHdlXG4gIC8vIHBhc3MgaG9zdCBjb250ZXh0IHRvIHRoaXMgbWV0aG9kP1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGUgPSBpbnN0YW5jZS5zdHlsZTtcblxuICBpZiAodHlwZW9mIHN0eWxlLnNldFByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnbm9uZScsICdpbXBvcnRhbnQnKTtcbiAgfSBlbHNlIHtcbiAgICBzdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG59XG5mdW5jdGlvbiBoaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gJyc7XG59XG5mdW5jdGlvbiB1bmhpZGVJbnN0YW5jZShpbnN0YW5jZSwgcHJvcHMpIHtcbiAgaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgdmFyIHN0eWxlUHJvcCA9IHByb3BzW1NUWUxFJDFdO1xuICB2YXIgZGlzcGxheSA9IHN0eWxlUHJvcCAhPT0gdW5kZWZpbmVkICYmIHN0eWxlUHJvcCAhPT0gbnVsbCAmJiBzdHlsZVByb3AuaGFzT3duUHJvcGVydHkoJ2Rpc3BsYXknKSA/IHN0eWxlUHJvcC5kaXNwbGF5IDogbnVsbDtcbiAgaW5zdGFuY2Uuc3R5bGUuZGlzcGxheSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoJ2Rpc3BsYXknLCBkaXNwbGF5KTtcbn1cbmZ1bmN0aW9uIHVuaGlkZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHQpIHtcbiAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IHRleHQ7XG59XG5mdW5jdGlvbiBjbGVhckNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnRleHRDb250ZW50ID0gJyc7XG4gIH0gZWxzZSBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgdmFyIGJvZHkgPSBjb250YWluZXIuYm9keTtcblxuICAgIGlmIChib2R5ICE9IG51bGwpIHtcbiAgICAgIGJvZHkudGV4dENvbnRlbnQgPSAnJztcbiAgICB9XG4gIH1cbn0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY2FuSHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcykge1xuICBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgIT09IEVMRU1FTlRfTk9ERSB8fCB0eXBlLnRvTG93ZXJDYXNlKCkgIT09IGluc3RhbmNlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGFuIGVsZW1lbnQgbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UoaW5zdGFuY2UsIHRleHQpIHtcbiAgaWYgKHRleHQgPT09ICcnIHx8IGluc3RhbmNlLm5vZGVUeXBlICE9PSBURVhUX05PREUpIHtcbiAgICAvLyBFbXB0eSBzdHJpbmdzIGFyZSBub3QgcGFyc2VkIGJ5IEhUTUwgc28gdGhlcmUgd29uJ3QgYmUgYSBjb3JyZWN0IG1hdGNoIGhlcmUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhpcyBoYXMgbm93IGJlZW4gcmVmaW5lZCB0byBhIHRleHQgbm9kZS5cblxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKGluc3RhbmNlKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgLy8gRW1wdHkgc3RyaW5ncyBhcmUgbm90IHBhcnNlZCBieSBIVE1MIHNvIHRoZXJlIHdvbid0IGJlIGEgY29ycmVjdCBtYXRjaCBoZXJlLlxuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYSBzdXNwZW5zZSBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEE7XG59XG5mdW5jdGlvbiByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShpbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgaW5zdGFuY2UuX3JlYWN0UmV0cnkgPSBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGUobm9kZSkge1xuICAvLyBTa2lwIG5vbi1oeWRyYXRhYmxlIG5vZGVzLlxuICBmb3IgKDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5uZXh0U2libGluZykge1xuICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSB8fCBub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAobm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIG5vZGVEYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAobm9kZURhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHwgbm9kZURhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGVEYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGluc3RhbmNlKSB7XG4gIHJldHVybiBnZXROZXh0SHlkcmF0YWJsZShpbnN0YW5jZS5uZXh0U2libGluZyk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZChwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UuZmlyc3RDaGlsZCk7XG59XG5mdW5jdGlvbiBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudENvbnRhaW5lci5maXJzdENoaWxkKTtcbn1cbmZ1bmN0aW9uIGdldEZpcnN0SHlkcmF0YWJsZUNoaWxkV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUocGFyZW50SW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH0gLy8gVE9ETzogVGVtcG9yYXJ5IGhhY2sgdG8gY2hlY2sgaWYgd2UncmUgaW4gYSBjb25jdXJyZW50IHJvb3QuIFdlIGNhbiBkZWxldGVcbiAgLy8gd2hlbiB0aGUgbGVnYWN5IHJvb3QgQVBJIGlzIHJlbW92ZWQuXG5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFByb3BlcnRpZXMoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBwYXJlbnROYW1lc3BhY2UsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaXNDb25jdXJyZW50TW9kZSwgc2hvdWxkV2FybkRldik7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc2hvdWxkV2FybkRldikge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpOyAvLyBUT0RPOiBUZW1wb3JhcnkgaGFjayB0byBjaGVjayBpZiB3ZSdyZSBpbiBhIGNvbmN1cnJlbnQgcm9vdC4gV2UgY2FuIGRlbGV0ZVxuICAvLyB3aGVuIHRoZSBsZWdhY3kgcm9vdCBBUEkgaXMgcmVtb3ZlZC5cblxuICB2YXIgaXNDb25jdXJyZW50TW9kZSA9IChpbnRlcm5hbEluc3RhbmNlSGFuZGxlLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZTtcbiAgcmV0dXJuIGRpZmZIeWRyYXRlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nOyAvLyBTa2lwIHBhc3QgYWxsIG5vZGVzIHdpdGhpbiB0aGlzIHN1c3BlbnNlIGJvdW5kYXJ5LlxuICAvLyBUaGVyZSBtaWdodCBiZSBuZXN0ZWQgbm9kZXMgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGhvd1xuICAvLyBkZWVwIHdlIGFyZSBhbmQgb25seSBicmVhayBvdXQgd2hlbiB3ZSdyZSBiYWNrIG9uIHRvcC5cblxuICB2YXIgZGVwdGggPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGRhdGEgPSBub2RlLmRhdGE7XG5cbiAgICAgIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICB9IC8vIFRPRE86IFdhcm4sIHdlIGRpZG4ndCBmaW5kIHRoZSBlbmQgY29tbWVudCBib3VuZGFyeS5cblxuXG4gIHJldHVybiBudWxsO1xufSAvLyBSZXR1cm5zIHRoZSBTdXNwZW5zZUluc3RhbmNlIGlmIHRoaXMgbm9kZSBpcyBhIGRpcmVjdCBjaGlsZCBvZiBhXG4vLyBTdXNwZW5zZUluc3RhbmNlLiBJLmUuIGlmIGl0cyBwcmV2aW91cyBzaWJsaW5nIGlzIGEgQ29tbWVudCB3aXRoXG4vLyBTVVNQRU5TRV94X1NUQVJUX0RBVEEuIE90aGVyd2lzZSwgbnVsbC5cblxuZnVuY3Rpb24gZ2V0UGFyZW50U3VzcGVuc2VJbnN0YW5jZSh0YXJnZXRJbnN0YW5jZSkge1xuICB2YXIgbm9kZSA9IHRhcmdldEluc3RhbmNlLnByZXZpb3VzU2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8IGRhdGEgPT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSkge1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX0VORF9EQVRBKSB7XG4gICAgICAgIGRlcHRoKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucHJldmlvdXNTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZENvbnRhaW5lcihjb250YWluZXIpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG59XG5mdW5jdGlvbiBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICAvLyBSZXRyeSBpZiBhbnkgZXZlbnQgcmVwbGF5aW5nIHdhcyBibG9ja2VkIG9uIHRoaXMuXG4gIHJldHJ5SWZCbG9ja2VkT24oc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5mdW5jdGlvbiBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhwYXJlbnRUeXBlKSB7XG4gIHJldHVybiBwYXJlbnRUeXBlICE9PSAnaGVhZCcgJiYgcGFyZW50VHlwZSAhPT0gJ2JvZHknO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCwgaXNDb25jdXJyZW50TW9kZSkge1xuICB2YXIgc2hvdWxkV2FybkRldiA9IHRydWU7XG4gIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbn1cbmZ1bmN0aW9uIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHQsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAgaWYgKHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgdmFyIHNob3VsZFdhcm5EZXYgPSB0cnVlO1xuICAgIGNoZWNrRm9yVW5tYXRjaGVkVGV4dCh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlLCBzaG91bGRXYXJuRGV2KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2VXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZTogT25seSBFbGVtZW50IG9yIERvY3VtZW50IGNhbiBiZSBwYXJlbnQgbm9kZXMuXG4gICAgdmFyIHBhcmVudE5vZGUgPSBwYXJlbnRJbnN0YW5jZS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKHBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudE5vZGUsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIGluc3RhbmNlLCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgd2FybkZvckRlbGV0ZWRIeWRyYXRhYmxlRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgaW5zdGFuY2UpO1xuICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSA7IGVsc2Uge1xuICAgICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRFbGVtZW50KHBhcmVudE5vZGUsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UocGFyZW50SW5zdGFuY2UsIHRleHQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWU6IE9ubHkgRWxlbWVudCBvciBEb2N1bWVudCBjYW4gYmUgcGFyZW50IG5vZGVzLlxuICAgIHZhciBwYXJlbnROb2RlID0gcGFyZW50SW5zdGFuY2UucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSAhPT0gbnVsbCkgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudE5vZGUsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMsIGlzQ29uY3VycmVudE1vZGUpIHtcbiAge1xuICAgIGlmIChpc0NvbmN1cnJlbnRNb2RlIHx8IHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgICB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50SW5zdGFuY2UsIHR5cGUpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0LCBpc0NvbmN1cnJlbnRNb2RlKSB7XG4gIHtcbiAgICBpZiAoaXNDb25jdXJyZW50TW9kZSB8fCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9ySHlkcmF0aW5nQ29udGFpbmVyKHBhcmVudENvbnRhaW5lcikge1xuICB7XG4gICAgLy8gVE9ETzogVGhpcyBnZXRzIGxvZ2dlZCBieSBvblJlY292ZXJhYmxlRXJyb3IsIHRvbywgc28gd2Ugc2hvdWxkIGJlXG4gICAgLy8gYWJsZSB0byByZW1vdmUgaXQuXG4gICAgZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24uIFRoZSBzZXJ2ZXIgSFRNTCB3YXMgcmVwbGFjZWQgd2l0aCBjbGllbnQgY29udGVudCBpbiA8JXM+LicsIHBhcmVudENvbnRhaW5lci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVBvcnRhbE1vdW50KHBvcnRhbEluc3RhbmNlKSB7XG4gIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbn1cblxudmFyIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xudmFyIGludGVybmFsSW5zdGFuY2VLZXkgPSAnX19yZWFjdEZpYmVyJCcgKyByYW5kb21LZXk7XG52YXIgaW50ZXJuYWxQcm9wc0tleSA9ICdfX3JlYWN0UHJvcHMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5ID0gJ19fcmVhY3RDb250YWluZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXkgPSAnX19yZWFjdEV2ZW50cyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5ID0gJ19fcmVhY3RMaXN0ZW5lcnMkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleSA9ICdfX3JlYWN0SGFuZGxlcyQnICsgcmFuZG9tS2V5O1xuZnVuY3Rpb24gZGV0YWNoRGVsZXRlZEluc3RhbmNlKG5vZGUpIHtcbiAgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBvbiBob3N0IGNvbXBvbmVudHMuIEkgZG9uJ3QgdGhpbmsgYWxsIG9mXG4gIC8vIHRoZXNlIGZpZWxkcyBhcmUgcmVsZXZhbnQuXG4gIGRlbGV0ZSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbFByb3BzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcbiAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXldO1xuICBkZWxldGUgbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlc1NldEtleV07XG59XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAgdGhyb3cgbmV3IEVycm9yKCdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpO1xufVxuZnVuY3Rpb24gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShub2RlKSB7XG4gIHJldHVybiBub2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG59XG5mdW5jdGlvbiB1cGRhdGVGaWJlclByb3BzKG5vZGUsIHByb3BzKSB7XG4gIG5vZGVbaW50ZXJuYWxQcm9wc0tleV0gPSBwcm9wcztcbn1cbmZ1bmN0aW9uIGdldEV2ZW50TGlzdGVuZXJTZXQobm9kZSkge1xuICB2YXIgZWxlbWVudExpc3RlbmVyU2V0ID0gbm9kZVtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldO1xuXG4gIGlmIChlbGVtZW50TGlzdGVuZXJTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XSA9IG5ldyBTZXQoKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50TGlzdGVuZXJTZXQ7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbHVlU3RhY2sgPSBbXTtcbnZhciBmaWJlclN0YWNrO1xuXG57XG4gIGZpYmVyU3RhY2sgPSBbXTtcbn1cblxudmFyIGluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZhdWx0VmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiBkZWZhdWx0VmFsdWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gcG9wKGN1cnNvciwgZmliZXIpIHtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHtcbiAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHBvcC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgaWYgKGZpYmVyICE9PSBmaWJlclN0YWNrW2luZGV4XSkge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgRmliZXIgcG9wcGVkLicpO1xuICAgIH1cbiAgfVxuXG4gIGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleF07XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gbnVsbDtcblxuICB7XG4gICAgZmliZXJTdGFja1tpbmRleF0gPSBudWxsO1xuICB9XG5cbiAgaW5kZXgtLTtcbn1cblxuZnVuY3Rpb24gcHVzaChjdXJzb3IsIHZhbHVlLCBmaWJlcikge1xuICBpbmRleCsrO1xuICB2YWx1ZVN0YWNrW2luZGV4XSA9IGN1cnNvci5jdXJyZW50O1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IGZpYmVyO1xuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZTtcbn1cblxudmFyIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dDtcblxue1xuICB3YXJuZWRBYm91dE1pc3NpbmdHZXRDaGlsZENvbnRleHQgPSB7fTtcbn1cblxudmFyIGVtcHR5Q29udGV4dE9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlDb250ZXh0T2JqZWN0KTtcbn0gLy8gQSBjdXJzb3IgdG8gdGhlIGN1cnJlbnQgbWVyZ2VkIGNvbnRleHQgb2JqZWN0IG9uIHRoZSBzdGFjay5cblxuXG52YXIgY29udGV4dFN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGVtcHR5Q29udGV4dE9iamVjdCk7IC8vIEEgY3Vyc29yIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQuXG5cbnZhciBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKGZhbHNlKTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJldmlvdXMgY29udGV4dCBvYmplY3QgdGhhdCB3YXMgb24gdGhlIHN0YWNrLlxuLy8gV2UgdXNlIHRoaXMgdG8gZ2V0IGFjY2VzcyB0byB0aGUgcGFyZW50IGNvbnRleHQgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5XG4vLyBwdXNoZWQgdGhlIG5leHQgY29udGV4dCBwcm92aWRlciwgYW5kIG5vdyBuZWVkIHRvIG1lcmdlIHRoZWlyIGNvbnRleHRzLlxuXG52YXIgcHJldmlvdXNDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG5mdW5jdGlvbiBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyKSB7XG4gIHtcbiAgICBpZiAoZGlkUHVzaE93bkNvbnRleHRJZlByb3ZpZGVyICYmIGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgIC8vIElmIHRoZSBmaWJlciBpcyBhIGNvbnRleHQgcHJvdmlkZXIgaXRzZWxmLCB3aGVuIHdlIHJlYWQgaXRzIGNvbnRleHRcbiAgICAgIC8vIHdlIG1heSBoYXZlIGFscmVhZHkgcHVzaGVkIGl0cyBvd24gY2hpbGQgY29udGV4dCBvbiB0aGUgc3RhY2suIEEgY29udGV4dFxuICAgICAgLy8gcHJvdmlkZXIgc2hvdWxkIG5vdCBcInNlZVwiIGl0cyBvd24gY2hpbGQgY29udGV4dC4gVGhlcmVmb3JlIHdlIHJlYWQgdGhlXG4gICAgICAvLyBwcmV2aW91cyAocGFyZW50KSBjb250ZXh0IGluc3RlYWQgZm9yIGEgY29udGV4dCBwcm92aWRlci5cbiAgICAgIHJldHVybiBwcmV2aW91c0NvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBtYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dCA9IG1hc2tlZENvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IHR5cGUuY29udGV4dFR5cGVzO1xuXG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gICAgfSAvLyBBdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyB1bm1hc2tlZCBjb250ZXh0IGhhcyBjaGFuZ2VkLlxuICAgIC8vIEZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBjYWxscyB0byBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLlxuICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaW5maW5pdGUgbG9vcHMgaWYgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBjYWxscyBzZXRTdGF0ZS5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQgPT09IHVubWFza2VkQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjb250ZXh0ID0ge307XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gY29udGV4dFR5cGVzKSB7XG4gICAgICBjb250ZXh0W2tleV0gPSB1bm1hc2tlZENvbnRleHRba2V5XTtcbiAgICB9XG5cbiAgICB7XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdVbmtub3duJztcbiAgICAgIGNoZWNrUHJvcFR5cGVzKGNvbnRleHRUeXBlcywgY29udGV4dCwgJ2NvbnRleHQnLCBuYW1lKTtcbiAgICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgICAvLyBDb250ZXh0IGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjbGFzcyBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkIHNvIGNoZWNrIGZvciBpbnN0YW5jZS5cblxuXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzQ29udGV4dENoYW5nZWQoKSB7XG4gIHtcbiAgICByZXR1cm4gZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvci5jdXJyZW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKHR5cGUpIHtcbiAge1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG4gICAgcmV0dXJuIGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyKSB7XG4gIHtcbiAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGZpYmVyLCBjb250ZXh0LCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIGlmIChjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZW1wdHlDb250ZXh0T2JqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29udGV4dCBmb3VuZCBvbiBzdGFjay4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBjb250ZXh0LCBmaWJlcik7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRDaGFuZ2UsIGZpYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzQ2hpbGRDb250ZXh0KGZpYmVyLCB0eXBlLCBwYXJlbnRDb250ZXh0KSB7XG4gIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gdHlwZS5jaGlsZENvbnRleHRUeXBlczsgLy8gVE9ETyAoYnZhdWdobikgUmVwbGFjZSB0aGlzIGJlaGF2aW9yIHdpdGggYW4gaW52YXJpYW50KCkgaW4gdGhlIGZ1dHVyZS5cbiAgICAvLyBJdCBoYXMgb25seSBiZWVuIGFkZGVkIGluIEZpYmVyIHRvIG1hdGNoIHRoZSAodW5pbnRlbnRpb25hbCkgYmVoYXZpb3IgaW4gU3RhY2suXG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAge1xuICAgICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ1Vua25vd24nO1xuICAgICAgY2hlY2tQcm9wVHlwZXMoY2hpbGRDb250ZXh0VHlwZXMsIGNoaWxkQ29udGV4dCwgJ2NoaWxkIGNvbnRleHQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCFpc0ZpYmVyTW91bnRlZChmaWJlcikgfHwgZmliZXIudGFnICE9PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBzdWJ0cmVlIHBhcmVudCB0byBiZSBhIG1vdW50ZWQgY2xhc3MgY29tcG9uZW50LiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIGRvIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICByZXR1cm4gbm9kZS5zdGF0ZU5vZGUuY29udGV4dDtcblxuICAgICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBDb21wb25lbnQgPSBub2RlLnR5cGU7XG5cbiAgICAgICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIHVuZXhwZWN0ZWQgZGV0YWNoZWQgc3VidHJlZSBwYXJlbnQuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQ29uY3VycmVudFJvb3QgPSAxO1xuXG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbmNsdWRlc0xlZ2FjeVN5bmNDYWxsYmFja3MgPSBmYWxzZTtcbnZhciBpc0ZsdXNoaW5nU3luY1F1ZXVlID0gZmFsc2U7XG5mdW5jdGlvbiBzY2hlZHVsZVN5bmNDYWxsYmFjayhjYWxsYmFjaykge1xuICAvLyBQdXNoIHRoaXMgY2FsbGJhY2sgaW50byBhbiBpbnRlcm5hbCBxdWV1ZS4gV2UnbGwgZmx1c2ggdGhlc2UgZWl0aGVyIGluXG4gIC8vIHRoZSBuZXh0IHRpY2ssIG9yIGVhcmxpZXIgaWYgc29tZXRoaW5nIGNhbGxzIGBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlYC5cbiAgaWYgKHN5bmNRdWV1ZSA9PT0gbnVsbCkge1xuICAgIHN5bmNRdWV1ZSA9IFtjYWxsYmFja107XG4gIH0gZWxzZSB7XG4gICAgLy8gUHVzaCBvbnRvIGV4aXN0aW5nIHF1ZXVlLiBEb24ndCBuZWVkIHRvIHNjaGVkdWxlIGEgY2FsbGJhY2sgYmVjYXVzZVxuICAgIC8vIHdlIGFscmVhZHkgc2NoZWR1bGVkIG9uZSB3aGVuIHdlIGNyZWF0ZWQgdGhlIHF1ZXVlLlxuICAgIHN5bmNRdWV1ZS5wdXNoKGNhbGxiYWNrKTtcbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVMZWdhY3lTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gdHJ1ZTtcbiAgc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpIHtcbiAgLy8gT25seSBmbHVzaGVzIHRoZSBxdWV1ZSBpZiB0aGVyZSdzIGEgbGVnYWN5IHN5bmMgY2FsbGJhY2sgc2NoZWR1bGVkLlxuICAvLyBUT0RPOiBUaGVyZSdzIG9ubHkgYSBzaW5nbGUgdHlwZSBvZiBjYWxsYmFjazogcGVyZm9ybVN5bmNPbldvcmtPblJvb3QuIFNvXG4gIC8vIGl0IG1pZ2h0IG1ha2UgbW9yZSBzZW5zZSBmb3IgdGhlIHF1ZXVlIHRvIGJlIGEgbGlzdCBvZiByb290cyBpbnN0ZWFkIG9mIGFcbiAgLy8gbGlzdCBvZiBnZW5lcmljIGNhbGxiYWNrcy4gVGhlbiB3ZSBjYW4gaGF2ZSB0d286IG9uZSBmb3IgbGVnYWN5IHJvb3RzLCBvbmVcbiAgLy8gZm9yIGNvbmN1cnJlbnQgcm9vdHMuIEFuZCB0aGlzIG1ldGhvZCB3b3VsZCBvbmx5IGZsdXNoIHRoZSBsZWdhY3kgb25lcy5cbiAgaWYgKGluY2x1ZGVzTGVnYWN5U3luY0NhbGxiYWNrcykge1xuICAgIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja3MoKSB7XG4gIGlmICghaXNGbHVzaGluZ1N5bmNRdWV1ZSAmJiBzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBQcmV2ZW50IHJlLWVudHJhbmNlLlxuICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSB0cnVlO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcHJldmlvdXNVcGRhdGVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc1N5bmMgPSB0cnVlO1xuICAgICAgdmFyIHF1ZXVlID0gc3luY1F1ZXVlOyAvLyBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeSBhbnltb3JlPyBUaGUgb25seSB1c2VyIGNvZGUgdGhhdCBydW5zIGluIHRoaXNcbiAgICAgIC8vIHF1ZXVlIGlzIGluIHRoZSByZW5kZXIgb3IgY29tbWl0IHBoYXNlcy5cblxuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICAgIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2soaXNTeW5jKTtcbiAgICAgICAgfSB3aGlsZSAoY2FsbGJhY2sgIT09IG51bGwpO1xuICAgICAgfVxuXG4gICAgICBzeW5jUXVldWUgPSBudWxsO1xuICAgICAgaW5jbHVkZXNMZWdhY3lTeW5jQ2FsbGJhY2tzID0gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgIGlmIChzeW5jUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgc3luY1F1ZXVlID0gc3luY1F1ZXVlLnNsaWNlKGkgKyAxKTtcbiAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5LCBmbHVzaFN5bmNDYWxsYmFja3MpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZVByaW9yaXR5KTtcbiAgICAgIGlzRmx1c2hpbmdTeW5jUXVldWUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBOb1RyYW5zaXRpb24gPSBudWxsO1xuZnVuY3Rpb24gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkge1xuICByZXR1cm4gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cGUgc3RyYXRlZ3k6IFdhcm4gb25jZSBwZXIgY29tcG9uZW50LlxuICAgIGlmIChkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nICYmIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLlxuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudC5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLl9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmIHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgZG8gYW4gaW5pdGlhbCBwYXNzIHRvIGdhdGhlciBjb21wb25lbnQgbmFtZXNcbiAgICB2YXIgY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgIH0pO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuXG4gICAgaWYgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIH0gLy8gRmluYWxseSwgd2UgZmx1c2ggYWxsIHRoZSB3YXJuaW5nc1xuICAgIC8vIFVOU0FGRV8gb25lcyBiZWZvcmUgdGhlIGRlcHJlY2F0ZWQgb25lcywgc2luY2UgdGhleSdsbCBiZSAnbG91ZGVyJ1xuXG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgJyArICdhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgXCIgKyAncmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzKTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczIgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMyKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsTW91bnQgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsTW91bnQgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzMyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczQgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgXCIqIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIHJlZmFjdG9yIHlvdXIgXCIgKyAnY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvICcgKyAnc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gTGVhcm4gbW9yZSBhdDogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Rlcml2ZWQtc3RhdGVcXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczQpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXM1ID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKTtcblxuICAgICAgd2FybignY29tcG9uZW50V2lsbFVwZGF0ZSBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArICcqIFJlbmFtZSBjb21wb25lbnRXaWxsVXBkYXRlIHRvIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXM1KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dCA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICB2YXIgc3RyaWN0Um9vdCA9IGZpbmRTdHJpY3RSb290KGZpYmVyKTtcblxuICAgIGlmIChzdHJpY3RSb290ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdG8gZmluZCBhIFN0cmljdE1vZGUgY29tcG9uZW50IGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG5cblxuICAgIGlmIChkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB3YXJuaW5nc0ZvclJvb3QgPSBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZ2V0KHN0cmljdFJvb3QpO1xuXG4gICAgaWYgKGZpYmVyLnR5cGUuY29udGV4dFR5cGVzICE9IG51bGwgfHwgZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyAhPSBudWxsIHx8IGluc3RhbmNlICE9PSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh3YXJuaW5nc0ZvclJvb3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3YXJuaW5nc0ZvclJvb3QgPSBbXTtcbiAgICAgICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLnNldChzdHJpY3RSb290LCB3YXJuaW5nc0ZvclJvb3QpO1xuICAgICAgfVxuXG4gICAgICB3YXJuaW5nc0ZvclJvb3QucHVzaChmaWJlcik7XG4gICAgfVxuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyQXJyYXksIHN0cmljdFJvb3QpIHtcbiAgICAgIGlmIChmaWJlckFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdEZpYmVyID0gZmliZXJBcnJheVswXTtcbiAgICAgIHZhciB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIGZpYmVyQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgdW5pcXVlTmFtZXMuYWRkKGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5Q29udGV4dC5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKHVuaXF1ZU5hbWVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpcnN0RmliZXIpO1xuXG4gICAgICAgIGVycm9yKCdMZWdhY3kgY29udGV4dCBBUEkgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aGluIGEgc3RyaWN0LW1vZGUgdHJlZS4nICsgJ1xcblxcblRoZSBvbGQgQVBJIHdpbGwgYmUgc3VwcG9ydGVkIGluIGFsbCAxNi54IHJlbGVhc2VzLCBidXQgYXBwbGljYXRpb25zICcgKyAndXNpbmcgaXQgc2hvdWxkIG1pZ3JhdGUgdG8gdGhlIG5ldyB2ZXJzaW9uLicgKyAnXFxuXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJyArICdcXG5cXG5MZWFybiBtb3JlIGFib3V0IHRoaXMgd2FybmluZyBoZXJlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvbGVnYWN5LWNvbnRleHQnLCBzb3J0ZWROYW1lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIGJhc2VQcm9wcykge1xuICBpZiAoQ29tcG9uZW50ICYmIENvbXBvbmVudC5kZWZhdWx0UHJvcHMpIHtcbiAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHMuIFRha2VuIGZyb20gUmVhY3RFbGVtZW50XG4gICAgdmFyIHByb3BzID0gYXNzaWduKHt9LCBiYXNlUHJvcHMpO1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSBDb21wb25lbnQuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICByZXR1cm4gYmFzZVByb3BzO1xufVxuXG52YXIgdmFsdWVDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCk7XG52YXIgcmVuZGVyZXJTaWdpbDtcblxue1xuICAvLyBVc2UgdGhpcyB0byBkZXRlY3QgbXVsdGlwbGUgcmVuZGVyZXJzIHVzaW5nIHRoZSBzYW1lIGNvbnRleHRcbiAgcmVuZGVyZXJTaWdpbCA9IHt9O1xufVxuXG52YXIgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xudmFyIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG52YXIgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbnZhciBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG5mdW5jdGlvbiByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKSB7XG4gIC8vIFRoaXMgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSBSZWFjdCB5aWVsZHMgZXhlY3V0aW9uLCB0byBlbnN1cmUgYHJlYWRDb250ZXh0YFxuICAvLyBjYW5ub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIHJlbmRlciBwaGFzZS5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSBudWxsO1xuICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBudWxsO1xuICBsYXN0RnVsbHlPYnNlcnZlZENvbnRleHQgPSBudWxsO1xuXG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCkge1xuICB7XG4gICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBwdXNoUHJvdmlkZXIocHJvdmlkZXJGaWJlciwgY29udGV4dCwgbmV4dFZhbHVlKSB7XG4gIHtcbiAgICBwdXNoKHZhbHVlQ3Vyc29yLCBjb250ZXh0Ll9jdXJyZW50VmFsdWUsIHByb3ZpZGVyRmliZXIpO1xuICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IG5leHRWYWx1ZTtcblxuICAgIHtcbiAgICAgIGlmIChjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IG51bGwgJiYgY29udGV4dC5fY3VycmVudFJlbmRlcmVyICE9PSByZW5kZXJlclNpZ2lsKSB7XG4gICAgICAgIGVycm9yKCdEZXRlY3RlZCBtdWx0aXBsZSByZW5kZXJlcnMgY29uY3VycmVudGx5IHJlbmRlcmluZyB0aGUgJyArICdzYW1lIGNvbnRleHQgcHJvdmlkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSByZW5kZXJlclNpZ2lsO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9wUHJvdmlkZXIoY29udGV4dCwgcHJvdmlkZXJGaWJlcikge1xuICB2YXIgY3VycmVudFZhbHVlID0gdmFsdWVDdXJzb3IuY3VycmVudDtcbiAgcG9wKHZhbHVlQ3Vyc29yLCBwcm92aWRlckZpYmVyKTtcblxuICB7XG4gICAge1xuICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgLy8gVXBkYXRlIHRoZSBjaGlsZCBsYW5lcyBvZiBhbGwgdGhlIGFuY2VzdG9ycywgaW5jbHVkaW5nIHRoZSBhbHRlcm5hdGVzLlxuICB2YXIgbm9kZSA9IHBhcmVudDtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIHZhciBhbHRlcm5hdGUgPSBub2RlLmFsdGVybmF0ZTtcblxuICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBub2RlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5vZGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmICFpc1N1YnNldE9mTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHByb3BhZ2F0aW9uUm9vdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIGlmIChub2RlICE9PSBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcm9wYWdhdGlvbiByb290IHdoZW4gc2NoZWR1bGluZyBjb250ZXh0IHdvcmsuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlX2VhZ2VyKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZV9lYWdlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgcmVuZGVyTGFuZXMpIHtcblxuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICBmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBuZXh0RmliZXIgPSB2b2lkIDA7IC8vIFZpc2l0IHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbGlzdCA9IGZpYmVyLmRlcGVuZGVuY2llcztcblxuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7XG5cbiAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZXh0IG1hdGNoZXMuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5LmNvbnRleHQgPT09IGNvbnRleHQpIHtcbiAgICAgICAgICAvLyBNYXRjaCEgU2NoZWR1bGUgYW4gdXBkYXRlIG9uIHRoaXMgZmliZXIuXG4gICAgICAgICAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIC8vIFNjaGVkdWxlIGEgZm9yY2UgdXBkYXRlIG9uIHRoZSB3b3JrLWluLXByb2dyZXNzLlxuICAgICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTtcbiAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTsgLy8gVE9ETzogQmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgd29yay1pbi1wcm9ncmVzcywgdGhpcyB3aWxsIGFkZCB0aGVcbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0byB0aGUgY3VycmVudCBmaWJlciwgdG9vLCB3aGljaCBtZWFucyBpdCB3aWxsIHBlcnNpc3QgZXZlbiBpZlxuICAgICAgICAgICAgLy8gdGhpcyByZW5kZXIgaXMgdGhyb3duIGF3YXkuIFNpbmNlIGl0J3MgYSByYWNlIGNvbmRpdGlvbiwgbm90IHN1cmUgaXQnc1xuICAgICAgICAgICAgLy8gd29ydGggZml4aW5nLlxuICAgICAgICAgICAgLy8gSW5saW5lZCBgZW5xdWV1ZVVwZGF0ZWAgdG8gcmVtb3ZlIGludGVybGVhdmVkIHVwZGF0ZSBjaGVja1xuXG4gICAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaWJlci51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSA7IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gICAgICAgICAgICAgIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICAgICAgICAgICAgICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgICAgICAgICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhmaWJlci5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpOyAvLyBNYXJrIHRoZSB1cGRhdGVkIGxhbmVzIG9uIHRoZSBsaXN0LCB0b28uXG5cbiAgICAgICAgICBsaXN0LmxhbmVzID0gbWVyZ2VMYW5lcyhsaXN0LmxhbmVzLCByZW5kZXJMYW5lcyk7IC8vIFNpbmNlIHdlIGFscmVhZHkgZm91bmQgYSBtYXRjaCwgd2UgY2FuIHN0b3AgdHJhdmVyc2luZyB0aGVcbiAgICAgICAgICAvLyBkZXBlbmRlbmN5IGxpc3QuXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5Lm5leHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENvbnRleHRQcm92aWRlcikge1xuICAgICAgLy8gRG9uJ3Qgc2NhbiBkZWVwZXIgaWYgdGhpcyBpcyBhIG1hdGNoaW5nIHByb3ZpZGVyXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy50eXBlID8gbnVsbCA6IGZpYmVyLmNoaWxkO1xuICAgIH0gZWxzZSBpZiAoZmliZXIudGFnID09PSBEZWh5ZHJhdGVkRnJhZ21lbnQpIHtcbiAgICAgIC8vIElmIGEgZGVoeWRyYXRlZCBzdXNwZW5zZSBib3VuZGFyeSBpcyBpbiB0aGlzIHN1YnRyZWUsIHdlIGRvbid0IGtub3dcbiAgICAgIC8vIGlmIGl0IHdpbGwgaGF2ZSBhbnkgY29udGV4dCBjb25zdW1lcnMgaW4gaXQuIFRoZSBiZXN0IHdlIGNhbiBkbyBpc1xuICAgICAgLy8gbWFyayBpdCBhcyBoYXZpbmcgdXBkYXRlcy5cbiAgICAgIHZhciBwYXJlbnRTdXNwZW5zZSA9IGZpYmVyLnJldHVybjtcblxuICAgICAgaWYgKHBhcmVudFN1c3BlbnNlID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignV2UganVzdCBjYW1lIGZyb20gYSBwYXJlbnQgc28gd2UgbXVzdCBoYXZlIGhhZCBhIHBhcmVudC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cblxuICAgICAgcGFyZW50U3VzcGVuc2UubGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudFN1c3BlbnNlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgX2FsdGVybmF0ZSA9IHBhcmVudFN1c3BlbnNlLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKF9hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgX2FsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoX2FsdGVybmF0ZS5sYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFzc2luZyB0aGlzIGZpYmVyIGFzIHRoZSBwYXJlbnRcbiAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byBzY2hlZHVsZSB0aGlzIGZpYmVyIGFzIGhhdmluZyB3b3JrXG4gICAgICAvLyBvbiBpdHMgY2hpbGRyZW4uIFdlJ2xsIHVzZSB0aGUgY2hpbGRMYW5lcyBvblxuICAgICAgLy8gdGhpcyBmaWJlciB0byBpbmRpY2F0ZSB0aGF0IGEgY29udGV4dCBoYXMgY2hhbmdlZC5cblxuXG4gICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKHBhcmVudFN1c3BlbnNlLCByZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgbmV4dEZpYmVyID0gZmliZXIuc2libGluZztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVHJhdmVyc2UgZG93bi5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLmNoaWxkO1xuICAgIH1cblxuICAgIGlmIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIGNoaWxkIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgbmV4dEZpYmVyLnJldHVybiA9IGZpYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjaGlsZC4gVHJhdmVyc2UgdG8gbmV4dCBzaWJsaW5nLlxuICAgICAgbmV4dEZpYmVyID0gZmliZXI7XG5cbiAgICAgIHdoaWxlIChuZXh0RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5leHRGaWJlciA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAvLyBXZSdyZSBiYWNrIHRvIHRoZSByb290IG9mIHRoaXMgc3VidHJlZS4gRXhpdC5cbiAgICAgICAgICBuZXh0RmliZXIgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNpYmxpbmcgPSBuZXh0RmliZXIuc2libGluZztcblxuICAgICAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNldCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgdGhlIHNpYmxpbmcgdG8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuXG4gICAgICAgICAgc2libGluZy5yZXR1cm4gPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgICAgIG5leHRGaWJlciA9IHNpYmxpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gLy8gTm8gbW9yZSBzaWJsaW5ncy4gVHJhdmVyc2UgdXAuXG5cblxuICAgICAgICBuZXh0RmliZXIgPSBuZXh0RmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gbmV4dEZpYmVyO1xuICB9XG59XG5mdW5jdGlvbiBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbiAgbGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID0gbnVsbDtcbiAgdmFyIGRlcGVuZGVuY2llcyA9IHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcztcblxuICBpZiAoZGVwZW5kZW5jaWVzICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgdmFyIGZpcnN0Q29udGV4dCA9IGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQ7XG5cbiAgICAgIGlmIChmaXJzdENvbnRleHQgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoZGVwZW5kZW5jaWVzLmxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgICAvLyBDb250ZXh0IGxpc3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuIE1hcmsgdGhhdCB0aGlzIGZpYmVyIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgICAgIH0gLy8gUmVzZXQgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgbGlzdFxuXG5cbiAgICAgICAgZGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZWFkQ29udGV4dChjb250ZXh0KSB7XG4gIHtcbiAgICAvLyBUaGlzIHdhcm5pbmcgd291bGQgZmlyZSBpZiB5b3UgcmVhZCBjb250ZXh0IGluc2lkZSBhIEhvb2sgbGlrZSB1c2VNZW1vLlxuICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuXG4gICAgaWYgKGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYpIHtcbiAgICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgdmFsdWUgPSAgY29udGV4dC5fY3VycmVudFZhbHVlIDtcblxuICBpZiAobGFzdEZ1bGx5T2JzZXJ2ZWRDb250ZXh0ID09PSBjb250ZXh0KSA7IGVsc2Uge1xuICAgIHZhciBjb250ZXh0SXRlbSA9IHtcbiAgICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgICBtZW1vaXplZFZhbHVlOiB2YWx1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9PT0gbnVsbCkge1xuICAgICAgaWYgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gJyArICdJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiAnICsgJ0luIGZ1bmN0aW9uIGNvbXBvbmVudHMsIHlvdSBjYW4gcmVhZCBpdCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24gYm9keSwgYnV0IG5vdCAnICsgJ2luc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuJyk7XG4gICAgICB9IC8vIFRoaXMgaXMgdGhlIGZpcnN0IGRlcGVuZGVuY3kgZm9yIHRoaXMgY29tcG9uZW50LiBDcmVhdGUgYSBuZXcgbGlzdC5cblxuXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBjb250ZXh0SXRlbTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmRlcGVuZGVuY2llcyA9IHtcbiAgICAgICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgICAgIGZpcnN0Q29udGV4dDogY29udGV4dEl0ZW1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCBhIG5ldyBjb250ZXh0IGl0ZW0uXG4gICAgICBsYXN0Q29udGV4dERlcGVuZGVuY3kgPSBsYXN0Q29udGV4dERlcGVuZGVuY3kubmV4dCA9IGNvbnRleHRJdGVtO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gQW4gYXJyYXkgb2YgYWxsIHVwZGF0ZSBxdWV1ZXMgdGhhdCByZWNlaXZlZCB1cGRhdGVzIGR1cmluZyB0aGUgY3VycmVudFxuLy8gcmVuZGVyLiBXaGVuIHRoaXMgcmVuZGVyIGV4aXRzLCBlaXRoZXIgYmVjYXVzZSBpdCBmaW5pc2hlcyBvciBiZWNhdXNlIGl0IGlzXG4vLyBpbnRlcnJ1cHRlZCwgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgd2lsbCBiZSB0cmFuc2ZlcnJlZCBvbnRvIHRoZSBtYWluIHBhcnRcbi8vIG9mIHRoZSBxdWV1ZS5cbnZhciBpbnRlcmxlYXZlZFF1ZXVlcyA9IG51bGw7XG5mdW5jdGlvbiBwdXNoSW50ZXJsZWF2ZWRRdWV1ZShxdWV1ZSkge1xuICBpZiAoaW50ZXJsZWF2ZWRRdWV1ZXMgPT09IG51bGwpIHtcbiAgICBpbnRlcmxlYXZlZFF1ZXVlcyA9IFtxdWV1ZV07XG4gIH0gZWxzZSB7XG4gICAgaW50ZXJsZWF2ZWRRdWV1ZXMucHVzaChxdWV1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0ludGVybGVhdmVkVXBkYXRlcygpIHtcbiAgcmV0dXJuIGludGVybGVhdmVkUXVldWVzICE9PSBudWxsO1xufVxuZnVuY3Rpb24gZW5xdWV1ZUludGVybGVhdmVkVXBkYXRlcygpIHtcbiAgLy8gVHJhbnNmZXIgdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgb250byB0aGUgbWFpbiBxdWV1ZS4gRWFjaCBxdWV1ZSBoYXMgYVxuICAvLyBgcGVuZGluZ2AgZmllbGQgYW5kIGFuIGBpbnRlcmxlYXZlZGAgZmllbGQuIFdoZW4gdGhleSBhcmUgbm90IG51bGwsIHRoZXlcbiAgLy8gcG9pbnQgdG8gdGhlIGxhc3Qgbm9kZSBpbiBhIGNpcmN1bGFyIGxpbmtlZCBsaXN0LiBXZSBuZWVkIHRvIGFwcGVuZCB0aGVcbiAgLy8gaW50ZXJsZWF2ZWQgbGlzdCB0byB0aGUgZW5kIG9mIHRoZSBwZW5kaW5nIGxpc3QgYnkgam9pbmluZyB0aGVtIGludG8gYVxuICAvLyBzaW5nbGUsIGNpcmN1bGFyIGxpc3QuXG4gIGlmIChpbnRlcmxlYXZlZFF1ZXVlcyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW50ZXJsZWF2ZWRRdWV1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWV1ZSA9IGludGVybGVhdmVkUXVldWVzW2ldO1xuICAgICAgdmFyIGxhc3RJbnRlcmxlYXZlZFVwZGF0ZSA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gICAgICBpZiAobGFzdEludGVybGVhdmVkVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLmludGVybGVhdmVkID0gbnVsbDtcbiAgICAgICAgdmFyIGZpcnN0SW50ZXJsZWF2ZWRVcGRhdGUgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dDtcbiAgICAgICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcXVldWUucGVuZGluZztcblxuICAgICAgICBpZiAobGFzdFBlbmRpbmdVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gZmlyc3RJbnRlcmxlYXZlZFVwZGF0ZTtcbiAgICAgICAgICBsYXN0SW50ZXJsZWF2ZWRVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBsYXN0SW50ZXJsZWF2ZWRVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW50ZXJsZWF2ZWRRdWV1ZXMgPSBudWxsO1xuICB9XG59XG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7IC8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG5cbnZhciBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGU7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlO1xuXG57XG4gIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSBmYWxzZTtcbiAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBiYXNlU3RhdGU6IGZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIHNoYXJlZDoge1xuICAgICAgcGVuZGluZzogbnVsbCxcbiAgICAgIGludGVybGVhdmVkOiBudWxsLFxuICAgICAgbGFuZXM6IE5vTGFuZXNcbiAgICB9LFxuICAgIGVmZmVjdHM6IG51bGxcbiAgfTtcbiAgZmliZXIudXBkYXRlUXVldWUgPSBxdWV1ZTtcbn1cbmZ1bmN0aW9uIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gQ2xvbmUgdGhlIHVwZGF0ZSBxdWV1ZSBmcm9tIGN1cnJlbnQuIFVubGVzcyBpdCdzIGFscmVhZHkgYSBjbG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG4gIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgdmFyIGNsb25lID0ge1xuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgZmlyc3RCYXNlVXBkYXRlOiBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlLFxuICAgICAgbGFzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZSxcbiAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgIGVmZmVjdHM6IGN1cnJlbnRRdWV1ZS5lZmZlY3RzXG4gICAgfTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGNsb25lO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKSB7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgZXZlbnRUaW1lOiBldmVudFRpbWUsXG4gICAgbGFuZTogbGFuZSxcbiAgICB0YWc6IFVwZGF0ZVN0YXRlLFxuICAgIHBheWxvYWQ6IG51bGwsXG4gICAgY2FsbGJhY2s6IG51bGwsXG4gICAgbmV4dDogbnVsbFxuICB9O1xuICByZXR1cm4gdXBkYXRlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlLCBsYW5lKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh1cGRhdGVRdWV1ZSA9PT0gbnVsbCkge1xuICAgIC8vIE9ubHkgb2NjdXJzIGlmIHRoZSBmaWJlciBoYXMgYmVlbiB1bm1vdW50ZWQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNoYXJlZFF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuXG4gIGlmIChpc0ludGVybGVhdmVkVXBkYXRlKGZpYmVyKSkge1xuICAgIHZhciBpbnRlcmxlYXZlZCA9IHNoYXJlZFF1ZXVlLmludGVybGVhdmVkO1xuXG4gICAgaWYgKGludGVybGVhdmVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTsgLy8gQXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCByZW5kZXIsIHRoaXMgcXVldWUncyBpbnRlcmxlYXZlZCB1cGRhdGVzIHdpbGxcbiAgICAgIC8vIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBwZW5kaW5nIHF1ZXVlLlxuXG4gICAgICBwdXNoSW50ZXJsZWF2ZWRRdWV1ZShzaGFyZWRRdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZS5uZXh0ID0gaW50ZXJsZWF2ZWQubmV4dDtcbiAgICAgIGludGVybGVhdmVkLm5leHQgPSB1cGRhdGU7XG4gICAgfVxuXG4gICAgc2hhcmVkUXVldWUuaW50ZXJsZWF2ZWQgPSB1cGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHBlbmRpbmcgPSBzaGFyZWRRdWV1ZS5wZW5kaW5nO1xuXG4gICAgaWYgKHBlbmRpbmcgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgICB9XG5cbiAgICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuICB9XG5cbiAge1xuICAgIGlmIChjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPT09IHNoYXJlZFF1ZXVlICYmICFkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlKSB7XG4gICAgICBlcnJvcignQW4gdXBkYXRlIChzZXRTdGF0ZSwgcmVwbGFjZVN0YXRlLCBvciBmb3JjZVVwZGF0ZSkgd2FzIHNjaGVkdWxlZCAnICsgJ2Zyb20gaW5zaWRlIGFuIHVwZGF0ZSBmdW5jdGlvbi4gVXBkYXRlIGZ1bmN0aW9ucyBzaG91bGQgYmUgcHVyZSwgJyArICd3aXRoIHplcm8gc2lkZS1lZmZlY3RzLiBDb25zaWRlciB1c2luZyBjb21wb25lbnREaWRVcGRhdGUgb3IgYSAnICsgJ2NhbGxiYWNrLicpO1xuXG4gICAgICBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG5cbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHNoYXJlZFF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5IG11c3RcbiAgICAvLyBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaCByZXByZXNlbnRzXG4gICAgLy8gYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZSBtYXkgZW50YW5nbGVcbiAgICAvLyBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmIHdlICpkb24ndCpcbiAgICAvLyBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgc2hhcmVkUXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY2FwdHVyZWRVcGRhdGUpIHtcbiAgLy8gQ2FwdHVyZWQgdXBkYXRlcyBhcmUgdXBkYXRlcyB0aGF0IGFyZSB0aHJvd24gYnkgYSBjaGlsZCBkdXJpbmcgdGhlIHJlbmRlclxuICAvLyBwaGFzZS4gVGhleSBzaG91bGQgYmUgZGlzY2FyZGVkIGlmIHRoZSByZW5kZXIgaXMgYWJvcnRlZC4gVGhlcmVmb3JlLFxuICAvLyB3ZSBzaG91bGQgb25seSBwdXQgdGhlbSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSwgbm90IHRoZSBjdXJyZW50IG9uZS5cbiAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7IC8vIENoZWNrIGlmIHRoZSB3b3JrLWluLXByb2dyZXNzIHF1ZXVlIGlzIGEgY2xvbmUuXG5cbiAgdmFyIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcblxuICAgIGlmIChxdWV1ZSA9PT0gY3VycmVudFF1ZXVlKSB7XG4gICAgICAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlblxuICAgICAgLy8gd2UgYmFpbCBvdXQgb24gYSBwYXJlbnQgZmliZXIgdGhhdCB0aGVuIGNhcHR1cmVzIGFuIGVycm9yIHRocm93biBieVxuICAgICAgLy8gYSBjaGlsZC4gU2luY2Ugd2Ugd2FudCB0byBhcHBlbmQgdGhlIHVwZGF0ZSBvbmx5IHRvIHRoZSB3b3JrLWluXG4gICAgICAvLyAtcHJvZ3Jlc3MgcXVldWUsIHdlIG5lZWQgdG8gY2xvbmUgdGhlIHVwZGF0ZXMuIFdlIHVzdWFsbHkgY2xvbmUgZHVyaW5nXG4gICAgICAvLyBwcm9jZXNzVXBkYXRlUXVldWUsIGJ1dCB0aGF0IGRpZG4ndCBoYXBwZW4gaW4gdGhpcyBjYXNlIGJlY2F1c2Ugd2VcbiAgICAgIC8vIHNraXBwZWQgb3ZlciB0aGUgcGFyZW50IHdoZW4gd2UgYmFpbGVkIG91dC5cbiAgICAgIHZhciBuZXdGaXJzdCA9IG51bGw7XG4gICAgICB2YXIgbmV3TGFzdCA9IG51bGw7XG4gICAgICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgdXBkYXRlcyBhbmQgY2xvbmUgdGhlbS5cbiAgICAgICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGUuZXZlbnRUaW1lLFxuICAgICAgICAgICAgbGFuZTogdXBkYXRlLmxhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjbG9uZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgICAgICBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCk7IC8vIEFwcGVuZCB0aGUgY2FwdHVyZWQgdXBkYXRlIHRoZSBlbmQgb2YgdGhlIGNsb25lZCBsaXN0LlxuXG5cbiAgICAgICAgaWYgKG5ld0xhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0Lm5leHQgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgICAgICBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSBubyBiYXNlIHVwZGF0ZXMuXG4gICAgICAgIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgfVxuXG4gICAgICBxdWV1ZSA9IHtcbiAgICAgICAgYmFzZVN0YXRlOiBjdXJyZW50UXVldWUuYmFzZVN0YXRlLFxuICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IG5ld0ZpcnN0LFxuICAgICAgICBsYXN0QmFzZVVwZGF0ZTogbmV3TGFzdCxcbiAgICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgICBlZmZlY3RzOiBjdXJyZW50UXVldWUuZWZmZWN0c1xuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cblxuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gIH1cblxuICBxdWV1ZS5sYXN0QmFzZVVwZGF0ZSA9IGNhcHR1cmVkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZUZyb21VcGRhdGUod29ya0luUHJvZ3Jlc3MsIHF1ZXVlLCB1cGRhdGUsIHByZXZTdGF0ZSwgbmV4dFByb3BzLCBpbnN0YW5jZSkge1xuICBzd2l0Y2ggKHVwZGF0ZS50YWcpIHtcbiAgICBjYXNlIFJlcGxhY2VTdGF0ZTpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhpdERpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICAgICAgfSAvLyBTdGF0ZSBvYmplY3RcblxuXG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgICAgfVxuXG4gICAgY2FzZSBDYXB0dXJlVXBkYXRlOlxuICAgICAge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuICAgICAgfVxuICAgIC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFVwZGF0ZVN0YXRlOlxuICAgICAge1xuICAgICAgICB2YXIgX3BheWxvYWQgPSB1cGRhdGUucGF5bG9hZDtcbiAgICAgICAgdmFyIHBhcnRpYWxTdGF0ZTtcblxuICAgICAgICBpZiAodHlwZW9mIF9wYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgX3BheWxvYWQuY2FsbChpbnN0YW5jZSwgcHJldlN0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yY2VVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIGhhc0ZvcmNlVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZTtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmV2U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgcHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIHtcbiAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7XG4gIH1cblxuICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuICB2YXIgbGFzdEJhc2VVcGRhdGUgPSBxdWV1ZS5sYXN0QmFzZVVwZGF0ZTsgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIHBlbmRpbmcgdXBkYXRlcy4gSWYgc28sIHRyYW5zZmVyIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG5cbiAgdmFyIHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICBxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGw7IC8vIFRoZSBwZW5kaW5nIHF1ZXVlIGlzIGNpcmN1bGFyLiBEaXNjb25uZWN0IHRoZSBwb2ludGVyIGJldHdlZW4gZmlyc3RcbiAgICAvLyBhbmQgbGFzdCBzbyB0aGF0IGl0J3Mgbm9uLWNpcmN1bGFyLlxuXG4gICAgdmFyIGxhc3RQZW5kaW5nVXBkYXRlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHZhciBmaXJzdFBlbmRpbmdVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0O1xuICAgIGxhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsOyAvLyBBcHBlbmQgcGVuZGluZyB1cGRhdGVzIHRvIGJhc2UgcXVldWVcblxuICAgIGlmIChsYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgIH1cblxuICAgIGxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7IC8vIElmIHRoZXJlJ3MgYSBjdXJyZW50IHF1ZXVlLCBhbmQgaXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgYmFzZSBxdWV1ZSwgdGhlblxuICAgIC8vIHdlIG5lZWQgdG8gdHJhbnNmZXIgdGhlIHVwZGF0ZXMgdG8gdGhhdCBxdWV1ZSwgdG9vLiBCZWNhdXNlIHRoZSBiYXNlXG4gICAgLy8gcXVldWUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgd2l0aCBubyBjeWNsZXMsIHdlIGNhbiBhcHBlbmQgdG8gYm90aFxuICAgIC8vIGxpc3RzIGFuZCB0YWtlIGFkdmFudGFnZSBvZiBzdHJ1Y3R1cmFsIHNoYXJpbmcuXG4gICAgLy8gVE9ETzogUGFzcyBgY3VycmVudGAgYXMgYXJndW1lbnRcblxuICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIG5vbi1udWxsIG9uIGEgQ2xhc3NDb21wb25lbnQgb3IgSG9zdFJvb3RcbiAgICAgIHZhciBjdXJyZW50UXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgdmFyIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9IGN1cnJlbnRRdWV1ZS5sYXN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSAhPT0gbGFzdEJhc2VVcGRhdGUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudExhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGUgPSBsYXN0UGVuZGluZ1VwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgYXMgd2UgcHJvY2VzcyB0aGUgcXVldWUuXG5cblxuICBpZiAoZmlyc3RCYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIHVwZGF0ZXMgdG8gY29tcHV0ZSB0aGUgcmVzdWx0LlxuICAgIHZhciBuZXdTdGF0ZSA9IHF1ZXVlLmJhc2VTdGF0ZTsgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmUgcmVuZGVyTGFuZXNcbiAgICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuICAgIHZhciBuZXdMYW5lcyA9IE5vTGFuZXM7XG4gICAgdmFyIG5ld0Jhc2VTdGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIG5ld0xhc3RCYXNlVXBkYXRlID0gbnVsbDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RCYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgdmFyIHVwZGF0ZUxhbmUgPSB1cGRhdGUubGFuZTtcbiAgICAgIHZhciB1cGRhdGVFdmVudFRpbWUgPSB1cGRhdGUuZXZlbnRUaW1lO1xuXG4gICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgdXBkYXRlTGFuZSkpIHtcbiAgICAgICAgLy8gUHJpb3JpdHkgaXMgaW5zdWZmaWNpZW50LiBTa2lwIHRoaXMgdXBkYXRlLiBJZiB0aGlzIGlzIHRoZSBmaXJzdFxuICAgICAgICAvLyBza2lwcGVkIHVwZGF0ZSwgdGhlIHByZXZpb3VzIHVwZGF0ZS9zdGF0ZSBpcyB0aGUgbmV3IGJhc2VcbiAgICAgICAgLy8gdXBkYXRlL3N0YXRlLlxuICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgY2FsbGJhY2s6IHVwZGF0ZS5jYWxsYmFjayxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0xhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3RCYXNlVXBkYXRlID0gbmV3TGFzdEJhc2VVcGRhdGUgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBjbG9uZTtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBwcmlvcml0eSBpbiB0aGUgcXVldWUuXG5cblxuICAgICAgICBuZXdMYW5lcyA9IG1lcmdlTGFuZXMobmV3TGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICBldmVudFRpbWU6IHVwZGF0ZUV2ZW50VGltZSxcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICB0YWc6IHVwZGF0ZS50YWcsXG4gICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUucGF5bG9hZCxcbiAgICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdMYXN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlLm5leHQgPSBfY2xvbmU7XG4gICAgICAgIH0gLy8gUHJvY2VzcyB0aGlzIHVwZGF0ZS5cblxuXG4gICAgICAgIG5ld1N0YXRlID0gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBuZXdTdGF0ZSwgcHJvcHMsIGluc3RhbmNlKTtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdXBkYXRlLmNhbGxiYWNrO1xuXG4gICAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiAvLyBJZiB0aGUgdXBkYXRlIHdhcyBhbHJlYWR5IGNvbW1pdHRlZCwgd2Ugc2hvdWxkIG5vdCBxdWV1ZSBpdHNcbiAgICAgICAgLy8gY2FsbGJhY2sgYWdhaW4uXG4gICAgICAgIHVwZGF0ZS5sYW5lICE9PSBOb0xhbmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAgIC8vIHByb2Nlc3MgdGhlbSBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCB3ZSBkbyBuZWVkIHRvIHRyYWNrIHdoaWNoIGxhbmVzXG4gICAgLy8gYXJlIHJlbWFpbmluZy5cblxuICAgIHZhciBsYXN0SW50ZXJsZWF2ZWQgPSBxdWV1ZS5zaGFyZWQuaW50ZXJsZWF2ZWQ7XG5cbiAgICBpZiAobGFzdEludGVybGVhdmVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCBpbnRlcmxlYXZlZC5sYW5lKTtcbiAgICAgICAgaW50ZXJsZWF2ZWQgPSBpbnRlcmxlYXZlZC5uZXh0O1xuICAgICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gICAgfSBlbHNlIGlmIChmaXJzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIC8vIGBxdWV1ZS5sYW5lc2AgaXMgdXNlZCBmb3IgZW50YW5nbGluZyB0cmFuc2l0aW9ucy4gV2UgY2FuIHNldCBpdCBiYWNrIHRvXG4gICAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgICAgcXVldWUuc2hhcmVkLmxhbmVzID0gTm9MYW5lcztcbiAgICB9IC8vIFNldCB0aGUgcmVtYWluaW5nIGV4cGlyYXRpb24gdGltZSB0byBiZSB3aGF0ZXZlciBpcyByZW1haW5pbmcgaW4gdGhlIHF1ZXVlLlxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIGZpbmUgYmVjYXVzZSB0aGUgb25seSB0d28gb3RoZXIgdGhpbmdzIHRoYXQgY29udHJpYnV0ZSB0b1xuICAgIC8vIGV4cGlyYXRpb24gdGltZSBhcmUgcHJvcHMgYW5kIGNvbnRleHQuIFdlJ3JlIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiB0aGVcbiAgICAvLyBiZWdpbiBwaGFzZSBieSB0aGUgdGltZSB3ZSBzdGFydCBwcm9jZXNzaW5nIHRoZSBxdWV1ZSwgc28gd2UndmUgYWxyZWFkeVxuICAgIC8vIGRlYWx0IHdpdGggdGhlIHByb3BzLiBDb250ZXh0IGluIGNvbXBvbmVudHMgdGhhdCBzcGVjaWZ5XG4gICAgLy8gc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHRyaWNreTsgYnV0IHdlJ2xsIGhhdmUgdG8gYWNjb3VudCBmb3JcbiAgICAvLyB0aGF0IHJlZ2FyZGxlc3MuXG5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIGFzIGNhbGxiYWNrLiBFeHBlY3RlZCBhIGZ1bmN0aW9uLiBJbnN0ZWFkICcgKyAoXCJyZWNlaXZlZDogXCIgKyBjYWxsYmFjaykpO1xuICB9XG5cbiAgY2FsbGJhY2suY2FsbChjb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKSB7XG4gIGhhc0ZvcmNlVXBkYXRlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkge1xuICByZXR1cm4gaGFzRm9yY2VVcGRhdGU7XG59XG5mdW5jdGlvbiBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIGZpbmlzaGVkUXVldWUsIGluc3RhbmNlKSB7XG4gIC8vIENvbW1pdCB0aGUgZWZmZWN0c1xuICB2YXIgZWZmZWN0cyA9IGZpbmlzaGVkUXVldWUuZWZmZWN0cztcbiAgZmluaXNoZWRRdWV1ZS5lZmZlY3RzID0gbnVsbDtcblxuICBpZiAoZWZmZWN0cyAhPT0gbnVsbCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWZmZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVmZmVjdCA9IGVmZmVjdHNbaV07XG4gICAgICB2YXIgY2FsbGJhY2sgPSBlZmZlY3QuY2FsbGJhY2s7XG5cbiAgICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICBlZmZlY3QuY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGZha2VJbnRlcm5hbEluc3RhbmNlID0ge307IC8vIFJlYWN0LkNvbXBvbmVudCB1c2VzIGEgc2hhcmVkIGZyb3plbiBvYmplY3QgYnkgZGVmYXVsdC5cbi8vIFdlJ2xsIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgbGVnYWN5IHJlZnMuXG5cbnZhciBlbXB0eVJlZnNPYmplY3QgPSBuZXcgUmVhY3QuQ29tcG9uZW50KCkucmVmcztcbnZhciBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlO1xudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZTtcbnZhciB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uSW52YWxpZENhbGxiYWNrO1xudmFyIGRpZFdhcm5BYm91dERpcmVjdGx5QXNzaWduaW5nUHJvcHNUb1N0YXRlO1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlQW5kQ29udGV4dFR5cGVzO1xudmFyIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZTtcblxue1xuICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcyA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlID0gbmV3IFNldCgpO1xuICB2YXIgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrID0gbmV3IFNldCgpO1xuXG4gIHdhcm5PbkludmFsaWRDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIGlmIChjYWxsYmFjayA9PT0gbnVsbCB8fCB0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gY2FsbGVyTmFtZSArICdfJyArIGNhbGxiYWNrO1xuXG4gICAgaWYgKCFkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suaGFzKGtleSkpIHtcbiAgICAgIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KTtcblxuICAgICAgZXJyb3IoJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9O1xuXG4gIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IGZ1bmN0aW9uICh0eXBlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAocGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignJXMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCk6IEEgdmFsaWQgc3RhdGUgb2JqZWN0IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiAnICsgJ1lvdSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZC4nLCBjb21wb25lbnROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07IC8vIFRoaXMgaXMgc28gZ3Jvc3MgYnV0IGl0J3MgYXQgbGVhc3Qgbm9uLWNyaXRpY2FsIGFuZCBjYW4gYmUgcmVtb3ZlZCBpZlxuICAvLyBpdCBjYXVzZXMgcHJvYmxlbXMuIFRoaXMgaXMgbWVhbnQgdG8gZ2l2ZSBhIG5pY2VyIGVycm9yIG1lc3NhZ2UgZm9yXG4gIC8vIFJlYWN0RE9NMTUudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocmVhY3RET00xNkNvbXBvbmVudCxcbiAgLy8gLi4uKSkgd2hpY2ggb3RoZXJ3aXNlIHRocm93cyBhIFwiX3Byb2Nlc3NDaGlsZENvbnRleHQgaXMgbm90IGEgZnVuY3Rpb25cIlxuICAvLyBleGNlcHRpb24uXG5cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZmFrZUludGVybmFsSW5zdGFuY2UsICdfcHJvY2Vzc0NoaWxkQ29udGV4dCcsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgJyArICdtZWFucyB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgYW5kIGFyZSBhdHRlbXB0aW5nIHRvIG5lc3QgJyArICdhIFJlYWN0IDE1IHRyZWUgaW5zaWRlIGEgUmVhY3QgMTYgdHJlZSB1c2luZyAnICsgXCJ1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciwgd2hpY2ggaXNuJ3Qgc3VwcG9ydGVkLiBUcnkgXCIgKyAndG8gbWFrZSBzdXJlIHlvdSBoYXZlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QgKGFuZCBpZGVhbGx5LCBzd2l0Y2ggJyArICd0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLicpO1xuICAgIH1cbiAgfSk7XG4gIE9iamVjdC5mcmVlemUoZmFrZUludGVybmFsSW5zdGFuY2UpO1xufVxuXG5mdW5jdGlvbiBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgY3RvciwgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLCBuZXh0UHJvcHMpIHtcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgcGFydGlhbFN0YXRlID0gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKG5leHRQcm9wcywgcHJldlN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUoY3RvciwgcGFydGlhbFN0YXRlKTtcbiAgfSAvLyBNZXJnZSB0aGUgcGFydGlhbCBzdGF0ZSBhbmQgdGhlIHByZXZpb3VzIHN0YXRlLlxuXG5cbiAgdmFyIG1lbW9pemVkU3RhdGUgPSBwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQgPyBwcmV2U3RhdGUgOiBhc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cblxudmFyIGNsYXNzQ29tcG9uZW50VXBkYXRlciA9IHtcbiAgaXNNb3VudGVkOiBpc01vdW50ZWQsXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSk7XG4gICAgdmFyIHJvb3QgPSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9ucyhyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya1N0YXRlVXBkYXRlU2NoZWR1bGVkKGZpYmVyLCBsYW5lKTtcbiAgICB9XG4gIH0sXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gUmVwbGFjZVN0YXRlO1xuICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcblxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHZhciByb290ID0gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtTdGF0ZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9LFxuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHZhciByb290ID0gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIG1hcmtGb3JjZVVwZGF0ZVNjaGVkdWxlZChmaWJlciwgbGFuZSk7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3Rvciwgb2xkUHJvcHMsIG5ld1Byb3BzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICBpZiAodHlwZW9mIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbiBleHRyYSB0aW1lIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRVcGRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcignJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgJyArICdib29sZWFuIHZhbHVlLiBNYWtlIHN1cmUgdG8gcmV0dXJuIHRydWUgb3IgZmFsc2UuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2hvdWxkVXBkYXRlO1xuICB9XG5cbiAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50KSB7XG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWwob2xkUHJvcHMsIG5ld1Byb3BzKSB8fCAhc2hhbGxvd0VxdWFsKG9sZFN0YXRlLCBuZXdTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdBIHB1cmUgY29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVbm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudERpZFVubW91bnQoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRSZWNlaXZlUHJvcHMoKS4gQnV0IHRoZXJlIGlzIG5vIHN1Y2ggbGlmZWN5Y2xlIG1ldGhvZC4gJyArICdJZiB5b3UgbWVhbnQgdG8gdXBkYXRlIHRoZSBzdGF0ZSBpbiByZXNwb25zZSB0byBjaGFuZ2luZyBwcm9wcywgJyArICd1c2UgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpLiBJZiB5b3UgbWVhbnQgdG8gZmV0Y2ggZGF0YSBvciAnICsgJ3J1biBzaWRlLWVmZmVjdHMgb3IgbXV0YXRpb25zIGFmdGVyIFJlYWN0IGhhcyB1cGRhdGVkIHRoZSBVSSwgdXNlIGNvbXBvbmVudERpZFVwZGF0ZSgpLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT8nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzTXV0YXRlZFByb3BzID0gaW5zdGFuY2UucHJvcHMgIT09IG5ld1Byb3BzO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSB1bmRlZmluZWQgJiYgaGFzTXV0YXRlZFByb3BzKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogV2hlbiBjYWxsaW5nIHN1cGVyKCkgaW4gYCVzYCwgbWFrZSBzdXJlIHRvIHBhc3MgJyArIFwidXAgdGhlIHNhbWUgcHJvcHMgdGhhdCB5b3VyIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIHdhcyBwYXNzZWQuXCIsIG5hbWUsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGVycm9yKCdTZXR0aW5nIGRlZmF1bHRQcm9wcyBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuJyArICcgSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy4nLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgIT09ICdmdW5jdGlvbicgJiYgIWRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5oYXMoY3RvcikpIHtcbiAgICAgIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5hZGQoY3Rvcik7XG5cbiAgICAgIGVycm9yKCclczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBzaG91bGQgYmUgdXNlZCB3aXRoIGNvbXBvbmVudERpZFVwZGF0ZSgpLiAnICsgJ1RoaXMgY29tcG9uZW50IGRlZmluZXMgZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBvbmx5LicsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclczogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGEgc3RhdGljIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY3Rvci5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhbiBpbnN0YW5jZSBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIF9zdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gICAgaWYgKF9zdGF0ZSAmJiAodHlwZW9mIF9zdGF0ZSAhPT0gJ29iamVjdCcgfHwgaXNBcnJheShfc3RhdGUpKSkge1xuICAgICAgZXJyb3IoJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbCcsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0Q2hpbGRDb250ZXh0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjdG9yLmNoaWxkQ29udGV4dFR5cGVzICE9PSAnb2JqZWN0Jykge1xuICAgICAgZXJyb3IoJyVzLmdldENoaWxkQ29udGV4dCgpOiBjaGlsZENvbnRleHRUeXBlcyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gJyArICd1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgbmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkb3B0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UudXBkYXRlciA9IGNsYXNzQ29tcG9uZW50VXBkYXRlcjtcbiAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gaW5zdGFuY2U7IC8vIFRoZSBpbnN0YW5jZSBuZWVkcyBhY2Nlc3MgdG8gdGhlIGZpYmVyIHNvIHRoYXQgaXQgY2FuIHNjaGVkdWxlIHVwZGF0ZXNcblxuICBzZXQoaW5zdGFuY2UsIHdvcmtJblByb2dyZXNzKTtcblxuICB7XG4gICAgaW5zdGFuY2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IGZha2VJbnRlcm5hbEluc3RhbmNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHByb3BzKSB7XG4gIHZhciBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGZhbHNlO1xuICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcblxuICB7XG4gICAgaWYgKCdjb250ZXh0VHlwZScgaW4gY3Rvcikge1xuICAgICAgdmFyIGlzVmFsaWQgPSAvLyBBbGxvdyBudWxsIGZvciBjb25kaXRpb25hbCBkZWNsYXJhdGlvblxuICAgICAgY29udGV4dFR5cGUgPT09IG51bGwgfHwgY29udGV4dFR5cGUgIT09IHVuZGVmaW5lZCAmJiBjb250ZXh0VHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFICYmIGNvbnRleHRUeXBlLl9jb250ZXh0ID09PSB1bmRlZmluZWQ7IC8vIE5vdCBhIDxDb250ZXh0LkNvbnN1bWVyPlxuXG4gICAgICBpZiAoIWlzVmFsaWQgJiYgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmFkZChjdG9yKTtcbiAgICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG5cbiAgICAgICAgaWYgKGNvbnRleHRUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIHVuZGVmaW5lZC4gJyArICdUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiAnICsgJ1RoaXMgY2FuIGFsc28gaGFwcGVuIGR1ZSB0byBhIGNpcmN1bGFyIGRlcGVuZGVuY3ksIHNvICcgKyAndHJ5IG1vdmluZyB0aGUgY3JlYXRlQ29udGV4dCgpIGNhbGwgdG8gYSBzZXBhcmF0ZSBmaWxlLic7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRleHRUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSAnICsgdHlwZW9mIGNvbnRleHRUeXBlICsgJy4nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuUHJvdmlkZXIgaW5zdGVhZD8nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHRUeXBlLl9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyA8Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Db25zdW1lciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhbiBvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY29udGV4dFR5cGUpLmpvaW4oJywgJykgKyAnfS4nO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3IoJyVzIGRlZmluZXMgYW4gaW52YWxpZCBjb250ZXh0VHlwZS4gJyArICdjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lcycsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gbmV3IGN0b3IocHJvcHMsIGNvbnRleHQpOyAvLyBJbnN0YW50aWF0ZSB0d2ljZSB0byBoZWxwIGRldGVjdCBzaWRlLWVmZmVjdHMuXG5cbiAge1xuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpbnN0YW5jZSA9IG5ldyBjdG9yKHByb3BzLCBjb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGUgIT09IG51bGwgJiYgaW5zdGFuY2Uuc3RhdGUgIT09IHVuZGVmaW5lZCA/IGluc3RhbmNlLnN0YXRlIDogbnVsbDtcbiAgYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSk7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgc3RhdGUgPT09IG51bGwpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgICB2YXIgbmV3QXBpTmFtZSA9IHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/ICdnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKScgOiAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmhhcyhfY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lMaWZlY3ljbGVzQW5kRGVyaXZlZFN0YXRlLmFkZChfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgICBlcnJvcignVW5zYWZlIGxlZ2FjeSBsaWZlY3ljbGVzIHdpbGwgbm90IGJlIGNhbGxlZCBmb3IgY29tcG9uZW50cyB1c2luZyBuZXcgY29tcG9uZW50IEFQSXMuXFxuXFxuJyArICclcyB1c2VzICVzIGJ1dCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVnYWN5IGxpZmVjeWNsZXM6JXMlcyVzXFxuXFxuJyArICdUaGUgYWJvdmUgbGlmZWN5Y2xlcyBzaG91bGQgYmUgcmVtb3ZlZC4gTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTpcXG4nICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMnLCBfY29tcG9uZW50TmFtZSwgbmV3QXBpTmFtZSwgZm91bmRXaWxsTW91bnROYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsTW91bnROYW1lIDogJycsIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lIDogJycsIGZvdW5kV2lsbFVwZGF0ZU5hbWUgIT09IG51bGwgPyBcIlxcbiAgXCIgKyBmb3VuZFdpbGxVcGRhdGVOYW1lIDogJycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENhY2hlIHVubWFza2VkIGNvbnRleHQgc28gd2UgY2FuIGF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIG5lY2Vzc2FyeS5cbiAgLy8gUmVhY3RGaWJlckNvbnRleHQgdXN1YWxseSB1cGRhdGVzIHRoaXMgY2FjaGUgYnV0IGNhbid0IGZvciBuZXdseS1jcmVhdGVkIGluc3RhbmNlcy5cblxuXG4gIGlmIChpc0xlZ2FjeUNvbnRleHRDb25zdW1lcikge1xuICAgIGNhY2hlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0LCBjb250ZXh0KTtcbiAgfVxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZnVuY3Rpb24gY2FsbENvbXBvbmVudFdpbGxNb3VudCh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpIHtcbiAgdmFyIG9sZFN0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgfVxuXG4gIGlmIChvbGRTdGF0ZSAhPT0gaW5zdGFuY2Uuc3RhdGUpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMuY29tcG9uZW50V2lsbE1vdW50KCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byB0aGlzLnN0YXRlIGlzICcgKyBcImRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byAnICsgXCJ0aGlzLnN0YXRlIGlzIGRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBcIiArICdjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsYXNzQ29tcG9uZW50VXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKGluc3RhbmNlLCBpbnN0YW5jZS5zdGF0ZSwgbnVsbCk7XG4gIH1cbn0gLy8gSW52b2tlcyB0aGUgbW91bnQgbGlmZS1jeWNsZXMgb24gYSBwcmV2aW91c2x5IG5ldmVyIHJlbmRlcmVkIGluc3RhbmNlLlxuXG5cbmZ1bmN0aW9uIG1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICBpbnN0YW5jZS5yZWZzID0gZW1wdHlSZWZzT2JqZWN0O1xuICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgaW5zdGFuY2UuY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgPT09IG5ld1Byb3BzKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgIHtcbiAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgIH1cblxuICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBmaWJlckZsYWdzO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dExlZ2FjeVVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMgJiYgb2xkU3RhdGUgPT09IG5ld1N0YXRlICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpICYmICFjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkpIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmaWJlckZsYWdzID0gVXBkYXRlO1xuXG4gICAgICB7XG4gICAgICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAodHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGFwcGx5RGVyaXZlZFN0YXRlRnJvbVByb3BzKHdvcmtJblByb2dyZXNzLCBjdG9yLCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIG5ld1Byb3BzKTtcbiAgICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIH1cblxuICB2YXIgc2hvdWxkVXBkYXRlID0gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHx8IGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBvbGRQcm9wcywgbmV3UHJvcHMsIG9sZFN0YXRlLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuXG4gIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuICAgIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gICAgICB9XG5cbiAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICBfZmliZXJGbGFncyB8PSBNb3VudExheW91dERldjtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gX2ZpYmVyRmxhZ3M7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9maWJlckZsYWdzMiA9IFVwZGF0ZTtcblxuICAgICAge1xuICAgICAgICBfZmliZXJGbGFnczIgfD0gTGF5b3V0U3RhdGljO1xuICAgICAgfVxuXG4gICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgX2ZpYmVyRmxhZ3MyIHw9IE1vdW50TGF5b3V0RGV2O1xuICAgICAgfVxuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBfZmliZXJGbGFnczI7XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufSAvLyBJbnZva2VzIHRoZSB1cGRhdGUgbGlmZS1jeWNsZXMgYW5kIHJldHVybnMgZmFsc2UgaWYgaXQgc2hvdWxkbid0IHJlcmVuZGVyLlxuXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzLCByZW5kZXJMYW5lcykge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdW5yZXNvbHZlZE9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcztcbiAgdmFyIG9sZFByb3BzID0gd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPyB1bnJlc29sdmVkT2xkUHJvcHMgOiByZXNvbHZlRGVmYXVsdFByb3BzKHdvcmtJblByb2dyZXNzLnR5cGUsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gIGluc3RhbmNlLnByb3BzID0gb2xkUHJvcHM7XG4gIHZhciB1bnJlc29sdmVkTmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBvbGRDb250ZXh0ID0gaW5zdGFuY2UuY29udGV4dDtcbiAgdmFyIGNvbnRleHRUeXBlID0gY3Rvci5jb250ZXh0VHlwZTtcbiAgdmFyIG5leHRDb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgbmV4dENvbnRleHQgPSByZWFkQ29udGV4dChjb250ZXh0VHlwZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5leHRVbm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIG5leHRDb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gIHZhciBoYXNOZXdMaWZlY3ljbGVzID0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbic7IC8vIE5vdGU6IER1cmluZyB0aGVzZSBsaWZlLWN5Y2xlcywgaW5zdGFuY2UucHJvcHMvaW5zdGFuY2Uuc3RhdGUgYXJlIHdoYXRcbiAgLy8gZXZlciB0aGUgcHJldmlvdXNseSBhdHRlbXB0ZWQgdG8gcmVuZGVyIC0gbm90IHRoZSBcImN1cnJlbnRcIi4gSG93ZXZlcixcbiAgLy8gZHVyaW5nIGNvbXBvbmVudERpZFVwZGF0ZSB3ZSBwYXNzIHRoZSBcImN1cnJlbnRcIiBwcm9wcy5cbiAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG5cbiAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gdW5yZXNvbHZlZE5ld1Byb3BzIHx8IG9sZENvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICBjYWxsQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UsIG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRIYXNGb3JjZVVwZGF0ZUJlZm9yZVByb2Nlc3NpbmcoKTtcbiAgdmFyIG9sZFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIG5ld1N0YXRlID0gaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXdQcm9wcywgaW5zdGFuY2UsIHJlbmRlckxhbmVzKTtcbiAgbmV3U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgPT09IHVucmVzb2x2ZWROZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSAmJiAhKGVuYWJsZUxhenlDb250ZXh0UHJvcGFnYXRpb24gICApKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkgfHwgLy8gVE9ETzogSW4gc29tZSBjYXNlcywgd2UnbGwgZW5kIHVwIGNoZWNraW5nIGlmIGNvbnRleHQgaGFzIGNoYW5nZWQgdHdpY2UsXG4gIC8vIGJvdGggYmVmb3JlIGFuZCBhZnRlciBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCBoYXMgYmVlbiBjYWxsZWQuIE5vdCBpZGVhbCxcbiAgLy8gYnV0IEknbSBsb2F0aCB0byByZWZhY3RvciB0aGlzIGZ1bmN0aW9uLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgbWVtb2l6ZWRcbiAgLy8gY29tcG9uZW50cyBzbyBpdCdzIG5vdCB0aGF0IGNvbW1vbi5cbiAgZW5hYmxlTGF6eUNvbnRleHRQcm9wYWdhdGlvbiAgIDtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMsXG4gICAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cbiAgICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKG5ld1Byb3BzLCBuZXdTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgIH1cbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBwcm9wcy9zdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbi8vIFRPRE86IFVzZSB0aGUgdW5pZmllZCBmaWJlciBzdGFjayBtb2R1bGUgaW5zdGVhZCBvZiB0aGlzIGxvY2FsIG9uZT9cbi8vIEludGVudGlvbmFsbHkgbm90IHVzaW5nIGl0IHlldCB0byBkZXJpc2sgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24sIGJlY2F1c2Vcbi8vIHRoZSB3YXkgd2UgcHVzaC9wb3AgdGhlc2UgdmFsdWVzIGlzIGEgYml0IHVudXN1YWwuIElmIHRoZXJlJ3MgYSBtaXN0YWtlLCBJJ2Rcbi8vIHJhdGhlciB0aGUgaWRzIGJlIHdyb25nIHRoYW4gY3Jhc2ggdGhlIHdob2xlIHJlY29uY2lsZXIuXG52YXIgZm9ya1N0YWNrID0gW107XG52YXIgZm9ya1N0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVGb3JrUHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVGb3JrQ291bnQgPSAwO1xudmFyIGlkU3RhY2sgPSBbXTtcbnZhciBpZFN0YWNrSW5kZXggPSAwO1xudmFyIHRyZWVDb250ZXh0UHJvdmlkZXIgPSBudWxsO1xudmFyIHRyZWVDb250ZXh0SWQgPSAxO1xudmFyIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSAnJztcbmZ1bmN0aW9uIGlzRm9ya2VkQ2hpbGQod29ya0luUHJvZ3Jlc3MpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIHJldHVybiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JrZWQpICE9PSBOb0ZsYWdzO1xufVxuZnVuY3Rpb24gZ2V0Rm9ya3NBdExldmVsKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICByZXR1cm4gdHJlZUZvcmtDb3VudDtcbn1cbmZ1bmN0aW9uIGdldFRyZWVJZCgpIHtcbiAgdmFyIG92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgdmFyIGlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgaWQgPSBpZFdpdGhMZWFkaW5nQml0ICYgfmdldExlYWRpbmdCaXQoaWRXaXRoTGVhZGluZ0JpdCk7XG4gIHJldHVybiBpZC50b1N0cmluZygzMikgKyBvdmVyZmxvdztcbn1cbmZ1bmN0aW9uIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbikge1xuICAvLyBUaGlzIGlzIGNhbGxlZCByaWdodCBhZnRlciB3ZSByZWNvbmNpbGUgYW4gYXJyYXkgKG9yIGl0ZXJhdG9yKSBvZiBjaGlsZFxuICAvLyBmaWJlcnMsIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdlIGtub3cgaG93IG1hbnkgY2hpbGRyZW4gaW5cbiAgLy8gdGhlIHdob2xlIHNldCB3aXRob3V0IGRvaW5nIGV4dHJhIHdvcmsgbGF0ZXIsIG9yIHN0b3JpbmcgYWRkdGlvbmFsXG4gIC8vIGluZm9ybWF0aW9uIG9uIHRoZSBmaWJlci5cbiAgLy9cbiAgLy8gVGhhdCdzIHdoeSB0aGlzIGZ1bmN0aW9uIGlzIHNlcGFyYXRlIGZyb20gcHVzaFRyZWVJZCBcdTIwMTQgaXQncyBjYWxsZWQgZHVyaW5nXG4gIC8vIHRoZSByZW5kZXIgcGhhc2Ugb2YgdGhlIGZvcmsgcGFyZW50LCBub3QgdGhlIGNoaWxkLCB3aGljaCBpcyB3aGVyZSB3ZSBwdXNoXG4gIC8vIHRoZSBvdGhlciBjb250ZXh0IHZhbHVlcy5cbiAgLy9cbiAgLy8gSW4gdGhlIEZpenogaW1wbGVtZW50YXRpb24gdGhpcyBpcyBtdWNoIHNpbXBsZXIgYmVjYXVzZSB0aGUgY2hpbGQgaXNcbiAgLy8gcmVuZGVyZWQgaW4gdGhlIHNhbWUgY2FsbHN0YWNrIGFzIHRoZSBwYXJlbnQuXG4gIC8vXG4gIC8vIEl0IG1pZ2h0IGJlIGJldHRlciB0byBqdXN0IGFkZCBhIGBmb3Jrc2AgZmllbGQgdG8gdGhlIEZpYmVyIHR5cGUuIEl0IHdvdWxkXG4gIC8vIG1ha2UgdGhpcyBtb2R1bGUgc2ltcGxlci5cbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrQ291bnQ7XG4gIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrUHJvdmlkZXI7XG4gIHRyZWVGb3JrUHJvdmlkZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdHJlZUZvcmtDb3VudCA9IHRvdGFsQ2hpbGRyZW47XG59XG5mdW5jdGlvbiBwdXNoVHJlZUlkKHdvcmtJblByb2dyZXNzLCB0b3RhbENoaWxkcmVuLCBpbmRleCkge1xuICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRQcm92aWRlcjtcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICB2YXIgYmFzZUlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICB2YXIgYmFzZU92ZXJmbG93ID0gdHJlZUNvbnRleHRPdmVyZmxvdzsgLy8gVGhlIGxlZnRtb3N0IDEgbWFya3MgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UsIG5vbi1pbmNsdXNpdmUuIEl0J3Mgbm90IHBhcnRcbiAgLy8gb2YgdGhlIGlkOyB3ZSB1c2UgaXQgdG8gYWNjb3VudCBmb3IgbGVhZGluZyAwcy5cblxuICB2YXIgYmFzZUxlbmd0aCA9IGdldEJpdExlbmd0aChiYXNlSWRXaXRoTGVhZGluZ0JpdCkgLSAxO1xuICB2YXIgYmFzZUlkID0gYmFzZUlkV2l0aExlYWRpbmdCaXQgJiB+KDEgPDwgYmFzZUxlbmd0aCk7XG4gIHZhciBzbG90ID0gaW5kZXggKyAxO1xuICB2YXIgbGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgYmFzZUxlbmd0aDsgLy8gMzAgaXMgdGhlIG1heCBsZW5ndGggd2UgY2FuIHN0b3JlIHdpdGhvdXQgb3ZlcmZsb3dpbmcsIHRha2luZyBpbnRvXG4gIC8vIGNvbnNpZGVyYXRpb24gdGhlIGxlYWRpbmcgMSB3ZSB1c2UgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZS5cblxuICBpZiAobGVuZ3RoID4gMzApIHtcbiAgICAvLyBXZSBvdmVyZmxvd2VkIHRoZSBiaXR3aXNlLXNhZmUgcmFuZ2UuIEZhbGwgYmFjayB0byBzbG93ZXIgYWxnb3JpdGhtLlxuICAgIC8vIFRoaXMgYnJhbmNoIGFzc3VtZXMgdGhlIGxlbmd0aCBvZiB0aGUgYmFzZSBpZCBpcyBncmVhdGVyIHRoYW4gNTsgaXQgd29uJ3RcbiAgICAvLyB3b3JrIGZvciBzbWFsbGVyIGlkcywgYmVjYXVzZSB5b3UgbmVlZCA1IGJpdHMgcGVyIGNoYXJhY3Rlci5cbiAgICAvL1xuICAgIC8vIFdlIGVuY29kZSB0aGUgaWQgaW4gbXVsdGlwbGUgc3RlcHM6IGZpcnN0IHRoZSBiYXNlIGlkLCB0aGVuIHRoZVxuICAgIC8vIHJlbWFpbmluZyBkaWdpdHMuXG4gICAgLy9cbiAgICAvLyBFYWNoIDUgYml0IHNlcXVlbmNlIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGJhc2UgMzIgY2hhcmFjdGVyLiBTbyBmb3JcbiAgICAvLyBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBpZCBpcyAyMyBiaXRzIGxvbmcsIHdlIGNhbiBjb252ZXJ0IDIwIG9mIHRob3NlXG4gICAgLy8gYml0cyBpbnRvIGEgc3RyaW5nIG9mIDQgY2hhcmFjdGVycywgd2l0aCAzIGJpdHMgbGVmdCBvdmVyLlxuICAgIC8vXG4gICAgLy8gRmlyc3QgY2FsY3VsYXRlIGhvdyBtYW55IGJpdHMgaW4gdGhlIGJhc2UgaWQgcmVwcmVzZW50IGEgY29tcGxldGVcbiAgICAvLyBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLlxuICAgIHZhciBudW1iZXJPZk92ZXJmbG93Qml0cyA9IGJhc2VMZW5ndGggLSBiYXNlTGVuZ3RoICUgNTsgLy8gVGhlbiBjcmVhdGUgYSBiaXRtYXNrIHRoYXQgc2VsZWN0cyBvbmx5IHRob3NlIGJpdHMuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3dCaXRzID0gKDEgPDwgbnVtYmVyT2ZPdmVyZmxvd0JpdHMpIC0gMTsgLy8gU2VsZWN0IHRoZSBiaXRzLCBhbmQgY29udmVydCB0aGVtIHRvIGEgYmFzZSAzMiBzdHJpbmcuXG5cbiAgICB2YXIgbmV3T3ZlcmZsb3cgPSAoYmFzZUlkICYgbmV3T3ZlcmZsb3dCaXRzKS50b1N0cmluZygzMik7IC8vIE5vdyB3ZSBjYW4gcmVtb3ZlIHRob3NlIGJpdHMgZnJvbSB0aGUgYmFzZSBpZC5cblxuICAgIHZhciByZXN0T2ZCYXNlSWQgPSBiYXNlSWQgPj4gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7XG4gICAgdmFyIHJlc3RPZkJhc2VMZW5ndGggPSBiYXNlTGVuZ3RoIC0gbnVtYmVyT2ZPdmVyZmxvd0JpdHM7IC8vIEZpbmFsbHksIGVuY29kZSB0aGUgcmVzdCBvZiB0aGUgYml0cyB1c2luZyB0aGUgbm9ybWFsIGFsZ29yaXRobS4gQmVjYXVzZVxuICAgIC8vIHdlIG1hZGUgbW9yZSByb29tLCB0aGlzIHRpbWUgaXQgd29uJ3Qgb3ZlcmZsb3cuXG5cbiAgICB2YXIgcmVzdE9mTGVuZ3RoID0gZ2V0Qml0TGVuZ3RoKHRvdGFsQ2hpbGRyZW4pICsgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgcmVzdE9mTmV3Qml0cyA9IHNsb3QgPDwgcmVzdE9mQmFzZUxlbmd0aDtcbiAgICB2YXIgaWQgPSByZXN0T2ZOZXdCaXRzIHwgcmVzdE9mQmFzZUlkO1xuICAgIHZhciBvdmVyZmxvdyA9IG5ld092ZXJmbG93ICsgYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IHJlc3RPZkxlbmd0aCB8IGlkO1xuICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBvdmVyZmxvdztcbiAgfSBlbHNlIHtcbiAgICAvLyBOb3JtYWwgcGF0aFxuICAgIHZhciBuZXdCaXRzID0gc2xvdCA8PCBiYXNlTGVuZ3RoO1xuXG4gICAgdmFyIF9pZCA9IG5ld0JpdHMgfCBiYXNlSWQ7XG5cbiAgICB2YXIgX292ZXJmbG93ID0gYmFzZU92ZXJmbG93O1xuICAgIHRyZWVDb250ZXh0SWQgPSAxIDw8IGxlbmd0aCB8IF9pZDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gX292ZXJmbG93O1xuICB9XG59XG5mdW5jdGlvbiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpOyAvLyBUaGlzIGNvbXBvbmVudCBtYXRlcmlhbGl6ZWQgYW4gaWQuIFRoaXMgd2lsbCBhZmZlY3QgYW55IGlkcyB0aGF0IGFwcGVhclxuICAvLyBpbiBpdHMgY2hpbGRyZW4uXG5cbiAgdmFyIHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuXG4gIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBudW1iZXJPZkZvcmtzID0gMTtcbiAgICB2YXIgc2xvdEluZGV4ID0gMDtcbiAgICBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MpO1xuICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIG51bWJlck9mRm9ya3MsIHNsb3RJbmRleCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Qml0TGVuZ3RoKG51bWJlcikge1xuICByZXR1cm4gMzIgLSBjbHozMihudW1iZXIpO1xufVxuXG5mdW5jdGlvbiBnZXRMZWFkaW5nQml0KGlkKSB7XG4gIHJldHVybiAxIDw8IGdldEJpdExlbmd0aChpZCkgLSAxO1xufVxuXG5mdW5jdGlvbiBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBSZXN0b3JlIHRoZSBwcmV2aW91cyB2YWx1ZXMuXG4gIC8vIFRoaXMgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuIG90aGVyIGNvbnRleHQtbGlrZSBtb2R1bGVzIGluIEZpYmVyXG4gIC8vIGJlY2F1c2UgdGhlIHNhbWUgRmliZXIgbWF5IGFwcGVhciBvbiB0aGUgc3RhY2sgbXVsdGlwbGUgdGltZXMgYW5kIGZvclxuICAvLyBkaWZmZXJlbnQgcmVhc29ucy4gV2UgaGF2ZSB0byBrZWVwIHBvcHBpbmcgdW50aWwgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaXNcbiAgLy8gbm8gbG9uZ2VyIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVGb3JrUHJvdmlkZXIpIHtcbiAgICB0cmVlRm9ya1Byb3ZpZGVyID0gZm9ya1N0YWNrWy0tZm9ya1N0YWNrSW5kZXhdO1xuICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsO1xuICAgIHRyZWVGb3JrQ291bnQgPSBmb3JrU3RhY2tbLS1mb3JrU3RhY2tJbmRleF07XG4gICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4XSA9IG51bGw7XG4gIH1cblxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgPT09IHRyZWVDb250ZXh0UHJvdmlkZXIpIHtcbiAgICB0cmVlQ29udGV4dFByb3ZpZGVyID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dE92ZXJmbG93ID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgICB0cmVlQ29udGV4dElkID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF07XG4gICAgaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbDtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSB7XG4gIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuXG4gIGlmICh0cmVlQ29udGV4dFByb3ZpZGVyICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0cmVlQ29udGV4dElkLFxuICAgICAgb3ZlcmZsb3c6IHRyZWVDb250ZXh0T3ZlcmZsb3dcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbmRlZENvbnRleHQpIHtcbiAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gIGlkU3RhY2tbaWRTdGFja0luZGV4KytdID0gdHJlZUNvbnRleHRJZDtcbiAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gIHRyZWVDb250ZXh0SWQgPSBzdXNwZW5kZWRDb250ZXh0LmlkO1xuICB0cmVlQ29udGV4dE92ZXJmbG93ID0gc3VzcGVuZGVkQ29udGV4dC5vdmVyZmxvdztcbiAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RIeWRyYXRpbmcoKSB7XG4gIHtcbiAgICBpZiAoIWdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBiZSBoeWRyYXRpbmcuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlICcgKyAnYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTsgLy8gVGhpcyBmbGFnIGFsbG93cyBmb3Igd2FybmluZyBzdXByZXNzaW9uIHdoZW4gd2UgZXhwZWN0IHRoZXJlIHRvIGJlIG1pc21hdGNoZXNcbi8vIGR1ZSB0byBlYXJsaWVyIG1pc21hdGNoZXMgb3IgYSBzdXNwZW5kZWQgZmliZXIuXG5cbnZhciBkaWRTdXNwZW5kT3JFcnJvckRFViA9IGZhbHNlOyAvLyBIeWRyYXRpb24gZXJyb3JzIHRoYXQgd2VyZSB0aHJvd24gaW5zaWRlIHRoaXMgYm91bmRhcnlcblxudmFyIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5JZkh5ZHJhdGluZygpIHtcbiAge1xuICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgZXJyb3IoJ1dlIHNob3VsZCBub3QgYmUgaHlkcmF0aW5nIGhlcmUuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGEgYnVnLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpIHtcbiAge1xuICAgIGRpZFN1c3BlbmRPckVycm9yREVWID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnRlckh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgdmFyIHBhcmVudEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXRGaXJzdEh5ZHJhdGFibGVDaGlsZFdpdGhpbkNvbnRhaW5lcihwYXJlbnRJbnN0YW5jZSk7XG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gIGlzSHlkcmF0aW5nID0gdHJ1ZTtcbiAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlZW50ZXJIeWRyYXRpb25TdGF0ZUZyb21EZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlciwgc3VzcGVuc2VJbnN0YW5jZSwgdHJlZUNvbnRleHQpIHtcblxuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGRXaXRoaW5TdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG5cbiAgaWYgKHRyZWVDb250ZXh0ICE9PSBudWxsKSB7XG4gICAgcmVzdG9yZVN1c3BlbmRlZFRyZWVDb250ZXh0KGZpYmVyLCB0cmVlQ29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluQ29udGFpbmVyKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHJldHVybkZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkgZGlkTm90SHlkcmF0ZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQsIGluc3RhbmNlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHdhcm5Vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKTtcbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBbY2hpbGRUb0RlbGV0ZV07XG4gICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGlvbnMucHVzaChjaGlsZFRvRGVsZXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShyZXR1cm5GaWJlciwgZmliZXIpIHtcbiAge1xuICAgIGlmIChkaWRTdXNwZW5kT3JFcnJvckRFVikge1xuICAgICAgLy8gSW5zaWRlIGEgYm91bmRhcnkgdGhhdCBhbHJlYWR5IHN1c3BlbmRlZC4gV2UncmUgY3VycmVudGx5IHJlbmRlcmluZyB0aGVcbiAgICAgIC8vIHNpYmxpbmdzIG9mIGEgc3VzcGVuZGVkIG5vZGUuIFRoZSBtaXNtYXRjaCBtYXkgYmUgZHVlIHRvIHRoZSBtaXNzaW5nXG4gICAgICAvLyBkYXRhLCBzbyBpdCdzIHByb2JhYmx5IGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVJbnN0YW5jZVdpdGhpbkNvbnRhaW5lcihwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlV2l0aGluQ29udGFpbmVyKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3R5cGUgPSBmaWJlci50eXBlO1xuICAgICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSwgX3Byb3BzLCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgICAgIGlzQ29uY3VycmVudE1vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2lzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gICAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdGV4dCwgLy8gVE9ETzogRGVsZXRlIHRoaXMgYXJndW1lbnQgd2hlbiB3ZSByZW1vdmUgdGhlIGxlZ2FjeSByb290IEFQSS5cbiAgICAgICAgICAgICAgICBfaXNDb25jdXJyZW50TW9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSByZXR1cm5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBfcGFyZW50SW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICAgICAgaWYgKF9wYXJlbnRJbnN0YW5jZSAhPT0gbnVsbCkgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgICAgdmFyIF90eXBlMiA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlV2l0aGluU3VzcGVuc2VJbnN0YW5jZShfcGFyZW50SW5zdGFuY2UsIF90eXBlMik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQyID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICAgICAgICBkaWROb3RGaW5kSHlkcmF0YWJsZVRleHRJbnN0YW5jZVdpdGhpblN1c3BlbnNlSW5zdGFuY2UoX3BhcmVudEluc3RhbmNlLCBfdGV4dDIpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcbiAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UocmV0dXJuRmliZXIsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSB7XG4gIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIGluc3RhbmNlID0gY2FuSHlkcmF0ZUluc3RhbmNlKG5leHRJbnN0YW5jZSwgdHlwZSk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgZmliZXIuc3RhdGVOb2RlID0gaW5zdGFuY2U7XG4gICAgICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgIHZhciB0ZXh0SW5zdGFuY2UgPSBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKG5leHRJbnN0YW5jZSwgdGV4dCk7XG5cbiAgICAgICAgaWYgKHRleHRJbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IHRleHRJbnN0YW5jZTtcbiAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyOyAvLyBUZXh0IEluc3RhbmNlcyBkb24ndCBoYXZlIGNoaWxkcmVuIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBoeWRyYXRlLlxuXG4gICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IGNhbkh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKG5leHRJbnN0YW5jZSk7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgc3VzcGVuc2VTdGF0ZSA9IHtcbiAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHN1c3BlbnNlSW5zdGFuY2UsXG4gICAgICAgICAgICB0cmVlQ29udGV4dDogZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSxcbiAgICAgICAgICAgIHJldHJ5TGFuZTogT2Zmc2NyZWVuTGFuZVxuICAgICAgICAgIH07XG4gICAgICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IHN1c3BlbnNlU3RhdGU7IC8vIFN0b3JlIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50IGFzIGEgY2hpbGQgZmliZXIuXG4gICAgICAgICAgLy8gVGhpcyBzaW1wbGlmaWVzIHRoZSBjb2RlIGZvciBnZXRIb3N0U2libGluZyBhbmQgZGVsZXRpbmcgbm9kZXMsXG4gICAgICAgICAgLy8gc2luY2UgaXQgZG9lc24ndCBoYXZlIHRvIGNvbnNpZGVyIGFsbCBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXkncmUgZGVoeWRyYXRlZCBvbmVzIG9yIG5vdC5cblxuICAgICAgICAgIHZhciBkZWh5ZHJhdGVkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgICAgZGVoeWRyYXRlZEZyYWdtZW50LnJldHVybiA9IGZpYmVyO1xuICAgICAgICAgIGZpYmVyLmNoaWxkID0gZGVoeWRyYXRlZEZyYWdtZW50O1xuICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7IC8vIFdoaWxlIGEgU3VzcGVuc2UgSW5zdGFuY2UgZG9lcyBoYXZlIGNoaWxkcmVuLCB3ZSB3b24ndCBzdGVwIGludG9cbiAgICAgICAgICAvLyBpdCBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIEluc3RlYWQsIHdlJ2xsIHJlZW50ZXIgaXQgbGF0ZXIuXG5cbiAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikge1xuICByZXR1cm4gKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSAmJiAoZmliZXIuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncztcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGZpYmVyKSB7XG4gIHRocm93IG5ldyBFcnJvcignSHlkcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBpbml0aWFsIFVJIGRvZXMgbm90IG1hdGNoIHdoYXQgd2FzICcgKyAncmVuZGVyZWQgb24gdGhlIHNlcnZlci4nKTtcbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgaWYgKHNob3VsZENsaWVudFJlbmRlck9uTWlzbWF0Y2goZmliZXIpKSB7XG4gICAgICB3YXJuTm9uaHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKCk7XG4gICAgfSAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuXG5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIGlmIChzaG91bGRDbGllbnRSZW5kZXJPbk1pc21hdGNoKGZpYmVyKSkge1xuICAgICAgd2Fybk5vbmh5ZHJhdGVkSW5zdGFuY2UoaHlkcmF0aW9uUGFyZW50RmliZXIsIGZpYmVyKTtcbiAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgIH0gLy8gSWYgd2UgY2FuJ3QgaHlkcmF0ZSB0aGlzIGluc3RhbmNlIGxldCdzIHRyeSB0aGUgbmV4dCBvbmUuXG4gICAgLy8gV2UgdXNlIHRoaXMgYXMgYSBoZXVyaXN0aWMuIEl0J3MgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBub3QgZGF0YSBzbyBpdFxuICAgIC8vIG1pZ2h0IGJlIGZsYXdlZCBvciB1bm5lY2Vzc2FyeS5cblxuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuICAgIHZhciBwcmV2SHlkcmF0aW9uUGFyZW50RmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgIGlmICghbmV4dEluc3RhbmNlIHx8ICF0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpKSB7XG4gICAgICAvLyBOb3RoaW5nIHRvIGh5ZHJhdGUuIE1ha2UgaXQgYW4gaW5zZXJ0aW9uLlxuICAgICAgaW5zZXJ0Tm9uSHlkcmF0ZWRJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmliZXIpO1xuICAgICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXI7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBXZSBtYXRjaGVkIHRoZSBuZXh0IG9uZSwgd2UnbGwgbm93IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBvbmUgd2FzXG4gICAgLy8gc3VwZXJmbHVvdXMgYW5kIHdlJ2xsIGRlbGV0ZSBpdC4gU2luY2Ugd2UgY2FuJ3QgZWFnZXJseSBkZWxldGUgaXRcbiAgICAvLyB3ZSdsbCBoYXZlIHRvIHNjaGVkdWxlIGEgZGVsZXRpb24uIFRvIGRvIHRoYXQsIHRoaXMgbm9kZSBuZWVkcyBhIGR1bW15XG4gICAgLy8gZmliZXIgYXNzb2NpYXRlZCB3aXRoIGl0LlxuXG5cbiAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocHJldkh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaXJzdEF0dGVtcHRlZEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG5cbiAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYgPSAhZGlkU3VzcGVuZE9yRXJyb3JERVY7XG4gIHZhciB1cGRhdGVQYXlsb2FkID0gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCBmaWJlci50eXBlLCBmaWJlci5tZW1vaXplZFByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0LCBmaWJlciwgc2hvdWxkV2FybklmTWlzbWF0Y2hEZXYpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICBmaWJlci51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAvLyBpcyBhIG5ldyByZWYgd2UgbWFyayB0aGlzIGFzIGFuIHVwZGF0ZS5cblxuICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciB0ZXh0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gIHZhciB0ZXh0Q29udGVudCA9IGZpYmVyLm1lbW9pemVkUHJvcHM7XG4gIHZhciBzaG91bGRVcGRhdGUgPSBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIGZpYmVyKTtcblxuICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UgaXMgY2FsbGVkIGluIGEgY29udGV4dCB3aGVyZSB0aGVcbiAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgdmFyIHJldHVybkZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXI7XG5cbiAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgdmFyIGlzQ29uY3VycmVudE1vZGUgPSAocmV0dXJuRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQsIC8vIFRPRE86IERlbGV0ZSB0aGlzIGFyZ3VtZW50IHdoZW4gd2UgcmVtb3ZlIHRoZSBsZWdhY3kgcm9vdCBBUEkuXG4gICAgICAgICAgICBpc0NvbmN1cnJlbnRNb2RlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBhcmVudFR5cGUgPSByZXR1cm5GaWJlci50eXBlO1xuICAgICAgICAgICAgdmFyIHBhcmVudFByb3BzID0gcmV0dXJuRmliZXIubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdmFyIF9pc0NvbmN1cnJlbnRNb2RlMiA9IChyZXR1cm5GaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGU7XG5cbiAgICAgICAgICAgIGRpZE5vdE1hdGNoSHlkcmF0ZWRUZXh0SW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCB0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCAvLyBUT0RPOiBEZWxldGUgdGhpcyBhcmd1bWVudCB3aGVuIHdlIHJlbW92ZSB0aGUgbGVnYWN5IHJvb3QgQVBJLlxuICAgICAgICAgICAgX2lzQ29uY3VycmVudE1vZGUyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuICcgKyAnVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIGh5ZHJhdGVTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gc2tpcFBhc3REZWh5ZHJhdGVkU3VzcGVuc2VJbnN0YW5jZShmaWJlcikge1xuXG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBzdXNwZW5zZVN0YXRlICE9PSBudWxsID8gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkIDogbnVsbDtcblxuICBpZiAoIXN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGhhdmUgYSBoeWRyYXRlZCBzdXNwZW5zZSBpbnN0YW5jZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB3ZSBoYXZlIGFueSByZW1haW5pbmcgaHlkcmF0YWJsZSBub2Rlcywgd2UgbmVlZCB0byBkZWxldGUgdGhlbSBub3cuXG4gIC8vIFdlIG9ubHkgZG8gdGhpcyBkZWVwZXIgdGhhbiBoZWFkIGFuZCBib2R5IHNpbmNlIHRoZXkgdGVuZCB0byBoYXZlIHJhbmRvbVxuICAvLyBvdGhlciBub2RlcyBpbiB0aGVtLiBXZSBhbHNvIGlnbm9yZSBjb21wb25lbnRzIHdpdGggcHVyZSB0ZXh0IGNvbnRlbnQgaW5cbiAgLy8gc2lkZSBvZiB0aGVtLiBXZSBhbHNvIGRvbid0IGRlbGV0ZSBhbnl0aGluZyBpbnNpZGUgdGhlIHJvb3QgY29udGFpbmVyLlxuXG5cbiAgaWYgKGZpYmVyLnRhZyAhPT0gSG9zdFJvb3QgJiYgKGZpYmVyLnRhZyAhPT0gSG9zdENvbXBvbmVudCB8fCBzaG91bGREZWxldGVVbmh5ZHJhdGVkVGFpbEluc3RhbmNlcyhmaWJlci50eXBlKSAmJiAhc2hvdWxkU2V0VGV4dENvbnRlbnQoZmliZXIudHlwZSwgZmliZXIubWVtb2l6ZWRQcm9wcykpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICBpZiAobmV4dEluc3RhbmNlKSB7XG4gICAgICBpZiAoc2hvdWxkQ2xpZW50UmVuZGVyT25NaXNtYXRjaChmaWJlcikpIHtcbiAgICAgICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcik7XG4gICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKG5leHRJbnN0YW5jZSkge1xuICAgICAgICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICAgICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpO1xuXG4gIGlmIChmaWJlci50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpO1xuICB9IGVsc2Uge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBoeWRyYXRpb25QYXJlbnRGaWJlciA/IGdldE5leHRIeWRyYXRhYmxlU2libGluZyhmaWJlci5zdGF0ZU5vZGUpIDogbnVsbDtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBoYXNVbmh5ZHJhdGVkVGFpbE5vZGVzKCkge1xuICByZXR1cm4gaXNIeWRyYXRpbmcgJiYgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVW5oeWRyYXRlZFRhaWxOb2RlcyhmaWJlcikge1xuICB2YXIgbmV4dEluc3RhbmNlID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZTtcblxuICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgd2FyblVuaHlkcmF0ZWRJbnN0YW5jZShmaWJlciwgbmV4dEluc3RhbmNlKTtcbiAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuXG4gIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbiAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG4gIGlzSHlkcmF0aW5nID0gZmFsc2U7XG4gIGRpZFN1c3BlbmRPckVycm9yREVWID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCkge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLiBUaGUgZXJyb3JzIHRoYXQgb2NjdXJyZWRcbiAgICAvLyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBhdHRlbXB0IGFyZSBub3cgcmVjb3ZlcmVkLiBXZSB3aWxsIGxvZyB0aGVtIGluXG4gICAgLy8gY29tbWl0IHBoYXNlLCBvbmNlIHRoZSBlbnRpcmUgdHJlZSBoYXMgZmluaXNoZWQuXG4gICAgcXVldWVSZWNvdmVyYWJsZUVycm9ycyhoeWRyYXRpb25FcnJvcnMpO1xuICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNIeWRyYXRpbmcoKSB7XG4gIHJldHVybiBpc0h5ZHJhdGluZztcbn1cblxuZnVuY3Rpb24gcXVldWVIeWRyYXRpb25FcnJvcihlcnJvcikge1xuICBpZiAoaHlkcmF0aW9uRXJyb3JzID09PSBudWxsKSB7XG4gICAgaHlkcmF0aW9uRXJyb3JzID0gW2Vycm9yXTtcbiAgfSBlbHNlIHtcbiAgICBoeWRyYXRpb25FcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5BYm91dE1hcHM7XG52YXIgZGlkV2FybkFib3V0R2VuZXJhdG9ycztcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xudmFyIG93bmVySGFzS2V5VXNlV2FybmluZztcbnZhciBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmc7XG5cbnZhciB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHt9O1xuXG57XG4gIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG4gIC8qKlxuICAgKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gICAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICAgKiB1cGRhdGVzLlxuICAgKi9cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcbiAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nID0ge307XG5cbiAgd2FybkZvck1pc3NpbmdLZXkgPSBmdW5jdGlvbiAoY2hpbGQsIHJldHVybkZpYmVyKSB7XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWNoaWxkLl9zdG9yZSB8fCBjaGlsZC5fc3RvcmUudmFsaWRhdGVkIHx8IGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjaGlsZC5fc3RvcmUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IENvbXBvbmVudCBpbiB3YXJuRm9yTWlzc2luZ0tleSBzaG91bGQgaGF2ZSBhIF9zdG9yZS4gJyArICdUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSAnICsgJ1wia2V5XCIgcHJvcC4gU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yICcgKyAnbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KSB7XG4gIHZhciBtaXhlZFJlZiA9IGVsZW1lbnQucmVmO1xuXG4gIGlmIChtaXhlZFJlZiAhPT0gbnVsbCAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1peGVkUmVmICE9PSAnb2JqZWN0Jykge1xuICAgIHtcbiAgICAgIC8vIFRPRE86IENsZWFuIHRoaXMgdXAgb25jZSB3ZSB0dXJuIG9uIHRoZSBzdHJpbmcgcmVmIHdhcm5pbmcgZm9yXG4gICAgICAvLyBldmVyeW9uZSwgYmVjYXVzZSB0aGUgc3RyaWN0IG1vZGUgY2FzZSB3aWxsIG5vIGxvbmdlciBiZSByZWxldmFudFxuICAgICAgaWYgKChyZXR1cm5GaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSB8fCB3YXJuQWJvdXRTdHJpbmdSZWZzKSAmJiAvLyBXZSB3YXJuIGluIFJlYWN0RWxlbWVudC5qcyBpZiBvd25lciBhbmQgc2VsZiBhcmUgZXF1YWwgZm9yIHN0cmluZyByZWZzXG4gICAgICAvLyBiZWNhdXNlIHRoZXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvblxuICAgICAgLy8gdXNpbmcgYSBjb2RlbW9kLiBUaGVyZWZvcmUsIHdlIGRvbid0IGhhdmUgdG8gd2FybiBhYm91dCBzdHJpbmcgcmVmcyBhZ2Fpbi5cbiAgICAgICEoZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fc2VsZiAmJiBlbGVtZW50Ll9vd25lci5zdGF0ZU5vZGUgIT09IGVsZW1lbnQuX3NlbGYpKSB7XG4gICAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3IoJ0Egc3RyaW5nIHJlZiwgXCIlc1wiLCBoYXMgYmVlbiBmb3VuZCB3aXRoaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1N0cmluZyByZWZzIGFyZSBhIHNvdXJjZSBvZiBwb3RlbnRpYWwgYnVncyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuICcgKyAnV2UgcmVjb21tZW5kIHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgbWl4ZWRSZWYpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuX293bmVyKSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBpbnN0O1xuXG4gICAgICBpZiAob3duZXIpIHtcbiAgICAgICAgdmFyIG93bmVyRmliZXIgPSBvd25lcjtcblxuICAgICAgICBpZiAob3duZXJGaWJlci50YWcgIT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBoYXZlIHN0cmluZyByZWZzLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5zdCA9IG93bmVyRmliZXIuc3RhdGVOb2RlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiBcIiArIG1peGVkUmVmICsgXCIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIFwiICsgJ2J1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9IC8vIEFzc2lnbmluZyB0aGlzIHRvIGEgY29uc3Qgc28gRmxvdyBrbm93cyBpdCB3b24ndCBjaGFuZ2UgaW4gdGhlIGNsb3N1cmVcblxuXG4gICAgICB2YXIgcmVzb2x2ZWRJbnN0ID0gaW5zdDtcblxuICAgICAge1xuICAgICAgICBjaGVja1Byb3BTdHJpbmdDb2VyY2lvbihtaXhlZFJlZiwgJ3JlZicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVmO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gcmVzb2x2ZWRJbnN0LnJlZnM7XG5cbiAgICAgICAgaWYgKHJlZnMgPT09IGVtcHR5UmVmc09iamVjdCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBsYXp5IHBvb2xlZCBmcm96ZW4gb2JqZWN0LCBzbyB3ZSBuZWVkIHRvIGluaXRpYWxpemUuXG4gICAgICAgICAgcmVmcyA9IHJlc29sdmVkSW5zdC5yZWZzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBkZWxldGUgcmVmc1tzdHJpbmdSZWZdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZnNbc3RyaW5nUmVmXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZWYuX3N0cmluZ1JlZiA9IHN0cmluZ1JlZjtcbiAgICAgIHJldHVybiByZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgbWl4ZWRSZWYgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVmIHRvIGJlIGEgZnVuY3Rpb24sIGEgc3RyaW5nLCBhbiBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlUmVmKCksIG9yIG51bGwuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudC5fb3duZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoXCIgKyBtaXhlZFJlZiArIFwiKSBidXQgbm8gb3duZXIgd2FzIHNldC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZlwiICsgJyB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuJyArICcxLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGZ1bmN0aW9uIGNvbXBvbmVudFxcbicgKyBcIjIuIFlvdSBtYXkgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudCdzIHJlbmRlciBtZXRob2RcXG5cIiArICczLiBZb3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlZnMtbXVzdC1oYXZlLW93bmVyIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICB2YXIgY2hpbGRTdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3Q2hpbGQpO1xuICB0aHJvdyBuZXcgRXJyb3IoXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMobmV3Q2hpbGQpLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZFN0cmluZykgKyBcIikuIFwiICsgJ0lmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkLicpO1xufVxuXG5mdW5jdGlvbiB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICBpZiAob3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3duZXJIYXNGdW5jdGlvblR5cGVXYXJuaW5nW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdGdW5jdGlvbnMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLiBUaGlzIG1heSBoYXBwZW4gaWYgJyArICd5b3UgcmV0dXJuIGEgQ29tcG9uZW50IGluc3RlYWQgb2YgPENvbXBvbmVudCAvPiBmcm9tIHJlbmRlci4gJyArICdPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTGF6eShsYXp5VHlwZSkge1xuICB2YXIgcGF5bG9hZCA9IGxhenlUeXBlLl9wYXlsb2FkO1xuICB2YXIgaW5pdCA9IGxhenlUeXBlLl9pbml0O1xuICByZXR1cm4gaW5pdChwYXlsb2FkKTtcbn0gLy8gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGV4aXN0cyBiZWNhdXNlIEkgZXhwZWN0IHRvIGNsb25lIHRoZSBjb2RlIGluIGVhY2ggcGF0aFxuLy8gdG8gYmUgYWJsZSB0byBvcHRpbWl6ZSBlYWNoIHBhdGggaW5kaXZpZHVhbGx5IGJ5IGJyYW5jaGluZyBlYXJseS4gVGhpcyBuZWVkc1xuLy8gYSBjb21waWxlciBvciB3ZSBjYW4gZG8gaXQgbWFudWFsbHkuIEhlbHBlcnMgdGhhdCBkb24ndCBuZWVkIHRoaXMgYnJhbmNoaW5nXG4vLyBsaXZlIG91dHNpZGUgb2YgdGhpcyBmdW5jdGlvbi5cblxuXG5mdW5jdGlvbiBDaGlsZFJlY29uY2lsZXIoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICBmdW5jdGlvbiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGRUb0RlbGV0ZSkge1xuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2NoaWxkVG9EZWxldGVdO1xuICAgICAgcmV0dXJuRmliZXIuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY2hpbGRUb0RlbGV0ZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuXG5cbiAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGlsZHJlbiB0byBhIHRlbXBvcmFyeSBtYXAgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGVtIGJ5XG4gICAgLy8ga2V5cyBxdWlja2x5LiBJbXBsaWNpdCAobnVsbCkga2V5cyBnZXQgYWRkZWQgdG8gdGhpcyBzZXQgd2l0aCB0aGVpciBpbmRleFxuICAgIC8vIGluc3RlYWQuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdmFyIGV4aXN0aW5nQ2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChleGlzdGluZ0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBpZiAoZXhpc3RpbmdDaGlsZC5rZXkgIT09IG51bGwpIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5rZXksIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5pbmRleCwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gIH1cblxuICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgLy8gV2UgY3VycmVudGx5IHNldCBzaWJsaW5nIHRvIG51bGwgYW5kIGluZGV4IHRvIDAgaGVyZSBiZWNhdXNlIGl0IGlzIGVhc3lcbiAgICAvLyB0byBmb3JnZXQgdG8gZG8gYmVmb3JlIHJldHVybmluZyBpdC4gRS5nLiBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLlxuICAgIHZhciBjbG9uZSA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGZpYmVyLCBwZW5kaW5nUHJvcHMpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcblxuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gRHVyaW5nIGh5ZHJhdGlvbiwgdGhlIHVzZUlkIGFsZ29yaXRobSBuZWVkcyB0byBrbm93IHdoaWNoIGZpYmVycyBhcmVcbiAgICAgIC8vIHBhcnQgb2YgYSBsaXN0IG9mIGNoaWxkcmVuIChhcnJheXMsIGl0ZXJhdG9ycykuXG4gICAgICBuZXdGaWJlci5mbGFncyB8PSBGb3JrZWQ7XG4gICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50ID0gbmV3RmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIHZhciBvbGRJbmRleCA9IGN1cnJlbnQuaW5kZXg7XG5cbiAgICAgIGlmIChvbGRJbmRleCA8IGxhc3RQbGFjZWRJbmRleCkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgbW92ZS5cbiAgICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gbGFzdFBsYWNlZEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpdGVtIGNhbiBzdGF5IGluIHBsYWNlLlxuICAgICAgICByZXR1cm4gb2xkSW5kZXg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uLlxuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGaWJlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50LCB0ZXh0Q29udGVudCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFRleHQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCwgbGFuZXMpIHtcbiAgICB2YXIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHtcbiAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbiwgbGFuZXMsIGVsZW1lbnQua2V5KTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGN1cnJlbnQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGN1cnJlbnQsIGVsZW1lbnQpICkgfHwgLy8gTGF6eSB0eXBlcyBzaG91bGQgcmVjb25jaWxlIHRoZWlyIHJlc29sdmVkIHR5cGUuXG4gICAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIEhvdCBSZWxvYWRpbmcgY2hlY2sgYWJvdmUsXG4gICAgICAvLyBiZWNhdXNlIGhvdCByZWxvYWRpbmcgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiBwcm9kIGJlY2F1c2VcbiAgICAgIC8vIGl0IGRvZXNuJ3QgcmVzdXNwZW5kLiBTbyB3ZSBjYW4ndCBsZXQgdGhlIGNhbGwgYmVsb3cgc3VzcGVuZC5cbiAgICAgIHR5cGVvZiBlbGVtZW50VHlwZSA9PT0gJ29iamVjdCcgJiYgZWxlbWVudFR5cGUgIT09IG51bGwgJiYgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJiByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGN1cnJlbnQudHlwZSkge1xuICAgICAgICAvLyBNb3ZlIGJhc2VkIG9uIGluZGV4XG4gICAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIGVsZW1lbnQucHJvcHMpO1xuICAgICAgICBleGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICB7XG4gICAgICAgICAgZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgICB9XG4gICAgfSAvLyBJbnNlcnRcblxuXG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJlZiA9IGNvZXJjZVJlZihyZXR1cm5GaWJlciwgY3VycmVudCwgZWxlbWVudCk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudCwgcG9ydGFsLCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0UG9ydGFsIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gIT09IHBvcnRhbC5jb250YWluZXJJbmZvIHx8IGN1cnJlbnQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uICE9PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgIGV4aXN0aW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBmcmFnbWVudCwgbGFuZXMsIGtleSkge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBGcmFnbWVudCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZyYWdtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywga2V5KTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBmcmFnbWVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCgnJyArIG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZDIgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSBuZXdDaGlsZC5fcGF5bG9hZDtcbiAgICAgICAgICAgIHZhciBpbml0ID0gbmV3Q2hpbGQuX2luaXQ7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIGluaXQocGF5bG9hZCksIGxhbmVzKTtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICB2YXIgX2NyZWF0ZWQzID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzLCBudWxsKTtcblxuICAgICAgICBfY3JlYXRlZDMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgIHJldHVybiBfY3JlYXRlZDM7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAvLyBVcGRhdGUgdGhlIGZpYmVyIGlmIHRoZSBrZXlzIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuXG4gICAgdmFyIGtleSA9IG9sZEZpYmVyICE9PSBudWxsID8gb2xkRmliZXIua2V5IDogbnVsbDtcblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnICYmIG5ld0NoaWxkICE9PSAnJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cy4gSWYgdGhlIHByZXZpb3VzIG5vZGUgaXMgaW1wbGljaXRseSBrZXllZFxuICAgICAgLy8gd2UgY2FuIGNvbnRpbnVlIHRvIHJlcGxhY2UgaXQgd2l0aG91dCBhYm9ydGluZyBldmVuIGlmIGl0IGlzIG5vdCBhIHRleHRcbiAgICAgIC8vIG5vZGUuXG4gICAgICBpZiAoa2V5ICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG9sZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGF5bG9hZCA9IG5ld0NoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIGlmIChrZXkgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgJiYgbmV3Q2hpbGQgIT09ICcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLCBzbyB3ZSBuZWl0aGVyIGhhdmUgdG8gY2hlY2sgdGhlIG9sZCBub3JcbiAgICAgIC8vIG5ldyBub2RlIGZvciB0aGUga2V5LiBJZiBib3RoIGFyZSB0ZXh0IG5vZGVzLCB0aGV5IG1hdGNoLlxuICAgICAgdmFyIG1hdGNoZWRGaWJlciA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbDtcbiAgICAgIHJldHVybiB1cGRhdGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgbWF0Y2hlZEZpYmVyLCAnJyArIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdDaGlsZC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXkpIHx8IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyMiA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0NoaWxkLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleSkgfHwgbnVsbDtcblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBpbml0KHBheWxvYWQpLCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5KG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICB2YXIgX21hdGNoZWRGaWJlcjMgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMywgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBXYXJucyBpZiB0aGVyZSBpcyBhIGR1cGxpY2F0ZSBvciBtaXNzaW5nIGtleVxuICAgKi9cblxuXG4gIGZ1bmN0aW9uIHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JyB8fCBjaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ga25vd25LZXlzO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGNoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHdhcm5Gb3JNaXNzaW5nS2V5KGNoaWxkLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgdmFyIGtleSA9IGNoaWxkLmtleTtcblxuICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtub3duS2V5cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAga25vd25LZXlzID0gbmV3IFNldCgpO1xuICAgICAgICAgICAga25vd25LZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFrbm93bktleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yKCdFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksIGAlc2AuICcgKyAnS2V5cyBzaG91bGQgYmUgdW5pcXVlIHNvIHRoYXQgY29tcG9uZW50cyBtYWludGFpbiB0aGVpciBpZGVudGl0eSAnICsgJ2Fjcm9zcyB1cGRhdGVzLiBOb24tdW5pcXVlIGtleXMgbWF5IGNhdXNlIGNoaWxkcmVuIHRvIGJlICcgKyAnZHVwbGljYXRlZCBhbmQvb3Igb21pdHRlZCBcdTIwMTQgdGhlIGJlaGF2aW9yIGlzIHVuc3VwcG9ydGVkIGFuZCAnICsgJ2NvdWxkIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicsIGtleSk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGNoaWxkLl9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gY2hpbGQuX2luaXQ7XG4gICAgICAgICAgd2Fybk9uSW52YWxpZEtleShpbml0KHBheWxvYWQpLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ga25vd25LZXlzO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuLCBsYW5lcykge1xuICAgIC8vIFRoaXMgYWxnb3JpdGhtIGNhbid0IG9wdGltaXplIGJ5IHNlYXJjaGluZyBmcm9tIGJvdGggZW5kcyBzaW5jZSB3ZVxuICAgIC8vIGRvbid0IGhhdmUgYmFja3BvaW50ZXJzIG9uIGZpYmVycy4gSSdtIHRyeWluZyB0byBzZWUgaG93IGZhciB3ZSBjYW4gZ2V0XG4gICAgLy8gd2l0aCB0aGF0IG1vZGVsLiBJZiBpdCBlbmRzIHVwIG5vdCBiZWluZyB3b3J0aCB0aGUgdHJhZGVvZmZzLCB3ZSBjYW5cbiAgICAvLyBhZGQgaXQgbGF0ZXIuXG4gICAgLy8gRXZlbiB3aXRoIGEgdHdvIGVuZGVkIG9wdGltaXphdGlvbiwgd2UnZCB3YW50IHRvIG9wdGltaXplIGZvciB0aGUgY2FzZVxuICAgIC8vIHdoZXJlIHRoZXJlIGFyZSBmZXcgY2hhbmdlcyBhbmQgYnJ1dGUgZm9yY2UgdGhlIGNvbXBhcmlzb24gaW5zdGVhZCBvZlxuICAgIC8vIGdvaW5nIGZvciB0aGUgTWFwLiBJdCdkIGxpa2UgdG8gZXhwbG9yZSBoaXR0aW5nIHRoYXQgcGF0aCBmaXJzdCBpblxuICAgIC8vIGZvcndhcmQtb25seSBtb2RlIGFuZCBvbmx5IGdvIGZvciB0aGUgTWFwIG9uY2Ugd2Ugbm90aWNlIHRoYXQgd2UgbmVlZFxuICAgIC8vIGxvdHMgb2YgbG9vayBhaGVhZC4gVGhpcyBkb2Vzbid0IGhhbmRsZSByZXZlcnNhbCBhcyB3ZWxsIGFzIHR3byBlbmRlZFxuICAgIC8vIHNlYXJjaCBidXQgdGhhdCdzIHVudXN1YWwuIEJlc2lkZXMsIGZvciB0aGUgdHdvIGVuZGVkIG9wdGltaXphdGlvbiB0b1xuICAgIC8vIHdvcmsgb24gSXRlcmFibGVzLCB3ZSdkIG5lZWQgdG8gY29weSB0aGUgd2hvbGUgc2V0LlxuICAgIC8vIEluIHRoaXMgZmlyc3QgaXRlcmF0aW9uLCB3ZSdsbCBqdXN0IGxpdmUgd2l0aCBoaXR0aW5nIHRoZSBiYWQgY2FzZVxuICAgIC8vIChhZGRpbmcgZXZlcnl0aGluZyB0byBhIE1hcCkgaW4gZm9yIGV2ZXJ5IGluc2VydC9tb3ZlLlxuICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBjb2RlLCBhbHNvIHVwZGF0ZSByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKCkgd2hpY2hcbiAgICAvLyB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobS5cbiAgICB7XG4gICAgICAvLyBGaXJzdCwgdmFsaWRhdGUga2V5cy5cbiAgICAgIHZhciBrbm93bktleXMgPSBudWxsO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5ld0NoaWxkcmVuW2ldO1xuICAgICAgICBrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG51bGw7XG4gICAgdmFyIHByZXZpb3VzTmV3RmliZXIgPSBudWxsO1xuICAgIHZhciBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkO1xuICAgIHZhciBsYXN0UGxhY2VkSW5kZXggPSAwO1xuICAgIHZhciBuZXdJZHggPSAwO1xuICAgIHZhciBuZXh0T2xkRmliZXIgPSBudWxsO1xuXG4gICAgZm9yICg7IG9sZEZpYmVyICE9PSBudWxsICYmIG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIGlmIChvbGRGaWJlci5pbmRleCA+IG5ld0lkeCkge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlcjtcbiAgICAgICAgb2xkRmliZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgaWYgKG5ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgYnJlYWtzIG9uIGVtcHR5IHNsb3RzIGxpa2UgbnVsbCBjaGlsZHJlbi4gVGhhdCdzXG4gICAgICAgIC8vIHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNsb3cgcGF0aCBhbGwgdGhlIHRpbWUuIFdlIG5lZWRcbiAgICAgICAgLy8gYSBiZXR0ZXIgd2F5IHRvIGNvbW11bmljYXRlIHdoZXRoZXIgdGhpcyB3YXMgYSBtaXNzIG9yIG51bGwsXG4gICAgICAgIC8vIGJvb2xlYW4sIHVuZGVmaW5lZCwgZXRjLlxuICAgICAgICBpZiAob2xkRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICBpZiAob2xkRmliZXIgJiYgbmV3RmliZXIuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgbWF0Y2hlZCB0aGUgc2xvdCwgYnV0IHdlIGRpZG4ndCByZXVzZSB0aGUgZXhpc3RpbmcgZmliZXIsIHNvIHdlXG4gICAgICAgICAgLy8gbmVlZCB0byBkZWxldGUgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBvbGRGaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChuZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBNb3ZlIG91dCBvZiB0aGUgbG9vcC4gVGhpcyBvbmx5IGhhcHBlbnMgZm9yIHRoZSBmaXJzdCBydW4uXG4gICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IERlZmVyIHNpYmxpbmdzIGlmIHdlJ3JlIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXggZm9yIHRoaXMgc2xvdC5cbiAgICAgICAgLy8gSS5lLiBpZiB3ZSBoYWQgbnVsbCB2YWx1ZXMgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gZGVmZXIgdGhpc1xuICAgICAgICAvLyBmb3IgZWFjaCBudWxsIHZhbHVlLiBIb3dldmVyLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gY2FsbCB1cGRhdGVTbG90XG4gICAgICAgIC8vIHdpdGggdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgIH1cblxuICAgIGlmIChuZXdJZHggPT09IG5ld0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBudW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgICB2YXIgX25ld0ZpYmVyID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgICBpZiAoX25ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlciwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGdldElzSHlkcmF0aW5nKCkpIHtcbiAgICAgICAgdmFyIF9udW1iZXJPZkZvcmtzID0gbmV3SWR4O1xuICAgICAgICBwdXNoVHJlZUZvcmsocmV0dXJuRmliZXIsIF9udW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfSAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cblxuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOyAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG5cbiAgICBmb3IgKDsgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBuZXdJZHgrKykge1xuICAgICAgdmFyIF9uZXdGaWJlcjIgPSB1cGRhdGVGcm9tTWFwKGV4aXN0aW5nQ2hpbGRyZW4sIHJldHVybkZpYmVyLCBuZXdJZHgsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKTtcblxuICAgICAgaWYgKF9uZXdGaWJlcjIgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICBpZiAoX25ld0ZpYmVyMi5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuZXcgZmliZXIgaXMgYSB3b3JrIGluIHByb2dyZXNzLCBidXQgaWYgdGhlcmUgZXhpc3RzIGFcbiAgICAgICAgICAgIC8vIGN1cnJlbnQsIHRoYXQgbWVhbnMgdGhhdCB3ZSByZXVzZWQgdGhlIGZpYmVyLiBXZSBuZWVkIHRvIGRlbGV0ZVxuICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgY2hpbGQgbGlzdCBzbyB0aGF0IHdlIGRvbid0IGFkZCBpdCB0byB0aGUgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIGxpc3QuXG4gICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLmRlbGV0ZShfbmV3RmliZXIyLmtleSA9PT0gbnVsbCA/IG5ld0lkeCA6IF9uZXdGaWJlcjIua2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBfbmV3RmliZXIyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjI7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gX25ld0ZpYmVyMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gQW55IGV4aXN0aW5nIGNoaWxkcmVuIHRoYXQgd2VyZW4ndCBjb25zdW1lZCBhYm92ZSB3ZXJlIGRlbGV0ZWQuIFdlIG5lZWRcbiAgICAgIC8vIHRvIGFkZCB0aGVtIHRvIHRoZSBkZWxldGlvbiBsaXN0LlxuICAgICAgZXhpc3RpbmdDaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICB2YXIgX251bWJlck9mRm9ya3MyID0gbmV3SWR4O1xuICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBfbnVtYmVyT2ZGb3JrczIpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkcmVuSXRlcmFibGUsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyByZWNvbmNpbGVDaGlsZHJlbkFycmF5KCksXG4gICAgLy8gYnV0IHVzaW5nIHRoZSBpdGVyYXRvciBpbnN0ZWFkLlxuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBvYmplY3QgaXMgbm90IGFuIGl0ZXJhYmxlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gJyArICdSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCByZW5kZXJpbmcgR2VuZXJhdG9ycyBiZWNhdXNlIGl0J3MgYSBtdXRhdGlvbi5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEyOTk1XG4gICAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IHRvU3RyaW5nVGFnXG4gICAgICBuZXdDaGlsZHJlbkl0ZXJhYmxlW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdHZW5lcmF0b3InKSB7XG4gICAgICAgIGlmICghZGlkV2FybkFib3V0R2VuZXJhdG9ycykge1xuICAgICAgICAgIGVycm9yKCdVc2luZyBHZW5lcmF0b3JzIGFzIGNoaWxkcmVuIGlzIHVuc3VwcG9ydGVkIGFuZCB3aWxsIGxpa2VseSB5aWVsZCAnICsgJ3VuZXhwZWN0ZWQgcmVzdWx0cyBiZWNhdXNlIGVudW1lcmF0aW5nIGEgZ2VuZXJhdG9yIG11dGF0ZXMgaXQuICcgKyAnWW91IG1heSBjb252ZXJ0IGl0IHRvIGFuIGFycmF5IHdpdGggYEFycmF5LmZyb20oKWAgb3IgdGhlICcgKyAnYFsuLi5zcHJlYWRdYCBvcGVyYXRvciBiZWZvcmUgcmVuZGVyaW5nLiBLZWVwIGluIG1pbmQgJyArICd5b3UgbWlnaHQgbmVlZCB0byBwb2x5ZmlsbCB0aGVzZSBmZWF0dXJlcyBmb3Igb2xkZXIgYnJvd3NlcnMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gdHJ1ZTtcbiAgICAgIH0gLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG5cblxuICAgICAgaWYgKG5ld0NoaWxkcmVuSXRlcmFibGUuZW50cmllcyA9PT0gaXRlcmF0b3JGbikge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgIH0gLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICAvLyBXZSdsbCBnZXQgYSBkaWZmZXJlbnQgaXRlcmF0b3IgbGF0ZXIgZm9yIHRoZSBtYWluIHBhc3MuXG5cblxuICAgICAgdmFyIF9uZXdDaGlsZHJlbiA9IGl0ZXJhdG9yRm4uY2FsbChuZXdDaGlsZHJlbkl0ZXJhYmxlKTtcblxuICAgICAgaWYgKF9uZXdDaGlsZHJlbikge1xuICAgICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgICB2YXIgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpO1xuXG4gICAgICAgIGZvciAoOyAhX3N0ZXAuZG9uZTsgX3N0ZXAgPSBfbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICAgICAgdmFyIGNoaWxkID0gX3N0ZXAudmFsdWU7XG4gICAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAobmV3Q2hpbGRyZW4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBpdGVyYWJsZSBvYmplY3QgcHJvdmlkZWQgbm8gaXRlcmF0b3IuJyk7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcbiAgICB2YXIgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuXG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IG5ld0lkeDtcbiAgICAgICAgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBudW1iZXJPZkZvcmtzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlcjMgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjMsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgICAgIHZhciBfbnVtYmVyT2ZGb3JrczMgPSBuZXdJZHg7XG4gICAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3MzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfSAvLyBBZGQgYWxsIGNoaWxkcmVuIHRvIGEga2V5IG1hcCBmb3IgcXVpY2sgbG9va3Vwcy5cblxuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpOyAvLyBLZWVwIHNjYW5uaW5nIGFuZCB1c2UgdGhlIG1hcCB0byByZXN0b3JlIGRlbGV0ZWQgaXRlbXMgYXMgbW92ZXMuXG5cbiAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgIHZhciBfbmV3RmliZXI0ID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBzdGVwLnZhbHVlLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXI0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjQuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyNC5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXI0LmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXI0LCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXI0O1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgICAgdmFyIF9udW1iZXJPZkZvcmtzNCA9IG5ld0lkeDtcbiAgICAgIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgX251bWJlck9mRm9ya3M0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZVRleHROb2RlKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQsIGxhbmVzKSB7XG4gICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIGNoZWNrIGZvciBrZXlzIG9uIHRleHQgbm9kZXMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhXG4gICAgLy8gd2F5IHRvIGRlZmluZSB0aGVtLlxuICAgIGlmIChjdXJyZW50Rmlyc3RDaGlsZCAhPT0gbnVsbCAmJiBjdXJyZW50Rmlyc3RDaGlsZC50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gZXhpc3Rpbmcgbm9kZSBzbyBsZXQncyBqdXN0IHVwZGF0ZSBpdCBhbmQgZGVsZXRlXG4gICAgICAvLyB0aGUgcmVzdC5cbiAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nKTtcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnRGaXJzdENoaWxkLCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9IC8vIFRoZSBleGlzdGluZyBmaXJzdCBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGUgc28gd2UgbmVlZCB0byBjcmVhdGUgb25lXG4gICAgLy8gYW5kIGRlbGV0ZSB0aGUgZXhpc3Rpbmcgb25lcy5cblxuXG4gICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKTtcbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIGVsZW1lbnQsIGxhbmVzKSB7XG4gICAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IEZyYWdtZW50KSB7XG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbik7XG4gICAgICAgICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z093bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmVsZW1lbnRUeXBlID09PSBlbGVtZW50VHlwZSB8fCAoIC8vIEtlZXAgdGhpcyBjaGVjayBpbmxpbmUgc28gaXQgb25seSBydW5zIG9uIHRoZSBmYWxzZSBwYXRoOlxuICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY2hpbGQsIGVsZW1lbnQpICkgfHwgLy8gTGF6eSB0eXBlcyBzaG91bGQgcmVjb25jaWxlIHRoZWlyIHJlc29sdmVkIHR5cGUuXG4gICAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHRoZSBIb3QgUmVsb2FkaW5nIGNoZWNrIGFib3ZlLFxuICAgICAgICAgIC8vIGJlY2F1c2UgaG90IHJlbG9hZGluZyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyB0aGFuIHByb2QgYmVjYXVzZVxuICAgICAgICAgIC8vIGl0IGRvZXNuJ3QgcmVzdXNwZW5kLiBTbyB3ZSBjYW4ndCBsZXQgdGhlIGNhbGwgYmVsb3cgc3VzcGVuZC5cbiAgICAgICAgICB0eXBlb2YgZWxlbWVudFR5cGUgPT09ICdvYmplY3QnICYmIGVsZW1lbnRUeXBlICE9PSBudWxsICYmIGVsZW1lbnRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiYgcmVzb2x2ZUxhenkoZWxlbWVudFR5cGUpID09PSBjaGlsZC50eXBlKSB7XG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG5cbiAgICAgICAgICAgIHZhciBfZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcyk7XG5cbiAgICAgICAgICAgIF9leGlzdGluZy5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGNoaWxkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIF9leGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICBfZXhpc3RpbmcuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIF9leGlzdGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRGlkbid0IG1hdGNoLlxuXG5cbiAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgIF9jcmVhdGVkNC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50KTtcbiAgICAgIF9jcmVhdGVkNC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBfY3JlYXRlZDQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgcG9ydGFsLCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBwb3J0YWwua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gSG9zdFBvcnRhbCAmJiBjaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT0gcG9ydGFsLmNvbnRhaW5lckluZm8gJiYgY2hpbGQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uID09PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9IC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cblxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVjdXJzaXZlLlxuICAgIC8vIElmIHRoZSB0b3AgbGV2ZWwgaXRlbSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgY2hpbGRyZW4sXG4gICAgLy8gbm90IGFzIGEgZnJhZ21lbnQuIE5lc3RlZCBhcnJheXMgb24gdGhlIG90aGVyIGhhbmQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgLy8gZnJhZ21lbnQgbm9kZXMuIFJlY3Vyc2lvbiBoYXBwZW5zIGF0IHRoZSBub3JtYWwgZmxvdy5cbiAgICAvLyBIYW5kbGUgdG9wIGxldmVsIHVua2V5ZWQgZnJhZ21lbnRzIGFzIGlmIHRoZXkgd2VyZSBhcnJheXMuXG4gICAgLy8gVGhpcyBsZWFkcyB0byBhbiBhbWJpZ3VpdHkgYmV0d2VlbiA8PntbLi4uXX08Lz4gYW5kIDw+Li4uPC8+LlxuICAgIC8vIFdlIHRyZWF0IHRoZSBhbWJpZ3VvdXMgY2FzZXMgYWJvdmUgdGhlIHNhbWUuXG4gICAgdmFyIGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQgPSB0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsICYmIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgJiYgbmV3Q2hpbGQua2V5ID09PSBudWxsO1xuXG4gICAgaWYgKGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW47XG4gICAgfSAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG5cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpKTtcblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHJldHVybiBwbGFjZVNpbmdsZUNoaWxkKHJlY29uY2lsZVNpbmdsZVBvcnRhbChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgIHZhciBwYXlsb2FkID0gbmV3Q2hpbGQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBuZXdDaGlsZC5faW5pdDsgLy8gVE9ETzogVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBiZSBub24tcmVjdXJzaXZlLlxuXG4gICAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgaW5pdChwYXlsb2FkKSwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgfVxuXG4gICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyAmJiBuZXdDaGlsZCAhPT0gJycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCAnJyArIG5ld0NoaWxkLCBsYW5lcykpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9IC8vIFJlbWFpbmluZyBjYXNlcyBhcmUgYWxsIHRyZWF0ZWQgYXMgZW1wdHkuXG5cblxuICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzO1xufVxuXG52YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIodHJ1ZSk7XG52YXIgbW91bnRDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcihmYWxzZSk7XG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50LmNoaWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXN1bWluZyB3b3JrIG5vdCB5ZXQgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIHZhciBuZXdDaGlsZCA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV3Q2hpbGQ7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHdoaWxlIChjdXJyZW50Q2hpbGQuc2libGluZyAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnRDaGlsZC5zaWJsaW5nO1xuICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQuc2libGluZyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGN1cnJlbnRDaGlsZCwgY3VycmVudENoaWxkLnBlbmRpbmdQcm9wcyk7XG4gICAgbmV3Q2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIH1cblxuICBuZXdDaGlsZC5zaWJsaW5nID0gbnVsbDtcbn0gLy8gUmVzZXQgYSB3b3JrSW5Qcm9ncmVzcyBjaGlsZCBzZXQgdG8gcHJlcGFyZSBpdCBmb3IgYSBzZWNvbmQgcGFzcy5cblxuZnVuY3Rpb24gcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgdmFyIGNoaWxkID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgcmVzZXRXb3JrSW5Qcm9ncmVzcyhjaGlsZCwgbGFuZXMpO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG52YXIgTk9fQ09OVEVYVCA9IHt9O1xudmFyIGNvbnRleHRTdGFja0N1cnNvciQxID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xudmFyIHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5PX0NPTlRFWFQpO1xuXG5mdW5jdGlvbiByZXF1aXJlZENvbnRleHQoYykge1xuICBpZiAoYyA9PT0gTk9fQ09OVEVYVCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgaG9zdCBjb250ZXh0IHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgJyArICdpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7IC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG5cbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgTk9fQ09OVEVYVCwgZmliZXIpO1xuICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC5cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dFJvb3RDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250YWluZXIoZmliZXIpIHtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xuICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUpOyAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cblxuICBpZiAoY29udGV4dCA9PT0gbmV4dENvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGV4dChmaWJlcikge1xuICAvLyBEbyBub3QgcG9wIHVubGVzcyB0aGlzIEZpYmVyIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gIC8vIHB1c2hIb3N0Q29udGV4dCgpIG9ubHkgcHVzaGVzIEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBpZiAoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZmliZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbnZhciBEZWZhdWx0U3VzcGVuc2VDb250ZXh0ID0gMDsgLy8gVGhlIFN1c3BlbnNlIENvbnRleHQgaXMgc3BsaXQgaW50byB0d28gcGFydHMuIFRoZSBsb3dlciBiaXRzIGlzXG4vLyBpbmhlcml0ZWQgZGVlcGx5IGRvd24gdGhlIHN1YnRyZWUuIFRoZSB1cHBlciBiaXRzIG9ubHkgYWZmZWN0XG4vLyB0aGlzIGltbWVkaWF0ZSBzdXNwZW5zZSBib3VuZGFyeSBhbmQgZ2V0cyByZXNldCBlYWNoIG5ld1xuLy8gYm91bmRhcnkgb3Igc3VzcGVuc2UgbGlzdC5cblxudmFyIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrID0gMTsgLy8gU3VidHJlZSBGbGFnczpcbi8vIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCBpbmRpY2F0ZXMgdGhhdCBvbmUgb2Ygb3VyIHBhcmVudCBTdXNwZW5zZVxuLy8gYm91bmRhcmllcyBpcyBub3QgY3VycmVudGx5IHNob3dpbmcgdmlzaWJsZSBtYWluIGNvbnRlbnQuXG4vLyBFaXRoZXIgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBvciBpcyBub3QgbW91bnRlZCBhdCBhbGwuXG4vLyBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlc2lyYWJsZSB0byB0cmlnZ2VyIGEgZmFsbGJhY2sgYXRcbi8vIHRoZSBwYXJlbnQuIElmIG5vdCwgdGhlbiB3ZSBtaWdodCBuZWVkIHRvIHRyaWdnZXIgdW5kZXNpcmFibGUgYm91bmRhcmllc1xuLy8gYW5kL29yIHN1c3BlbmQgdGhlIGNvbW1pdCB0byBhdm9pZCBoaWRpbmcgdGhlIHBhcmVudCBjb250ZW50LlxuXG52YXIgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0ID0gMTsgLy8gU2hhbGxvdyBGbGFnczpcbi8vIEZvcmNlU3VzcGVuc2VGYWxsYmFjayBjYW4gYmUgdXNlZCBieSBTdXNwZW5zZUxpc3QgdG8gZm9yY2UgbmV3bHkgYWRkZWRcbi8vIGl0ZW1zIGludG8gdGhlaXIgZmFsbGJhY2sgc3RhdGUgZHVyaW5nIG9uZSBvZiB0aGUgcmVuZGVyIHBhc3Nlcy5cblxudmFyIEZvcmNlU3VzcGVuc2VGYWxsYmFjayA9IDI7XG52YXIgc3VzcGVuc2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihEZWZhdWx0U3VzcGVuc2VDb250ZXh0KTtcbmZ1bmN0aW9uIGhhc1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBmbGFnKSB7XG4gIHJldHVybiAocGFyZW50Q29udGV4dCAmIGZsYWcpICE9PSAwO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrO1xufVxuZnVuY3Rpb24gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzaGFsbG93Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrIHwgc2hhbGxvd0NvbnRleHQ7XG59XG5mdW5jdGlvbiBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHN1YnRyZWVDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0IHwgc3VidHJlZUNvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoU3VzcGVuc2VDb250ZXh0KGZpYmVyLCBuZXdDb250ZXh0KSB7XG4gIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgbmV3Q29udGV4dCwgZmliZXIpO1xufVxuZnVuY3Rpb24gcG9wU3VzcGVuc2VDb250ZXh0KGZpYmVyKSB7XG4gIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcywgaGFzSW52aXNpYmxlUGFyZW50KSB7XG4gIC8vIElmIGl0IHdhcyB0aGUgcHJpbWFyeSBjaGlsZHJlbiB0aGF0IGp1c3Qgc3VzcGVuZGVkLCBjYXB0dXJlIGFuZCByZW5kZXIgdGhlXG4gIC8vIGZhbGxiYWNrLiBPdGhlcndpc2UsIGRvbid0IGNhcHR1cmUgYW5kIGJ1YmJsZSB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFsd2F5cyBjYXB0dXJlcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7IC8vIFJlZ3VsYXIgYm91bmRhcmllcyBhbHdheXMgY2FwdHVyZS5cblxuICB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gSWYgaXQncyBhIGJvdW5kYXJ5IHdlIHNob3VsZCBhdm9pZCwgdGhlbiB3ZSBwcmVmZXIgdG8gYnViYmxlIHVwIHRvIHRoZVxufVxuZnVuY3Rpb24gZmluZEZpcnN0U3VzcGVuZGVkKHJvdykge1xuICB2YXIgbm9kZSA9IHJvdztcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IG5vZGUubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3RhdGUuZGVoeWRyYXRlZDtcblxuICAgICAgICBpZiAoZGVoeWRyYXRlZCA9PT0gbnVsbCB8fCBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGRlaHlkcmF0ZWQpIHx8IGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGRlaHlkcmF0ZWQpKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQgJiYgLy8gcmV2ZWFsT3JkZXIgdW5kZWZpbmVkIGNhbid0IGJlIHRydXN0ZWQgYmVjYXVzZSBpdCBkb24ndFxuICAgIC8vIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBpdCBzdXNwZW5kZWQgb3Igbm90LlxuICAgIG5vZGUubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgZGlkU3VzcGVuZCA9IChub2RlLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgIGlmIChkaWRTdXNwZW5kKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcm93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IHJvdykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBOb0ZsYWdzJDEgPVxuLyogICAqL1xuMDsgLy8gUmVwcmVzZW50cyB3aGV0aGVyIGVmZmVjdCBzaG91bGQgZmlyZS5cblxudmFyIEhhc0VmZmVjdCA9XG4vKiAqL1xuMTsgLy8gUmVwcmVzZW50cyB0aGUgcGhhc2UgaW4gd2hpY2ggdGhlIGVmZmVjdCAobm90IHRoZSBjbGVhbi11cCkgZmlyZXMuXG5cbnZhciBJbnNlcnRpb24gPVxuLyogICovXG4yO1xudmFyIExheW91dCA9XG4vKiAgICAqL1xuNDtcbnZhciBQYXNzaXZlJDEgPVxuLyogICAqL1xuODtcblxuLy8gYW5kIHNob3VsZCBiZSByZXNldCBiZWZvcmUgc3RhcnRpbmcgYSBuZXcgcmVuZGVyLlxuLy8gVGhpcyB0cmFja3Mgd2hpY2ggbXV0YWJsZSBzb3VyY2VzIG5lZWQgdG8gYmUgcmVzZXQgYWZ0ZXIgYSByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMgPSBbXTtcbmZ1bmN0aW9uIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3JrSW5Qcm9ncmVzc1NvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IHdvcmtJblByb2dyZXNzU291cmNlc1tpXTtcblxuICAgIHtcbiAgICAgIG11dGFibGVTb3VyY2UuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGggPSAwO1xufVxuLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHZlcnNpb24gdXNlZCBmb3Igc2VydmVyIHJlbmRlcmluZyBtYXRjaGVzIHRoZSBvbmVcbi8vIHRoYXQgaXMgZXZlbnR1YWxseSByZWFkIGR1cmluZyBoeWRyYXRpb24uXG4vLyBJZiB0aGV5IGRvbid0IG1hdGNoIHRoZXJlJ3MgYSBwb3RlbnRpYWwgdGVhciBhbmQgYSBmdWxsIGRlb3B0IHJlbmRlciBpcyByZXF1aXJlZC5cblxuZnVuY3Rpb24gcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpIHtcbiAgdmFyIGdldFZlcnNpb24gPSBtdXRhYmxlU291cmNlLl9nZXRWZXJzaW9uO1xuICB2YXIgdmVyc2lvbiA9IGdldFZlcnNpb24obXV0YWJsZVNvdXJjZS5fc291cmNlKTsgLy8gVE9ETyBDbGVhciB0aGlzIGRhdGEgb25jZSBhbGwgcGVuZGluZyBoeWRyYXRpb24gd29yayBpcyBmaW5pc2hlZC5cbiAgLy8gUmV0YWluaW5nIGl0IGZvcmV2ZXIgbWF5IGludGVyZmVyZSB3aXRoIEdDLlxuXG4gIGlmIChyb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPT0gbnVsbCkge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IFttdXRhYmxlU291cmNlLCB2ZXJzaW9uXTtcbiAgfSBlbHNlIHtcbiAgICByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEucHVzaChtdXRhYmxlU291cmNlLCB2ZXJzaW9uKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QmF0Y2hDb25maWc7XG52YXIgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90O1xuXG57XG4gIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuLy8gVGhlc2UgYXJlIHNldCByaWdodCBiZWZvcmUgY2FsbGluZyB0aGUgY29tcG9uZW50LlxudmFyIHJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIEkndmUgbmFtZWQgaXQgZGlmZmVyZW50bHkgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbVxuLy8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOyAvLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuXG52YXIgY3VycmVudEhvb2sgPSBudWxsO1xudmFyIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7IC8vIFdoZXRoZXIgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzXG4vLyBkb2VzIG5vdCBnZXQgcmVzZXQgaWYgd2UgZG8gYW5vdGhlciByZW5kZXIgcGFzczsgb25seSB3aGVuIHdlJ3JlIGNvbXBsZXRlbHlcbi8vIGZpbmlzaGVkIGV2YWx1YXRpbmcgdGhpcyBjb21wb25lbnQuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHdlIGtub3dcbi8vIHdoZXRoZXIgd2UgbmVlZCB0byBjbGVhciByZW5kZXIgcGhhc2UgdXBkYXRlcyBhZnRlciBhIHRocm93LlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBXaGVyZSBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbmx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIgcGFzcy4gVGhpc1xuLy8gZ2V0cyByZXNldCBhZnRlciBlYWNoIGF0dGVtcHQuXG4vLyBUT0RPOiBNYXliZSB0aGVyZSdzIHNvbWUgd2F5IHRvIGNvbnNvbGlkYXRlIHRoaXMgd2l0aFxuLy8gYGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVgLiBPciB3aXRoIGBudW1iZXJPZlJlUmVuZGVyc2AuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTsgLy8gQ291bnRzIHRoZSBudW1iZXIgb2YgdXNlSWQgaG9va3MgaW4gdGhpcyBjb21wb25lbnQuXG5cbnZhciBsb2NhbElkQ291bnRlciA9IDA7IC8vIFVzZWQgZm9yIGlkcyB0aGF0IGFyZSBnZW5lcmF0ZWQgY29tcGxldGVseSBjbGllbnQtc2lkZSAoaS5lLiBub3QgZHVyaW5nXG4vLyBoeWRyYXRpb24pLiBUaGlzIGNvdW50ZXIgaXMgZ2xvYmFsLCBzbyBjbGllbnQgaWRzIGFyZSBub3Qgc3RhYmxlIGFjcm9zc1xuLy8gcmVuZGVyIGF0dGVtcHRzLlxuXG52YXIgZ2xvYmFsQ2xpZW50SWRDb3VudGVyID0gMDtcbnZhciBSRV9SRU5ERVJfTElNSVQgPSAyNTsgLy8gSW4gREVWLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByaW1pdGl2ZSBob29rXG5cbnZhciBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7IC8vIEluIERFViwgdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBob29rcyBhcmUgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyIGJldHdlZW4gcmVuZGVycy5cbi8vIFRoZSBsaXN0IHN0b3JlcyB0aGUgb3JkZXIgb2YgaG9va3MgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgcmVuZGVyIChtb3VudCkuXG4vLyBTdWJzZXF1ZW50IHJlbmRlcnMgKHVwZGF0ZXMpIHJlZmVyZW5jZSB0aGlzIGxpc3QuXG5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIEluIERFViwgdGhpcyB0cmFja3Mgd2hldGhlciBjdXJyZW50bHkgcmVuZGVyaW5nIGNvbXBvbmVudCBuZWVkcyB0byBpZ25vcmVcbi8vIHRoZSBkZXBlbmRlbmNpZXMgZm9yIEhvb2tzIHRoYXQgbmVlZCB0aGVtIChlLmcuIHVzZUVmZmVjdCBvciB1c2VNZW1vKS5cbi8vIFdoZW4gdHJ1ZSwgc3VjaCBIb29rcyB3aWxsIGFsd2F5cyBiZSBcInJlbW91bnRlZFwiLiBPbmx5IHVzZWQgZHVyaW5nIGhvdCByZWxvYWQuXG5cbnZhciBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBtb3VudEhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiA9PT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzRGV2ID0gW2hvb2tOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va1R5cGVzRGV2LnB1c2goaG9va05hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2Kys7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpIHtcbiAge1xuICAgIGlmIChkZXBzICE9PSB1bmRlZmluZWQgJiYgZGVwcyAhPT0gbnVsbCAmJiAhaXNBcnJheShkZXBzKSkge1xuICAgICAgLy8gVmVyaWZ5IGRlcHMsIGJ1dCBvbmx5IG9uIG1vdW50IHRvIGF2b2lkIGV4dHJhIGNoZWNrcy5cbiAgICAgIC8vIEl0J3MgdW5saWtlbHkgdGhlaXIgdHlwZSB3b3VsZCBjaGFuZ2UgYXMgdXN1YWxseSB5b3UgZGVmaW5lIHRoZW0gaW5saW5lLlxuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuICcgKyAnc3BlY2lmaWVkLCB0aGUgZmluYWwgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheS4nLCBjdXJyZW50SG9va05hbWVJbkRldiwgdHlwZW9mIGRlcHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihjdXJyZW50SG9va05hbWUpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxKTtcblxuICAgIGlmICghZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50Lmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgZGlkV2FybkFib3V0TWlzbWF0Y2hlZEhvb2tzRm9yQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgaWYgKGhvb2tUeXBlc0RldiAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgdGFibGUgPSAnJztcbiAgICAgICAgdmFyIHNlY29uZENvbHVtblN0YXJ0ID0gMzA7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gaG9va1R5cGVzVXBkYXRlSW5kZXhEZXY7IGkrKykge1xuICAgICAgICAgIHZhciBvbGRIb29rTmFtZSA9IGhvb2tUeXBlc0RldltpXTtcbiAgICAgICAgICB2YXIgbmV3SG9va05hbWUgPSBpID09PSBob29rVHlwZXNVcGRhdGVJbmRleERldiA/IGN1cnJlbnRIb29rTmFtZSA6IG9sZEhvb2tOYW1lO1xuICAgICAgICAgIHZhciByb3cgPSBpICsgMSArIFwiLiBcIiArIG9sZEhvb2tOYW1lOyAvLyBFeHRyYSBzcGFjZSBzbyBzZWNvbmQgY29sdW1uIGxpbmVzIHVwXG4gICAgICAgICAgLy8gbG9sIEAgSUUgbm90IHN1cHBvcnRpbmcgU3RyaW5nI3JlcGVhdFxuXG4gICAgICAgICAgd2hpbGUgKHJvdy5sZW5ndGggPCBzZWNvbmRDb2x1bW5TdGFydCkge1xuICAgICAgICAgICAgcm93ICs9ICcgJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByb3cgKz0gbmV3SG9va05hbWUgKyAnXFxuJztcbiAgICAgICAgICB0YWJsZSArPSByb3c7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignUmVhY3QgaGFzIGRldGVjdGVkIGEgY2hhbmdlIGluIHRoZSBvcmRlciBvZiBIb29rcyBjYWxsZWQgYnkgJXMuICcgKyAnVGhpcyB3aWxsIGxlYWQgdG8gYnVncyBhbmQgZXJyb3JzIGlmIG5vdCBmaXhlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVhZCB0aGUgUnVsZXMgb2YgSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rc1xcblxcbicgKyAnICAgUHJldmlvdXMgcmVuZGVyICAgICAgICAgICAgTmV4dCByZW5kZXJcXG4nICsgJyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicgKyAnJXMnICsgJyAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlxcbicsIGNvbXBvbmVudE5hbWUsIHRhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dJbnZhbGlkSG9va0Vycm9yKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3InICsgJyBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbicgKyAnMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuJyArICcyLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuJyArICczLiBZb3UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QgaW4gdGhlIHNhbWUgYXBwXFxuJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS4nKTtcbn1cblxuZnVuY3Rpb24gYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykge1xuICB7XG4gICAgaWYgKGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzKSB7XG4gICAgICAvLyBPbmx5IHRydWUgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBiZWluZyBob3QgcmVsb2FkZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByZXZEZXBzID09PSBudWxsKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgbm90IGR1cmluZyAnICsgJ3RoZSBwcmV2aW91cyByZW5kZXIuIEV2ZW4gdGhvdWdoIHRoZSBmaW5hbCBhcmd1bWVudCBpcyBvcHRpb25hbCwgJyArICdpdHMgdHlwZSBjYW5ub3QgY2hhbmdlIGJldHdlZW4gcmVuZGVycy4nLCBjdXJyZW50SG9va05hbWVJbkRldik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAge1xuICAgIC8vIERvbid0IGJvdGhlciBjb21wYXJpbmcgbGVuZ3RocyBpbiBwcm9kIGJlY2F1c2UgdGhlc2UgYXJyYXlzIHNob3VsZCBiZVxuICAgIC8vIHBhc3NlZCBpbmxpbmUuXG4gICAgaWYgKG5leHREZXBzLmxlbmd0aCAhPT0gcHJldkRlcHMubGVuZ3RoKSB7XG4gICAgICBlcnJvcignVGhlIGZpbmFsIGFyZ3VtZW50IHBhc3NlZCB0byAlcyBjaGFuZ2VkIHNpemUgYmV0d2VlbiByZW5kZXJzLiBUaGUgJyArICdvcmRlciBhbmQgc2l6ZSBvZiB0aGlzIGFycmF5IG11c3QgcmVtYWluIGNvbnN0YW50LlxcblxcbicgKyAnUHJldmlvdXM6ICVzXFxuJyArICdJbmNvbWluZzogJXMnLCBjdXJyZW50SG9va05hbWVJbkRldiwgXCJbXCIgKyBwcmV2RGVwcy5qb2luKCcsICcpICsgXCJdXCIsIFwiW1wiICsgbmV4dERlcHMuam9pbignLCAnKSArIFwiXVwiKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXZEZXBzLmxlbmd0aCAmJiBpIDwgbmV4dERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob2JqZWN0SXMobmV4dERlcHNbaV0sIHByZXZEZXBzW2ldKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgc2Vjb25kQXJnLCBuZXh0UmVuZGVyTGFuZXMpIHtcbiAgcmVuZGVyTGFuZXMgPSBuZXh0UmVuZGVyTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSB3b3JrSW5Qcm9ncmVzcztcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gY3VycmVudCAhPT0gbnVsbCA/IGN1cnJlbnQuX2RlYnVnSG9va1R5cGVzIDogbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBVc2VkIGZvciBob3QgcmVsb2FkaW5nOlxuXG4gICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lczsgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzZXRcbiAgLy8gY3VycmVudEhvb2sgPSBudWxsO1xuICAvLyB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuICAvLyBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gIC8vIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgLy8gVE9ETyBXYXJuIGlmIG5vIGhvb2tzIGFyZSB1c2VkIGF0IGFsbCBkdXJpbmcgbW91bnQsIHRoZW4gc29tZSBhcmUgdXNlZCBkdXJpbmcgdXBkYXRlLlxuICAvLyBDdXJyZW50bHkgd2Ugd2lsbCBpZGVudGlmeSB0aGUgdXBkYXRlIHJlbmRlciBhcyBhIG1vdW50IGJlY2F1c2UgbWVtb2l6ZWRTdGF0ZSA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcbiAgLy8gVXNpbmcgbWVtb2l6ZWRTdGF0ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbW91bnQvdXBkYXRlIG9ubHkgd29ya3MgaWYgYXQgbGVhc3Qgb25lIHN0YXRlZnVsIGhvb2sgaXMgdXNlZC5cbiAgLy8gTm9uLXN0YXRlZnVsIGhvb2tzIChlLmcuIGNvbnRleHQpIGRvbid0IGdldCBhZGRlZCB0byBtZW1vaXplZFN0YXRlLFxuICAvLyBzbyBtZW1vaXplZFN0YXRlIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cblxuICB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgfSBlbHNlIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBoYW5kbGVzIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIGNvbXBvbmVudCBpcyB1cGRhdGluZyxcbiAgICAgIC8vIGJ1dCBubyBzdGF0ZWZ1bCBob29rcyBoYXZlIGJlZW4gdXNlZC5cbiAgICAgIC8vIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3Rpb24gY29kZSBiZWhhdmlvciAod2hpY2ggd2lsbCB1c2UgSG9va3NEaXNwYXRjaGVyT25Nb3VudCksXG4gICAgICAvLyBidXQgd2l0aCB0aGUgZXh0cmEgREVWIHZhbGlkYXRpb24gdG8gZW5zdXJlIGhvb2tzIG9yZGVyaW5nIGhhc24ndCBjaGFuZ2VkLlxuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGRvZXMgdGhhdC5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVjtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpOyAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlXG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcykge1xuICAgIC8vIEtlZXAgcmVuZGVyaW5nIGluIGEgbG9vcCBmb3IgYXMgbG9uZyBhcyByZW5kZXIgcGhhc2UgdXBkYXRlcyBjb250aW51ZSB0b1xuICAgIC8vIGJlIHNjaGVkdWxlZC4gVXNlIGEgY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbiAgICAgIGxvY2FsSWRDb3VudGVyID0gMDtcblxuICAgICAgaWYgKG51bWJlck9mUmVSZW5kZXJzID49IFJFX1JFTkRFUl9MSU1JVCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBtYW55IHJlLXJlbmRlcnMuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlbmRlcnMgdG8gcHJldmVudCAnICsgJ2FuIGluZmluaXRlIGxvb3AuJyk7XG4gICAgICB9XG5cbiAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gRXZlbiB3aGVuIGhvdCByZWxvYWRpbmcsIGFsbG93IGRlcGVuZGVuY2llcyB0byBzdGFiaWxpemVcbiAgICAgICAgLy8gYWZ0ZXIgZmlyc3QgcmVuZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuXG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICB9IC8vIFN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cblxuICAgICAgY3VycmVudEhvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAge1xuICAgICAgICAvLyBBbHNvIHZhbGlkYXRlIGhvb2sgb3JkZXIgZm9yIGNhc2NhZGluZyB1cGRhdGVzLlxuICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgfVxuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9ICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgO1xuICAgICAgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgfSB3aGlsZSAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKTtcbiAgfSAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jZS5cblxuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBob29rVHlwZXNEZXY7XG4gIH0gLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuXG5cbiAgdmFyIGRpZFJlbmRlclRvb0Zld0hvb2tzID0gY3VycmVudEhvb2sgIT09IG51bGwgJiYgY3VycmVudEhvb2submV4dCAhPT0gbnVsbDtcbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xOyAvLyBDb25maXJtIHRoYXQgYSBzdGF0aWMgZmxhZyB3YXMgbm90IGFkZGVkIG9yIHJlbW92ZWQgc2luY2UgdGhlIGxhc3RcbiAgICAvLyByZW5kZXIuIElmIHRoaXMgZmlyZXMsIGl0IHN1Z2dlc3RzIHRoYXQgd2UgaW5jb3JyZWN0bHkgcmVzZXQgdGhlIHN0YXRpY1xuICAgIC8vIGZsYWdzIGluIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgY29kZWJhc2UuIFRoaXMgaGFzIGhhcHBlbmVkIGJlZm9yZSwgZm9yXG4gICAgLy8gZXhhbXBsZSwgaW4gdGhlIFN1c3BlbnNlTGlzdCBpbXBsZW1lbnRhdGlvbi5cblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgU3RhdGljTWFzaykgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIFN0YXRpY01hc2spICYmIC8vIERpc2FibGUgdGhpcyB3YXJuaW5nIGluIGxlZ2FjeSBtb2RlLCBiZWNhdXNlIGxlZ2FjeSBTdXNwZW5zZSBpcyB3ZWlyZFxuICAgIC8vIGFuZCBjcmVhdGVzIGZhbHNlIHBvc2l0aXZlcy4gVG8gbWFrZSB0aGlzIHdvcmsgaW4gbGVnYWN5IG1vZGUsIHdlJ2RcbiAgICAvLyBuZWVkIHRvIG1hcmsgZmliZXJzIHRoYXQgY29tbWl0IGluIGFuIGluY29tcGxldGUgc3RhdGUsIHNvbWVob3cuIEZvclxuICAgIC8vIG5vdyBJJ2xsIGRpc2FibGUgdGhlIHdhcm5pbmcgdGhhdCBtb3N0IG9mIHRoZSBidWdzIHRoYXQgd291bGQgdHJpZ2dlclxuICAgIC8vIGl0IGFyZSBlaXRoZXIgZXhjbHVzaXZlIHRvIGNvbmN1cnJlbnQgbW9kZSBvciBleGlzdCBpbiBib3RoLlxuICAgIChjdXJyZW50Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgZXJyb3IoJ0ludGVybmFsIFJlYWN0IGVycm9yOiBFeHBlY3RlZCBzdGF0aWMgZmxhZyB3YXMgbWlzc2luZy4gUGxlYXNlICcgKyAnbm90aWZ5IHRoZSBSZWFjdCB0ZWFtLicpO1xuICAgIH1cbiAgfVxuXG4gIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTsgLy8gVGhpcyBpcyByZXNldCBieSBjaGVja0RpZFJlbmRlcklkSG9va1xuICAvLyBsb2NhbElkQ291bnRlciA9IDA7XG5cbiAgaWYgKGRpZFJlbmRlclRvb0Zld0hvb2tzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZW5kZXJlZCBmZXdlciBob29rcyB0aGFuIGV4cGVjdGVkLiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYW4gYWNjaWRlbnRhbCAnICsgJ2Vhcmx5IHJldHVybiBzdGF0ZW1lbnQuJyk7XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5mdW5jdGlvbiBjaGVja0RpZFJlbmRlcklkSG9vaygpIHtcbiAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGV2ZXJ5IHJlbmRlcldpdGhIb29rcyBjYWxsLlxuICAvLyBDb25jZXB0dWFsbHksIGl0J3MgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIHJlbmRlcldpdGhIb29rczsgaXQncyBvbmx5IGFcbiAgLy8gc2VwYXJhdGUgZnVuY3Rpb24gdG8gYXZvaWQgdXNpbmcgYW4gYXJyYXkgdHVwbGUuXG4gIHZhciBkaWRSZW5kZXJJZEhvb2sgPSBsb2NhbElkQ291bnRlciAhPT0gMDtcbiAgbG9jYWxJZENvdW50ZXIgPSAwO1xuICByZXR1cm4gZGlkUmVuZGVySWRIb29rO1xufVxuZnVuY3Rpb24gYmFpbG91dEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBsYW5lcykge1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gcmVzZXQgdGhlIGZsYWdzIGhlcmUsIGJlY2F1c2UgdGhleSdyZSByZXNldCBpbiB0aGVcbiAgLy8gY29tcGxldGUgcGhhc2UgKGJ1YmJsZVByb3BlcnRpZXMpLlxuXG4gIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH4oTW91bnRQYXNzaXZlRGV2IHwgTW91bnRMYXlvdXREZXYgfCBQYXNzaXZlIHwgVXBkYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICB9XG5cbiAgY3VycmVudC5sYW5lcyA9IHJlbW92ZUxhbmVzKGN1cnJlbnQubGFuZXMsIGxhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0SG9va3NBZnRlclRocm93KCkge1xuICAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jZS5cbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHtcbiAgICAvLyBUaGVyZSB3ZXJlIHJlbmRlciBwaGFzZSB1cGRhdGVzLiBUaGVzZSBhcmUgb25seSB2YWxpZCBmb3IgdGhpcyByZW5kZXJcbiAgICAvLyBwaGFzZSwgd2hpY2ggd2UgYXJlIG5vdyBhYm9ydGluZy4gUmVtb3ZlIHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlcyBzb1xuICAgIC8vIHRoZXkgZG8gbm90IHBlcnNpc3QgdG8gdGhlIG5leHQgcmVuZGVyLiBEbyBub3QgcmVtb3ZlIHVwZGF0ZXMgZnJvbSBob29rc1xuICAgIC8vIHRoYXQgd2VyZW4ndCBwcm9jZXNzZWQuXG4gICAgLy9cbiAgICAvLyBPbmx5IHJlc2V0IHRoZSB1cGRhdGVzIGZyb20gdGhlIHF1ZXVlIGlmIGl0IGhhcyBhIGNsb25lLiBJZiBpdCBkb2VzXG4gICAgLy8gbm90IGhhdmUgYSBjbG9uZSwgdGhhdCBtZWFucyBpdCB3YXNuJ3QgcHJvY2Vzc2VkLCBhbmQgdGhlIHVwZGF0ZXMgd2VyZVxuICAgIC8vIHNjaGVkdWxlZCBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIHZhciBob29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuXG4gICAgd2hpbGUgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaG9vayA9IGhvb2submV4dDtcbiAgICB9XG5cbiAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gZmFsc2U7XG4gIH1cblxuICByZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsO1xuICBjdXJyZW50SG9vayA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG5cbiAge1xuICAgIGhvb2tUeXBlc0RldiA9IG51bGw7XG4gICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZmFsc2U7XG4gIGxvY2FsSWRDb3VudGVyID0gMDtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIHZhciBob29rID0ge1xuICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgYmFzZVN0YXRlOiBudWxsLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3RcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYm90aCBmb3IgdXBkYXRlcyBhbmQgZm9yIHJlLXJlbmRlcnMgdHJpZ2dlcmVkIGJ5IGFcbiAgLy8gcmVuZGVyIHBoYXNlIHVwZGF0ZS4gSXQgYXNzdW1lcyB0aGVyZSBpcyBlaXRoZXIgYSBjdXJyZW50IGhvb2sgd2UgY2FuXG4gIC8vIGNsb25lLCBvciBhIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBmcm9tIGEgcHJldmlvdXMgcmVuZGVyIHBhc3MgdGhhdCB3ZSBjYW5cbiAgLy8gdXNlIGFzIGEgYmFzZS4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBiYXNlIGxpc3QsIHdlIG11c3Qgc3dpdGNoIHRvXG4gIC8vIHRoZSBkaXNwYXRjaGVyIHVzZWQgZm9yIG1vdW50cy5cbiAgdmFyIG5leHRDdXJyZW50SG9vaztcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuXG4gIHZhciBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuICB9IGVsc2Uge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgfVxuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xvbmUgZnJvbSB0aGUgY3VycmVudCBob29rLlxuICAgIGlmIChuZXh0Q3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVuZGVyZWQgbW9yZSBob29rcyB0aGFuIGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICAgIHZhciBuZXdIb29rID0ge1xuICAgICAgbWVtb2l6ZWRTdGF0ZTogY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgIGJhc2VTdGF0ZTogY3VycmVudEhvb2suYmFzZVN0YXRlLFxuICAgICAgYmFzZVF1ZXVlOiBjdXJyZW50SG9vay5iYXNlUXVldWUsXG4gICAgICBxdWV1ZTogY3VycmVudEhvb2sucXVldWUsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3QuXG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXdIb29rO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gbmV3SG9vaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NIb29rO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCkge1xuICByZXR1cm4ge1xuICAgIGxhc3RFZmZlY3Q6IG51bGwsXG4gICAgc3RvcmVzOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJhc2ljU3RhdGVSZWR1Y2VyKHN0YXRlLCBhY3Rpb24pIHtcbiAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgcmV0dXJuIHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicgPyBhY3Rpb24oc3RhdGUpIDogYWN0aW9uO1xufVxuXG5mdW5jdGlvbiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBpbml0aWFsU3RhdGU7XG5cbiAgaWYgKGluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXQoaW5pdGlhbEFyZyk7XG4gIH0gZWxzZSB7XG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbEFyZztcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSB7XG4gICAgcGVuZGluZzogbnVsbCxcbiAgICBpbnRlcmxlYXZlZDogbnVsbCxcbiAgICBsYW5lczogTm9MYW5lcyxcbiAgICBkaXNwYXRjaDogbnVsbCxcbiAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiByZWR1Y2VyLFxuICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgfTtcbiAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoUmVkdWNlckFjdGlvbi5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBxdWV1ZSA9IGhvb2sucXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnQgPSBjdXJyZW50SG9vazsgLy8gVGhlIGxhc3QgcmViYXNlIHVwZGF0ZSB0aGF0IGlzIE5PVCBwYXJ0IG9mIHRoZSBiYXNlIHN0YXRlLlxuXG4gIHZhciBiYXNlUXVldWUgPSBjdXJyZW50LmJhc2VRdWV1ZTsgLy8gVGhlIGxhc3QgcGVuZGluZyB1cGRhdGUgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIG5ldyB1cGRhdGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG4gICAgLy8gV2UnbGwgYWRkIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG4gICAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gTWVyZ2UgdGhlIHBlbmRpbmcgcXVldWUgYW5kIHRoZSBiYXNlIHF1ZXVlLlxuICAgICAgdmFyIGJhc2VGaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgdmFyIHBlbmRpbmdGaXJzdCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgYmFzZVF1ZXVlLm5leHQgPSBwZW5kaW5nRmlyc3Q7XG4gICAgICBwZW5kaW5nUXVldWUubmV4dCA9IGJhc2VGaXJzdDtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3VycmVudC5iYXNlUXVldWUgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAvLyBJbnRlcm5hbCBpbnZhcmlhbnQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZmVhc2libHkgY291bGQgaW5cbiAgICAgICAgLy8gdGhlIGZ1dHVyZSBpZiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcsIG9yIHNvbWUgZm9ybSBvZiB0aGF0LlxuICAgICAgICBlcnJvcignSW50ZXJuYWwgZXJyb3I6IEV4cGVjdGVkIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgdG8gYmUgYSBjbG9uZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnQuYmFzZVF1ZXVlID0gYmFzZVF1ZXVlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgYSBxdWV1ZSB0byBwcm9jZXNzLlxuICAgIHZhciBmaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgIHZhciBuZXdTdGF0ZSA9IGN1cnJlbnQuYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVGaXJzdCA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUxhc3QgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICBlYWdlclN0YXRlOiB1cGRhdGUuZWFnZXJTdGF0ZSxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG5ld0Jhc2VRdWV1ZUxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICBuZXdCYXNlUXVldWVGaXJzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QgPSBjbG9uZTtcbiAgICAgICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuICAgICAgICAvLyBUT0RPOiBEb24ndCBuZWVkIHRvIGFjY3VtdWxhdGUgdGhpcy4gSW5zdGVhZCwgd2UgY2FuIHJlbW92ZVxuICAgICAgICAvLyByZW5kZXJMYW5lcyBmcm9tIHRoZSBvcmlnaW5hbCBsYW5lcy5cblxuXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIHVwZGF0ZUxhbmUpO1xuICAgICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKHVwZGF0ZUxhbmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyB1cGRhdGUgZG9lcyBoYXZlIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbG9uZSA9IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdXBkYXRlIGlzIGdvaW5nIHRvIGJlIGNvbW1pdHRlZCBzbyB3ZSBuZXZlciB3YW50IHVuY29tbWl0XG4gICAgICAgICAgICAvLyBpdC4gVXNpbmcgTm9MYW5lIHdvcmtzIGJlY2F1c2UgMCBpcyBhIHN1YnNldCBvZiBhbGwgYml0bWFza3MsIHNvXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgYmUgc2tpcHBlZCBieSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICBsYW5lOiBOb0xhbmUsXG4gICAgICAgICAgICBhY3Rpb246IHVwZGF0ZS5hY3Rpb24sXG4gICAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IF9jbG9uZTtcbiAgICAgICAgfSAvLyBQcm9jZXNzIHRoaXMgdXBkYXRlLlxuXG5cbiAgICAgICAgaWYgKHVwZGF0ZS5oYXNFYWdlclN0YXRlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyB1cGRhdGUgaXMgYSBzdGF0ZSB1cGRhdGUgKG5vdCBhIHJlZHVjZXIpIGFuZCB3YXMgcHJvY2Vzc2VkIGVhZ2VybHksXG4gICAgICAgICAgLy8gd2UgY2FuIHVzZSB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZVxuICAgICAgICAgIG5ld1N0YXRlID0gdXBkYXRlLmVhZ2VyU3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCAmJiB1cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gbmV3QmFzZVF1ZXVlRmlyc3Q7XG4gICAgfSAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgaG9vay5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH0gLy8gSW50ZXJsZWF2ZWQgdXBkYXRlcyBhcmUgc3RvcmVkIG9uIGEgc2VwYXJhdGUgcXVldWUuIFdlIGFyZW4ndCBnb2luZyB0b1xuICAvLyBwcm9jZXNzIHRoZW0gZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgd2UgZG8gbmVlZCB0byB0cmFjayB3aGljaCBsYW5lc1xuICAvLyBhcmUgcmVtYWluaW5nLlxuXG5cbiAgdmFyIGxhc3RJbnRlcmxlYXZlZCA9IHF1ZXVlLmludGVybGVhdmVkO1xuXG4gIGlmIChsYXN0SW50ZXJsZWF2ZWQgIT09IG51bGwpIHtcbiAgICB2YXIgaW50ZXJsZWF2ZWQgPSBsYXN0SW50ZXJsZWF2ZWQ7XG5cbiAgICBkbyB7XG4gICAgICB2YXIgaW50ZXJsZWF2ZWRMYW5lID0gaW50ZXJsZWF2ZWQubGFuZTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMgPSBtZXJnZUxhbmVzKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubGFuZXMsIGludGVybGVhdmVkTGFuZSk7XG4gICAgICBtYXJrU2tpcHBlZFVwZGF0ZUxhbmVzKGludGVybGVhdmVkTGFuZSk7XG4gICAgICBpbnRlcmxlYXZlZCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgfSB3aGlsZSAoaW50ZXJsZWF2ZWQgIT09IGxhc3RJbnRlcmxlYXZlZCk7XG4gIH0gZWxzZSBpZiAoYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gYHF1ZXVlLmxhbmVzYCBpcyB1c2VkIGZvciBlbnRhbmdsaW5nIHRyYW5zaXRpb25zLiBXZSBjYW4gc2V0IGl0IGJhY2sgdG9cbiAgICAvLyB6ZXJvIG9uY2UgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgIHF1ZXVlLmxhbmVzID0gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlO1xuXG4gIGlmIChxdWV1ZSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBxdWV1ZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG5cbiAgcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlciA9IHJlZHVjZXI7IC8vIFRoaXMgaXMgYSByZS1yZW5kZXIuIEFwcGx5IHRoZSBuZXcgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG8gdGhlIHByZXZpb3VzXG4gIC8vIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgdmFyIGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IHF1ZXVlLnBlbmRpbmc7XG4gIHZhciBuZXdTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobGFzdFJlbmRlclBoYXNlVXBkYXRlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHF1ZXVlIGRvZXNuJ3QgcGVyc2lzdCBwYXN0IHRoaXMgcmVuZGVyIHBhc3MuXG4gICAgcXVldWUucGVuZGluZyA9IG51bGw7XG4gICAgdmFyIGZpcnN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dDtcbiAgICB2YXIgdXBkYXRlID0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIC8vIFByb2Nlc3MgdGhpcyByZW5kZXIgcGhhc2UgdXBkYXRlLiBXZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZVxuICAgICAgLy8gcHJpb3JpdHkgYmVjYXVzZSBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBhcyB0aGUgY3VycmVudFxuICAgICAgLy8gcmVuZGVyJ3MuXG4gICAgICB2YXIgYWN0aW9uID0gdXBkYXRlLmFjdGlvbjtcbiAgICAgIG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgYWN0aW9uKTtcbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSk7IC8vIE1hcmsgdGhhdCB0aGUgZmliZXIgcGVyZm9ybWVkIHdvcmssIGJ1dCBvbmx5IGlmIHRoZSBuZXcgc3RhdGUgaXNcbiAgICAvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS5cblxuXG4gICAgaWYgKCFvYmplY3RJcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSkge1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTsgLy8gRG9uJ3QgcGVyc2lzdCB0aGUgc3RhdGUgYWNjdW11bGF0ZWQgZnJvbSB0aGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgdG9cbiAgICAvLyB0aGUgYmFzZSBzdGF0ZSB1bmxlc3MgdGhlIHF1ZXVlIGlzIGVtcHR5LlxuICAgIC8vIFRPRE86IE5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGRlc2lyZWQgc2VtYW50aWNzLCBidXQgaXQncyB3aGF0IHdlXG4gICAgLy8gZG8gZm9yIGdEU0ZQLiBJIGNhbid0IHJlbWVtYmVyIHdoeS5cblxuICAgIGlmIChob29rLmJhc2VRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAgcmV0dXJuIFtuZXdTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiBtb3VudE11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdW50U3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dFNuYXBzaG90O1xuICB2YXIgaXNIeWRyYXRpbmcgPSBnZXRJc0h5ZHJhdGluZygpO1xuXG4gIGlmIChpc0h5ZHJhdGluZykge1xuICAgIGlmIChnZXRTZXJ2ZXJTbmFwc2hvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZ2V0U2VydmVyU25hcHNob3QsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciAnICsgJ3NlcnZlci1yZW5kZXJlZCBjb250ZW50LiBXaWxsIHJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLicpO1xuICAgIH1cblxuICAgIG5leHRTbmFwc2hvdCA9IGdldFNlcnZlclNuYXBzaG90KCk7XG5cbiAgICB7XG4gICAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICAgIGlmIChuZXh0U25hcHNob3QgIT09IGdldFNlcnZlclNuYXBzaG90KCkpIHtcbiAgICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTZXJ2ZXJTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAge1xuICAgICAgaWYgKCFkaWRXYXJuVW5jYWNoZWRHZXRTbmFwc2hvdCkge1xuICAgICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICAgIGlmICghb2JqZWN0SXMobmV4dFNuYXBzaG90LCBjYWNoZWRTbmFwc2hvdCkpIHtcbiAgICAgICAgICBlcnJvcignVGhlIHJlc3VsdCBvZiBnZXRTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AnKTtcblxuICAgICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suXG4gICAgLy8gUmlnaHQgYmVmb3JlIGNvbW1pdHRpbmcsIHdlIHdpbGwgd2FsayB0aGUgdHJlZSBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZVxuICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuXG4gICAgLy9cbiAgICAvLyBXZSB3b24ndCBkbyB0aGlzIGlmIHdlJ3JlIGh5ZHJhdGluZyBzZXJ2ZXItcmVuZGVyZWQgY29udGVudCwgYmVjYXVzZSBpZlxuICAgIC8vIHRoZSBjb250ZW50IGlzIHN0YWxlLCBpdCdzIGFscmVhZHkgdmlzaWJsZSBhbnl3YXkuIEluc3RlYWQgd2UnbGwgcGF0Y2hcbiAgICAvLyBpdCB1cCBpbiBhIHBhc3NpdmUgZWZmZWN0LlxuXG5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmICghaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICB9XG4gIH0gLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIFRoaXMgYnJlYWtzIHRoZVxuICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90O1xuICB2YXIgaW5zdCA9IHtcbiAgICB2YWx1ZTogbmV4dFNuYXBzaG90LFxuICAgIGdldFNuYXBzaG90OiBnZXRTbmFwc2hvdFxuICB9O1xuICBob29rLnF1ZXVlID0gaW5zdDsgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmUuXG5cbiAgbW91bnRFZmZlY3Qoc3Vic2NyaWJlVG9TdG9yZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBzdWJzY3JpYmUpLCBbc3Vic2NyaWJlXSk7IC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byB1cGRhdGUgdGhlIG11dGFibGUgaW5zdGFuY2UgZmllbGRzLiBXZSB3aWxsIHVwZGF0ZVxuICAvLyB0aGlzIHdoZW5ldmVyIHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIG9yIHZhbHVlIGNoYW5nZXMuIEJlY2F1c2UgdGhlcmUncyBub1xuICAvLyBjbGVhbi11cCBmdW5jdGlvbiwgYW5kIHdlIHRyYWNrIHRoZSBkZXBzIGNvcnJlY3RseSwgd2UgY2FuIGNhbGwgcHVzaEVmZmVjdFxuICAvLyBkaXJlY3RseSwgd2l0aG91dCBzdG9yaW5nIGFueSBhZGRpdGlvbmFsIHN0YXRlLiBGb3IgdGhlIHNhbWUgcmVhc29uLCB3ZVxuICAvLyBkb24ndCBuZWVkIHRvIHNldCBhIHN0YXRpYyBmbGFnLCBlaXRoZXIuXG4gIC8vIFRPRE86IFdlIGNhbiBtb3ZlIHRoaXMgdG8gdGhlIHBhc3NpdmUgcGhhc2Ugb25jZSB3ZSBhZGQgYSBwcmUtY29tbWl0XG4gIC8vIGNvbnNpc3RlbmN5IGNoZWNrLiBTZWUgdGhlIG5leHQgY29tbWVudC5cblxuICBmaWJlci5mbGFncyB8PSBQYXNzaXZlO1xuICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTtcbiAgcmV0dXJuIG5leHRTbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTsgLy8gUmVhZCB0aGUgY3VycmVudCBzbmFwc2hvdCBmcm9tIHRoZSBzdG9yZSBvbiBldmVyeSByZW5kZXIuIFRoaXMgYnJlYWtzIHRoZVxuICAvLyBub3JtYWwgcnVsZXMgb2YgUmVhY3QsIGFuZCBvbmx5IHdvcmtzIGJlY2F1c2Ugc3RvcmUgdXBkYXRlcyBhcmVcbiAgLy8gYWx3YXlzIHN5bmNocm9ub3VzLlxuXG4gIHZhciBuZXh0U25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90KSB7XG4gICAgICB2YXIgY2FjaGVkU25hcHNob3QgPSBnZXRTbmFwc2hvdCgpO1xuXG4gICAgICBpZiAoIW9iamVjdElzKG5leHRTbmFwc2hvdCwgY2FjaGVkU25hcHNob3QpKSB7XG4gICAgICAgIGVycm9yKCdUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcCcpO1xuXG4gICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgcHJldlNuYXBzaG90ID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICB2YXIgc25hcHNob3RDaGFuZ2VkID0gIW9iamVjdElzKHByZXZTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcblxuICBpZiAoc25hcHNob3RDaGFuZ2VkKSB7XG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV4dFNuYXBzaG90O1xuICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gIH1cblxuICB2YXIgaW5zdCA9IGhvb2sucXVldWU7XG4gIHVwZGF0ZUVmZmVjdChzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGluc3QsIHN1YnNjcmliZSksIFtzdWJzY3JpYmVdKTsgLy8gV2hlbmV2ZXIgZ2V0U25hcHNob3Qgb3Igc3Vic2NyaWJlIGNoYW5nZXMsIHdlIG5lZWQgdG8gY2hlY2sgaW4gdGhlXG4gIC8vIGNvbW1pdCBwaGFzZSBpZiB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgbXV0YXRpb24uIEluIGNvbmN1cnJlbnQgbW9kZVxuICAvLyB0aGlzIGNhbiBoYXBwZW4gYWxsIHRoZSB0aW1lLCBidXQgZXZlbiBpbiBzeW5jaHJvbm91cyBtb2RlLCBhbiBlYXJsaWVyXG4gIC8vIGVmZmVjdCBtYXkgaGF2ZSBtdXRhdGVkIHRoZSBzdG9yZS5cblxuICBpZiAoaW5zdC5nZXRTbmFwc2hvdCAhPT0gZ2V0U25hcHNob3QgfHwgc25hcHNob3RDaGFuZ2VkIHx8IC8vIENoZWNrIGlmIHRoZSBzdXNiY3JpYmUgZnVuY3Rpb24gY2hhbmdlZC4gV2UgY2FuIHNhdmUgc29tZSBtZW1vcnkgYnlcbiAgLy8gY2hlY2tpbmcgd2hldGhlciB3ZSBzY2hlZHVsZWQgYSBzdWJzY3JpcHRpb24gZWZmZWN0IGFib3ZlLlxuICB3b3JrSW5Qcm9ncmVzc0hvb2sgIT09IG51bGwgJiYgd29ya0luUHJvZ3Jlc3NIb29rLm1lbW9pemVkU3RhdGUudGFnICYgSGFzRWZmZWN0KSB7XG4gICAgZmliZXIuZmxhZ3MgfD0gUGFzc2l2ZTtcbiAgICBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IFBhc3NpdmUkMSwgdXBkYXRlU3RvcmVJbnN0YW5jZS5iaW5kKG51bGwsIGZpYmVyLCBpbnN0LCBuZXh0U25hcHNob3QsIGdldFNuYXBzaG90KSwgdW5kZWZpbmVkLCBudWxsKTsgLy8gVW5sZXNzIHdlJ3JlIHJlbmRlcmluZyBhIGJsb2NraW5nIGxhbmUsIHNjaGVkdWxlIGEgY29uc2lzdGVuY3kgY2hlY2suXG4gICAgLy8gUmlnaHQgYmVmb3JlIGNvbW1pdHRpbmcsIHdlIHdpbGwgd2FsayB0aGUgdHJlZSBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZVxuICAgIC8vIHN0b3JlcyB3ZXJlIG11dGF0ZWQuXG5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB3b3JrLWluLXByb2dyZXNzIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cblxuICAgIGlmICghaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgcmVuZGVyTGFuZXMpKSB7XG4gICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFNuYXBzaG90O1xufVxuXG5mdW5jdGlvbiBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgcmVuZGVyZWRTbmFwc2hvdCkge1xuICBmaWJlci5mbGFncyB8PSBTdG9yZUNvbnNpc3RlbmN5O1xuICB2YXIgY2hlY2sgPSB7XG4gICAgZ2V0U25hcHNob3Q6IGdldFNuYXBzaG90LFxuICAgIHZhbHVlOiByZW5kZXJlZFNuYXBzaG90XG4gIH07XG4gIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7XG5cbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZSA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlO1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcyA9IFtjaGVja107XG4gIH0gZWxzZSB7XG4gICAgdmFyIHN0b3JlcyA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcztcblxuICAgIGlmIChzdG9yZXMgPT09IG51bGwpIHtcbiAgICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLnN0b3JlcyA9IFtjaGVja107XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3Jlcy5wdXNoKGNoZWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RvcmVJbnN0YW5jZShmaWJlciwgaW5zdCwgbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdCkge1xuICAvLyBUaGVzZSBhcmUgdXBkYXRlZCBpbiB0aGUgcGFzc2l2ZSBwaGFzZVxuICBpbnN0LnZhbHVlID0gbmV4dFNuYXBzaG90O1xuICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7IC8vIFNvbWV0aGluZyBtYXkgaGF2ZSBiZWVuIG11dGF0ZWQgaW4gYmV0d2VlbiByZW5kZXIgYW5kIGNvbW1pdC4gVGhpcyBjb3VsZFxuICAvLyBoYXZlIGJlZW4gaW4gYW4gZXZlbnQgdGhhdCBmaXJlZCBiZWZvcmUgdGhlIHBhc3NpdmUgZWZmZWN0cywgb3IgaXQgY291bGRcbiAgLy8gaGF2ZSBiZWVuIGluIGEgbGF5b3V0IGVmZmVjdC4gSW4gdGhhdCBjYXNlLCB3ZSB3b3VsZCBoYXZlIHVzZWQgdGhlIG9sZFxuICAvLyBzbmFwc2hvIGFuZCBnZXRTbmFwc2hvdCB2YWx1ZXMgdG8gYmFpbCBvdXQuIFdlIG5lZWQgdG8gY2hlY2sgb25lIG1vcmUgdGltZS5cblxuICBpZiAoY2hlY2tJZlNuYXBzaG90Q2hhbmdlZChpbnN0KSkge1xuICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlVG9TdG9yZShmaWJlciwgaW5zdCwgc3Vic2NyaWJlKSB7XG4gIHZhciBoYW5kbGVTdG9yZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGUgc3RvcmUgY2hhbmdlZC4gQ2hlY2sgaWYgdGhlIHNuYXBzaG90IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZVxuICAgIC8vIHJlYWQgZnJvbSB0aGUgc3RvcmUuXG4gICAgaWYgKGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkpIHtcbiAgICAgIC8vIEZvcmNlIGEgcmUtcmVuZGVyLlxuICAgICAgZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKTtcbiAgICB9XG4gIH07IC8vIFN1YnNjcmliZSB0byB0aGUgc3RvcmUgYW5kIHJldHVybiBhIGNsZWFuLXVwIGZ1bmN0aW9uLlxuXG5cbiAgcmV0dXJuIHN1YnNjcmliZShoYW5kbGVTdG9yZUNoYW5nZSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkge1xuICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSBpbnN0LmdldFNuYXBzaG90O1xuICB2YXIgcHJldlZhbHVlID0gaW5zdC52YWx1ZTtcblxuICB0cnkge1xuICAgIHZhciBuZXh0VmFsdWUgPSBsYXRlc3RHZXRTbmFwc2hvdCgpO1xuICAgIHJldHVybiAhb2JqZWN0SXMocHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcikge1xuICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcblxuICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gICAgaW5pdGlhbFN0YXRlID0gaW5pdGlhbFN0YXRlKCk7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgaW50ZXJsZWF2ZWQ6IG51bGwsXG4gICAgbGFuZXM6IE5vTGFuZXMsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICBob29rLnF1ZXVlID0gcXVldWU7XG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoID0gZGlzcGF0Y2hTZXRTdGF0ZS5iaW5kKG51bGwsIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIHF1ZXVlKTtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHJldHVybiB1cGRhdGVSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG59XG5cbmZ1bmN0aW9uIHB1c2hFZmZlY3QodGFnLCBjcmVhdGUsIGRlc3Ryb3ksIGRlcHMpIHtcbiAgdmFyIGVmZmVjdCA9IHtcbiAgICB0YWc6IHRhZyxcbiAgICBjcmVhdGU6IGNyZWF0ZSxcbiAgICBkZXN0cm95OiBkZXN0cm95LFxuICAgIGRlcHM6IGRlcHMsXG4gICAgLy8gQ2lyY3VsYXJcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHZhciBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEudXBkYXRlUXVldWU7XG5cbiAgaWYgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjcmVhdGVGdW5jdGlvbkNvbXBvbmVudFVwZGF0ZVF1ZXVlKCk7XG4gICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZSA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlO1xuICAgIGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgPSBlZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGFzdEVmZmVjdCA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3Q7XG5cbiAgICBpZiAobGFzdEVmZmVjdCA9PT0gbnVsbCkge1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICBsYXN0RWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgICBlZmZlY3QubmV4dCA9IGZpcnN0RWZmZWN0O1xuICAgICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWZmZWN0O1xufVxuXG5mdW5jdGlvbiBtb3VudFJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIHtcbiAgICB2YXIgX3JlZjIgPSB7XG4gICAgICBjdXJyZW50OiBpbml0aWFsVmFsdWVcbiAgICB9O1xuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IF9yZWYyO1xuICAgIHJldHVybiBfcmVmMjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHJldHVybiBob29rLm1lbW9pemVkU3RhdGU7XG59XG5cbmZ1bmN0aW9uIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBob29rRmxhZ3MsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIHVuZGVmaW5lZCwgbmV4dERlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgZGVzdHJveSA9IHVuZGVmaW5lZDtcblxuICBpZiAoY3VycmVudEhvb2sgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldkVmZmVjdCA9IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gICAgZGVzdHJveSA9IHByZXZFZmZlY3QuZGVzdHJveTtcblxuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldkVmZmVjdC5kZXBzO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChob29rRmxhZ3MsIGNyZWF0ZSwgZGVzdHJveSwgbmV4dERlcHMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBmaWJlckZsYWdzO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoRWZmZWN0KEhhc0VmZmVjdCB8IGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIHJldHVybiBtb3VudEVmZmVjdEltcGwoTW91bnRQYXNzaXZlRGV2IHwgUGFzc2l2ZSB8IFBhc3NpdmVTdGF0aWMsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFBhc3NpdmUgfCBQYXNzaXZlU3RhdGljLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChQYXNzaXZlLCBQYXNzaXZlJDEsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGZpYmVyRmxhZ3MgPSBVcGRhdGU7XG5cbiAge1xuICAgIGZpYmVyRmxhZ3MgfD0gTGF5b3V0U3RhdGljO1xuICB9XG5cbiAgaWYgKCAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUpIHtcbiAgICBmaWJlckZsYWdzIHw9IE1vdW50TGF5b3V0RGV2O1xuICB9XG5cbiAgcmV0dXJuIG1vdW50RWZmZWN0SW1wbChmaWJlckZsYWdzLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVmQ2FsbGJhY2sgPSByZWY7XG5cbiAgICB2YXIgX2luc3QgPSBjcmVhdGUoKTtcblxuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuXG4gICAge1xuICAgICAgaWYgKCFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIGZpcnN0IGFyZ3VtZW50IHRvIGVpdGhlciBiZSBhICcgKyAncmVmIGNhbGxiYWNrIG9yIFJlYWN0LmNyZWF0ZVJlZigpIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgJ2FuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhyZWZPYmplY3QpLmpvaW4oJywgJykgKyAnfScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfaW5zdDIgPSBjcmVhdGUoKTtcblxuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICB2YXIgZmliZXJGbGFncyA9IFVwZGF0ZTtcblxuICB7XG4gICAgZmliZXJGbGFncyB8PSBMYXlvdXRTdGF0aWM7XG4gIH1cblxuICBpZiAoIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSkge1xuICAgIGZpYmVyRmxhZ3MgfD0gTW91bnRMYXlvdXREZXY7XG4gIH1cblxuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIExheW91dCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZWZmZWN0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbChVcGRhdGUsIExheW91dCwgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSwgZWZmZWN0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIG1vdW50RGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHsvLyBUaGlzIGhvb2sgaXMgbm9ybWFsbHkgYSBuby1vcC5cbiAgLy8gVGhlIHJlYWN0LWRlYnVnLWhvb2tzIHBhY2thZ2UgaW5qZWN0cyBpdHMgb3duIGltcGxlbWVudGF0aW9uXG4gIC8vIHNvIHRoYXQgZS5nLiBEZXZUb29scyBjYW4gZGlzcGxheSBjdXN0b20gaG9vayB2YWx1ZXMuXG59XG5cbnZhciB1cGRhdGVEZWJ1Z1ZhbHVlID0gbW91bnREZWJ1Z1ZhbHVlO1xuXG5mdW5jdGlvbiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgbmV4dERlcHNdO1xuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgcHJldlN0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gbW91bnRNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNZW1vKG5leHRDcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEFzc3VtZSB0aGVzZSBhcmUgZGVmaW5lZC4gSWYgdGhleSdyZSBub3QsIGFyZUhvb2tJbnB1dHNFcXVhbCB3aWxsIHdhcm4uXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2U3RhdGVbMV07XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICByZXR1cm4gcHJldlN0YXRlWzBdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0VmFsdWUgPSBuZXh0Q3JlYXRlKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtuZXh0VmFsdWUsIG5leHREZXBzXTtcbiAgcmV0dXJuIG5leHRWYWx1ZTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWU7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgcmVzb2x2ZWRDdXJyZW50SG9vayA9IGN1cnJlbnRIb29rO1xuICB2YXIgcHJldlZhbHVlID0gcmVzb2x2ZWRDdXJyZW50SG9vay5tZW1vaXplZFN0YXRlO1xuICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgcHJldlZhbHVlLCB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmIChjdXJyZW50SG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSByZXJlbmRlciBkdXJpbmcgYSBtb3VudC5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlcmVuZGVyIGR1cmluZyBhbiB1cGRhdGUuXG4gICAgdmFyIHByZXZWYWx1ZSA9IGN1cnJlbnRIb29rLm1lbW9pemVkU3RhdGU7XG4gICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUpIHtcbiAgdmFyIHNob3VsZERlZmVyVmFsdWUgPSAhaW5jbHVkZXNPbmx5Tm9uVXJnZW50TGFuZXMocmVuZGVyTGFuZXMpO1xuXG4gIGlmIChzaG91bGREZWZlclZhbHVlKSB7XG4gICAgLy8gVGhpcyBpcyBhbiB1cmdlbnQgdXBkYXRlLiBJZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQsIGtlZXAgdXNpbmcgdGhlXG4gICAgLy8gcHJldmlvdXMgdmFsdWUgYW5kIHNwYXduIGEgZGVmZXJyZWQgcmVuZGVyIHRvIHVwZGF0ZSBpdCBsYXRlci5cbiAgICBpZiAoIW9iamVjdElzKHZhbHVlLCBwcmV2VmFsdWUpKSB7XG4gICAgICAvLyBTY2hlZHVsZSBhIGRlZmVycmVkIHJlbmRlclxuICAgICAgdmFyIGRlZmVycmVkTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCBkZWZlcnJlZExhbmUpO1xuICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyhkZWZlcnJlZExhbmUpOyAvLyBTZXQgdGhpcyB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlbmRlcmVkIHZhbHVlIGlzIGluY29uc2lzdGVudFxuICAgICAgLy8gZnJvbSB0aGUgbGF0ZXN0IHZhbHVlLiBUaGUgbmFtZSBcImJhc2VTdGF0ZVwiIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZVxuICAgICAgLy8gdXNlIGl0IGJlY2F1c2Ugd2UncmUgcmV1c2luZyBhIHN0YXRlIGhvb2sgZmllbGQgaW5zdGVhZCBvZiBjcmVhdGluZyBhXG4gICAgICAvLyBuZXcgb25lLlxuXG4gICAgICBob29rLmJhc2VTdGF0ZSA9IHRydWU7XG4gICAgfSAvLyBSZXVzZSB0aGUgcHJldmlvdXMgdmFsdWVcblxuXG4gICAgcmV0dXJuIHByZXZWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIG5vdCBhbiB1cmdlbnQgdXBkYXRlLCBzbyB3ZSBjYW4gdXNlIHRoZSBsYXRlc3QgdmFsdWUgcmVnYXJkbGVzc1xuICAgIC8vIG9mIHdoYXQgaXQgaXMuIE5vIG5lZWQgdG8gZGVmZXIgaXQuXG4gICAgLy8gSG93ZXZlciwgaWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhIHNwYXduZWQgcmVuZGVyLCB0aGVuIHdlIG5lZWQgdG8gbWFya1xuICAgIC8vIHRoaXMgYXMgYW4gdXBkYXRlIHRvIHByZXZlbnQgdGhlIGZpYmVyIGZyb20gYmFpbGluZyBvdXQuXG4gICAgLy9cbiAgICAvLyBgYmFzZVN0YXRlYCBpcyB0cnVlIHdoZW4gdGhlIGN1cnJlbnQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHJlbmRlcmVkXG4gICAgLy8gdmFsdWUuIFRoZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdGNoIGhvdyB3ZSB1c2UgaXQgYmVjYXVzZSB3ZSdyZSByZXVzaW5nXG4gICAgLy8gYSBzdGF0ZSBob29rIGZpZWxkIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICAgIGlmIChob29rLmJhc2VTdGF0ZSkge1xuICAgICAgLy8gRmxpcCB0aGlzIGJhY2sgdG8gZmFsc2UuXG4gICAgICBob29rLmJhc2VTdGF0ZSA9IGZhbHNlO1xuICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICB9XG5cbiAgICBob29rLm1lbW9pemVkU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RhcnRUcmFuc2l0aW9uKHNldFBlbmRpbmcsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShoaWdoZXJFdmVudFByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHksIENvbnRpbnVvdXNFdmVudFByaW9yaXR5KSk7XG4gIHNldFBlbmRpbmcodHJ1ZSk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uID0ge307XG4gIHZhciBjdXJyZW50VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDIudHJhbnNpdGlvbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMi50cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBzZXRQZW5kaW5nKGZhbHNlKTtcbiAgICBjYWxsYmFjaygpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQyLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIHtcbiAgICAgIGlmIChwcmV2VHJhbnNpdGlvbiA9PT0gbnVsbCAmJiBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycykge1xuICAgICAgICB2YXIgdXBkYXRlZEZpYmVyc0NvdW50ID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZTtcblxuICAgICAgICBpZiAodXBkYXRlZEZpYmVyc0NvdW50ID4gMTApIHtcbiAgICAgICAgICB3YXJuKCdEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uICcgKyAnSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gJyArICdPdGhlcndpc2UgY29uY3VycmVudCBtb2RlIGd1YXJhbnRlZXMgYXJlIG9mZiB0aGUgdGFibGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFRyYW5zaXRpb24oKSB7XG4gIHZhciBfbW91bnRTdGF0ZSA9IG1vdW50U3RhdGUoZmFsc2UpLFxuICAgICAgaXNQZW5kaW5nID0gX21vdW50U3RhdGVbMF0sXG4gICAgICBzZXRQZW5kaW5nID0gX21vdW50U3RhdGVbMV07IC8vIFRoZSBgc3RhcnRgIG1ldGhvZCBuZXZlciBjaGFuZ2VzLlxuXG5cbiAgdmFyIHN0YXJ0ID0gc3RhcnRUcmFuc2l0aW9uLmJpbmQobnVsbCwgc2V0UGVuZGluZyk7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gc3RhcnQ7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRyYW5zaXRpb24oKSB7XG4gIHZhciBfdXBkYXRlU3RhdGUgPSB1cGRhdGVTdGF0ZSgpLFxuICAgICAgaXNQZW5kaW5nID0gX3VwZGF0ZVN0YXRlWzBdO1xuXG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBzdGFydCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIFtpc1BlbmRpbmcsIHN0YXJ0XTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJUcmFuc2l0aW9uKCkge1xuICB2YXIgX3JlcmVuZGVyU3RhdGUgPSByZXJlbmRlclN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfcmVyZW5kZXJTdGF0ZVswXTtcblxuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgc3RhcnQgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gIHJldHVybiBbaXNQZW5kaW5nLCBzdGFydF07XG59XG5cbnZhciBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudElkKCkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByb290ID0gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCk7IC8vIFRPRE86IEluIEZpenosIGlkIGdlbmVyYXRpb24gaXMgc3BlY2lmaWMgdG8gZWFjaCBzZXJ2ZXIgY29uZmlnLiBNYXliZSB3ZVxuICAvLyBzaG91bGQgZG8gdGhpcyBpbiBGaWJlciwgdG9vPyBEZWZlcnJpbmcgdGhpcyBkZWNpc2lvbiBmb3Igbm93IGJlY2F1c2VcbiAgLy8gdGhlcmUncyBubyBvdGhlciBwbGFjZSB0byBzdG9yZSB0aGUgcHJlZml4IGV4Y2VwdCBmb3IgYW4gaW50ZXJuYWwgZmllbGQgb25cbiAgLy8gdGhlIHB1YmxpYyBjcmVhdGVSb290IG9iamVjdCwgd2hpY2ggdGhlIGZpYmVyIHRyZWUgZG9lcyBub3QgY3VycmVudGx5IGhhdmVcbiAgLy8gYSByZWZlcmVuY2UgdG8uXG5cbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSByb290LmlkZW50aWZpZXJQcmVmaXg7XG4gIHZhciBpZDtcblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIHZhciB0cmVlSWQgPSBnZXRUcmVlSWQoKTsgLy8gVXNlIGEgY2FwdGlhbCBSIHByZWZpeCBmb3Igc2VydmVyLWdlbmVyYXRlZCBpZHMuXG5cbiAgICBpZCA9ICc6JyArIGlkZW50aWZpZXJQcmVmaXggKyAnUicgKyB0cmVlSWQ7IC8vIFVubGVzcyB0aGlzIGlzIHRoZSBmaXJzdCBpZCBhdCB0aGlzIGxldmVsLCBhcHBlbmQgYSBudW1iZXIgYXQgdGhlIGVuZFxuICAgIC8vIHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgdGhpcyB1c2VJZCBob29rIGFtb25nIGFsbCB0aGUgdXNlSWRcbiAgICAvLyBob29rcyBmb3IgdGhpcyBmaWJlci5cblxuICAgIHZhciBsb2NhbElkID0gbG9jYWxJZENvdW50ZXIrKztcblxuICAgIGlmIChsb2NhbElkID4gMCkge1xuICAgICAgaWQgKz0gJ0gnICsgbG9jYWxJZC50b1N0cmluZygzMik7XG4gICAgfVxuXG4gICAgaWQgKz0gJzonO1xuICB9IGVsc2Uge1xuICAgIC8vIFVzZSBhIGxvd2VyY2FzZSByIHByZWZpeCBmb3IgY2xpZW50LWdlbmVyYXRlZCBpZHMuXG4gICAgdmFyIGdsb2JhbENsaWVudElkID0gZ2xvYmFsQ2xpZW50SWRDb3VudGVyKys7XG4gICAgaWQgPSAnOicgKyBpZGVudGlmaWVyUHJlZml4ICsgJ3InICsgZ2xvYmFsQ2xpZW50SWQudG9TdHJpbmcoMzIpICsgJzonO1xuICB9XG5cbiAgaG9vay5tZW1vaXplZFN0YXRlID0gaWQ7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSWQoKSB7XG4gIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBpZCA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaFJlZHVjZXJBY3Rpb24oZmliZXIsIHF1ZXVlLCBhY3Rpb24pIHtcbiAge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcihcIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlIFwiICsgJ3NlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyICcgKyAncmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIHRoZSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICB2YXIgdXBkYXRlID0ge1xuICAgIGxhbmU6IGxhbmUsXG4gICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgaGFzRWFnZXJTdGF0ZTogZmFsc2UsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpKSB7XG4gICAgZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpO1xuICB9IGVsc2Uge1xuICAgIGVucXVldWVVcGRhdGUkMShmaWJlciwgcXVldWUsIHVwZGF0ZSk7XG4gICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICB2YXIgcm9vdCA9IHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcblxuICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtVcGRhdGVJbkRldlRvb2xzKGZpYmVyLCBsYW5lKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hTZXRTdGF0ZShmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBoYXNFYWdlclN0YXRlOiBmYWxzZSxcbiAgICBlYWdlclN0YXRlOiBudWxsLFxuICAgIG5leHQ6IG51bGxcbiAgfTtcblxuICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIHtcbiAgICBlbnF1ZXVlUmVuZGVyUGhhc2VVcGRhdGUocXVldWUsIHVwZGF0ZSk7XG4gIH0gZWxzZSB7XG4gICAgZW5xdWV1ZVVwZGF0ZSQxKGZpYmVyLCBxdWV1ZSwgdXBkYXRlKTtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5oYXNFYWdlclN0YXRlID0gdHJ1ZTtcbiAgICAgICAgICB1cGRhdGUuZWFnZXJTdGF0ZSA9IGVhZ2VyU3RhdGU7XG5cbiAgICAgICAgICBpZiAob2JqZWN0SXMoZWFnZXJTdGF0ZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgICAgICAgLy8gRmFzdCBwYXRoLiBXZSBjYW4gYmFpbCBvdXQgd2l0aG91dCBzY2hlZHVsaW5nIFJlYWN0IHRvIHJlLXJlbmRlci5cbiAgICAgICAgICAgIC8vIEl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSdsbCBuZWVkIHRvIHJlYmFzZSB0aGlzIHVwZGF0ZSBsYXRlcixcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb21wb25lbnQgcmUtcmVuZGVycyBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIGFuZCBieSB0aGF0XG4gICAgICAgICAgICAvLyB0aW1lIHRoZSByZWR1Y2VyIGhhcyBjaGFuZ2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsvLyBTdXBwcmVzcyB0aGUgZXJyb3IuIEl0IHdpbGwgdGhyb3cgYWdhaW4gaW4gdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIHJvb3QgPSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgICAgZW50YW5nbGVUcmFuc2l0aW9uVXBkYXRlKHJvb3QsIHF1ZXVlLCBsYW5lKTtcbiAgICB9XG4gIH1cblxuICBtYXJrVXBkYXRlSW5EZXZUb29scyhmaWJlciwgbGFuZSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgcmV0dXJuIGZpYmVyID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDE7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKSB7XG4gIC8vIFRoaXMgaXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlLiBTdGFzaCBpdCBpbiBhIGxhemlseS1jcmVhdGVkIG1hcCBvZlxuICAvLyBxdWV1ZSAtPiBsaW5rZWQgbGlzdCBvZiB1cGRhdGVzLiBBZnRlciB0aGlzIHJlbmRlciBwYXNzLCB3ZSdsbCByZXN0YXJ0XG4gIC8vIGFuZCBhcHBseSB0aGUgc3Rhc2hlZCB1cGRhdGVzIG9uIHRvcCBvZiB0aGUgd29yay1pbi1wcm9ncmVzcyBob29rLlxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gdHJ1ZTtcbiAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUkMShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICBpZiAoaXNJbnRlcmxlYXZlZFVwZGF0ZShmaWJlcikpIHtcbiAgICB2YXIgaW50ZXJsZWF2ZWQgPSBxdWV1ZS5pbnRlcmxlYXZlZDtcblxuICAgIGlmIChpbnRlcmxlYXZlZCA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgICAgdXBkYXRlLm5leHQgPSB1cGRhdGU7IC8vIEF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyLCB0aGlzIHF1ZXVlJ3MgaW50ZXJsZWF2ZWQgdXBkYXRlcyB3aWxsXG4gICAgICAvLyBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgcGVuZGluZyBxdWV1ZS5cblxuICAgICAgcHVzaEludGVybGVhdmVkUXVldWUocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGUubmV4dCA9IGludGVybGVhdmVkLm5leHQ7XG4gICAgICBpbnRlcmxlYXZlZC5uZXh0ID0gdXBkYXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmludGVybGVhdmVkID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHZhciBwZW5kaW5nID0gcXVldWUucGVuZGluZztcblxuICAgIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUuIENyZWF0ZSBhIGNpcmN1bGFyIGxpc3QuXG4gICAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlLm5leHQgPSBwZW5kaW5nLm5leHQ7XG4gICAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gICAgfVxuXG4gICAgcXVldWUucGVuZGluZyA9IHVwZGF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUocm9vdCwgcXVldWUsIGxhbmUpIHtcbiAgaWYgKGlzVHJhbnNpdGlvbkxhbmUobGFuZSkpIHtcbiAgICB2YXIgcXVldWVMYW5lcyA9IHF1ZXVlLmxhbmVzOyAvLyBJZiBhbnkgZW50YW5nbGVkIGxhbmVzIGFyZSBubyBsb25nZXIgcGVuZGluZyBvbiB0aGUgcm9vdCwgdGhlbiB0aGV5XG4gICAgLy8gbXVzdCBoYXZlIGZpbmlzaGVkLiBXZSBjYW4gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc2hhcmVkIHF1ZXVlLCB3aGljaFxuICAgIC8vIHJlcHJlc2VudHMgYSBzdXBlcnNldCBvZiB0aGUgYWN0dWFsbHkgcGVuZGluZyBsYW5lcy4gSW4gc29tZSBjYXNlcyB3ZVxuICAgIC8vIG1heSBlbnRhbmdsZSBtb3JlIHRoYW4gd2UgbmVlZCB0bywgYnV0IHRoYXQncyBPSy4gSW4gZmFjdCBpdCdzIHdvcnNlIGlmXG4gICAgLy8gd2UgKmRvbid0KiBlbnRhbmdsZSB3aGVuIHdlIHNob3VsZC5cblxuICAgIHF1ZXVlTGFuZXMgPSBpbnRlcnNlY3RMYW5lcyhxdWV1ZUxhbmVzLCByb290LnBlbmRpbmdMYW5lcyk7IC8vIEVudGFuZ2xlIHRoZSBuZXcgdHJhbnNpdGlvbiBsYW5lIHdpdGggdGhlIG90aGVyIHRyYW5zaXRpb24gbGFuZXMuXG5cbiAgICB2YXIgbmV3UXVldWVMYW5lcyA9IG1lcmdlTGFuZXMocXVldWVMYW5lcywgbGFuZSk7XG4gICAgcXVldWUubGFuZXMgPSBuZXdRdWV1ZUxhbmVzOyAvLyBFdmVuIGlmIHF1ZXVlLmxhbmVzIGFscmVhZHkgaW5jbHVkZSBsYW5lLCB3ZSBkb24ndCBrbm93IGZvciBjZXJ0YWluIGlmXG4gICAgLy8gdGhlIGxhbmUgZmluaXNoZWQgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBlbnRhbmdsZWQgaXQuIFNvIHdlIG5lZWQgdG9cbiAgICAvLyBlbnRhbmdsZSBpdCBhZ2FpbiwganVzdCB0byBiZSBzdXJlLlxuXG4gICAgbWFya1Jvb3RFbnRhbmdsZWQocm9vdCwgbmV3UXVldWVMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1VwZGF0ZUluRGV2VG9vbHMoZmliZXIsIGxhbmUsIGFjdGlvbikge1xuXG4gIHtcbiAgICBtYXJrU3RhdGVVcGRhdGVTY2hlZHVsZWQoZmliZXIsIGxhbmUpO1xuICB9XG59XG5cbnZhciBDb250ZXh0T25seURpc3BhdGNoZXIgPSB7XG4gIHJlYWRDb250ZXh0OiByZWFkQ29udGV4dCxcbiAgdXNlQ2FsbGJhY2s6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlQ29udGV4dDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJbnNlcnRpb25FZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTGF5b3V0RWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTXV0YWJsZVNvdXJjZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VJZDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbn07XG5cbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICB9O1xuXG4gIHZhciB3YXJuSW52YWxpZEhvb2tBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0RvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gJyArICdZb3UgY2FuIG9ubHkgY2FsbCBIb29rcyBhdCB0aGUgdG9wIGxldmVsIG9mIHlvdXIgUmVhY3QgZnVuY3Rpb24uICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rcycpO1xuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2UoKTtcbiAgICB9LFxuICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN5bmNFeHRlcm5hbFN0b3JlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ2FsbGJhY2snO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW5zZXJ0aW9uRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVJbnNlcnRpb25FZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTGF5b3V0RWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCBnZXRTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgfSxcbiAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSWQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuXG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVJlZigpO1xuICAgIH0sXG4gICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVN0YXRlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZSgpO1xuICAgIH0sXG4gICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IGZ1bmN0aW9uIChzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3luY0V4dGVybmFsU3RvcmUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90KTtcbiAgICB9LFxuICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJZCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUlkKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcblxuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUluc2VydGlvbkVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUluc2VydGlvbkVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKCk7XG4gICAgfSxcbiAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKHN1YnNjcmliZSwgZ2V0U25hcHNob3QsIGdldFNlcnZlclNuYXBzaG90KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTeW5jRXh0ZXJuYWxTdG9yZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKHN1YnNjcmliZSwgZ2V0U25hcHNob3QpO1xuICAgIH0sXG4gICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUlkJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSWQoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xufVxuXG52YXIgbm93JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfbm93O1xudmFyIGNvbW1pdFRpbWUgPSAwO1xudmFyIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xO1xudmFyIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG52YXIgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IC0xO1xuLyoqXG4gKiBUcmFja3Mgd2hldGhlciB0aGUgY3VycmVudCB1cGRhdGUgd2FzIGEgbmVzdGVkL2Nhc2NhZGluZyB1cGRhdGUgKHNjaGVkdWxlZCBmcm9tIGEgbGF5b3V0IGVmZmVjdCkuXG4gKlxuICogVGhlIG92ZXJhbGwgc2VxdWVuY2UgaXM6XG4gKiAgIDEuIHJlbmRlclxuICogICAyLiBjb21taXQgKGFuZCBjYWxsIGBvblJlbmRlcmAsIGBvbkNvbW1pdGApXG4gKiAgIDMuIGNoZWNrIGZvciBuZXN0ZWQgdXBkYXRlc1xuICogICA0LiBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgKGFuZCBjYWxsIGBvblBvc3RDb21taXRgKVxuICpcbiAqIE5lc3RlZCB1cGRhdGVzIGFyZSBpZGVudGlmaWVkIGluIHN0ZXAgMyBhYm92ZSxcbiAqIGJ1dCBzdGVwIDQgc3RpbGwgYXBwbGllcyB0byB0aGUgd29yayB0aGF0IHdhcyBqdXN0IGNvbW1pdHRlZC5cbiAqIFdlIHVzZSB0d28gZmxhZ3MgdG8gdHJhY2sgbmVzdGVkIHVwZGF0ZXMgdGhlbjpcbiAqIG9uZSB0cmFja3Mgd2hldGhlciB0aGUgdXBjb21pbmcgdXBkYXRlIGlzIGEgbmVzdGVkIHVwZGF0ZSxcbiAqIGFuZCB0aGUgb3RoZXIgdHJhY2tzIHdoZXRoZXIgdGhlIGN1cnJlbnQgdXBkYXRlIHdhcyBhIG5lc3RlZCB1cGRhdGUuXG4gKiBUaGUgZmlyc3QgdmFsdWUgZ2V0cyBzeW5jZWQgdG8gdGhlIHNlY29uZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlbmRlciBwaGFzZS5cbiAqL1xuXG52YXIgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7XG52YXIgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpIHtcbiAgcmV0dXJuIGN1cnJlbnRVcGRhdGVJc05lc3RlZDtcbn1cblxuZnVuY3Rpb24gbWFya05lc3RlZFVwZGF0ZVNjaGVkdWxlZCgpIHtcbiAge1xuICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCkge1xuICB7XG4gICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkID0gZmFsc2U7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3luY05lc3RlZFVwZGF0ZUZsYWcoKSB7XG4gIHtcbiAgICBjdXJyZW50VXBkYXRlSXNOZXN0ZWQgPSBuZXN0ZWRVcGRhdGVTY2hlZHVsZWQ7XG4gICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q29tbWl0VGltZSgpIHtcbiAgcmV0dXJuIGNvbW1pdFRpbWU7XG59XG5cbmZ1bmN0aW9uIHJlY29yZENvbW1pdFRpbWUoKSB7XG5cbiAgY29tbWl0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0UHJvZmlsZXJUaW1lcihmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gbm93JDEoKTtcblxuICBpZiAoZmliZXIuYWN0dWFsU3RhcnRUaW1lIDwgMCkge1xuICAgIGZpYmVyLmFjdHVhbFN0YXJ0VGltZSA9IG5vdyQxKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoZmliZXIpIHtcblxuICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGZpYmVyLCBvdmVycmlkZUJhc2VUaW1lKSB7XG5cbiAgaWYgKHByb2ZpbGVyU3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gcHJvZmlsZXJTdGFydFRpbWU7XG4gICAgZmliZXIuYWN0dWFsRHVyYXRpb24gKz0gZWxhcHNlZFRpbWU7XG5cbiAgICBpZiAob3ZlcnJpZGVCYXNlVGltZSkge1xuICAgICAgZmliZXIuc2VsZkJhc2VEdXJhdGlvbiA9IGVsYXBzZWRUaW1lO1xuICAgIH1cblxuICAgIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmliZXIpIHtcblxuICBpZiAobGF5b3V0RWZmZWN0U3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gbGF5b3V0RWZmZWN0U3RhcnRUaW1lO1xuICAgIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IC0xOyAvLyBTdG9yZSBkdXJhdGlvbiBvbiB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yXG4gICAgLy8gT3IgdGhlIHJvb3QgKGZvciB0aGUgRGV2VG9vbHMgUHJvZmlsZXIgdG8gcmVhZClcblxuICAgIHZhciBwYXJlbnRGaWJlciA9IGZpYmVyLnJldHVybjtcblxuICAgIHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICByb290LmVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgcGFyZW50U3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlY29yZFBhc3NpdmVFZmZlY3REdXJhdGlvbihmaWJlcikge1xuXG4gIGlmIChwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID49IDApIHtcbiAgICB2YXIgZWxhcHNlZFRpbWUgPSBub3ckMSgpIC0gcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZTtcbiAgICBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gLTE7IC8vIFN0b3JlIGR1cmF0aW9uIG9uIHRoZSBuZXh0IG5lYXJlc3QgUHJvZmlsZXIgYW5jZXN0b3JcbiAgICAvLyBPciB0aGUgcm9vdCAoZm9yIHRoZSBEZXZUb29scyBQcm9maWxlciB0byByZWFkKVxuXG4gICAgdmFyIHBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuO1xuXG4gICAgd2hpbGUgKHBhcmVudEZpYmVyICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHZhciByb290ID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAocGFyZW50U3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBEZXRhY2hlZCBmaWJlcnMgaGF2ZSB0aGVpciBzdGF0ZSBub2RlIGNsZWFyZWQgb3V0LlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuIHBvaW50ZXIgaXMgYWxzbyBjbGVhcmVkIG91dCxcbiAgICAgICAgICAgIC8vIHNvIHdlIHdvbid0IGJlIGFibGUgdG8gcmVwb3J0IHRoZSB0aW1lIHNwZW50IGluIHRoaXMgUHJvZmlsZXIncyBzdWJ0cmVlLlxuICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFydExheW91dEVmZmVjdFRpbWVyKCkge1xuXG4gIGxheW91dEVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7XG59XG5cbmZ1bmN0aW9uIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCkge1xuXG4gIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUgPSBub3ckMSgpO1xufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKGZpYmVyKSB7XG4gIC8vIFRyYW5zZmVyIHRpbWUgc3BlbnQgcmVuZGVyaW5nIHRoZXNlIGNoaWxkcmVuIHNvIHdlIGRvbid0IGxvc2UgaXRcbiAgLy8gYWZ0ZXIgd2UgcmVyZW5kZXIuIFRoaXMgaXMgdXNlZCBhcyBhIGhlbHBlciBpbiBzcGVjaWFsIGNhc2VzXG4gIC8vIHdoZXJlIHdlIHNob3VsZCBjb3VudCB0aGUgd29yayBvZiBtdWx0aXBsZSBwYXNzZXMuXG4gIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpXG4gIH07XG59XG5cbi8vIFRoaXMgbW9kdWxlIGlzIGZvcmtlZCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuLy8gQnkgZGVmYXVsdCwgcmV0dXJuIGB0cnVlYCB0byBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlLlxuLy8gRm9ya3MgY2FuIHJldHVybiBgZmFsc2VgIGlmIHRoaXMgaXNuJ3QgZGVzaXJhYmxlLlxuZnVuY3Rpb24gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxvZ0NhcHR1cmVkRXJyb3IoYm91bmRhcnksIGVycm9ySW5mbykge1xuICB0cnkge1xuICAgIHZhciBsb2dFcnJvciA9IHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKTsgLy8gQWxsb3cgaW5qZWN0ZWQgc2hvd0Vycm9yRGlhbG9nKCkgdG8gcHJldmVudCBkZWZhdWx0IGNvbnNvbGUuZXJyb3IgbG9nZ2luZy5cbiAgICAvLyBUaGlzIGVuYWJsZXMgcmVuZGVyZXJzIGxpa2UgUmVhY3ROYXRpdmUgdG8gYmV0dGVyIG1hbmFnZSByZWRib3ggYmVoYXZpb3IuXG5cbiAgICBpZiAobG9nRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgaWYgKHRydWUpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBlcnJvckluZm8uc291cmNlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnOyAvLyBCcm93c2VycyBzdXBwb3J0IHNpbGVuY2luZyB1bmNhdWdodCBlcnJvcnMgYnkgY2FsbGluZ1xuICAgICAgLy8gYHByZXZlbnREZWZhdWx0KClgIGluIHdpbmRvdyBgZXJyb3JgIGhhbmRsZXIuXG4gICAgICAvLyBXZSByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbiBhcyBhbiBleHBhbmRvIG9uIHRoZSBlcnJvci5cblxuICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICBpZiAoYm91bmRhcnkudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBpcyByZWNvdmVyYWJsZSBhbmQgd2FzIHNpbGVuY2VkLlxuICAgICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuICAgICAgICAgIC8vIFRoaXMgaXMgaGFuZHkgZm9yIHRlc3RpbmcgZXJyb3IgYm91bmRhcmllcyB3aXRob3V0IG5vaXNlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBUaGUgZXJyb3IgaXMgZmF0YWwuIFNpbmNlIHRoZSBzaWxlbmNpbmcgbWlnaHQgaGF2ZVxuICAgICAgICAvLyBiZWVuIGFjY2lkZW50YWwsIHdlJ2xsIHN1cmZhY2UgaXQgYW55d2F5LlxuICAgICAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3NlciB3b3VsZCBoYXZlIHNpbGVuY2VkIHRoZSBvcmlnaW5hbCBlcnJvclxuICAgICAgICAvLyBzbyB3ZSdsbCBwcmludCBpdCBmaXJzdCwgYW5kIHRoZW4gcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuXG5cbiAgICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgICAgICAvLyBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgYmxvY2ssIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTMzODRcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBzb3VyY2UgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHNvdXJjZSkgOiBudWxsO1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWVNZXNzYWdlID0gY29tcG9uZW50TmFtZSA/IFwiVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIHRoZSA8XCIgKyBjb21wb25lbnROYW1lICsgXCI+IGNvbXBvbmVudDpcIiA6ICdUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gb25lIG9mIHlvdXIgUmVhY3QgY29tcG9uZW50czonO1xuICAgICAgdmFyIGVycm9yQm91bmRhcnlNZXNzYWdlO1xuXG4gICAgICBpZiAoYm91bmRhcnkudGFnID09PSBIb3N0Um9vdCkge1xuICAgICAgICBlcnJvckJvdW5kYXJ5TWVzc2FnZSA9ICdDb25zaWRlciBhZGRpbmcgYW4gZXJyb3IgYm91bmRhcnkgdG8geW91ciB0cmVlIHRvIGN1c3RvbWl6ZSBlcnJvciBoYW5kbGluZyBiZWhhdmlvci5cXG4nICsgJ1Zpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9lcnJvci1ib3VuZGFyaWVzIHRvIGxlYXJuIG1vcmUgYWJvdXQgZXJyb3IgYm91bmRhcmllcy4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVycm9yQm91bmRhcnlOYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihib3VuZGFyeSkgfHwgJ0Fub255bW91cyc7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gXCJSZWFjdCB3aWxsIHRyeSB0byByZWNyZWF0ZSB0aGlzIGNvbXBvbmVudCB0cmVlIGZyb20gc2NyYXRjaCBcIiArIChcInVzaW5nIHRoZSBlcnJvciBib3VuZGFyeSB5b3UgcHJvdmlkZWQsIFwiICsgZXJyb3JCb3VuZGFyeU5hbWUgKyBcIi5cIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21iaW5lZE1lc3NhZ2UgPSBjb21wb25lbnROYW1lTWVzc2FnZSArIFwiXFxuXCIgKyBjb21wb25lbnRTdGFjayArIFwiXFxuXFxuXCIgKyAoXCJcIiArIGVycm9yQm91bmRhcnlNZXNzYWdlKTsgLy8gSW4gZGV2ZWxvcG1lbnQsIHdlIHByb3ZpZGUgb3VyIG93biBtZXNzYWdlIHdpdGgganVzdCB0aGUgY29tcG9uZW50IHN0YWNrLlxuICAgICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZSBhbmQgSlMgc3RhY2sgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgICAgLy8gaGFzIGFscmVhZHkgcHJpbnRlZCBpdC4gRXZlbiBpZiB0aGUgYXBwbGljYXRpb24gc3dhbGxvd3MgdGhlIGVycm9yLCBpdCBpcyBzdGlsbFxuICAgICAgLy8gZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIHRoYW5rcyB0byB0aGUgREVWLW9ubHkgZmFrZSBldmVudCB0cmljayBpbiBSZWFjdEVycm9yVXRpbHMuXG5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oY29tYmluZWRNZXNzYWdlKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIHByb2R1Y3Rpb24sIHdlIHByaW50IHRoZSBlcnJvciBkaXJlY3RseS5cbiAgICAgIC8vIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBtZXNzYWdlLCB0aGUgSlMgc3RhY2ssIGFuZCBhbnl0aGluZyB0aGUgYnJvd3NlciB3YW50cyB0byBzaG93LlxuICAgICAgLy8gV2UgcGFzcyB0aGUgZXJyb3Igb2JqZWN0IGluc3RlYWQgb2YgY3VzdG9tIG1lc3NhZ2Ugc28gdGhhdCB0aGUgYnJvd3NlciBkaXNwbGF5cyB0aGUgZXJyb3IgbmF0aXZlbHkuXG4gICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFBvc3NpYmx5V2Vha01hcCQxID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuXG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cblxuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogbnVsbFxuICB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7XG4gICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIHVwZGF0ZS5wYXlsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvciQxKTtcbiAgICB9O1xuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAge1xuICAgICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgICB9XG5cbiAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gIGlmIChpbnN0ICE9PSBudWxsICYmIHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcblxuICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhlIHByZWV4aXN0aW5nIHJldHJ5IGJlaGF2aW9yIG9mIGVycm9yIGJvdW5kYXJpZXMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb25lcyBhbHJlYWR5IGZhaWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLlxuICAgICAgICAvLyBUT0RPOiBXYXJuIGluIHN0cmljdCBtb2RlIGlmIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpc1xuICAgICAgICAvLyBub3QgZGVmaW5lZC5cbiAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVycm9yJDEgPSBlcnJvckluZm8udmFsdWU7XG4gICAgICB2YXIgc3RhY2sgPSBlcnJvckluZm8uc3RhY2s7XG4gICAgICB0aGlzLmNvbXBvbmVudERpZENhdGNoKGVycm9yJDEsIHtcbiAgICAgICAgY29tcG9uZW50U3RhY2s6IHN0YWNrICE9PSBudWxsID8gc3RhY2sgOiAnJ1xuICAgICAgfSk7XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBJZiBjb21wb25lbnREaWRDYXRjaCBpcyB0aGUgb25seSBlcnJvciBib3VuZGFyeSBtZXRob2QgZGVmaW5lZCxcbiAgICAgICAgICAvLyB0aGVuIGl0IG5lZWRzIHRvIGNhbGwgc2V0U3RhdGUgdG8gcmVjb3ZlciBmcm9tIGVycm9ycy5cbiAgICAgICAgICAvLyBJZiBubyBzdGF0ZSB1cGRhdGUgaXMgc2NoZWR1bGVkIHRoZW4gdGhlIGJvdW5kYXJ5IHdpbGwgc3dhbGxvdyB0aGUgZXJyb3IuXG4gICAgICAgICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKGZpYmVyLmxhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICAgICAgICAgIGVycm9yKCclczogRXJyb3IgYm91bmRhcmllcyBzaG91bGQgaW1wbGVtZW50IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpLiAnICsgJ0luIHRoYXQgbWV0aG9kLCByZXR1cm4gYSBzdGF0ZSB1cGRhdGUgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIG9yIGZhbGxiYWNrIFVJLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gQXR0YWNoIGEgcGluZyBsaXN0ZW5lclxuICAvL1xuICAvLyBUaGUgZGF0YSBtaWdodCByZXNvbHZlIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIGNvbW1pdCB0aGUgZmFsbGJhY2suIE9yLFxuICAvLyBpbiB0aGUgY2FzZSBvZiBhIHJlZnJlc2gsIHdlJ2xsIG5ldmVyIGNvbW1pdCBhIGZhbGxiYWNrLiBTbyB3ZSBuZWVkIHRvXG4gIC8vIGF0dGFjaCBhIGxpc3RlbmVyIG5vdy4gV2hlbiBpdCByZXNvbHZlcyAoXCJwaW5nc1wiKSwgd2UgY2FuIGRlY2lkZSB3aGV0aGVyIHRvXG4gIC8vIHRyeSByZW5kZXJpbmcgdGhlIHRyZWUgYWdhaW4uXG4gIC8vXG4gIC8vIE9ubHkgYXR0YWNoIGEgbGlzdGVuZXIgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBsYW5lc1xuICAvLyB3ZSdyZSBjdXJyZW50bHkgcmVuZGVyaW5nICh3aGljaCBhY3RzIGxpa2UgYSBcInRocmVhZCBJRFwiIGhlcmUpLlxuICAvL1xuICAvLyBXZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpbiBjb25jdXJyZW50IG1vZGUuIExlZ2FjeSBTdXNwZW5zZSBhbHdheXNcbiAgLy8gY29tbWl0cyBmYWxsYmFja3Mgc3luY2hyb25vdXNseSwgc28gdGhlcmUgYXJlIG5vIHBpbmdzLlxuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG4gIHZhciB0aHJlYWRJRHM7XG5cbiAgaWYgKHBpbmdDYWNoZSA9PT0gbnVsbCkge1xuICAgIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCQxKCk7XG4gICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyZWFkSURzID0gcGluZ0NhY2hlLmdldCh3YWtlYWJsZSk7XG5cbiAgICBpZiAodGhyZWFkSURzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocmVhZElEcyA9IG5ldyBTZXQoKTtcbiAgICAgIHBpbmdDYWNoZS5zZXQod2FrZWFibGUsIHRocmVhZElEcyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0aHJlYWRJRHMuaGFzKGxhbmVzKSkge1xuICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIHRocmVhZCBJRCB0byBwcmV2ZW50IHJlZHVuZGFudCBsaXN0ZW5lcnMuXG4gICAgdGhyZWFkSURzLmFkZChsYW5lcyk7XG4gICAgdmFyIHBpbmcgPSBwaW5nU3VzcGVuZGVkUm9vdC5iaW5kKG51bGwsIHJvb3QsIHdha2VhYmxlLCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHVwZGF0ZXJzXG4gICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdha2VhYmxlLnRoZW4ocGluZywgcGluZyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoUmV0cnlMaXN0ZW5lcihzdXNwZW5zZUJvdW5kYXJ5LCByb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gUmV0cnkgbGlzdGVuZXJcbiAgLy9cbiAgLy8gSWYgdGhlIGZhbGxiYWNrIGRvZXMgY29tbWl0LCB3ZSBuZWVkIHRvIGF0dGFjaCBhIGRpZmZlcmVudCB0eXBlIG9mXG4gIC8vIGxpc3RlbmVyLiBUaGlzIG9uZSBzY2hlZHVsZXMgYW4gdXBkYXRlIG9uIHRoZSBTdXNwZW5zZSBib3VuZGFyeSB0byB0dXJuXG4gIC8vIHRoZSBmYWxsYmFjayBzdGF0ZSBvZmYuXG4gIC8vXG4gIC8vIFN0YXNoIHRoZSB3YWtlYWJsZSBvbiB0aGUgYm91bmRhcnkgZmliZXIgc28gd2UgY2FuIGFjY2VzcyBpdCBpbiB0aGVcbiAgLy8gY29tbWl0IHBoYXNlLlxuICAvL1xuICAvLyBXaGVuIHRoZSB3YWtlYWJsZSByZXNvbHZlcywgd2UnbGwgYXR0ZW1wdCB0byByZW5kZXIgdGhlIGJvdW5kYXJ5XG4gIC8vIGFnYWluIChcInJldHJ5XCIpLlxuICB2YXIgd2FrZWFibGVzID0gc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZTtcblxuICBpZiAod2FrZWFibGVzID09PSBudWxsKSB7XG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gbmV3IFNldCgpO1xuICAgIHVwZGF0ZVF1ZXVlLmFkZCh3YWtlYWJsZSk7XG4gICAgc3VzcGVuc2VCb3VuZGFyeS51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICB9IGVsc2Uge1xuICAgIHdha2VhYmxlcy5hZGQod2FrZWFibGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3VzcGVuZGVkQ29tcG9uZW50KHNvdXJjZUZpYmVyLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gQSBsZWdhY3kgbW9kZSBTdXNwZW5zZSBxdWlyaywgb25seSByZWxldmFudCB0byBob29rIGNvbXBvbmVudHMuXG5cblxuICB2YXIgdGFnID0gc291cmNlRmliZXIudGFnO1xuXG4gIGlmICgoc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmICh0YWcgPT09IEZ1bmN0aW9uQ29tcG9uZW50IHx8IHRhZyA9PT0gRm9yd2FyZFJlZiB8fCB0YWcgPT09IFNpbXBsZU1lbW9Db21wb25lbnQpKSB7XG4gICAgdmFyIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudFNvdXJjZSkge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBjdXJyZW50U291cmNlLnVwZGF0ZVF1ZXVlO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gY3VycmVudFNvdXJjZS5sYW5lcztcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5lYXJlc3RTdXNwZW5zZUJvdW5kYXJ5VG9DYXB0dXJlKHJldHVybkZpYmVyKSB7XG4gIHZhciBub2RlID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgc2hvdWxkQ2FwdHVyZVN1c3BlbnNlKG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IC8vIFRoaXMgYm91bmRhcnkgYWxyZWFkeSBjYXB0dXJlZCBkdXJpbmcgdGhpcyByZW5kZXIuIENvbnRpbnVlIHRvIHRoZSBuZXh0XG4gICAgLy8gYm91bmRhcnkuXG5cblxuICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgfSB3aGlsZSAobm9kZSAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShzdXNwZW5zZUJvdW5kYXJ5LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHJvb3QsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIG1hcmtzIGEgU3VzcGVuc2UgYm91bmRhcnkgc28gdGhhdCB3aGVuIHdlJ3JlIHVud2luZGluZyB0aGUgc3RhY2ssXG4gIC8vIGl0IGNhcHR1cmVzIHRoZSBzdXNwZW5kZWQgXCJleGNlcHRpb25cIiBhbmQgZG9lcyBhIHNlY29uZCAoZmFsbGJhY2spIHBhc3MuXG4gIGlmICgoc3VzcGVuc2VCb3VuZGFyeS5tb2RlICYgQ29uY3VycmVudE1vZGUpID09PSBOb01vZGUpIHtcbiAgICAvLyBMZWdhY3kgTW9kZSBTdXNwZW5zZVxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGJvdW5kYXJ5IGlzIGluIGxlZ2FjeSBtb2RlLCB3ZSBzaG91bGQgKm5vdCpcbiAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWRcbiAgICAvLyBudWxsIGFuZCBrZWVwIHJlbmRlcmluZy4gV2hlbiB0aGUgU3VzcGVuc2UgYm91bmRhcnkgY29tcGxldGVzLFxuICAgIC8vIHdlJ2xsIGRvIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIHRoZSBmYWxsYmFjay5cbiAgICBpZiAoc3VzcGVuc2VCb3VuZGFyeSA9PT0gcmV0dXJuRmliZXIpIHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBzdXNwZW5kZWQgd2hpbGUgcmVjb25jaWxpbmcgdGhlIGNoaWxkcmVuIG9mXG4gICAgICAvLyBhIFN1c3BlbnNlIGJvdW5kYXJ5J3MgaW5uZXIgT2Zmc2NyZWVuIHdyYXBwZXIgZmliZXIuIFRoaXMgaGFwcGVuc1xuICAgICAgLy8gd2hlbiBhIFJlYWN0LmxhenkgY29tcG9uZW50IGlzIGEgZGlyZWN0IGNoaWxkIG9mIGFcbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJ5LlxuICAgICAgLy9cbiAgICAgIC8vIFN1c3BlbnNlIGJvdW5kYXJpZXMgYXJlIGltcGxlbWVudGVkIGFzIG11bHRpcGxlIGZpYmVycywgYnV0IHRoZXlcbiAgICAgIC8vIGFyZSBhIHNpbmdsZSBjb25jZXB0dWFsIHVuaXQuIFRoZSBsZWdhY3kgbW9kZSBiZWhhdmlvciB3aGVyZSB3ZVxuICAgICAgLy8gcHJldGVuZCB0aGUgc3VzcGVuZGVkIGZpYmVyIGNvbW1pdHRlZCBhcyBgbnVsbGAgd29uJ3Qgd29yayxcbiAgICAgIC8vIGJlY2F1c2UgaW4gdGhpcyBjYXNlIHRoZSBcInN1c3BlbmRlZFwiIGZpYmVyIGlzIHRoZSBpbm5lclxuICAgICAgLy8gT2Zmc2NyZWVuIHdyYXBwZXIuXG4gICAgICAvL1xuICAgICAgLy8gQmVjYXVzZSB0aGUgY29udGVudHMgb2YgdGhlIGJvdW5kYXJ5IGhhdmVuJ3Qgc3RhcnRlZCByZW5kZXJpbmdcbiAgICAgIC8vIHlldCAoaS5lLiBub3RoaW5nIGluIHRoZSB0cmVlIGhhcyBwYXJ0aWFsbHkgcmVuZGVyZWQpIHdlIGNhblxuICAgICAgLy8gc3dpdGNoIHRvIHRoZSByZWd1bGFyLCBjb25jdXJyZW50IG1vZGUgYmVoYXZpb3I6IG1hcmsgdGhlXG4gICAgICAvLyBib3VuZGFyeSB3aXRoIFNob3VsZENhcHR1cmUgYW5kIGVudGVyIHRoZSB1bndpbmQgcGhhc2UuXG4gICAgICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2U7IC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgIC8vIEJ1dCB3ZSBzaG91bGRuJ3QgY2FsbCBhbnkgbGlmZWN5Y2xlIG1ldGhvZHMgb3IgY2FsbGJhY2tzLiBSZW1vdmVcbiAgICAgIC8vIGFsbCBsaWZlY3ljbGUgZWZmZWN0IHRhZ3MuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmZsYWdzICY9IH4oTGlmZWN5Y2xlRWZmZWN0TWFzayB8IEluY29tcGxldGUpO1xuXG4gICAgICBpZiAoc291cmNlRmliZXIudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICB2YXIgY3VycmVudFNvdXJjZUZpYmVyID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50LiBDaGFuZ2UgdGhlIHRhZyBzbyBpdCdzIG5vdCBtaXN0YWtlbiBmb3IgYVxuICAgICAgICAgIC8vIGNvbXBsZXRlZCBjbGFzcyBjb21wb25lbnQuIEZvciBleGFtcGxlLCB3ZSBzaG91bGQgbm90IGNhbGxcbiAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgIHNvdXJjZUZpYmVyLnRhZyA9IEluY29tcGxldGVDbGFzc0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgLy8gc2luY2UgaXQncyBrbm93biB0byBiZSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFVzZSBhIGZvcmNlIHVwZGF0ZSB0b1xuICAgICAgICAgIC8vIHByZXZlbnQgYSBiYWlsIG91dC5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBTeW5jTGFuZSk7XG4gICAgICAgICAgdXBkYXRlLnRhZyA9IEZvcmNlVXBkYXRlO1xuICAgICAgICAgIGVucXVldWVVcGRhdGUoc291cmNlRmliZXIsIHVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLiBNYXJrIGl0IHdpdGggU3luYyBwcmlvcml0eSB0b1xuICAgICAgLy8gaW5kaWNhdGUgdGhhdCBpdCBzdGlsbCBoYXMgcGVuZGluZyB3b3JrLlxuXG5cbiAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xuICB9IC8vIENvbmZpcm1lZCB0aGF0IHRoZSBib3VuZGFyeSBpcyBpbiBhIGNvbmN1cnJlbnQgbW9kZSB0cmVlLiBDb250aW51ZVxuICAvLyB3aXRoIHRoZSBub3JtYWwgc3VzcGVuZCBwYXRoLlxuICAvL1xuICAvLyBBZnRlciB0aGlzIHdlJ2xsIHVzZSBhIHNldCBvZiBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXNcbiAgLy8gcmVuZGVyIHBhc3Mgd2lsbCBydW4gdG8gY29tcGxldGlvbiBvciByZXN0YXJ0IG9yIFwic3VzcGVuZFwiIHRoZSBjb21taXQuXG4gIC8vIFRoZSBhY3R1YWwgbG9naWMgZm9yIHRoaXMgaXMgc3ByZWFkIG91dCBpbiBkaWZmZXJlbnQgcGxhY2VzLlxuICAvL1xuICAvLyBUaGlzIGZpcnN0IHByaW5jaXBsZSBpcyB0aGF0IGlmIHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2hlbiB3ZSBjb21wbGV0ZVxuICAvLyBhIHJvb3QsIHRoZW4gd2Ugc2hvdWxkIGFsc28gcmVzdGFydCBpZiB3ZSBnZXQgYW4gdXBkYXRlIG9yIHBpbmcgdGhhdFxuICAvLyBtaWdodCB1bnN1c3BlbmQgaXQsIGFuZCB2aWNlIHZlcnNhLiBUaGUgb25seSByZWFzb24gdG8gc3VzcGVuZCBpc1xuICAvLyBiZWNhdXNlIHlvdSB0aGluayB5b3UgbWlnaHQgd2FudCB0byByZXN0YXJ0IGJlZm9yZSBjb21taXR0aW5nLiBIb3dldmVyLFxuICAvLyBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcmVzdGFydCBvbmx5IHdoaWxlIGluIHRoZSBwZXJpb2Qgd2UncmUgc3VzcGVuZGVkLlxuICAvL1xuICAvLyBSZXN0YXJ0aW5nIHRvbyBhZ2dyZXNzaXZlbHkgaXMgYWxzbyBub3QgZ29vZCBiZWNhdXNlIGl0IHN0YXJ2ZXMgb3V0IGFueVxuICAvLyBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gU28gd2UgdXNlIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIHdoZW4uXG4gIC8vIFN1c3BlbnNlIEhldXJpc3RpY3NcbiAgLy9cbiAgLy8gSWYgbm90aGluZyB0aHJldyBhIFByb21pc2Ugb3IgYWxsIHRoZSBzYW1lIGZhbGxiYWNrcyBhcmUgYWxyZWFkeSBzaG93aW5nLFxuICAvLyB0aGVuIGRvbid0IHN1c3BlbmQvcmVzdGFydC5cbiAgLy9cbiAgLy8gSWYgdGhpcyBpcyBhbiBpbml0aWFsIHJlbmRlciBvZiBhIG5ldyB0cmVlIG9mIFN1c3BlbnNlIGJvdW5kYXJpZXMgYW5kXG4gIC8vIHRob3NlIHRyaWdnZXIgYSBmYWxsYmFjaywgdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgY2FuIHNob3cgdGhlIGluaXRpYWwgbG9hZGluZyBzdGF0ZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLlxuICAvL1xuICAvLyBJZiB3ZSBoaXQgYSBcIkRlbGF5ZWRcIiBjYXNlLCBzdWNoIGFzIHdoZW4gd2UnZCBzd2l0Y2ggZnJvbSBjb250ZW50IGJhY2sgaW50b1xuICAvLyBhIGZhbGxiYWNrLCB0aGVuIHdlIHNob3VsZCBhbHdheXMgc3VzcGVuZC9yZXN0YXJ0LiBUcmFuc2l0aW9ucyBhcHBseVxuICAvLyB0byB0aGlzIGNhc2UuIElmIG5vbmUgaXMgZGVmaW5lZCwgSk5EIGlzIHVzZWQgaW5zdGVhZC5cbiAgLy9cbiAgLy8gSWYgd2UncmUgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgYW5kIGl0IGdldHMgXCJyZXRyaWVkXCIsIGFsbG93aW5nIHVzIHRvIHNob3dcbiAgLy8gYW5vdGhlciBsZXZlbCwgYnV0IHRoZXJlJ3Mgc3RpbGwgYW4gaW5uZXIgYm91bmRhcnkgdGhhdCB3b3VsZCBzaG93IGEgZmFsbGJhY2ssXG4gIC8vIHRoZW4gd2Ugc3VzcGVuZC9yZXN0YXJ0IGZvciA1MDBtcyBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHNob3dlZCBhIGZhbGxiYWNrXG4gIC8vIGFueXdoZXJlIGluIHRoZSB0cmVlLiBUaGlzIGVmZmVjdGl2ZWx5IHRocm90dGxlcyBwcm9ncmVzc2l2ZSBsb2FkaW5nIGludG8gYVxuICAvLyBjb25zaXN0ZW50IHRyYWluIG9mIGNvbW1pdHMuIFRoaXMgYWxzbyBnaXZlcyB1cyBhbiBvcHBvcnR1bml0eSB0byByZXN0YXJ0IHRvXG4gIC8vIGdldCB0byB0aGUgY29tcGxldGVkIHN0YXRlIHNsaWdodGx5IGVhcmxpZXIuXG4gIC8vXG4gIC8vIElmIHRoZXJlJ3MgYW1iaWd1aXR5IGR1ZSB0byBiYXRjaGluZyBpdCdzIHJlc29sdmVkIGluIHByZWZlcmVuY2Ugb2Y6XG4gIC8vIDEpIFwiZGVsYXllZFwiLCAyKSBcImluaXRpYWwgcmVuZGVyXCIsIDMpIFwicmV0cnlcIi5cbiAgLy9cbiAgLy8gV2Ugd2FudCB0byBlbnN1cmUgdGhhdCBhIFwiYnVzeVwiIHN0YXRlIGRvZXNuJ3QgZ2V0IGZvcmNlIGNvbW1pdHRlZC4gV2Ugd2FudCB0b1xuICAvLyBlbnN1cmUgdGhhdCBuZXcgaW5pdGlhbCBsb2FkaW5nIHN0YXRlcyBjYW4gY29tbWl0IGFzIHNvb24gYXMgcG9zc2libGUuXG5cblxuICBzdXNwZW5zZUJvdW5kYXJ5LmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIFRPRE86IEkgdGhpbmsgd2UgY2FuIHJlbW92ZSB0aGlzLCBzaW5jZSB3ZSBub3cgdXNlIGBEaWRDYXB0dXJlYCBpblxuICAvLyB0aGUgYmVnaW4gcGhhc2UgdG8gcHJldmVudCBhbiBlYXJseSBiYWlsb3V0LlxuXG4gIHN1c3BlbnNlQm91bmRhcnkubGFuZXMgPSByb290UmVuZGVyTGFuZXM7XG4gIHJldHVybiBzdXNwZW5zZUJvdW5kYXJ5O1xufVxuXG5mdW5jdGlvbiB0aHJvd0V4Y2VwdGlvbihyb290LCByZXR1cm5GaWJlciwgc291cmNlRmliZXIsIHZhbHVlLCByb290UmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhlIHNvdXJjZSBmaWJlciBkaWQgbm90IGNvbXBsZXRlLlxuICBzb3VyY2VGaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuXG4gIHtcbiAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3b3JrIHN0aWxsLCByZXN0b3JlIHRoZSBvcmlnaW5hbCB1cGRhdGVyc1xuICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCByb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVGhpcyBpcyBhIHdha2VhYmxlLiBUaGUgY29tcG9uZW50IHN1c3BlbmRlZC5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcbiAgICByZXNldFN1c3BlbmRlZENvbXBvbmVudChzb3VyY2VGaWJlcik7XG5cbiAgICB7XG4gICAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBzb3VyY2VGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgbWFya0RpZFRocm93V2hpbGVIeWRyYXRpbmdERVYoKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHZhciBzdXNwZW5zZUJvdW5kYXJ5ID0gZ2V0TmVhcmVzdFN1c3BlbnNlQm91bmRhcnlUb0NhcHR1cmUocmV0dXJuRmliZXIpO1xuXG4gICAgaWYgKHN1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgIHN1c3BlbnNlQm91bmRhcnkuZmxhZ3MgJj0gfkZvcmNlQ2xpZW50UmVuZGVyO1xuICAgICAgbWFya1N1c3BlbnNlQm91bmRhcnlTaG91bGRDYXB0dXJlKHN1c3BlbnNlQm91bmRhcnksIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgcm9vdCwgcm9vdFJlbmRlckxhbmVzKTsgLy8gV2Ugb25seSBhdHRhY2ggcGluZyBsaXN0ZW5lcnMgaW4gY29uY3VycmVudCBtb2RlLiBMZWdhY3kgU3VzcGVuc2UgYWx3YXlzXG4gICAgICAvLyBjb21taXRzIGZhbGxiYWNrcyBzeW5jaHJvbm91c2x5LCBzbyB0aGVyZSBhcmUgbm8gcGluZ3MuXG5cbiAgICAgIGlmIChzdXNwZW5zZUJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkge1xuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGF0dGFjaFJldHJ5TGlzdGVuZXIoc3VzcGVuc2VCb3VuZGFyeSwgcm9vdCwgd2FrZWFibGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBib3VuZGFyeSB3YXMgZm91bmQuIFVubGVzcyB0aGlzIGlzIGEgc3luYyB1cGRhdGUsIHRoaXMgaXMgT0suXG4gICAgICAvLyBXZSBjYW4gc3VzcGVuZCBhbmQgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cbiAgICAgIGlmICghaW5jbHVkZXNTeW5jTGFuZShyb290UmVuZGVyTGFuZXMpKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgbm90IGEgc3luYyB1cGRhdGUuIFN1c3BlbmQuIFNpbmNlIHdlJ3JlIG5vdCBhY3RpdmF0aW5nIGFcbiAgICAgICAgLy8gU3VzcGVuc2UgYm91bmRhcnksIHRoaXMgd2lsbCB1bndpbmQgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3Qgd2l0aG91dFxuICAgICAgICAvLyBwZXJmb3JtaW5nIGEgc2Vjb25kIHBhc3MgdG8gcmVuZGVyIGEgZmFsbGJhY2suIChUaGlzIGlzIGFyZ3VhYmx5IGhvd1xuICAgICAgICAvLyByZWZyZXNoIHRyYW5zaXRpb25zIHNob3VsZCB3b3JrLCB0b28sIHNpbmNlIHdlJ3JlIG5vdCBnb2luZyB0byBjb21taXRcbiAgICAgICAgLy8gdGhlIGZhbGxiYWNrcyBhbnl3YXkuKVxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIGNhc2UgYWxzbyBhcHBsaWVzIHRvIGluaXRpYWwgaHlkcmF0aW9uLlxuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBUaGlzIGlzIGEgc3luYy9kaXNjcmV0ZSB1cGRhdGUuIFdlIHRyZWF0IHRoaXMgY2FzZSBsaWtlIGFuIGVycm9yXG4gICAgICAvLyBiZWNhdXNlIGRpc2NyZXRlIHJlbmRlcnMgYXJlIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBjb21wbGV0ZSB0cmVlXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggZXh0ZXJuYWwgc3RhdGUuXG5cblxuICAgICAgdmFyIHVuY2F1Z2h0U3VzcGVuc2VFcnJvciA9IG5ldyBFcnJvcignQSBjb21wb25lbnQgc3VzcGVuZGVkIHdoaWxlIHJlc3BvbmRpbmcgdG8gc3luY2hyb25vdXMgaW5wdXQuIFRoaXMgJyArICd3aWxsIGNhdXNlIHRoZSBVSSB0byBiZSByZXBsYWNlZCB3aXRoIGEgbG9hZGluZyBpbmRpY2F0b3IuIFRvICcgKyAnZml4LCB1cGRhdGVzIHRoYXQgc3VzcGVuZCBzaG91bGQgYmUgd3JhcHBlZCAnICsgJ3dpdGggc3RhcnRUcmFuc2l0aW9uLicpOyAvLyBJZiB3ZSdyZSBvdXRzaWRlIGEgdHJhbnNpdGlvbiwgZmFsbCB0aHJvdWdoIHRvIHRoZSByZWd1bGFyIGVycm9yIHBhdGguXG4gICAgICAvLyBUaGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgYnkgdGhlIG5lYXJlc3Qgc3VzcGVuc2UgYm91bmRhcnkuXG5cbiAgICAgIHZhbHVlID0gdW5jYXVnaHRTdXNwZW5zZUVycm9yO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVndWxhciBlcnJvciwgbm90IGEgU3VzcGVuc2Ugd2FrZWFibGUuXG4gICAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgc291cmNlRmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBtYXJrRGlkVGhyb3dXaGlsZUh5ZHJhdGluZ0RFVigpO1xuXG4gICAgICB2YXIgX3N1c3BlbnNlQm91bmRhcnkgPSBnZXROZWFyZXN0U3VzcGVuc2VCb3VuZGFyeVRvQ2FwdHVyZShyZXR1cm5GaWJlcik7IC8vIElmIHRoZSBlcnJvciB3YXMgdGhyb3duIGR1cmluZyBoeWRyYXRpb24sIHdlIG1heSBiZSBhYmxlIHRvIHJlY292ZXIgYnlcbiAgICAgIC8vIGRpc2NhcmRpbmcgdGhlIGRlaHlkcmF0ZWQgY29udGVudCBhbmQgc3dpdGNoaW5nIHRvIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIC8vIEluc3RlYWQgb2Ygc3VyZmFjaW5nIHRoZSBlcnJvciwgZmluZCB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeVxuICAgICAgLy8gYW5kIHJlbmRlciBpdCBhZ2FpbiB3aXRob3V0IGh5ZHJhdGlvbi5cblxuXG4gICAgICBpZiAoX3N1c3BlbnNlQm91bmRhcnkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKChfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyAmIFNob3VsZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU2V0IGEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCB0cnkgcmVuZGVyaW5nIHRoZSBub3JtYWxcbiAgICAgICAgICAvLyBjaGlsZHJlbiBhZ2Fpbiwgbm90IHRoZSBmYWxsYmFjay5cbiAgICAgICAgICBfc3VzcGVuc2VCb3VuZGFyeS5mbGFncyB8PSBGb3JjZUNsaWVudFJlbmRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1hcmtTdXNwZW5zZUJvdW5kYXJ5U2hvdWxkQ2FwdHVyZShfc3VzcGVuc2VCb3VuZGFyeSwgcmV0dXJuRmliZXIsIHNvdXJjZUZpYmVyLCByb290LCByb290UmVuZGVyTGFuZXMpOyAvLyBFdmVuIHRob3VnaCB0aGUgdXNlciBtYXkgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgZXJyb3IsIHdlIHNob3VsZFxuICAgICAgICAvLyBzdGlsbCBsb2cgaXQgc28gaXQgY2FuIGJlIGZpeGVkLlxuXG4gICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IodmFsdWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFdlIGRpZG4ndCBmaW5kIGEgYm91bmRhcnkgdGhhdCBjb3VsZCBoYW5kbGUgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gU3RhcnRcbiAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uXG4gIC8vIGFzIGFuIGVycm9yLlxuXG5cbiAgcmVuZGVyRGlkRXJyb3IodmFsdWUpO1xuICB2YWx1ZSA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUodmFsdWUsIHNvdXJjZUZpYmVyKTtcbiAgdmFyIHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXI7XG5cbiAgZG8ge1xuICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9lcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuICAgICAgICAgIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMsIGxhbmUpO1xuICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIF9lcnJvckluZm8sIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgLy8gQ2FwdHVyZSBhbmQgcmV0cnlcbiAgICAgICAgdmFyIGVycm9ySW5mbyA9IHZhbHVlO1xuICAgICAgICB2YXIgY3RvciA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MgJiYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCBpbnN0YW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7XG5cbiAgICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyb290UmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBfbGFuZSk7IC8vIFNjaGVkdWxlIHRoZSBlcnJvciBib3VuZGFyeSB0byByZS1yZW5kZXIgdXNpbmcgdXBkYXRlZCBzdGF0ZVxuXG4gICAgICAgICAgdmFyIF91cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBlcnJvckluZm8sIF9sYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3VzcGVuZGVkQ2FjaGUoKSB7XG4gIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgc3VzcGVuZHMuIEl0IHJldHVybnMgdGhlXG59XG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpIHtcbiAgLy8gVGFnIHRoZSBmaWJlciB3aXRoIGFuIHVwZGF0ZSBlZmZlY3QuIFRoaXMgdHVybnMgYSBQbGFjZW1lbnQgaW50b1xuICAvLyBhIFBsYWNlbWVudEFuZFVwZGF0ZS5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xufVxuXG5mdW5jdGlvbiBtYXJrUmVmKHdvcmtJblByb2dyZXNzKSB7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmU3RhdGljO1xuICB9XG59XG5cbnZhciBhcHBlbmRBbGxDaGlsZHJlbjtcbnZhciB1cGRhdGVIb3N0Q29udGFpbmVyO1xudmFyIHVwZGF0ZUhvc3RDb21wb25lbnQ7XG52YXIgdXBkYXRlSG9zdFRleHQ7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50ID0gZnVuY3Rpb24gKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB0eXBlLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWQgdG9cbiAgICAvLyBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIC8vIEluIG11dGF0aW9uIG1vZGUsIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYSBiYWlsb3V0IGJlY2F1c2VcbiAgICAgIC8vIHdlIHdvbid0IHRvdWNoIHRoaXMgbm9kZSBldmVuIGlmIGNoaWxkcmVuIGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBnZXQgdXBkYXRlZCBiZWNhdXNlIG9uZSBvZiBvdXIgY2hpbGRyZW4gdXBkYXRlZCwgd2UgZG9uJ3RcbiAgICAvLyBoYXZlIG5ld1Byb3BzIHNvIHdlJ2xsIGhhdmUgdG8gcmV1c2UgdGhlbS5cbiAgICAvLyBUT0RPOiBTcGxpdCB0aGUgdXBkYXRlIEFQSSBhcyBzZXBhcmF0ZSBmb3IgdGhlIHByb3BzIHZzLiBjaGlsZHJlbi5cbiAgICAvLyBFdmVuIGJldHRlciB3b3VsZCBiZSBpZiBjaGlsZHJlbiB3ZXJlbid0IHNwZWNpYWwgY2FzZWQgYXQgYWxsIHRoby5cblxuXG4gICAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgIHZhciBjdXJyZW50SG9zdENvbnRleHQgPSBnZXRIb3N0Q29udGV4dCgpOyAvLyBUT0RPOiBFeHBlcmllbmNpbmcgYW4gZXJyb3Igd2hlcmUgb2xkUHJvcHMgaXMgbnVsbC4gU3VnZ2VzdHMgYSBob3N0XG4gICAgLy8gY29tcG9uZW50IGlzIGhpdHRpbmcgdGhlIHJlc3VtZSBwYXRoLiBGaWd1cmUgb3V0IHdoeS4gUG9zc2libHlcbiAgICAvLyByZWxhdGVkIHRvIGBoaWRkZW5gLlxuXG4gICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBwcmVwYXJlVXBkYXRlKGluc3RhbmNlLCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVBheWxvYWQ7IC8vIElmIHRoZSB1cGRhdGUgcGF5bG9hZCBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGNoYW5nZSBvciBpZiB0aGVyZVxuICAgIC8vIGlzIGEgbmV3IHJlZiB3ZSBtYXJrIHRoaXMgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaXMgZG9uZSBpbiBjb21taXRXb3JrLlxuXG4gICAgaWYgKHVwZGF0ZVBheWxvYWQpIHtcbiAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfTtcblxuICB1cGRhdGVIb3N0VGV4dCA9IGZ1bmN0aW9uIChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgIC8vIElmIHRoZSB0ZXh0IGRpZmZlcnMsIG1hcmsgaXQgYXMgYW4gdXBkYXRlLiBBbGwgdGhlIHdvcmsgaW4gZG9uZSBpbiBjb21taXRXb3JrLlxuICAgIGlmIChvbGRUZXh0ICE9PSBuZXdUZXh0KSB7XG4gICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrKSB7XG4gIGlmIChnZXRJc0h5ZHJhdGluZygpKSB7XG4gICAgLy8gSWYgd2UncmUgaHlkcmF0aW5nLCB3ZSBzaG91bGQgY29uc3VtZSBhcyBtYW55IGl0ZW1zIGFzIHdlIGNhblxuICAgIC8vIHNvIHdlIGRvbid0IGxlYXZlIGFueSBiZWhpbmQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3dpdGNoIChyZW5kZXJTdGF0ZS50YWlsTW9kZSkge1xuICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgdGFpbE5vZGUgPSByZW5kZXJTdGF0ZS50YWlsO1xuICAgICAgICB2YXIgbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAodGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAodGFpbE5vZGUuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsYXN0VGFpbE5vZGUgPSB0YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0YWlsTm9kZSA9IHRhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAobGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEZXRhY2ggdGhlIGluc2VydGlvbiBhZnRlciB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFscmVhZHlcbiAgICAgICAgICAvLyBpbnNlcnRlZC5cbiAgICAgICAgICBsYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgJ2NvbGxhcHNlZCc6XG4gICAgICB7XG4gICAgICAgIC8vIEFueSBpbnNlcnRpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHRhaWwgbGlzdCBhZnRlciB0aGlzIHBvaW50XG4gICAgICAgIC8vIHNob3VsZCBiZSBpbnZpc2libGUuIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vdW50ZWQgYm91bmRhcmllc1xuICAgICAgICAvLyBhbnl0aGluZyBiZWZvcmUgdGhlbSBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbGxhcHNpbmcuXG4gICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHRhaWwgdG8gZmluZCBpZlxuICAgICAgICAvLyB0aGVyZSBhcmUgYW55LlxuICAgICAgICB2YXIgX3RhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIF9sYXN0VGFpbE5vZGUgPSBudWxsO1xuXG4gICAgICAgIHdoaWxlIChfdGFpbE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoX3RhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgX2xhc3RUYWlsTm9kZSA9IF90YWlsTm9kZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGFpbE5vZGUgPSBfdGFpbE5vZGUuc2libGluZztcbiAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIHNpbXBseSBnb2luZyB0byBkZWxldGUgYWxsIGluc2VydGlvbnMgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxhc3QgcmVuZGVyZWQgaXRlbS5cblxuXG4gICAgICAgIGlmIChfbGFzdFRhaWxOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gQWxsIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgdGFpbCBhcmUgaW5zZXJ0aW9ucy5cbiAgICAgICAgICBpZiAoIWhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjayAmJiByZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXZSBzdXNwZW5kZWQgZHVyaW5nIHRoZSBoZWFkLiBXZSB3YW50IHRvIHNob3cgYXQgbGVhc3Qgb25lXG4gICAgICAgICAgICAvLyByb3cgYXQgdGhlIHRhaWwuIFNvIHdlJ2xsIGtlZXAgb24gYW5kIGN1dCBvZmYgdGhlIHJlc3QuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgX2xhc3RUYWlsTm9kZS5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJ1YmJsZVByb3BlcnRpZXMoY29tcGxldGVkV29yaykge1xuICB2YXIgZGlkQmFpbG91dCA9IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlICE9PSBudWxsICYmIGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlLmNoaWxkID09PSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciBzdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuXG4gIGlmICghZGlkQmFpbG91dCkge1xuICAgIC8vIEJ1YmJsZSB1cCB0aGUgZWFybGllc3QgZXhwaXJhdGlvbiB0aW1lLlxuICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgICAgLy8gcHJvZmlsZXIgZHVyYXRpb25zLlxuICAgICAgdmFyIGFjdHVhbER1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgdmFyIGNoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoY2hpbGQubGFuZXMsIGNoaWxkLmNoaWxkTGFuZXMpKTtcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IGNoaWxkLmZsYWdzOyAvLyBXaGVuIGEgZmliZXIgaXMgY2xvbmVkLCBpdHMgYWN0dWFsRHVyYXRpb24gaXMgcmVzZXQgdG8gMC4gVGhpcyB2YWx1ZSB3aWxsXG4gICAgICAgIC8vIG9ubHkgYmUgdXBkYXRlZCBpZiB3b3JrIGlzIGRvbmUgb24gdGhlIGZpYmVyIChpLmUuIGl0IGRvZXNuJ3QgYmFpbG91dCkuXG4gICAgICAgIC8vIFdoZW4gd29yayBpcyBkb25lLCBpdCBzaG91bGQgYnViYmxlIHRvIHRoZSBwYXJlbnQncyBhY3R1YWxEdXJhdGlvbi4gSWZcbiAgICAgICAgLy8gdGhlIGZpYmVyIGhhcyBub3QgYmVlbiBjbG9uZWQgdGhvdWdoLCAobWVhbmluZyBubyB3b3JrIHdhcyBkb25lKSwgdGhlblxuICAgICAgICAvLyB0aGlzIHZhbHVlIHdpbGwgcmVmbGVjdCB0aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgd29ya2luZyBvbiBhIHByZXZpb3VzXG4gICAgICAgIC8vIHJlbmRlci4gSW4gdGhhdCBjYXNlIGl0IHNob3VsZCBub3QgYnViYmxlLiBXZSBkZXRlcm1pbmUgd2hldGhlciBpdCB3YXNcbiAgICAgICAgLy8gY2xvbmVkIGJ5IGNvbXBhcmluZyB0aGUgY2hpbGQgcG9pbnRlci5cblxuICAgICAgICBhY3R1YWxEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgdHJlZUJhc2VEdXJhdGlvbiArPSBjaGlsZC50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IHRyZWVCYXNlRHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgICBzdWJ0cmVlRmxhZ3MgfD0gX2NoaWxkLnN1YnRyZWVGbGFncztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZC5mbGFnczsgLy8gVXBkYXRlIHRoZSByZXR1cm4gcG9pbnRlciBzbyB0aGUgdHJlZSBpcyBjb25zaXN0ZW50LiBUaGlzIGlzIGEgY29kZVxuICAgICAgICAvLyBzbWVsbCBiZWNhdXNlIGl0IGFzc3VtZXMgdGhlIGNvbW1pdCBwaGFzZSBpcyBuZXZlciBjb25jdXJyZW50IHdpdGhcbiAgICAgICAgLy8gdGhlIHJlbmRlciBwaGFzZS4gV2lsbCBhZGRyZXNzIGR1cmluZyByZWZhY3RvciB0byBhbHRlcm5hdGUgbW9kZWwuXG5cbiAgICAgICAgX2NoaWxkLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgfSBlbHNlIHtcbiAgICAvLyBCdWJibGUgdXAgdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZS5cbiAgICBpZiAoIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gcHJvZmlsaW5nIG1vZGUsIHJlc2V0Q2hpbGRFeHBpcmF0aW9uVGltZSBpcyBhbHNvIHVzZWQgdG8gcmVzZXRcbiAgICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICAgIHZhciBfdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHZhciBfY2hpbGQyID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgd2hpbGUgKF9jaGlsZDIgIT09IG51bGwpIHtcbiAgICAgICAgbmV3Q2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMobmV3Q2hpbGRMYW5lcywgbWVyZ2VMYW5lcyhfY2hpbGQyLmxhbmVzLCBfY2hpbGQyLmNoaWxkTGFuZXMpKTsgLy8gXCJTdGF0aWNcIiBmbGFncyBzaGFyZSB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpYmVyL2hvb2sgdGhleSBiZWxvbmcgdG8sXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBidWJibGUgdGhvc2UgdXAgZXZlbiBkdXJpbmcgYSBiYWlsb3V0LiBBbGwgdGhlIG90aGVyXG4gICAgICAgIC8vIGZsYWdzIGhhdmUgYSBsaWZldGltZSBvbmx5IG9mIGEgc2luZ2xlIHJlbmRlciArIGNvbW1pdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGlnbm9yZSB0aGVtLlxuXG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gICAgICAgIHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLmZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24gKz0gX2NoaWxkMi50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICBfY2hpbGQyID0gX2NoaWxkMi5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSBfdHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIF9jaGlsZDMgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICB3aGlsZSAoX2NoaWxkMyAhPT0gbnVsbCkge1xuICAgICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKF9jaGlsZDMubGFuZXMsIF9jaGlsZDMuY2hpbGRMYW5lcykpOyAvLyBcIlN0YXRpY1wiIGZsYWdzIHNoYXJlIHRoZSBsaWZldGltZSBvZiB0aGUgZmliZXIvaG9vayB0aGV5IGJlbG9uZyB0byxcbiAgICAgICAgLy8gc28gd2Ugc2hvdWxkIGJ1YmJsZSB0aG9zZSB1cCBldmVuIGR1cmluZyBhIGJhaWxvdXQuIEFsbCB0aGUgb3RoZXJcbiAgICAgICAgLy8gZmxhZ3MgaGF2ZSBhIGxpZmV0aW1lIG9ubHkgb2YgYSBzaW5nbGUgcmVuZGVyICsgY29tbWl0LCBzbyB3ZSBzaG91bGRcbiAgICAgICAgLy8gaWdub3JlIHRoZW0uXG5cbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuc3VidHJlZUZsYWdzICYgU3RhdGljTWFzaztcbiAgICAgICAgc3VidHJlZUZsYWdzIHw9IF9jaGlsZDMuZmxhZ3MgJiBTdGF0aWNNYXNrOyAvLyBVcGRhdGUgdGhlIHJldHVybiBwb2ludGVyIHNvIHRoZSB0cmVlIGlzIGNvbnNpc3RlbnQuIFRoaXMgaXMgYSBjb2RlXG4gICAgICAgIC8vIHNtZWxsIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGUgY29tbWl0IHBoYXNlIGlzIG5ldmVyIGNvbmN1cnJlbnQgd2l0aFxuICAgICAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLiBXaWxsIGFkZHJlc3MgZHVyaW5nIHJlZmFjdG9yIHRvIGFsdGVybmF0ZSBtb2RlbC5cblxuICAgICAgICBfY2hpbGQzLnJldHVybiA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgIF9jaGlsZDMgPSBfY2hpbGQzLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29tcGxldGVkV29yay5zdWJ0cmVlRmxhZ3MgfD0gc3VidHJlZUZsYWdzO1xuICB9XG5cbiAgY29tcGxldGVkV29yay5jaGlsZExhbmVzID0gbmV3Q2hpbGRMYW5lcztcbiAgcmV0dXJuIGRpZEJhaWxvdXQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBsZXRlV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cblxuICBwb3BUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgY2FzZSBMYXp5Q29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIEZyYWdtZW50OlxuICAgIGNhc2UgTW9kZTpcbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgIGNhc2UgQ29udGV4dENvbnN1bWVyOlxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGZpYmVyUm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuXG4gICAgICAgIGlmIChmaWJlclJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBmaWJlclJvb3QuY29udGV4dCA9IGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dDtcbiAgICAgICAgICBmaWJlclJvb3QucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5jaGlsZCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCBwb3Agc28gdGhhdCB3ZSBjYW4gZGVsZXRlIGFueSByZW1haW5pbmcgY2hpbGRyZW5cbiAgICAgICAgICAvLyB0aGF0IHdlcmVuJ3QgaHlkcmF0ZWQuXG4gICAgICAgICAgdmFyIHdhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKHdhc0h5ZHJhdGVkKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSBoeWRyYXRlZCwgdGhlbiB3ZSdsbCBuZWVkIHRvIHNjaGVkdWxlIGFuIHVwZGF0ZSBmb3JcbiAgICAgICAgICAgIC8vIHRoZSBjb21taXQgc2lkZS1lZmZlY3RzIG9uIHRoZSByb290LlxuICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgICAgaWYgKCAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2xpZW50IHJvb3RcbiAgICAgICAgICAgICAgIXByZXZTdGF0ZS5pc0RlaHlkcmF0ZWQgfHwgLy8gQ2hlY2sgaWYgd2UgcmV2ZXJ0ZWQgdG8gY2xpZW50IHJlbmRlcmluZyAoZS5nLiBkdWUgdG8gYW4gZXJyb3IpXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICAgIC8vIFNjaGVkdWxlIGFuIGVmZmVjdCB0byBjbGVhciB0aGlzIGNvbnRhaW5lciBhdCB0aGUgc3RhcnQgb2YgdGhlXG4gICAgICAgICAgICAgICAgLy8gbmV4dCBjb21taXQuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSBvZiBSZWFjdCByZW5kZXJpbmcgaW50byBhXG4gICAgICAgICAgICAgICAgLy8gY29udGFpbmVyIHdpdGggcHJldmlvdXMgY2hpbGRyZW4uIEl0J3MgYWxzbyBzYWZlIHRvIGRvIGZvclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgdG9vLCBiZWNhdXNlIGN1cnJlbnQuY2hpbGQgd291bGQgb25seSBiZSBudWxsIGlmIHRoZVxuICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIGNvbnRhaW5lciB3b3VsZCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgLy8gYmUgZW1wdHkpLlxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90OyAvLyBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLCB0aGVyZSBtYXkgaGF2ZSBiZWVuXG4gICAgICAgICAgICAgICAgLy8gcmVjb3ZlcmFibGUgZXJyb3JzIGR1cmluZyBmaXJzdCBoeWRyYXRpb24gYXR0ZW1wdC4gSWYgc28sIGFkZFxuICAgICAgICAgICAgICAgIC8vIHRoZW0gdG8gYSBxdWV1ZSBzbyB3ZSBjYW4gbG9nIHRoZW0gaW4gdGhlIGNvbW1pdCBwaGFzZS5cblxuICAgICAgICAgICAgICAgIHVwZ3JhZGVIeWRyYXRpb25FcnJvcnNUb1JlY292ZXJhYmxlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnQucmVmICE9PSB3b3JrSW5Qcm9ncmVzcy5yZWYpIHtcbiAgICAgICAgICAgIG1hcmtSZWYod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfSAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhYm9ydCB3b3JrLlxuXG5cbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3JcbiAgICAgICAgICAvLyBib3R0b20tPnVwLiBUb3AtPmRvd24gaXMgZmFzdGVyIGluIElFMTEuXG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGFuZCBjcmVhdGVJbnN0YW5jZSBzdGVwIGludG8gdGhlIGJlZ2luUGhhc2VcbiAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLlxuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KSkge1xuICAgICAgICAgICAgICAvLyBJZiBjaGFuZ2VzIHRvIHRoZSBoeWRyYXRlZCBub2RlIG5lZWQgdG8gYmUgYXBwbGllZCBhdCB0aGVcbiAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLlxuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LlxuICAgICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBzdXBwb3J0cyBhdXRvLWZvY3VzIGZvciBjZXJ0YWluIGVsZW1lbnRzKS5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzdWNoIHJlbmRlcmVycyBnZXQgc2NoZWR1bGVkIGZvciBsYXRlciB3b3JrLlxuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1RleHQgPSBuZXdQcm9wcztcblxuICAgICAgICBpZiAoY3VycmVudCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBvbGRUZXh0ID0gY3VycmVudC5tZW1vaXplZFByb3BzOyAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZFxuICAgICAgICAgIC8vIHRvIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG5cbiAgICAgICAgICB1cGRhdGVIb3N0VGV4dChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5ICcgKyAnY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYWJvcnQgd29yay5cblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfcm9vdENvbnRhaW5lckluc3RhbmNlID0gZ2V0Um9vdEhvc3RDb250YWluZXIoKTtcblxuICAgICAgICAgIHZhciBfY3VycmVudEhvc3RDb250ZXh0ID0gZ2V0SG9zdENvbnRleHQoKTtcblxuICAgICAgICAgIHZhciBfd2FzSHlkcmF0ZWQyID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZDIpIHtcbiAgICAgICAgICAgIGlmIChwcmVwYXJlVG9IeWRyYXRlSG9zdFRleHRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgICAgICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZVRleHRJbnN0YW5jZShuZXdUZXh0LCBfcm9vdENvbnRhaW5lckluc3RhbmNlLCBfY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKGhhc1VuaHlkcmF0ZWRUYWlsTm9kZXMoKSAmJiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgd2FybklmVW5oeWRyYXRlZFRhaWxOb2Rlcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IEZvcmNlQ2xpZW50UmVuZGVyIHwgSW5jb21wbGV0ZSB8IFNob3VsZENhcHR1cmU7XG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCAmJiBuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1pZ2h0IGJlIGluc2lkZSBhIGh5ZHJhdGlvbiBzdGF0ZSB0aGUgZmlyc3QgdGltZSB3ZSdyZSBwaWNraW5nIHVwIHRoaXNcbiAgICAgICAgICAvLyBTdXNwZW5zZSBib3VuZGFyeSwgYW5kIGFsc28gYWZ0ZXIgd2UndmUgcmVlbnRlcmVkIGl0IGZvciBmdXJ0aGVyIGh5ZHJhdGlvbi5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMyA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIV93YXNIeWRyYXRlZDMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50IHdhcyBjb21wbGV0ZWQgd2l0aG91dCBhIGh5ZHJhdGVkIG5vZGUuICcgKyAnVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJlcGFyZVRvSHlkcmF0ZUhvc3RTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzVGltZWRPdXRTdXNwZW5zZSA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgICAgICAgICAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5Q2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09IHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBXZSBtaWdodCBoYXZlIHJlZW50ZXJlZCB0aGlzIGJvdW5kYXJ5IHRvIGh5ZHJhdGUgaXQuIElmIHNvLCB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBoeWRyYXRpb25cbiAgICAgICAgICAgIC8vIHN0YXRlIHNpbmNlIHdlJ3JlIG5vdyBleGl0aW5nIG91dCBvZiBpdC4gcG9wSHlkcmF0aW9uU3RhdGUgZG9lc24ndCBkbyB0aGF0IGZvciB1cy5cbiAgICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcblxuICAgICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgYm91bmRhcnkgZGlkIG5vdCBzdXNwZW5kIHNvIGl0J3Mgbm93IGh5ZHJhdGVkIGFuZCB1bnN1c3BlbmRlZC5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBtYXJrIHRoaXMgYm91bmRhcnlcbiAgICAgICAgICAgIC8vIGFzIGhhdmluZyBoeWRyYXRlZCBzbyBldmVudHMga25vdyB0aGF0IHRoZXkncmUgZnJlZSB0byBiZSBpbnZva2VkLlxuICAgICAgICAgICAgLy8gSXQncyBhbHNvIGEgc2lnbmFsIHRvIHJlcGxheSBldmVudHMgYW5kIHRoZSBzdXNwZW5zZSBjYWxsYmFjay5cbiAgICAgICAgICAgIC8vIElmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHNjaGVkdWxlIGFuIGVmZmVjdCB0byBhdHRhY2ggcmV0cnkgbGlzdGVuZXJzLlxuICAgICAgICAgICAgLy8gU28gd2UgbWlnaHQgYXMgd2VsbCBhbHdheXMgbWFyayB0aGlzLlxuXG5cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9pc1RpbWVkT3V0U3VzcGVuc2UgPSBuZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAoX2lzVGltZWRPdXRTdXNwZW5zZSkge1xuICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChfcHJpbWFyeUNoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0eXBlIGNhc3RpbmcgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLT0gb3BlcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBfcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhpcyB0cmVlLiBJZiB0aGlzIHdhcyBhIGZvcmNlZCBjbGllbnQgcmVuZGVyLFxuICAgICAgICAvLyB0aGVyZSBtYXkgaGF2ZSBiZWVuIHJlY292ZXJhYmxlIGVycm9ycyBkdXJpbmcgZmlyc3QgaHlkcmF0aW9uXG4gICAgICAgIC8vIGF0dGVtcHQuIElmIHNvLCBhZGQgdGhlbSB0byBhIHF1ZXVlIHNvIHdlIGNhbiBsb2cgdGhlbSBpbiB0aGVcbiAgICAgICAgLy8gY29tbWl0IHBoYXNlLlxuXG5cbiAgICAgICAgdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKTtcblxuICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICAvLyBTb21ldGhpbmcgc3VzcGVuZGVkLiBSZS1yZW5kZXIgd2l0aCB0aGUgZmFsbGJhY2sgY2hpbGRyZW4uXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lczsgLy8gRG8gbm90IHJlc2V0IHRoZSBlZmZlY3QgbGlzdC5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfSAvLyBEb24ndCBidWJibGUgcHJvcGVydGllcyBpbiB0aGlzIGNhc2UuXG5cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIF9wcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgcHJldkRpZFRpbWVvdXQgPSBfcHJldlN0YXRlICE9PSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGEgcGFzc2l2ZSBlZmZlY3QsIHdoaWNoIGlzIHdoZW4gd2UgcHJvY2VzcyB0aGUgdHJhbnNpdGlvbnNcblxuXG4gICAgICAgIGlmIChuZXh0RGlkVGltZW91dCAhPT0gcHJldkRpZFRpbWVvdXQpIHtcbiAgICAgICAgICAvLyBhbiBlZmZlY3QgdG8gdG9nZ2xlIHRoZSBzdWJ0cmVlJ3MgdmlzaWJpbGl0eS4gV2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIGZhbGxiYWNrIC0+IHByaW1hcnksIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgc2NoZWR1bGVzIHRoaXMgZWZmZWN0XG4gICAgICAgICAgLy8gYXMgcGFydCBvZiBpdHMgbm9ybWFsIGNvbXBsZXRlIHBoYXNlLiBCdXQgd2hlbiB3ZSBzd2l0Y2ggZnJvbVxuICAgICAgICAgIC8vIHByaW1hcnkgLT4gZmFsbGJhY2ssIHRoZSBpbm5lciBPZmZzY3JlZW4gZmliZXIgZG9lcyBub3QgaGF2ZSBhIGNvbXBsZXRlXG4gICAgICAgICAgLy8gcGhhc2UuIFNvIHdlIG5lZWQgdG8gc2NoZWR1bGUgaXRzIGVmZmVjdCBoZXJlLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2UgYWxzbyB1c2UgdGhpcyBmbGFnIHRvIGNvbm5lY3QvZGlzY29ubmVjdCB0aGUgZWZmZWN0cywgYnV0IHRoZSBzYW1lXG4gICAgICAgICAgLy8gbG9naWMgYXBwbGllczogd2hlbiByZS1jb25uZWN0aW5nLCB0aGUgT2Zmc2NyZWVuIGZpYmVyJ3MgY29tcGxldGVcbiAgICAgICAgICAvLyBwaGFzZSB3aWxsIGhhbmRsZSBzY2hlZHVsaW5nIHRoZSBlZmZlY3QuIEl0J3Mgb25seSB3aGVuIHRoZSBmYWxsYmFja1xuICAgICAgICAgIC8vIGlzIGFjdGl2ZSB0aGF0IHdlIGhhdmUgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC5cblxuXG4gICAgICAgICAgaWYgKG5leHREaWRUaW1lb3V0KSB7XG4gICAgICAgICAgICB2YXIgX29mZnNjcmVlbkZpYmVyMiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgX29mZnNjcmVlbkZpYmVyMi5mbGFncyB8PSBWaXNpYmlsaXR5OyAvLyBUT0RPOiBUaGlzIHdpbGwgc3RpbGwgc3VzcGVuZCBhIHN5bmNocm9ub3VzIHRyZWUgaWYgYW55dGhpbmdcbiAgICAgICAgICAgIC8vIGluIHRoZSBjb25jdXJyZW50IHRyZWUgYWxyZWFkeSBzdXNwZW5kZWQgZHVyaW5nIHRoaXMgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cblxuICAgICAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGJhY2sgdG8gdGhyb3dFeGNlcHRpb24gYmVjYXVzZSB0aGlzIGlzIHRvbyBsYXRlXG4gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBsYXJnZSB0cmVlIHdoaWNoIGlzIGNvbW1vbiBmb3IgaW5pdGlhbCBsb2Fkcy4gV2VcbiAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAgIC8vIHRoaXMgbWFya2VyLCBhbmQgdGhpcyBpcyB0b28gbGF0ZS5cbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyByZW5kZXIgYWxyZWFkeSBoYWQgYSBwaW5nIG9yIGxvd2VyIHByaSB1cGRhdGVzLFxuICAgICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gaW1tZWRpYXRlbHkgcmVzdGFydCBmcm9tIHdpdGhpbiB0aHJvd0V4Y2VwdGlvbi5cbiAgICAgICAgICAgICAgdmFyIGhhc0ludmlzaWJsZUNoaWxkQ29udGV4dCA9IGN1cnJlbnQgPT09IG51bGwgJiYgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUgfHwgIWVuYWJsZVN1c3BlbnNlQXZvaWRUaGlzRmFsbGJhY2spO1xuXG4gICAgICAgICAgICAgIGlmIChoYXNJbnZpc2libGVDaGlsZENvbnRleHQgfHwgaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIGluIGFuIGludmlzaWJsZSB0cmVlIG9yIGEgbmV3IHJlbmRlciwgdGhlbiBzaG93aW5nXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgICAvLyBzdXNwZW5kIGZvciBsb25nZXIgaWYgcG9zc2libGUuXG4gICAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdha2VhYmxlcyA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTY2hlZHVsZSBhbiBlZmZlY3QgdG8gYXR0YWNoIGEgcmV0cnkgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UuXG4gICAgICAgICAgLy8gVE9ETzogTW92ZSB0byBwYXNzaXZlIHBoYXNlXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgLy8gRG9uJ3QgY291bnQgdGltZSBzcGVudCBpbiBhIHRpbWVkIG91dCBTdXNwZW5zZSBzdWJ0cmVlIGFzIHBhcnQgb2YgdGhlIGJhc2UgZHVyYXRpb24uXG4gICAgICAgICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgaWYgKF9wcmltYXJ5Q2hpbGRGcmFnbWVudDIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyAkRmxvd0ZpeE1lIEZsb3cgZG9lc24ndCBzdXBwb3J0IHR5cGUgY2FzdGluZyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtPSBvcGVyYXRvclxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gLT0gX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi50cmVlQmFzZUR1cmF0aW9uO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHVwZGF0ZUhvc3RDb250YWluZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgICBwcmVwYXJlUG9ydGFsTW91bnQod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgfVxuXG4gICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIEluY29tcGxldGVDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gU2FtZSBhcyBjbGFzcyBjb21wb25lbnQgY2FzZS4gSSBwdXQgaXQgZG93biBoZXJlIHNvIHRoYXQgdGhlIHRhZ3MgYXJlXG4gICAgICAgIC8vIHNlcXVlbnRpYWwgdG8gZW5zdXJlIHRoaXMgc3dpdGNoIGlzIGNvbXBpbGVkIHRvIGEganVtcCB0YWJsZS5cbiAgICAgICAgdmFyIF9Db21wb25lbnQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuXG4gICAgICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihfQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVuYWJsZXMuIEluc3RlYWQsIHdlJ2xsIHRyYW5zZmVyIGl0cyB0aGVuYWJsZXMgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAvLyBTdXNwZW5zZUxpc3Qgc28gdGhhdCBpdCBjYW4gcmV0cnkgaWYgdGhleSByZXNvbHZlLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUgb2YgdGhlc2UgaW4gdGhlIGxpc3QgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgICAgICAgICAgICAvLyBnb2luZyB0byB3YWl0IGZvciBhbGwgb2YgdGhlbSBhbnl3YXksIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlclxuICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggb25lcyBnZXRzIHRvIHBpbmcuIEluIHRoZW9yeSB3ZSBjb3VsZCBnZXQgY2xldmVyIGFuZCBrZWVwXG4gICAgICAgICAgICAgICAgICAvLyB0cmFjayBvZiBob3cgbWFueSBkZXBlbmRlbmNpZXMgcmVtYWluIGJ1dCBpdCBnZXRzIHRyaWNreSBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbWVhbnRpbWUsIHdlIGNhbiBhZGQvcmVtb3ZlL2NoYW5nZSBpdGVtcyBhbmQgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmFpbCBvdXQgb2YgdGhlIGxvb3AgYmVmb3JlIGZpbmRpbmcgYW55IGJ1dCB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IG1hdHRlciBzaW5jZSB0aGF0IG1lYW5zIHRoYXQgdGhlIG90aGVyIGJvdW5kYXJpZXMgdGhhdFxuICAgICAgICAgICAgICAgICAgLy8gd2UgZGlkIGZpbmQgYWxyZWFkeSBoYXMgdGhlaXIgbGlzdGVuZXJzIGF0dGFjaGVkLlxuXG4gICAgICAgICAgICAgICAgICB2YXIgbmV3VGhlbmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbmFibGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbmV3VGhlbmFibGVzO1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgICAgICB9IC8vIFJlcmVuZGVyIHRoZSB3aG9sZSBsaXN0LCBidXQgdGhpcyB0aW1lLCB3ZSdsbCBmb3JjZSBmYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgIC8vIHRvIHN0YXkgaW4gcGxhY2UuXG4gICAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZWZmZWN0IGZsYWdzIGJlZm9yZSBkb2luZyB0aGUgc2Vjb25kIHBhc3Mgc2luY2UgdGhhdCdzIG5vdyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGNoaWxkIGZpYmVycyB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZS5cblxuXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICAgICAgICAgICAgcmVzZXRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpOyAvLyBTZXQgdXAgdGhlIFN1c3BlbnNlIENvbnRleHQgdG8gZm9yY2Ugc3VzcGVuc2UgYW5kIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAvLyByZXJlbmRlciB0aGUgY2hpbGRyZW4uXG5cbiAgICAgICAgICAgICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spKTsgLy8gRG9uJ3QgYnViYmxlIHByb3BlcnRpZXMgaW4gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcm93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwgJiYgbm93KCkgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IHBhc3NlZCBvdXIgQ1BVIGRlYWRsaW5lIGJ1dCB3ZSBzdGlsbCBoYXZlIHJvd3NcbiAgICAgICAgICAgICAgLy8gbGVmdCBpbiB0aGUgdGFpbC4gV2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gcmVuZGVyXG4gICAgICAgICAgICAgIC8vIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7XG4gICAgICAgICAgfSAvLyBOZXh0IHdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGUgdGFpbC5cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFwcGVuZCB0aGUgcmVuZGVyZWQgcm93IHRvIHRoZSBjaGlsZCBsaXN0LlxuICAgICAgICAgIGlmICghZGlkU3VzcGVuZEFscmVhZHkpIHtcbiAgICAgICAgICAgIHZhciBfc3VzcGVuZGVkID0gZmluZEZpcnN0U3VzcGVuZGVkKHJlbmRlcmVkVGFpbCk7XG5cbiAgICAgICAgICAgIGlmIChfc3VzcGVuZGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTsgLy8gRW5zdXJlIHdlIHRyYW5zZmVyIHRoZSB1cGRhdGUgcXVldWUgdG8gdGhlIHBhcmVudCBzbyB0aGF0IGl0IGRvZXNuJ3RcbiAgICAgICAgICAgICAgLy8gZ2V0IGxvc3QgaWYgdGhpcyByb3cgZW5kcyB1cCBkcm9wcGVkIGR1cmluZyBhIHNlY29uZCBwYXNzLlxuXG4gICAgICAgICAgICAgIHZhciBfbmV3VGhlbmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gX25ld1RoZW5hYmxlcztcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIHRydWUpOyAvLyBUaGlzIG1pZ2h0IGhhdmUgYmVlbiBtb2RpZmllZC5cblxuICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUudGFpbCA9PT0gbnVsbCAmJiByZW5kZXJTdGF0ZS50YWlsTW9kZSA9PT0gJ2hpZGRlbicgJiYgIXJlbmRlcmVkVGFpbC5hbHRlcm5hdGUgJiYgIWdldElzSHlkcmF0aW5nKCkgLy8gV2UgZG9uJ3QgY3V0IGl0IGlmIHdlJ3JlIGh5ZHJhdGluZy5cbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSdyZSBkb25lLlxuICAgICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCAvLyBUaGUgdGltZSBpdCB0b29rIHRvIHJlbmRlciBsYXN0IHJvdyBpcyBncmVhdGVyIHRoYW4gdGhlIHJlbWFpbmluZ1xuICAgICAgICAgICAgLy8gdGltZSB3ZSBoYXZlIHRvIHJlbmRlci4gU28gcmVuZGVyaW5nIG9uZSBtb3JlIHJvdyB3b3VsZCBsaWtlbHlcbiAgICAgICAgICAgIC8vIGV4Y2VlZCBpdC5cbiAgICAgICAgICAgIG5vdygpICogMiAtIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA+IGdldFJlbmRlclRhcmdldFRpbWUoKSAmJiByZW5kZXJMYW5lcyAhPT0gT2Zmc2NyZWVuTGFuZSkge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdyBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBhbmQgd2UnbGwganVzdCBnaXZlIHVwIGZ1cnRoZXJcbiAgICAgICAgICAgICAgLy8gYXR0ZW1wdHMgdG8gcmVuZGVyIHRoZSBtYWluIGNvbnRlbnQgYW5kIG9ubHkgcmVuZGVyIGZhbGxiYWNrcy5cbiAgICAgICAgICAgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGlzIGlzIHVzdWFsbHkgZmFzdGVyLlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgICAgICBkaWRTdXNwZW5kQWxyZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBTaW5jZSBub3RoaW5nIGFjdHVhbGx5IHN1c3BlbmRlZCwgdGhlcmUgd2lsbCBub3RoaW5nIHRvIHBpbmcgdGhpc1xuICAgICAgICAgICAgICAvLyB0byBnZXQgaXQgc3RhcnRlZCBiYWNrIHVwIHRvIGF0dGVtcHQgdGhlIG5leHQgaXRlbS4gV2hpbGUgaW4gdGVybXNcbiAgICAgICAgICAgICAgLy8gb2YgcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLFxuICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBzYW1lIHRyYW5zaXRpb24gb25jZSB0aGUgdHJhbnNpdGlvbiBoYXNcbiAgICAgICAgICAgICAgLy8gY29tbWl0dGVkLiBJZiBpdCdzIHN5bmMsIHdlIHN0aWxsIHdhbnQgdG8geWllbGQgc28gdGhhdCBpdCBjYW4gYmVcbiAgICAgICAgICAgICAgLy8gcGFpbnRlZC4gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLlxuICAgICAgICAgICAgICAvLyBXZSBjYW4gdXNlIGFueSBSZXRyeUxhbmUgZXZlbiBpZiBpdCdzIHRoZSBvbmUgY3VycmVudGx5IHJlbmRlcmluZ1xuICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSdyZSBsZWF2aW5nIGl0IGJlaGluZCBvbiB0aGlzIG5vZGUuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcykge1xuICAgICAgICAgICAgLy8gVGhlIGVmZmVjdCBsaXN0IG9mIHRoZSBiYWNrd2FyZHMgdGFpbCB3aWxsIGhhdmUgYmVlbiBhZGRlZFxuICAgICAgICAgICAgLy8gdG8gdGhlIGVuZC4gVGhpcyBicmVha3MgdGhlIGd1YXJhbnRlZSB0aGF0IGxpZmUtY3ljbGVzIGZpcmUgaW5cbiAgICAgICAgICAgIC8vIHNpYmxpbmcgb3JkZXIgYnV0IHRoYXQgaXNuJ3QgYSBzdHJvbmcgZ3VhcmFudGVlIHByb21pc2VkIGJ5IFJlYWN0LlxuICAgICAgICAgICAgLy8gRXNwZWNpYWxseSBzaW5jZSB0aGVzZSBtaWdodCBhbHNvIGp1c3QgcG9wIGluIGR1cmluZyBmdXR1cmUgY29tbWl0cy5cbiAgICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LlxuICAgICAgICAgICAgcmVuZGVyZWRUYWlsLnNpYmxpbmcgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gcmVuZGVyU3RhdGUubGFzdDtcblxuICAgICAgICAgICAgaWYgKHByZXZpb3VzU2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpYmxpbmcuc2libGluZyA9IHJlbmRlcmVkVGFpbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0ID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSB0YWlsIHJvd3MgdG8gcmVuZGVyLlxuICAgICAgICAgIC8vIFBvcCBhIHJvdy5cbiAgICAgICAgICB2YXIgbmV4dCA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbmV4dDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbmV4dC5zaWJsaW5nO1xuICAgICAgICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgICAgIG5leHQuc2libGluZyA9IG51bGw7IC8vIFJlc3RvcmUgdGhlIGNvbnRleHQuXG4gICAgICAgICAgLy8gVE9ETzogV2UgY2FuIHByb2JhYmx5IGp1c3QgYXZvaWQgcG9wcGluZyBpdCBpbnN0ZWFkIGFuZCBvbmx5XG4gICAgICAgICAgLy8gc2V0dGluZyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBnbyBmcm9tIG5vdCBzdXNwZW5kZWQgdG8gc3VzcGVuZGVkLlxuXG4gICAgICAgICAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcblxuICAgICAgICAgIGlmIChkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuc2VDb250ZXh0KTsgLy8gRG8gYSBwYXNzIG92ZXIgdGhlIG5leHQgcm93LlxuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGluIHRoaXMgY2FzZS5cblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBfbmV4dFN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX3ByZXZTdGF0ZTIgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIHByZXZJc0hpZGRlbiA9IF9wcmV2U3RhdGUyICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKHByZXZJc0hpZGRlbiAhPT0gbmV4dElzSGlkZGVuICYmICggLy8gTGVnYWN5SGlkZGVuIGRvZXNuJ3QgZG8gYW55IGhpZGluZyBcdTIwMTQgaXQgb25seSBwcmUtcmVuZGVycy5cbiAgICAgICAgICAhZW5hYmxlTGVnYWN5SGlkZGVuICkpIHtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXh0SXNIaWRkZW4gfHwgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERvbid0IGJ1YmJsZSBwcm9wZXJ0aWVzIGZvciBoaWRkZW4gY2hpbGRyZW4gdW5sZXNzIHdlJ3JlIHJlbmRlcmluZ1xuICAgICAgICAgIC8vIGF0IG9mZnNjcmVlbiBwcmlvcml0eS5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShzdWJ0cmVlUmVuZGVyTGFuZXMsIE9mZnNjcmVlbkxhbmUpKSB7XG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZSBpbiB0aGUgaGlkZGVuIHN1YnRyZWUuXG4gICAgICAgICAgICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIGhpZGUgdGhvc2Ugbm9kZXMgaW4gdGhlIGNvbW1pdCBwaGFzZSwgc29cbiAgICAgICAgICAgICAgLy8gc2NoZWR1bGUgYSB2aXNpYmlsaXR5IGVmZmVjdC5cbiAgICAgICAgICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgJiAoUGxhY2VtZW50IHwgVXBkYXRlKSkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFZpc2liaWxpdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBUcmFjaW5nTWFya2VyQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFwiICsgJ1JlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbnZhciBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0QmFkQ2xhc3M7XG52YXIgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnM7XG52YXIgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcztcbnZhciBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcjtcbnZhciBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucztcblxue1xuICBkaWRXYXJuQWJvdXRCYWRDbGFzcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudCA9IHt9O1xuICBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcyA9IHt9O1xuICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyID0ge307XG4gIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zID0ge307XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBpcyBhIGZyZXNoIG5ldyBjb21wb25lbnQgdGhhdCBoYXNuJ3QgYmVlbiByZW5kZXJlZCB5ZXQsIHdlXG4gICAgLy8gd29uJ3QgdXBkYXRlIGl0cyBjaGlsZCBzZXQgYnkgYXBwbHlpbmcgbWluaW1hbCBzaWRlLWVmZmVjdHMuIEluc3RlYWQsXG4gICAgLy8gd2Ugd2lsbCBhZGQgdGhlbSBhbGwgdG8gdGhlIGNoaWxkIGJlZm9yZSBpdCBnZXRzIHJlbmRlcmVkLiBUaGF0IG1lYW5zXG4gICAgLy8gd2UgY2FuIG9wdGltaXplIHRoaXMgcmVjb25jaWxpYXRpb24gcGFzcyBieSBub3QgdHJhY2tpbmcgc2lkZS1lZmZlY3RzLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgY2hpbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHdvcmsgaW4gcHJvZ3Jlc3MsIGl0IG1lYW5zIHRoYXRcbiAgICAvLyB3ZSBoYXZlbid0IHlldCBzdGFydGVkIGFueSB3b3JrIG9uIHRoZXNlIGNoaWxkcmVuLiBUaGVyZWZvcmUsIHdlIHVzZVxuICAgIC8vIHRoZSBjbG9uZSBhbGdvcml0aG0gdG8gY3JlYXRlIGEgY29weSBvZiBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4uXG4gICAgLy8gSWYgd2UgaGFkIGFueSBwcm9ncmVzc2VkIHdvcmsgYWxyZWFkeSwgdGhhdCBpcyBpbnZhbGlkIGF0IHRoaXMgcG9pbnQgc29cbiAgICAvLyBsZXQncyB0aHJvdyBpdCBvdXQuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGZvcmsgb2YgcmVjb25jaWxlQ2hpbGRyZW4uIEl0J3MgdXNlZCBpbiBjYXNlcyB3aGVyZSB3ZVxuICAvLyB3YW50IHRvIHJlY29uY2lsZSB3aXRob3V0IG1hdGNoaW5nIGFnYWluc3QgdGhlIGV4aXN0aW5nIHNldC4gVGhpcyBoYXMgdGhlXG4gIC8vIGVmZmVjdCBvZiBhbGwgY3VycmVudCBjaGlsZHJlbiBiZWluZyB1bm1vdW50ZWQ7IGV2ZW4gaWYgdGhlIHR5cGUgYW5kIGtleVxuICAvLyBhcmUgdGhlIHNhbWUsIHRoZSBvbGQgY2hpbGQgaXMgdW5tb3VudGVkIGFuZCBhIG5ldyBjaGlsZCBpcyBjcmVhdGVkLlxuICAvL1xuICAvLyBUbyBkbyB0aGlzLCB3ZSdyZSBnb2luZyB0byBnbyB0aHJvdWdoIHRoZSByZWNvbmNpbGUgYWxnb3JpdGhtIHR3aWNlLiBJblxuICAvLyB0aGUgZmlyc3QgcGFzcywgd2Ugc2NoZWR1bGUgYSBkZWxldGlvbiBmb3IgYWxsIHRoZSBjdXJyZW50IGNoaWxkcmVuIGJ5XG4gIC8vIHBhc3NpbmcgbnVsbC5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBJbiB0aGUgc2Vjb25kIHBhc3MsIHdlIG1vdW50IHRoZSBuZXcgY2hpbGRyZW4uIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgd2VcbiAgLy8gcGFzcyBudWxsIGluIHBsYWNlIG9mIHdoZXJlIHdlIHVzdWFsbHkgcGFzcyB0aGUgY3VycmVudCBjaGlsZCBzZXQuIFRoaXMgaGFzXG4gIC8vIHRoZSBlZmZlY3Qgb2YgcmVtb3VudGluZyBhbGwgY2hpbGRyZW4gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZWlyXG4gIC8vIGlkZW50aXRpZXMgbWF0Y2guXG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZvcndhcmRSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyBhZnRlciB0aGUgZmlyc3QgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgaW5uZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbmRlciA9IENvbXBvbmVudC5yZW5kZXI7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlciwgbmV4dFByb3BzLCByZWYsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgaGFzSWQgPSBjaGVja0RpZFJlbmRlcklkSG9vaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFJlY2VpdmVVcGRhdGUpIHtcbiAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgaWYgKGdldElzSHlkcmF0aW5nKCkgJiYgaGFzSWQpIHtcbiAgICBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgdmFyIHR5cGUgPSBDb21wb25lbnQudHlwZTtcblxuICAgIGlmIChpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpICYmIENvbXBvbmVudC5jb21wYXJlID09PSBudWxsICYmIC8vIFNpbXBsZU1lbW9Db21wb25lbnQgY29kZXBhdGggZG9lc24ndCByZXNvbHZlIG91dGVyIHByb3BzIGVpdGhlci5cbiAgICBDb21wb25lbnQuZGVmYXVsdFByb3BzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZXNvbHZlZFR5cGUgPSB0eXBlO1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKTtcbiAgICAgIH0gLy8gSWYgdGhpcyBpcyBhIHBsYWluIGZ1bmN0aW9uIGNvbXBvbmVudCB3aXRob3V0IGRlZmF1bHQgcHJvcHMsXG4gICAgICAvLyBhbmQgd2l0aCBvbmx5IHRoZSBkZWZhdWx0IHNoYWxsb3cgY29tcGFyaXNvbiwgd2UgdXBncmFkZSBpdFxuICAgICAgLy8gdG8gYSBTaW1wbGVNZW1vQ29tcG9uZW50IHRvIGFsbG93IGZhc3QgcGF0aCB1cGRhdGVzLlxuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IFNpbXBsZU1lbW9Db21wb25lbnQ7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gcmVzb2x2ZWRUeXBlO1xuXG4gICAgICB7XG4gICAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgdHlwZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZXNvbHZlZFR5cGUsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGlsZCA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyhDb21wb25lbnQudHlwZSwgbnVsbCwgbmV4dFByb3BzLCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MubW9kZSwgcmVuZGVyTGFuZXMpO1xuICAgIGNoaWxkLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICBjaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGNoaWxkO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIHtcbiAgICB2YXIgX3R5cGUgPSBDb21wb25lbnQudHlwZTtcbiAgICB2YXIgX2lubmVyUHJvcFR5cGVzID0gX3R5cGUucHJvcFR5cGVzO1xuXG4gICAgaWYgKF9pbm5lclByb3BUeXBlcykge1xuICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgIC8vIFdlIGNvdWxkIG1vdmUgaXQgdGhlcmUsIGJ1dCB3ZSdkIHN0aWxsIG5lZWQgdGhpcyBmb3IgbGF6eSBjb2RlIHBhdGguXG4gICAgICBjaGVja1Byb3BUeXBlcyhfaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKF90eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IGN1cnJlbnQuY2hpbGQ7IC8vIFRoaXMgaXMgYWx3YXlzIGV4YWN0bHkgb25lIGNoaWxkXG5cbiAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICBpZiAoIWhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzOyAvLyBEZWZhdWx0IHRvIHNoYWxsb3cgY29tcGFyaXNvblxuXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG5cbiAgICBpZiAoY29tcGFyZShwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBuZXh0UHJvcHMpO1xuICBuZXdDaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICByZXR1cm4gbmV3Q2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcykge1xuICAvLyBUT0RPOiBjdXJyZW50IGNhbiBiZSBub24tbnVsbCBoZXJlIGV2ZW4gaWYgdGhlIGNvbXBvbmVudFxuICAvLyBoYXNuJ3QgeWV0IG1vdW50ZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBpbm5lciByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBvdXRlck1lbW9UeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG5cbiAgICAgIGlmIChvdXRlck1lbW9UeXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgLy8gV2Ugd2FybiB3aGVuIHlvdSBkZWZpbmUgcHJvcFR5cGVzIG9uIGxhenkoKVxuICAgICAgICAvLyBzbyBsZXQncyBqdXN0IHNraXAgb3ZlciBpdCB0byBmaW5kIG1lbW8oKSBvdXRlciB3cmFwcGVyLlxuICAgICAgICAvLyBJbm5lciBwcm9wcyBmb3IgbWVtbyBhcmUgdmFsaWRhdGVkIGxhdGVyLlxuICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IG91dGVyTWVtb1R5cGU7XG4gICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IGluaXQocGF5bG9hZCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBvdXRlck1lbW9UeXBlID0gbnVsbDtcbiAgICAgICAgfSAvLyBJbm5lciBwcm9wVHlwZXMgd2lsbCBiZSB2YWxpZGF0ZWQgaW4gdGhlIGZ1bmN0aW9uIGNvbXBvbmVudCBwYXRoLlxuXG5cbiAgICAgICAgdmFyIG91dGVyUHJvcFR5cGVzID0gb3V0ZXJNZW1vVHlwZSAmJiBvdXRlck1lbW9UeXBlLnByb3BUeXBlcztcblxuICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCAoU2ltcGxlTWVtb0NvbXBvbmVudCBoYXMgbm8gZGVmYXVsdFByb3BzKVxuICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG91dGVyTWVtb1R5cGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcblxuICAgIGlmIChzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpICYmIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWYgJiYgKCAvLyBQcmV2ZW50IGJhaWxvdXQgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQuXG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7IC8vIFRoZSBwcm9wcyBhcmUgc2hhbGxvd2x5IGVxdWFsLiBSZXVzZSB0aGUgcHJldmlvdXMgcHJvcHMgb2JqZWN0LCBsaWtlIHdlXG4gICAgICAvLyB3b3VsZCBkdXJpbmcgYSBub3JtYWwgZmliZXIgYmFpbG91dC5cbiAgICAgIC8vXG4gICAgICAvLyBXZSBkb24ndCBoYXZlIHN0cm9uZyBndWFyYW50ZWVzIHRoYXQgdGhlIHByb3BzIG9iamVjdCBpcyByZWZlcmVudGlhbGx5XG4gICAgICAvLyBlcXVhbCBkdXJpbmcgdXBkYXRlcyB3aGVyZSB3ZSBjYW4ndCBiYWlsIG91dCBhbnl3YXkgXHUyMDE0IGxpa2UgaWYgdGhlIHByb3BzXG4gICAgICAvLyBhcmUgc2hhbGxvd2x5IGVxdWFsLCBidXQgdGhlcmUncyBhIGxvY2FsIHN0YXRlIG9yIGNvbnRleHQgdXBkYXRlIGluIHRoZVxuICAgICAgLy8gc2FtZSBiYXRjaC5cbiAgICAgIC8vXG4gICAgICAvLyBIb3dldmVyLCBhcyBhIHByaW5jaXBsZSwgd2Ugc2hvdWxkIGFpbSB0byBtYWtlIHRoZSBiZWhhdmlvciBjb25zaXN0ZW50XG4gICAgICAvLyBhY3Jvc3MgZGlmZmVyZW50IHdheXMgb2YgbWVtb2l6aW5nIGEgY29tcG9uZW50LiBGb3IgZXhhbXBsZSwgUmVhY3QubWVtb1xuICAgICAgLy8gaGFzIGEgZGlmZmVyZW50IGludGVybmFsIEZpYmVyIGxheW91dCBpZiB5b3UgcGFzcyBhIG5vcm1hbCBmdW5jdGlvblxuICAgICAgLy8gY29tcG9uZW50IChTaW1wbGVNZW1vQ29tcG9uZW50KSB2ZXJzdXMgaWYgeW91IHBhc3MgYSBkaWZmZXJlbnQgdHlwZVxuICAgICAgLy8gbGlrZSBmb3J3YXJkUmVmIChNZW1vQ29tcG9uZW50KS4gQnV0IHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLlxuICAgICAgLy8gV3JhcHBpbmcgYSBjb21wb25lbnQgaW4gZm9yd2FyZFJlZiAob3IgUmVhY3QubGF6eSwgZXRjKSBzaG91bGRuJ3RcbiAgICAgIC8vIGFmZmVjdCB3aGV0aGVyIHRoZSBwcm9wcyBvYmplY3QgaXMgcmV1c2VkIGR1cmluZyBhIGJhaWxvdXQuXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IG5leHRQcm9wcyA9IHByZXZQcm9wcztcblxuICAgICAgaWYgKCFjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgbGFuZXMgd2VyZSBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYmVnaW5Xb3JrLiBXZSdyZVxuICAgICAgICAvLyBhYm91dCB0byBiYWlsIG91dCwgYnV0IHRoZXJlIG1pZ2h0IGJlIG90aGVyIGxhbmVzIHRoYXQgd2VyZW4ndFxuICAgICAgICAvLyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCByZW5kZXIuIFVzdWFsbHksIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHVwZGF0ZXMgaXMgYWNjdW11bGF0ZWQgZHVyaW5nIHRoZSBldmFsdWF0aW9uIG9mIHRoZVxuICAgICAgICAvLyBjb21wb25lbnQgKGkuZS4gd2hlbiBwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUpLiBCdXQgc2luY2Ugc2luY2VcbiAgICAgICAgLy8gd2UncmUgYmFpbGluZyBvdXQgZWFybHkgKndpdGhvdXQqIGV2YWx1YXRpbmcgdGhlIGNvbXBvbmVudCwgd2UgbmVlZFxuICAgICAgICAvLyB0byBhY2NvdW50IGZvciBpdCBoZXJlLCB0b28uIFJlc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCBmaWJlci5cbiAgICAgICAgLy8gTk9URTogVGhpcyBvbmx5IGFwcGxpZXMgdG8gU2ltcGxlTWVtb0NvbXBvbmVudCwgbm90IE1lbW9Db21wb25lbnQsXG4gICAgICAgIC8vIGJlY2F1c2UgYSBNZW1vQ29tcG9uZW50IGZpYmVyIGRvZXMgbm90IGhhdmUgaG9va3Mgb3IgYW4gdXBkYXRlIHF1ZXVlO1xuICAgICAgICAvLyByYXRoZXIsIGl0IHdyYXBzIGFyb3VuZCBhbiBpbm5lciBjb21wb25lbnQsIHdoaWNoIG1heSBvciBtYXkgbm90XG4gICAgICAgIC8vIGNvbnRhaW5zIGhvb2tzLlxuICAgICAgICAvLyBUT0RPOiBNb3ZlIHRoZSByZXNldCBhdCBpbiBiZWdpbldvcmsgb3V0IG9mIHRoZSBjb21tb24gcGF0aCBzbyB0aGF0XG4gICAgICAgIC8vIHRoaXMgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFN0YXRlIDogbnVsbDtcblxuICBpZiAobmV4dFByb3BzLm1vZGUgPT09ICdoaWRkZW4nIHx8IGVuYWJsZUxlZ2FjeUhpZGRlbiApIHtcbiAgICAvLyBSZW5kZXJpbmcgYSBoaWRkZW4gdHJlZS5cbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gbGVnYWN5IHN5bmMgbW9kZSwgZG9uJ3QgZGVmZXIgdGhlIHN1YnRyZWUuIFJlbmRlciBpdCBub3cuXG4gICAgICAvLyBUT0RPOiBDb25zaWRlciBob3cgT2Zmc2NyZWVuIHNob3VsZCB3b3JrIHdpdGggdHJhbnNpdGlvbnMgaW4gdGhlIGZ1dHVyZVxuICAgICAgdmFyIG5leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IG51bGwsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5leHRTdGF0ZTtcblxuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgIHZhciBzcGF3bmVkQ2FjaGVQb29sID0gbnVsbDsgLy8gV2UncmUgaGlkZGVuLCBhbmQgd2UncmUgbm90IHJlbmRlcmluZyBhdCBPZmZzY3JlZW4uIFdlIHdpbGwgYmFpbCBvdXRcbiAgICAgIC8vIGFuZCByZXN1bWUgdGhpcyB0cmVlIGxhdGVyLlxuXG4gICAgICB2YXIgbmV4dEJhc2VMYW5lcztcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgcHJldkJhc2VMYW5lcyA9IHByZXZTdGF0ZS5iYXNlTGFuZXM7XG4gICAgICAgIG5leHRCYXNlTGFuZXMgPSBtZXJnZUxhbmVzKHByZXZCYXNlTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRCYXNlTGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICAgIH0gLy8gU2NoZWR1bGUgdGhpcyBmaWJlciB0byByZS1yZW5kZXIgYXQgb2Zmc2NyZWVuIHByaW9yaXR5LiBUaGVuIGJhaWxvdXQuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gICAgICB2YXIgX25leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IHNwYXduZWRDYWNoZVBvb2wsXG4gICAgICAgIHRyYW5zaXRpb25zOiBudWxsXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGU7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgICAvLyB0byBhdm9pZCBhIHB1c2gvcG9wIG1pc2FsaWdubWVudC5cblxuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIG5leHRCYXNlTGFuZXMpO1xuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHJlbmRlci4gVGhlIHN1cnJvdW5kaW5nIHZpc2libGUgY29udGVudCBoYXMgYWxyZWFkeVxuICAgICAgLy8gY29tbWl0dGVkLiBOb3cgd2UgcmVzdW1lIHJlbmRlcmluZyB0aGUgaGlkZGVuIHRyZWUuXG4gICAgICAvLyBSZW5kZXJpbmcgYXQgb2Zmc2NyZWVuLCBzbyB3ZSBjYW4gY2xlYXIgdGhlIGJhc2UgbGFuZXMuXG4gICAgICB2YXIgX25leHRTdGF0ZTIgPSB7XG4gICAgICAgIGJhc2VMYW5lczogTm9MYW5lcyxcbiAgICAgICAgY2FjaGVQb29sOiBudWxsLFxuICAgICAgICB0cmFuc2l0aW9uczogbnVsbFxuICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBfbmV4dFN0YXRlMjsgLy8gUHVzaCB0aGUgbGFuZXMgdGhhdCB3ZXJlIHNraXBwZWQgd2hlbiB3ZSBiYWlsZWQgb3V0LlxuXG4gICAgICB2YXIgc3VidHJlZVJlbmRlckxhbmVzID0gcHJldlN0YXRlICE9PSBudWxsID8gcHJldlN0YXRlLmJhc2VMYW5lcyA6IHJlbmRlckxhbmVzO1xuXG4gICAgICBwdXNoUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MsIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFJlbmRlcmluZyBhIHZpc2libGUgdHJlZS5cbiAgICB2YXIgX3N1YnRyZWVSZW5kZXJMYW5lcztcblxuICAgIGlmIChwcmV2U3RhdGUgIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIGdvaW5nIGZyb20gaGlkZGVuIC0+IHZpc2libGUuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2U3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlbid0IHByZXZpb3VzbHkgaGlkZGVuLCBhbmQgd2Ugc3RpbGwgYXJlbid0LCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAgIC8vIHNwZWNpYWwgdG8gZG8uIE5lZWQgdG8gcHVzaCB0byB0aGUgc3RhY2sgcmVnYXJkbGVzcywgdGhvdWdoLCB0byBhdm9pZFxuICAgICAgLy8gYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgfVxuXG4gICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBfc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVByb2ZpbGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuXG4gICAge1xuICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgLy8gVGhlc2UgYXJlIHJlc2V0IGR1cmluZyByZW5kZXIgdG8gYWxsb3cgdGhlIERldlRvb2xzIGNvbW1pdCBob29rIGEgY2hhbmNlIHRvIHJlYWQgdGhlbSxcbiAgICAgIHZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICB2YXIgcmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsICYmIHJlZiAhPT0gbnVsbCB8fCBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSByZWYpIHtcbiAgICAvLyBTY2hlZHVsZSBhIFJlZiBlZmZlY3RcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWY7XG5cbiAgICB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBSZWZTdGF0aWM7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgY29udGV4dDtcblxuICB7XG4gICAgdmFyIHVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCB0cnVlKTtcbiAgICBjb250ZXh0ID0gZ2V0TWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgdW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHZhciBoYXNJZDtcbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0YXJ0ZWQod29ya0luUHJvZ3Jlc3MpO1xuICB9XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBoYXNJZCA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICB9XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBlcnJvci5cbiAgICBzd2l0Y2ggKHNob3VsZEVycm9yKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUT0RPIFRoaXMgd2F5IG9mIHJlc2V0dGluZyB0aGUgZXJyb3IgYm91bmRhcnkgc3RhdGUgaXMgYSBoYWNrLlxuICAgICAgICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuXG4gICAgICAgICAgdmFyIHRlbXBJbnN0YW5jZSA9IG5ldyBjdG9yKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMsIF9pbnN0YW5jZS5jb250ZXh0KTtcbiAgICAgICAgICB2YXIgc3RhdGUgPSB0ZW1wSW5zdGFuY2Uuc3RhdGU7XG5cbiAgICAgICAgICBfaW5zdGFuY2UudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUoX2luc3RhbmNlLCBzdGF0ZSwgbnVsbCk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIHRydWU6XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNob3VsZENhcHR1cmU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG5cbiAgICAgICAgICB2YXIgZXJyb3IkMSA9IG5ldyBFcnJvcignU2ltdWxhdGVkIGVycm9yIGNvbWluZyBmcm9tIERldlRvb2xzJyk7XG4gICAgICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShyZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTsgLy8gU2NoZWR1bGUgdGhlIGVycm9yIGJvdW5kYXJ5IHRvIHJlLXJlbmRlciB1c2luZyB1cGRhdGVkIHN0YXRlXG5cbiAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgY3JlYXRlQ2FwdHVyZWRWYWx1ZShlcnJvciQxLCB3b3JrSW5Qcm9ncmVzcyksIGxhbmUpO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgdXBkYXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgLy8gRHVyaW5nIG1vdW50aW5nIHdlIGRvbid0IGtub3cgdGhlIGNoaWxkIGNvbnRleHQgeWV0IGFzIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGV4aXN0LlxuICAvLyBXZSB3aWxsIGludmFsaWRhdGUgdGhlIGNoaWxkIGNvbnRleHQgaW4gZmluaXNoQ2xhc3NDb21wb25lbnQoKSByaWdodCBhZnRlciByZW5kZXJpbmcuXG5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgdmFyIHNob3VsZFVwZGF0ZTtcblxuICBpZiAoaW5zdGFuY2UgPT09IG51bGwpIHtcbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBjbGFzcyBjb21wb25lbnQgd2l0aG91dCBhbiBpbnN0YW5jZSBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWRcbiAgICAgIC8vIGluc2lkZSBhIG5vbi1jb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0b1xuICAgICAgLy8gdHJlYXQgaXQgbGlrZSBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5XG4gICAgICAvLyBjb21taXR0ZWQuIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICAgIH0gLy8gSW4gdGhlIGluaXRpYWwgcGFzcyB3ZSBtaWdodCBuZWVkIHRvIGNvbnN0cnVjdCB0aGUgaW5zdGFuY2UuXG5cblxuICAgIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gSW4gYSByZXN1bWUsIHdlJ2xsIGFscmVhZHkgaGF2ZSBhbiBpbnN0YW5jZSB3ZSBjYW4gcmV1c2UuXG4gICAgc2hvdWxkVXBkYXRlID0gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFVwZGF0ZSA9IHVwZGF0ZUNsYXNzSW5zdGFuY2UoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgbmV4dFVuaXRPZldvcmsgPSBmaW5pc2hDbGFzc0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBzaG91bGRVcGRhdGUsIGhhc0NvbnRleHQsIHJlbmRlckxhbmVzKTtcblxuICB7XG4gICAgdmFyIGluc3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoc2hvdWxkVXBkYXRlICYmIGluc3QucHJvcHMgIT09IG5leHRQcm9wcykge1xuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgIGVycm9yKCdJdCBsb29rcyBsaWtlICVzIGlzIHJlYXNzaWduaW5nIGl0cyBvd24gYHRoaXMucHJvcHNgIHdoaWxlIHJlbmRlcmluZy4gJyArICdUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIGNhbiBsZWFkIHRvIGNvbmZ1c2luZyBidWdzLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZiQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgdmFyIGRpZENhcHR1cmVFcnJvciA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmICghc2hvdWxkVXBkYXRlICYmICFkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBDb250ZXh0IHByb3ZpZGVycyBzaG91bGQgZGVmZXIgdG8gc0NVIGZvciByZW5kZXJpbmdcbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gUmVyZW5kZXJcblxuICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgdmFyIG5leHRDaGlsZHJlbjtcblxuICBpZiAoZGlkQ2FwdHVyZUVycm9yICYmIHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYgd2UgY2FwdHVyZWQgYW4gZXJyb3IsIGJ1dCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgaXMgbm90IGRlZmluZWQsXG4gICAgLy8gdW5tb3VudCBhbGwgdGhlIGNoaWxkcmVuLiBjb21wb25lbnREaWRDYXRjaCB3aWxsIHNjaGVkdWxlIGFuIHVwZGF0ZSB0b1xuICAgIC8vIHJlLXJlbmRlciBhIGZhbGxiYWNrLiBUaGlzIGlzIHRlbXBvcmFyeSB1bnRpbCB3ZSBtaWdyYXRlIGV2ZXJ5b25lIHRvXG4gICAgLy8gdGhlIG5ldyBBUEkuXG4gICAgLy8gVE9ETzogV2FybiBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgIG5leHRDaGlsZHJlbiA9IG51bGw7XG5cbiAgICB7XG4gICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RhcnRlZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAge1xuICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyh0cnVlKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGluc3RhbmNlLnJlbmRlcigpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiBkaWRDYXB0dXJlRXJyb3IpIHtcbiAgICAvLyBJZiB3ZSdyZSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlY29uY2lsZSB3aXRob3V0IHJldXNpbmcgYW55IG9mXG4gICAgLy8gdGhlIGV4aXN0aW5nIGNoaWxkcmVuLiBDb25jZXB0dWFsbHksIHRoZSBub3JtYWwgY2hpbGRyZW4gYW5kIHRoZSBjaGlsZHJlblxuICAgIC8vIHRoYXQgYXJlIHNob3duIG9uIGVycm9yIGFyZSB0d28gZGlmZmVyZW50IHNldHMsIHNvIHdlIHNob3VsZG4ndCByZXVzZVxuICAgIC8vIG5vcm1hbCBjaGlsZHJlbiBldmVuIGlmIHRoZWlyIGlkZW50aXRpZXMgbWF0Y2guXG4gICAgZm9yY2VVbm1vdW50Q3VycmVudEFuZFJlY29uY2lsZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gZWxzZSB7XG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICB9IC8vIE1lbW9pemUgc3RhdGUgdXNpbmcgdGhlIHZhbHVlcyB3ZSBqdXN0IHVzZWQgdG8gcmVuZGVyLlxuICAvLyBUT0RPOiBSZXN0cnVjdHVyZSBzbyB3ZSBuZXZlciByZWFkIHZhbHVlcyBmcm9tIHRoZSBpbnN0YW5jZS5cblxuXG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTsgLy8gVGhlIGNvbnRleHQgbWlnaHQgaGF2ZSBjaGFuZ2VkIHNvIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgaXQuXG5cbiAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKSB7XG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmIChyb290LnBlbmRpbmdDb250ZXh0KSB7XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5wZW5kaW5nQ29udGV4dCwgcm9vdC5wZW5kaW5nQ29udGV4dCAhPT0gcm9vdC5jb250ZXh0KTtcbiAgfSBlbHNlIGlmIChyb290LmNvbnRleHQpIHtcbiAgICAvLyBTaG91bGQgYWx3YXlzIGJlIHNldFxuICAgIHB1c2hUb3BMZXZlbENvbnRleHRPYmplY3Qod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGV4dCwgZmFsc2UpO1xuICB9XG5cbiAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHJvb3QuY29udGFpbmVySW5mbyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUhvc3RSb290KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIGhhdmUgYSBjdXJyZW50IGZpYmVyLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIHZhciBwcmV2Q2hpbGRyZW4gPSBwcmV2U3RhdGUuZWxlbWVudDtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCBudWxsLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG5cbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRTdGF0ZS5lbGVtZW50O1xuXG4gIGlmICggcHJldlN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgIC8vIFRoaXMgaXMgYSBoeWRyYXRpb24gcm9vdCB3aG9zZSBzaGVsbCBoYXMgbm90IHlldCBoeWRyYXRlZC4gV2Ugc2hvdWxkXG4gICAgLy8gYXR0ZW1wdCB0byBoeWRyYXRlLlxuICAgIC8vIEZsaXAgaXNEZWh5ZHJhdGVkIHRvIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgd2hlbiB0aGlzIHJlbmRlclxuICAgIC8vIGZpbmlzaGVzLCB0aGUgcm9vdCB3aWxsIG5vIGxvbmdlciBiZSBkZWh5ZHJhdGVkLlxuICAgIHZhciBvdmVycmlkZVN0YXRlID0ge1xuICAgICAgZWxlbWVudDogbmV4dENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBmYWxzZSxcbiAgICAgIGNhY2hlOiBuZXh0U3RhdGUuY2FjaGUsXG4gICAgICBwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOiBuZXh0U3RhdGUucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyxcbiAgICAgIHRyYW5zaXRpb25zOiBuZXh0U3RhdGUudHJhbnNpdGlvbnNcbiAgICB9O1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBgYmFzZVN0YXRlYCBjYW4gYWx3YXlzIGJlIHRoZSBsYXN0IHN0YXRlIGJlY2F1c2UgdGhlIHJvb3QgZG9lc24ndFxuICAgIC8vIGhhdmUgcmVkdWNlciBmdW5jdGlvbnMgc28gaXQgZG9lc24ndCBuZWVkIHJlYmFzaW5nLlxuXG4gICAgdXBkYXRlUXVldWUuYmFzZVN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gb3ZlcnJpZGVTdGF0ZTtcblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIEZvcmNlQ2xpZW50UmVuZGVyKSB7XG4gICAgICAvLyBTb21ldGhpbmcgZXJyb3JlZCBkdXJpbmcgYSBwcmV2aW91cyBhdHRlbXB0IHRvIGh5ZHJhdGUgdGhlIHNoZWxsLCBzbyB3ZVxuICAgICAgLy8gZm9yY2VkIGEgY2xpZW50IHJlbmRlci5cbiAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gbmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nLiBCZWNhdXNlIHRoZSBlcnJvciBoYXBwZW5lZCBvdXRzaWRlICcgKyAnb2YgYSBTdXNwZW5zZSBib3VuZGFyeSwgdGhlIGVudGlyZSByb290IHdpbGwgc3dpdGNoIHRvICcgKyAnY2xpZW50IHJlbmRlcmluZy4nKTtcbiAgICAgIHJldHVybiBtb3VudEhvc3RSb290V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIGlmIChuZXh0Q2hpbGRyZW4gIT09IHByZXZDaGlsZHJlbikge1xuICAgICAgdmFyIF9yZWNvdmVyYWJsZUVycm9yID0gbmV3IEVycm9yKCdUaGlzIHJvb3QgcmVjZWl2ZWQgYW4gZWFybHkgdXBkYXRlLCBiZWZvcmUgYW55dGhpbmcgd2FzIGFibGUgJyArICdoeWRyYXRlLiBTd2l0Y2hlZCB0aGUgZW50aXJlIHJvb3QgdG8gY2xpZW50IHJlbmRlcmluZy4nKTtcblxuICAgICAgcmV0dXJuIG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzLCBfcmVjb3ZlcmFibGVFcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBvdXRlcm1vc3Qgc2hlbGwgaGFzIG5vdCBoeWRyYXRlZCB5ZXQuIFN0YXJ0IGh5ZHJhdGluZy5cbiAgICAgIGVudGVySHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICB2YXIgY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY2hpbGQ7XG4gICAgICB2YXIgbm9kZSA9IGNoaWxkO1xuXG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAvLyBNYXJrIGVhY2ggY2hpbGQgYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgICAgLy8gbm9kZSBoYXMgZnVsbHkgbW91bnRlZCB5ZXQsIGFuZCBmb3Igc2NoZWR1bGluZyBldmVudCByZXBsYXlpbmcuXG4gICAgICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgICAgLy8gbXV0YXRpb25zIGJlY2F1c2UgaXQgYWxyZWFkeSBleGlzdHMuXG4gICAgICAgIG5vZGUuZmxhZ3MgPSBub2RlLmZsYWdzICYgflBsYWNlbWVudCB8IEh5ZHJhdGluZztcbiAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUm9vdCBpcyBub3QgZGVoeWRyYXRlZC4gRWl0aGVyIHRoaXMgaXMgYSBjbGllbnQtb25seSByb290LCBvciBpdFxuICAgIC8vIGFscmVhZHkgaHlkcmF0ZWQuXG4gICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuXG4gICAgaWYgKG5leHRDaGlsZHJlbiA9PT0gcHJldkNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMsIHJlY292ZXJhYmxlRXJyb3IpIHtcbiAgLy8gUmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXG4gIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgcXVldWVIeWRyYXRpb25FcnJvcihyZWNvdmVyYWJsZUVycm9yKTtcbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIb3N0Q29tcG9uZW50JDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cblxuICB2YXIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbnVsbDtcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIGlzRGlyZWN0VGV4dENoaWxkID0gc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgbmV4dFByb3BzKTtcblxuICBpZiAoaXNEaXJlY3RUZXh0Q2hpbGQpIHtcbiAgICAvLyBXZSBzcGVjaWFsIGNhc2UgYSBkaXJlY3QgdGV4dCBjaGlsZCBvZiBhIGhvc3Qgbm9kZS4gVGhpcyBpcyBhIGNvbW1vblxuICAgIC8vIGNhc2UuIFdlIHdvbid0IGhhbmRsZSBpdCBhcyBhIHJlaWZpZWQgY2hpbGQuIFdlIHdpbGwgaW5zdGVhZCBoYW5kbGVcbiAgICAvLyB0aGlzIGluIHRoZSBob3N0IGVudmlyb25tZW50IHRoYXQgYWxzbyBoYXMgYWNjZXNzIHRvIHRoaXMgcHJvcC4gVGhhdFxuICAgIC8vIGF2b2lkcyBhbGxvY2F0aW5nIGFub3RoZXIgSG9zdFRleHQgZmliZXIgYW5kIHRyYXZlcnNpbmcgaXQuXG4gICAgbmV4dENoaWxkcmVuID0gbnVsbDtcbiAgfSBlbHNlIGlmIChwcmV2UHJvcHMgIT09IG51bGwgJiYgc2hvdWxkU2V0VGV4dENvbnRlbnQodHlwZSwgcHJldlByb3BzKSkge1xuICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZyBmcm9tIGEgZGlyZWN0IHRleHQgY2hpbGQgdG8gYSBub3JtYWwgY2hpbGQsIG9yIHRvXG4gICAgLy8gZW1wdHksIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhlIHRleHQgY29udGVudCB0byBiZSByZXNldC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDb250ZW50UmVzZXQ7XG4gIH1cblxuICBtYXJrUmVmJDEoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfSAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuIFRoaXMgaXMgdGVybWluYWwuIFdlJ2xsIGRvIHRoZSBjb21wbGV0aW9uIHN0ZXBcbiAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIuXG5cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXp5Q29tcG9uZW50KF9jdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgZWxlbWVudFR5cGUsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChfY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIEEgbGF6eSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgIF9jdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgdmFyIHByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgbGF6eUNvbXBvbmVudCA9IGVsZW1lbnRUeXBlO1xuICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcbiAgdmFyIENvbXBvbmVudCA9IGluaXQocGF5bG9hZCk7IC8vIFN0b3JlIHRoZSB1bndyYXBwZWQgY29tcG9uZW50IGluIHRoZSB0eXBlLlxuXG4gIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQ7XG4gIHZhciByZXNvbHZlZFRhZyA9IHdvcmtJblByb2dyZXNzLnRhZyA9IHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCk7XG4gIHZhciByZXNvbHZlZFByb3BzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHByb3BzKTtcbiAgdmFyIGNoaWxkO1xuXG4gIHN3aXRjaCAocmVzb2x2ZWRUYWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVDbGFzc0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBDb21wb25lbnQgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGb3J3YXJkUmVmKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLnR5cGUgIT09IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICB2YXIgb3V0ZXJQcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzO1xuXG4gICAgICAgICAgICBpZiAob3V0ZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIHJlc29sdmVkUHJvcHMsIC8vIFJlc29sdmVkIGZvciBvdXRlciBvbmx5XG4gICAgICAgICAgICAgICdwcm9wJywgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlTWVtb0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudC50eXBlLCByZXNvbHZlZFByb3BzKSwgLy8gVGhlIGlubmVyIHR5cGUgY2FuIGhhdmUgZGVmYXVsdHMgdG9vXG4gICAgICAgIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICB9XG5cbiAgdmFyIGhpbnQgPSAnJztcblxuICB7XG4gICAgaWYgKENvbXBvbmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgQ29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiBDb21wb25lbnQuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgaGludCA9ICcgRGlkIHlvdSB3cmFwIGEgY29tcG9uZW50IGluIFJlYWN0LmxhenkoKSBtb3JlIHRoYW4gb25jZT8nO1xuICAgIH1cbiAgfSAvLyBUaGlzIG1lc3NhZ2UgaW50ZW50aW9uYWxseSBkb2Vzbid0IG1lbnRpb24gRm9yd2FyZFJlZiBvciBNZW1vQ29tcG9uZW50XG4gIC8vIGJlY2F1c2UgdGhlIGZhY3QgdGhhdCBpdCdzIGEgc2VwYXJhdGUgdHlwZSBvZiB3b3JrIGlzIGFuXG4gIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbC5cblxuXG4gIHRocm93IG5ldyBFcnJvcihcIkVsZW1lbnQgdHlwZSBpcyBpbnZhbGlkLiBSZWNlaXZlZCBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0bzogXCIgKyBDb21wb25lbnQgKyBcIi4gXCIgKyAoXCJMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi5cIiArIGhpbnQpKTtcbn1cblxuZnVuY3Rpb24gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKF9jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gQW4gaW5jb21wbGV0ZSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgIF9jdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cblxuICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuICAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChfY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIEFuIGluZGV0ZXJtaW5hdGUgY29tcG9uZW50IG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZCBpbnNpZGUgYSBub24tXG4gICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgIC8vIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHkgY29tbWl0dGVkLlxuICAgIC8vIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICBfY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuICB2YXIgaGFzSWQ7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKFwiVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBoYXZlIGEgcmVuZGVyIG1ldGhvZCwgYnV0IGRvZXNuJ3QgZXh0ZW5kIFJlYWN0LkNvbXBvbmVudC4gXCIgKyAnVGhpcyBpcyBsaWtlbHkgdG8gY2F1c2UgZXJyb3JzLiBDaGFuZ2UgJXMgdG8gZXh0ZW5kIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKHdvcmtJblByb2dyZXNzLCBudWxsKTtcbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICB7XG4gICAgbWFya0NvbXBvbmVudFJlbmRlclN0b3BwZWQoKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIHtcbiAgICAvLyBTdXBwb3J0IGZvciBtb2R1bGUgY29tcG9uZW50cyBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGJlaGluZCBhIGZsYWcuXG4gICAgLy8gV2hldGhlciBvciBub3QgaXQgd291bGQgY3Jhc2ggbGF0ZXIsIHdlIHdhbnQgdG8gc2hvdyBhIGdvb2QgbWVzc2FnZSBpbiBERVYgZmlyc3QuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJyAmJiB2YWx1ZS4kJHR5cGVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCAnVW5rbm93bic7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ1RoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gYmUgYSBmdW5jdGlvbiBjb21wb25lbnQgdGhhdCByZXR1cm5zIGEgY2xhc3MgaW5zdGFuY2UuICcgKyAnQ2hhbmdlICVzIHRvIGEgY2xhc3MgdGhhdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCBpbnN0ZWFkLiAnICsgXCJJZiB5b3UgY2FuJ3QgdXNlIGEgY2xhc3MgdHJ5IGFzc2lnbmluZyB0aGUgcHJvdG90eXBlIG9uIHRoZSBmdW5jdGlvbiBhcyBhIHdvcmthcm91bmQuIFwiICsgXCJgJXMucHJvdG90eXBlID0gUmVhY3QuQ29tcG9uZW50LnByb3RvdHlwZWAuIERvbid0IHVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzaW5jZSBpdCBcIiArICdjYW5ub3QgYmUgY2FsbGVkIHdpdGggYG5ld2AgYnkgUmVhY3QuJywgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lLCBfY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0TW9kdWxlUGF0dGVybkNvbXBvbmVudFtfY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICggLy8gUnVuIHRoZXNlIGNoZWNrcyBpbiBwcm9kdWN0aW9uIG9ubHkgaWYgdGhlIGZsYWcgaXMgb2ZmLlxuICAvLyBFdmVudHVhbGx5IHdlJ2xsIGRlbGV0ZSB0aGlzIGJyYW5jaCBhbHRvZ2V0aGVyLlxuICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUucmVuZGVyID09PSAnZnVuY3Rpb24nICYmIHZhbHVlLiQkdHlwZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHModHJ1ZSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IHJlbmRlcldpdGhIb29rcyhudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBwcm9wcywgY29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIGhhc0lkID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBoYXNJZCkge1xuICAgICAgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4obnVsbCwgd29ya0luUHJvZ3Jlc3MsIHZhbHVlLCByZW5kZXJMYW5lcyk7XG5cbiAgICB7XG4gICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KSB7XG4gIHtcbiAgICBpZiAoQ29tcG9uZW50KSB7XG4gICAgICBpZiAoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICB9XG5cbiAgICAgIHZhciB3YXJuaW5nS2V5ID0gb3duZXJOYW1lIHx8ICcnO1xuICAgICAgdmFyIGRlYnVnU291cmNlID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlO1xuXG4gICAgICBpZiAoZGVidWdTb3VyY2UpIHtcbiAgICAgICAgd2FybmluZ0tleSA9IGRlYnVnU291cmNlLmZpbGVOYW1lICsgJzonICsgZGVidWdTb3VyY2UubGluZU51bWJlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0pIHtcbiAgICAgICAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzW3dhcm5pbmdLZXldID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignRnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcy4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLiAnICsgJ0RpZCB5b3UgbWVhbiB0byB1c2UgUmVhY3QuZm9yd2FyZFJlZigpPyVzJywgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWUzID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdKSB7XG4gICAgICAgIGVycm9yKCclczogRnVuY3Rpb24gY29tcG9uZW50cyBkbyBub3Qgc3VwcG9ydCBjb250ZXh0VHlwZS4nLCBfY29tcG9uZW50TmFtZTQpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTRdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFNVU1BFTkRFRF9NQVJLRVIgPSB7XG4gIGRlaHlkcmF0ZWQ6IG51bGwsXG4gIHRyZWVDb250ZXh0OiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lcyxcbiAgICBjYWNoZVBvb2w6IGdldFN1c3BlbmRlZENhY2hlKCksXG4gICAgdHJhbnNpdGlvbnM6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjYWNoZVBvb2wgPSBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiBtZXJnZUxhbmVzKHByZXZPZmZzY3JlZW5TdGF0ZS5iYXNlTGFuZXMsIHJlbmRlckxhbmVzKSxcbiAgICBjYWNoZVBvb2w6IGNhY2hlUG9vbCxcbiAgICB0cmFuc2l0aW9uczogcHJldk9mZnNjcmVlblN0YXRlLnRyYW5zaXRpb25zXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgIC8vIGlzIHRydWUuIE1vcmUgcHJlY2lzZSBuYW1lIG1pZ2h0IGJlIFwiRm9yY2VSZW1haW5TdXNwZW5zZUZhbGxiYWNrXCIuXG4gICAgICAvLyBOb3RlOiBUaGlzIGlzIGEgZmFjdG9yaW5nIHNtZWxsLiBDYW4ndCByZW1haW4gb24gYSBmYWxsYmFjayBpZiB0aGVyZSdzXG4gICAgICAvLyBubyBmYWxsYmFjayB0byByZW1haW4gb24uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IC8vIE5vdCBjdXJyZW50bHkgc2hvd2luZyBjb250ZW50LiBDb25zdWx0IHRoZSBTdXNwZW5zZSBjb250ZXh0LlxuXG5cbiAgcmV0dXJuIGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IFNob3VsZCBub3QgcmVtb3ZlIHJlbmRlciBsYW5lcyB0aGF0IHdlcmUgcGluZ2VkIGR1cmluZyB0aGlzIHJlbmRlclxuICByZXR1cm4gcmVtb3ZlTGFuZXMoY3VycmVudC5jaGlsZExhbmVzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzOyAvLyBUaGlzIGlzIHVzZWQgYnkgRGV2VG9vbHMgdG8gZm9yY2UgYSBib3VuZGFyeSB0byBzdXNwZW5kLlxuXG4gIHtcbiAgICBpZiAoc2hvdWxkU3VzcGVuZCh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgfVxuICB9XG5cbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3dGYWxsYmFjayA9IGZhbHNlO1xuICB2YXIgZGlkU3VzcGVuZCA9ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gIGlmIChkaWRTdXNwZW5kIHx8IHNob3VsZFJlbWFpbk9uRmFsbGJhY2soc3VzcGVuc2VDb250ZXh0LCBjdXJyZW50KSkge1xuICAgIC8vIFNvbWV0aGluZyBpbiB0aGlzIGJvdW5kYXJ5J3Mgc3VidHJlZSBhbHJlYWR5IHN1c3BlbmRlZC4gU3dpdGNoIHRvXG4gICAgLy8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjayBjaGlsZHJlbi5cbiAgICBzaG93RmFsbGJhY2sgPSB0cnVlO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IH5EaWRDYXB0dXJlO1xuICB9IGVsc2Uge1xuICAgIC8vIEF0dGVtcHRpbmcgdGhlIG1haW4gY29udGVudFxuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudCBvciB0aGlzIGJvdW5kYXJ5IGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gTWFyayB0aGlzIHN1YnRyZWUgY29udGV4dCBhcyBoYXZpbmcgYXQgbGVhc3Qgb25lIGludmlzaWJsZSBwYXJlbnQgdGhhdCBjb3VsZFxuICAgICAgLy8gaGFuZGxlIHRoZSBmYWxsYmFjayBzdGF0ZS5cbiAgICAgIC8vIEF2b2lkZWQgYm91bmRhcmllcyBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2UgdGhleSBjYW5ub3QgaGFuZGxlIHByZWZlcnJlZCBmYWxsYmFjayBzdGF0ZXMuXG4gICAgICB7XG4gICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IGFkZFN1YnRyZWVTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7IC8vIE9LLCB0aGUgbmV4dCBwYXJ0IGlzIGNvbmZ1c2luZy4gV2UncmUgYWJvdXQgdG8gcmVjb25jaWxlIHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSdzIGNoaWxkcmVuLiBUaGlzIGludm9sdmVzIHNvbWUgY3VzdG9tIHJlY29uY2lsaWF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGh5ZHJhdGluZywgdHJ5IHRvIGh5ZHJhdGUgdGhpcyBib3VuZGFyeS5cbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7IC8vIFRoaXMgY291bGQndmUgYmVlbiBhIGRlaHlkcmF0ZWQgc3VzcGVuc2UgY29tcG9uZW50LlxuXG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBkZWh5ZHJhdGVkID0gc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICBpZiAoZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIGRlaHlkcmF0ZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBuZXh0UHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBuZXh0RmFsbGJhY2tDaGlsZHJlbiA9IG5leHRQcm9wcy5mYWxsYmFjaztcblxuICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgIHZhciBmYWxsYmFja0ZyYWdtZW50ID0gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcmltYXJ5Q2hpbGRyZW4sIG5leHRGYWxsYmFja0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50Lm1lbW9pemVkU3RhdGUgPSBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG5cbiAgICAgIHJldHVybiBmYWxsYmFja0ZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgYW4gdXBkYXRlLlxuICAgIC8vIElmIHRoZSBjdXJyZW50IGZpYmVyIGhhcyBhIFN1c3BlbnNlU3RhdGUsIHRoYXQgbWVhbnMgaXQncyBhbHJlYWR5IHNob3dpbmdcbiAgICAvLyBhIGZhbGxiYWNrLlxuICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0cmVlIGlzIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrXG4gICAgICAvLyBTcGVjaWFsIHBhdGggZm9yIGh5ZHJhdGlvblxuICAgICAgdmFyIF9kZWh5ZHJhdGVkID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgIGlmIChfZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoIWRpZFN1c3BlbmQpIHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfZGVoeWRyYXRlZCwgcHJldlN0YXRlLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBGb3JjZUNsaWVudFJlbmRlcikge1xuICAgICAgICAgIC8vIFNvbWV0aGluZyBlcnJvcmVkIGR1cmluZyBoeWRyYXRpb24uIFRyeSBhZ2FpbiB3aXRob3V0IGh5ZHJhdGluZy5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+Rm9yY2VDbGllbnRSZW5kZXI7XG4gICAgICAgICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgbmV3IEVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nIHRoaXMgU3VzcGVuc2UgYm91bmRhcnkuICcgKyAnU3dpdGNoZWQgdG8gY2xpZW50IHJlbmRlcmluZy4nKSk7XG4gICAgICAgIH0gZWxzZSBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFNvbWV0aGluZyBzdXNwZW5kZWQgYW5kIHdlIHNob3VsZCBzdGlsbCBiZSBpbiBkZWh5ZHJhdGVkIG1vZGUuXG4gICAgICAgICAgLy8gTGVhdmUgdGhlIGV4aXN0aW5nIGNoaWxkIGluIHBsYWNlLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhlIGRlaHlkcmF0ZWQgY29tcGxldGlvbiBwYXNzIGV4cGVjdHMgdGhpcyBmbGFnIHRvIGJlIHRoZXJlXG4gICAgICAgICAgLy8gYnV0IHRoZSBub3JtYWwgc3VzcGVuc2UgcGFzcyBkb2Vzbid0LlxuXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTdXNwZW5kZWQgYnV0IHdlIHNob3VsZCBubyBsb25nZXIgYmUgaW4gZGVoeWRyYXRlZCBtb2RlLlxuICAgICAgICAgIC8vIFRoZXJlZm9yZSB3ZSBub3cgaGF2ZSB0byByZW5kZXIgdGhlIGZhbGxiYWNrLlxuICAgICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICAgICAgICB2YXIgX25leHRGYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgICAgIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlRmFsbGJhY2tBZnRlclJldHJ5V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW4sIF9uZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50Mi5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgICAgICByZXR1cm4gZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG93RmFsbGJhY2spIHtcbiAgICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjIgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjIgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgICAgdmFyIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQgPSB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuMiwgX25leHRGYWxsYmFja0NoaWxkcmVuMiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3RhdGUgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDMubWVtb2l6ZWRTdGF0ZSA9IHByZXZPZmZzY3JlZW5TdGF0ZSA9PT0gbnVsbCA/IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykgOiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDMuY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICAgIHJldHVybiBfZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIF9uZXh0UHJpbWFyeUNoaWxkcmVuMyA9IG5leHRQcm9wcy5jaGlsZHJlbjtcblxuICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NCA9IHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IHRyZWUgaXMgbm90IGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrLlxuICAgICAgaWYgKHNob3dGYWxsYmFjaykge1xuICAgICAgICAvLyBUaW1lZCBvdXQuXG4gICAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4zID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW40ID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfZmFsbGJhY2tDaGlsZEZyYWdtZW50MiA9IHVwZGF0ZVN1c3BlbnNlRmFsbGJhY2tDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW40LCBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4zLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDUgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgdmFyIF9wcmV2T2Zmc2NyZWVuU3RhdGUgPSBjdXJyZW50LmNoaWxkLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDUubWVtb2l6ZWRTdGF0ZSA9IF9wcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShfcHJldk9mZnNjcmVlblN0YXRlLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDUuY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgLy8gZmFsbGJhY2sgY2hpbGRyZW4uXG5cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgICAgcmV0dXJuIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RpbGwgaGF2ZW4ndCB0aW1lZCBvdXQuIENvbnRpbnVlIHJlbmRlcmluZyB0aGUgY2hpbGRyZW4sIGxpa2Ugd2VcbiAgICAgICAgLy8gbm9ybWFsbHkgZG8uXG4gICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjUgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgICAgdmFyIF9wcmltYXJ5Q2hpbGRGcmFnbWVudDYgPSB1cGRhdGVTdXNwZW5zZVByaW1hcnlDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX25leHRQcmltYXJ5Q2hpbGRyZW41LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICAgIHJldHVybiBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ2O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gICAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSk7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKG9mZnNjcmVlblByb3BzLCBtb2RlLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbmAgaXMgYGFueWAgdHlwZWQsIHNvIHdlIHVzZVxuICAvLyB0aGlzIHdyYXBwZXIgZnVuY3Rpb24gdG8gY29uc3RyYWluIGl0LlxuICByZXR1cm4gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKG9mZnNjcmVlblByb3BzLCBtb2RlLCBOb0xhbmVzLCBudWxsKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZVdvcmtJblByb2dyZXNzYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlIHRoaXNcbiAgLy8gd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH0pO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgfVxuXG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gbnVsbDtcblxuICBpZiAoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCAhPT0gbnVsbCkge1xuICAgIC8vIERlbGV0ZSB0aGUgZmFsbGJhY2sgY2hpbGQgZnJhZ21lbnRcbiAgICB2YXIgZGVsZXRpb25zID0gd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zO1xuXG4gICAgaWYgKGRlbGV0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gW2N1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnRdO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gQ2hpbGREZWxldGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRpb25zLnB1c2goY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIHByaW1hcnlDaGlsZEZyYWdtZW50O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3VycmVudC5jaGlsZDtcbiAgdmFyIGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZztcbiAgdmFyIHByaW1hcnlDaGlsZFByb3BzID0ge1xuICAgIG1vZGU6ICdoaWRkZW4nLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50O1xuXG4gIGlmICggLy8gSW4gbGVnYWN5IG1vZGUsIHdlIGNvbW1pdCB0aGUgcHJpbWFyeSB0cmVlIGFzIGlmIGl0IHN1Y2Nlc3NmdWxseVxuICAvLyBjb21wbGV0ZWQsIGV2ZW4gdGhvdWdoIGl0J3MgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLlxuICAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIE1ha2Ugc3VyZSB3ZSdyZSBvbiB0aGUgc2Vjb25kIHBhc3MsIGkuZS4gdGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgd2FzXG4gIC8vIGFscmVhZHkgY2xvbmVkLiBJbiBsZWdhY3kgbW9kZSwgdGhlIG9ubHkgY2FzZSB3aGVyZSB0aGlzIGlzbid0IHRydWUgaXNcbiAgLy8gd2hlbiBEZXZUb29scyBmb3JjZXMgdXMgdG8gZGlzcGxheSBhIGZhbGxiYWNrOyB3ZSBza2lwIHRoZSBmaXJzdCByZW5kZXJcbiAgLy8gcGFzcyBlbnRpcmVseSBhbmQgZ28gc3RyYWlnaHQgdG8gcmVuZGVyaW5nIHRoZSBmYWxsYmFjay4gKEluIENvbmN1cnJlbnRcbiAgLy8gTW9kZSwgU3VzcGVuc2VMaXN0IGNhbiBhbHNvIHRyaWdnZXIgdGhpcyBzY2VuYXJpbywgYnV0IHRoaXMgaXMgYSBsZWdhY3ktXG4gIC8vIG9ubHkgY29kZXBhdGguKVxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCAhPT0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50KSB7XG4gICAgdmFyIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb247XG4gICAgfVxuICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIHJlbWFpbiBvbiB0aGUgZmFsbGJhY2ssIHdlIG5vIGxvbmdlciB3YW50XG4gICAgLy8gdG8gZGVsZXRlIGl0LlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHByaW1hcnlDaGlsZFByb3BzKTtcbiAgICAvLyAoV2UgZG9uJ3QgZG8gdGhpcyBpbiBsZWdhY3kgbW9kZSwgYmVjYXVzZSBpbiBsZWdhY3kgbW9kZSB3ZSBkb24ndCByZS11c2VcbiAgICAvLyB0aGUgY3VycmVudCB0cmVlOyBzZWUgcHJldmlvdXMgYnJhbmNoLilcblxuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc3VidHJlZUZsYWdzID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnN1YnRyZWVGbGFncyAmIFN0YXRpY01hc2s7XG4gIH1cblxuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50O1xuXG4gIGlmIChjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCwgZmFsbGJhY2tDaGlsZHJlbik7XG4gIH0gZWxzZSB7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgICAvLyBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgcmVjb3ZlcmFibGVFcnJvcikge1xuICAvLyBGYWxsaW5nIGJhY2sgdG8gY2xpZW50IHJlbmRlcmluZy4gQmVjYXVzZSB0aGlzIGhhcyBwZXJmb3JtYW5jZVxuICAvLyBpbXBsaWNhdGlvbnMsIGl0J3MgY29uc2lkZXJlZCBhIHJlY292ZXJhYmxlIGVycm9yLCBldmVuIHRob3VnaCB0aGUgdXNlclxuICAvLyBsaWtlbHkgd29uJ3Qgb2JzZXJ2ZSBhbnl0aGluZyB3cm9uZyB3aXRoIHRoZSBVSS5cbiAgLy9cbiAgLy8gVGhlIGVycm9yIGlzIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCB0byBlbmZvcmNlIHRoYXQgZXZlcnkgY2FsbGVyIHByb3ZpZGVcbiAgLy8gYSBjdXN0b20gbWVzc2FnZSwgb3IgZXhwbGljaXRseSBvcHQgb3V0IChjdXJyZW50bHkgdGhlIG9ubHkgcGF0aCB0aGF0IG9wdHNcbiAgLy8gb3V0IGlzIGxlZ2FjeSBtb2RlOyBldmVyeSBjb25jdXJyZW50IHBhdGggcHJvdmlkZXMgYW4gZXJyb3IpLlxuICBpZiAocmVjb3ZlcmFibGVFcnJvciAhPT0gbnVsbCkge1xuICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IocmVjb3ZlcmFibGVFcnJvcik7XG4gIH0gLy8gVGhpcyB3aWxsIGFkZCB0aGUgb2xkIGZpYmVyIHRvIHRoZSBkZWxldGlvbiBsaXN0XG5cblxuICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpOyAvLyBXZSdyZSBub3cgbm90IHN1c3BlbmRlZCBub3IgZGVoeWRyYXRlZC5cblxuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcHJpbWFyeUNoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pOyAvLyBOZWVkcyBhIHBsYWNlbWVudCBlZmZlY3QgYmVjYXVzZSB0aGUgcGFyZW50ICh0aGUgU3VzcGVuc2UgYm91bmRhcnkpIGFscmVhZHlcbiAgLy8gbW91bnRlZCBidXQgdGhpcyBpcyBhIG5ldyBmaWJlci5cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICByZXR1cm4gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2VGYWxsYmFja0FmdGVyUmV0cnlXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBmaWJlck1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ3Zpc2libGUnLFxuICAgIGNoaWxkcmVuOiBwcmltYXJ5Q2hpbGRyZW5cbiAgfTtcbiAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKHByaW1hcnlDaGlsZFByb3BzLCBmaWJlck1vZGUpO1xuICB2YXIgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgZmliZXJNb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZVxuICAvLyBib3VuZGFyeSkgYWxyZWFkeSBtb3VudGVkIGJ1dCB0aGlzIGlzIGEgbmV3IGZpYmVyLlxuXG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBmYWxsYmFja0NoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmcgPSBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAvLyBXZSB3aWxsIGhhdmUgZHJvcHBlZCB0aGUgZWZmZWN0IGxpc3Qgd2hpY2ggY29udGFpbnMgdGhlXG4gICAgLy8gZGVsZXRpb24uIFdlIG5lZWQgdG8gcmVjb25jaWxlIHRvIGRlbGV0ZSB0aGUgY3VycmVudCBjaGlsZC5cbiAgICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnREZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlSW5zdGFuY2UsIHJlbmRlckxhbmVzKSB7XG4gIC8vIER1cmluZyB0aGUgZmlyc3QgcGFzcywgd2UnbGwgYmFpbCBvdXQgYW5kIG5vdCBkcmlsbCBpbnRvIHRoZSBjaGlsZHJlbi5cbiAgLy8gSW5zdGVhZCwgd2UnbGwgbGVhdmUgdGhlIGNvbnRlbnQgaW4gcGxhY2UgYW5kIHRyeSB0byBoeWRyYXRlIGl0IGxhdGVyLlxuICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHtcbiAgICAgIGVycm9yKCdDYW5ub3QgaHlkcmF0ZSBTdXNwZW5zZSBpbiBsZWdhY3kgbW9kZS4gU3dpdGNoIGZyb20gJyArICdSZWFjdERPTS5oeWRyYXRlKGVsZW1lbnQsIGNvbnRhaW5lcikgdG8gJyArICdSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pJyArICcucmVuZGVyKGVsZW1lbnQpIG9yIHJlbW92ZSB0aGUgU3VzcGVuc2UgY29tcG9uZW50cyBmcm9tICcgKyAndGhlIHNlcnZlciByZW5kZXJlZCBjb21wb25lbnRzLicpO1xuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoU3luY0xhbmUpO1xuICB9IGVsc2UgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgLy8gVGhpcyBpcyBhIGNsaWVudC1vbmx5IGJvdW5kYXJ5LiBTaW5jZSB3ZSB3b24ndCBnZXQgYW55IGNvbnRlbnQgZnJvbSB0aGUgc2VydmVyXG4gICAgLy8gZm9yIHRoaXMsIHdlIG5lZWQgdG8gc2NoZWR1bGUgdGhhdCBhdCBhIGhpZ2hlciBwcmlvcml0eSBiYXNlZCBvbiB3aGVuIGl0IHdvdWxkXG4gICAgLy8gaGF2ZSB0aW1lZCBvdXQuIEluIHRoZW9yeSB3ZSBjb3VsZCByZW5kZXIgaXQgaW4gdGhpcyBwYXNzIGJ1dCBpdCB3b3VsZCBoYXZlIHRoZVxuICAgIC8vIHdyb25nIHByaW9yaXR5IGFzc29jaWF0ZWQgd2l0aCBpdCBhbmQgd2lsbCBwcmV2ZW50IGh5ZHJhdGlvbiBvZiBwYXJlbnQgcGF0aC5cbiAgICAvLyBJbnN0ZWFkLCB3ZSdsbCBsZWF2ZSB3b3JrIGxlZnQgb24gaXQgdG8gcmVuZGVyIGl0IGluIGEgc2VwYXJhdGUgY29tbWl0LlxuICAgIC8vIFRPRE8gVGhpcyB0aW1lIHNob3VsZCBiZSB0aGUgdGltZSBhdCB3aGljaCB0aGUgc2VydmVyIHJlbmRlcmVkIHJlc3BvbnNlIHRoYXQgaXNcbiAgICAvLyBhIHBhcmVudCB0byB0aGlzIGJvdW5kYXJ5IHdhcyBkaXNwbGF5ZWQuIEhvd2V2ZXIsIHNpbmNlIHdlIGN1cnJlbnRseSBkb24ndCBoYXZlXG4gICAgLy8gYSBwcm90b2NvbCB0byB0cmFuc2ZlciB0aGF0IHRpbWUsIHdlJ2xsIGp1c3QgZXN0aW1hdGUgaXQgYnkgdXNpbmcgdGhlIGN1cnJlbnRcbiAgICAvLyB0aW1lLiBUaGlzIHdpbGwgbWVhbiB0aGF0IFN1c3BlbnNlIHRpbWVvdXRzIGFyZSBzbGlnaHRseSBzaGlmdGVkIHRvIGxhdGVyIHRoYW5cbiAgICAvLyB0aGV5IHNob3VsZCBiZS5cbiAgICAvLyBTY2hlZHVsZSBhIG5vcm1hbCBwcmkgdXBkYXRlIHRvIHJlbmRlciB0aGlzIGNvbnRlbnQuXG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBsYW5lVG9MYW5lcyhEZWZhdWx0SHlkcmF0aW9uTGFuZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gV2UnbGwgY29udGludWUgaHlkcmF0aW5nIHRoZSByZXN0IGF0IG9mZnNjcmVlbiBwcmlvcml0eSBzaW5jZSB3ZSdsbCBhbHJlYWR5XG4gICAgLy8gYmUgc2hvd2luZyB0aGUgcmlnaHQgY29udGVudCBjb21pbmcgZnJvbSB0aGUgc2VydmVyLCBpdCBpcyBubyBydXNoLlxuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLCByZW5kZXJMYW5lcykge1xuICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgaHlkcmF0aW5nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgcGFzcyxcbiAgLy8gYnV0IGFmdGVyIHdlJ3ZlIGFscmVhZHkgY29tbWl0dGVkIG9uY2UuXG4gIHdhcm5JZkh5ZHJhdGluZygpO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIHJldHJ5U3VzcGVuc2VDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgLy8gVE9ETzogV2hlbiB3ZSBkZWxldGUgbGVnYWN5IG1vZGUsIHdlIHNob3VsZCBtYWtlIHRoaXMgZXJyb3IgYXJndW1lbnRcbiAgICAvLyByZXF1aXJlZCBcdTIwMTQgZXZlcnkgY29uY3VycmVudCBtb2RlIHBhdGggdGhhdCBjYXVzZXMgaHlkcmF0aW9uIHRvXG4gICAgLy8gZGUtb3B0IHRvIGNsaWVudCByZW5kZXJpbmcgc2hvdWxkIGhhdmUgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICBudWxsKTtcbiAgfVxuXG4gIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgIC8vIFRoaXMgYm91bmRhcnkgaXMgaW4gYSBwZXJtYW5lbnQgZmFsbGJhY2sgc3RhdGUuIEluIHRoaXMgY2FzZSwgd2UnbGwgbmV2ZXJcbiAgICAvLyBnZXQgYW4gdXBkYXRlIGFuZCB3ZSdsbCBuZXZlciBiZSBhYmxlIHRvIGh5ZHJhdGUgdGhlIGZpbmFsIGNvbnRlbnQuIExldCdzIGp1c3QgdHJ5IHRoZVxuICAgIC8vIGNsaWVudCBzaWRlIHJlbmRlciBpbnN0ZWFkLlxuICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMsIC8vIFRPRE86IFRoZSBzZXJ2ZXIgc2hvdWxkIHNlcmlhbGl6ZSB0aGUgZXJyb3IgbWVzc2FnZSBzbyB3ZSBjYW4gbG9nIGl0XG4gICAgLy8gaGVyZSBvbiB0aGUgY2xpZW50LiBPciwgaW4gcHJvZHVjdGlvbiwgYSBoYXNoL2lkIHRoYXQgY29ycmVzcG9uZHMgdG9cbiAgICAvLyB0aGUgZXJyb3IuXG4gICAgbmV3IEVycm9yKCdUaGUgc2VydmVyIGNvdWxkIG5vdCBmaW5pc2ggdGhpcyBTdXNwZW5zZSBib3VuZGFyeSwgbGlrZWx5ICcgKyAnZHVlIHRvIGFuIGVycm9yIGR1cmluZyBzZXJ2ZXIgcmVuZGVyaW5nLiBTd2l0Y2hlZCB0byAnICsgJ2NsaWVudCByZW5kZXJpbmcuJykpO1xuICB9XG4gIC8vIGFueSBjb250ZXh0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHRyZWF0IGlzIGFzIGlmIHRoZSBpbnB1dCBtaWdodCBoYXZlIGNoYW5nZWQuXG5cblxuICB2YXIgaGFzQ29udGV4dENoYW5nZWQgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCBjdXJyZW50LmNoaWxkTGFuZXMpO1xuXG4gIGlmIChkaWRSZWNlaXZlVXBkYXRlIHx8IGhhc0NvbnRleHRDaGFuZ2VkKSB7XG4gICAgLy8gVGhpcyBib3VuZGFyeSBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgZmlyc3QgcmVuZGVyLiBUaGlzIG1lYW5zIHRoYXQgd2UgYXJlIG5vdyB1bmFibGUgdG9cbiAgICAvLyBoeWRyYXRlIGl0LiBXZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIGh5ZHJhdGUgaXQgdXNpbmcgYSBoaWdoZXIgcHJpb3JpdHkgbGFuZS5cbiAgICB2YXIgcm9vdCA9IGdldFdvcmtJblByb2dyZXNzUm9vdCgpO1xuXG4gICAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAgIHZhciBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lID0gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcyk7XG5cbiAgICAgIGlmIChhdHRlbXB0SHlkcmF0aW9uQXRMYW5lICE9PSBOb0xhbmUgJiYgYXR0ZW1wdEh5ZHJhdGlvbkF0TGFuZSAhPT0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUpIHtcbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBtdXRhdGluZyBzaW5jZSB0aGlzIHJlbmRlciB3aWxsIGdldCBpbnRlcnJ1cHRlZC4gVGhpc1xuICAgICAgICAvLyBpcyBvbmUgb2YgdGhlIHZlcnkgcmFyZSB0aW1lcyB3aGVyZSB3ZSBtdXRhdGUgdGhlIGN1cnJlbnQgdHJlZVxuICAgICAgICAvLyBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lOyAvLyBUT0RPOiBJZGVhbGx5IHRoaXMgd291bGQgaW5oZXJpdCB0aGUgZXZlbnQgdGltZSBvZiB0aGUgY3VycmVudCByZW5kZXJcblxuICAgICAgICB2YXIgZXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihjdXJyZW50LCBhdHRlbXB0SHlkcmF0aW9uQXRMYW5lLCBldmVudFRpbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgaGF2ZSBzY2hlZHVsZWQgaGlnaGVyIHByaSB3b3JrIGFib3ZlLCB0aGlzIHdpbGwgcHJvYmFibHkganVzdCBhYm9ydCB0aGUgcmVuZGVyXG4gICAgLy8gc2luY2Ugd2Ugbm93IGhhdmUgaGlnaGVyIHByaW9yaXR5IHdvcmssIGJ1dCBpbiBjYXNlIGl0IGRvZXNuJ3QsIHdlIG5lZWQgdG8gcHJlcGFyZSB0b1xuICAgIC8vIHJlbmRlciBzb21ldGhpbmcsIGlmIHdlIHRpbWUgb3V0LiBFdmVuIGlmIHRoYXQgcmVxdWlyZXMgdXMgdG8gZGVsZXRlIGV2ZXJ5dGhpbmcgYW5kXG4gICAgLy8gc2tpcCBoeWRyYXRpb24uXG4gICAgLy8gRGVsYXkgaGF2aW5nIHRvIGRvIHRoaXMgYXMgbG9uZyBhcyB0aGUgc3VzcGVuc2UgdGltZW91dCBhbGxvd3MgdXMuXG5cblxuICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCBuZXcgRXJyb3IoJ1RoaXMgU3VzcGVuc2UgYm91bmRhcnkgcmVjZWl2ZWQgYW4gdXBkYXRlIGJlZm9yZSBpdCBmaW5pc2hlZCAnICsgJ2h5ZHJhdGluZy4gVGhpcyBjYXVzZWQgdGhlIGJvdW5kYXJ5IHRvIHN3aXRjaCB0byBjbGllbnQgcmVuZGVyaW5nLiAnICsgJ1RoZSB1c3VhbCB3YXkgdG8gZml4IHRoaXMgaXMgdG8gd3JhcCB0aGUgb3JpZ2luYWwgdXBkYXRlICcgKyAnaW4gc3RhcnRUcmFuc2l0aW9uLicpKTtcbiAgfSBlbHNlIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN1c3BlbnNlSW5zdGFuY2UpKSB7XG4gICAgLy8gVGhpcyBjb21wb25lbnQgaXMgc3RpbGwgcGVuZGluZyBtb3JlIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBzbyB3ZSBjYW4ndCBoeWRyYXRlIGl0c1xuICAgIC8vIGNvbnRlbnQuIFdlIHRyZWF0IGl0IGFzIGlmIHRoaXMgY29tcG9uZW50IHN1c3BlbmRlZCBpdHNlbGYuIEl0IG1pZ2h0IHNlZW0gYXMgaWZcbiAgICAvLyB3ZSBjb3VsZCBqdXN0IHRyeSB0byByZW5kZXIgaXQgY2xpZW50LXNpZGUgaW5zdGVhZC4gSG93ZXZlciwgdGhpcyB3aWxsIHBlcmZvcm0gYVxuICAgIC8vIGxvdCBvZiB1bm5lY2Vzc2FyeSB3b3JrIGFuZCBpcyB1bmxpa2VseSB0byBjb21wbGV0ZSBzaW5jZSBpdCBvZnRlbiB3aWxsIHN1c3BlbmRcbiAgICAvLyBvbiBtaXNzaW5nIGRhdGEgYW55d2F5LiBBZGRpdGlvbmFsbHksIHRoZSBzZXJ2ZXIgbWlnaHQgYmUgYWJsZSB0byByZW5kZXIgbW9yZVxuICAgIC8vIHRoYW4gd2UgY2FuIG9uIHRoZSBjbGllbnQgeWV0LiBJbiB0aGF0IGNhc2Ugd2UnZCBlbmQgdXAgd2l0aCBtb3JlIGZhbGxiYWNrIHN0YXRlc1xuICAgIC8vIG9uIHRoZSBjbGllbnQgdGhhbiBpZiB3ZSBqdXN0IGxlYXZlIGl0IGFsb25lLiBJZiB0aGUgc2VydmVyIHRpbWVzIG91dCBvciBlcnJvcnNcbiAgICAvLyB0aGVzZSBzaG91bGQgdXBkYXRlIHRoaXMgYm91bmRhcnkgdG8gdGhlIHBlcm1hbmVudCBGYWxsYmFjayBzdGF0ZSBpbnN0ZWFkLlxuICAgIC8vIE1hcmsgaXQgYXMgaGF2aW5nIGNhcHR1cmVkIChpLmUuIHN1c3BlbmRlZCkuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTsgLy8gTGVhdmUgdGhlIGNoaWxkIGluIHBsYWNlLiBJLmUuIHRoZSBkZWh5ZHJhdGVkIGZyYWdtZW50LlxuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkOyAvLyBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIHJldHJ5IHRoaXMgYm91bmRhcnkgb25jZSB0aGUgc2VydmVyIGhhcyBzZW50IHRoZSByZXN1bHQuXG5cbiAgICB2YXIgcmV0cnkgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQobnVsbCwgY3VycmVudCk7XG4gICAgcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoc3VzcGVuc2VJbnN0YW5jZSwgcmV0cnkpO1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGF0dGVtcHQuXG4gICAgcmVlbnRlckh5ZHJhdGlvblN0YXRlRnJvbURlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUluc3RhbmNlLCBzdXNwZW5zZVN0YXRlLnRyZWVDb250ZXh0KTtcbiAgICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgIHZhciBwcmltYXJ5Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuKTsgLy8gTWFyayB0aGUgY2hpbGRyZW4gYXMgaHlkcmF0aW5nLiBUaGlzIGlzIGEgZmFzdCBwYXRoIHRvIGtub3cgd2hldGhlciB0aGlzXG4gICAgLy8gdHJlZSBpcyBwYXJ0IG9mIGEgaHlkcmF0aW5nIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjaGlsZFxuICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgIC8vIENvbmNlcHR1YWxseSB0aGlzIGlzIHNpbWlsYXIgdG8gUGxhY2VtZW50IGluIHRoYXQgYSBuZXcgc3VidHJlZSBpc1xuICAgIC8vIGluc2VydGVkIGludG8gdGhlIFJlYWN0IHRyZWUgaGVyZS4gSXQganVzdCBoYXBwZW5zIHRvIG5vdCBuZWVkIERPTVxuICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuXG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gSHlkcmF0aW5nO1xuICAgIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIoZmliZXIsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKGZpYmVyLnJldHVybiwgcmVuZGVyTGFuZXMsIHByb3BhZ2F0aW9uUm9vdCk7XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgZmlyc3RDaGlsZCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTWFyayBhbnkgU3VzcGVuc2UgYm91bmRhcmllcyB3aXRoIGZhbGxiYWNrcyBhcyBoYXZpbmcgd29yayB0byBkby5cbiAgLy8gSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgZm9yY2VkIGludG8gZmFsbGJhY2tzLCB0aGV5IG1heSBub3cgYmUgYWJsZVxuICAvLyB0byB1bmJsb2NrLlxuICB2YXIgbm9kZSA9IGZpcnN0Q2hpbGQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIobm9kZSwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQpIHtcbiAgICAgIC8vIElmIHRoZSB0YWlsIGlzIGhpZGRlbiB0aGVyZSBtaWdodCBub3QgYmUgYW4gU3VzcGVuc2UgYm91bmRhcmllc1xuICAgICAgLy8gdG8gc2NoZWR1bGUgd29yayBvbi4gSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgb24gdGhlXG4gICAgICAvLyBsaXN0IGl0c2VsZi5cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBsaXN0IHNpbmNlXG4gICAgICAvLyB0aGUgbGlzdCB3aWxsIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIHdoZW4gaXQgcmVyZW5kZXJzLlxuICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgLy8gVGhpcyBpcyBnb2luZyB0byBmaW5kIHRoZSBsYXN0IHJvdyBhbW9uZyB0aGVzZSBjaGlsZHJlbiB0aGF0IGlzIGFscmVhZHlcbiAgLy8gc2hvd2luZyBjb250ZW50IG9uIHRoZSBzY3JlZW4sIGFzIG9wcG9zZWQgdG8gYmVpbmcgaW4gZmFsbGJhY2sgc3RhdGUgb3JcbiAgLy8gbmV3LiBJZiBhIHJvdyBoYXMgbXVsdGlwbGUgU3VzcGVuc2UgYm91bmRhcmllcywgYW55IG9mIHRoZW0gYmVpbmcgaW4gdGhlXG4gIC8vIGZhbGxiYWNrIHN0YXRlLCBjb3VudHMgYXMgdGhlIHdob2xlIHJvdyBiZWluZyBpbiBhIGZhbGxiYWNrIHN0YXRlLlxuICAvLyBOb3RlIHRoYXQgdGhlIFwicm93c1wiIHdpbGwgYmUgd29ya0luUHJvZ3Jlc3MsIGJ1dCBhbnkgbmVzdGVkIGNoaWxkcmVuXG4gIC8vIHdpbGwgc3RpbGwgYmUgY3VycmVudCBzaW5jZSB3ZSBoYXZlbid0IHJlbmRlcmVkIHRoZW0geWV0LiBUaGUgbW91bnRlZFxuICAvLyBvcmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBuZXcgb3JkZXIuIFdlIHVzZSB0aGUgbmV3IG9yZGVyLlxuICB2YXIgcm93ID0gZmlyc3RDaGlsZDtcbiAgdmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDtcblxuICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgIGxhc3RDb250ZW50Um93ID0gcm93O1xuICAgIH1cblxuICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RDb250ZW50Um93O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAocmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCAmJiByZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICd0b2dldGhlcicgJiYgIWRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSkge1xuICAgICAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiByZXZlYWxPcmRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1VzZSBsb3dlcmNhc2UgXCIlc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZm9yd2FyZCc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1JlYWN0IHVzZXMgdGhlIC1zIHN1ZmZpeCBpbiB0aGUgc3BlbGxpbmcuIFVzZSBcIiVzc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAodGFpbE1vZGUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdKSB7XG4gICAgICBpZiAodGFpbE1vZGUgIT09ICdjb2xsYXBzZWQnICYmIHRhaWxNb2RlICE9PSAnaGlkZGVuJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciB0YWlsIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgJyArICdcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIi4gJyArICdEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkU2xvdCwgaW5kZXgpIHtcbiAge1xuICAgIHZhciBpc0FuQXJyYXkgPSBpc0FycmF5KGNoaWxkU2xvdCk7XG4gICAgdmFyIGlzSXRlcmFibGUgPSAhaXNBbkFycmF5ICYmIHR5cGVvZiBnZXRJdGVyYXRvckZuKGNoaWxkU2xvdCkgPT09ICdmdW5jdGlvbic7XG5cbiAgICBpZiAoaXNBbkFycmF5IHx8IGlzSXRlcmFibGUpIHtcbiAgICAgIHZhciB0eXBlID0gaXNBbkFycmF5ID8gJ2FycmF5JyA6ICdpdGVyYWJsZSc7XG5cbiAgICAgIGVycm9yKCdBIG5lc3RlZCAlcyB3YXMgcGFzc2VkIHRvIHJvdyAjJXMgaW4gPFN1c3BlbnNlTGlzdCAvPi4gV3JhcCBpdCBpbiAnICsgJ2FuIGFkZGl0aW9uYWwgU3VzcGVuc2VMaXN0IHRvIGNvbmZpZ3VyZSBpdHMgcmV2ZWFsT3JkZXI6ICcgKyAnPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+IC4uLiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPnslc308L1N1c3BlbnNlTGlzdD4gLi4uICcgKyAnPC9TdXNwZW5zZUxpc3Q+JywgdHlwZSwgaW5kZXgsIHR5cGUpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3VzcGVuc2VMaXN0Q2hpbGRyZW4oY2hpbGRyZW4sIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAoKHJldmVhbE9yZGVyID09PSAnZm9yd2FyZHMnIHx8IHJldmVhbE9yZGVyID09PSAnYmFja3dhcmRzJykgJiYgY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbiAhPT0gbnVsbCAmJiBjaGlsZHJlbiAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChpc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkcmVuW2ldLCBpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5JdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7XG5cbiAgICAgICAgICBpZiAoY2hpbGRyZW5JdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHN0ZXAgPSBjaGlsZHJlbkl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHZhciBfaSA9IDA7XG5cbiAgICAgICAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKHN0ZXAudmFsdWUsIF9pKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIF9pKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yKCdBIHNpbmdsZSByb3cgd2FzIHBhc3NlZCB0byBhIDxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9XCIlc1wiIC8+LiAnICsgJ1RoaXMgaXMgbm90IHVzZWZ1bCBzaW5jZSBpdCBuZWVkcyBtdWx0aXBsZSByb3dzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBwYXNzIG11bHRpcGxlIGNoaWxkcmVuIG9yIGFuIGFycmF5PycsIHJldmVhbE9yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIGlzQmFja3dhcmRzLCB0YWlsLCBsYXN0Q29udGVudFJvdywgdGFpbE1vZGUpIHtcbiAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocmVuZGVyU3RhdGUgPT09IG51bGwpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0ge1xuICAgICAgaXNCYWNrd2FyZHM6IGlzQmFja3dhcmRzLFxuICAgICAgcmVuZGVyaW5nOiBudWxsLFxuICAgICAgcmVuZGVyaW5nU3RhcnRUaW1lOiAwLFxuICAgICAgbGFzdDogbGFzdENvbnRlbnRSb3csXG4gICAgICB0YWlsOiB0YWlsLFxuICAgICAgdGFpbE1vZGU6IHRhaWxNb2RlXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBjYW4gcmV1c2UgdGhlIGV4aXN0aW5nIG9iamVjdCBmcm9tIHByZXZpb3VzIHJlbmRlcnMuXG4gICAgcmVuZGVyU3RhdGUuaXNCYWNrd2FyZHMgPSBpc0JhY2t3YXJkcztcbiAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZ1N0YXJ0VGltZSA9IDA7XG4gICAgcmVuZGVyU3RhdGUubGFzdCA9IGxhc3RDb250ZW50Um93O1xuICAgIHJlbmRlclN0YXRlLnRhaWwgPSB0YWlsO1xuICAgIHJlbmRlclN0YXRlLnRhaWxNb2RlID0gdGFpbE1vZGU7XG4gIH1cbn0gLy8gVGhpcyBjYW4gZW5kIHVwIHJlbmRlcmluZyB0aGlzIGNvbXBvbmVudCBtdWx0aXBsZSBwYXNzZXMuXG4vLyBUaGUgZmlyc3QgcGFzcyBzcGxpdHMgdGhlIGNoaWxkcmVuIGZpYmVycyBpbnRvIHR3byBzZXRzLiBBIGhlYWQgYW5kIHRhaWwuXG4vLyBXZSBmaXJzdCByZW5kZXIgdGhlIGhlYWQuIElmIGFueXRoaW5nIGlzIGluIGZhbGxiYWNrIHN0YXRlLCB3ZSBkbyBhbm90aGVyXG4vLyBwYXNzIHRocm91Z2ggYmVnaW5Xb3JrIHRvIHJlcmVuZGVyIGFsbCBjaGlsZHJlbiAoaW5jbHVkaW5nIHRoZSB0YWlsKSB3aXRoXG4vLyB0aGUgZm9yY2Ugc3VzcGVuZCBjb250ZXh0LiBJZiB0aGUgZmlyc3QgcmVuZGVyIGRpZG4ndCBoYXZlIGFueXRoaW5nIGluXG4vLyBpbiBmYWxsYmFjayBzdGF0ZS4gVGhlbiB3ZSByZW5kZXIgZWFjaCByb3cgaW4gdGhlIHRhaWwgb25lLWJ5LW9uZS5cbi8vIFRoYXQgaGFwcGVucyBpbiB0aGUgY29tcGxldGVXb3JrIHBoYXNlIHdpdGhvdXQgZ29pbmcgYmFjayB0byBiZWdpbldvcmsuXG5cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgcmV2ZWFsT3JkZXIgPSBuZXh0UHJvcHMucmV2ZWFsT3JkZXI7XG4gIHZhciB0YWlsTW9kZSA9IG5leHRQcm9wcy50YWlsO1xuICB2YXIgbmV3Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW47XG4gIHZhbGlkYXRlUmV2ZWFsT3JkZXIocmV2ZWFsT3JkZXIpO1xuICB2YWxpZGF0ZVRhaWxPcHRpb25zKHRhaWxNb2RlLCByZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlU3VzcGVuc2VMaXN0Q2hpbGRyZW4obmV3Q2hpbGRyZW4sIHJldmVhbE9yZGVyKTtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHZhciBzdXNwZW5zZUNvbnRleHQgPSBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIHZhciBzaG91bGRGb3JjZUZhbGxiYWNrID0gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcblxuICBpZiAoc2hvdWxkRm9yY2VGYWxsYmFjaykge1xuICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGRpZFN1c3BlbmRCZWZvcmUgPSBjdXJyZW50ICE9PSBudWxsICYmIChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgLy8gSWYgd2UgcHJldmlvdXNseSBmb3JjZWQgYSBmYWxsYmFjaywgd2UgbmVlZCB0byBzY2hlZHVsZSB3b3JrXG4gICAgICAvLyBvbiBhbnkgbmVzdGVkIGJvdW5kYXJpZXMgdG8gbGV0IHRoZW0ga25vdyB0byB0cnkgdG8gcmVuZGVyXG4gICAgICAvLyBhZ2Fpbi4gVGhpcyBpcyB0aGUgc2FtZSBhcyBjb250ZXh0IHVwZGF0aW5nLlxuICAgICAgcHJvcGFnYXRlU3VzcGVuc2VDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZCwgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHN1c3BlbnNlQ29udGV4dCA9IHNldERlZmF1bHRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCk7XG4gIH1cblxuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIFN1c3BlbnNlTGlzdCBkb2Vzbid0IHdvcmsgc28gd2UganVzdFxuICAgIC8vIHVzZSBtYWtlIGl0IGEgbm9vcCBieSB0cmVhdGluZyBpdCBhcyB0aGUgZGVmYXVsdCByZXZlYWxPcmRlci5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHJldmVhbE9yZGVyKSB7XG4gICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGFzdENvbnRlbnRSb3cgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpO1xuICAgICAgICAgIHZhciB0YWlsO1xuXG4gICAgICAgICAgaWYgKGxhc3RDb250ZW50Um93ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgd2hvbGUgbGlzdCBpcyBwYXJ0IG9mIHRoZSB0YWlsLlxuICAgICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgZmFzdCBwYXRoIGJ5IGp1c3QgcmVuZGVyaW5nIHRoZSB0YWlsIG5vdy5cbiAgICAgICAgICAgIHRhaWwgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgdGFpbCByb3dzIGFmdGVyIHRoZSBjb250ZW50IHJvdy5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkgbGF0ZXIuXG4gICAgICAgICAgICB0YWlsID0gbGFzdENvbnRlbnRSb3cuc2libGluZztcbiAgICAgICAgICAgIGxhc3RDb250ZW50Um93LnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gZmluZCB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSdyZSBnb2luZyB0byByZXZlcnNlIHRoZSBsaXN0IG9mIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvLyB3ZSBwYXNzIGluIHRoZSBtZWFudGltZS4gVGhhdCdzIGdvaW5nIHRvIGJlIG91ciB0YWlsIGluIHJldmVyc2VcbiAgICAgICAgICAvLyBvcmRlci5cbiAgICAgICAgICB2YXIgX3RhaWwgPSBudWxsO1xuICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFpbiBjb250ZW50LlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJvdztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICByb3cuc2libGluZyA9IF90YWlsO1xuICAgICAgICAgICAgX3RhaWwgPSByb3c7XG4gICAgICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgICAgIH0gLy8gVE9ETzogSWYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgaXMgbnVsbCwgd2UgY2FuIGNvbnRpbnVlIG9uIHRoZSB0YWlsIGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIHRydWUsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgX3RhaWwsIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB0YWlsTW9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICB7XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBudWxsLCAvLyB0YWlsXG4gICAgICAgICAgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHVuZGVmaW5lZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHJldmVhbCBvcmRlciBpcyB0aGUgc2FtZSBhcyBub3QgaGF2aW5nXG4gICAgICAgICAgLy8gYSBib3VuZGFyeS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUG9ydGFscyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlIGRvbid0IGFwcGVuZCB0aGUgY2hpbGRyZW4gZHVyaW5nIG1vdW50XG4gICAgLy8gYnV0IGF0IGNvbW1pdC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gdHJhY2sgaW5zZXJ0aW9ucyB3aGljaCB0aGUgbm9ybWFsXG4gICAgLy8gZmxvdyBkb2Vzbid0IGRvIGR1cmluZyBtb3VudC4gVGhpcyBkb2Vzbid0IGhhcHBlbiBhdCB0aGUgcm9vdCBiZWNhdXNlXG4gICAgLy8gdGhlIHJvb3QgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgXCJjdXJyZW50XCIgd2l0aCBhIG51bGwgY2hpbGQuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgdW5pZnlpbmcgdGhpcyB3aXRoIGhvdyB0aGUgcm9vdCB3b3Jrcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBwcm92aWRlclR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyVHlwZS5fY29udGV4dDtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wcy52YWx1ZTtcblxuICB7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBuZXdQcm9wcykpIHtcbiAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIpIHtcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgYHZhbHVlYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGUgYDxDb250ZXh0LlByb3ZpZGVyPmAuIERpZCB5b3UgbWlzc3BlbGwgaXQgb3IgZm9yZ2V0IHRvIHBhc3MgaXQ/Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3ZpZGVyUHJvcFR5cGVzID0gd29ya0luUHJvZ3Jlc3MudHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAocHJvdmlkZXJQcm9wVHlwZXMpIHtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3ZpZGVyUHJvcFR5cGVzLCBuZXdQcm9wcywgJ3Byb3AnLCAnQ29udGV4dC5Qcm92aWRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgbmV3VmFsdWUpO1xuXG4gIHtcbiAgICBpZiAob2xkUHJvcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBvbGRWYWx1ZSA9IG9sZFByb3BzLnZhbHVlO1xuXG4gICAgICBpZiAob2JqZWN0SXMob2xkVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICAvLyBObyBjaGFuZ2UuIEJhaWxvdXQgZWFybHkgaWYgY2hpbGRyZW4gYXJlIHRoZSBzYW1lLlxuICAgICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIGNvbnRleHQgdmFsdWUgY2hhbmdlZC4gU2VhcmNoIGZvciBtYXRjaGluZyBjb25zdW1lcnMgYW5kIHNjaGVkdWxlXG4gICAgICAgIC8vIHRoZW0gdG8gdXBkYXRlLlxuICAgICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5ld0NoaWxkcmVuID0gbmV3UHJvcHMuY2hpbGRyZW47XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSBmYWxzZTtcblxuZnVuY3Rpb24gdXBkYXRlQ29udGV4dENvbnN1bWVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGU7IC8vIFRoZSBsb2dpYyBiZWxvdyBmb3IgQ29udGV4dCBkaWZmZXJzIGRlcGVuZGluZyBvbiBQUk9EIG9yIERFViBtb2RlLiBJblxuICAvLyBERVYgbW9kZSwgd2UgY3JlYXRlIGEgc2VwYXJhdGUgb2JqZWN0IGZvciBDb250ZXh0LkNvbnN1bWVyIHRoYXQgYWN0c1xuICAvLyBsaWtlIGEgcHJveHkgdG8gQ29udGV4dC4gVGhpcyBwcm94eSBvYmplY3QgYWRkcyB1bm5lY2Vzc2FyeSBjb2RlIGluIFBST0RcbiAgLy8gc28gd2UgdXNlIHRoZSBvbGQgYmVoYXZpb3VyIChDb250ZXh0LkNvbnN1bWVyIHJlZmVyZW5jZXMgQ29udGV4dCkgdG9cbiAgLy8gcmVkdWNlIHNpemUgYW5kIG92ZXJoZWFkLiBUaGUgc2VwYXJhdGUgb2JqZWN0IHJlZmVyZW5jZXMgY29udGV4dCB2aWFcbiAgLy8gYSBwcm9wZXJ0eSBjYWxsZWQgXCJfY29udGV4dFwiLCB3aGljaCBhbHNvIGdpdmVzIHVzIHRoZSBhYmlsaXR5IHRvIGNoZWNrXG4gIC8vIGluIERFViBtb2RlIGlmIHRoaXMgcHJvcGVydHkgZXhpc3RzIG9yIG5vdCBhbmQgd2FybiBpZiBpdCBkb2VzIG5vdC5cblxuICB7XG4gICAgaWYgKGNvbnRleHQuX2NvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVGhpcyBtYXkgYmUgYmVjYXVzZSBpdCdzIGEgQ29udGV4dCAocmF0aGVyIHRoYW4gYSBDb25zdW1lcikuXG4gICAgICAvLyBPciBpdCBtYXkgYmUgYmVjYXVzZSBpdCdzIG9sZGVyIFJlYWN0IHdoZXJlIHRoZXkncmUgdGhlIHNhbWUgdGhpbmcuXG4gICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gd2FybiBpZiB3ZSdyZSBzdXJlIGl0J3MgYSBuZXcgUmVhY3QuXG4gICAgICBpZiAoY29udGV4dCAhPT0gY29udGV4dC5Db25zdW1lcikge1xuICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lcikge1xuICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb250ZXh0QXNDb25zdW1lciA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0PiBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0Ll9jb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHJlbmRlciA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ0EgY29udGV4dCBjb25zdW1lciB3YXMgcmVuZGVyZWQgd2l0aCBtdWx0aXBsZSBjaGlsZHJlbiwgb3IgYSBjaGlsZCAnICsgXCJ0aGF0IGlzbid0IGEgZnVuY3Rpb24uIEEgY29udGV4dCBjb25zdW1lciBleHBlY3RzIGEgc2luZ2xlIGNoaWxkIFwiICsgJ3RoYXQgaXMgYSBmdW5jdGlvbi4gSWYgeW91IGRpZCBwYXNzIGEgZnVuY3Rpb24sIG1ha2Ugc3VyZSB0aGVyZSAnICsgJ2lzIG5vIHRyYWlsaW5nIG9yIGxlYWRpbmcgd2hpdGVzcGFjZSBhcm91bmQgaXQuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5ld1ZhbHVlID0gcmVhZENvbnRleHQoY29udGV4dCk7XG5cbiAge1xuICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdGFydGVkKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrQ29tcG9uZW50UmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFJlYWN0IERldlRvb2xzIHJlYWRzIHRoaXMgZmxhZy5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBlcmZvcm1lZFdvcms7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXdDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCkge1xuICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAvLyBSZXVzZSBwcmV2aW91cyBkZXBlbmRlbmNpZXNcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcztcbiAgfVxuXG4gIHtcbiAgICAvLyBEb24ndCB1cGRhdGUgXCJiYXNlXCIgcmVuZGVyIHRpbWVzIGZvciBiYWlsb3V0cy5cbiAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZygpO1xuICB9XG5cbiAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcyk7IC8vIENoZWNrIGlmIHRoZSBjaGlsZHJlbiBoYXZlIGFueSBwZW5kaW5nIHdvcmsuXG5cbiAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSkge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBkb24ndCBoYXZlIGFueSB3b3JrIGVpdGhlci4gV2UgY2FuIHNraXAgdGhlbS5cbiAgICAvLyBUT0RPOiBPbmNlIHdlIGFkZCBiYWNrIHJlc3VtaW5nLCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNoaWxkcmVuIGFyZVxuICAgIC8vIGEgd29yay1pbi1wcm9ncmVzcyBzZXQuIElmIHNvLCB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZWlyIGVmZmVjdHMuXG4gICAge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgLy8gZmliZXJzIGFuZCBjb250aW51ZS5cblxuXG4gIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHJlbW91bnRGaWJlcihjdXJyZW50LCBvbGRXb3JrSW5Qcm9ncmVzcywgbmV3V29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciByZXR1cm5GaWJlciA9IG9sZFdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIGlmIChyZXR1cm5GaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9wcm9kLWVycm9yLWNvZGVzXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIHRoZSBwcmV2aW91cyBzaWJsaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHByZXZTaWJsaW5nLnNpYmxpbmcgPSBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgICB9IC8vIERlbGV0ZSB0aGUgb2xkIGZpYmVyIGFuZCBwbGFjZSB0aGUgbmV3IG9uZS5cbiAgICAvLyBTaW5jZSB0aGUgb2xkIGZpYmVyIGlzIGRpc2Nvbm5lY3RlZCwgd2UgaGF2ZSB0byBzY2hlZHVsZSBpdCBtYW51YWxseS5cblxuXG4gICAgdmFyIGRlbGV0aW9ucyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcblxuICAgIGlmIChkZWxldGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjdXJyZW50XTtcbiAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IENoaWxkRGVsZXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0aW9ucy5wdXNoKGN1cnJlbnQpO1xuICAgIH1cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDsgLy8gUmVzdGFydCB3b3JrIGZyb20gdGhlIG5ldyBmaWJlci5cblxuICAgIHJldHVybiBuZXdXb3JrSW5Qcm9ncmVzcztcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAvLyBCZWZvcmUgcGVyZm9ybWluZyBhbiBlYXJseSBiYWlsb3V0LCB3ZSBtdXN0IGNoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nXG4gIC8vIHVwZGF0ZXMgb3IgY29udGV4dC5cbiAgdmFyIHVwZGF0ZUxhbmVzID0gY3VycmVudC5sYW5lcztcblxuICBpZiAoaW5jbHVkZXNTb21lTGFuZSh1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm8gcGVuZGluZyB1cGRhdGUsIGJ1dCBiZWNhdXNlIGNvbnRleHQgaXMgcHJvcGFnYXRlZCBsYXppbHksIHdlIG5lZWRcblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIGZpYmVyIGRvZXMgbm90IGhhdmUgYW55IHBlbmRpbmcgd29yay4gQmFpbG91dCB3aXRob3V0IGVudGVyaW5nXG4gIC8vIHRoZSBiZWdpbiBwaGFzZS4gVGhlcmUncyBzdGlsbCBzb21lIGJvb2trZWVwaW5nIHdlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZVxuICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAgcHVzaEhvc3RSb290Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICB2YXIgcm9vdCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgIHtcbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy52YWx1ZTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlLl9jb250ZXh0O1xuICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIG5ld1ZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFByb2ZpbGVyOlxuICAgICAge1xuICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgdmFyIGhhc0NoaWxkV29yayA9IGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gUmVzZXQgZWZmZWN0IGR1cmF0aW9ucyBmb3IgdGhlIG5leHQgZXZlbnR1YWwgZWZmZWN0IHBoYXNlLlxuICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG4gICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFdlIGtub3cgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHN1c3BlbmQgYWdhaW4gYmVjYXVzZSBpZiBpdCBoYXNcbiAgICAgICAgICAgIC8vIGJlZW4gdW5zdXNwZW5kZWQgaXQgaGFzIGNvbW1pdHRlZCBhcyBhIHJlc29sdmVkIFN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICAgICAgICAgIC8vIElmIGl0IG5lZWRzIHRvIGJlIHJldHJpZWQsIGl0IHNob3VsZCBoYXZlIHdvcmsgc2NoZWR1bGVkIG9uIGl0LlxuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlOyAvLyBXZSBzaG91bGQgbmV2ZXIgcmVuZGVyIHRoZSBjaGlsZHJlbiBvZiBhIGRlaHlkcmF0ZWQgYm91bmRhcnkgdW50aWwgd2VcbiAgICAgICAgICAgIC8vIHVwZ3JhZGUgaXQuIFdlIHJldHVybiBudWxsIGluc3RlYWQgb2YgYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yay5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSAvLyBJZiB0aGlzIGJvdW5kYXJ5IGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHdlIG5lZWQgdG8gZGVjaWRlXG4gICAgICAgICAgLy8gd2hldGhlciB0byByZXRyeSB0aGUgcHJpbWFyeSBjaGlsZHJlbiwgb3IgdG8gc2tpcCBvdmVyIGl0IGFuZFxuICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgLy8gY2hpbGQgZnJhZ21lbnQuXG5cblxuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICBpZiAoaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgcHJpbWFyeUNoaWxkTGFuZXMpKSB7XG4gICAgICAgICAgICAvLyBUaGUgcHJpbWFyeSBjaGlsZHJlbiBoYXZlIHBlbmRpbmcgd29yay4gVXNlIHRoZSBub3JtYWwgcGF0aFxuICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAvLyBvbiBpdFxuICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7IC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGRvIG5vdCBoYXZlIHBlbmRpbmcgd29yayB3aXRoIHN1ZmZpY2llbnRcbiAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbiBhbmQgd29yayBvbiB0aGUgZmFsbGJhY2suXG4gICAgICAgICAgICAgIHJldHVybiBjaGlsZC5zaWJsaW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gTm90ZTogV2UgY2FuIHJldHVybiBgbnVsbGAgaGVyZSBiZWNhdXNlIHdlIGFscmVhZHkgY2hlY2tlZFxuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZXJlIHdlcmUgbmVzdGVkIGNvbnRleHQgY29uc3VtZXJzLCB2aWEgdGhlIGNhbGwgdG9cbiAgICAgICAgICAgICAgLy8gYGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmtgIGFib3ZlLlxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgdmFyIF9oYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICBpZiAoZGlkU3VzcGVuZEJlZm9yZSkge1xuICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2FzIGluIGZhbGxiYWNrIHN0YXRlIGxhc3QgdGltZSwgYW5kIHdlIGhhdmUgYWxsIHRoZVxuICAgICAgICAgICAgLy8gc2FtZSBjaGlsZHJlbiB0aGVuIHdlJ3JlIHN0aWxsIGluIHByb2dyZXNzaXZlIGxvYWRpbmcgc3RhdGUuXG4gICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAvLyB0cmVlIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSB0YWlsLiBTbyB3ZSBuZWVkIHRvIHVzZSB0aGUgbm9ybWFsXG4gICAgICAgICAgICAvLyBwYXRoIHRvIGNvbXB1dGUgdGhlIGNvcnJlY3QgdGFpbC5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9IC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAvLyB0aGVtIGdvdCByZXRyaWVkIHNvIHRoZXknbGwgc3RpbGwgYmUgYmxvY2tlZCBpbiB0aGUgc2FtZSB3YXlcbiAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICB9IC8vIElmIG5vdGhpbmcgc3VzcGVuZGVkIGJlZm9yZSBhbmQgd2UncmUgcmVuZGVyaW5nIHRoZSBzYW1lIGNoaWxkcmVuLFxuICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgLy8gaW4gdGhlIFwidG9nZXRoZXJcIiBtb2RlLCBzbyB3ZSBjYW4gY29udGludWUgZnJvbSB0aGUgc3RhdGUgd2UgaGFkLlxuXG5cbiAgICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBSZXNldCB0byB0aGUgXCJ0b2dldGhlclwiIG1vZGUgaW4gY2FzZSB3ZSd2ZSBzdGFydGVkIGEgZGlmZmVyZW50XG4gICAgICAgICAgLy8gdXBkYXRlIGluIHRoZSBwYXN0IGJ1dCBkaWRuJ3QgY29tcGxldGUgaXQuXG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS50YWlsID0gbnVsbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG5cbiAgICAgICAgaWYgKF9oYXNDaGlsZFdvcmspIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgLy8gYXMgYmVmb3JlLiBXZSBjYW4gZmFzdCBiYWlsIG91dC5cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgdGhlIHRyZWUgc3RpbGwgbmVlZHMgdG8gYmUgZGVmZXJyZWQuIFRoaXMgaXNcbiAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAvLyBzbyB3ZSdsbCBqdXN0IGVudGVyIHRoYXQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgd2UnbGwgYmFpbCBvdXRcbiAgICAgICAgLy8gYXQgdGhlIG5leHQgbGV2ZWwgaW5zdGVhZCBvZiB0aGlzIG9uZSwgYmVjYXVzZSB0aGUgY2hpbGQgcHJvcHNcbiAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIHJlZmFjdG9yIGBiZWdpbldvcmtgIHRvIHNwbGl0IHRoZSBiYWlsb3V0XG4gICAgICAgIC8vIHBhdGggZnJvbSB0aGUgbm9ybWFsIHBhdGguIEknbSB0ZW1wdGVkIHRvIGRvIGEgbGFiZWxlZCBicmVhayBoZXJlXG4gICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gTm9MYW5lcztcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gYmVnaW5Xb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB7XG4gICAgaWYgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCAmJiBjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHdpbGwgcmVzdGFydCB0aGUgYmVnaW4gcGhhc2Ugd2l0aCBhIG5ldyBmaWJlci5cbiAgICAgIHJldHVybiByZW1vdW50RmliZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcy5rZXksIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgfHwgbnVsbCwgd29ya0luUHJvZ3Jlc3MubW9kZSwgd29ya0luUHJvZ3Jlc3MubGFuZXMpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICBpZiAob2xkUHJvcHMgIT09IG5ld1Byb3BzIHx8IGhhc0NvbnRleHRDaGFuZ2VkKCkgfHwgKCAvLyBGb3JjZSBhIHJlLXJlbmRlciBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZDpcbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIC8vIElmIHByb3BzIG9yIGNvbnRleHQgY2hhbmdlZCwgbWFyayB0aGUgZmliZXIgYXMgaGF2aW5nIHBlcmZvcm1lZCB3b3JrLlxuICAgICAgLy8gVGhpcyBtYXkgYmUgdW5zZXQgaWYgdGhlIHByb3BzIGFyZSBkZXRlcm1pbmVkIHRvIGJlIGVxdWFsIGxhdGVyIChtZW1vKS5cbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIHByb3BzIG5vciBsZWdhY3kgY29udGV4dCBjaGFuZ2VzLiBDaGVjayBpZiB0aGVyZSdzIGEgcGVuZGluZ1xuICAgICAgLy8gdXBkYXRlIG9yIGNvbnRleHQgY2hhbmdlLlxuICAgICAgdmFyIGhhc1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dCA9IGNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKCFoYXNTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQgJiYgLy8gSWYgdGhpcyBpcyB0aGUgc2Vjb25kIHBhc3Mgb2YgYW4gZXJyb3Igb3Igc3VzcGVuc2UgYm91bmRhcnksIHRoZXJlXG4gICAgICAvLyBtYXkgbm90IGJlIHdvcmsgc2NoZWR1bGVkIG9uIGBjdXJyZW50YCwgc28gd2UgY2hlY2sgZm9yIHRoaXMgZmxhZy5cbiAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIE5vIHBlbmRpbmcgdXBkYXRlcyBvciBjb250ZXh0LiBCYWlsIG91dCBub3cuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoY3VycmVudC5mbGFncyAmIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IG1vZGUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8xOTIxNi5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbiB0aGlzIGZpYmVyLCBidXQgdGhlcmUgYXJlIG5vIG5ldyBwcm9wc1xuICAgICAgICAvLyBub3IgbGVnYWN5IGNvbnRleHQuIFNldCB0aGlzIHRvIGZhbHNlLiBJZiBhbiB1cGRhdGUgcXVldWUgb3IgY29udGV4dFxuICAgICAgICAvLyBjb25zdW1lciBwcm9kdWNlcyBhIGNoYW5nZWQgdmFsdWUsIGl0IHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlLFxuICAgICAgICAvLyB0aGUgY29tcG9uZW50IHdpbGwgYXNzdW1lIHRoZSBjaGlsZHJlbiBoYXZlIG5vdCBjaGFuZ2VkIGFuZCBiYWlsIG91dC5cbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaWRSZWNlaXZlVXBkYXRlID0gZmFsc2U7XG5cbiAgICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSAmJiBpc0ZvcmtlZENoaWxkKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjaGlsZCBiZWxvbmdzIHRvIGEgbGlzdCBvZiBtdWxpcGxlIGNoaWxkcmVuIGluXG4gICAgICAvLyBpdHMgcGFyZW50LlxuICAgICAgLy9cbiAgICAgIC8vIEluIGEgdHJ1ZSBtdWx0aS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbiwgd2Ugd291bGQgcmVuZGVyIGNoaWxkcmVuIG9uXG4gICAgICAvLyBwYXJhbGxlbCB0aHJlYWRzLiBUaGlzIHdvdWxkIHJlcHJlc2VudCB0aGUgYmVnaW5uaW5nIG9mIGEgbmV3IHJlbmRlclxuICAgICAgLy8gdGhyZWFkIGZvciB0aGlzIHN1YnRyZWUuXG4gICAgICAvL1xuICAgICAgLy8gV2Ugb25seSB1c2UgdGhpcyBmb3IgaWQgZ2VuZXJhdGlvbiBkdXJpbmcgaHlkcmF0aW9uLCB3aGljaCBpcyB3aHkgdGhlXG4gICAgICAvLyBsb2dpYyBpcyBsb2NhdGVkIGluIHRoaXMgc3BlY2lhbCBicmFuY2guXG4gICAgICB2YXIgc2xvdEluZGV4ID0gd29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgICB2YXIgbnVtYmVyT2ZGb3JrcyA9IGdldEZvcmtzQXRMZXZlbCgpO1xuICAgICAgcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgbnVtYmVyT2ZGb3Jrcywgc2xvdEluZGV4KTtcbiAgICB9XG4gIH0gLy8gQmVmb3JlIGVudGVyaW5nIHRoZSBiZWdpbiBwaGFzZSwgY2xlYXIgcGVuZGluZyB1cGRhdGUgcHJpb3JpdHkuXG4gIC8vIFRPRE86IFRoaXMgYXNzdW1lcyB0aGF0IHdlJ3JlIGFib3V0IHRvIGV2YWx1YXRlIHRoZSBjb21wb25lbnQgYW5kIHByb2Nlc3NcbiAgLy8gdGhlIHVwZGF0ZSBxdWV1ZS4gSG93ZXZlciwgdGhlcmUncyBhbiBleGNlcHRpb246IFNpbXBsZU1lbW9Db21wb25lbnRcbiAgLy8gc29tZXRpbWVzIGJhaWxzIG91dCBsYXRlciBpbiB0aGUgYmVnaW4gcGhhc2UuIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkXG4gIC8vIG1vdmUgdGhpcyBhc3NpZ25tZW50IG91dCBvZiB0aGUgY29tbW9uIHBhdGggYW5kIGludG8gZWFjaCBicmFuY2guXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG5cbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIEluZGV0ZXJtaW5hdGVDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUeXBlID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGU7XG4gICAgICAgIHJldHVybiBtb3VudExhenlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gQ29tcG9uZW50ID8gdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRQcm9wcyk7XG4gICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSBfQ29tcG9uZW50ID8gX3VucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCBfcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Um9vdChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0VGV4dCQxKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IF90eXBlMi5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShfdHlwZTIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMi50eXBlLCBfcmVzb2x2ZWRQcm9wczMpO1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgX3R5cGUyLCBfcmVzb2x2ZWRQcm9wczMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnR5cGUsIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQyID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQyLCBfdW5yZXNvbHZlZFByb3BzNCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICsgd29ya0luUHJvZ3Jlc3MudGFnICsgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gXCIgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiB1bndpbmRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIENvbXBvbmVudCA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG5cbiAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmbGFncyA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFNob3VsZENhcHR1cmUpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGZsYWdzICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlO1xuXG4gICAgICAgICAgaWYgKCAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgICB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIHZhciBfZmxhZ3MgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcblxuICAgICAgICBpZiAoKF9mbGFncyAmIFNob3VsZENhcHR1cmUpICE9PSBOb0ZsYWdzICYmIChfZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAgIC8vIFRoZXJlIHdhcyBhbiBlcnJvciBkdXJpbmcgcmVuZGVyIHRoYXQgd2Fzbid0IGNhcHR1cmVkIGJ5IGEgc3VzcGVuc2VcbiAgICAgICAgICAvLyBib3VuZGFyeS4gRG8gYSBzZWNvbmQgcGFzcyBvbiB0aGUgcm9vdCB0byB1bm1vdW50IHRoZSBjaGlsZHJlbi5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIH0gLy8gV2UgdW53b3VuZCB0byB0aGUgcm9vdCB3aXRob3V0IGNvbXBsZXRpbmcgaXQuIEV4aXQuXG5cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogcG9wSHlkcmF0aW9uU3RhdGVcbiAgICAgICAgcG9wSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBzdXNwZW5zZVN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RocmV3IGluIG5ld2x5IG1vdW50ZWQgZGVoeWRyYXRlZCBjb21wb25lbnQuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluICcgKyAnUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZmxhZ3MyID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKF9mbGFnczIgJiBTaG91bGRDYXB0dXJlKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSBfZmxhZ3MyICYgflNob3VsZENhcHR1cmUgfCBEaWRDYXB0dXJlOyAvLyBDYXB0dXJlZCBhIHN1c3BlbnNlIGVmZmVjdC4gUmUtcmVuZGVyIHRoZSBib3VuZGFyeS5cblxuICAgICAgICAgIGlmICggKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTsgLy8gU3VzcGVuc2VMaXN0IGRvZXNuJ3QgYWN0dWFsbHkgY2F0Y2ggYW55dGhpbmcuIEl0IHNob3VsZCd2ZSBiZWVuXG4gICAgICAgIC8vIGNhdWdodCBieSBhIG5lc3RlZCBib3VuZGFyeS4gSWYgbm90LCBpdCBzaG91bGQgYnViYmxlIHRocm91Z2guXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICB2YXIgY29udGV4dCA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQ7XG4gICAgICBwb3BQcm92aWRlcihjb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENhY2hlQ29tcG9uZW50OlxuXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrLCByZW5kZXJMYW5lcykge1xuICAvLyBOb3RlOiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBjaGVjayBpZiB3ZSdyZSBoeWRyYXRpbmcgYmVjYXVzZSBjb21wYXJpbmdcbiAgLy8gdG8gdGhlIGN1cnJlbnQgdHJlZSBwcm92aWRlciBmaWJlciBpcyBqdXN0IGFzIGZhc3QgYW5kIGxlc3MgZXJyb3ItcHJvbmUuXG4gIC8vIElkZWFsbHkgd2Ugd291bGQgaGF2ZSBhIHNwZWNpYWwgdmVyc2lvbiBvZiB0aGUgd29yayBsb29wIG9ubHlcbiAgLy8gZm9yIGh5ZHJhdGlvbi5cbiAgcG9wVHJlZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcblxuICBzd2l0Y2ggKGludGVycnVwdGVkV29yay50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5jaGlsZENvbnRleHRUeXBlcztcblxuICAgICAgICBpZiAoY2hpbGRDb250ZXh0VHlwZXMgIT09IG51bGwgJiYgY2hpbGRDb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBvcENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgdmFyIHJvb3QgPSBpbnRlcnJ1cHRlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICByZXNldFdvcmtJblByb2dyZXNzVmVyc2lvbnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgdmFyIGNvbnRleHQgPSBpbnRlcnJ1cHRlZFdvcmsudHlwZS5fY29udGV4dDtcbiAgICAgIHBvcFByb3ZpZGVyKGNvbnRleHQsIGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcG9wUmVuZGVyTGFuZXMoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG51bGw7XG5cbntcbiAgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBuZXcgU2V0KCk7XG59IC8vIFVzZWQgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBPZmZzY3JlZW4gY29tcG9uZW50IHN0YWNrLlxuLy8gQWxsb3dzIHVzIHRvIGF2b2lkIHRyYXZlcnNpbmcgdGhlIHJldHVybiBwYXRoIHRvIGZpbmQgdGhlIG5lYXJlc3QgT2Zmc2NyZWVuIGFuY2VzdG9yLlxuLy8gT25seSB1c2VkIHdoZW4gZW5hYmxlU3VzcGVuc2VMYXlvdXRFZmZlY3RTZW1hbnRpY3MgaXMgZW5hYmxlZC5cblxuXG52YXIgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gZmFsc2U7XG52YXIgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IGZhbHNlO1xudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcbnZhciBuZXh0RWZmZWN0ID0gbnVsbDsgLy8gVXNlZCBmb3IgUHJvZmlsaW5nIGJ1aWxkcyB0byB0cmFjayB1cGRhdGVycy5cblxudmFyIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG52YXIgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuZnVuY3Rpb24gcmVwb3J0VW5jYXVnaHRFcnJvckluREVWKGVycm9yKSB7XG4gIC8vIFdyYXBwaW5nIGVhY2ggc21hbGwgcGFydCBvZiB0aGUgY29tbWl0IHBoYXNlIGludG8gYSBndWFyZGVkXG4gIC8vIGNhbGxiYWNrIGlzIGEgYml0IHRvbyBzbG93IChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC8yMTY2NikuXG4gIC8vIEJ1dCB3ZSByZWx5IG9uIGl0IHRvIHN1cmZhY2UgZXJyb3JzIHRvIERFViB0b29scyBsaWtlIG92ZXJsYXlzXG4gIC8vIChodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIxNzEyKS5cbiAgLy8gQXMgYSBjb21wcm9taXNlLCByZXRocm93IG9ubHkgY2F1Z2h0IGVycm9ycyBpbiBhIGd1YXJkLlxuICB7XG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICAgIGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgfVxufVxuXG52YXIgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyID0gZnVuY3Rpb24gKGN1cnJlbnQsIGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICB9XG59OyAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCBtb3VudGluZy5cblxuXG5mdW5jdGlvbiBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQsIGN1cnJlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufSAvLyBDYXB0dXJlIGVycm9ycyBzbyB0aGV5IGRvbid0IGludGVycnVwdCB1bm1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkge1xuICB0cnkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lcihjdXJyZW50LCBpbnN0YW5jZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxDb21wb25lbnREaWRNb3VudChjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBpbnN0YW5jZSkge1xuICB0cnkge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IG1vdW50aW5nLlxuXG5cbmZ1bmN0aW9uIHNhZmVseUF0dGFjaFJlZihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSB7XG4gIHRyeSB7XG4gICAgY29tbWl0QXR0YWNoUmVmKGN1cnJlbnQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICB2YXIgcmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKHJlZiAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgcmV0VmFsO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlbmFibGVQcm9maWxlckNvbW1pdEhvb2tzICYmIGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgIHJldFZhbCA9IHJlZihudWxsKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldFZhbCA9IHJlZihudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgcmV0VmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gYSBjYWxsYmFjayByZWYgaW4gJXMuICcgKyAnQSBjYWxsYmFjayByZWYgc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbi4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseUNhbGxEZXN0cm95KGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpIHtcbiAgdHJ5IHtcbiAgICBkZXN0cm95KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICB9XG59XG5cbnZhciBmb2N1c2VkSW5zdGFuY2VIYW5kbGUgPSBudWxsO1xudmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGZhbHNlO1xuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpcnN0Q2hpbGQpIHtcbiAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gcHJlcGFyZUZvckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pO1xuICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2JlZ2luKCk7IC8vIFdlIG5vIGxvbmdlciBuZWVkIHRvIHRyYWNrIHRoZSBhY3RpdmUgaW5zdGFuY2UgZmliZXJcblxuICB2YXIgc2hvdWxkRmlyZSA9IHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1cjtcbiAgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG4gIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG4gIHJldHVybiBzaG91bGRGaXJlO1xufVxuXG5mdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfYmVnaW4oKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDsgLy8gVGhpcyBwaGFzZSBpcyBvbmx5IHVzZWQgZm9yIGJlZm9yZUFjdGl2ZUluc3RhbmNlQmx1ci5cblxuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChmaWJlci5zdWJ0cmVlRmxhZ3MgJiBCZWZvcmVNdXRhdGlvbk1hc2spICE9PSBOb0ZsYWdzICYmIGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBjaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBjaGlsZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZSgpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICB0cnkge1xuICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaWJlcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICB9XG5cbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmspIHtcbiAgdmFyIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG5cbiAgaWYgKChmbGFncyAmIFNuYXBzaG90KSAhPT0gTm9GbGFncykge1xuICAgIHNldEN1cnJlbnRGaWJlcihmaW5pc2hlZFdvcmspO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNuYXBzaG90ID0gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IHByZXZQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIHByZXZQcm9wcyksIHByZXZTdGF0ZSk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGRpZFdhcm5TZXQgPSBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3IoJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUgPSBzbmFwc2hvdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIHJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgY2xlYXJDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gZm9yIHRoZXNlIGNvbXBvbmVudCB0eXBlc1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgJyArICdsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KGZsYWdzLCBmaW5pc2hlZFdvcmssIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICB2YXIgbGFzdEVmZmVjdCA9IHVwZGF0ZVF1ZXVlICE9PSBudWxsID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG5cbiAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgdmFyIGVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAgaWYgKChlZmZlY3QudGFnICYgZmxhZ3MpID09PSBmbGFncykge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0VW5tb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgTGF5b3V0KSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGZpbmlzaGVkV29yaywgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgIHNldElzUnVubmluZ0luc2VydGlvbkVmZmVjdChmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50UGFzc2l2ZUVmZmVjdFVubW91bnRTdG9wcGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgICBtYXJrQ29tcG9uZW50TGF5b3V0RWZmZWN0VW5tb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChmbGFncywgZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAge1xuICAgICAgICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRQYXNzaXZlRWZmZWN0TW91bnRTdGFydGVkKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RNb3VudFN0YXJ0ZWQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gTW91bnRcblxuXG4gICAgICAgIHZhciBjcmVhdGUgPSBlZmZlY3QuY3JlYXRlO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoKGZsYWdzICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZWZmZWN0LmRlc3Ryb3kgPSBjcmVhdGUoKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIEluc2VydGlvbikgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKChmbGFncyAmIFBhc3NpdmUkMSkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudFBhc3NpdmVFZmZlY3RNb3VudFN0b3BwZWQoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmIExheW91dCkgIT09IE5vRmxhZ3MkMSkge1xuICAgICAgICAgICAgbWFya0NvbXBvbmVudExheW91dEVmZmVjdE1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgZGVzdHJveSA9IGVmZmVjdC5kZXN0cm95O1xuXG4gICAgICAgICAgaWYgKGRlc3Ryb3kgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZGVzdHJveSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGhvb2tOYW1lID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoKGVmZmVjdC50YWcgJiBMYXlvdXQpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgICAgIGhvb2tOYW1lID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChlZmZlY3QudGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgICAgICBob29rTmFtZSA9ICd1c2VJbnNlcnRpb25FZmZlY3QnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaG9va05hbWUgPSAndXNlRWZmZWN0JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGFkZGVuZHVtID0gdm9pZCAwO1xuXG4gICAgICAgICAgICBpZiAoZGVzdHJveSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkIG51bGwuIElmIHlvdXIgZWZmZWN0IGRvZXMgbm90IHJlcXVpcmUgY2xlYW4gJyArICd1cCwgcmV0dXJuIHVuZGVmaW5lZCAob3Igbm90aGluZykuJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlc3Ryb3kudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICdcXG5cXG5JdCBsb29rcyBsaWtlIHlvdSB3cm90ZSAnICsgaG9va05hbWUgKyAnKGFzeW5jICgpID0+IC4uLikgb3IgcmV0dXJuZWQgYSBQcm9taXNlLiAnICsgJ0luc3RlYWQsIHdyaXRlIHRoZSBhc3luYyBmdW5jdGlvbiBpbnNpZGUgeW91ciBlZmZlY3QgJyArICdhbmQgY2FsbCBpdCBpbW1lZGlhdGVseTpcXG5cXG4nICsgaG9va05hbWUgKyAnKCgpID0+IHtcXG4nICsgJyAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEYXRhKCkge1xcbicgKyAnICAgIC8vIFlvdSBjYW4gYXdhaXQgaGVyZVxcbicgKyAnICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgTXlBUEkuZ2V0RGF0YShzb21lSWQpO1xcbicgKyAnICAgIC8vIC4uLlxcbicgKyAnICB9XFxuJyArICcgIGZldGNoRGF0YSgpO1xcbicgKyBcIn0sIFtzb21lSWRdKTsgLy8gT3IgW10gaWYgZWZmZWN0IGRvZXNuJ3QgbmVlZCBwcm9wcyBvciBzdGF0ZVxcblxcblwiICsgJ0xlYXJuIG1vcmUgYWJvdXQgZGF0YSBmZXRjaGluZyB3aXRoIEhvb2tzOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaG9va3MtZGF0YS1mZXRjaGluZyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhZGRlbmR1bSA9ICcgWW91IHJldHVybmVkOiAnICsgZGVzdHJveTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXJyb3IoJyVzIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMnLCBob29rTmFtZSwgYWRkZW5kdW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBlZmZlY3QubmV4dDtcbiAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKSB7XG4gIHtcbiAgICAvLyBPbmx5IFByb2ZpbGVycyB3aXRoIHdvcmsgaW4gdGhlaXIgc3VidHJlZSB3aWxsIGhhdmUgYW4gVXBkYXRlIGVmZmVjdCBzY2hlZHVsZWQuXG4gICAgaWYgKChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgcGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgaWQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUuaWQsXG4gICAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLm9uUG9zdENvbW1pdDsgLy8gVGhpcyB2YWx1ZSB3aWxsIHN0aWxsIHJlZmxlY3QgdGhlIHByZXZpb3VzIGNvbW1pdCBwaGFzZS5cbiAgICAgICAgICAgIC8vIEl0IGRvZXMgbm90IGdldCByZXNldCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY29tbWl0IHBoYXNlLlxuXG4gICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBwaGFzZSA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgPT09IG51bGwgPyAnbW91bnQnIDogJ3VwZGF0ZSc7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblBvc3RDb21taXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgb25Qb3N0Q29tbWl0KGlkLCBwaGFzZSwgcGFzc2l2ZUVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgIH0gLy8gQnViYmxlIHRpbWVzIHRvIHRoZSBuZXh0IG5lYXJlc3QgYW5jZXN0b3IgUHJvZmlsZXIuXG4gICAgICAgICAgICAvLyBBZnRlciB3ZSBwcm9jZXNzIHRoYXQgUHJvZmlsZXIsIHdlJ2xsIGJ1YmJsZSBmdXJ0aGVyIHVwLlxuXG5cbiAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG5cbiAgICAgICAgICAgIG91dGVyOiB3aGlsZSAocGFyZW50RmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgICAgICAgdmFyIHJvb3QgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICByb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcblxuICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgICAgICAgICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgcGFyZW50U3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwYXNzaXZlRWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdE9uRmliZXIoZmluaXNoZWRSb290LCBjdXJyZW50LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIGlmICgoZmluaXNoZWRXb3JrLmZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoICFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGxheW91dCBlZmZlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCAoZHVyaW5nIG11dGF0aW9uIHBoYXNlKS5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHNpYmxpbmcgY29tcG9uZW50IGVmZmVjdHMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIsXG4gICAgICAgICAgICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IHNob3VsZCBuZXZlciBvdmVycmlkZSBhIHJlZiBzZXRcbiAgICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkTW91bnQuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHN0YXRlIHRvIG1hdGNoIG1lbW9pemVkIHN0YXRlIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZE1vdW50LiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJldlByb3BzID0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgJ2luc3RhbmNlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0TGF5b3V0RWZmZWN0VGltZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFRPRE86IEkgdGhpbmsgdGhpcyBpcyBub3cgYWx3YXlzIG5vbi1udWxsIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cblxuXG4gICAgICAgICAgdmFyIHVwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAncHJvY2Vzc2luZyB0aGUgdXBkYXRlIHF1ZXVlLiAnICsgJ1RoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgJyArICdhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuICcgKyAnUGxlYXNlIGZpbGUgYW4gaXNzdWUuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBXZSBjb3VsZCB1cGRhdGUgaW5zdGFuY2UgcHJvcHMgYW5kIHN0YXRlIGhlcmUsXG4gICAgICAgICAgICAvLyBidXQgaW5zdGVhZCB3ZSByZWx5IG9uIHRoZW0gYmVpbmcgc2V0IGR1cmluZyBsYXN0IHJlbmRlci5cbiAgICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuXG4gICAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIHVwZGF0ZVF1ZXVlLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IEkgdGhpbmsgdGhpcyBpcyBub3cgYWx3YXlzIG5vbi1udWxsIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgdGhlXG4gICAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cbiAgICAgICAgICB2YXIgX3VwZGF0ZVF1ZXVlID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgaWYgKF91cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsuY2hpbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZ2V0UHVibGljSW5zdGFuY2UoZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBfdXBkYXRlUXVldWUsIF9pbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBSZW5kZXJlcnMgbWF5IHNjaGVkdWxlIHdvcmsgdG8gYmUgZG9uZSBhZnRlciBob3N0IGNvbXBvbmVudHMgYXJlIG1vdW50ZWRcbiAgICAgICAgICAvLyAoZWcgRE9NIHJlbmRlcmVyIG1heSBzY2hlZHVsZSBhdXRvLWZvY3VzIGZvciBpbnB1dHMgYW5kIGZvcm0gY29udHJvbHMpLlxuICAgICAgICAgIC8vIFRoZXNlIGVmZmVjdHMgc2hvdWxkIG9ubHkgYmUgY29tbWl0dGVkIHdoZW4gY29tcG9uZW50cyBhcmUgZmlyc3QgbW91bnRlZCxcbiAgICAgICAgICAvLyBha2Egd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50L2FsdGVybmF0ZS5cblxuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBudWxsICYmIGZpbmlzaGVkV29yay5mbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTtcbiAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgY29tbWl0TW91bnQoX2luc3RhbmNlMiwgdHlwZSwgcHJvcHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXZSBoYXZlIG5vIGxpZmUtY3ljbGVzIGFzc29jaWF0ZWQgd2l0aCB0ZXh0LlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHBvcnRhbHMuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgb25Db21taXQgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uQ29tbWl0LFxuICAgICAgICAgICAgICAgIG9uUmVuZGVyID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vblJlbmRlcjtcbiAgICAgICAgICAgIHZhciBlZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgICB2YXIgY29tbWl0VGltZSA9IGdldENvbW1pdFRpbWUoKTtcbiAgICAgICAgICAgIHZhciBwaGFzZSA9IGN1cnJlbnQgPT09IG51bGwgPyAnbW91bnQnIDogJ3VwZGF0ZSc7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGlzQ3VycmVudFVwZGF0ZU5lc3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgcGhhc2UgPSAnbmVzdGVkLXVwZGF0ZSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvblJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBvblJlbmRlcihmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGZpbmlzaGVkV29yay5hY3R1YWxEdXJhdGlvbiwgZmluaXNoZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24sIGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUsIGNvbW1pdFRpbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2Ygb25Db21taXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBvbkNvbW1pdChmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcy5pZCwgcGhhc2UsIGVmZmVjdER1cmF0aW9uLCBjb21taXRUaW1lKTtcbiAgICAgICAgICAgICAgfSAvLyBTY2hlZHVsZSBhIHBhc3NpdmUgZWZmZWN0IGZvciB0aGlzIFByb2ZpbGVyIHRvIGNhbGwgb25Qb3N0Q29tbWl0IGhvb2tzLlxuICAgICAgICAgICAgICAvLyBUaGlzIGVmZmVjdCBzaG91bGQgYmUgc2NoZWR1bGVkIGV2ZW4gaWYgdGhlcmUgaXMgbm8gb25Qb3N0Q29tbWl0IGNhbGxiYWNrIGZvciB0aGlzIFByb2ZpbGVyLFxuICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBlZmZlY3QgaXMgYWxzbyB3aGVyZSB0aW1lcyBidWJibGUgdG8gcGFyZW50IFByb2ZpbGVycy5cblxuXG4gICAgICAgICAgICAgIGVucXVldWVQZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0KGZpbmlzaGVkV29yayk7IC8vIFByb3BhZ2F0ZSBsYXlvdXQgZWZmZWN0IGR1cmF0aW9ucyB0byB0aGUgbmV4dCBuZWFyZXN0IFByb2ZpbGVyIGFuY2VzdG9yLlxuICAgICAgICAgICAgICAvLyBEbyBub3QgcmVzZXQgdGhlc2UgdmFsdWVzIHVudGlsIHRoZSBuZXh0IHJlbmRlciBzbyBEZXZUb29scyBoYXMgYSBjaGFuY2UgdG8gcmVhZCB0aGVtIGZpcnN0LlxuXG4gICAgICAgICAgICAgIHZhciBwYXJlbnRGaWJlciA9IGZpbmlzaGVkV29yay5yZXR1cm47XG5cbiAgICAgICAgICAgICAgb3V0ZXI6IHdoaWxlIChwYXJlbnRGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICAgICAgcm9vdC5lZmZlY3REdXJhdGlvbiArPSBlZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiArPSBlZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5yZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgJyArICdsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoICFvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuKSB7XG4gICAge1xuICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFJlZikge1xuICAgICAgICBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzT25GaWJlcihub2RlKSB7XG4gIC8vIFR1cm4gb24gbGF5b3V0IGVmZmVjdHMgaW4gYSB0cmVlIHRoYXQgcHJldmlvdXNseSBkaXNhcHBlYXJlZC5cbiAgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiBMYXlvdXRTdGF0aWNcbiAgc3dpdGNoIChub2RlLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBub2RlLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzdGFydExheW91dEVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKG5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tbWl0SG9va0xheW91dEVmZmVjdExpc3RNb3VudChub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50RGlkTW91bnQobm9kZSwgbm9kZS5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNhZmVseUF0dGFjaFJlZihub2RlLCBub2RlLnJldHVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlBdHRhY2hSZWYobm9kZSwgbm9kZS5yZXR1cm4pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihmaW5pc2hlZFdvcmssIGlzSGlkZGVuKSB7XG4gIC8vIE9ubHkgaGlkZSBvciB1bmhpZGUgdGhlIHRvcC1tb3N0IGhvc3Qgbm9kZXMuXG4gIHZhciBob3N0U3VidHJlZVJvb3QgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gZmluaXNoZWRXb3JrO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7XG4gICAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbm9kZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICAgIGhpZGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB1bmhpZGVJbnN0YW5jZShub2RlLnN0YXRlTm9kZSwgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBpZiAoaG9zdFN1YnRyZWVSb290ID09PSBudWxsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2UzID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgICBoaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdW5oaWRlVGV4dEluc3RhbmNlKF9pbnN0YW5jZTMsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgobm9kZS50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gTGVnYWN5SGlkZGVuQ29tcG9uZW50KSAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgbm9kZSAhPT0gZmluaXNoZWRXb3JrKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhvc3RTdWJ0cmVlUm9vdCA9PT0gbm9kZSkge1xuICAgICAgICAgIGhvc3RTdWJ0cmVlUm9vdCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChob3N0U3VidHJlZVJvb3QgPT09IG5vZGUpIHtcbiAgICAgICAgaG9zdFN1YnRyZWVSb290ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QXR0YWNoUmVmKGZpbmlzaGVkV29yaykge1xuICB2YXIgcmVmID0gZmluaXNoZWRXb3JrLnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICB2YXIgaW5zdGFuY2VUb1VzZTtcblxuICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gZ2V0UHVibGljSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5zdGFuY2VUb1VzZSA9IGluc3RhbmNlO1xuICAgIH0gLy8gTW92ZWQgb3V0c2lkZSB0byBlbnN1cmUgRENFIHdvcmtzIHdpdGggdGhpcyBmbGFnXG5cbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHJldFZhbDtcblxuICAgICAgaWYgKCBmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgIHJldFZhbCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZWNvcmRMYXlvdXRFZmZlY3REdXJhdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRWYWwgPSByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXRWYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBhIGNhbGxiYWNrIHJlZiBpbiAlcy4gJyArICdBIGNhbGxiYWNrIHJlZiBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uLicsIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoIXJlZi5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpKSB7XG4gICAgICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcmVmIG9iamVjdCBwcm92aWRlZCBmb3IgJXMuICcgKyAnVXNlIGVpdGhlciBhIHJlZi1zZXR0ZXIgZnVuY3Rpb24gb3IgUmVhY3QuY3JlYXRlUmVmKCkuJywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRldGFjaEZpYmVyTXV0YXRpb24oZmliZXIpIHtcbiAgLy8gQ3V0IG9mZiB0aGUgcmV0dXJuIHBvaW50ZXIgdG8gZGlzY29ubmVjdCBpdCBmcm9tIHRoZSB0cmVlLlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gZGV0ZWN0IGFuZCB3YXJuIGFnYWluc3Qgc3RhdGUgdXBkYXRlcyBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlxuICAvLyBJdCBhbHNvIHByZXZlbnRzIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIGZyb20gd2l0aGluIGRpc2Nvbm5lY3RlZCBjb21wb25lbnRzLlxuICAvL1xuICAvLyBJZGVhbGx5LCB3ZSBzaG91bGQgYWxzbyBjbGVhciB0aGUgY2hpbGQgcG9pbnRlciBvZiB0aGUgcGFyZW50IGFsdGVybmF0ZSB0byBsZXQgdGhpc1xuICAvLyBnZXQgR0M6ZWQgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggZm9yIHN1cmUgd2hpY2ggcGFyZW50IGlzIHRoZSBjdXJyZW50XG4gIC8vIG9uZSBzbyB3ZSdsbCBzZXR0bGUgZm9yIEdDOmluZyB0aGUgc3VidHJlZSBvZiB0aGlzIGNoaWxkLlxuICAvLyBUaGlzIGNoaWxkIGl0c2VsZiB3aWxsIGJlIEdDOmVkIHdoZW4gdGhlIHBhcmVudCB1cGRhdGVzIHRoZSBuZXh0IHRpbWUuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjbGVhciBjaGlsZCBvciBzaWJsaW5nIHBvaW50ZXJzIHlldC5cbiAgLy8gVGhleSdyZSBuZWVkZWQgZm9yIHBhc3NpdmUgZWZmZWN0cyBhbmQgZm9yIGZpbmRET01Ob2RlLlxuICAvLyBXZSBkZWZlciB0aG9zZSBmaWVsZHMsIGFuZCBhbGwgb3RoZXIgY2xlYW51cCwgdG8gdGhlIHBhc3NpdmUgcGhhc2UgKHNlZSBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cykuXG4gIC8vXG4gIC8vIERvbid0IHJlc2V0IHRoZSBhbHRlcm5hdGUgeWV0LCBlaXRoZXIuIFdlIG5lZWQgdGhhdCBzbyB3ZSBjYW4gZGV0YWNoIHRoZVxuICAvLyBhbHRlcm5hdGUncyBmaWVsZHMgaW4gdGhlIHBhc3NpdmUgcGhhc2UuIENsZWFyaW5nIHRoZSByZXR1cm4gcG9pbnRlciBpc1xuICAvLyBzdWZmaWNpZW50IGZvciBmaW5kRE9NTm9kZSBzZW1hbnRpY3MuXG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5yZXR1cm4gPSBudWxsO1xuICB9XG5cbiAgZmliZXIucmV0dXJuID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgZmliZXIuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhhbHRlcm5hdGUpO1xuICB9IC8vIE5vdGU6IERlZmVuc2l2ZWx5IHVzaW5nIG5lZ2F0aW9uIGluc3RlYWQgb2YgPCBpbiBjYXNlXG4gIC8vIGBkZWxldGVkVHJlZUNsZWFuVXBMZXZlbGAgaXMgdW5kZWZpbmVkLlxuXG5cbiAge1xuICAgIC8vIENsZWFyIGN5Y2xpY2FsIEZpYmVyIGZpZWxkcy4gVGhpcyBsZXZlbCBhbG9uZSBpcyBkZXNpZ25lZCB0byByb3VnaGx5XG4gICAgLy8gYXBwcm94aW1hdGUgdGhlIHBsYW5uZWQgRmliZXIgcmVmYWN0b3IuIEluIHRoYXQgd29ybGQsIGBzZXRTdGF0ZWAgd2lsbCBiZVxuICAgIC8vIGJvdW5kIHRvIGEgc3BlY2lhbCBcImluc3RhbmNlXCIgb2JqZWN0IGluc3RlYWQgb2YgYSBGaWJlci4gVGhlIEluc3RhbmNlXG4gICAgLy8gb2JqZWN0IHdpbGwgbm90IGhhdmUgYW55IG9mIHRoZXNlIGZpZWxkcy4gSXQgd2lsbCBvbmx5IGJlIGNvbm5lY3RlZCB0b1xuICAgIC8vIHRoZSBmaWJlciB0cmVlIHZpYSBhIHNpbmdsZSBsaW5rIGF0IHRoZSByb290LiBTbyBpZiB0aGlzIGxldmVsIGFsb25lIGlzXG4gICAgLy8gc3VmZmljaWVudCB0byBmaXggbWVtb3J5IGlzc3VlcywgdGhhdCBib2RlcyB3ZWxsIGZvciBvdXIgcGxhbnMuXG4gICAgZmliZXIuY2hpbGQgPSBudWxsO1xuICAgIGZpYmVyLmRlbGV0aW9ucyA9IG51bGw7XG4gICAgZmliZXIuc2libGluZyA9IG51bGw7IC8vIFRoZSBgc3RhdGVOb2RlYCBpcyBjeWNsaWNhbCBiZWNhdXNlIG9uIGhvc3Qgbm9kZXMgaXQgcG9pbnRzIHRvIHRoZSBob3N0XG4gICAgLy8gdHJlZSwgd2hpY2ggaGFzIGl0cyBvd24gcG9pbnRlcnMgdG8gY2hpbGRyZW4sIHBhcmVudHMsIGFuZCBzaWJsaW5ncy5cbiAgICAvLyBUaGUgb3RoZXIgaG9zdCBub2RlcyBhbHNvIHBvaW50IGJhY2sgdG8gZmliZXJzLCBzbyB3ZSBzaG91bGQgZGV0YWNoIHRoYXRcbiAgICAvLyBvbmUsIHRvby5cblxuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgIHZhciBob3N0SW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgZGV0YWNoRGVsZXRlZEluc3RhbmNlKGhvc3RJbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDsgLy8gSSdtIGludGVudGlvbmFsbHkgbm90IGNsZWFyaW5nIHRoZSBgcmV0dXJuYCBmaWVsZCBpbiB0aGlzIGxldmVsLiBXZVxuICAgIC8vIGFscmVhZHkgZGlzY29ubmVjdCB0aGUgYHJldHVybmAgcG9pbnRlciBhdCB0aGUgcm9vdCBvZiB0aGUgZGVsZXRlZFxuICAgIC8vIHN1YnRyZWUgKGluIGBkZXRhY2hGaWJlck11dGF0aW9uYCkuIEJlc2lkZXMsIGByZXR1cm5gIGJ5IGl0c2VsZiBpcyBub3RcbiAgICAvLyBjeWNsaWNhbCBcdTIwMTQgaXQncyBvbmx5IGN5Y2xpY2FsIHdoZW4gY29tYmluZWQgd2l0aCBgY2hpbGRgLCBgc2libGluZ2AsIGFuZFxuICAgIC8vIGBhbHRlcm5hdGVgLiBCdXQgd2UnbGwgY2xlYXIgaXQgaW4gdGhlIG5leHQgbGV2ZWwgYW55d2F5LCBqdXN0IGluIGNhc2UuXG5cbiAgICB7XG4gICAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gVGhlb3JldGljYWxseSwgbm90aGluZyBpbiBoZXJlIHNob3VsZCBiZSBuZWNlc3NhcnksIGJlY2F1c2Ugd2UgYWxyZWFkeVxuICAgICAgLy8gZGlzY29ubmVjdGVkIHRoZSBmaWJlciBmcm9tIHRoZSB0cmVlLiBTbyBldmVuIGlmIHNvbWV0aGluZyBsZWFrcyB0aGlzXG4gICAgICAvLyBwYXJ0aWN1bGFyIGZpYmVyLCBpdCB3b24ndCBsZWFrIGFueXRoaW5nIGVsc2VcbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcHVycG9zZSBvZiB0aGlzIGJyYW5jaCBpcyB0byBiZSBzdXBlciBhZ2dyZXNzaXZlIHNvIHdlIGNhbiBtZWFzdXJlXG4gICAgICAvLyBpZiB0aGVyZSdzIGFueSBkaWZmZXJlbmNlIGluIG1lbW9yeSBpbXBhY3QuIElmIHRoZXJlIGlzLCB0aGF0IGNvdWxkXG4gICAgICAvLyBpbmRpY2F0ZSBhIFJlYWN0IGxlYWsgd2UgZG9uJ3Qga25vdyBhYm91dC5cbiAgICAgIGZpYmVyLnJldHVybiA9IG51bGw7XG4gICAgICBmaWJlci5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgICBmaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IG51bGw7XG4gICAgICBmaWJlci5zdGF0ZU5vZGUgPSBudWxsOyAvLyBUT0RPOiBNb3ZlIHRvIGBjb21taXRQYXNzaXZlVW5tb3VudEluc2lkZURlbGV0ZWRUcmVlT25GaWJlcmAgaW5zdGVhZC5cblxuICAgICAgZmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRIb3N0UGFyZW50RmliZXIoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGlzSG9zdFBhcmVudChwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgLy8gVE9ETzogRmluZCBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLlxuICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gIHNpYmxpbmdzOiB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBsZXQncyB0cnkgdGhlIG5leHQgc2libGluZy5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgaXNIb3N0UGFyZW50KG5vZGUucmV0dXJuKSkge1xuICAgICAgICAvLyBJZiB3ZSBwb3Agb3V0IG9mIHRoZSByb290IG9yIGhpdCB0aGUgcGFyZW50IHRoZSBmaWJlciB3ZSBhcmUgdGhlXG4gICAgICAgIC8vIGxhc3Qgc2libGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcblxuICAgIHdoaWxlIChub2RlLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBub2RlLnRhZyAhPT0gSG9zdFRleHQgJiYgbm9kZS50YWcgIT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgaXQgaXMgbm90IGhvc3Qgbm9kZSBhbmQsIHdlIG1pZ2h0IGhhdmUgYSBob3N0IG5vZGUgaW5zaWRlIGl0LlxuICAgICAgLy8gVHJ5IHRvIHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgb25lLlxuICAgICAgaWYgKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgIC8vIFdlIGFsc28gc2tpcCBwb3J0YWxzIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhpcyBob3N0IHRyZWUuXG5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgaWYgdGhpcyBob3N0IG5vZGUgaXMgc3RhYmxlIG9yIGFib3V0IHRvIGJlIHBsYWNlZC5cblxuXG4gICAgaWYgKCEobm9kZS5mbGFncyAmIFBsYWNlbWVudCkpIHtcbiAgICAgIC8vIEZvdW5kIGl0IVxuICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKSB7XG5cblxuICB2YXIgcGFyZW50RmliZXIgPSBnZXRIb3N0UGFyZW50RmliZXIoZmluaXNoZWRXb3JrKTsgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG5cbiAgc3dpdGNoIChwYXJlbnRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKHBhcmVudEZpYmVyLmZsYWdzICYgQ29udGVudFJlc2V0KSB7XG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgcGFyZW50IGJlZm9yZSBkb2luZyBhbnkgaW5zZXJ0aW9uc1xuICAgICAgICAgIHJlc2V0VGV4dENvbnRlbnQocGFyZW50KTsgLy8gQ2xlYXIgQ29udGVudFJlc2V0IGZyb20gdGhlIGVmZmVjdCB0YWdcblxuICAgICAgICAgIHBhcmVudEZpYmVyLmZsYWdzICY9IH5Db250ZW50UmVzZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTsgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgaW5zZXJ0ZWQgYnV0IHdlIG5lZWQgdG8gcmVjdXJzZSBkb3duIGl0c1xuICAgICAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG5cbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGZpbmlzaGVkV29yaywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAge1xuICAgICAgICB2YXIgX3BhcmVudCA9IHBhcmVudEZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgIHZhciBfYmVmb3JlID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGZpbmlzaGVkV29yaywgX2JlZm9yZSwgX3BhcmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBob3N0IHBhcmVudCBmaWJlci4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnICcgKyAnaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCkge1xuICAgIHZhciBzdGF0ZU5vZGUgPSBub2RlLnN0YXRlTm9kZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEluQ29udGFpbmVyQmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKHBhcmVudCwgc3RhdGVOb2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2Uge1xuICAgIHZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShub2RlLCBiZWZvcmUsIHBhcmVudCkge1xuICB2YXIgdGFnID0gbm9kZS50YWc7XG4gIHZhciBpc0hvc3QgPSB0YWcgPT09IEhvc3RDb21wb25lbnQgfHwgdGFnID09PSBIb3N0VGV4dDtcblxuICBpZiAoaXNIb3N0KSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgaW5zZXJ0QmVmb3JlKHBhcmVudCwgc3RhdGVOb2RlLCBiZWZvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoY2hpbGQsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgIHZhciBzaWJsaW5nID0gY2hpbGQuc2libGluZztcblxuICAgICAgd2hpbGUgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKHNpYmxpbmcsIGJlZm9yZSwgcGFyZW50KTtcbiAgICAgICAgc2libGluZyA9IHNpYmxpbmcuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn0gLy8gVGhlc2UgYXJlIHRyYWNrZWQgb24gdGhlIHN0YWNrIGFzIHdlIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFcbi8vIGRlbGV0ZWQgc3VidHJlZS5cbi8vIFRPRE86IFVwZGF0ZSB0aGVzZSBkdXJpbmcgdGhlIHdob2xlIG11dGF0aW9uIHBoYXNlLCBub3QganVzdCBkdXJpbmdcbi8vIGEgZGVsZXRpb24uXG5cblxudmFyIGhvc3RQYXJlbnQgPSBudWxsO1xudmFyIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHMocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcikge1xuICB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQsIGRldGFjaCByZWZzLCBjbGVhblxuICAgIC8vIHVwIG1vdW50ZWQgbGF5b3V0IGVmZmVjdHMsIGFuZCBjYWxsIGNvbXBvbmVudFdpbGxVbm1vdW50LlxuICAgIC8vIFdlIG9ubHkgbmVlZCB0byByZW1vdmUgdGhlIHRvcG1vc3QgaG9zdCBjaGlsZCBpbiBlYWNoIGJyYW5jaC4gQnV0IHRoZW4gd2VcbiAgICAvLyBzdGlsbCBuZWVkIHRvIGtlZXAgdHJhdmVyc2luZyB0byB1bm1vdW50IGVmZmVjdHMsIHJlZnMsIGFuZCBjV1UuIFRPRE86IFdlXG4gICAgLy8gY291bGQgc3BsaXQgdGhpcyBpbnRvIHR3byBzZXBhcmF0ZSB0cmF2ZXJzYWxzIGZ1bmN0aW9ucywgd2hlcmUgdGhlIHNlY29uZFxuICAgIC8vIG9uZSBkb2Vzbid0IGluY2x1ZGUgYW55IHJlbW92ZUNoaWxkIGxvZ2ljLiBUaGlzIGlzIG1heWJlIHRoZSBzYW1lXG4gICAgLy8gZnVuY3Rpb24gYXMgXCJkaXNhcHBlYXJMYXlvdXRFZmZlY3RzXCIgKG9yIHdoYXRldmVyIHRoYXQgdHVybnMgaW50byBhZnRlclxuICAgIC8vIHRoZSBsYXlvdXQgcGhhc2UgaXMgcmVmYWN0b3JlZCB0byB1c2UgcmVjdXJzaW9uKS5cbiAgICAvLyBCZWZvcmUgc3RhcnRpbmcsIGZpbmQgdGhlIG5lYXJlc3QgaG9zdCBwYXJlbnQgb24gdGhlIHN0YWNrIHNvIHdlIGtub3dcbiAgICAvLyB3aGljaCBpbnN0YW5jZS9jb250YWluZXIgdG8gcmVtb3ZlIHRoZSBjaGlsZHJlbiBmcm9tLlxuICAgIC8vIFRPRE86IEluc3RlYWQgb2Ygc2VhcmNoaW5nIHVwIHRoZSBmaWJlciByZXR1cm4gcGF0aCBvbiBldmVyeSBkZWxldGlvbiwgd2VcbiAgICAvLyBjYW4gdHJhY2sgdGhlIG5lYXJlc3QgaG9zdCBjb21wb25lbnQgb24gdGhlIEpTIHN0YWNrIGFzIHdlIHRyYXZlcnNlIHRoZVxuICAgIC8vIHRyZWUgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFRoaXMgd291bGQgbWFrZSBpbnNlcnRpb25zIGZhc3RlciwgdG9vLlxuICAgIHZhciBwYXJlbnQgPSByZXR1cm5GaWJlcjtcblxuICAgIGZpbmRQYXJlbnQ6IHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaG9zdFBhcmVudCA9IHBhcmVudC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHRydWU7XG4gICAgICAgICAgICBicmVhayBmaW5kUGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaG9zdFBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBwYXJlbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSAnICsgJ2EgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG5cbiAgICBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKHJvb3QsIHJldHVybkZpYmVyLCBkZWxldGVkRmliZXIpO1xuICAgIGhvc3RQYXJlbnQgPSBudWxsO1xuICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IGZhbHNlO1xuICB9XG5cbiAgZGV0YWNoRmliZXJNdXRhdGlvbihkZWxldGVkRmliZXIpO1xufVxuXG5mdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgcGFyZW50KSB7XG4gIC8vIFRPRE86IFVzZSBhIHN0YXRpYyBmbGFnIHRvIHNraXAgdHJlZXMgdGhhdCBkb24ndCBoYXZlIHVubW91bnQgZWZmZWN0c1xuICB2YXIgY2hpbGQgPSBwYXJlbnQuY2hpbGQ7XG5cbiAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGNoaWxkKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcikge1xuICBvbkNvbW1pdFVubW91bnQoZGVsZXRlZEZpYmVyKTsgLy8gVGhlIGNhc2VzIGluIHRoaXMgb3V0ZXIgc3dpdGNoIG1vZGlmeSB0aGUgc3RhY2sgYmVmb3JlIHRoZXkgdHJhdmVyc2VcbiAgLy8gaW50byB0aGVpciBzdWJ0cmVlLiBUaGVyZSBhcmUgc2ltcGxlciBjYXNlcyBpbiB0aGUgaW5uZXIgc3dpdGNoXG4gIC8vIHRoYXQgZG9uJ3QgbW9kaWZ5IHRoZSBzdGFjay5cblxuICBzd2l0Y2ggKGRlbGV0ZWRGaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICghb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIHNhZmVseURldGFjaFJlZihkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICB9IC8vIEludGVudGlvbmFsIGZhbGx0aHJvdWdoIHRvIG5leHQgYnJhbmNoXG5cbiAgICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUtbm8tZmFsbHRocm91Z2hcblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byByZW1vdmUgdGhlIG5lYXJlc3QgaG9zdCBjaGlsZC4gU2V0IHRoZSBob3N0IHBhcmVudFxuICAgICAgICAvLyB0byBgbnVsbGAgb24gdGhlIHN0YWNrIHRvIGluZGljYXRlIHRoYXQgbmVzdGVkIGNoaWxkcmVuIGRvbid0XG4gICAgICAgIC8vIG5lZWQgdG8gYmUgcmVtb3ZlZC5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBwcmV2SG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IHByZXZIb3N0UGFyZW50O1xuICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9IHByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG5cbiAgICAgICAgICBpZiAoaG9zdFBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gTm93IHRoYXQgYWxsIHRoZSBjaGlsZCBlZmZlY3RzIGhhdmUgdW5tb3VudGVkLCB3ZSBjYW4gcmVtb3ZlIHRoZVxuICAgICAgICAgICAgLy8gbm9kZSBmcm9tIHRoZSB0cmVlLlxuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoaG9zdFBhcmVudCwgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZW1vdmVDaGlsZChob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIERlaHlkcmF0ZWRGcmFnbWVudDpcbiAgICAgIHtcbiAgICAgICAgLy8gRGVsZXRlIHRoZSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGJvdW5kYXJ5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnQuXG5cblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGhvc3RQYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChob3N0UGFyZW50SXNDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgY2xlYXJTdXNwZW5zZUJvdW5kYXJ5RnJvbUNvbnRhaW5lcihob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNsZWFyU3VzcGVuc2VCb3VuZGFyeShob3N0UGFyZW50LCBkZWxldGVkRmliZXIuc3RhdGVOb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXaGVuIHdlIGdvIGludG8gYSBwb3J0YWwsIGl0IGJlY29tZXMgdGhlIHBhcmVudCB0byByZW1vdmUgZnJvbS5cbiAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICB2YXIgX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBfcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gX3ByZXZIb3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBkZWxldGVkRmliZXIudXBkYXRlUXVldWU7XG5cbiAgICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgICAgICAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBfZWZmZWN0ID0gZWZmZWN0LFxuICAgICAgICAgICAgICAgICAgICBkZXN0cm95ID0gX2VmZmVjdC5kZXN0cm95LFxuICAgICAgICAgICAgICAgICAgICB0YWcgPSBfZWZmZWN0LnRhZztcblxuICAgICAgICAgICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGlmICgodGFnICYgSW5zZXJ0aW9uKSAhPT0gTm9GbGFncyQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YWcgJiBMYXlvdXQpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RhcnRlZChkZWxldGVkRmliZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWxldGVkRmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICAgIHNhZmVseUNhbGxEZXN0cm95KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTGF5b3V0RWZmZWN0RHVyYXRpb24oZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBzYWZlbHlDYWxsRGVzdHJveShkZWxldGVkRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtDb21wb25lbnRMYXlvdXRFZmZlY3RVbm1vdW50U3RvcHBlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIW9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pIHtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgaW5zdGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGRlbGV0ZWRGaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIG9mZnNjcmVlbiBjb21wb25lbnQgaXMgaGlkZGVuLCB3ZSBhbHJlYWR5IHVubW91bnRlZCBpdC4gQmVmb3JlXG4gICAgICAgICAgLy8gZGVsZXRpbmcgdGhlIGNoaWxkcmVuLCB0cmFjayB0aGF0IGl0J3MgYWxyZWFkeSB1bm1vdW50ZWQgc28gdGhhdCB3ZVxuICAgICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gdW5tb3VudCB0aGUgZWZmZWN0cyBhZ2Fpbi5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGUgdHJlZSBpcyBoaWRkZW4sIGluIG1vc3QgY2FzZXMgd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2tpcFxuICAgICAgICAgIC8vIG92ZXIgdGhlIG5lc3RlZCBjaGlsZHJlbiBlbnRpcmVseS4gQW4gZXhjZXB0aW9uIGlzIHdlIGhhdmVuJ3QgeWV0IGZvdW5kXG4gICAgICAgICAgLy8gdGhlIHRvcG1vc3QgaG9zdCBub2RlIHRvIGRlbGV0ZSwgd2hpY2ggd2UgYWxyZWFkeSB0cmFjayBvbiB0aGUgc3RhY2suXG4gICAgICAgICAgLy8gQnV0IHRoZSBvdGhlciBjYXNlIGlzIHBvcnRhbHMsIHdoaWNoIG5lZWQgdG8gYmUgZGV0YWNoZWQgbm8gbWF0dGVyIGhvd1xuICAgICAgICAgIC8vIGRlZXBseSB0aGV5IGFyZSBuZXN0ZWQuIFdlIHNob3VsZCB1c2UgYSBzdWJ0cmVlIGZsYWcgdG8gdHJhY2sgd2hldGhlciBhXG4gICAgICAgICAgLy8gc3VidHJlZSBpbmNsdWRlcyBhIG5lc3RlZCBwb3J0YWwuXG4gICAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgZGVsZXRlZEZpYmVyLm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoZmluaXNoZWRSb290LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBkZWxldGVkRmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKGZpbmlzaGVkUm9vdCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZGVsZXRlZEZpYmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKSB7XG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0byBwYXNzaXZlIHBoYXNlXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuXG4gIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChuZXdTdGF0ZSA9PT0gbnVsbCkge1xuICAgIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBzdXNwZW5zZUluc3RhbmNlID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKHN1c3BlbnNlSW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspIHtcbiAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgdGhlbiBpdCB3aWxsIGhhdmUgYSBzZXQgb2Ygd2FrZWFibGVzLlxuICAvLyBGb3IgZWFjaCB3YWtlYWJsZSwgYXR0YWNoIGEgbGlzdGVuZXIgc28gdGhhdCB3aGVuIGl0IHJlc29sdmVzLCBSZWFjdFxuICAvLyBhdHRlbXB0cyB0byByZS1yZW5kZXIgdGhlIGJvdW5kYXJ5IGluIHRoZSBwcmltYXJ5IChwcmUtdGltZW91dCkgc3RhdGUuXG4gIHZhciB3YWtlYWJsZXMgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG5cbiAgaWYgKHdha2VhYmxlcyAhPT0gbnVsbCkge1xuICAgIGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSA9IG51bGw7XG4gICAgdmFyIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgaWYgKHJldHJ5Q2FjaGUgPT09IG51bGwpIHtcbiAgICAgIHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gbmV3IFBvc3NpYmx5V2Vha1NldCgpO1xuICAgIH1cblxuICAgIHdha2VhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uICh3YWtlYWJsZSkge1xuICAgICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgYm91bmRhcnkgZmliZXIgdG8gcHJldmVudCByZWR1bmRhbnQgbGlzdGVuZXJzLlxuICAgICAgdmFyIHJldHJ5ID0gcmVzb2x2ZVJldHJ5V2FrZWFibGUuYmluZChudWxsLCBmaW5pc2hlZFdvcmssIHdha2VhYmxlKTtcblxuICAgICAgaWYgKCFyZXRyeUNhY2hlLmhhcyh3YWtlYWJsZSkpIHtcbiAgICAgICAgcmV0cnlDYWNoZS5hZGQod2FrZWFibGUpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgICAgIGlmIChpblByb2dyZXNzTGFuZXMgIT09IG51bGwgJiYgaW5Qcm9ncmVzc1Jvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBwZW5kaW5nIHdvcmsgc3RpbGwsIGFzc29jaWF0ZSB0aGUgb3JpZ2luYWwgdXBkYXRlcnMgd2l0aCBpdC5cbiAgICAgICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhpblByb2dyZXNzUm9vdCwgaW5Qcm9ncmVzc0xhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKCdFeHBlY3RlZCBmaW5pc2hlZCByb290IGFuZCBsYW5lcyB0byBiZSBzZXQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2FrZWFibGUudGhlbihyZXRyeSwgcmV0cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIFRoaXMgZnVuY3Rpb24gZGV0ZWN0cyB3aGVuIGEgU3VzcGVuc2UgYm91bmRhcnkgZ29lcyBmcm9tIHZpc2libGUgdG8gaGlkZGVuLlxuZnVuY3Rpb24gY29tbWl0TXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290KTtcbiAgc2V0Q3VycmVudEZpYmVyKGZpbmlzaGVkV29yayk7XG4gIGluUHJvZ3Jlc3NMYW5lcyA9IG51bGw7XG4gIGluUHJvZ3Jlc3NSb290ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgbGFuZXMpIHtcbiAgLy8gRGVsZXRpb25zIGVmZmVjdHMgY2FuIGJlIHNjaGVkdWxlZCBvbiBhbnkgZmliZXIgdHlwZS4gVGhleSBuZWVkIHRvIGhhcHBlblxuICAvLyBiZWZvcmUgdGhlIGNoaWxkcmVuIGVmZmVjdHMgaGFlIGZpcmVkLlxuICB2YXIgZGVsZXRpb25zID0gcGFyZW50RmliZXIuZGVsZXRpb25zO1xuXG4gIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBkZWxldGlvbnNbaV07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0cyhyb290LCBwYXJlbnRGaWJlciwgY2hpbGRUb0RlbGV0ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjaGlsZFRvRGVsZXRlLCBwYXJlbnRGaWJlciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBwcmV2RGVidWdGaWJlciA9IGdldEN1cnJlbnRGaWJlcigpO1xuXG4gIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiBNdXRhdGlvbk1hc2spIHtcbiAgICB2YXIgY2hpbGQgPSBwYXJlbnRGaWJlci5jaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGNoaWxkKTtcbiAgICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoY2hpbGQsIHJvb3QpO1xuICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHNldEN1cnJlbnRGaWJlcihwcmV2RGVidWdGaWJlcik7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcykge1xuICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG4gIHZhciBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFnczsgLy8gVGhlIGVmZmVjdCBmbGFnIHNob3VsZCBiZSBjaGVja2VkICphZnRlciogd2UgcmVmaW5lIHRoZSB0eXBlIG9mIGZpYmVyLFxuICAvLyBiZWNhdXNlIHRoZSBmaWJlciB0YWcgaXMgbW9yZSBzcGVjaWZpYy4gQW4gZXhjZXB0aW9uIGlzIGFueSBmbGFnIHJlbGF0ZWRcbiAgLy8gdG8gcmVjb25jaWxhdGlvbiwgYmVjYXVzZSB0aG9zZSBjYW4gYmUgc2V0IG9uIGFsbCBmaWJlciB0eXBlcy5cblxuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChJbnNlcnRpb24gfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH0gLy8gTGF5b3V0IGVmZmVjdHMgYXJlIGRlc3Ryb3llZCBkdXJpbmcgdGhlIG11dGF0aW9uIHBoYXNlIHNvIHRoYXQgYWxsXG4gICAgICAgICAgLy8gZGVzdHJveSBmdW5jdGlvbnMgZm9yIGFsbCBmaWJlcnMgYXJlIGNhbGxlZCBiZWZvcmUgYW55IGNyZWF0ZSBmdW5jdGlvbnMuXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzaWJsaW5nIGNvbXBvbmVudCBlZmZlY3RzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLFxuICAgICAgICAgIC8vIGUuZy4gYSBkZXN0cm95IGZ1bmN0aW9uIGluIG9uZSBjb21wb25lbnQgc2hvdWxkIG5ldmVyIG92ZXJyaWRlIGEgcmVmIHNldFxuICAgICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG5cblxuICAgICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChMYXlvdXQgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFJlZikge1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB7XG4gICAgICAgICAgLy8gVE9ETzogQ29udGVudFJlc2V0IGdldHMgY2xlYXJlZCBieSB0aGUgY2hpbGRyZW4gZHVyaW5nIHRoZSBjb21taXRcbiAgICAgICAgICAvLyBwaGFzZS4gVGhpcyBpcyBhIHJlZmFjdG9yIGhhemFyZCBiZWNhdXNlIGl0IG1lYW5zIHdlIG11c3QgcmVhZFxuICAgICAgICAgIC8vIGZsYWdzIHRoZSBmbGFncyBhZnRlciBgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzYCBoYXMgYWxyZWFkeSBydW47XG4gICAgICAgICAgLy8gdGhlIG9yZGVyIG1hdHRlcnMuIFdlIHNob3VsZCByZWZhY3RvciBzbyB0aGF0IENvbnRlbnRSZXNldCBkb2VzIG5vdFxuICAgICAgICAgIC8vIHJlbHkgb24gbXV0YXRpbmcgdGhlIGZsYWcgZHVyaW5nIGNvbW1pdC4gTGlrZSBieSBzZXR0aW5nIGEgZmxhZ1xuICAgICAgICAgIC8vIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlIGluc3RlYWQuXG4gICAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIENvbnRlbnRSZXNldCkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVzZXRUZXh0Q29udGVudChpbnN0YW5jZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICAgIHZhciBfaW5zdGFuY2U0ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICAgICAgaWYgKF9pbnN0YW5jZTQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBDb21taXQgdGhlIHdvcmsgcHJlcGFyZWQgZWFybGllci5cbiAgICAgICAgICAgICAgdmFyIG5ld1Byb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICAgICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3UHJvcHM7XG4gICAgICAgICAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGU7IC8vIFRPRE86IFR5cGUgdGhlIHVwZGF0ZVF1ZXVlIHRvIGJlIHNwZWNpZmljIHRvIGhvc3QgY29tcG9uZW50cy5cblxuICAgICAgICAgICAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAgICAgICAgICBpZiAodXBkYXRlUGF5bG9hZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRVcGRhdGUoX2luc3RhbmNlNCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzLCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgaGF2ZSBhIHRleHQgbm9kZSBpbml0aWFsaXplZC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgJyArICdjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHZhciBuZXdUZXh0ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAgIC8vIGFzIHRoZSBuZXdQcm9wcy4gVGhlIHVwZGF0ZVBheWxvYWQgd2lsbCBjb250YWluIHRoZSByZWFsIGNoYW5nZSBpblxuICAgICAgICAgICAgLy8gdGhpcyBjYXNlLlxuXG4gICAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuXG4gICAgICAgIGlmIChmbGFncyAmIFVwZGF0ZSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2Um9vdFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICAgIGlmIChwcmV2Um9vdFN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBjb21taXRIeWRyYXRlZENvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgdmFyIG9mZnNjcmVlbkZpYmVyID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5GaWJlci5mbGFncyAmIFZpc2liaWxpdHkpIHtcbiAgICAgICAgICB2YXIgbmV3U3RhdGUgPSBvZmZzY3JlZW5GaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBpc0hpZGRlbiA9IG5ld1N0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgICB2YXIgd2FzSGlkZGVuID0gb2Zmc2NyZWVuRmliZXIuYWx0ZXJuYXRlICE9PSBudWxsICYmIG9mZnNjcmVlbkZpYmVyLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoIXdhc0hpZGRlbikge1xuICAgICAgICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIHBhc3NpdmUgcGhhc2VcbiAgICAgICAgICAgICAgbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdFN1c3BlbnNlQ2FsbGJhY2soZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfd2FzSGlkZGVuID0gY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKCAvLyBUT0RPOiBSZW1vdmUgdGhpcyBkZWFkIGZsYWdcbiAgICAgICAgIGZpbmlzaGVkV29yay5tb2RlICYgQ29uY3VycmVudE1vZGUpIHtcbiAgICAgICAgICAvLyBCZWZvcmUgY29tbWl0dGluZyB0aGUgY2hpbGRyZW4sIHRyYWNrIG9uIHRoZSBzdGFjayB3aGV0aGVyIHRoaXNcbiAgICAgICAgICAvLyBvZmZzY3JlZW4gc3VidHJlZSB3YXMgYWxyZWFkeSBoaWRkZW4sIHNvIHRoYXQgd2UgZG9uJ3QgdW5tb3VudCB0aGVcbiAgICAgICAgICAvLyBlZmZlY3RzIGFnYWluLlxuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8IF93YXNIaWRkZW47XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcblxuICAgICAgICBpZiAoZmxhZ3MgJiBWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgdmFyIF9uZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgdmFyIF9pc0hpZGRlbiA9IF9uZXdTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIHZhciBvZmZzY3JlZW5Cb3VuZGFyeSA9IGZpbmlzaGVkV29yaztcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgbmVlZHMgdG8gcnVuIHdoZW5ldmVyIHRoZXJlJ3MgYW4gaW5zZXJ0aW9uIG9yIHVwZGF0ZVxuICAgICAgICAgICAgLy8gaW5zaWRlIGEgaGlkZGVuIE9mZnNjcmVlbiB0cmVlLlxuICAgICAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4ob2Zmc2NyZWVuQm91bmRhcnksIF9pc0hpZGRlbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKF9pc0hpZGRlbikge1xuICAgICAgICAgICAgICBpZiAoIV93YXNIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoKG9mZnNjcmVlbkJvdW5kYXJ5Lm1vZGUgJiBDb25jdXJyZW50TW9kZSkgIT09IE5vTW9kZSkge1xuICAgICAgICAgICAgICAgICAgbmV4dEVmZmVjdCA9IG9mZnNjcmVlbkJvdW5kYXJ5O1xuICAgICAgICAgICAgICAgICAgdmFyIG9mZnNjcmVlbkNoaWxkID0gb2Zmc2NyZWVuQm91bmRhcnkuY2hpbGQ7XG5cbiAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzY3JlZW5DaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gb2Zmc2NyZWVuQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfYmVnaW4ob2Zmc2NyZWVuQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5DaGlsZCA9IG9mZnNjcmVlbkNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTY29wZUNvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yaykge1xuICAvLyBQbGFjZW1lbnQgZWZmZWN0cyAoaW5zZXJ0aW9ucywgcmVvcmRlcnMpIGNhbiBiZSBzY2hlZHVsZWQgb24gYW55IGZpYmVyXG4gIC8vIHR5cGUuIFRoZXkgbmVlZHMgdG8gaGFwcGVuIGFmdGVyIHRoZSBjaGlsZHJlbiBlZmZlY3RzIGhhdmUgZmlyZWQsIGJ1dFxuICAvLyBiZWZvcmUgdGhlIGVmZmVjdHMgb24gdGhpcyBmaWJlciBoYXZlIGZpcmVkLlxuICB2YXIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG5cbiAgaWYgKGZsYWdzICYgUGxhY2VtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICB9IC8vIENsZWFyIHRoZSBcInBsYWNlbWVudFwiIGZyb20gZWZmZWN0IHRhZyBzbyB0aGF0IHdlIGtub3cgdGhhdCB0aGlzIGlzXG4gICAgLy8gaW5zZXJ0ZWQsIGJlZm9yZSBhbnkgbGlmZS1jeWNsZXMgbGlrZSBjb21wb25lbnREaWRNb3VudCBnZXRzIGNhbGxlZC5cbiAgICAvLyBUT0RPOiBmaW5kRE9NTm9kZSBkb2Vzbid0IHJlbHkgb24gdGhpcyBhbnkgbW9yZSBidXQgaXNNb3VudGVkIGRvZXNcbiAgICAvLyBhbmQgaXNNb3VudGVkIGlzIGRlcHJlY2F0ZWQgYW55d2F5IHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIGtpbGwgdGhpcy5cblxuXG4gICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IH5QbGFjZW1lbnQ7XG4gIH1cblxuICBpZiAoZmxhZ3MgJiBIeWRyYXRpbmcpIHtcbiAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gfkh5ZHJhdGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgcm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gY29tbWl0dGVkTGFuZXM7XG4gIGluUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgbmV4dEVmZmVjdCA9IGZpbmlzaGVkV29yaztcbiAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihmaW5pc2hlZFdvcmssIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgaW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICAvLyBTdXNwZW5zZSBsYXlvdXQgZWZmZWN0cyBzZW1hbnRpY3MgZG9uJ3QgY2hhbmdlIGZvciBsZWdhY3kgcm9vdHMuXG4gIHZhciBpc01vZGVyblJvb3QgPSAoc3VidHJlZVJvb3QubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlO1xuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKCBmaWJlci50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCAmJiBpc01vZGVyblJvb3QpIHtcbiAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgT2Zmc2NyZWVuIHN0YWNrJ3Mgc3RhdGUuXG4gICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGlzSGlkZGVuIHx8IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcblxuICAgICAgaWYgKG5ld09mZnNjcmVlblN1YnRyZWVJc0hpZGRlbikge1xuICAgICAgICAvLyBUaGUgT2Zmc2NyZWVuIHRyZWUgaXMgaGlkZGVuLiBTa2lwIG92ZXIgaXRzIGxheW91dCBlZmZlY3RzLlxuICAgICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPIChPZmZzY3JlZW4pIEFsc28gY2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dE1hc2tcbiAgICAgICAgdmFyIGN1cnJlbnQgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICAgIHZhciB3YXNIaWRkZW4gPSBjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIG5ld09mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSB3YXNIaWRkZW4gfHwgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgdmFyIHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47IC8vIFRyYXZlcnNlIHRoZSBPZmZzY3JlZW4gc3VidHJlZSB3aXRoIHRoZSBjdXJyZW50IE9mZnNjcmVlbiBhcyB0aGUgcm9vdC5cblxuICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBuZXdPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuXG4gICAgICAgIGlmIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuICYmICFwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJvb3Qgb2YgYSByZWFwcGVhcmluZyBib3VuZGFyeS4gVHVybiBpdHMgbGF5b3V0IGVmZmVjdHNcbiAgICAgICAgICAvLyBiYWNrIG9uLlxuICAgICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfYmVnaW4oZmliZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkID0gZmlyc3RDaGlsZDtcblxuICAgICAgICB3aGlsZSAoY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0c19iZWdpbihjaGlsZCwgLy8gTmV3IHJvb3Q7IGJ1YmJsZSBiYWNrIHVwIHRvIGhlcmUgYW5kIHN0b3AuXG4gICAgICAgICAgcm9vdCwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfSAvLyBSZXN0b3JlIE9mZnNjcmVlbiBzdGF0ZSBhbmQgcmVzdW1lIGluIG91ci1wcm9ncmVzcyB0cmF2ZXJzYWwuXG5cblxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXI7XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW47XG4gICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbjtcbiAgICAgICAgY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgoZmliZXIuc3VidHJlZUZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MgJiYgZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgZmlyc3RDaGlsZC5yZXR1cm4gPSBmaWJlcjtcbiAgICAgIG5leHRFZmZlY3QgPSBmaXJzdENoaWxkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21taXRMYXlvdXRNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0TGF5b3V0TW91bnRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgTGF5b3V0TWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihyb290LCBjdXJyZW50LCBmaWJlciwgY29tbWl0dGVkTGFuZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19iZWdpbihzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBmaWJlci5jaGlsZDsgLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogZmxhZ3MgJiAoUmVmU3RhdGljIHwgTGF5b3V0U3RhdGljKVxuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoIGZpYmVyLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RhcnRMYXlvdXRFZmZlY3RUaW1lcigpO1xuICAgICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHJlY29yZExheW91dEVmZmVjdER1cmF0aW9uKGZpYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgUmVmU3RhdGljXG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChmaWJlciwgZmliZXIucmV0dXJuLCBpbnN0YW5jZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpYmVyLCBmaWJlci5yZXR1cm4pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhXG4gICAgICAgICAgdmFyIGlzSGlkZGVuID0gZmliZXIubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgICAgLy8gTmVzdGVkIE9mZnNjcmVlbiB0cmVlIGlzIGFscmVhZHkgaGlkZGVuLiBEb24ndCBkaXNhcHBlYXJcbiAgICAgICAgICAgIC8vIGl0cyBlZmZlY3RzLlxuICAgICAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH0gLy8gVE9ETyAoT2Zmc2NyZWVuKSBDaGVjazogc3VidHJlZUZsYWdzICYgTGF5b3V0U3RhdGljXG5cblxuICAgIGlmIChmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc2FwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzX2NvbXBsZXRlKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhcHBlYXJMYXlvdXRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290KSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcbiAgICB2YXIgZmlyc3RDaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gT2Zmc2NyZWVuQ29tcG9uZW50KSB7XG4gICAgICB2YXIgaXNIaWRkZW4gPSBmaWJlci5tZW1vaXplZFN0YXRlICE9PSBudWxsO1xuXG4gICAgICBpZiAoaXNIaWRkZW4pIHtcbiAgICAgICAgLy8gTmVzdGVkIE9mZnNjcmVlbiB0cmVlIGlzIHN0aWxsIGhpZGRlbi4gRG9uJ3QgcmUtYXBwZWFyIGl0cyBlZmZlY3RzLlxuICAgICAgICByZWFwcGVhckxheW91dEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IHN1YnRyZWVGbGFncyAmIExheW91dFN0YXRpY1xuXG5cbiAgICBpZiAoZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBub2RlIG1heSBoYXZlIGJlZW4gcmV1c2VkIGZyb20gYSBwcmV2aW91cyByZW5kZXIsIHNvIHdlIGNhbid0XG4gICAgICAvLyBhc3N1bWUgaXRzIHJldHVybiBwb2ludGVyIGlzIGNvcnJlY3QuXG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0c19jb21wbGV0ZShzdWJ0cmVlUm9vdCkge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7IC8vIFRPRE8gKE9mZnNjcmVlbikgQ2hlY2s6IGZsYWdzICYgTGF5b3V0U3RhdGljXG5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0c09uRmliZXIoZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcblxuICAgIGlmIChmaWJlciA9PT0gc3VidHJlZVJvb3QpIHtcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIG5vZGUgbWF5IGhhdmUgYmVlbiByZXVzZWQgZnJvbSBhIHByZXZpb3VzIHJlbmRlciwgc28gd2UgY2FuJ3RcbiAgICAgIC8vIGFzc3VtZSBpdHMgcmV0dXJuIHBvaW50ZXIgaXMgY29ycmVjdC5cbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgY29tbWl0dGVkTGFuZXMsIGNvbW1pdHRlZFRyYW5zaXRpb25zKSB7XG4gIG5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfYmVnaW4oZmluaXNoZWRXb3JrLCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzX2JlZ2luKHN1YnRyZWVSb290LCByb290LCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBmaXJzdENoaWxkID0gZmliZXIuY2hpbGQ7XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyAmJiBmaXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgICBmaXJzdENoaWxkLnJldHVybiA9IGZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNfY29tcGxldGUoc3VidHJlZVJvb3QsIHJvb3QsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucykge1xuICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaWJlciA9IG5leHRFZmZlY3Q7XG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIocm9vdCwgZmliZXIsIGNvbW1pdHRlZExhbmVzLCBjb21taXR0ZWRUcmFuc2l0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKGZpYmVyID09PSBzdWJ0cmVlUm9vdCkge1xuICAgICAgbmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nO1xuXG4gICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgIHNpYmxpbmcucmV0dXJuID0gZmliZXIucmV0dXJuO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IGZpYmVyLnJldHVybjtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlTW91bnRPbkZpYmVyKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrLCBjb21taXR0ZWRMYW5lcywgY29tbWl0dGVkVHJhbnNpdGlvbnMpIHtcbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBpZiAoIGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgICBzdGFydFBhc3NpdmVFZmZlY3RUaW1lcigpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHMoZmlyc3RDaGlsZCkge1xuICBuZXh0RWZmZWN0ID0gZmlyc3RDaGlsZDtcbiAgY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzX2JlZ2luKCk7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19iZWdpbigpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gICAgaWYgKChuZXh0RWZmZWN0LmZsYWdzICYgQ2hpbGREZWxldGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHZhciBkZWxldGlvbnMgPSBmaWJlci5kZWxldGlvbnM7XG5cbiAgICAgIGlmIChkZWxldGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWxldGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgZmliZXJUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXJUb0RlbGV0ZTtcbiAgICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKGZpYmVyVG9EZWxldGUsIGZpYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBBIGZpYmVyIHdhcyBkZWxldGVkIGZyb20gdGhpcyBwYXJlbnQgZmliZXIsIGJ1dCBpdCdzIHN0aWxsIHBhcnQgb2ZcbiAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKGFsdGVybmF0ZSkgcGFyZW50IGZpYmVyJ3MgbGlzdCBvZiBjaGlsZHJlbi4gQmVjYXVzZVxuICAgICAgICAgIC8vIGNoaWxkcmVuIGFyZSBhIGxpbmtlZCBsaXN0LCBhbiBlYXJsaWVyIHNpYmxpbmcgdGhhdCdzIHN0aWxsIGFsaXZlXG4gICAgICAgICAgLy8gd2lsbCBiZSBjb25uZWN0ZWQgdG8gdGhlIGRlbGV0ZWQgZmliZXIgdmlhIGl0cyBgYWx0ZXJuYXRlYDpcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vICAgbGl2ZSBmaWJlclxuICAgICAgICAgIC8vICAgLS1hbHRlcm5hdGUtLT4gcHJldmlvdXMgbGl2ZSBmaWJlclxuICAgICAgICAgIC8vICAgLS1zaWJsaW5nLS0+IGRlbGV0ZWQgZmliZXJcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFdlIGNhbid0IGRpc2Nvbm5lY3QgYGFsdGVybmF0ZWAgb24gbm9kZXMgdGhhdCBoYXZlbid0IGJlZW4gZGVsZXRlZFxuICAgICAgICAgIC8vIHlldCwgYnV0IHdlIGNhbiBkaXNjb25uZWN0IHRoZSBgc2libGluZ2AgYW5kIGBjaGlsZGAgcG9pbnRlcnMuXG4gICAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGRldGFjaGVkQ2hpbGQgPSBwcmV2aW91c0ZpYmVyLmNoaWxkO1xuXG4gICAgICAgICAgICBpZiAoZGV0YWNoZWRDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBwcmV2aW91c0ZpYmVyLmNoaWxkID0gbnVsbDtcblxuICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgdmFyIGRldGFjaGVkU2libGluZyA9IGRldGFjaGVkQ2hpbGQuc2libGluZztcbiAgICAgICAgICAgICAgICBkZXRhY2hlZENoaWxkLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgIGRldGFjaGVkQ2hpbGQgPSBkZXRhY2hlZFNpYmxpbmc7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGRldGFjaGVkQ2hpbGQgIT09IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRFZmZlY3QgPSBmaWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoKGZpYmVyLnN1YnRyZWVGbGFncyAmIFBhc3NpdmVNYXNrKSAhPT0gTm9GbGFncyAmJiBjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c19jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNfY29tcGxldGUoKSB7XG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdDtcblxuICAgIGlmICgoZmliZXIuZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50T25GaWJlcihmaWJlcik7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgIG5leHRFZmZlY3QgPSBzaWJsaW5nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHRFZmZlY3QgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGlmICggZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICByZWNvcmRQYXNzaXZlRWZmZWN0RHVyYXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9iZWdpbihkZWxldGVkU3VidHJlZVJvb3QsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0OyAvLyBEZWxldGlvbiBlZmZlY3RzIGZpcmUgaW4gcGFyZW50IC0+IGNoaWxkIG9yZGVyXG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgZmliZXIgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnXG5cbiAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyKGZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkOyAvLyBUT0RPOiBPbmx5IHRyYXZlcnNlIHN1YnRyZWUgaWYgaXQgaGFzIGEgUGFzc2l2ZVN0YXRpYyBmbGFnLiAoQnV0LCBpZiB3ZVxuICAgIC8vIGRvIHRoaXMsIHN0aWxsIG5lZWQgdG8gaGFuZGxlIGBkZWxldGVkVHJlZUNsZWFuVXBMZXZlbGAgY29ycmVjdGx5LilcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgY2hpbGQucmV0dXJuID0gZmliZXI7XG4gICAgICBuZXh0RWZmZWN0ID0gY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfY29tcGxldGUoZGVsZXRlZFN1YnRyZWVSb290KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0UGFzc2l2ZVVubW91bnRFZmZlY3RzSW5zaWRlT2ZEZWxldGVkVHJlZV9jb21wbGV0ZShkZWxldGVkU3VidHJlZVJvb3QpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgZmliZXIgPSBuZXh0RWZmZWN0O1xuICAgIHZhciBzaWJsaW5nID0gZmliZXIuc2libGluZztcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBmaWJlci5yZXR1cm47XG5cbiAgICB7XG4gICAgICAvLyBSZWN1cnNpdmVseSB0cmF2ZXJzZSB0aGUgZW50aXJlIGRlbGV0ZWQgdHJlZSBhbmQgY2xlYW4gdXAgZmliZXIgZmllbGRzLlxuICAgICAgLy8gVGhpcyBpcyBtb3JlIGFnZ3Jlc3NpdmUgdGhhbiBpZGVhbCwgYW5kIHRoZSBsb25nIHRlcm0gZ29hbCBpcyB0byBvbmx5XG4gICAgICAvLyBoYXZlIHRvIGRldGFjaCB0aGUgZGVsZXRlZCB0cmVlIGF0IHRoZSByb290LlxuICAgICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZmliZXIpO1xuXG4gICAgICBpZiAoZmliZXIgPT09IGRlbGV0ZWRTdWJ0cmVlUm9vdCkge1xuICAgICAgICBuZXh0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzaWJsaW5nLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgbmV4dEVmZmVjdCA9IHNpYmxpbmc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IHJldHVybkZpYmVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFBhc3NpdmVVbm1vdW50SW5zaWRlRGVsZXRlZFRyZWVPbkZpYmVyKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgc3dpdGNoIChjdXJyZW50LnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCBjdXJyZW50Lm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAgIHN0YXJ0UGFzc2l2ZUVmZmVjdFRpbWVyKCk7XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFBhc3NpdmUkMSwgY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjb3JkUGFzc2l2ZUVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0VW5tb3VudChQYXNzaXZlJDEsIGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gIH1cbn0gLy8gVE9ETzogUmV1c2UgcmVhcHBlYXJMYXlvdXRFZmZlY3RzIHRyYXZlcnNhbCBoZXJlP1xuXG5cbmZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gcmUtY2hlY2sgU3RyaWN0RWZmZWN0c01vZGUgaGVyZS5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGlmIHRoYXQgY2hlY2sgaGFzIGFscmVhZHkgcGFzc2VkLlxuICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaWJlcik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VQYXNzaXZlRWZmZWN0TW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChQYXNzaXZlJDEgfCBIYXNFZmZlY3QsIGZpYmVyKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUxheW91dEVmZmVjdFVubW91bnRJbkRFVihmaWJlcikge1xuICB7XG4gICAgLy8gV2UgZG9uJ3QgbmVlZCB0byByZS1jaGVjayBTdHJpY3RFZmZlY3RzTW9kZSBoZXJlLlxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgaWYgdGhhdCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmliZXIsIGZpYmVyLnJldHVybik7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGZpYmVyLCBmaWJlci5yZXR1cm4sIGluc3RhbmNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VQYXNzaXZlRWZmZWN0VW5tb3VudEluREVWKGZpYmVyKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoUGFzc2l2ZSQxIHwgSGFzRWZmZWN0LCBmaWJlciwgZmliZXIucmV0dXJuKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmliZXIsIGZpYmVyLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgQ09NUE9ORU5UX1RZUEUgPSAwO1xudmFyIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IDE7XG52YXIgUk9MRV9UWVBFID0gMjtcbnZhciBURVNUX05BTUVfVFlQRSA9IDM7XG52YXIgVEVYVF9UWVBFID0gNDtcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcikge1xuICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgQ09NUE9ORU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmNvbXBvbmVudCcpO1xuICBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSBzeW1ib2xGb3IoJ3NlbGVjdG9yLmhhc19wc2V1ZG9fY2xhc3MnKTtcbiAgUk9MRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci5yb2xlJyk7XG4gIFRFU1RfTkFNRV9UWVBFID0gc3ltYm9sRm9yKCdzZWxlY3Rvci50ZXN0X2lkJyk7XG4gIFRFWFRfVFlQRSA9IHN5bWJvbEZvcignc2VsZWN0b3IudGV4dCcpO1xufVxudmFyIGNvbW1pdEhvb2tzID0gW107XG5mdW5jdGlvbiBvbkNvbW1pdFJvb3QkMSgpIHtcbiAge1xuICAgIGNvbW1pdEhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1pdEhvb2spIHtcbiAgICAgIHJldHVybiBjb21taXRIb29rKCk7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudEFjdFF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG5mdW5jdGlvbiBpc0xlZ2FjeUFjdEVudmlyb25tZW50KGZpYmVyKSB7XG4gIHtcbiAgICAvLyBMZWdhY3kgbW9kZS4gV2UgcHJlc2VydmUgdGhlIGJlaGF2aW9yIG9mIFJlYWN0IDE3J3MgYWN0LiBJdCBhc3N1bWVzIGFuXG4gICAgLy8gYWN0IGVudmlyb25tZW50IHdoZW5ldmVyIGBqZXN0YCBpcyBkZWZpbmVkLCBidXQgeW91IGNhbiBzdGlsbCB0dXJuIG9mZlxuICAgIC8vIHNwdXJpb3VzIHdhcm5pbmdzIGJ5IHNldHRpbmcgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UIGV4cGxpY2l0bHlcbiAgICAvLyB0byBmYWxzZS5cbiAgICB2YXIgaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsID0gLy8gJEZsb3dFeHBlY3RlZEVycm9yIFx1MjAxMyBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgZ2xvYmFsXG4gICAgdHlwZW9mIElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCAhPT0gJ3VuZGVmaW5lZCcgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlQgOiB1bmRlZmluZWQ7IC8vICRGbG93RXhwZWN0ZWRFcnJvciAtIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IGplc3RcblxuICAgIHZhciBqZXN0SXNEZWZpbmVkID0gdHlwZW9mIGplc3QgIT09ICd1bmRlZmluZWQnO1xuICAgIHJldHVybiAgamVzdElzRGVmaW5lZCAmJiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgIT09IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpIHtcbiAge1xuICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPSAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgXHUyMDEzIEZsb3cgZG9lc24ndCBrbm93IGFib3V0IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCBnbG9iYWxcbiAgICB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UICE9PSAndW5kZWZpbmVkJyA/IElTX1JFQUNUX0FDVF9FTlZJUk9OTUVOVCA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsICYmIFJlYWN0Q3VycmVudEFjdFF1ZXVlLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIFRPRE86IEluY2x1ZGUgbGluayB0byByZWxldmFudCBkb2N1bWVudGF0aW9uIHBhZ2UuXG4gICAgICBlcnJvcignVGhlIGN1cnJlbnQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBub3QgY29uZmlndXJlZCB0byBzdXBwb3J0ICcgKyAnYWN0KC4uLiknKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNSZWFjdEFjdEVudmlyb25tZW50R2xvYmFsO1xuICB9XG59XG5cbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgICBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50QWN0UXVldWU7XG52YXIgTm9Db250ZXh0ID1cbi8qICAgICAgICAgICAgICovXG4wO1xudmFyIEJhdGNoZWRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgUmVuZGVyQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBDb21taXRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICovXG40O1xudmFyIFJvb3RJblByb2dyZXNzID0gMDtcbnZhciBSb290RmF0YWxFcnJvcmVkID0gMTtcbnZhciBSb290RXJyb3JlZCA9IDI7XG52YXIgUm9vdFN1c3BlbmRlZCA9IDM7XG52YXIgUm9vdFN1c3BlbmRlZFdpdGhEZWxheSA9IDQ7XG52YXIgUm9vdENvbXBsZXRlZCA9IDU7XG52YXIgUm9vdERpZE5vdENvbXBsZXRlID0gNjsgLy8gRGVzY3JpYmVzIHdoZXJlIHdlIGFyZSBpbiB0aGUgUmVhY3QgZXhlY3V0aW9uIHN0YWNrXG5cbnZhciBleGVjdXRpb25Db250ZXh0ID0gTm9Db250ZXh0OyAvLyBUaGUgcm9vdCB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsOyAvLyBUaGUgZmliZXIgd2UncmUgd29ya2luZyBvblxuXG52YXIgd29ya0luUHJvZ3Jlc3MgPSBudWxsOyAvLyBUaGUgbGFuZXMgd2UncmUgcmVuZGVyaW5nXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7IC8vIFN0YWNrIHRoYXQgYWxsb3dzIGNvbXBvbmVudHMgdG8gY2hhbmdlIHRoZSByZW5kZXIgbGFuZXMgZm9yIGl0cyBzdWJ0cmVlXG4vLyBUaGlzIGlzIGEgc3VwZXJzZXQgb2YgdGhlIGxhbmVzIHdlIHN0YXJ0ZWQgd29ya2luZyBvbiBhdCB0aGUgcm9vdC4gVGhlIG9ubHlcbi8vIGNhc2Ugd2hlcmUgaXQncyBkaWZmZXJlbnQgZnJvbSBgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXNgIGlzIHdoZW4gd2Vcbi8vIGVudGVyIGEgc3VidHJlZSB0aGF0IGlzIGhpZGRlbiBhbmQgbmVlZHMgdG8gYmUgdW5oaWRkZW46IFN1c3BlbnNlIGFuZFxuLy8gT2Zmc2NyZWVuIGNvbXBvbmVudC5cbi8vXG4vLyBNb3N0IHRoaW5ncyBpbiB0aGUgd29yayBsb29wIHNob3VsZCBkZWFsIHdpdGggd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMuXG4vLyBNb3N0IHRoaW5ncyBpbiBiZWdpbi9jb21wbGV0ZSBwaGFzZXMgc2hvdWxkIGRlYWwgd2l0aCBzdWJ0cmVlUmVuZGVyTGFuZXMuXG5cbnZhciBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xudmFyIHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOb0xhbmVzKTsgLy8gV2hldGhlciB0byByb290IGNvbXBsZXRlZCwgZXJyb3JlZCwgc3VzcGVuZGVkLCBldGMuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7IC8vIEEgZmF0YWwgZXJyb3IsIGlmIG9uZSBpcyB0aHJvd25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsOyAvLyBcIkluY2x1ZGVkXCIgbGFuZXMgcmVmZXIgdG8gbGFuZXMgdGhhdCB3ZXJlIHdvcmtlZCBvbiBkdXJpbmcgdGhpcyByZW5kZXIuIEl0J3Ncbi8vIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIGByZW5kZXJMYW5lc2AgYmVjYXVzZSBgcmVuZGVyTGFuZXNgIGNhbiBjaGFuZ2UgYXMgeW91XG4vLyBlbnRlciBhbmQgZXhpdCBhbiBPZmZzY3JlZW4gdHJlZS4gVGhpcyB2YWx1ZSBpcyB0aGUgY29tYmluYXRpb24gb2YgYWxsIHJlbmRlclxuLy8gbGFuZXMgZm9yIHRoZSBlbnRpcmUgcmVuZGVyIHBoYXNlLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IE5vTGFuZXM7IC8vIFRoZSB3b3JrIGxlZnQgb3ZlciBieSBjb21wb25lbnRzIHRoYXQgd2VyZSB2aXNpdGVkIGR1cmluZyB0aGlzIHJlbmRlci4gT25seVxuLy8gaW5jbHVkZXMgdW5wcm9jZXNzZWQgdXBkYXRlcywgbm90IHdvcmsgaW4gYmFpbGVkIG91dCBjaGlsZHJlbi5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IE5vTGFuZXM7IC8vIExhbmVzIHRoYXQgd2VyZSB1cGRhdGVkIChpbiBhbiBpbnRlcmxlYXZlZCBldmVudCkgZHVyaW5nIHRoaXMgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSAoKm5vdCogYW4gaW50ZXJsZWF2ZWQgZXZlbnQpLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzOyAvLyBFcnJvcnMgdGhhdCBhcmUgdGhyb3duIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7IC8vIFRoZXNlIGFyZSBlcnJvcnMgdGhhdCB3ZSByZWNvdmVyZWQgZnJvbSB3aXRob3V0IHN1cmZhY2luZyB0aGVtIHRvIHRoZSBVSS5cbi8vIFdlIHdpbGwgbG9nIHRoZW0gb25jZSB0aGUgdHJlZSBjb21taXRzLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBudWxsOyAvLyBUaGUgbW9zdCByZWNlbnQgdGltZSB3ZSBjb21taXR0ZWQgYSBmYWxsYmFjay4gVGhpcyBsZXRzIHVzIGVuc3VyZSBhIHRyYWluXG4vLyBtb2RlbCB3aGVyZSB3ZSBkb24ndCBjb21taXQgbmV3IGxvYWRpbmcgc3RhdGVzIGluIHRvbyBxdWljayBzdWNjZXNzaW9uLlxuXG52YXIgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IDA7XG52YXIgRkFMTEJBQ0tfVEhST1RUTEVfTVMgPSA1MDA7IC8vIFRoZSBhYnNvbHV0ZSB0aW1lIGZvciB3aGVuIHdlIHNob3VsZCBzdGFydCBnaXZpbmcgdXAgb24gcmVuZGVyaW5nXG4vLyBtb3JlIGFuZCBwcmVmZXIgQ1BVIHN1c3BlbnNlIGhldXJpc3RpY3MgaW5zdGVhZC5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBJbmZpbml0eTsgLy8gSG93IGxvbmcgYSByZW5kZXIgaXMgc3VwcG9zZWQgdG8gdGFrZSBiZWZvcmUgd2Ugc3RhcnQgZm9sbG93aW5nIENQVVxuLy8gc3VzcGVuc2UgaGV1cmlzdGljcyBhbmQgb3B0IG91dCBvZiByZW5kZXJpbmcgbW9yZSBjb250ZW50LlxuXG52YXIgUkVOREVSX1RJTUVPVVRfTVMgPSA1MDA7XG52YXIgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlc2V0UmVuZGVyVGltZXIoKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBub3coKSArIFJFTkRFUl9USU1FT1VUX01TO1xufVxuXG5mdW5jdGlvbiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkge1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZTtcbn1cbnZhciBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG52YXIgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbnZhciBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGw7IC8vIE9ubHkgdXNlZCB3aGVuIGVuYWJsZVByb2ZpbGVyTmVzdGVkVXBkYXRlU2NoZWR1bGVkSG9vayBpcyB0cnVlO1xudmFyIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcbnZhciBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xudmFyIHBlbmRpbmdQYXNzaXZlVHJhbnNpdGlvbnMgPSBudWxsOyAvLyBVc2UgdGhlc2UgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIG5lc3RlZCB1cGRhdGVzXG5cbnZhciBORVNURURfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG52YXIgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCA9IDUwO1xudmFyIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG52YXIgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGw7IC8vIElmIHR3byB1cGRhdGVzIGFyZSBzY2hlZHVsZWQgd2l0aGluIHRoZSBzYW1lIGV2ZW50LCB3ZSBzaG91bGQgdHJlYXQgdGhlaXJcbi8vIGV2ZW50IHRpbWVzIGFzIHNpbXVsdGFuZW91cywgZXZlbiBpZiB0aGUgYWN0dWFsIGNsb2NrIHRpbWUgaGFzIGFkdmFuY2VkXG4vLyBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNhbGwuXG5cbnZhciBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG52YXIgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSBOb0xhbmVzO1xudmFyIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9IGZhbHNlO1xuZnVuY3Rpb24gZ2V0V29ya0luUHJvZ3Jlc3NSb290KCkge1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290O1xufVxuZnVuY3Rpb24gcmVxdWVzdEV2ZW50VGltZSgpIHtcbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIC8vIFdlJ3JlIGluc2lkZSBSZWFjdCwgc28gaXQncyBmaW5lIHRvIHJlYWQgdGhlIGFjdHVhbCB0aW1lLlxuICAgIHJldHVybiBub3coKTtcbiAgfSAvLyBXZSdyZSBub3QgaW5zaWRlIFJlYWN0LCBzbyB3ZSBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiBhIGJyb3dzZXIgZXZlbnQuXG5cblxuICBpZiAoY3VycmVudEV2ZW50VGltZSAhPT0gTm9UaW1lc3RhbXApIHtcbiAgICAvLyBVc2UgdGhlIHNhbWUgc3RhcnQgdGltZSBmb3IgYWxsIHVwZGF0ZXMgdW50aWwgd2UgZW50ZXIgUmVhY3QgYWdhaW4uXG4gICAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7XG4gIH0gLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlIHNpbmNlIFJlYWN0IHlpZWxkZWQuIENvbXB1dGUgYSBuZXcgc3RhcnQgdGltZS5cblxuXG4gIGN1cnJlbnRFdmVudFRpbWUgPSBub3coKTtcbiAgcmV0dXJuIGN1cnJlbnRFdmVudFRpbWU7XG59XG5mdW5jdGlvbiByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcikge1xuICAvLyBTcGVjaWFsIGNhc2VzXG4gIHZhciBtb2RlID0gZmliZXIubW9kZTtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICggKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgLy8gVGhpcyBpcyBhIHJlbmRlciBwaGFzZSB1cGRhdGUuIFRoZXNlIGFyZSBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQuIFRoZVxuICAgIC8vIG9sZCBiZWhhdmlvciBpcyB0byBnaXZlIHRoaXMgdGhlIHNhbWUgXCJ0aHJlYWRcIiAobGFuZXMpIGFzXG4gICAgLy8gd2hhdGV2ZXIgaXMgY3VycmVudGx5IHJlbmRlcmluZy4gU28gaWYgeW91IGNhbGwgYHNldFN0YXRlYCBvbiBhIGNvbXBvbmVudFxuICAgIC8vIHRoYXQgaGFwcGVucyBsYXRlciBpbiB0aGUgc2FtZSByZW5kZXIsIGl0IHdpbGwgZmx1c2guIElkZWFsbHksIHdlIHdhbnQgdG9cbiAgICAvLyByZW1vdmUgdGhlIHNwZWNpYWwgY2FzZSBhbmQgdHJlYXQgdGhlbSBhcyBpZiB0aGV5IGNhbWUgZnJvbSBhblxuICAgIC8vIGludGVybGVhdmVkIGV2ZW50LiBSZWdhcmRsZXNzLCB0aGlzIHBhdHRlcm4gaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkLlxuICAgIC8vIFRoaXMgYmVoYXZpb3IgaXMgb25seSBhIGZhbGxiYWNrLiBUaGUgZmxhZyBvbmx5IGV4aXN0cyB1bnRpbCB3ZSBjYW4gcm9sbFxuICAgIC8vIG91dCB0aGUgc2V0U3RhdGUgd2FybmluZywgc2luY2UgZXhpc3RpbmcgY29kZSBtaWdodCBhY2NpZGVudGFsbHkgcmVseSBvblxuICAgIC8vIHRoZSBjdXJyZW50IGJlaGF2aW9yLlxuICAgIHJldHVybiBwaWNrQXJiaXRyYXJ5TGFuZSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaXNUcmFuc2l0aW9uID0gcmVxdWVzdEN1cnJlbnRUcmFuc2l0aW9uKCkgIT09IE5vVHJhbnNpdGlvbjtcblxuICBpZiAoaXNUcmFuc2l0aW9uKSB7XG4gICAgaWYgKCBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gIT09IG51bGwpIHtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuXG4gICAgICBpZiAoIXRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMpIHtcbiAgICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyA9IG5ldyBTZXQoKTtcbiAgICAgIH1cblxuICAgICAgdHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5hZGQoZmliZXIpO1xuICAgIH0gLy8gVGhlIGFsZ29yaXRobSBmb3IgYXNzaWduaW5nIGFuIHVwZGF0ZSB0byBhIGxhbmUgc2hvdWxkIGJlIHN0YWJsZSBmb3IgYWxsXG4gICAgLy8gdXBkYXRlcyBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoaW4gdGhlIHNhbWUgZXZlbnQuIFRvIGRvIHRoaXMsIHRoZVxuICAgIC8vIGlucHV0cyB0byB0aGUgYWxnb3JpdGhtIG11c3QgYmUgdGhlIHNhbWUuXG4gICAgLy9cbiAgICAvLyBUaGUgdHJpY2sgd2UgdXNlIGlzIHRvIGNhY2hlIHRoZSBmaXJzdCBvZiBlYWNoIG9mIHRoZXNlIGlucHV0cyB3aXRoaW4gYW5cbiAgICAvLyBldmVudC4gVGhlbiByZXNldCB0aGUgY2FjaGVkIHZhbHVlcyBvbmNlIHdlIGNhbiBiZSBzdXJlIHRoZSBldmVudCBpc1xuICAgIC8vIG92ZXIuIE91ciBoZXVyaXN0aWMgZm9yIHRoYXQgaXMgd2hlbmV2ZXIgd2UgZW50ZXIgYSBjb25jdXJyZW50IHdvcmsgbG9vcC5cblxuXG4gICAgaWYgKGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lID09PSBOb0xhbmUpIHtcbiAgICAgIC8vIEFsbCB0cmFuc2l0aW9ucyB3aXRoaW4gdGhlIHNhbWUgZXZlbnQgYXJlIGFzc2lnbmVkIHRoZSBzYW1lIGxhbmUuXG4gICAgICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IGNsYWltTmV4dFRyYW5zaXRpb25MYW5lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lO1xuICB9IC8vIFVwZGF0ZXMgb3JpZ2luYXRpbmcgaW5zaWRlIGNlcnRhaW4gUmVhY3QgbWV0aG9kcywgbGlrZSBmbHVzaFN5bmMsIGhhdmVcbiAgLy8gdGhlaXIgcHJpb3JpdHkgc2V0IGJ5IHRyYWNraW5nIGl0IHdpdGggYSBjb250ZXh0IHZhcmlhYmxlLlxuICAvL1xuICAvLyBUaGUgb3BhcXVlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGhvc3QgY29uZmlnIGlzIGludGVybmFsbHkgYSBsYW5lLCBzbyB3ZSBjYW5cbiAgLy8gdXNlIHRoYXQgZGlyZWN0bHkuXG4gIC8vIFRPRE86IE1vdmUgdGhpcyB0eXBlIGNvbnZlcnNpb24gdG8gdGhlIGV2ZW50IHByaW9yaXR5IG1vZHVsZS5cblxuXG4gIHZhciB1cGRhdGVMYW5lID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgaWYgKHVwZGF0ZUxhbmUgIT09IE5vTGFuZSkge1xuICAgIHJldHVybiB1cGRhdGVMYW5lO1xuICB9IC8vIFRoaXMgdXBkYXRlIG9yaWdpbmF0ZWQgb3V0c2lkZSBSZWFjdC4gQXNrIHRoZSBob3N0IGVudmlyb25tZW50IGZvciBhblxuICAvLyBhcHByb3ByaWF0ZSBwcmlvcml0eSwgYmFzZWQgb24gdGhlIHR5cGUgb2YgZXZlbnQuXG4gIC8vXG4gIC8vIFRoZSBvcGFxdWUgdHlwZSByZXR1cm5lZCBieSB0aGUgaG9zdCBjb25maWcgaXMgaW50ZXJuYWxseSBhIGxhbmUsIHNvIHdlIGNhblxuICAvLyB1c2UgdGhhdCBkaXJlY3RseS5cbiAgLy8gVE9ETzogTW92ZSB0aGlzIHR5cGUgY29udmVyc2lvbiB0byB0aGUgZXZlbnQgcHJpb3JpdHkgbW9kdWxlLlxuXG5cbiAgdmFyIGV2ZW50TGFuZSA9IGdldEN1cnJlbnRFdmVudFByaW9yaXR5KCk7XG4gIHJldHVybiBldmVudExhbmU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RSZXRyeUxhbmUoZmliZXIpIHtcbiAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgYHJlcXVlc3RVcGRhdGVMYW5lYCBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIFN1c3BlbnNlXG4gIC8vIFwicmV0cmllc1wiIFx1MjAxNCBhIHNwZWNpYWwgdXBkYXRlIHRoYXQgYXR0ZW1wdHMgdG8gZmxpcCBhIFN1c3BlbnNlIGJvdW5kYXJ5XG4gIC8vIGZyb20gaXRzIHBsYWNlaG9sZGVyIHN0YXRlIHRvIGl0cyBwcmltYXJ5L3Jlc29sdmVkIHN0YXRlLlxuICAvLyBTcGVjaWFsIGNhc2VzXG4gIHZhciBtb2RlID0gZmliZXIubW9kZTtcblxuICBpZiAoKG1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfVxuXG4gIHJldHVybiBjbGFpbU5leHRSZXRyeUxhbmUoKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpIHtcbiAgY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCk7XG5cbiAge1xuICAgIGlmIChpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QpIHtcbiAgICAgIGVycm9yKCd1c2VJbnNlcnRpb25FZmZlY3QgbXVzdCBub3Qgc2NoZWR1bGUgdXBkYXRlcy4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmIChpc0ZsdXNoaW5nUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIH1cbiAgfSAvLyBNYXJrIHRoYXQgdGhlIHJvb3QgaGFzIGEgcGVuZGluZyB1cGRhdGUuXG5cblxuICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgbGFuZSwgZXZlbnRUaW1lKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9MYW5lcyAmJiByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBUaGlzIHVwZGF0ZSB3YXMgZGlzcGF0Y2hlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS4gVGhpcyBpcyBhIG1pc3Rha2VcbiAgICAvLyBpZiB0aGUgdXBkYXRlIG9yaWdpbmF0ZXMgZnJvbSB1c2VyIHNwYWNlICh3aXRoIHRoZSBleGNlcHRpb24gb2YgbG9jYWxcbiAgICAvLyBob29rIHVwZGF0ZXMsIHdoaWNoIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5IGFuZCBkb24ndCByZWFjaCB0aGlzXG4gICAgLy8gZnVuY3Rpb24pLCBidXQgdGhlcmUgYXJlIHNvbWUgaW50ZXJuYWwgUmVhY3QgZmVhdHVyZXMgdGhhdCB1c2UgdGhpcyBhc1xuICAgIC8vIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbGlrZSBzZWxlY3RpdmUgaHlkcmF0aW9uLlxuICAgIHdhcm5BYm91dFJlbmRlclBoYXNlVXBkYXRlc0luREVWKGZpYmVyKTsgLy8gVHJhY2sgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2VcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGEgbm9ybWFsIHVwZGF0ZSwgc2NoZWR1bGVkIGZyb20gb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLiBGb3JcbiAgICAvLyBleGFtcGxlLCBkdXJpbmcgYW4gaW5wdXQgZXZlbnQuXG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKTtcblxuICAgIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAgIC8vIFRPRE86IENvbnNvbGlkYXRlIHdpdGggYGlzSW50ZXJsZWF2ZWRVcGRhdGVgIGNoZWNrXG4gICAgICAvLyBSZWNlaXZlZCBhbiB1cGRhdGUgdG8gYSB0cmVlIHRoYXQncyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlcmluZy4gTWFya1xuICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlXG4gICAgICAvLyBgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoYCBmbGFnIGlzIG9mZiBhbmQgdGhpcyBpcyBhIHJlbmRlclxuICAgICAgLy8gcGhhc2UgdXBkYXRlLiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHRyZWF0IHJlbmRlciBwaGFzZSB1cGRhdGVzIGFzIGlmXG4gICAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuXG4gICAgICBpZiAoIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290SW50ZXJsZWF2ZWRVcGRhdGVkTGFuZXMsIGxhbmUpO1xuICAgICAgfVxuXG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSkge1xuICAgICAgICAvLyBUaGUgcm9vdCBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHdoaWNoIG1lYW5zIHRoaXMgcmVuZGVyXG4gICAgICAgIC8vIGRlZmluaXRlbHkgd29uJ3QgZmluaXNoLiBTaW5jZSB3ZSBoYXZlIGEgbmV3IHVwZGF0ZSwgbGV0J3MgbWFyayBpdCBhc1xuICAgICAgICAvLyBzdXNwZW5kZWQgbm93LCByaWdodCBiZWZvcmUgbWFya2luZyB0aGUgaW5jb21pbmcgdXBkYXRlLiBUaGlzIGhhcyB0aGVcbiAgICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCByZW5kZXIgYW5kIHN3aXRjaGluZyB0byB0aGUgdXBkYXRlLlxuICAgICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IG92ZXJyaWRlIHBpbmdzIHRoYXQgaGFwcGVuIHdoaWxlIHdlJ3ZlXG4gICAgICAgIC8vIGFscmVhZHkgc3RhcnRlZCByZW5kZXJpbmcuXG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuXG4gICAgaWYgKGxhbmUgPT09IFN5bmNMYW5lICYmIGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCAmJiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgLy8gRmx1c2ggdGhlIHN5bmNocm9ub3VzIHdvcmsgbm93LCB1bmxlc3Mgd2UncmUgYWxyZWFkeSB3b3JraW5nIG9yIGluc2lkZVxuICAgICAgLy8gYSBiYXRjaC4gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGluc2lkZSBzY2hlZHVsZVVwZGF0ZU9uRmliZXIgaW5zdGVhZCBvZlxuICAgICAgLy8gc2NoZWR1bGVDYWxsYmFja0ZvckZpYmVyIHRvIHByZXNlcnZlIHRoZSBhYmlsaXR5IHRvIHNjaGVkdWxlIGEgY2FsbGJhY2tcbiAgICAgIC8vIHdpdGhvdXQgaW1tZWRpYXRlbHkgZmx1c2hpbmcgaXQuIFdlIG9ubHkgZG8gdGhpcyBmb3IgdXNlci1pbml0aWF0ZWRcbiAgICAgIC8vIHVwZGF0ZXMsIHRvIHByZXNlcnZlIGhpc3RvcmljYWwgYmVoYXZpb3Igb2YgbGVnYWN5IG1vZGUuXG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3NPbmx5SW5MZWdhY3lNb2RlKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5mdW5jdGlvbiBzY2hlZHVsZUluaXRpYWxIeWRyYXRpb25PblJvb3Qocm9vdCwgbGFuZSwgZXZlbnRUaW1lKSB7XG4gIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGZvcmsgb2Ygc2NoZWR1bGVVcGRhdGVPbkZpYmVyIHRoYXQgaXMgb25seSB1c2VkIHRvXG4gIC8vIHNjaGVkdWxlIHRoZSBpbml0aWFsIGh5ZHJhdGlvbiBvZiBhIHJvb3QgdGhhdCBoYXMganVzdCBiZWVuIGNyZWF0ZWQuIE1vc3RcbiAgLy8gb2YgdGhlIHN0dWZmIGluIHNjaGVkdWxlVXBkYXRlT25GaWJlciBjYW4gYmUgc2tpcHBlZC5cbiAgLy9cbiAgLy8gVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIHNlcGFyYXRlIHBhdGgsIHRob3VnaCwgaXMgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gIC8vIGluaXRpYWwgY2hpbGRyZW4gZnJvbSBzdWJzZXF1ZW50IHVwZGF0ZXMuIEluIGZ1bGx5IGNsaWVudC1yZW5kZXJlZCByb290c1xuICAvLyAoY3JlYXRlUm9vdCBpbnN0ZWFkIG9mIGh5ZHJhdGVSb290KSwgYWxsIHRvcC1sZXZlbCByZW5kZXJzIGFyZSBtb2RlbGVkIGFzXG4gIC8vIHVwZGF0ZXMsIGJ1dCBoeWRyYXRpb24gcm9vdHMgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGUgaW5pdGlhbCByZW5kZXIgbXVzdFxuICAvLyBtYXRjaCB3aGF0IHdhcyByZW5kZXJlZCBvbiB0aGUgc2VydmVyLlxuICB2YXIgY3VycmVudCA9IHJvb3QuY3VycmVudDtcbiAgY3VycmVudC5sYW5lcyA9IGxhbmU7XG4gIG1hcmtSb290VXBkYXRlZChyb290LCBsYW5lLCBldmVudFRpbWUpO1xuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn0gLy8gVGhpcyBpcyBzcGxpdCBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gd2UgY2FuIG1hcmsgYSBmaWJlciB3aXRoIHBlbmRpbmdcbi8vIHdvcmsgd2l0aG91dCB0cmVhdGluZyBpdCBhcyBhIHR5cGljYWwgdXBkYXRlIHRoYXQgb3JpZ2luYXRlcyBmcm9tIGFuIGV2ZW50O1xuLy8gZS5nLiByZXRyeWluZyBhIFN1c3BlbnNlIGJvdW5kYXJ5IGlzbid0IGFuIHVwZGF0ZSwgYnV0IGl0IGRvZXMgc2NoZWR1bGUgd29ya1xuLy8gb24gYSBmaWJlci5cblxuZnVuY3Rpb24gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Qoc291cmNlRmliZXIsIGxhbmUpIHtcbiAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgZmliZXIncyBsYW5lc1xuICBzb3VyY2VGaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoc291cmNlRmliZXIubGFuZXMsIGxhbmUpO1xuICB2YXIgYWx0ZXJuYXRlID0gc291cmNlRmliZXIuYWx0ZXJuYXRlO1xuXG4gIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICBhbHRlcm5hdGUubGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5sYW5lcywgbGFuZSk7XG4gIH1cblxuICB7XG4gICAgaWYgKGFsdGVybmF0ZSA9PT0gbnVsbCAmJiAoc291cmNlRmliZXIuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgIH1cbiAgfSAvLyBXYWxrIHRoZSBwYXJlbnQgcGF0aCB0byB0aGUgcm9vdCBhbmQgdXBkYXRlIHRoZSBjaGlsZCBsYW5lcy5cblxuXG4gIHZhciBub2RlID0gc291cmNlRmliZXI7XG4gIHZhciBwYXJlbnQgPSBzb3VyY2VGaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIHBhcmVudC5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhwYXJlbnQuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgYWx0ZXJuYXRlID0gcGFyZW50LmFsdGVybmF0ZTtcblxuICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgbGFuZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKChwYXJlbnQuZmxhZ3MgJiAoUGxhY2VtZW50IHwgSHlkcmF0aW5nKSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgfVxuXG4gIGlmIChub2RlLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICB2YXIgcm9vdCA9IG5vZGUuc3RhdGVOb2RlO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJsZWF2ZWRVcGRhdGUoZmliZXIsIGxhbmUpIHtcbiAgcmV0dXJuICgvLyBUT0RPOiBPcHRpbWl6ZSBzbGlnaHRseSBieSBjb21wYXJpbmcgdG8gcm9vdCB0aGF0IGZpYmVyIGJlbG9uZ3MgdG8uXG4gICAgLy8gUmVxdWlyZXMgc29tZSByZWZhY3RvcmluZy4gTm90IGEgYmlnIGRlYWwgdGhvdWdoIHNpbmNlIGl0J3MgcmFyZSBmb3JcbiAgICAvLyBjb25jdXJyZW50IGFwcHMgdG8gaGF2ZSBtb3JlIHRoYW4gYSBzaW5nbGUgcm9vdC5cbiAgICAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsIHx8IC8vIElmIHRoZSBpbnRlcmxlYXZlZCB1cGRhdGVzIHF1ZXVlIGhhc24ndCBiZWVuIGNsZWFyZWQgeWV0LCB0aGVuXG4gICAgLy8gd2Ugc2hvdWxkIHRyZWF0IHRoaXMgYXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlLCB0b28uIFRoaXMgaXMgYWxzbyBhXG4gICAgLy8gZGVmZW5zaXZlIGNvZGluZyBtZWFzdXJlIGluIGNhc2UgYSBuZXcgdXBkYXRlIGNvbWVzIGluIGJldHdlZW4gd2hlblxuICAgIC8vIHJlbmRlcmluZyBoYXMgZmluaXNoZWQgYW5kIHdoZW4gdGhlIGludGVybGVhdmVkIHVwZGF0ZXMgYXJlIHRyYW5zZmVycmVkXG4gICAgLy8gdG8gdGhlIG1haW4gcXVldWUuXG4gICAgaGFzSW50ZXJsZWF2ZWRVcGRhdGVzKCkpICYmIChmaWJlci5tb2RlICYgQ29uY3VycmVudE1vZGUpICE9PSBOb01vZGUgJiYgKCAvLyBJZiB0aGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZSAoaS5lLiBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyksXG4gICAgLy8gdGhlbiBkb24ndCB0cmVhdCB0aGlzIGFzIGFuIGludGVybGVhdmVkIHVwZGF0ZS4gVGhpcyBwYXR0ZXJuIGlzXG4gICAgLy8gYWNjb21wYW5pZWQgYnkgYSB3YXJuaW5nIGJ1dCB3ZSBoYXZlbid0IGZ1bGx5IGRlcHJlY2F0ZWQgaXQgeWV0LiBXZSBjYW5cbiAgICAvLyByZW1vdmUgb25jZSB0aGUgZGVmZXJSZW5kZXJQaGFzZVVwZGF0ZVRvTmV4dEJhdGNoIGZsYWcgaXMgZW5hYmxlZC5cbiAgICAgKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSA9PT0gTm9Db250ZXh0KVxuICApO1xufSAvLyBVc2UgdGhpcyBmdW5jdGlvbiB0byBzY2hlZHVsZSBhIHRhc2sgZm9yIGEgcm9vdC4gVGhlcmUncyBvbmx5IG9uZSB0YXNrIHBlclxuLy8gcm9vdDsgaWYgYSB0YXNrIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCwgd2UnbGwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBwcmlvcml0eVxuLy8gb2YgdGhlIGV4aXN0aW5nIHRhc2sgaXMgdGhlIHNhbWUgYXMgdGhlIHByaW9yaXR5IG9mIHRoZSBuZXh0IGxldmVsIHRoYXQgdGhlXG4vLyByb290IGhhcyB3b3JrIG9uLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBldmVyeSB1cGRhdGUsIGFuZCByaWdodCBiZWZvcmVcbi8vIGV4aXRpbmcgYSB0YXNrLlxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IFRoZXJlJ3Mgbm90aGluZyB0byB3b3JrIG9uLlxuICAgIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgfVxuXG4gICAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZTtcbiAgICByZXR1cm47XG4gIH0gLy8gV2UgdXNlIHRoZSBoaWdoZXN0IHByaW9yaXR5IGxhbmUgdG8gcmVwcmVzZW50IHRoZSBwcmlvcml0eSBvZiB0aGUgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobmV4dExhbmVzKTsgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuICB2YXIgZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID0gcm9vdC5jYWxsYmFja1ByaW9yaXR5O1xuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPT09IG5ld0NhbGxiYWNrUHJpb3JpdHkgJiYgLy8gU3BlY2lhbCBjYXNlIHJlbGF0ZWQgdG8gYGFjdGAuIElmIHRoZSBjdXJyZW50bHkgc2NoZWR1bGVkIHRhc2sgaXMgYVxuICAvLyBTY2hlZHVsZXIgdGFzaywgcmF0aGVyIHRoYW4gYW4gYGFjdGAgdGFzaywgY2FuY2VsIGl0IGFuZCByZS1zY2hlZHVsZWRcbiAgLy8gb24gdGhlIGBhY3RgIHF1ZXVlLlxuICAhKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmN1cnJlbnQgIT09IG51bGwgJiYgZXhpc3RpbmdDYWxsYmFja05vZGUgIT09IGZha2VBY3RDYWxsYmFja05vZGUpKSB7XG4gICAge1xuICAgICAgLy8gSWYgd2UncmUgZ29pbmcgdG8gcmUtdXNlIGFuIGV4aXN0aW5nIHRhc2ssIGl0IG5lZWRzIHRvIGV4aXN0LlxuICAgICAgLy8gQXNzdW1lIHRoYXQgZGlzY3JldGUgdXBkYXRlIG1pY3JvdGFza3MgYXJlIG5vbi1jYW5jZWxsYWJsZSBhbmQgbnVsbC5cbiAgICAgIC8vIFRPRE86IFRlbXBvcmFyeSB1bnRpbCB3ZSBjb25maXJtIHRoaXMgd2FybmluZyBpcyBub3QgZmlyZWQuXG4gICAgICBpZiAoZXhpc3RpbmdDYWxsYmFja05vZGUgPT0gbnVsbCAmJiBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgIT09IFN5bmNMYW5lKSB7XG4gICAgICAgIGVycm9yKCdFeHBlY3RlZCBzY2hlZHVsZWQgY2FsbGJhY2sgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cblxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9IG51bGwpIHtcbiAgICAvLyBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ldyBvbmUgYmVsb3cuXG4gICAgY2FuY2VsQ2FsbGJhY2skMShleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gIH0gLy8gU2NoZWR1bGUgYSBuZXcgY2FsbGJhY2suXG5cblxuICB2YXIgbmV3Q2FsbGJhY2tOb2RlO1xuXG4gIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jTGFuZSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIGlmIChyb290LnRhZyA9PT0gTGVnYWN5Um9vdCkge1xuICAgICAgaWYgKCBSZWFjdEN1cnJlbnRBY3RRdWV1ZSQxLmlzQmF0Y2hpbmdMZWdhY3kgIT09IG51bGwpIHtcbiAgICAgICAgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5kaWRTY2hlZHVsZUxlZ2FjeVVwZGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlTGVnYWN5U3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTeW5jQ2FsbGJhY2socGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBxdWV1ZSBpbiBhIG1pY3JvdGFzay5cbiAgICAgIGlmICggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEluc2lkZSBgYWN0YCwgdXNlIG91ciBpbnRlcm5hbCBgYWN0YCBxdWV1ZSBzbyB0aGF0IHRoZXNlIGdldCBmbHVzaGVkXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2NvcGUgZXZlbiB3aGVuIHVzaW5nIHRoZSBzeW5jIHZlcnNpb25cbiAgICAgICAgLy8gb2YgYGFjdGAuXG4gICAgICAgIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudC5wdXNoKGZsdXNoU3luY0NhbGxiYWNrcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlZHVsZU1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gSW4gU2FmYXJpLCBhcHBlbmRpbmcgYW4gaWZyYW1lIGZvcmNlcyBtaWNyb3Rhc2tzIHRvIHJ1bi5cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzIyNDU5XG4gICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBydW5uaW5nIGNhbGxiYWNrcyBpbiB0aGUgbWlkZGxlIG9mIHJlbmRlclxuICAgICAgICAgIC8vIG9yIGNvbW1pdCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QgdGhhdC5cbiAgICAgICAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0KSB7XG4gICAgICAgICAgICAvLyBJdCdzIG9ubHkgc2FmZSB0byBkbyB0aGlzIGNvbmRpdGlvbmFsbHkgYmVjYXVzZSB3ZSBhbHdheXNcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBwZW5kaW5nIHdvcmsgYmVmb3JlIHdlIGV4aXQgdGhlIHRhc2suXG4gICAgICAgICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNjaGVkdWxlclByaW9yaXR5TGV2ZWw7XG5cbiAgICBzd2l0Y2ggKGxhbmVzVG9FdmVudFByaW9yaXR5KG5leHRMYW5lcykpIHtcbiAgICAgIGNhc2UgRGlzY3JldGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSW1tZWRpYXRlUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gSWRsZVByaW9yaXR5O1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrJDEoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCwgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICB9XG5cbiAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gbmV3Q2FsbGJhY2tQcmlvcml0eTtcbiAgcm9vdC5jYWxsYmFja05vZGUgPSBuZXdDYWxsYmFja05vZGU7XG59IC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IGZvciBldmVyeSBjb25jdXJyZW50IHRhc2ssIGkuZS4gYW55dGhpbmcgdGhhdFxuLy8gZ29lcyB0aHJvdWdoIFNjaGVkdWxlci5cblxuXG5mdW5jdGlvbiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3Qocm9vdCwgZGlkVGltZW91dCkge1xuICB7XG4gICAgcmVzZXROZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH0gLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnRcbiAgLy8gZXZlbnQgdGltZS4gVGhlIG5leHQgdXBkYXRlIHdpbGwgY29tcHV0ZSBhIG5ldyBldmVudCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IE5vTGFuZXM7XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuJyk7XG4gIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLFxuICAvLyBpbiBjYXNlIHRoZXkgc2NoZWR1bGUgYWRkaXRpb25hbCB3b3JrLlxuXG5cbiAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7XG4gIHZhciBkaWRGbHVzaFBhc3NpdmVFZmZlY3RzID0gZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuXG4gIGlmIChkaWRGbHVzaFBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoZSBwYXNzaXZlIGVmZmVjdCBwaGFzZSBtYXkgaGF2ZSBjYW5jZWxlZCB0aGUgY3VycmVudCB0YXNrLlxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC5cbiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgIT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0YXNrIHdhcyBjYW5jZWxlZC4gRXhpdC4gV2UgZG9uJ3QgbmVlZCB0byBjYWxsXG4gICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0XG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IHRhc2ssIG9yIHRoYXQgdGhlcmUncyBubyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGxhbmVzIHRvIHdvcmsgb24sIHVzaW5nIHRoZSBmaWVsZHMgc3RvcmVkXG4gIC8vIG9uIHRoZSByb290LlxuXG5cbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzIDogTm9MYW5lcyk7XG5cbiAgaWYgKGxhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gRGVmZW5zaXZlIGNvZGluZy4gVGhpcyBpcyBuZXZlciBleHBlY3RlZCB0byBoYXBwZW4uXG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gV2UgZGlzYWJsZSB0aW1lLXNsaWNpbmcgaW4gc29tZSBjYXNlczogaWYgdGhlIHdvcmsgaGFzIGJlZW4gQ1BVLWJvdW5kXG4gIC8vIGZvciB0b28gbG9uZyAoXCJleHBpcmVkXCIgd29yaywgdG8gcHJldmVudCBzdGFydmF0aW9uKSwgb3Igd2UncmUgaW5cbiAgLy8gc3luYy11cGRhdGVzLWJ5LWRlZmF1bHQgbW9kZS5cbiAgLy8gVE9ETzogV2Ugb25seSBjaGVjayBgZGlkVGltZW91dGAgZGVmZW5zaXZlbHksIHRvIGFjY291bnQgZm9yIGEgU2NoZWR1bGVyXG4gIC8vIGJ1ZyB3ZSdyZSBzdGlsbCBpbnZlc3RpZ2F0aW5nLiBPbmNlIHRoZSBidWcgaW4gU2NoZWR1bGVyIGlzIGZpeGVkLFxuICAvLyB3ZSBjYW4gcmVtb3ZlIHRoaXMsIHNpbmNlIHdlIHRyYWNrIGV4cGlyYXRpb24gb3Vyc2VsdmVzLlxuXG5cbiAgdmFyIHNob3VsZFRpbWVTbGljZSA9ICFpbmNsdWRlc0Jsb2NraW5nTGFuZShyb290LCBsYW5lcykgJiYgIWluY2x1ZGVzRXhwaXJlZExhbmUocm9vdCwgbGFuZXMpICYmICggIWRpZFRpbWVvdXQpO1xuICB2YXIgZXhpdFN0YXR1cyA9IHNob3VsZFRpbWVTbGljZSA/IHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSA6IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEluUHJvZ3Jlc3MpIHtcbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbFxuICAgICAgLy8gcmVuZGVyIHN5bmNocm9ub3VzbHkgdG8gYmxvY2sgY29uY3VycmVudCBkYXRhIG11dGF0aW9ucywgYW5kIHdlJ2xsXG4gICAgICAvLyBpbmNsdWRlcyBhbGwgcGVuZGluZyB1cGRhdGVzIGFyZSBpbmNsdWRlZC4gSWYgaXQgc3RpbGwgZmFpbHMgYWZ0ZXJcbiAgICAgIC8vIHRoZSBzZWNvbmQgYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgaWYgKGVycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIGVycm9yUmV0cnlMYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdERpZE5vdENvbXBsZXRlKSB7XG4gICAgICAvLyBUaGUgcmVuZGVyIHVud291bmQgd2l0aG91dCBjb21wbGV0aW5nIHRoZSB0cmVlLiBUaGlzIGhhcHBlbnMgaW4gc3BlY2lhbFxuICAgICAgLy8gY2FzZXMgd2hlcmUgbmVlZCB0byBleGl0IHRoZSBjdXJyZW50IHJlbmRlciB3aXRob3V0IHByb2R1Y2luZyBhXG4gICAgICAvLyBjb25zaXN0ZW50IHRyZWUgb3IgY29tbWl0dGluZy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBkdXJpbmcgYSBjb25jdXJyZW50IHJlbmRlciwgbm90IGEgZGlzY3JldGUgb3JcbiAgICAgIC8vIHN5bmNocm9ub3VzIHVwZGF0ZS4gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIGZvciB0aGlzIHdoZW4gd2VcbiAgICAgIC8vIHVud291bmQgdGhlIHN0YWNrLlxuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZW5kZXIgY29tcGxldGVkLlxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyByZW5kZXIgbWF5IGhhdmUgeWllbGRlZCB0byBhIGNvbmN1cnJlbnQgZXZlbnQsIGFuZCBpZiBzbyxcbiAgICAgIC8vIGNvbmZpcm0gdGhhdCBhbnkgbmV3bHkgcmVuZGVyZWQgc3RvcmVzIGFyZSBjb25zaXN0ZW50LlxuICAgICAgLy8gVE9ETzogSXQncyBwb3NzaWJsZSB0aGF0IGV2ZW4gYSBjb25jdXJyZW50IHJlbmRlciBtYXkgbmV2ZXIgaGF2ZSB5aWVsZGVkXG4gICAgICAvLyB0byB0aGUgbWFpbiB0aHJlYWQsIGlmIGl0IHdhcyBmYXN0IGVub3VnaCwgb3IgaWYgaXQgZXhwaXJlZC4gV2UgY291bGRcbiAgICAgIC8vIHNraXAgdGhlIGNvbnNpc3RlbmN5IGNoZWNrIGluIHRoYXQgY2FzZSwgdG9vLlxuICAgICAgdmFyIHJlbmRlcldhc0NvbmN1cnJlbnQgPSAhaW5jbHVkZXNCbG9ja2luZ0xhbmUocm9vdCwgbGFuZXMpO1xuICAgICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChyZW5kZXJXYXNDb25jdXJyZW50ICYmICFpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSkge1xuICAgICAgICAvLyBBIHN0b3JlIHdhcyBtdXRhdGVkIGluIGFuIGludGVybGVhdmVkIGV2ZW50LiBSZW5kZXIgYWdhaW4sXG4gICAgICAgIC8vIHN5bmNocm9ub3VzbHksIHRvIGJsb2NrIGZ1cnRoZXIgbXV0YXRpb25zLlxuICAgICAgICBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpOyAvLyBXZSBuZWVkIHRvIGNoZWNrIGFnYWluIGlmIHNvbWV0aGluZyB0aHJld1xuXG4gICAgICAgIGlmIChleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICAgICAgICBpZiAoX2Vycm9yUmV0cnlMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgbGFuZXMgPSBfZXJyb3JSZXRyeUxhbmVzO1xuICAgICAgICAgICAgZXhpdFN0YXR1cyA9IHJlY292ZXJGcm9tQ29uY3VycmVudEVycm9yKHJvb3QsIF9lcnJvclJldHJ5TGFuZXMpOyAvLyBXZSBhc3N1bWUgdGhlIHRyZWUgaXMgbm93IGNvbnNpc3RlbnQgYmVjYXVzZSB3ZSBkaWRuJ3QgeWllbGQgdG8gYW55XG4gICAgICAgICAgICAvLyBjb25jdXJyZW50IGV2ZW50cy5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgICAgIHZhciBfZmF0YWxFcnJvciA9IHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3I7XG4gICAgICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICAgICAgICB0aHJvdyBfZmF0YWxFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gVGhlIG5leHQgc3RlcCBpcyBlaXRoZXIgdG8gY29tbWl0IGl0LFxuICAgICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC5cblxuXG4gICAgICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgICAgIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICAgICAgZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcblxuICBpZiAocm9vdC5jYWxsYmFja05vZGUgPT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgLy8gVGhlIHRhc2sgbm9kZSBzY2hlZHVsZWQgZm9yIHRoaXMgcm9vdCBpcyB0aGUgc2FtZSBvbmUgdGhhdCdzXG4gICAgLy8gY3VycmVudGx5IGV4ZWN1dGVkLiBOZWVkIHRvIHJldHVybiBhIGNvbnRpbnVhdGlvbi5cbiAgICByZXR1cm4gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVjb3ZlckZyb21Db25jdXJyZW50RXJyb3Iocm9vdCwgZXJyb3JSZXRyeUxhbmVzKSB7XG4gIC8vIElmIGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBoeWRyYXRpb24sIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsXG4gIC8vIGJhY2sgdG8gY2xpZW50IHNpZGUgcmVuZGVyLlxuICAvLyBCZWZvcmUgcmVuZGVyaW5nIGFnYWluLCBzYXZlIHRoZSBlcnJvcnMgZnJvbSB0aGUgcHJldmlvdXMgYXR0ZW1wdC5cbiAgdmFyIGVycm9yc0Zyb21GaXJzdEF0dGVtcHQgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzO1xuXG4gIGlmIChpc1Jvb3REZWh5ZHJhdGVkKHJvb3QpKSB7XG4gICAgLy8gVGhlIHNoZWxsIGZhaWxlZCB0byBoeWRyYXRlLiBTZXQgYSBmbGFnIHRvIGZvcmNlIGEgY2xpZW50IHJlbmRlcmluZ1xuICAgIC8vIGR1cmluZyB0aGUgbmV4dCBhdHRlbXB0LiBUbyBkbyB0aGlzLCB3ZSBjYWxsIHByZXBhcmVGcmVzaFN0YWNrIG5vd1xuICAgIC8vIHRvIGNyZWF0ZSB0aGUgcm9vdCB3b3JrLWluLXByb2dyZXNzIGZpYmVyLiBUaGlzIGlzIGEgYml0IHdlaXJkIGluIHRlcm1zXG4gICAgLy8gb2YgZmFjdG9yaW5nLCBiZWNhdXNlIGl0IHJlbGllcyBvbiByZW5kZXJSb290U3luYyBub3QgY2FsbGluZ1xuICAgIC8vIHByZXBhcmVGcmVzaFN0YWNrIGFnYWluIGluIHRoZSBjYWxsIGJlbG93LCB3aGljaCBoYXBwZW5zIGJlY2F1c2UgdGhlXG4gICAgLy8gcm9vdCBhbmQgbGFuZXMgaGF2ZW4ndCBjaGFuZ2VkLlxuICAgIC8vXG4gICAgLy8gVE9ETzogSSB0aGluayB3aGF0IHdlIHNob3VsZCBkbyBpcyBzZXQgRm9yY2VDbGllbnRSZW5kZXIgaW5zaWRlXG4gICAgLy8gdGhyb3dFeGNlcHRpb24sIGxpa2Ugd2UgZG8gZm9yIG5lc3RlZCBTdXNwZW5zZSBib3VuZGFyaWVzLiBUaGUgcmVhc29uXG4gICAgLy8gaXQncyBoZXJlIGluc3RlYWQgaXMgc28gd2UgY2FuIHN3aXRjaCB0byB0aGUgc3luY2hyb25vdXMgd29yayBsb29wLCB0b28uXG4gICAgLy8gU29tZXRoaW5nIHRvIGNvbnNpZGVyIGZvciBhIGZ1dHVyZSByZWZhY3Rvci5cbiAgICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcbiAgICByb290V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRm9yY2VDbGllbnRSZW5kZXI7XG5cbiAgICB7XG4gICAgICBlcnJvckh5ZHJhdGluZ0NvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgZXJyb3JSZXRyeUxhbmVzKTtcblxuICBpZiAoZXhpdFN0YXR1cyAhPT0gUm9vdEVycm9yZWQpIHtcbiAgICAvLyBTdWNjZXNzZnVsbHkgZmluaXNoZWQgcmVuZGVyaW5nIG9uIHJldHJ5XG4gICAgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBmYWlsZWQgZmlyc3QgYXR0ZW1wdCBoYXZlIGJlZW4gcmVjb3ZlcmVkLiBBZGRcbiAgICAvLyB0aGVtIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHJlY292ZXJhYmxlIGVycm9ycy4gV2UnbGwgbG9nIHRoZW0gaW4gdGhlXG4gICAgLy8gY29tbWl0IHBoYXNlLlxuICAgIHZhciBlcnJvcnNGcm9tU2Vjb25kQXR0ZW1wdCA9IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gZXJyb3JzRnJvbUZpcnN0QXR0ZW1wdDsgLy8gVGhlIGVycm9ycyBmcm9tIHRoZSBzZWNvbmQgYXR0ZW1wdCBzaG91bGQgYmUgcXVldWVkIGFmdGVyIHRoZSBlcnJvcnNcbiAgICAvLyBmcm9tIHRoZSBmaXJzdCBhdHRlbXB0LCB0byBwcmVzZXJ2ZSB0aGUgY2F1c2FsIHNlcXVlbmNlLlxuXG4gICAgaWYgKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0ICE9PSBudWxsKSB7XG4gICAgICBxdWV1ZVJlY292ZXJhYmxlRXJyb3JzKGVycm9yc0Zyb21TZWNvbmRBdHRlbXB0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhpdFN0YXR1cztcbn1cblxuZnVuY3Rpb24gcXVldWVSZWNvdmVyYWJsZUVycm9ycyhlcnJvcnMpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMgPSBlcnJvcnM7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMucHVzaC5hcHBseSh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycywgZXJyb3JzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7XG4gIHN3aXRjaCAoZXhpdFN0YXR1cykge1xuICAgIGNhc2UgUm9vdEluUHJvZ3Jlc3M6XG4gICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgICAgIH1cbiAgICAvLyBGbG93IGtub3dzIGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zIGlmIEkgYWRkIGEgYnJlYWtcbiAgICAvLyBzdGF0ZW1lbnQsIGJ1dCBlc2xpbnQgZG9lc24ndCBrbm93IGFib3V0IGludmFyaWFudCwgc28gaXQgY29tcGxhaW5zXG4gICAgLy8gaWYgSSBkby4gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG5cbiAgICBjYXNlIFJvb3RFcnJvcmVkOlxuICAgICAge1xuICAgICAgICAvLyBXZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGF0dGVtcHRlZCB0byByZXRyeSB0aGlzIHRyZWUuIElmIHdlIHJlYWNoZWRcbiAgICAgICAgLy8gdGhpcyBwb2ludCwgaXQgZXJyb3JlZCBhZ2Fpbi4gQ29tbWl0IGl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOyAvLyBXZSBoYXZlIGFuIGFjY2VwdGFibGUgbG9hZGluZyBzdGF0ZS4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHdlXG4gICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC5cblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZVxuICAgICAgICAhc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIHJlbmRlciBvbmx5IGluY2x1ZGVkIHJldHJpZXMsIG5vIHVwZGF0ZXMuIFRocm90dGxlIGNvbW1pdHRpbmdcbiAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS5cbiAgICAgICAgICB2YXIgbXNVbnRpbFRpbWVvdXQgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgRkFMTEJBQ0tfVEhST1RUTEVfTVMgLSBub3coKTsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cbiAgICAgICAgICBpZiAobXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICAgICAgICAgICAgaWYgKG5leHRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuXG4gICAgICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhzdXNwZW5kZWRMYW5lcywgbGFuZXMpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdFxuICAgICAgICAgICAgICAvLyBzdXNwZW5kZWQgbGV2ZWwuIFBpbmcgdGhlIGxhc3Qgc3VzcGVuZGVkIGxldmVsIHRvIHRyeVxuICAgICAgICAgICAgICAvLyByZW5kZXJpbmcgaXQgYWdhaW4uXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC5cbiAgICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgICAgbWFya1Jvb3RQaW5nZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gVGhlIHJlbmRlciBpcyBzdXNwZW5kZWQsIGl0IGhhc24ndCB0aW1lZCBvdXQsIGFuZCB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB3b3JrIHRvIGRvLiBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cblxuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKSwgbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFRoZSB3b3JrIGV4cGlyZWQuIENvbW1pdCBpbW1lZGlhdGVseS5cblxuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdFN1c3BlbmRlZFdpdGhEZWxheTpcbiAgICAgIHtcbiAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSB0cmFuc2l0aW9uLCBzbyB3ZSBzaG91bGQgZXhpdCB3aXRob3V0IGNvbW1pdHRpbmcgYVxuICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIGFuZCB3aXRob3V0IHNjaGVkdWxpbmcgYSB0aW1lb3V0LiBEZWxheSBpbmRlZmluaXRlbHlcbiAgICAgICAgICAvLyB1bnRpbCB3ZSByZWNlaXZlIG1vcmUgZGF0YS5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHRyYW5zaXRpb24sIGJ1dCB3ZSBkaWQgdHJpZ2dlciBhbiBhdm9pZGVkIHN0YXRlLlxuICAgICAgICAgIC8vIFNjaGVkdWxlIGEgcGxhY2Vob2xkZXIgdG8gZGlzcGxheSBhZnRlciBhIHNob3J0IGRlbGF5LCB1c2luZyB0aGUgSnVzdFxuICAgICAgICAgIC8vIE5vdGljZWFibGUgRGlmZmVyZW5jZS5cbiAgICAgICAgICAvLyBUT0RPOiBJcyB0aGUgSk5EIG9wdGltaXphdGlvbiB3b3J0aCB0aGUgYWRkZWQgY29tcGxleGl0eT8gSWYgdGhpcyBpc1xuICAgICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB3ZSB0cmFjayB0aGUgZXZlbnQgdGltZSwgdGhlbiBwcm9iYWJseSBub3QuXG4gICAgICAgICAgLy8gQ29uc2lkZXIgcmVtb3ZpbmcuXG4gICAgICAgICAgdmFyIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICB2YXIgZXZlbnRUaW1lTXMgPSBtb3N0UmVjZW50RXZlbnRUaW1lO1xuICAgICAgICAgIHZhciB0aW1lRWxhcHNlZE1zID0gbm93KCkgLSBldmVudFRpbWVNcztcblxuICAgICAgICAgIHZhciBfbXNVbnRpbFRpbWVvdXQgPSBqbmQodGltZUVsYXBzZWRNcykgLSB0aW1lRWxhcHNlZE1zOyAvLyBEb24ndCBib3RoZXIgd2l0aCBhIHZlcnkgc2hvcnQgc3VzcGVuc2UgdGltZS5cblxuXG4gICAgICAgICAgaWYgKF9tc1VudGlsVGltZW91dCA+IDEwKSB7XG4gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrIGltbWVkaWF0ZWx5LCB3YWl0IGZvciBtb3JlIGRhdGFcbiAgICAgICAgICAgIC8vIHRvIGFycml2ZS5cbiAgICAgICAgICAgIHJvb3QudGltZW91dEhhbmRsZSA9IHNjaGVkdWxlVGltZW91dChjb21taXRSb290LmJpbmQobnVsbCwgcm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpLCBfbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RDb21wbGV0ZWQ6XG4gICAgICB7XG4gICAgICAgIC8vIFRoZSB3b3JrIGNvbXBsZXRlZC4gUmVhZHkgdG8gY29tbWl0LlxuICAgICAgICBjb21taXRSb290KHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLCB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcm9vdCBleGl0IHN0YXR1cy4nKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1JlbmRlckNvbnNpc3RlbnRXaXRoRXh0ZXJuYWxTdG9yZXMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIFNlYXJjaCB0aGUgcmVuZGVyZWQgdHJlZSBmb3IgZXh0ZXJuYWwgc3RvcmUgcmVhZHMsIGFuZCBjaGVjayB3aGV0aGVyIHRoZVxuICAvLyBzdG9yZXMgd2VyZSBtdXRhdGVkIGluIGEgY29uY3VycmVudCBldmVudC4gSW50ZW50aW9uYWxseSB1c2luZyBhbiBpdGVyYXRpdmVcbiAgLy8gbG9vcCBpbnN0ZWFkIG9mIHJlY3Vyc2lvbiBzbyB3ZSBjYW4gZXhpdCBlYXJseS5cbiAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobm9kZS5mbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kpIHtcbiAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5vZGUudXBkYXRlUXVldWU7XG5cbiAgICAgIGlmICh1cGRhdGVRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgY2hlY2tzID0gdXBkYXRlUXVldWUuc3RvcmVzO1xuXG4gICAgICAgIGlmIChjaGVja3MgIT09IG51bGwpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoZWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoZWNrID0gY2hlY2tzW2ldO1xuICAgICAgICAgICAgdmFyIGdldFNuYXBzaG90ID0gY2hlY2suZ2V0U25hcHNob3Q7XG4gICAgICAgICAgICB2YXIgcmVuZGVyZWRWYWx1ZSA9IGNoZWNrLnZhbHVlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoIW9iamVjdElzKGdldFNuYXBzaG90KCksIHJlbmRlcmVkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm91bmQgYW4gaW5jb25zaXN0ZW50IHN0b3JlLlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gSWYgYGdldFNuYXBzaG90YCB0aHJvd3MsIHJldHVybiBgZmFsc2VgLiBUaGlzIHdpbGwgc2NoZWR1bGVcbiAgICAgICAgICAgICAgLy8gYSByZS1yZW5kZXIsIGFuZCB0aGUgZXJyb3Igd2lsbCBiZSByZXRocm93biBkdXJpbmcgcmVuZGVyLlxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChub2RlLnN1YnRyZWVGbGFncyAmIFN0b3JlQ29uc2lzdGVuY3kgJiYgY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIGNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpbmlzaGVkV29yaykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9IC8vIEZsb3cgZG9lc24ndCBrbm93IHRoaXMgaXMgdW5yZWFjaGFibGUsIGJ1dCBlc2xpbnQgZG9lc1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGVcblxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIHN1c3BlbmRlZExhbmVzKSB7XG4gIC8vIFdoZW4gc3VzcGVuZGluZywgd2Ugc2hvdWxkIGFsd2F5cyBleGNsdWRlIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgb3IgKG1vcmVcbiAgLy8gcmFyZWx5LCBzaW5jZSB3ZSB0cnkgdG8gYXZvaWQgaXQpIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gIC8vIFRPRE86IExvbCBtYXliZSB0aGVyZSdzIGEgYmV0dGVyIHdheSB0byBmYWN0b3IgdGhpcyBiZXNpZGVzIHRoaXNcbiAgLy8gb2Jub3hpb3VzbHkgbmFtZWQgZnVuY3Rpb24gOilcbiAgc3VzcGVuZGVkTGFuZXMgPSByZW1vdmVMYW5lcyhzdXNwZW5kZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMpO1xuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyk7XG4gIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgZ29cbi8vIHRocm91Z2ggU2NoZWR1bGVyXG5cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QpIHtcbiAge1xuICAgIHN5bmNOZXN0ZWRVcGRhdGVGbGFnKCk7XG4gIH1cblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgdmFyIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShsYW5lcywgU3luY0xhbmUpKSB7XG4gICAgLy8gVGhlcmUncyBubyByZW1haW5pbmcgc3luYyB3b3JrIGxlZnQuXG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gIGlmIChyb290LnRhZyAhPT0gTGVnYWN5Um9vdCAmJiBleGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbCByZW5kZXJcbiAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kXG4gICAgLy8gYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cbiAgICB2YXIgZXJyb3JSZXRyeUxhbmVzID0gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCk7XG5cbiAgICBpZiAoZXJyb3JSZXRyeUxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgIGV4aXRTdGF0dXMgPSByZWNvdmVyRnJvbUNvbmN1cnJlbnRFcnJvcihyb290LCBlcnJvclJldHJ5TGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RmF0YWxFcnJvcmVkKSB7XG4gICAgdmFyIGZhdGFsRXJyb3IgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RGYXRhbEVycm9yO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG4gICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgfVxuXG4gIGlmIChleGl0U3RhdHVzID09PSBSb290RGlkTm90Q29tcGxldGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgZGlkIG5vdCBjb21wbGV0ZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4nKTtcbiAgfSAvLyBXZSBub3cgaGF2ZSBhIGNvbnNpc3RlbnQgdHJlZS4gQmVjYXVzZSB0aGlzIGlzIGEgc3luYyByZW5kZXIsIHdlXG4gIC8vIHdpbGwgY29tbWl0IGl0IGV2ZW4gaWYgc29tZXRoaW5nIHN1c3BlbmRlZC5cblxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmN1cnJlbnQuYWx0ZXJuYXRlO1xuICByb290LmZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yaztcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gIGNvbW1pdFJvb3Qocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMpOyAvLyBCZWZvcmUgZXhpdGluZywgbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYWxsYmFjayBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0XG4gIC8vIHBlbmRpbmcgbGV2ZWwuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUm9vdChyb290LCBsYW5lcykge1xuICBpZiAobGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBtZXJnZUxhbmVzKGxhbmVzLCBTeW5jTGFuZSkpO1xuICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSB7XG4gICAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgICBmbHVzaFN5bmNDYWxsYmFja3MoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBCYXRjaGVkQ29udGV4dDtcblxuICB0cnkge1xuICAgIHJldHVybiBmbihhKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7IC8vIElmIHRoZXJlIHdlcmUgbGVnYWN5IHN5bmMgdXBkYXRlcywgZmx1c2ggdGhlbSBhdCB0aGUgZW5kIG9mIHRoZSBvdXRlclxuICAgIC8vIG1vc3QgYmF0Y2hlZFVwZGF0ZXMtbGlrZSBtZXRob2QuXG5cbiAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIC8vIFRyZWF0IGBhY3RgIGFzIGlmIGl0J3MgaW5zaWRlIGBiYXRjaGVkVXBkYXRlc2AsIGV2ZW4gaW4gbGVnYWN5IG1vZGUuXG4gICAgISggUmVhY3RDdXJyZW50QWN0UXVldWUkMS5pc0JhdGNoaW5nTGVnYWN5KSkge1xuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzT25seUluTGVnYWN5TW9kZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZGlzY3JldGVVcGRhdGVzKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKGEsIGIsIGMsIGQpO1xuICB9IGZpbmFsbHkge1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICB9XG4gIH1cbn0gLy8gT3ZlcmxvYWQgdGhlIGRlZmluaXRpb24gdG8gdGhlIHR3byB2YWxpZCBzaWduYXR1cmVzLlxuLy8gV2FybmluZywgdGhpcyBvcHRzLW91dCBvZiBjaGVja2luZyB0aGUgZnVuY3Rpb24gYm9keS5cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuZnVuY3Rpb24gZmx1c2hTeW5jKGZuKSB7XG4gIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBmbHVzaCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZVxuICAvLyBuZXh0IGV2ZW50LCBub3QgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgb25lLlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwgJiYgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMudGFnID09PSBMZWdhY3lSb290ICYmIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG4gIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBnZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkoKTtcblxuICB0cnkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IG51bGw7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG5cbiAgICBpZiAoZm4pIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRDdXJyZW50VXBkYXRlUHJpb3JpdHkocHJldmlvdXNQcmlvcml0eSk7XG4gICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0OyAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoLlxuICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgLy8gdGhlIHN0YWNrLlxuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpc0FscmVhZHlSZW5kZXJpbmcoKSB7XG4gIC8vIFVzZWQgYnkgdGhlIHJlbmRlcmVyIHRvIHByaW50IGEgd2FybmluZyBpZiBjZXJ0YWluIEFQSXMgYXJlIGNhbGxlZCBmcm9tXG4gIC8vIHRoZSB3cm9uZyBjb250ZXh0LlxuICByZXR1cm4gIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dDtcbn1cbmZ1bmN0aW9uIHB1c2hSZW5kZXJMYW5lcyhmaWJlciwgbGFuZXMpIHtcbiAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpO1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHN1YnRyZWVSZW5kZXJMYW5lcywgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiBwb3BSZW5kZXJMYW5lcyhmaWJlcikge1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IuY3VycmVudDtcbiAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcykge1xuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciB0aW1lb3V0SGFuZGxlID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuXG4gIGlmICh0aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXQpIHtcbiAgICAvLyBUaGUgcm9vdCBwcmV2aW91cyBzdXNwZW5kZWQgYW5kIHNjaGVkdWxlZCBhIHRpbWVvdXQgdG8gY29tbWl0IGEgZmFsbGJhY2tcbiAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC5cbiAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7IC8vICRGbG93Rml4TWUgQ29tcGxhaW5zIG5vVGltZW91dCBpcyBub3QgYSBUaW1lb3V0SUQsIGRlc3BpdGUgdGhlIGNoZWNrIGFib3ZlXG5cbiAgICBjYW5jZWxUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaW50ZXJydXB0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICB2YXIgcm9vdFdvcmtJblByb2dyZXNzID0gY3JlYXRlV29ya0luUHJvZ3Jlc3Mocm9vdC5jdXJyZW50LCBudWxsKTtcbiAgd29ya0luUHJvZ3Jlc3MgPSByb290V29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IGxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbDtcbiAgZW5xdWV1ZUludGVybGVhdmVkVXBkYXRlcygpO1xuXG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzKCk7XG4gIH1cblxuICByZXR1cm4gcm9vdFdvcmtJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSkge1xuICBkbyB7XG4gICAgdmFyIGVycm9yZWRXb3JrID0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVzZXQgbW9kdWxlLWxldmVsIHN0YXRlIHRoYXQgd2FzIHNldCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTtcbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7IC8vIFRPRE86IEkgZm91bmQgYW5kIGFkZGVkIHRoaXMgbWlzc2luZyBsaW5lIHdoaWxlIGludmVzdGlnYXRpbmcgYVxuICAgICAgLy8gc2VwYXJhdGUgaXNzdWUuIFdyaXRlIGEgcmVncmVzc2lvbiB0ZXN0IHVzaW5nIHN0cmluZyByZWZzLlxuXG4gICAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xuXG4gICAgICBpZiAoZXJyb3JlZFdvcmsgPT09IG51bGwgfHwgZXJyb3JlZFdvcmsucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIC8vIEV4cGVjdGVkIHRvIGJlIHdvcmtpbmcgb24gYSBub24tcm9vdCBmaWJlci4gVGhpcyBpcyBhIGZhdGFsIGVycm9yXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlcmUncyBubyBhbmNlc3RvciB0aGF0IGNhbiBoYW5kbGUgaXQ7IHRoZSByb290IGlzXG4gICAgICAgIC8vIHN1cHBvc2VkIHRvIGNhcHR1cmUgYWxsIGVycm9ycyB0aGF0IHdlcmVuJ3QgY2F1Z2h0IGJ5IGFuIGVycm9yXG4gICAgICAgIC8vIGJvdW5kYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEZhdGFsRXJyb3JlZDtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IHRocm93blZhbHVlOyAvLyBTZXQgYHdvcmtJblByb2dyZXNzYCB0byBudWxsLiBUaGlzIHJlcHJlc2VudHMgYWR2YW5jaW5nIHRvIHRoZSBuZXh0XG4gICAgICAgIC8vIHNpYmxpbmcsIG9yIHRoZSBwYXJlbnQgaWYgdGhlcmUgYXJlIG5vIHNpYmxpbmdzLiBCdXQgc2luY2UgdGhlIHJvb3RcbiAgICAgICAgLy8gaGFzIG5vIHNpYmxpbmdzIG5vciBhIHBhcmVudCwgd2Ugc2V0IGl0IHRvIG51bGwuIFVzdWFsbHkgdGhpcyBpc1xuICAgICAgICAvLyBoYW5kbGVkIGJ5IGBjb21wbGV0ZVVuaXRPZldvcmtgIG9yIGB1bndpbmRXb3JrYCwgYnV0IHNpbmNlIHdlJ3JlXG4gICAgICAgIC8vIGludGVudGlvbmFsbHkgbm90IGNhbGxpbmcgdGhvc2UsIHdlIG5lZWQgc2V0IGl0IGhlcmUuXG4gICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGNhbGxpbmcgYHVud2luZFdvcmtgIHRvIHBvcCB0aGUgY29udGV4dHMuXG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmFibGVQcm9maWxlclRpbWVyICYmIGVycm9yZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHRpbWUgc3BlbnQgcmVuZGVyaW5nIGJlZm9yZSBhbiBlcnJvciB3YXMgdGhyb3duLiBUaGlzXG4gICAgICAgIC8vIGF2b2lkcyBpbmFjY3VyYXRlIFByb2ZpbGVyIGR1cmF0aW9ucyBpbiB0aGUgY2FzZSBvZiBhXG4gICAgICAgIC8vIHN1c3BlbmRlZCByZW5kZXIuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZXJyb3JlZFdvcmssIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlU2NoZWR1bGluZ1Byb2ZpbGVyKSB7XG4gICAgICAgIG1hcmtDb21wb25lbnRSZW5kZXJTdG9wcGVkKCk7XG5cbiAgICAgICAgaWYgKHRocm93blZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB0aHJvd25WYWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHRocm93blZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgd2FrZWFibGUgPSB0aHJvd25WYWx1ZTtcbiAgICAgICAgICBtYXJrQ29tcG9uZW50U3VzcGVuZGVkKGVycm9yZWRXb3JrLCB3YWtlYWJsZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcmtDb21wb25lbnRFcnJvcmVkKGVycm9yZWRXb3JrLCB0aHJvd25WYWx1ZSwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93RXhjZXB0aW9uKHJvb3QsIGVycm9yZWRXb3JrLnJldHVybiwgZXJyb3JlZFdvcmssIHRocm93blZhbHVlLCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICBjb21wbGV0ZVVuaXRPZldvcmsoZXJyb3JlZFdvcmspO1xuICAgIH0gY2F0Y2ggKHlldEFub3RoZXJUaHJvd25WYWx1ZSkge1xuICAgICAgLy8gU29tZXRoaW5nIGluIHRoZSByZXR1cm4gcGF0aCBhbHNvIHRocmV3LlxuICAgICAgdGhyb3duVmFsdWUgPSB5ZXRBbm90aGVyVGhyb3duVmFsdWU7XG5cbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gZXJyb3JlZFdvcmsgJiYgZXJyb3JlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBoYXMgYWxyZWFkeSBlcnJvcmVkLCB0aGVuIHdlIGhhZCB0cm91YmxlIHByb2Nlc3NpbmdcbiAgICAgICAgLy8gdGhlIGVycm9yLiBCdWJibGUgaXQgdG8gdGhlIG5leHQgYm91bmRhcnkuXG4gICAgICAgIGVycm9yZWRXb3JrID0gZXJyb3JlZFdvcmsucmV0dXJuO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IGVycm9yZWRXb3JrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfSAvLyBSZXR1cm4gdG8gdGhlIG5vcm1hbCB3b3JrIGxvb3AuXG5cblxuICAgIHJldHVybjtcbiAgfSB3aGlsZSAodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIHB1c2hEaXNwYXRjaGVyKCkge1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudDtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG5cbiAgaWYgKHByZXZEaXNwYXRjaGVyID09PSBudWxsKSB7XG4gICAgLy8gVGhlIFJlYWN0IGlzb21vcnBoaWMgcGFja2FnZSBkb2VzIG5vdCBpbmNsdWRlIGEgZGVmYXVsdCBkaXNwYXRjaGVyLlxuICAgIC8vIEluc3RlYWQgdGhlIGZpcnN0IHJlbmRlcmVyIHdpbGwgbGF6aWx5IGF0dGFjaCBvbmUsIGluIG9yZGVyIHRvIGdpdmVcbiAgICAvLyBuaWNlciBlcnJvciBtZXNzYWdlcy5cbiAgICByZXR1cm4gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwcmV2RGlzcGF0Y2hlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpIHtcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IG5vdygpO1xufVxuZnVuY3Rpb24gbWFya1NraXBwZWRVcGRhdGVMYW5lcyhsYW5lKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IG1lcmdlTGFuZXMobGFuZSwgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmQoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290RXJyb3JlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkV2l0aERlbGF5O1xuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWRcbiAgLy8gdGhpcyByZW5kZXIuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcykpKSB7XG4gICAgLy8gTWFyayB0aGUgY3VycmVudCByZW5kZXIgYXMgc3VzcGVuZGVkIHNvIHRoYXQgd2Ugc3dpdGNoIHRvIHdvcmtpbmcgb25cbiAgICAvLyB0aGUgdXBkYXRlcyB0aGF0IHdlcmUgc2tpcHBlZC4gVXN1YWxseSB3ZSBvbmx5IHN1c3BlbmQgYXQgdGhlIGVuZCBvZlxuICAgIC8vIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgLy8gVE9ETzogV2Ugc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBtYXJrIHRoZSByb290IGFzIHN1c3BlbmRlZCBpbW1lZGlhdGVseVxuICAgIC8vIChpbnNpZGUgdGhpcyBmdW5jdGlvbiksIHNpbmNlIGJ5IHN1c3BlbmRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgcmVuZGVyXG4gICAgLy8gcGhhc2UgaW50cm9kdWNlcyBhIHBvdGVudGlhbCBtaXN0YWtlIHdoZXJlIHdlIHN1c3BlbmQgbGFuZXMgdGhhdCB3ZXJlXG4gICAgLy8gcGluZ2VkIG9yIHVwZGF0ZWQgd2hpbGUgd2Ugd2VyZSByZW5kZXJpbmcuXG4gICAgbWFya1Jvb3RTdXNwZW5kZWQkMSh3b3JrSW5Qcm9ncmVzc1Jvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVuZGVyRGlkRXJyb3IoZXJyb3IpIHtcbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgIT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkpIHtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEVycm9yZWQ7XG4gIH1cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9PT0gbnVsbCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMgPSBbZXJyb3JdO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdENvbmN1cnJlbnRFcnJvcnMucHVzaChlcnJvcik7XG4gIH1cbn0gLy8gQ2FsbGVkIGR1cmluZyByZW5kZXIgdG8gZGV0ZXJtaW5lIGlmIGFueXRoaW5nIGhhcyBzdXNwZW5kZWQuXG4vLyBSZXR1cm5zIGZhbHNlIGlmIHdlJ3JlIG5vdCBzdXJlLlxuXG5mdW5jdGlvbiByZW5kZXJIYXNOb3RTdXNwZW5kZWRZZXQoKSB7XG4gIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIG9yIGNvbXBsZXRlZCwgd2UgY2FuJ3QgcmVhbGx5IGJlIHN1cmUsXG4gIC8vIHNvIHRob3NlIGFyZSBmYWxzZS5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzO1xufVxuXG5mdW5jdGlvbiByZW5kZXJSb290U3luYyhyb290LCBsYW5lcykge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IFJlbmRlckNvbnRleHQ7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCk7IC8vIElmIHRoZSByb290IG9yIGxhbmVzIGhhdmUgY2hhbmdlZCwgdGhyb3cgb3V0IHRoZSBleGlzdGluZyBzdGFja1xuICAvLyBhbmQgcHJlcGFyZSBhIGZyZXNoIG9uZS4gT3RoZXJ3aXNlIHdlJ2xsIGNvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgIT09IHJvb3QgfHwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgIT09IGxhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFVwZGF0ZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycy5jbGVhcigpO1xuICAgICAgICB9IC8vIEF0IHRoaXMgcG9pbnQsIG1vdmUgRmliZXJzIHRoYXQgc2NoZWR1bGVkIHRoZSB1cGNvbWluZyB3b3JrIGZyb20gdGhlIE1hcCB0byB0aGUgU2V0LlxuICAgICAgICAvLyBJZiB3ZSBiYWlsb3V0IG9uIHRoaXMgd29yaywgd2UnbGwgbW92ZSB0aGVtIGJhY2sgKGxpa2UgYWJvdmUpLlxuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byBtb3ZlIHRoZW0gbm93IGluIGNhc2UgdGhlIHdvcmsgc3Bhd25zIG1vcmUgd29yayBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoIGRpZmZlcmVudCB1cGRhdGVycy5cbiAgICAgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGtlZXAgdGhlIGN1cnJlbnQgdXBkYXRlIGFuZCBmdXR1cmUgdXBkYXRlcyBzZXBhcmF0ZS5cblxuXG4gICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IGdldFRyYW5zaXRpb25zRm9yTGFuZXMoKTtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgbWFya1JlbmRlclN0YXJ0ZWQobGFuZXMpO1xuICB9XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcFN5bmMoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcblxuICBpZiAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICAvLyBUaGlzIGlzIGEgc3luYyByZW5kZXIsIHNvIHdlIHNob3VsZCBoYXZlIGZpbmlzaGVkIHRoZSB3aG9sZSB0cmVlLlxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCBhbiBpbmNvbXBsZXRlIHJvb3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhICcgKyAnYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RvcHBlZCgpO1xuICB9IC8vIFNldCB0aGlzIHRvIG51bGwgdG8gaW5kaWNhdGUgdGhlcmUncyBubyBpbi1wcm9ncmVzcyByZW5kZXIuXG5cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xufSAvLyBUaGUgd29yayBsb29wIGlzIGFuIGV4dHJlbWVseSBob3QgcGF0aC4gVGVsbCBDbG9zdXJlIG5vdCB0byBpbmxpbmUgaXQuXG5cbi8qKiBAbm9pbmxpbmUgKi9cblxuXG5mdW5jdGlvbiB3b3JrTG9vcFN5bmMoKSB7XG4gIC8vIEFscmVhZHkgdGltZWQgb3V0LCBzbyBwZXJmb3JtIHdvcmsgd2l0aG91dCBjaGVja2luZyBpZiB3ZSBuZWVkIHRvIHlpZWxkLlxuICB3aGlsZSAod29ya0luUHJvZ3Jlc3MgIT09IG51bGwpIHtcbiAgICBwZXJmb3JtVW5pdE9mV29yayh3b3JrSW5Qcm9ncmVzcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpIHtcbiAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICB2YXIgcHJldkRpc3BhdGNoZXIgPSBwdXNoRGlzcGF0Y2hlcigpOyAvLyBJZiB0aGUgcm9vdCBvciBsYW5lcyBoYXZlIGNoYW5nZWQsIHRocm93IG91dCB0aGUgZXhpc3Rpbmcgc3RhY2tcbiAgLy8gYW5kIHByZXBhcmUgYSBmcmVzaCBvbmUuIE90aGVyd2lzZSB3ZSdsbCBjb250aW51ZSB3aGVyZSB3ZSBsZWZ0IG9mZi5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lcykge1xuICAgIHtcbiAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcblxuICAgICAgICBpZiAobWVtb2l6ZWRVcGRhdGVycy5zaXplID4gMCkge1xuICAgICAgICAgIHJlc3RvcmVQZW5kaW5nVXBkYXRlcnMocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgfSAvLyBBdCB0aGlzIHBvaW50LCBtb3ZlIEZpYmVycyB0aGF0IHNjaGVkdWxlZCB0aGUgdXBjb21pbmcgd29yayBmcm9tIHRoZSBNYXAgdG8gdGhlIFNldC5cbiAgICAgICAgLy8gSWYgd2UgYmFpbG91dCBvbiB0aGlzIHdvcmssIHdlJ2xsIG1vdmUgdGhlbSBiYWNrIChsaWtlIGFib3ZlKS5cbiAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gbW92ZSB0aGVtIG5vdyBpbiBjYXNlIHRoZSB3b3JrIHNwYXducyBtb3JlIHdvcmsgYXQgdGhlIHNhbWUgcHJpb3JpdHkgd2l0aCBkaWZmZXJlbnQgdXBkYXRlcnMuXG4gICAgICAgIC8vIFRoYXQgd2F5IHdlIGNhbiBrZWVwIHRoZSBjdXJyZW50IHVwZGF0ZSBhbmQgZnV0dXJlIHVwZGF0ZXMgc2VwYXJhdGUuXG5cblxuICAgICAgICBtb3ZlUGVuZGluZ0ZpYmVyc1RvTWVtb2l6ZWQocm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgPSBnZXRUcmFuc2l0aW9uc0ZvckxhbmVzKCk7XG4gICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHtcbiAgICBtYXJrUmVuZGVyU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wQ29uY3VycmVudCgpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICBwb3BEaXNwYXRjaGVyKHByZXZEaXNwYXRjaGVyKTtcbiAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgLy8gU3RpbGwgd29yayByZW1haW5pbmcuXG4gICAge1xuICAgICAgbWFya1JlbmRlcllpZWxkZWQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUm9vdEluUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ29tcGxldGVkIHRoZSB0cmVlLlxuICAgIHtcbiAgICAgIG1hcmtSZW5kZXJTdG9wcGVkKCk7XG4gICAgfSAvLyBTZXQgdGhpcyB0byBudWxsIHRvIGluZGljYXRlIHRoZXJlJ3Mgbm8gaW4tcHJvZ3Jlc3MgcmVuZGVyLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gUmV0dXJuIHRoZSBmaW5hbCBleGl0IHN0YXR1cy5cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICB9XG59XG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BDb25jdXJyZW50KCkge1xuICAvLyBQZXJmb3JtIHdvcmsgdW50aWwgU2NoZWR1bGVyIGFza3MgdXMgdG8geWllbGRcbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50ID0gdW5pdE9mV29yay5hbHRlcm5hdGU7XG4gIHNldEN1cnJlbnRGaWJlcih1bml0T2ZXb3JrKTtcbiAgdmFyIG5leHQ7XG5cbiAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gIH1cblxuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaXQgb2Ygd29yaywgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0XG4gIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci5cbiAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuXG4gIGRvIHtcbiAgICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy5cblxuICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY29tcGxldGVkV29yayk7XG4gICAgICB2YXIgbmV4dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLlxuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wbGV0aW5nIHRoaXMgZmliZXIgc3Bhd25lZCBuZXcgd29yay4gV29yayBvbiB0aGF0IG5leHQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBzb21ldGhpbmcgdGhyZXcuIFBvcCB2YWx1ZXMgb2ZmXG4gICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBlbnRlcmluZyB0aGUgY29tcGxldGUgcGhhc2UuIElmIHRoaXMgaXMgYSBib3VuZGFyeSxcbiAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLlxuICAgICAgdmFyIF9uZXh0ID0gdW53aW5kV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrKTsgLy8gQmVjYXVzZSB0aGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUsIGRvbid0IHJlc2V0IGl0cyBsYW5lcy5cblxuXG4gICAgICBpZiAoX25leHQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgY29tcGxldGluZyB0aGlzIHdvcmsgc3Bhd25lZCBuZXcgd29yaywgZG8gdGhhdCBuZXh0LiBXZSdsbCBjb21lXG4gICAgICAgIC8vIGJhY2sgaGVyZSBhZ2Fpbi5cbiAgICAgICAgLy8gU2luY2Ugd2UncmUgcmVzdGFydGluZywgcmVtb3ZlIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgaG9zdCBlZmZlY3RcbiAgICAgICAgLy8gZnJvbSB0aGUgZWZmZWN0IHRhZy5cbiAgICAgICAgX25leHQuZmxhZ3MgJj0gSG9zdEVmZmVjdE1hc2s7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gX25leHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSByZW5kZXIgZHVyYXRpb24gZm9yIHRoZSBmaWJlciB0aGF0IGVycm9yZWQuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpOyAvLyBJbmNsdWRlIHRoZSB0aW1lIHNwZW50IHdvcmtpbmcgb24gZmFpbGVkIGNoaWxkcmVuIGJlZm9yZSBjb250aW51aW5nLlxuXG4gICAgICAgIHZhciBhY3R1YWxEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb247XG4gICAgICAgIHZhciBjaGlsZCA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG5cbiAgICAgICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAocmV0dXJuRmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgLy8gTWFyayB0aGUgcGFyZW50IGZpYmVyIGFzIGluY29tcGxldGUgYW5kIGNsZWFyIGl0cyBzdWJ0cmVlIGZsYWdzLlxuICAgICAgICByZXR1cm5GaWJlci5mbGFncyB8PSBJbmNvbXBsZXRlO1xuICAgICAgICByZXR1cm5GaWJlci5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgICAgICByZXR1cm5GaWJlci5kZWxldGlvbnMgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2UndmUgdW53b3VuZCBhbGwgdGhlIHdheSB0byB0aGUgcm9vdC5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3REaWROb3RDb21wbGV0ZTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHNpYmxpbmdGaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnRcblxuXG4gICAgY29tcGxldGVkV29yayA9IHJldHVybkZpYmVyOyAvLyBVcGRhdGUgdGhlIG5leHQgdGhpbmcgd2UncmUgd29ya2luZyBvbiBpbiBjYXNlIHNvbWV0aGluZyB0aHJvd3MuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdChyb290LCByZWNvdmVyYWJsZUVycm9ycywgdHJhbnNpdGlvbnMpIHtcbiAgLy8gVE9ETzogVGhpcyBubyBsb25nZXIgbWFrZXMgYW55IHNlbnNlLiBXZSBhbHJlYWR5IHdyYXAgdGhlIG11dGF0aW9uIGFuZFxuICAvLyBsYXlvdXQgcGhhc2VzLiBTaG91bGQgYmUgYWJsZSB0byByZW1vdmUuXG4gIHZhciBwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSA9IGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSgpO1xuICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb247XG5cbiAgdHJ5IHtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpO1xuICAgIGNvbW1pdFJvb3RJbXBsKHJvb3QsIHJlY292ZXJhYmxlRXJyb3JzLCB0cmFuc2l0aW9ucywgcHJldmlvdXNVcGRhdGVMYW5lUHJpb3JpdHkpO1xuICB9IGZpbmFsbHkge1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbiA9IHByZXZUcmFuc2l0aW9uO1xuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1VwZGF0ZUxhbmVQcmlvcml0eSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdEltcGwocm9vdCwgcmVjb3ZlcmFibGVFcnJvcnMsIHRyYW5zaXRpb25zLCByZW5kZXJQcmlvcml0eUxldmVsKSB7XG4gIGRvIHtcbiAgICAvLyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBjYWxsIGBmbHVzaFN5bmNVcGRhdGVRdWV1ZWAgYXQgdGhlIGVuZCwgd2hpY2hcbiAgICAvLyBtZWFucyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBzb21ldGltZXMgcmVzdWx0IGluIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlXG4gICAgLy8gbm8gbW9yZSBwZW5kaW5nIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgYmV0dGVyIGlmIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCBkaWQgbm90IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gd2hpbGUgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKTtcblxuICBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKTtcblxuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy4nKTtcbiAgfVxuXG4gIHZhciBmaW5pc2hlZFdvcmsgPSByb290LmZpbmlzaGVkV29yaztcbiAgdmFyIGxhbmVzID0gcm9vdC5maW5pc2hlZExhbmVzO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICBpZiAoZmluaXNoZWRXb3JrID09PSBudWxsKSB7XG5cbiAgICB7XG4gICAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgICAgICBlcnJvcigncm9vdC5maW5pc2hlZExhbmVzIHNob3VsZCBub3QgYmUgZW1wdHkgZHVyaW5nIGEgY29tbWl0LiBUaGlzIGlzIGEgJyArICdidWcgaW4gUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBudWxsO1xuICByb290LmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmIChmaW5pc2hlZFdvcmsgPT09IHJvb3QuY3VycmVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5ICcgKyAnYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICB9IC8vIGNvbW1pdFJvb3QgbmV2ZXIgcmV0dXJucyBhIGNvbnRpbnVhdGlvbjsgaXQgYWx3YXlzIGZpbmlzaGVzIHN5bmNocm9ub3VzbHkuXG4gIC8vIFNvIHdlIGNhbiBjbGVhciB0aGVzZSBub3cgdG8gYWxsb3cgYSBuZXcgY2FsbGJhY2sgdG8gYmUgc2NoZWR1bGVkLlxuXG5cbiAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsO1xuICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmU7IC8vIFVwZGF0ZSB0aGUgZmlyc3QgYW5kIGxhc3QgcGVuZGluZyB0aW1lcyBvbiB0aGlzIHJvb3QuIFRoZSBuZXcgZmlyc3RcbiAgLy8gcGVuZGluZyB0aW1lIGlzIHdoYXRldmVyIGlzIGxlZnQgb24gdGhlIHJvb3QgZmliZXIuXG5cbiAgdmFyIHJlbWFpbmluZ0xhbmVzID0gbWVyZ2VMYW5lcyhmaW5pc2hlZFdvcmsubGFuZXMsIGZpbmlzaGVkV29yay5jaGlsZExhbmVzKTtcbiAgbWFya1Jvb3RGaW5pc2hlZChyb290LCByZW1haW5pbmdMYW5lcyk7XG5cbiAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFdlIGNhbiByZXNldCB0aGVzZSBub3cgdGhhdCB0aGV5IGFyZSBmaW5pc2hlZC5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG4gIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzLCBzY2hlZHVsZSBhIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlbS5cbiAgLy8gRG8gdGhpcyBhcyBlYXJseSBhcyBwb3NzaWJsZSwgc28gaXQgaXMgcXVldWVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXRcbiAgLy8gbWlnaHQgZ2V0IHNjaGVkdWxlZCBpbiB0aGUgY29tbWl0IHBoYXNlLiAoU2VlICMxNjcxNC4pXG4gIC8vIFRPRE86IERlbGV0ZSBhbGwgb3RoZXIgcGxhY2VzIHRoYXQgc2NoZWR1bGUgdGhlIHBhc3NpdmUgZWZmZWN0IGNhbGxiYWNrXG4gIC8vIFRoZXkncmUgcmVkdW5kYW50LlxuXG5cbiAgaWYgKChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgUGFzc2l2ZU1hc2spICE9PSBOb0ZsYWdzIHx8IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBQYXNzaXZlTWFzaykgIT09IE5vRmxhZ3MpIHtcbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICAvLyB0byBzdG9yZSBpdCBpbiBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zIHVudGlsIHRoZXkgZ2V0IHByb2Nlc3NlZFxuICAgICAgLy8gV2UgbmVlZCB0byBwYXNzIHRoaXMgdGhyb3VnaCBhcyBhbiBhcmd1bWVudCB0byBjb21taXRSb290XG4gICAgICAvLyBiZWNhdXNlIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMgbWlnaHQgaGF2ZSBjaGFuZ2VkIGJldHdlZW5cbiAgICAgIC8vIHRoZSBwcmV2aW91cyByZW5kZXIgYW5kIGNvbW1pdCBpZiB3ZSB0aHJvdHRsZSB0aGUgY29tbWl0XG4gICAgICAvLyB3aXRoIHNldFRpbWVvdXRcblxuICAgICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zO1xuICAgICAgc2NoZWR1bGVDYWxsYmFjayQxKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTsgLy8gVGhpcyByZW5kZXIgdHJpZ2dlcmVkIHBhc3NpdmUgZWZmZWN0czogcmVsZWFzZSB0aGUgcm9vdCBjYWNoZSBwb29sXG4gICAgICAgIC8vICphZnRlciogcGFzc2l2ZSBlZmZlY3RzIGZpcmUgdG8gYXZvaWQgZnJlZWluZyBhIGNhY2hlIHBvb2wgdGhhdCBtYXlcbiAgICAgICAgLy8gYmUgcmVmZXJlbmNlZCBieSBhIG5vZGUgaW4gdGhlIHRyZWUgKEhvc3RSb290LCBDYWNoZSBib3VuZGFyeSBldGMpXG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBlZmZlY3RzIGluIHRoZSB3aG9sZSB0cmVlLlxuICAvLyBUT0RPOiBUaGlzIGlzIGxlZnQgb3ZlciBmcm9tIHRoZSBlZmZlY3QgbGlzdCBpbXBsZW1lbnRhdGlvbiwgd2hlcmUgd2UgaGFkXG4gIC8vIHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGBmaXJzdEVmZmVjdGAgdG8gc2F0aXNmeSBGbG93LiBJIHRoaW5rIHRoZVxuICAvLyBvbmx5IG90aGVyIHJlYXNvbiB0aGlzIG9wdGltaXphdGlvbiBleGlzdHMgaXMgYmVjYXVzZSBpdCBhZmZlY3RzIHByb2ZpbGluZy5cbiAgLy8gUmVjb25zaWRlciB3aGV0aGVyIHRoaXMgaXMgbmVjZXNzYXJ5LlxuXG5cbiAgdmFyIHN1YnRyZWVIYXNFZmZlY3RzID0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAoQmVmb3JlTXV0YXRpb25NYXNrIHwgTXV0YXRpb25NYXNrIHwgTGF5b3V0TWFzayB8IFBhc3NpdmVNYXNrKSkgIT09IE5vRmxhZ3M7XG4gIHZhciByb290SGFzRWZmZWN0ID0gKGZpbmlzaGVkV29yay5mbGFncyAmIChCZWZvcmVNdXRhdGlvbk1hc2sgfCBNdXRhdGlvbk1hc2sgfCBMYXlvdXRNYXNrIHwgUGFzc2l2ZU1hc2spKSAhPT0gTm9GbGFncztcblxuICBpZiAoc3VidHJlZUhhc0VmZmVjdHMgfHwgcm9vdEhhc0VmZmVjdCkge1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDMudHJhbnNpdGlvbjtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBudWxsO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG4gICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KERpc2NyZXRlRXZlbnRQcmlvcml0eSk7XG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7IC8vIFJlc2V0IHRoaXMgdG8gbnVsbCBiZWZvcmUgY2FsbGluZyBsaWZlY3ljbGVzXG5cbiAgICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsOyAvLyBUaGUgY29tbWl0IHBoYXNlIGlzIGJyb2tlbiBpbnRvIHNldmVyYWwgc3ViLXBoYXNlcy4gV2UgZG8gYSBzZXBhcmF0ZSBwYXNzXG4gICAgLy8gb2YgdGhlIGVmZmVjdCBsaXN0IGZvciBlYWNoIHBoYXNlOiBhbGwgbXV0YXRpb24gZWZmZWN0cyBjb21lIGJlZm9yZSBhbGxcbiAgICAvLyBsYXlvdXQgZWZmZWN0cywgYW5kIHNvIG9uLlxuICAgIC8vIFRoZSBmaXJzdCBwaGFzZSBhIFwiYmVmb3JlIG11dGF0aW9uXCIgcGhhc2UuIFdlIHVzZSB0aGlzIHBoYXNlIHRvIHJlYWQgdGhlXG4gICAgLy8gc3RhdGUgb2YgdGhlIGhvc3QgdHJlZSByaWdodCBiZWZvcmUgd2UgbXV0YXRlIGl0LiBUaGlzIGlzIHdoZXJlXG4gICAgLy8gZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgaXMgY2FsbGVkLlxuXG4gICAgdmFyIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuXG4gICAge1xuICAgICAgLy8gTWFyayB0aGUgY3VycmVudCBjb21taXQgdGltZSB0byBiZSBzaGFyZWQgYnkgYWxsIFByb2ZpbGVycyBpbiB0aGlzXG4gICAgICAvLyBiYXRjaC4gVGhpcyBlbmFibGVzIHRoZW0gdG8gYmUgZ3JvdXBlZCBsYXRlci5cbiAgICAgIHJlY29yZENvbW1pdFRpbWUoKTtcbiAgICB9XG5cblxuICAgIGNvbW1pdE11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcblxuICAgIHJlc2V0QWZ0ZXJDb21taXQocm9vdC5jb250YWluZXJJbmZvKTsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgdHJlZSBpcyBub3cgdGhlIGN1cnJlbnQgdHJlZS4gVGhpcyBtdXN0IGNvbWUgYWZ0ZXJcbiAgICAvLyB0aGUgbXV0YXRpb24gcGhhc2UsIHNvIHRoYXQgdGhlIHByZXZpb3VzIHRyZWUgaXMgc3RpbGwgY3VycmVudCBkdXJpbmdcbiAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCwgYnV0IGJlZm9yZSB0aGUgbGF5b3V0IHBoYXNlLCBzbyB0aGF0IHRoZSBmaW5pc2hlZFxuICAgIC8vIHdvcmsgaXMgY3VycmVudCBkdXJpbmcgY29tcG9uZW50RGlkTW91bnQvVXBkYXRlLlxuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbGF5b3V0IHBoYXNlLCB3aGVyZSB3ZSBjYWxsIGVmZmVjdHMgdGhhdCByZWFkXG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0YXJ0ZWQobGFuZXMpO1xuICAgIH1cblxuICAgIGNvbW1pdExheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcyk7XG5cbiAgICB7XG4gICAgICBtYXJrTGF5b3V0RWZmZWN0c1N0b3BwZWQoKTtcbiAgICB9XG4gICAgLy8gb3Bwb3J0dW5pdHkgdG8gcGFpbnQuXG5cblxuICAgIHJlcXVlc3RQYWludCgpO1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gUmVzZXQgdGhlIHByaW9yaXR5IHRvIHRoZSBwcmV2aW91cyBub24tc3luYyB2YWx1ZS5cblxuICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmV2aW91c1ByaW9yaXR5KTtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQzLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBObyBlZmZlY3RzLlxuICAgIHJvb3QuY3VycmVudCA9IGZpbmlzaGVkV29yazsgLy8gTWVhc3VyZSB0aGVzZSBhbnl3YXkgc28gdGhlIGZsYW1lZ3JhcGggZXhwbGljaXRseSBzaG93cyB0aGF0IHRoZXJlIHdlcmVcbiAgICAvLyBubyBlZmZlY3RzLlxuICAgIC8vIFRPRE86IE1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIHJlcG9ydCB0aGlzLlxuXG4gICAge1xuICAgICAgcmVjb3JkQ29tbWl0VGltZSgpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290RGlkSGF2ZVBhc3NpdmVFZmZlY3RzID0gcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHM7XG5cbiAgaWYgKHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gVGhpcyBjb21taXQgaGFzIHBhc3NpdmUgZWZmZWN0cy4gU3Rhc2ggYSByZWZlcmVuY2UgdG8gdGhlbS4gQnV0IGRvbid0XG4gICAgLy8gc2NoZWR1bGUgYSBjYWxsYmFjayB1bnRpbCBhZnRlciBmbHVzaGluZyBsYXlvdXQgd29yay5cbiAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID0gcm9vdDtcbiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IGxhbmVzO1xuICB9IGVsc2Uge1xuXG4gICAge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7IC8vIENoZWNrIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290XG4gIC8vIFRPRE86IFRoaXMgaXMgcGFydCBvZiB0aGUgYGNvbXBvbmVudERpZENhdGNoYCBpbXBsZW1lbnRhdGlvbi4gSXRzIHB1cnBvc2VcbiAgLy8gaXMgdG8gZGV0ZWN0IHdoZXRoZXIgc29tZXRoaW5nIG1pZ2h0IGhhdmUgY2FsbGVkIHNldFN0YXRlIGluc2lkZVxuICAvLyBgY29tcG9uZW50RGlkQ2F0Y2hgLiBUaGUgbWVjaGFuaXNtIGlzIGtub3duIHRvIGJlIGZsYXdlZCBiZWNhdXNlIGBzZXRTdGF0ZWBcbiAgLy8gaW5zaWRlIGBjb21wb25lbnREaWRDYXRjaGAgaXMgaXRzZWxmIGZsYXdlZCBcdTIwMTQgdGhhdCdzIHdoeSB3ZSByZWNvbW1lbmRcbiAgLy8gYGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcmAgaW5zdGVhZC4gSG93ZXZlciwgaXQgY291bGQgYmUgaW1wcm92ZWQgYnlcbiAgLy8gY2hlY2tpbmcgaWYgcmVtYWluaW5nTGFuZXMgaW5jbHVkZXMgU3luYyB3b3JrLCBpbnN0ZWFkIG9mIHdoZXRoZXIgdGhlcmUnc1xuICAvLyBhbnkgd29yayByZW1haW5pbmcgYXQgYWxsICh3aGljaCB3b3VsZCBhbHNvIGluY2x1ZGUgc3R1ZmYgbGlrZSBTdXNwZW5zZVxuICAvLyByZXRyaWVzIG9yIHRyYW5zaXRpb25zKS4gSXQncyBiZWVuIGxpa2UgdGhpcyBmb3IgYSB3aGlsZSwgdGhvdWdoLCBzbyBmaXhpbmdcbiAgLy8gaXQgcHJvYmFibHkgaXNuJ3QgdGhhdCB1cmdlbnQuXG5cbiAgaWYgKHJlbWFpbmluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgLy8gSWYgdGhlcmUncyBubyByZW1haW5pbmcgd29yaywgd2UgY2FuIGNsZWFyIHRoZSBzZXQgb2YgYWxyZWFkeSBmYWlsZWRcbiAgICAvLyBlcnJvciBib3VuZGFyaWVzLlxuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAoIXJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290LmN1cnJlbnQsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBvbkNvbW1pdFJvb3QoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSwgcmVuZGVyUHJpb3JpdHlMZXZlbCk7XG5cbiAge1xuICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgcm9vdC5tZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG9uQ29tbWl0Um9vdCQxKCk7XG4gIH0gLy8gQWx3YXlzIGNhbGwgdGhpcyBiZWZvcmUgZXhpdGluZyBgY29tbWl0Um9vdGAsIHRvIGVuc3VyZSB0aGF0IGFueVxuICAvLyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290IGlzIHNjaGVkdWxlZC5cblxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKHJlY292ZXJhYmxlRXJyb3JzICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUgd2VyZSBlcnJvcnMgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgcmVjb3ZlcmVkIGZyb20gdGhlbSB3aXRob3V0XG4gICAgLy8gbmVlZGluZyB0byBzdXJmYWNlIGl0IHRvIHRoZSBVSS4gV2UgbG9nIHRoZW0gaGVyZS5cbiAgICB2YXIgb25SZWNvdmVyYWJsZUVycm9yID0gcm9vdC5vblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY292ZXJhYmxlRXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmVjb3ZlcmFibGVFcnJvciA9IHJlY292ZXJhYmxlRXJyb3JzW2ldO1xuICAgICAgb25SZWNvdmVyYWJsZUVycm9yKHJlY292ZXJhYmxlRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xuICAgIHZhciBlcnJvciQxID0gZmlyc3RVbmNhdWdodEVycm9yO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG4gICAgdGhyb3cgZXJyb3IkMTtcbiAgfSAvLyBJZiB0aGUgcGFzc2l2ZSBlZmZlY3RzIGFyZSB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgcmVuZGVyLCBmbHVzaCB0aGVtXG4gIC8vIHN5bmNocm9ub3VzbHkgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCB0YXNrIHNvIHRoYXQgdGhlIHJlc3VsdCBpc1xuICAvLyBpbW1lZGlhdGVseSBvYnNlcnZhYmxlLiBPdGhlcndpc2UsIHdlIGFzc3VtZSB0aGF0IHRoZXkgYXJlIG5vdFxuICAvLyBvcmRlci1kZXBlbmRlbnQgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIG9ic2VydmVkIGJ5IGV4dGVybmFsIHN5c3RlbXMsIHNvIHdlXG4gIC8vIGNhbiB3YWl0IHVudGlsIGFmdGVyIHBhaW50LlxuICAvLyBUT0RPOiBXZSBjYW4gb3B0aW1pemUgdGhpcyBieSBub3Qgc2NoZWR1bGluZyB0aGUgY2FsbGJhY2sgZWFybGllci4gU2luY2Ugd2VcbiAgLy8gY3VycmVudGx5IHNjaGVkdWxlIHRoZSBjYWxsYmFjayBpbiBtdWx0aXBsZSBwbGFjZXMsIHdpbGwgd2FpdCB1bnRpbCB0aG9zZVxuICAvLyBhcmUgY29uc29saWRhdGVkLlxuXG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUocGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMsIFN5bmNMYW5lKSAmJiByb290LnRhZyAhPT0gTGVnYWN5Um9vdCkge1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGEgcGFzc2l2ZSBlZmZlY3QgbWlnaHQgaGF2ZSB1cGRhdGVkIGl0XG5cblxuICByZW1haW5pbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuXG4gIGlmIChpbmNsdWRlc1NvbWVMYW5lKHJlbWFpbmluZ0xhbmVzLCBTeW5jTGFuZSkpIHtcbiAgICB7XG4gICAgICBtYXJrTmVzdGVkVXBkYXRlU2NoZWR1bGVkKCk7XG4gICAgfSAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByb290IHN5bmNocm9ub3VzbHkgcmUtcmVuZGVycyB3aXRob3V0XG4gICAgLy8gZmluaXNoaW5nLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnksIGl0IGluZGljYXRlcyBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcC5cblxuXG4gICAgaWYgKHJvb3QgPT09IHJvb3RXaXRoTmVzdGVkVXBkYXRlcykge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gcm9vdDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICB9IC8vIElmIGxheW91dCB3b3JrIHdhcyBzY2hlZHVsZWQsIGZsdXNoIGl0IG5vdy5cblxuXG4gIGZsdXNoU3luY0NhbGxiYWNrcygpO1xuXG4gIHtcbiAgICBtYXJrQ29tbWl0U3RvcHBlZCgpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKSB7XG4gIC8vIFJldHVybnMgd2hldGhlciBwYXNzaXZlIGVmZmVjdHMgd2VyZSBmbHVzaGVkLlxuICAvLyBUT0RPOiBDb21iaW5lIHRoaXMgY2hlY2sgd2l0aCB0aGUgb25lIGluIGZsdXNoUGFzc2l2ZUVGZmVjdHNJbXBsLiBXZSBzaG91bGRcbiAgLy8gcHJvYmFibHkganVzdCBjb21iaW5lIHRoZSB0d28gZnVuY3Rpb25zLiBJIGJlbGlldmUgdGhleSB3ZXJlIG9ubHkgc2VwYXJhdGVcbiAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlIGJlY2F1c2Ugd2UgdXNlZCB0byB3cmFwIGl0IHdpdGhcbiAgLy8gYFNjaGVkdWxlci5ydW5XaXRoUHJpb3JpdHlgLCB3aGljaCBhY2NlcHRzIGEgZnVuY3Rpb24uIEJ1dCBub3cgd2UgdHJhY2sgdGhlXG4gIC8vIHByaW9yaXR5IHdpdGhpbiBSZWFjdCBpdHNlbGYsIHNvIHdlIGNhbiBtdXRhdGUgdGhlIHZhcmlhYmxlIGRpcmVjdGx5LlxuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgIT09IG51bGwpIHtcbiAgICB2YXIgcmVuZGVyUHJpb3JpdHkgPSBsYW5lc1RvRXZlbnRQcmlvcml0eShwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyk7XG4gICAgdmFyIHByaW9yaXR5ID0gbG93ZXJFdmVudFByaW9yaXR5KERlZmF1bHRFdmVudFByaW9yaXR5LCByZW5kZXJQcmlvcml0eSk7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uO1xuICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gZ2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KCk7XG5cbiAgICB0cnkge1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gbnVsbDtcbiAgICAgIHNldEN1cnJlbnRVcGRhdGVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgICByZXR1cm4gZmx1c2hQYXNzaXZlRWZmZWN0c0ltcGwoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KHByZXZpb3VzUHJpb3JpdHkpO1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMy50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247IC8vIE9uY2UgcGFzc2l2ZSBlZmZlY3RzIGhhdmUgcnVuIGZvciB0aGUgdHJlZSAtIGdpdmluZyBjb21wb25lbnRzIGFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdChmaWJlcikge1xuICB7XG4gICAgcGVuZGluZ1Bhc3NpdmVQcm9maWxlckVmZmVjdHMucHVzaChmaWJlcik7XG5cbiAgICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDEoTm9ybWFsUHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCgpIHtcbiAgaWYgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IC8vIENhY2hlIGFuZCBjbGVhciB0aGUgdHJhbnNpdGlvbnMgZmxhZ1xuXG5cbiAgdmFyIHRyYW5zaXRpb25zID0gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucztcbiAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7XG4gIHZhciByb290ID0gcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHM7XG4gIHZhciBsYW5lcyA9IHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzO1xuICByb290V2l0aFBlbmRpbmdQYXNzaXZlRWZmZWN0cyA9IG51bGw7IC8vIFRPRE86IFRoaXMgaXMgc29tZXRpbWVzIG91dCBvZiBzeW5jIHdpdGggcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMuXG4gIC8vIEZpZ3VyZSBvdXQgd2h5IGFuZCBmaXggaXQuIEl0J3Mgbm90IGNhdXNpbmcgYW55IGtub3duIGlzc3VlcyAocHJvYmFibHlcbiAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdXNlZCBmb3IgcHJvZmlsaW5nKSwgYnV0IGl0J3MgYSByZWZhY3RvciBoYXphcmQuXG5cbiAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzTGFuZXMgPSBOb0xhbmVzO1xuXG4gIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuJyk7XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgbWFya1Bhc3NpdmVFZmZlY3RzU3RhcnRlZChsYW5lcyk7XG4gIH1cblxuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0cyhyb290LmN1cnJlbnQpO1xuICBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzKHJvb3QsIHJvb3QuY3VycmVudCwgbGFuZXMsIHRyYW5zaXRpb25zKTsgLy8gVE9ETzogTW92ZSB0byBjb21taXRQYXNzaXZlTW91bnRFZmZlY3RzXG5cbiAge1xuICAgIHZhciBwcm9maWxlckVmZmVjdHMgPSBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cztcbiAgICBwZW5kaW5nUGFzc2l2ZVByb2ZpbGVyRWZmZWN0cyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9maWxlckVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBfZmliZXIgPSBwcm9maWxlckVmZmVjdHNbaV07XG4gICAgICBjb21taXRQYXNzaXZlRWZmZWN0RHVyYXRpb25zKHJvb3QsIF9maWJlcik7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIG1hcmtQYXNzaXZlRWZmZWN0c1N0b3BwZWQoKTtcbiAgfVxuXG4gIHtcbiAgICBjb21taXREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYocm9vdC5jdXJyZW50LCB0cnVlKTtcbiAgfVxuXG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcbiAgZmx1c2hTeW5jQ2FsbGJhY2tzKCk7XG5cbiAge1xuICAgIC8vIElmIGFkZGl0aW9uYWwgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgc2NoZWR1bGVkLCBpbmNyZW1lbnQgYSBjb3VudGVyLiBJZiB0aGlzXG4gICAgLy8gZXhjZWVkcyB0aGUgbGltaXQsIHdlJ2xsIGZpcmUgYSB3YXJuaW5nLlxuICAgIGlmIChkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcykge1xuICAgICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDA7XG4gICAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwO1xuICAgIH1cblxuICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xuICAgIGRpZFNjaGVkdWxlVXBkYXRlRHVyaW5nUGFzc2l2ZUVmZmVjdHMgPSBmYWxzZTtcbiAgfSAvLyBUT0RPOiBNb3ZlIHRvIGNvbW1pdFBhc3NpdmVNb3VudEVmZmVjdHNcblxuXG4gIG9uUG9zdENvbW1pdFJvb3Qocm9vdCk7XG5cbiAge1xuICAgIHZhciBzdGF0ZU5vZGUgPSByb290LmN1cnJlbnQuc3RhdGVOb2RlO1xuICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IDA7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNBbHJlYWR5RmFpbGVkTGVnYWN5RXJyb3JCb3VuZGFyeShpbnN0YW5jZSkge1xuICByZXR1cm4gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgIT09IG51bGwgJiYgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuaGFzKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIG1hcmtMZWdhY3lFcnJvckJvdW5kYXJ5QXNGYWlsZWQoaW5zdGFuY2UpIHtcbiAgaWYgKGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkID09PSBudWxsKSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFtpbnN0YW5jZV0pO1xuICB9IGVsc2Uge1xuICAgIGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkLmFkZChpbnN0YW5jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvVGhyb3dVbmNhdWdodEVycm9yKGVycm9yKSB7XG4gIGlmICghaGFzVW5jYXVnaHRFcnJvcikge1xuICAgIGhhc1VuY2F1Z2h0RXJyb3IgPSB0cnVlO1xuICAgIGZpcnN0VW5jYXVnaHRFcnJvciA9IGVycm9yO1xuICB9XG59XG5cbnZhciBvblVuY2F1Z2h0RXJyb3IgPSBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3I7XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHJvb3RGaWJlciwgc291cmNlRmliZXIsIGVycm9yKSB7XG4gIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gIHZhciB1cGRhdGUgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdEZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIHVwZGF0ZSk7XG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciByb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3Qocm9vdEZpYmVyLCBTeW5jTGFuZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBtYXJrUm9vdFVwZGF0ZWQocm9vdCwgU3luY0xhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3Ioc291cmNlRmliZXIsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yJDEpIHtcbiAge1xuICAgIHJlcG9ydFVuY2F1Z2h0RXJyb3JJbkRFVihlcnJvciQxKTtcbiAgICBzZXRJc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QoZmFsc2UpO1xuICB9XG5cbiAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAvLyBFcnJvciB3YXMgdGhyb3duIGF0IHRoZSByb290LiBUaGVyZSBpcyBubyBwYXJlbnQsIHNvIHRoZSByb290XG4gICAgLy8gaXRzZWxmIHNob3VsZCBjYXB0dXJlIGl0LlxuICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gbnVsbDtcblxuICB7XG4gICAgZmliZXIgPSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yO1xuICB9XG5cbiAgd2hpbGUgKGZpYmVyICE9PSBudWxsKSB7XG4gICAgaWYgKGZpYmVyLnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KGZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IkMSk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICB2YXIgY3RvciA9IGZpYmVyLnR5cGU7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICB2YXIgZXJyb3JJbmZvID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZShlcnJvciQxLCBzb3VyY2VGaWJlcik7XG4gICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIC8vIFRPRE86IFVudGlsIHdlIHJlLWxhbmQgc2tpcFVubW91bnRlZEJvdW5kYXJpZXMgKHNlZSAjMjAxNDcpLCB0aGlzIHdhcm5pbmdcbiAgICAvLyB3aWxsIGZpcmUgZm9yIGVycm9ycyB0aGF0IGFyZSB0aHJvd24gYnkgZGVzdHJveSBmdW5jdGlvbnMgaW5zaWRlIGRlbGV0ZWRcbiAgICAvLyB0cmVlcy4gV2hhdCBpdCBzaG91bGQgaW5zdGVhZCBkbyBpcyBwcm9wYWdhdGUgdGhlIGVycm9yIHRvIHRoZSBwYXJlbnQgb2ZcbiAgICAvLyB0aGUgZGVsZXRlZCB0cmVlLiBJbiB0aGUgbWVhbnRpbWUsIGRvIG5vdCBhZGQgdGhpcyB3YXJuaW5nIHRvIHRoZVxuICAgIC8vIGFsbG93bGlzdDsgdGhpcyBpcyBvbmx5IGZvciBvdXIgaW50ZXJuYWwgdXNlLlxuICAgIGVycm9yKCdJbnRlcm5hbCBSZWFjdCBlcnJvcjogQXR0ZW1wdGVkIHRvIGNhcHR1cmUgYSBjb21taXQgcGhhc2UgZXJyb3IgJyArICdpbnNpZGUgYSBkZXRhY2hlZCB0cmVlLiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC4gTGlrZWx5ICcgKyAnY2F1c2VzIGluY2x1ZGUgZGVsZXRpbmcgdGhlIHNhbWUgZmliZXIgbW9yZSB0aGFuIG9uY2UsIGNvbW1pdHRpbmcgYW4gJyArICdhbHJlYWR5LWZpbmlzaGVkIHRyZWUsIG9yIGFuIGluY29uc2lzdGVudCByZXR1cm4gcG9pbnRlci5cXG5cXG4nICsgJ0Vycm9yIG1lc3NhZ2U6XFxuXFxuJXMnLCBlcnJvciQxKTtcbiAgfVxufVxuZnVuY3Rpb24gcGluZ1N1c3BlbmRlZFJvb3Qocm9vdCwgd2FrZWFibGUsIHBpbmdlZExhbmVzKSB7XG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcblxuICBpZiAocGluZ0NhY2hlICE9PSBudWxsKSB7XG4gICAgLy8gVGhlIHdha2VhYmxlIHJlc29sdmVkLCBzbyB3ZSBubyBsb25nZXIgbmVlZCB0byBtZW1vaXplLCBiZWNhdXNlIGl0IHdpbGxcbiAgICAvLyBuZXZlciBiZSB0aHJvd24gYWdhaW4uXG4gICAgcGluZ0NhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcyk7XG4gIHdhcm5JZlN1c3BlbnNlUmVzb2x1dGlvbk5vdFdyYXBwZWRXaXRoQWN0REVWKHJvb3QpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHtcbiAgICAvLyBSZWNlaXZlZCBhIHBpbmcgYXQgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgYXQgd2hpY2ggd2UncmUgY3VycmVudGx5XG4gICAgLy8gcmVuZGVyaW5nLiBXZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdGhpcyByZW5kZXIuIFRoaXMgc2hvdWxkIG1pcnJvclxuICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgcmVuZGVyaW5nIHN5bmMgZWl0aGVyIGR1ZSB0byBTeW5jLCBCYXRjaGVkIG9yIGV4cGlyZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIHJlc3RhcnQuXG4gICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmRcbiAgICAvLyBzbyB3ZSBjYW4gYWx3YXlzIHJlc3RhcnQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCAmJiBpbmNsdWRlc09ubHlSZXRyaWVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSAmJiBub3coKSAtIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPCBGQUxMQkFDS19USFJPVFRMRV9NUykge1xuICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LlxuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW5cbiAgICAgIC8vIG9wcG9ydHVuaXR5IGxhdGVyLiBTbyB3ZSBtYXJrIHRoaXMgcmVuZGVyIGFzIGhhdmluZyBhIHBpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMsIHBpbmdlZExhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbn1cblxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpXG4gIC8vIHByZXZpb3VzbHkgd2FzIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0XG4gIC8vIHN1c3BlbmRlZCBpdCBoYXMgcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzXG4gIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGxhbmVzLlxuICBpZiAocmV0cnlMYW5lID09PSBOb0xhbmUpIHtcbiAgICAvLyBUT0RPOiBBc3NpZ24gdGhpcyB0byBgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmVgPyB0byBhdm9pZFxuICAgIC8vIHVubmVjZXNzYXJ5IGVudGFuZ2xlbWVudD9cbiAgICByZXRyeUxhbmUgPSByZXF1ZXN0UmV0cnlMYW5lKGJvdW5kYXJ5RmliZXIpO1xuICB9IC8vIFRPRE86IFNwZWNpYWwgY2FzZSBpZGxlIHByaW9yaXR5P1xuXG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xuXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHJldHJ5TGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIpIHtcbiAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwpIHtcbiAgICByZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgdmFyIHJldHJ5TGFuZSA9IE5vTGFuZTsgLy8gRGVmYXVsdFxuXG4gIHZhciByZXRyeUNhY2hlO1xuXG4gIHN3aXRjaCAoYm91bmRhcnlGaWJlci50YWcpIHtcbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdXNwZW5zZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHJ5TGFuZSA9IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaW5nZWQgdW5rbm93biBzdXNwZW5zZSBib3VuZGFyeSB0eXBlLiAnICsgJ1RoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuJyk7XG4gIH1cblxuICBpZiAocmV0cnlDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHJldHJ5Q2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgfVxuXG4gIHJldHJ5VGltZWRPdXRCb3VuZGFyeShib3VuZGFyeUZpYmVyLCByZXRyeUxhbmUpO1xufSAvLyBDb21wdXRlcyB0aGUgbmV4dCBKdXN0IE5vdGljZWFibGUgRGlmZmVyZW5jZSAoSk5EKSBib3VuZGFyeS5cbi8vIFRoZSB0aGVvcnkgaXMgdGhhdCBhIHBlcnNvbiBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc21hbGwgZGlmZmVyZW5jZXMgaW4gdGltZS5cbi8vIFRoZXJlZm9yZSwgaWYgd2Ugd2FpdCBhIGJpdCBsb25nZXIgdGhhbiBuZWNlc3NhcnkgdGhhdCB3b24ndCB0cmFuc2xhdGUgdG8gYSBub3RpY2VhYmxlXG4vLyBkaWZmZXJlbmNlIGluIHRoZSBleHBlcmllbmNlLiBIb3dldmVyLCB3YWl0aW5nIGZvciBsb25nZXIgbWlnaHQgbWVhbiB0aGF0IHdlIGNhbiBhdm9pZFxuLy8gc2hvd2luZyBhbiBpbnRlcm1lZGlhdGUgbG9hZGluZyBzdGF0ZS4gVGhlIGxvbmdlciB3ZSBoYXZlIGFscmVhZHkgd2FpdGVkLCB0aGUgaGFyZGVyIGl0XG4vLyBpcyB0byB0ZWxsIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuIFRoZXJlZm9yZSwgdGhlIGxvbmdlciB3ZSd2ZSBhbHJlYWR5IHdhaXRlZCxcbi8vIHRoZSBsb25nZXIgd2UgY2FuIHdhaXQgYWRkaXRpb25hbGx5LiBBdCBzb21lIHBvaW50IHdlIGhhdmUgdG8gZ2l2ZSB1cCB0aG91Z2guXG4vLyBXZSBwaWNrIGEgdHJhaW4gbW9kZWwgd2hlcmUgdGhlIG5leHQgYm91bmRhcnkgY29tbWl0cyBhdCBhIGNvbnNpc3RlbnQgc2NoZWR1bGUuXG4vLyBUaGVzZSBwYXJ0aWN1bGFyIG51bWJlcnMgYXJlIHZhZ3VlIGVzdGltYXRlcy4gV2UgZXhwZWN0IHRvIGFkanVzdCB0aGVtIGJhc2VkIG9uIHJlc2VhcmNoLlxuXG5mdW5jdGlvbiBqbmQodGltZUVsYXBzZWQpIHtcbiAgcmV0dXJuIHRpbWVFbGFwc2VkIDwgMTIwID8gMTIwIDogdGltZUVsYXBzZWQgPCA0ODAgPyA0ODAgOiB0aW1lRWxhcHNlZCA8IDEwODAgPyAxMDgwIDogdGltZUVsYXBzZWQgPCAxOTIwID8gMTkyMCA6IHRpbWVFbGFwc2VkIDwgMzAwMCA/IDMwMDAgOiB0aW1lRWxhcHNlZCA8IDQzMjAgPyA0MzIwIDogY2VpbCh0aW1lRWxhcHNlZCAvIDE5NjApICogMTk2MDtcbn1cblxuZnVuY3Rpb24gY2hlY2tGb3JOZXN0ZWRVcGRhdGVzKCkge1xuICBpZiAobmVzdGVkVXBkYXRlQ291bnQgPiBORVNURURfVVBEQVRFX0xJTUlUKSB7XG4gICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xuICAgIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgJyArICdyZXBlYXRlZGx5IGNhbGxzIHNldFN0YXRlIGluc2lkZSBjb21wb25lbnRXaWxsVXBkYXRlIG9yICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiBuZXN0ZWQgdXBkYXRlcyB0byAnICsgJ3ByZXZlbnQgaW5maW5pdGUgbG9vcHMuJyk7XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcbiAgICAgIHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAgICBlcnJvcignTWF4aW11bSB1cGRhdGUgZGVwdGggZXhjZWVkZWQuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgY29tcG9uZW50ICcgKyBcImNhbGxzIHNldFN0YXRlIGluc2lkZSB1c2VFZmZlY3QsIGJ1dCB1c2VFZmZlY3QgZWl0aGVyIGRvZXNuJ3QgXCIgKyAnaGF2ZSBhIGRlcGVuZGVuY3kgYXJyYXksIG9yIG9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIGNoYW5nZXMgb24gJyArICdldmVyeSByZW5kZXIuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoUmVuZGVyUGhhc2VTdHJpY3RNb2RlV2FybmluZ3NJbkRFVigpIHtcbiAge1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcblxuICAgIHtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihmaWJlciwgaGFzUGFzc2l2ZUVmZmVjdHMpIHtcbiAge1xuICAgIC8vIFRPRE8gKFN0cmljdEVmZmVjdHMpIFNob3VsZCB3ZSBzZXQgYSBtYXJrZXIgb24gdGhlIHJvb3QgaWYgaXQgY29udGFpbnMgc3RyaWN0IGVmZmVjdHNcbiAgICAvLyBzbyB3ZSBkb24ndCB0cmF2ZXJzZSB1bm5lY2Vzc2FyaWx5PyBzaW1pbGFyIHRvIHN1YnRyZWVGbGFncyBidXQganVzdCBhdCB0aGUgcm9vdCBsZXZlbC5cbiAgICAvLyBNYXliZSBub3QgYSBiaWcgZGVhbCBzaW5jZSB0aGlzIGlzIERFViBvbmx5IGJlaGF2aW9yLlxuICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudExheW91dERldiwgaW52b2tlTGF5b3V0RWZmZWN0VW5tb3VudEluREVWKTtcblxuICAgIGlmIChoYXNQYXNzaXZlRWZmZWN0cykge1xuICAgICAgaW52b2tlRWZmZWN0c0luRGV2KGZpYmVyLCBNb3VudFBhc3NpdmVEZXYsIGludm9rZVBhc3NpdmVFZmZlY3RVbm1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIGludm9rZUVmZmVjdHNJbkRldihmaWJlciwgTW91bnRMYXlvdXREZXYsIGludm9rZUxheW91dEVmZmVjdE1vdW50SW5ERVYpO1xuXG4gICAgaWYgKGhhc1Bhc3NpdmVFZmZlY3RzKSB7XG4gICAgICBpbnZva2VFZmZlY3RzSW5EZXYoZmliZXIsIE1vdW50UGFzc2l2ZURldiwgaW52b2tlUGFzc2l2ZUVmZmVjdE1vdW50SW5ERVYpO1xuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlRWZmZWN0c0luRGV2KGZpcnN0Q2hpbGQsIGZpYmVyRmxhZ3MsIGludm9rZUVmZmVjdEZuKSB7XG4gIHtcbiAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHJlLWNoZWNrIFN0cmljdEVmZmVjdHNNb2RlIGhlcmUuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB0aGF0IGNoZWNrIGhhcyBhbHJlYWR5IHBhc3NlZC5cbiAgICB2YXIgY3VycmVudCA9IGZpcnN0Q2hpbGQ7XG4gICAgdmFyIHN1YnRyZWVSb290ID0gbnVsbDtcblxuICAgIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJpbWFyeVN1YnRyZWVGbGFnID0gY3VycmVudC5zdWJ0cmVlRmxhZ3MgJiBmaWJlckZsYWdzO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gc3VidHJlZVJvb3QgJiYgY3VycmVudC5jaGlsZCAhPT0gbnVsbCAmJiBwcmltYXJ5U3VidHJlZUZsYWcgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBmaWJlckZsYWdzKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIGludm9rZUVmZmVjdEZuKGN1cnJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3VycmVudCA9IHN1YnRyZWVSb290ID0gY3VycmVudC5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBudWxsO1xuXG5mdW5jdGlvbiB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAvLyBXZSBsZXQgdGhlIG90aGVyIHdhcm5pbmcgYWJvdXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgZGVhbCB3aXRoIHRoaXMgb25lLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghKGZpYmVyLm1vZGUgJiBDb25jdXJyZW50TW9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGFnID0gZmliZXIudGFnO1xuXG4gICAgaWYgKHRhZyAhPT0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCAmJiB0YWcgIT09IEhvc3RSb290ICYmIHRhZyAhPT0gQ2xhc3NDb21wb25lbnQgJiYgdGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiB0YWcgIT09IEZvcndhcmRSZWYgJiYgdGFnICE9PSBNZW1vQ29tcG9uZW50ICYmIHRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCkge1xuICAgICAgLy8gT25seSB3YXJuIGZvciB1c2VyLWRlZmluZWQgY29tcG9uZW50cywgbm90IGludGVybmFsIG9uZXMgbGlrZSBTdXNwZW5zZS5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIHNob3cgdGhlIHdob2xlIHN0YWNrIGJ1dCBkZWR1cGUgb24gdGhlIHRvcCBjb21wb25lbnQncyBuYW1lIGJlY2F1c2VcbiAgICAvLyB0aGUgcHJvYmxlbWF0aWMgY29kZSBhbG1vc3QgYWx3YXlzIGxpZXMgaW5zaWRlIHRoYXQgY29tcG9uZW50LlxuXG5cbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdSZWFjdENvbXBvbmVudCc7XG5cbiAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFtjb21wb25lbnROYW1lXSk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgIGVycm9yKFwiQ2FuJ3QgcGVyZm9ybSBhIFJlYWN0IHN0YXRlIHVwZGF0ZSBvbiBhIGNvbXBvbmVudCB0aGF0IGhhc24ndCBtb3VudGVkIHlldC4gXCIgKyAnVGhpcyBpbmRpY2F0ZXMgdGhhdCB5b3UgaGF2ZSBhIHNpZGUtZWZmZWN0IGluIHlvdXIgcmVuZGVyIGZ1bmN0aW9uIHRoYXQgJyArICdhc3luY2hyb25vdXNseSBsYXRlciBjYWxscyB0cmllcyB0byB1cGRhdGUgdGhlIGNvbXBvbmVudC4gTW92ZSB0aGlzIHdvcmsgdG8gJyArICd1c2VFZmZlY3QgaW5zdGVhZC4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBiZWdpbldvcmskMTtcblxue1xuICB2YXIgZHVtbXlGaWJlciA9IG51bGw7XG5cbiAgYmVnaW5Xb3JrJDEgPSBmdW5jdGlvbiAoY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpIHtcbiAgICAvLyBJZiBhIGNvbXBvbmVudCB0aHJvd3MgYW4gZXJyb3IsIHdlIHJlcGxheSBpdCBhZ2FpbiBpbiBhIHN5bmNocm9ub3VzbHlcbiAgICAvLyBkaXNwYXRjaGVkIGV2ZW50LCBzbyB0aGF0IHRoZSBkZWJ1Z2dlciB3aWxsIHRyZWF0IGl0IGFzIGFuIHVuY2F1Z2h0XG4gICAgLy8gZXJyb3IgU2VlIFJlYWN0RXJyb3JVdGlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGJlZ2luIHBoYXNlLCBjb3B5IHRoZSB3b3JrLWluLXByb2dyZXNzIG9udG8gYSBkdW1teVxuICAgIC8vIGZpYmVyLiBJZiBiZWdpbldvcmsgdGhyb3dzLCB3ZSdsbCB1c2UgdGhpcyB0byByZXNldCB0aGUgc3RhdGUuXG4gICAgdmFyIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5ID0gYXNzaWduRmliZXJQcm9wZXJ0aWVzSW5ERVYoZHVtbXlGaWJlciwgdW5pdE9mV29yayk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGJlZ2luV29yayhjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG4gICAgfSBjYXRjaCAob3JpZ2luYWxFcnJvcikge1xuICAgICAgaWYgKG9yaWdpbmFsRXJyb3IgIT09IG51bGwgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcmlnaW5hbEVycm9yLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRG9uJ3QgcmVwbGF5IHByb21pc2VzLiBUcmVhdCBldmVyeXRoaW5nIGVsc2UgbGlrZSBhbiBlcnJvci5cbiAgICAgICAgdGhyb3cgb3JpZ2luYWxFcnJvcjtcbiAgICAgIH0gLy8gS2VlcCB0aGlzIGNvZGUgaW4gc3luYyB3aXRoIGhhbmRsZUVycm9yOyBhbnkgY2hhbmdlcyBoZXJlIG11c3QgaGF2ZVxuICAgICAgLy8gY29ycmVzcG9uZGluZyBjaGFuZ2VzIHRoZXJlLlxuXG5cbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc0FmdGVyVGhyb3coKTsgLy8gRG9uJ3QgcmVzZXQgY3VycmVudCBkZWJ1ZyBmaWJlciwgc2luY2Ugd2UncmUgYWJvdXQgdG8gd29yayBvbiB0aGVcbiAgICAgIC8vIHNhbWUgZmliZXIgYWdhaW4uXG4gICAgICAvLyBVbndpbmQgdGhlIGZhaWxlZCBzdGFjayBmcmFtZVxuXG4gICAgICB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgdW5pdE9mV29yayk7IC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGZpYmVyLlxuXG4gICAgICBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih1bml0T2ZXb3JrLCBvcmlnaW5hbFdvcmtJblByb2dyZXNzQ29weSk7XG5cbiAgICAgIGlmICggdW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHByb2ZpbGVyIHRpbWVyLlxuICAgICAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgICB9IC8vIFJ1biBiZWdpbldvcmsgYWdhaW4uXG5cblxuICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGJlZ2luV29yaywgbnVsbCwgY3VycmVudCwgdW5pdE9mV29yaywgbGFuZXMpO1xuXG4gICAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgICB2YXIgcmVwbGF5RXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYXlFcnJvciA9PT0gJ29iamVjdCcgJiYgcmVwbGF5RXJyb3IgIT09IG51bGwgJiYgcmVwbGF5RXJyb3IuX3N1cHByZXNzTG9nZ2luZyAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgb3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiAhb3JpZ2luYWxFcnJvci5fc3VwcHJlc3NMb2dnaW5nKSB7XG4gICAgICAgICAgLy8gSWYgc3VwcHJlc3NlZCwgbGV0IHRoZSBmbGFnIGNhcnJ5IG92ZXIgdG8gdGhlIG9yaWdpbmFsIGVycm9yIHdoaWNoIGlzIHRoZSBvbmUgd2UnbGwgcmV0aHJvdy5cbiAgICAgICAgICBvcmlnaW5hbEVycm9yLl9zdXBwcmVzc0xvZ2dpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIGFsd2F5cyB0aHJvdyB0aGUgb3JpZ2luYWwgZXJyb3IgaW4gY2FzZSB0aGUgc2Vjb25kIHJlbmRlciBwYXNzIGlzIG5vdCBpZGVtcG90ZW50LlxuICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGEgbWVtb2l6ZWQgZnVuY3Rpb24gb3IgQ29tbW9uSlMgbW9kdWxlIGRvZXNuJ3QgdGhyb3cgYWZ0ZXIgZmlyc3QgaW52b2NhdGlvbi5cblxuXG4gICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gZmFsc2U7XG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50O1xuXG57XG4gIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykgfHwgJ1Vua25vd24nOyAvLyBEZWR1cGUgYnkgdGhlIHJlbmRlcmluZyBjb21wb25lbnQgYmVjYXVzZSBpdCdzIHRoZSBvbmUgdGhhdCBuZWVkcyB0byBiZSBmaXhlZC5cblxuICAgICAgICAgICAgdmFyIGRlZHVwZUtleSA9IHJlbmRlcmluZ0NvbXBvbmVudE5hbWU7XG5cbiAgICAgICAgICAgIGlmICghZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmhhcyhkZWR1cGVLZXkpKSB7XG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5hZGQoZGVkdXBlS2V5KTtcbiAgICAgICAgICAgICAgdmFyIHNldFN0YXRlQ29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8ICdVbmtub3duJztcblxuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBhIGNvbXBvbmVudCAoYCVzYCkgd2hpbGUgcmVuZGVyaW5nIGEgJyArICdkaWZmZXJlbnQgY29tcG9uZW50IChgJXNgKS4gVG8gbG9jYXRlIHRoZSBiYWQgc2V0U3RhdGUoKSBjYWxsIGluc2lkZSBgJXNgLCAnICsgJ2ZvbGxvdyB0aGUgc3RhY2sgdHJhY2UgYXMgZGVzY3JpYmVkIGluIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zZXRzdGF0ZS1pbi1yZW5kZXInLCBzZXRTdGF0ZUNvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUsIHJlbmRlcmluZ0NvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyKSB7XG4gICAgICAgICAgICAgIGVycm9yKCdDYW5ub3QgdXBkYXRlIGR1cmluZyBhbiBleGlzdGluZyBzdGF0ZSB0cmFuc2l0aW9uIChzdWNoIGFzICcgKyAnd2l0aGluIGByZW5kZXJgKS4gUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSAnICsgJ2Z1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4nKTtcblxuICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcykge1xuICB7XG4gICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KSB7XG4gICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcbiAgICAgIG1lbW9pemVkVXBkYXRlcnMuZm9yRWFjaChmdW5jdGlvbiAoc2NoZWR1bGluZ0ZpYmVyKSB7XG4gICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBzY2hlZHVsaW5nRmliZXIsIGxhbmVzKTtcbiAgICAgIH0pOyAvLyBUaGlzIGZ1bmN0aW9uIGludGVudGlvbmFsbHkgZG9lcyBub3QgY2xlYXIgbWVtb2l6ZWQgdXBkYXRlcnMuXG4gICAgICAvLyBUaG9zZSBtYXkgc3RpbGwgYmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgY29tbWl0XG4gICAgICAvLyBhbmQgYSBmdXR1cmUgb25lIChlLmcuIFN1c3BlbnNlKS5cbiAgICB9XG4gIH1cbn1cbnZhciBmYWtlQWN0Q2FsbGJhY2tOb2RlID0ge307XG5cbmZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2skMShwcmlvcml0eUxldmVsLCBjYWxsYmFjaykge1xuICB7XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGluc2lkZSBhbiBgYWN0YCBzY29wZSwgYnlwYXNzIFNjaGVkdWxlciBhbmQgcHVzaCB0b1xuICAgIC8vIHRoZSBgYWN0YCBxdWV1ZSBpbnN0ZWFkLlxuICAgIHZhciBhY3RRdWV1ZSA9IFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudDtcblxuICAgIGlmIChhY3RRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgYWN0UXVldWUucHVzaChjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZmFrZUFjdENhbGxiYWNrTm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5jZWxDYWxsYmFjayQxKGNhbGxiYWNrTm9kZSkge1xuICBpZiAoIGNhbGxiYWNrTm9kZSA9PT0gZmFrZUFjdENhbGxiYWNrTm9kZSkge1xuICAgIHJldHVybjtcbiAgfSAvLyBJbiBwcm9kdWN0aW9uLCBhbHdheXMgY2FsbCBTY2hlZHVsZXIuIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBzdHJpcHBlZCBvdXQuXG5cblxuICByZXR1cm4gY2FuY2VsQ2FsbGJhY2soY2FsbGJhY2tOb2RlKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkge1xuICAvLyBOZXZlciBmb3JjZSBmbHVzaCBpbiBwcm9kdWN0aW9uLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBnZXQgc3RyaXBwZWQgb3V0LlxuICByZXR1cm4gIFJlYWN0Q3VycmVudEFjdFF1ZXVlJDEuY3VycmVudCAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICBpZiAoIWlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkpIHtcbiAgICAgICAgLy8gTm90IGluIGFuIGFjdCBlbnZpcm9ubWVudC4gTm8gbmVlZCB0byB3YXJuLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlZ2FjeSBtb2RlIGhhcyBhZGRpdGlvbmFsIGNhc2VzIHdoZXJlIHdlIHN1cHByZXNzIGEgd2FybmluZy5cbiAgICAgIGlmICghaXNMZWdhY3lBY3RFbnZpcm9ubWVudCgpKSB7XG4gICAgICAgIC8vIE5vdCBpbiBhbiBhY3QgZW52aXJvbm1lbnQuIE5vIG5lZWQgdG8gd2Fybi5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhlY3V0aW9uQ29udGV4dCAhPT0gTm9Db250ZXh0KSB7XG4gICAgICAgIC8vIExlZ2FjeSBtb2RlIGRvZXNuJ3Qgd2FybiBpZiB0aGUgdXBkYXRlIGlzIGJhdGNoZWQsIGkuZS5cbiAgICAgICAgLy8gYmF0Y2hlZFVwZGF0ZXMgb3IgZmx1c2hTeW5jLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWJlci50YWcgIT09IEZ1bmN0aW9uQ29tcG9uZW50ICYmIGZpYmVyLnRhZyAhPT0gRm9yd2FyZFJlZiAmJiBmaWJlci50YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQpIHtcbiAgICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcHJlLWhvb2tzIGNvZGUsIGxlZ2FjeSBtb2RlIG9ubHlcbiAgICAgICAgLy8gd2FybnMgZm9yIHVwZGF0ZXMgdGhhdCBvcmlnaW5hdGUgZnJvbSBhIGhvb2suXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gd2FybklmU3VzcGVuc2VSZXNvbHV0aW9uTm90V3JhcHBlZFdpdGhBY3RERVYocm9vdCkge1xuICB7XG4gICAgaWYgKHJvb3QudGFnICE9PSBMZWdhY3lSb290ICYmIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiYgUmVhY3RDdXJyZW50QWN0UXVldWUkMS5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJvcignQSBzdXNwZW5kZWQgcmVzb3VyY2UgZmluaXNoZWQgbG9hZGluZyBpbnNpZGUgYSB0ZXN0LCBidXQgdGhlIGV2ZW50ICcgKyAnd2FzIG5vdCB3cmFwcGVkIGluIGFjdCguLi4pLlxcblxcbicgKyAnV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgcmVzb2x2ZXMgc3VzcGVuZGVkIGRhdGEgc2hvdWxkIGJlIHdyYXBwZWQgJyArICdpbnRvIGFjdCguLi4pOlxcblxcbicgKyAnYWN0KCgpID0+IHtcXG4nICsgJyAgLyogZmluaXNoIGxvYWRpbmcgc3VzcGVuZGVkIGRhdGEgKi9cXG4nICsgJ30pO1xcbicgKyAnLyogYXNzZXJ0IG9uIHRoZSBvdXRwdXQgKi9cXG5cXG4nICsgXCJUaGlzIGVuc3VyZXMgdGhhdCB5b3UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3IgdGhlIHVzZXIgd291bGQgc2VlIFwiICsgJ2luIHRoZSBicm93c2VyLicgKyAnIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dyYXAtdGVzdHMtd2l0aC1hY3QnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0SXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0KGlzUnVubmluZykge1xuICB7XG4gICAgaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gaXNSdW5uaW5nO1xuICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL3Byb2QtZXJyb3ItY29kZXMgKi9cbnZhciByZXNvbHZlRmFtaWx5ID0gbnVsbDsgLy8gJEZsb3dGaXhNZSBGbG93IGdldHMgY29uZnVzZWQgYnkgYSBXZWFrU2V0IGZlYXR1cmUgY2hlY2sgYmVsb3cuXG5cbnZhciBmYWlsZWRCb3VuZGFyaWVzID0gbnVsbDtcbnZhciBzZXRSZWZyZXNoSGFuZGxlciA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gIHtcbiAgICByZXNvbHZlRmFtaWx5ID0gaGFuZGxlcjtcbiAgfVxufTtcbmZ1bmN0aW9uIHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIC8vIE5vIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzLlxuICByZXR1cm4gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUZvcndhcmRSZWZGb3JIb3RSZWxvYWRpbmcodHlwZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG5cbiAgICB2YXIgZmFtaWx5ID0gcmVzb2x2ZUZhbWlseSh0eXBlKTtcblxuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgcmVhbCBmb3J3YXJkUmVmLiBEb24ndCB3YW50IHRvIGNyYXNoIGVhcmx5LlxuICAgICAgaWYgKHR5cGUgIT09IG51bGwgJiYgdHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGb3J3YXJkUmVmIGlzIHNwZWNpYWwgYmVjYXVzZSBpdHMgcmVzb2x2ZWQgLnR5cGUgaXMgYW4gb2JqZWN0LFxuICAgICAgICAvLyBidXQgaXQncyBwb3NzaWJsZSB0aGF0IHdlIG9ubHkgaGF2ZSBpdHMgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGluIHRoZSBtYXAuXG4gICAgICAgIC8vIElmIHRoYXQgaW5uZXIgcmVuZGVyIGZ1bmN0aW9uIGlzIGRpZmZlcmVudCwgd2UnbGwgYnVpbGQgYSBuZXcgZm9yd2FyZFJlZiB0eXBlLlxuICAgICAgICB2YXIgY3VycmVudFJlbmRlciA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyh0eXBlLnJlbmRlcik7XG5cbiAgICAgICAgaWYgKHR5cGUucmVuZGVyICE9PSBjdXJyZW50UmVuZGVyKSB7XG4gICAgICAgICAgdmFyIHN5bnRoZXRpY1R5cGUgPSB7XG4gICAgICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICAgICAgICAgIHJlbmRlcjogY3VycmVudFJlbmRlclxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAodHlwZS5kaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzeW50aGV0aWNUeXBlLmRpc3BsYXlOYW1lID0gdHlwZS5kaXNwbGF5TmFtZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gc3ludGhldGljVHlwZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9IC8vIFVzZSB0aGUgbGF0ZXN0IGtub3duIGltcGxlbWVudGF0aW9uLlxuXG5cbiAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhmaWJlciwgZWxlbWVudCkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHByZXZUeXBlID0gZmliZXIuZWxlbWVudFR5cGU7XG4gICAgdmFyIG5leHRUeXBlID0gZWxlbWVudC50eXBlOyAvLyBJZiB3ZSBnb3QgaGVyZSwgd2Uga25vdyB0eXBlcyBhcmVuJ3QgPT09IGVxdWFsLlxuXG4gICAgdmFyIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gZmFsc2U7XG4gICAgdmFyICQkdHlwZW9mTmV4dFR5cGUgPSB0eXBlb2YgbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIG5leHRUeXBlICE9PSBudWxsID8gbmV4dFR5cGUuJCR0eXBlb2YgOiBudWxsO1xuXG4gICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG5leHRUeXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgaW5uZXIgdHlwZSB5ZXQuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGUgbGF6eSBpbm5lciB0eXBlIGlzIHN0YWJsZSxcbiAgICAgICAgICAgIC8vIGFuZCBzbyBpdCBpcyBzdWZmaWNpZW50IHRvIGF2b2lkIHJlY29uY2lsaW5nIGl0IGF3YXkuXG4gICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gdW53cmFwIG9yIGFjdHVhbGx5IHVzZSB0aGUgbmV3IGxhenkgdHlwZS5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgICAgICAgLy8gVE9ETzogaWYgaXQgd2FzIGJ1dCBjYW4gbm8gbG9uZ2VyIGJlIHNpbXBsZSxcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBzZXQgdGhpcy5cbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX0xBWllfVFlQRSkge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IC8vIENoZWNrIGlmIGJvdGggdHlwZXMgaGF2ZSBhIGZhbWlseSBhbmQgaXQncyB0aGUgc2FtZSBvbmUuXG5cblxuICAgIGlmIChuZWVkc0NvbXBhcmVGYW1pbGllcykge1xuICAgICAgLy8gTm90ZTogbWVtbygpIGFuZCBmb3J3YXJkUmVmKCkgd2UnbGwgY29tcGFyZSBvdXRlciByYXRoZXIgdGhhbiBpbm5lciB0eXBlLlxuICAgICAgLy8gVGhpcyBtZWFucyBib3RoIG9mIHRoZW0gbmVlZCB0byBiZSByZWdpc3RlcmVkIHRvIHByZXNlcnZlIHN0YXRlLlxuICAgICAgLy8gSWYgd2UgdW53cmFwcGVkIGFuZCBjb21wYXJlZCB0aGUgaW5uZXIgdHlwZXMgZm9yIHdyYXBwZXJzIGluc3RlYWQsXG4gICAgICAvLyB0aGVuIHdlIHdvdWxkIHJpc2sgZmFsc2VseSBzYXlpbmcgdHdvIHNlcGFyYXRlIG1lbW8oRm9vKVxuICAgICAgLy8gY2FsbHMgYXJlIGVxdWl2YWxlbnQgYmVjYXVzZSB0aGV5IHdyYXAgdGhlIHNhbWUgRm9vIGZ1bmN0aW9uLlxuICAgICAgdmFyIHByZXZGYW1pbHkgPSByZXNvbHZlRmFtaWx5KHByZXZUeXBlKTtcblxuICAgICAgaWYgKHByZXZGYW1pbHkgIT09IHVuZGVmaW5lZCAmJiBwcmV2RmFtaWx5ID09PSByZXNvbHZlRmFtaWx5KG5leHRUeXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIFdlYWtTZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyA9PT0gbnVsbCkge1xuICAgICAgZmFpbGVkQm91bmRhcmllcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgfVxuXG4gICAgZmFpbGVkQm91bmRhcmllcy5hZGQoZmliZXIpO1xuICB9XG59XG52YXIgc2NoZWR1bGVSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIHVwZGF0ZSkge1xuICB7XG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIC8vIEhvdCByZWxvYWRpbmcgaXMgZGlzYWJsZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHN0YWxlRmFtaWxpZXMgPSB1cGRhdGUuc3RhbGVGYW1pbGllcyxcbiAgICAgICAgdXBkYXRlZEZhbWlsaWVzID0gdXBkYXRlLnVwZGF0ZWRGYW1pbGllcztcbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgZmx1c2hTeW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkocm9vdC5jdXJyZW50LCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH0pO1xuICB9XG59O1xudmFyIHNjaGVkdWxlUm9vdCA9IGZ1bmN0aW9uIChyb290LCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocm9vdC5jb250ZXh0ICE9PSBlbXB0eUNvbnRleHRPYmplY3QpIHtcbiAgICAgIC8vIFN1cGVyIGVkZ2UgY2FzZTogcm9vdCBoYXMgYSBsZWdhY3kgX3JlbmRlclN1YnRyZWUgY29udGV4dFxuICAgICAgLy8gYnV0IHdlIGRvbid0IGtub3cgdGhlIHBhcmVudENvbXBvbmVudCBzbyB3ZSBjYW4ndCBwYXNzIGl0LlxuICAgICAgLy8gSnVzdCBpZ25vcmUuIFdlJ2xsIGRlbGV0ZSB0aGlzIHdpdGggX3JlbmRlclN1YnRyZWUgY29kZSBwYXRoIGxhdGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIHJvb3QsIG51bGwsIG51bGwpO1xuICAgIH0pO1xuICB9XG59O1xuXG5mdW5jdGlvbiBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGZpYmVyLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGUsXG4gICAgICAgIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHJlc29sdmVGYW1pbHkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzb2x2ZUZhbWlseSB0byBiZSBzZXQgZHVyaW5nIGhvdCByZWxvYWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIG5lZWRzUmVuZGVyID0gZmFsc2U7XG4gICAgdmFyIG5lZWRzUmVtb3VudCA9IGZhbHNlO1xuXG4gICAgaWYgKGNhbmRpZGF0ZVR5cGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KGNhbmRpZGF0ZVR5cGUpO1xuXG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHN0YWxlRmFtaWxpZXMuaGFzKGZhbWlseSkpIHtcbiAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHVwZGF0ZWRGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIGlmICh0YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZWVkc1JlbmRlciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMgIT09IG51bGwpIHtcbiAgICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzLmhhcyhmaWJlcikgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGZhaWxlZEJvdW5kYXJpZXMuaGFzKGFsdGVybmF0ZSkpIHtcbiAgICAgICAgbmVlZHNSZW1vdW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVlZHNSZW1vdW50KSB7XG4gICAgICBmaWJlci5fZGVidWdOZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQgfHwgbmVlZHNSZW5kZXIpIHtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgIW5lZWRzUmVtb3VudCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShjaGlsZCwgdXBkYXRlZEZhbWlsaWVzLCBzdGFsZUZhbWlsaWVzKTtcbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShzaWJsaW5nLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoID0gZnVuY3Rpb24gKHJvb3QsIGZhbWlsaWVzKSB7XG4gIHtcbiAgICB2YXIgaG9zdEluc3RhbmNlcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgdHlwZXMgPSBuZXcgU2V0KGZhbWlsaWVzLm1hcChmdW5jdGlvbiAoZmFtaWx5KSB7XG4gICAgICByZXR1cm4gZmFtaWx5LmN1cnJlbnQ7XG4gICAgfSkpO1xuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICByZXR1cm4gaG9zdEluc3RhbmNlcztcbiAgfVxufTtcblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KGZpYmVyLCB0eXBlcywgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGNoaWxkID0gZmliZXIuY2hpbGQsXG4gICAgICAgIHNpYmxpbmcgPSBmaWJlci5zaWJsaW5nLFxuICAgICAgICB0YWcgPSBmaWJlci50YWcsXG4gICAgICAgIHR5cGUgPSBmaWJlci50eXBlO1xuICAgIHZhciBjYW5kaWRhdGVUeXBlID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICAgIGNhbmRpZGF0ZVR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGRpZE1hdGNoID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVzLmhhcyhjYW5kaWRhdGVUeXBlKSkge1xuICAgICAgICBkaWRNYXRjaCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZE1hdGNoKSB7XG4gICAgICAvLyBXZSBoYXZlIGEgbWF0Y2guIFRoaXMgb25seSBkcmlsbHMgZG93biB0byB0aGUgY2xvc2VzdCBob3N0IGNvbXBvbmVudHMuXG4gICAgICAvLyBUaGVyZSdzIG5vIG5lZWQgdG8gc2VhcmNoIGRlZXBlciBiZWNhdXNlIGZvciB0aGUgcHVycG9zZSBvZiBnaXZpbmdcbiAgICAgIC8vIHZpc3VhbCBmZWVkYmFjaywgXCJmbGFzaGluZ1wiIG91dGVybW9zdCBwYXJlbnQgcmVjdGFuZ2xlcyBpcyBzdWZmaWNpZW50LlxuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gbWF0Y2gsIG1heWJlIHRoZXJlIHdpbGwgYmUgb25lIGZ1cnRoZXIgZG93biBpbiB0aGUgY2hpbGQgdHJlZS5cbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoY2hpbGQsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2libGluZyAhPT0gbnVsbCkge1xuICAgICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHR5cGVzLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcykge1xuICB7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZpbmRDaGlsZEhvc3RJbnN0YW5jZXNGb3JGaWJlclNoYWxsb3dseShmaWJlciwgaG9zdEluc3RhbmNlcyk7XG5cbiAgICBpZiAoZm91bmRIb3N0SW5zdGFuY2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnkgaG9zdCBjaGlsZHJlbiwgZmFsbGJhY2sgdG8gY2xvc2VzdCBob3N0IHBhcmVudC5cblxuXG4gICAgdmFyIG5vZGUgPSBmaWJlcjtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUudGFnKSB7XG4gICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICBob3N0SW5zdGFuY2VzLmFkZChub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRvIHJlYWNoIHJvb3QgZmlyc3QuJyk7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuICAgIHZhciBmb3VuZEhvc3RJbnN0YW5jZXMgPSBmYWxzZTtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQpIHtcbiAgICAgICAgLy8gV2UgZ290IGEgbWF0Y2guXG4gICAgICAgIGZvdW5kSG9zdEluc3RhbmNlcyA9IHRydWU7XG4gICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTsgLy8gVGhlcmUgbWF5IHN0aWxsIGJlIG1vcmUsIHNvIGtlZXAgc2VhcmNoaW5nLlxuICAgICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZSA9PT0gZmliZXIpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGZpYmVyKSB7XG4gICAgICAgICAgcmV0dXJuIGZvdW5kSG9zdEluc3RhbmNlcztcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBoYXNCYWRNYXBQb2x5ZmlsbDtcblxue1xuICBoYXNCYWRNYXBQb2x5ZmlsbCA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgdmFyIG5vbkV4dGVuc2libGVPYmplY3QgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAqL1xuXG4gICAgbmV3IE1hcChbW25vbkV4dGVuc2libGVPYmplY3QsIG51bGxdXSk7XG4gICAgbmV3IFNldChbbm9uRXh0ZW5zaWJsZU9iamVjdF0pO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbmV3ICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGFib3V0IGJhZCBwb2x5ZmlsbHNcbiAgICBoYXNCYWRNYXBQb2x5ZmlsbCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gSW5zdGFuY2VcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmVsZW1lbnRUeXBlID0gbnVsbDtcbiAgdGhpcy50eXBlID0gbnVsbDtcbiAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlclxuXG4gIHRoaXMucmV0dXJuID0gbnVsbDtcbiAgdGhpcy5jaGlsZCA9IG51bGw7XG4gIHRoaXMuc2libGluZyA9IG51bGw7XG4gIHRoaXMuaW5kZXggPSAwO1xuICB0aGlzLnJlZiA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlOyAvLyBFZmZlY3RzXG5cbiAgdGhpcy5mbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMuc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgdGhpcy5kZWxldGlvbnMgPSBudWxsO1xuICB0aGlzLmxhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgdG8gYXZvaWQgYSB2OCBwZXJmb3JtYW5jZSBjbGlmZi5cbiAgICAvL1xuICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aFxuICAgIC8vIGRvdWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSBGaWJlcnMgdG8gZW5kIHVwIGhhdmluZyBzZXBhcmF0ZSBzaGFwZXMuXG4gICAgLy8gVGhpcyBiZWhhdmlvci9idWcgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uKCkuXG4gICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IG1ha2VzIFJlYWN0IHVudXNhYmx5IHNsb3cgZm9yIHNvbWUgYXBwbGljYXRpb25zLlxuICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBiZWxvdyB3aXRoIGRvdWJsZXMuXG4gICAgLy9cbiAgICAvLyBMZWFybiBtb3JlIGFib3V0IHRoaXMgaGVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MzY1XG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOFxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47IC8vIEl0J3Mgb2theSB0byByZXBsYWNlIHRoZSBpbml0aWFsIGRvdWJsZXMgd2l0aCBzbWlzIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIFRoaXMgd29uJ3QgdHJpZ2dlciB0aGUgcGVyZm9ybWFuY2UgY2xpZmYgbWVudGlvbmVkIGFib3ZlLFxuICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuXG5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IHVzZWQgYnV0IGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxzOlxuICAgIHRoaXMuX2RlYnVnU291cmNlID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z093bmVyID0gbnVsbDtcbiAgICB0aGlzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGZhbHNlO1xuICAgIHRoaXMuX2RlYnVnSG9va1R5cGVzID0gbnVsbDtcblxuICAgIGlmICghaGFzQmFkTWFwUG9seWZpbGwgJiYgdHlwZW9mIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHRoaXMpO1xuICAgIH1cbiAgfVxufSAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGEgUE9KTyBjb25zdHJ1Y3Rvciwgc3RpbGxcbi8vIHBsZWFzZSBlbnN1cmUgd2UgZG8gdGhlIGZvbGxvd2luZzpcbi8vIDEpIE5vYm9keSBzaG91bGQgYWRkIGFueSBpbnN0YW5jZSBtZXRob2RzIG9uIHRoaXMuIEluc3RhbmNlIG1ldGhvZHMgY2FuIGJlXG4vLyAgICBtb3JlIGRpZmZpY3VsdCB0byBwcmVkaWN0IHdoZW4gdGhleSBnZXQgb3B0aW1pemVkIGFuZCB0aGV5IGFyZSBhbG1vc3Rcbi8vICAgIG5ldmVyIGlubGluZWQgcHJvcGVybHkgaW4gc3RhdGljIGNvbXBpbGVycy5cbi8vIDIpIE5vYm9keSBzaG91bGQgcmVseSBvbiBgaW5zdGFuY2VvZiBGaWJlcmAgZm9yIHR5cGUgdGVzdGluZy4gV2Ugc2hvdWxkXG4vLyAgICBhbHdheXMga25vdyB3aGVuIGl0IGlzIGEgZmliZXIuXG4vLyAzKSBXZSBtaWdodCB3YW50IHRvIGV4cGVyaW1lbnQgd2l0aCB1c2luZyBudW1lcmljIGtleXMgc2luY2UgdGhleSBhcmUgZWFzaWVyXG4vLyAgICB0byBvcHRpbWl6ZSBpbiBhIG5vbi1KSVQgZW52aXJvbm1lbnQuXG4vLyA0KSBXZSBjYW4gZWFzaWx5IGdvIGZyb20gYSBjb25zdHJ1Y3RvciB0byBhIGNyZWF0ZUZpYmVyIG9iamVjdCBsaXRlcmFsIGlmIHRoYXRcbi8vICAgIGlzIGZhc3Rlci5cbi8vIDUpIEl0IHNob3VsZCBiZSBlYXN5IHRvIHBvcnQgdGhpcyB0byBhIEMgc3RydWN0IGFuZCBrZWVwIGEgQyBpbXBsZW1lbnRhdGlvblxuLy8gICAgY29tcGF0aWJsZS5cblxuXG52YXIgY3JlYXRlRmliZXIgPSBmdW5jdGlvbiAodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAvLyAkRmxvd0ZpeE1lOiB0aGUgc2hhcGVzIGFyZSBleGFjdCBoZXJlIGJ1dCBGbG93IGRvZXNuJ3QgbGlrZSBjb25zdHJ1Y3RvcnNcbiAgcmV0dXJuIG5ldyBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1NpbXBsZUZ1bmN0aW9uQ29tcG9uZW50KHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmICFzaG91bGRDb25zdHJ1Y3QkMSh0eXBlKSAmJiB0eXBlLmRlZmF1bHRQcm9wcyA9PT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KSB7XG4gIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNob3VsZENvbnN0cnVjdCQxKENvbXBvbmVudCkgPyBDbGFzc0NvbXBvbmVudCA6IEZ1bmN0aW9uQ29tcG9uZW50O1xuICB9IGVsc2UgaWYgKENvbXBvbmVudCAhPT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IENvbXBvbmVudC4kJHR5cGVvZjtcblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSkge1xuICAgICAgcmV0dXJuIEZvcndhcmRSZWY7XG4gICAgfVxuXG4gICAgaWYgKCQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIHJldHVybiBNZW1vQ29tcG9uZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBJbmRldGVybWluYXRlQ29tcG9uZW50O1xufSAvLyBUaGlzIGlzIHVzZWQgdG8gY3JlYXRlIGFuIGFsdGVybmF0ZSBmaWJlciB0byBkbyB3b3JrIG9uLlxuXG5mdW5jdGlvbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBwZW5kaW5nUHJvcHMpIHtcbiAgdmFyIHdvcmtJblByb2dyZXNzID0gY3VycmVudC5hbHRlcm5hdGU7XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzID09PSBudWxsKSB7XG4gICAgLy8gV2UgdXNlIGEgZG91YmxlIGJ1ZmZlcmluZyBwb29saW5nIHRlY2huaXF1ZSBiZWNhdXNlIHdlIGtub3cgdGhhdCB3ZSdsbFxuICAgIC8vIG9ubHkgZXZlciBuZWVkIGF0IG1vc3QgdHdvIHZlcnNpb25zIG9mIGEgdHJlZS4gV2UgcG9vbCB0aGUgXCJvdGhlclwiIHVudXNlZFxuICAgIC8vIG5vZGUgdGhhdCB3ZSdyZSBmcmVlIHRvIHJldXNlLiBUaGlzIGlzIGxhemlseSBjcmVhdGVkIHRvIGF2b2lkIGFsbG9jYXRpbmdcbiAgICAvLyBleHRyYSBvYmplY3RzIGZvciB0aGluZ3MgdGhhdCBhcmUgbmV2ZXIgdXBkYXRlZC4gSXQgYWxzbyBhbGxvdyB1cyB0b1xuICAgIC8vIHJlY2xhaW0gdGhlIGV4dHJhIG1lbW9yeSBpZiBuZWVkZWQuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSBjcmVhdGVGaWJlcihjdXJyZW50LnRhZywgcGVuZGluZ1Byb3BzLCBjdXJyZW50LmtleSwgY3VycmVudC5tb2RlKTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9IGN1cnJlbnQuZWxlbWVudFR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZTtcblxuICAgIHtcbiAgICAgIC8vIERFVi1vbmx5IGZpZWxkc1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnU291cmNlID0gY3VycmVudC5fZGVidWdTb3VyY2U7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcztcbiAgICB9XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gd29ya0luUHJvZ3Jlc3M7XG4gIH0gZWxzZSB7XG4gICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGFsdGVybmF0ZS5cbiAgICAvLyBSZXNldCB0aGUgZWZmZWN0IHRhZy5cblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gTm9GbGFnczsgLy8gVGhlIGVmZmVjdHMgYXJlIG5vIGxvbmdlciB2YWxpZC5cblxuICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IE5vRmxhZ3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgcmVzZXQsIHJhdGhlciB0aGFuIGNvcHksIGFjdHVhbER1cmF0aW9uICYgYWN0dWFsU3RhcnRUaW1lLlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aW1lIGZyb20gZW5kbGVzc2x5IGFjY3VtdWxhdGluZyBpbiBuZXcgY29tbWl0cy5cbiAgICAgIC8vIFRoaXMgaGFzIHRoZSBkb3duc2lkZSBvZiByZXNldHRpbmcgdmFsdWVzIGZvciBkaWZmZXJlbnQgcHJpb3JpdHkgcmVuZGVycyxcbiAgICAgIC8vIEJ1dCB3b3JrcyBmb3IgeWllbGRpbmcgKHRoZSBjb21tb24gY2FzZSkgYW5kIHNob3VsZCBzdXBwb3J0IHJlc3VtaW5nLlxuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgfVxuICB9IC8vIFJlc2V0IGFsbCBlZmZlY3RzIGV4Y2VwdCBzdGF0aWMgb25lcy5cbiAgLy8gU3RhdGljIGVmZmVjdHMgYXJlIG5vdCBzcGVjaWZpYyB0byBhIHJlbmRlci5cblxuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzID0gY3VycmVudC5mbGFncyAmIFN0YXRpY01hc2s7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gIH07IC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG5cbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGN1cnJlbnQuX2RlYnVnTmVlZHNSZW1vdW50O1xuXG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn0gLy8gVXNlZCB0byByZXVzZSBhIEZpYmVyIGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZFxuICAvLyBoYXZlIHNldCB0aGUgdmFsdWVzIHRvIGJlZm9yZSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIElkZWFsbHkgdGhpcyB3b3VsZG4ndFxuICAvLyBiZSBuZWNlc3NhcnkgYnV0IHVuZm9ydHVuYXRlbHkgbWFueSBjb2RlIHBhdGhzIHJlYWRzIGZyb20gdGhlIHdvcmtJblByb2dyZXNzXG4gIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuXG4gIC8vIFdlIGFzc3VtZSBwZW5kaW5nUHJvcHMsIGluZGV4LCBrZXksIHJlZiwgcmV0dXJuIGFyZSBzdGlsbCB1bnRvdWNoZWQgdG9cbiAgLy8gYXZvaWQgZG9pbmcgYW5vdGhlciByZWNvbmNpbGlhdGlvbi5cbiAgLy8gUmVzZXQgdGhlIGVmZmVjdCBmbGFncyBidXQga2VlcCBhbnkgUGxhY2VtZW50IHRhZ3MsIHNpbmNlIHRoYXQncyBzb21ldGhpbmdcbiAgLy8gdGhhdCBjaGlsZCBmaWJlciBpcyBzZXR0aW5nLCBub3QgdGhlIHJlY29uY2lsaWF0aW9uLlxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSBTdGF0aWNNYXNrIHwgUGxhY2VtZW50OyAvLyBUaGUgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUmVzZXQgdG8gY3JlYXRlRmliZXIncyBpbml0aWFsIHZhbHVlcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSBOb0ZsYWdzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBOb3RlOiBXZSBkb24ndCByZXNldCB0aGUgYWN0dWFsVGltZSBjb3VudHMuIEl0J3MgdXNlZnVsIHRvIGFjY3VtdWxhdGVcbiAgICAgIC8vIGFjdHVhbCB0aW1lIGFjcm9zcyBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLlxuICAgICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVzZXQgdG8gdGhlIGNsb25lZCB2YWx1ZXMgdGhhdCBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZCd2ZS5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gY3VycmVudC5jaGlsZExhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gTm9GbGFncztcbiAgICB3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIE5lZWRlZCBiZWNhdXNlIEJsb2NrcyBzdG9yZSBkYXRhIG9uIHR5cGUuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlOyAvLyBDbG9uZSB0aGUgZGVwZW5kZW5jaWVzIG9iamVjdC4gVGhpcyBpcyBtdXRhdGVkIGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLCBzb1xuICAgIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICAgIHZhciBjdXJyZW50RGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudERlcGVuZGVuY2llcyA9PT0gbnVsbCA/IG51bGwgOiB7XG4gICAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICAgIGZpcnN0Q29udGV4dDogY3VycmVudERlcGVuZGVuY2llcy5maXJzdENvbnRleHRcbiAgICB9O1xuXG4gICAge1xuICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgcmVzZXQgdGhlIGFjdHVhbFRpbWUgY291bnRzLiBJdCdzIHVzZWZ1bCB0byBhY2N1bXVsYXRlXG4gICAgICAvLyBhY3R1YWwgdGltZSBhY3Jvc3MgbXVsdGlwbGUgcmVuZGVyIHBhc3Nlcy5cbiAgICAgIHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50LnNlbGZCYXNlRHVyYXRpb247XG4gICAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZUhvc3RSb290RmliZXIodGFnLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUpIHtcbiAgdmFyIG1vZGU7XG5cbiAgaWYgKHRhZyA9PT0gQ29uY3VycmVudFJvb3QpIHtcbiAgICBtb2RlID0gQ29uY3VycmVudE1vZGU7XG5cbiAgICBpZiAoaXNTdHJpY3RNb2RlID09PSB0cnVlKSB7XG4gICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgIHtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RFZmZlY3RzTW9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbW9kZSA9IE5vTW9kZTtcbiAgfVxuXG4gIGlmICggaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAvLyBBbHdheXMgY29sbGVjdCBwcm9maWxlIHRpbWluZ3Mgd2hlbiBEZXZUb29scyBhcmUgcHJlc2VudC5cbiAgICAvLyBUaGlzIGVuYWJsZXMgRGV2VG9vbHMgdG8gc3RhcnQgY2FwdHVyaW5nIHRpbWluZyBhdCBhbnkgcG9pbnRcdTIwMTNcbiAgICAvLyBXaXRob3V0IHNvbWUgbm9kZXMgaW4gdGhlIHRyZWUgaGF2aW5nIGVtcHR5IGJhc2UgdGltZXMuXG4gICAgbW9kZSB8PSBQcm9maWxlTW9kZTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVGaWJlcihIb3N0Um9vdCwgbnVsbCwgbnVsbCwgbW9kZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHModHlwZSwgLy8gUmVhY3QkRWxlbWVudFR5cGVcbmtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIGZpYmVyVGFnID0gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDsgLy8gVGhlIHJlc29sdmVkIHR5cGUgaXMgc2V0IGlmIHdlIGtub3cgd2hhdCB0aGUgZmluYWwgdHlwZSB3aWxsIGJlLiBJLmUuIGl0J3Mgbm90IGxhenkuXG5cbiAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHNob3VsZENvbnN0cnVjdCQxKHR5cGUpKSB7XG4gICAgICBmaWJlclRhZyA9IENsYXNzQ29tcG9uZW50O1xuXG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVDbGFzc0ZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB7XG4gICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICBmaWJlclRhZyA9IEhvc3RDb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgZ2V0VGFnOiBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KHBlbmRpbmdQcm9wcy5jaGlsZHJlbiwgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSBNb2RlO1xuICAgICAgICBtb2RlIHw9IFN0cmljdExlZ2FjeU1vZGU7XG5cbiAgICAgICAgaWYgKCAobW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgICAgLy8gU3RyaWN0IGVmZmVjdHMgc2hvdWxkIG5ldmVyIHJ1biBvbiBsZWdhY3kgcm9vdHNcbiAgICAgICAgICBtb2RlIHw9IFN0cmljdEVmZmVjdHNNb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVByb2ZpbGVyKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2VMaXN0KHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfT0ZGU0NSRUVOX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1NDT1BFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0NBQ0hFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX1RSQUNJTkdfTUFSS0VSX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBjYXNlIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFOlxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRQcm92aWRlcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGNvbnN1bWVyXG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBDb250ZXh0Q29uc3VtZXI7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEZvcndhcmRSZWY7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyhyZXNvbHZlZFR5cGUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IE1lbW9Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTGF6eUNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICByZXNvbHZlZFR5cGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKSA6IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChvd25lck5hbWUpIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBvd25lck5hbWUgKyAnYC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gJyArICdjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpICcgKyAoXCJidXQgZ290OiBcIiArICh0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUpICsgXCIuXCIgKyBpbmZvKSk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBvd25lciA9IG51bGw7XG5cbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wcztcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEZyYWdtZW50LCBlbGVtZW50cywga2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgb2YgdHlwZSBgc3RyaW5nYCBhcyBhIHByb3AuIFJlY2VpdmVkIHRoZSB0eXBlIGAlc2AgaW5zdGVhZC4nLCB0eXBlb2YgcGVuZGluZ1Byb3BzLmlkKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihQcm9maWxlciwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUgfCBQcm9maWxlTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgICAgZWZmZWN0RHVyYXRpb246IDAsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKFN1c3BlbnNlTGlzdENvbXBvbmVudCwgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihPZmZzY3JlZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgdmFyIHByaW1hcnlDaGlsZEluc3RhbmNlID0ge307XG4gIGZpYmVyLnN0YXRlTm9kZSA9IHByaW1hcnlDaGlsZEluc3RhbmNlO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7XG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gJ0RFTEVURUQnO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21EZWh5ZHJhdGVkRnJhZ21lbnQoZGVoeWRyYXRlZE5vZGUpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoRGVoeWRyYXRlZEZyYWdtZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICBmaWJlci5zdGF0ZU5vZGUgPSBkZWh5ZHJhdGVkTm9kZTtcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgbW9kZSwgbGFuZXMpIHtcbiAgdmFyIHBlbmRpbmdQcm9wcyA9IHBvcnRhbC5jaGlsZHJlbiAhPT0gbnVsbCA/IHBvcnRhbC5jaGlsZHJlbiA6IFtdO1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihIb3N0UG9ydGFsLCBwZW5kaW5nUHJvcHMsIHBvcnRhbC5rZXksIG1vZGUpO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICBmaWJlci5zdGF0ZU5vZGUgPSB7XG4gICAgY29udGFpbmVySW5mbzogcG9ydGFsLmNvbnRhaW5lckluZm8sXG4gICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgIC8vIFVzZWQgYnkgcGVyc2lzdGVudCB1cGRhdGVzXG4gICAgaW1wbGVtZW50YXRpb246IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICB9O1xuICByZXR1cm4gZmliZXI7XG59IC8vIFVzZWQgZm9yIHN0YXNoaW5nIFdJUCBwcm9wZXJ0aWVzIHRvIHJlcGxheSBmYWlsZWQgd29yayBpbiBERVYuXG5cbmZ1bmN0aW9uIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHRhcmdldCwgc291cmNlKSB7XG4gIGlmICh0YXJnZXQgPT09IG51bGwpIHtcbiAgICAvLyBUaGlzIEZpYmVyJ3MgaW5pdGlhbCBwcm9wZXJ0aWVzIHdpbGwgYWx3YXlzIGJlIG92ZXJ3cml0dGVuLlxuICAgIC8vIFdlIG9ubHkgdXNlIGEgRmliZXIgdG8gZW5zdXJlIHRoZSBzYW1lIGhpZGRlbiBjbGFzcyBzbyBERVYgaXNuJ3Qgc2xvdy5cbiAgICB0YXJnZXQgPSBjcmVhdGVGaWJlcihJbmRldGVybWluYXRlQ29tcG9uZW50LCBudWxsLCBudWxsLCBOb01vZGUpO1xuICB9IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSB3cml0dGVuIGFzIGEgbGlzdCBvZiBhbGwgcHJvcGVydGllcy5cbiAgLy8gV2UgdHJpZWQgdG8gdXNlIE9iamVjdC5hc3NpZ24oKSBpbnN0ZWFkIGJ1dCB0aGlzIGlzIGNhbGxlZCBpblxuICAvLyB0aGUgaG90dGVzdCBwYXRoLCBhbmQgT2JqZWN0LmFzc2lnbigpIHdhcyB0b28gc2xvdzpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwMlxuICAvLyBUaGlzIGNvZGUgaXMgREVWLW9ubHkgc28gc2l6ZSBpcyBub3QgYSBjb25jZXJuLlxuXG5cbiAgdGFyZ2V0LnRhZyA9IHNvdXJjZS50YWc7XG4gIHRhcmdldC5rZXkgPSBzb3VyY2Uua2V5O1xuICB0YXJnZXQuZWxlbWVudFR5cGUgPSBzb3VyY2UuZWxlbWVudFR5cGU7XG4gIHRhcmdldC50eXBlID0gc291cmNlLnR5cGU7XG4gIHRhcmdldC5zdGF0ZU5vZGUgPSBzb3VyY2Uuc3RhdGVOb2RlO1xuICB0YXJnZXQucmV0dXJuID0gc291cmNlLnJldHVybjtcbiAgdGFyZ2V0LmNoaWxkID0gc291cmNlLmNoaWxkO1xuICB0YXJnZXQuc2libGluZyA9IHNvdXJjZS5zaWJsaW5nO1xuICB0YXJnZXQuaW5kZXggPSBzb3VyY2UuaW5kZXg7XG4gIHRhcmdldC5yZWYgPSBzb3VyY2UucmVmO1xuICB0YXJnZXQucGVuZGluZ1Byb3BzID0gc291cmNlLnBlbmRpbmdQcm9wcztcbiAgdGFyZ2V0Lm1lbW9pemVkUHJvcHMgPSBzb3VyY2UubWVtb2l6ZWRQcm9wcztcbiAgdGFyZ2V0LnVwZGF0ZVF1ZXVlID0gc291cmNlLnVwZGF0ZVF1ZXVlO1xuICB0YXJnZXQubWVtb2l6ZWRTdGF0ZSA9IHNvdXJjZS5tZW1vaXplZFN0YXRlO1xuICB0YXJnZXQuZGVwZW5kZW5jaWVzID0gc291cmNlLmRlcGVuZGVuY2llcztcbiAgdGFyZ2V0Lm1vZGUgPSBzb3VyY2UubW9kZTtcbiAgdGFyZ2V0LmZsYWdzID0gc291cmNlLmZsYWdzO1xuICB0YXJnZXQuc3VidHJlZUZsYWdzID0gc291cmNlLnN1YnRyZWVGbGFncztcbiAgdGFyZ2V0LmRlbGV0aW9ucyA9IHNvdXJjZS5kZWxldGlvbnM7XG4gIHRhcmdldC5sYW5lcyA9IHNvdXJjZS5sYW5lcztcbiAgdGFyZ2V0LmNoaWxkTGFuZXMgPSBzb3VyY2UuY2hpbGRMYW5lcztcbiAgdGFyZ2V0LmFsdGVybmF0ZSA9IHNvdXJjZS5hbHRlcm5hdGU7XG5cbiAge1xuICAgIHRhcmdldC5hY3R1YWxEdXJhdGlvbiA9IHNvdXJjZS5hY3R1YWxEdXJhdGlvbjtcbiAgICB0YXJnZXQuYWN0dWFsU3RhcnRUaW1lID0gc291cmNlLmFjdHVhbFN0YXJ0VGltZTtcbiAgICB0YXJnZXQuc2VsZkJhc2VEdXJhdGlvbiA9IHNvdXJjZS5zZWxmQmFzZUR1cmF0aW9uO1xuICAgIHRhcmdldC50cmVlQmFzZUR1cmF0aW9uID0gc291cmNlLnRyZWVCYXNlRHVyYXRpb247XG4gIH1cblxuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IpIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gIHRoaXMucGVuZGluZ0NoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgdGhpcy5waW5nQ2FjaGUgPSBudWxsO1xuICB0aGlzLmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHRoaXMudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgdGhpcy5jYWxsYmFja1ByaW9yaXR5ID0gTm9MYW5lO1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcbiAgdGhpcy5pZGVudGlmaWVyUHJlZml4ID0gaWRlbnRpZmllclByZWZpeDtcbiAgdGhpcy5vblJlY292ZXJhYmxlRXJyb3IgPSBvblJlY292ZXJhYmxlRXJyb3I7XG5cbiAge1xuICAgIHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9IG51bGw7XG4gIH1cblxuICB7XG4gICAgdGhpcy5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgdGhpcy5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAge1xuICAgIHRoaXMubWVtb2l6ZWRVcGRhdGVycyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgcGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IHRoaXMucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IFtdO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IFRvdGFsTGFuZXM7IF9pKyspIHtcbiAgICAgIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAucHVzaChuZXcgU2V0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZVJvb3QoKScgOiAnY3JlYXRlUm9vdCgpJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgTGVnYWN5Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyAnaHlkcmF0ZSgpJyA6ICdyZW5kZXIoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBpbml0aWFsQ2hpbGRyZW4sIGh5ZHJhdGlvbkNhbGxiYWNrcywgaXNTdHJpY3RNb2RlLCBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLCAvLyBUT0RPOiBXZSBoYXZlIHNldmVyYWwgb2YgdGhlc2UgYXJndW1lbnRzIHRoYXQgYXJlIGNvbmNlcHR1YWxseSBwYXJ0IG9mIHRoZVxuLy8gaG9zdCBjb25maWcsIGJ1dCBiZWNhdXNlIHRoZXkgYXJlIHBhc3NlZCBpbiBhdCBydW50aW1lLCB3ZSBoYXZlIHRvIHRocmVhZFxuLy8gdGhlbSB0aHJvdWdoIHRoZSByb290IGNvbnN0cnVjdG9yLiBQZXJoYXBzIHdlIHNob3VsZCBwdXQgdGhlbSBhbGwgaW50byBhXG4vLyBzaW5nbGUgdHlwZSwgbGlrZSBhIER5bmFtaWNIb3N0Q29uZmlnIHRoYXQgaXMgZGVmaW5lZCBieSB0aGUgcmVuZGVyZXIuXG5pZGVudGlmaWVyUHJlZml4LCBvblJlY292ZXJhYmxlRXJyb3IsIHRyYW5zaXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIC8vIHN0YXRlTm9kZSBpcyBhbnkuXG5cblxuICB2YXIgdW5pbml0aWFsaXplZEZpYmVyID0gY3JlYXRlSG9zdFJvb3RGaWJlcih0YWcsIGlzU3RyaWN0TW9kZSk7XG4gIHJvb3QuY3VycmVudCA9IHVuaW5pdGlhbGl6ZWRGaWJlcjtcbiAgdW5pbml0aWFsaXplZEZpYmVyLnN0YXRlTm9kZSA9IHJvb3Q7XG5cbiAge1xuICAgIHZhciBfaW5pdGlhbFN0YXRlID0ge1xuICAgICAgZWxlbWVudDogaW5pdGlhbENoaWxkcmVuLFxuICAgICAgaXNEZWh5ZHJhdGVkOiBoeWRyYXRlLFxuICAgICAgY2FjaGU6IG51bGwsXG4gICAgICAvLyBub3QgZW5hYmxlZCB5ZXRcbiAgICAgIHRyYW5zaXRpb25zOiBudWxsLFxuICAgICAgcGVuZGluZ1N1c3BlbnNlQm91bmRhcmllczogbnVsbFxuICAgIH07XG4gICAgdW5pbml0aWFsaXplZEZpYmVyLm1lbW9pemVkU3RhdGUgPSBfaW5pdGlhbFN0YXRlO1xuICB9XG5cbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG52YXIgUmVhY3RWZXJzaW9uID0gJzE4LjEuMCc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG5cbiAge1xuICAgIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oa2V5KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnQpLmpvaW4oJywnKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgYSBSZWFjdENvbXBvbmVudC4gS2V5czogXCIgKyBrZXlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZVtjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihob3N0RmliZXIpO1xuXG4gICAgICAgICAgaWYgKGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggaXMgaW5zaWRlIFN0cmljdE1vZGUuICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignJXMgaXMgZGVwcmVjYXRlZCBpbiBTdHJpY3RNb2RlLiAnICsgJyVzIHdhcyBwYXNzZWQgYW4gaW5zdGFuY2Ugb2YgJXMgd2hpY2ggcmVuZGVycyBTdHJpY3RNb2RlIGNoaWxkcmVuLiAnICsgJ0luc3RlYWQsIGFkZCBhIHJlZiBkaXJlY3RseSB0byB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byByZWZlcmVuY2UuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1maW5kLW5vZGUnLCBtZXRob2ROYW1lLCBtZXRob2ROYW1lLCBjb21wb25lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8gSWRlYWxseSB0aGlzIHNob3VsZCByZXNldCB0byBwcmV2aW91cyBidXQgdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGluXG4gICAgICAgICAgLy8gcmVuZGVyIGFuZCB0aGVyZSdzIGFub3RoZXIgd2FybmluZyBmb3IgdGhhdCBhbnl3YXkuXG4gICAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihwcmV2aW91c0ZpYmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaG9zdEZpYmVyLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250YWluZXIoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yLCB0cmFuc2l0aW9uQ2FsbGJhY2tzKSB7XG4gIHZhciBoeWRyYXRlID0gZmFsc2U7XG4gIHZhciBpbml0aWFsQ2hpbGRyZW4gPSBudWxsO1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkNvbnRhaW5lcihpbml0aWFsQ2hpbGRyZW4sIC8vIFRPRE86IFJlbW92ZSBgY2FsbGJhY2tgIHdoZW4gd2UgZGVsZXRlIGxlZ2FjeSBtb2RlLlxuY2FsbGJhY2ssIGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvciwgdHJhbnNpdGlvbkNhbGxiYWNrcykge1xuICB2YXIgaHlkcmF0ZSA9IHRydWU7XG4gIHZhciByb290ID0gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSwgaW5pdGlhbENoaWxkcmVuLCBoeWRyYXRpb25DYWxsYmFja3MsIGlzU3RyaWN0TW9kZSwgY29uY3VycmVudFVwZGF0ZXNCeURlZmF1bHRPdmVycmlkZSwgaWRlbnRpZmllclByZWZpeCwgb25SZWNvdmVyYWJsZUVycm9yKTsgLy8gVE9ETzogTW92ZSB0aGlzIHRvIEZpYmVyUm9vdCBjb25zdHJ1Y3RvclxuXG4gIHJvb3QuY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKG51bGwpOyAvLyBTY2hlZHVsZSB0aGUgaW5pdGlhbCByZW5kZXIuIEluIGEgaHlkcmF0aW9uIHJvb3QsIHRoaXMgaXMgZGlmZmVyZW50IGZyb21cbiAgLy8gYSByZWd1bGFyIHVwZGF0ZSBiZWNhdXNlIHRoZSBpbml0aWFsIHJlbmRlciBtdXN0IG1hdGNoIHdhcyB3YXMgcmVuZGVyZWRcbiAgLy8gb24gdGhlIHNlcnZlci5cbiAgLy8gTk9URTogVGhpcyB1cGRhdGUgaW50ZW50aW9uYWxseSBkb2Vzbid0IGhhdmUgYSBwYXlsb2FkLiBXZSdyZSBvbmx5IHVzaW5nXG4gIC8vIHRoZSB1cGRhdGUgdG8gc2NoZWR1bGUgd29yayBvbiB0aGUgcm9vdCBmaWJlciAoYW5kLCBmb3IgbGVnYWN5IHJvb3RzLCB0b1xuICAvLyBlbnF1ZXVlIHRoZSBjYWxsYmFjayBpZiBvbmUgaXMgcHJvdmlkZWQpLlxuXG4gIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGN1cnJlbnQpO1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGV2ZW50VGltZSwgbGFuZSk7XG4gIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwgPyBjYWxsYmFjayA6IG51bGw7XG4gIGVucXVldWVVcGRhdGUoY3VycmVudCwgdXBkYXRlKTtcbiAgc2NoZWR1bGVJbml0aWFsSHlkcmF0aW9uT25Sb290KHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gdXBkYXRlQ29udGFpbmVyKGVsZW1lbnQsIGNvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaykge1xuICB7XG4gICAgb25TY2hlZHVsZVJvb3QoY29udGFpbmVyLCBlbGVtZW50KTtcbiAgfVxuXG4gIHZhciBjdXJyZW50JDEgPSBjb250YWluZXIuY3VycmVudDtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50JDEpO1xuXG4gIHtcbiAgICBtYXJrUmVuZGVyU2NoZWR1bGVkKGxhbmUpO1xuICB9XG5cbiAgdmFyIGNvbnRleHQgPSBnZXRDb250ZXh0Rm9yU3VidHJlZShwYXJlbnRDb21wb25lbnQpO1xuXG4gIGlmIChjb250YWluZXIuY29udGV4dCA9PT0gbnVsbCkge1xuICAgIGNvbnRhaW5lci5jb250ZXh0ID0gY29udGV4dDtcbiAgfSBlbHNlIHtcbiAgICBjb250YWluZXIucGVuZGluZ0NvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAge1xuICAgIGlmIChpc1JlbmRlcmluZyAmJiBjdXJyZW50ICE9PSBudWxsICYmICFkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ1JlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyAnICsgJ3RyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyIGlzIG5vdCBhbGxvd2VkLiAnICsgJ0lmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiBjb21wb25lbnREaWRVcGRhdGUuXFxuXFxuJyArICdDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnQpIHx8ICdVbmtub3duJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpOyAvLyBDYXV0aW9uOiBSZWFjdCBEZXZUb29scyBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByb3BlcnR5XG4gIC8vIGJlaW5nIGNhbGxlZCBcImVsZW1lbnRcIi5cblxuICB1cGRhdGUucGF5bG9hZCA9IHtcbiAgICBlbGVtZW50OiBlbGVtZW50XG4gIH07XG4gIGNhbGxiYWNrID0gY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaztcblxuICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICB7XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIGVucXVldWVVcGRhdGUoY3VycmVudCQxLCB1cGRhdGUpO1xuICB2YXIgcm9vdCA9IHNjaGVkdWxlVXBkYXRlT25GaWJlcihjdXJyZW50JDEsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIGN1cnJlbnQkMSwgbGFuZSk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cbmZ1bmN0aW9uIGdldFB1YmxpY1Jvb3RJbnN0YW5jZShjb250YWluZXIpIHtcbiAgdmFyIGNvbnRhaW5lckZpYmVyID0gY29udGFpbmVyLmN1cnJlbnQ7XG5cbiAgaWYgKCFjb250YWluZXJGaWJlci5jaGlsZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3dpdGNoIChjb250YWluZXJGaWJlci5jaGlsZC50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICByZXR1cm4gZ2V0UHVibGljSW5zdGFuY2UoY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY29udGFpbmVyRmliZXIuY2hpbGQuc3RhdGVOb2RlO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB2YXIgcm9vdCA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKGlzUm9vdERlaHlkcmF0ZWQocm9vdCkpIHtcbiAgICAgICAgLy8gRmx1c2ggdGhlIGZpcnN0IHNjaGVkdWxlZCBcInVwZGF0ZVwiLlxuICAgICAgICB2YXIgbGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlQZW5kaW5nTGFuZXMocm9vdCk7XG4gICAgICAgIGZsdXNoUm9vdChyb290LCBsYW5lcyk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICAgIH0pOyAvLyBJZiB3ZSdyZSBzdGlsbCBibG9ja2VkIGFmdGVyIHRoaXMsIHdlIG5lZWQgdG8gaW5jcmVhc2VcbiAgICAgIC8vIHRoZSBwcmlvcml0eSBvZiBhbnkgcHJvbWlzZXMgcmVzb2x2aW5nIHdpdGhpbiB0aGlzXG4gICAgICAvLyBib3VuZGFyeSBzbyB0aGF0IHRoZXkgbmV4dCBhdHRlbXB0IGFsc28gaGFzIGhpZ2hlciBwcmkuXG5cbiAgICAgIHZhciByZXRyeUxhbmUgPSBTeW5jTGFuZTtcbiAgICAgIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCByZXRyeUxhbmUpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSkge1xuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHN1c3BlbnNlU3RhdGUgIT09IG51bGwgJiYgc3VzcGVuc2VTdGF0ZS5kZWh5ZHJhdGVkICE9PSBudWxsKSB7XG4gICAgc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUgPSBoaWdoZXJQcmlvcml0eUxhbmUoc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUsIHJldHJ5TGFuZSk7XG4gIH1cbn0gLy8gSW5jcmVhc2VzIHRoZSBwcmlvcml0eSBvZiB0aGVuYWJsZXMgd2hlbiB0aGV5IHJlc29sdmUgd2l0aGluIHRoaXMgYm91bmRhcnkuXG5cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSkge1xuICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgbWFya1JldHJ5TGFuZUltcGwoYWx0ZXJuYXRlLCByZXRyeUxhbmUpO1xuICB9XG59XG5mdW5jdGlvbiBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBhbmQgdGhleSBzaG91bGQgbm90IHN1c3BlbmQgb24gSS9PLFxuICAgIC8vIHNpbmNlIHlvdSBoYXZlIHRvIHdyYXAgYW55dGhpbmcgdGhhdCBtaWdodCBzdXNwZW5kIGluXG4gICAgLy8gU3VzcGVuc2UuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eSQxKGZpYmVyKSB7XG4gIGlmIChmaWJlci50YWcgIT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgLy8gV2UgaWdub3JlIEhvc3RSb290cyBoZXJlIGJlY2F1c2Ugd2UgY2FuJ3QgaW5jcmVhc2VcbiAgICAvLyB0aGVpciBwcmlvcml0eSBvdGhlciB0aGFuIHN5bmNocm9ub3VzbHkgZmx1c2ggaXQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhOb1BvcnRhbHMoZmliZXIpIHtcbiAgdmFyIGhvc3RGaWJlciA9IGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbnZhciBzaG91bGRFcnJvckltcGwgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRFcnJvcihmaWJlcikge1xuICByZXR1cm4gc2hvdWxkRXJyb3JJbXBsKGZpYmVyKTtcbn1cblxudmFyIHNob3VsZFN1c3BlbmRJbXBsID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmZ1bmN0aW9uIHNob3VsZFN1c3BlbmQoZmliZXIpIHtcbiAgcmV0dXJuIHNob3VsZFN1c3BlbmRJbXBsKGZpYmVyKTtcbn1cbnZhciBvdmVycmlkZUhvb2tTdGF0ZSA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHMgPSBudWxsO1xudmFyIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IG51bGw7XG52YXIgc2NoZWR1bGVVcGRhdGUgPSBudWxsO1xudmFyIHNldEVycm9ySGFuZGxlciA9IG51bGw7XG52YXIgc2V0U3VzcGVuc2VIYW5kbGVyID0gbnVsbDtcblxue1xuICB2YXIgY29weVdpdGhEZWxldGVJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRba2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhEZWxldGUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZUltcGwgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCkge1xuICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IGlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gb2xkUGF0aC5sZW5ndGgpIHtcbiAgICAgIHZhciBuZXdLZXkgPSBuZXdQYXRoW2luZGV4XTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgICB1cGRhdGVkW25ld0tleV0gPSB1cGRhdGVkW29sZEtleV07XG5cbiAgICAgIGlmIChpc0FycmF5KHVwZGF0ZWQpKSB7XG4gICAgICAgIHVwZGF0ZWQuc3BsaWNlKG9sZEtleSwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtvbGRLZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICB1cGRhdGVkW29sZEtleV0gPSBjb3B5V2l0aFJlbmFtZUltcGwoIC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcbiAgICAgIG9ialtvbGRLZXldLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZSA9IGZ1bmN0aW9uIChvYmosIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBpZiAob2xkUGF0aC5sZW5ndGggIT09IG5ld1BhdGgubGVuZ3RoKSB7XG4gICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgb2YgdGhlIHNhbWUgbGVuZ3RoJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdQYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBpZiAob2xkUGF0aFtpXSAhPT0gbmV3UGF0aFtpXSkge1xuICAgICAgICAgIHdhcm4oJ2NvcHlXaXRoUmVuYW1lKCkgZXhwZWN0cyBwYXRocyB0byBiZSB0aGUgc2FtZSBleGNlcHQgZm9yIHRoZSBkZWVwZXN0IGtleScpO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvcHlXaXRoUmVuYW1lSW1wbChvYmosIG9sZFBhdGgsIG5ld1BhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldEltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCwgdmFsdWUpIHtcbiAgICBpZiAoaW5kZXggPj0gcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIga2V5ID0gcGF0aFtpbmRleF07XG4gICAgdmFyIHVwZGF0ZWQgPSBpc0FycmF5KG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTsgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuXG4gICAgdXBkYXRlZFtrZXldID0gY29weVdpdGhTZXRJbXBsKG9ialtrZXldLCBwYXRoLCBpbmRleCArIDEsIHZhbHVlKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXQgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCB2YWx1ZSkge1xuICAgIHJldHVybiBjb3B5V2l0aFNldEltcGwob2JqLCBwYXRoLCAwLCB2YWx1ZSk7XG4gIH07XG5cbiAgdmFyIGZpbmRIb29rID0gZnVuY3Rpb24gKGZpYmVyLCBpZCkge1xuICAgIC8vIEZvciBub3csIHRoZSBcImlkXCIgb2Ygc3RhdGVmdWwgaG9va3MgaXMganVzdCB0aGUgc3RhdGVmdWwgaG9vayBpbmRleC5cbiAgICAvLyBUaGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSB3aXRoIGUuZy4gbmVzdGVkIGhvb2tzLlxuICAgIHZhciBjdXJyZW50SG9vayA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoY3VycmVudEhvb2sgIT09IG51bGwgJiYgaWQgPiAwKSB7XG4gICAgICBjdXJyZW50SG9vayA9IGN1cnJlbnRIb29rLm5leHQ7XG4gICAgICBpZC0tO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50SG9vaztcbiAgfTsgLy8gU3VwcG9ydCBEZXZUb29scyBlZGl0YWJsZSB2YWx1ZXMgZm9yIHVzZVN0YXRlIGFuZCB1c2VSZWR1Y2VyLlxuXG5cbiAgb3ZlcnJpZGVIb29rU3RhdGUgPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBwYXRoLCB2YWx1ZSkge1xuICAgIHZhciBob29rID0gZmluZEhvb2soZmliZXIsIGlkKTtcblxuICAgIGlmIChob29rICE9PSBudWxsKSB7XG4gICAgICB2YXIgbmV3U3RhdGUgPSBjb3B5V2l0aFNldChob29rLm1lbW9pemVkU3RhdGUsIHBhdGgsIHZhbHVlKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhSZW5hbWUoaG9vay5tZW1vaXplZFN0YXRlLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIHByb3BzIGZvciBmdW5jdGlvbiBjb21wb25lbnRzLCBmb3J3YXJkUmVmLCBtZW1vLCBob3N0IGNvbXBvbmVudHMsIGV0Yy5cblxuXG4gIG92ZXJyaWRlUHJvcHMgPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgsIHZhbHVlKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhTZXQoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCwgdmFsdWUpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIHBhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aERlbGV0ZShmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9O1xuXG4gIG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhSZW5hbWUoZmliZXIubWVtb2l6ZWRQcm9wcywgb2xkUGF0aCwgbmV3UGF0aCk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfTtcblxuICBzY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfTtcblxuICBzZXRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkRXJyb3JJbXBsKSB7XG4gICAgc2hvdWxkRXJyb3JJbXBsID0gbmV3U2hvdWxkRXJyb3JJbXBsO1xuICB9O1xuXG4gIHNldFN1c3BlbnNlSGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRTdXNwZW5kSW1wbCkge1xuICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50b0RldlRvb2xzKGRldlRvb2xzQ29uZmlnKSB7XG4gIHZhciBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSA9IGRldlRvb2xzQ29uZmlnLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO1xuICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoe1xuICAgIGJ1bmRsZVR5cGU6IGRldlRvb2xzQ29uZmlnLmJ1bmRsZVR5cGUsXG4gICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbixcbiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlclBhY2thZ2VOYW1lLFxuICAgIHJlbmRlcmVyQ29uZmlnOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlckNvbmZpZyxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcyxcbiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aDogb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoLFxuICAgIHNldEVycm9ySGFuZGxlcjogc2V0RXJyb3JIYW5kbGVyLFxuICAgIHNldFN1c3BlbnNlSGFuZGxlcjogc2V0U3VzcGVuc2VIYW5kbGVyLFxuICAgIHNjaGVkdWxlVXBkYXRlOiBzY2hlZHVsZVVwZGF0ZSxcbiAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjogZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIsXG4gICAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlIHx8IGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UsXG4gICAgLy8gUmVhY3QgUmVmcmVzaFxuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDogIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSZWZyZXNoOiAgc2NoZWR1bGVSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLFxuICAgIHNldFJlZnJlc2hIYW5kbGVyOiAgc2V0UmVmcmVzaEhhbmRsZXIgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gYXBwZW5kIG93bmVyIHN0YWNrcyB0byBlcnJvciBtZXNzYWdlcyBpbiBERVYgbW9kZS5cbiAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyAsXG4gICAgLy8gRW5hYmxlcyBEZXZUb29scyB0byBkZXRlY3QgcmVjb25jaWxlciB2ZXJzaW9uIHJhdGhlciB0aGFuIHJlbmRlcmVyIHZlcnNpb25cbiAgICAvLyB3aGljaCBtYXkgbm90IG1hdGNoIGZvciB0aGlyZCBwYXJ0eSByZW5kZXJlcnMuXG4gICAgcmVjb25jaWxlclZlcnNpb246IFJlYWN0VmVyc2lvblxuICB9KTtcbn1cblxuLyogZ2xvYmFsIHJlcG9ydEVycm9yICovXG5cbnZhciBkZWZhdWx0T25SZWNvdmVyYWJsZUVycm9yID0gdHlwZW9mIHJlcG9ydEVycm9yID09PSAnZnVuY3Rpb24nID8gLy8gSW4gbW9kZXJuIGJyb3dzZXJzLCByZXBvcnRFcnJvciB3aWxsIGRpc3BhdGNoIGFuIGVycm9yIGV2ZW50LFxuLy8gZW11bGF0aW5nIGFuIHVuY2F1Z2h0IEphdmFTY3JpcHQgZXJyb3IuXG5yZXBvcnRFcnJvciA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAvLyBJbiBvbGRlciBicm93c2VycyBhbmQgdGVzdCBlbnZpcm9ubWVudHMsIGZhbGxiYWNrIHRvIGNvbnNvbGUuZXJyb3IuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcbiAgY29uc29sZVsnZXJyb3InXShlcnJvcik7XG59O1xuXG5mdW5jdGlvbiBSZWFjdERPTVJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBhbiB1bm1vdW50ZWQgcm9vdC4nKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkQ29udGFpbmVyKGFyZ3VtZW50c1sxXSkpIHtcbiAgICAgIGVycm9yKCdZb3UgcGFzc2VkIGEgY29udGFpbmVyIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQgb2Ygcm9vdC5yZW5kZXIoLi4uKS4gJyArIFwiWW91IGRvbid0IG5lZWQgdG8gcGFzcyBpdCBhZ2FpbiBzaW5jZSB5b3UgYWxyZWFkeSBwYXNzZWQgaXQgdG8gY3JlYXRlIHRoZSByb290LlwiKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignWW91IHBhc3NlZCBhIHNlY29uZCBhcmd1bWVudCB0byByb290LnJlbmRlciguLi4pIGJ1dCBpdCBvbmx5IGFjY2VwdHMgJyArICdvbmUgYXJndW1lbnQuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKHJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhlICcgKyAncm9vdCBjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyBcInJvb3QudW5tb3VudCgpIHRvIGVtcHR5IGEgcm9vdCdzIGNvbnRhaW5lci5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIG51bGwsIG51bGwpO1xufTtcblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCd1bm1vdW50KC4uLik6IGRvZXMgbm90IHN1cHBvcnQgYSBjYWxsYmFjayBhcmd1bWVudC4gJyArICdUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgcmVuZGVyaW5nLCBkZWNsYXJlIGl0IGluIGEgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS4nKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IHRoaXMuX2ludGVybmFsUm9vdDtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IG51bGw7XG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIHtcbiAgICAgIGlmIChpc0FscmVhZHlSZW5kZXJpbmcoKSkge1xuICAgICAgICBlcnJvcignQXR0ZW1wdGVkIHRvIHN5bmNocm9ub3VzbHkgdW5tb3VudCBhIHJvb3Qgd2hpbGUgUmVhY3Qgd2FzIGFscmVhZHkgJyArICdyZW5kZXJpbmcuIFJlYWN0IGNhbm5vdCBmaW5pc2ggdW5tb3VudGluZyB0aGUgcm9vdCB1bnRpbCB0aGUgJyArICdjdXJyZW50IHJlbmRlciBoYXMgY29tcGxldGVkLCB3aGljaCBtYXkgbGVhZCB0byBhIHJhY2UgY29uZGl0aW9uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIobnVsbCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7XG4gIHZhciBpc1N0cmljdE1vZGUgPSBmYWxzZTtcbiAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTtcbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSAnJztcbiAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3I7XG4gIHZhciB0cmFuc2l0aW9uQ2FsbGJhY2tzID0gbnVsbDtcblxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICB7XG4gICAgICBpZiAob3B0aW9ucy5oeWRyYXRlKSB7XG4gICAgICAgIHdhcm4oJ2h5ZHJhdGUgdGhyb3VnaCBjcmVhdGVSb290IGlzIGRlcHJlY2F0ZWQuIFVzZSBSZWFjdERPTUNsaWVudC5oeWRyYXRlUm9vdChjb250YWluZXIsIDxBcHAgLz4pIGluc3RlYWQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucy4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgICAgZXJyb3IoJ1lvdSBwYXNzZWQgYSBKU1ggZWxlbWVudCB0byBjcmVhdGVSb290LiBZb3UgcHJvYmFibHkgbWVhbnQgdG8gJyArICdjYWxsIHJvb3QucmVuZGVyIGluc3RlYWQuICcgKyAnRXhhbXBsZSB1c2FnZTpcXG5cXG4nICsgJyAgbGV0IHJvb3QgPSBjcmVhdGVSb290KGRvbUNvbnRhaW5lcik7XFxuJyArICcgIHJvb3QucmVuZGVyKDxBcHAgLz4pOycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgaXNTdHJpY3RNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZGVudGlmaWVyUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnRyYW5zaXRpb25DYWxsYmFja3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJhbnNpdGlvbkNhbGxiYWNrcyA9IG9wdGlvbnMudHJhbnNpdGlvbkNhbGxiYWNrcztcbiAgICB9XG4gIH1cblxuICB2YXIgcm9vdCA9IGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXIsIENvbmN1cnJlbnRSb290LCBudWxsLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuICB2YXIgcm9vdENvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IGNvbnRhaW5lci5wYXJlbnROb2RlIDogY29udGFpbmVyO1xuICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIHJldHVybiBuZXcgUmVhY3RET01Sb290KHJvb3QpO1xufVxuXG5mdW5jdGlvbiBSZWFjdERPTUh5ZHJhdGlvblJvb3QoaW50ZXJuYWxSb290KSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVIeWRyYXRpb24odGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBxdWV1ZUV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0KHRhcmdldCk7XG4gIH1cbn1cblxuUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbiA9IHNjaGVkdWxlSHlkcmF0aW9uO1xuZnVuY3Rpb24gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2h5ZHJhdGVSb290KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcik7XG5cbiAge1xuICAgIGlmIChpbml0aWFsQ2hpbGRyZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IoJ011c3QgcHJvdmlkZSBpbml0aWFsIGNoaWxkcmVuIGFzIHNlY29uZCBhcmd1bWVudCB0byBoeWRyYXRlUm9vdC4gJyArICdFeGFtcGxlIHVzYWdlOiBoeWRyYXRlUm9vdChkb21Db250YWluZXIsIDxBcHAgLz4pJyk7XG4gICAgfVxuICB9IC8vIEZvciBub3cgd2UgcmV1c2UgdGhlIHdob2xlIGJhZyBvZiBvcHRpb25zIHNpbmNlIHRoZXkgY29udGFpblxuICAvLyB0aGUgaHlkcmF0aW9uIGNhbGxiYWNrcy5cblxuXG4gIHZhciBoeWRyYXRpb25DYWxsYmFja3MgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDogbnVsbDsgLy8gVE9ETzogRGVsZXRlIHRoaXMgb3B0aW9uXG5cbiAgdmFyIG11dGFibGVTb3VyY2VzID0gb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaHlkcmF0ZWRTb3VyY2VzIHx8IG51bGw7XG4gIHZhciBpc1N0cmljdE1vZGUgPSBmYWxzZTtcbiAgdmFyIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUgPSBmYWxzZTtcbiAgdmFyIGlkZW50aWZpZXJQcmVmaXggPSAnJztcbiAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3I7XG5cbiAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgaXNTdHJpY3RNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZGVudGlmaWVyUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBvcHRpb25zLmlkZW50aWZpZXJQcmVmaXg7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgbnVsbCwgY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgaHlkcmF0aW9uQ2FsbGJhY2tzLCBpc1N0cmljdE1vZGUsIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsIGlkZW50aWZpZXJQcmVmaXgsIG9uUmVjb3ZlcmFibGVFcnJvcik7XG4gIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpOyAvLyBUaGlzIGNhbid0IGJlIGEgY29tbWVudCBub2RlIHNpbmNlIGh5ZHJhdGlvbiBkb2Vzbid0IHdvcmsgb24gY29tbWVudCBub2RlcyBhbnl3YXkuXG5cbiAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoY29udGFpbmVyKTtcblxuICBpZiAobXV0YWJsZVNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dGFibGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IG11dGFibGVTb3VyY2VzW2ldO1xuICAgICAgcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhY3RET01IeWRyYXRpb25Sb290KHJvb3QpO1xufVxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8ICFkaXNhYmxlQ29tbWVudHNBc0RPTUNvbnRhaW5lcnMgICkpO1xufSAvLyBUT0RPOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiB3aGljaCBhbHNvIGluY2x1ZGVzIGNvbW1lbnQgbm9kZXMuXG4vLyBXZSBvbmx5IHVzZSBpdCBpbiBwbGFjZXMgdGhhdCBhcmUgY3VycmVudGx5IG1vcmUgcmVsYXhlZC5cblxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lckxlZ2FjeShub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKSB7XG4gIHtcbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgY29udGFpbmVyLnRhZ05hbWUgJiYgY29udGFpbmVyLnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknKSB7XG4gICAgICBlcnJvcignY3JlYXRlUm9vdCgpOiBDcmVhdGluZyByb290cyBkaXJlY3RseSB3aXRoIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSB1c2luZyBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikpIHtcbiAgICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NLnJlbmRlcigpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0ICcgKyAnaGFzIGFscmVhZHkgYmVlbiBwYXNzZWQgdG8gY3JlYXRlUm9vdCgpIGJlZm9yZS4gSW5zdGVhZCwgY2FsbCAnICsgJ3Jvb3QucmVuZGVyKCkgb24gdGhlIGV4aXN0aW5nIHJvb3QgaW5zdGVhZCBpZiB5b3Ugd2FudCB0byB1cGRhdGUgaXQuJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncztcblxue1xuICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciAmJiBjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyLmN1cnJlbnQpO1xuXG4gICAgICBpZiAoaG9zdEluc3RhbmNlKSB7XG4gICAgICAgIGlmIChob3N0SW5zdGFuY2UucGFyZW50Tm9kZSAhPT0gY29udGFpbmVyKSB7XG4gICAgICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBJdCBsb29rcyBsaWtlIHRoZSBSZWFjdC1yZW5kZXJlZCBjb250ZW50IG9mIHRoaXMgJyArICdjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyAnUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSB0byBlbXB0eSBhIGNvbnRhaW5lci4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBpc1Jvb3RSZW5kZXJlZEJ5U29tZVJlYWN0ID0gISFjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcjtcbiAgICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdmFyIGhhc05vblJvb3RSZWFjdENoaWxkID0gISEocm9vdEVsICYmIGdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKSk7XG5cbiAgICBpZiAoaGFzTm9uUm9vdFJlYWN0Q2hpbGQgJiYgIWlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoLi4uKTogUmVwbGFjaW5nIFJlYWN0LXJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBuZXcgcm9vdCAnICsgJ2NvbXBvbmVudC4gSWYgeW91IGludGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCAnICsgJ3lvdSBzaG91bGQgaW5zdGVhZCBoYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiB1cGRhdGUgdGhlaXIgc3RhdGUgJyArICdhbmQgcmVuZGVyIHRoZSBuZXcgY29tcG9uZW50cyBpbnN0ZWFkIG9mIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyLicpO1xuICAgIH1cblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBjb250YWluZXIudGFnTmFtZSAmJiBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnQk9EWScpIHtcbiAgICAgIGVycm9yKCdyZW5kZXIoKTogUmVuZGVyaW5nIGNvbXBvbmVudHMgZGlyZWN0bHkgaW50byBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIHJldHVybiBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub29wT25SZWNvdmVyYWJsZUVycm9yKCkgey8vIFRoaXMgaXNuJ3QgcmVhY2hhYmxlIGJlY2F1c2Ugb25SZWNvdmVyYWJsZUVycm9yIGlzbid0IGNhbGxlZCBpbiB0aGVcbiAgLy8gbGVnYWN5IEFQSS5cbn1cblxuZnVuY3Rpb24gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2ssIGlzSHlkcmF0aW9uQ29udGFpbmVyKSB7XG4gIGlmIChpc0h5ZHJhdGlvbkNvbnRhaW5lcikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciByb290ID0gY3JlYXRlSHlkcmF0aW9uQ29udGFpbmVyKGluaXRpYWxDaGlsZHJlbiwgY2FsbGJhY2ssIGNvbnRhaW5lciwgTGVnYWN5Um9vdCwgbnVsbCwgLy8gaHlkcmF0aW9uQ2FsbGJhY2tzXG4gICAgZmFsc2UsIC8vIGlzU3RyaWN0TW9kZVxuICAgIGZhbHNlLCAvLyBjb25jdXJyZW50VXBkYXRlc0J5RGVmYXVsdE92ZXJyaWRlLFxuICAgICcnLCAvLyBpZGVudGlmaWVyUHJlZml4XG4gICAgbm9vcE9uUmVjb3ZlcmFibGVFcnJvcik7XG4gICAgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPSByb290O1xuICAgIG1hcmtDb250YWluZXJBc1Jvb3Qocm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuICAgIHZhciByb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG4gICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICAgIGZsdXNoU3luYygpO1xuICAgIHJldHVybiByb290O1xuICB9IGVsc2Uge1xuICAgIC8vIEZpcnN0IGNsZWFyIGFueSBleGlzdGluZyBjb250ZW50LlxuICAgIHZhciByb290U2libGluZztcblxuICAgIHdoaWxlIChyb290U2libGluZyA9IGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChyb290U2libGluZyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIF9vcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2s7XG5cbiAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRQdWJsaWNSb290SW5zdGFuY2UoX3Jvb3QpO1xuXG4gICAgICAgIF9vcmlnaW5hbENhbGxiYWNrLmNhbGwoaW5zdGFuY2UpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgX3Jvb3QgPSBjcmVhdGVDb250YWluZXIoY29udGFpbmVyLCBMZWdhY3lSb290LCBudWxsLCAvLyBoeWRyYXRpb25DYWxsYmFja3NcbiAgICBmYWxzZSwgLy8gaXNTdHJpY3RNb2RlXG4gICAgZmFsc2UsIC8vIGNvbmN1cnJlbnRVcGRhdGVzQnlEZWZhdWx0T3ZlcnJpZGUsXG4gICAgJycsIC8vIGlkZW50aWZpZXJQcmVmaXhcbiAgICBub29wT25SZWNvdmVyYWJsZUVycm9yKTtcblxuICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gX3Jvb3Q7XG4gICAgbWFya0NvbnRhaW5lckFzUm9vdChfcm9vdC5jdXJyZW50LCBjb250YWluZXIpO1xuXG4gICAgdmFyIF9yb290Q29udGFpbmVyRWxlbWVudCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFID8gY29udGFpbmVyLnBhcmVudE5vZGUgOiBjb250YWluZXI7XG5cbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhfcm9vdENvbnRhaW5lckVsZW1lbnQpOyAvLyBJbml0aWFsIG1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoaW5pdGlhbENoaWxkcmVuLCBfcm9vdCwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gICAgfSk7XG4gICAgcmV0dXJuIF9yb290O1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhcm5PbkludmFsaWRDYWxsYmFjayQxKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNhbGxlck5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBjaGlsZHJlbiwgY29udGFpbmVyLCBmb3JjZUh5ZHJhdGUsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzKGNvbnRhaW5lcik7XG4gICAgd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjYWxsYmFjaywgJ3JlbmRlcicpO1xuICB9XG5cbiAgdmFyIG1heWJlUm9vdCA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICB2YXIgcm9vdDtcblxuICBpZiAoIW1heWJlUm9vdCkge1xuICAgIC8vIEluaXRpYWwgbW91bnRcbiAgICByb290ID0gbGVnYWN5Q3JlYXRlUm9vdEZyb21ET01Db250YWluZXIoY29udGFpbmVyLCBjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBjYWxsYmFjaywgZm9yY2VIeWRyYXRlKTtcbiAgfSBlbHNlIHtcbiAgICByb290ID0gbWF5YmVSb290O1xuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIG9yaWdpbmFsQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGdldFB1YmxpY1Jvb3RJbnN0YW5jZShyb290KTtcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5jYWxsKGluc3RhbmNlKTtcbiAgICAgIH07XG4gICAgfSAvLyBVcGRhdGVcblxuXG4gICAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCByb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBnZXRQdWJsaWNSb290SW5zdGFuY2Uocm9vdCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICB7XG4gICAgdmFyIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIkMy5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIHdhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gb3duZXIuc3RhdGVOb2RlLl93YXJuZWRBYm91dFJlZnNJblJlbmRlcjtcblxuICAgICAgaWYgKCF3YXJuZWRBYm91dFJlZnNJblJlbmRlcikge1xuICAgICAgICBlcnJvcignJXMgaXMgYWNjZXNzaW5nIGZpbmRET01Ob2RlIGluc2lkZSBpdHMgcmVuZGVyKCkuICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3duZXIudHlwZSkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHtcbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudE9yRWxlbWVudCwgJ2ZpbmRET01Ob2RlJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICB7XG4gICAgZXJyb3IoJ1JlYWN0RE9NLmh5ZHJhdGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBSZWFjdCAxOC4gVXNlIGh5ZHJhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArIFwiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiBcIiArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLmh5ZHJhdGUoKSBvbiBhIGNvbnRhaW5lciB0aGF0IHdhcyBwcmV2aW91c2x5ICcgKyAncGFzc2VkIHRvIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIGh5ZHJhdGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk/Jyk7XG4gICAgfVxuICB9IC8vIFRPRE86IHRocm93IG9yIHdhcm4gaWYgd2UgY291bGRuJ3QgaHlkcmF0ZT9cblxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBlbGVtZW50LCBjb250YWluZXIsIHRydWUsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHJlbmRlcihlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBlcnJvcignUmVhY3RET00ucmVuZGVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUmVhY3QgMTguIFVzZSBjcmVhdGVSb290ICcgKyAnaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byB0aGUgbmV3IEFQSSwgeW91ciBhcHAgd2lsbCBiZWhhdmUgYXMgJyArIFwiaWYgaXQncyBydW5uaW5nIFJlYWN0IDE3LiBMZWFybiBcIiArICdtb3JlOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3dpdGNoLXRvLWNyZWF0ZXJvb3QnKTtcbiAgfVxuXG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LicpO1xuICB9XG5cbiAge1xuICAgIHZhciBpc01vZGVyblJvb3QgPSBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChjb250YWluZXIpICYmIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID09PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNNb2Rlcm5Sb290KSB7XG4gICAgICBlcnJvcignWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NLnJlbmRlcigpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC5yZW5kZXIoZWxlbWVudCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIGVsZW1lbnQsIGNvbnRhaW5lciwgZmFsc2UsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIGVycm9yKCdSZWFjdERPTS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcigpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgJyArICdpbiBSZWFjdCAxOC4gQ29uc2lkZXIgdXNpbmcgYSBwb3J0YWwgaW5zdGVhZC4gVW50aWwgeW91IHN3aXRjaCB0byAnICsgXCJ0aGUgY3JlYXRlUm9vdCBBUEksIHlvdXIgYXBwIHdpbGwgYmVoYXZlIGFzIGlmIGl0J3MgcnVubmluZyBSZWFjdCBcIiArICcxNy4gTGVhcm4gbW9yZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N3aXRjaC10by1jcmVhdGVyb290Jyk7XG4gIH1cblxuICBpZiAoIWlzVmFsaWRDb250YWluZXJMZWdhY3koY29udGFpbmVyTm9kZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICBpZiAocGFyZW50Q29tcG9uZW50ID09IG51bGwgfHwgIWhhcyhwYXJlbnRDb21wb25lbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwYXJlbnRDb21wb25lbnQgbXVzdCBiZSBhIHZhbGlkIFJlYWN0IENvbXBvbmVudCcpO1xuICB9XG5cbiAgcmV0dXJuIGxlZ2FjeVJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgZmFsc2UsIGNhbGxiYWNrKTtcbn1cbmZ1bmN0aW9uIHVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKSB7XG4gIGlmICghaXNWYWxpZENvbnRhaW5lckxlZ2FjeShjb250YWluZXIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bm1vdW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJyk7XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIERpZCB5b3UgbWVhbiB0byBjYWxsIHJvb3QudW5tb3VudCgpPycpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lcikge1xuICAgIHtcbiAgICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICAgIHZhciByZW5kZXJlZEJ5RGlmZmVyZW50UmVhY3QgPSByb290RWwgJiYgIWdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTtcblxuICAgICAgaWYgKHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH0gLy8gVW5tb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyTGVnYWN5KGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0U3luY2hyb25vdXNIeWRyYXRpb24oYXR0ZW1wdFN5bmNocm9ub3VzSHlkcmF0aW9uJDEpO1xuc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5JDEpO1xuc2V0R2V0Q3VycmVudFVwZGF0ZVByaW9yaXR5KGdldEN1cnJlbnRVcGRhdGVQcmlvcml0eSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkpO1xuXG57XG4gIGlmICh0eXBlb2YgTWFwICE9PSAnZnVuY3Rpb24nIHx8IC8vICRGbG93SXNzdWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgTWFwIGhhcyBubyBwcm90b3R5cGVcbiAgTWFwLnByb3RvdHlwZSA9PSBudWxsIHx8IHR5cGVvZiBNYXAucHJvdG90eXBlLmZvckVhY2ggIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFNldCBoYXMgbm8gcHJvdG90eXBlXG4gIFNldC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5jbGVhciAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgU2V0LnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgZXJyb3IoJ1JlYWN0IGRlcGVuZHMgb24gTWFwIGFuZCBTZXQgYnVpbHQtaW4gdHlwZXMuIE1ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxscycpO1xuICB9XG59XG5cbnNldFJlc3RvcmVJbXBsZW1lbnRhdGlvbihyZXN0b3JlQ29udHJvbGxlZFN0YXRlJDMpO1xuc2V0QmF0Y2hpbmdJbXBsZW1lbnRhdGlvbihiYXRjaGVkVXBkYXRlcyQxLCBkaXNjcmV0ZVVwZGF0ZXMsIGZsdXNoU3luYyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbCQxKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKTtcbiAgfSAvLyBUT0RPOiBwYXNzIFJlYWN0RE9NIHBvcnRhbCBpbXBsZW1lbnRhdGlvbiBhcyB0aGlyZCBhcmd1bWVudFxuICAvLyAkRmxvd0ZpeE1lIFRoZSBGbG93IHR5cGUgaXMgb3BhcXVlIGJ1dCB0aGVyZSdzIG5vIHdheSB0byBhY3R1YWxseSBjcmVhdGUgaXQuXG5cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIsIG51bGwsIGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHBhcmVudENvbXBvbmVudCwgZWxlbWVudCwgY29udGFpbmVyTm9kZSwgY2FsbGJhY2spO1xufVxuXG52YXIgSW50ZXJuYWxzID0ge1xuICB1c2luZ0NsaWVudEVudHJ5UG9pbnQ6IGZhbHNlLFxuICAvLyBLZWVwIGluIHN5bmMgd2l0aCBSZWFjdFRlc3RVdGlscy5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGJhdGNoZWRVcGRhdGVzJDFdXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVSb290JDEoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gIHtcbiAgICBpZiAoIUludGVybmFscy51c2luZ0NsaWVudEVudHJ5UG9pbnQgJiYgIWZhbHNlKSB7XG4gICAgICBlcnJvcignWW91IGFyZSBpbXBvcnRpbmcgY3JlYXRlUm9vdCBmcm9tIFwicmVhY3QtZG9tXCIgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3Ugc2hvdWxkIGluc3RlYWQgaW1wb3J0IGl0IGZyb20gXCJyZWFjdC1kb20vY2xpZW50XCIuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVJvb3QoY29udGFpbmVyLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaHlkcmF0ZVJvb3QkMShjb250YWluZXIsIGluaXRpYWxDaGlsZHJlbiwgb3B0aW9ucykge1xuICB7XG4gICAgaWYgKCFJbnRlcm5hbHMudXNpbmdDbGllbnRFbnRyeVBvaW50ICYmICFmYWxzZSkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgaW1wb3J0aW5nIGh5ZHJhdGVSb290IGZyb20gXCJyZWFjdC1kb21cIiB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBzaG91bGQgaW5zdGVhZCBpbXBvcnQgaXQgZnJvbSBcInJlYWN0LWRvbS9jbGllbnRcIi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaHlkcmF0ZVJvb3QoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpO1xufSAvLyBPdmVybG9hZCB0aGUgZGVmaW5pdGlvbiB0byB0aGUgdHdvIHZhbGlkIHNpZ25hdHVyZXMuXG4vLyBXYXJuaW5nLCB0aGlzIG9wdHMtb3V0IG9mIGNoZWNraW5nIHRoZSBmdW5jdGlvbiBib2R5LlxuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcbmZ1bmN0aW9uIGZsdXNoU3luYyQxKGZuKSB7XG4gIHtcbiAgICBpZiAoaXNBbHJlYWR5UmVuZGVyaW5nKCkpIHtcbiAgICAgIGVycm9yKCdmbHVzaFN5bmMgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIGxpZmVjeWNsZSBtZXRob2QuIFJlYWN0IGNhbm5vdCAnICsgJ2ZsdXNoIHdoZW4gUmVhY3QgaXMgYWxyZWFkeSByZW5kZXJpbmcuIENvbnNpZGVyIG1vdmluZyB0aGlzIGNhbGwgdG8gJyArICdhIHNjaGVkdWxlciB0YXNrIG9yIG1pY3JvIHRhc2suJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsdXNoU3luYyhmbik7XG59XG52YXIgZm91bmREZXZUb29scyA9IGluamVjdEludG9EZXZUb29scyh7XG4gIGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgYnVuZGxlVHlwZTogIDEgLFxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG4gIHJlbmRlcmVyUGFja2FnZU5hbWU6ICdyZWFjdC1kb20nXG59KTtcblxue1xuICBpZiAoIWZvdW5kRGV2VG9vbHMgJiYgY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7XG4gICAgLy8gSWYgd2UncmUgaW4gQ2hyb21lIG9yIEZpcmVmb3gsIHByb3ZpZGUgYSBkb3dubG9hZCBsaW5rIGlmIG5vdCBpbnN0YWxsZWQuXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgdmFyIHByb3RvY29sID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sOyAvLyBEb24ndCB3YXJuIGluIGV4b3RpYyBjYXNlcyBsaWtlIGNocm9tZS1leHRlbnNpb246Ly8uXG5cbiAgICAgIGlmICgvXihodHRwcz98ZmlsZSk6JC8udGVzdChwcm90b2NvbCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuICAgICAgICBjb25zb2xlLmluZm8oJyVjRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LWRldnRvb2xzJyArIChwcm90b2NvbCA9PT0gJ2ZpbGU6JyA/ICdcXG5Zb3UgbWlnaHQgbmVlZCB0byB1c2UgYSBsb2NhbCBIVFRQIHNlcnZlciAoaW5zdGVhZCBvZiBmaWxlOi8vKTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMtZmFxJyA6ICcnKSwgJ2ZvbnQtd2VpZ2h0OmJvbGQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IEludGVybmFscztcbmV4cG9ydHMuY3JlYXRlUG9ydGFsID0gY3JlYXRlUG9ydGFsJDE7XG5leHBvcnRzLmNyZWF0ZVJvb3QgPSBjcmVhdGVSb290JDE7XG5leHBvcnRzLmZpbmRET01Ob2RlID0gZmluZERPTU5vZGU7XG5leHBvcnRzLmZsdXNoU3luYyA9IGZsdXNoU3luYyQxO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBoeWRyYXRlUm9vdCQxO1xuZXhwb3J0cy5yZW5kZXIgPSByZW5kZXI7XG5leHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGUgPSB1bm1vdW50Q29tcG9uZW50QXROb2RlO1xuZXhwb3J0cy51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyA9IGJhdGNoZWRVcGRhdGVzJDE7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gICAgICAgICAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKFxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wID09PVxuICAgICdmdW5jdGlvbidcbikge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AobmV3IEVycm9yKCkpO1xufVxuICAgICAgICBcbiAgfSkoKTtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gbS5jcmVhdGVSb290O1xuICBleHBvcnRzLmh5ZHJhdGVSb290ID0gbS5oeWRyYXRlUm9vdDtcbn0gZWxzZSB7XG4gIHZhciBpID0gbS5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcbiAgZXhwb3J0cy5jcmVhdGVSb290ID0gZnVuY3Rpb24oYywgbykge1xuICAgIGkudXNpbmdDbGllbnRFbnRyeVBvaW50ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG0uY3JlYXRlUm9vdChjLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbihjLCBoLCBvKSB7XG4gICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbS5oeWRyYXRlUm9vdChjLCBoLCBvKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaS51c2luZ0NsaWVudEVudHJ5UG9pbnQgPSBmYWxzZTtcbiAgICB9XG4gIH07XG59XG4iLCAiLyohXG4gKiBkZXBkXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE4IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHJlbGF0aXZlID0gcmVxdWlyZSgncGF0aCcpLnJlbGF0aXZlXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXBkXG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIHRvIGJhc2UgZmlsZXMgb24uXG4gKi9cblxudmFyIGJhc2VQYXRoID0gcHJvY2Vzcy5jd2QoKVxuXG4vKipcbiAqIERldGVybWluZSBpZiBuYW1lc3BhY2UgaXMgY29udGFpbmVkIGluIHRoZSBzdHJpbmcuXG4gKi9cblxuZnVuY3Rpb24gY29udGFpbnNOYW1lc3BhY2UgKHN0ciwgbmFtZXNwYWNlKSB7XG4gIHZhciB2YWxzID0gc3RyLnNwbGl0KC9bICxdKy8pXG4gIHZhciBucyA9IFN0cmluZyhuYW1lc3BhY2UpLnRvTG93ZXJDYXNlKClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdmFsID0gdmFsc1tpXVxuXG4gICAgLy8gbmFtZXNwYWNlIGNvbnRhaW5lZFxuICAgIGlmICh2YWwgJiYgKHZhbCA9PT0gJyonIHx8IHZhbC50b0xvd2VyQ2FzZSgpID09PSBucykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ29udmVydCBhIGRhdGEgZGVzY3JpcHRvciB0byBhY2Nlc3NvciBkZXNjcmlwdG9yLlxuICovXG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRhRGVzY3JpcHRvclRvQWNjZXNzb3IgKG9iaiwgcHJvcCwgbWVzc2FnZSkge1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKVxuICB2YXIgdmFsdWUgPSBkZXNjcmlwdG9yLnZhbHVlXG5cbiAgZGVzY3JpcHRvci5nZXQgPSBmdW5jdGlvbiBnZXR0ZXIgKCkgeyByZXR1cm4gdmFsdWUgfVxuXG4gIGlmIChkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgZGVzY3JpcHRvci5zZXQgPSBmdW5jdGlvbiBzZXR0ZXIgKHZhbCkgeyByZXR1cm4gKHZhbHVlID0gdmFsKSB9XG4gIH1cblxuICBkZWxldGUgZGVzY3JpcHRvci52YWx1ZVxuICBkZWxldGUgZGVzY3JpcHRvci53cml0YWJsZVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2NyaXB0b3IpXG5cbiAgcmV0dXJuIGRlc2NyaXB0b3Jcbn1cblxuLyoqXG4gKiBDcmVhdGUgYXJndW1lbnRzIHN0cmluZyB0byBrZWVwIGFyaXR5LlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUFyZ3VtZW50c1N0cmluZyAoYXJpdHkpIHtcbiAgdmFyIHN0ciA9ICcnXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcml0eTsgaSsrKSB7XG4gICAgc3RyICs9ICcsIGFyZycgKyBpXG4gIH1cblxuICByZXR1cm4gc3RyLnN1YnN0cigyKVxufVxuXG4vKipcbiAqIENyZWF0ZSBzdGFjayBzdHJpbmcgZnJvbSBzdGFjay5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdGFja1N0cmluZyAoc3RhY2spIHtcbiAgdmFyIHN0ciA9IHRoaXMubmFtZSArICc6ICcgKyB0aGlzLm5hbWVzcGFjZVxuXG4gIGlmICh0aGlzLm1lc3NhZ2UpIHtcbiAgICBzdHIgKz0gJyBkZXByZWNhdGVkICcgKyB0aGlzLm1lc3NhZ2VcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICBzdHIgKz0gJ1xcbiAgICBhdCAnICsgc3RhY2tbaV0udG9TdHJpbmcoKVxuICB9XG5cbiAgcmV0dXJuIHN0clxufVxuXG4vKipcbiAqIENyZWF0ZSBkZXByZWNhdGUgZm9yIG5hbWVzcGFjZSBpbiBjYWxsZXIuXG4gKi9cblxuZnVuY3Rpb24gZGVwZCAobmFtZXNwYWNlKSB7XG4gIGlmICghbmFtZXNwYWNlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgbmFtZXNwYWNlIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIHZhciBzdGFjayA9IGdldFN0YWNrKClcbiAgdmFyIHNpdGUgPSBjYWxsU2l0ZUxvY2F0aW9uKHN0YWNrWzFdKVxuICB2YXIgZmlsZSA9IHNpdGVbMF1cblxuICBmdW5jdGlvbiBkZXByZWNhdGUgKG1lc3NhZ2UpIHtcbiAgICAvLyBjYWxsIHRvIHNlbGYgYXMgbG9nXG4gICAgbG9nLmNhbGwoZGVwcmVjYXRlLCBtZXNzYWdlKVxuICB9XG5cbiAgZGVwcmVjYXRlLl9maWxlID0gZmlsZVxuICBkZXByZWNhdGUuX2lnbm9yZWQgPSBpc2lnbm9yZWQobmFtZXNwYWNlKVxuICBkZXByZWNhdGUuX25hbWVzcGFjZSA9IG5hbWVzcGFjZVxuICBkZXByZWNhdGUuX3RyYWNlZCA9IGlzdHJhY2VkKG5hbWVzcGFjZSlcbiAgZGVwcmVjYXRlLl93YXJuZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgZGVwcmVjYXRlLmZ1bmN0aW9uID0gd3JhcGZ1bmN0aW9uXG4gIGRlcHJlY2F0ZS5wcm9wZXJ0eSA9IHdyYXBwcm9wZXJ0eVxuXG4gIHJldHVybiBkZXByZWNhdGVcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgZXZlbnQgZW1pdHRlciBoYXMgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gdHlwZS5cbiAqXG4gKiBUaGUgd2F5IHRvIGRvIHRoaXMgY2hlY2sgaXMgZG9uZSB0aHJlZSBkaWZmZXJlbnQgd2F5cyBpbiBOb2RlLmpzID49IDAuOFxuICogc28gdGhpcyBjb25zb2xpZGF0ZXMgdGhlbSBpbnRvIGEgbWluaW1hbCBzZXQgdXNpbmcgaW5zdGFuY2UgbWV0aG9kcy5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlclxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBlZWhhc2xpc3RlbmVycyAoZW1pdHRlciwgdHlwZSkge1xuICB2YXIgY291bnQgPSB0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ICE9PSAnZnVuY3Rpb24nXG4gICAgPyBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGhcbiAgICA6IGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKVxuXG4gIHJldHVybiBjb3VudCA+IDBcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgbmFtZXNwYWNlIGlzIGlnbm9yZWQuXG4gKi9cblxuZnVuY3Rpb24gaXNpZ25vcmVkIChuYW1lc3BhY2UpIHtcbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbikge1xuICAgIC8vIC0tbm8tZGVwcmVjYXRpb24gc3VwcG9ydFxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICB2YXIgc3RyID0gcHJvY2Vzcy5lbnYuTk9fREVQUkVDQVRJT04gfHwgJydcblxuICAvLyBuYW1lc3BhY2UgaWdub3JlZFxuICByZXR1cm4gY29udGFpbnNOYW1lc3BhY2Uoc3RyLCBuYW1lc3BhY2UpXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIG5hbWVzcGFjZSBpcyB0cmFjZWQuXG4gKi9cblxuZnVuY3Rpb24gaXN0cmFjZWQgKG5hbWVzcGFjZSkge1xuICBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgLy8gLS10cmFjZS1kZXByZWNhdGlvbiBzdXBwb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHZhciBzdHIgPSBwcm9jZXNzLmVudi5UUkFDRV9ERVBSRUNBVElPTiB8fCAnJ1xuXG4gIC8vIG5hbWVzcGFjZSB0cmFjZWRcbiAgcmV0dXJuIGNvbnRhaW5zTmFtZXNwYWNlKHN0ciwgbmFtZXNwYWNlKVxufVxuXG4vKipcbiAqIERpc3BsYXkgZGVwcmVjYXRpb24gbWVzc2FnZS5cbiAqL1xuXG5mdW5jdGlvbiBsb2cgKG1lc3NhZ2UsIHNpdGUpIHtcbiAgdmFyIGhhc2xpc3RlbmVycyA9IGVlaGFzbGlzdGVuZXJzKHByb2Nlc3MsICdkZXByZWNhdGlvbicpXG5cbiAgLy8gYWJvcnQgZWFybHkgaWYgbm8gZGVzdGluYXRpb25cbiAgaWYgKCFoYXNsaXN0ZW5lcnMgJiYgdGhpcy5faWdub3JlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGNhbGxlclxuICB2YXIgY2FsbEZpbGVcbiAgdmFyIGNhbGxTaXRlXG4gIHZhciBkZXBTaXRlXG4gIHZhciBpID0gMFxuICB2YXIgc2VlbiA9IGZhbHNlXG4gIHZhciBzdGFjayA9IGdldFN0YWNrKClcbiAgdmFyIGZpbGUgPSB0aGlzLl9maWxlXG5cbiAgaWYgKHNpdGUpIHtcbiAgICAvLyBwcm92aWRlZCBzaXRlXG4gICAgZGVwU2l0ZSA9IHNpdGVcbiAgICBjYWxsU2l0ZSA9IGNhbGxTaXRlTG9jYXRpb24oc3RhY2tbMV0pXG4gICAgY2FsbFNpdGUubmFtZSA9IGRlcFNpdGUubmFtZVxuICAgIGZpbGUgPSBjYWxsU2l0ZVswXVxuICB9IGVsc2Uge1xuICAgIC8vIGdldCBjYWxsIHNpdGVcbiAgICBpID0gMlxuICAgIGRlcFNpdGUgPSBjYWxsU2l0ZUxvY2F0aW9uKHN0YWNrW2ldKVxuICAgIGNhbGxTaXRlID0gZGVwU2l0ZVxuICB9XG5cbiAgLy8gZ2V0IGNhbGxlciBvZiBkZXByZWNhdGVkIHRoaW5nIGluIHJlbGF0aW9uIHRvIGZpbGVcbiAgZm9yICg7IGkgPCBzdGFjay5sZW5ndGg7IGkrKykge1xuICAgIGNhbGxlciA9IGNhbGxTaXRlTG9jYXRpb24oc3RhY2tbaV0pXG4gICAgY2FsbEZpbGUgPSBjYWxsZXJbMF1cblxuICAgIGlmIChjYWxsRmlsZSA9PT0gZmlsZSkge1xuICAgICAgc2VlbiA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGNhbGxGaWxlID09PSB0aGlzLl9maWxlKSB7XG4gICAgICBmaWxlID0gdGhpcy5fZmlsZVxuICAgIH0gZWxzZSBpZiAoc2Vlbikge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICB2YXIga2V5ID0gY2FsbGVyXG4gICAgPyBkZXBTaXRlLmpvaW4oJzonKSArICdfXycgKyBjYWxsZXIuam9pbignOicpXG4gICAgOiB1bmRlZmluZWRcblxuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYga2V5IGluIHRoaXMuX3dhcm5lZCkge1xuICAgIC8vIGFscmVhZHkgd2FybmVkXG4gICAgcmV0dXJuXG4gIH1cblxuICB0aGlzLl93YXJuZWRba2V5XSA9IHRydWVcblxuICAvLyBnZW5lcmF0ZSBhdXRvbWF0aWMgbWVzc2FnZSBmcm9tIGNhbGwgc2l0ZVxuICB2YXIgbXNnID0gbWVzc2FnZVxuICBpZiAoIW1zZykge1xuICAgIG1zZyA9IGNhbGxTaXRlID09PSBkZXBTaXRlIHx8ICFjYWxsU2l0ZS5uYW1lXG4gICAgICA/IGRlZmF1bHRNZXNzYWdlKGRlcFNpdGUpXG4gICAgICA6IGRlZmF1bHRNZXNzYWdlKGNhbGxTaXRlKVxuICB9XG5cbiAgLy8gZW1pdCBkZXByZWNhdGlvbiBpZiBsaXN0ZW5lcnMgZXhpc3RcbiAgaWYgKGhhc2xpc3RlbmVycykge1xuICAgIHZhciBlcnIgPSBEZXByZWNhdGlvbkVycm9yKHRoaXMuX25hbWVzcGFjZSwgbXNnLCBzdGFjay5zbGljZShpKSlcbiAgICBwcm9jZXNzLmVtaXQoJ2RlcHJlY2F0aW9uJywgZXJyKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gZm9ybWF0IGFuZCB3cml0ZSBtZXNzYWdlXG4gIHZhciBmb3JtYXQgPSBwcm9jZXNzLnN0ZGVyci5pc1RUWVxuICAgID8gZm9ybWF0Q29sb3JcbiAgICA6IGZvcm1hdFBsYWluXG4gIHZhciBvdXRwdXQgPSBmb3JtYXQuY2FsbCh0aGlzLCBtc2csIGNhbGxlciwgc3RhY2suc2xpY2UoaSkpXG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlKG91dHB1dCArICdcXG4nLCAndXRmOCcpXG59XG5cbi8qKlxuICogR2V0IGNhbGwgc2l0ZSBsb2NhdGlvbiBhcyBhcnJheS5cbiAqL1xuXG5mdW5jdGlvbiBjYWxsU2l0ZUxvY2F0aW9uIChjYWxsU2l0ZSkge1xuICB2YXIgZmlsZSA9IGNhbGxTaXRlLmdldEZpbGVOYW1lKCkgfHwgJzxhbm9ueW1vdXM+J1xuICB2YXIgbGluZSA9IGNhbGxTaXRlLmdldExpbmVOdW1iZXIoKVxuICB2YXIgY29sbSA9IGNhbGxTaXRlLmdldENvbHVtbk51bWJlcigpXG5cbiAgaWYgKGNhbGxTaXRlLmlzRXZhbCgpKSB7XG4gICAgZmlsZSA9IGNhbGxTaXRlLmdldEV2YWxPcmlnaW4oKSArICcsICcgKyBmaWxlXG4gIH1cblxuICB2YXIgc2l0ZSA9IFtmaWxlLCBsaW5lLCBjb2xtXVxuXG4gIHNpdGUuY2FsbFNpdGUgPSBjYWxsU2l0ZVxuICBzaXRlLm5hbWUgPSBjYWxsU2l0ZS5nZXRGdW5jdGlvbk5hbWUoKVxuXG4gIHJldHVybiBzaXRlXG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBkZWZhdWx0IG1lc3NhZ2UgZnJvbSB0aGUgc2l0ZS5cbiAqL1xuXG5mdW5jdGlvbiBkZWZhdWx0TWVzc2FnZSAoc2l0ZSkge1xuICB2YXIgY2FsbFNpdGUgPSBzaXRlLmNhbGxTaXRlXG4gIHZhciBmdW5jTmFtZSA9IHNpdGUubmFtZVxuXG4gIC8vIG1ha2UgdXNlZnVsIGFub255bW91cyBuYW1lXG4gIGlmICghZnVuY05hbWUpIHtcbiAgICBmdW5jTmFtZSA9ICc8YW5vbnltb3VzQCcgKyBmb3JtYXRMb2NhdGlvbihzaXRlKSArICc+J1xuICB9XG5cbiAgdmFyIGNvbnRleHQgPSBjYWxsU2l0ZS5nZXRUaGlzKClcbiAgdmFyIHR5cGVOYW1lID0gY29udGV4dCAmJiBjYWxsU2l0ZS5nZXRUeXBlTmFtZSgpXG5cbiAgLy8gaWdub3JlIHVzZWxlc3MgdHlwZSBuYW1lXG4gIGlmICh0eXBlTmFtZSA9PT0gJ09iamVjdCcpIHtcbiAgICB0eXBlTmFtZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gbWFrZSB1c2VmdWwgdHlwZSBuYW1lXG4gIGlmICh0eXBlTmFtZSA9PT0gJ0Z1bmN0aW9uJykge1xuICAgIHR5cGVOYW1lID0gY29udGV4dC5uYW1lIHx8IHR5cGVOYW1lXG4gIH1cblxuICByZXR1cm4gdHlwZU5hbWUgJiYgY2FsbFNpdGUuZ2V0TWV0aG9kTmFtZSgpXG4gICAgPyB0eXBlTmFtZSArICcuJyArIGZ1bmNOYW1lXG4gICAgOiBmdW5jTmFtZVxufVxuXG4vKipcbiAqIEZvcm1hdCBkZXByZWNhdGlvbiBtZXNzYWdlIHdpdGhvdXQgY29sb3IuXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0UGxhaW4gKG1zZywgY2FsbGVyLCBzdGFjaykge1xuICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG5cbiAgdmFyIGZvcm1hdHRlZCA9IHRpbWVzdGFtcCArXG4gICAgJyAnICsgdGhpcy5fbmFtZXNwYWNlICtcbiAgICAnIGRlcHJlY2F0ZWQgJyArIG1zZ1xuXG4gIC8vIGFkZCBzdGFjayB0cmFjZVxuICBpZiAodGhpcy5fdHJhY2VkKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkrKykge1xuICAgICAgZm9ybWF0dGVkICs9ICdcXG4gICAgYXQgJyArIHN0YWNrW2ldLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0dGVkXG4gIH1cblxuICBpZiAoY2FsbGVyKSB7XG4gICAgZm9ybWF0dGVkICs9ICcgYXQgJyArIGZvcm1hdExvY2F0aW9uKGNhbGxlcilcbiAgfVxuXG4gIHJldHVybiBmb3JtYXR0ZWRcbn1cblxuLyoqXG4gKiBGb3JtYXQgZGVwcmVjYXRpb24gbWVzc2FnZSB3aXRoIGNvbG9yLlxuICovXG5cbmZ1bmN0aW9uIGZvcm1hdENvbG9yIChtc2csIGNhbGxlciwgc3RhY2spIHtcbiAgdmFyIGZvcm1hdHRlZCA9ICdcXHgxYlszNjsxbScgKyB0aGlzLl9uYW1lc3BhY2UgKyAnXFx4MWJbMjI7MzltJyArIC8vIGJvbGQgY3lhblxuICAgICcgXFx4MWJbMzM7MW1kZXByZWNhdGVkXFx4MWJbMjI7MzltJyArIC8vIGJvbGQgeWVsbG93XG4gICAgJyBcXHgxYlswbScgKyBtc2cgKyAnXFx4MWJbMzltJyAvLyByZXNldFxuXG4gIC8vIGFkZCBzdGFjayB0cmFjZVxuICBpZiAodGhpcy5fdHJhY2VkKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkrKykge1xuICAgICAgZm9ybWF0dGVkICs9ICdcXG4gICAgXFx4MWJbMzZtYXQgJyArIHN0YWNrW2ldLnRvU3RyaW5nKCkgKyAnXFx4MWJbMzltJyAvLyBjeWFuXG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdHRlZFxuICB9XG5cbiAgaWYgKGNhbGxlcikge1xuICAgIGZvcm1hdHRlZCArPSAnIFxceDFiWzM2bScgKyBmb3JtYXRMb2NhdGlvbihjYWxsZXIpICsgJ1xceDFiWzM5bScgLy8gY3lhblxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlZFxufVxuXG4vKipcbiAqIEZvcm1hdCBjYWxsIHNpdGUgbG9jYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0TG9jYXRpb24gKGNhbGxTaXRlKSB7XG4gIHJldHVybiByZWxhdGl2ZShiYXNlUGF0aCwgY2FsbFNpdGVbMF0pICtcbiAgICAnOicgKyBjYWxsU2l0ZVsxXSArXG4gICAgJzonICsgY2FsbFNpdGVbMl1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YWNrIGFzIGFycmF5IG9mIGNhbGwgc2l0ZXMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0U3RhY2sgKCkge1xuICB2YXIgbGltaXQgPSBFcnJvci5zdGFja1RyYWNlTGltaXRcbiAgdmFyIG9iaiA9IHt9XG4gIHZhciBwcmVwID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2VcblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXBhcmVPYmplY3RTdGFja1RyYWNlXG4gIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IE1hdGgubWF4KDEwLCBsaW1pdClcblxuICAvLyBjYXB0dXJlIHRoZSBzdGFja1xuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvYmopXG5cbiAgLy8gc2xpY2UgdGhpcyBmdW5jdGlvbiBvZmYgdGhlIHRvcFxuICB2YXIgc3RhY2sgPSBvYmouc3RhY2suc2xpY2UoMSlcblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXBcbiAgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ID0gbGltaXRcblxuICByZXR1cm4gc3RhY2tcbn1cblxuLyoqXG4gKiBDYXB0dXJlIGNhbGwgc2l0ZSBzdGFjayBmcm9tIHY4LlxuICovXG5cbmZ1bmN0aW9uIHByZXBhcmVPYmplY3RTdGFja1RyYWNlIChvYmosIHN0YWNrKSB7XG4gIHJldHVybiBzdGFja1xufVxuXG4vKipcbiAqIFJldHVybiBhIHdyYXBwZWQgZnVuY3Rpb24gaW4gYSBkZXByZWNhdGlvbiBtZXNzYWdlLlxuICovXG5cbmZ1bmN0aW9uIHdyYXBmdW5jdGlvbiAoZm4sIG1lc3NhZ2UpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IGZuIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gIH1cblxuICB2YXIgYXJncyA9IGNyZWF0ZUFyZ3VtZW50c1N0cmluZyhmbi5sZW5ndGgpXG4gIHZhciBzdGFjayA9IGdldFN0YWNrKClcbiAgdmFyIHNpdGUgPSBjYWxsU2l0ZUxvY2F0aW9uKHN0YWNrWzFdKVxuXG4gIHNpdGUubmFtZSA9IGZuLm5hbWVcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgdmFyIGRlcHJlY2F0ZWRmbiA9IG5ldyBGdW5jdGlvbignZm4nLCAnbG9nJywgJ2RlcHJlY2F0ZScsICdtZXNzYWdlJywgJ3NpdGUnLFxuICAgICdcInVzZSBzdHJpY3RcIlxcbicgK1xuICAgICdyZXR1cm4gZnVuY3Rpb24gKCcgKyBhcmdzICsgJykgeycgK1xuICAgICdsb2cuY2FsbChkZXByZWNhdGUsIG1lc3NhZ2UsIHNpdGUpXFxuJyArXG4gICAgJ3JldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXFxuJyArXG4gICAgJ30nKShmbiwgbG9nLCB0aGlzLCBtZXNzYWdlLCBzaXRlKVxuXG4gIHJldHVybiBkZXByZWNhdGVkZm5cbn1cblxuLyoqXG4gKiBXcmFwIHByb3BlcnR5IGluIGEgZGVwcmVjYXRpb24gbWVzc2FnZS5cbiAqL1xuXG5mdW5jdGlvbiB3cmFwcHJvcGVydHkgKG9iaiwgcHJvcCwgbWVzc2FnZSkge1xuICBpZiAoIW9iaiB8fCAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBvYmogbXVzdCBiZSBvYmplY3QnKVxuICB9XG5cbiAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcClcblxuICBpZiAoIWRlc2NyaXB0b3IpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtdXN0IGNhbGwgcHJvcGVydHkgb24gb3duZXIgb2JqZWN0JylcbiAgfVxuXG4gIGlmICghZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcm9wZXJ0eSBtdXN0IGJlIGNvbmZpZ3VyYWJsZScpXG4gIH1cblxuICB2YXIgZGVwcmVjYXRlID0gdGhpc1xuICB2YXIgc3RhY2sgPSBnZXRTdGFjaygpXG4gIHZhciBzaXRlID0gY2FsbFNpdGVMb2NhdGlvbihzdGFja1sxXSlcblxuICAvLyBzZXQgc2l0ZSBuYW1lXG4gIHNpdGUubmFtZSA9IHByb3BcblxuICAvLyBjb252ZXJ0IGRhdGEgZGVzY3JpcHRvclxuICBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKSB7XG4gICAgZGVzY3JpcHRvciA9IGNvbnZlcnREYXRhRGVzY3JpcHRvclRvQWNjZXNzb3Iob2JqLCBwcm9wLCBtZXNzYWdlKVxuICB9XG5cbiAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0XG4gIHZhciBzZXQgPSBkZXNjcmlwdG9yLnNldFxuXG4gIC8vIHdyYXAgZ2V0dGVyXG4gIGlmICh0eXBlb2YgZ2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGVzY3JpcHRvci5nZXQgPSBmdW5jdGlvbiBnZXR0ZXIgKCkge1xuICAgICAgbG9nLmNhbGwoZGVwcmVjYXRlLCBtZXNzYWdlLCBzaXRlKVxuICAgICAgcmV0dXJuIGdldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgfVxuICB9XG5cbiAgLy8gd3JhcCBzZXR0ZXJcbiAgaWYgKHR5cGVvZiBzZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZXNjcmlwdG9yLnNldCA9IGZ1bmN0aW9uIHNldHRlciAoKSB7XG4gICAgICBsb2cuY2FsbChkZXByZWNhdGUsIG1lc3NhZ2UsIHNpdGUpXG4gICAgICByZXR1cm4gc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjcmlwdG9yKVxufVxuXG4vKipcbiAqIENyZWF0ZSBEZXByZWNhdGlvbkVycm9yIGZvciBkZXByZWNhdGlvblxuICovXG5cbmZ1bmN0aW9uIERlcHJlY2F0aW9uRXJyb3IgKG5hbWVzcGFjZSwgbWVzc2FnZSwgc3RhY2spIHtcbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKClcbiAgdmFyIHN0YWNrU3RyaW5nXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnY29uc3RydWN0b3InLCB7XG4gICAgdmFsdWU6IERlcHJlY2F0aW9uRXJyb3JcbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICdtZXNzYWdlJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogbWVzc2FnZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ25hbWUnLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiAnRGVwcmVjYXRpb25FcnJvcicsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICduYW1lc3BhY2UnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBuYW1lc3BhY2UsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICdzdGFjaycsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoc3RhY2tTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tTdHJpbmdcbiAgICAgIH1cblxuICAgICAgLy8gcHJlcGFyZSBzdGFjayB0cmFjZVxuICAgICAgcmV0dXJuIChzdGFja1N0cmluZyA9IGNyZWF0ZVN0YWNrU3RyaW5nLmNhbGwodGhpcywgc3RhY2spKVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXR0ZXIgKHZhbCkge1xuICAgICAgc3RhY2tTdHJpbmcgPSB2YWxcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGVycm9yXG59XG4iLCAiLyohXG4gKiBieXRlc1xuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTUgSmVkIFdhdHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gYnl0ZXM7XG5tb2R1bGUuZXhwb3J0cy5mb3JtYXQgPSBmb3JtYXQ7XG5tb2R1bGUuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBmb3JtYXRUaG91c2FuZHNSZWdFeHAgPSAvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZztcblxudmFyIGZvcm1hdERlY2ltYWxzUmVnRXhwID0gLyg/OlxcLjAqfChcXC5bXjBdKykwKykkLztcblxudmFyIG1hcCA9IHtcbiAgYjogIDEsXG4gIGtiOiAxIDw8IDEwLFxuICBtYjogMSA8PCAyMCxcbiAgZ2I6IDEgPDwgMzAsXG4gIHRiOiBNYXRoLnBvdygxMDI0LCA0KSxcbiAgcGI6IE1hdGgucG93KDEwMjQsIDUpLFxufTtcblxudmFyIHBhcnNlUmVnRXhwID0gL14oKC18XFwrKT8oXFxkKyg/OlxcLlxcZCspPykpICooa2J8bWJ8Z2J8dGJ8cGIpJC9pO1xuXG4vKipcbiAqIENvbnZlcnQgdGhlIGdpdmVuIHZhbHVlIGluIGJ5dGVzIGludG8gYSBzdHJpbmcgb3IgcGFyc2UgdG8gc3RyaW5nIHRvIGFuIGludGVnZXIgaW4gYnl0ZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHt7XG4gKiAgY2FzZTogW3N0cmluZ10sXG4gKiAgZGVjaW1hbFBsYWNlczogW251bWJlcl1cbiAqICBmaXhlZERlY2ltYWxzOiBbYm9vbGVhbl1cbiAqICB0aG91c2FuZHNTZXBhcmF0b3I6IFtzdHJpbmddXG4gKiAgdW5pdFNlcGFyYXRvcjogW3N0cmluZ11cbiAqICB9fSBbb3B0aW9uc10gYnl0ZXMgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfG51bWJlcnxudWxsfVxuICovXG5cbmZ1bmN0aW9uIGJ5dGVzKHZhbHVlLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbHVlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBGb3JtYXQgdGhlIGdpdmVuIHZhbHVlIGluIGJ5dGVzIGludG8gYSBzdHJpbmcuXG4gKlxuICogSWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLCBpdCBpcyBrZXB0IGFzIHN1Y2guIElmIGl0IGlzIGEgZmxvYXQsXG4gKiBpdCBpcyByb3VuZGVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmRlY2ltYWxQbGFjZXM9Ml1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5maXhlZERlY2ltYWxzPWZhbHNlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRob3VzYW5kc1NlcGFyYXRvcj1dXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudW5pdD1dXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudW5pdFNlcGFyYXRvcj1dXG4gKlxuICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYWcgPSBNYXRoLmFicyh2YWx1ZSk7XG4gIHZhciB0aG91c2FuZHNTZXBhcmF0b3IgPSAob3B0aW9ucyAmJiBvcHRpb25zLnRob3VzYW5kc1NlcGFyYXRvcikgfHwgJyc7XG4gIHZhciB1bml0U2VwYXJhdG9yID0gKG9wdGlvbnMgJiYgb3B0aW9ucy51bml0U2VwYXJhdG9yKSB8fCAnJztcbiAgdmFyIGRlY2ltYWxQbGFjZXMgPSAob3B0aW9ucyAmJiBvcHRpb25zLmRlY2ltYWxQbGFjZXMgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmRlY2ltYWxQbGFjZXMgOiAyO1xuICB2YXIgZml4ZWREZWNpbWFscyA9IEJvb2xlYW4ob3B0aW9ucyAmJiBvcHRpb25zLmZpeGVkRGVjaW1hbHMpO1xuICB2YXIgdW5pdCA9IChvcHRpb25zICYmIG9wdGlvbnMudW5pdCkgfHwgJyc7XG5cbiAgaWYgKCF1bml0IHx8ICFtYXBbdW5pdC50b0xvd2VyQ2FzZSgpXSkge1xuICAgIGlmIChtYWcgPj0gbWFwLnBiKSB7XG4gICAgICB1bml0ID0gJ1BCJztcbiAgICB9IGVsc2UgaWYgKG1hZyA+PSBtYXAudGIpIHtcbiAgICAgIHVuaXQgPSAnVEInO1xuICAgIH0gZWxzZSBpZiAobWFnID49IG1hcC5nYikge1xuICAgICAgdW5pdCA9ICdHQic7XG4gICAgfSBlbHNlIGlmIChtYWcgPj0gbWFwLm1iKSB7XG4gICAgICB1bml0ID0gJ01CJztcbiAgICB9IGVsc2UgaWYgKG1hZyA+PSBtYXAua2IpIHtcbiAgICAgIHVuaXQgPSAnS0InO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bml0ID0gJ0InO1xuICAgIH1cbiAgfVxuXG4gIHZhciB2YWwgPSB2YWx1ZSAvIG1hcFt1bml0LnRvTG93ZXJDYXNlKCldO1xuICB2YXIgc3RyID0gdmFsLnRvRml4ZWQoZGVjaW1hbFBsYWNlcyk7XG5cbiAgaWYgKCFmaXhlZERlY2ltYWxzKSB7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoZm9ybWF0RGVjaW1hbHNSZWdFeHAsICckMScpO1xuICB9XG5cbiAgaWYgKHRob3VzYW5kc1NlcGFyYXRvcikge1xuICAgIHN0ciA9IHN0ci5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAocywgaSkge1xuICAgICAgcmV0dXJuIGkgPT09IDBcbiAgICAgICAgPyBzLnJlcGxhY2UoZm9ybWF0VGhvdXNhbmRzUmVnRXhwLCB0aG91c2FuZHNTZXBhcmF0b3IpXG4gICAgICAgIDogc1xuICAgIH0pLmpvaW4oJy4nKTtcbiAgfVxuXG4gIHJldHVybiBzdHIgKyB1bml0U2VwYXJhdG9yICsgdW5pdDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgc3RyaW5nIHZhbHVlIGludG8gYW4gaW50ZWdlciBpbiBieXRlcy5cbiAqXG4gKiBJZiBubyB1bml0IGlzIGdpdmVuLCBpdCBpcyBhc3N1bWVkIHRoZSB2YWx1ZSBpcyBpbiBieXRlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbFxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ8bnVsbH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZSh2YWwpIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmICFpc05hTih2YWwpKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gVGVzdCBpZiB0aGUgc3RyaW5nIHBhc3NlZCBpcyB2YWxpZFxuICB2YXIgcmVzdWx0cyA9IHBhcnNlUmVnRXhwLmV4ZWModmFsKTtcbiAgdmFyIGZsb2F0VmFsdWU7XG4gIHZhciB1bml0ID0gJ2InO1xuXG4gIGlmICghcmVzdWx0cykge1xuICAgIC8vIE5vdGhpbmcgY291bGQgYmUgZXh0cmFjdGVkIGZyb20gdGhlIGdpdmVuIHN0cmluZ1xuICAgIGZsb2F0VmFsdWUgPSBwYXJzZUludCh2YWwsIDEwKTtcbiAgICB1bml0ID0gJ2InXG4gIH0gZWxzZSB7XG4gICAgLy8gUmV0cmlldmUgdGhlIHZhbHVlIGFuZCB0aGUgdW5pdFxuICAgIGZsb2F0VmFsdWUgPSBwYXJzZUZsb2F0KHJlc3VsdHNbMV0pO1xuICAgIHVuaXQgPSByZXN1bHRzWzRdLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICBpZiAoaXNOYU4oZmxvYXRWYWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKG1hcFt1bml0XSAqIGZsb2F0VmFsdWUpO1xufVxuIiwgIi8qIVxuICogY29udGVudC10eXBlXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoICooIFwiO1wiIHBhcmFtZXRlciApIGluIFJGQyA3MjMxIHNlYyAzLjEuMS4xXG4gKlxuICogcGFyYW1ldGVyICAgICA9IHRva2VuIFwiPVwiICggdG9rZW4gLyBxdW90ZWQtc3RyaW5nIClcbiAqIHRva2VuICAgICAgICAgPSAxKnRjaGFyXG4gKiB0Y2hhciAgICAgICAgID0gXCIhXCIgLyBcIiNcIiAvIFwiJFwiIC8gXCIlXCIgLyBcIiZcIiAvIFwiJ1wiIC8gXCIqXCJcbiAqICAgICAgICAgICAgICAgLyBcIitcIiAvIFwiLVwiIC8gXCIuXCIgLyBcIl5cIiAvIFwiX1wiIC8gXCJgXCIgLyBcInxcIiAvIFwiflwiXG4gKiAgICAgICAgICAgICAgIC8gRElHSVQgLyBBTFBIQVxuICogICAgICAgICAgICAgICA7IGFueSBWQ0hBUiwgZXhjZXB0IGRlbGltaXRlcnNcbiAqIHF1b3RlZC1zdHJpbmcgPSBEUVVPVEUgKiggcWR0ZXh0IC8gcXVvdGVkLXBhaXIgKSBEUVVPVEVcbiAqIHFkdGV4dCAgICAgICAgPSBIVEFCIC8gU1AgLyAleDIxIC8gJXgyMy01QiAvICV4NUQtN0UgLyBvYnMtdGV4dFxuICogb2JzLXRleHQgICAgICA9ICV4ODAtRkZcbiAqIHF1b3RlZC1wYWlyICAgPSBcIlxcXCIgKCBIVEFCIC8gU1AgLyBWQ0hBUiAvIG9icy10ZXh0IClcbiAqL1xudmFyIFBBUkFNX1JFR0VYUCA9IC87ICooWyEjJCUmJyorLl5fYHx+MC05QS1aYS16LV0rKSAqPSAqKFwiKD86W1xcdTAwMGJcXHUwMDIwXFx1MDAyMVxcdTAwMjMtXFx1MDA1YlxcdTAwNWQtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl18XFxcXFtcXHUwMDBiXFx1MDAyMC1cXHUwMGZmXSkqXCJ8WyEjJCUmJyorLl5fYHx+MC05QS1aYS16LV0rKSAqL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG52YXIgVEVYVF9SRUdFWFAgPSAvXltcXHUwMDBiXFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbnZhciBUT0tFTl9SRUdFWFAgPSAvXlshIyQlJicqKy5eX2B8fjAtOUEtWmEtei1dKyQvXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHF1b3RlZC1wYWlyIGluIFJGQyA3MjMwIHNlYyAzLjIuNlxuICpcbiAqIHF1b3RlZC1wYWlyID0gXCJcXFwiICggSFRBQiAvIFNQIC8gVkNIQVIgLyBvYnMtdGV4dCApXG4gKiBvYnMtdGV4dCAgICA9ICV4ODAtRkZcbiAqL1xudmFyIFFFU0NfUkVHRVhQID0gL1xcXFwoW1xcdTAwMGJcXHUwMDIwLVxcdTAwZmZdKS9nIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBjaGFycyB0aGF0IG11c3QgYmUgcXVvdGVkLXBhaXIgaW4gUkZDIDcyMzAgc2VjIDMuMi42XG4gKi9cbnZhciBRVU9URV9SRUdFWFAgPSAvKFtcXFxcXCJdKS9nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHR5cGUgaW4gUkZDIDcyMzEgc2VjIDMuMS4xLjFcbiAqXG4gKiBtZWRpYS10eXBlID0gdHlwZSBcIi9cIiBzdWJ0eXBlXG4gKiB0eXBlICAgICAgID0gdG9rZW5cbiAqIHN1YnR5cGUgICAgPSB0b2tlblxuICovXG52YXIgVFlQRV9SRUdFWFAgPSAvXlshIyQlJicqKy5eX2B8fjAtOUEtWmEtei1dK1xcL1shIyQlJicqKy5eX2B8fjAtOUEtWmEtei1dKyQvXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxuZXhwb3J0cy5mb3JtYXQgPSBmb3JtYXRcbmV4cG9ydHMucGFyc2UgPSBwYXJzZVxuXG4vKipcbiAqIEZvcm1hdCBvYmplY3QgdG8gbWVkaWEgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0IChvYmopIHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBvYmogaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgdmFyIHBhcmFtZXRlcnMgPSBvYmoucGFyYW1ldGVyc1xuICB2YXIgdHlwZSA9IG9iai50eXBlXG5cbiAgaWYgKCF0eXBlIHx8ICFUWVBFX1JFR0VYUC50ZXN0KHR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCB0eXBlJylcbiAgfVxuXG4gIHZhciBzdHJpbmcgPSB0eXBlXG5cbiAgLy8gYXBwZW5kIHBhcmFtZXRlcnNcbiAgaWYgKHBhcmFtZXRlcnMgJiYgdHlwZW9mIHBhcmFtZXRlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHBhcmFtXG4gICAgdmFyIHBhcmFtcyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLnNvcnQoKVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhcmFtID0gcGFyYW1zW2ldXG5cbiAgICAgIGlmICghVE9LRU5fUkVHRVhQLnRlc3QocGFyYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIG5hbWUnKVxuICAgICAgfVxuXG4gICAgICBzdHJpbmcgKz0gJzsgJyArIHBhcmFtICsgJz0nICsgcXN0cmluZyhwYXJhbWV0ZXJzW3BhcmFtXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyaW5nXG59XG5cbi8qKlxuICogUGFyc2UgbWVkaWEgdHlwZSB0byBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBzdHJpbmdcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZSAoc3RyaW5nKSB7XG4gIGlmICghc3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyaW5nIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIHN1cHBvcnQgcmVxL3Jlcy1saWtlIG9iamVjdHMgYXMgYXJndW1lbnRcbiAgdmFyIGhlYWRlciA9IHR5cGVvZiBzdHJpbmcgPT09ICdvYmplY3QnXG4gICAgPyBnZXRjb250ZW50dHlwZShzdHJpbmcpXG4gICAgOiBzdHJpbmdcblxuICBpZiAodHlwZW9mIGhlYWRlciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzdHJpbmcgaXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcnKVxuICB9XG5cbiAgdmFyIGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzsnKVxuICB2YXIgdHlwZSA9IGluZGV4ICE9PSAtMVxuICAgID8gaGVhZGVyLnNsaWNlKDAsIGluZGV4KS50cmltKClcbiAgICA6IGhlYWRlci50cmltKClcblxuICBpZiAoIVRZUEVfUkVHRVhQLnRlc3QodHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIG1lZGlhIHR5cGUnKVxuICB9XG5cbiAgdmFyIG9iaiA9IG5ldyBDb250ZW50VHlwZSh0eXBlLnRvTG93ZXJDYXNlKCkpXG5cbiAgLy8gcGFyc2UgcGFyYW1ldGVyc1xuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgdmFyIGtleVxuICAgIHZhciBtYXRjaFxuICAgIHZhciB2YWx1ZVxuXG4gICAgUEFSQU1fUkVHRVhQLmxhc3RJbmRleCA9IGluZGV4XG5cbiAgICB3aGlsZSAoKG1hdGNoID0gUEFSQU1fUkVHRVhQLmV4ZWMoaGVhZGVyKSkpIHtcbiAgICAgIGlmIChtYXRjaC5pbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgZm9ybWF0JylcbiAgICAgIH1cblxuICAgICAgaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICBrZXkgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgICB2YWx1ZSA9IG1hdGNoWzJdXG5cbiAgICAgIGlmICh2YWx1ZS5jaGFyQ29kZUF0KDApID09PSAweDIyIC8qIFwiICovKSB7XG4gICAgICAgIC8vIHJlbW92ZSBxdW90ZXNcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgxLCAtMSlcblxuICAgICAgICAvLyByZW1vdmUgZXNjYXBlc1xuICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignXFxcXCcpICE9PSAtMSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShRRVNDX1JFR0VYUCwgJyQxJylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvYmoucGFyYW1ldGVyc1trZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT09IGhlYWRlci5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIGZvcm1hdCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG4vKipcbiAqIEdldCBjb250ZW50LXR5cGUgZnJvbSByZXEvcmVzIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldGNvbnRlbnR0eXBlIChvYmopIHtcbiAgdmFyIGhlYWRlclxuXG4gIGlmICh0eXBlb2Ygb2JqLmdldEhlYWRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIHJlcy1saWtlXG4gICAgaGVhZGVyID0gb2JqLmdldEhlYWRlcignY29udGVudC10eXBlJylcbiAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqLmhlYWRlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gcmVxLWxpa2VcbiAgICBoZWFkZXIgPSBvYmouaGVhZGVycyAmJiBvYmouaGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgfVxuXG4gIGlmICh0eXBlb2YgaGVhZGVyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NvbnRlbnQtdHlwZSBoZWFkZXIgaXMgbWlzc2luZyBmcm9tIG9iamVjdCcpXG4gIH1cblxuICByZXR1cm4gaGVhZGVyXG59XG5cbi8qKlxuICogUXVvdGUgYSBzdHJpbmcgaWYgbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcXN0cmluZyAodmFsKSB7XG4gIHZhciBzdHIgPSBTdHJpbmcodmFsKVxuXG4gIC8vIG5vIG5lZWQgdG8gcXVvdGUgdG9rZW5zXG4gIGlmIChUT0tFTl9SRUdFWFAudGVzdChzdHIpKSB7XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgaWYgKHN0ci5sZW5ndGggPiAwICYmICFURVhUX1JFR0VYUC50ZXN0KHN0cikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHBhcmFtZXRlciB2YWx1ZScpXG4gIH1cblxuICByZXR1cm4gJ1wiJyArIHN0ci5yZXBsYWNlKFFVT1RFX1JFR0VYUCwgJ1xcXFwkMScpICsgJ1wiJ1xufVxuXG4vKipcbiAqIENsYXNzIHRvIHJlcHJlc2VudCBhIGNvbnRlbnQgdHlwZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIENvbnRlbnRUeXBlICh0eXBlKSB7XG4gIHRoaXMucGFyYW1ldGVycyA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgdGhpcy50eXBlID0gdHlwZVxufVxuIiwgIid1c2Ugc3RyaWN0J1xuLyogZXNsaW50IG5vLXByb3RvOiAwICovXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSA/IHNldFByb3RvT2YgOiBtaXhpblByb3BlcnRpZXMpXG5cbmZ1bmN0aW9uIHNldFByb3RvT2YgKG9iaiwgcHJvdG8pIHtcbiAgb2JqLl9fcHJvdG9fXyA9IHByb3RvXG4gIHJldHVybiBvYmpcbn1cblxuZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzIChvYmosIHByb3RvKSB7XG4gIGZvciAodmFyIHByb3AgaW4gcHJvdG8pIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSB7XG4gICAgICBvYmpbcHJvcF0gPSBwcm90b1twcm9wXVxuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqXG59XG4iLCAiLyohXG4gKiBzdGF0dXNlc1xuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGNvZGVzID0gcmVxdWlyZSgnLi9jb2Rlcy5qc29uJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YXR1c1xuXG4vLyBzdGF0dXMgY29kZSB0byBtZXNzYWdlIG1hcFxuc3RhdHVzLm1lc3NhZ2UgPSBjb2Rlc1xuXG4vLyBzdGF0dXMgbWVzc2FnZSAobG93ZXItY2FzZSkgdG8gY29kZSBtYXBcbnN0YXR1cy5jb2RlID0gY3JlYXRlTWVzc2FnZVRvU3RhdHVzQ29kZU1hcChjb2RlcylcblxuLy8gYXJyYXkgb2Ygc3RhdHVzIGNvZGVzXG5zdGF0dXMuY29kZXMgPSBjcmVhdGVTdGF0dXNDb2RlTGlzdChjb2RlcylcblxuLy8gc3RhdHVzIGNvZGVzIGZvciByZWRpcmVjdHNcbnN0YXR1cy5yZWRpcmVjdCA9IHtcbiAgMzAwOiB0cnVlLFxuICAzMDE6IHRydWUsXG4gIDMwMjogdHJ1ZSxcbiAgMzAzOiB0cnVlLFxuICAzMDU6IHRydWUsXG4gIDMwNzogdHJ1ZSxcbiAgMzA4OiB0cnVlXG59XG5cbi8vIHN0YXR1cyBjb2RlcyBmb3IgZW1wdHkgYm9kaWVzXG5zdGF0dXMuZW1wdHkgPSB7XG4gIDIwNDogdHJ1ZSxcbiAgMjA1OiB0cnVlLFxuICAzMDQ6IHRydWVcbn1cblxuLy8gc3RhdHVzIGNvZGVzIGZvciB3aGVuIHlvdSBzaG91bGQgcmV0cnkgdGhlIHJlcXVlc3RcbnN0YXR1cy5yZXRyeSA9IHtcbiAgNTAyOiB0cnVlLFxuICA1MDM6IHRydWUsXG4gIDUwNDogdHJ1ZVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG1hcCBvZiBtZXNzYWdlIHRvIHN0YXR1cyBjb2RlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlVG9TdGF0dXNDb2RlTWFwIChjb2Rlcykge1xuICB2YXIgbWFwID0ge31cblxuICBPYmplY3Qua2V5cyhjb2RlcykuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoQ29kZSAoY29kZSkge1xuICAgIHZhciBtZXNzYWdlID0gY29kZXNbY29kZV1cbiAgICB2YXIgc3RhdHVzID0gTnVtYmVyKGNvZGUpXG5cbiAgICAvLyBwb3B1bGF0ZSBtYXBcbiAgICBtYXBbbWVzc2FnZS50b0xvd2VyQ2FzZSgpXSA9IHN0YXR1c1xuICB9KVxuXG4gIHJldHVybiBtYXBcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBsaXN0IG9mIGFsbCBzdGF0dXMgY29kZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVN0YXR1c0NvZGVMaXN0IChjb2Rlcykge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29kZXMpLm1hcChmdW5jdGlvbiBtYXBDb2RlIChjb2RlKSB7XG4gICAgcmV0dXJuIE51bWJlcihjb2RlKVxuICB9KVxufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdHVzIGNvZGUgZm9yIGdpdmVuIG1lc3NhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldFN0YXR1c0NvZGUgKG1lc3NhZ2UpIHtcbiAgdmFyIG1zZyA9IG1lc3NhZ2UudG9Mb3dlckNhc2UoKVxuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXR1cy5jb2RlLCBtc2cpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YXR1cyBtZXNzYWdlOiBcIicgKyBtZXNzYWdlICsgJ1wiJylcbiAgfVxuXG4gIHJldHVybiBzdGF0dXMuY29kZVttc2ddXG59XG5cbi8qKlxuICogR2V0IHRoZSBzdGF0dXMgbWVzc2FnZSBmb3IgZ2l2ZW4gY29kZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0U3RhdHVzTWVzc2FnZSAoY29kZSkge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzdGF0dXMubWVzc2FnZSwgY29kZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdHVzIGNvZGU6ICcgKyBjb2RlKVxuICB9XG5cbiAgcmV0dXJuIHN0YXR1cy5tZXNzYWdlW2NvZGVdXG59XG5cbi8qKlxuICogR2V0IHRoZSBzdGF0dXMgY29kZS5cbiAqXG4gKiBHaXZlbiBhIG51bWJlciwgdGhpcyB3aWxsIHRocm93IGlmIGl0IGlzIG5vdCBhIGtub3duIHN0YXR1c1xuICogY29kZSwgb3RoZXJ3aXNlIHRoZSBjb2RlIHdpbGwgYmUgcmV0dXJuZWQuIEdpdmVuIGEgc3RyaW5nLFxuICogdGhlIHN0cmluZyB3aWxsIGJlIHBhcnNlZCBmb3IgYSBudW1iZXIgYW5kIHJldHVybiB0aGUgY29kZVxuICogaWYgdmFsaWQsIG90aGVyd2lzZSB3aWxsIGxvb2t1cCB0aGUgY29kZSBhc3N1bWluZyB0aGlzIGlzXG4gKiB0aGUgc3RhdHVzIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBjb2RlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHN0YXR1cyAoY29kZSkge1xuICBpZiAodHlwZW9mIGNvZGUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGdldFN0YXR1c01lc3NhZ2UoY29kZSlcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29kZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb2RlIG11c3QgYmUgYSBudW1iZXIgb3Igc3RyaW5nJylcbiAgfVxuXG4gIC8vICc0MDMnXG4gIHZhciBuID0gcGFyc2VJbnQoY29kZSwgMTApXG4gIGlmICghaXNOYU4obikpIHtcbiAgICByZXR1cm4gZ2V0U3RhdHVzTWVzc2FnZShuKVxuICB9XG5cbiAgcmV0dXJuIGdldFN0YXR1c0NvZGUoY29kZSlcbn1cbiIsICJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLCAidHJ5IHtcbiAgdmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICh0eXBlb2YgdXRpbC5pbmhlcml0cyAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgJyc7XG4gIG1vZHVsZS5leHBvcnRzID0gdXRpbC5pbmhlcml0cztcbn0gY2F0Y2ggKGUpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2luaGVyaXRzX2Jyb3dzZXIuanMnKTtcbn1cbiIsICIvKiFcbiAqIHRvaWRlbnRpZmllclxuICogQ29weXJpZ2h0KGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdG9JZGVudGlmaWVyXG5cbi8qKlxuICogVHJhc2Zvcm0gdGhlIGdpdmVuIHN0cmluZyBpbnRvIGEgSmF2YVNjcmlwdCBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB0b0lkZW50aWZpZXIgKHN0cikge1xuICByZXR1cm4gc3RyXG4gICAgLnNwbGl0KCcgJylcbiAgICAubWFwKGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgcmV0dXJuIHRva2VuLnNsaWNlKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB0b2tlbi5zbGljZSgxKVxuICAgIH0pXG4gICAgLmpvaW4oJycpXG4gICAgLnJlcGxhY2UoL1teIF8wLTlhLXpdL2dpLCAnJylcbn1cbiIsICIvKiFcbiAqIGh0dHAtZXJyb3JzXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGVwcmVjYXRlID0gcmVxdWlyZSgnZGVwZCcpKCdodHRwLWVycm9ycycpXG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCdzZXRwcm90b3R5cGVvZicpXG52YXIgc3RhdHVzZXMgPSByZXF1aXJlKCdzdGF0dXNlcycpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG52YXIgdG9JZGVudGlmaWVyID0gcmVxdWlyZSgndG9pZGVudGlmaWVyJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUVycm9yXG5tb2R1bGUuZXhwb3J0cy5IdHRwRXJyb3IgPSBjcmVhdGVIdHRwRXJyb3JDb25zdHJ1Y3RvcigpXG5tb2R1bGUuZXhwb3J0cy5pc0h0dHBFcnJvciA9IGNyZWF0ZUlzSHR0cEVycm9yRnVuY3Rpb24obW9kdWxlLmV4cG9ydHMuSHR0cEVycm9yKVxuXG4vLyBQb3B1bGF0ZSBleHBvcnRzIGZvciBhbGwgY29uc3RydWN0b3JzXG5wb3B1bGF0ZUNvbnN0cnVjdG9yRXhwb3J0cyhtb2R1bGUuZXhwb3J0cywgc3RhdHVzZXMuY29kZXMsIG1vZHVsZS5leHBvcnRzLkh0dHBFcnJvcilcblxuLyoqXG4gKiBHZXQgdGhlIGNvZGUgY2xhc3Mgb2YgYSBzdGF0dXMgY29kZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29kZUNsYXNzIChzdGF0dXMpIHtcbiAgcmV0dXJuIE51bWJlcihTdHJpbmcoc3RhdHVzKS5jaGFyQXQoMCkgKyAnMDAnKVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBIVFRQIEVycm9yLlxuICpcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFcnJvciAoKSB7XG4gIC8vIHNvIG11Y2ggYXJpdHkgZ29pbmcgb24gfl9+XG4gIHZhciBlcnJcbiAgdmFyIG1zZ1xuICB2YXIgc3RhdHVzID0gNTAwXG4gIHZhciBwcm9wcyA9IHt9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXVxuICAgIHZhciB0eXBlID0gdHlwZW9mIGFyZ1xuICAgIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiBhcmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgZXJyID0gYXJnXG4gICAgICBzdGF0dXMgPSBlcnIuc3RhdHVzIHx8IGVyci5zdGF0dXNDb2RlIHx8IHN0YXR1c1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaSA9PT0gMCkge1xuICAgICAgc3RhdHVzID0gYXJnXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgbXNnID0gYXJnXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgcHJvcHMgPSBhcmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgIycgKyAoaSArIDEpICsgJyB1bnN1cHBvcnRlZCB0eXBlICcgKyB0eXBlKVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJyAmJiAoc3RhdHVzIDwgNDAwIHx8IHN0YXR1cyA+PSA2MDApKSB7XG4gICAgZGVwcmVjYXRlKCdub24tZXJyb3Igc3RhdHVzIGNvZGU7IHVzZSBvbmx5IDR4eCBvciA1eHggc3RhdHVzIGNvZGVzJylcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RhdHVzICE9PSAnbnVtYmVyJyB8fFxuICAgICghc3RhdHVzZXMubWVzc2FnZVtzdGF0dXNdICYmIChzdGF0dXMgPCA0MDAgfHwgc3RhdHVzID49IDYwMCkpKSB7XG4gICAgc3RhdHVzID0gNTAwXG4gIH1cblxuICAvLyBjb25zdHJ1Y3RvclxuICB2YXIgSHR0cEVycm9yID0gY3JlYXRlRXJyb3Jbc3RhdHVzXSB8fCBjcmVhdGVFcnJvcltjb2RlQ2xhc3Moc3RhdHVzKV1cblxuICBpZiAoIWVycikge1xuICAgIC8vIGNyZWF0ZSBlcnJvclxuICAgIGVyciA9IEh0dHBFcnJvclxuICAgICAgPyBuZXcgSHR0cEVycm9yKG1zZylcbiAgICAgIDogbmV3IEVycm9yKG1zZyB8fCBzdGF0dXNlcy5tZXNzYWdlW3N0YXR1c10pXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyLCBjcmVhdGVFcnJvcilcbiAgfVxuXG4gIGlmICghSHR0cEVycm9yIHx8ICEoZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yKSB8fCBlcnIuc3RhdHVzICE9PSBzdGF0dXMpIHtcbiAgICAvLyBhZGQgcHJvcGVydGllcyB0byBnZW5lcmljIGVycm9yXG4gICAgZXJyLmV4cG9zZSA9IHN0YXR1cyA8IDUwMFxuICAgIGVyci5zdGF0dXMgPSBlcnIuc3RhdHVzQ29kZSA9IHN0YXR1c1xuICB9XG5cbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgaWYgKGtleSAhPT0gJ3N0YXR1cycgJiYga2V5ICE9PSAnc3RhdHVzQ29kZScpIHtcbiAgICAgIGVycltrZXldID0gcHJvcHNba2V5XVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJcbn1cblxuLyoqXG4gKiBDcmVhdGUgSFRUUCBlcnJvciBhYnN0cmFjdCBiYXNlIGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVIdHRwRXJyb3JDb25zdHJ1Y3RvciAoKSB7XG4gIGZ1bmN0aW9uIEh0dHBFcnJvciAoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IGNvbnN0cnVjdCBhYnN0cmFjdCBjbGFzcycpXG4gIH1cblxuICBpbmhlcml0cyhIdHRwRXJyb3IsIEVycm9yKVxuXG4gIHJldHVybiBIdHRwRXJyb3Jcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBjb25zdHJ1Y3RvciBmb3IgYSBjbGllbnQgZXJyb3IuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudEVycm9yQ29uc3RydWN0b3IgKEh0dHBFcnJvciwgbmFtZSwgY29kZSkge1xuICB2YXIgY2xhc3NOYW1lID0gdG9DbGFzc05hbWUobmFtZSlcblxuICBmdW5jdGlvbiBDbGllbnRFcnJvciAobWVzc2FnZSkge1xuICAgIC8vIGNyZWF0ZSB0aGUgZXJyb3Igb2JqZWN0XG4gICAgdmFyIG1zZyA9IG1lc3NhZ2UgIT0gbnVsbCA/IG1lc3NhZ2UgOiBzdGF0dXNlcy5tZXNzYWdlW2NvZGVdXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpXG5cbiAgICAvLyBjYXB0dXJlIGEgc3RhY2sgdHJhY2UgdG8gdGhlIGNvbnN0cnVjdGlvbiBwb2ludFxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgQ2xpZW50RXJyb3IpXG5cbiAgICAvLyBhZGp1c3QgdGhlIFtbUHJvdG90eXBlXV1cbiAgICBzZXRQcm90b3R5cGVPZihlcnIsIENsaWVudEVycm9yLnByb3RvdHlwZSlcblxuICAgIC8vIHJlZGVmaW5lIHRoZSBlcnJvciBtZXNzYWdlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ21lc3NhZ2UnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IG1zZyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSlcblxuICAgIC8vIHJlZGVmaW5lIHRoZSBlcnJvciBuYW1lXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ25hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBjbGFzc05hbWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pXG5cbiAgICByZXR1cm4gZXJyXG4gIH1cblxuICBpbmhlcml0cyhDbGllbnRFcnJvciwgSHR0cEVycm9yKVxuICBuYW1lRnVuYyhDbGllbnRFcnJvciwgY2xhc3NOYW1lKVxuXG4gIENsaWVudEVycm9yLnByb3RvdHlwZS5zdGF0dXMgPSBjb2RlXG4gIENsaWVudEVycm9yLnByb3RvdHlwZS5zdGF0dXNDb2RlID0gY29kZVxuICBDbGllbnRFcnJvci5wcm90b3R5cGUuZXhwb3NlID0gdHJ1ZVxuXG4gIHJldHVybiBDbGllbnRFcnJvclxufVxuXG4vKipcbiAqIENyZWF0ZSBmdW5jdGlvbiB0byB0ZXN0IGlzIGEgdmFsdWUgaXMgYSBIdHRwRXJyb3IuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUlzSHR0cEVycm9yRnVuY3Rpb24gKEh0dHBFcnJvcikge1xuICByZXR1cm4gZnVuY3Rpb24gaXNIdHRwRXJyb3IgKHZhbCkge1xuICAgIGlmICghdmFsIHx8IHR5cGVvZiB2YWwgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodmFsIGluc3RhbmNlb2YgSHR0cEVycm9yKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiB2YWwgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgdHlwZW9mIHZhbC5leHBvc2UgPT09ICdib29sZWFuJyAmJlxuICAgICAgdHlwZW9mIHZhbC5zdGF0dXNDb2RlID09PSAnbnVtYmVyJyAmJiB2YWwuc3RhdHVzID09PSB2YWwuc3RhdHVzQ29kZVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY29uc3RydWN0b3IgZm9yIGEgc2VydmVyIGVycm9yLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTZXJ2ZXJFcnJvckNvbnN0cnVjdG9yIChIdHRwRXJyb3IsIG5hbWUsIGNvZGUpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHRvQ2xhc3NOYW1lKG5hbWUpXG5cbiAgZnVuY3Rpb24gU2VydmVyRXJyb3IgKG1lc3NhZ2UpIHtcbiAgICAvLyBjcmVhdGUgdGhlIGVycm9yIG9iamVjdFxuICAgIHZhciBtc2cgPSBtZXNzYWdlICE9IG51bGwgPyBtZXNzYWdlIDogc3RhdHVzZXMubWVzc2FnZVtjb2RlXVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IobXNnKVxuXG4gICAgLy8gY2FwdHVyZSBhIHN0YWNrIHRyYWNlIHRvIHRoZSBjb25zdHJ1Y3Rpb24gcG9pbnRcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIFNlcnZlckVycm9yKVxuXG4gICAgLy8gYWRqdXN0IHRoZSBbW1Byb3RvdHlwZV1dXG4gICAgc2V0UHJvdG90eXBlT2YoZXJyLCBTZXJ2ZXJFcnJvci5wcm90b3R5cGUpXG5cbiAgICAvLyByZWRlZmluZSB0aGUgZXJyb3IgbWVzc2FnZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsICdtZXNzYWdlJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBtc2csXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pXG5cbiAgICAvLyByZWRlZmluZSB0aGUgZXJyb3IgbmFtZVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsICduYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogY2xhc3NOYW1lLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KVxuXG4gICAgcmV0dXJuIGVyclxuICB9XG5cbiAgaW5oZXJpdHMoU2VydmVyRXJyb3IsIEh0dHBFcnJvcilcbiAgbmFtZUZ1bmMoU2VydmVyRXJyb3IsIGNsYXNzTmFtZSlcblxuICBTZXJ2ZXJFcnJvci5wcm90b3R5cGUuc3RhdHVzID0gY29kZVxuICBTZXJ2ZXJFcnJvci5wcm90b3R5cGUuc3RhdHVzQ29kZSA9IGNvZGVcbiAgU2VydmVyRXJyb3IucHJvdG90eXBlLmV4cG9zZSA9IGZhbHNlXG5cbiAgcmV0dXJuIFNlcnZlckVycm9yXG59XG5cbi8qKlxuICogU2V0IHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24sIGlmIHBvc3NpYmxlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBuYW1lRnVuYyAoZnVuYywgbmFtZSkge1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZnVuYywgJ25hbWUnKVxuXG4gIGlmIChkZXNjICYmIGRlc2MuY29uZmlndXJhYmxlKSB7XG4gICAgZGVzYy52YWx1ZSA9IG5hbWVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnVuYywgJ25hbWUnLCBkZXNjKVxuICB9XG59XG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGV4cG9ydHMgb2JqZWN0IHdpdGggY29uc3RydWN0b3JzIGZvciBldmVyeSBlcnJvciBjbGFzcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcG9wdWxhdGVDb25zdHJ1Y3RvckV4cG9ydHMgKGV4cG9ydHMsIGNvZGVzLCBIdHRwRXJyb3IpIHtcbiAgY29kZXMuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoQ29kZSAoY29kZSkge1xuICAgIHZhciBDb2RlRXJyb3JcbiAgICB2YXIgbmFtZSA9IHRvSWRlbnRpZmllcihzdGF0dXNlcy5tZXNzYWdlW2NvZGVdKVxuXG4gICAgc3dpdGNoIChjb2RlQ2xhc3MoY29kZSkpIHtcbiAgICAgIGNhc2UgNDAwOlxuICAgICAgICBDb2RlRXJyb3IgPSBjcmVhdGVDbGllbnRFcnJvckNvbnN0cnVjdG9yKEh0dHBFcnJvciwgbmFtZSwgY29kZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgNTAwOlxuICAgICAgICBDb2RlRXJyb3IgPSBjcmVhdGVTZXJ2ZXJFcnJvckNvbnN0cnVjdG9yKEh0dHBFcnJvciwgbmFtZSwgY29kZSlcbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoQ29kZUVycm9yKSB7XG4gICAgICAvLyBleHBvcnQgdGhlIGNvbnN0cnVjdG9yXG4gICAgICBleHBvcnRzW2NvZGVdID0gQ29kZUVycm9yXG4gICAgICBleHBvcnRzW25hbWVdID0gQ29kZUVycm9yXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIEdldCBhIGNsYXNzIG5hbWUgZnJvbSBhIG5hbWUgaWRlbnRpZmllci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdG9DbGFzc05hbWUgKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUuc3Vic3RyKC01KSAhPT0gJ0Vycm9yJ1xuICAgID8gbmFtZSArICdFcnJvcidcbiAgICA6IG5hbWVcbn1cbiIsICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oKD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICBpZiAobXMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtcyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgcmV0dXJuIHBsdXJhbChtcywgZCwgJ2RheScpIHx8XG4gICAgcGx1cmFsKG1zLCBoLCAnaG91cicpIHx8XG4gICAgcGx1cmFsKG1zLCBtLCAnbWludXRlJykgfHxcbiAgICBwbHVyYWwobXMsIHMsICdzZWNvbmQnKSB8fFxuICAgIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBuLCBuYW1lKSB7XG4gIGlmIChtcyA8IG4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1zIDwgbiAqIDEuNSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKG1zIC8gbikgKyAnICcgKyBuYW1lO1xuICB9XG4gIHJldHVybiBNYXRoLmNlaWwobXMgLyBuKSArICcgJyArIG5hbWUgKyAncyc7XG59XG4iLCAiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWdbJ2RlZmF1bHQnXSA9IGNyZWF0ZURlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG4gKi9cblxuZXhwb3J0cy5uYW1lcyA9IFtdO1xuZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cbiAqXG4gKiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzID0ge307XG5cbi8qKlxuICogUHJldmlvdXMgbG9nIHRpbWVzdGFtcC5cbiAqL1xuXG52YXIgcHJldlRpbWU7XG5cbi8qKlxuICogU2VsZWN0IGEgY29sb3IuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcbiAgdmFyIGhhc2ggPSAwLCBpO1xuXG4gIGZvciAoaSBpbiBuYW1lc3BhY2UpIHtcbiAgICBoYXNoICA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGV4cG9ydHMuY29sb3JzLmxlbmd0aF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXG4gIGZ1bmN0aW9uIGRlYnVnKCkge1xuICAgIC8vIGRpc2FibGVkP1xuICAgIGlmICghZGVidWcuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgdmFyIHNlbGYgPSBkZWJ1ZztcblxuICAgIC8vIHNldCBgZGlmZmAgdGltZXN0YW1wXG4gICAgdmFyIGN1cnIgPSArbmV3IERhdGUoKTtcbiAgICB2YXIgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuICAgIHNlbGYuZGlmZiA9IG1zO1xuICAgIHNlbGYucHJldiA9IHByZXZUaW1lO1xuICAgIHNlbGYuY3VyciA9IGN1cnI7XG4gICAgcHJldlRpbWUgPSBjdXJyO1xuXG4gICAgLy8gdHVybiB0aGUgYGFyZ3VtZW50c2AgaW50byBhIHByb3BlciBBcnJheVxuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBhcmdzWzBdID0gZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7XG5cbiAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhcmdzWzBdKSB7XG4gICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuICAgICAgYXJncy51bnNoaWZ0KCclTycpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgZnVuY3Rpb24obWF0Y2gsIGZvcm1hdCkge1xuICAgICAgLy8gaWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuICAgICAgaWYgKG1hdGNoID09PSAnJSUnKSByZXR1cm4gbWF0Y2g7XG4gICAgICBpbmRleCsrO1xuICAgICAgdmFyIGZvcm1hdHRlciA9IGV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIHZhbCA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICBtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cbiAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICAvLyBhcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuICAgIGV4cG9ydHMuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG4gICAgdmFyIGxvZ0ZuID0gZGVidWcubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgbG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cblxuICBkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIGRlYnVnLmVuYWJsZWQgPSBleHBvcnRzLmVuYWJsZWQobmFtZXNwYWNlKTtcbiAgZGVidWcudXNlQ29sb3JzID0gZXhwb3J0cy51c2VDb2xvcnMoKTtcbiAgZGVidWcuY29sb3IgPSBzZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXG4gIC8vIGVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5pbml0KSB7XG4gICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcbiAgfVxuXG4gIHJldHVybiBkZWJ1Zztcbn1cblxuLyoqXG4gKiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG4gKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuICBleHBvcnRzLm5hbWVzID0gW107XG4gIGV4cG9ydHMuc2tpcHMgPSBbXTtcblxuICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3NcbiAgICBuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcbiAgICBpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG4gICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICBleHBvcnRzLmVuYWJsZSgnJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcbiAgdmFyIGksIGxlbjtcbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcbiAgcmV0dXJuIHZhbDtcbn1cbiIsICIvKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kZWJ1ZycpO1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWVcbiAgICAgICAgICAgICAgICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWUuc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgPyBjaHJvbWUuc3RvcmFnZS5sb2NhbFxuICAgICAgICAgICAgICAgICAgOiBsb2NhbHN0b3JhZ2UoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG4gICdsaWdodHNlYWdyZWVuJyxcbiAgJ2ZvcmVzdGdyZWVuJyxcbiAgJ2dvbGRlbnJvZCcsXG4gICdkb2RnZXJibHVlJyxcbiAgJ2RhcmtvcmNoaWQnLFxuICAnY3JpbXNvbidcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuICAvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG4gIC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG4gIC8vIGV4cGxpY2l0bHlcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmIHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGlzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG4gIC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG4gIHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuICAgIC8vIGlzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuICAgIC8vIGlzIGZpcmVmb3ggPj0gdjMxP1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuICAgIC8vIGRvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uKHYpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnIubWVzc2FnZTtcbiAgfVxufTtcblxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuICB2YXIgdXNlQ29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cbiAgYXJnc1swXSA9ICh1c2VDb2xvcnMgPyAnJWMnIDogJycpXG4gICAgKyB0aGlzLm5hbWVzcGFjZVxuICAgICsgKHVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKVxuICAgICsgYXJnc1swXVxuICAgICsgKHVzZUNvbG9ycyA/ICclYyAnIDogJyAnKVxuICAgICsgJysnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG4gIGlmICghdXNlQ29sb3JzKSByZXR1cm47XG5cbiAgdmFyIGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuICBhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKVxuXG4gIC8vIHRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG4gIC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cbiAgLy8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0QyA9IDA7XG4gIGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIGlmICgnJSUnID09PSBtYXRjaCkgcmV0dXJuO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCclYycgPT09IG1hdGNoKSB7XG4gICAgICAvLyB3ZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcbiAgICAgIC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG4gICAgICBsYXN0QyA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgYXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUubG9nKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5sb2dgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgLy8gdGhpcyBoYWNrZXJ5IGlzIHJlcXVpcmVkIGZvciBJRTgvOSwgd2hlcmVcbiAgLy8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24gZG9lc24ndCBoYXZlICdhcHBseSdcbiAgcmV0dXJuICdvYmplY3QnID09PSB0eXBlb2YgY29uc29sZVxuICAgICYmIGNvbnNvbGUubG9nXG4gICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICB0cnkge1xuICAgIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UuZGVidWcgPSBuYW1lc3BhY2VzO1xuICAgIH1cbiAgfSBjYXRjaChlKSB7fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIHIgPSBleHBvcnRzLnN0b3JhZ2UuZGVidWc7XG4gIH0gY2F0Y2goZSkge31cblxuICAvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG4gIGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuICAgIHIgPSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfVxuXG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgbG9jYWxTdG9yYWdlLmRlYnVnYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG4iLCAiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciB0dHkgPSByZXF1aXJlKCd0dHknKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIC9eZGVidWdfL2kudGVzdChrZXkpO1xufSkucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAvLyBjYW1lbC1jYXNlXG4gIHZhciBwcm9wID0ga2V5XG4gICAgLnN1YnN0cmluZyg2KVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL18oW2Etel0pL2csIGZ1bmN0aW9uIChfLCBrKSB7IHJldHVybiBrLnRvVXBwZXJDYXNlKCkgfSk7XG5cbiAgLy8gY29lcmNlIHN0cmluZyB2YWx1ZSBpbnRvIEpTIHZhbHVlXG4gIHZhciB2YWwgPSBwcm9jZXNzLmVudltrZXldO1xuICBpZiAoL14oeWVzfG9ufHRydWV8ZW5hYmxlZCkkL2kudGVzdCh2YWwpKSB2YWwgPSB0cnVlO1xuICBlbHNlIGlmICgvXihub3xvZmZ8ZmFsc2V8ZGlzYWJsZWQpJC9pLnRlc3QodmFsKSkgdmFsID0gZmFsc2U7XG4gIGVsc2UgaWYgKHZhbCA9PT0gJ251bGwnKSB2YWwgPSBudWxsO1xuICBlbHNlIHZhbCA9IE51bWJlcih2YWwpO1xuXG4gIG9ialtwcm9wXSA9IHZhbDtcbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcblxuLyoqXG4gKiBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIHRoZSBgZGVidWcoKWAgY2FsbHMgdG8uXG4gKiBTZXQgdGhlIGBERUJVR19GRGAgZW52IHZhcmlhYmxlIHRvIG92ZXJyaWRlIHdpdGggYW5vdGhlciB2YWx1ZS4gaS5lLjpcbiAqXG4gKiAgICQgREVCVUdfRkQ9MyBub2RlIHNjcmlwdC5qcyAzPmRlYnVnLmxvZ1xuICovXG5cbnZhciBmZCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkRFQlVHX0ZELCAxMCkgfHwgMjtcblxuaWYgKDEgIT09IGZkICYmIDIgIT09IGZkKSB7XG4gIHV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uKCl7fSwgJ2V4Y2VwdCBmb3Igc3RkZXJyKDIpIGFuZCBzdGRvdXQoMSksIGFueSBvdGhlciB1c2FnZSBvZiBERUJVR19GRCBpcyBkZXByZWNhdGVkLiBPdmVycmlkZSBkZWJ1Zy5sb2cgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGxvZyBmdW5jdGlvbiAoaHR0cHM6Ly9naXQuaW8vZGVidWdfZmQpJykoKVxufVxuXG52YXIgc3RyZWFtID0gMSA9PT0gZmQgPyBwcm9jZXNzLnN0ZG91dCA6XG4gICAgICAgICAgICAgMiA9PT0gZmQgPyBwcm9jZXNzLnN0ZGVyciA6XG4gICAgICAgICAgICAgY3JlYXRlV3JpdGFibGVTdGRpb1N0cmVhbShmZCk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgcmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHNcbiAgICA/IEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpXG4gICAgOiB0dHkuaXNhdHR5KGZkKTtcbn1cblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsIG9uIGEgc2luZ2xlIGxpbmUuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbih2KSB7XG4gIHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG4gIHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cylcbiAgICAuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihzdHIpIHtcbiAgICAgIHJldHVybiBzdHIudHJpbSgpXG4gICAgfSkuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsb3dpbmcgbXVsdGlwbGUgbGluZXMgaWYgbmVlZGVkLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5PID0gZnVuY3Rpb24odikge1xuICB0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuICByZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLm5hbWVzcGFjZTtcbiAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG4gIGlmICh1c2VDb2xvcnMpIHtcbiAgICB2YXIgYyA9IHRoaXMuY29sb3I7XG4gICAgdmFyIHByZWZpeCA9ICcgIFxcdTAwMWJbMycgKyBjICsgJzsxbScgKyBuYW1lICsgJyAnICsgJ1xcdTAwMWJbMG0nO1xuXG4gICAgYXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuICAgIGFyZ3MucHVzaCgnXFx1MDAxYlszJyArIGMgKyAnbSsnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMWJbMG0nKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzWzBdID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG4gICAgICArICcgJyArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBgdXRpbC5mb3JtYXQoKWAgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhbmQgd3JpdGVzIHRvIGBzdHJlYW1gLlxuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgcmV0dXJuIHN0cmVhbS53cml0ZSh1dGlsLmZvcm1hdC5hcHBseSh1dGlsLCBhcmd1bWVudHMpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcbiAgaWYgKG51bGwgPT0gbmFtZXNwYWNlcykge1xuICAgIC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuICAgIC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5ERUJVRztcbn1cblxuLyoqXG4gKiBDb3BpZWQgZnJvbSBgbm9kZS9zcmMvbm9kZS5qc2AuXG4gKlxuICogWFhYOiBJdCdzIGxhbWUgdGhhdCBub2RlIGRvZXNuJ3QgZXhwb3NlIHRoaXMgQVBJIG91dC1vZi10aGUtYm94LiBJdCBhbHNvXG4gKiByZWxpZXMgb24gdGhlIHVuZG9jdW1lbnRlZCBgdHR5X3dyYXAuZ3Vlc3NIYW5kbGVUeXBlKClgIHdoaWNoIGlzIGFsc28gbGFtZS5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVXcml0YWJsZVN0ZGlvU3RyZWFtIChmZCkge1xuICB2YXIgc3RyZWFtO1xuICB2YXIgdHR5X3dyYXAgPSBwcm9jZXNzLmJpbmRpbmcoJ3R0eV93cmFwJyk7XG5cbiAgLy8gTm90ZSBzdHJlYW0uX3R5cGUgaXMgdXNlZCBmb3IgdGVzdC1tb2R1bGUtbG9hZC1saXN0LmpzXG5cbiAgc3dpdGNoICh0dHlfd3JhcC5ndWVzc0hhbmRsZVR5cGUoZmQpKSB7XG4gICAgY2FzZSAnVFRZJzpcbiAgICAgIHN0cmVhbSA9IG5ldyB0dHkuV3JpdGVTdHJlYW0oZmQpO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ3R0eSc7XG5cbiAgICAgIC8vIEhhY2sgdG8gaGF2ZSBzdHJlYW0gbm90IGtlZXAgdGhlIGV2ZW50IGxvb3AgYWxpdmUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzI2XG4gICAgICBpZiAoc3RyZWFtLl9oYW5kbGUgJiYgc3RyZWFtLl9oYW5kbGUudW5yZWYpIHtcbiAgICAgICAgc3RyZWFtLl9oYW5kbGUudW5yZWYoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnRklMRSc6XG4gICAgICB2YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuICAgICAgc3RyZWFtID0gbmV3IGZzLlN5bmNXcml0ZVN0cmVhbShmZCwgeyBhdXRvQ2xvc2U6IGZhbHNlIH0pO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ2ZzJztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnUElQRSc6XG4gICAgY2FzZSAnVENQJzpcbiAgICAgIHZhciBuZXQgPSByZXF1aXJlKCduZXQnKTtcbiAgICAgIHN0cmVhbSA9IG5ldyBuZXQuU29ja2V0KHtcbiAgICAgICAgZmQ6IGZkLFxuICAgICAgICByZWFkYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gRklYTUUgU2hvdWxkIHByb2JhYmx5IGhhdmUgYW4gb3B0aW9uIGluIG5ldC5Tb2NrZXQgdG8gY3JlYXRlIGFcbiAgICAgIC8vIHN0cmVhbSBmcm9tIGFuIGV4aXN0aW5nIGZkIHdoaWNoIGlzIHdyaXRhYmxlIG9ubHkuIEJ1dCBmb3Igbm93XG4gICAgICAvLyB3ZSdsbCBqdXN0IGFkZCB0aGlzIGhhY2sgYW5kIHNldCB0aGUgYHJlYWRhYmxlYCBtZW1iZXIgdG8gZmFsc2UuXG4gICAgICAvLyBUZXN0OiAuL25vZGUgdGVzdC9maXh0dXJlcy9lY2hvLmpzIDwgL2V0Yy9wYXNzd2RcbiAgICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlYWQgPSBudWxsO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ3BpcGUnO1xuXG4gICAgICAvLyBGSVhNRSBIYWNrIHRvIGhhdmUgc3RyZWFtIG5vdCBrZWVwIHRoZSBldmVudCBsb29wIGFsaXZlLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcyNlxuICAgICAgaWYgKHN0cmVhbS5faGFuZGxlICYmIHN0cmVhbS5faGFuZGxlLnVucmVmKSB7XG4gICAgICAgIHN0cmVhbS5faGFuZGxlLnVucmVmKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBQcm9iYWJseSBhbiBlcnJvciBvbiBpbiB1dl9ndWVzc19oYW5kbGUoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXBsZW1lbnQgbWUuIFVua25vd24gc3RyZWFtIGZpbGUgdHlwZSEnKTtcbiAgfVxuXG4gIC8vIEZvciBzdXBwb3J0aW5nIGxlZ2FjeSBBUEkgd2UgcHV0IHRoZSBGRCBoZXJlLlxuICBzdHJlYW0uZmQgPSBmZDtcblxuICBzdHJlYW0uX2lzU3RkaW8gPSB0cnVlO1xuXG4gIHJldHVybiBzdHJlYW07XG59XG5cbi8qKlxuICogSW5pdCBsb2dpYyBmb3IgYGRlYnVnYCBpbnN0YW5jZXMuXG4gKlxuICogQ3JlYXRlIGEgbmV3IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGluIGNhc2UgYHVzZUNvbG9yc2AgaXMgc2V0XG4gKiBkaWZmZXJlbnRseSBmb3IgYSBwYXJ0aWN1bGFyIGBkZWJ1Z2AgaW5zdGFuY2UuXG4gKi9cblxuZnVuY3Rpb24gaW5pdCAoZGVidWcpIHtcbiAgZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuaW5zcGVjdE9wdHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWJ1Zy5pbnNwZWN0T3B0c1trZXlzW2ldXSA9IGV4cG9ydHMuaW5zcGVjdE9wdHNba2V5c1tpXV07XG4gIH1cbn1cblxuLyoqXG4gKiBFbmFibGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gYHByb2Nlc3MuZW52LkRFQlVHYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcbiIsICIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciBwcm9jZXNzLCB3aGljaCBpcyBub2RlLCBidXQgd2Ugc2hvdWxkXG4gKiB0cmVhdCBhcyBhIGJyb3dzZXIuXG4gKi9cblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLCAiLyohXG4gKiBkZXN0cm95XG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE1LTIwMjIgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXJcbnZhciBSZWFkU3RyZWFtID0gcmVxdWlyZSgnZnMnKS5SZWFkU3RyZWFtXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbnZhciBabGliID0gcmVxdWlyZSgnemxpYicpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXN0cm95XG5cbi8qKlxuICogRGVzdHJveSB0aGUgZ2l2ZW4gc3RyZWFtLCBhbmQgb3B0aW9uYWxseSBzdXBwcmVzcyBhbnkgZnV0dXJlIGBlcnJvcmAgZXZlbnRzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc3VwcHJlc3NcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkZXN0cm95IChzdHJlYW0sIHN1cHByZXNzKSB7XG4gIGlmIChpc0ZzUmVhZFN0cmVhbShzdHJlYW0pKSB7XG4gICAgZGVzdHJveVJlYWRTdHJlYW0oc3RyZWFtKVxuICB9IGVsc2UgaWYgKGlzWmxpYlN0cmVhbShzdHJlYW0pKSB7XG4gICAgZGVzdHJveVpsaWJTdHJlYW0oc3RyZWFtKVxuICB9IGVsc2UgaWYgKGhhc0Rlc3Ryb3koc3RyZWFtKSkge1xuICAgIHN0cmVhbS5kZXN0cm95KClcbiAgfVxuXG4gIGlmIChpc0V2ZW50RW1pdHRlcihzdHJlYW0pICYmIHN1cHByZXNzKSB7XG4gICAgc3RyZWFtLnJlbW92ZUFsbExpc3RlbmVycygnZXJyb3InKVxuICAgIHN0cmVhbS5hZGRMaXN0ZW5lcignZXJyb3InLCBub29wKVxuICB9XG5cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG4vKipcbiAqIERlc3Ryb3kgYSBSZWFkU3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZGVzdHJveVJlYWRTdHJlYW0gKHN0cmVhbSkge1xuICBzdHJlYW0uZGVzdHJveSgpXG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0uY2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBub2RlLmpzIGNvcmUgYnVnIHdvcmstYXJvdW5kXG4gICAgc3RyZWFtLm9uKCdvcGVuJywgb25PcGVuQ2xvc2UpXG4gIH1cbn1cblxuLyoqXG4gKiBDbG9zZSBhIFpsaWIgc3RyZWFtLlxuICpcbiAqIFpsaWIgc3RyZWFtcyBiZWxvdyBOb2RlLmpzIDQuNS41IGhhdmUgYSBidWdneSBpbXBsZW1lbnRhdGlvblxuICogb2YgLmNsb3NlKCkgd2hlbiB6bGliIGVuY291bnRlcmVkIGFuIGVycm9yLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY2xvc2VabGliU3RyZWFtIChzdHJlYW0pIHtcbiAgaWYgKHN0cmVhbS5faGFkRXJyb3IgPT09IHRydWUpIHtcbiAgICB2YXIgcHJvcCA9IHN0cmVhbS5fYmluZGluZyA9PT0gbnVsbFxuICAgICAgPyAnX2JpbmRpbmcnXG4gICAgICA6ICdfaGFuZGxlJ1xuXG4gICAgc3RyZWFtW3Byb3BdID0ge1xuICAgICAgY2xvc2U6IGZ1bmN0aW9uICgpIHsgdGhpc1twcm9wXSA9IG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5jbG9zZSgpXG59XG5cbi8qKlxuICogRGVzdHJveSBhIFpsaWIgc3RyZWFtLlxuICpcbiAqIFpsaWIgc3RyZWFtcyBkb24ndCBoYXZlIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBOb2RlLmpzIDYuIE9uIHRvcCBvZiB0aGF0XG4gKiBzaW1wbHkgY2FsbGluZyBkZXN0cm95IG9uIGEgemxpYiBzdHJlYW0gaW4gTm9kZS5qcyA4KyB3aWxsIHJlc3VsdCBpbiBhXG4gKiBtZW1vcnkgbGVhay4gU28gdW50aWwgdGhhdCBpcyBmaXhlZCwgd2UgbmVlZCB0byBjYWxsIGJvdGggY2xvc2UgQU5EIGRlc3Ryb3kuXG4gKlxuICogUFIgdG8gZml4IG1lbW9yeSBsZWFrOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8yMzczNFxuICpcbiAqIEluIE5vZGUuanMgNis4LCBpdCdzIGltcG9ydGFudCB0aGF0IGRlc3Ryb3kgaXMgY2FsbGVkIGJlZm9yZSBjbG9zZSBhcyB0aGVcbiAqIHN0cmVhbSB3b3VsZCBvdGhlcndpc2UgZW1pdCB0aGUgZXJyb3IgJ3psaWIgYmluZGluZyBjbG9zZWQnLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZGVzdHJveVpsaWJTdHJlYW0gKHN0cmVhbSkge1xuICBpZiAodHlwZW9mIHN0cmVhbS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gbm9kZS5qcyBjb3JlIGJ1ZyB3b3JrLWFyb3VuZFxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBpZjogbm9kZS5qcyAwLjhcbiAgICBpZiAoc3RyZWFtLl9iaW5kaW5nKSB7XG4gICAgICAvLyBub2RlLmpzIDwgMC4xMC4wXG4gICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgICBpZiAoc3RyZWFtLl9wcm9jZXNzaW5nKSB7XG4gICAgICAgIHN0cmVhbS5fbmVlZERyYWluID0gdHJ1ZVxuICAgICAgICBzdHJlYW0ub25jZSgnZHJhaW4nLCBvbkRyYWluQ2xlYXJCaW5kaW5nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtLl9iaW5kaW5nLmNsZWFyKClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0cmVhbS5fZGVzdHJveSAmJiBzdHJlYW0uX2Rlc3Ryb3kgIT09IFN0cmVhbS5UcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95KSB7XG4gICAgICAvLyBub2RlLmpzID49IDEyLCBeMTEuMS4wLCBeMTAuMTUuMVxuICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgIH0gZWxzZSBpZiAoc3RyZWFtLl9kZXN0cm95ICYmIHR5cGVvZiBzdHJlYW0uY2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIG5vZGUuanMgNywgOFxuICAgICAgc3RyZWFtLmRlc3Ryb3llZCA9IHRydWVcbiAgICAgIHN0cmVhbS5jbG9zZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZhbGxiYWNrXG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyZWFtLmNsb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gbm9kZS5qcyA8IDggZmFsbGJhY2tcbiAgICBjbG9zZVpsaWJTdHJlYW0oc3RyZWFtKVxuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHN0cmVhbSBoYXMgZGVzdHJveS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaGFzRGVzdHJveSAoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0gaW5zdGFuY2VvZiBTdHJlYW0gJiZcbiAgICB0eXBlb2Ygc3RyZWFtLmRlc3Ryb3kgPT09ICdmdW5jdGlvbidcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdmFsIGlzIEV2ZW50RW1pdHRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNFdmVudEVtaXR0ZXIgKHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHN0cmVhbSBpcyBmcy5SZWFkU3RyZWFtIHN0cmVhbS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNGc1JlYWRTdHJlYW0gKHN0cmVhbSkge1xuICByZXR1cm4gc3RyZWFtIGluc3RhbmNlb2YgUmVhZFN0cmVhbVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBzdHJlYW0gaXMgWmxpYiBzdHJlYW0uXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzWmxpYlN0cmVhbSAoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0gaW5zdGFuY2VvZiBabGliLkd6aXAgfHxcbiAgICBzdHJlYW0gaW5zdGFuY2VvZiBabGliLkd1bnppcCB8fFxuICAgIHN0cmVhbSBpbnN0YW5jZW9mIFpsaWIuRGVmbGF0ZSB8fFxuICAgIHN0cmVhbSBpbnN0YW5jZW9mIFpsaWIuRGVmbGF0ZVJhdyB8fFxuICAgIHN0cmVhbSBpbnN0YW5jZW9mIFpsaWIuSW5mbGF0ZSB8fFxuICAgIHN0cmVhbSBpbnN0YW5jZW9mIFpsaWIuSW5mbGF0ZVJhdyB8fFxuICAgIHN0cmVhbSBpbnN0YW5jZW9mIFpsaWIuVW56aXBcbn1cblxuLyoqXG4gKiBOby1vcCBmdW5jdGlvbi5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG4vKipcbiAqIE9uIGRyYWluIGhhbmRsZXIgdG8gY2xlYXIgYmluZGluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuLy8gaXN0YW5idWwgaWdub3JlIG5leHQ6IG5vZGUuanMgMC44XG5mdW5jdGlvbiBvbkRyYWluQ2xlYXJCaW5kaW5nICgpIHtcbiAgdGhpcy5fYmluZGluZy5jbGVhcigpXG59XG5cbi8qKlxuICogT24gb3BlbiBoYW5kbGVyIHRvIGNsb3NlIHN0cmVhbS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gb25PcGVuQ2xvc2UgKCkge1xuICBpZiAodHlwZW9mIHRoaXMuZmQgPT09ICdudW1iZXInKSB7XG4gICAgLy8gYWN0dWFsbHkgY2xvc2UgZG93biB0aGUgZmRcbiAgICB0aGlzLmNsb3NlKClcbiAgfVxufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxudmFyIHNhZmVyID0ge31cblxudmFyIGtleVxuXG5mb3IgKGtleSBpbiBidWZmZXIpIHtcbiAgaWYgKCFidWZmZXIuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWVcbiAgaWYgKGtleSA9PT0gJ1Nsb3dCdWZmZXInIHx8IGtleSA9PT0gJ0J1ZmZlcicpIGNvbnRpbnVlXG4gIHNhZmVyW2tleV0gPSBidWZmZXJba2V5XVxufVxuXG52YXIgU2FmZXIgPSBzYWZlci5CdWZmZXIgPSB7fVxuZm9yIChrZXkgaW4gQnVmZmVyKSB7XG4gIGlmICghQnVmZmVyLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlXG4gIGlmIChrZXkgPT09ICdhbGxvY1Vuc2FmZScgfHwga2V5ID09PSAnYWxsb2NVbnNhZmVTbG93JykgY29udGludWVcbiAgU2FmZXJba2V5XSA9IEJ1ZmZlcltrZXldXG59XG5cbnNhZmVyLkJ1ZmZlci5wcm90b3R5cGUgPSBCdWZmZXIucHJvdG90eXBlXG5cbmlmICghU2FmZXIuZnJvbSB8fCBTYWZlci5mcm9tID09PSBVaW50OEFycmF5LmZyb20pIHtcbiAgU2FmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiB2YWx1ZSlcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gQnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cbn1cblxuaWYgKCFTYWZlci5hbGxvYykge1xuICBTYWZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc2l6ZSlcbiAgICB9XG4gICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPj0gMiAqICgxIDw8IDMwKSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gICAgfVxuICAgIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgICBpZiAoIWZpbGwgfHwgZmlsbC5sZW5ndGggPT09IDApIHtcbiAgICAgIGJ1Zi5maWxsKDApXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZlxuICB9XG59XG5cbmlmICghc2FmZXIua1N0cmluZ01heExlbmd0aCkge1xuICB0cnkge1xuICAgIHNhZmVyLmtTdHJpbmdNYXhMZW5ndGggPSBwcm9jZXNzLmJpbmRpbmcoJ2J1ZmZlcicpLmtTdHJpbmdNYXhMZW5ndGhcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIHdlIGNhbid0IGRldGVybWluZSBrU3RyaW5nTWF4TGVuZ3RoIGluIGVudmlyb25tZW50cyB3aGVyZSBwcm9jZXNzLmJpbmRpbmdcbiAgICAvLyBpcyB1bnN1cHBvcnRlZCwgc28gbGV0J3Mgbm90IHNldCBpdFxuICB9XG59XG5cbmlmICghc2FmZXIuY29uc3RhbnRzKSB7XG4gIHNhZmVyLmNvbnN0YW50cyA9IHtcbiAgICBNQVhfTEVOR1RIOiBzYWZlci5rTWF4TGVuZ3RoXG4gIH1cbiAgaWYgKHNhZmVyLmtTdHJpbmdNYXhMZW5ndGgpIHtcbiAgICBzYWZlci5jb25zdGFudHMuTUFYX1NUUklOR19MRU5HVEggPSBzYWZlci5rU3RyaW5nTWF4TGVuZ3RoXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzYWZlclxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG52YXIgQk9NQ2hhciA9ICdcXHVGRUZGJztcblxuZXhwb3J0cy5QcmVwZW5kQk9NID0gUHJlcGVuZEJPTVdyYXBwZXJcbmZ1bmN0aW9uIFByZXBlbmRCT01XcmFwcGVyKGVuY29kZXIsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmVuY29kZXIgPSBlbmNvZGVyO1xuICAgIHRoaXMuYWRkQk9NID0gdHJ1ZTtcbn1cblxuUHJlcGVuZEJPTVdyYXBwZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgaWYgKHRoaXMuYWRkQk9NKSB7XG4gICAgICAgIHN0ciA9IEJPTUNoYXIgKyBzdHI7XG4gICAgICAgIHRoaXMuYWRkQk9NID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZW5jb2Rlci53cml0ZShzdHIpO1xufVxuXG5QcmVwZW5kQk9NV3JhcHBlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2Rlci5lbmQoKTtcbn1cblxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnRzLlN0cmlwQk9NID0gU3RyaXBCT01XcmFwcGVyO1xuZnVuY3Rpb24gU3RyaXBCT01XcmFwcGVyKGRlY29kZXIsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBkZWNvZGVyO1xuICAgIHRoaXMucGFzcyA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG59XG5cblN0cmlwQk9NV3JhcHBlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHtcbiAgICB2YXIgcmVzID0gdGhpcy5kZWNvZGVyLndyaXRlKGJ1Zik7XG4gICAgaWYgKHRoaXMucGFzcyB8fCAhcmVzKVxuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgaWYgKHJlc1swXSA9PT0gQk9NQ2hhcikge1xuICAgICAgICByZXMgPSByZXMuc2xpY2UoMSk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnN0cmlwQk9NID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0cmlwQk9NKCk7XG4gICAgfVxuXG4gICAgdGhpcy5wYXNzID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5TdHJpcEJPTVdyYXBwZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmRlY29kZXIuZW5kKCk7XG59XG5cbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBCdWZmZXIgPSByZXF1aXJlKFwic2FmZXItYnVmZmVyXCIpLkJ1ZmZlcjtcblxuLy8gRXhwb3J0IE5vZGUuanMgaW50ZXJuYWwgZW5jb2RpbmdzLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAvLyBFbmNvZGluZ3NcbiAgICB1dGY4OiAgIHsgdHlwZTogXCJfaW50ZXJuYWxcIiwgYm9tQXdhcmU6IHRydWV9LFxuICAgIGNlc3U4OiAgeyB0eXBlOiBcIl9pbnRlcm5hbFwiLCBib21Bd2FyZTogdHJ1ZX0sXG4gICAgdW5pY29kZTExdXRmODogXCJ1dGY4XCIsXG5cbiAgICB1Y3MyOiAgIHsgdHlwZTogXCJfaW50ZXJuYWxcIiwgYm9tQXdhcmU6IHRydWV9LFxuICAgIHV0ZjE2bGU6IFwidWNzMlwiLFxuXG4gICAgYmluYXJ5OiB7IHR5cGU6IFwiX2ludGVybmFsXCIgfSxcbiAgICBiYXNlNjQ6IHsgdHlwZTogXCJfaW50ZXJuYWxcIiB9LFxuICAgIGhleDogICAgeyB0eXBlOiBcIl9pbnRlcm5hbFwiIH0sXG5cbiAgICAvLyBDb2RlYy5cbiAgICBfaW50ZXJuYWw6IEludGVybmFsQ29kZWMsXG59O1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBJbnRlcm5hbENvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgICB0aGlzLmVuYyA9IGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWU7XG4gICAgdGhpcy5ib21Bd2FyZSA9IGNvZGVjT3B0aW9ucy5ib21Bd2FyZTtcblxuICAgIGlmICh0aGlzLmVuYyA9PT0gXCJiYXNlNjRcIilcbiAgICAgICAgdGhpcy5lbmNvZGVyID0gSW50ZXJuYWxFbmNvZGVyQmFzZTY0O1xuICAgIGVsc2UgaWYgKHRoaXMuZW5jID09PSBcImNlc3U4XCIpIHtcbiAgICAgICAgdGhpcy5lbmMgPSBcInV0ZjhcIjsgLy8gVXNlIHV0ZjggZm9yIGRlY29kaW5nLlxuICAgICAgICB0aGlzLmVuY29kZXIgPSBJbnRlcm5hbEVuY29kZXJDZXN1ODtcblxuICAgICAgICAvLyBBZGQgZGVjb2RlciBmb3IgdmVyc2lvbnMgb2YgTm9kZSBub3Qgc3VwcG9ydGluZyBDRVNVLThcbiAgICAgICAgaWYgKEJ1ZmZlci5mcm9tKCdlZGEwYmRlZGIyYTknLCAnaGV4JykudG9TdHJpbmcoKSAhPT0gJ1x1RDgzRFx1RENBOScpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb2RlciA9IEludGVybmFsRGVjb2RlckNlc3U4O1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBpY29udi5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkludGVybmFsQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBJbnRlcm5hbEVuY29kZXI7XG5JbnRlcm5hbENvZGVjLnByb3RvdHlwZS5kZWNvZGVyID0gSW50ZXJuYWxEZWNvZGVyO1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBXZSB1c2Ugbm9kZS5qcyBpbnRlcm5hbCBkZWNvZGVyLiBJdHMgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIG91cnMuXG52YXIgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJykuU3RyaW5nRGVjb2RlcjtcblxuaWYgKCFTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQpIC8vIE5vZGUgdjAuOCBkb2Vzbid0IGhhdmUgdGhpcyBtZXRob2QuXG4gICAgU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7fTtcblxuXG5mdW5jdGlvbiBJbnRlcm5hbERlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICBTdHJpbmdEZWNvZGVyLmNhbGwodGhpcywgY29kZWMuZW5jKTtcbn1cblxuSW50ZXJuYWxEZWNvZGVyLnByb3RvdHlwZSA9IFN0cmluZ0RlY29kZXIucHJvdG90eXBlO1xuXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNvZGVyIGlzIG1vc3RseSB0cml2aWFsXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMuZW5jID0gY29kZWMuZW5jO1xufVxuXG5JbnRlcm5hbEVuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHN0ciwgdGhpcy5lbmMpO1xufVxuXG5JbnRlcm5hbEVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeGNlcHQgYmFzZTY0IGVuY29kZXIsIHdoaWNoIG11c3Qga2VlcCBpdHMgc3RhdGUuXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlckJhc2U2NChvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMucHJldlN0ciA9ICcnO1xufVxuXG5JbnRlcm5hbEVuY29kZXJCYXNlNjQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgc3RyID0gdGhpcy5wcmV2U3RyICsgc3RyO1xuICAgIHZhciBjb21wbGV0ZVF1YWRzID0gc3RyLmxlbmd0aCAtIChzdHIubGVuZ3RoICUgNCk7XG4gICAgdGhpcy5wcmV2U3RyID0gc3RyLnNsaWNlKGNvbXBsZXRlUXVhZHMpO1xuICAgIHN0ciA9IHN0ci5zbGljZSgwLCBjb21wbGV0ZVF1YWRzKTtcblxuICAgIHJldHVybiBCdWZmZXIuZnJvbShzdHIsIFwiYmFzZTY0XCIpO1xufVxuXG5JbnRlcm5hbEVuY29kZXJCYXNlNjQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLnByZXZTdHIsIFwiYmFzZTY0XCIpO1xufVxuXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDRVNVLTggZW5jb2RlciBpcyBhbHNvIHNwZWNpYWwuXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlckNlc3U4KG9wdGlvbnMsIGNvZGVjKSB7XG59XG5cbkludGVybmFsRW5jb2RlckNlc3U4LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciBidWYgPSBCdWZmZXIuYWxsb2Moc3RyLmxlbmd0aCAqIDMpLCBidWZJZHggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAvLyBOYWl2ZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGl0IHdvcmtzIGJlY2F1c2UgQ0VTVS04IGlzIGVzcGVjaWFsbHkgZWFzeVxuICAgICAgICAvLyB0byBjb252ZXJ0IGZyb20gVVRGLTE2ICh3aGljaCBhbGwgSlMgc3RyaW5ncyBhcmUgZW5jb2RlZCBpbikuXG4gICAgICAgIGlmIChjaGFyQ29kZSA8IDB4ODApXG4gICAgICAgICAgICBidWZbYnVmSWR4KytdID0gY2hhckNvZGU7XG4gICAgICAgIGVsc2UgaWYgKGNoYXJDb2RlIDwgMHg4MDApIHtcbiAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSAweEMwICsgKGNoYXJDb2RlID4+PiA2KTtcbiAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSAweDgwICsgKGNoYXJDb2RlICYgMHgzZik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIGNoYXJDb2RlIHdpbGwgYWx3YXlzIGJlIDwgMHgxMDAwMCBpbiBqYXZhc2NyaXB0LlxuICAgICAgICAgICAgYnVmW2J1ZklkeCsrXSA9IDB4RTAgKyAoY2hhckNvZGUgPj4+IDEyKTtcbiAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSAweDgwICsgKChjaGFyQ29kZSA+Pj4gNikgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSAweDgwICsgKGNoYXJDb2RlICYgMHgzZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1Zi5zbGljZSgwLCBidWZJZHgpO1xufVxuXG5JbnRlcm5hbEVuY29kZXJDZXN1OC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG59XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDRVNVLTggZGVjb2RlciBpcyBub3QgaW1wbGVtZW50ZWQgaW4gTm9kZSB2NC4wK1xuXG5mdW5jdGlvbiBJbnRlcm5hbERlY29kZXJDZXN1OChvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMuYWNjID0gMDtcbiAgICB0aGlzLmNvbnRCeXRlcyA9IDA7XG4gICAgdGhpcy5hY2NCeXRlcyA9IDA7XG4gICAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBjb2RlYy5kZWZhdWx0Q2hhclVuaWNvZGU7XG59XG5cbkludGVybmFsRGVjb2RlckNlc3U4LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIHZhciBhY2MgPSB0aGlzLmFjYywgY29udEJ5dGVzID0gdGhpcy5jb250Qnl0ZXMsIGFjY0J5dGVzID0gdGhpcy5hY2NCeXRlcywgXG4gICAgICAgIHJlcyA9ICcnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjdXJCeXRlID0gYnVmW2ldO1xuICAgICAgICBpZiAoKGN1ckJ5dGUgJiAweEMwKSAhPT0gMHg4MCkgeyAvLyBMZWFkaW5nIGJ5dGVcbiAgICAgICAgICAgIGlmIChjb250Qnl0ZXMgPiAwKSB7IC8vIFByZXZpb3VzIGNvZGUgaXMgaW52YWxpZFxuICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgICAgICAgICAgICAgICBjb250Qnl0ZXMgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VyQnl0ZSA8IDB4ODApIHsgLy8gU2luZ2xlLWJ5dGUgY29kZVxuICAgICAgICAgICAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGN1ckJ5dGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJCeXRlIDwgMHhFMCkgeyAvLyBUd28tYnl0ZSBjb2RlXG4gICAgICAgICAgICAgICAgYWNjID0gY3VyQnl0ZSAmIDB4MUY7XG4gICAgICAgICAgICAgICAgY29udEJ5dGVzID0gMTsgYWNjQnl0ZXMgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJCeXRlIDwgMHhGMCkgeyAvLyBUaHJlZS1ieXRlIGNvZGVcbiAgICAgICAgICAgICAgICBhY2MgPSBjdXJCeXRlICYgMHgwRjtcbiAgICAgICAgICAgICAgICBjb250Qnl0ZXMgPSAyOyBhY2NCeXRlcyA9IDE7XG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBGb3VyIG9yIG1vcmUgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIENFU1UtOC5cbiAgICAgICAgICAgICAgICByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7IC8vIENvbnRpbnVhdGlvbiBieXRlXG4gICAgICAgICAgICBpZiAoY29udEJ5dGVzID4gMCkgeyAvLyBXZSdyZSB3YWl0aW5nIGZvciBpdC5cbiAgICAgICAgICAgICAgICBhY2MgPSAoYWNjIDw8IDYpIHwgKGN1ckJ5dGUgJiAweDNmKTtcbiAgICAgICAgICAgICAgICBjb250Qnl0ZXMtLTsgYWNjQnl0ZXMrKztcbiAgICAgICAgICAgICAgICBpZiAoY29udEJ5dGVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVybG9uZyBlbmNvZGluZywgYnV0IHN1cHBvcnQgTW9kaWZpZWQgVVRGLTggKGVuY29kaW5nIE5VTEwgYXMgQzAgODApXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY2NCeXRlcyA9PT0gMiAmJiBhY2MgPCAweDgwICYmIGFjYyA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjY0J5dGVzID09PSAzICYmIGFjYyA8IDB4ODAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3R1YWxseSBhZGQgY2hhcmFjdGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYWNjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgeyAvLyBVbmV4cGVjdGVkIGNvbnRpbnVhdGlvbiBieXRlXG4gICAgICAgICAgICAgICAgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWNjID0gYWNjOyB0aGlzLmNvbnRCeXRlcyA9IGNvbnRCeXRlczsgdGhpcy5hY2NCeXRlcyA9IGFjY0J5dGVzO1xuICAgIHJldHVybiByZXM7XG59XG5cbkludGVybmFsRGVjb2RlckNlc3U4LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzID0gMDtcbiAgICBpZiAodGhpcy5jb250Qnl0ZXMgPiAwKVxuICAgICAgICByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgcmV0dXJuIHJlcztcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBCdWZmZXIgPSByZXF1aXJlKFwic2FmZXItYnVmZmVyXCIpLkJ1ZmZlcjtcblxuLy8gTm90ZTogVVRGMTYtTEUgKG9yIFVDUzIpIGNvZGVjIGlzIE5vZGUuanMgbmF0aXZlLiBTZWUgZW5jb2RpbmdzL2ludGVybmFsLmpzXG5cbi8vID09IFVURjE2LUJFIGNvZGVjLiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydHMudXRmMTZiZSA9IFV0ZjE2QkVDb2RlYztcbmZ1bmN0aW9uIFV0ZjE2QkVDb2RlYygpIHtcbn1cblxuVXRmMTZCRUNvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmMTZCRUVuY29kZXI7XG5VdGYxNkJFQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBVdGYxNkJFRGVjb2RlcjtcblV0ZjE2QkVDb2RlYy5wcm90b3R5cGUuYm9tQXdhcmUgPSB0cnVlO1xuXG5cbi8vIC0tIEVuY29kaW5nXG5cbmZ1bmN0aW9uIFV0ZjE2QkVFbmNvZGVyKCkge1xufVxuXG5VdGYxNkJFRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgYnVmID0gQnVmZmVyLmZyb20oc3RyLCAndWNzMicpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHZhciB0bXAgPSBidWZbaV07IGJ1ZltpXSA9IGJ1ZltpKzFdOyBidWZbaSsxXSA9IHRtcDtcbiAgICB9XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxuVXRmMTZCRUVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbi8vIC0tIERlY29kaW5nXG5cbmZ1bmN0aW9uIFV0ZjE2QkVEZWNvZGVyKCkge1xuICAgIHRoaXMub3ZlcmZsb3dCeXRlID0gLTE7XG59XG5cblV0ZjE2QkVEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIGlmIChidWYubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiAnJztcblxuICAgIHZhciBidWYyID0gQnVmZmVyLmFsbG9jKGJ1Zi5sZW5ndGggKyAxKSxcbiAgICAgICAgaSA9IDAsIGogPSAwO1xuXG4gICAgaWYgKHRoaXMub3ZlcmZsb3dCeXRlICE9PSAtMSkge1xuICAgICAgICBidWYyWzBdID0gYnVmWzBdO1xuICAgICAgICBidWYyWzFdID0gdGhpcy5vdmVyZmxvd0J5dGU7XG4gICAgICAgIGkgPSAxOyBqID0gMjtcbiAgICB9XG5cbiAgICBmb3IgKDsgaSA8IGJ1Zi5sZW5ndGgtMTsgaSArPSAyLCBqKz0gMikge1xuICAgICAgICBidWYyW2pdID0gYnVmW2krMV07XG4gICAgICAgIGJ1ZjJbaisxXSA9IGJ1ZltpXTtcbiAgICB9XG5cbiAgICB0aGlzLm92ZXJmbG93Qnl0ZSA9IChpID09IGJ1Zi5sZW5ndGgtMSkgPyBidWZbYnVmLmxlbmd0aC0xXSA6IC0xO1xuXG4gICAgcmV0dXJuIGJ1ZjIuc2xpY2UoMCwgaikudG9TdHJpbmcoJ3VjczInKTtcbn1cblxuVXRmMTZCRURlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbi8vID09IFVURi0xNiBjb2RlYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWNvZGVyIGNob29zZXMgYXV0b21hdGljYWxseSBmcm9tIFVURi0xNkxFIGFuZCBVVEYtMTZCRSB1c2luZyBCT00gYW5kIHNwYWNlLWJhc2VkIGhldXJpc3RpYy5cbi8vIERlZmF1bHRzIHRvIFVURi0xNkxFLCBhcyBpdCdzIHByZXZhbGVudCBhbmQgZGVmYXVsdCBpbiBOb2RlLlxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYgYW5kIGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI3V0Zi0xNmxlXG4vLyBEZWNvZGVyIGRlZmF1bHQgY2FuIGJlIGNoYW5nZWQ6IGljb252LmRlY29kZShidWYsICd1dGYxNicsIHtkZWZhdWx0RW5jb2Rpbmc6ICd1dGYtMTZiZSd9KTtcblxuLy8gRW5jb2RlciB1c2VzIFVURi0xNkxFIGFuZCBwcmVwZW5kcyBCT00gKHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggYWRkQk9NOiBmYWxzZSkuXG5cbmV4cG9ydHMudXRmMTYgPSBVdGYxNkNvZGVjO1xuZnVuY3Rpb24gVXRmMTZDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gICAgdGhpcy5pY29udiA9IGljb252O1xufVxuXG5VdGYxNkNvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmMTZFbmNvZGVyO1xuVXRmMTZDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFV0ZjE2RGVjb2RlcjtcblxuXG4vLyAtLSBFbmNvZGluZyAocGFzcy10aHJvdWdoKVxuXG5mdW5jdGlvbiBVdGYxNkVuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAob3B0aW9ucy5hZGRCT00gPT09IHVuZGVmaW5lZClcbiAgICAgICAgb3B0aW9ucy5hZGRCT00gPSB0cnVlO1xuICAgIHRoaXMuZW5jb2RlciA9IGNvZGVjLmljb252LmdldEVuY29kZXIoJ3V0Zi0xNmxlJywgb3B0aW9ucyk7XG59XG5cblV0ZjE2RW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5lbmNvZGVyLndyaXRlKHN0cik7XG59XG5cblV0ZjE2RW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2Rlci5lbmQoKTtcbn1cblxuXG4vLyAtLSBEZWNvZGluZ1xuXG5mdW5jdGlvbiBVdGYxNkRlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICAgIHRoaXMuaW5pdGlhbEJ5dGVzID0gW107XG4gICAgdGhpcy5pbml0aWFsQnl0ZXNMZW4gPSAwO1xuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG59XG5cblV0ZjE2RGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHtcbiAgICBpZiAoIXRoaXMuZGVjb2Rlcikge1xuICAgICAgICAvLyBDb2RlYyBpcyBub3QgY2hvc2VuIHlldC4gQWNjdW11bGF0ZSBpbml0aWFsIGJ5dGVzLlxuICAgICAgICB0aGlzLmluaXRpYWxCeXRlcy5wdXNoKGJ1Zik7XG4gICAgICAgIHRoaXMuaW5pdGlhbEJ5dGVzTGVuICs9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5pbml0aWFsQnl0ZXNMZW4gPCAxNikgLy8gV2UgbmVlZCBtb3JlIGJ5dGVzIHRvIHVzZSBzcGFjZSBoZXVyaXN0aWMgKHNlZSBiZWxvdylcbiAgICAgICAgICAgIHJldHVybiAnJztcblxuICAgICAgICAvLyBXZSBoYXZlIGVub3VnaCBieXRlcyAtPiBkZXRlY3QgZW5kaWFubmVzcy5cbiAgICAgICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQodGhpcy5pbml0aWFsQnl0ZXMpLFxuICAgICAgICAgICAgZW5jb2RpbmcgPSBkZXRlY3RFbmNvZGluZyhidWYsIHRoaXMub3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSB0aGlzLmljb252LmdldERlY29kZXIoZW5jb2RpbmcsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuaW5pdGlhbEJ5dGVzLmxlbmd0aCA9IHRoaXMuaW5pdGlhbEJ5dGVzTGVuID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGVyLndyaXRlKGJ1Zik7XG59XG5cblV0ZjE2RGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmRlY29kZXIpIHtcbiAgICAgICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQodGhpcy5pbml0aWFsQnl0ZXMpLFxuICAgICAgICAgICAgZW5jb2RpbmcgPSBkZXRlY3RFbmNvZGluZyhidWYsIHRoaXMub3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSB0aGlzLmljb252LmdldERlY29kZXIoZW5jb2RpbmcsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuZGVjb2Rlci53cml0ZShidWYpLFxuICAgICAgICAgICAgdHJhaWwgPSB0aGlzLmRlY29kZXIuZW5kKCk7XG5cbiAgICAgICAgcmV0dXJuIHRyYWlsID8gKHJlcyArIHRyYWlsKSA6IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGVjb2Rlci5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0RW5jb2RpbmcoYnVmLCBkZWZhdWx0RW5jb2RpbmcpIHtcbiAgICB2YXIgZW5jID0gZGVmYXVsdEVuY29kaW5nIHx8ICd1dGYtMTZsZSc7XG5cbiAgICBpZiAoYnVmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIC8vIENoZWNrIEJPTS5cbiAgICAgICAgaWYgKGJ1ZlswXSA9PSAweEZFICYmIGJ1ZlsxXSA9PSAweEZGKSAvLyBVVEYtMTZCRSBCT01cbiAgICAgICAgICAgIGVuYyA9ICd1dGYtMTZiZSc7XG4gICAgICAgIGVsc2UgaWYgKGJ1ZlswXSA9PSAweEZGICYmIGJ1ZlsxXSA9PSAweEZFKSAvLyBVVEYtMTZMRSBCT01cbiAgICAgICAgICAgIGVuYyA9ICd1dGYtMTZsZSc7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gQk9NIGZvdW5kLiBUcnkgdG8gZGVkdWNlIGVuY29kaW5nIGZyb20gaW5pdGlhbCBjb250ZW50LlxuICAgICAgICAgICAgLy8gTW9zdCBvZiB0aGUgdGltZSwgdGhlIGNvbnRlbnQgaGFzIEFTQ0lJIGNoYXJzIChVKzAwKiopLCBidXQgdGhlIG9wcG9zaXRlIChVKyoqMDApIGlzIHVuY29tbW9uLlxuICAgICAgICAgICAgLy8gU28sIHdlIGNvdW50IEFTQ0lJIGFzIGlmIGl0IHdhcyBMRSBvciBCRSwgYW5kIGRlY2lkZSBmcm9tIHRoYXQuXG4gICAgICAgICAgICB2YXIgYXNjaWlDaGFyc0xFID0gMCwgYXNjaWlDaGFyc0JFID0gMCwgLy8gQ291bnRzIG9mIGNoYXJzIGluIGJvdGggcG9zaXRpb25zXG4gICAgICAgICAgICAgICAgX2xlbiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSAoYnVmLmxlbmd0aCAlIDIpLCA2NCk7IC8vIExlbiBpcyBhbHdheXMgZXZlbi5cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfbGVuOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldID09PSAwICYmIGJ1ZltpKzFdICE9PSAwKSBhc2NpaUNoYXJzQkUrKztcbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9PSAwICYmIGJ1ZltpKzFdID09PSAwKSBhc2NpaUNoYXJzTEUrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFzY2lpQ2hhcnNCRSA+IGFzY2lpQ2hhcnNMRSlcbiAgICAgICAgICAgICAgICBlbmMgPSAndXRmLTE2YmUnO1xuICAgICAgICAgICAgZWxzZSBpZiAoYXNjaWlDaGFyc0JFIDwgYXNjaWlDaGFyc0xFKVxuICAgICAgICAgICAgICAgIGVuYyA9ICd1dGYtMTZsZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5jO1xufVxuXG5cbiIsICJcInVzZSBzdHJpY3RcIjtcbnZhciBCdWZmZXIgPSByZXF1aXJlKFwic2FmZXItYnVmZmVyXCIpLkJ1ZmZlcjtcblxuLy8gVVRGLTcgY29kZWMsIGFjY29yZGluZyB0byBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjE1MlxuLy8gU2VlIGFsc28gYmVsb3cgYSBVVEYtNy1JTUFQIGNvZGVjLCBhY2NvcmRpbmcgdG8gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTUuMS4zXG5cbmV4cG9ydHMudXRmNyA9IFV0ZjdDb2RlYztcbmV4cG9ydHMudW5pY29kZTExdXRmNyA9ICd1dGY3JzsgLy8gQWxpYXMgVU5JQ09ERS0xLTEtVVRGLTdcbmZ1bmN0aW9uIFV0ZjdDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gICAgdGhpcy5pY29udiA9IGljb252O1xufTtcblxuVXRmN0NvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmN0VuY29kZXI7XG5VdGY3Q29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBVdGY3RGVjb2RlcjtcblV0ZjdDb2RlYy5wcm90b3R5cGUuYm9tQXdhcmUgPSB0cnVlO1xuXG5cbi8vIC0tIEVuY29kaW5nXG5cbnZhciBub25EaXJlY3RDaGFycyA9IC9bXkEtWmEtejAtOSdcXChcXCksLVxcLlxcLzpcXD8gXFxuXFxyXFx0XSsvZztcblxuZnVuY3Rpb24gVXRmN0VuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG59XG5cblV0ZjdFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIC8vIE5haXZlIGltcGxlbWVudGF0aW9uLlxuICAgIC8vIE5vbi1kaXJlY3QgY2hhcnMgYXJlIGVuY29kZWQgYXMgXCIrPGJhc2U2ND4tXCI7IHNpbmdsZSBcIitcIiBjaGFyIGlzIGVuY29kZWQgYXMgXCIrLVwiLlxuICAgIHJldHVybiBCdWZmZXIuZnJvbShzdHIucmVwbGFjZShub25EaXJlY3RDaGFycywgZnVuY3Rpb24oY2h1bmspIHtcbiAgICAgICAgcmV0dXJuIFwiK1wiICsgKGNodW5rID09PSAnKycgPyAnJyA6IFxuICAgICAgICAgICAgdGhpcy5pY29udi5lbmNvZGUoY2h1bmssICd1dGYxNi1iZScpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC89KyQvLCAnJykpIFxuICAgICAgICAgICAgKyBcIi1cIjtcbiAgICB9LmJpbmQodGhpcykpKTtcbn1cblxuVXRmN0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbi8vIC0tIERlY29kaW5nXG5cbmZ1bmN0aW9uIFV0ZjdEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgdGhpcy5pY29udiA9IGNvZGVjLmljb252O1xuICAgIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgICB0aGlzLmJhc2U2NEFjY3VtID0gJyc7XG59XG5cbnZhciBiYXNlNjRSZWdleCA9IC9bQS1aYS16MC05XFwvK10vO1xudmFyIGJhc2U2NENoYXJzID0gW107XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgaSsrKVxuICAgIGJhc2U2NENoYXJzW2ldID0gYmFzZTY0UmVnZXgudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGkpKTtcblxudmFyIHBsdXNDaGFyID0gJysnLmNoYXJDb2RlQXQoMCksIFxuICAgIG1pbnVzQ2hhciA9ICctJy5jaGFyQ29kZUF0KDApLFxuICAgIGFuZENoYXIgPSAnJicuY2hhckNvZGVBdCgwKTtcblxuVXRmN0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmKSB7XG4gICAgdmFyIHJlcyA9IFwiXCIsIGxhc3RJID0gMCxcbiAgICAgICAgaW5CYXNlNjQgPSB0aGlzLmluQmFzZTY0LFxuICAgICAgICBiYXNlNjRBY2N1bSA9IHRoaXMuYmFzZTY0QWNjdW07XG5cbiAgICAvLyBUaGUgZGVjb2RlciBpcyBtb3JlIGludm9sdmVkIGFzIHdlIG11c3QgaGFuZGxlIGNodW5rcyBpbiBzdHJlYW0uXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWluQmFzZTY0KSB7IC8vIFdlJ3JlIGluIGRpcmVjdCBtb2RlLlxuICAgICAgICAgICAgLy8gV3JpdGUgZGlyZWN0IGNoYXJzIHVudGlsICcrJ1xuICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSBwbHVzQ2hhcikge1xuICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEksIGkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG4gICAgICAgICAgICAgICAgbGFzdEkgPSBpKzE7XG4gICAgICAgICAgICAgICAgaW5CYXNlNjQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgeyAvLyBXZSBkZWNvZGUgYmFzZTY0LlxuICAgICAgICAgICAgaWYgKCFiYXNlNjRDaGFyc1tidWZbaV1dKSB7IC8vIEJhc2U2NCBlbmRlZC5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PSBsYXN0SSAmJiBidWZbaV0gPT0gbWludXNDaGFyKSB7Ly8gXCIrLVwiIC0+IFwiK1wiXG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSBcIitcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYjY0c3RyID0gYmFzZTY0QWNjdW0gKyBidWYuc2xpY2UobGFzdEksIGkpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIuZnJvbShiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9IG1pbnVzQ2hhcikgLy8gTWludXMgaXMgYWJzb3JiZWQgYWZ0ZXIgYmFzZTY0LlxuICAgICAgICAgICAgICAgICAgICBpLS07XG5cbiAgICAgICAgICAgICAgICBsYXN0SSA9IGkrMTtcbiAgICAgICAgICAgICAgICBpbkJhc2U2NCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJhc2U2NEFjY3VtID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWluQmFzZTY0KSB7XG4gICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGI2NHN0ciA9IGJhc2U2NEFjY3VtICsgYnVmLnNsaWNlKGxhc3RJKS50b1N0cmluZygpO1xuXG4gICAgICAgIHZhciBjYW5CZURlY29kZWQgPSBiNjRzdHIubGVuZ3RoIC0gKGI2NHN0ci5sZW5ndGggJSA4KTsgLy8gTWluaW1hbCBjaHVuazogMiBxdWFkcyAtPiAyeDMgYnl0ZXMgLT4gMyBjaGFycy5cbiAgICAgICAgYmFzZTY0QWNjdW0gPSBiNjRzdHIuc2xpY2UoY2FuQmVEZWNvZGVkKTsgLy8gVGhlIHJlc3Qgd2lsbCBiZSBkZWNvZGVkIGluIGZ1dHVyZS5cbiAgICAgICAgYjY0c3RyID0gYjY0c3RyLnNsaWNlKDAsIGNhbkJlRGVjb2RlZCk7XG5cbiAgICAgICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKEJ1ZmZlci5mcm9tKGI2NHN0ciwgJ2Jhc2U2NCcpLCBcInV0ZjE2LWJlXCIpO1xuICAgIH1cblxuICAgIHRoaXMuaW5CYXNlNjQgPSBpbkJhc2U2NDtcbiAgICB0aGlzLmJhc2U2NEFjY3VtID0gYmFzZTY0QWNjdW07XG5cbiAgICByZXR1cm4gcmVzO1xufVxuXG5VdGY3RGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMuaW5CYXNlNjQgJiYgdGhpcy5iYXNlNjRBY2N1bS5sZW5ndGggPiAwKVxuICAgICAgICByZXMgPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIuZnJvbSh0aGlzLmJhc2U2NEFjY3VtLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG5cbiAgICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gICAgdGhpcy5iYXNlNjRBY2N1bSA9ICcnO1xuICAgIHJldHVybiByZXM7XG59XG5cblxuLy8gVVRGLTctSU1BUCBjb2RlYy5cbi8vIFJGQzM1MDEgU2VjLiA1LjEuMyBNb2RpZmllZCBVVEYtNyAoaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzUwMSNzZWN0aW9uLTUuMS4zKVxuLy8gRGlmZmVyZW5jZXM6XG4vLyAgKiBCYXNlNjQgcGFydCBpcyBzdGFydGVkIGJ5IFwiJlwiIGluc3RlYWQgb2YgXCIrXCJcbi8vICAqIERpcmVjdCBjaGFyYWN0ZXJzIGFyZSAweDIwLTB4N0UsIGV4Y2VwdCBcIiZcIiAoMHgyNilcbi8vICAqIEluIEJhc2U2NCwgXCIsXCIgaXMgdXNlZCBpbnN0ZWFkIG9mIFwiL1wiXG4vLyAgKiBCYXNlNjQgbXVzdCBub3QgYmUgdXNlZCB0byByZXByZXNlbnQgZGlyZWN0IGNoYXJhY3RlcnMuXG4vLyAgKiBObyBpbXBsaWNpdCBzaGlmdCBiYWNrIGZyb20gQmFzZTY0IChzaG91bGQgYWx3YXlzIGVuZCB3aXRoICctJylcbi8vICAqIFN0cmluZyBtdXN0IGVuZCBpbiBub24tc2hpZnRlZCBwb3NpdGlvbi5cbi8vICAqIFwiLSZcIiB3aGlsZSBpbiBiYXNlNjQgaXMgbm90IGFsbG93ZWQuXG5cblxuZXhwb3J0cy51dGY3aW1hcCA9IFV0ZjdJTUFQQ29kZWM7XG5mdW5jdGlvbiBVdGY3SU1BUENvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgICB0aGlzLmljb252ID0gaWNvbnY7XG59O1xuXG5VdGY3SU1BUENvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmN0lNQVBFbmNvZGVyO1xuVXRmN0lNQVBDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFV0ZjdJTUFQRGVjb2RlcjtcblV0ZjdJTUFQQ29kZWMucHJvdG90eXBlLmJvbUF3YXJlID0gdHJ1ZTtcblxuXG4vLyAtLSBFbmNvZGluZ1xuXG5mdW5jdGlvbiBVdGY3SU1BUEVuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG4gICAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICAgIHRoaXMuYmFzZTY0QWNjdW0gPSBCdWZmZXIuYWxsb2MoNik7XG4gICAgdGhpcy5iYXNlNjRBY2N1bUlkeCA9IDA7XG59XG5cblV0ZjdJTUFQRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgaW5CYXNlNjQgPSB0aGlzLmluQmFzZTY0LFxuICAgICAgICBiYXNlNjRBY2N1bSA9IHRoaXMuYmFzZTY0QWNjdW0sXG4gICAgICAgIGJhc2U2NEFjY3VtSWR4ID0gdGhpcy5iYXNlNjRBY2N1bUlkeCxcbiAgICAgICAgYnVmID0gQnVmZmVyLmFsbG9jKHN0ci5sZW5ndGgqNSArIDEwKSwgYnVmSWR4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB1Q2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoMHgyMCA8PSB1Q2hhciAmJiB1Q2hhciA8PSAweDdFKSB7IC8vIERpcmVjdCBjaGFyYWN0ZXIgb3IgJyYnLlxuICAgICAgICAgICAgaWYgKGluQmFzZTY0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGJhc2U2NEFjY3VtSWR4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZJZHggKz0gYnVmLndyaXRlKGJhc2U2NEFjY3VtLnNsaWNlKDAsIGJhc2U2NEFjY3VtSWR4KS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvXFwvL2csICcsJykucmVwbGFjZSgvPSskLywgJycpLCBidWZJZHgpO1xuICAgICAgICAgICAgICAgICAgICBiYXNlNjRBY2N1bUlkeCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnVmW2J1ZklkeCsrXSA9IG1pbnVzQ2hhcjsgLy8gV3JpdGUgJy0nLCB0aGVuIGdvIHRvIGRpcmVjdCBtb2RlLlxuICAgICAgICAgICAgICAgIGluQmFzZTY0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaW5CYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBidWZbYnVmSWR4KytdID0gdUNoYXI7IC8vIFdyaXRlIGRpcmVjdCBjaGFyYWN0ZXJcblxuICAgICAgICAgICAgICAgIGlmICh1Q2hhciA9PT0gYW5kQ2hhcikgIC8vIEFtcGVyc2FuZCAtPiAnJi0nXG4gICAgICAgICAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSBtaW51c0NoYXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHsgLy8gTm9uLWRpcmVjdCBjaGFyYWN0ZXJcbiAgICAgICAgICAgIGlmICghaW5CYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBidWZbYnVmSWR4KytdID0gYW5kQ2hhcjsgLy8gV3JpdGUgJyYnLCB0aGVuIGdvIHRvIGJhc2U2NCBtb2RlLlxuICAgICAgICAgICAgICAgIGluQmFzZTY0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbkJhc2U2NCkge1xuICAgICAgICAgICAgICAgIGJhc2U2NEFjY3VtW2Jhc2U2NEFjY3VtSWR4KytdID0gdUNoYXIgPj4gODtcbiAgICAgICAgICAgICAgICBiYXNlNjRBY2N1bVtiYXNlNjRBY2N1bUlkeCsrXSA9IHVDaGFyICYgMHhGRjtcblxuICAgICAgICAgICAgICAgIGlmIChiYXNlNjRBY2N1bUlkeCA9PSBiYXNlNjRBY2N1bS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmSWR4ICs9IGJ1Zi53cml0ZShiYXNlNjRBY2N1bS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvXFwvL2csICcsJyksIGJ1ZklkeCk7XG4gICAgICAgICAgICAgICAgICAgIGJhc2U2NEFjY3VtSWR4ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmluQmFzZTY0ID0gaW5CYXNlNjQ7XG4gICAgdGhpcy5iYXNlNjRBY2N1bUlkeCA9IGJhc2U2NEFjY3VtSWR4O1xuXG4gICAgcmV0dXJuIGJ1Zi5zbGljZSgwLCBidWZJZHgpO1xufVxuXG5VdGY3SU1BUEVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBidWYgPSBCdWZmZXIuYWxsb2MoMTApLCBidWZJZHggPSAwO1xuICAgIGlmICh0aGlzLmluQmFzZTY0KSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2U2NEFjY3VtSWR4ID4gMCkge1xuICAgICAgICAgICAgYnVmSWR4ICs9IGJ1Zi53cml0ZSh0aGlzLmJhc2U2NEFjY3VtLnNsaWNlKDAsIHRoaXMuYmFzZTY0QWNjdW1JZHgpLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXC8vZywgJywnKS5yZXBsYWNlKC89KyQvLCAnJyksIGJ1ZklkeCk7XG4gICAgICAgICAgICB0aGlzLmJhc2U2NEFjY3VtSWR4ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1ZltidWZJZHgrK10gPSBtaW51c0NoYXI7IC8vIFdyaXRlICctJywgdGhlbiBnbyB0byBkaXJlY3QgbW9kZS5cbiAgICAgICAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBidWYuc2xpY2UoMCwgYnVmSWR4KTtcbn1cblxuXG4vLyAtLSBEZWNvZGluZ1xuXG5mdW5jdGlvbiBVdGY3SU1BUERlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG4gICAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICAgIHRoaXMuYmFzZTY0QWNjdW0gPSAnJztcbn1cblxudmFyIGJhc2U2NElNQVBDaGFycyA9IGJhc2U2NENoYXJzLnNsaWNlKCk7XG5iYXNlNjRJTUFQQ2hhcnNbJywnLmNoYXJDb2RlQXQoMCldID0gdHJ1ZTtcblxuVXRmN0lNQVBEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIHZhciByZXMgPSBcIlwiLCBsYXN0SSA9IDAsXG4gICAgICAgIGluQmFzZTY0ID0gdGhpcy5pbkJhc2U2NCxcbiAgICAgICAgYmFzZTY0QWNjdW0gPSB0aGlzLmJhc2U2NEFjY3VtO1xuXG4gICAgLy8gVGhlIGRlY29kZXIgaXMgbW9yZSBpbnZvbHZlZCBhcyB3ZSBtdXN0IGhhbmRsZSBjaHVua3MgaW4gc3RyZWFtLlxuICAgIC8vIEl0IGlzIGZvcmdpdmluZywgY2xvc2VyIHRvIHN0YW5kYXJkIFVURi03IChmb3IgZXhhbXBsZSwgJy0nIGlzIG9wdGlvbmFsIGF0IHRoZSBlbmQpLlxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFpbkJhc2U2NCkgeyAvLyBXZSdyZSBpbiBkaXJlY3QgbW9kZS5cbiAgICAgICAgICAgIC8vIFdyaXRlIGRpcmVjdCBjaGFycyB1bnRpbCAnJidcbiAgICAgICAgICAgIGlmIChidWZbaV0gPT0gYW5kQ2hhcikge1xuICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEksIGkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG4gICAgICAgICAgICAgICAgbGFzdEkgPSBpKzE7XG4gICAgICAgICAgICAgICAgaW5CYXNlNjQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgeyAvLyBXZSBkZWNvZGUgYmFzZTY0LlxuICAgICAgICAgICAgaWYgKCFiYXNlNjRJTUFQQ2hhcnNbYnVmW2ldXSkgeyAvLyBCYXNlNjQgZW5kZWQuXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gbGFzdEkgJiYgYnVmW2ldID09IG1pbnVzQ2hhcikgeyAvLyBcIiYtXCIgLT4gXCImXCJcbiAgICAgICAgICAgICAgICAgICAgcmVzICs9IFwiJlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiNjRzdHIgPSBiYXNlNjRBY2N1bSArIGJ1Zi5zbGljZShsYXN0SSwgaSkudG9TdHJpbmcoKS5yZXBsYWNlKC8sL2csICcvJyk7XG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIuZnJvbShiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9IG1pbnVzQ2hhcikgLy8gTWludXMgbWF5IGJlIGFic29yYmVkIGFmdGVyIGJhc2U2NC5cbiAgICAgICAgICAgICAgICAgICAgaS0tO1xuXG4gICAgICAgICAgICAgICAgbGFzdEkgPSBpKzE7XG4gICAgICAgICAgICAgICAgaW5CYXNlNjQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBiYXNlNjRBY2N1bSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbkJhc2U2NCkge1xuICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoYnVmLnNsaWNlKGxhc3RJKSwgXCJhc2NpaVwiKTsgLy8gV3JpdGUgZGlyZWN0IGNoYXJzLlxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBiNjRzdHIgPSBiYXNlNjRBY2N1bSArIGJ1Zi5zbGljZShsYXN0SSkudG9TdHJpbmcoKS5yZXBsYWNlKC8sL2csICcvJyk7XG5cbiAgICAgICAgdmFyIGNhbkJlRGVjb2RlZCA9IGI2NHN0ci5sZW5ndGggLSAoYjY0c3RyLmxlbmd0aCAlIDgpOyAvLyBNaW5pbWFsIGNodW5rOiAyIHF1YWRzIC0+IDJ4MyBieXRlcyAtPiAzIGNoYXJzLlxuICAgICAgICBiYXNlNjRBY2N1bSA9IGI2NHN0ci5zbGljZShjYW5CZURlY29kZWQpOyAvLyBUaGUgcmVzdCB3aWxsIGJlIGRlY29kZWQgaW4gZnV0dXJlLlxuICAgICAgICBiNjRzdHIgPSBiNjRzdHIuc2xpY2UoMCwgY2FuQmVEZWNvZGVkKTtcblxuICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoQnVmZmVyLmZyb20oYjY0c3RyLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG4gICAgfVxuXG4gICAgdGhpcy5pbkJhc2U2NCA9IGluQmFzZTY0O1xuICAgIHRoaXMuYmFzZTY0QWNjdW0gPSBiYXNlNjRBY2N1bTtcblxuICAgIHJldHVybiByZXM7XG59XG5cblV0ZjdJTUFQRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMuaW5CYXNlNjQgJiYgdGhpcy5iYXNlNjRBY2N1bS5sZW5ndGggPiAwKVxuICAgICAgICByZXMgPSB0aGlzLmljb252LmRlY29kZShCdWZmZXIuZnJvbSh0aGlzLmJhc2U2NEFjY3VtLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG5cbiAgICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gICAgdGhpcy5iYXNlNjRBY2N1bSA9ICcnO1xuICAgIHJldHVybiByZXM7XG59XG5cblxuIiwgIlwidXNlIHN0cmljdFwiO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoXCJzYWZlci1idWZmZXJcIikuQnVmZmVyO1xuXG4vLyBTaW5nbGUtYnl0ZSBjb2RlYy4gTmVlZHMgYSAnY2hhcnMnIHN0cmluZyBwYXJhbWV0ZXIgdGhhdCBjb250YWlucyAyNTYgb3IgMTI4IGNoYXJzIHRoYXRcbi8vIGNvcnJlc3BvbmQgdG8gZW5jb2RlZCBieXRlcyAoaWYgMTI4IC0gdGhlbiBsb3dlciBoYWxmIGlzIEFTQ0lJKS4gXG5cbmV4cG9ydHMuX3NiY3MgPSBTQkNTQ29kZWM7XG5mdW5jdGlvbiBTQkNTQ29kZWMoY29kZWNPcHRpb25zLCBpY29udikge1xuICAgIGlmICghY29kZWNPcHRpb25zKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTQkNTIGNvZGVjIGlzIGNhbGxlZCB3aXRob3V0IHRoZSBkYXRhLlwiKVxuICAgIFxuICAgIC8vIFByZXBhcmUgY2hhciBidWZmZXIgZm9yIGRlY29kaW5nLlxuICAgIGlmICghY29kZWNPcHRpb25zLmNoYXJzIHx8IChjb2RlY09wdGlvbnMuY2hhcnMubGVuZ3RoICE9PSAxMjggJiYgY29kZWNPcHRpb25zLmNoYXJzLmxlbmd0aCAhPT0gMjU2KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5jb2RpbmcgJ1wiK2NvZGVjT3B0aW9ucy50eXBlK1wiJyBoYXMgaW5jb3JyZWN0ICdjaGFycycgKG11c3QgYmUgb2YgbGVuIDEyOCBvciAyNTYpXCIpO1xuICAgIFxuICAgIGlmIChjb2RlY09wdGlvbnMuY2hhcnMubGVuZ3RoID09PSAxMjgpIHtcbiAgICAgICAgdmFyIGFzY2lpU3RyaW5nID0gXCJcIjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMjg7IGkrKylcbiAgICAgICAgICAgIGFzY2lpU3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoaSk7XG4gICAgICAgIGNvZGVjT3B0aW9ucy5jaGFycyA9IGFzY2lpU3RyaW5nICsgY29kZWNPcHRpb25zLmNoYXJzO1xuICAgIH1cblxuICAgIHRoaXMuZGVjb2RlQnVmID0gQnVmZmVyLmZyb20oY29kZWNPcHRpb25zLmNoYXJzLCAndWNzMicpO1xuICAgIFxuICAgIC8vIEVuY29kaW5nIGJ1ZmZlci5cbiAgICB2YXIgZW5jb2RlQnVmID0gQnVmZmVyLmFsbG9jKDY1NTM2LCBpY29udi5kZWZhdWx0Q2hhclNpbmdsZUJ5dGUuY2hhckNvZGVBdCgwKSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVjT3B0aW9ucy5jaGFycy5sZW5ndGg7IGkrKylcbiAgICAgICAgZW5jb2RlQnVmW2NvZGVjT3B0aW9ucy5jaGFycy5jaGFyQ29kZUF0KGkpXSA9IGk7XG5cbiAgICB0aGlzLmVuY29kZUJ1ZiA9IGVuY29kZUJ1Zjtcbn1cblxuU0JDU0NvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gU0JDU0VuY29kZXI7XG5TQkNTQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBTQkNTRGVjb2RlcjtcblxuXG5mdW5jdGlvbiBTQkNTRW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMuZW5jb2RlQnVmID0gY29kZWMuZW5jb2RlQnVmO1xufVxuXG5TQkNTRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jKHN0ci5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKVxuICAgICAgICBidWZbaV0gPSB0aGlzLmVuY29kZUJ1ZltzdHIuY2hhckNvZGVBdChpKV07XG4gICAgXG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxuU0JDU0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbmZ1bmN0aW9uIFNCQ1NEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgdGhpcy5kZWNvZGVCdWYgPSBjb2RlYy5kZWNvZGVCdWY7XG59XG5cblNCQ1NEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIC8vIFN0cmluZ3MgYXJlIGltbXV0YWJsZSBpbiBKUyAtPiB3ZSB1c2UgdWNzMiBidWZmZXIgdG8gc3BlZWQgdXAgY29tcHV0YXRpb25zLlxuICAgIHZhciBkZWNvZGVCdWYgPSB0aGlzLmRlY29kZUJ1ZjtcbiAgICB2YXIgbmV3QnVmID0gQnVmZmVyLmFsbG9jKGJ1Zi5sZW5ndGgqMik7XG4gICAgdmFyIGlkeDEgPSAwLCBpZHgyID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZHgxID0gYnVmW2ldKjI7IGlkeDIgPSBpKjI7XG4gICAgICAgIG5ld0J1ZltpZHgyXSA9IGRlY29kZUJ1ZltpZHgxXTtcbiAgICAgICAgbmV3QnVmW2lkeDIrMV0gPSBkZWNvZGVCdWZbaWR4MSsxXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0J1Zi50b1N0cmluZygndWNzMicpO1xufVxuXG5TQkNTRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIE1hbnVhbGx5IGFkZGVkIGRhdGEgdG8gYmUgdXNlZCBieSBzYmNzIGNvZGVjIGluIGFkZGl0aW9uIHRvIGdlbmVyYXRlZCBvbmUuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIC8vIE5vdCBzdXBwb3J0ZWQgYnkgaWNvbnYsIG5vdCBzdXJlIHdoeS5cbiAgICBcIjEwMDI5XCI6IFwibWFjY2VudGV1cm9cIixcbiAgICBcIm1hY2NlbnRldXJvXCI6IHtcbiAgICAgICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICAgICAgXCJjaGFyc1wiOiBcIlx1MDBDNFx1MDEwMFx1MDEwMVx1MDBDOVx1MDEwNFx1MDBENlx1MDBEQ1x1MDBFMVx1MDEwNVx1MDEwQ1x1MDBFNFx1MDEwRFx1MDEwNlx1MDEwN1x1MDBFOVx1MDE3OVx1MDE3QVx1MDEwRVx1MDBFRFx1MDEwRlx1MDExMlx1MDExM1x1MDExNlx1MDBGM1x1MDExN1x1MDBGNFx1MDBGNlx1MDBGNVx1MDBGQVx1MDExQVx1MDExQlx1MDBGQ1x1MjAyMFx1MDBCMFx1MDExOFx1MDBBM1x1MDBBN1x1MjAyMlx1MDBCNlx1MDBERlx1MDBBRVx1MDBBOVx1MjEyMlx1MDExOVx1MDBBOFx1MjI2MFx1MDEyM1x1MDEyRVx1MDEyRlx1MDEyQVx1MjI2NFx1MjI2NVx1MDEyQlx1MDEzNlx1MjIwMlx1MjIxMVx1MDE0Mlx1MDEzQlx1MDEzQ1x1MDEzRFx1MDEzRVx1MDEzOVx1MDEzQVx1MDE0NVx1MDE0Nlx1MDE0M1x1MDBBQ1x1MjIxQVx1MDE0NFx1MDE0N1x1MjIwNlx1MDBBQlx1MDBCQlx1MjAyNlx1MDBBMFx1MDE0OFx1MDE1MFx1MDBENVx1MDE1MVx1MDE0Q1x1MjAxM1x1MjAxNFx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVx1MDBGN1x1MjVDQVx1MDE0RFx1MDE1NFx1MDE1NVx1MDE1OFx1MjAzOVx1MjAzQVx1MDE1OVx1MDE1Nlx1MDE1N1x1MDE2MFx1MjAxQVx1MjAxRVx1MDE2MVx1MDE1QVx1MDE1Qlx1MDBDMVx1MDE2NFx1MDE2NVx1MDBDRFx1MDE3RFx1MDE3RVx1MDE2QVx1MDBEM1x1MDBENFx1MDE2Qlx1MDE2RVx1MDBEQVx1MDE2Rlx1MDE3MFx1MDE3MVx1MDE3Mlx1MDE3M1x1MDBERFx1MDBGRFx1MDEzN1x1MDE3Qlx1MDE0MVx1MDE3Q1x1MDEyMlx1MDJDN1wiXG4gICAgfSxcblxuICAgIFwiODA4XCI6IFwiY3A4MDhcIixcbiAgICBcImlibTgwOFwiOiBcImNwODA4XCIsXG4gICAgXCJjcDgwOFwiOiB7XG4gICAgICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgICAgIFwiY2hhcnNcIjogXCJcdTA0MTBcdTA0MTFcdTA0MTJcdTA0MTNcdTA0MTRcdTA0MTVcdTA0MTZcdTA0MTdcdTA0MThcdTA0MTlcdTA0MUFcdTA0MUJcdTA0MUNcdTA0MURcdTA0MUVcdTA0MUZcdTA0MjBcdTA0MjFcdTA0MjJcdTA0MjNcdTA0MjRcdTA0MjVcdTA0MjZcdTA0MjdcdTA0MjhcdTA0MjlcdTA0MkFcdTA0MkJcdTA0MkNcdTA0MkRcdTA0MkVcdTA0MkZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0MzZcdTA0MzdcdTA0MzhcdTA0MzlcdTA0M0FcdTA0M0JcdTA0M0NcdTA0M0RcdTA0M0VcdTA0M0ZcdTI1OTFcdTI1OTJcdTI1OTNcdTI1MDJcdTI1MjRcdTI1NjFcdTI1NjJcdTI1NTZcdTI1NTVcdTI1NjNcdTI1NTFcdTI1NTdcdTI1NURcdTI1NUNcdTI1NUJcdTI1MTBcdTI1MTRcdTI1MzRcdTI1MkNcdTI1MUNcdTI1MDBcdTI1M0NcdTI1NUVcdTI1NUZcdTI1NUFcdTI1NTRcdTI1NjlcdTI1NjZcdTI1NjBcdTI1NTBcdTI1NkNcdTI1NjdcdTI1NjhcdTI1NjRcdTI1NjVcdTI1NTlcdTI1NThcdTI1NTJcdTI1NTNcdTI1NkJcdTI1NkFcdTI1MThcdTI1MENcdTI1ODhcdTI1ODRcdTI1OENcdTI1OTBcdTI1ODBcdTA0NDBcdTA0NDFcdTA0NDJcdTA0NDNcdTA0NDRcdTA0NDVcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NERcdTA0NEVcdTA0NEZcdTA0MDFcdTA0NTFcdTA0MDRcdTA0NTRcdTA0MDdcdTA0NTdcdTA0MEVcdTA0NUVcdTAwQjBcdTIyMTlcdTAwQjdcdTIyMUFcdTIxMTZcdTIwQUNcdTI1QTBcdTAwQTBcIlxuICAgIH0sXG5cbiAgICBcIm1pa1wiOiB7XG4gICAgICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgICAgIFwiY2hhcnNcIjogXCJcdTA0MTBcdTA0MTFcdTA0MTJcdTA0MTNcdTA0MTRcdTA0MTVcdTA0MTZcdTA0MTdcdTA0MThcdTA0MTlcdTA0MUFcdTA0MUJcdTA0MUNcdTA0MURcdTA0MUVcdTA0MUZcdTA0MjBcdTA0MjFcdTA0MjJcdTA0MjNcdTA0MjRcdTA0MjVcdTA0MjZcdTA0MjdcdTA0MjhcdTA0MjlcdTA0MkFcdTA0MkJcdTA0MkNcdTA0MkRcdTA0MkVcdTA0MkZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0MzZcdTA0MzdcdTA0MzhcdTA0MzlcdTA0M0FcdTA0M0JcdTA0M0NcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0NDFcdTA0NDJcdTA0NDNcdTA0NDRcdTA0NDVcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NERcdTA0NEVcdTA0NEZcdTI1MTRcdTI1MzRcdTI1MkNcdTI1MUNcdTI1MDBcdTI1M0NcdTI1NjNcdTI1NTFcdTI1NUFcdTI1NTRcdTI1NjlcdTI1NjZcdTI1NjBcdTI1NTBcdTI1NkNcdTI1MTBcdTI1OTFcdTI1OTJcdTI1OTNcdTI1MDJcdTI1MjRcdTIxMTZcdTAwQTdcdTI1NTdcdTI1NURcdTI1MThcdTI1MENcdTI1ODhcdTI1ODRcdTI1OENcdTI1OTBcdTI1ODBcdTAzQjFcdTAwREZcdTAzOTNcdTAzQzBcdTAzQTNcdTAzQzNcdTAwQjVcdTAzQzRcdTAzQTZcdTAzOThcdTAzQTlcdTAzQjRcdTIyMUVcdTAzQzZcdTAzQjVcdTIyMjlcdTIyNjFcdTAwQjFcdTIyNjVcdTIyNjRcdTIzMjBcdTIzMjFcdTAwRjdcdTIyNDhcdTAwQjBcdTIyMTlcdTAwQjdcdTIyMUFcdTIwN0ZcdTAwQjJcdTI1QTBcdTAwQTBcIlxuICAgIH0sXG5cbiAgICAvLyBBbGlhc2VzIG9mIGdlbmVyYXRlZCBlbmNvZGluZ3MuXG4gICAgXCJhc2NpaThiaXRcIjogXCJhc2NpaVwiLFxuICAgIFwidXNhc2NpaVwiOiBcImFzY2lpXCIsXG4gICAgXCJhbnNpeDM0XCI6IFwiYXNjaWlcIixcbiAgICBcImFuc2l4MzQxOTY4XCI6IFwiYXNjaWlcIixcbiAgICBcImFuc2l4MzQxOTg2XCI6IFwiYXNjaWlcIixcbiAgICBcImNzYXNjaWlcIjogXCJhc2NpaVwiLFxuICAgIFwiY3AzNjdcIjogXCJhc2NpaVwiLFxuICAgIFwiaWJtMzY3XCI6IFwiYXNjaWlcIixcbiAgICBcImlzb2lyNlwiOiBcImFzY2lpXCIsXG4gICAgXCJpc282NDZ1c1wiOiBcImFzY2lpXCIsXG4gICAgXCJpc282NDZpcnZcIjogXCJhc2NpaVwiLFxuICAgIFwidXNcIjogXCJhc2NpaVwiLFxuXG4gICAgXCJsYXRpbjFcIjogXCJpc284ODU5MVwiLFxuICAgIFwibGF0aW4yXCI6IFwiaXNvODg1OTJcIixcbiAgICBcImxhdGluM1wiOiBcImlzbzg4NTkzXCIsXG4gICAgXCJsYXRpbjRcIjogXCJpc284ODU5NFwiLFxuICAgIFwibGF0aW41XCI6IFwiaXNvODg1OTlcIixcbiAgICBcImxhdGluNlwiOiBcImlzbzg4NTkxMFwiLFxuICAgIFwibGF0aW43XCI6IFwiaXNvODg1OTEzXCIsXG4gICAgXCJsYXRpbjhcIjogXCJpc284ODU5MTRcIixcbiAgICBcImxhdGluOVwiOiBcImlzbzg4NTkxNVwiLFxuICAgIFwibGF0aW4xMFwiOiBcImlzbzg4NTkxNlwiLFxuXG4gICAgXCJjc2lzb2xhdGluMVwiOiBcImlzbzg4NTkxXCIsXG4gICAgXCJjc2lzb2xhdGluMlwiOiBcImlzbzg4NTkyXCIsXG4gICAgXCJjc2lzb2xhdGluM1wiOiBcImlzbzg4NTkzXCIsXG4gICAgXCJjc2lzb2xhdGluNFwiOiBcImlzbzg4NTk0XCIsXG4gICAgXCJjc2lzb2xhdGluY3lyaWxsaWNcIjogXCJpc284ODU5NVwiLFxuICAgIFwiY3Npc29sYXRpbmFyYWJpY1wiOiBcImlzbzg4NTk2XCIsXG4gICAgXCJjc2lzb2xhdGluZ3JlZWtcIiA6IFwiaXNvODg1OTdcIixcbiAgICBcImNzaXNvbGF0aW5oZWJyZXdcIjogXCJpc284ODU5OFwiLFxuICAgIFwiY3Npc29sYXRpbjVcIjogXCJpc284ODU5OVwiLFxuICAgIFwiY3Npc29sYXRpbjZcIjogXCJpc284ODU5MTBcIixcblxuICAgIFwibDFcIjogXCJpc284ODU5MVwiLFxuICAgIFwibDJcIjogXCJpc284ODU5MlwiLFxuICAgIFwibDNcIjogXCJpc284ODU5M1wiLFxuICAgIFwibDRcIjogXCJpc284ODU5NFwiLFxuICAgIFwibDVcIjogXCJpc284ODU5OVwiLFxuICAgIFwibDZcIjogXCJpc284ODU5MTBcIixcbiAgICBcImw3XCI6IFwiaXNvODg1OTEzXCIsXG4gICAgXCJsOFwiOiBcImlzbzg4NTkxNFwiLFxuICAgIFwibDlcIjogXCJpc284ODU5MTVcIixcbiAgICBcImwxMFwiOiBcImlzbzg4NTkxNlwiLFxuXG4gICAgXCJpc29pcjE0XCI6IFwiaXNvNjQ2anBcIixcbiAgICBcImlzb2lyNTdcIjogXCJpc282NDZjblwiLFxuICAgIFwiaXNvaXIxMDBcIjogXCJpc284ODU5MVwiLFxuICAgIFwiaXNvaXIxMDFcIjogXCJpc284ODU5MlwiLFxuICAgIFwiaXNvaXIxMDlcIjogXCJpc284ODU5M1wiLFxuICAgIFwiaXNvaXIxMTBcIjogXCJpc284ODU5NFwiLFxuICAgIFwiaXNvaXIxNDRcIjogXCJpc284ODU5NVwiLFxuICAgIFwiaXNvaXIxMjdcIjogXCJpc284ODU5NlwiLFxuICAgIFwiaXNvaXIxMjZcIjogXCJpc284ODU5N1wiLFxuICAgIFwiaXNvaXIxMzhcIjogXCJpc284ODU5OFwiLFxuICAgIFwiaXNvaXIxNDhcIjogXCJpc284ODU5OVwiLFxuICAgIFwiaXNvaXIxNTdcIjogXCJpc284ODU5MTBcIixcbiAgICBcImlzb2lyMTY2XCI6IFwidGlzNjIwXCIsXG4gICAgXCJpc29pcjE3OVwiOiBcImlzbzg4NTkxM1wiLFxuICAgIFwiaXNvaXIxOTlcIjogXCJpc284ODU5MTRcIixcbiAgICBcImlzb2lyMjAzXCI6IFwiaXNvODg1OTE1XCIsXG4gICAgXCJpc29pcjIyNlwiOiBcImlzbzg4NTkxNlwiLFxuXG4gICAgXCJjcDgxOVwiOiBcImlzbzg4NTkxXCIsXG4gICAgXCJpYm04MTlcIjogXCJpc284ODU5MVwiLFxuXG4gICAgXCJjeXJpbGxpY1wiOiBcImlzbzg4NTk1XCIsXG5cbiAgICBcImFyYWJpY1wiOiBcImlzbzg4NTk2XCIsXG4gICAgXCJhcmFiaWM4XCI6IFwiaXNvODg1OTZcIixcbiAgICBcImVjbWExMTRcIjogXCJpc284ODU5NlwiLFxuICAgIFwiYXNtbzcwOFwiOiBcImlzbzg4NTk2XCIsXG5cbiAgICBcImdyZWVrXCIgOiBcImlzbzg4NTk3XCIsXG4gICAgXCJncmVlazhcIiA6IFwiaXNvODg1OTdcIixcbiAgICBcImVjbWExMThcIiA6IFwiaXNvODg1OTdcIixcbiAgICBcImVsb3Q5MjhcIiA6IFwiaXNvODg1OTdcIixcblxuICAgIFwiaGVicmV3XCI6IFwiaXNvODg1OThcIixcbiAgICBcImhlYnJldzhcIjogXCJpc284ODU5OFwiLFxuXG4gICAgXCJ0dXJraXNoXCI6IFwiaXNvODg1OTlcIixcbiAgICBcInR1cmtpc2g4XCI6IFwiaXNvODg1OTlcIixcblxuICAgIFwidGhhaVwiOiBcImlzbzg4NTkxMVwiLFxuICAgIFwidGhhaThcIjogXCJpc284ODU5MTFcIixcblxuICAgIFwiY2VsdGljXCI6IFwiaXNvODg1OTE0XCIsXG4gICAgXCJjZWx0aWM4XCI6IFwiaXNvODg1OTE0XCIsXG4gICAgXCJpc29jZWx0aWNcIjogXCJpc284ODU5MTRcIixcblxuICAgIFwidGlzNjIwMFwiOiBcInRpczYyMFwiLFxuICAgIFwidGlzNjIwMjUyOTFcIjogXCJ0aXM2MjBcIixcbiAgICBcInRpczYyMDI1MzMwXCI6IFwidGlzNjIwXCIsXG5cbiAgICBcIjEwMDAwXCI6IFwibWFjcm9tYW5cIixcbiAgICBcIjEwMDA2XCI6IFwibWFjZ3JlZWtcIixcbiAgICBcIjEwMDA3XCI6IFwibWFjY3lyaWxsaWNcIixcbiAgICBcIjEwMDc5XCI6IFwibWFjaWNlbGFuZFwiLFxuICAgIFwiMTAwODFcIjogXCJtYWN0dXJraXNoXCIsXG5cbiAgICBcImNzcGM4Y29kZXBhZ2U0MzdcIjogXCJjcDQzN1wiLFxuICAgIFwiY3NwYzc3NWJhbHRpY1wiOiBcImNwNzc1XCIsXG4gICAgXCJjc3BjODUwbXVsdGlsaW5ndWFsXCI6IFwiY3A4NTBcIixcbiAgICBcImNzcGNwODUyXCI6IFwiY3A4NTJcIixcbiAgICBcImNzcGM4NjJsYXRpbmhlYnJld1wiOiBcImNwODYyXCIsXG4gICAgXCJjcGdyXCI6IFwiY3A4NjlcIixcblxuICAgIFwibXNlZVwiOiBcImNwMTI1MFwiLFxuICAgIFwibXNjeXJsXCI6IFwiY3AxMjUxXCIsXG4gICAgXCJtc2Fuc2lcIjogXCJjcDEyNTJcIixcbiAgICBcIm1zZ3JlZWtcIjogXCJjcDEyNTNcIixcbiAgICBcIm1zdHVya1wiOiBcImNwMTI1NFwiLFxuICAgIFwibXNoZWJyXCI6IFwiY3AxMjU1XCIsXG4gICAgXCJtc2FyYWJcIjogXCJjcDEyNTZcIixcbiAgICBcIndpbmJhbHRyaW1cIjogXCJjcDEyNTdcIixcblxuICAgIFwiY3AyMDg2NlwiOiBcImtvaThyXCIsXG4gICAgXCIyMDg2NlwiOiBcImtvaThyXCIsXG4gICAgXCJpYm04NzhcIjogXCJrb2k4clwiLFxuICAgIFwiY3Nrb2k4clwiOiBcImtvaThyXCIsXG5cbiAgICBcImNwMjE4NjZcIjogXCJrb2k4dVwiLFxuICAgIFwiMjE4NjZcIjogXCJrb2k4dVwiLFxuICAgIFwiaWJtMTE2OFwiOiBcImtvaTh1XCIsXG5cbiAgICBcInN0cmsxMDQ4MjAwMlwiOiBcInJrMTA0OFwiLFxuXG4gICAgXCJ0Y3ZuNTcxMlwiOiBcInRjdm5cIixcbiAgICBcInRjdm41NzEyMVwiOiBcInRjdm5cIixcblxuICAgIFwiZ2IxOTg4ODBcIjogXCJpc282NDZjblwiLFxuICAgIFwiY25cIjogXCJpc282NDZjblwiLFxuXG4gICAgXCJjc2lzbzE0amlzYzYyMjByb1wiOiBcImlzbzY0NmpwXCIsXG4gICAgXCJqaXNjNjIyMDE5Njlyb1wiOiBcImlzbzY0NmpwXCIsXG4gICAgXCJqcFwiOiBcImlzbzY0NmpwXCIsXG5cbiAgICBcImNzaHByb21hbjhcIjogXCJocHJvbWFuOFwiLFxuICAgIFwicjhcIjogXCJocHJvbWFuOFwiLFxuICAgIFwicm9tYW44XCI6IFwiaHByb21hbjhcIixcbiAgICBcInhyb21hbjhcIjogXCJocHJvbWFuOFwiLFxuICAgIFwiaWJtMTA1MVwiOiBcImhwcm9tYW44XCIsXG5cbiAgICBcIm1hY1wiOiBcIm1hY2ludG9zaFwiLFxuICAgIFwiY3NtYWNpbnRvc2hcIjogXCJtYWNpbnRvc2hcIixcbn07XG5cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLy8gR2VuZXJhdGVkIGRhdGEgZm9yIHNiY3MgY29kZWMuIERvbid0IGVkaXQgbWFudWFsbHkuIFJlZ2VuZXJhdGUgdXNpbmcgZ2VuZXJhdGlvbi9nZW4tc2Jjcy5qcyBzY3JpcHQuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgXCI0MzdcIjogXCJjcDQzN1wiLFxuICBcIjczN1wiOiBcImNwNzM3XCIsXG4gIFwiNzc1XCI6IFwiY3A3NzVcIixcbiAgXCI4NTBcIjogXCJjcDg1MFwiLFxuICBcIjg1MlwiOiBcImNwODUyXCIsXG4gIFwiODU1XCI6IFwiY3A4NTVcIixcbiAgXCI4NTZcIjogXCJjcDg1NlwiLFxuICBcIjg1N1wiOiBcImNwODU3XCIsXG4gIFwiODU4XCI6IFwiY3A4NThcIixcbiAgXCI4NjBcIjogXCJjcDg2MFwiLFxuICBcIjg2MVwiOiBcImNwODYxXCIsXG4gIFwiODYyXCI6IFwiY3A4NjJcIixcbiAgXCI4NjNcIjogXCJjcDg2M1wiLFxuICBcIjg2NFwiOiBcImNwODY0XCIsXG4gIFwiODY1XCI6IFwiY3A4NjVcIixcbiAgXCI4NjZcIjogXCJjcDg2NlwiLFxuICBcIjg2OVwiOiBcImNwODY5XCIsXG4gIFwiODc0XCI6IFwid2luZG93czg3NFwiLFxuICBcIjkyMlwiOiBcImNwOTIyXCIsXG4gIFwiMTA0NlwiOiBcImNwMTA0NlwiLFxuICBcIjExMjRcIjogXCJjcDExMjRcIixcbiAgXCIxMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiMTEyOVwiOiBcImNwMTEyOVwiLFxuICBcIjExMzNcIjogXCJjcDExMzNcIixcbiAgXCIxMTYxXCI6IFwiY3AxMTYxXCIsXG4gIFwiMTE2MlwiOiBcImNwMTE2MlwiLFxuICBcIjExNjNcIjogXCJjcDExNjNcIixcbiAgXCIxMjUwXCI6IFwid2luZG93czEyNTBcIixcbiAgXCIxMjUxXCI6IFwid2luZG93czEyNTFcIixcbiAgXCIxMjUyXCI6IFwid2luZG93czEyNTJcIixcbiAgXCIxMjUzXCI6IFwid2luZG93czEyNTNcIixcbiAgXCIxMjU0XCI6IFwid2luZG93czEyNTRcIixcbiAgXCIxMjU1XCI6IFwid2luZG93czEyNTVcIixcbiAgXCIxMjU2XCI6IFwid2luZG93czEyNTZcIixcbiAgXCIxMjU3XCI6IFwid2luZG93czEyNTdcIixcbiAgXCIxMjU4XCI6IFwid2luZG93czEyNThcIixcbiAgXCIyODU5MVwiOiBcImlzbzg4NTkxXCIsXG4gIFwiMjg1OTJcIjogXCJpc284ODU5MlwiLFxuICBcIjI4NTkzXCI6IFwiaXNvODg1OTNcIixcbiAgXCIyODU5NFwiOiBcImlzbzg4NTk0XCIsXG4gIFwiMjg1OTVcIjogXCJpc284ODU5NVwiLFxuICBcIjI4NTk2XCI6IFwiaXNvODg1OTZcIixcbiAgXCIyODU5N1wiOiBcImlzbzg4NTk3XCIsXG4gIFwiMjg1OThcIjogXCJpc284ODU5OFwiLFxuICBcIjI4NTk5XCI6IFwiaXNvODg1OTlcIixcbiAgXCIyODYwMFwiOiBcImlzbzg4NTkxMFwiLFxuICBcIjI4NjAxXCI6IFwiaXNvODg1OTExXCIsXG4gIFwiMjg2MDNcIjogXCJpc284ODU5MTNcIixcbiAgXCIyODYwNFwiOiBcImlzbzg4NTkxNFwiLFxuICBcIjI4NjA1XCI6IFwiaXNvODg1OTE1XCIsXG4gIFwiMjg2MDZcIjogXCJpc284ODU5MTZcIixcbiAgXCJ3aW5kb3dzODc0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTIwQUNcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTIwMjZcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTAwQTBcdTBFMDFcdTBFMDJcdTBFMDNcdTBFMDRcdTBFMDVcdTBFMDZcdTBFMDdcdTBFMDhcdTBFMDlcdTBFMEFcdTBFMEJcdTBFMENcdTBFMERcdTBFMEVcdTBFMEZcdTBFMTBcdTBFMTFcdTBFMTJcdTBFMTNcdTBFMTRcdTBFMTVcdTBFMTZcdTBFMTdcdTBFMThcdTBFMTlcdTBFMUFcdTBFMUJcdTBFMUNcdTBFMURcdTBFMUVcdTBFMUZcdTBFMjBcdTBFMjFcdTBFMjJcdTBFMjNcdTBFMjRcdTBFMjVcdTBFMjZcdTBFMjdcdTBFMjhcdTBFMjlcdTBFMkFcdTBFMkJcdTBFMkNcdTBFMkRcdTBFMkVcdTBFMkZcdTBFMzBcdTBFMzFcdTBFMzJcdTBFMzNcdTBFMzRcdTBFMzVcdTBFMzZcdTBFMzdcdTBFMzhcdTBFMzlcdTBFM0FcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTBFM0ZcdTBFNDBcdTBFNDFcdTBFNDJcdTBFNDNcdTBFNDRcdTBFNDVcdTBFNDZcdTBFNDdcdTBFNDhcdTBFNDlcdTBFNEFcdTBFNEJcdTBFNENcdTBFNERcdTBFNEVcdTBFNEZcdTBFNTBcdTBFNTFcdTBFNTJcdTBFNTNcdTBFNTRcdTBFNTVcdTBFNTZcdTBFNTdcdTBFNThcdTBFNTlcdTBFNUFcdTBFNUJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcIlxuICB9LFxuICBcIndpbjg3NFwiOiBcIndpbmRvd3M4NzRcIixcbiAgXCJjcDg3NFwiOiBcIndpbmRvd3M4NzRcIixcbiAgXCJ3aW5kb3dzMTI1MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUyMEFDXHVGRkZEXHUyMDFBXHVGRkZEXHUyMDFFXHUyMDI2XHUyMDIwXHUyMDIxXHVGRkZEXHUyMDMwXHUwMTYwXHUyMDM5XHUwMTVBXHUwMTY0XHUwMTdEXHUwMTc5XHVGRkZEXHUyMDE4XHUyMDE5XHUyMDFDXHUyMDFEXHUyMDIyXHUyMDEzXHUyMDE0XHVGRkZEXHUyMTIyXHUwMTYxXHUyMDNBXHUwMTVCXHUwMTY1XHUwMTdFXHUwMTdBXHUwMEEwXHUwMkM3XHUwMkQ4XHUwMTQxXHUwMEE0XHUwMTA0XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMTVFXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMTdCXHUwMEIwXHUwMEIxXHUwMkRCXHUwMTQyXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMTA1XHUwMTVGXHUwMEJCXHUwMTNEXHUwMkREXHUwMTNFXHUwMTdDXHUwMTU0XHUwMEMxXHUwMEMyXHUwMTAyXHUwMEM0XHUwMTM5XHUwMTA2XHUwMEM3XHUwMTBDXHUwMEM5XHUwMTE4XHUwMENCXHUwMTFBXHUwMENEXHUwMENFXHUwMTBFXHUwMTEwXHUwMTQzXHUwMTQ3XHUwMEQzXHUwMEQ0XHUwMTUwXHUwMEQ2XHUwMEQ3XHUwMTU4XHUwMTZFXHUwMERBXHUwMTcwXHUwMERDXHUwMEREXHUwMTYyXHUwMERGXHUwMTU1XHUwMEUxXHUwMEUyXHUwMTAzXHUwMEU0XHUwMTNBXHUwMTA3XHUwMEU3XHUwMTBEXHUwMEU5XHUwMTE5XHUwMEVCXHUwMTFCXHUwMEVEXHUwMEVFXHUwMTBGXHUwMTExXHUwMTQ0XHUwMTQ4XHUwMEYzXHUwMEY0XHUwMTUxXHUwMEY2XHUwMEY3XHUwMTU5XHUwMTZGXHUwMEZBXHUwMTcxXHUwMEZDXHUwMEZEXHUwMTYzXHUwMkQ5XCJcbiAgfSxcbiAgXCJ3aW4xMjUwXCI6IFwid2luZG93czEyNTBcIixcbiAgXCJjcDEyNTBcIjogXCJ3aW5kb3dzMTI1MFwiLFxuICBcIndpbmRvd3MxMjUxXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTA0MDJcdTA0MDNcdTIwMUFcdTA0NTNcdTIwMUVcdTIwMjZcdTIwMjBcdTIwMjFcdTIwQUNcdTIwMzBcdTA0MDlcdTIwMzlcdTA0MEFcdTA0MENcdTA0MEJcdTA0MEZcdTA0NTJcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdUZGRkRcdTIxMjJcdTA0NTlcdTIwM0FcdTA0NUFcdTA0NUNcdTA0NUJcdTA0NUZcdTAwQTBcdTA0MEVcdTA0NUVcdTA0MDhcdTAwQTRcdTA0OTBcdTAwQTZcdTAwQTdcdTA0MDFcdTAwQTlcdTA0MDRcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTA0MDdcdTAwQjBcdTAwQjFcdTA0MDZcdTA0NTZcdTA0OTFcdTAwQjVcdTAwQjZcdTAwQjdcdTA0NTFcdTIxMTZcdTA0NTRcdTAwQkJcdTA0NThcdTA0MDVcdTA0NTVcdTA0NTdcdTA0MTBcdTA0MTFcdTA0MTJcdTA0MTNcdTA0MTRcdTA0MTVcdTA0MTZcdTA0MTdcdTA0MThcdTA0MTlcdTA0MUFcdTA0MUJcdTA0MUNcdTA0MURcdTA0MUVcdTA0MUZcdTA0MjBcdTA0MjFcdTA0MjJcdTA0MjNcdTA0MjRcdTA0MjVcdTA0MjZcdTA0MjdcdTA0MjhcdTA0MjlcdTA0MkFcdTA0MkJcdTA0MkNcdTA0MkRcdTA0MkVcdTA0MkZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0MzZcdTA0MzdcdTA0MzhcdTA0MzlcdTA0M0FcdTA0M0JcdTA0M0NcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0NDFcdTA0NDJcdTA0NDNcdTA0NDRcdTA0NDVcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NERcdTA0NEVcdTA0NEZcIlxuICB9LFxuICBcIndpbjEyNTFcIjogXCJ3aW5kb3dzMTI1MVwiLFxuICBcImNwMTI1MVwiOiBcIndpbmRvd3MxMjUxXCIsXG4gIFwid2luZG93czEyNTJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MjBBQ1x1RkZGRFx1MjAxQVx1MDE5Mlx1MjAxRVx1MjAyNlx1MjAyMFx1MjAyMVx1MDJDNlx1MjAzMFx1MDE2MFx1MjAzOVx1MDE1Mlx1RkZGRFx1MDE3RFx1RkZGRFx1RkZGRFx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyMlx1MjAxM1x1MjAxNFx1MDJEQ1x1MjEyMlx1MDE2MVx1MjAzQVx1MDE1M1x1RkZGRFx1MDE3RVx1MDE3OFx1MDBBMFx1MDBBMVx1MDBBMlx1MDBBM1x1MDBBNFx1MDBBNVx1MDBBNlx1MDBBN1x1MDBBOFx1MDBBOVx1MDBBQVx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MDBBRlx1MDBCMFx1MDBCMVx1MDBCMlx1MDBCM1x1MDBCNFx1MDBCNVx1MDBCNlx1MDBCN1x1MDBCOFx1MDBCOVx1MDBCQVx1MDBCQlx1MDBCQ1x1MDBCRFx1MDBCRVx1MDBCRlx1MDBDMFx1MDBDMVx1MDBDMlx1MDBDM1x1MDBDNFx1MDBDNVx1MDBDNlx1MDBDN1x1MDBDOFx1MDBDOVx1MDBDQVx1MDBDQlx1MDBDQ1x1MDBDRFx1MDBDRVx1MDBDRlx1MDBEMFx1MDBEMVx1MDBEMlx1MDBEM1x1MDBENFx1MDBENVx1MDBENlx1MDBEN1x1MDBEOFx1MDBEOVx1MDBEQVx1MDBEQlx1MDBEQ1x1MDBERFx1MDBERVx1MDBERlx1MDBFMFx1MDBFMVx1MDBFMlx1MDBFM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDBFN1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQlx1MDBFQ1x1MDBFRFx1MDBFRVx1MDBFRlx1MDBGMFx1MDBGMVx1MDBGMlx1MDBGM1x1MDBGNFx1MDBGNVx1MDBGNlx1MDBGN1x1MDBGOFx1MDBGOVx1MDBGQVx1MDBGQlx1MDBGQ1x1MDBGRFx1MDBGRVx1MDBGRlwiXG4gIH0sXG4gIFwid2luMTI1MlwiOiBcIndpbmRvd3MxMjUyXCIsXG4gIFwiY3AxMjUyXCI6IFwid2luZG93czEyNTJcIixcbiAgXCJ3aW5kb3dzMTI1M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUyMEFDXHVGRkZEXHUyMDFBXHUwMTkyXHUyMDFFXHUyMDI2XHUyMDIwXHUyMDIxXHVGRkZEXHUyMDMwXHVGRkZEXHUyMDM5XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUyMDE4XHUyMDE5XHUyMDFDXHUyMDFEXHUyMDIyXHUyMDEzXHUyMDE0XHVGRkZEXHUyMTIyXHVGRkZEXHUyMDNBXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwMEEwXHUwMzg1XHUwMzg2XHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHVGRkZEXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUyMDE1XHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMzg0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMzg4XHUwMzg5XHUwMzhBXHUwMEJCXHUwMzhDXHUwMEJEXHUwMzhFXHUwMzhGXHUwMzkwXHUwMzkxXHUwMzkyXHUwMzkzXHUwMzk0XHUwMzk1XHUwMzk2XHUwMzk3XHUwMzk4XHUwMzk5XHUwMzlBXHUwMzlCXHUwMzlDXHUwMzlEXHUwMzlFXHUwMzlGXHUwM0EwXHUwM0ExXHVGRkZEXHUwM0EzXHUwM0E0XHUwM0E1XHUwM0E2XHUwM0E3XHUwM0E4XHUwM0E5XHUwM0FBXHUwM0FCXHUwM0FDXHUwM0FEXHUwM0FFXHUwM0FGXHUwM0IwXHUwM0IxXHUwM0IyXHUwM0IzXHUwM0I0XHUwM0I1XHUwM0I2XHUwM0I3XHUwM0I4XHUwM0I5XHUwM0JBXHUwM0JCXHUwM0JDXHUwM0JEXHUwM0JFXHUwM0JGXHUwM0MwXHUwM0MxXHUwM0MyXHUwM0MzXHUwM0M0XHUwM0M1XHUwM0M2XHUwM0M3XHUwM0M4XHUwM0M5XHUwM0NBXHUwM0NCXHUwM0NDXHUwM0NEXHUwM0NFXHVGRkZEXCJcbiAgfSxcbiAgXCJ3aW4xMjUzXCI6IFwid2luZG93czEyNTNcIixcbiAgXCJjcDEyNTNcIjogXCJ3aW5kb3dzMTI1M1wiLFxuICBcIndpbmRvd3MxMjU0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTIwQUNcdUZGRkRcdTIwMUFcdTAxOTJcdTIwMUVcdTIwMjZcdTIwMjBcdTIwMjFcdTAyQzZcdTIwMzBcdTAxNjBcdTIwMzlcdTAxNTJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdTAyRENcdTIxMjJcdTAxNjFcdTIwM0FcdTAxNTNcdUZGRkRcdUZGRkRcdTAxNzhcdTAwQTBcdTAwQTFcdTAwQTJcdTAwQTNcdTAwQTRcdTAwQTVcdTAwQTZcdTAwQTdcdTAwQThcdTAwQTlcdTAwQUFcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTAwQUZcdTAwQjBcdTAwQjFcdTAwQjJcdTAwQjNcdTAwQjRcdTAwQjVcdTAwQjZcdTAwQjdcdTAwQjhcdTAwQjlcdTAwQkFcdTAwQkJcdTAwQkNcdTAwQkRcdTAwQkVcdTAwQkZcdTAwQzBcdTAwQzFcdTAwQzJcdTAwQzNcdTAwQzRcdTAwQzVcdTAwQzZcdTAwQzdcdTAwQzhcdTAwQzlcdTAwQ0FcdTAwQ0JcdTAwQ0NcdTAwQ0RcdTAwQ0VcdTAwQ0ZcdTAxMUVcdTAwRDFcdTAwRDJcdTAwRDNcdTAwRDRcdTAwRDVcdTAwRDZcdTAwRDdcdTAwRDhcdTAwRDlcdTAwREFcdTAwREJcdTAwRENcdTAxMzBcdTAxNUVcdTAwREZcdTAwRTBcdTAwRTFcdTAwRTJcdTAwRTNcdTAwRTRcdTAwRTVcdTAwRTZcdTAwRTdcdTAwRThcdTAwRTlcdTAwRUFcdTAwRUJcdTAwRUNcdTAwRURcdTAwRUVcdTAwRUZcdTAxMUZcdTAwRjFcdTAwRjJcdTAwRjNcdTAwRjRcdTAwRjVcdTAwRjZcdTAwRjdcdTAwRjhcdTAwRjlcdTAwRkFcdTAwRkJcdTAwRkNcdTAxMzFcdTAxNUZcdTAwRkZcIlxuICB9LFxuICBcIndpbjEyNTRcIjogXCJ3aW5kb3dzMTI1NFwiLFxuICBcImNwMTI1NFwiOiBcIndpbmRvd3MxMjU0XCIsXG4gIFwid2luZG93czEyNTVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MjBBQ1x1RkZGRFx1MjAxQVx1MDE5Mlx1MjAxRVx1MjAyNlx1MjAyMFx1MjAyMVx1MDJDNlx1MjAzMFx1RkZGRFx1MjAzOVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyMlx1MjAxM1x1MjAxNFx1MDJEQ1x1MjEyMlx1RkZGRFx1MjAzQVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MDBBMFx1MDBBMVx1MDBBMlx1MDBBM1x1MjBBQVx1MDBBNVx1MDBBNlx1MDBBN1x1MDBBOFx1MDBBOVx1MDBEN1x1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MDBBRlx1MDBCMFx1MDBCMVx1MDBCMlx1MDBCM1x1MDBCNFx1MDBCNVx1MDBCNlx1MDBCN1x1MDBCOFx1MDBCOVx1MDBGN1x1MDBCQlx1MDBCQ1x1MDBCRFx1MDBCRVx1MDBCRlx1MDVCMFx1MDVCMVx1MDVCMlx1MDVCM1x1MDVCNFx1MDVCNVx1MDVCNlx1MDVCN1x1MDVCOFx1MDVCOVx1MDVCQVx1MDVCQlx1MDVCQ1x1MDVCRFx1MDVCRVx1MDVCRlx1MDVDMFx1MDVDMVx1MDVDMlx1MDVDM1x1MDVGMFx1MDVGMVx1MDVGMlx1MDVGM1x1MDVGNFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MDVEMFx1MDVEMVx1MDVEMlx1MDVEM1x1MDVENFx1MDVENVx1MDVENlx1MDVEN1x1MDVEOFx1MDVEOVx1MDVEQVx1MDVEQlx1MDVEQ1x1MDVERFx1MDVERVx1MDVERlx1MDVFMFx1MDVFMVx1MDVFMlx1MDVFM1x1MDVFNFx1MDVFNVx1MDVFNlx1MDVFN1x1MDVFOFx1MDVFOVx1MDVFQVx1RkZGRFx1RkZGRFx1MjAwRVx1MjAwRlx1RkZGRFwiXG4gIH0sXG4gIFwid2luMTI1NVwiOiBcIndpbmRvd3MxMjU1XCIsXG4gIFwiY3AxMjU1XCI6IFwid2luZG93czEyNTVcIixcbiAgXCJ3aW5kb3dzMTI1NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUyMEFDXHUwNjdFXHUyMDFBXHUwMTkyXHUyMDFFXHUyMDI2XHUyMDIwXHUyMDIxXHUwMkM2XHUyMDMwXHUwNjc5XHUyMDM5XHUwMTUyXHUwNjg2XHUwNjk4XHUwNjg4XHUwNkFGXHUyMDE4XHUyMDE5XHUyMDFDXHUyMDFEXHUyMDIyXHUyMDEzXHUyMDE0XHUwNkE5XHUyMTIyXHUwNjkxXHUyMDNBXHUwMTUzXHUyMDBDXHUyMDBEXHUwNkJBXHUwMEEwXHUwNjBDXHUwMEEyXHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwNkJFXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMEI5XHUwNjFCXHUwMEJCXHUwMEJDXHUwMEJEXHUwMEJFXHUwNjFGXHUwNkMxXHUwNjIxXHUwNjIyXHUwNjIzXHUwNjI0XHUwNjI1XHUwNjI2XHUwNjI3XHUwNjI4XHUwNjI5XHUwNjJBXHUwNjJCXHUwNjJDXHUwNjJEXHUwNjJFXHUwNjJGXHUwNjMwXHUwNjMxXHUwNjMyXHUwNjMzXHUwNjM0XHUwNjM1XHUwNjM2XHUwMEQ3XHUwNjM3XHUwNjM4XHUwNjM5XHUwNjNBXHUwNjQwXHUwNjQxXHUwNjQyXHUwNjQzXHUwMEUwXHUwNjQ0XHUwMEUyXHUwNjQ1XHUwNjQ2XHUwNjQ3XHUwNjQ4XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwNjQ5XHUwNjRBXHUwMEVFXHUwMEVGXHUwNjRCXHUwNjRDXHUwNjREXHUwNjRFXHUwMEY0XHUwNjRGXHUwNjUwXHUwMEY3XHUwNjUxXHUwMEY5XHUwNjUyXHUwMEZCXHUwMEZDXHUyMDBFXHUyMDBGXHUwNkQyXCJcbiAgfSxcbiAgXCJ3aW4xMjU2XCI6IFwid2luZG93czEyNTZcIixcbiAgXCJjcDEyNTZcIjogXCJ3aW5kb3dzMTI1NlwiLFxuICBcIndpbmRvd3MxMjU3XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTIwQUNcdUZGRkRcdTIwMUFcdUZGRkRcdTIwMUVcdTIwMjZcdTIwMjBcdTIwMjFcdUZGRkRcdTIwMzBcdUZGRkRcdTIwMzlcdUZGRkRcdTAwQThcdTAyQzdcdTAwQjhcdUZGRkRcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdUZGRkRcdTIxMjJcdUZGRkRcdTIwM0FcdUZGRkRcdTAwQUZcdTAyREJcdUZGRkRcdTAwQTBcdUZGRkRcdTAwQTJcdTAwQTNcdTAwQTRcdUZGRkRcdTAwQTZcdTAwQTdcdTAwRDhcdTAwQTlcdTAxNTZcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTAwQzZcdTAwQjBcdTAwQjFcdTAwQjJcdTAwQjNcdTAwQjRcdTAwQjVcdTAwQjZcdTAwQjdcdTAwRjhcdTAwQjlcdTAxNTdcdTAwQkJcdTAwQkNcdTAwQkRcdTAwQkVcdTAwRTZcdTAxMDRcdTAxMkVcdTAxMDBcdTAxMDZcdTAwQzRcdTAwQzVcdTAxMThcdTAxMTJcdTAxMENcdTAwQzlcdTAxNzlcdTAxMTZcdTAxMjJcdTAxMzZcdTAxMkFcdTAxM0JcdTAxNjBcdTAxNDNcdTAxNDVcdTAwRDNcdTAxNENcdTAwRDVcdTAwRDZcdTAwRDdcdTAxNzJcdTAxNDFcdTAxNUFcdTAxNkFcdTAwRENcdTAxN0JcdTAxN0RcdTAwREZcdTAxMDVcdTAxMkZcdTAxMDFcdTAxMDdcdTAwRTRcdTAwRTVcdTAxMTlcdTAxMTNcdTAxMERcdTAwRTlcdTAxN0FcdTAxMTdcdTAxMjNcdTAxMzdcdTAxMkJcdTAxM0NcdTAxNjFcdTAxNDRcdTAxNDZcdTAwRjNcdTAxNERcdTAwRjVcdTAwRjZcdTAwRjdcdTAxNzNcdTAxNDJcdTAxNUJcdTAxNkJcdTAwRkNcdTAxN0NcdTAxN0VcdTAyRDlcIlxuICB9LFxuICBcIndpbjEyNTdcIjogXCJ3aW5kb3dzMTI1N1wiLFxuICBcImNwMTI1N1wiOiBcIndpbmRvd3MxMjU3XCIsXG4gIFwid2luZG93czEyNThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MjBBQ1x1RkZGRFx1MjAxQVx1MDE5Mlx1MjAxRVx1MjAyNlx1MjAyMFx1MjAyMVx1MDJDNlx1MjAzMFx1RkZGRFx1MjAzOVx1MDE1Mlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyMlx1MjAxM1x1MjAxNFx1MDJEQ1x1MjEyMlx1RkZGRFx1MjAzQVx1MDE1M1x1RkZGRFx1RkZGRFx1MDE3OFx1MDBBMFx1MDBBMVx1MDBBMlx1MDBBM1x1MDBBNFx1MDBBNVx1MDBBNlx1MDBBN1x1MDBBOFx1MDBBOVx1MDBBQVx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MDBBRlx1MDBCMFx1MDBCMVx1MDBCMlx1MDBCM1x1MDBCNFx1MDBCNVx1MDBCNlx1MDBCN1x1MDBCOFx1MDBCOVx1MDBCQVx1MDBCQlx1MDBCQ1x1MDBCRFx1MDBCRVx1MDBCRlx1MDBDMFx1MDBDMVx1MDBDMlx1MDEwMlx1MDBDNFx1MDBDNVx1MDBDNlx1MDBDN1x1MDBDOFx1MDBDOVx1MDBDQVx1MDBDQlx1MDMwMFx1MDBDRFx1MDBDRVx1MDBDRlx1MDExMFx1MDBEMVx1MDMwOVx1MDBEM1x1MDBENFx1MDFBMFx1MDBENlx1MDBEN1x1MDBEOFx1MDBEOVx1MDBEQVx1MDBEQlx1MDBEQ1x1MDFBRlx1MDMwM1x1MDBERlx1MDBFMFx1MDBFMVx1MDBFMlx1MDEwM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDBFN1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQlx1MDMwMVx1MDBFRFx1MDBFRVx1MDBFRlx1MDExMVx1MDBGMVx1MDMyM1x1MDBGM1x1MDBGNFx1MDFBMVx1MDBGNlx1MDBGN1x1MDBGOFx1MDBGOVx1MDBGQVx1MDBGQlx1MDBGQ1x1MDFCMFx1MjBBQlx1MDBGRlwiXG4gIH0sXG4gIFwid2luMTI1OFwiOiBcIndpbmRvd3MxMjU4XCIsXG4gIFwiY3AxMjU4XCI6IFwid2luZG93czEyNThcIixcbiAgXCJpc284ODU5MVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMEExXHUwMEEyXHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMEFBXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMEI5XHUwMEJBXHUwMEJCXHUwMEJDXHUwMEJEXHUwMEJFXHUwMEJGXHUwMEMwXHUwMEMxXHUwMEMyXHUwMEMzXHUwMEM0XHUwMEM1XHUwMEM2XHUwMEM3XHUwMEM4XHUwMEM5XHUwMENBXHUwMENCXHUwMENDXHUwMENEXHUwMENFXHUwMENGXHUwMEQwXHUwMEQxXHUwMEQyXHUwMEQzXHUwMEQ0XHUwMEQ1XHUwMEQ2XHUwMEQ3XHUwMEQ4XHUwMEQ5XHUwMERBXHUwMERCXHUwMERDXHUwMEREXHUwMERFXHUwMERGXHUwMEUwXHUwMEUxXHUwMEUyXHUwMEUzXHUwMEU0XHUwMEU1XHUwMEU2XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwMEVDXHUwMEVEXHUwMEVFXHUwMEVGXHUwMEYwXHUwMEYxXHUwMEYyXHUwMEYzXHUwMEY0XHUwMEY1XHUwMEY2XHUwMEY3XHUwMEY4XHUwMEY5XHUwMEZBXHUwMEZCXHUwMEZDXHUwMEZEXHUwMEZFXHUwMEZGXCJcbiAgfSxcbiAgXCJjcDI4NTkxXCI6IFwiaXNvODg1OTFcIixcbiAgXCJpc284ODU5MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMTA0XHUwMkQ4XHUwMTQxXHUwMEE0XHUwMTNEXHUwMTVBXHUwMEE3XHUwMEE4XHUwMTYwXHUwMTVFXHUwMTY0XHUwMTc5XHUwMEFEXHUwMTdEXHUwMTdCXHUwMEIwXHUwMTA1XHUwMkRCXHUwMTQyXHUwMEI0XHUwMTNFXHUwMTVCXHUwMkM3XHUwMEI4XHUwMTYxXHUwMTVGXHUwMTY1XHUwMTdBXHUwMkREXHUwMTdFXHUwMTdDXHUwMTU0XHUwMEMxXHUwMEMyXHUwMTAyXHUwMEM0XHUwMTM5XHUwMTA2XHUwMEM3XHUwMTBDXHUwMEM5XHUwMTE4XHUwMENCXHUwMTFBXHUwMENEXHUwMENFXHUwMTBFXHUwMTEwXHUwMTQzXHUwMTQ3XHUwMEQzXHUwMEQ0XHUwMTUwXHUwMEQ2XHUwMEQ3XHUwMTU4XHUwMTZFXHUwMERBXHUwMTcwXHUwMERDXHUwMEREXHUwMTYyXHUwMERGXHUwMTU1XHUwMEUxXHUwMEUyXHUwMTAzXHUwMEU0XHUwMTNBXHUwMTA3XHUwMEU3XHUwMTBEXHUwMEU5XHUwMTE5XHUwMEVCXHUwMTFCXHUwMEVEXHUwMEVFXHUwMTBGXHUwMTExXHUwMTQ0XHUwMTQ4XHUwMEYzXHUwMEY0XHUwMTUxXHUwMEY2XHUwMEY3XHUwMTU5XHUwMTZGXHUwMEZBXHUwMTcxXHUwMEZDXHUwMEZEXHUwMTYzXHUwMkQ5XCJcbiAgfSxcbiAgXCJjcDI4NTkyXCI6IFwiaXNvODg1OTJcIixcbiAgXCJpc284ODU5M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMTI2XHUwMkQ4XHUwMEEzXHUwMEE0XHVGRkZEXHUwMTI0XHUwMEE3XHUwMEE4XHUwMTMwXHUwMTVFXHUwMTFFXHUwMTM0XHUwMEFEXHVGRkZEXHUwMTdCXHUwMEIwXHUwMTI3XHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMTI1XHUwMEI3XHUwMEI4XHUwMTMxXHUwMTVGXHUwMTFGXHUwMTM1XHUwMEJEXHVGRkZEXHUwMTdDXHUwMEMwXHUwMEMxXHUwMEMyXHVGRkZEXHUwMEM0XHUwMTBBXHUwMTA4XHUwMEM3XHUwMEM4XHUwMEM5XHUwMENBXHUwMENCXHUwMENDXHUwMENEXHUwMENFXHUwMENGXHVGRkZEXHUwMEQxXHUwMEQyXHUwMEQzXHUwMEQ0XHUwMTIwXHUwMEQ2XHUwMEQ3XHUwMTFDXHUwMEQ5XHUwMERBXHUwMERCXHUwMERDXHUwMTZDXHUwMTVDXHUwMERGXHUwMEUwXHUwMEUxXHUwMEUyXHVGRkZEXHUwMEU0XHUwMTBCXHUwMTA5XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwMEVDXHUwMEVEXHUwMEVFXHUwMEVGXHVGRkZEXHUwMEYxXHUwMEYyXHUwMEYzXHUwMEY0XHUwMTIxXHUwMEY2XHUwMEY3XHUwMTFEXHUwMEY5XHUwMEZBXHUwMEZCXHUwMEZDXHUwMTZEXHUwMTVEXHUwMkQ5XCJcbiAgfSxcbiAgXCJjcDI4NTkzXCI6IFwiaXNvODg1OTNcIixcbiAgXCJpc284ODU5NFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMTA0XHUwMTM4XHUwMTU2XHUwMEE0XHUwMTI4XHUwMTNCXHUwMEE3XHUwMEE4XHUwMTYwXHUwMTEyXHUwMTIyXHUwMTY2XHUwMEFEXHUwMTdEXHUwMEFGXHUwMEIwXHUwMTA1XHUwMkRCXHUwMTU3XHUwMEI0XHUwMTI5XHUwMTNDXHUwMkM3XHUwMEI4XHUwMTYxXHUwMTEzXHUwMTIzXHUwMTY3XHUwMTRBXHUwMTdFXHUwMTRCXHUwMTAwXHUwMEMxXHUwMEMyXHUwMEMzXHUwMEM0XHUwMEM1XHUwMEM2XHUwMTJFXHUwMTBDXHUwMEM5XHUwMTE4XHUwMENCXHUwMTE2XHUwMENEXHUwMENFXHUwMTJBXHUwMTEwXHUwMTQ1XHUwMTRDXHUwMTM2XHUwMEQ0XHUwMEQ1XHUwMEQ2XHUwMEQ3XHUwMEQ4XHUwMTcyXHUwMERBXHUwMERCXHUwMERDXHUwMTY4XHUwMTZBXHUwMERGXHUwMTAxXHUwMEUxXHUwMEUyXHUwMEUzXHUwMEU0XHUwMEU1XHUwMEU2XHUwMTJGXHUwMTBEXHUwMEU5XHUwMTE5XHUwMEVCXHUwMTE3XHUwMEVEXHUwMEVFXHUwMTJCXHUwMTExXHUwMTQ2XHUwMTREXHUwMTM3XHUwMEY0XHUwMEY1XHUwMEY2XHUwMEY3XHUwMEY4XHUwMTczXHUwMEZBXHUwMEZCXHUwMEZDXHUwMTY5XHUwMTZCXHUwMkQ5XCJcbiAgfSxcbiAgXCJjcDI4NTk0XCI6IFwiaXNvODg1OTRcIixcbiAgXCJpc284ODU5NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwNDAxXHUwNDAyXHUwNDAzXHUwNDA0XHUwNDA1XHUwNDA2XHUwNDA3XHUwNDA4XHUwNDA5XHUwNDBBXHUwNDBCXHUwNDBDXHUwMEFEXHUwNDBFXHUwNDBGXHUwNDEwXHUwNDExXHUwNDEyXHUwNDEzXHUwNDE0XHUwNDE1XHUwNDE2XHUwNDE3XHUwNDE4XHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDFEXHUwNDFFXHUwNDFGXHUwNDIwXHUwNDIxXHUwNDIyXHUwNDIzXHUwNDI0XHUwNDI1XHUwNDI2XHUwNDI3XHUwNDI4XHUwNDI5XHUwNDJBXHUwNDJCXHUwNDJDXHUwNDJEXHUwNDJFXHUwNDJGXHUwNDMwXHUwNDMxXHUwNDMyXHUwNDMzXHUwNDM0XHUwNDM1XHUwNDM2XHUwNDM3XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDQwXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDQ0XHUwNDQ1XHUwNDQ2XHUwNDQ3XHUwNDQ4XHUwNDQ5XHUwNDRBXHUwNDRCXHUwNDRDXHUwNDREXHUwNDRFXHUwNDRGXHUyMTE2XHUwNDUxXHUwNDUyXHUwNDUzXHUwNDU0XHUwNDU1XHUwNDU2XHUwNDU3XHUwNDU4XHUwNDU5XHUwNDVBXHUwNDVCXHUwNDVDXHUwMEE3XHUwNDVFXHUwNDVGXCJcbiAgfSxcbiAgXCJjcDI4NTk1XCI6IFwiaXNvODg1OTVcIixcbiAgXCJpc284ODU5NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHVGRkZEXHVGRkZEXHVGRkZEXHUwMEE0XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwNjBDXHUwMEFEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwNjFCXHVGRkZEXHVGRkZEXHVGRkZEXHUwNjFGXHVGRkZEXHUwNjIxXHUwNjIyXHUwNjIzXHUwNjI0XHUwNjI1XHUwNjI2XHUwNjI3XHUwNjI4XHUwNjI5XHUwNjJBXHUwNjJCXHUwNjJDXHUwNjJEXHUwNjJFXHUwNjJGXHUwNjMwXHUwNjMxXHUwNjMyXHUwNjMzXHUwNjM0XHUwNjM1XHUwNjM2XHUwNjM3XHUwNjM4XHUwNjM5XHUwNjNBXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwNjQwXHUwNjQxXHUwNjQyXHUwNjQzXHUwNjQ0XHUwNjQ1XHUwNjQ2XHUwNjQ3XHUwNjQ4XHUwNjQ5XHUwNjRBXHUwNjRCXHUwNjRDXHUwNjREXHUwNjRFXHUwNjRGXHUwNjUwXHUwNjUxXHUwNjUyXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXCJcbiAgfSxcbiAgXCJjcDI4NTk2XCI6IFwiaXNvODg1OTZcIixcbiAgXCJpc284ODU5N1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUyMDE4XHUyMDE5XHUwMEEzXHUyMEFDXHUyMEFGXHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMzdBXHUwMEFCXHUwMEFDXHUwMEFEXHVGRkZEXHUyMDE1XHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMzg0XHUwMzg1XHUwMzg2XHUwMEI3XHUwMzg4XHUwMzg5XHUwMzhBXHUwMEJCXHUwMzhDXHUwMEJEXHUwMzhFXHUwMzhGXHUwMzkwXHUwMzkxXHUwMzkyXHUwMzkzXHUwMzk0XHUwMzk1XHUwMzk2XHUwMzk3XHUwMzk4XHUwMzk5XHUwMzlBXHUwMzlCXHUwMzlDXHUwMzlEXHUwMzlFXHUwMzlGXHUwM0EwXHUwM0ExXHVGRkZEXHUwM0EzXHUwM0E0XHUwM0E1XHUwM0E2XHUwM0E3XHUwM0E4XHUwM0E5XHUwM0FBXHUwM0FCXHUwM0FDXHUwM0FEXHUwM0FFXHUwM0FGXHUwM0IwXHUwM0IxXHUwM0IyXHUwM0IzXHUwM0I0XHUwM0I1XHUwM0I2XHUwM0I3XHUwM0I4XHUwM0I5XHUwM0JBXHUwM0JCXHUwM0JDXHUwM0JEXHUwM0JFXHUwM0JGXHUwM0MwXHUwM0MxXHUwM0MyXHUwM0MzXHUwM0M0XHUwM0M1XHUwM0M2XHUwM0M3XHUwM0M4XHUwM0M5XHUwM0NBXHUwM0NCXHUwM0NDXHUwM0NEXHUwM0NFXHVGRkZEXCJcbiAgfSxcbiAgXCJjcDI4NTk3XCI6IFwiaXNvODg1OTdcIixcbiAgXCJpc284ODU5OFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHVGRkZEXHUwMEEyXHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMEQ3XHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMEI5XHUwMEY3XHUwMEJCXHUwMEJDXHUwMEJEXHUwMEJFXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUyMDE3XHUwNUQwXHUwNUQxXHUwNUQyXHUwNUQzXHUwNUQ0XHUwNUQ1XHUwNUQ2XHUwNUQ3XHUwNUQ4XHUwNUQ5XHUwNURBXHUwNURCXHUwNURDXHUwNUREXHUwNURFXHUwNURGXHUwNUUwXHUwNUUxXHUwNUUyXHUwNUUzXHUwNUU0XHUwNUU1XHUwNUU2XHUwNUU3XHUwNUU4XHUwNUU5XHUwNUVBXHVGRkZEXHVGRkZEXHUyMDBFXHUyMDBGXHVGRkZEXCJcbiAgfSxcbiAgXCJjcDI4NTk4XCI6IFwiaXNvODg1OThcIixcbiAgXCJpc284ODU5OVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMEExXHUwMEEyXHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMEFBXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMEI5XHUwMEJBXHUwMEJCXHUwMEJDXHUwMEJEXHUwMEJFXHUwMEJGXHUwMEMwXHUwMEMxXHUwMEMyXHUwMEMzXHUwMEM0XHUwMEM1XHUwMEM2XHUwMEM3XHUwMEM4XHUwMEM5XHUwMENBXHUwMENCXHUwMENDXHUwMENEXHUwMENFXHUwMENGXHUwMTFFXHUwMEQxXHUwMEQyXHUwMEQzXHUwMEQ0XHUwMEQ1XHUwMEQ2XHUwMEQ3XHUwMEQ4XHUwMEQ5XHUwMERBXHUwMERCXHUwMERDXHUwMTMwXHUwMTVFXHUwMERGXHUwMEUwXHUwMEUxXHUwMEUyXHUwMEUzXHUwMEU0XHUwMEU1XHUwMEU2XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwMEVDXHUwMEVEXHUwMEVFXHUwMEVGXHUwMTFGXHUwMEYxXHUwMEYyXHUwMEYzXHUwMEY0XHUwMEY1XHUwMEY2XHUwMEY3XHUwMEY4XHUwMEY5XHUwMEZBXHUwMEZCXHUwMEZDXHUwMTMxXHUwMTVGXHUwMEZGXCJcbiAgfSxcbiAgXCJjcDI4NTk5XCI6IFwiaXNvODg1OTlcIixcbiAgXCJpc284ODU5MTBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MDEwNFx1MDExMlx1MDEyMlx1MDEyQVx1MDEyOFx1MDEzNlx1MDBBN1x1MDEzQlx1MDExMFx1MDE2MFx1MDE2Nlx1MDE3RFx1MDBBRFx1MDE2QVx1MDE0QVx1MDBCMFx1MDEwNVx1MDExM1x1MDEyM1x1MDEyQlx1MDEyOVx1MDEzN1x1MDBCN1x1MDEzQ1x1MDExMVx1MDE2MVx1MDE2N1x1MDE3RVx1MjAxNVx1MDE2Qlx1MDE0Qlx1MDEwMFx1MDBDMVx1MDBDMlx1MDBDM1x1MDBDNFx1MDBDNVx1MDBDNlx1MDEyRVx1MDEwQ1x1MDBDOVx1MDExOFx1MDBDQlx1MDExNlx1MDBDRFx1MDBDRVx1MDBDRlx1MDBEMFx1MDE0NVx1MDE0Q1x1MDBEM1x1MDBENFx1MDBENVx1MDBENlx1MDE2OFx1MDBEOFx1MDE3Mlx1MDBEQVx1MDBEQlx1MDBEQ1x1MDBERFx1MDBERVx1MDBERlx1MDEwMVx1MDBFMVx1MDBFMlx1MDBFM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDEyRlx1MDEwRFx1MDBFOVx1MDExOVx1MDBFQlx1MDExN1x1MDBFRFx1MDBFRVx1MDBFRlx1MDBGMFx1MDE0Nlx1MDE0RFx1MDBGM1x1MDBGNFx1MDBGNVx1MDBGNlx1MDE2OVx1MDBGOFx1MDE3M1x1MDBGQVx1MDBGQlx1MDBGQ1x1MDBGRFx1MDBGRVx1MDEzOFwiXG4gIH0sXG4gIFwiY3AyODYwMFwiOiBcImlzbzg4NTkxMFwiLFxuICBcImlzbzg4NTkxMVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwRTAxXHUwRTAyXHUwRTAzXHUwRTA0XHUwRTA1XHUwRTA2XHUwRTA3XHUwRTA4XHUwRTA5XHUwRTBBXHUwRTBCXHUwRTBDXHUwRTBEXHUwRTBFXHUwRTBGXHUwRTEwXHUwRTExXHUwRTEyXHUwRTEzXHUwRTE0XHUwRTE1XHUwRTE2XHUwRTE3XHUwRTE4XHUwRTE5XHUwRTFBXHUwRTFCXHUwRTFDXHUwRTFEXHUwRTFFXHUwRTFGXHUwRTIwXHUwRTIxXHUwRTIyXHUwRTIzXHUwRTI0XHUwRTI1XHUwRTI2XHUwRTI3XHUwRTI4XHUwRTI5XHUwRTJBXHUwRTJCXHUwRTJDXHUwRTJEXHUwRTJFXHUwRTJGXHUwRTMwXHUwRTMxXHUwRTMyXHUwRTMzXHUwRTM0XHUwRTM1XHUwRTM2XHUwRTM3XHUwRTM4XHUwRTM5XHUwRTNBXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwRTNGXHUwRTQwXHUwRTQxXHUwRTQyXHUwRTQzXHUwRTQ0XHUwRTQ1XHUwRTQ2XHUwRTQ3XHUwRTQ4XHUwRTQ5XHUwRTRBXHUwRTRCXHUwRTRDXHUwRTREXHUwRTRFXHUwRTRGXHUwRTUwXHUwRTUxXHUwRTUyXHUwRTUzXHUwRTU0XHUwRTU1XHUwRTU2XHUwRTU3XHUwRTU4XHUwRTU5XHUwRTVBXHUwRTVCXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXCJcbiAgfSxcbiAgXCJjcDI4NjAxXCI6IFwiaXNvODg1OTExXCIsXG4gIFwiaXNvODg1OTEzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwODBcdTAwODFcdTAwODJcdTAwODNcdTAwODRcdTAwODVcdTAwODZcdTAwODdcdTAwODhcdTAwODlcdTAwOEFcdTAwOEJcdTAwOENcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTAwOTFcdTAwOTJcdTAwOTNcdTAwOTRcdTAwOTVcdTAwOTZcdTAwOTdcdTAwOThcdTAwOTlcdTAwOUFcdTAwOUJcdTAwOUNcdTAwOURcdTAwOUVcdTAwOUZcdTAwQTBcdTIwMURcdTAwQTJcdTAwQTNcdTAwQTRcdTIwMUVcdTAwQTZcdTAwQTdcdTAwRDhcdTAwQTlcdTAxNTZcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTAwQzZcdTAwQjBcdTAwQjFcdTAwQjJcdTAwQjNcdTIwMUNcdTAwQjVcdTAwQjZcdTAwQjdcdTAwRjhcdTAwQjlcdTAxNTdcdTAwQkJcdTAwQkNcdTAwQkRcdTAwQkVcdTAwRTZcdTAxMDRcdTAxMkVcdTAxMDBcdTAxMDZcdTAwQzRcdTAwQzVcdTAxMThcdTAxMTJcdTAxMENcdTAwQzlcdTAxNzlcdTAxMTZcdTAxMjJcdTAxMzZcdTAxMkFcdTAxM0JcdTAxNjBcdTAxNDNcdTAxNDVcdTAwRDNcdTAxNENcdTAwRDVcdTAwRDZcdTAwRDdcdTAxNzJcdTAxNDFcdTAxNUFcdTAxNkFcdTAwRENcdTAxN0JcdTAxN0RcdTAwREZcdTAxMDVcdTAxMkZcdTAxMDFcdTAxMDdcdTAwRTRcdTAwRTVcdTAxMTlcdTAxMTNcdTAxMERcdTAwRTlcdTAxN0FcdTAxMTdcdTAxMjNcdTAxMzdcdTAxMkJcdTAxM0NcdTAxNjFcdTAxNDRcdTAxNDZcdTAwRjNcdTAxNERcdTAwRjVcdTAwRjZcdTAwRjdcdTAxNzNcdTAxNDJcdTAxNUJcdTAxNkJcdTAwRkNcdTAxN0NcdTAxN0VcdTIwMTlcIlxuICB9LFxuICBcImNwMjg2MDNcIjogXCJpc284ODU5MTNcIixcbiAgXCJpc284ODU5MTRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MUUwMlx1MUUwM1x1MDBBM1x1MDEwQVx1MDEwQlx1MUUwQVx1MDBBN1x1MUU4MFx1MDBBOVx1MUU4Mlx1MUUwQlx1MUVGMlx1MDBBRFx1MDBBRVx1MDE3OFx1MUUxRVx1MUUxRlx1MDEyMFx1MDEyMVx1MUU0MFx1MUU0MVx1MDBCNlx1MUU1Nlx1MUU4MVx1MUU1N1x1MUU4M1x1MUU2MFx1MUVGM1x1MUU4NFx1MUU4NVx1MUU2MVx1MDBDMFx1MDBDMVx1MDBDMlx1MDBDM1x1MDBDNFx1MDBDNVx1MDBDNlx1MDBDN1x1MDBDOFx1MDBDOVx1MDBDQVx1MDBDQlx1MDBDQ1x1MDBDRFx1MDBDRVx1MDBDRlx1MDE3NFx1MDBEMVx1MDBEMlx1MDBEM1x1MDBENFx1MDBENVx1MDBENlx1MUU2QVx1MDBEOFx1MDBEOVx1MDBEQVx1MDBEQlx1MDBEQ1x1MDBERFx1MDE3Nlx1MDBERlx1MDBFMFx1MDBFMVx1MDBFMlx1MDBFM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDBFN1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQlx1MDBFQ1x1MDBFRFx1MDBFRVx1MDBFRlx1MDE3NVx1MDBGMVx1MDBGMlx1MDBGM1x1MDBGNFx1MDBGNVx1MDBGNlx1MUU2Qlx1MDBGOFx1MDBGOVx1MDBGQVx1MDBGQlx1MDBGQ1x1MDBGRFx1MDE3N1x1MDBGRlwiXG4gIH0sXG4gIFwiY3AyODYwNFwiOiBcImlzbzg4NTkxNFwiLFxuICBcImlzbzg4NTkxNVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUwMDgyXHUwMDgzXHUwMDg0XHUwMDg1XHUwMDg2XHUwMDg3XHUwMDg4XHUwMDg5XHUwMDhBXHUwMDhCXHUwMDhDXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUwMDkxXHUwMDkyXHUwMDkzXHUwMDk0XHUwMDk1XHUwMDk2XHUwMDk3XHUwMDk4XHUwMDk5XHUwMDlBXHUwMDlCXHUwMDlDXHUwMDlEXHUwMDlFXHUwMDlGXHUwMEEwXHUwMEExXHUwMEEyXHUwMEEzXHUyMEFDXHUwMEE1XHUwMTYwXHUwMEE3XHUwMTYxXHUwMEE5XHUwMEFBXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMTdEXHUwMEI1XHUwMEI2XHUwMEI3XHUwMTdFXHUwMEI5XHUwMEJBXHUwMEJCXHUwMTUyXHUwMTUzXHUwMTc4XHUwMEJGXHUwMEMwXHUwMEMxXHUwMEMyXHUwMEMzXHUwMEM0XHUwMEM1XHUwMEM2XHUwMEM3XHUwMEM4XHUwMEM5XHUwMENBXHUwMENCXHUwMENDXHUwMENEXHUwMENFXHUwMENGXHUwMEQwXHUwMEQxXHUwMEQyXHUwMEQzXHUwMEQ0XHUwMEQ1XHUwMEQ2XHUwMEQ3XHUwMEQ4XHUwMEQ5XHUwMERBXHUwMERCXHUwMERDXHUwMEREXHUwMERFXHUwMERGXHUwMEUwXHUwMEUxXHUwMEUyXHUwMEUzXHUwMEU0XHUwMEU1XHUwMEU2XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwMEVDXHUwMEVEXHUwMEVFXHUwMEVGXHUwMEYwXHUwMEYxXHUwMEYyXHUwMEYzXHUwMEY0XHUwMEY1XHUwMEY2XHUwMEY3XHUwMEY4XHUwMEY5XHUwMEZBXHUwMEZCXHUwMEZDXHUwMEZEXHUwMEZFXHUwMEZGXCJcbiAgfSxcbiAgXCJjcDI4NjA1XCI6IFwiaXNvODg1OTE1XCIsXG4gIFwiaXNvODg1OTE2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwODBcdTAwODFcdTAwODJcdTAwODNcdTAwODRcdTAwODVcdTAwODZcdTAwODdcdTAwODhcdTAwODlcdTAwOEFcdTAwOEJcdTAwOENcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTAwOTFcdTAwOTJcdTAwOTNcdTAwOTRcdTAwOTVcdTAwOTZcdTAwOTdcdTAwOThcdTAwOTlcdTAwOUFcdTAwOUJcdTAwOUNcdTAwOURcdTAwOUVcdTAwOUZcdTAwQTBcdTAxMDRcdTAxMDVcdTAxNDFcdTIwQUNcdTIwMUVcdTAxNjBcdTAwQTdcdTAxNjFcdTAwQTlcdTAyMThcdTAwQUJcdTAxNzlcdTAwQURcdTAxN0FcdTAxN0JcdTAwQjBcdTAwQjFcdTAxMENcdTAxNDJcdTAxN0RcdTIwMURcdTAwQjZcdTAwQjdcdTAxN0VcdTAxMERcdTAyMTlcdTAwQkJcdTAxNTJcdTAxNTNcdTAxNzhcdTAxN0NcdTAwQzBcdTAwQzFcdTAwQzJcdTAxMDJcdTAwQzRcdTAxMDZcdTAwQzZcdTAwQzdcdTAwQzhcdTAwQzlcdTAwQ0FcdTAwQ0JcdTAwQ0NcdTAwQ0RcdTAwQ0VcdTAwQ0ZcdTAxMTBcdTAxNDNcdTAwRDJcdTAwRDNcdTAwRDRcdTAxNTBcdTAwRDZcdTAxNUFcdTAxNzBcdTAwRDlcdTAwREFcdTAwREJcdTAwRENcdTAxMThcdTAyMUFcdTAwREZcdTAwRTBcdTAwRTFcdTAwRTJcdTAxMDNcdTAwRTRcdTAxMDdcdTAwRTZcdTAwRTdcdTAwRThcdTAwRTlcdTAwRUFcdTAwRUJcdTAwRUNcdTAwRURcdTAwRUVcdTAwRUZcdTAxMTFcdTAxNDRcdTAwRjJcdTAwRjNcdTAwRjRcdTAxNTFcdTAwRjZcdTAxNUJcdTAxNzFcdTAwRjlcdTAwRkFcdTAwRkJcdTAwRkNcdTAxMTlcdTAyMUJcdTAwRkZcIlxuICB9LFxuICBcImNwMjg2MDZcIjogXCJpc284ODU5MTZcIixcbiAgXCJjcDQzN1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMEUwXHUwMEU1XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEVGXHUwMEVFXHUwMEVDXHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMEY0XHUwMEY2XHUwMEYyXHUwMEZCXHUwMEY5XHUwMEZGXHUwMEQ2XHUwMERDXHUwMEEyXHUwMEEzXHUwMEE1XHUyMEE3XHUwMTkyXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMEFBXHUwMEJBXHUwMEJGXHUyMzEwXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0IxXHUwMERGXHUwMzkzXHUwM0MwXHUwM0EzXHUwM0MzXHUwMEI1XHUwM0M0XHUwM0E2XHUwMzk4XHUwM0E5XHUwM0I0XHUyMjFFXHUwM0M2XHUwM0I1XHUyMjI5XHUyMjYxXHUwMEIxXHUyMjY1XHUyMjY0XHUyMzIwXHUyMzIxXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm00MzdcIjogXCJjcDQzN1wiLFxuICBcImNzaWJtNDM3XCI6IFwiY3A0MzdcIixcbiAgXCJjcDczN1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMzkxXHUwMzkyXHUwMzkzXHUwMzk0XHUwMzk1XHUwMzk2XHUwMzk3XHUwMzk4XHUwMzk5XHUwMzlBXHUwMzlCXHUwMzlDXHUwMzlEXHUwMzlFXHUwMzlGXHUwM0EwXHUwM0ExXHUwM0EzXHUwM0E0XHUwM0E1XHUwM0E2XHUwM0E3XHUwM0E4XHUwM0E5XHUwM0IxXHUwM0IyXHUwM0IzXHUwM0I0XHUwM0I1XHUwM0I2XHUwM0I3XHUwM0I4XHUwM0I5XHUwM0JBXHUwM0JCXHUwM0JDXHUwM0JEXHUwM0JFXHUwM0JGXHUwM0MwXHUwM0MxXHUwM0MzXHUwM0MyXHUwM0M0XHUwM0M1XHUwM0M2XHUwM0M3XHUwM0M4XHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0M5XHUwM0FDXHUwM0FEXHUwM0FFXHUwM0NBXHUwM0FGXHUwM0NDXHUwM0NEXHUwM0NCXHUwM0NFXHUwMzg2XHUwMzg4XHUwMzg5XHUwMzhBXHUwMzhDXHUwMzhFXHUwMzhGXHUwMEIxXHUyMjY1XHUyMjY0XHUwM0FBXHUwM0FCXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm03MzdcIjogXCJjcDczN1wiLFxuICBcImNzaWJtNzM3XCI6IFwiY3A3MzdcIixcbiAgXCJjcDc3NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMTA2XHUwMEZDXHUwMEU5XHUwMTAxXHUwMEU0XHUwMTIzXHUwMEU1XHUwMTA3XHUwMTQyXHUwMTEzXHUwMTU2XHUwMTU3XHUwMTJCXHUwMTc5XHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMTREXHUwMEY2XHUwMTIyXHUwMEEyXHUwMTVBXHUwMTVCXHUwMEQ2XHUwMERDXHUwMEY4XHUwMEEzXHUwMEQ4XHUwMEQ3XHUwMEE0XHUwMTAwXHUwMTJBXHUwMEYzXHUwMTdCXHUwMTdDXHUwMTdBXHUyMDFEXHUwMEE2XHUwMEE5XHUwMEFFXHUwMEFDXHUwMEJEXHUwMEJDXHUwMTQxXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwMTA0XHUwMTBDXHUwMTE4XHUwMTE2XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMTJFXHUwMTYwXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwMTcyXHUwMTZBXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMTdEXHUwMTA1XHUwMTBEXHUwMTE5XHUwMTE3XHUwMTJGXHUwMTYxXHUwMTczXHUwMTZCXHUwMTdFXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwMEQzXHUwMERGXHUwMTRDXHUwMTQzXHUwMEY1XHUwMEQ1XHUwMEI1XHUwMTQ0XHUwMTM2XHUwMTM3XHUwMTNCXHUwMTNDXHUwMTQ2XHUwMTEyXHUwMTQ1XHUyMDE5XHUwMEFEXHUwMEIxXHUyMDFDXHUwMEJFXHUwMEI2XHUwMEE3XHUwMEY3XHUyMDFFXHUwMEIwXHUyMjE5XHUwMEI3XHUwMEI5XHUwMEIzXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm03NzVcIjogXCJjcDc3NVwiLFxuICBcImNzaWJtNzc1XCI6IFwiY3A3NzVcIixcbiAgXCJjcDg1MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMEUwXHUwMEU1XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEVGXHUwMEVFXHUwMEVDXHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMEY0XHUwMEY2XHUwMEYyXHUwMEZCXHUwMEY5XHUwMEZGXHUwMEQ2XHUwMERDXHUwMEY4XHUwMEEzXHUwMEQ4XHUwMEQ3XHUwMTkyXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMEFBXHUwMEJBXHUwMEJGXHUwMEFFXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwMEMxXHUwMEMyXHUwMEMwXHUwMEE5XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMEEyXHUwMEE1XHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwMEUzXHUwMEMzXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHUwMEYwXHUwMEQwXHUwMENBXHUwMENCXHUwMEM4XHUwMTMxXHUwMENEXHUwMENFXHUwMENGXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwMEE2XHUwMENDXHUyNTgwXHUwMEQzXHUwMERGXHUwMEQ0XHUwMEQyXHUwMEY1XHUwMEQ1XHUwMEI1XHUwMEZFXHUwMERFXHUwMERBXHUwMERCXHUwMEQ5XHUwMEZEXHUwMEREXHUwMEFGXHUwMEI0XHUwMEFEXHUwMEIxXHUyMDE3XHUwMEJFXHUwMEI2XHUwMEE3XHUwMEY3XHUwMEI4XHUwMEIwXHUwMEE4XHUwMEI3XHUwMEI5XHUwMEIzXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NTBcIjogXCJjcDg1MFwiLFxuICBcImNzaWJtODUwXCI6IFwiY3A4NTBcIixcbiAgXCJjcDg1MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMTZGXHUwMTA3XHUwMEU3XHUwMTQyXHUwMEVCXHUwMTUwXHUwMTUxXHUwMEVFXHUwMTc5XHUwMEM0XHUwMTA2XHUwMEM5XHUwMTM5XHUwMTNBXHUwMEY0XHUwMEY2XHUwMTNEXHUwMTNFXHUwMTVBXHUwMTVCXHUwMEQ2XHUwMERDXHUwMTY0XHUwMTY1XHUwMTQxXHUwMEQ3XHUwMTBEXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMTA0XHUwMTA1XHUwMTdEXHUwMTdFXHUwMTE4XHUwMTE5XHUwMEFDXHUwMTdBXHUwMTBDXHUwMTVGXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwMEMxXHUwMEMyXHUwMTFBXHUwMTVFXHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMTdCXHUwMTdDXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwMTAyXHUwMTAzXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHUwMTExXHUwMTEwXHUwMTBFXHUwMENCXHUwMTBGXHUwMTQ3XHUwMENEXHUwMENFXHUwMTFCXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwMTYyXHUwMTZFXHUyNTgwXHUwMEQzXHUwMERGXHUwMEQ0XHUwMTQzXHUwMTQ0XHUwMTQ4XHUwMTYwXHUwMTYxXHUwMTU0XHUwMERBXHUwMTU1XHUwMTcwXHUwMEZEXHUwMEREXHUwMTYzXHUwMEI0XHUwMEFEXHUwMkREXHUwMkRCXHUwMkM3XHUwMkQ4XHUwMEE3XHUwMEY3XHUwMEI4XHUwMEIwXHUwMEE4XHUwMkQ5XHUwMTcxXHUwMTU4XHUwMTU5XHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NTJcIjogXCJjcDg1MlwiLFxuICBcImNzaWJtODUyXCI6IFwiY3A4NTJcIixcbiAgXCJjcDg1NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwNDUyXHUwNDAyXHUwNDUzXHUwNDAzXHUwNDUxXHUwNDAxXHUwNDU0XHUwNDA0XHUwNDU1XHUwNDA1XHUwNDU2XHUwNDA2XHUwNDU3XHUwNDA3XHUwNDU4XHUwNDA4XHUwNDU5XHUwNDA5XHUwNDVBXHUwNDBBXHUwNDVCXHUwNDBCXHUwNDVDXHUwNDBDXHUwNDVFXHUwNDBFXHUwNDVGXHUwNDBGXHUwNDRFXHUwNDJFXHUwNDRBXHUwNDJBXHUwNDMwXHUwNDEwXHUwNDMxXHUwNDExXHUwNDQ2XHUwNDI2XHUwNDM0XHUwNDE0XHUwNDM1XHUwNDE1XHUwNDQ0XHUwNDI0XHUwNDMzXHUwNDEzXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwNDQ1XHUwNDI1XHUwNDM4XHUwNDE4XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwNDM5XHUwNDE5XHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwNDNBXHUwNDFBXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHUwNDNCXHUwNDFCXHUwNDNDXHUwNDFDXHUwNDNEXHUwNDFEXHUwNDNFXHUwNDFFXHUwNDNGXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwNDFGXHUwNDRGXHUyNTgwXHUwNDJGXHUwNDQwXHUwNDIwXHUwNDQxXHUwNDIxXHUwNDQyXHUwNDIyXHUwNDQzXHUwNDIzXHUwNDM2XHUwNDE2XHUwNDMyXHUwNDEyXHUwNDRDXHUwNDJDXHUyMTE2XHUwMEFEXHUwNDRCXHUwNDJCXHUwNDM3XHUwNDE3XHUwNDQ4XHUwNDI4XHUwNDREXHUwNDJEXHUwNDQ5XHUwNDI5XHUwNDQ3XHUwNDI3XHUwMEE3XHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NTVcIjogXCJjcDg1NVwiLFxuICBcImNzaWJtODU1XCI6IFwiY3A4NTVcIixcbiAgXCJjcDg1NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwNUQwXHUwNUQxXHUwNUQyXHUwNUQzXHUwNUQ0XHUwNUQ1XHUwNUQ2XHUwNUQ3XHUwNUQ4XHUwNUQ5XHUwNURBXHUwNURCXHUwNURDXHUwNUREXHUwNURFXHUwNURGXHUwNUUwXHUwNUUxXHUwNUUyXHUwNUUzXHUwNUU0XHUwNUU1XHUwNUU2XHUwNUU3XHUwNUU4XHUwNUU5XHUwNUVBXHVGRkZEXHUwMEEzXHVGRkZEXHUwMEQ3XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwMEFFXHUwMEFDXHUwMEJEXHUwMEJDXHVGRkZEXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHVGRkZEXHVGRkZEXHVGRkZEXHUwMEE5XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMEEyXHUwMEE1XHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHVGRkZEXHVGRkZEXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwMEE2XHVGRkZEXHUyNTgwXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwMEI1XHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwMEFGXHUwMEI0XHUwMEFEXHUwMEIxXHUyMDE3XHUwMEJFXHUwMEI2XHUwMEE3XHUwMEY3XHUwMEI4XHUwMEIwXHUwMEE4XHUwMEI3XHUwMEI5XHUwMEIzXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NTZcIjogXCJjcDg1NlwiLFxuICBcImNzaWJtODU2XCI6IFwiY3A4NTZcIixcbiAgXCJjcDg1N1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMEUwXHUwMEU1XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEVGXHUwMEVFXHUwMTMxXHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMEY0XHUwMEY2XHUwMEYyXHUwMEZCXHUwMEY5XHUwMTMwXHUwMEQ2XHUwMERDXHUwMEY4XHUwMEEzXHUwMEQ4XHUwMTVFXHUwMTVGXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMTFFXHUwMTFGXHUwMEJGXHUwMEFFXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwMEMxXHUwMEMyXHUwMEMwXHUwMEE5XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMEEyXHUwMEE1XHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwMEUzXHUwMEMzXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHUwMEJBXHUwMEFBXHUwMENBXHUwMENCXHUwMEM4XHVGRkZEXHUwMENEXHUwMENFXHUwMENGXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwMEE2XHUwMENDXHUyNTgwXHUwMEQzXHUwMERGXHUwMEQ0XHUwMEQyXHUwMEY1XHUwMEQ1XHUwMEI1XHVGRkZEXHUwMEQ3XHUwMERBXHUwMERCXHUwMEQ5XHUwMEVDXHUwMEZGXHUwMEFGXHUwMEI0XHUwMEFEXHUwMEIxXHVGRkZEXHUwMEJFXHUwMEI2XHUwMEE3XHUwMEY3XHUwMEI4XHUwMEIwXHUwMEE4XHUwMEI3XHUwMEI5XHUwMEIzXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NTdcIjogXCJjcDg1N1wiLFxuICBcImNzaWJtODU3XCI6IFwiY3A4NTdcIixcbiAgXCJjcDg1OFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMEUwXHUwMEU1XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEVGXHUwMEVFXHUwMEVDXHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMEY0XHUwMEY2XHUwMEYyXHUwMEZCXHUwMEY5XHUwMEZGXHUwMEQ2XHUwMERDXHUwMEY4XHUwMEEzXHUwMEQ4XHUwMEQ3XHUwMTkyXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMEFBXHUwMEJBXHUwMEJGXHUwMEFFXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUwMEMxXHUwMEMyXHUwMEMwXHUwMEE5XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUwMEEyXHUwMEE1XHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUwMEUzXHUwMEMzXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUwMEE0XHUwMEYwXHUwMEQwXHUwMENBXHUwMENCXHUwMEM4XHUyMEFDXHUwMENEXHUwMENFXHUwMENGXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUwMEE2XHUwMENDXHUyNTgwXHUwMEQzXHUwMERGXHUwMEQ0XHUwMEQyXHUwMEY1XHUwMEQ1XHUwMEI1XHUwMEZFXHUwMERFXHUwMERBXHUwMERCXHUwMEQ5XHUwMEZEXHUwMEREXHUwMEFGXHUwMEI0XHUwMEFEXHUwMEIxXHUyMDE3XHUwMEJFXHUwMEI2XHUwMEE3XHUwMEY3XHUwMEI4XHUwMEIwXHUwMEE4XHUwMEI3XHUwMEI5XHUwMEIzXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NThcIjogXCJjcDg1OFwiLFxuICBcImNzaWJtODU4XCI6IFwiY3A4NThcIixcbiAgXCJjcDg2MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEUzXHUwMEUwXHUwMEMxXHUwMEU3XHUwMEVBXHUwMENBXHUwMEU4XHUwMENEXHUwMEQ0XHUwMEVDXHUwMEMzXHUwMEMyXHUwMEM5XHUwMEMwXHUwMEM4XHUwMEY0XHUwMEY1XHUwMEYyXHUwMERBXHUwMEY5XHUwMENDXHUwMEQ1XHUwMERDXHUwMEEyXHUwMEEzXHUwMEQ5XHUyMEE3XHUwMEQzXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMEFBXHUwMEJBXHUwMEJGXHUwMEQyXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0IxXHUwMERGXHUwMzkzXHUwM0MwXHUwM0EzXHUwM0MzXHUwMEI1XHUwM0M0XHUwM0E2XHUwMzk4XHUwM0E5XHUwM0I0XHUyMjFFXHUwM0M2XHUwM0I1XHUyMjI5XHUyMjYxXHUwMEIxXHUyMjY1XHUyMjY0XHUyMzIwXHUyMzIxXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NjBcIjogXCJjcDg2MFwiLFxuICBcImNzaWJtODYwXCI6IFwiY3A4NjBcIixcbiAgXCJjcDg2MVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEU0XHUwMEUwXHUwMEU1XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEQwXHUwMEYwXHUwMERFXHUwMEM0XHUwMEM1XHUwMEM5XHUwMEU2XHUwMEM2XHUwMEY0XHUwMEY2XHUwMEZFXHUwMEZCXHUwMEREXHUwMEZEXHUwMEQ2XHUwMERDXHUwMEY4XHUwMEEzXHUwMEQ4XHUyMEE3XHUwMTkyXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEMxXHUwMENEXHUwMEQzXHUwMERBXHUwMEJGXHUyMzEwXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0IxXHUwMERGXHUwMzkzXHUwM0MwXHUwM0EzXHUwM0MzXHUwMEI1XHUwM0M0XHUwM0E2XHUwMzk4XHUwM0E5XHUwM0I0XHUyMjFFXHUwM0M2XHUwM0I1XHUyMjI5XHUyMjYxXHUwMEIxXHUyMjY1XHUyMjY0XHUyMzIwXHUyMzIxXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NjFcIjogXCJjcDg2MVwiLFxuICBcImNzaWJtODYxXCI6IFwiY3A4NjFcIixcbiAgXCJjcDg2MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwNUQwXHUwNUQxXHUwNUQyXHUwNUQzXHUwNUQ0XHUwNUQ1XHUwNUQ2XHUwNUQ3XHUwNUQ4XHUwNUQ5XHUwNURBXHUwNURCXHUwNURDXHUwNUREXHUwNURFXHUwNURGXHUwNUUwXHUwNUUxXHUwNUUyXHUwNUUzXHUwNUU0XHUwNUU1XHUwNUU2XHUwNUU3XHUwNUU4XHUwNUU5XHUwNUVBXHUwMEEyXHUwMEEzXHUwMEE1XHUyMEE3XHUwMTkyXHUwMEUxXHUwMEVEXHUwMEYzXHUwMEZBXHUwMEYxXHUwMEQxXHUwMEFBXHUwMEJBXHUwMEJGXHUyMzEwXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEExXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0IxXHUwMERGXHUwMzkzXHUwM0MwXHUwM0EzXHUwM0MzXHUwMEI1XHUwM0M0XHUwM0E2XHUwMzk4XHUwM0E5XHUwM0I0XHUyMjFFXHUwM0M2XHUwM0I1XHUyMjI5XHUyMjYxXHUwMEIxXHUyMjY1XHUyMjY0XHUyMzIwXHUyMzIxXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NjJcIjogXCJjcDg2MlwiLFxuICBcImNzaWJtODYyXCI6IFwiY3A4NjJcIixcbiAgXCJjcDg2M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM3XHUwMEZDXHUwMEU5XHUwMEUyXHUwMEMyXHUwMEUwXHUwMEI2XHUwMEU3XHUwMEVBXHUwMEVCXHUwMEU4XHUwMEVGXHUwMEVFXHUyMDE3XHUwMEMwXHUwMEE3XHUwMEM5XHUwMEM4XHUwMENBXHUwMEY0XHUwMENCXHUwMENGXHUwMEZCXHUwMEY5XHUwMEE0XHUwMEQ0XHUwMERDXHUwMEEyXHUwMEEzXHUwMEQ5XHUwMERCXHUwMTkyXHUwMEE2XHUwMEI0XHUwMEYzXHUwMEZBXHUwMEE4XHUwMEI4XHUwMEIzXHUwMEFGXHUwMENFXHUyMzEwXHUwMEFDXHUwMEJEXHUwMEJDXHUwMEJFXHUwMEFCXHUwMEJCXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwM0IxXHUwMERGXHUwMzkzXHUwM0MwXHUwM0EzXHUwM0MzXHUwMEI1XHUwM0M0XHUwM0E2XHUwMzk4XHUwM0E5XHUwM0I0XHUyMjFFXHUwM0M2XHUwM0I1XHUyMjI5XHUyMjYxXHUwMEIxXHUyMjY1XHUyMjY0XHUyMzIwXHUyMzIxXHUwMEY3XHUyMjQ4XHUwMEIwXHUyMjE5XHUwMEI3XHUyMjFBXHUyMDdGXHUwMEIyXHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm04NjNcIjogXCJjcDg2M1wiLFxuICBcImNzaWJtODYzXCI6IFwiY3A4NjNcIixcbiAgXCJjcDg2NFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXFx1MDAxNFxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyRcdTA2NkEmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9flx1MDA3Rlx1MDBCMFx1MDBCN1x1MjIxOVx1MjIxQVx1MjU5Mlx1MjUwMFx1MjUwMlx1MjUzQ1x1MjUyNFx1MjUyQ1x1MjUxQ1x1MjUzNFx1MjUxMFx1MjUwQ1x1MjUxNFx1MjUxOFx1MDNCMlx1MjIxRVx1MDNDNlx1MDBCMVx1MDBCRFx1MDBCQ1x1MjI0OFx1MDBBQlx1MDBCQlx1RkVGN1x1RkVGOFx1RkZGRFx1RkZGRFx1RkVGQlx1RkVGQ1x1RkZGRFx1MDBBMFx1MDBBRFx1RkU4Mlx1MDBBM1x1MDBBNFx1RkU4NFx1RkZGRFx1RkZGRFx1RkU4RVx1RkU4Rlx1RkU5NVx1RkU5OVx1MDYwQ1x1RkU5RFx1RkVBMVx1RkVBNVx1MDY2MFx1MDY2MVx1MDY2Mlx1MDY2M1x1MDY2NFx1MDY2NVx1MDY2Nlx1MDY2N1x1MDY2OFx1MDY2OVx1RkVEMVx1MDYxQlx1RkVCMVx1RkVCNVx1RkVCOVx1MDYxRlx1MDBBMlx1RkU4MFx1RkU4MVx1RkU4M1x1RkU4NVx1RkVDQVx1RkU4Qlx1RkU4RFx1RkU5MVx1RkU5M1x1RkU5N1x1RkU5Qlx1RkU5Rlx1RkVBM1x1RkVBN1x1RkVBOVx1RkVBQlx1RkVBRFx1RkVBRlx1RkVCM1x1RkVCN1x1RkVCQlx1RkVCRlx1RkVDMVx1RkVDNVx1RkVDQlx1RkVDRlx1MDBBNlx1MDBBQ1x1MDBGN1x1MDBEN1x1RkVDOVx1MDY0MFx1RkVEM1x1RkVEN1x1RkVEQlx1RkVERlx1RkVFM1x1RkVFN1x1RkVFQlx1RkVFRFx1RkVFRlx1RkVGM1x1RkVCRFx1RkVDQ1x1RkVDRVx1RkVDRFx1RkVFMVx1RkU3RFx1MDY1MVx1RkVFNVx1RkVFOVx1RkVFQ1x1RkVGMFx1RkVGMlx1RkVEMFx1RkVENVx1RkVGNVx1RkVGNlx1RkVERFx1RkVEOVx1RkVGMVx1MjVBMFx1RkZGRFwiXG4gIH0sXG4gIFwiaWJtODY0XCI6IFwiY3A4NjRcIixcbiAgXCJjc2libTg2NFwiOiBcImNwODY0XCIsXG4gIFwiY3A4NjVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDBDN1x1MDBGQ1x1MDBFOVx1MDBFMlx1MDBFNFx1MDBFMFx1MDBFNVx1MDBFN1x1MDBFQVx1MDBFQlx1MDBFOFx1MDBFRlx1MDBFRVx1MDBFQ1x1MDBDNFx1MDBDNVx1MDBDOVx1MDBFNlx1MDBDNlx1MDBGNFx1MDBGNlx1MDBGMlx1MDBGQlx1MDBGOVx1MDBGRlx1MDBENlx1MDBEQ1x1MDBGOFx1MDBBM1x1MDBEOFx1MjBBN1x1MDE5Mlx1MDBFMVx1MDBFRFx1MDBGM1x1MDBGQVx1MDBGMVx1MDBEMVx1MDBBQVx1MDBCQVx1MDBCRlx1MjMxMFx1MDBBQ1x1MDBCRFx1MDBCQ1x1MDBBMVx1MDBBQlx1MDBBNFx1MjU5MVx1MjU5Mlx1MjU5M1x1MjUwMlx1MjUyNFx1MjU2MVx1MjU2Mlx1MjU1Nlx1MjU1NVx1MjU2M1x1MjU1MVx1MjU1N1x1MjU1RFx1MjU1Q1x1MjU1Qlx1MjUxMFx1MjUxNFx1MjUzNFx1MjUyQ1x1MjUxQ1x1MjUwMFx1MjUzQ1x1MjU1RVx1MjU1Rlx1MjU1QVx1MjU1NFx1MjU2OVx1MjU2Nlx1MjU2MFx1MjU1MFx1MjU2Q1x1MjU2N1x1MjU2OFx1MjU2NFx1MjU2NVx1MjU1OVx1MjU1OFx1MjU1Mlx1MjU1M1x1MjU2Qlx1MjU2QVx1MjUxOFx1MjUwQ1x1MjU4OFx1MjU4NFx1MjU4Q1x1MjU5MFx1MjU4MFx1MDNCMVx1MDBERlx1MDM5M1x1MDNDMFx1MDNBM1x1MDNDM1x1MDBCNVx1MDNDNFx1MDNBNlx1MDM5OFx1MDNBOVx1MDNCNFx1MjIxRVx1MDNDNlx1MDNCNVx1MjIyOVx1MjI2MVx1MDBCMVx1MjI2NVx1MjI2NFx1MjMyMFx1MjMyMVx1MDBGN1x1MjI0OFx1MDBCMFx1MjIxOVx1MDBCN1x1MjIxQVx1MjA3Rlx1MDBCMlx1MjVBMFx1MDBBMFwiXG4gIH0sXG4gIFwiaWJtODY1XCI6IFwiY3A4NjVcIixcbiAgXCJjc2libTg2NVwiOiBcImNwODY1XCIsXG4gIFwiY3A4NjZcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDQxMFx1MDQxMVx1MDQxMlx1MDQxM1x1MDQxNFx1MDQxNVx1MDQxNlx1MDQxN1x1MDQxOFx1MDQxOVx1MDQxQVx1MDQxQlx1MDQxQ1x1MDQxRFx1MDQxRVx1MDQxRlx1MDQyMFx1MDQyMVx1MDQyMlx1MDQyM1x1MDQyNFx1MDQyNVx1MDQyNlx1MDQyN1x1MDQyOFx1MDQyOVx1MDQyQVx1MDQyQlx1MDQyQ1x1MDQyRFx1MDQyRVx1MDQyRlx1MDQzMFx1MDQzMVx1MDQzMlx1MDQzM1x1MDQzNFx1MDQzNVx1MDQzNlx1MDQzN1x1MDQzOFx1MDQzOVx1MDQzQVx1MDQzQlx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzRlx1MjU5MVx1MjU5Mlx1MjU5M1x1MjUwMlx1MjUyNFx1MjU2MVx1MjU2Mlx1MjU1Nlx1MjU1NVx1MjU2M1x1MjU1MVx1MjU1N1x1MjU1RFx1MjU1Q1x1MjU1Qlx1MjUxMFx1MjUxNFx1MjUzNFx1MjUyQ1x1MjUxQ1x1MjUwMFx1MjUzQ1x1MjU1RVx1MjU1Rlx1MjU1QVx1MjU1NFx1MjU2OVx1MjU2Nlx1MjU2MFx1MjU1MFx1MjU2Q1x1MjU2N1x1MjU2OFx1MjU2NFx1MjU2NVx1MjU1OVx1MjU1OFx1MjU1Mlx1MjU1M1x1MjU2Qlx1MjU2QVx1MjUxOFx1MjUwQ1x1MjU4OFx1MjU4NFx1MjU4Q1x1MjU5MFx1MjU4MFx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQ0NFx1MDQ0NVx1MDQ0Nlx1MDQ0N1x1MDQ0OFx1MDQ0OVx1MDQ0QVx1MDQ0Qlx1MDQ0Q1x1MDQ0RFx1MDQ0RVx1MDQ0Rlx1MDQwMVx1MDQ1MVx1MDQwNFx1MDQ1NFx1MDQwN1x1MDQ1N1x1MDQwRVx1MDQ1RVx1MDBCMFx1MjIxOVx1MDBCN1x1MjIxQVx1MjExNlx1MDBBNFx1MjVBMFx1MDBBMFwiXG4gIH0sXG4gIFwiaWJtODY2XCI6IFwiY3A4NjZcIixcbiAgXCJjc2libTg2NlwiOiBcImNwODY2XCIsXG4gIFwiY3A4NjlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MDM4Nlx1RkZGRFx1MDBCN1x1MDBBQ1x1MDBBNlx1MjAxOFx1MjAxOVx1MDM4OFx1MjAxNVx1MDM4OVx1MDM4QVx1MDNBQVx1MDM4Q1x1RkZGRFx1RkZGRFx1MDM4RVx1MDNBQlx1MDBBOVx1MDM4Rlx1MDBCMlx1MDBCM1x1MDNBQ1x1MDBBM1x1MDNBRFx1MDNBRVx1MDNBRlx1MDNDQVx1MDM5MFx1MDNDQ1x1MDNDRFx1MDM5MVx1MDM5Mlx1MDM5M1x1MDM5NFx1MDM5NVx1MDM5Nlx1MDM5N1x1MDBCRFx1MDM5OFx1MDM5OVx1MDBBQlx1MDBCQlx1MjU5MVx1MjU5Mlx1MjU5M1x1MjUwMlx1MjUyNFx1MDM5QVx1MDM5Qlx1MDM5Q1x1MDM5RFx1MjU2M1x1MjU1MVx1MjU1N1x1MjU1RFx1MDM5RVx1MDM5Rlx1MjUxMFx1MjUxNFx1MjUzNFx1MjUyQ1x1MjUxQ1x1MjUwMFx1MjUzQ1x1MDNBMFx1MDNBMVx1MjU1QVx1MjU1NFx1MjU2OVx1MjU2Nlx1MjU2MFx1MjU1MFx1MjU2Q1x1MDNBM1x1MDNBNFx1MDNBNVx1MDNBNlx1MDNBN1x1MDNBOFx1MDNBOVx1MDNCMVx1MDNCMlx1MDNCM1x1MjUxOFx1MjUwQ1x1MjU4OFx1MjU4NFx1MDNCNFx1MDNCNVx1MjU4MFx1MDNCNlx1MDNCN1x1MDNCOFx1MDNCOVx1MDNCQVx1MDNCQlx1MDNCQ1x1MDNCRFx1MDNCRVx1MDNCRlx1MDNDMFx1MDNDMVx1MDNDM1x1MDNDMlx1MDNDNFx1MDM4NFx1MDBBRFx1MDBCMVx1MDNDNVx1MDNDNlx1MDNDN1x1MDBBN1x1MDNDOFx1MDM4NVx1MDBCMFx1MDBBOFx1MDNDOVx1MDNDQlx1MDNCMFx1MDNDRVx1MjVBMFx1MDBBMFwiXG4gIH0sXG4gIFwiaWJtODY5XCI6IFwiY3A4NjlcIixcbiAgXCJjc2libTg2OVwiOiBcImNwODY5XCIsXG4gIFwiY3A5MjJcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MDBBMVx1MDBBMlx1MDBBM1x1MDBBNFx1MDBBNVx1MDBBNlx1MDBBN1x1MDBBOFx1MDBBOVx1MDBBQVx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MjAzRVx1MDBCMFx1MDBCMVx1MDBCMlx1MDBCM1x1MDBCNFx1MDBCNVx1MDBCNlx1MDBCN1x1MDBCOFx1MDBCOVx1MDBCQVx1MDBCQlx1MDBCQ1x1MDBCRFx1MDBCRVx1MDBCRlx1MDBDMFx1MDBDMVx1MDBDMlx1MDBDM1x1MDBDNFx1MDBDNVx1MDBDNlx1MDBDN1x1MDBDOFx1MDBDOVx1MDBDQVx1MDBDQlx1MDBDQ1x1MDBDRFx1MDBDRVx1MDBDRlx1MDE2MFx1MDBEMVx1MDBEMlx1MDBEM1x1MDBENFx1MDBENVx1MDBENlx1MDBEN1x1MDBEOFx1MDBEOVx1MDBEQVx1MDBEQlx1MDBEQ1x1MDBERFx1MDE3RFx1MDBERlx1MDBFMFx1MDBFMVx1MDBFMlx1MDBFM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDBFN1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQlx1MDBFQ1x1MDBFRFx1MDBFRVx1MDBFRlx1MDE2MVx1MDBGMVx1MDBGMlx1MDBGM1x1MDBGNFx1MDBGNVx1MDBGNlx1MDBGN1x1MDBGOFx1MDBGOVx1MDBGQVx1MDBGQlx1MDBGQ1x1MDBGRFx1MDE3RVx1MDBGRlwiXG4gIH0sXG4gIFwiaWJtOTIyXCI6IFwiY3A5MjJcIixcbiAgXCJjc2libTkyMlwiOiBcImNwOTIyXCIsXG4gIFwiY3AxMDQ2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdUZFODhcdTAwRDdcdTAwRjdcdUY4RjZcdUY4RjVcdUY4RjRcdUY4RjdcdUZFNzFcdTAwODhcdTI1QTBcdTI1MDJcdTI1MDBcdTI1MTBcdTI1MENcdTI1MTRcdTI1MThcdUZFNzlcdUZFN0JcdUZFN0RcdUZFN0ZcdUZFNzdcdUZFOEFcdUZFRjBcdUZFRjNcdUZFRjJcdUZFQ0VcdUZFQ0ZcdUZFRDBcdUZFRjZcdUZFRjhcdUZFRkFcdUZFRkNcdTAwQTBcdUY4RkFcdUY4RjlcdUY4RjhcdTAwQTRcdUY4RkJcdUZFOEJcdUZFOTFcdUZFOTdcdUZFOUJcdUZFOUZcdUZFQTNcdTA2MENcdTAwQURcdUZFQTdcdUZFQjNcdTA2NjBcdTA2NjFcdTA2NjJcdTA2NjNcdTA2NjRcdTA2NjVcdTA2NjZcdTA2NjdcdTA2NjhcdTA2NjlcdUZFQjdcdTA2MUJcdUZFQkJcdUZFQkZcdUZFQ0FcdTA2MUZcdUZFQ0JcdTA2MjFcdTA2MjJcdTA2MjNcdTA2MjRcdTA2MjVcdTA2MjZcdTA2MjdcdTA2MjhcdTA2MjlcdTA2MkFcdTA2MkJcdTA2MkNcdTA2MkRcdTA2MkVcdTA2MkZcdTA2MzBcdTA2MzFcdTA2MzJcdTA2MzNcdTA2MzRcdTA2MzVcdTA2MzZcdTA2MzdcdUZFQzdcdTA2MzlcdTA2M0FcdUZFQ0NcdUZFODJcdUZFODRcdUZFOEVcdUZFRDNcdTA2NDBcdTA2NDFcdTA2NDJcdTA2NDNcdTA2NDRcdTA2NDVcdTA2NDZcdTA2NDdcdTA2NDhcdTA2NDlcdTA2NEFcdTA2NEJcdTA2NENcdTA2NERcdTA2NEVcdTA2NEZcdTA2NTBcdTA2NTFcdTA2NTJcdUZFRDdcdUZFREJcdUZFREZcdUY4RkNcdUZFRjVcdUZFRjdcdUZFRjlcdUZFRkJcdUZFRTNcdUZFRTdcdUZFRUNcdUZFRTlcdUZGRkRcIlxuICB9LFxuICBcImlibTEwNDZcIjogXCJjcDEwNDZcIixcbiAgXCJjc2libTEwNDZcIjogXCJjcDEwNDZcIixcbiAgXCJjcDExMjRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MDQwMVx1MDQwMlx1MDQ5MFx1MDQwNFx1MDQwNVx1MDQwNlx1MDQwN1x1MDQwOFx1MDQwOVx1MDQwQVx1MDQwQlx1MDQwQ1x1MDBBRFx1MDQwRVx1MDQwRlx1MDQxMFx1MDQxMVx1MDQxMlx1MDQxM1x1MDQxNFx1MDQxNVx1MDQxNlx1MDQxN1x1MDQxOFx1MDQxOVx1MDQxQVx1MDQxQlx1MDQxQ1x1MDQxRFx1MDQxRVx1MDQxRlx1MDQyMFx1MDQyMVx1MDQyMlx1MDQyM1x1MDQyNFx1MDQyNVx1MDQyNlx1MDQyN1x1MDQyOFx1MDQyOVx1MDQyQVx1MDQyQlx1MDQyQ1x1MDQyRFx1MDQyRVx1MDQyRlx1MDQzMFx1MDQzMVx1MDQzMlx1MDQzM1x1MDQzNFx1MDQzNVx1MDQzNlx1MDQzN1x1MDQzOFx1MDQzOVx1MDQzQVx1MDQzQlx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQ0NFx1MDQ0NVx1MDQ0Nlx1MDQ0N1x1MDQ0OFx1MDQ0OVx1MDQ0QVx1MDQ0Qlx1MDQ0Q1x1MDQ0RFx1MDQ0RVx1MDQ0Rlx1MjExNlx1MDQ1MVx1MDQ1Mlx1MDQ5MVx1MDQ1NFx1MDQ1NVx1MDQ1Nlx1MDQ1N1x1MDQ1OFx1MDQ1OVx1MDQ1QVx1MDQ1Qlx1MDQ1Q1x1MDBBN1x1MDQ1RVx1MDQ1RlwiXG4gIH0sXG4gIFwiaWJtMTEyNFwiOiBcImNwMTEyNFwiLFxuICBcImNzaWJtMTEyNFwiOiBcImNwMTEyNFwiLFxuICBcImNwMTEyNVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwNDEwXHUwNDExXHUwNDEyXHUwNDEzXHUwNDE0XHUwNDE1XHUwNDE2XHUwNDE3XHUwNDE4XHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDFEXHUwNDFFXHUwNDFGXHUwNDIwXHUwNDIxXHUwNDIyXHUwNDIzXHUwNDI0XHUwNDI1XHUwNDI2XHUwNDI3XHUwNDI4XHUwNDI5XHUwNDJBXHUwNDJCXHUwNDJDXHUwNDJEXHUwNDJFXHUwNDJGXHUwNDMwXHUwNDMxXHUwNDMyXHUwNDMzXHUwNDM0XHUwNDM1XHUwNDM2XHUwNDM3XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDNGXHUyNTkxXHUyNTkyXHUyNTkzXHUyNTAyXHUyNTI0XHUyNTYxXHUyNTYyXHUyNTU2XHUyNTU1XHUyNTYzXHUyNTUxXHUyNTU3XHUyNTVEXHUyNTVDXHUyNTVCXHUyNTEwXHUyNTE0XHUyNTM0XHUyNTJDXHUyNTFDXHUyNTAwXHUyNTNDXHUyNTVFXHUyNTVGXHUyNTVBXHUyNTU0XHUyNTY5XHUyNTY2XHUyNTYwXHUyNTUwXHUyNTZDXHUyNTY3XHUyNTY4XHUyNTY0XHUyNTY1XHUyNTU5XHUyNTU4XHUyNTUyXHUyNTUzXHUyNTZCXHUyNTZBXHUyNTE4XHUyNTBDXHUyNTg4XHUyNTg0XHUyNThDXHUyNTkwXHUyNTgwXHUwNDQwXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDQ0XHUwNDQ1XHUwNDQ2XHUwNDQ3XHUwNDQ4XHUwNDQ5XHUwNDRBXHUwNDRCXHUwNDRDXHUwNDREXHUwNDRFXHUwNDRGXHUwNDAxXHUwNDUxXHUwNDkwXHUwNDkxXHUwNDA0XHUwNDU0XHUwNDA2XHUwNDU2XHUwNDA3XHUwNDU3XHUwMEI3XHUyMjFBXHUyMTE2XHUwMEE0XHUyNUEwXHUwMEEwXCJcbiAgfSxcbiAgXCJpYm0xMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiY3NpYm0xMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiY3AxMTI5XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwODBcdTAwODFcdTAwODJcdTAwODNcdTAwODRcdTAwODVcdTAwODZcdTAwODdcdTAwODhcdTAwODlcdTAwOEFcdTAwOEJcdTAwOENcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTAwOTFcdTAwOTJcdTAwOTNcdTAwOTRcdTAwOTVcdTAwOTZcdTAwOTdcdTAwOThcdTAwOTlcdTAwOUFcdTAwOUJcdTAwOUNcdTAwOURcdTAwOUVcdTAwOUZcdTAwQTBcdTAwQTFcdTAwQTJcdTAwQTNcdTAwQTRcdTAwQTVcdTAwQTZcdTAwQTdcdTAxNTNcdTAwQTlcdTAwQUFcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTAwQUZcdTAwQjBcdTAwQjFcdTAwQjJcdTAwQjNcdTAxNzhcdTAwQjVcdTAwQjZcdTAwQjdcdTAxNTJcdTAwQjlcdTAwQkFcdTAwQkJcdTAwQkNcdTAwQkRcdTAwQkVcdTAwQkZcdTAwQzBcdTAwQzFcdTAwQzJcdTAxMDJcdTAwQzRcdTAwQzVcdTAwQzZcdTAwQzdcdTAwQzhcdTAwQzlcdTAwQ0FcdTAwQ0JcdTAzMDBcdTAwQ0RcdTAwQ0VcdTAwQ0ZcdTAxMTBcdTAwRDFcdTAzMDlcdTAwRDNcdTAwRDRcdTAxQTBcdTAwRDZcdTAwRDdcdTAwRDhcdTAwRDlcdTAwREFcdTAwREJcdTAwRENcdTAxQUZcdTAzMDNcdTAwREZcdTAwRTBcdTAwRTFcdTAwRTJcdTAxMDNcdTAwRTRcdTAwRTVcdTAwRTZcdTAwRTdcdTAwRThcdTAwRTlcdTAwRUFcdTAwRUJcdTAzMDFcdTAwRURcdTAwRUVcdTAwRUZcdTAxMTFcdTAwRjFcdTAzMjNcdTAwRjNcdTAwRjRcdTAxQTFcdTAwRjZcdTAwRjdcdTAwRjhcdTAwRjlcdTAwRkFcdTAwRkJcdTAwRkNcdTAxQjBcdTIwQUJcdTAwRkZcIlxuICB9LFxuICBcImlibTExMjlcIjogXCJjcDExMjlcIixcbiAgXCJjc2libTExMjlcIjogXCJjcDExMjlcIixcbiAgXCJjcDExMzNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4N1x1MEU4OFx1MEVBQVx1MEU4QVx1MEU4RFx1MEU5NFx1MEU5NVx1MEU5Nlx1MEU5N1x1MEU5OVx1MEU5QVx1MEU5Qlx1MEU5Q1x1MEU5RFx1MEU5RVx1MEU5Rlx1MEVBMVx1MEVBMlx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQlx1MEVBRFx1MEVBRVx1RkZGRFx1RkZGRFx1RkZGRFx1MEVBRlx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCNFx1MEVCNVx1MEVCNlx1MEVCN1x1MEVCOFx1MEVCOVx1MEVCQ1x1MEVCMVx1MEVCQlx1MEVCRFx1RkZGRFx1RkZGRFx1RkZGRFx1MEVDMFx1MEVDMVx1MEVDMlx1MEVDM1x1MEVDNFx1MEVDOFx1MEVDOVx1MEVDQVx1MEVDQlx1MEVDQ1x1MEVDRFx1MEVDNlx1RkZGRFx1MEVEQ1x1MEVERFx1MjBBRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MEVEMFx1MEVEMVx1MEVEMlx1MEVEM1x1MEVENFx1MEVENVx1MEVENlx1MEVEN1x1MEVEOFx1MEVEOVx1RkZGRFx1RkZGRFx1MDBBMlx1MDBBQ1x1MDBBNlx1RkZGRFwiXG4gIH0sXG4gIFwiaWJtMTEzM1wiOiBcImNwMTEzM1wiLFxuICBcImNzaWJtMTEzM1wiOiBcImNwMTEzM1wiLFxuICBcImNwMTE2MVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHUwRTQ4XHUwRTAxXHUwRTAyXHUwRTAzXHUwRTA0XHUwRTA1XHUwRTA2XHUwRTA3XHUwRTA4XHUwRTA5XHUwRTBBXHUwRTBCXHUwRTBDXHUwRTBEXHUwRTBFXHUwRTBGXHUwRTEwXHUwRTExXHUwRTEyXHUwRTEzXHUwRTE0XHUwRTE1XHUwRTE2XHUwRTE3XHUwRTE4XHUwRTE5XHUwRTFBXHUwRTFCXHUwRTFDXHUwRTFEXHUwRTFFXHUwRTFGXHUwRTIwXHUwRTIxXHUwRTIyXHUwRTIzXHUwRTI0XHUwRTI1XHUwRTI2XHUwRTI3XHUwRTI4XHUwRTI5XHUwRTJBXHUwRTJCXHUwRTJDXHUwRTJEXHUwRTJFXHUwRTJGXHUwRTMwXHUwRTMxXHUwRTMyXHUwRTMzXHUwRTM0XHUwRTM1XHUwRTM2XHUwRTM3XHUwRTM4XHUwRTM5XHUwRTNBXHUwRTQ5XHUwRTRBXHUwRTRCXHUyMEFDXHUwRTNGXHUwRTQwXHUwRTQxXHUwRTQyXHUwRTQzXHUwRTQ0XHUwRTQ1XHUwRTQ2XHUwRTQ3XHUwRTQ4XHUwRTQ5XHUwRTRBXHUwRTRCXHUwRTRDXHUwRTREXHUwRTRFXHUwRTRGXHUwRTUwXHUwRTUxXHUwRTUyXHUwRTUzXHUwRTU0XHUwRTU1XHUwRTU2XHUwRTU3XHUwRTU4XHUwRTU5XHUwRTVBXHUwRTVCXHUwMEEyXHUwMEFDXHUwMEE2XHUwMEEwXCJcbiAgfSxcbiAgXCJpYm0xMTYxXCI6IFwiY3AxMTYxXCIsXG4gIFwiY3NpYm0xMTYxXCI6IFwiY3AxMTYxXCIsXG4gIFwiY3AxMTYyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTIwQUNcdTAwODFcdTAwODJcdTAwODNcdTAwODRcdTIwMjZcdTAwODZcdTAwODdcdTAwODhcdTAwODlcdTAwOEFcdTAwOEJcdTAwOENcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdTAwOThcdTAwOTlcdTAwOUFcdTAwOUJcdTAwOUNcdTAwOURcdTAwOUVcdTAwOUZcdTAwQTBcdTBFMDFcdTBFMDJcdTBFMDNcdTBFMDRcdTBFMDVcdTBFMDZcdTBFMDdcdTBFMDhcdTBFMDlcdTBFMEFcdTBFMEJcdTBFMENcdTBFMERcdTBFMEVcdTBFMEZcdTBFMTBcdTBFMTFcdTBFMTJcdTBFMTNcdTBFMTRcdTBFMTVcdTBFMTZcdTBFMTdcdTBFMThcdTBFMTlcdTBFMUFcdTBFMUJcdTBFMUNcdTBFMURcdTBFMUVcdTBFMUZcdTBFMjBcdTBFMjFcdTBFMjJcdTBFMjNcdTBFMjRcdTBFMjVcdTBFMjZcdTBFMjdcdTBFMjhcdTBFMjlcdTBFMkFcdTBFMkJcdTBFMkNcdTBFMkRcdTBFMkVcdTBFMkZcdTBFMzBcdTBFMzFcdTBFMzJcdTBFMzNcdTBFMzRcdTBFMzVcdTBFMzZcdTBFMzdcdTBFMzhcdTBFMzlcdTBFM0FcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdTBFM0ZcdTBFNDBcdTBFNDFcdTBFNDJcdTBFNDNcdTBFNDRcdTBFNDVcdTBFNDZcdTBFNDdcdTBFNDhcdTBFNDlcdTBFNEFcdTBFNEJcdTBFNENcdTBFNERcdTBFNEVcdTBFNEZcdTBFNTBcdTBFNTFcdTBFNTJcdTBFNTNcdTBFNTRcdTBFNTVcdTBFNTZcdTBFNTdcdTBFNThcdTBFNTlcdTBFNUFcdTBFNUJcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcIlxuICB9LFxuICBcImlibTExNjJcIjogXCJjcDExNjJcIixcbiAgXCJjc2libTExNjJcIjogXCJjcDExNjJcIixcbiAgXCJjcDExNjNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1MDBBMVx1MDBBMlx1MDBBM1x1MjBBQ1x1MDBBNVx1MDBBNlx1MDBBN1x1MDE1M1x1MDBBOVx1MDBBQVx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MDBBRlx1MDBCMFx1MDBCMVx1MDBCMlx1MDBCM1x1MDE3OFx1MDBCNVx1MDBCNlx1MDBCN1x1MDE1Mlx1MDBCOVx1MDBCQVx1MDBCQlx1MDBCQ1x1MDBCRFx1MDBCRVx1MDBCRlx1MDBDMFx1MDBDMVx1MDBDMlx1MDEwMlx1MDBDNFx1MDBDNVx1MDBDNlx1MDBDN1x1MDBDOFx1MDBDOVx1MDBDQVx1MDBDQlx1MDMwMFx1MDBDRFx1MDBDRVx1MDBDRlx1MDExMFx1MDBEMVx1MDMwOVx1MDBEM1x1MDBENFx1MDFBMFx1MDBENlx1MDBEN1x1MDBEOFx1MDBEOVx1MDBEQVx1MDBEQlx1MDBEQ1x1MDFBRlx1MDMwM1x1MDBERlx1MDBFMFx1MDBFMVx1MDBFMlx1MDEwM1x1MDBFNFx1MDBFNVx1MDBFNlx1MDBFN1x1MDBFOFx1MDBFOVx1MDBFQVx1MDBFQlx1MDMwMVx1MDBFRFx1MDBFRVx1MDBFRlx1MDExMVx1MDBGMVx1MDMyM1x1MDBGM1x1MDBGNFx1MDFBMVx1MDBGNlx1MDBGN1x1MDBGOFx1MDBGOVx1MDBGQVx1MDBGQlx1MDBGQ1x1MDFCMFx1MjBBQlx1MDBGRlwiXG4gIH0sXG4gIFwiaWJtMTE2M1wiOiBcImNwMTE2M1wiLFxuICBcImNzaWJtMTE2M1wiOiBcImNwMTE2M1wiLFxuICBcIm1hY2Nyb2F0aWFuXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwQzRcdTAwQzVcdTAwQzdcdTAwQzlcdTAwRDFcdTAwRDZcdTAwRENcdTAwRTFcdTAwRTBcdTAwRTJcdTAwRTRcdTAwRTNcdTAwRTVcdTAwRTdcdTAwRTlcdTAwRThcdTAwRUFcdTAwRUJcdTAwRURcdTAwRUNcdTAwRUVcdTAwRUZcdTAwRjFcdTAwRjNcdTAwRjJcdTAwRjRcdTAwRjZcdTAwRjVcdTAwRkFcdTAwRjlcdTAwRkJcdTAwRkNcdTIwMjBcdTAwQjBcdTAwQTJcdTAwQTNcdTAwQTdcdTIwMjJcdTAwQjZcdTAwREZcdTAwQUVcdTAxNjBcdTIxMjJcdTAwQjRcdTAwQThcdTIyNjBcdTAxN0RcdTAwRDhcdTIyMUVcdTAwQjFcdTIyNjRcdTIyNjVcdTIyMDZcdTAwQjVcdTIyMDJcdTIyMTFcdTIyMEZcdTAxNjFcdTIyMkJcdTAwQUFcdTAwQkFcdTIxMjZcdTAxN0VcdTAwRjhcdTAwQkZcdTAwQTFcdTAwQUNcdTIyMUFcdTAxOTJcdTIyNDhcdTAxMDZcdTAwQUJcdTAxMENcdTIwMjZcdTAwQTBcdTAwQzBcdTAwQzNcdTAwRDVcdTAxNTJcdTAxNTNcdTAxMTBcdTIwMTRcdTIwMUNcdTIwMURcdTIwMThcdTIwMTlcdTAwRjdcdTI1Q0FcdUZGRkRcdTAwQTlcdTIwNDRcdTAwQTRcdTIwMzlcdTIwM0FcdTAwQzZcdTAwQkJcdTIwMTNcdTAwQjdcdTIwMUFcdTIwMUVcdTIwMzBcdTAwQzJcdTAxMDdcdTAwQzFcdTAxMERcdTAwQzhcdTAwQ0RcdTAwQ0VcdTAwQ0ZcdTAwQ0NcdTAwRDNcdTAwRDRcdTAxMTFcdTAwRDJcdTAwREFcdTAwREJcdTAwRDlcdTAxMzFcdTAyQzZcdTAyRENcdTAwQUZcdTAzQzBcdTAwQ0JcdTAyREFcdTAwQjhcdTAwQ0FcdTAwRTZcdTAyQzdcIlxuICB9LFxuICBcIm1hY2N5cmlsbGljXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTA0MTBcdTA0MTFcdTA0MTJcdTA0MTNcdTA0MTRcdTA0MTVcdTA0MTZcdTA0MTdcdTA0MThcdTA0MTlcdTA0MUFcdTA0MUJcdTA0MUNcdTA0MURcdTA0MUVcdTA0MUZcdTA0MjBcdTA0MjFcdTA0MjJcdTA0MjNcdTA0MjRcdTA0MjVcdTA0MjZcdTA0MjdcdTA0MjhcdTA0MjlcdTA0MkFcdTA0MkJcdTA0MkNcdTA0MkRcdTA0MkVcdTA0MkZcdTIwMjBcdTAwQjBcdTAwQTJcdTAwQTNcdTAwQTdcdTIwMjJcdTAwQjZcdTA0MDZcdTAwQUVcdTAwQTlcdTIxMjJcdTA0MDJcdTA0NTJcdTIyNjBcdTA0MDNcdTA0NTNcdTIyMUVcdTAwQjFcdTIyNjRcdTIyNjVcdTA0NTZcdTAwQjVcdTIyMDJcdTA0MDhcdTA0MDRcdTA0NTRcdTA0MDdcdTA0NTdcdTA0MDlcdTA0NTlcdTA0MEFcdTA0NUFcdTA0NThcdTA0MDVcdTAwQUNcdTIyMUFcdTAxOTJcdTIyNDhcdTIyMDZcdTAwQUJcdTAwQkJcdTIwMjZcdTAwQTBcdTA0MEJcdTA0NUJcdTA0MENcdTA0NUNcdTA0NTVcdTIwMTNcdTIwMTRcdTIwMUNcdTIwMURcdTIwMThcdTIwMTlcdTAwRjdcdTIwMUVcdTA0MEVcdTA0NUVcdTA0MEZcdTA0NUZcdTIxMTZcdTA0MDFcdTA0NTFcdTA0NEZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0MzZcdTA0MzdcdTA0MzhcdTA0MzlcdTA0M0FcdTA0M0JcdTA0M0NcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0NDFcdTA0NDJcdTA0NDNcdTA0NDRcdTA0NDVcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NERcdTA0NEVcdTAwQTRcIlxuICB9LFxuICBcIm1hY2dyZWVrXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwQzRcdTAwQjlcdTAwQjJcdTAwQzlcdTAwQjNcdTAwRDZcdTAwRENcdTAzODVcdTAwRTBcdTAwRTJcdTAwRTRcdTAzODRcdTAwQThcdTAwRTdcdTAwRTlcdTAwRThcdTAwRUFcdTAwRUJcdTAwQTNcdTIxMjJcdTAwRUVcdTAwRUZcdTIwMjJcdTAwQkRcdTIwMzBcdTAwRjRcdTAwRjZcdTAwQTZcdTAwQURcdTAwRjlcdTAwRkJcdTAwRkNcdTIwMjBcdTAzOTNcdTAzOTRcdTAzOThcdTAzOUJcdTAzOUVcdTAzQTBcdTAwREZcdTAwQUVcdTAwQTlcdTAzQTNcdTAzQUFcdTAwQTdcdTIyNjBcdTAwQjBcdTAzODdcdTAzOTFcdTAwQjFcdTIyNjRcdTIyNjVcdTAwQTVcdTAzOTJcdTAzOTVcdTAzOTZcdTAzOTdcdTAzOTlcdTAzOUFcdTAzOUNcdTAzQTZcdTAzQUJcdTAzQThcdTAzQTlcdTAzQUNcdTAzOURcdTAwQUNcdTAzOUZcdTAzQTFcdTIyNDhcdTAzQTRcdTAwQUJcdTAwQkJcdTIwMjZcdTAwQTBcdTAzQTVcdTAzQTdcdTAzODZcdTAzODhcdTAxNTNcdTIwMTNcdTIwMTVcdTIwMUNcdTIwMURcdTIwMThcdTIwMTlcdTAwRjdcdTAzODlcdTAzOEFcdTAzOENcdTAzOEVcdTAzQURcdTAzQUVcdTAzQUZcdTAzQ0NcdTAzOEZcdTAzQ0RcdTAzQjFcdTAzQjJcdTAzQzhcdTAzQjRcdTAzQjVcdTAzQzZcdTAzQjNcdTAzQjdcdTAzQjlcdTAzQkVcdTAzQkFcdTAzQkJcdTAzQkNcdTAzQkRcdTAzQkZcdTAzQzBcdTAzQ0VcdTAzQzFcdTAzQzNcdTAzQzRcdTAzQjhcdTAzQzlcdTAzQzJcdTAzQzdcdTAzQzVcdTAzQjZcdTAzQ0FcdTAzQ0JcdTAzOTBcdTAzQjBcdUZGRkRcIlxuICB9LFxuICBcIm1hY2ljZWxhbmRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDBDNFx1MDBDNVx1MDBDN1x1MDBDOVx1MDBEMVx1MDBENlx1MDBEQ1x1MDBFMVx1MDBFMFx1MDBFMlx1MDBFNFx1MDBFM1x1MDBFNVx1MDBFN1x1MDBFOVx1MDBFOFx1MDBFQVx1MDBFQlx1MDBFRFx1MDBFQ1x1MDBFRVx1MDBFRlx1MDBGMVx1MDBGM1x1MDBGMlx1MDBGNFx1MDBGNlx1MDBGNVx1MDBGQVx1MDBGOVx1MDBGQlx1MDBGQ1x1MDBERFx1MDBCMFx1MDBBMlx1MDBBM1x1MDBBN1x1MjAyMlx1MDBCNlx1MDBERlx1MDBBRVx1MDBBOVx1MjEyMlx1MDBCNFx1MDBBOFx1MjI2MFx1MDBDNlx1MDBEOFx1MjIxRVx1MDBCMVx1MjI2NFx1MjI2NVx1MDBBNVx1MDBCNVx1MjIwMlx1MjIxMVx1MjIwRlx1MDNDMFx1MjIyQlx1MDBBQVx1MDBCQVx1MjEyNlx1MDBFNlx1MDBGOFx1MDBCRlx1MDBBMVx1MDBBQ1x1MjIxQVx1MDE5Mlx1MjI0OFx1MjIwNlx1MDBBQlx1MDBCQlx1MjAyNlx1MDBBMFx1MDBDMFx1MDBDM1x1MDBENVx1MDE1Mlx1MDE1M1x1MjAxM1x1MjAxNFx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVx1MDBGN1x1MjVDQVx1MDBGRlx1MDE3OFx1MjA0NFx1MDBBNFx1MDBEMFx1MDBGMFx1MDBERVx1MDBGRVx1MDBGRFx1MDBCN1x1MjAxQVx1MjAxRVx1MjAzMFx1MDBDMlx1MDBDQVx1MDBDMVx1MDBDQlx1MDBDOFx1MDBDRFx1MDBDRVx1MDBDRlx1MDBDQ1x1MDBEM1x1MDBENFx1RkZGRFx1MDBEMlx1MDBEQVx1MDBEQlx1MDBEOVx1MDEzMVx1MDJDNlx1MDJEQ1x1MDBBRlx1MDJEOFx1MDJEOVx1MDJEQVx1MDBCOFx1MDJERFx1MDJEQlx1MDJDN1wiXG4gIH0sXG4gIFwibWFjcm9tYW5cIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDBDNFx1MDBDNVx1MDBDN1x1MDBDOVx1MDBEMVx1MDBENlx1MDBEQ1x1MDBFMVx1MDBFMFx1MDBFMlx1MDBFNFx1MDBFM1x1MDBFNVx1MDBFN1x1MDBFOVx1MDBFOFx1MDBFQVx1MDBFQlx1MDBFRFx1MDBFQ1x1MDBFRVx1MDBFRlx1MDBGMVx1MDBGM1x1MDBGMlx1MDBGNFx1MDBGNlx1MDBGNVx1MDBGQVx1MDBGOVx1MDBGQlx1MDBGQ1x1MjAyMFx1MDBCMFx1MDBBMlx1MDBBM1x1MDBBN1x1MjAyMlx1MDBCNlx1MDBERlx1MDBBRVx1MDBBOVx1MjEyMlx1MDBCNFx1MDBBOFx1MjI2MFx1MDBDNlx1MDBEOFx1MjIxRVx1MDBCMVx1MjI2NFx1MjI2NVx1MDBBNVx1MDBCNVx1MjIwMlx1MjIxMVx1MjIwRlx1MDNDMFx1MjIyQlx1MDBBQVx1MDBCQVx1MjEyNlx1MDBFNlx1MDBGOFx1MDBCRlx1MDBBMVx1MDBBQ1x1MjIxQVx1MDE5Mlx1MjI0OFx1MjIwNlx1MDBBQlx1MDBCQlx1MjAyNlx1MDBBMFx1MDBDMFx1MDBDM1x1MDBENVx1MDE1Mlx1MDE1M1x1MjAxM1x1MjAxNFx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVx1MDBGN1x1MjVDQVx1MDBGRlx1MDE3OFx1MjA0NFx1MDBBNFx1MjAzOVx1MjAzQVx1RkIwMVx1RkIwMlx1MjAyMVx1MDBCN1x1MjAxQVx1MjAxRVx1MjAzMFx1MDBDMlx1MDBDQVx1MDBDMVx1MDBDQlx1MDBDOFx1MDBDRFx1MDBDRVx1MDBDRlx1MDBDQ1x1MDBEM1x1MDBENFx1RkZGRFx1MDBEMlx1MDBEQVx1MDBEQlx1MDBEOVx1MDEzMVx1MDJDNlx1MDJEQ1x1MDBBRlx1MDJEOFx1MDJEOVx1MDJEQVx1MDBCOFx1MDJERFx1MDJEQlx1MDJDN1wiXG4gIH0sXG4gIFwibWFjcm9tYW5pYVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM0XHUwMEM1XHUwMEM3XHUwMEM5XHUwMEQxXHUwMEQ2XHUwMERDXHUwMEUxXHUwMEUwXHUwMEUyXHUwMEU0XHUwMEUzXHUwMEU1XHUwMEU3XHUwMEU5XHUwMEU4XHUwMEVBXHUwMEVCXHUwMEVEXHUwMEVDXHUwMEVFXHUwMEVGXHUwMEYxXHUwMEYzXHUwMEYyXHUwMEY0XHUwMEY2XHUwMEY1XHUwMEZBXHUwMEY5XHUwMEZCXHUwMEZDXHUyMDIwXHUwMEIwXHUwMEEyXHUwMEEzXHUwMEE3XHUyMDIyXHUwMEI2XHUwMERGXHUwMEFFXHUwMEE5XHUyMTIyXHUwMEI0XHUwMEE4XHUyMjYwXHUwMTAyXHUwMTVFXHUyMjFFXHUwMEIxXHUyMjY0XHUyMjY1XHUwMEE1XHUwMEI1XHUyMjAyXHUyMjExXHUyMjBGXHUwM0MwXHUyMjJCXHUwMEFBXHUwMEJBXHUyMTI2XHUwMTAzXHUwMTVGXHUwMEJGXHUwMEExXHUwMEFDXHUyMjFBXHUwMTkyXHUyMjQ4XHUyMjA2XHUwMEFCXHUwMEJCXHUyMDI2XHUwMEEwXHUwMEMwXHUwMEMzXHUwMEQ1XHUwMTUyXHUwMTUzXHUyMDEzXHUyMDE0XHUyMDFDXHUyMDFEXHUyMDE4XHUyMDE5XHUwMEY3XHUyNUNBXHUwMEZGXHUwMTc4XHUyMDQ0XHUwMEE0XHUyMDM5XHUyMDNBXHUwMTYyXHUwMTYzXHUyMDIxXHUwMEI3XHUyMDFBXHUyMDFFXHUyMDMwXHUwMEMyXHUwMENBXHUwMEMxXHUwMENCXHUwMEM4XHUwMENEXHUwMENFXHUwMENGXHUwMENDXHUwMEQzXHUwMEQ0XHVGRkZEXHUwMEQyXHUwMERBXHUwMERCXHUwMEQ5XHUwMTMxXHUwMkM2XHUwMkRDXHUwMEFGXHUwMkQ4XHUwMkQ5XHUwMkRBXHUwMEI4XHUwMkREXHUwMkRCXHUwMkM3XCJcbiAgfSxcbiAgXCJtYWN0aGFpXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwQUJcdTAwQkJcdTIwMjZcdUY4OENcdUY4OEZcdUY4OTJcdUY4OTVcdUY4OThcdUY4OEJcdUY4OEVcdUY4OTFcdUY4OTRcdUY4OTdcdTIwMUNcdTIwMURcdUY4OTlcdUZGRkRcdTIwMjJcdUY4ODRcdUY4ODlcdUY4ODVcdUY4ODZcdUY4ODdcdUY4ODhcdUY4OEFcdUY4OERcdUY4OTBcdUY4OTNcdUY4OTZcdTIwMThcdTIwMTlcdUZGRkRcdTAwQTBcdTBFMDFcdTBFMDJcdTBFMDNcdTBFMDRcdTBFMDVcdTBFMDZcdTBFMDdcdTBFMDhcdTBFMDlcdTBFMEFcdTBFMEJcdTBFMENcdTBFMERcdTBFMEVcdTBFMEZcdTBFMTBcdTBFMTFcdTBFMTJcdTBFMTNcdTBFMTRcdTBFMTVcdTBFMTZcdTBFMTdcdTBFMThcdTBFMTlcdTBFMUFcdTBFMUJcdTBFMUNcdTBFMURcdTBFMUVcdTBFMUZcdTBFMjBcdTBFMjFcdTBFMjJcdTBFMjNcdTBFMjRcdTBFMjVcdTBFMjZcdTBFMjdcdTBFMjhcdTBFMjlcdTBFMkFcdTBFMkJcdTBFMkNcdTBFMkRcdTBFMkVcdTBFMkZcdTBFMzBcdTBFMzFcdTBFMzJcdTBFMzNcdTBFMzRcdTBFMzVcdTBFMzZcdTBFMzdcdTBFMzhcdTBFMzlcdTBFM0FcdUZFRkZcdTIwMEJcdTIwMTNcdTIwMTRcdTBFM0ZcdTBFNDBcdTBFNDFcdTBFNDJcdTBFNDNcdTBFNDRcdTBFNDVcdTBFNDZcdTBFNDdcdTBFNDhcdTBFNDlcdTBFNEFcdTBFNEJcdTBFNENcdTBFNERcdTIxMjJcdTBFNEZcdTBFNTBcdTBFNTFcdTBFNTJcdTBFNTNcdTBFNTRcdTBFNTVcdTBFNTZcdTBFNTdcdTBFNThcdTBFNTlcdTAwQUVcdTAwQTlcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcIlxuICB9LFxuICBcIm1hY3R1cmtpc2hcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDBDNFx1MDBDNVx1MDBDN1x1MDBDOVx1MDBEMVx1MDBENlx1MDBEQ1x1MDBFMVx1MDBFMFx1MDBFMlx1MDBFNFx1MDBFM1x1MDBFNVx1MDBFN1x1MDBFOVx1MDBFOFx1MDBFQVx1MDBFQlx1MDBFRFx1MDBFQ1x1MDBFRVx1MDBFRlx1MDBGMVx1MDBGM1x1MDBGMlx1MDBGNFx1MDBGNlx1MDBGNVx1MDBGQVx1MDBGOVx1MDBGQlx1MDBGQ1x1MjAyMFx1MDBCMFx1MDBBMlx1MDBBM1x1MDBBN1x1MjAyMlx1MDBCNlx1MDBERlx1MDBBRVx1MDBBOVx1MjEyMlx1MDBCNFx1MDBBOFx1MjI2MFx1MDBDNlx1MDBEOFx1MjIxRVx1MDBCMVx1MjI2NFx1MjI2NVx1MDBBNVx1MDBCNVx1MjIwMlx1MjIxMVx1MjIwRlx1MDNDMFx1MjIyQlx1MDBBQVx1MDBCQVx1MjEyNlx1MDBFNlx1MDBGOFx1MDBCRlx1MDBBMVx1MDBBQ1x1MjIxQVx1MDE5Mlx1MjI0OFx1MjIwNlx1MDBBQlx1MDBCQlx1MjAyNlx1MDBBMFx1MDBDMFx1MDBDM1x1MDBENVx1MDE1Mlx1MDE1M1x1MjAxM1x1MjAxNFx1MjAxQ1x1MjAxRFx1MjAxOFx1MjAxOVx1MDBGN1x1MjVDQVx1MDBGRlx1MDE3OFx1MDExRVx1MDExRlx1MDEzMFx1MDEzMVx1MDE1RVx1MDE1Rlx1MjAyMVx1MDBCN1x1MjAxQVx1MjAxRVx1MjAzMFx1MDBDMlx1MDBDQVx1MDBDMVx1MDBDQlx1MDBDOFx1MDBDRFx1MDBDRVx1MDBDRlx1MDBDQ1x1MDBEM1x1MDBENFx1RkZGRFx1MDBEMlx1MDBEQVx1MDBEQlx1MDBEOVx1RkZGRFx1MDJDNlx1MDJEQ1x1MDBBRlx1MDJEOFx1MDJEOVx1MDJEQVx1MDBCOFx1MDJERFx1MDJEQlx1MDJDN1wiXG4gIH0sXG4gIFwibWFjdWtyYWluZVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwNDEwXHUwNDExXHUwNDEyXHUwNDEzXHUwNDE0XHUwNDE1XHUwNDE2XHUwNDE3XHUwNDE4XHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDFEXHUwNDFFXHUwNDFGXHUwNDIwXHUwNDIxXHUwNDIyXHUwNDIzXHUwNDI0XHUwNDI1XHUwNDI2XHUwNDI3XHUwNDI4XHUwNDI5XHUwNDJBXHUwNDJCXHUwNDJDXHUwNDJEXHUwNDJFXHUwNDJGXHUyMDIwXHUwMEIwXHUwNDkwXHUwMEEzXHUwMEE3XHUyMDIyXHUwMEI2XHUwNDA2XHUwMEFFXHUwMEE5XHUyMTIyXHUwNDAyXHUwNDUyXHUyMjYwXHUwNDAzXHUwNDUzXHUyMjFFXHUwMEIxXHUyMjY0XHUyMjY1XHUwNDU2XHUwMEI1XHUwNDkxXHUwNDA4XHUwNDA0XHUwNDU0XHUwNDA3XHUwNDU3XHUwNDA5XHUwNDU5XHUwNDBBXHUwNDVBXHUwNDU4XHUwNDA1XHUwMEFDXHUyMjFBXHUwMTkyXHUyMjQ4XHUyMjA2XHUwMEFCXHUwMEJCXHUyMDI2XHUwMEEwXHUwNDBCXHUwNDVCXHUwNDBDXHUwNDVDXHUwNDU1XHUyMDEzXHUyMDE0XHUyMDFDXHUyMDFEXHUyMDE4XHUyMDE5XHUwMEY3XHUyMDFFXHUwNDBFXHUwNDVFXHUwNDBGXHUwNDVGXHUyMTE2XHUwNDAxXHUwNDUxXHUwNDRGXHUwNDMwXHUwNDMxXHUwNDMyXHUwNDMzXHUwNDM0XHUwNDM1XHUwNDM2XHUwNDM3XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDQwXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDQ0XHUwNDQ1XHUwNDQ2XHUwNDQ3XHUwNDQ4XHUwNDQ5XHUwNDRBXHUwNDRCXHUwNDRDXHUwNDREXHUwNDRFXHUwMEE0XCJcbiAgfSxcbiAgXCJrb2k4clwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUyNTAwXHUyNTAyXHUyNTBDXHUyNTEwXHUyNTE0XHUyNTE4XHUyNTFDXHUyNTI0XHUyNTJDXHUyNTM0XHUyNTNDXHUyNTgwXHUyNTg0XHUyNTg4XHUyNThDXHUyNTkwXHUyNTkxXHUyNTkyXHUyNTkzXHUyMzIwXHUyNUEwXHUyMjE5XHUyMjFBXHUyMjQ4XHUyMjY0XHUyMjY1XHUwMEEwXHUyMzIxXHUwMEIwXHUwMEIyXHUwMEI3XHUwMEY3XHUyNTUwXHUyNTUxXHUyNTUyXHUwNDUxXHUyNTUzXHUyNTU0XHUyNTU1XHUyNTU2XHUyNTU3XHUyNTU4XHUyNTU5XHUyNTVBXHUyNTVCXHUyNTVDXHUyNTVEXHUyNTVFXHUyNTVGXHUyNTYwXHUyNTYxXHUwNDAxXHUyNTYyXHUyNTYzXHUyNTY0XHUyNTY1XHUyNTY2XHUyNTY3XHUyNTY4XHUyNTY5XHUyNTZBXHUyNTZCXHUyNTZDXHUwMEE5XHUwNDRFXHUwNDMwXHUwNDMxXHUwNDQ2XHUwNDM0XHUwNDM1XHUwNDQ0XHUwNDMzXHUwNDQ1XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDRGXHUwNDQwXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDM2XHUwNDMyXHUwNDRDXHUwNDRCXHUwNDM3XHUwNDQ4XHUwNDREXHUwNDQ5XHUwNDQ3XHUwNDRBXHUwNDJFXHUwNDEwXHUwNDExXHUwNDI2XHUwNDE0XHUwNDE1XHUwNDI0XHUwNDEzXHUwNDI1XHUwNDE4XHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDFEXHUwNDFFXHUwNDFGXHUwNDJGXHUwNDIwXHUwNDIxXHUwNDIyXHUwNDIzXHUwNDE2XHUwNDEyXHUwNDJDXHUwNDJCXHUwNDE3XHUwNDI4XHUwNDJEXHUwNDI5XHUwNDI3XHUwNDJBXCJcbiAgfSxcbiAgXCJrb2k4dVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUyNTAwXHUyNTAyXHUyNTBDXHUyNTEwXHUyNTE0XHUyNTE4XHUyNTFDXHUyNTI0XHUyNTJDXHUyNTM0XHUyNTNDXHUyNTgwXHUyNTg0XHUyNTg4XHUyNThDXHUyNTkwXHUyNTkxXHUyNTkyXHUyNTkzXHUyMzIwXHUyNUEwXHUyMjE5XHUyMjFBXHUyMjQ4XHUyMjY0XHUyMjY1XHUwMEEwXHUyMzIxXHUwMEIwXHUwMEIyXHUwMEI3XHUwMEY3XHUyNTUwXHUyNTUxXHUyNTUyXHUwNDUxXHUwNDU0XHUyNTU0XHUwNDU2XHUwNDU3XHUyNTU3XHUyNTU4XHUyNTU5XHUyNTVBXHUyNTVCXHUwNDkxXHUyNTVEXHUyNTVFXHUyNTVGXHUyNTYwXHUyNTYxXHUwNDAxXHUwNDA0XHUyNTYzXHUwNDA2XHUwNDA3XHUyNTY2XHUyNTY3XHUyNTY4XHUyNTY5XHUyNTZBXHUwNDkwXHUyNTZDXHUwMEE5XHUwNDRFXHUwNDMwXHUwNDMxXHUwNDQ2XHUwNDM0XHUwNDM1XHUwNDQ0XHUwNDMzXHUwNDQ1XHUwNDM4XHUwNDM5XHUwNDNBXHUwNDNCXHUwNDNDXHUwNDNEXHUwNDNFXHUwNDNGXHUwNDRGXHUwNDQwXHUwNDQxXHUwNDQyXHUwNDQzXHUwNDM2XHUwNDMyXHUwNDRDXHUwNDRCXHUwNDM3XHUwNDQ4XHUwNDREXHUwNDQ5XHUwNDQ3XHUwNDRBXHUwNDJFXHUwNDEwXHUwNDExXHUwNDI2XHUwNDE0XHUwNDE1XHUwNDI0XHUwNDEzXHUwNDI1XHUwNDE4XHUwNDE5XHUwNDFBXHUwNDFCXHUwNDFDXHUwNDFEXHUwNDFFXHUwNDFGXHUwNDJGXHUwNDIwXHUwNDIxXHUwNDIyXHUwNDIzXHUwNDE2XHUwNDEyXHUwNDJDXHUwNDJCXHUwNDE3XHUwNDI4XHUwNDJEXHUwNDI5XHUwNDI3XHUwNDJBXCJcbiAgfSxcbiAgXCJrb2k4cnVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MjUwMFx1MjUwMlx1MjUwQ1x1MjUxMFx1MjUxNFx1MjUxOFx1MjUxQ1x1MjUyNFx1MjUyQ1x1MjUzNFx1MjUzQ1x1MjU4MFx1MjU4NFx1MjU4OFx1MjU4Q1x1MjU5MFx1MjU5MVx1MjU5Mlx1MjU5M1x1MjMyMFx1MjVBMFx1MjIxOVx1MjIxQVx1MjI0OFx1MjI2NFx1MjI2NVx1MDBBMFx1MjMyMVx1MDBCMFx1MDBCMlx1MDBCN1x1MDBGN1x1MjU1MFx1MjU1MVx1MjU1Mlx1MDQ1MVx1MDQ1NFx1MjU1NFx1MDQ1Nlx1MDQ1N1x1MjU1N1x1MjU1OFx1MjU1OVx1MjU1QVx1MjU1Qlx1MDQ5MVx1MDQ1RVx1MjU1RVx1MjU1Rlx1MjU2MFx1MjU2MVx1MDQwMVx1MDQwNFx1MjU2M1x1MDQwNlx1MDQwN1x1MjU2Nlx1MjU2N1x1MjU2OFx1MjU2OVx1MjU2QVx1MDQ5MFx1MDQwRVx1MDBBOVx1MDQ0RVx1MDQzMFx1MDQzMVx1MDQ0Nlx1MDQzNFx1MDQzNVx1MDQ0NFx1MDQzM1x1MDQ0NVx1MDQzOFx1MDQzOVx1MDQzQVx1MDQzQlx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzRlx1MDQ0Rlx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzNlx1MDQzMlx1MDQ0Q1x1MDQ0Qlx1MDQzN1x1MDQ0OFx1MDQ0RFx1MDQ0OVx1MDQ0N1x1MDQ0QVx1MDQyRVx1MDQxMFx1MDQxMVx1MDQyNlx1MDQxNFx1MDQxNVx1MDQyNFx1MDQxM1x1MDQyNVx1MDQxOFx1MDQxOVx1MDQxQVx1MDQxQlx1MDQxQ1x1MDQxRFx1MDQxRVx1MDQxRlx1MDQyRlx1MDQyMFx1MDQyMVx1MDQyMlx1MDQyM1x1MDQxNlx1MDQxMlx1MDQyQ1x1MDQyQlx1MDQxN1x1MDQyOFx1MDQyRFx1MDQyOVx1MDQyN1x1MDQyQVwiXG4gIH0sXG4gIFwia29pOHRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDQ5Qlx1MDQ5M1x1MjAxQVx1MDQ5Mlx1MjAxRVx1MjAyNlx1MjAyMFx1MjAyMVx1RkZGRFx1MjAzMFx1MDRCM1x1MjAzOVx1MDRCMlx1MDRCN1x1MDRCNlx1RkZGRFx1MDQ5QVx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyMlx1MjAxM1x1MjAxNFx1RkZGRFx1MjEyMlx1RkZGRFx1MjAzQVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MDRFRlx1MDRFRVx1MDQ1MVx1MDBBNFx1MDRFM1x1MDBBNlx1MDBBN1x1RkZGRFx1RkZGRFx1RkZGRFx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1RkZGRFx1MDBCMFx1MDBCMVx1MDBCMlx1MDQwMVx1RkZGRFx1MDRFMlx1MDBCNlx1MDBCN1x1RkZGRFx1MjExNlx1RkZGRFx1MDBCQlx1RkZGRFx1RkZGRFx1RkZGRFx1MDBBOVx1MDQ0RVx1MDQzMFx1MDQzMVx1MDQ0Nlx1MDQzNFx1MDQzNVx1MDQ0NFx1MDQzM1x1MDQ0NVx1MDQzOFx1MDQzOVx1MDQzQVx1MDQzQlx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzRlx1MDQ0Rlx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQzNlx1MDQzMlx1MDQ0Q1x1MDQ0Qlx1MDQzN1x1MDQ0OFx1MDQ0RFx1MDQ0OVx1MDQ0N1x1MDQ0QVx1MDQyRVx1MDQxMFx1MDQxMVx1MDQyNlx1MDQxNFx1MDQxNVx1MDQyNFx1MDQxM1x1MDQyNVx1MDQxOFx1MDQxOVx1MDQxQVx1MDQxQlx1MDQxQ1x1MDQxRFx1MDQxRVx1MDQxRlx1MDQyRlx1MDQyMFx1MDQyMVx1MDQyMlx1MDQyM1x1MDQxNlx1MDQxMlx1MDQyQ1x1MDQyQlx1MDQxN1x1MDQyOFx1MDQyRFx1MDQyOVx1MDQyN1x1MDQyQVwiXG4gIH0sXG4gIFwiYXJtc2NpaThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDA4MFx1MDA4MVx1MDA4Mlx1MDA4M1x1MDA4NFx1MDA4NVx1MDA4Nlx1MDA4N1x1MDA4OFx1MDA4OVx1MDA4QVx1MDA4Qlx1MDA4Q1x1MDA4RFx1MDA4RVx1MDA4Rlx1MDA5MFx1MDA5MVx1MDA5Mlx1MDA5M1x1MDA5NFx1MDA5NVx1MDA5Nlx1MDA5N1x1MDA5OFx1MDA5OVx1MDA5QVx1MDA5Qlx1MDA5Q1x1MDA5RFx1MDA5RVx1MDA5Rlx1MDBBMFx1RkZGRFx1MDU4N1x1MDU4OSkoXHUwMEJCXHUwMEFCXHUyMDE0Llx1MDU1RCwtXHUwNThBXHUyMDI2XHUwNTVDXHUwNTVCXHUwNTVFXHUwNTMxXHUwNTYxXHUwNTMyXHUwNTYyXHUwNTMzXHUwNTYzXHUwNTM0XHUwNTY0XHUwNTM1XHUwNTY1XHUwNTM2XHUwNTY2XHUwNTM3XHUwNTY3XHUwNTM4XHUwNTY4XHUwNTM5XHUwNTY5XHUwNTNBXHUwNTZBXHUwNTNCXHUwNTZCXHUwNTNDXHUwNTZDXHUwNTNEXHUwNTZEXHUwNTNFXHUwNTZFXHUwNTNGXHUwNTZGXHUwNTQwXHUwNTcwXHUwNTQxXHUwNTcxXHUwNTQyXHUwNTcyXHUwNTQzXHUwNTczXHUwNTQ0XHUwNTc0XHUwNTQ1XHUwNTc1XHUwNTQ2XHUwNTc2XHUwNTQ3XHUwNTc3XHUwNTQ4XHUwNTc4XHUwNTQ5XHUwNTc5XHUwNTRBXHUwNTdBXHUwNTRCXHUwNTdCXHUwNTRDXHUwNTdDXHUwNTREXHUwNTdEXHUwNTRFXHUwNTdFXHUwNTRGXHUwNTdGXHUwNTUwXHUwNTgwXHUwNTUxXHUwNTgxXHUwNTUyXHUwNTgyXHUwNTUzXHUwNTgzXHUwNTU0XHUwNTg0XHUwNTU1XHUwNTg1XHUwNTU2XHUwNTg2XHUwNTVBXHVGRkZEXCJcbiAgfSxcbiAgXCJyazEwNDhcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1MDQwMlx1MDQwM1x1MjAxQVx1MDQ1M1x1MjAxRVx1MjAyNlx1MjAyMFx1MjAyMVx1MjBBQ1x1MjAzMFx1MDQwOVx1MjAzOVx1MDQwQVx1MDQ5QVx1MDRCQVx1MDQwRlx1MDQ1Mlx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyMlx1MjAxM1x1MjAxNFx1RkZGRFx1MjEyMlx1MDQ1OVx1MjAzQVx1MDQ1QVx1MDQ5Qlx1MDRCQlx1MDQ1Rlx1MDBBMFx1MDRCMFx1MDRCMVx1MDREOFx1MDBBNFx1MDRFOFx1MDBBNlx1MDBBN1x1MDQwMVx1MDBBOVx1MDQ5Mlx1MDBBQlx1MDBBQ1x1MDBBRFx1MDBBRVx1MDRBRVx1MDBCMFx1MDBCMVx1MDQwNlx1MDQ1Nlx1MDRFOVx1MDBCNVx1MDBCNlx1MDBCN1x1MDQ1MVx1MjExNlx1MDQ5M1x1MDBCQlx1MDREOVx1MDRBMlx1MDRBM1x1MDRBRlx1MDQxMFx1MDQxMVx1MDQxMlx1MDQxM1x1MDQxNFx1MDQxNVx1MDQxNlx1MDQxN1x1MDQxOFx1MDQxOVx1MDQxQVx1MDQxQlx1MDQxQ1x1MDQxRFx1MDQxRVx1MDQxRlx1MDQyMFx1MDQyMVx1MDQyMlx1MDQyM1x1MDQyNFx1MDQyNVx1MDQyNlx1MDQyN1x1MDQyOFx1MDQyOVx1MDQyQVx1MDQyQlx1MDQyQ1x1MDQyRFx1MDQyRVx1MDQyRlx1MDQzMFx1MDQzMVx1MDQzMlx1MDQzM1x1MDQzNFx1MDQzNVx1MDQzNlx1MDQzN1x1MDQzOFx1MDQzOVx1MDQzQVx1MDQzQlx1MDQzQ1x1MDQzRFx1MDQzRVx1MDQzRlx1MDQ0MFx1MDQ0MVx1MDQ0Mlx1MDQ0M1x1MDQ0NFx1MDQ0NVx1MDQ0Nlx1MDQ0N1x1MDQ0OFx1MDQ0OVx1MDQ0QVx1MDQ0Qlx1MDQ0Q1x1MDQ0RFx1MDQ0RVx1MDQ0RlwiXG4gIH0sXG4gIFwidGN2blwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFx1MDAwMFx1MDBEQVx1MUVFNFxcdTAwMDNcdTFFRUFcdTFFRUNcdTFFRUVcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFx1MUVFOFx1MUVGMFx1MUVGMlx1MUVGNlx1MUVGOFx1MDBERFx1MUVGNFxcdTAwMThcXHUwMDE5XFx1MDAxYVxcdTAwMWJcXHUwMDFjXFx1MDAxZFxcdTAwMWVcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cdTAwN0ZcdTAwQzBcdTFFQTJcdTAwQzNcdTAwQzFcdTFFQTBcdTFFQjZcdTFFQUNcdTAwQzhcdTFFQkFcdTFFQkNcdTAwQzlcdTFFQjhcdTFFQzZcdTAwQ0NcdTFFQzhcdTAxMjhcdTAwQ0RcdTFFQ0FcdTAwRDJcdTFFQ0VcdTAwRDVcdTAwRDNcdTFFQ0NcdTFFRDhcdTFFRENcdTFFREVcdTFFRTBcdTFFREFcdTFFRTJcdTAwRDlcdTFFRTZcdTAxNjhcdTAwQTBcdTAxMDJcdTAwQzJcdTAwQ0FcdTAwRDRcdTAxQTBcdTAxQUZcdTAxMTBcdTAxMDNcdTAwRTJcdTAwRUFcdTAwRjRcdTAxQTFcdTAxQjBcdTAxMTFcdTFFQjBcdTAzMDBcdTAzMDlcdTAzMDNcdTAzMDFcdTAzMjNcdTAwRTBcdTFFQTNcdTAwRTNcdTAwRTFcdTFFQTFcdTFFQjJcdTFFQjFcdTFFQjNcdTFFQjVcdTFFQUZcdTFFQjRcdTFFQUVcdTFFQTZcdTFFQThcdTFFQUFcdTFFQTRcdTFFQzBcdTFFQjdcdTFFQTdcdTFFQTlcdTFFQUJcdTFFQTVcdTFFQURcdTAwRThcdTFFQzJcdTFFQkJcdTFFQkRcdTAwRTlcdTFFQjlcdTFFQzFcdTFFQzNcdTFFQzVcdTFFQkZcdTFFQzdcdTAwRUNcdTFFQzlcdTFFQzRcdTFFQkVcdTFFRDJcdTAxMjlcdTAwRURcdTFFQ0JcdTAwRjJcdTFFRDRcdTFFQ0ZcdTAwRjVcdTAwRjNcdTFFQ0RcdTFFRDNcdTFFRDVcdTFFRDdcdTFFRDFcdTFFRDlcdTFFRERcdTFFREZcdTFFRTFcdTFFREJcdTFFRTNcdTAwRjlcdTFFRDZcdTFFRTdcdTAxNjlcdTAwRkFcdTFFRTVcdTFFRUJcdTFFRURcdTFFRUZcdTFFRTlcdTFFRjFcdTFFRjNcdTFFRjdcdTFFRjlcdTAwRkRcdTFFRjVcdTFFRDBcIlxuICB9LFxuICBcImdlb3JnaWFuYWNhZGVteVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMDgwXHUwMDgxXHUyMDFBXHUwMTkyXHUyMDFFXHUyMDI2XHUyMDIwXHUyMDIxXHUwMkM2XHUyMDMwXHUwMTYwXHUyMDM5XHUwMTUyXHUwMDhEXHUwMDhFXHUwMDhGXHUwMDkwXHUyMDE4XHUyMDE5XHUyMDFDXHUyMDFEXHUyMDIyXHUyMDEzXHUyMDE0XHUwMkRDXHUyMTIyXHUwMTYxXHUyMDNBXHUwMTUzXHUwMDlEXHUwMDlFXHUwMTc4XHUwMEEwXHUwMEExXHUwMEEyXHUwMEEzXHUwMEE0XHUwMEE1XHUwMEE2XHUwMEE3XHUwMEE4XHUwMEE5XHUwMEFBXHUwMEFCXHUwMEFDXHUwMEFEXHUwMEFFXHUwMEFGXHUwMEIwXHUwMEIxXHUwMEIyXHUwMEIzXHUwMEI0XHUwMEI1XHUwMEI2XHUwMEI3XHUwMEI4XHUwMEI5XHUwMEJBXHUwMEJCXHUwMEJDXHUwMEJEXHUwMEJFXHUwMEJGXHUxMEQwXHUxMEQxXHUxMEQyXHUxMEQzXHUxMEQ0XHUxMEQ1XHUxMEQ2XHUxMEQ3XHUxMEQ4XHUxMEQ5XHUxMERBXHUxMERCXHUxMERDXHUxMEREXHUxMERFXHUxMERGXHUxMEUwXHUxMEUxXHUxMEUyXHUxMEUzXHUxMEU0XHUxMEU1XHUxMEU2XHUxMEU3XHUxMEU4XHUxMEU5XHUxMEVBXHUxMEVCXHUxMEVDXHUxMEVEXHUxMEVFXHUxMEVGXHUxMEYwXHUxMEYxXHUxMEYyXHUxMEYzXHUxMEY0XHUxMEY1XHUxMEY2XHUwMEU3XHUwMEU4XHUwMEU5XHUwMEVBXHUwMEVCXHUwMEVDXHUwMEVEXHUwMEVFXHUwMEVGXHUwMEYwXHUwMEYxXHUwMEYyXHUwMEYzXHUwMEY0XHUwMEY1XHUwMEY2XHUwMEY3XHUwMEY4XHUwMEY5XHUwMEZBXHUwMEZCXHUwMEZDXHUwMEZEXHUwMEZFXHUwMEZGXCJcbiAgfSxcbiAgXCJnZW9yZ2lhbnBzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwODBcdTAwODFcdTIwMUFcdTAxOTJcdTIwMUVcdTIwMjZcdTIwMjBcdTIwMjFcdTAyQzZcdTIwMzBcdTAxNjBcdTIwMzlcdTAxNTJcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdTAyRENcdTIxMjJcdTAxNjFcdTIwM0FcdTAxNTNcdTAwOURcdTAwOUVcdTAxNzhcdTAwQTBcdTAwQTFcdTAwQTJcdTAwQTNcdTAwQTRcdTAwQTVcdTAwQTZcdTAwQTdcdTAwQThcdTAwQTlcdTAwQUFcdTAwQUJcdTAwQUNcdTAwQURcdTAwQUVcdTAwQUZcdTAwQjBcdTAwQjFcdTAwQjJcdTAwQjNcdTAwQjRcdTAwQjVcdTAwQjZcdTAwQjdcdTAwQjhcdTAwQjlcdTAwQkFcdTAwQkJcdTAwQkNcdTAwQkRcdTAwQkVcdTAwQkZcdTEwRDBcdTEwRDFcdTEwRDJcdTEwRDNcdTEwRDRcdTEwRDVcdTEwRDZcdTEwRjFcdTEwRDdcdTEwRDhcdTEwRDlcdTEwREFcdTEwREJcdTEwRENcdTEwRjJcdTEwRERcdTEwREVcdTEwREZcdTEwRTBcdTEwRTFcdTEwRTJcdTEwRjNcdTEwRTNcdTEwRTRcdTEwRTVcdTEwRTZcdTEwRTdcdTEwRThcdTEwRTlcdTEwRUFcdTEwRUJcdTEwRUNcdTEwRURcdTEwRUVcdTEwRjRcdTEwRUZcdTEwRjBcdTEwRjVcdTAwRTZcdTAwRTdcdTAwRThcdTAwRTlcdTAwRUFcdTAwRUJcdTAwRUNcdTAwRURcdTAwRUVcdTAwRUZcdTAwRjBcdTAwRjFcdTAwRjJcdTAwRjNcdTAwRjRcdTAwRjVcdTAwRjZcdTAwRjdcdTAwRjhcdTAwRjlcdTAwRkFcdTAwRkJcdTAwRkNcdTAwRkRcdTAwRkVcdTAwRkZcIlxuICB9LFxuICBcInB0MTU0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTA0OTZcdTA0OTJcdTA0RUVcdTA0OTNcdTIwMUVcdTIwMjZcdTA0QjZcdTA0QUVcdTA0QjJcdTA0QUZcdTA0QTBcdTA0RTJcdTA0QTJcdTA0OUFcdTA0QkFcdTA0QjhcdTA0OTdcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjJcdTIwMTNcdTIwMTRcdTA0QjNcdTA0QjdcdTA0QTFcdTA0RTNcdTA0QTNcdTA0OUJcdTA0QkJcdTA0QjlcdTAwQTBcdTA0MEVcdTA0NUVcdTA0MDhcdTA0RThcdTA0OThcdTA0QjBcdTAwQTdcdTA0MDFcdTAwQTlcdTA0RDhcdTAwQUJcdTAwQUNcdTA0RUZcdTAwQUVcdTA0OUNcdTAwQjBcdTA0QjFcdTA0MDZcdTA0NTZcdTA0OTlcdTA0RTlcdTAwQjZcdTAwQjdcdTA0NTFcdTIxMTZcdTA0RDlcdTAwQkJcdTA0NThcdTA0QUFcdTA0QUJcdTA0OURcdTA0MTBcdTA0MTFcdTA0MTJcdTA0MTNcdTA0MTRcdTA0MTVcdTA0MTZcdTA0MTdcdTA0MThcdTA0MTlcdTA0MUFcdTA0MUJcdTA0MUNcdTA0MURcdTA0MUVcdTA0MUZcdTA0MjBcdTA0MjFcdTA0MjJcdTA0MjNcdTA0MjRcdTA0MjVcdTA0MjZcdTA0MjdcdTA0MjhcdTA0MjlcdTA0MkFcdTA0MkJcdTA0MkNcdTA0MkRcdTA0MkVcdTA0MkZcdTA0MzBcdTA0MzFcdTA0MzJcdTA0MzNcdTA0MzRcdTA0MzVcdTA0MzZcdTA0MzdcdTA0MzhcdTA0MzlcdTA0M0FcdTA0M0JcdTA0M0NcdTA0M0RcdTA0M0VcdTA0M0ZcdTA0NDBcdTA0NDFcdTA0NDJcdTA0NDNcdTA0NDRcdTA0NDVcdTA0NDZcdTA0NDdcdTA0NDhcdTA0NDlcdTA0NEFcdTA0NEJcdTA0NENcdTA0NERcdTA0NEVcdTA0NEZcIlxuICB9LFxuICBcInZpc2NpaVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFx1MDAwMFxcdTAwMDFcdTFFQjJcXHUwMDAzXFx1MDAwNFx1MUVCNFx1MUVBQVxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEwXFx1MDAxMVxcdTAwMTJcXHUwMDEzXHUxRUY2XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFx1MUVGOFxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcdTFFRjRcXHUwMDFmICFcXFwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cdTAwN0ZcdTFFQTBcdTFFQUVcdTFFQjBcdTFFQjZcdTFFQTRcdTFFQTZcdTFFQThcdTFFQUNcdTFFQkNcdTFFQjhcdTFFQkVcdTFFQzBcdTFFQzJcdTFFQzRcdTFFQzZcdTFFRDBcdTFFRDJcdTFFRDRcdTFFRDZcdTFFRDhcdTFFRTJcdTFFREFcdTFFRENcdTFFREVcdTFFQ0FcdTFFQ0VcdTFFQ0NcdTFFQzhcdTFFRTZcdTAxNjhcdTFFRTRcdTFFRjJcdTAwRDVcdTFFQUZcdTFFQjFcdTFFQjdcdTFFQTVcdTFFQTdcdTFFQTlcdTFFQURcdTFFQkRcdTFFQjlcdTFFQkZcdTFFQzFcdTFFQzNcdTFFQzVcdTFFQzdcdTFFRDFcdTFFRDNcdTFFRDVcdTFFRDdcdTFFRTBcdTAxQTBcdTFFRDlcdTFFRERcdTFFREZcdTFFQ0JcdTFFRjBcdTFFRThcdTFFRUFcdTFFRUNcdTAxQTFcdTFFREJcdTAxQUZcdTAwQzBcdTAwQzFcdTAwQzJcdTAwQzNcdTFFQTJcdTAxMDJcdTFFQjNcdTFFQjVcdTAwQzhcdTAwQzlcdTAwQ0FcdTFFQkFcdTAwQ0NcdTAwQ0RcdTAxMjhcdTFFRjNcdTAxMTBcdTFFRTlcdTAwRDJcdTAwRDNcdTAwRDRcdTFFQTFcdTFFRjdcdTFFRUJcdTFFRURcdTAwRDlcdTAwREFcdTFFRjlcdTFFRjVcdTAwRERcdTFFRTFcdTAxQjBcdTAwRTBcdTAwRTFcdTAwRTJcdTAwRTNcdTFFQTNcdTAxMDNcdTFFRUZcdTFFQUJcdTAwRThcdTAwRTlcdTAwRUFcdTFFQkJcdTAwRUNcdTAwRURcdTAxMjlcdTFFQzlcdTAxMTFcdTFFRjFcdTAwRjJcdTAwRjNcdTAwRjRcdTAwRjVcdTFFQ0ZcdTFFQ0RcdTFFRTVcdTAwRjlcdTAwRkFcdTAxNjlcdTFFRTdcdTAwRkRcdTFFRTNcdTFFRUVcIlxuICB9LFxuICBcImlzbzY0NmNuXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjXHUwMEE1JSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1cdTIwM0VcdTAwN0ZcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcIlxuICB9LFxuICBcImlzbzY0NmpwXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcdTAwQTVdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1cdTIwM0VcdTAwN0ZcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcdUZGRkRcIlxuICB9LFxuICBcImhwcm9tYW44XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcdTAwODBcdTAwODFcdTAwODJcdTAwODNcdTAwODRcdTAwODVcdTAwODZcdTAwODdcdTAwODhcdTAwODlcdTAwOEFcdTAwOEJcdTAwOENcdTAwOERcdTAwOEVcdTAwOEZcdTAwOTBcdTAwOTFcdTAwOTJcdTAwOTNcdTAwOTRcdTAwOTVcdTAwOTZcdTAwOTdcdTAwOThcdTAwOTlcdTAwOUFcdTAwOUJcdTAwOUNcdTAwOURcdTAwOUVcdTAwOUZcdTAwQTBcdTAwQzBcdTAwQzJcdTAwQzhcdTAwQ0FcdTAwQ0JcdTAwQ0VcdTAwQ0ZcdTAwQjRcdTAyQ0JcdTAyQzZcdTAwQThcdTAyRENcdTAwRDlcdTAwREJcdTIwQTRcdTAwQUZcdTAwRERcdTAwRkRcdTAwQjBcdTAwQzdcdTAwRTdcdTAwRDFcdTAwRjFcdTAwQTFcdTAwQkZcdTAwQTRcdTAwQTNcdTAwQTVcdTAwQTdcdTAxOTJcdTAwQTJcdTAwRTJcdTAwRUFcdTAwRjRcdTAwRkJcdTAwRTFcdTAwRTlcdTAwRjNcdTAwRkFcdTAwRTBcdTAwRThcdTAwRjJcdTAwRjlcdTAwRTRcdTAwRUJcdTAwRjZcdTAwRkNcdTAwQzVcdTAwRUVcdTAwRDhcdTAwQzZcdTAwRTVcdTAwRURcdTAwRjhcdTAwRTZcdTAwQzRcdTAwRUNcdTAwRDZcdTAwRENcdTAwQzlcdTAwRUZcdTAwREZcdTAwRDRcdTAwQzFcdTAwQzNcdTAwRTNcdTAwRDBcdTAwRjBcdTAwQ0RcdTAwQ0NcdTAwRDNcdTAwRDJcdTAwRDVcdTAwRjVcdTAxNjBcdTAxNjFcdTAwREFcdTAxNzhcdTAwRkZcdTAwREVcdTAwRkVcdTAwQjdcdTAwQjVcdTAwQjZcdTAwQkVcdTIwMTRcdTAwQkNcdTAwQkRcdTAwQUFcdTAwQkFcdTAwQUJcdTI1QTBcdTAwQkJcdTAwQjFcdUZGRkRcIlxuICB9LFxuICBcIm1hY2ludG9zaFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHUwMEM0XHUwMEM1XHUwMEM3XHUwMEM5XHUwMEQxXHUwMEQ2XHUwMERDXHUwMEUxXHUwMEUwXHUwMEUyXHUwMEU0XHUwMEUzXHUwMEU1XHUwMEU3XHUwMEU5XHUwMEU4XHUwMEVBXHUwMEVCXHUwMEVEXHUwMEVDXHUwMEVFXHUwMEVGXHUwMEYxXHUwMEYzXHUwMEYyXHUwMEY0XHUwMEY2XHUwMEY1XHUwMEZBXHUwMEY5XHUwMEZCXHUwMEZDXHUyMDIwXHUwMEIwXHUwMEEyXHUwMEEzXHUwMEE3XHUyMDIyXHUwMEI2XHUwMERGXHUwMEFFXHUwMEE5XHUyMTIyXHUwMEI0XHUwMEE4XHUyMjYwXHUwMEM2XHUwMEQ4XHUyMjFFXHUwMEIxXHUyMjY0XHUyMjY1XHUwMEE1XHUwMEI1XHUyMjAyXHUyMjExXHUyMjBGXHUwM0MwXHUyMjJCXHUwMEFBXHUwMEJBXHUyMTI2XHUwMEU2XHUwMEY4XHUwMEJGXHUwMEExXHUwMEFDXHUyMjFBXHUwMTkyXHUyMjQ4XHUyMjA2XHUwMEFCXHUwMEJCXHUyMDI2XHUwMEEwXHUwMEMwXHUwMEMzXHUwMEQ1XHUwMTUyXHUwMTUzXHUyMDEzXHUyMDE0XHUyMDFDXHUyMDFEXHUyMDE4XHUyMDE5XHUwMEY3XHUyNUNBXHUwMEZGXHUwMTc4XHUyMDQ0XHUwMEE0XHUyMDM5XHUyMDNBXHVGQjAxXHVGQjAyXHUyMDIxXHUwMEI3XHUyMDFBXHUyMDFFXHUyMDMwXHUwMEMyXHUwMENBXHUwMEMxXHUwMENCXHUwMEM4XHUwMENEXHUwMENFXHUwMENGXHUwMENDXHUwMEQzXHUwMEQ0XHVGRkZEXHUwMEQyXHUwMERBXHUwMERCXHUwMEQ5XHUwMTMxXHUwMkM2XHUwMkRDXHUwMEFGXHUwMkQ4XHUwMkQ5XHUwMkRBXHUwMEI4XHUwMkREXHUwMkRCXHUwMkM3XCJcbiAgfSxcbiAgXCJhc2NpaVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXHVGRkZEXCJcbiAgfSxcbiAgXCJ0aXM2MjBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MEUwMVx1MEUwMlx1MEUwM1x1MEUwNFx1MEUwNVx1MEUwNlx1MEUwN1x1MEUwOFx1MEUwOVx1MEUwQVx1MEUwQlx1MEUwQ1x1MEUwRFx1MEUwRVx1MEUwRlx1MEUxMFx1MEUxMVx1MEUxMlx1MEUxM1x1MEUxNFx1MEUxNVx1MEUxNlx1MEUxN1x1MEUxOFx1MEUxOVx1MEUxQVx1MEUxQlx1MEUxQ1x1MEUxRFx1MEUxRVx1MEUxRlx1MEUyMFx1MEUyMVx1MEUyMlx1MEUyM1x1MEUyNFx1MEUyNVx1MEUyNlx1MEUyN1x1MEUyOFx1MEUyOVx1MEUyQVx1MEUyQlx1MEUyQ1x1MEUyRFx1MEUyRVx1MEUyRlx1MEUzMFx1MEUzMVx1MEUzMlx1MEUzM1x1MEUzNFx1MEUzNVx1MEUzNlx1MEUzN1x1MEUzOFx1MEUzOVx1MEUzQVx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFx1MEUzRlx1MEU0MFx1MEU0MVx1MEU0Mlx1MEU0M1x1MEU0NFx1MEU0NVx1MEU0Nlx1MEU0N1x1MEU0OFx1MEU0OVx1MEU0QVx1MEU0Qlx1MEU0Q1x1MEU0RFx1MEU0RVx1MEU0Rlx1MEU1MFx1MEU1MVx1MEU1Mlx1MEU1M1x1MEU1NFx1MEU1NVx1MEU1Nlx1MEU1N1x1MEU1OFx1MEU1OVx1MEU1QVx1MEU1Qlx1RkZGRFx1RkZGRFx1RkZGRFx1RkZGRFwiXG4gIH1cbn0iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQnVmZmVyID0gcmVxdWlyZShcInNhZmVyLWJ1ZmZlclwiKS5CdWZmZXI7XG5cbi8vIE11bHRpYnl0ZSBjb2RlYy4gSW4gdGhpcyBzY2hlbWUsIGEgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIGJ5IDEgb3IgbW9yZSBieXRlcy5cbi8vIE91ciBjb2RlYyBzdXBwb3J0cyBVVEYtMTYgc3Vycm9nYXRlcywgZXh0ZW5zaW9ucyBmb3IgR0IxODAzMCBhbmQgdW5pY29kZSBzZXF1ZW5jZXMuXG4vLyBUbyBzYXZlIG1lbW9yeSBhbmQgbG9hZGluZyB0aW1lLCB3ZSByZWFkIHRhYmxlIGZpbGVzIG9ubHkgd2hlbiByZXF1ZXN0ZWQuXG5cbmV4cG9ydHMuX2RiY3MgPSBEQkNTQ29kZWM7XG5cbnZhciBVTkFTU0lHTkVEID0gLTEsXG4gICAgR0IxODAzMF9DT0RFID0gLTIsXG4gICAgU0VRX1NUQVJUICA9IC0xMCxcbiAgICBOT0RFX1NUQVJUID0gLTEwMDAsXG4gICAgVU5BU1NJR05FRF9OT0RFID0gbmV3IEFycmF5KDB4MTAwKSxcbiAgICBERUZfQ0hBUiA9IC0xO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IDB4MTAwOyBpKyspXG4gICAgVU5BU1NJR05FRF9OT0RFW2ldID0gVU5BU1NJR05FRDtcblxuXG4vLyBDbGFzcyBEQkNTQ29kZWMgcmVhZHMgYW5kIGluaXRpYWxpemVzIG1hcHBpbmcgdGFibGVzLlxuZnVuY3Rpb24gREJDU0NvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgICB0aGlzLmVuY29kaW5nTmFtZSA9IGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWU7XG4gICAgaWYgKCFjb2RlY09wdGlvbnMpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRCQ1MgY29kZWMgaXMgY2FsbGVkIHdpdGhvdXQgdGhlIGRhdGEuXCIpXG4gICAgaWYgKCFjb2RlY09wdGlvbnMudGFibGUpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY29kaW5nICdcIiArIHRoaXMuZW5jb2RpbmdOYW1lICsgXCInIGhhcyBubyBkYXRhLlwiKTtcblxuICAgIC8vIExvYWQgdGFibGVzLlxuICAgIHZhciBtYXBwaW5nVGFibGUgPSBjb2RlY09wdGlvbnMudGFibGUoKTtcblxuXG4gICAgLy8gRGVjb2RlIHRhYmxlczogTUJDUyAtPiBVbmljb2RlLlxuXG4gICAgLy8gZGVjb2RlVGFibGVzIGlzIGEgdHJpZSwgZW5jb2RlZCBhcyBhbiBhcnJheSBvZiBhcnJheXMgb2YgaW50ZWdlcnMuIEludGVybmFsIGFycmF5cyBhcmUgdHJpZSBub2RlcyBhbmQgYWxsIGhhdmUgbGVuID0gMjU2LlxuICAgIC8vIFRyaWUgcm9vdCBpcyBkZWNvZGVUYWJsZXNbMF0uXG4gICAgLy8gVmFsdWVzOiA+PSAgMCAtPiB1bmljb2RlIGNoYXJhY3RlciBjb2RlLiBjYW4gYmUgPiAweEZGRkZcbiAgICAvLyAgICAgICAgID09IFVOQVNTSUdORUQgLT4gdW5rbm93bi91bmFzc2lnbmVkIHNlcXVlbmNlLlxuICAgIC8vICAgICAgICAgPT0gR0IxODAzMF9DT0RFIC0+IHRoaXMgaXMgdGhlIGVuZCBvZiBhIEdCMTgwMzAgNC1ieXRlIHNlcXVlbmNlLlxuICAgIC8vICAgICAgICAgPD0gTk9ERV9TVEFSVCAtPiBpbmRleCBvZiB0aGUgbmV4dCBub2RlIGluIG91ciB0cmllIHRvIHByb2Nlc3MgbmV4dCBieXRlLlxuICAgIC8vICAgICAgICAgPD0gU0VRX1NUQVJUICAtPiBpbmRleCBvZiB0aGUgc3RhcnQgb2YgYSBjaGFyYWN0ZXIgY29kZSBzZXF1ZW5jZSwgaW4gZGVjb2RlVGFibGVTZXEuXG4gICAgdGhpcy5kZWNvZGVUYWJsZXMgPSBbXTtcbiAgICB0aGlzLmRlY29kZVRhYmxlc1swXSA9IFVOQVNTSUdORURfTk9ERS5zbGljZSgwKTsgLy8gQ3JlYXRlIHJvb3Qgbm9kZS5cblxuICAgIC8vIFNvbWV0aW1lcyBhIE1CQ1MgY2hhciBjb3JyZXNwb25kcyB0byBhIHNlcXVlbmNlIG9mIHVuaWNvZGUgY2hhcnMuIFdlIHN0b3JlIHRoZW0gYXMgYXJyYXlzIG9mIGludGVnZXJzIGhlcmUuIFxuICAgIHRoaXMuZGVjb2RlVGFibGVTZXEgPSBbXTtcblxuICAgIC8vIEFjdHVhbCBtYXBwaW5nIHRhYmxlcyBjb25zaXN0IG9mIGNodW5rcy4gVXNlIHRoZW0gdG8gZmlsbCB1cCBkZWNvZGUgdGFibGVzLlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwcGluZ1RhYmxlLmxlbmd0aDsgaSsrKVxuICAgICAgICB0aGlzLl9hZGREZWNvZGVDaHVuayhtYXBwaW5nVGFibGVbaV0pO1xuXG4gICAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBpY29udi5kZWZhdWx0Q2hhclVuaWNvZGU7XG5cbiAgICBcbiAgICAvLyBFbmNvZGUgdGFibGVzOiBVbmljb2RlIC0+IERCQ1MuXG5cbiAgICAvLyBgZW5jb2RlVGFibGVgIGlzIGFycmF5IG1hcHBpbmcgZnJvbSB1bmljb2RlIGNoYXIgdG8gZW5jb2RlZCBjaGFyLiBBbGwgaXRzIHZhbHVlcyBhcmUgaW50ZWdlcnMgZm9yIHBlcmZvcm1hbmNlLlxuICAgIC8vIEJlY2F1c2UgaXQgY2FuIGJlIHNwYXJzZSwgaXQgaXMgcmVwcmVzZW50ZWQgYXMgYXJyYXkgb2YgYnVja2V0cyBieSAyNTYgY2hhcnMgZWFjaC4gQnVja2V0IGNhbiBiZSBudWxsLlxuICAgIC8vIFZhbHVlczogPj0gIDAgLT4gaXQgaXMgYSBub3JtYWwgY2hhci4gV3JpdGUgdGhlIHZhbHVlIChpZiA8PTI1NiB0aGVuIDEgYnl0ZSwgaWYgPD02NTUzNiB0aGVuIDIgYnl0ZXMsIGV0Yy4pLlxuICAgIC8vICAgICAgICAgPT0gVU5BU1NJR05FRCAtPiBubyBjb252ZXJzaW9uIGZvdW5kLiBPdXRwdXQgYSBkZWZhdWx0IGNoYXIuXG4gICAgLy8gICAgICAgICA8PSBTRVFfU1RBUlQgIC0+IGl0J3MgYW4gaW5kZXggaW4gZW5jb2RlVGFibGVTZXEsIHNlZSBiZWxvdy4gVGhlIGNoYXJhY3RlciBzdGFydHMgYSBzZXF1ZW5jZS5cbiAgICB0aGlzLmVuY29kZVRhYmxlID0gW107XG4gICAgXG4gICAgLy8gYGVuY29kZVRhYmxlU2VxYCBpcyB1c2VkIHdoZW4gYSBzZXF1ZW5jZSBvZiB1bmljb2RlIGNoYXJhY3RlcnMgaXMgZW5jb2RlZCBhcyBhIHNpbmdsZSBjb2RlLiBXZSB1c2UgYSB0cmVlIG9mXG4gICAgLy8gb2JqZWN0cyB3aGVyZSBrZXlzIGNvcnJlc3BvbmQgdG8gY2hhcmFjdGVycyBpbiBzZXF1ZW5jZSBhbmQgbGVhZnMgYXJlIHRoZSBlbmNvZGVkIGRiY3MgdmFsdWVzLiBBIHNwZWNpYWwgREVGX0NIQVIga2V5XG4gICAgLy8gbWVhbnMgZW5kIG9mIHNlcXVlbmNlIChuZWVkZWQgd2hlbiBvbmUgc2VxdWVuY2UgaXMgYSBzdHJpY3Qgc3Vic2VxdWVuY2Ugb2YgYW5vdGhlcikuXG4gICAgLy8gT2JqZWN0cyBhcmUga2VwdCBzZXBhcmF0ZWx5IGZyb20gZW5jb2RlVGFibGUgdG8gaW5jcmVhc2UgcGVyZm9ybWFuY2UuXG4gICAgdGhpcy5lbmNvZGVUYWJsZVNlcSA9IFtdO1xuXG4gICAgLy8gU29tZSBjaGFycyBjYW4gYmUgZGVjb2RlZCwgYnV0IG5lZWQgbm90IGJlIGVuY29kZWQuXG4gICAgdmFyIHNraXBFbmNvZGVDaGFycyA9IHt9O1xuICAgIGlmIChjb2RlY09wdGlvbnMuZW5jb2RlU2tpcFZhbHMpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZWNPcHRpb25zLmVuY29kZVNraXBWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdmFsID0gY29kZWNPcHRpb25zLmVuY29kZVNraXBWYWxzW2ldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHNraXBFbmNvZGVDaGFyc1t2YWxdID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gdmFsLmZyb207IGogPD0gdmFsLnRvOyBqKyspXG4gICAgICAgICAgICAgICAgICAgIHNraXBFbmNvZGVDaGFyc1tqXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgLy8gVXNlIGRlY29kZSB0cmllIHRvIHJlY3Vyc2l2ZWx5IGZpbGwgb3V0IGVuY29kZSB0YWJsZXMuXG4gICAgdGhpcy5fZmlsbEVuY29kZVRhYmxlKDAsIDAsIHNraXBFbmNvZGVDaGFycyk7XG5cbiAgICAvLyBBZGQgbW9yZSBlbmNvZGluZyBwYWlycyB3aGVuIG5lZWRlZC5cbiAgICBpZiAoY29kZWNPcHRpb25zLmVuY29kZUFkZCkge1xuICAgICAgICBmb3IgKHZhciB1Q2hhciBpbiBjb2RlY09wdGlvbnMuZW5jb2RlQWRkKVxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb2RlY09wdGlvbnMuZW5jb2RlQWRkLCB1Q2hhcikpXG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RW5jb2RlQ2hhcih1Q2hhci5jaGFyQ29kZUF0KDApLCBjb2RlY09wdGlvbnMuZW5jb2RlQWRkW3VDaGFyXSk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWZDaGFyU0IgID0gdGhpcy5lbmNvZGVUYWJsZVswXVtpY29udi5kZWZhdWx0Q2hhclNpbmdsZUJ5dGUuY2hhckNvZGVBdCgwKV07XG4gICAgaWYgKHRoaXMuZGVmQ2hhclNCID09PSBVTkFTU0lHTkVEKSB0aGlzLmRlZkNoYXJTQiA9IHRoaXMuZW5jb2RlVGFibGVbMF1bJz8nXTtcbiAgICBpZiAodGhpcy5kZWZDaGFyU0IgPT09IFVOQVNTSUdORUQpIHRoaXMuZGVmQ2hhclNCID0gXCI/XCIuY2hhckNvZGVBdCgwKTtcblxuXG4gICAgLy8gTG9hZCAmIGNyZWF0ZSBHQjE4MDMwIHRhYmxlcyB3aGVuIG5lZWRlZC5cbiAgICBpZiAodHlwZW9mIGNvZGVjT3B0aW9ucy5nYjE4MDMwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuZ2IxODAzMCA9IGNvZGVjT3B0aW9ucy5nYjE4MDMwKCk7IC8vIExvYWQgR0IxODAzMCByYW5nZXMuXG5cbiAgICAgICAgLy8gQWRkIEdCMTgwMzAgZGVjb2RlIHRhYmxlcy5cbiAgICAgICAgdmFyIHRoaXJkQnl0ZU5vZGVJZHggPSB0aGlzLmRlY29kZVRhYmxlcy5sZW5ndGg7XG4gICAgICAgIHZhciB0aGlyZEJ5dGVOb2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbdGhpcmRCeXRlTm9kZUlkeF0gPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCk7XG5cbiAgICAgICAgdmFyIGZvdXJ0aEJ5dGVOb2RlSWR4ID0gdGhpcy5kZWNvZGVUYWJsZXMubGVuZ3RoO1xuICAgICAgICB2YXIgZm91cnRoQnl0ZU5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tmb3VydGhCeXRlTm9kZUlkeF0gPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDB4ODE7IGkgPD0gMHhGRTsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgc2Vjb25kQnl0ZU5vZGVJZHggPSBOT0RFX1NUQVJUIC0gdGhpcy5kZWNvZGVUYWJsZXNbMF1baV07XG4gICAgICAgICAgICB2YXIgc2Vjb25kQnl0ZU5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tzZWNvbmRCeXRlTm9kZUlkeF07XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMHgzMDsgaiA8PSAweDM5OyBqKyspXG4gICAgICAgICAgICAgICAgc2Vjb25kQnl0ZU5vZGVbal0gPSBOT0RFX1NUQVJUIC0gdGhpcmRCeXRlTm9kZUlkeDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMHg4MTsgaSA8PSAweEZFOyBpKyspXG4gICAgICAgICAgICB0aGlyZEJ5dGVOb2RlW2ldID0gTk9ERV9TVEFSVCAtIGZvdXJ0aEJ5dGVOb2RlSWR4O1xuICAgICAgICBmb3IgKHZhciBpID0gMHgzMDsgaSA8PSAweDM5OyBpKyspXG4gICAgICAgICAgICBmb3VydGhCeXRlTm9kZVtpXSA9IEdCMTgwMzBfQ09ERVxuICAgIH0gICAgICAgIFxufVxuXG5EQkNTQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBEQkNTRW5jb2RlcjtcbkRCQ1NDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IERCQ1NEZWNvZGVyO1xuXG4vLyBEZWNvZGVyIGhlbHBlcnNcbkRCQ1NDb2RlYy5wcm90b3R5cGUuX2dldERlY29kZVRyaWVOb2RlID0gZnVuY3Rpb24oYWRkcikge1xuICAgIHZhciBieXRlcyA9IFtdO1xuICAgIGZvciAoOyBhZGRyID4gMDsgYWRkciA+Pj0gOClcbiAgICAgICAgYnl0ZXMucHVzaChhZGRyICYgMHhGRik7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICBieXRlcy5wdXNoKDApO1xuXG4gICAgdmFyIG5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1swXTtcbiAgICBmb3IgKHZhciBpID0gYnl0ZXMubGVuZ3RoLTE7IGkgPiAwOyBpLS0pIHsgLy8gVHJhdmVyc2Ugbm9kZXMgZGVlcGVyIGludG8gdGhlIHRyaWUuXG4gICAgICAgIHZhciB2YWwgPSBub2RlW2J5dGVzW2ldXTtcblxuICAgICAgICBpZiAodmFsID09IFVOQVNTSUdORUQpIHsgLy8gQ3JlYXRlIG5ldyBub2RlLlxuICAgICAgICAgICAgbm9kZVtieXRlc1tpXV0gPSBOT0RFX1NUQVJUIC0gdGhpcy5kZWNvZGVUYWJsZXMubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5kZWNvZGVUYWJsZXMucHVzaChub2RlID0gVU5BU1NJR05FRF9OT0RFLnNsaWNlKDApKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWwgPD0gTk9ERV9TVEFSVCkgeyAvLyBFeGlzdGluZyBub2RlLlxuICAgICAgICAgICAgbm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzW05PREVfU1RBUlQgLSB2YWxdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk92ZXJ3cml0ZSBieXRlIGluIFwiICsgdGhpcy5lbmNvZGluZ05hbWUgKyBcIiwgYWRkcjogXCIgKyBhZGRyLnRvU3RyaW5nKDE2KSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xufVxuXG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX2FkZERlY29kZUNodW5rID0gZnVuY3Rpb24oY2h1bmspIHtcbiAgICAvLyBGaXJzdCBlbGVtZW50IG9mIGNodW5rIGlzIHRoZSBoZXggbWJjcyBjb2RlIHdoZXJlIHdlIHN0YXJ0LlxuICAgIHZhciBjdXJBZGRyID0gcGFyc2VJbnQoY2h1bmtbMF0sIDE2KTtcblxuICAgIC8vIENob29zZSB0aGUgZGVjb2Rpbmcgbm9kZSB3aGVyZSB3ZSdsbCB3cml0ZSBvdXIgY2hhcnMuXG4gICAgdmFyIHdyaXRlVGFibGUgPSB0aGlzLl9nZXREZWNvZGVUcmllTm9kZShjdXJBZGRyKTtcbiAgICBjdXJBZGRyID0gY3VyQWRkciAmIDB4RkY7XG5cbiAgICAvLyBXcml0ZSBhbGwgb3RoZXIgZWxlbWVudHMgb2YgdGhlIGNodW5rIHRvIHRoZSB0YWJsZS5cbiAgICBmb3IgKHZhciBrID0gMTsgayA8IGNodW5rLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBwYXJ0ID0gY2h1bmtba107XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikgeyAvLyBTdHJpbmcsIHdyaXRlIGFzLWlzLlxuICAgICAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBwYXJ0Lmxlbmd0aDspIHtcbiAgICAgICAgICAgICAgICB2YXIgY29kZSA9IHBhcnQuY2hhckNvZGVBdChsKyspO1xuICAgICAgICAgICAgICAgIGlmICgweEQ4MDAgPD0gY29kZSAmJiBjb2RlIDwgMHhEQzAwKSB7IC8vIERlY29kZSBzdXJyb2dhdGVcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGVUcmFpbCA9IHBhcnQuY2hhckNvZGVBdChsKyspO1xuICAgICAgICAgICAgICAgICAgICBpZiAoMHhEQzAwIDw9IGNvZGVUcmFpbCAmJiBjb2RlVHJhaWwgPCAweEUwMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVRhYmxlW2N1ckFkZHIrK10gPSAweDEwMDAwICsgKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyAoY29kZVRyYWlsIC0gMHhEQzAwKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5jb3JyZWN0IHN1cnJvZ2F0ZSBwYWlyIGluIFwiICArIHRoaXMuZW5jb2RpbmdOYW1lICsgXCIgYXQgY2h1bmsgXCIgKyBjaHVua1swXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKDB4MEZGMCA8IGNvZGUgJiYgY29kZSA8PSAweDBGRkYpIHsgLy8gQ2hhcmFjdGVyIHNlcXVlbmNlIChvdXIgb3duIGVuY29kaW5nIHVzZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSAweEZGRiAtIGNvZGUgKyAyO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VxID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG0gPSAwOyBtIDwgbGVuOyBtKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXEucHVzaChwYXJ0LmNoYXJDb2RlQXQobCsrKSk7IC8vIFNpbXBsZSB2YXJpYXRpb246IGRvbid0IHN1cHBvcnQgc3Vycm9nYXRlcyBvciBzdWJzZXF1ZW5jZXMgaW4gc2VxLlxuXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlVGFibGVbY3VyQWRkcisrXSA9IFNFUV9TVEFSVCAtIHRoaXMuZGVjb2RlVGFibGVTZXEubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY29kZVRhYmxlU2VxLnB1c2goc2VxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB3cml0ZVRhYmxlW2N1ckFkZHIrK10gPSBjb2RlOyAvLyBCYXNpYyBjaGFyXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwYXJ0ID09PSBcIm51bWJlclwiKSB7IC8vIEludGVnZXIsIG1lYW5pbmcgaW5jcmVhc2luZyBzZXF1ZW5jZSBzdGFydGluZyB3aXRoIHByZXYgY2hhcmFjdGVyLlxuICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gd3JpdGVUYWJsZVtjdXJBZGRyIC0gMV0gKyAxO1xuICAgICAgICAgICAgZm9yICh2YXIgbCA9IDA7IGwgPCBwYXJ0OyBsKyspXG4gICAgICAgICAgICAgICAgd3JpdGVUYWJsZVtjdXJBZGRyKytdID0gY2hhckNvZGUrKztcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNvcnJlY3QgdHlwZSAnXCIgKyB0eXBlb2YgcGFydCArIFwiJyBnaXZlbiBpbiBcIiAgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiIGF0IGNodW5rIFwiICsgY2h1bmtbMF0pO1xuICAgIH1cbiAgICBpZiAoY3VyQWRkciA+IDB4RkYpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY29ycmVjdCBjaHVuayBpbiBcIiAgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiIGF0IGFkZHIgXCIgKyBjaHVua1swXSArIFwiOiB0b28gbG9uZ1wiICsgY3VyQWRkcik7XG59XG5cbi8vIEVuY29kZXIgaGVscGVyc1xuREJDU0NvZGVjLnByb3RvdHlwZS5fZ2V0RW5jb2RlQnVja2V0ID0gZnVuY3Rpb24odUNvZGUpIHtcbiAgICB2YXIgaGlnaCA9IHVDb2RlID4+IDg7IC8vIFRoaXMgY291bGQgYmUgPiAweEZGIGJlY2F1c2Ugb2YgYXN0cmFsIGNoYXJhY3RlcnMuXG4gICAgaWYgKHRoaXMuZW5jb2RlVGFibGVbaGlnaF0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhpcy5lbmNvZGVUYWJsZVtoaWdoXSA9IFVOQVNTSUdORURfTk9ERS5zbGljZSgwKTsgLy8gQ3JlYXRlIGJ1Y2tldCBvbiBkZW1hbmQuXG4gICAgcmV0dXJuIHRoaXMuZW5jb2RlVGFibGVbaGlnaF07XG59XG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX3NldEVuY29kZUNoYXIgPSBmdW5jdGlvbih1Q29kZSwgZGJjc0NvZGUpIHtcbiAgICB2YXIgYnVja2V0ID0gdGhpcy5fZ2V0RW5jb2RlQnVja2V0KHVDb2RlKTtcbiAgICB2YXIgbG93ID0gdUNvZGUgJiAweEZGO1xuICAgIGlmIChidWNrZXRbbG93XSA8PSBTRVFfU1RBUlQpXG4gICAgICAgIHRoaXMuZW5jb2RlVGFibGVTZXFbU0VRX1NUQVJULWJ1Y2tldFtsb3ddXVtERUZfQ0hBUl0gPSBkYmNzQ29kZTsgLy8gVGhlcmUncyBhbHJlYWR5IGEgc2VxdWVuY2UsIHNldCBhIHNpbmdsZS1jaGFyIHN1YnNlcXVlbmNlIG9mIGl0LlxuICAgIGVsc2UgaWYgKGJ1Y2tldFtsb3ddID09IFVOQVNTSUdORUQpXG4gICAgICAgIGJ1Y2tldFtsb3ddID0gZGJjc0NvZGU7XG59XG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX3NldEVuY29kZVNlcXVlbmNlID0gZnVuY3Rpb24oc2VxLCBkYmNzQ29kZSkge1xuICAgIFxuICAgIC8vIEdldCB0aGUgcm9vdCBvZiBjaGFyYWN0ZXIgdHJlZSBhY2NvcmRpbmcgdG8gZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzZXF1ZW5jZS5cbiAgICB2YXIgdUNvZGUgPSBzZXFbMF07XG4gICAgdmFyIGJ1Y2tldCA9IHRoaXMuX2dldEVuY29kZUJ1Y2tldCh1Q29kZSk7XG4gICAgdmFyIGxvdyA9IHVDb2RlICYgMHhGRjtcblxuICAgIHZhciBub2RlO1xuICAgIGlmIChidWNrZXRbbG93XSA8PSBTRVFfU1RBUlQpIHtcbiAgICAgICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgc2VxdWVuY2Ugd2l0aCAgLSB1c2UgaXQuXG4gICAgICAgIG5vZGUgPSB0aGlzLmVuY29kZVRhYmxlU2VxW1NFUV9TVEFSVC1idWNrZXRbbG93XV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBUaGVyZSB3YXMgbm8gc2VxdWVuY2Ugb2JqZWN0IC0gYWxsb2NhdGUgYSBuZXcgb25lLlxuICAgICAgICBub2RlID0ge307XG4gICAgICAgIGlmIChidWNrZXRbbG93XSAhPT0gVU5BU1NJR05FRCkgbm9kZVtERUZfQ0hBUl0gPSBidWNrZXRbbG93XTsgLy8gSWYgYSBjaGFyIHdhcyBzZXQgYmVmb3JlIC0gbWFrZSBpdCBhIHNpbmdsZS1jaGFyIHN1YnNlcXVlbmNlLlxuICAgICAgICBidWNrZXRbbG93XSA9IFNFUV9TVEFSVCAtIHRoaXMuZW5jb2RlVGFibGVTZXEubGVuZ3RoO1xuICAgICAgICB0aGlzLmVuY29kZVRhYmxlU2VxLnB1c2gobm9kZSk7XG4gICAgfVxuXG4gICAgLy8gVHJhdmVyc2UgdGhlIGNoYXJhY3RlciB0cmVlLCBhbGxvY2F0aW5nIG5ldyBub2RlcyBhcyBuZWVkZWQuXG4gICAgZm9yICh2YXIgaiA9IDE7IGogPCBzZXEubGVuZ3RoLTE7IGorKykge1xuICAgICAgICB2YXIgb2xkVmFsID0gbm9kZVt1Q29kZV07XG4gICAgICAgIGlmICh0eXBlb2Ygb2xkVmFsID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgIG5vZGUgPSBvbGRWYWw7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm9kZSA9IG5vZGVbdUNvZGVdID0ge31cbiAgICAgICAgICAgIGlmIChvbGRWYWwgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBub2RlW0RFRl9DSEFSXSA9IG9sZFZhbFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBsZWFmIHRvIGdpdmVuIGRiY3NDb2RlLlxuICAgIHVDb2RlID0gc2VxW3NlcS5sZW5ndGgtMV07XG4gICAgbm9kZVt1Q29kZV0gPSBkYmNzQ29kZTtcbn1cblxuREJDU0NvZGVjLnByb3RvdHlwZS5fZmlsbEVuY29kZVRhYmxlID0gZnVuY3Rpb24obm9kZUlkeCwgcHJlZml4LCBza2lwRW5jb2RlQ2hhcnMpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzW25vZGVJZHhdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMHgxMDA7IGkrKykge1xuICAgICAgICB2YXIgdUNvZGUgPSBub2RlW2ldO1xuICAgICAgICB2YXIgbWJDb2RlID0gcHJlZml4ICsgaTtcbiAgICAgICAgaWYgKHNraXBFbmNvZGVDaGFyc1ttYkNvZGVdKVxuICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgaWYgKHVDb2RlID49IDApXG4gICAgICAgICAgICB0aGlzLl9zZXRFbmNvZGVDaGFyKHVDb2RlLCBtYkNvZGUpO1xuICAgICAgICBlbHNlIGlmICh1Q29kZSA8PSBOT0RFX1NUQVJUKVxuICAgICAgICAgICAgdGhpcy5fZmlsbEVuY29kZVRhYmxlKE5PREVfU1RBUlQgLSB1Q29kZSwgbWJDb2RlIDw8IDgsIHNraXBFbmNvZGVDaGFycyk7XG4gICAgICAgIGVsc2UgaWYgKHVDb2RlIDw9IFNFUV9TVEFSVClcbiAgICAgICAgICAgIHRoaXMuX3NldEVuY29kZVNlcXVlbmNlKHRoaXMuZGVjb2RlVGFibGVTZXFbU0VRX1NUQVJUIC0gdUNvZGVdLCBtYkNvZGUpO1xuICAgIH1cbn1cblxuXG5cbi8vID09IEVuY29kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIERCQ1NFbmNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgLy8gRW5jb2RlciBzdGF0ZVxuICAgIHRoaXMubGVhZFN1cnJvZ2F0ZSA9IC0xO1xuICAgIHRoaXMuc2VxT2JqID0gdW5kZWZpbmVkO1xuICAgIFxuICAgIC8vIFN0YXRpYyBkYXRhXG4gICAgdGhpcy5lbmNvZGVUYWJsZSA9IGNvZGVjLmVuY29kZVRhYmxlO1xuICAgIHRoaXMuZW5jb2RlVGFibGVTZXEgPSBjb2RlYy5lbmNvZGVUYWJsZVNlcTtcbiAgICB0aGlzLmRlZmF1bHRDaGFyU2luZ2xlQnl0ZSA9IGNvZGVjLmRlZkNoYXJTQjtcbiAgICB0aGlzLmdiMTgwMzAgPSBjb2RlYy5nYjE4MDMwO1xufVxuXG5EQkNTRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgbmV3QnVmID0gQnVmZmVyLmFsbG9jKHN0ci5sZW5ndGggKiAodGhpcy5nYjE4MDMwID8gNCA6IDMpKSxcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IHRoaXMubGVhZFN1cnJvZ2F0ZSxcbiAgICAgICAgc2VxT2JqID0gdGhpcy5zZXFPYmosIG5leHRDaGFyID0gLTEsXG4gICAgICAgIGkgPSAwLCBqID0gMDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIC8vIDAuIEdldCBuZXh0IGNoYXJhY3Rlci5cbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAtMSkge1xuICAgICAgICAgICAgaWYgKGkgPT0gc3RyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgICAgICB2YXIgdUNvZGUgPSBzdHIuY2hhckNvZGVBdChpKyspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHVDb2RlID0gbmV4dENoYXI7XG4gICAgICAgICAgICBuZXh0Q2hhciA9IC0xOyAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIEhhbmRsZSBzdXJyb2dhdGVzLlxuICAgICAgICBpZiAoMHhEODAwIDw9IHVDb2RlICYmIHVDb2RlIDwgMHhFMDAwKSB7IC8vIENoYXIgaXMgb25lIG9mIHN1cnJvZ2F0ZXMuXG4gICAgICAgICAgICBpZiAodUNvZGUgPCAweERDMDApIHsgLy8gV2UndmUgZ290IGxlYWQgc3Vycm9nYXRlLlxuICAgICAgICAgICAgICAgIGlmIChsZWFkU3Vycm9nYXRlID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gdUNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSB1Q29kZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG91YmxlIGxlYWQgc3Vycm9nYXRlIGZvdW5kLlxuICAgICAgICAgICAgICAgICAgICB1Q29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gV2UndmUgZ290IHRyYWlsIHN1cnJvZ2F0ZS5cbiAgICAgICAgICAgICAgICBpZiAobGVhZFN1cnJvZ2F0ZSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdUNvZGUgPSAweDEwMDAwICsgKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDApICogMHg0MDAgKyAodUNvZGUgLSAweERDMDApO1xuICAgICAgICAgICAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gLTE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBzdXJyb2dhdGUgcGFpciAtIG9ubHkgdHJhaWwgc3Vycm9nYXRlIGZvdW5kLlxuICAgICAgICAgICAgICAgICAgICB1Q29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBJbmNvbXBsZXRlIHN1cnJvZ2F0ZSBwYWlyIC0gb25seSBsZWFkIHN1cnJvZ2F0ZSBmb3VuZC5cbiAgICAgICAgICAgIG5leHRDaGFyID0gdUNvZGU7IHVDb2RlID0gVU5BU1NJR05FRDsgLy8gV3JpdGUgYW4gZXJyb3IsIHRoZW4gY3VycmVudCBjaGFyLlxuICAgICAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gQ29udmVydCB1Q29kZSBjaGFyYWN0ZXIuXG4gICAgICAgIHZhciBkYmNzQ29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgIGlmIChzZXFPYmogIT09IHVuZGVmaW5lZCAmJiB1Q29kZSAhPSBVTkFTU0lHTkVEKSB7IC8vIFdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzZXF1ZW5jZVxuICAgICAgICAgICAgdmFyIHJlc0NvZGUgPSBzZXFPYmpbdUNvZGVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNDb2RlID09PSAnb2JqZWN0JykgeyAvLyBTZXF1ZW5jZSBjb250aW51ZXMuXG4gICAgICAgICAgICAgICAgc2VxT2JqID0gcmVzQ29kZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzQ29kZSA9PSAnbnVtYmVyJykgeyAvLyBTZXF1ZW5jZSBmaW5pc2hlZC4gV3JpdGUgaXQuXG4gICAgICAgICAgICAgICAgZGJjc0NvZGUgPSByZXNDb2RlO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc0NvZGUgPT0gdW5kZWZpbmVkKSB7IC8vIEN1cnJlbnQgY2hhcmFjdGVyIGlzIG5vdCBwYXJ0IG9mIHRoZSBzZXF1ZW5jZS5cblxuICAgICAgICAgICAgICAgIC8vIFRyeSBkZWZhdWx0IGNoYXJhY3RlciBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgIHJlc0NvZGUgPSBzZXFPYmpbREVGX0NIQVJdO1xuICAgICAgICAgICAgICAgIGlmIChyZXNDb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGJjc0NvZGUgPSByZXNDb2RlOyAvLyBGb3VuZC4gV3JpdGUgaXQuXG4gICAgICAgICAgICAgICAgICAgIG5leHRDaGFyID0gdUNvZGU7IC8vIEN1cnJlbnQgY2hhcmFjdGVyIHdpbGwgYmUgd3JpdHRlbiB0b28gaW4gdGhlIG5leHQgaXRlcmF0aW9uLlxuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogV2hhdCBpZiB3ZSBoYXZlIG5vIGRlZmF1bHQ/IChyZXNDb2RlID09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlbiwgd2Ugc2hvdWxkIHdyaXRlIGZpcnN0IGNoYXIgb2YgdGhlIHNlcXVlbmNlIGFzLWlzIGFuZCB0cnkgdGhlIHJlc3QgcmVjdXJzaXZlbHkuXG4gICAgICAgICAgICAgICAgICAgIC8vIERpZG4ndCBkbyBpdCBmb3Igbm93IGJlY2F1c2Ugbm8gZW5jb2RpbmcgaGFzIHRoaXMgc2l0dWF0aW9uIHlldC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5LCBqdXN0IHNraXAgdGhlIHNlcXVlbmNlIGFuZCB3cml0ZSBjdXJyZW50IGNoYXIuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VxT2JqID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVDb2RlID49IDApIHsgIC8vIFJlZ3VsYXIgY2hhcmFjdGVyXG4gICAgICAgICAgICB2YXIgc3VidGFibGUgPSB0aGlzLmVuY29kZVRhYmxlW3VDb2RlID4+IDhdO1xuICAgICAgICAgICAgaWYgKHN1YnRhYmxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgZGJjc0NvZGUgPSBzdWJ0YWJsZVt1Q29kZSAmIDB4RkZdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZGJjc0NvZGUgPD0gU0VRX1NUQVJUKSB7IC8vIFNlcXVlbmNlIHN0YXJ0XG4gICAgICAgICAgICAgICAgc2VxT2JqID0gdGhpcy5lbmNvZGVUYWJsZVNlcVtTRVFfU1RBUlQtZGJjc0NvZGVdO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGJjc0NvZGUgPT0gVU5BU1NJR05FRCAmJiB0aGlzLmdiMTgwMzApIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgR0IxODAzMCBhbGdvcml0aG0gdG8gZmluZCBjaGFyYWN0ZXIocykgdG8gd3JpdGUuXG4gICAgICAgICAgICAgICAgdmFyIGlkeCA9IGZpbmRJZHgodGhpcy5nYjE4MDMwLnVDaGFycywgdUNvZGUpO1xuICAgICAgICAgICAgICAgIGlmIChpZHggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRiY3NDb2RlID0gdGhpcy5nYjE4MDMwLmdiQ2hhcnNbaWR4XSArICh1Q29kZSAtIHRoaXMuZ2IxODAzMC51Q2hhcnNbaWR4XSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0J1ZltqKytdID0gMHg4MSArIE1hdGguZmxvb3IoZGJjc0NvZGUgLyAxMjYwMCk7IGRiY3NDb2RlID0gZGJjc0NvZGUgJSAxMjYwMDtcbiAgICAgICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSAweDMwICsgTWF0aC5mbG9vcihkYmNzQ29kZSAvIDEyNjApOyBkYmNzQ29kZSA9IGRiY3NDb2RlICUgMTI2MDtcbiAgICAgICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSAweDgxICsgTWF0aC5mbG9vcihkYmNzQ29kZSAvIDEwKTsgZGJjc0NvZGUgPSBkYmNzQ29kZSAlIDEwO1xuICAgICAgICAgICAgICAgICAgICBuZXdCdWZbaisrXSA9IDB4MzAgKyBkYmNzQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gV3JpdGUgZGJjc0NvZGUgY2hhcmFjdGVyLlxuICAgICAgICBpZiAoZGJjc0NvZGUgPT09IFVOQVNTSUdORUQpXG4gICAgICAgICAgICBkYmNzQ29kZSA9IHRoaXMuZGVmYXVsdENoYXJTaW5nbGVCeXRlO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRiY3NDb2RlIDwgMHgxMDApIHtcbiAgICAgICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGJjc0NvZGUgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlID4+IDg7ICAgLy8gaGlnaCBieXRlXG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlICYgMHhGRjsgLy8gbG93IGJ5dGVcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgPj4gMTY7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IChkYmNzQ29kZSA+PiA4KSAmIDB4RkY7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlICYgMHhGRjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VxT2JqID0gc2VxT2JqO1xuICAgIHRoaXMubGVhZFN1cnJvZ2F0ZSA9IGxlYWRTdXJyb2dhdGU7XG4gICAgcmV0dXJuIG5ld0J1Zi5zbGljZSgwLCBqKTtcbn1cblxuREJDU0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmxlYWRTdXJyb2dhdGUgPT09IC0xICYmIHRoaXMuc2VxT2JqID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybjsgLy8gQWxsIGNsZWFuLiBNb3N0IG9mdGVuIGNhc2UuXG5cbiAgICB2YXIgbmV3QnVmID0gQnVmZmVyLmFsbG9jKDEwKSwgaiA9IDA7XG5cbiAgICBpZiAodGhpcy5zZXFPYmopIHsgLy8gV2UncmUgaW4gdGhlIHNlcXVlbmNlLlxuICAgICAgICB2YXIgZGJjc0NvZGUgPSB0aGlzLnNlcU9ialtERUZfQ0hBUl07XG4gICAgICAgIGlmIChkYmNzQ29kZSAhPT0gdW5kZWZpbmVkKSB7IC8vIFdyaXRlIGJlZ2lubmluZyBvZiB0aGUgc2VxdWVuY2UuXG4gICAgICAgICAgICBpZiAoZGJjc0NvZGUgPCAweDEwMCkge1xuICAgICAgICAgICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlID4+IDg7ICAgLy8gaGlnaCBieXRlXG4gICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZSAmIDB4RkY7IC8vIGxvdyBieXRlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZWUgdG9kbyBhYm92ZS5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlcU9iaiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkU3Vycm9nYXRlICE9PSAtMSkge1xuICAgICAgICAvLyBJbmNvbXBsZXRlIHN1cnJvZ2F0ZSBwYWlyIC0gb25seSBsZWFkIHN1cnJvZ2F0ZSBmb3VuZC5cbiAgICAgICAgbmV3QnVmW2orK10gPSB0aGlzLmRlZmF1bHRDaGFyU2luZ2xlQnl0ZTtcbiAgICAgICAgdGhpcy5sZWFkU3Vycm9nYXRlID0gLTE7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBuZXdCdWYuc2xpY2UoMCwgaik7XG59XG5cbi8vIEV4cG9ydCBmb3IgdGVzdGluZ1xuREJDU0VuY29kZXIucHJvdG90eXBlLmZpbmRJZHggPSBmaW5kSWR4O1xuXG5cbi8vID09IERlY29kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIERCQ1NEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgLy8gRGVjb2RlciBzdGF0ZVxuICAgIHRoaXMubm9kZUlkeCA9IDA7XG4gICAgdGhpcy5wcmV2QnVmID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gICAgLy8gU3RhdGljIGRhdGFcbiAgICB0aGlzLmRlY29kZVRhYmxlcyA9IGNvZGVjLmRlY29kZVRhYmxlcztcbiAgICB0aGlzLmRlY29kZVRhYmxlU2VxID0gY29kZWMuZGVjb2RlVGFibGVTZXE7XG4gICAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBjb2RlYy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgdGhpcy5nYjE4MDMwID0gY29kZWMuZ2IxODAzMDtcbn1cblxuREJDU0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmKSB7XG4gICAgdmFyIG5ld0J1ZiA9IEJ1ZmZlci5hbGxvYyhidWYubGVuZ3RoKjIpLFxuICAgICAgICBub2RlSWR4ID0gdGhpcy5ub2RlSWR4LCBcbiAgICAgICAgcHJldkJ1ZiA9IHRoaXMucHJldkJ1ZiwgcHJldkJ1Zk9mZnNldCA9IHRoaXMucHJldkJ1Zi5sZW5ndGgsXG4gICAgICAgIHNlcVN0YXJ0ID0gLXRoaXMucHJldkJ1Zi5sZW5ndGgsIC8vIGlkeCBvZiB0aGUgc3RhcnQgb2YgY3VycmVudCBwYXJzZWQgc2VxdWVuY2UuXG4gICAgICAgIHVDb2RlO1xuXG4gICAgaWYgKHByZXZCdWZPZmZzZXQgPiAwKSAvLyBNYWtlIHByZXYgYnVmIG92ZXJsYXAgYSBsaXR0bGUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gc2xpY2UgbGF0ZXIuXG4gICAgICAgIHByZXZCdWYgPSBCdWZmZXIuY29uY2F0KFtwcmV2QnVmLCBidWYuc2xpY2UoMCwgMTApXSk7XG4gICAgXG4gICAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjdXJCeXRlID0gKGkgPj0gMCkgPyBidWZbaV0gOiBwcmV2QnVmW2kgKyBwcmV2QnVmT2Zmc2V0XTtcblxuICAgICAgICAvLyBMb29rdXAgaW4gY3VycmVudCB0cmllIG5vZGUuXG4gICAgICAgIHZhciB1Q29kZSA9IHRoaXMuZGVjb2RlVGFibGVzW25vZGVJZHhdW2N1ckJ5dGVdO1xuXG4gICAgICAgIGlmICh1Q29kZSA+PSAwKSB7IFxuICAgICAgICAgICAgLy8gTm9ybWFsIGNoYXJhY3RlciwganVzdCB1c2UgaXQuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodUNvZGUgPT09IFVOQVNTSUdORUQpIHsgLy8gVW5rbm93biBjaGFyLlxuICAgICAgICAgICAgLy8gVE9ETzogQ2FsbGJhY2sgd2l0aCBzZXEuXG4gICAgICAgICAgICAvL3ZhciBjdXJTZXEgPSAoc2VxU3RhcnQgPj0gMCkgPyBidWYuc2xpY2Uoc2VxU3RhcnQsIGkrMSkgOiBwcmV2QnVmLnNsaWNlKHNlcVN0YXJ0ICsgcHJldkJ1Zk9mZnNldCwgaSsxICsgcHJldkJ1Zk9mZnNldCk7XG4gICAgICAgICAgICBpID0gc2VxU3RhcnQ7IC8vIFRyeSB0byBwYXJzZSBhZ2FpbiwgYWZ0ZXIgc2tpcHBpbmcgZmlyc3QgYnl0ZSBvZiB0aGUgc2VxdWVuY2UgKCdpJyB3aWxsIGJlIGluY3JlbWVudGVkIGJ5ICdmb3InIGN5Y2xlKS5cbiAgICAgICAgICAgIHVDb2RlID0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1Q29kZSA9PT0gR0IxODAzMF9DT0RFKSB7XG4gICAgICAgICAgICB2YXIgY3VyU2VxID0gKHNlcVN0YXJ0ID49IDApID8gYnVmLnNsaWNlKHNlcVN0YXJ0LCBpKzEpIDogcHJldkJ1Zi5zbGljZShzZXFTdGFydCArIHByZXZCdWZPZmZzZXQsIGkrMSArIHByZXZCdWZPZmZzZXQpO1xuICAgICAgICAgICAgdmFyIHB0ciA9IChjdXJTZXFbMF0tMHg4MSkqMTI2MDAgKyAoY3VyU2VxWzFdLTB4MzApKjEyNjAgKyAoY3VyU2VxWzJdLTB4ODEpKjEwICsgKGN1clNlcVszXS0weDMwKTtcbiAgICAgICAgICAgIHZhciBpZHggPSBmaW5kSWR4KHRoaXMuZ2IxODAzMC5nYkNoYXJzLCBwdHIpO1xuICAgICAgICAgICAgdUNvZGUgPSB0aGlzLmdiMTgwMzAudUNoYXJzW2lkeF0gKyBwdHIgLSB0aGlzLmdiMTgwMzAuZ2JDaGFyc1tpZHhdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVDb2RlIDw9IE5PREVfU1RBUlQpIHsgLy8gR28gdG8gbmV4dCB0cmllIG5vZGUuXG4gICAgICAgICAgICBub2RlSWR4ID0gTk9ERV9TVEFSVCAtIHVDb2RlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodUNvZGUgPD0gU0VRX1NUQVJUKSB7IC8vIE91dHB1dCBhIHNlcXVlbmNlIG9mIGNoYXJzLlxuICAgICAgICAgICAgdmFyIHNlcSA9IHRoaXMuZGVjb2RlVGFibGVTZXFbU0VRX1NUQVJUIC0gdUNvZGVdO1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZXEubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAgICAgICAgICAgdUNvZGUgPSBzZXFba107XG4gICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSA+PiA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdUNvZGUgPSBzZXFbc2VxLmxlbmd0aC0xXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpY29udi1saXRlIGludGVybmFsIGVycm9yOiBpbnZhbGlkIGRlY29kaW5nIHRhYmxlIHZhbHVlIFwiICsgdUNvZGUgKyBcIiBhdCBcIiArIG5vZGVJZHggKyBcIi9cIiArIGN1ckJ5dGUpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgdG8gYnVmZmVyLCBoYW5kbGluZyBoaWdoZXIgcGxhbmVzIHVzaW5nIHN1cnJvZ2F0ZSBwYWlyLlxuICAgICAgICBpZiAodUNvZGUgPiAweEZGRkYpIHsgXG4gICAgICAgICAgICB1Q29kZSAtPSAweDEwMDAwO1xuICAgICAgICAgICAgdmFyIHVDb2RlTGVhZCA9IDB4RDgwMCArIE1hdGguZmxvb3IodUNvZGUgLyAweDQwMCk7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IHVDb2RlTGVhZCAmIDB4RkY7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IHVDb2RlTGVhZCA+PiA4O1xuXG4gICAgICAgICAgICB1Q29kZSA9IDB4REMwMCArIHVDb2RlICUgMHg0MDA7XG4gICAgICAgIH1cbiAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSAmIDB4RkY7XG4gICAgICAgIG5ld0J1ZltqKytdID0gdUNvZGUgPj4gODtcblxuICAgICAgICAvLyBSZXNldCB0cmllIG5vZGUuXG4gICAgICAgIG5vZGVJZHggPSAwOyBzZXFTdGFydCA9IGkrMTtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVJZHggPSBub2RlSWR4O1xuICAgIHRoaXMucHJldkJ1ZiA9IChzZXFTdGFydCA+PSAwKSA/IGJ1Zi5zbGljZShzZXFTdGFydCkgOiBwcmV2QnVmLnNsaWNlKHNlcVN0YXJ0ICsgcHJldkJ1Zk9mZnNldCk7XG4gICAgcmV0dXJuIG5ld0J1Zi5zbGljZSgwLCBqKS50b1N0cmluZygndWNzMicpO1xufVxuXG5EQkNTRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJldCA9ICcnO1xuXG4gICAgLy8gVHJ5IHRvIHBhcnNlIGFsbCByZW1haW5pbmcgY2hhcnMuXG4gICAgd2hpbGUgKHRoaXMucHJldkJ1Zi5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNraXAgMSBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlci5cbiAgICAgICAgcmV0ICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgICB2YXIgYnVmID0gdGhpcy5wcmV2QnVmLnNsaWNlKDEpO1xuXG4gICAgICAgIC8vIFBhcnNlIHJlbWFpbmluZyBhcyB1c3VhbC5cbiAgICAgICAgdGhpcy5wcmV2QnVmID0gQnVmZmVyLmFsbG9jKDApO1xuICAgICAgICB0aGlzLm5vZGVJZHggPSAwO1xuICAgICAgICBpZiAoYnVmLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXQgKz0gdGhpcy53cml0ZShidWYpO1xuICAgIH1cblxuICAgIHRoaXMubm9kZUlkeCA9IDA7XG4gICAgcmV0dXJuIHJldDtcbn1cblxuLy8gQmluYXJ5IHNlYXJjaCBmb3IgR0IxODAzMC4gUmV0dXJucyBsYXJnZXN0IGkgc3VjaCB0aGF0IHRhYmxlW2ldIDw9IHZhbC5cbmZ1bmN0aW9uIGZpbmRJZHgodGFibGUsIHZhbCkge1xuICAgIGlmICh0YWJsZVswXSA+IHZhbClcbiAgICAgICAgcmV0dXJuIC0xO1xuXG4gICAgdmFyIGwgPSAwLCByID0gdGFibGUubGVuZ3RoO1xuICAgIHdoaWxlIChsIDwgci0xKSB7IC8vIGFsd2F5cyB0YWJsZVtsXSA8PSB2YWwgPCB0YWJsZVtyXVxuICAgICAgICB2YXIgbWlkID0gbCArIE1hdGguZmxvb3IoKHItbCsxKS8yKTtcbiAgICAgICAgaWYgKHRhYmxlW21pZF0gPD0gdmFsKVxuICAgICAgICAgICAgbCA9IG1pZDtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgciA9IG1pZDtcbiAgICB9XG4gICAgcmV0dXJuIGw7XG59XG5cbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLy8gRGVzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIGRvdWJsZSBieXRlIGVuY29kaW5ncyBhbmQgYWxpYXNlcy5cbi8vIFRhYmxlcyBhcmUgbm90IHJlcXVpcmUoKS1kIHVudGlsIHRoZXkgYXJlIG5lZWRlZCB0byBzcGVlZCB1cCBsaWJyYXJ5IGxvYWQuXG4vLyByZXF1aXJlKCktcyBhcmUgZGlyZWN0IHRvIHN1cHBvcnQgQnJvd3NlcmlmeS5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgXG4gICAgLy8gPT0gSmFwYW5lc2UvU2hpZnRKSVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEFsbCBqYXBhbmVzZSBlbmNvZGluZ3MgYXJlIGJhc2VkIG9uIEpJUyBYIHNldCBvZiBzdGFuZGFyZHM6XG4gICAgLy8gSklTIFggMDIwMSAtIFNpbmdsZS1ieXRlIGVuY29kaW5nIG9mIEFTQ0lJICsgXHUwMEE1ICsgS2FuYSBjaGFycyBhdCAweEExLTB4REYuXG4gICAgLy8gSklTIFggMDIwOCAtIE1haW4gc2V0IG9mIDY4NzkgY2hhcmFjdGVycywgcGxhY2VkIGluIDk0eDk0IHBsYW5lLCB0byBiZSBlbmNvZGVkIGJ5IDIgYnl0ZXMuIFxuICAgIC8vICAgICAgICAgICAgICBIYXMgc2V2ZXJhbCB2YXJpYXRpb25zIGluIDE5NzgsIDE5ODMsIDE5OTAgYW5kIDE5OTcuXG4gICAgLy8gSklTIFggMDIxMiAtIFN1cHBsZW1lbnRhcnkgcGxhbmUgb2YgNjA2NyBjaGFycyBpbiA5NHg5NCBwbGFuZS4gMTk5MC4gRWZmZWN0aXZlbHkgZGVhZC5cbiAgICAvLyBKSVMgWCAwMjEzIC0gRXh0ZW5zaW9uIGFuZCBtb2Rlcm4gcmVwbGFjZW1lbnQgb2YgMDIwOCBhbmQgMDIxMi4gVG90YWwgY2hhcnM6IDExMjMzLlxuICAgIC8vICAgICAgICAgICAgICAyIHBsYW5lcywgZmlyc3QgaXMgc3VwZXJzZXQgb2YgMDIwOCwgc2Vjb25kIC0gcmV2aXNlZCAwMjEyLlxuICAgIC8vICAgICAgICAgICAgICBJbnRyb2R1Y2VkIGluIDIwMDAsIHJldmlzZWQgMjAwNC4gU29tZSBjaGFyYWN0ZXJzIGFyZSBpbiBVbmljb2RlIFBsYW5lIDIgKDB4Mnh4eHgpXG5cbiAgICAvLyBCeXRlIGVuY29kaW5ncyBhcmU6XG4gICAgLy8gICogU2hpZnRfSklTOiBDb21wYXRpYmxlIHdpdGggMDIwMSwgdXNlcyBub3QgZGVmaW5lZCBjaGFycyBpbiB0b3AgaGFsZiBhcyBsZWFkIGJ5dGVzIGZvciBkb3VibGUtYnl0ZVxuICAgIC8vICAgICAgICAgICAgICAgZW5jb2Rpbmcgb2YgMDIwOC4gTGVhZCBieXRlIHJhbmdlczogMHg4MS0weDlGLCAweEUwLTB4RUY7IFRyYWlsIGJ5dGUgcmFuZ2VzOiAweDQwLTB4N0UsIDB4ODAtMHg5RSwgMHg5Ri0weEZDLlxuICAgIC8vICAgICAgICAgICAgICAgV2luZG93cyBDUDkzMiBpcyBhIHN1cGVyc2V0IG9mIFNoaWZ0X0pJUy4gU29tZSBjb21wYW5pZXMgYWRkZWQgbW9yZSBjaGFycywgbm90YWJseSBLRERJLlxuICAgIC8vICAqIEVVQy1KUDogICAgVXAgdG8gMyBieXRlcyBwZXIgY2hhcmFjdGVyLiBVc2VkIG1vc3RseSBvbiAqbml4ZXMuXG4gICAgLy8gICAgICAgICAgICAgICAweDAwLTB4N0YgICAgICAgLSBsb3dlciBwYXJ0IG9mIDAyMDFcbiAgICAvLyAgICAgICAgICAgICAgIDB4OEUsIDB4QTEtMHhERiAtIHVwcGVyIHBhcnQgb2YgMDIwMVxuICAgIC8vICAgICAgICAgICAgICAgKDB4QTEtMHhGRSl4MiAgIC0gMDIwOCBwbGFuZSAoOTR4OTQpLlxuICAgIC8vICAgICAgICAgICAgICAgMHg4RiwgKDB4QTEtMHhGRSl4MiAtIDAyMTIgcGxhbmUgKDk0eDk0KS5cbiAgICAvLyAgKiBKSVMgWCAyMDg6IDctYml0LCBkaXJlY3QgZW5jb2Rpbmcgb2YgMDIwOC4gQnl0ZSByYW5nZXM6IDB4MjEtMHg3RSAoOTQgdmFsdWVzKS4gVW5jb21tb24uXG4gICAgLy8gICAgICAgICAgICAgICBVc2VkIGFzLWlzIGluIElTTzIwMjIgZmFtaWx5LlxuICAgIC8vICAqIElTTzIwMjItSlA6IFN0YXRlZnVsIGVuY29kaW5nLCB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgdG8gc3dpdGNoIGJldHdlZW4gQVNDSUksIFxuICAgIC8vICAgICAgICAgICAgICAgIDAyMDEtMTk3NiBSb21hbiwgMDIwOC0xOTc4LCAwMjA4LTE5ODMuXG4gICAgLy8gICogSVNPMjAyMi1KUC0xOiBBZGRzIGVzYyBzZXEgZm9yIDAyMTItMTk5MC5cbiAgICAvLyAgKiBJU08yMDIyLUpQLTI6IEFkZHMgZXNjIHNlcSBmb3IgR0IyMzEzLTE5ODAsIEtTWDEwMDEtMTk5MiwgSVNPODg1OS0xLCBJU084ODU5LTcuXG4gICAgLy8gICogSVNPMjAyMi1KUC0zOiBBZGRzIGVzYyBzZXEgZm9yIDAyMDEtMTk3NiBLYW5hIHNldCwgMDIxMy0yMDAwIFBsYW5lcyAxLCAyLlxuICAgIC8vICAqIElTTzIwMjItSlAtMjAwNDogQWRkcyAwMjEzLTIwMDQgUGxhbmUgMS5cbiAgICAvL1xuICAgIC8vIEFmdGVyIEpJUyBYIDAyMTMgYXBwZWFyZWQsIFNoaWZ0X0pJUy0yMDA0LCBFVUMtSklTWDAyMTMgYW5kIElTTzIwMjItSlAtMjAwNCBmb2xsb3dlZCwgd2l0aCBqdXN0IGNoYW5naW5nIHRoZSBwbGFuZXMuXG4gICAgLy9cbiAgICAvLyBPdmVyYWxsLCBpdCBzZWVtcyB0aGF0IGl0J3MgYSBtZXNzIDooIGh0dHA6Ly93d3c4LnBsYWxhLm9yLmpwL3RrdWJvdGExL3VuaWNvZGUtc3ltYm9scy1tYXAyLmh0bWxcblxuICAgICdzaGlmdGppcyc6IHtcbiAgICAgICAgdHlwZTogJ19kYmNzJyxcbiAgICAgICAgdGFibGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVxdWlyZSgnLi90YWJsZXMvc2hpZnRqaXMuanNvbicpIH0sXG4gICAgICAgIGVuY29kZUFkZDogeydcXHUwMGE1JzogMHg1QywgJ1xcdTIwM0UnOiAweDdFfSxcbiAgICAgICAgZW5jb2RlU2tpcFZhbHM6IFt7ZnJvbTogMHhFRDQwLCB0bzogMHhGOTQwfV0sXG4gICAgfSxcbiAgICAnY3NzaGlmdGppcyc6ICdzaGlmdGppcycsXG4gICAgJ21za2FuamknOiAnc2hpZnRqaXMnLFxuICAgICdzamlzJzogJ3NoaWZ0amlzJyxcbiAgICAnd2luZG93czMxaic6ICdzaGlmdGppcycsXG4gICAgJ21zMzFqJzogJ3NoaWZ0amlzJyxcbiAgICAneHNqaXMnOiAnc2hpZnRqaXMnLFxuICAgICd3aW5kb3dzOTMyJzogJ3NoaWZ0amlzJyxcbiAgICAnbXM5MzInOiAnc2hpZnRqaXMnLFxuICAgICc5MzInOiAnc2hpZnRqaXMnLFxuICAgICdjcDkzMic6ICdzaGlmdGppcycsXG5cbiAgICAnZXVjanAnOiB7XG4gICAgICAgIHR5cGU6ICdfZGJjcycsXG4gICAgICAgIHRhYmxlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL2V1Y2pwLmpzb24nKSB9LFxuICAgICAgICBlbmNvZGVBZGQ6IHsnXFx1MDBhNSc6IDB4NUMsICdcXHUyMDNFJzogMHg3RX0sXG4gICAgfSxcblxuICAgIC8vIFRPRE86IEtEREkgZXh0ZW5zaW9uIHRvIFNoaWZ0X0pJU1xuICAgIC8vIFRPRE86IElCTSBDQ1NJRCA5NDIgPSBDUDkzMiwgYnV0IEYwLUY5IGN1c3RvbSBjaGFycyBhbmQgb3RoZXIgY2hhciBjaGFuZ2VzLlxuICAgIC8vIFRPRE86IElCTSBDQ1NJRCA5NDMgPSBTaGlmdF9KSVMgPSBDUDkzMiB3aXRoIG9yaWdpbmFsIFNoaWZ0X0pJUyBsb3dlciAxMjggY2hhcnMuXG5cblxuICAgIC8vID09IENoaW5lc2UvR0JLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dCS1xuICAgIC8vIFdlIG1vc3RseSBpbXBsZW1lbnQgVzNDIHJlY29tbWVuZGF0aW9uOiBodHRwczovL3d3dy53My5vcmcvVFIvZW5jb2RpbmcvI2diay1lbmNvZGVyXG5cbiAgICAvLyBPbGRlc3QgR0IyMzEyICgxOTgxLCB+NzYwMCBjaGFycykgaXMgYSBzdWJzZXQgb2YgQ1A5MzZcbiAgICAnZ2IyMzEyJzogJ2NwOTM2JyxcbiAgICAnZ2IyMzEyODAnOiAnY3A5MzYnLFxuICAgICdnYjIzMTIxOTgwJzogJ2NwOTM2JyxcbiAgICAnY3NnYjIzMTInOiAnY3A5MzYnLFxuICAgICdjc2lzbzU4Z2IyMzEyODAnOiAnY3A5MzYnLFxuICAgICdldWNjbic6ICdjcDkzNicsXG5cbiAgICAvLyBNaWNyb3NvZnQncyBDUDkzNiBpcyBhIHN1YnNldCBhbmQgYXBwcm94aW1hdGlvbiBvZiBHQksuXG4gICAgJ3dpbmRvd3M5MzYnOiAnY3A5MzYnLFxuICAgICdtczkzNic6ICdjcDkzNicsXG4gICAgJzkzNic6ICdjcDkzNicsXG4gICAgJ2NwOTM2Jzoge1xuICAgICAgICB0eXBlOiAnX2RiY3MnLFxuICAgICAgICB0YWJsZTogZnVuY3Rpb24oKSB7IHJldHVybiByZXF1aXJlKCcuL3RhYmxlcy9jcDkzNi5qc29uJykgfSxcbiAgICB9LFxuXG4gICAgLy8gR0JLICh+MjIwMDAgY2hhcnMpIGlzIGFuIGV4dGVuc2lvbiBvZiBDUDkzNiB0aGF0IGFkZGVkIHVzZXItbWFwcGVkIGNoYXJzIGFuZCBzb21lIG90aGVyLlxuICAgICdnYmsnOiB7XG4gICAgICAgIHR5cGU6ICdfZGJjcycsXG4gICAgICAgIHRhYmxlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL2NwOTM2Lmpzb24nKS5jb25jYXQocmVxdWlyZSgnLi90YWJsZXMvZ2JrLWFkZGVkLmpzb24nKSkgfSxcbiAgICB9LFxuICAgICd4Z2JrJzogJ2diaycsXG4gICAgJ2lzb2lyNTgnOiAnZ2JrJyxcblxuICAgIC8vIEdCMTgwMzAgaXMgYW4gYWxnb3JpdGhtaWMgZXh0ZW5zaW9uIG9mIEdCSy5cbiAgICAvLyBNYWluIHNvdXJjZTogaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY29kaW5nLyNnYmstZW5jb2RlclxuICAgIC8vIGh0dHA6Ly9pY3UtcHJvamVjdC5vcmcvZG9jcy9wYXBlcnMvZ2IxODAzMC5odG1sXG4gICAgLy8gaHR0cDovL3NvdXJjZS5pY3UtcHJvamVjdC5vcmcvcmVwb3MvaWN1L2RhdGEvdHJ1bmsvY2hhcnNldC9kYXRhL3htbC9nYi0xODAzMC0yMDAwLnhtbFxuICAgIC8vIGh0dHA6Ly93d3cua2huZ2FpLmNvbS9jaGluZXNlL2NoYXJtYXAvdGJsZ2JrLnBocD9wYWdlPTBcbiAgICAnZ2IxODAzMCc6IHtcbiAgICAgICAgdHlwZTogJ19kYmNzJyxcbiAgICAgICAgdGFibGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVxdWlyZSgnLi90YWJsZXMvY3A5MzYuanNvbicpLmNvbmNhdChyZXF1aXJlKCcuL3RhYmxlcy9nYmstYWRkZWQuanNvbicpKSB9LFxuICAgICAgICBnYjE4MDMwOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL2diMTgwMzAtcmFuZ2VzLmpzb24nKSB9LFxuICAgICAgICBlbmNvZGVTa2lwVmFsczogWzB4ODBdLFxuICAgICAgICBlbmNvZGVBZGQ6IHsnXHUyMEFDJzogMHhBMkUzfSxcbiAgICB9LFxuXG4gICAgJ2NoaW5lc2UnOiAnZ2IxODAzMCcsXG5cblxuICAgIC8vID09IEtvcmVhbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBFVUMtS1IsIEtTX0NfNTYwMSBhbmQgS1MgWCAxMDAxIGFyZSBleGFjdGx5IHRoZSBzYW1lLlxuICAgICd3aW5kb3dzOTQ5JzogJ2NwOTQ5JyxcbiAgICAnbXM5NDknOiAnY3A5NDknLFxuICAgICc5NDknOiAnY3A5NDknLFxuICAgICdjcDk0OSc6IHtcbiAgICAgICAgdHlwZTogJ19kYmNzJyxcbiAgICAgICAgdGFibGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVxdWlyZSgnLi90YWJsZXMvY3A5NDkuanNvbicpIH0sXG4gICAgfSxcblxuICAgICdjc2V1Y2tyJzogJ2NwOTQ5JyxcbiAgICAnY3Nrc2M1NjAxMTk4Nyc6ICdjcDk0OScsXG4gICAgJ2V1Y2tyJzogJ2NwOTQ5JyxcbiAgICAnaXNvaXIxNDknOiAnY3A5NDknLFxuICAgICdrb3JlYW4nOiAnY3A5NDknLFxuICAgICdrc2M1NjAxMTk4Nyc6ICdjcDk0OScsXG4gICAgJ2tzYzU2MDExOTg5JzogJ2NwOTQ5JyxcbiAgICAna3NjNTYwMSc6ICdjcDk0OScsXG5cblxuICAgIC8vID09IEJpZzUvVGFpd2FuL0hvbmcgS29uZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBUaGVyZSBhcmUgbG90cyBvZiB0YWJsZXMgZm9yIEJpZzUgYW5kIGNwOTUwLiBQbGVhc2Ugc2VlIHRoZSBmb2xsb3dpbmcgbGlua3MgZm9yIGhpc3Rvcnk6XG4gICAgLy8gaHR0cDovL21venR3Lm9yZy9kb2NzL2JpZzUvICBodHRwOi8vd3d3LmhhaWJsZS5kZS9icnVuby9jaGFyc2V0cy9jb252ZXJzaW9uLXRhYmxlcy9CaWc1Lmh0bWxcbiAgICAvLyBWYXJpYXRpb25zLCBpbiByb3VnaGx5IG51bWJlciBvZiBkZWZpbmVkIGNoYXJzOlxuICAgIC8vICAqIFdpbmRvd3MgQ1AgOTUwOiBNaWNyb3NvZnQgdmFyaWFudCBvZiBCaWc1LiBDYW5vbmljYWw6IGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A5NTAuVFhUXG4gICAgLy8gICogV2luZG93cyBDUCA5NTE6IE1pY3Jvc29mdCB2YXJpYW50IG9mIEJpZzUtSEtTQ1MtMjAwMS4gU2VlbXMgdG8gYmUgbmV2ZXIgcHVibGljLiBodHRwOi8vbWUuYWJlbGNoZXVuZy5vcmcvYXJ0aWNsZXMvcmVzZWFyY2gvd2hhdC1pcy1jcDk1MS9cbiAgICAvLyAgKiBCaWc1LTIwMDMgKFRhaXdhbiBzdGFuZGFyZCkgYWxtb3N0IHN1cGVyc2V0IG9mIGNwOTUwLlxuICAgIC8vICAqIFVuaWNvZGUtYXQtb24gKFVBTykgLyBNb3ppbGxhIDEuOC4gRmFsbGluZyBvdXQgb2YgdXNlIG9uIHRoZSBXZWIuIE5vdCBzdXBwb3J0ZWQgYnkgb3RoZXIgYnJvd3NlcnMuXG4gICAgLy8gICogQmlnNS1IS1NDUyAoLTIwMDEsIC0yMDA0LCAtMjAwOCkuIEhvbmcgS29uZyBzdGFuZGFyZC4gXG4gICAgLy8gICAgbWFueSB1bmljb2RlIGNvZGUgcG9pbnRzIG1vdmVkIGZyb20gUFVBIHRvIFN1cHBsZW1lbnRhcnkgcGxhbmUgKFUrMlhYWFgpIG92ZXIgdGhlIHllYXJzLlxuICAgIC8vICAgIFBsdXMsIGl0IGhhcyA0IGNvbWJpbmluZyBzZXF1ZW5jZXMuXG4gICAgLy8gICAgU2VlbXMgdGhhdCBNb3ppbGxhIHJlZnVzZWQgdG8gc3VwcG9ydCBpdCBmb3IgMTAgeXJzLiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNjI0MzEgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzEwMjk5XG4gICAgLy8gICAgYmVjYXVzZSBiaWc1LWhrc2NzIGlzIHRoZSBvbmx5IGVuY29kaW5nIHRvIGluY2x1ZGUgYXN0cmFsIGNoYXJhY3RlcnMgaW4gbm9uLWFsZ29yaXRobWljIHdheS5cbiAgICAvLyAgICBJbXBsZW1lbnRhdGlvbnMgYXJlIG5vdCBjb25zaXN0ZW50IHdpdGhpbiBicm93c2Vyczsgc29tZXRpbWVzIGxhYmVsZWQgYXMganVzdCBiaWc1LlxuICAgIC8vICAgIE1TIEludGVybmV0IEV4cGxvcmVyIHN3aXRjaGVzIGZyb20gYmlnNSB0byBiaWc1LWhrc2NzIHdoZW4gYSBwYXRjaCBhcHBsaWVkLlxuICAgIC8vICAgIEdyZWF0IGRpc2N1c3Npb24gJiByZWNhcCBvZiB3aGF0J3MgZ29pbmcgb24gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTEyNDcwI2MzMVxuICAgIC8vICAgIEluIHRoZSBlbmNvZGVyLCBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIHN1cHBvcnQgZW5jb2Rpbmcgb2xkIFBVQSBtYXBwaW5ncyB0byBCaWc1IGJ5dGVzIHNlcS1zLlxuICAgIC8vICAgIE9mZmljaWFsIHNwZWM6IGh0dHA6Ly93d3cub2djaW8uZ292LmhrL2VuL2J1c2luZXNzL3RlY2hfcHJvbW90aW9uL2NjbGkvdGVybXMvZG9jLzIwMDNjbXBfMjAwOC50eHRcbiAgICAvLyAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lm9nY2lvLmdvdi5oay90Yy9idXNpbmVzcy90ZWNoX3Byb21vdGlvbi9jY2xpL3Rlcm1zL2RvYy9oa3Njcy0yMDA4LWJpZzUtaXNvLnR4dFxuICAgIC8vIFxuICAgIC8vIEN1cnJlbnQgdW5kZXJzdGFuZGluZyBvZiBob3cgdG8gZGVhbCB3aXRoIEJpZzUoLUhLU0NTKSBpcyBpbiB0aGUgRW5jb2RpbmcgU3RhbmRhcmQsIGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2JpZzUtZW5jb2RlclxuICAgIC8vIFVuaWNvZGUgbWFwcGluZyAoaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvT0JTT0xFVEUvRUFTVEFTSUEvT1RIRVIvQklHNS5UWFQpIGlzIHNhaWQgdG8gYmUgd3JvbmcuXG5cbiAgICAnd2luZG93czk1MCc6ICdjcDk1MCcsXG4gICAgJ21zOTUwJzogJ2NwOTUwJyxcbiAgICAnOTUwJzogJ2NwOTUwJyxcbiAgICAnY3A5NTAnOiB7XG4gICAgICAgIHR5cGU6ICdfZGJjcycsXG4gICAgICAgIHRhYmxlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL2NwOTUwLmpzb24nKSB9LFxuICAgIH0sXG5cbiAgICAvLyBCaWc1IGhhcyBtYW55IHZhcmlhdGlvbnMgYW5kIGlzIGFuIGV4dGVuc2lvbiBvZiBjcDk1MC4gV2UgdXNlIEVuY29kaW5nIFN0YW5kYXJkJ3MgYXMgYSBjb25zZW5zdXMuXG4gICAgJ2JpZzUnOiAnYmlnNWhrc2NzJyxcbiAgICAnYmlnNWhrc2NzJzoge1xuICAgICAgICB0eXBlOiAnX2RiY3MnLFxuICAgICAgICB0YWJsZTogZnVuY3Rpb24oKSB7IHJldHVybiByZXF1aXJlKCcuL3RhYmxlcy9jcDk1MC5qc29uJykuY29uY2F0KHJlcXVpcmUoJy4vdGFibGVzL2JpZzUtYWRkZWQuanNvbicpKSB9LFxuICAgICAgICBlbmNvZGVTa2lwVmFsczogWzB4YTJjY10sXG4gICAgfSxcblxuICAgICdjbmJpZzUnOiAnYmlnNWhrc2NzJyxcbiAgICAnY3NiaWc1JzogJ2JpZzVoa3NjcycsXG4gICAgJ3h4YmlnNSc6ICdiaWc1aGtzY3MnLFxufTtcbiIsICJcInVzZSBzdHJpY3RcIjtcblxuLy8gVXBkYXRlIHRoaXMgYXJyYXkgaWYgeW91IGFkZC9yZW5hbWUvcmVtb3ZlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5LlxuLy8gV2Ugc3VwcG9ydCBCcm93c2VyaWZ5IGJ5IHNraXBwaW5nIGF1dG9tYXRpYyBtb2R1bGUgZGlzY292ZXJ5IGFuZCByZXF1aXJpbmcgbW9kdWxlcyBkaXJlY3RseS5cbnZhciBtb2R1bGVzID0gW1xuICAgIHJlcXVpcmUoXCIuL2ludGVybmFsXCIpLFxuICAgIHJlcXVpcmUoXCIuL3V0ZjE2XCIpLFxuICAgIHJlcXVpcmUoXCIuL3V0ZjdcIiksXG4gICAgcmVxdWlyZShcIi4vc2Jjcy1jb2RlY1wiKSxcbiAgICByZXF1aXJlKFwiLi9zYmNzLWRhdGFcIiksXG4gICAgcmVxdWlyZShcIi4vc2Jjcy1kYXRhLWdlbmVyYXRlZFwiKSxcbiAgICByZXF1aXJlKFwiLi9kYmNzLWNvZGVjXCIpLFxuICAgIHJlcXVpcmUoXCIuL2RiY3MtZGF0YVwiKSxcbl07XG5cbi8vIFB1dCBhbGwgZW5jb2RpbmcvYWxpYXMvY29kZWMgZGVmaW5pdGlvbnMgdG8gc2luZ2xlIG9iamVjdCBhbmQgZXhwb3J0IGl0LiBcbmZvciAodmFyIGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtb2R1bGUgPSBtb2R1bGVzW2ldO1xuICAgIGZvciAodmFyIGVuYyBpbiBtb2R1bGUpXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kdWxlLCBlbmMpKVxuICAgICAgICAgICAgZXhwb3J0c1tlbmNdID0gbW9kdWxlW2VuY107XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKFwiYnVmZmVyXCIpLkJ1ZmZlcixcbiAgICBUcmFuc2Zvcm0gPSByZXF1aXJlKFwic3RyZWFtXCIpLlRyYW5zZm9ybTtcblxuXG4vLyA9PSBFeHBvcnRzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpY29udikge1xuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgUHVibGljIEFQSS5cbiAgICBpY29udi5lbmNvZGVTdHJlYW0gPSBmdW5jdGlvbiBlbmNvZGVTdHJlYW0oZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJY29udkxpdGVFbmNvZGVyU3RyZWFtKGljb252LmdldEVuY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpY29udi5kZWNvZGVTdHJlYW0gPSBmdW5jdGlvbiBkZWNvZGVTdHJlYW0oZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJY29udkxpdGVEZWNvZGVyU3RyZWFtKGljb252LmdldERlY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpY29udi5zdXBwb3J0c1N0cmVhbXMgPSB0cnVlO1xuXG5cbiAgICAvLyBOb3QgcHVibGlzaGVkIHlldC5cbiAgICBpY29udi5JY29udkxpdGVFbmNvZGVyU3RyZWFtID0gSWNvbnZMaXRlRW5jb2RlclN0cmVhbTtcbiAgICBpY29udi5JY29udkxpdGVEZWNvZGVyU3RyZWFtID0gSWNvbnZMaXRlRGVjb2RlclN0cmVhbTtcbiAgICBpY29udi5fY29sbGVjdCA9IEljb252TGl0ZURlY29kZXJTdHJlYW0ucHJvdG90eXBlLmNvbGxlY3Q7XG59O1xuXG5cbi8vID09IEVuY29kZXIgc3RyZWFtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIEljb252TGl0ZUVuY29kZXJTdHJlYW0oY29udiwgb3B0aW9ucykge1xuICAgIHRoaXMuY29udiA9IGNvbnY7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID0gZmFsc2U7IC8vIFdlIGFjY2VwdCBvbmx5IHN0cmluZ3MsIHNvIHdlIGRvbid0IG5lZWQgdG8gZGVjb2RlIHRoZW0uXG4gICAgVHJhbnNmb3JtLmNhbGwodGhpcywgb3B0aW9ucyk7XG59XG5cbkljb252TGl0ZUVuY29kZXJTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShUcmFuc2Zvcm0ucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHsgdmFsdWU6IEljb252TGl0ZUVuY29kZXJTdHJlYW0gfVxufSk7XG5cbkljb252TGl0ZUVuY29kZXJTdHJlYW0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbihjaHVuaywgZW5jb2RpbmcsIGRvbmUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rICE9ICdzdHJpbmcnKVxuICAgICAgICByZXR1cm4gZG9uZShuZXcgRXJyb3IoXCJJY29udiBlbmNvZGluZyBzdHJlYW0gbmVlZHMgc3RyaW5ncyBhcyBpdHMgaW5wdXQuXCIpKTtcbiAgICB0cnkge1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5jb252LndyaXRlKGNodW5rKTtcbiAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoKSB0aGlzLnB1c2gocmVzKTtcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBkb25lKGUpO1xuICAgIH1cbn1cblxuSWNvbnZMaXRlRW5jb2RlclN0cmVhbS5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24oZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmNvbnYuZW5kKCk7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCkgdGhpcy5wdXNoKHJlcyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZG9uZShlKTtcbiAgICB9XG59XG5cbkljb252TGl0ZUVuY29kZXJTdHJlYW0ucHJvdG90eXBlLmNvbGxlY3QgPSBmdW5jdGlvbihjYikge1xuICAgIHZhciBjaHVua3MgPSBbXTtcbiAgICB0aGlzLm9uKCdlcnJvcicsIGNiKTtcbiAgICB0aGlzLm9uKCdkYXRhJywgZnVuY3Rpb24oY2h1bmspIHsgY2h1bmtzLnB1c2goY2h1bmspOyB9KTtcbiAgICB0aGlzLm9uKCdlbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY2IobnVsbCwgQnVmZmVyLmNvbmNhdChjaHVua3MpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbn1cblxuXG4vLyA9PSBEZWNvZGVyIHN0cmVhbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5mdW5jdGlvbiBJY29udkxpdGVEZWNvZGVyU3RyZWFtKGNvbnYsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmNvbnYgPSBjb252O1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIG9wdGlvbnMuZW5jb2RpbmcgPSB0aGlzLmVuY29kaW5nID0gJ3V0ZjgnOyAvLyBXZSBvdXRwdXQgc3RyaW5ncy5cbiAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybS5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogSWNvbnZMaXRlRGVjb2RlclN0cmVhbSB9XG59KTtcblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgZG9uZSkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSlcbiAgICAgICAgcmV0dXJuIGRvbmUobmV3IEVycm9yKFwiSWNvbnYgZGVjb2Rpbmcgc3RyZWFtIG5lZWRzIGJ1ZmZlcnMgYXMgaXRzIGlucHV0LlwiKSk7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuY29udi53cml0ZShjaHVuayk7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCkgdGhpcy5wdXNoKHJlcywgdGhpcy5lbmNvZGluZyk7XG4gICAgICAgIGRvbmUoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZG9uZShlKTtcbiAgICB9XG59XG5cbkljb252TGl0ZURlY29kZXJTdHJlYW0ucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uKGRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5jb252LmVuZCgpO1xuICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGgpIHRoaXMucHVzaChyZXMsIHRoaXMuZW5jb2RpbmcpOyAgICAgICAgICAgICAgICBcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBkb25lKGUpO1xuICAgIH1cbn1cblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUuY29sbGVjdCA9IGZ1bmN0aW9uKGNiKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHRoaXMub24oJ2Vycm9yJywgY2IpO1xuICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykgeyByZXMgKz0gY2h1bms7IH0pO1xuICAgIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBjYihudWxsLCByZXMpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQnVmZmVyID0gcmVxdWlyZShcImJ1ZmZlclwiKS5CdWZmZXI7XG4vLyBOb3RlOiBub3QgcG9seWZpbGxlZCB3aXRoIHNhZmVyLWJ1ZmZlciBvbiBhIHB1cnBvc2UsIGFzIG92ZXJyaWRlcyBCdWZmZXJcblxuLy8gPT0gRXh0ZW5kIE5vZGUgcHJpbWl0aXZlcyB0byB1c2UgaWNvbnYtbGl0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaWNvbnYpIHtcbiAgICB2YXIgb3JpZ2luYWwgPSB1bmRlZmluZWQ7IC8vIFBsYWNlIHRvIGtlZXAgb3JpZ2luYWwgbWV0aG9kcy5cblxuICAgIC8vIE5vZGUgYXV0aG9ycyByZXdyb3RlIEJ1ZmZlciBpbnRlcm5hbHMgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGhcbiAgICAvLyBVaW50OEFycmF5IGFuZCB3ZSBjYW5ub3QgcGF0Y2gga2V5IGZ1bmN0aW9ucyBzaW5jZSB0aGVuLlxuICAgIC8vIE5vdGU6IHRoaXMgZG9lcyB1c2Ugb2xkZXIgQnVmZmVyIEFQSSBvbiBhIHB1cnBvc2VcbiAgICBpY29udi5zdXBwb3J0c05vZGVFbmNvZGluZ3NFeHRlbnNpb24gPSAhKEJ1ZmZlci5mcm9tIHx8IG5ldyBCdWZmZXIoMCkgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcblxuICAgIGljb252LmV4dGVuZE5vZGVFbmNvZGluZ3MgPSBmdW5jdGlvbiBleHRlbmROb2RlRW5jb2RpbmdzKCkge1xuICAgICAgICBpZiAob3JpZ2luYWwpIHJldHVybjtcbiAgICAgICAgb3JpZ2luYWwgPSB7fTtcblxuICAgICAgICBpZiAoIWljb252LnN1cHBvcnRzTm9kZUVuY29kaW5nc0V4dGVuc2lvbikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkFDVElPTiBORUVERUQ6IHJlcXVpcmUoJ2ljb252LWxpdGUnKS5leHRlbmROb2RlRW5jb2RpbmdzKCkgaXMgbm90IHN1cHBvcnRlZCBpbiB5b3VyIHZlcnNpb24gb2YgTm9kZVwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTZWUgbW9yZSBpbmZvIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hc2h0dWNoa2luL2ljb252LWxpdGUvd2lraS9Ob2RlLXY0LWNvbXBhdGliaWxpdHlcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9kZU5hdGl2ZUVuY29kaW5ncyA9IHtcbiAgICAgICAgICAgICdoZXgnOiB0cnVlLCAndXRmOCc6IHRydWUsICd1dGYtOCc6IHRydWUsICdhc2NpaSc6IHRydWUsICdiaW5hcnknOiB0cnVlLCBcbiAgICAgICAgICAgICdiYXNlNjQnOiB0cnVlLCAndWNzMic6IHRydWUsICd1Y3MtMic6IHRydWUsICd1dGYxNmxlJzogdHJ1ZSwgJ3V0Zi0xNmxlJzogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICBCdWZmZXIuaXNOYXRpdmVFbmNvZGluZyA9IGZ1bmN0aW9uKGVuYykge1xuICAgICAgICAgICAgcmV0dXJuIGVuYyAmJiBub2RlTmF0aXZlRW5jb2RpbmdzW2VuYy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tIFNsb3dCdWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdmFyIFNsb3dCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5TbG93QnVmZmVyO1xuXG4gICAgICAgIG9yaWdpbmFsLlNsb3dCdWZmZXJUb1N0cmluZyA9IFNsb3dCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgICAgICBTbG93QnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG4gICAgICAgICAgICBpZiAoQnVmZmVyLmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5TbG93QnVmZmVyVG9TdHJpbmcuY2FsbCh0aGlzLCBlbmNvZGluZywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdXNlIG91ciBkZWNvZGluZyBtZXRob2QuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0YXJ0ID09ICd1bmRlZmluZWQnKSBzdGFydCA9IDA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVuZCA9PSAndW5kZWZpbmVkJykgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gaWNvbnYuZGVjb2RlKHRoaXMuc2xpY2Uoc3RhcnQsIGVuZCksIGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9yaWdpbmFsLlNsb3dCdWZmZXJXcml0ZSA9IFNsb3dCdWZmZXIucHJvdG90eXBlLndyaXRlO1xuICAgICAgICBTbG93QnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gICAgICAgICAgICAvLyBTdXBwb3J0IGJvdGggKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKVxuICAgICAgICAgICAgLy8gYW5kIHRoZSBsZWdhY3kgKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKVxuICAgICAgICAgICAgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBsZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgeyAgLy8gbGVnYWN5XG4gICAgICAgICAgICAgICAgdmFyIHN3YXAgPSBlbmNvZGluZztcbiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBsZW5ndGg7XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gc3dhcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2Zmc2V0ID0gK29mZnNldCB8fCAwO1xuICAgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9ICtsZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAvLyBVc2UgbmF0aXZlIGNvbnZlcnNpb24gd2hlbiBwb3NzaWJsZVxuICAgICAgICAgICAgaWYgKEJ1ZmZlci5pc05hdGl2ZUVuY29kaW5nKGVuY29kaW5nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuU2xvd0J1ZmZlcldyaXRlLmNhbGwodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpO1xuXG4gICAgICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2F0dGVtcHQgdG8gd3JpdGUgYmV5b25kIGJ1ZmZlciBib3VuZHMnKTtcblxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB1c2Ugb3VyIGVuY29kaW5nIG1ldGhvZC5cbiAgICAgICAgICAgIHZhciBidWYgPSBpY29udi5lbmNvZGUoc3RyaW5nLCBlbmNvZGluZyk7XG4gICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCA8IGxlbmd0aCkgbGVuZ3RoID0gYnVmLmxlbmd0aDtcbiAgICAgICAgICAgIGJ1Zi5jb3B5KHRoaXMsIG9mZnNldCwgMCwgbGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLSBCdWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgb3JpZ2luYWwuQnVmZmVySXNFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nO1xuICAgICAgICBCdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpIHx8IGljb252LmVuY29kaW5nRXhpc3RzKGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9yaWdpbmFsLkJ1ZmZlckJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgQnVmZmVyLmJ5dGVMZW5ndGggPSBTbG93QnVmZmVyLmJ5dGVMZW5ndGggPSBmdW5jdGlvbihzdHIsIGVuY29kaW5nKSB7XG4gICAgICAgICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG4gICAgICAgICAgICBpZiAoQnVmZmVyLmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5CdWZmZXJCeXRlTGVuZ3RoLmNhbGwodGhpcywgc3RyLCBlbmNvZGluZyk7XG5cbiAgICAgICAgICAgIC8vIFNsb3csIEkga25vdywgYnV0IHdlIGRvbid0IGhhdmUgYSBiZXR0ZXIgd2F5IHlldC5cbiAgICAgICAgICAgIHJldHVybiBpY29udi5lbmNvZGUoc3RyLCBlbmNvZGluZykubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgb3JpZ2luYWwuQnVmZmVyVG9TdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgICAgICBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcbiAgICAgICAgICAgIGlmIChCdWZmZXIuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLkJ1ZmZlclRvU3RyaW5nLmNhbGwodGhpcywgZW5jb2RpbmcsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSBvdXIgZGVjb2RpbmcgbWV0aG9kLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdGFydCA9PSAndW5kZWZpbmVkJykgc3RhcnQgPSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmQgPT0gJ3VuZGVmaW5lZCcpIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIGljb252LmRlY29kZSh0aGlzLnNsaWNlKHN0YXJ0LCBlbmQpLCBlbmNvZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBvcmlnaW5hbC5CdWZmZXJXcml0ZSA9IEJ1ZmZlci5wcm90b3R5cGUud3JpdGU7XG4gICAgICAgIEJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAgICAgICAgICAgdmFyIF9vZmZzZXQgPSBvZmZzZXQsIF9sZW5ndGggPSBsZW5ndGgsIF9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgICAgICAgLy8gU3VwcG9ydCBib3RoIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZylcbiAgICAgICAgICAgIC8vIGFuZCB0aGUgbGVnYWN5IChzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aClcbiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgIC8vIGxlZ2FjeVxuICAgICAgICAgICAgICAgIHZhciBzd2FwID0gZW5jb2Rpbmc7XG4gICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN3YXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcbiAgICAgICAgICAgIGlmIChCdWZmZXIuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLkJ1ZmZlcldyaXRlLmNhbGwodGhpcywgc3RyaW5nLCBfb2Zmc2V0LCBfbGVuZ3RoLCBfZW5jb2RpbmcpO1xuXG4gICAgICAgICAgICBvZmZzZXQgPSArb2Zmc2V0IHx8IDA7XG4gICAgICAgICAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gK2xlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXR0ZW1wdCB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGJvdW5kcycpO1xuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSBvdXIgZW5jb2RpbmcgbWV0aG9kLlxuICAgICAgICAgICAgdmFyIGJ1ZiA9IGljb252LmVuY29kZShzdHJpbmcsIGVuY29kaW5nKTtcbiAgICAgICAgICAgIGlmIChidWYubGVuZ3RoIDwgbGVuZ3RoKSBsZW5ndGggPSBidWYubGVuZ3RoO1xuICAgICAgICAgICAgYnVmLmNvcHkodGhpcywgb2Zmc2V0LCAwLCBsZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDtcblxuICAgICAgICAgICAgLy8gVE9ETzogU2V0IF9jaGFyc1dyaXR0ZW4uXG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIC0tIFJlYWRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgaWYgKGljb252LnN1cHBvcnRzU3RyZWFtcykge1xuICAgICAgICAgICAgdmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnc3RyZWFtJykuUmVhZGFibGU7XG5cbiAgICAgICAgICAgIG9yaWdpbmFsLlJlYWRhYmxlU2V0RW5jb2RpbmcgPSBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc7XG4gICAgICAgICAgICBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXRFbmNvZGluZyhlbmMsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2Ugb3VyIG93biBkZWNvZGVyLCBpdCBoYXMgdGhlIHNhbWUgaW50ZXJmYWNlLlxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCB1c2Ugb3JpZ2luYWwgZnVuY3Rpb24gYXMgaXQgZG9lc24ndCBoYW5kbGUgQk9NLXMuXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gaWNvbnYuZ2V0RGVjb2RlcihlbmMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFJlYWRhYmxlLnByb3RvdHlwZS5jb2xsZWN0ID0gaWNvbnYuX2NvbGxlY3Q7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgaWNvbnYtbGl0ZSBOb2RlIHByaW1pdGl2ZSBleHRlbnNpb25zLlxuICAgIGljb252LnVuZG9FeHRlbmROb2RlRW5jb2RpbmdzID0gZnVuY3Rpb24gdW5kb0V4dGVuZE5vZGVFbmNvZGluZ3MoKSB7XG4gICAgICAgIGlmICghaWNvbnYuc3VwcG9ydHNOb2RlRW5jb2RpbmdzRXh0ZW5zaW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoIW9yaWdpbmFsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVxdWlyZSgnaWNvbnYtbGl0ZScpLnVuZG9FeHRlbmROb2RlRW5jb2RpbmdzKCk6IE5vdGhpbmcgdG8gdW5kbzsgZXh0ZW5kTm9kZUVuY29kaW5ncygpIGlzIG5vdCBjYWxsZWQuXCIpXG5cbiAgICAgICAgZGVsZXRlIEJ1ZmZlci5pc05hdGl2ZUVuY29kaW5nO1xuXG4gICAgICAgIHZhciBTbG93QnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuU2xvd0J1ZmZlcjtcblxuICAgICAgICBTbG93QnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IG9yaWdpbmFsLlNsb3dCdWZmZXJUb1N0cmluZztcbiAgICAgICAgU2xvd0J1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBvcmlnaW5hbC5TbG93QnVmZmVyV3JpdGU7XG5cbiAgICAgICAgQnVmZmVyLmlzRW5jb2RpbmcgPSBvcmlnaW5hbC5CdWZmZXJJc0VuY29kaW5nO1xuICAgICAgICBCdWZmZXIuYnl0ZUxlbmd0aCA9IG9yaWdpbmFsLkJ1ZmZlckJ5dGVMZW5ndGg7XG4gICAgICAgIEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBvcmlnaW5hbC5CdWZmZXJUb1N0cmluZztcbiAgICAgICAgQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IG9yaWdpbmFsLkJ1ZmZlcldyaXRlO1xuXG4gICAgICAgIGlmIChpY29udi5zdXBwb3J0c1N0cmVhbXMpIHtcbiAgICAgICAgICAgIHZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJ3N0cmVhbScpLlJlYWRhYmxlO1xuXG4gICAgICAgICAgICBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBvcmlnaW5hbC5SZWFkYWJsZVNldEVuY29kaW5nO1xuICAgICAgICAgICAgZGVsZXRlIFJlYWRhYmxlLnByb3RvdHlwZS5jb2xsZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgb3JpZ2luYWwgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuXG4vLyBTb21lIGVudmlyb25tZW50cyBkb24ndCBoYXZlIGdsb2JhbCBCdWZmZXIgKGUuZy4gUmVhY3QgTmF0aXZlKS5cbi8vIFNvbHV0aW9uIHdvdWxkIGJlIGluc3RhbGxpbmcgbnBtIG1vZHVsZXMgXCJidWZmZXJcIiBhbmQgXCJzdHJlYW1cIiBleHBsaWNpdGx5LlxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoXCJzYWZlci1idWZmZXJcIikuQnVmZmVyO1xuXG52YXIgYm9tSGFuZGxpbmcgPSByZXF1aXJlKFwiLi9ib20taGFuZGxpbmdcIiksXG4gICAgaWNvbnYgPSBtb2R1bGUuZXhwb3J0cztcblxuLy8gQWxsIGNvZGVjcyBhbmQgYWxpYXNlcyBhcmUga2VwdCBoZXJlLCBrZXllZCBieSBlbmNvZGluZyBuYW1lL2FsaWFzLlxuLy8gVGhleSBhcmUgbGF6eSBsb2FkZWQgaW4gYGljb252LmdldENvZGVjYCBmcm9tIGBlbmNvZGluZ3MvaW5kZXguanNgLlxuaWNvbnYuZW5jb2RpbmdzID0gbnVsbDtcblxuLy8gQ2hhcmFjdGVycyBlbWl0dGVkIGluIGNhc2Ugb2YgZXJyb3IuXG5pY29udi5kZWZhdWx0Q2hhclVuaWNvZGUgPSAnXHVGRkZEJztcbmljb252LmRlZmF1bHRDaGFyU2luZ2xlQnl0ZSA9ICc/JztcblxuLy8gUHVibGljIEFQSS5cbmljb252LmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIsIGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgc3RyID0gXCJcIiArIChzdHIgfHwgXCJcIik7IC8vIEVuc3VyZSBzdHJpbmcuXG5cbiAgICB2YXIgZW5jb2RlciA9IGljb252LmdldEVuY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpO1xuXG4gICAgdmFyIHJlcyA9IGVuY29kZXIud3JpdGUoc3RyKTtcbiAgICB2YXIgdHJhaWwgPSBlbmNvZGVyLmVuZCgpO1xuICAgIFxuICAgIHJldHVybiAodHJhaWwgJiYgdHJhaWwubGVuZ3RoID4gMCkgPyBCdWZmZXIuY29uY2F0KFtyZXMsIHRyYWlsXSkgOiByZXM7XG59XG5cbmljb252LmRlY29kZSA9IGZ1bmN0aW9uIGRlY29kZShidWYsIGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBidWYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghaWNvbnYuc2tpcERlY29kZVdhcm5pbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ljb252LWxpdGUgd2FybmluZzogZGVjb2RlKCktaW5nIHN0cmluZ3MgaXMgZGVwcmVjYXRlZC4gUmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL2FzaHR1Y2hraW4vaWNvbnYtbGl0ZS93aWtpL1VzZS1CdWZmZXJzLXdoZW4tZGVjb2RpbmcnKTtcbiAgICAgICAgICAgIGljb252LnNraXBEZWNvZGVXYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKFwiXCIgKyAoYnVmIHx8IFwiXCIpLCBcImJpbmFyeVwiKTsgLy8gRW5zdXJlIGJ1ZmZlci5cbiAgICB9XG5cbiAgICB2YXIgZGVjb2RlciA9IGljb252LmdldERlY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpO1xuXG4gICAgdmFyIHJlcyA9IGRlY29kZXIud3JpdGUoYnVmKTtcbiAgICB2YXIgdHJhaWwgPSBkZWNvZGVyLmVuZCgpO1xuXG4gICAgcmV0dXJuIHRyYWlsID8gKHJlcyArIHRyYWlsKSA6IHJlcztcbn1cblxuaWNvbnYuZW5jb2RpbmdFeGlzdHMgPSBmdW5jdGlvbiBlbmNvZGluZ0V4aXN0cyhlbmMpIHtcbiAgICB0cnkge1xuICAgICAgICBpY29udi5nZXRDb2RlYyhlbmMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIExlZ2FjeSBhbGlhc2VzIHRvIGNvbnZlcnQgZnVuY3Rpb25zXG5pY29udi50b0VuY29kaW5nID0gaWNvbnYuZW5jb2RlO1xuaWNvbnYuZnJvbUVuY29kaW5nID0gaWNvbnYuZGVjb2RlO1xuXG4vLyBTZWFyY2ggZm9yIGEgY29kZWMgaW4gaWNvbnYuZW5jb2RpbmdzLiBDYWNoZSBjb2RlYyBkYXRhIGluIGljb252Ll9jb2RlY0RhdGFDYWNoZS5cbmljb252Ll9jb2RlY0RhdGFDYWNoZSA9IHt9O1xuaWNvbnYuZ2V0Q29kZWMgPSBmdW5jdGlvbiBnZXRDb2RlYyhlbmNvZGluZykge1xuICAgIGlmICghaWNvbnYuZW5jb2RpbmdzKVxuICAgICAgICBpY29udi5lbmNvZGluZ3MgPSByZXF1aXJlKFwiLi4vZW5jb2RpbmdzXCIpOyAvLyBMYXp5IGxvYWQgYWxsIGVuY29kaW5nIGRlZmluaXRpb25zLlxuICAgIFxuICAgIC8vIENhbm9uaWNhbGl6ZSBlbmNvZGluZyBuYW1lOiBzdHJpcCBhbGwgbm9uLWFscGhhbnVtZXJpYyBjaGFycyBhbmQgYXBwZW5kZWQgeWVhci5cbiAgICB2YXIgZW5jID0gaWNvbnYuX2Nhbm9uaWNhbGl6ZUVuY29kaW5nKGVuY29kaW5nKTtcblxuICAgIC8vIFRyYXZlcnNlIGljb252LmVuY29kaW5ncyB0byBmaW5kIGFjdHVhbCBjb2RlYy5cbiAgICB2YXIgY29kZWNPcHRpb25zID0ge307XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGNvZGVjID0gaWNvbnYuX2NvZGVjRGF0YUNhY2hlW2VuY107XG4gICAgICAgIGlmIChjb2RlYylcbiAgICAgICAgICAgIHJldHVybiBjb2RlYztcblxuICAgICAgICB2YXIgY29kZWNEZWYgPSBpY29udi5lbmNvZGluZ3NbZW5jXTtcblxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBjb2RlY0RlZikge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOiAvLyBEaXJlY3QgYWxpYXMgdG8gb3RoZXIgZW5jb2RpbmcuXG4gICAgICAgICAgICAgICAgZW5jID0gY29kZWNEZWY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjogLy8gQWxpYXMgd2l0aCBvcHRpb25zLiBDYW4gYmUgbGF5ZXJlZC5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gY29kZWNEZWYpXG4gICAgICAgICAgICAgICAgICAgIGNvZGVjT3B0aW9uc1trZXldID0gY29kZWNEZWZba2V5XTtcblxuICAgICAgICAgICAgICAgIGlmICghY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSA9IGVuYztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBlbmMgPSBjb2RlY0RlZi50eXBlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjogLy8gQ29kZWMgaXRzZWxmLlxuICAgICAgICAgICAgICAgIGlmICghY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZSA9IGVuYztcblxuICAgICAgICAgICAgICAgIC8vIFRoZSBjb2RlYyBmdW5jdGlvbiBtdXN0IGxvYWQgYWxsIHRhYmxlcyBhbmQgcmV0dXJuIG9iamVjdCB3aXRoIC5lbmNvZGVyIGFuZCAuZGVjb2RlciBtZXRob2RzLlxuICAgICAgICAgICAgICAgIC8vIEl0J2xsIGJlIGNhbGxlZCBvbmx5IG9uY2UgKGZvciBlYWNoIGRpZmZlcmVudCBvcHRpb25zIG9iamVjdCkuXG4gICAgICAgICAgICAgICAgY29kZWMgPSBuZXcgY29kZWNEZWYoY29kZWNPcHRpb25zLCBpY29udik7XG5cbiAgICAgICAgICAgICAgICBpY29udi5fY29kZWNEYXRhQ2FjaGVbY29kZWNPcHRpb25zLmVuY29kaW5nTmFtZV0gPSBjb2RlYzsgLy8gU2F2ZSBpdCB0byBiZSByZXVzZWQgbGF0ZXIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVjO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuY29kaW5nIG5vdCByZWNvZ25pemVkOiAnXCIgKyBlbmNvZGluZyArIFwiJyAoc2VhcmNoZWQgYXM6ICdcIitlbmMrXCInKVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuaWNvbnYuX2Nhbm9uaWNhbGl6ZUVuY29kaW5nID0gZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgICAvLyBDYW5vbmljYWxpemUgZW5jb2RpbmcgbmFtZTogc3RyaXAgYWxsIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMgYW5kIGFwcGVuZGVkIHllYXIuXG4gICAgcmV0dXJuICgnJytlbmNvZGluZykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC86XFxkezR9JHxbXjAtOWEtel0vZywgXCJcIik7XG59XG5cbmljb252LmdldEVuY29kZXIgPSBmdW5jdGlvbiBnZXRFbmNvZGVyKGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgdmFyIGNvZGVjID0gaWNvbnYuZ2V0Q29kZWMoZW5jb2RpbmcpLFxuICAgICAgICBlbmNvZGVyID0gbmV3IGNvZGVjLmVuY29kZXIob3B0aW9ucywgY29kZWMpO1xuXG4gICAgaWYgKGNvZGVjLmJvbUF3YXJlICYmIG9wdGlvbnMgJiYgb3B0aW9ucy5hZGRCT00pXG4gICAgICAgIGVuY29kZXIgPSBuZXcgYm9tSGFuZGxpbmcuUHJlcGVuZEJPTShlbmNvZGVyLCBvcHRpb25zKTtcblxuICAgIHJldHVybiBlbmNvZGVyO1xufVxuXG5pY29udi5nZXREZWNvZGVyID0gZnVuY3Rpb24gZ2V0RGVjb2RlcihlbmNvZGluZywgb3B0aW9ucykge1xuICAgIHZhciBjb2RlYyA9IGljb252LmdldENvZGVjKGVuY29kaW5nKSxcbiAgICAgICAgZGVjb2RlciA9IG5ldyBjb2RlYy5kZWNvZGVyKG9wdGlvbnMsIGNvZGVjKTtcblxuICAgIGlmIChjb2RlYy5ib21Bd2FyZSAmJiAhKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpcEJPTSA9PT0gZmFsc2UpKVxuICAgICAgICBkZWNvZGVyID0gbmV3IGJvbUhhbmRsaW5nLlN0cmlwQk9NKGRlY29kZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGRlY29kZXI7XG59XG5cblxuLy8gTG9hZCBleHRlbnNpb25zIGluIE5vZGUuIEFsbCBvZiB0aGVtIGFyZSBvbWl0dGVkIGluIEJyb3dzZXJpZnkgYnVpbGQgdmlhICdicm93c2VyJyBmaWVsZCBpbiBwYWNrYWdlLmpzb24uXG52YXIgbm9kZVZlciA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZTtcbmlmIChub2RlVmVyKSB7XG5cbiAgICAvLyBMb2FkIHN0cmVhbWluZyBzdXBwb3J0IGluIE5vZGUgdjAuMTArXG4gICAgdmFyIG5vZGVWZXJBcnIgPSBub2RlVmVyLnNwbGl0KFwiLlwiKS5tYXAoTnVtYmVyKTtcbiAgICBpZiAobm9kZVZlckFyclswXSA+IDAgfHwgbm9kZVZlckFyclsxXSA+PSAxMCkge1xuICAgICAgICByZXF1aXJlKFwiLi9zdHJlYW1zXCIpKGljb252KTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIE5vZGUgcHJpbWl0aXZlIGV4dGVuc2lvbnMuXG4gICAgcmVxdWlyZShcIi4vZXh0ZW5kLW5vZGVcIikoaWNvbnYpO1xufVxuXG5pZiAoXCJcdTAxMDBcIiAhPSBcIlxcdTAxMDBcIikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJpY29udi1saXRlIHdhcm5pbmc6IGphdmFzY3JpcHQgZmlsZXMgdXNlIGVuY29kaW5nIGRpZmZlcmVudCBmcm9tIHV0Zi04LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FzaHR1Y2hraW4vaWNvbnYtbGl0ZS93aWtpL0phdmFzY3JpcHQtc291cmNlLWZpbGUtZW5jb2RpbmdzIGZvciBtb3JlIGluZm8uXCIpO1xufVxuIiwgIi8qIVxuICogdW5waXBlXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB1bnBpcGVcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlcmUgYXJlIE5vZGUuanMgcGlwZS1saWtlIGRhdGEgbGlzdGVuZXJzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBoYXNQaXBlRGF0YUxpc3RlbmVycyhzdHJlYW0pIHtcbiAgdmFyIGxpc3RlbmVycyA9IHN0cmVhbS5saXN0ZW5lcnMoJ2RhdGEnKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGxpc3RlbmVyc1tpXS5uYW1lID09PSAnb25kYXRhJykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBVbnBpcGUgYSBzdHJlYW0gZnJvbSBhbGwgZGVzdGluYXRpb25zLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB1bnBpcGUoc3RyZWFtKSB7XG4gIGlmICghc3RyZWFtKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyZWFtIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtLnVucGlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIG5ldy1zdHlsZVxuICAgIHN0cmVhbS51bnBpcGUoKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gTm9kZS5qcyAwLjggaGFja1xuICBpZiAoIWhhc1BpcGVEYXRhTGlzdGVuZXJzKHN0cmVhbSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBsaXN0ZW5lclxuICB2YXIgbGlzdGVuZXJzID0gc3RyZWFtLmxpc3RlbmVycygnY2xvc2UnKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV1cblxuICAgIGlmIChsaXN0ZW5lci5uYW1lICE9PSAnY2xlYW51cCcgJiYgbGlzdGVuZXIubmFtZSAhPT0gJ29uY2xvc2UnKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIGludm9rZSB0aGUgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci5jYWxsKHN0cmVhbSlcbiAgfVxufVxuIiwgIi8qIVxuICogcmF3LWJvZHlcbiAqIENvcHlyaWdodChjKSAyMDEzLTIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDIyIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgYXN5bmNIb29rcyA9IHRyeVJlcXVpcmVBc3luY0hvb2tzKClcbnZhciBieXRlcyA9IHJlcXVpcmUoJ2J5dGVzJylcbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJ2h0dHAtZXJyb3JzJylcbnZhciBpY29udiA9IHJlcXVpcmUoJ2ljb252LWxpdGUnKVxudmFyIHVucGlwZSA9IHJlcXVpcmUoJ3VucGlwZScpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRSYXdCb2R5XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIElDT05WX0VOQ09ESU5HX01FU1NBR0VfUkVHRVhQID0gL15FbmNvZGluZyBub3QgcmVjb2duaXplZDogL1xuXG4vKipcbiAqIEdldCB0aGUgZGVjb2RlciBmb3IgYSBnaXZlbiBlbmNvZGluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RGVjb2RlciAoZW5jb2RpbmcpIHtcbiAgaWYgKCFlbmNvZGluZykgcmV0dXJuIG51bGxcblxuICB0cnkge1xuICAgIHJldHVybiBpY29udi5nZXREZWNvZGVyKGVuY29kaW5nKVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZXJyb3IgZ2V0dGluZyBkZWNvZGVyXG4gICAgaWYgKCFJQ09OVl9FTkNPRElOR19NRVNTQUdFX1JFR0VYUC50ZXN0KGUubWVzc2FnZSkpIHRocm93IGVcblxuICAgIC8vIHRoZSBlbmNvZGluZyB3YXMgbm90IGZvdW5kXG4gICAgdGhyb3cgY3JlYXRlRXJyb3IoNDE1LCAnc3BlY2lmaWVkIGVuY29kaW5nIHVuc3VwcG9ydGVkJywge1xuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgdHlwZTogJ2VuY29kaW5nLnVuc3VwcG9ydGVkJ1xuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHJhdyBib2R5IG9mIGEgc3RyZWFtICh0eXBpY2FsbHkgSFRUUCkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHN0cmVhbVxuICogQHBhcmFtIHtvYmplY3R8c3RyaW5nfGZ1bmN0aW9ufSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja11cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBnZXRSYXdCb2R5IChzdHJlYW0sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBkb25lID0gY2FsbGJhY2tcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9XG5cbiAgaWYgKG9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gc2hvcnQgY3V0IGZvciBlbmNvZGluZ1xuICAgIG9wdHMgPSB7XG4gICAgICBlbmNvZGluZzogb3B0aW9uc1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBvcHRpb25zXG4gICAgb3B0cyA9IHt9XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBjYWxsYmFjayBpcyBhIGZ1bmN0aW9uLCBpZiBwcm92aWRlZFxuICBpZiAoZG9uZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkb25lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgfVxuXG4gIC8vIHJlcXVpcmUgdGhlIGNhbGxiYWNrIHdpdGhvdXQgcHJvbWlzZXNcbiAgaWYgKCFkb25lICYmICFnbG9iYWwuUHJvbWlzZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IGNhbGxiYWNrIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIGdldCBlbmNvZGluZ1xuICB2YXIgZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nICE9PSB0cnVlXG4gICAgPyBvcHRzLmVuY29kaW5nXG4gICAgOiAndXRmLTgnXG5cbiAgLy8gY29udmVydCB0aGUgbGltaXQgdG8gYW4gaW50ZWdlclxuICB2YXIgbGltaXQgPSBieXRlcy5wYXJzZShvcHRzLmxpbWl0KVxuXG4gIC8vIGNvbnZlcnQgdGhlIGV4cGVjdGVkIGxlbmd0aCB0byBhbiBpbnRlZ2VyXG4gIHZhciBsZW5ndGggPSBvcHRzLmxlbmd0aCAhPSBudWxsICYmICFpc05hTihvcHRzLmxlbmd0aClcbiAgICA/IHBhcnNlSW50KG9wdHMubGVuZ3RoLCAxMClcbiAgICA6IG51bGxcblxuICBpZiAoZG9uZSkge1xuICAgIC8vIGNsYXNzaWMgY2FsbGJhY2sgc3R5bGVcbiAgICByZXR1cm4gcmVhZFN0cmVhbShzdHJlYW0sIGVuY29kaW5nLCBsZW5ndGgsIGxpbWl0LCB3cmFwKGRvbmUpKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGV4ZWN1dG9yIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZWFkU3RyZWFtKHN0cmVhbSwgZW5jb2RpbmcsIGxlbmd0aCwgbGltaXQsIGZ1bmN0aW9uIG9uUmVhZCAoZXJyLCBidWYpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZShidWYpXG4gICAgfSlcbiAgfSlcbn1cblxuLyoqXG4gKiBIYWx0IGEgc3RyZWFtLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHJlYW1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaGFsdCAoc3RyZWFtKSB7XG4gIC8vIHVucGlwZSBldmVyeXRoaW5nIGZyb20gdGhlIHN0cmVhbVxuICB1bnBpcGUoc3RyZWFtKVxuXG4gIC8vIHBhdXNlIHN0cmVhbVxuICBpZiAodHlwZW9mIHN0cmVhbS5wYXVzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0cmVhbS5wYXVzZSgpXG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBkYXRhIGZyb20gdGhlIHN0cmVhbS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gc3RyZWFtXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdFxuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiByZWFkU3RyZWFtIChzdHJlYW0sIGVuY29kaW5nLCBsZW5ndGgsIGxpbWl0LCBjYWxsYmFjaykge1xuICB2YXIgY29tcGxldGUgPSBmYWxzZVxuICB2YXIgc3luYyA9IHRydWVcblxuICAvLyBjaGVjayB0aGUgbGVuZ3RoIGFuZCBsaW1pdCBvcHRpb25zLlxuICAvLyBub3RlOiB3ZSBpbnRlbnRpb25hbGx5IGxlYXZlIHRoZSBzdHJlYW0gcGF1c2VkLFxuICAvLyBzbyB1c2VycyBzaG91bGQgaGFuZGxlIHRoZSBzdHJlYW0gdGhlbXNlbHZlcy5cbiAgaWYgKGxpbWl0ICE9PSBudWxsICYmIGxlbmd0aCAhPT0gbnVsbCAmJiBsZW5ndGggPiBsaW1pdCkge1xuICAgIHJldHVybiBkb25lKGNyZWF0ZUVycm9yKDQxMywgJ3JlcXVlc3QgZW50aXR5IHRvbyBsYXJnZScsIHtcbiAgICAgIGV4cGVjdGVkOiBsZW5ndGgsXG4gICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgIHR5cGU6ICdlbnRpdHkudG9vLmxhcmdlJ1xuICAgIH0pKVxuICB9XG5cbiAgLy8gc3RyZWFtczE6IGFzc2VydCByZXF1ZXN0IGVuY29kaW5nIGlzIGJ1ZmZlci5cbiAgLy8gc3RyZWFtczIrOiBhc3NlcnQgdGhlIHN0cmVhbSBlbmNvZGluZyBpcyBidWZmZXIuXG4gIC8vICAgc3RyZWFtLl9kZWNvZGVyOiBzdHJlYW1zMVxuICAvLyAgIHN0YXRlLmVuY29kaW5nOiBzdHJlYW1zMlxuICAvLyAgIHN0YXRlLmRlY29kZXI6IHN0cmVhbXMyLCBzcGVjaWZpY2FsbHkgPCAwLjEwLjZcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGlmIChzdHJlYW0uX2RlY29kZXIgfHwgKHN0YXRlICYmIChzdGF0ZS5lbmNvZGluZyB8fCBzdGF0ZS5kZWNvZGVyKSkpIHtcbiAgICAvLyBkZXZlbG9wZXIgZXJyb3JcbiAgICByZXR1cm4gZG9uZShjcmVhdGVFcnJvcig1MDAsICdzdHJlYW0gZW5jb2Rpbmcgc2hvdWxkIG5vdCBiZSBzZXQnLCB7XG4gICAgICB0eXBlOiAnc3RyZWFtLmVuY29kaW5nLnNldCdcbiAgICB9KSlcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtLnJlYWRhYmxlICE9PSAndW5kZWZpbmVkJyAmJiAhc3RyZWFtLnJlYWRhYmxlKSB7XG4gICAgcmV0dXJuIGRvbmUoY3JlYXRlRXJyb3IoNTAwLCAnc3RyZWFtIGlzIG5vdCByZWFkYWJsZScsIHtcbiAgICAgIHR5cGU6ICdzdHJlYW0ubm90LnJlYWRhYmxlJ1xuICAgIH0pKVxuICB9XG5cbiAgdmFyIHJlY2VpdmVkID0gMFxuICB2YXIgZGVjb2RlclxuXG4gIHRyeSB7XG4gICAgZGVjb2RlciA9IGdldERlY29kZXIoZW5jb2RpbmcpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBkb25lKGVycilcbiAgfVxuXG4gIHZhciBidWZmZXIgPSBkZWNvZGVyXG4gICAgPyAnJ1xuICAgIDogW11cblxuICAvLyBhdHRhY2ggbGlzdGVuZXJzXG4gIHN0cmVhbS5vbignYWJvcnRlZCcsIG9uQWJvcnRlZClcbiAgc3RyZWFtLm9uKCdjbG9zZScsIGNsZWFudXApXG4gIHN0cmVhbS5vbignZGF0YScsIG9uRGF0YSlcbiAgc3RyZWFtLm9uKCdlbmQnLCBvbkVuZClcbiAgc3RyZWFtLm9uKCdlcnJvcicsIG9uRW5kKVxuXG4gIC8vIG1hcmsgc3luYyBzZWN0aW9uIGNvbXBsZXRlXG4gIHN5bmMgPSBmYWxzZVxuXG4gIGZ1bmN0aW9uIGRvbmUgKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG5cbiAgICAvLyBjb3B5IGFyZ3VtZW50c1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgIH1cblxuICAgIC8vIG1hcmsgY29tcGxldGVcbiAgICBjb21wbGV0ZSA9IHRydWVcblxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGludm9rZUNhbGxiYWNrKVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnZva2VDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2sgKCkge1xuICAgICAgY2xlYW51cCgpXG5cbiAgICAgIGlmIChhcmdzWzBdKSB7XG4gICAgICAgIC8vIGhhbHQgdGhlIHN0cmVhbSBvbiBlcnJvclxuICAgICAgICBoYWx0KHN0cmVhbSlcbiAgICAgIH1cblxuICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJncylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkFib3J0ZWQgKCkge1xuICAgIGlmIChjb21wbGV0ZSkgcmV0dXJuXG5cbiAgICBkb25lKGNyZWF0ZUVycm9yKDQwMCwgJ3JlcXVlc3QgYWJvcnRlZCcsIHtcbiAgICAgIGNvZGU6ICdFQ09OTkFCT1JURUQnLFxuICAgICAgZXhwZWN0ZWQ6IGxlbmd0aCxcbiAgICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgICAgcmVjZWl2ZWQ6IHJlY2VpdmVkLFxuICAgICAgdHlwZTogJ3JlcXVlc3QuYWJvcnRlZCdcbiAgICB9KSlcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRGF0YSAoY2h1bmspIHtcbiAgICBpZiAoY29tcGxldGUpIHJldHVyblxuXG4gICAgcmVjZWl2ZWQgKz0gY2h1bmsubGVuZ3RoXG5cbiAgICBpZiAobGltaXQgIT09IG51bGwgJiYgcmVjZWl2ZWQgPiBsaW1pdCkge1xuICAgICAgZG9uZShjcmVhdGVFcnJvcig0MTMsICdyZXF1ZXN0IGVudGl0eSB0b28gbGFyZ2UnLCB7XG4gICAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgICAgcmVjZWl2ZWQ6IHJlY2VpdmVkLFxuICAgICAgICB0eXBlOiAnZW50aXR5LnRvby5sYXJnZSdcbiAgICAgIH0pKVxuICAgIH0gZWxzZSBpZiAoZGVjb2Rlcikge1xuICAgICAgYnVmZmVyICs9IGRlY29kZXIud3JpdGUoY2h1bmspXG4gICAgfSBlbHNlIHtcbiAgICAgIGJ1ZmZlci5wdXNoKGNodW5rKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRW5kIChlcnIpIHtcbiAgICBpZiAoY29tcGxldGUpIHJldHVyblxuICAgIGlmIChlcnIpIHJldHVybiBkb25lKGVycilcblxuICAgIGlmIChsZW5ndGggIT09IG51bGwgJiYgcmVjZWl2ZWQgIT09IGxlbmd0aCkge1xuICAgICAgZG9uZShjcmVhdGVFcnJvcig0MDAsICdyZXF1ZXN0IHNpemUgZGlkIG5vdCBtYXRjaCBjb250ZW50IGxlbmd0aCcsIHtcbiAgICAgICAgZXhwZWN0ZWQ6IGxlbmd0aCxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgICAgIHJlY2VpdmVkOiByZWNlaXZlZCxcbiAgICAgICAgdHlwZTogJ3JlcXVlc3Quc2l6ZS5pbnZhbGlkJ1xuICAgICAgfSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdHJpbmcgPSBkZWNvZGVyXG4gICAgICAgID8gYnVmZmVyICsgKGRlY29kZXIuZW5kKCkgfHwgJycpXG4gICAgICAgIDogQnVmZmVyLmNvbmNhdChidWZmZXIpXG4gICAgICBkb25lKG51bGwsIHN0cmluZylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwICgpIHtcbiAgICBidWZmZXIgPSBudWxsXG5cbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0ZWQnLCBvbkFib3J0ZWQpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25EYXRhKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25FbmQpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRW5kKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKVxuICB9XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlcXVpcmUgYXN5bmNfaG9va3NcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdHJ5UmVxdWlyZUFzeW5jSG9va3MgKCkge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdhc3luY19ob29rcycpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4ge31cbiAgfVxufVxuXG4vKipcbiAqIFdyYXAgZnVuY3Rpb24gd2l0aCBhc3luYyByZXNvdXJjZSwgaWYgcG9zc2libGUuXG4gKiBBc3luY1Jlc291cmNlLmJpbmQgc3RhdGljIG1ldGhvZCBiYWNrcG9ydGVkLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB3cmFwIChmbikge1xuICB2YXIgcmVzXG5cbiAgLy8gY3JlYXRlIGFub255bW91cyByZXNvdXJjZVxuICBpZiAoYXN5bmNIb29rcy5Bc3luY1Jlc291cmNlKSB7XG4gICAgcmVzID0gbmV3IGFzeW5jSG9va3MuQXN5bmNSZXNvdXJjZShmbi5uYW1lIHx8ICdib3VuZC1hbm9ueW1vdXMtZm4nKVxuICB9XG5cbiAgLy8gaW5jb21wYXRpYmxlIG5vZGUuanNcbiAgaWYgKCFyZXMgfHwgIXJlcy5ydW5JbkFzeW5jU2NvcGUpIHtcbiAgICByZXR1cm4gZm5cbiAgfVxuXG4gIC8vIHJldHVybiBib3VuZCBmdW5jdGlvblxuICByZXR1cm4gcmVzLnJ1bkluQXN5bmNTY29wZS5iaW5kKHJlcywgZm4sIG51bGwpXG59XG4iLCAiLyohXG4gKiBlZS1maXJzdFxuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpcnN0XG5cbi8qKlxuICogR2V0IHRoZSBmaXJzdCBldmVudCBpbiBhIHNldCBvZiBldmVudCBlbWl0dGVycyBhbmQgZXZlbnQgcGFpcnMuXG4gKlxuICogQHBhcmFtIHthcnJheX0gc3R1ZmZcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRvbmVcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmaXJzdChzdHVmZiwgZG9uZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3R1ZmYpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZyBtdXN0IGJlIGFuIGFycmF5IG9mIFtlZSwgZXZlbnRzLi4uXSBhcnJheXMnKVxuXG4gIHZhciBjbGVhbnVwcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHVmZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhcnIgPSBzdHVmZltpXVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikgfHwgYXJyLmxlbmd0aCA8IDIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlYWNoIGFycmF5IG1lbWJlciBtdXN0IGJlIFtlZSwgZXZlbnRzLi4uXScpXG5cbiAgICB2YXIgZWUgPSBhcnJbMF1cblxuICAgIGZvciAodmFyIGogPSAxOyBqIDwgYXJyLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZXZlbnQgPSBhcnJbal1cbiAgICAgIHZhciBmbiA9IGxpc3RlbmVyKGV2ZW50LCBjYWxsYmFjaylcblxuICAgICAgLy8gbGlzdGVuIHRvIHRoZSBldmVudFxuICAgICAgZWUub24oZXZlbnQsIGZuKVxuICAgICAgLy8gcHVzaCB0aGlzIGxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIGNsZWFudXBzXG4gICAgICBjbGVhbnVwcy5wdXNoKHtcbiAgICAgICAgZWU6IGVlLFxuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGZuOiBmbixcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgY2xlYW51cCgpXG4gICAgZG9uZS5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHZhciB4XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGVhbnVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgeCA9IGNsZWFudXBzW2ldXG4gICAgICB4LmVlLnJlbW92ZUxpc3RlbmVyKHguZXZlbnQsIHguZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdGh1bmsoZm4pIHtcbiAgICBkb25lID0gZm5cbiAgfVxuXG4gIHRodW5rLmNhbmNlbCA9IGNsZWFudXBcblxuICByZXR1cm4gdGh1bmtcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsaXN0ZW5lcihldmVudCwgZG9uZSkge1xuICByZXR1cm4gZnVuY3Rpb24gb25ldmVudChhcmcxKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICB2YXIgZWUgPSB0aGlzXG4gICAgdmFyIGVyciA9IGV2ZW50ID09PSAnZXJyb3InXG4gICAgICA/IGFyZzFcbiAgICAgIDogbnVsbFxuXG4gICAgLy8gY29weSBhcmdzIHRvIHByZXZlbnQgYXJndW1lbnRzIGVzY2FwaW5nIHNjb3BlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuXG4gICAgZG9uZShlcnIsIGVlLCBldmVudCwgYXJncylcbiAgfVxufVxuIiwgIi8qIVxuICogb24tZmluaXNoZWRcbiAqIENvcHlyaWdodChjKSAyMDEzIEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTQgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gb25GaW5pc2hlZFxubW9kdWxlLmV4cG9ydHMuaXNGaW5pc2hlZCA9IGlzRmluaXNoZWRcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgYXN5bmNIb29rcyA9IHRyeVJlcXVpcmVBc3luY0hvb2tzKClcbnZhciBmaXJzdCA9IHJlcXVpcmUoJ2VlLWZpcnN0JylcblxuLyoqXG4gKiBWYXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgZGVmZXIgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nXG4gID8gc2V0SW1tZWRpYXRlXG4gIDogZnVuY3Rpb24gKGZuKSB7IHByb2Nlc3MubmV4dFRpY2soZm4uYmluZC5hcHBseShmbiwgYXJndW1lbnRzKSkgfVxuXG4vKipcbiAqIEludm9rZSBjYWxsYmFjayB3aGVuIHRoZSByZXNwb25zZSBoYXMgZmluaXNoZWQsIHVzZWZ1bCBmb3JcbiAqIGNsZWFuaW5nIHVwIHJlc291cmNlcyBhZnRlcndhcmRzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtc2dcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gb25GaW5pc2hlZCAobXNnLCBsaXN0ZW5lcikge1xuICBpZiAoaXNGaW5pc2hlZChtc2cpICE9PSBmYWxzZSkge1xuICAgIGRlZmVyKGxpc3RlbmVyLCBudWxsLCBtc2cpXG4gICAgcmV0dXJuIG1zZ1xuICB9XG5cbiAgLy8gYXR0YWNoIHRoZSBsaXN0ZW5lciB0byB0aGUgbWVzc2FnZVxuICBhdHRhY2hMaXN0ZW5lcihtc2csIHdyYXAobGlzdGVuZXIpKVxuXG4gIHJldHVybiBtc2dcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgbWVzc2FnZSBpcyBhbHJlYWR5IGZpbmlzaGVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtc2dcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gaXNGaW5pc2hlZCAobXNnKSB7XG4gIHZhciBzb2NrZXQgPSBtc2cuc29ja2V0XG5cbiAgaWYgKHR5cGVvZiBtc2cuZmluaXNoZWQgPT09ICdib29sZWFuJykge1xuICAgIC8vIE91dGdvaW5nTWVzc2FnZVxuICAgIHJldHVybiBCb29sZWFuKG1zZy5maW5pc2hlZCB8fCAoc29ja2V0ICYmICFzb2NrZXQud3JpdGFibGUpKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBtc2cuY29tcGxldGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEluY29taW5nTWVzc2FnZVxuICAgIHJldHVybiBCb29sZWFuKG1zZy51cGdyYWRlIHx8ICFzb2NrZXQgfHwgIXNvY2tldC5yZWFkYWJsZSB8fCAobXNnLmNvbXBsZXRlICYmICFtc2cucmVhZGFibGUpKVxuICB9XG5cbiAgLy8gZG9uJ3Qga25vd1xuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQXR0YWNoIGEgZmluaXNoZWQgbGlzdGVuZXIgdG8gdGhlIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1zZ1xuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gYXR0YWNoRmluaXNoZWRMaXN0ZW5lciAobXNnLCBjYWxsYmFjaykge1xuICB2YXIgZWVNc2dcbiAgdmFyIGVlU29ja2V0XG4gIHZhciBmaW5pc2hlZCA9IGZhbHNlXG5cbiAgZnVuY3Rpb24gb25GaW5pc2ggKGVycm9yKSB7XG4gICAgZWVNc2cuY2FuY2VsKClcbiAgICBlZVNvY2tldC5jYW5jZWwoKVxuXG4gICAgZmluaXNoZWQgPSB0cnVlXG4gICAgY2FsbGJhY2soZXJyb3IpXG4gIH1cblxuICAvLyBmaW5pc2hlZCBvbiBmaXJzdCBtZXNzYWdlIGV2ZW50XG4gIGVlTXNnID0gZWVTb2NrZXQgPSBmaXJzdChbW21zZywgJ2VuZCcsICdmaW5pc2gnXV0sIG9uRmluaXNoKVxuXG4gIGZ1bmN0aW9uIG9uU29ja2V0IChzb2NrZXQpIHtcbiAgICAvLyByZW1vdmUgbGlzdGVuZXJcbiAgICBtc2cucmVtb3ZlTGlzdGVuZXIoJ3NvY2tldCcsIG9uU29ja2V0KVxuXG4gICAgaWYgKGZpbmlzaGVkKSByZXR1cm5cbiAgICBpZiAoZWVNc2cgIT09IGVlU29ja2V0KSByZXR1cm5cblxuICAgIC8vIGZpbmlzaGVkIG9uIGZpcnN0IHNvY2tldCBldmVudFxuICAgIGVlU29ja2V0ID0gZmlyc3QoW1tzb2NrZXQsICdlcnJvcicsICdjbG9zZSddXSwgb25GaW5pc2gpXG4gIH1cblxuICBpZiAobXNnLnNvY2tldCkge1xuICAgIC8vIHNvY2tldCBhbHJlYWR5IGFzc2lnbmVkXG4gICAgb25Tb2NrZXQobXNnLnNvY2tldClcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIHdhaXQgZm9yIHNvY2tldCB0byBiZSBhc3NpZ25lZFxuICBtc2cub24oJ3NvY2tldCcsIG9uU29ja2V0KVxuXG4gIGlmIChtc2cuc29ja2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogbm9kZS5qcyAwLjggcGF0Y2hcbiAgICBwYXRjaEFzc2lnblNvY2tldChtc2csIG9uU29ja2V0KVxuICB9XG59XG5cbi8qKlxuICogQXR0YWNoIHRoZSBsaXN0ZW5lciB0byB0aGUgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbXNnXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gYXR0YWNoTGlzdGVuZXIgKG1zZywgbGlzdGVuZXIpIHtcbiAgdmFyIGF0dGFjaGVkID0gbXNnLl9fb25GaW5pc2hlZFxuXG4gIC8vIGNyZWF0ZSBhIHByaXZhdGUgc2luZ2xlIGxpc3RlbmVyIHdpdGggcXVldWVcbiAgaWYgKCFhdHRhY2hlZCB8fCAhYXR0YWNoZWQucXVldWUpIHtcbiAgICBhdHRhY2hlZCA9IG1zZy5fX29uRmluaXNoZWQgPSBjcmVhdGVMaXN0ZW5lcihtc2cpXG4gICAgYXR0YWNoRmluaXNoZWRMaXN0ZW5lcihtc2csIGF0dGFjaGVkKVxuICB9XG5cbiAgYXR0YWNoZWQucXVldWUucHVzaChsaXN0ZW5lcilcbn1cblxuLyoqXG4gKiBDcmVhdGUgbGlzdGVuZXIgb24gbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbXNnXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlTGlzdGVuZXIgKG1zZykge1xuICBmdW5jdGlvbiBsaXN0ZW5lciAoZXJyKSB7XG4gICAgaWYgKG1zZy5fX29uRmluaXNoZWQgPT09IGxpc3RlbmVyKSBtc2cuX19vbkZpbmlzaGVkID0gbnVsbFxuICAgIGlmICghbGlzdGVuZXIucXVldWUpIHJldHVyblxuXG4gICAgdmFyIHF1ZXVlID0gbGlzdGVuZXIucXVldWVcbiAgICBsaXN0ZW5lci5xdWV1ZSA9IG51bGxcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXVlW2ldKGVyciwgbXNnKVxuICAgIH1cbiAgfVxuXG4gIGxpc3RlbmVyLnF1ZXVlID0gW11cblxuICByZXR1cm4gbGlzdGVuZXJcbn1cblxuLyoqXG4gKiBQYXRjaCBTZXJ2ZXJSZXNwb25zZS5wcm90b3R5cGUuYXNzaWduU29ja2V0IGZvciBub2RlLmpzIDAuOC5cbiAqXG4gKiBAcGFyYW0ge1NlcnZlclJlc3BvbnNlfSByZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBub2RlLmpzIDAuOCBwYXRjaFxuZnVuY3Rpb24gcGF0Y2hBc3NpZ25Tb2NrZXQgKHJlcywgY2FsbGJhY2spIHtcbiAgdmFyIGFzc2lnblNvY2tldCA9IHJlcy5hc3NpZ25Tb2NrZXRcblxuICBpZiAodHlwZW9mIGFzc2lnblNvY2tldCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuXG5cbiAgLy8gcmVzLm9uKCdzb2NrZXQnLCBjYWxsYmFjaykgaXMgYnJva2VuIGluIDAuOFxuICByZXMuYXNzaWduU29ja2V0ID0gZnVuY3Rpb24gX2Fzc2lnblNvY2tldCAoc29ja2V0KSB7XG4gICAgYXNzaWduU29ja2V0LmNhbGwodGhpcywgc29ja2V0KVxuICAgIGNhbGxiYWNrKHNvY2tldClcbiAgfVxufVxuXG4vKipcbiAqIFRyeSB0byByZXF1aXJlIGFzeW5jX2hvb2tzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRyeVJlcXVpcmVBc3luY0hvb2tzICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZSgnYXN5bmNfaG9va3MnKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwIGZ1bmN0aW9uIHdpdGggYXN5bmMgcmVzb3VyY2UsIGlmIHBvc3NpYmxlLlxuICogQXN5bmNSZXNvdXJjZS5iaW5kIHN0YXRpYyBtZXRob2QgYmFja3BvcnRlZC5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gd3JhcCAoZm4pIHtcbiAgdmFyIHJlc1xuXG4gIC8vIGNyZWF0ZSBhbm9ueW1vdXMgcmVzb3VyY2VcbiAgaWYgKGFzeW5jSG9va3MuQXN5bmNSZXNvdXJjZSkge1xuICAgIHJlcyA9IG5ldyBhc3luY0hvb2tzLkFzeW5jUmVzb3VyY2UoZm4ubmFtZSB8fCAnYm91bmQtYW5vbnltb3VzLWZuJylcbiAgfVxuXG4gIC8vIGluY29tcGF0aWJsZSBub2RlLmpzXG4gIGlmICghcmVzIHx8ICFyZXMucnVuSW5Bc3luY1Njb3BlKSB7XG4gICAgcmV0dXJuIGZuXG4gIH1cblxuICAvLyByZXR1cm4gYm91bmQgZnVuY3Rpb25cbiAgcmV0dXJuIHJlcy5ydW5JbkFzeW5jU2NvcGUuYmluZChyZXMsIGZuLCBudWxsKVxufVxuIiwgIi8qIVxuICogYm9keS1wYXJzZXJcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJ2h0dHAtZXJyb3JzJylcbnZhciBkZXN0cm95ID0gcmVxdWlyZSgnZGVzdHJveScpXG52YXIgZ2V0Qm9keSA9IHJlcXVpcmUoJ3Jhdy1ib2R5JylcbnZhciBpY29udiA9IHJlcXVpcmUoJ2ljb252LWxpdGUnKVxudmFyIG9uRmluaXNoZWQgPSByZXF1aXJlKCdvbi1maW5pc2hlZCcpXG52YXIgdW5waXBlID0gcmVxdWlyZSgndW5waXBlJylcbnZhciB6bGliID0gcmVxdWlyZSgnemxpYicpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZWFkXG5cbi8qKlxuICogUmVhZCBhIHJlcXVlc3QgaW50byBhIGJ1ZmZlciBhbmQgcGFyc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlcVxuICogQHBhcmFtIHtvYmplY3R9IHJlc1xuICogQHBhcmFtIHtmdW5jdGlvbn0gbmV4dFxuICogQHBhcmFtIHtmdW5jdGlvbn0gcGFyc2VcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRlYnVnXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiByZWFkIChyZXEsIHJlcywgbmV4dCwgcGFyc2UsIGRlYnVnLCBvcHRpb25zKSB7XG4gIHZhciBsZW5ndGhcbiAgdmFyIG9wdHMgPSBvcHRpb25zXG4gIHZhciBzdHJlYW1cblxuICAvLyBmbGFnIGFzIHBhcnNlZFxuICByZXEuX2JvZHkgPSB0cnVlXG5cbiAgLy8gcmVhZCBvcHRpb25zXG4gIHZhciBlbmNvZGluZyA9IG9wdHMuZW5jb2RpbmcgIT09IG51bGxcbiAgICA/IG9wdHMuZW5jb2RpbmdcbiAgICA6IG51bGxcbiAgdmFyIHZlcmlmeSA9IG9wdHMudmVyaWZ5XG5cbiAgdHJ5IHtcbiAgICAvLyBnZXQgdGhlIGNvbnRlbnQgc3RyZWFtXG4gICAgc3RyZWFtID0gY29udGVudHN0cmVhbShyZXEsIGRlYnVnLCBvcHRzLmluZmxhdGUpXG4gICAgbGVuZ3RoID0gc3RyZWFtLmxlbmd0aFxuICAgIHN0cmVhbS5sZW5ndGggPSB1bmRlZmluZWRcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIG5leHQoZXJyKVxuICB9XG5cbiAgLy8gc2V0IHJhdy1ib2R5IG9wdGlvbnNcbiAgb3B0cy5sZW5ndGggPSBsZW5ndGhcbiAgb3B0cy5lbmNvZGluZyA9IHZlcmlmeVxuICAgID8gbnVsbFxuICAgIDogZW5jb2RpbmdcblxuICAvLyBhc3NlcnQgY2hhcnNldCBpcyBzdXBwb3J0ZWRcbiAgaWYgKG9wdHMuZW5jb2RpbmcgPT09IG51bGwgJiYgZW5jb2RpbmcgIT09IG51bGwgJiYgIWljb252LmVuY29kaW5nRXhpc3RzKGVuY29kaW5nKSkge1xuICAgIHJldHVybiBuZXh0KGNyZWF0ZUVycm9yKDQxNSwgJ3Vuc3VwcG9ydGVkIGNoYXJzZXQgXCInICsgZW5jb2RpbmcudG9VcHBlckNhc2UoKSArICdcIicsIHtcbiAgICAgIGNoYXJzZXQ6IGVuY29kaW5nLnRvTG93ZXJDYXNlKCksXG4gICAgICB0eXBlOiAnY2hhcnNldC51bnN1cHBvcnRlZCdcbiAgICB9KSlcbiAgfVxuXG4gIC8vIHJlYWQgYm9keVxuICBkZWJ1ZygncmVhZCBib2R5JylcbiAgZ2V0Qm9keShzdHJlYW0sIG9wdHMsIGZ1bmN0aW9uIChlcnJvciwgYm9keSkge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgdmFyIF9lcnJvclxuXG4gICAgICBpZiAoZXJyb3IudHlwZSA9PT0gJ2VuY29kaW5nLnVuc3VwcG9ydGVkJykge1xuICAgICAgICAvLyBlY2hvIGJhY2sgY2hhcnNldFxuICAgICAgICBfZXJyb3IgPSBjcmVhdGVFcnJvcig0MTUsICd1bnN1cHBvcnRlZCBjaGFyc2V0IFwiJyArIGVuY29kaW5nLnRvVXBwZXJDYXNlKCkgKyAnXCInLCB7XG4gICAgICAgICAgY2hhcnNldDogZW5jb2RpbmcudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICB0eXBlOiAnY2hhcnNldC51bnN1cHBvcnRlZCdcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNldCBzdGF0dXMgY29kZSBvbiBlcnJvclxuICAgICAgICBfZXJyb3IgPSBjcmVhdGVFcnJvcig0MDAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICAvLyB1bnBpcGUgZnJvbSBzdHJlYW0gYW5kIGRlc3Ryb3lcbiAgICAgIGlmIChzdHJlYW0gIT09IHJlcSkge1xuICAgICAgICB1bnBpcGUocmVxKVxuICAgICAgICBkZXN0cm95KHN0cmVhbSwgdHJ1ZSlcbiAgICAgIH1cblxuICAgICAgLy8gcmVhZCBvZmYgZW50aXJlIHJlcXVlc3RcbiAgICAgIGR1bXAocmVxLCBmdW5jdGlvbiBvbmZpbmlzaGVkICgpIHtcbiAgICAgICAgbmV4dChjcmVhdGVFcnJvcig0MDAsIF9lcnJvcikpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5XG4gICAgaWYgKHZlcmlmeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVidWcoJ3ZlcmlmeSBib2R5JylcbiAgICAgICAgdmVyaWZ5KHJlcSwgcmVzLCBib2R5LCBlbmNvZGluZylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBuZXh0KGNyZWF0ZUVycm9yKDQwMywgZXJyLCB7XG4gICAgICAgICAgYm9keTogYm9keSxcbiAgICAgICAgICB0eXBlOiBlcnIudHlwZSB8fCAnZW50aXR5LnZlcmlmeS5mYWlsZWQnXG4gICAgICAgIH0pKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwYXJzZVxuICAgIHZhciBzdHIgPSBib2R5XG4gICAgdHJ5IHtcbiAgICAgIGRlYnVnKCdwYXJzZSBib2R5JylcbiAgICAgIHN0ciA9IHR5cGVvZiBib2R5ICE9PSAnc3RyaW5nJyAmJiBlbmNvZGluZyAhPT0gbnVsbFxuICAgICAgICA/IGljb252LmRlY29kZShib2R5LCBlbmNvZGluZylcbiAgICAgICAgOiBib2R5XG4gICAgICByZXEuYm9keSA9IHBhcnNlKHN0cilcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIG5leHQoY3JlYXRlRXJyb3IoNDAwLCBlcnIsIHtcbiAgICAgICAgYm9keTogc3RyLFxuICAgICAgICB0eXBlOiBlcnIudHlwZSB8fCAnZW50aXR5LnBhcnNlLmZhaWxlZCdcbiAgICAgIH0pKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbmV4dCgpXG4gIH0pXG59XG5cbi8qKlxuICogR2V0IHRoZSBjb250ZW50IHN0cmVhbSBvZiB0aGUgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBkZWJ1Z1xuICogQHBhcmFtIHtib29sZWFufSBbaW5mbGF0ZT10cnVlXVxuICogQHJldHVybiB7b2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29udGVudHN0cmVhbSAocmVxLCBkZWJ1ZywgaW5mbGF0ZSkge1xuICB2YXIgZW5jb2RpbmcgPSAocmVxLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSB8fCAnaWRlbnRpdHknKS50b0xvd2VyQ2FzZSgpXG4gIHZhciBsZW5ndGggPSByZXEuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXVxuICB2YXIgc3RyZWFtXG5cbiAgZGVidWcoJ2NvbnRlbnQtZW5jb2RpbmcgXCIlc1wiJywgZW5jb2RpbmcpXG5cbiAgaWYgKGluZmxhdGUgPT09IGZhbHNlICYmIGVuY29kaW5nICE9PSAnaWRlbnRpdHknKSB7XG4gICAgdGhyb3cgY3JlYXRlRXJyb3IoNDE1LCAnY29udGVudCBlbmNvZGluZyB1bnN1cHBvcnRlZCcsIHtcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZyxcbiAgICAgIHR5cGU6ICdlbmNvZGluZy51bnN1cHBvcnRlZCdcbiAgICB9KVxuICB9XG5cbiAgc3dpdGNoIChlbmNvZGluZykge1xuICAgIGNhc2UgJ2RlZmxhdGUnOlxuICAgICAgc3RyZWFtID0gemxpYi5jcmVhdGVJbmZsYXRlKClcbiAgICAgIGRlYnVnKCdpbmZsYXRlIGJvZHknKVxuICAgICAgcmVxLnBpcGUoc3RyZWFtKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdnemlwJzpcbiAgICAgIHN0cmVhbSA9IHpsaWIuY3JlYXRlR3VuemlwKClcbiAgICAgIGRlYnVnKCdndW56aXAgYm9keScpXG4gICAgICByZXEucGlwZShzdHJlYW0pXG4gICAgICBicmVha1xuICAgIGNhc2UgJ2lkZW50aXR5JzpcbiAgICAgIHN0cmVhbSA9IHJlcVxuICAgICAgc3RyZWFtLmxlbmd0aCA9IGxlbmd0aFxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgY3JlYXRlRXJyb3IoNDE1LCAndW5zdXBwb3J0ZWQgY29udGVudCBlbmNvZGluZyBcIicgKyBlbmNvZGluZyArICdcIicsIHtcbiAgICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgICB0eXBlOiAnZW5jb2RpbmcudW5zdXBwb3J0ZWQnXG4gICAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG4vKipcbiAqIER1bXAgdGhlIGNvbnRlbnRzIG9mIGEgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZHVtcCAocmVxLCBjYWxsYmFjaykge1xuICBpZiAob25GaW5pc2hlZC5pc0ZpbmlzaGVkKHJlcSkpIHtcbiAgICBjYWxsYmFjayhudWxsKVxuICB9IGVsc2Uge1xuICAgIG9uRmluaXNoZWQocmVxLCBjYWxsYmFjaylcbiAgICByZXEucmVzdW1lKClcbiAgfVxufVxuIiwgIi8qIVxuICogbWVkaWEtdHlwZXJcbiAqIENvcHlyaWdodChjKSAyMDE0IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCAqKCBcIjtcIiBwYXJhbWV0ZXIgKSBpbiBSRkMgMjYxNiBzZWMgMy43XG4gKlxuICogcGFyYW1ldGVyICAgICA9IHRva2VuIFwiPVwiICggdG9rZW4gfCBxdW90ZWQtc3RyaW5nIClcbiAqIHRva2VuICAgICAgICAgPSAxKjxhbnkgQ0hBUiBleGNlcHQgQ1RMcyBvciBzZXBhcmF0b3JzPlxuICogc2VwYXJhdG9ycyAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAqICAgICAgICAgICAgICAgfCBcIixcIiB8IFwiO1wiIHwgXCI6XCIgfCBcIlxcXCIgfCA8XCI+XG4gKiAgICAgICAgICAgICAgIHwgXCIvXCIgfCBcIltcIiB8IFwiXVwiIHwgXCI/XCIgfCBcIj1cIlxuICogICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKiBxdW90ZWQtc3RyaW5nID0gKCA8XCI+ICoocWR0ZXh0IHwgcXVvdGVkLXBhaXIgKSA8XCI+IClcbiAqIHFkdGV4dCAgICAgICAgPSA8YW55IFRFWFQgZXhjZXB0IDxcIj4+XG4gKiBxdW90ZWQtcGFpciAgID0gXCJcXFwiIENIQVJcbiAqIENIQVIgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuICogVEVYVCAgICAgICAgICA9IDxhbnkgT0NURVQgZXhjZXB0IENUTHMsIGJ1dCBpbmNsdWRpbmcgTFdTPlxuICogTFdTICAgICAgICAgICA9IFtDUkxGXSAxKiggU1AgfCBIVCApXG4gKiBDUkxGICAgICAgICAgID0gQ1IgTEZcbiAqIENSICAgICAgICAgICAgPSA8VVMtQVNDSUkgQ1IsIGNhcnJpYWdlIHJldHVybiAoMTMpPlxuICogTEYgICAgICAgICAgICA9IDxVUy1BU0NJSSBMRiwgbGluZWZlZWQgKDEwKT5cbiAqIFNQICAgICAgICAgICAgPSA8VVMtQVNDSUkgU1AsIHNwYWNlICgzMik+XG4gKiBTSFQgICAgICAgICAgID0gPFVTLUFTQ0lJIEhULCBob3Jpem9udGFsLXRhYiAoOSk+XG4gKiBDVEwgICAgICAgICAgID0gPGFueSBVUy1BU0NJSSBjb250cm9sIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAzMSkgYW5kIERFTCAoMTI3KT5cbiAqIE9DVEVUICAgICAgICAgPSA8YW55IDgtYml0IHNlcXVlbmNlIG9mIGRhdGE+XG4gKi9cbnZhciBwYXJhbVJlZ0V4cCA9IC87ICooWyEjJCUmJ1xcKlxcK1xcLVxcLjAtOUEtWlxcXl9gYS16XFx8fl0rKSAqPSAqKFwiKD86WyAhXFx1MDAyMy1cXHUwMDViXFx1MDA1ZC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXXxcXFxcW1xcdTAwMjAtXFx1MDA3ZV0pKlwifFshIyQlJidcXCpcXCtcXC1cXC4wLTlBLVpcXF5fYGEtelxcfH5dKykgKi9nO1xudmFyIHRleHRSZWdFeHAgPSAvXltcXHUwMDIwLVxcdTAwN2VcXHUwMDgwLVxcdTAwZmZdKyQvXG52YXIgdG9rZW5SZWdFeHAgPSAvXlshIyQlJidcXCpcXCtcXC1cXC4wLTlBLVpcXF5fYGEtelxcfH5dKyQvXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHF1b3RlZC1wYWlyIGluIFJGQyAyNjE2XG4gKlxuICogcXVvdGVkLXBhaXIgPSBcIlxcXCIgQ0hBUlxuICogQ0hBUiAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuICovXG52YXIgcWVzY1JlZ0V4cCA9IC9cXFxcKFtcXHUwMDAwLVxcdTAwN2ZdKS9nO1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBjaGFycyB0aGF0IG11c3QgYmUgcXVvdGVkLXBhaXIgaW4gUkZDIDI2MTZcbiAqL1xudmFyIHF1b3RlUmVnRXhwID0gLyhbXFxcXFwiXSkvZztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggdHlwZSBpbiBSRkMgNjgzOFxuICpcbiAqIHR5cGUtbmFtZSA9IHJlc3RyaWN0ZWQtbmFtZVxuICogc3VidHlwZS1uYW1lID0gcmVzdHJpY3RlZC1uYW1lXG4gKiByZXN0cmljdGVkLW5hbWUgPSByZXN0cmljdGVkLW5hbWUtZmlyc3QgKjEyNnJlc3RyaWN0ZWQtbmFtZS1jaGFyc1xuICogcmVzdHJpY3RlZC1uYW1lLWZpcnN0ICA9IEFMUEhBIC8gRElHSVRcbiAqIHJlc3RyaWN0ZWQtbmFtZS1jaGFycyAgPSBBTFBIQSAvIERJR0lUIC8gXCIhXCIgLyBcIiNcIiAvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgXCIkXCIgLyBcIiZcIiAvIFwiLVwiIC8gXCJeXCIgLyBcIl9cIlxuICogcmVzdHJpY3RlZC1uYW1lLWNoYXJzID0vIFwiLlwiIDsgQ2hhcmFjdGVycyBiZWZvcmUgZmlyc3QgZG90IGFsd2F5c1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNwZWNpZnkgYSBmYWNldCBuYW1lXG4gKiByZXN0cmljdGVkLW5hbWUtY2hhcnMgPS8gXCIrXCIgOyBDaGFyYWN0ZXJzIGFmdGVyIGxhc3QgcGx1cyBhbHdheXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBzcGVjaWZ5IGEgc3RydWN0dXJlZCBzeW50YXggc3VmZml4XG4gKiBBTFBIQSA9ICAleDQxLTVBIC8gJXg2MS03QSAgIDsgQS1aIC8gYS16XG4gKiBESUdJVCA9ICAleDMwLTM5ICAgICAgICAgICAgIDsgMC05XG4gKi9cbnZhciBzdWJ0eXBlTmFtZVJlZ0V4cCA9IC9eW0EtWmEtejAtOV1bQS1aYS16MC05ISMkJl5fLi1dezAsMTI2fSQvXG52YXIgdHlwZU5hbWVSZWdFeHAgPSAvXltBLVphLXowLTldW0EtWmEtejAtOSEjJCZeXy1dezAsMTI2fSQvXG52YXIgdHlwZVJlZ0V4cCA9IC9eICooW0EtWmEtejAtOV1bQS1aYS16MC05ISMkJl5fLV17MCwxMjZ9KVxcLyhbQS1aYS16MC05XVtBLVphLXowLTkhIyQmXl8uKy1dezAsMTI2fSkgKiQvO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0ID0gZm9ybWF0XG5leHBvcnRzLnBhcnNlID0gcGFyc2VcblxuLyoqXG4gKiBGb3JtYXQgb2JqZWN0IHRvIG1lZGlhIHR5cGUuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHJldHVybiB7c3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXQob2JqKSB7XG4gIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgb2JqIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIHZhciBwYXJhbWV0ZXJzID0gb2JqLnBhcmFtZXRlcnNcbiAgdmFyIHN1YnR5cGUgPSBvYmouc3VidHlwZVxuICB2YXIgc3VmZml4ID0gb2JqLnN1ZmZpeFxuICB2YXIgdHlwZSA9IG9iai50eXBlXG5cbiAgaWYgKCF0eXBlIHx8ICF0eXBlTmFtZVJlZ0V4cC50ZXN0KHR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCB0eXBlJylcbiAgfVxuXG4gIGlmICghc3VidHlwZSB8fCAhc3VidHlwZU5hbWVSZWdFeHAudGVzdChzdWJ0eXBlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgc3VidHlwZScpXG4gIH1cblxuICAvLyBmb3JtYXQgYXMgdHlwZS9zdWJ0eXBlXG4gIHZhciBzdHJpbmcgPSB0eXBlICsgJy8nICsgc3VidHlwZVxuXG4gIC8vIGFwcGVuZCArc3VmZml4XG4gIGlmIChzdWZmaXgpIHtcbiAgICBpZiAoIXR5cGVOYW1lUmVnRXhwLnRlc3Qoc3VmZml4KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzdWZmaXgnKVxuICAgIH1cblxuICAgIHN0cmluZyArPSAnKycgKyBzdWZmaXhcbiAgfVxuXG4gIC8vIGFwcGVuZCBwYXJhbWV0ZXJzXG4gIGlmIChwYXJhbWV0ZXJzICYmIHR5cGVvZiBwYXJhbWV0ZXJzID09PSAnb2JqZWN0Jykge1xuICAgIHZhciBwYXJhbVxuICAgIHZhciBwYXJhbXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5zb3J0KClcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYXJhbSA9IHBhcmFtc1tpXVxuXG4gICAgICBpZiAoIXRva2VuUmVnRXhwLnRlc3QocGFyYW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIG5hbWUnKVxuICAgICAgfVxuXG4gICAgICBzdHJpbmcgKz0gJzsgJyArIHBhcmFtICsgJz0nICsgcXN0cmluZyhwYXJhbWV0ZXJzW3BhcmFtXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyaW5nXG59XG5cbi8qKlxuICogUGFyc2UgbWVkaWEgdHlwZSB0byBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBzdHJpbmdcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyaW5nKSB7XG4gIGlmICghc3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyaW5nIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIHN1cHBvcnQgcmVxL3Jlcy1saWtlIG9iamVjdHMgYXMgYXJndW1lbnRcbiAgaWYgKHR5cGVvZiBzdHJpbmcgPT09ICdvYmplY3QnKSB7XG4gICAgc3RyaW5nID0gZ2V0Y29udGVudHR5cGUoc3RyaW5nKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyaW5nIGlzIHJlcXVpcmVkIHRvIGJlIGEgc3RyaW5nJylcbiAgfVxuXG4gIHZhciBpbmRleCA9IHN0cmluZy5pbmRleE9mKCc7JylcbiAgdmFyIHR5cGUgPSBpbmRleCAhPT0gLTFcbiAgICA/IHN0cmluZy5zdWJzdHIoMCwgaW5kZXgpXG4gICAgOiBzdHJpbmdcblxuICB2YXIga2V5XG4gIHZhciBtYXRjaFxuICB2YXIgb2JqID0gc3BsaXRUeXBlKHR5cGUpXG4gIHZhciBwYXJhbXMgPSB7fVxuICB2YXIgdmFsdWVcblxuICBwYXJhbVJlZ0V4cC5sYXN0SW5kZXggPSBpbmRleFxuXG4gIHdoaWxlIChtYXRjaCA9IHBhcmFtUmVnRXhwLmV4ZWMoc3RyaW5nKSkge1xuICAgIGlmIChtYXRjaC5pbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIGZvcm1hdCcpXG4gICAgfVxuXG4gICAgaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAga2V5ID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIHZhbHVlID0gbWF0Y2hbMl1cblxuICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgLy8gcmVtb3ZlIHF1b3RlcyBhbmQgZXNjYXBlc1xuICAgICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgICAuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpXG4gICAgICAgIC5yZXBsYWNlKHFlc2NSZWdFeHAsICckMScpXG4gICAgfVxuXG4gICAgcGFyYW1zW2tleV0gPSB2YWx1ZVxuICB9XG5cbiAgaWYgKGluZGV4ICE9PSAtMSAmJiBpbmRleCAhPT0gc3RyaW5nLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIGZvcm1hdCcpXG4gIH1cblxuICBvYmoucGFyYW1ldGVycyA9IHBhcmFtc1xuXG4gIHJldHVybiBvYmpcbn1cblxuLyoqXG4gKiBHZXQgY29udGVudC10eXBlIGZyb20gcmVxL3JlcyBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fVxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0Y29udGVudHR5cGUob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqLmdldEhlYWRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIHJlcy1saWtlXG4gICAgcmV0dXJuIG9iai5nZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScpXG4gIH1cblxuICBpZiAodHlwZW9mIG9iai5oZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgIC8vIHJlcS1saWtlXG4gICAgcmV0dXJuIG9iai5oZWFkZXJzICYmIG9iai5oZWFkZXJzWydjb250ZW50LXR5cGUnXVxuICB9XG59XG5cbi8qKlxuICogUXVvdGUgYSBzdHJpbmcgaWYgbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHFzdHJpbmcodmFsKSB7XG4gIHZhciBzdHIgPSBTdHJpbmcodmFsKVxuXG4gIC8vIG5vIG5lZWQgdG8gcXVvdGUgdG9rZW5zXG4gIGlmICh0b2tlblJlZ0V4cC50ZXN0KHN0cikpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBpZiAoc3RyLmxlbmd0aCA+IDAgJiYgIXRleHRSZWdFeHAudGVzdChzdHIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgdmFsdWUnKVxuICB9XG5cbiAgcmV0dXJuICdcIicgKyBzdHIucmVwbGFjZShxdW90ZVJlZ0V4cCwgJ1xcXFwkMScpICsgJ1wiJ1xufVxuXG4vKipcbiAqIFNpbXBseSBcInR5cGUvc3VidHlwZStzaWZmeFwiIGludG8gcGFydHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRUeXBlKHN0cmluZykge1xuICB2YXIgbWF0Y2ggPSB0eXBlUmVnRXhwLmV4ZWMoc3RyaW5nLnRvTG93ZXJDYXNlKCkpXG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgbWVkaWEgdHlwZScpXG4gIH1cblxuICB2YXIgdHlwZSA9IG1hdGNoWzFdXG4gIHZhciBzdWJ0eXBlID0gbWF0Y2hbMl1cbiAgdmFyIHN1ZmZpeFxuXG4gIC8vIHN1ZmZpeCBhZnRlciBsYXN0ICtcbiAgdmFyIGluZGV4ID0gc3VidHlwZS5sYXN0SW5kZXhPZignKycpXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBzdWZmaXggPSBzdWJ0eXBlLnN1YnN0cihpbmRleCArIDEpXG4gICAgc3VidHlwZSA9IHN1YnR5cGUuc3Vic3RyKDAsIGluZGV4KVxuICB9XG5cbiAgdmFyIG9iaiA9IHtcbiAgICB0eXBlOiB0eXBlLFxuICAgIHN1YnR5cGU6IHN1YnR5cGUsXG4gICAgc3VmZml4OiBzdWZmaXhcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cbiIsICIvKiFcbiAqIG1pbWUtZGJcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTUtMjAyMiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGIuanNvbicpXG4iLCAiLyohXG4gKiBtaW1lLXR5cGVzXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGIgPSByZXF1aXJlKCdtaW1lLWRiJylcbnZhciBleHRuYW1lID0gcmVxdWlyZSgncGF0aCcpLmV4dG5hbWVcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRVhUUkFDVF9UWVBFX1JFR0VYUCA9IC9eXFxzKihbXjtcXHNdKikoPzo7fFxcc3wkKS9cbnZhciBURVhUX1RZUEVfUkVHRVhQID0gL150ZXh0XFwvL2lcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmNoYXJzZXQgPSBjaGFyc2V0XG5leHBvcnRzLmNoYXJzZXRzID0geyBsb29rdXA6IGNoYXJzZXQgfVxuZXhwb3J0cy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlXG5leHBvcnRzLmV4dGVuc2lvbiA9IGV4dGVuc2lvblxuZXhwb3J0cy5leHRlbnNpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuZXhwb3J0cy5sb29rdXAgPSBsb29rdXBcbmV4cG9ydHMudHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbi8vIFBvcHVsYXRlIHRoZSBleHRlbnNpb25zL3R5cGVzIG1hcHNcbnBvcHVsYXRlTWFwcyhleHBvcnRzLmV4dGVuc2lvbnMsIGV4cG9ydHMudHlwZXMpXG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGNoYXJzZXQgZm9yIGEgTUlNRSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufHN0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBjaGFyc2V0ICh0eXBlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBtZWRpYS10eXBlclxuICB2YXIgbWF0Y2ggPSBFWFRSQUNUX1RZUEVfUkVHRVhQLmV4ZWModHlwZSlcbiAgdmFyIG1pbWUgPSBtYXRjaCAmJiBkYlttYXRjaFsxXS50b0xvd2VyQ2FzZSgpXVxuXG4gIGlmIChtaW1lICYmIG1pbWUuY2hhcnNldCkge1xuICAgIHJldHVybiBtaW1lLmNoYXJzZXRcbiAgfVxuXG4gIC8vIGRlZmF1bHQgdGV4dC8qIHRvIHV0Zi04XG4gIGlmIChtYXRjaCAmJiBURVhUX1RZUEVfUkVHRVhQLnRlc3QobWF0Y2hbMV0pKSB7XG4gICAgcmV0dXJuICdVVEYtOCdcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bGwgQ29udGVudC1UeXBlIGhlYWRlciBnaXZlbiBhIE1JTUUgdHlwZSBvciBleHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7Ym9vbGVhbnxzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gY29udGVudFR5cGUgKHN0cikge1xuICAvLyBUT0RPOiBzaG91bGQgdGhpcyBldmVuIGJlIGluIHRoaXMgbW9kdWxlP1xuICBpZiAoIXN0ciB8fCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdmFyIG1pbWUgPSBzdHIuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gZXhwb3J0cy5sb29rdXAoc3RyKVxuICAgIDogc3RyXG5cbiAgaWYgKCFtaW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgY29udGVudC10eXBlIG9yIG90aGVyIG1vZHVsZVxuICBpZiAobWltZS5pbmRleE9mKCdjaGFyc2V0JykgPT09IC0xKSB7XG4gICAgdmFyIGNoYXJzZXQgPSBleHBvcnRzLmNoYXJzZXQobWltZSlcbiAgICBpZiAoY2hhcnNldCkgbWltZSArPSAnOyBjaGFyc2V0PScgKyBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIHJldHVybiBtaW1lXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgYSBNSU1FIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGV4dGVuc2lvbiAodHlwZSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgbWVkaWEtdHlwZXJcbiAgdmFyIG1hdGNoID0gRVhUUkFDVF9UWVBFX1JFR0VYUC5leGVjKHR5cGUpXG5cbiAgLy8gZ2V0IGV4dGVuc2lvbnNcbiAgdmFyIGV4dHMgPSBtYXRjaCAmJiBleHBvcnRzLmV4dGVuc2lvbnNbbWF0Y2hbMV0udG9Mb3dlckNhc2UoKV1cblxuICBpZiAoIWV4dHMgfHwgIWV4dHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXh0c1swXVxufVxuXG4vKipcbiAqIExvb2t1cCB0aGUgTUlNRSB0eXBlIGZvciBhIGZpbGUgcGF0aC9leHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGxvb2t1cCAocGF0aCkge1xuICBpZiAoIXBhdGggfHwgdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBnZXQgdGhlIGV4dGVuc2lvbiAoXCJleHRcIiBvciBcIi5leHRcIiBvciBmdWxsIHBhdGgpXG4gIHZhciBleHRlbnNpb24gPSBleHRuYW1lKCd4LicgKyBwYXRoKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnN1YnN0cigxKVxuXG4gIGlmICghZXh0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy50eXBlc1tleHRlbnNpb25dIHx8IGZhbHNlXG59XG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGV4dGVuc2lvbnMgYW5kIHR5cGVzIG1hcHMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBvcHVsYXRlTWFwcyAoZXh0ZW5zaW9ucywgdHlwZXMpIHtcbiAgLy8gc291cmNlIHByZWZlcmVuY2UgKGxlYXN0IC0+IG1vc3QpXG4gIHZhciBwcmVmZXJlbmNlID0gWyduZ2lueCcsICdhcGFjaGUnLCB1bmRlZmluZWQsICdpYW5hJ11cblxuICBPYmplY3Qua2V5cyhkYikuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoTWltZVR5cGUgKHR5cGUpIHtcbiAgICB2YXIgbWltZSA9IGRiW3R5cGVdXG4gICAgdmFyIGV4dHMgPSBtaW1lLmV4dGVuc2lvbnNcblxuICAgIGlmICghZXh0cyB8fCAhZXh0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIG1pbWUgLT4gZXh0ZW5zaW9uc1xuICAgIGV4dGVuc2lvbnNbdHlwZV0gPSBleHRzXG5cbiAgICAvLyBleHRlbnNpb24gLT4gbWltZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV4dGVuc2lvbiA9IGV4dHNbaV1cblxuICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0pIHtcbiAgICAgICAgdmFyIGZyb20gPSBwcmVmZXJlbmNlLmluZGV4T2YoZGJbdHlwZXNbZXh0ZW5zaW9uXV0uc291cmNlKVxuICAgICAgICB2YXIgdG8gPSBwcmVmZXJlbmNlLmluZGV4T2YobWltZS5zb3VyY2UpXG5cbiAgICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0gIT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nICYmXG4gICAgICAgICAgKGZyb20gPiB0byB8fCAoZnJvbSA9PT0gdG8gJiYgdHlwZXNbZXh0ZW5zaW9uXS5zdWJzdHIoMCwgMTIpID09PSAnYXBwbGljYXRpb24vJykpKSB7XG4gICAgICAgICAgLy8gc2tpcCB0aGUgcmVtYXBwaW5nXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIGV4dGVuc2lvbiAtPiBtaW1lXG4gICAgICB0eXBlc1tleHRlbnNpb25dID0gdHlwZVxuICAgIH1cbiAgfSlcbn1cbiIsICIvKiFcbiAqIHR5cGUtaXNcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHR5cGVyID0gcmVxdWlyZSgnbWVkaWEtdHlwZXInKVxudmFyIG1pbWUgPSByZXF1aXJlKCdtaW1lLXR5cGVzJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHR5cGVvZnJlcXVlc3Rcbm1vZHVsZS5leHBvcnRzLmlzID0gdHlwZWlzXG5tb2R1bGUuZXhwb3J0cy5oYXNCb2R5ID0gaGFzYm9keVxubW9kdWxlLmV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplXG5tb2R1bGUuZXhwb3J0cy5tYXRjaCA9IG1pbWVNYXRjaFxuXG4vKipcbiAqIENvbXBhcmUgYSBgdmFsdWVgIGNvbnRlbnQtdHlwZSB3aXRoIGB0eXBlc2AuXG4gKiBFYWNoIGB0eXBlYCBjYW4gYmUgYW4gZXh0ZW5zaW9uIGxpa2UgYGh0bWxgLFxuICogYSBzcGVjaWFsIHNob3J0Y3V0IGxpa2UgYG11bHRpcGFydGAgb3IgYHVybGVuY29kZWRgLFxuICogb3IgYSBtaW1lIHR5cGUuXG4gKlxuICogSWYgbm8gdHlwZXMgbWF0Y2gsIGBmYWxzZWAgaXMgcmV0dXJuZWQuXG4gKiBPdGhlcndpc2UsIHRoZSBmaXJzdCBgdHlwZWAgdGhhdCBtYXRjaGVzIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtBcnJheX0gdHlwZXNcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB0eXBlaXMgKHZhbHVlLCB0eXBlc18pIHtcbiAgdmFyIGlcbiAgdmFyIHR5cGVzID0gdHlwZXNfXG5cbiAgLy8gcmVtb3ZlIHBhcmFtZXRlcnMgYW5kIG5vcm1hbGl6ZVxuICB2YXIgdmFsID0gdHJ5Tm9ybWFsaXplVHlwZSh2YWx1ZSlcblxuICAvLyBubyB0eXBlIG9yIGludmFsaWRcbiAgaWYgKCF2YWwpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAodHlwZXMgJiYgIUFycmF5LmlzQXJyYXkodHlwZXMpKSB7XG4gICAgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpXG4gICAgZm9yIChpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpICsgMV1cbiAgICB9XG4gIH1cblxuICAvLyBubyB0eXBlcywgcmV0dXJuIHRoZSBjb250ZW50IHR5cGVcbiAgaWYgKCF0eXBlcyB8fCAhdHlwZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgdmFyIHR5cGVcbiAgZm9yIChpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG1pbWVNYXRjaChub3JtYWxpemUodHlwZSA9IHR5cGVzW2ldKSwgdmFsKSkge1xuICAgICAgcmV0dXJuIHR5cGVbMF0gPT09ICcrJyB8fCB0eXBlLmluZGV4T2YoJyonKSAhPT0gLTFcbiAgICAgICAgPyB2YWxcbiAgICAgICAgOiB0eXBlXG4gICAgfVxuICB9XG5cbiAgLy8gbm8gbWF0Y2hlc1xuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHJlcXVlc3QgaGFzIGEgcmVxdWVzdCBib2R5LlxuICogQSByZXF1ZXN0IHdpdGggYSBib2R5IF9fbXVzdF9fIGVpdGhlciBoYXZlIGB0cmFuc2Zlci1lbmNvZGluZ2BcbiAqIG9yIGBjb250ZW50LWxlbmd0aGAgaGVhZGVycyBzZXQuXG4gKiBodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzQuaHRtbCNzZWM0LjNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBoYXNib2R5IChyZXEpIHtcbiAgcmV0dXJuIHJlcS5oZWFkZXJzWyd0cmFuc2Zlci1lbmNvZGluZyddICE9PSB1bmRlZmluZWQgfHxcbiAgICAhaXNOYU4ocmVxLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGluY29taW5nIHJlcXVlc3QgY29udGFpbnMgdGhlIFwiQ29udGVudC1UeXBlXCJcbiAqIGhlYWRlciBmaWVsZCwgYW5kIGl0IGNvbnRhaW5zIGFueSBvZiB0aGUgZ2l2ZSBtaW1lIGB0eXBlYHMuXG4gKiBJZiB0aGVyZSBpcyBubyByZXF1ZXN0IGJvZHksIGBudWxsYCBpcyByZXR1cm5lZC5cbiAqIElmIHRoZXJlIGlzIG5vIGNvbnRlbnQgdHlwZSwgYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAqIE90aGVyd2lzZSwgaXQgcmV0dXJucyB0aGUgZmlyc3QgYHR5cGVgIHRoYXQgbWF0Y2hlcy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgLy8gV2l0aCBDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOFxuICogICAgIHRoaXMuaXMoJ2h0bWwnKTsgLy8gPT4gJ2h0bWwnXG4gKiAgICAgdGhpcy5pcygndGV4dC9odG1sJyk7IC8vID0+ICd0ZXh0L2h0bWwnXG4gKiAgICAgdGhpcy5pcygndGV4dC8qJywgJ2FwcGxpY2F0aW9uL2pzb24nKTsgLy8gPT4gJ3RleHQvaHRtbCdcbiAqXG4gKiAgICAgLy8gV2hlbiBDb250ZW50LVR5cGUgaXMgYXBwbGljYXRpb24vanNvblxuICogICAgIHRoaXMuaXMoJ2pzb24nLCAndXJsZW5jb2RlZCcpOyAvLyA9PiAnanNvbidcbiAqICAgICB0aGlzLmlzKCdhcHBsaWNhdGlvbi9qc29uJyk7IC8vID0+ICdhcHBsaWNhdGlvbi9qc29uJ1xuICogICAgIHRoaXMuaXMoJ2h0bWwnLCAnYXBwbGljYXRpb24vKicpOyAvLyA9PiAnYXBwbGljYXRpb24vanNvbidcbiAqXG4gKiAgICAgdGhpcy5pcygnaHRtbCcpOyAvLyA9PiBmYWxzZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSB0eXBlcy4uLlxuICogQHJldHVybiB7U3RyaW5nfGZhbHNlfG51bGx9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gdHlwZW9mcmVxdWVzdCAocmVxLCB0eXBlc18pIHtcbiAgdmFyIHR5cGVzID0gdHlwZXNfXG5cbiAgLy8gbm8gYm9keVxuICBpZiAoIWhhc2JvZHkocmVxKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBzdXBwb3J0IGZsYXR0ZW5lZCBhcmd1bWVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdHlwZXNbaV0gPSBhcmd1bWVudHNbaSArIDFdXG4gICAgfVxuICB9XG5cbiAgLy8gcmVxdWVzdCBjb250ZW50IHR5cGVcbiAgdmFyIHZhbHVlID0gcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddXG5cbiAgcmV0dXJuIHR5cGVpcyh2YWx1ZSwgdHlwZXMpXG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgbWltZSB0eXBlLlxuICogSWYgaXQncyBhIHNob3J0aGFuZCwgZXhwYW5kIGl0IHRvIGEgdmFsaWQgbWltZSB0eXBlLlxuICpcbiAqIEluIGdlbmVyYWwsIHlvdSBwcm9iYWJseSB3YW50OlxuICpcbiAqICAgdmFyIHR5cGUgPSBpcyhyZXEsIFsndXJsZW5jb2RlZCcsICdqc29uJywgJ211bHRpcGFydCddKTtcbiAqXG4gKiBUaGVuIHVzZSB0aGUgYXBwcm9wcmlhdGUgYm9keSBwYXJzZXJzLlxuICogVGhlc2UgdGhyZWUgYXJlIHRoZSBtb3N0IGNvbW1vbiByZXF1ZXN0IGJvZHkgdHlwZXNcbiAqIGFuZCBhcmUgdGh1cyBlbnN1cmVkIHRvIHdvcmsuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplICh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBpbnZhbGlkIHR5cGVcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3VybGVuY29kZWQnOlxuICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgY2FzZSAnbXVsdGlwYXJ0JzpcbiAgICAgIHJldHVybiAnbXVsdGlwYXJ0LyonXG4gIH1cblxuICBpZiAodHlwZVswXSA9PT0gJysnKSB7XG4gICAgLy8gXCIranNvblwiIC0+IFwiKi8qK2pzb25cIiBleHBhbmRvXG4gICAgcmV0dXJuICcqLyonICsgdHlwZVxuICB9XG5cbiAgcmV0dXJuIHR5cGUuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gbWltZS5sb29rdXAodHlwZSlcbiAgICA6IHR5cGVcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBgZXhwZWN0ZWRgIG1pbWUgdHlwZVxuICogbWF0Y2hlcyBgYWN0dWFsYCBtaW1lIHR5cGUgd2l0aFxuICogd2lsZGNhcmQgYW5kICtzdWZmaXggc3VwcG9ydC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXhwZWN0ZWRcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3R1YWxcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1pbWVNYXRjaCAoZXhwZWN0ZWQsIGFjdHVhbCkge1xuICAvLyBpbnZhbGlkIHR5cGVcbiAgaWYgKGV4cGVjdGVkID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gc3BsaXQgdHlwZXNcbiAgdmFyIGFjdHVhbFBhcnRzID0gYWN0dWFsLnNwbGl0KCcvJylcbiAgdmFyIGV4cGVjdGVkUGFydHMgPSBleHBlY3RlZC5zcGxpdCgnLycpXG5cbiAgLy8gaW52YWxpZCBmb3JtYXRcbiAgaWYgKGFjdHVhbFBhcnRzLmxlbmd0aCAhPT0gMiB8fCBleHBlY3RlZFBhcnRzLmxlbmd0aCAhPT0gMikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gdmFsaWRhdGUgdHlwZVxuICBpZiAoZXhwZWN0ZWRQYXJ0c1swXSAhPT0gJyonICYmIGV4cGVjdGVkUGFydHNbMF0gIT09IGFjdHVhbFBhcnRzWzBdKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyB2YWxpZGF0ZSBzdWZmaXggd2lsZGNhcmRcbiAgaWYgKGV4cGVjdGVkUGFydHNbMV0uc3Vic3RyKDAsIDIpID09PSAnKisnKSB7XG4gICAgcmV0dXJuIGV4cGVjdGVkUGFydHNbMV0ubGVuZ3RoIDw9IGFjdHVhbFBhcnRzWzFdLmxlbmd0aCArIDEgJiZcbiAgICAgIGV4cGVjdGVkUGFydHNbMV0uc3Vic3RyKDEpID09PSBhY3R1YWxQYXJ0c1sxXS5zdWJzdHIoMSAtIGV4cGVjdGVkUGFydHNbMV0ubGVuZ3RoKVxuICB9XG5cbiAgLy8gdmFsaWRhdGUgc3VidHlwZVxuICBpZiAoZXhwZWN0ZWRQYXJ0c1sxXSAhPT0gJyonICYmIGV4cGVjdGVkUGFydHNbMV0gIT09IGFjdHVhbFBhcnRzWzFdKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHR5cGUgYW5kIHJlbW92ZSBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVUeXBlICh2YWx1ZSkge1xuICAvLyBwYXJzZSB0aGUgdHlwZVxuICB2YXIgdHlwZSA9IHR5cGVyLnBhcnNlKHZhbHVlKVxuXG4gIC8vIHJlbW92ZSB0aGUgcGFyYW1ldGVyc1xuICB0eXBlLnBhcmFtZXRlcnMgPSB1bmRlZmluZWRcblxuICAvLyByZWZvcm1hdCBpdFxuICByZXR1cm4gdHlwZXIuZm9ybWF0KHR5cGUpXG59XG5cbi8qKlxuICogVHJ5IHRvIG5vcm1hbGl6ZSBhIHR5cGUgYW5kIHJlbW92ZSBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0cnlOb3JtYWxpemVUeXBlICh2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVR5cGUodmFsdWUpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbiIsICIvKiFcbiAqIGJvZHktcGFyc2VyXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBieXRlcyA9IHJlcXVpcmUoJ2J5dGVzJylcbnZhciBjb250ZW50VHlwZSA9IHJlcXVpcmUoJ2NvbnRlbnQtdHlwZScpXG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCdodHRwLWVycm9ycycpXG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdib2R5LXBhcnNlcjpqc29uJylcbnZhciByZWFkID0gcmVxdWlyZSgnLi4vcmVhZCcpXG52YXIgdHlwZWlzID0gcmVxdWlyZSgndHlwZS1pcycpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBqc29uXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHRoZSBmaXJzdCBub24tc3BhY2UgaW4gYSBzdHJpbmcuXG4gKlxuICogQWxsb3dlZCB3aGl0ZXNwYWNlIGlzIGRlZmluZWQgaW4gUkZDIDcxNTk6XG4gKlxuICogICAgd3MgPSAqKFxuICogICAgICAgICAgICAleDIwIC8gICAgICAgICAgICAgIDsgU3BhY2VcbiAqICAgICAgICAgICAgJXgwOSAvICAgICAgICAgICAgICA7IEhvcml6b250YWwgdGFiXG4gKiAgICAgICAgICAgICV4MEEgLyAgICAgICAgICAgICAgOyBMaW5lIGZlZWQgb3IgTmV3IGxpbmVcbiAqICAgICAgICAgICAgJXgwRCApICAgICAgICAgICAgICA7IENhcnJpYWdlIHJldHVyblxuICovXG5cbnZhciBGSVJTVF9DSEFSX1JFR0VYUCA9IC9eW1xceDIwXFx4MDlcXHgwYVxceDBkXSooW15cXHgyMFxceDA5XFx4MGFcXHgwZF0pLyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIEpTT04gYm9kaWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGpzb24gKG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9XG5cbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgIT09ICdudW1iZXInXG4gICAgPyBieXRlcy5wYXJzZShvcHRzLmxpbWl0IHx8ICcxMDBrYicpXG4gICAgOiBvcHRzLmxpbWl0XG4gIHZhciBpbmZsYXRlID0gb3B0cy5pbmZsYXRlICE9PSBmYWxzZVxuICB2YXIgcmV2aXZlciA9IG9wdHMucmV2aXZlclxuICB2YXIgc3RyaWN0ID0gb3B0cy5zdHJpY3QgIT09IGZhbHNlXG4gIHZhciB0eXBlID0gb3B0cy50eXBlIHx8ICdhcHBsaWNhdGlvbi9qc29uJ1xuICB2YXIgdmVyaWZ5ID0gb3B0cy52ZXJpZnkgfHwgZmFsc2VcblxuICBpZiAodmVyaWZ5ICE9PSBmYWxzZSAmJiB0eXBlb2YgdmVyaWZ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHZlcmlmeSBtdXN0IGJlIGZ1bmN0aW9uJylcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBjaGVja2luZyBmdW5jdGlvblxuICB2YXIgc2hvdWxkUGFyc2UgPSB0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJ1xuICAgID8gdHlwZUNoZWNrZXIodHlwZSlcbiAgICA6IHR5cGVcblxuICBmdW5jdGlvbiBwYXJzZSAoYm9keSkge1xuICAgIGlmIChib2R5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gc3BlY2lhbC1jYXNlIGVtcHR5IGpzb24gYm9keSwgYXMgaXQncyBhIGNvbW1vbiBjbGllbnQtc2lkZSBtaXN0YWtlXG4gICAgICAvLyBUT0RPOiBtYXliZSBtYWtlIHRoaXMgY29uZmlndXJhYmxlIG9yIHBhcnQgb2YgXCJzdHJpY3RcIiBvcHRpb25cbiAgICAgIHJldHVybiB7fVxuICAgIH1cblxuICAgIGlmIChzdHJpY3QpIHtcbiAgICAgIHZhciBmaXJzdCA9IGZpcnN0Y2hhcihib2R5KVxuXG4gICAgICBpZiAoZmlyc3QgIT09ICd7JyAmJiBmaXJzdCAhPT0gJ1snKSB7XG4gICAgICAgIGRlYnVnKCdzdHJpY3QgdmlvbGF0aW9uJylcbiAgICAgICAgdGhyb3cgY3JlYXRlU3RyaWN0U3ludGF4RXJyb3IoYm9keSwgZmlyc3QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGRlYnVnKCdwYXJzZSBqc29uJylcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGJvZHksIHJldml2ZXIpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbm9ybWFsaXplSnNvblN5bnRheEVycm9yKGUsIHtcbiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICBzdGFjazogZS5zdGFja1xuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24ganNvblBhcnNlciAocmVxLCByZXMsIG5leHQpIHtcbiAgICBpZiAocmVxLl9ib2R5KSB7XG4gICAgICBkZWJ1ZygnYm9keSBhbHJlYWR5IHBhcnNlZCcpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcS5ib2R5ID0gcmVxLmJvZHkgfHwge31cblxuICAgIC8vIHNraXAgcmVxdWVzdHMgd2l0aG91dCBib2RpZXNcbiAgICBpZiAoIXR5cGVpcy5oYXNCb2R5KHJlcSkpIHtcbiAgICAgIGRlYnVnKCdza2lwIGVtcHR5IGJvZHknKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkZWJ1ZygnY29udGVudC10eXBlICVqJywgcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKVxuXG4gICAgLy8gZGV0ZXJtaW5lIGlmIHJlcXVlc3Qgc2hvdWxkIGJlIHBhcnNlZFxuICAgIGlmICghc2hvdWxkUGFyc2UocmVxKSkge1xuICAgICAgZGVidWcoJ3NraXAgcGFyc2luZycpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGFzc2VydCBjaGFyc2V0IHBlciBSRkMgNzE1OSBzZWMgOC4xXG4gICAgdmFyIGNoYXJzZXQgPSBnZXRDaGFyc2V0KHJlcSkgfHwgJ3V0Zi04J1xuICAgIGlmIChjaGFyc2V0LnNsaWNlKDAsIDQpICE9PSAndXRmLScpIHtcbiAgICAgIGRlYnVnKCdpbnZhbGlkIGNoYXJzZXQnKVxuICAgICAgbmV4dChjcmVhdGVFcnJvcig0MTUsICd1bnN1cHBvcnRlZCBjaGFyc2V0IFwiJyArIGNoYXJzZXQudG9VcHBlckNhc2UoKSArICdcIicsIHtcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgdHlwZTogJ2NoYXJzZXQudW5zdXBwb3J0ZWQnXG4gICAgICB9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHJlYWRcbiAgICByZWFkKHJlcSwgcmVzLCBuZXh0LCBwYXJzZSwgZGVidWcsIHtcbiAgICAgIGVuY29kaW5nOiBjaGFyc2V0LFxuICAgICAgaW5mbGF0ZTogaW5mbGF0ZSxcbiAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgIHZlcmlmeTogdmVyaWZ5XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBzdHJpY3QgdmlvbGF0aW9uIHN5bnRheCBlcnJvciBtYXRjaGluZyBuYXRpdmUgZXJyb3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJcbiAqIEByZXR1cm4ge0Vycm9yfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdHJpY3RTeW50YXhFcnJvciAoc3RyLCBjaGFyKSB7XG4gIHZhciBpbmRleCA9IHN0ci5pbmRleE9mKGNoYXIpXG4gIHZhciBwYXJ0aWFsID0gaW5kZXggIT09IC0xXG4gICAgPyBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSArICcjJ1xuICAgIDogJydcblxuICB0cnkge1xuICAgIEpTT04ucGFyc2UocGFydGlhbCk7IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIHRocm93IG5ldyBTeW50YXhFcnJvcignc3RyaWN0IHZpb2xhdGlvbicpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplSnNvblN5bnRheEVycm9yKGUsIHtcbiAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZS5yZXBsYWNlKCcjJywgY2hhciksXG4gICAgICBzdGFjazogZS5zdGFja1xuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZmlyc3RjaGFyIChzdHIpIHtcbiAgdmFyIG1hdGNoID0gRklSU1RfQ0hBUl9SRUdFWFAuZXhlYyhzdHIpXG5cbiAgcmV0dXJuIG1hdGNoXG4gICAgPyBtYXRjaFsxXVxuICAgIDogdW5kZWZpbmVkXG59XG5cbi8qKlxuICogR2V0IHRoZSBjaGFyc2V0IG9mIGEgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRDaGFyc2V0IChyZXEpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGNvbnRlbnRUeXBlLnBhcnNlKHJlcSkucGFyYW1ldGVycy5jaGFyc2V0IHx8ICcnKS50b0xvd2VyQ2FzZSgpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYSBTeW50YXhFcnJvciBmb3IgSlNPTi5wYXJzZS5cbiAqXG4gKiBAcGFyYW0ge1N5bnRheEVycm9yfSBlcnJvclxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHJldHVybiB7U3ludGF4RXJyb3J9XG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplSnNvblN5bnRheEVycm9yIChlcnJvciwgb2JqKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXJyb3IpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV1cbiAgICBpZiAoa2V5ICE9PSAnc3RhY2snICYmIGtleSAhPT0gJ21lc3NhZ2UnKSB7XG4gICAgICBkZWxldGUgZXJyb3Jba2V5XVxuICAgIH1cbiAgfVxuXG4gIC8vIHJlcGxhY2Ugc3RhY2sgYmVmb3JlIG1lc3NhZ2UgZm9yIE5vZGUuanMgMC4xMCBhbmQgYmVsb3dcbiAgZXJyb3Iuc3RhY2sgPSBvYmouc3RhY2sucmVwbGFjZShlcnJvci5tZXNzYWdlLCBvYmoubWVzc2FnZSlcbiAgZXJyb3IubWVzc2FnZSA9IG9iai5tZXNzYWdlXG5cbiAgcmV0dXJuIGVycm9yXG59XG5cbi8qKlxuICogR2V0IHRoZSBzaW1wbGUgdHlwZSBjaGVja2VyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqL1xuXG5mdW5jdGlvbiB0eXBlQ2hlY2tlciAodHlwZSkge1xuICByZXR1cm4gZnVuY3Rpb24gY2hlY2tUeXBlIChyZXEpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0eXBlaXMocmVxLCB0eXBlKSlcbiAgfVxufVxuIiwgIi8qIVxuICogYm9keS1wYXJzZXJcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGJ5dGVzID0gcmVxdWlyZSgnYnl0ZXMnKVxudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYm9keS1wYXJzZXI6cmF3JylcbnZhciByZWFkID0gcmVxdWlyZSgnLi4vcmVhZCcpXG52YXIgdHlwZWlzID0gcmVxdWlyZSgndHlwZS1pcycpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByYXdcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIHJhdyBib2RpZXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJhdyAob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge31cblxuICB2YXIgaW5mbGF0ZSA9IG9wdHMuaW5mbGF0ZSAhPT0gZmFsc2VcbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgIT09ICdudW1iZXInXG4gICAgPyBieXRlcy5wYXJzZShvcHRzLmxpbWl0IHx8ICcxMDBrYicpXG4gICAgOiBvcHRzLmxpbWl0XG4gIHZhciB0eXBlID0gb3B0cy50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gIHZhciB2ZXJpZnkgPSBvcHRzLnZlcmlmeSB8fCBmYWxzZVxuXG4gIGlmICh2ZXJpZnkgIT09IGZhbHNlICYmIHR5cGVvZiB2ZXJpZnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gdmVyaWZ5IG11c3QgYmUgZnVuY3Rpb24nKVxuICB9XG5cbiAgLy8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9uXG4gIHZhciBzaG91bGRQYXJzZSA9IHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nXG4gICAgPyB0eXBlQ2hlY2tlcih0eXBlKVxuICAgIDogdHlwZVxuXG4gIGZ1bmN0aW9uIHBhcnNlIChidWYpIHtcbiAgICByZXR1cm4gYnVmXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcmF3UGFyc2VyIChyZXEsIHJlcywgbmV4dCkge1xuICAgIGlmIChyZXEuX2JvZHkpIHtcbiAgICAgIGRlYnVnKCdib2R5IGFscmVhZHkgcGFyc2VkJylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVxLmJvZHkgPSByZXEuYm9keSB8fCB7fVxuXG4gICAgLy8gc2tpcCByZXF1ZXN0cyB3aXRob3V0IGJvZGllc1xuICAgIGlmICghdHlwZWlzLmhhc0JvZHkocmVxKSkge1xuICAgICAgZGVidWcoJ3NraXAgZW1wdHkgYm9keScpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGRlYnVnKCdjb250ZW50LXR5cGUgJWonLCByZXEuaGVhZGVyc1snY29udGVudC10eXBlJ10pXG5cbiAgICAvLyBkZXRlcm1pbmUgaWYgcmVxdWVzdCBzaG91bGQgYmUgcGFyc2VkXG4gICAgaWYgKCFzaG91bGRQYXJzZShyZXEpKSB7XG4gICAgICBkZWJ1Zygnc2tpcCBwYXJzaW5nJylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gcmVhZFxuICAgIHJlYWQocmVxLCByZXMsIG5leHQsIHBhcnNlLCBkZWJ1Zywge1xuICAgICAgZW5jb2Rpbmc6IG51bGwsXG4gICAgICBpbmZsYXRlOiBpbmZsYXRlLFxuICAgICAgbGltaXQ6IGxpbWl0LFxuICAgICAgdmVyaWZ5OiB2ZXJpZnlcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzaW1wbGUgdHlwZSBjaGVja2VyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqL1xuXG5mdW5jdGlvbiB0eXBlQ2hlY2tlciAodHlwZSkge1xuICByZXR1cm4gZnVuY3Rpb24gY2hlY2tUeXBlIChyZXEpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0eXBlaXMocmVxLCB0eXBlKSlcbiAgfVxufVxuIiwgIi8qIVxuICogYm9keS1wYXJzZXJcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGJ5dGVzID0gcmVxdWlyZSgnYnl0ZXMnKVxudmFyIGNvbnRlbnRUeXBlID0gcmVxdWlyZSgnY29udGVudC10eXBlJylcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2JvZHktcGFyc2VyOnRleHQnKVxudmFyIHJlYWQgPSByZXF1aXJlKCcuLi9yZWFkJylcbnZhciB0eXBlaXMgPSByZXF1aXJlKCd0eXBlLWlzJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRleHRcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIHRleHQgYm9kaWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB0ZXh0IChvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fVxuXG4gIHZhciBkZWZhdWx0Q2hhcnNldCA9IG9wdHMuZGVmYXVsdENoYXJzZXQgfHwgJ3V0Zi04J1xuICB2YXIgaW5mbGF0ZSA9IG9wdHMuaW5mbGF0ZSAhPT0gZmFsc2VcbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgIT09ICdudW1iZXInXG4gICAgPyBieXRlcy5wYXJzZShvcHRzLmxpbWl0IHx8ICcxMDBrYicpXG4gICAgOiBvcHRzLmxpbWl0XG4gIHZhciB0eXBlID0gb3B0cy50eXBlIHx8ICd0ZXh0L3BsYWluJ1xuICB2YXIgdmVyaWZ5ID0gb3B0cy52ZXJpZnkgfHwgZmFsc2VcblxuICBpZiAodmVyaWZ5ICE9PSBmYWxzZSAmJiB0eXBlb2YgdmVyaWZ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHZlcmlmeSBtdXN0IGJlIGZ1bmN0aW9uJylcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBjaGVja2luZyBmdW5jdGlvblxuICB2YXIgc2hvdWxkUGFyc2UgPSB0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJ1xuICAgID8gdHlwZUNoZWNrZXIodHlwZSlcbiAgICA6IHR5cGVcblxuICBmdW5jdGlvbiBwYXJzZSAoYnVmKSB7XG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHRleHRQYXJzZXIgKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgaWYgKHJlcS5fYm9keSkge1xuICAgICAgZGVidWcoJ2JvZHkgYWxyZWFkeSBwYXJzZWQnKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXEuYm9keSA9IHJlcS5ib2R5IHx8IHt9XG5cbiAgICAvLyBza2lwIHJlcXVlc3RzIHdpdGhvdXQgYm9kaWVzXG4gICAgaWYgKCF0eXBlaXMuaGFzQm9keShyZXEpKSB7XG4gICAgICBkZWJ1Zygnc2tpcCBlbXB0eSBib2R5JylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbnRlbnQtdHlwZSAlaicsIHJlcS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSlcblxuICAgIC8vIGRldGVybWluZSBpZiByZXF1ZXN0IHNob3VsZCBiZSBwYXJzZWRcbiAgICBpZiAoIXNob3VsZFBhcnNlKHJlcSkpIHtcbiAgICAgIGRlYnVnKCdza2lwIHBhcnNpbmcnKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgY2hhcnNldFxuICAgIHZhciBjaGFyc2V0ID0gZ2V0Q2hhcnNldChyZXEpIHx8IGRlZmF1bHRDaGFyc2V0XG5cbiAgICAvLyByZWFkXG4gICAgcmVhZChyZXEsIHJlcywgbmV4dCwgcGFyc2UsIGRlYnVnLCB7XG4gICAgICBlbmNvZGluZzogY2hhcnNldCxcbiAgICAgIGluZmxhdGU6IGluZmxhdGUsXG4gICAgICBsaW1pdDogbGltaXQsXG4gICAgICB2ZXJpZnk6IHZlcmlmeVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNoYXJzZXQgb2YgYSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldENoYXJzZXQgKHJlcSkge1xuICB0cnkge1xuICAgIHJldHVybiAoY29udGVudFR5cGUucGFyc2UocmVxKS5wYXJhbWV0ZXJzLmNoYXJzZXQgfHwgJycpLnRvTG93ZXJDYXNlKClcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgc2ltcGxlIHR5cGUgY2hlY2tlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKi9cblxuZnVuY3Rpb24gdHlwZUNoZWNrZXIgKHR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNoZWNrVHlwZSAocmVxKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odHlwZWlzKHJlcSwgdHlwZSkpXG4gIH1cbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qIGVzbGludCBjb21wbGV4aXR5OiBbMiwgMThdLCBtYXgtc3RhdGVtZW50czogWzIsIDMzXSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBoYXNTeW1ib2xzKCkge1xuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09ICdzeW1ib2wnKSB7IHJldHVybiB0cnVlOyB9XG5cblx0dmFyIG9iaiA9IHt9O1xuXHR2YXIgc3ltID0gU3ltYm9sKCd0ZXN0Jyk7XG5cdHZhciBzeW1PYmogPSBPYmplY3Qoc3ltKTtcblx0aWYgKHR5cGVvZiBzeW0gPT09ICdzdHJpbmcnKSB7IHJldHVybiBmYWxzZTsgfVxuXG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3ltT2JqKSAhPT0gJ1tvYmplY3QgU3ltYm9sXScpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0Ly8gdGVtcCBkaXNhYmxlZCBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9vYmplY3QuYXNzaWduL2lzc3Vlcy8xN1xuXHQvLyBpZiAoc3ltIGluc3RhbmNlb2YgU3ltYm9sKSB7IHJldHVybiBmYWxzZTsgfVxuXHQvLyB0ZW1wIGRpc2FibGVkIHBlciBodHRwczovL2dpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi9nZXQtb3duLXByb3BlcnR5LXN5bWJvbHMvaXNzdWVzLzRcblx0Ly8gaWYgKCEoc3ltT2JqIGluc3RhbmNlb2YgU3ltYm9sKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHQvLyBpZiAodHlwZW9mIFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdC8vIGlmIChTdHJpbmcoc3ltKSAhPT0gU3ltYm9sLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0dmFyIHN5bVZhbCA9IDQyO1xuXHRvYmpbc3ltXSA9IHN5bVZhbDtcblx0Zm9yIChzeW0gaW4gb2JqKSB7IHJldHVybiBmYWxzZTsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby11bnJlYWNoYWJsZS1sb29wXG5cdGlmICh0eXBlb2YgT2JqZWN0LmtleXMgPT09ICdmdW5jdGlvbicgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggIT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyA9PT0gJ2Z1bmN0aW9uJyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmxlbmd0aCAhPT0gMCkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHR2YXIgc3ltcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKTtcblx0aWYgKHN5bXMubGVuZ3RoICE9PSAxIHx8IHN5bXNbMF0gIT09IHN5bSkgeyByZXR1cm4gZmFsc2U7IH1cblxuXHRpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmosIHN5bSkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0aWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0dmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKTtcblx0XHRpZiAoZGVzY3JpcHRvci52YWx1ZSAhPT0gc3ltVmFsIHx8IGRlc2NyaXB0b3IuZW51bWVyYWJsZSAhPT0gdHJ1ZSkgeyByZXR1cm4gZmFsc2U7IH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBvcmlnU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sO1xudmFyIGhhc1N5bWJvbFNoYW0gPSByZXF1aXJlKCcuL3NoYW1zJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzTmF0aXZlU3ltYm9scygpIHtcblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sICE9PSAnZnVuY3Rpb24nKSB7IHJldHVybiBmYWxzZTsgfVxuXHRpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ2Z1bmN0aW9uJykgeyByZXR1cm4gZmFsc2U7IH1cblx0aWYgKHR5cGVvZiBvcmlnU3ltYm9sKCdmb28nKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cdGlmICh0eXBlb2YgU3ltYm9sKCdiYXInKSAhPT0gJ3N5bWJvbCcpIHsgcmV0dXJuIGZhbHNlOyB9XG5cblx0cmV0dXJuIGhhc1N5bWJvbFNoYW0oKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdGVzdCA9IHtcblx0Zm9vOiB7fVxufTtcblxudmFyICRPYmplY3QgPSBPYmplY3Q7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaGFzUHJvdG8oKSB7XG5cdHJldHVybiB7IF9fcHJvdG9fXzogdGVzdCB9LmZvbyA9PT0gdGVzdC5mb28gJiYgISh7IF9fcHJvdG9fXzogbnVsbCB9IGluc3RhbmNlb2YgJE9iamVjdCk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuLyogZXNsaW50IG5vLWludmFsaWQtdGhpczogMSAqL1xuXG52YXIgRVJST1JfTUVTU0FHRSA9ICdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICc7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xudmFyIGZ1bmNUeXBlID0gJ1tvYmplY3QgRnVuY3Rpb25dJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBiaW5kKHRoYXQpIHtcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcztcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKHRhcmdldCkgIT09IGZ1bmNUeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRVJST1JfTUVTU0FHRSArIHRhcmdldCk7XG4gICAgfVxuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gICAgdmFyIGJvdW5kO1xuICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgYm91bmQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0YXJnZXQuYXBwbHkoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKE9iamVjdChyZXN1bHQpID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmFwcGx5KFxuICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgYXJncy5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgYm91bmRMZW5ndGggPSBNYXRoLm1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuICAgIHZhciBib3VuZEFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYm91bmRBcmdzLnB1c2goJyQnICsgaSk7XG4gICAgfVxuXG4gICAgYm91bmQgPSBGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGJvdW5kQXJncy5qb2luKCcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0nKShiaW5kZXIpO1xuXG4gICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgdmFyIEVtcHR5ID0gZnVuY3Rpb24gRW1wdHkoKSB7fTtcbiAgICAgICAgRW1wdHkucHJvdG90eXBlID0gdGFyZ2V0LnByb3RvdHlwZTtcbiAgICAgICAgYm91bmQucHJvdG90eXBlID0gbmV3IEVtcHR5KCk7XG4gICAgICAgIEVtcHR5LnByb3RvdHlwZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBpbXBsZW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vaW1wbGVtZW50YXRpb24nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB8fCBpbXBsZW1lbnRhdGlvbjtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnZnVuY3Rpb24tYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciB1bmRlZmluZWQ7XG5cbnZhciAkU3ludGF4RXJyb3IgPSBTeW50YXhFcnJvcjtcbnZhciAkRnVuY3Rpb24gPSBGdW5jdGlvbjtcbnZhciAkVHlwZUVycm9yID0gVHlwZUVycm9yO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbnZhciBnZXRFdmFsbGVkQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoZXhwcmVzc2lvblN5bnRheCkge1xuXHR0cnkge1xuXHRcdHJldHVybiAkRnVuY3Rpb24oJ1widXNlIHN0cmljdFwiOyByZXR1cm4gKCcgKyBleHByZXNzaW9uU3ludGF4ICsgJykuY29uc3RydWN0b3I7JykoKTtcblx0fSBjYXRjaCAoZSkge31cbn07XG5cbnZhciAkZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5pZiAoJGdPUEQpIHtcblx0dHJ5IHtcblx0XHQkZ09QRCh7fSwgJycpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0JGdPUEQgPSBudWxsOyAvLyB0aGlzIGlzIElFIDgsIHdoaWNoIGhhcyBhIGJyb2tlbiBnT1BEXG5cdH1cbn1cblxudmFyIHRocm93VHlwZUVycm9yID0gZnVuY3Rpb24gKCkge1xuXHR0aHJvdyBuZXcgJFR5cGVFcnJvcigpO1xufTtcbnZhciBUaHJvd1R5cGVFcnJvciA9ICRnT1BEXG5cdD8gKGZ1bmN0aW9uICgpIHtcblx0XHR0cnkge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9ucywgbm8tY2FsbGVyLCBuby1yZXN0cmljdGVkLXByb3BlcnRpZXNcblx0XHRcdGFyZ3VtZW50cy5jYWxsZWU7IC8vIElFIDggZG9lcyBub3QgdGhyb3cgaGVyZVxuXHRcdFx0cmV0dXJuIHRocm93VHlwZUVycm9yO1xuXHRcdH0gY2F0Y2ggKGNhbGxlZVRocm93cykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Ly8gSUUgOCB0aHJvd3Mgb24gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcmd1bWVudHMsICcnKVxuXHRcdFx0XHRyZXR1cm4gJGdPUEQoYXJndW1lbnRzLCAnY2FsbGVlJykuZ2V0O1xuXHRcdFx0fSBjYXRjaCAoZ09QRHRocm93cykge1xuXHRcdFx0XHRyZXR1cm4gdGhyb3dUeXBlRXJyb3I7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KCkpXG5cdDogdGhyb3dUeXBlRXJyb3I7XG5cbnZhciBoYXNTeW1ib2xzID0gcmVxdWlyZSgnaGFzLXN5bWJvbHMnKSgpO1xudmFyIGhhc1Byb3RvID0gcmVxdWlyZSgnaGFzLXByb3RvJykoKTtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IChcblx0aGFzUHJvdG9cblx0XHQ/IGZ1bmN0aW9uICh4KSB7IHJldHVybiB4Ll9fcHJvdG9fXzsgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvXG5cdFx0OiBudWxsXG4pO1xuXG52YXIgbmVlZHNFdmFsID0ge307XG5cbnZhciBUeXBlZEFycmF5ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKFVpbnQ4QXJyYXkpO1xuXG52YXIgSU5UUklOU0lDUyA9IHtcblx0JyVBZ2dyZWdhdGVFcnJvciUnOiB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogQWdncmVnYXRlRXJyb3IsXG5cdCclQXJyYXklJzogQXJyYXksXG5cdCclQXJyYXlCdWZmZXIlJzogdHlwZW9mIEFycmF5QnVmZmVyID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEFycmF5QnVmZmVyLFxuXHQnJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkgOiB1bmRlZmluZWQsXG5cdCclQXN5bmNGcm9tU3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IHVuZGVmaW5lZCxcblx0JyVBc3luY0Z1bmN0aW9uJSc6IG5lZWRzRXZhbCxcblx0JyVBc3luY0dlbmVyYXRvciUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiBuZWVkc0V2YWwsXG5cdCclQXRvbWljcyUnOiB0eXBlb2YgQXRvbWljcyA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBBdG9taWNzLFxuXHQnJUJpZ0ludCUnOiB0eXBlb2YgQmlnSW50ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludCxcblx0JyVCaWdJbnQ2NEFycmF5JSc6IHR5cGVvZiBCaWdJbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ0ludDY0QXJyYXksXG5cdCclQmlnVWludDY0QXJyYXklJzogdHlwZW9mIEJpZ1VpbnQ2NEFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEJpZ1VpbnQ2NEFycmF5LFxuXHQnJUJvb2xlYW4lJzogQm9vbGVhbixcblx0JyVEYXRhVmlldyUnOiB0eXBlb2YgRGF0YVZpZXcgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogRGF0YVZpZXcsXG5cdCclRGF0ZSUnOiBEYXRlLFxuXHQnJWRlY29kZVVSSSUnOiBkZWNvZGVVUkksXG5cdCclZGVjb2RlVVJJQ29tcG9uZW50JSc6IGRlY29kZVVSSUNvbXBvbmVudCxcblx0JyVlbmNvZGVVUkklJzogZW5jb2RlVVJJLFxuXHQnJWVuY29kZVVSSUNvbXBvbmVudCUnOiBlbmNvZGVVUklDb21wb25lbnQsXG5cdCclRXJyb3IlJzogRXJyb3IsXG5cdCclZXZhbCUnOiBldmFsLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV2YWxcblx0JyVFdmFsRXJyb3IlJzogRXZhbEVycm9yLFxuXHQnJUZsb2F0MzJBcnJheSUnOiB0eXBlb2YgRmxvYXQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZsb2F0MzJBcnJheSxcblx0JyVGbG9hdDY0QXJyYXklJzogdHlwZW9mIEZsb2F0NjRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBGbG9hdDY0QXJyYXksXG5cdCclRmluYWxpemF0aW9uUmVnaXN0cnklJzogdHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuXHQnJUZ1bmN0aW9uJSc6ICRGdW5jdGlvbixcblx0JyVHZW5lcmF0b3JGdW5jdGlvbiUnOiBuZWVkc0V2YWwsXG5cdCclSW50OEFycmF5JSc6IHR5cGVvZiBJbnQ4QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50OEFycmF5LFxuXHQnJUludDE2QXJyYXklJzogdHlwZW9mIEludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogSW50MTZBcnJheSxcblx0JyVJbnQzMkFycmF5JSc6IHR5cGVvZiBJbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IEludDMyQXJyYXksXG5cdCclaXNGaW5pdGUlJzogaXNGaW5pdGUsXG5cdCclaXNOYU4lJzogaXNOYU4sXG5cdCclSXRlcmF0b3JQcm90b3R5cGUlJzogaGFzU3ltYm9scyAmJiBnZXRQcm90byA/IGdldFByb3RvKGdldFByb3RvKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSkpIDogdW5kZWZpbmVkLFxuXHQnJUpTT04lJzogdHlwZW9mIEpTT04gPT09ICdvYmplY3QnID8gSlNPTiA6IHVuZGVmaW5lZCxcblx0JyVNYXAlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBNYXAsXG5cdCclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogdHlwZW9mIE1hcCA9PT0gJ3VuZGVmaW5lZCcgfHwgIWhhc1N5bWJvbHMgfHwgIWdldFByb3RvID8gdW5kZWZpbmVkIDogZ2V0UHJvdG8obmV3IE1hcCgpW1N5bWJvbC5pdGVyYXRvcl0oKSksXG5cdCclTWF0aCUnOiBNYXRoLFxuXHQnJU51bWJlciUnOiBOdW1iZXIsXG5cdCclT2JqZWN0JSc6IE9iamVjdCxcblx0JyVwYXJzZUZsb2F0JSc6IHBhcnNlRmxvYXQsXG5cdCclcGFyc2VJbnQlJzogcGFyc2VJbnQsXG5cdCclUHJvbWlzZSUnOiB0eXBlb2YgUHJvbWlzZSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm9taXNlLFxuXHQnJVByb3h5JSc6IHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBQcm94eSxcblx0JyVSYW5nZUVycm9yJSc6IFJhbmdlRXJyb3IsXG5cdCclUmVmZXJlbmNlRXJyb3IlJzogUmVmZXJlbmNlRXJyb3IsXG5cdCclUmVmbGVjdCUnOiB0eXBlb2YgUmVmbGVjdCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBSZWZsZWN0LFxuXHQnJVJlZ0V4cCUnOiBSZWdFeHAsXG5cdCclU2V0JSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogU2V0LFxuXHQnJVNldEl0ZXJhdG9yUHJvdG90eXBlJSc6IHR5cGVvZiBTZXQgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNTeW1ib2xzIHx8ICFnZXRQcm90byA/IHVuZGVmaW5lZCA6IGdldFByb3RvKG5ldyBTZXQoKVtTeW1ib2wuaXRlcmF0b3JdKCkpLFxuXHQnJVNoYXJlZEFycmF5QnVmZmVyJSc6IHR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlciA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBTaGFyZWRBcnJheUJ1ZmZlcixcblx0JyVTdHJpbmclJzogU3RyaW5nLFxuXHQnJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJSc6IGhhc1N5bWJvbHMgJiYgZ2V0UHJvdG8gPyBnZXRQcm90bygnJ1tTeW1ib2wuaXRlcmF0b3JdKCkpIDogdW5kZWZpbmVkLFxuXHQnJVN5bWJvbCUnOiBoYXNTeW1ib2xzID8gU3ltYm9sIDogdW5kZWZpbmVkLFxuXHQnJVN5bnRheEVycm9yJSc6ICRTeW50YXhFcnJvcixcblx0JyVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcblx0JyVUeXBlZEFycmF5JSc6IFR5cGVkQXJyYXksXG5cdCclVHlwZUVycm9yJSc6ICRUeXBlRXJyb3IsXG5cdCclVWludDhBcnJheSUnOiB0eXBlb2YgVWludDhBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OEFycmF5LFxuXHQnJVVpbnQ4Q2xhbXBlZEFycmF5JSc6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBVaW50OENsYW1wZWRBcnJheSxcblx0JyVVaW50MTZBcnJheSUnOiB0eXBlb2YgVWludDE2QXJyYXkgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogVWludDE2QXJyYXksXG5cdCclVWludDMyQXJyYXklJzogdHlwZW9mIFVpbnQzMkFycmF5ID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFVpbnQzMkFycmF5LFxuXHQnJVVSSUVycm9yJSc6IFVSSUVycm9yLFxuXHQnJVdlYWtNYXAlJzogdHlwZW9mIFdlYWtNYXAgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogV2Vha01hcCxcblx0JyVXZWFrUmVmJSc6IHR5cGVvZiBXZWFrUmVmID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IFdlYWtSZWYsXG5cdCclV2Vha1NldCUnOiB0eXBlb2YgV2Vha1NldCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBXZWFrU2V0XG59O1xuXG5pZiAoZ2V0UHJvdG8pIHtcblx0dHJ5IHtcblx0XHRudWxsLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc2hhZG93cmVhbG0vcHVsbC8zODQjaXNzdWVjb21tZW50LTEzNjQyNjQyMjlcblx0XHR2YXIgZXJyb3JQcm90byA9IGdldFByb3RvKGdldFByb3RvKGUpKTtcblx0XHRJTlRSSU5TSUNTWyclRXJyb3IucHJvdG90eXBlJSddID0gZXJyb3JQcm90bztcblx0fVxufVxuXG52YXIgZG9FdmFsID0gZnVuY3Rpb24gZG9FdmFsKG5hbWUpIHtcblx0dmFyIHZhbHVlO1xuXHRpZiAobmFtZSA9PT0gJyVBc3luY0Z1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24gKCkge30nKTtcblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUdlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJScpIHtcblx0XHR2YWx1ZSA9IGdldEV2YWxsZWRDb25zdHJ1Y3RvcignYXN5bmMgZnVuY3Rpb24qICgpIHt9Jyk7XG5cdH0gZWxzZSBpZiAobmFtZSA9PT0gJyVBc3luY0dlbmVyYXRvciUnKSB7XG5cdFx0dmFyIGZuID0gZG9FdmFsKCclQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnKTtcblx0XHRpZiAoZm4pIHtcblx0XHRcdHZhbHVlID0gZm4ucHJvdG90eXBlO1xuXHRcdH1cblx0fSBlbHNlIGlmIChuYW1lID09PSAnJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlJykge1xuXHRcdHZhciBnZW4gPSBkb0V2YWwoJyVBc3luY0dlbmVyYXRvciUnKTtcblx0XHRpZiAoZ2VuICYmIGdldFByb3RvKSB7XG5cdFx0XHR2YWx1ZSA9IGdldFByb3RvKGdlbi5wcm90b3R5cGUpO1xuXHRcdH1cblx0fVxuXG5cdElOVFJJTlNJQ1NbbmFtZV0gPSB2YWx1ZTtcblxuXHRyZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgTEVHQUNZX0FMSUFTRVMgPSB7XG5cdCclQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogWydBcnJheUJ1ZmZlcicsICdwcm90b3R5cGUnXSxcblx0JyVBcnJheVByb3RvdHlwZSUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUFycmF5UHJvdG9fZW50cmllcyUnOiBbJ0FycmF5JywgJ3Byb3RvdHlwZScsICdlbnRyaWVzJ10sXG5cdCclQXJyYXlQcm90b19mb3JFYWNoJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ2ZvckVhY2gnXSxcblx0JyVBcnJheVByb3RvX2tleXMlJzogWydBcnJheScsICdwcm90b3R5cGUnLCAna2V5cyddLFxuXHQnJUFycmF5UHJvdG9fdmFsdWVzJSc6IFsnQXJyYXknLCAncHJvdG90eXBlJywgJ3ZhbHVlcyddLFxuXHQnJUFzeW5jRnVuY3Rpb25Qcm90b3R5cGUlJzogWydBc3luY0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUFzeW5jR2VuZXJhdG9yJSc6IFsnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsICdwcm90b3R5cGUnXSxcblx0JyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0FzeW5jR2VuZXJhdG9yRnVuY3Rpb24nLCAncHJvdG90eXBlJywgJ3Byb3RvdHlwZSddLFxuXHQnJUJvb2xlYW5Qcm90b3R5cGUlJzogWydCb29sZWFuJywgJ3Byb3RvdHlwZSddLFxuXHQnJURhdGFWaWV3UHJvdG90eXBlJSc6IFsnRGF0YVZpZXcnLCAncHJvdG90eXBlJ10sXG5cdCclRGF0ZVByb3RvdHlwZSUnOiBbJ0RhdGUnLCAncHJvdG90eXBlJ10sXG5cdCclRXJyb3JQcm90b3R5cGUlJzogWydFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVFdmFsRXJyb3JQcm90b3R5cGUlJzogWydFdmFsRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IFsnRmxvYXQzMkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiBbJ0Zsb2F0NjRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVGdW5jdGlvblByb3RvdHlwZSUnOiBbJ0Z1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvciUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZSddLFxuXHQnJUdlbmVyYXRvclByb3RvdHlwZSUnOiBbJ0dlbmVyYXRvckZ1bmN0aW9uJywgJ3Byb3RvdHlwZScsICdwcm90b3R5cGUnXSxcblx0JyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogWydJbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ0ludDE2QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSW50MzJBcnJheVByb3RvdHlwZSUnOiBbJ0ludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclSlNPTlBhcnNlJSc6IFsnSlNPTicsICdwYXJzZSddLFxuXHQnJUpTT05TdHJpbmdpZnklJzogWydKU09OJywgJ3N0cmluZ2lmeSddLFxuXHQnJU1hcFByb3RvdHlwZSUnOiBbJ01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVOdW1iZXJQcm90b3R5cGUlJzogWydOdW1iZXInLCAncHJvdG90eXBlJ10sXG5cdCclT2JqZWN0UHJvdG90eXBlJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZSddLFxuXHQnJU9ialByb3RvX3RvU3RyaW5nJSc6IFsnT2JqZWN0JywgJ3Byb3RvdHlwZScsICd0b1N0cmluZyddLFxuXHQnJU9ialByb3RvX3ZhbHVlT2YlJzogWydPYmplY3QnLCAncHJvdG90eXBlJywgJ3ZhbHVlT2YnXSxcblx0JyVQcm9taXNlUHJvdG90eXBlJSc6IFsnUHJvbWlzZScsICdwcm90b3R5cGUnXSxcblx0JyVQcm9taXNlUHJvdG9fdGhlbiUnOiBbJ1Byb21pc2UnLCAncHJvdG90eXBlJywgJ3RoZW4nXSxcblx0JyVQcm9taXNlX2FsbCUnOiBbJ1Byb21pc2UnLCAnYWxsJ10sXG5cdCclUHJvbWlzZV9yZWplY3QlJzogWydQcm9taXNlJywgJ3JlamVjdCddLFxuXHQnJVByb21pc2VfcmVzb2x2ZSUnOiBbJ1Byb21pc2UnLCAncmVzb2x2ZSddLFxuXHQnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogWydSYW5nZUVycm9yJywgJ3Byb3RvdHlwZSddLFxuXHQnJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJSc6IFsnUmVmZXJlbmNlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclUmVnRXhwUHJvdG90eXBlJSc6IFsnUmVnRXhwJywgJ3Byb3RvdHlwZSddLFxuXHQnJVNldFByb3RvdHlwZSUnOiBbJ1NldCcsICdwcm90b3R5cGUnXSxcblx0JyVTaGFyZWRBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiBbJ1NoYXJlZEFycmF5QnVmZmVyJywgJ3Byb3RvdHlwZSddLFxuXHQnJVN0cmluZ1Byb3RvdHlwZSUnOiBbJ1N0cmluZycsICdwcm90b3R5cGUnXSxcblx0JyVTeW1ib2xQcm90b3R5cGUlJzogWydTeW1ib2wnLCAncHJvdG90eXBlJ10sXG5cdCclU3ludGF4RXJyb3JQcm90b3R5cGUlJzogWydTeW50YXhFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IFsnVHlwZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVUeXBlRXJyb3JQcm90b3R5cGUlJzogWydUeXBlRXJyb3InLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQ4QXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVWludDhDbGFtcGVkQXJyYXlQcm90b3R5cGUlJzogWydVaW50OENsYW1wZWRBcnJheScsICdwcm90b3R5cGUnXSxcblx0JyVVaW50MTZBcnJheVByb3RvdHlwZSUnOiBbJ1VpbnQxNkFycmF5JywgJ3Byb3RvdHlwZSddLFxuXHQnJVVpbnQzMkFycmF5UHJvdG90eXBlJSc6IFsnVWludDMyQXJyYXknLCAncHJvdG90eXBlJ10sXG5cdCclVVJJRXJyb3JQcm90b3R5cGUlJzogWydVUklFcnJvcicsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrTWFwUHJvdG90eXBlJSc6IFsnV2Vha01hcCcsICdwcm90b3R5cGUnXSxcblx0JyVXZWFrU2V0UHJvdG90eXBlJSc6IFsnV2Vha1NldCcsICdwcm90b3R5cGUnXVxufTtcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgaGFzT3duID0gcmVxdWlyZSgnaGFzJyk7XG52YXIgJGNvbmNhdCA9IGJpbmQuY2FsbChGdW5jdGlvbi5jYWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KTtcbnZhciAkc3BsaWNlQXBwbHkgPSBiaW5kLmNhbGwoRnVuY3Rpb24uYXBwbHksIEFycmF5LnByb3RvdHlwZS5zcGxpY2UpO1xudmFyICRyZXBsYWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSk7XG52YXIgJHN0clNsaWNlID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFN0cmluZy5wcm90b3R5cGUuc2xpY2UpO1xudmFyICRleGVjID0gYmluZC5jYWxsKEZ1bmN0aW9uLmNhbGwsIFJlZ0V4cC5wcm90b3R5cGUuZXhlYyk7XG5cbi8qIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iLzQuMTcuMTUvZGlzdC9sb2Rhc2guanMjTDY3MzUtTDY3NDQgKi9cbnZhciByZVByb3BOYW1lID0gL1teJS5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwlJCkpL2c7XG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7IC8qKiBVc2VkIHRvIG1hdGNoIGJhY2tzbGFzaGVzIGluIHByb3BlcnR5IHBhdGhzLiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IGZ1bmN0aW9uIHN0cmluZ1RvUGF0aChzdHJpbmcpIHtcblx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHN0cmluZywgMCwgMSk7XG5cdHZhciBsYXN0ID0gJHN0clNsaWNlKHN0cmluZywgLTEpO1xuXHRpZiAoZmlyc3QgPT09ICclJyAmJiBsYXN0ICE9PSAnJScpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIGNsb3NpbmcgYCVgJyk7XG5cdH0gZWxzZSBpZiAobGFzdCA9PT0gJyUnICYmIGZpcnN0ICE9PSAnJScpIHtcblx0XHR0aHJvdyBuZXcgJFN5bnRheEVycm9yKCdpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIG9wZW5pbmcgYCVgJyk7XG5cdH1cblx0dmFyIHJlc3VsdCA9IFtdO1xuXHQkcmVwbGFjZShzdHJpbmcsIHJlUHJvcE5hbWUsIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7XG5cdFx0cmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gcXVvdGUgPyAkcmVwbGFjZShzdWJTdHJpbmcsIHJlRXNjYXBlQ2hhciwgJyQxJykgOiBudW1iZXIgfHwgbWF0Y2g7XG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0O1xufTtcbi8qIGVuZCBhZGFwdGF0aW9uICovXG5cbnZhciBnZXRCYXNlSW50cmluc2ljID0gZnVuY3Rpb24gZ2V0QmFzZUludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0dmFyIGludHJpbnNpY05hbWUgPSBuYW1lO1xuXHR2YXIgYWxpYXM7XG5cdGlmIChoYXNPd24oTEVHQUNZX0FMSUFTRVMsIGludHJpbnNpY05hbWUpKSB7XG5cdFx0YWxpYXMgPSBMRUdBQ1lfQUxJQVNFU1tpbnRyaW5zaWNOYW1lXTtcblx0XHRpbnRyaW5zaWNOYW1lID0gJyUnICsgYWxpYXNbMF0gKyAnJSc7XG5cdH1cblxuXHRpZiAoaGFzT3duKElOVFJJTlNJQ1MsIGludHJpbnNpY05hbWUpKSB7XG5cdFx0dmFyIHZhbHVlID0gSU5UUklOU0lDU1tpbnRyaW5zaWNOYW1lXTtcblx0XHRpZiAodmFsdWUgPT09IG5lZWRzRXZhbCkge1xuXHRcdFx0dmFsdWUgPSBkb0V2YWwoaW50cmluc2ljTmFtZSk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnICYmICFhbGxvd01pc3NpbmcpIHtcblx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgJyArIG5hbWUgKyAnIGV4aXN0cywgYnV0IGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIScpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRhbGlhczogYWxpYXMsXG5cdFx0XHRuYW1lOiBpbnRyaW5zaWNOYW1lLFxuXHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0fTtcblx0fVxuXG5cdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ2ludHJpbnNpYyAnICsgbmFtZSArICcgZG9lcyBub3QgZXhpc3QhJyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEdldEludHJpbnNpYyhuYW1lLCBhbGxvd01pc3NpbmcpIHtcblx0aWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCBuYW1lLmxlbmd0aCA9PT0gMCkge1xuXHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdpbnRyaW5zaWMgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuXHR9XG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB0eXBlb2YgYWxsb3dNaXNzaW5nICE9PSAnYm9vbGVhbicpIHtcblx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignXCJhbGxvd01pc3NpbmdcIiBhcmd1bWVudCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuXHR9XG5cblx0aWYgKCRleGVjKC9eJT9bXiVdKiU/JC8sIG5hbWUpID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3ICRTeW50YXhFcnJvcignYCVgIG1heSBub3QgYmUgcHJlc2VudCBhbnl3aGVyZSBidXQgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBpbnRyaW5zaWMgbmFtZScpO1xuXHR9XG5cdHZhciBwYXJ0cyA9IHN0cmluZ1RvUGF0aChuYW1lKTtcblx0dmFyIGludHJpbnNpY0Jhc2VOYW1lID0gcGFydHMubGVuZ3RoID4gMCA/IHBhcnRzWzBdIDogJyc7XG5cblx0dmFyIGludHJpbnNpYyA9IGdldEJhc2VJbnRyaW5zaWMoJyUnICsgaW50cmluc2ljQmFzZU5hbWUgKyAnJScsIGFsbG93TWlzc2luZyk7XG5cdHZhciBpbnRyaW5zaWNSZWFsTmFtZSA9IGludHJpbnNpYy5uYW1lO1xuXHR2YXIgdmFsdWUgPSBpbnRyaW5zaWMudmFsdWU7XG5cdHZhciBza2lwRnVydGhlckNhY2hpbmcgPSBmYWxzZTtcblxuXHR2YXIgYWxpYXMgPSBpbnRyaW5zaWMuYWxpYXM7XG5cdGlmIChhbGlhcykge1xuXHRcdGludHJpbnNpY0Jhc2VOYW1lID0gYWxpYXNbMF07XG5cdFx0JHNwbGljZUFwcGx5KHBhcnRzLCAkY29uY2F0KFswLCAxXSwgYWxpYXMpKTtcblx0fVxuXG5cdGZvciAodmFyIGkgPSAxLCBpc093biA9IHRydWU7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuXHRcdHZhciBwYXJ0ID0gcGFydHNbaV07XG5cdFx0dmFyIGZpcnN0ID0gJHN0clNsaWNlKHBhcnQsIDAsIDEpO1xuXHRcdHZhciBsYXN0ID0gJHN0clNsaWNlKHBhcnQsIC0xKTtcblx0XHRpZiAoXG5cdFx0XHQoXG5cdFx0XHRcdChmaXJzdCA9PT0gJ1wiJyB8fCBmaXJzdCA9PT0gXCInXCIgfHwgZmlyc3QgPT09ICdgJylcblx0XHRcdFx0fHwgKGxhc3QgPT09ICdcIicgfHwgbGFzdCA9PT0gXCInXCIgfHwgbGFzdCA9PT0gJ2AnKVxuXHRcdFx0KVxuXHRcdFx0JiYgZmlyc3QgIT09IGxhc3Rcblx0XHQpIHtcblx0XHRcdHRocm93IG5ldyAkU3ludGF4RXJyb3IoJ3Byb3BlcnR5IG5hbWVzIHdpdGggcXVvdGVzIG11c3QgaGF2ZSBtYXRjaGluZyBxdW90ZXMnKTtcblx0XHR9XG5cdFx0aWYgKHBhcnQgPT09ICdjb25zdHJ1Y3RvcicgfHwgIWlzT3duKSB7XG5cdFx0XHRza2lwRnVydGhlckNhY2hpbmcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGludHJpbnNpY0Jhc2VOYW1lICs9ICcuJyArIHBhcnQ7XG5cdFx0aW50cmluc2ljUmVhbE5hbWUgPSAnJScgKyBpbnRyaW5zaWNCYXNlTmFtZSArICclJztcblxuXHRcdGlmIChoYXNPd24oSU5UUklOU0lDUywgaW50cmluc2ljUmVhbE5hbWUpKSB7XG5cdFx0XHR2YWx1ZSA9IElOVFJJTlNJQ1NbaW50cmluc2ljUmVhbE5hbWVdO1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0aWYgKCEocGFydCBpbiB2YWx1ZSkpIHtcblx0XHRcdFx0aWYgKCFhbGxvd01pc3NpbmcpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgJFR5cGVFcnJvcignYmFzZSBpbnRyaW5zaWMgZm9yICcgKyBuYW1lICsgJyBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdm9pZCB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAoJGdPUEQgJiYgKGkgKyAxKSA+PSBwYXJ0cy5sZW5ndGgpIHtcblx0XHRcdFx0dmFyIGRlc2MgPSAkZ09QRCh2YWx1ZSwgcGFydCk7XG5cdFx0XHRcdGlzT3duID0gISFkZXNjO1xuXG5cdFx0XHRcdC8vIEJ5IGNvbnZlbnRpb24sIHdoZW4gYSBkYXRhIHByb3BlcnR5IGlzIGNvbnZlcnRlZCB0byBhbiBhY2Nlc3NvclxuXHRcdFx0XHQvLyBwcm9wZXJ0eSB0byBlbXVsYXRlIGEgZGF0YSBwcm9wZXJ0eSB0aGF0IGRvZXMgbm90IHN1ZmZlciBmcm9tXG5cdFx0XHRcdC8vIHRoZSBvdmVycmlkZSBtaXN0YWtlLCB0aGF0IGFjY2Vzc29yJ3MgZ2V0dGVyIGlzIG1hcmtlZCB3aXRoXG5cdFx0XHRcdC8vIGFuIGBvcmlnaW5hbFZhbHVlYCBwcm9wZXJ0eS4gSGVyZSwgd2hlbiB3ZSBkZXRlY3QgdGhpcywgd2Vcblx0XHRcdFx0Ly8gdXBob2xkIHRoZSBpbGx1c2lvbiBieSBwcmV0ZW5kaW5nIHRvIHNlZSB0aGF0IG9yaWdpbmFsIGRhdGFcblx0XHRcdFx0Ly8gcHJvcGVydHksIGkuZS4sIHJldHVybmluZyB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIGdldHRlclxuXHRcdFx0XHQvLyBpdHNlbGYuXG5cdFx0XHRcdGlmIChpc093biAmJiAnZ2V0JyBpbiBkZXNjICYmICEoJ29yaWdpbmFsVmFsdWUnIGluIGRlc2MuZ2V0KSkge1xuXHRcdFx0XHRcdHZhbHVlID0gZGVzYy5nZXQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtwYXJ0XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aXNPd24gPSBoYXNPd24odmFsdWUsIHBhcnQpO1xuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlW3BhcnRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXNPd24gJiYgIXNraXBGdXJ0aGVyQ2FjaGluZykge1xuXHRcdFx0XHRJTlRSSU5TSUNTW2ludHJpbnNpY1JlYWxOYW1lXSA9IHZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmQgPSByZXF1aXJlKCdmdW5jdGlvbi1iaW5kJyk7XG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgJGFwcGx5ID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5JScpO1xudmFyICRjYWxsID0gR2V0SW50cmluc2ljKCclRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwlJyk7XG52YXIgJHJlZmxlY3RBcHBseSA9IEdldEludHJpbnNpYygnJVJlZmxlY3QuYXBwbHklJywgdHJ1ZSkgfHwgYmluZC5jYWxsKCRjYWxsLCAkYXBwbHkpO1xuXG52YXIgJGdPUEQgPSBHZXRJbnRyaW5zaWMoJyVPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJScsIHRydWUpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IEdldEludHJpbnNpYygnJU9iamVjdC5kZWZpbmVQcm9wZXJ0eSUnLCB0cnVlKTtcbnZhciAkbWF4ID0gR2V0SW50cmluc2ljKCclTWF0aC5tYXglJyk7XG5cbmlmICgkZGVmaW5lUHJvcGVydHkpIHtcblx0dHJ5IHtcblx0XHQkZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyB2YWx1ZTogMSB9KTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIElFIDggaGFzIGEgYnJva2VuIGRlZmluZVByb3BlcnR5XG5cdFx0JGRlZmluZVByb3BlcnR5ID0gbnVsbDtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNhbGxCaW5kKG9yaWdpbmFsRnVuY3Rpb24pIHtcblx0dmFyIGZ1bmMgPSAkcmVmbGVjdEFwcGx5KGJpbmQsICRjYWxsLCBhcmd1bWVudHMpO1xuXHRpZiAoJGdPUEQgJiYgJGRlZmluZVByb3BlcnR5KSB7XG5cdFx0dmFyIGRlc2MgPSAkZ09QRChmdW5jLCAnbGVuZ3RoJyk7XG5cdFx0aWYgKGRlc2MuY29uZmlndXJhYmxlKSB7XG5cdFx0XHQvLyBvcmlnaW5hbCBsZW5ndGgsIHBsdXMgdGhlIHJlY2VpdmVyLCBtaW51cyBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgKGFmdGVyIHRoZSByZWNlaXZlcilcblx0XHRcdCRkZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0ZnVuYyxcblx0XHRcdFx0J2xlbmd0aCcsXG5cdFx0XHRcdHsgdmFsdWU6IDEgKyAkbWF4KDAsIG9yaWdpbmFsRnVuY3Rpb24ubGVuZ3RoIC0gKGFyZ3VtZW50cy5sZW5ndGggLSAxKSkgfVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGZ1bmM7XG59O1xuXG52YXIgYXBwbHlCaW5kID0gZnVuY3Rpb24gYXBwbHlCaW5kKCkge1xuXHRyZXR1cm4gJHJlZmxlY3RBcHBseShiaW5kLCAkYXBwbHksIGFyZ3VtZW50cyk7XG59O1xuXG5pZiAoJGRlZmluZVByb3BlcnR5KSB7XG5cdCRkZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ2FwcGx5JywgeyB2YWx1ZTogYXBwbHlCaW5kIH0pO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMuYXBwbHkgPSBhcHBseUJpbmQ7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xuXG52YXIgY2FsbEJpbmQgPSByZXF1aXJlKCcuLycpO1xuXG52YXIgJGluZGV4T2YgPSBjYWxsQmluZChHZXRJbnRyaW5zaWMoJ1N0cmluZy5wcm90b3R5cGUuaW5kZXhPZicpKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjYWxsQm91bmRJbnRyaW5zaWMobmFtZSwgYWxsb3dNaXNzaW5nKSB7XG5cdHZhciBpbnRyaW5zaWMgPSBHZXRJbnRyaW5zaWMobmFtZSwgISFhbGxvd01pc3NpbmcpO1xuXHRpZiAodHlwZW9mIGludHJpbnNpYyA9PT0gJ2Z1bmN0aW9uJyAmJiAkaW5kZXhPZihuYW1lLCAnLnByb3RvdHlwZS4nKSA+IC0xKSB7XG5cdFx0cmV0dXJuIGNhbGxCaW5kKGludHJpbnNpYyk7XG5cdH1cblx0cmV0dXJuIGludHJpbnNpYztcbn07XG4iLCAibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCd1dGlsJykuaW5zcGVjdDtcbiIsICJ2YXIgaGFzTWFwID0gdHlwZW9mIE1hcCA9PT0gJ2Z1bmN0aW9uJyAmJiBNYXAucHJvdG90eXBlO1xudmFyIG1hcFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNNYXAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE1hcC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIG1hcFNpemUgPSBoYXNNYXAgJiYgbWFwU2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIG1hcFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IG1hcFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgbWFwRm9yRWFjaCA9IGhhc01hcCAmJiBNYXAucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzU2V0ID0gdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiBTZXQucHJvdG90eXBlO1xudmFyIHNldFNpemVEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAmJiBoYXNTZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNldC5wcm90b3R5cGUsICdzaXplJykgOiBudWxsO1xudmFyIHNldFNpemUgPSBoYXNTZXQgJiYgc2V0U2l6ZURlc2NyaXB0b3IgJiYgdHlwZW9mIHNldFNpemVEZXNjcmlwdG9yLmdldCA9PT0gJ2Z1bmN0aW9uJyA/IHNldFNpemVEZXNjcmlwdG9yLmdldCA6IG51bGw7XG52YXIgc2V0Rm9yRWFjaCA9IGhhc1NldCAmJiBTZXQucHJvdG90eXBlLmZvckVhY2g7XG52YXIgaGFzV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nICYmIFdlYWtNYXAucHJvdG90eXBlO1xudmFyIHdlYWtNYXBIYXMgPSBoYXNXZWFrTWFwID8gV2Vha01hcC5wcm90b3R5cGUuaGFzIDogbnVsbDtcbnZhciBoYXNXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbicgJiYgV2Vha1NldC5wcm90b3R5cGU7XG52YXIgd2Vha1NldEhhcyA9IGhhc1dlYWtTZXQgPyBXZWFrU2V0LnByb3RvdHlwZS5oYXMgOiBudWxsO1xudmFyIGhhc1dlYWtSZWYgPSB0eXBlb2YgV2Vha1JlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBXZWFrUmVmLnByb3RvdHlwZTtcbnZhciB3ZWFrUmVmRGVyZWYgPSBoYXNXZWFrUmVmID8gV2Vha1JlZi5wcm90b3R5cGUuZGVyZWYgOiBudWxsO1xudmFyIGJvb2xlYW5WYWx1ZU9mID0gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZjtcbnZhciBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbnZhciAkbWF0Y2ggPSBTdHJpbmcucHJvdG90eXBlLm1hdGNoO1xudmFyICRzbGljZSA9IFN0cmluZy5wcm90b3R5cGUuc2xpY2U7XG52YXIgJHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgJHRvVXBwZXJDYXNlID0gU3RyaW5nLnByb3RvdHlwZS50b1VwcGVyQ2FzZTtcbnZhciAkdG9Mb3dlckNhc2UgPSBTdHJpbmcucHJvdG90eXBlLnRvTG93ZXJDYXNlO1xudmFyICR0ZXN0ID0gUmVnRXhwLnByb3RvdHlwZS50ZXN0O1xudmFyICRjb25jYXQgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xudmFyICRqb2luID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG52YXIgJGFyclNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xudmFyICRmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgYmlnSW50VmFsdWVPZiA9IHR5cGVvZiBCaWdJbnQgPT09ICdmdW5jdGlvbicgPyBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YgOiBudWxsO1xudmFyIGdPUFMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIHN5bVRvU3RyaW5nID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnc3ltYm9sJyA/IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcgOiBudWxsO1xudmFyIGhhc1NoYW1tZWRTeW1ib2xzID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAnb2JqZWN0Jztcbi8vIGllLCBgaGFzLXRvc3RyaW5ndGFnL3NoYW1zXG52YXIgdG9TdHJpbmdUYWcgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiAodHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyA9PT0gaGFzU2hhbW1lZFN5bWJvbHMgPyAnb2JqZWN0JyA6ICdzeW1ib2wnKVxuICAgID8gU3ltYm9sLnRvU3RyaW5nVGFnXG4gICAgOiBudWxsO1xudmFyIGlzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbnZhciBnUE8gPSAodHlwZW9mIFJlZmxlY3QgPT09ICdmdW5jdGlvbicgPyBSZWZsZWN0LmdldFByb3RvdHlwZU9mIDogT2JqZWN0LmdldFByb3RvdHlwZU9mKSB8fCAoXG4gICAgW10uX19wcm90b19fID09PSBBcnJheS5wcm90b3R5cGUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b1xuICAgICAgICA/IGZ1bmN0aW9uIChPKSB7XG4gICAgICAgICAgICByZXR1cm4gTy5fX3Byb3RvX187IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG9cbiAgICAgICAgfVxuICAgICAgICA6IG51bGxcbik7XG5cbmZ1bmN0aW9uIGFkZE51bWVyaWNTZXBhcmF0b3IobnVtLCBzdHIpIHtcbiAgICBpZiAoXG4gICAgICAgIG51bSA9PT0gSW5maW5pdHlcbiAgICAgICAgfHwgbnVtID09PSAtSW5maW5pdHlcbiAgICAgICAgfHwgbnVtICE9PSBudW1cbiAgICAgICAgfHwgKG51bSAmJiBudW0gPiAtMTAwMCAmJiBudW0gPCAxMDAwKVxuICAgICAgICB8fCAkdGVzdC5jYWxsKC9lLywgc3RyKVxuICAgICkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICB2YXIgc2VwUmVnZXggPSAvWzAtOV0oPz0oPzpbMC05XXszfSkrKD8hWzAtOV0pKS9nO1xuICAgIGlmICh0eXBlb2YgbnVtID09PSAnbnVtYmVyJykge1xuICAgICAgICB2YXIgaW50ID0gbnVtIDwgMCA/IC0kZmxvb3IoLW51bSkgOiAkZmxvb3IobnVtKTsgLy8gdHJ1bmMobnVtKVxuICAgICAgICBpZiAoaW50ICE9PSBudW0pIHtcbiAgICAgICAgICAgIHZhciBpbnRTdHIgPSBTdHJpbmcoaW50KTtcbiAgICAgICAgICAgIHZhciBkZWMgPSAkc2xpY2UuY2FsbChzdHIsIGludFN0ci5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKGludFN0ciwgc2VwUmVnZXgsICckJl8nKSArICcuJyArICRyZXBsYWNlLmNhbGwoJHJlcGxhY2UuY2FsbChkZWMsIC8oWzAtOV17M30pL2csICckJl8nKSwgL18kLywgJycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKHN0ciwgc2VwUmVnZXgsICckJl8nKTtcbn1cblxudmFyIHV0aWxJbnNwZWN0ID0gcmVxdWlyZSgnLi91dGlsLmluc3BlY3QnKTtcbnZhciBpbnNwZWN0Q3VzdG9tID0gdXRpbEluc3BlY3QuY3VzdG9tO1xudmFyIGluc3BlY3RTeW1ib2wgPSBpc1N5bWJvbChpbnNwZWN0Q3VzdG9tKSA/IGluc3BlY3RDdXN0b20gOiBudWxsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluc3BlY3RfKG9iaiwgb3B0aW9ucywgZGVwdGgsIHNlZW4pIHtcbiAgICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykgJiYgKG9wdHMucXVvdGVTdHlsZSAhPT0gJ3NpbmdsZScgJiYgb3B0cy5xdW90ZVN0eWxlICE9PSAnZG91YmxlJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwicXVvdGVTdHlsZVwiIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcImRvdWJsZVwiJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICAgaGFzKG9wdHMsICdtYXhTdHJpbmdMZW5ndGgnKSAmJiAodHlwZW9mIG9wdHMubWF4U3RyaW5nTGVuZ3RoID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBvcHRzLm1heFN0cmluZ0xlbmd0aCA8IDAgJiYgb3B0cy5tYXhTdHJpbmdMZW5ndGggIT09IEluZmluaXR5XG4gICAgICAgICAgICA6IG9wdHMubWF4U3RyaW5nTGVuZ3RoICE9PSBudWxsXG4gICAgICAgIClcbiAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIFwibWF4U3RyaW5nTGVuZ3RoXCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tSW5zcGVjdCA9IGhhcyhvcHRzLCAnY3VzdG9tSW5zcGVjdCcpID8gb3B0cy5jdXN0b21JbnNwZWN0IDogdHJ1ZTtcbiAgICBpZiAodHlwZW9mIGN1c3RvbUluc3BlY3QgIT09ICdib29sZWFuJyAmJiBjdXN0b21JbnNwZWN0ICE9PSAnc3ltYm9sJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYFxcJ3N5bWJvbFxcJ2AnKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIGhhcyhvcHRzLCAnaW5kZW50JylcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09IG51bGxcbiAgICAgICAgJiYgb3B0cy5pbmRlbnQgIT09ICdcXHQnXG4gICAgICAgICYmICEocGFyc2VJbnQob3B0cy5pbmRlbnQsIDEwKSA9PT0gb3B0cy5pbmRlbnQgJiYgb3B0cy5pbmRlbnQgPiAwKVxuICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gXCJpbmRlbnRcIiBtdXN0IGJlIFwiXFxcXHRcIiwgYW4gaW50ZWdlciA+IDAsIG9yIGBudWxsYCcpO1xuICAgIH1cbiAgICBpZiAoaGFzKG9wdHMsICdudW1lcmljU2VwYXJhdG9yJykgJiYgdHlwZW9mIG9wdHMubnVtZXJpY1NlcGFyYXRvciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBcIm51bWVyaWNTZXBhcmF0b3JcIiwgaWYgcHJvdmlkZWQsIG11c3QgYmUgYHRydWVgIG9yIGBmYWxzZWAnKTtcbiAgICB9XG4gICAgdmFyIG51bWVyaWNTZXBhcmF0b3IgPSBvcHRzLm51bWVyaWNTZXBhcmF0b3I7XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIG9iaiA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKG9iaiwgb3B0cyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAob2JqID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gSW5maW5pdHkgLyBvYmogPiAwID8gJzAnIDogJy0wJztcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RyID0gU3RyaW5nKG9iaik7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIHN0cikgOiBzdHI7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnYmlnaW50Jykge1xuICAgICAgICB2YXIgYmlnSW50U3RyID0gU3RyaW5nKG9iaikgKyAnbic7XG4gICAgICAgIHJldHVybiBudW1lcmljU2VwYXJhdG9yID8gYWRkTnVtZXJpY1NlcGFyYXRvcihvYmosIGJpZ0ludFN0cikgOiBiaWdJbnRTdHI7XG4gICAgfVxuXG4gICAgdmFyIG1heERlcHRoID0gdHlwZW9mIG9wdHMuZGVwdGggPT09ICd1bmRlZmluZWQnID8gNSA6IG9wdHMuZGVwdGg7XG4gICAgaWYgKHR5cGVvZiBkZXB0aCA9PT0gJ3VuZGVmaW5lZCcpIHsgZGVwdGggPSAwOyB9XG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoICYmIG1heERlcHRoID4gMCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheShvYmopID8gJ1tBcnJheV0nIDogJ1tPYmplY3RdJztcbiAgICB9XG5cbiAgICB2YXIgaW5kZW50ID0gZ2V0SW5kZW50KG9wdHMsIGRlcHRoKTtcblxuICAgIGlmICh0eXBlb2Ygc2VlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2VlbiA9IFtdO1xuICAgIH0gZWxzZSBpZiAoaW5kZXhPZihzZWVuLCBvYmopID49IDApIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnNwZWN0KHZhbHVlLCBmcm9tLCBub0luZGVudCkge1xuICAgICAgICBpZiAoZnJvbSkge1xuICAgICAgICAgICAgc2VlbiA9ICRhcnJTbGljZS5jYWxsKHNlZW4pO1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGZyb20pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub0luZGVudCkge1xuICAgICAgICAgICAgdmFyIG5ld09wdHMgPSB7XG4gICAgICAgICAgICAgICAgZGVwdGg6IG9wdHMuZGVwdGhcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGFzKG9wdHMsICdxdW90ZVN0eWxlJykpIHtcbiAgICAgICAgICAgICAgICBuZXdPcHRzLnF1b3RlU3R5bGUgPSBvcHRzLnF1b3RlU3R5bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdF8odmFsdWUsIG5ld09wdHMsIGRlcHRoICsgMSwgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluc3BlY3RfKHZhbHVlLCBvcHRzLCBkZXB0aCArIDEsIHNlZW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nICYmICFpc1JlZ0V4cChvYmopKSB7IC8vIGluIG9sZGVyIGVuZ2luZXMsIHJlZ2V4ZXMgYXJlIGNhbGxhYmxlXG4gICAgICAgIHZhciBuYW1lID0gbmFtZU9mKG9iaik7XG4gICAgICAgIHZhciBrZXlzID0gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpO1xuICAgICAgICByZXR1cm4gJ1tGdW5jdGlvbicgKyAobmFtZSA/ICc6ICcgKyBuYW1lIDogJyAoYW5vbnltb3VzKScpICsgJ10nICsgKGtleXMubGVuZ3RoID4gMCA/ICcgeyAnICsgJGpvaW4uY2FsbChrZXlzLCAnLCAnKSArICcgfScgOiAnJyk7XG4gICAgfVxuICAgIGlmIChpc1N5bWJvbChvYmopKSB7XG4gICAgICAgIHZhciBzeW1TdHJpbmcgPSBoYXNTaGFtbWVkU3ltYm9scyA/ICRyZXBsYWNlLmNhbGwoU3RyaW5nKG9iaiksIC9eKFN5bWJvbFxcKC4qXFwpKV9bXildKiQvLCAnJDEnKSA6IHN5bVRvU3RyaW5nLmNhbGwob2JqKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmICFoYXNTaGFtbWVkU3ltYm9scyA/IG1hcmtCb3hlZChzeW1TdHJpbmcpIDogc3ltU3RyaW5nO1xuICAgIH1cbiAgICBpZiAoaXNFbGVtZW50KG9iaikpIHtcbiAgICAgICAgdmFyIHMgPSAnPCcgKyAkdG9Mb3dlckNhc2UuY2FsbChTdHJpbmcob2JqLm5vZGVOYW1lKSk7XG4gICAgICAgIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzIHx8IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzICs9ICcgJyArIGF0dHJzW2ldLm5hbWUgKyAnPScgKyB3cmFwUXVvdGVzKHF1b3RlKGF0dHJzW2ldLnZhbHVlKSwgJ2RvdWJsZScsIG9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIHMgKz0gJz4nO1xuICAgICAgICBpZiAob2JqLmNoaWxkTm9kZXMgJiYgb2JqLmNoaWxkTm9kZXMubGVuZ3RoKSB7IHMgKz0gJy4uLic7IH1cbiAgICAgICAgcyArPSAnPC8nICsgJHRvTG93ZXJDYXNlLmNhbGwoU3RyaW5nKG9iai5ub2RlTmFtZSkpICsgJz4nO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1tdJzsgfVxuICAgICAgICB2YXIgeHMgPSBhcnJPYmpLZXlzKG9iaiwgaW5zcGVjdCk7XG4gICAgICAgIGlmIChpbmRlbnQgJiYgIXNpbmdsZUxpbmVWYWx1ZXMoeHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ1snICsgaW5kZW50ZWRKb2luKHhzLCBpbmRlbnQpICsgJ10nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnWyAnICsgJGpvaW4uY2FsbCh4cywgJywgJykgKyAnIF0nO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcihvYmopKSB7XG4gICAgICAgIHZhciBwYXJ0cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgaWYgKCEoJ2NhdXNlJyBpbiBFcnJvci5wcm90b3R5cGUpICYmICdjYXVzZScgaW4gb2JqICYmICFpc0VudW1lcmFibGUuY2FsbChvYmosICdjYXVzZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3sgWycgKyBTdHJpbmcob2JqKSArICddICcgKyAkam9pbi5jYWxsKCRjb25jYXQuY2FsbCgnW2NhdXNlXTogJyArIGluc3BlY3Qob2JqLmNhdXNlKSwgcGFydHMpLCAnLCAnKSArICcgfSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJ1snICsgU3RyaW5nKG9iaikgKyAnXSc7IH1cbiAgICAgICAgcmV0dXJuICd7IFsnICsgU3RyaW5nKG9iaikgKyAnXSAnICsgJGpvaW4uY2FsbChwYXJ0cywgJywgJykgKyAnIH0nO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgY3VzdG9tSW5zcGVjdCkge1xuICAgICAgICBpZiAoaW5zcGVjdFN5bWJvbCAmJiB0eXBlb2Ygb2JqW2luc3BlY3RTeW1ib2xdID09PSAnZnVuY3Rpb24nICYmIHV0aWxJbnNwZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdXRpbEluc3BlY3Qob2JqLCB7IGRlcHRoOiBtYXhEZXB0aCAtIGRlcHRoIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1c3RvbUluc3BlY3QgIT09ICdzeW1ib2wnICYmIHR5cGVvZiBvYmouaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5pbnNwZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTWFwKG9iaikpIHtcbiAgICAgICAgdmFyIG1hcFBhcnRzID0gW107XG4gICAgICAgIGlmIChtYXBGb3JFYWNoKSB7XG4gICAgICAgICAgICBtYXBGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgIG1hcFBhcnRzLnB1c2goaW5zcGVjdChrZXksIG9iaiwgdHJ1ZSkgKyAnID0+ICcgKyBpbnNwZWN0KHZhbHVlLCBvYmopKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uT2YoJ01hcCcsIG1hcFNpemUuY2FsbChvYmopLCBtYXBQYXJ0cywgaW5kZW50KTtcbiAgICB9XG4gICAgaWYgKGlzU2V0KG9iaikpIHtcbiAgICAgICAgdmFyIHNldFBhcnRzID0gW107XG4gICAgICAgIGlmIChzZXRGb3JFYWNoKSB7XG4gICAgICAgICAgICBzZXRGb3JFYWNoLmNhbGwob2JqLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzZXRQYXJ0cy5wdXNoKGluc3BlY3QodmFsdWUsIG9iaikpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25PZignU2V0Jywgc2V0U2l6ZS5jYWxsKG9iaiksIHNldFBhcnRzLCBpbmRlbnQpO1xuICAgIH1cbiAgICBpZiAoaXNXZWFrTWFwKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHdlYWtDb2xsZWN0aW9uT2YoJ1dlYWtNYXAnKTtcbiAgICB9XG4gICAgaWYgKGlzV2Vha1NldChvYmopKSB7XG4gICAgICAgIHJldHVybiB3ZWFrQ29sbGVjdGlvbk9mKCdXZWFrU2V0Jyk7XG4gICAgfVxuICAgIGlmIChpc1dlYWtSZWYob2JqKSkge1xuICAgICAgICByZXR1cm4gd2Vha0NvbGxlY3Rpb25PZignV2Vha1JlZicpO1xuICAgIH1cbiAgICBpZiAoaXNOdW1iZXIob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGluc3BlY3QoTnVtYmVyKG9iaikpKTtcbiAgICB9XG4gICAgaWYgKGlzQmlnSW50KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG1hcmtCb3hlZChpbnNwZWN0KGJpZ0ludFZhbHVlT2YuY2FsbChvYmopKSk7XG4gICAgfVxuICAgIGlmIChpc0Jvb2xlYW4ob2JqKSkge1xuICAgICAgICByZXR1cm4gbWFya0JveGVkKGJvb2xlYW5WYWx1ZU9mLmNhbGwob2JqKSk7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyhvYmopKSB7XG4gICAgICAgIHJldHVybiBtYXJrQm94ZWQoaW5zcGVjdChTdHJpbmcob2JqKSkpO1xuICAgIH1cbiAgICBpZiAoIWlzRGF0ZShvYmopICYmICFpc1JlZ0V4cChvYmopKSB7XG4gICAgICAgIHZhciB5cyA9IGFyck9iaktleXMob2JqLCBpbnNwZWN0KTtcbiAgICAgICAgdmFyIGlzUGxhaW5PYmplY3QgPSBnUE8gPyBnUE8ob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZSA6IG9iaiBpbnN0YW5jZW9mIE9iamVjdCB8fCBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbiAgICAgICAgdmFyIHByb3RvVGFnID0gb2JqIGluc3RhbmNlb2YgT2JqZWN0ID8gJycgOiAnbnVsbCBwcm90b3R5cGUnO1xuICAgICAgICB2YXIgc3RyaW5nVGFnID0gIWlzUGxhaW5PYmplY3QgJiYgdG9TdHJpbmdUYWcgJiYgT2JqZWN0KG9iaikgPT09IG9iaiAmJiB0b1N0cmluZ1RhZyBpbiBvYmogPyAkc2xpY2UuY2FsbCh0b1N0cihvYmopLCA4LCAtMSkgOiBwcm90b1RhZyA/ICdPYmplY3QnIDogJyc7XG4gICAgICAgIHZhciBjb25zdHJ1Y3RvclRhZyA9IGlzUGxhaW5PYmplY3QgfHwgdHlwZW9mIG9iai5jb25zdHJ1Y3RvciAhPT0gJ2Z1bmN0aW9uJyA/ICcnIDogb2JqLmNvbnN0cnVjdG9yLm5hbWUgPyBvYmouY29uc3RydWN0b3IubmFtZSArICcgJyA6ICcnO1xuICAgICAgICB2YXIgdGFnID0gY29uc3RydWN0b3JUYWcgKyAoc3RyaW5nVGFnIHx8IHByb3RvVGFnID8gJ1snICsgJGpvaW4uY2FsbCgkY29uY2F0LmNhbGwoW10sIHN0cmluZ1RhZyB8fCBbXSwgcHJvdG9UYWcgfHwgW10pLCAnOiAnKSArICddICcgOiAnJyk7XG4gICAgICAgIGlmICh5cy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHRhZyArICd7fSc7IH1cbiAgICAgICAgaWYgKGluZGVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhZyArICd7JyArIGluZGVudGVkSm9pbih5cywgaW5kZW50KSArICd9JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFnICsgJ3sgJyArICRqb2luLmNhbGwoeXMsICcsICcpICsgJyB9JztcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhvYmopO1xufTtcblxuZnVuY3Rpb24gd3JhcFF1b3RlcyhzLCBkZWZhdWx0U3R5bGUsIG9wdHMpIHtcbiAgICB2YXIgcXVvdGVDaGFyID0gKG9wdHMucXVvdGVTdHlsZSB8fCBkZWZhdWx0U3R5bGUpID09PSAnZG91YmxlJyA/ICdcIicgOiBcIidcIjtcbiAgICByZXR1cm4gcXVvdGVDaGFyICsgcyArIHF1b3RlQ2hhcjtcbn1cblxuZnVuY3Rpb24gcXVvdGUocykge1xuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKFN0cmluZyhzKSwgL1wiL2csICcmcXVvdDsnKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheShvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc0RhdGUob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBEYXRlXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc1JlZ0V4cChvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNFcnJvcihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEVycm9yXScgJiYgKCF0b1N0cmluZ1RhZyB8fCAhKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHRvU3RyaW5nVGFnIGluIG9iaikpOyB9XG5mdW5jdGlvbiBpc1N0cmluZyhvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IFN0cmluZ10nICYmICghdG9TdHJpbmdUYWcgfHwgISh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiB0b1N0cmluZ1RhZyBpbiBvYmopKTsgfVxuZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7IHJldHVybiB0b1N0cihvYmopID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHsgcmV0dXJuIHRvU3RyKG9iaikgPT09ICdbb2JqZWN0IEJvb2xlYW5dJyAmJiAoIXRvU3RyaW5nVGFnIHx8ICEodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgdG9TdHJpbmdUYWcgaW4gb2JqKSk7IH1cblxuLy8gU3ltYm9sIGFuZCBCaWdJbnQgZG8gaGF2ZSBTeW1ib2wudG9TdHJpbmdUYWcgYnkgc3BlYywgc28gdGhhdCBjYW4ndCBiZSB1c2VkIHRvIGVsaW1pbmF0ZSBmYWxzZSBwb3NpdGl2ZXNcbmZ1bmN0aW9uIGlzU3ltYm9sKG9iaikge1xuICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scykge1xuICAgICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiBpbnN0YW5jZW9mIFN5bWJvbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhc3ltVG9TdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBzeW1Ub1N0cmluZy5jYWxsKG9iaik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0JpZ0ludChvYmopIHtcbiAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCAhYmlnSW50VmFsdWVPZikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGJpZ0ludFZhbHVlT2YuY2FsbChvYmopO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkgfHwgZnVuY3Rpb24gKGtleSkgeyByZXR1cm4ga2V5IGluIHRoaXM7IH07XG5mdW5jdGlvbiBoYXMob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBrZXkpO1xufVxuXG5mdW5jdGlvbiB0b1N0cihvYmopIHtcbiAgICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbChvYmopO1xufVxuXG5mdW5jdGlvbiBuYW1lT2YoZikge1xuICAgIGlmIChmLm5hbWUpIHsgcmV0dXJuIGYubmFtZTsgfVxuICAgIHZhciBtID0gJG1hdGNoLmNhbGwoZnVuY3Rpb25Ub1N0cmluZy5jYWxsKGYpLCAvXmZ1bmN0aW9uXFxzKihbXFx3JF0rKS8pO1xuICAgIGlmIChtKSB7IHJldHVybiBtWzFdOyB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGluZGV4T2YoeHMsIHgpIHtcbiAgICBpZiAoeHMuaW5kZXhPZikgeyByZXR1cm4geHMuaW5kZXhPZih4KTsgfVxuICAgIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmICh4c1tpXSA9PT0geCkgeyByZXR1cm4gaTsgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzTWFwKHgpIHtcbiAgICBpZiAoIW1hcFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChzKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIE1hcDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha01hcCh4KSB7XG4gICAgaWYgKCF3ZWFrTWFwSGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrTWFwOyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNXZWFrUmVmKHgpIHtcbiAgICBpZiAoIXdlYWtSZWZEZXJlZiB8fCAheCB8fCB0eXBlb2YgeCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICB3ZWFrUmVmRGVyZWYuY2FsbCh4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzU2V0KHgpIHtcbiAgICBpZiAoIXNldFNpemUgfHwgIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgc2V0U2l6ZS5jYWxsKHgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWFwU2l6ZS5jYWxsKHgpO1xuICAgICAgICB9IGNhdGNoIChtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geCBpbnN0YW5jZW9mIFNldDsgLy8gY29yZS1qcyB3b3JrYXJvdW5kLCBwcmUtdjIuNS4wXG4gICAgfSBjYXRjaCAoZSkge31cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzV2Vha1NldCh4KSB7XG4gICAgaWYgKCF3ZWFrU2V0SGFzIHx8ICF4IHx8IHR5cGVvZiB4ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHdlYWtTZXRIYXMuY2FsbCh4LCB3ZWFrU2V0SGFzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdlYWtNYXBIYXMuY2FsbCh4LCB3ZWFrTWFwSGFzKTtcbiAgICAgICAgfSBjYXRjaCAocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggaW5zdGFuY2VvZiBXZWFrU2V0OyAvLyBjb3JlLWpzIHdvcmthcm91bmQsIHByZS12Mi41LjBcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50KHgpIHtcbiAgICBpZiAoIXggfHwgdHlwZW9mIHggIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB4Lm5vZGVOYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgeC5nZXRBdHRyaWJ1dGUgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyLCBvcHRzKSB7XG4gICAgaWYgKHN0ci5sZW5ndGggPiBvcHRzLm1heFN0cmluZ0xlbmd0aCkge1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gc3RyLmxlbmd0aCAtIG9wdHMubWF4U3RyaW5nTGVuZ3RoO1xuICAgICAgICB2YXIgdHJhaWxlciA9ICcuLi4gJyArIHJlbWFpbmluZyArICcgbW9yZSBjaGFyYWN0ZXInICsgKHJlbWFpbmluZyA+IDEgPyAncycgOiAnJyk7XG4gICAgICAgIHJldHVybiBpbnNwZWN0U3RyaW5nKCRzbGljZS5jYWxsKHN0ciwgMCwgb3B0cy5tYXhTdHJpbmdMZW5ndGgpLCBvcHRzKSArIHRyYWlsZXI7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICAgdmFyIHMgPSAkcmVwbGFjZS5jYWxsKCRyZXBsYWNlLmNhbGwoc3RyLCAvKFsnXFxcXF0pL2csICdcXFxcJDEnKSwgL1tcXHgwMC1cXHgxZl0vZywgbG93Ynl0ZSk7XG4gICAgcmV0dXJuIHdyYXBRdW90ZXMocywgJ3NpbmdsZScsIG9wdHMpO1xufVxuXG5mdW5jdGlvbiBsb3dieXRlKGMpIHtcbiAgICB2YXIgbiA9IGMuY2hhckNvZGVBdCgwKTtcbiAgICB2YXIgeCA9IHtcbiAgICAgICAgODogJ2InLFxuICAgICAgICA5OiAndCcsXG4gICAgICAgIDEwOiAnbicsXG4gICAgICAgIDEyOiAnZicsXG4gICAgICAgIDEzOiAncidcbiAgICB9W25dO1xuICAgIGlmICh4KSB7IHJldHVybiAnXFxcXCcgKyB4OyB9XG4gICAgcmV0dXJuICdcXFxceCcgKyAobiA8IDB4MTAgPyAnMCcgOiAnJykgKyAkdG9VcHBlckNhc2UuY2FsbChuLnRvU3RyaW5nKDE2KSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtCb3hlZChzdHIpIHtcbiAgICByZXR1cm4gJ09iamVjdCgnICsgc3RyICsgJyknO1xufVxuXG5mdW5jdGlvbiB3ZWFrQ29sbGVjdGlvbk9mKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZSArICcgeyA/IH0nO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0aW9uT2YodHlwZSwgc2l6ZSwgZW50cmllcywgaW5kZW50KSB7XG4gICAgdmFyIGpvaW5lZEVudHJpZXMgPSBpbmRlbnQgPyBpbmRlbnRlZEpvaW4oZW50cmllcywgaW5kZW50KSA6ICRqb2luLmNhbGwoZW50cmllcywgJywgJyk7XG4gICAgcmV0dXJuIHR5cGUgKyAnICgnICsgc2l6ZSArICcpIHsnICsgam9pbmVkRW50cmllcyArICd9Jztcbn1cblxuZnVuY3Rpb24gc2luZ2xlTGluZVZhbHVlcyh4cykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGluZGV4T2YoeHNbaV0sICdcXG4nKSA+PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldEluZGVudChvcHRzLCBkZXB0aCkge1xuICAgIHZhciBiYXNlSW5kZW50O1xuICAgIGlmIChvcHRzLmluZGVudCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICdcXHQnO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdHMuaW5kZW50ID09PSAnbnVtYmVyJyAmJiBvcHRzLmluZGVudCA+IDApIHtcbiAgICAgICAgYmFzZUluZGVudCA9ICRqb2luLmNhbGwoQXJyYXkob3B0cy5pbmRlbnQgKyAxKSwgJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmFzZTogYmFzZUluZGVudCxcbiAgICAgICAgcHJldjogJGpvaW4uY2FsbChBcnJheShkZXB0aCArIDEpLCBiYXNlSW5kZW50KVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGluZGVudGVkSm9pbih4cywgaW5kZW50KSB7XG4gICAgaWYgKHhzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJyc7IH1cbiAgICB2YXIgbGluZUpvaW5lciA9ICdcXG4nICsgaW5kZW50LnByZXYgKyBpbmRlbnQuYmFzZTtcbiAgICByZXR1cm4gbGluZUpvaW5lciArICRqb2luLmNhbGwoeHMsICcsJyArIGxpbmVKb2luZXIpICsgJ1xcbicgKyBpbmRlbnQucHJldjtcbn1cblxuZnVuY3Rpb24gYXJyT2JqS2V5cyhvYmosIGluc3BlY3QpIHtcbiAgICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iaik7XG4gICAgdmFyIHhzID0gW107XG4gICAgaWYgKGlzQXJyKSB7XG4gICAgICAgIHhzLmxlbmd0aCA9IG9iai5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB4c1tpXSA9IGhhcyhvYmosIGkpID8gaW5zcGVjdChvYmpbaV0sIG9iaikgOiAnJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgc3ltcyA9IHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nID8gZ09QUyhvYmopIDogW107XG4gICAgdmFyIHN5bU1hcDtcbiAgICBpZiAoaGFzU2hhbW1lZFN5bWJvbHMpIHtcbiAgICAgICAgc3ltTWFwID0ge307XG4gICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgc3ltcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgc3ltTWFwWyckJyArIHN5bXNba11dID0gc3ltc1trXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBpZiAoIWhhcyhvYmosIGtleSkpIHsgY29udGludWU7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCwgbm8tY29udGludWVcbiAgICAgICAgaWYgKGlzQXJyICYmIFN0cmluZyhOdW1iZXIoa2V5KSkgPT09IGtleSAmJiBrZXkgPCBvYmoubGVuZ3RoKSB7IGNvbnRpbnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgsIG5vLWNvbnRpbnVlXG4gICAgICAgIGlmIChoYXNTaGFtbWVkU3ltYm9scyAmJiBzeW1NYXBbJyQnICsga2V5XSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0byBwcmV2ZW50IHNoYW1tZWQgU3ltYm9scywgd2hpY2ggYXJlIHN0b3JlZCBhcyBzdHJpbmdzLCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcga2V5IHNlY3Rpb25cbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4LCBuby1jb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKCR0ZXN0LmNhbGwoL1teXFx3JF0vLCBrZXkpKSB7XG4gICAgICAgICAgICB4cy5wdXNoKGluc3BlY3Qoa2V5LCBvYmopICsgJzogJyArIGluc3BlY3Qob2JqW2tleV0sIG9iaikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeHMucHVzaChrZXkgKyAnOiAnICsgaW5zcGVjdChvYmpba2V5XSwgb2JqKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnT1BTID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ltcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgaWYgKGlzRW51bWVyYWJsZS5jYWxsKG9iaiwgc3ltc1tqXSkpIHtcbiAgICAgICAgICAgICAgICB4cy5wdXNoKCdbJyArIGluc3BlY3Qoc3ltc1tqXSkgKyAnXTogJyArIGluc3BlY3Qob2JqW3N5bXNbal1dLCBvYmopKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geHM7XG59XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2V0SW50cmluc2ljID0gcmVxdWlyZSgnZ2V0LWludHJpbnNpYycpO1xudmFyIGNhbGxCb3VuZCA9IHJlcXVpcmUoJ2NhbGwtYmluZC9jYWxsQm91bmQnKTtcbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnb2JqZWN0LWluc3BlY3QnKTtcblxudmFyICRUeXBlRXJyb3IgPSBHZXRJbnRyaW5zaWMoJyVUeXBlRXJyb3IlJyk7XG52YXIgJFdlYWtNYXAgPSBHZXRJbnRyaW5zaWMoJyVXZWFrTWFwJScsIHRydWUpO1xudmFyICRNYXAgPSBHZXRJbnRyaW5zaWMoJyVNYXAlJywgdHJ1ZSk7XG5cbnZhciAkd2Vha01hcEdldCA9IGNhbGxCb3VuZCgnV2Vha01hcC5wcm90b3R5cGUuZ2V0JywgdHJ1ZSk7XG52YXIgJHdlYWtNYXBTZXQgPSBjYWxsQm91bmQoJ1dlYWtNYXAucHJvdG90eXBlLnNldCcsIHRydWUpO1xudmFyICR3ZWFrTWFwSGFzID0gY2FsbEJvdW5kKCdXZWFrTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcbnZhciAkbWFwR2V0ID0gY2FsbEJvdW5kKCdNYXAucHJvdG90eXBlLmdldCcsIHRydWUpO1xudmFyICRtYXBTZXQgPSBjYWxsQm91bmQoJ01hcC5wcm90b3R5cGUuc2V0JywgdHJ1ZSk7XG52YXIgJG1hcEhhcyA9IGNhbGxCb3VuZCgnTWFwLnByb3RvdHlwZS5oYXMnLCB0cnVlKTtcblxuLypcbiAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBsaXN0IHJldHVybmluZyB0aGUgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZVxuICogZ2l2ZW4ga2V5LlxuICpcbiAqIFRoYXQgbm9kZSBpcyBhbHNvIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyB0aGF0IGlmIGl0J3MgYWNjZXNzZWRcbiAqIGFnYWluIHdlIGRvbid0IG5lZWQgdG8gdHJhdmVyc2UgdGhlIHdob2xlIGxpc3QuIEJ5IGRvaW5nIHNvLCBhbGwgdGhlIHJlY2VudGx5XG4gKiB1c2VkIG5vZGVzIGNhbiBiZSBhY2Nlc3NlZCByZWxhdGl2ZWx5IHF1aWNrbHkuXG4gKi9cbnZhciBsaXN0R2V0Tm9kZSA9IGZ1bmN0aW9uIChsaXN0LCBrZXkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb25zaXN0ZW50LXJldHVyblxuXHRmb3IgKHZhciBwcmV2ID0gbGlzdCwgY3VycjsgKGN1cnIgPSBwcmV2Lm5leHQpICE9PSBudWxsOyBwcmV2ID0gY3Vycikge1xuXHRcdGlmIChjdXJyLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRwcmV2Lm5leHQgPSBjdXJyLm5leHQ7XG5cdFx0XHRjdXJyLm5leHQgPSBsaXN0Lm5leHQ7XG5cdFx0XHRsaXN0Lm5leHQgPSBjdXJyOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cdFx0XHRyZXR1cm4gY3Vycjtcblx0XHR9XG5cdH1cbn07XG5cbnZhciBsaXN0R2V0ID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSkge1xuXHR2YXIgbm9kZSA9IGxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG5cdHJldHVybiBub2RlICYmIG5vZGUudmFsdWU7XG59O1xudmFyIGxpc3RTZXQgPSBmdW5jdGlvbiAob2JqZWN0cywga2V5LCB2YWx1ZSkge1xuXHR2YXIgbm9kZSA9IGxpc3RHZXROb2RlKG9iamVjdHMsIGtleSk7XG5cdGlmIChub2RlKSB7XG5cdFx0bm9kZS52YWx1ZSA9IHZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdC8vIFByZXBlbmQgdGhlIG5ldyBub2RlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3Rcblx0XHRvYmplY3RzLm5leHQgPSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0XHRcdGtleToga2V5LFxuXHRcdFx0bmV4dDogb2JqZWN0cy5uZXh0LFxuXHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0fTtcblx0fVxufTtcbnZhciBsaXN0SGFzID0gZnVuY3Rpb24gKG9iamVjdHMsIGtleSkge1xuXHRyZXR1cm4gISFsaXN0R2V0Tm9kZShvYmplY3RzLCBrZXkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRTaWRlQ2hhbm5lbCgpIHtcblx0dmFyICR3bTtcblx0dmFyICRtO1xuXHR2YXIgJG87XG5cdHZhciBjaGFubmVsID0ge1xuXHRcdGFzc2VydDogZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0aWYgKCFjaGFubmVsLmhhcyhrZXkpKSB7XG5cdFx0XHRcdHRocm93IG5ldyAkVHlwZUVycm9yKCdTaWRlIGNoYW5uZWwgZG9lcyBub3QgY29udGFpbiAnICsgaW5zcGVjdChrZXkpKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGdldDogZnVuY3Rpb24gKGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoJHdtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICR3ZWFrTWFwR2V0KCR3bSwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICgkTWFwKSB7XG5cdFx0XHRcdGlmICgkbSkge1xuXHRcdFx0XHRcdHJldHVybiAkbWFwR2V0KCRtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoJG8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sb25lbHktaWZcblx0XHRcdFx0XHRyZXR1cm4gbGlzdEdldCgkbywga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0aGFzOiBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRpZiAoJFdlYWtNYXAgJiYga2V5ICYmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0JyB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSkge1xuXHRcdFx0XHRpZiAoJHdtKSB7XG5cdFx0XHRcdFx0cmV0dXJuICR3ZWFrTWFwSGFzKCR3bSwga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICgkTWFwKSB7XG5cdFx0XHRcdGlmICgkbSkge1xuXHRcdFx0XHRcdHJldHVybiAkbWFwSGFzKCRtLCBrZXkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoJG8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1sb25lbHktaWZcblx0XHRcdFx0XHRyZXR1cm4gbGlzdEhhcygkbywga2V5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCRXZWFrTWFwICYmIGtleSAmJiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykpIHtcblx0XHRcdFx0aWYgKCEkd20pIHtcblx0XHRcdFx0XHQkd20gPSBuZXcgJFdlYWtNYXAoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQkd2Vha01hcFNldCgkd20sIGtleSwgdmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmICgkTWFwKSB7XG5cdFx0XHRcdGlmICghJG0pIHtcblx0XHRcdFx0XHQkbSA9IG5ldyAkTWFwKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0JG1hcFNldCgkbSwga2V5LCB2YWx1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoISRvKSB7XG5cdFx0XHRcdFx0Lypcblx0XHRcdFx0XHQgKiBJbml0aWFsaXplIHRoZSBsaW5rZWQgbGlzdCBhcyBhbiBlbXB0eSBub2RlLCBzbyB0aGF0IHdlIGRvbid0IGhhdmVcblx0XHRcdFx0XHQgKiB0byBzcGVjaWFsLWNhc2UgaGFuZGxpbmcgb2YgdGhlIGZpcnN0IG5vZGU6IHdlIGNhbiBhbHdheXMgcmVmZXIgdG9cblx0XHRcdFx0XHQgKiBpdCBhcyAocHJldmlvdXMgbm9kZSkubmV4dCwgaW5zdGVhZCBvZiBzb21ldGhpbmcgbGlrZSAobGlzdCkuaGVhZFxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdCRvID0geyBrZXk6IHt9LCBuZXh0OiBudWxsIH07XG5cdFx0XHRcdH1cblx0XHRcdFx0bGlzdFNldCgkbywga2V5LCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRyZXR1cm4gY2hhbm5lbDtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbnZhciBGb3JtYXQgPSB7XG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ2RlZmF1bHQnOiBGb3JtYXQuUkZDMzk4NixcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSRkMxNzM4OiBGb3JtYXQuUkZDMTczOCxcbiAgICBSRkMzOTg2OiBGb3JtYXQuUkZDMzk4NlxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG52YXIgaGV4VGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgYXJyYXkucHVzaCgnJScgKyAoKGkgPCAxNiA/ICcwJyA6ICcnKSArIGkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59KCkpO1xuXG52YXIgY29tcGFjdFF1ZXVlID0gZnVuY3Rpb24gY29tcGFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgdmFyIGNvbXBhY3RlZCA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iai5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqW2pdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wYWN0ZWQucHVzaChvYmpbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXRlbS5vYmpbaXRlbS5wcm9wXSA9IGNvbXBhY3RlZDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciBhcnJheVRvT2JqZWN0ID0gZnVuY3Rpb24gYXJyYXlUb09iamVjdChzb3VyY2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgb2JqID0gb3B0aW9ucyAmJiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9ialtpXSA9IHNvdXJjZVtpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgbWVyZ2UgPSBmdW5jdGlvbiBtZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuICAgIC8qIGVzbGludCBuby1wYXJhbS1yZWFzc2lnbjogMCAqL1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChpc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiYgKG9wdGlvbnMucGxhaW5PYmplY3RzIHx8IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSkgfHwgIWhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHNvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbc291cmNlXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW3RhcmdldCwgc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXQgfHwgdHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFt0YXJnZXRdLmNvbmNhdChzb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciBtZXJnZVRhcmdldCA9IHRhcmdldDtcbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmICFpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgbWVyZ2VUYXJnZXQgPSBhcnJheVRvT2JqZWN0KHRhcmdldCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkodGFyZ2V0KSAmJiBpc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgc291cmNlLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICAgICAgICAgIGlmIChoYXMuY2FsbCh0YXJnZXQsIGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldEl0ZW0gPSB0YXJnZXRbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldEl0ZW0gJiYgdHlwZW9mIHRhcmdldEl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gJiYgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IG1lcmdlKHRhcmdldEl0ZW0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgICBpZiAoaGFzLmNhbGwoYWNjLCBrZXkpKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IG1lcmdlKGFjY1trZXldLCB2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbWVyZ2VUYXJnZXQpO1xufTtcblxudmFyIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnblNpbmdsZVNvdXJjZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0YXJnZXQpO1xufTtcblxudmFyIGRlY29kZSA9IGZ1bmN0aW9uIChzdHIsIGRlY29kZXIsIGNoYXJzZXQpIHtcbiAgICB2YXIgc3RyV2l0aG91dFBsdXMgPSBzdHIucmVwbGFjZSgvXFwrL2csICcgJyk7XG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAvLyB1bmVzY2FwZSBuZXZlciB0aHJvd3MsIG5vIHRyeS4uLmNhdGNoIG5lZWRlZDpcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzLnJlcGxhY2UoLyVbMC05YS1mXXsyfS9naSwgdW5lc2NhcGUpO1xuICAgIH1cbiAgICAvLyB1dGYtOFxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyV2l0aG91dFBsdXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHN0cldpdGhvdXRQbHVzO1xuICAgIH1cbn07XG5cbnZhciBlbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoc3RyLCBkZWZhdWx0RW5jb2RlciwgY2hhcnNldCwga2luZCwgZm9ybWF0KSB7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQnJpYW4gV2hpdGUgKG1zY2RleCkgZm9yIHRoZSBpby5qcyBjb3JlIHF1ZXJ5c3RyaW5nIGxpYnJhcnkuXG4gICAgLy8gSXQgaGFzIGJlZW4gYWRhcHRlZCBoZXJlIGZvciBzdHJpY3RlciBhZGhlcmVuY2UgdG8gUkZDIDM5ODZcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHZhciBzdHJpbmcgPSBzdHI7XG4gICAgaWYgKHR5cGVvZiBzdHIgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHN0cmluZyA9IFN5bWJvbC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzdHIpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3RyaW5nID0gU3RyaW5nKHN0cik7XG4gICAgfVxuXG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICByZXR1cm4gZXNjYXBlKHN0cmluZykucmVwbGFjZSgvJXVbMC05YS1mXXs0fS9naSwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyUyNiUyMycgKyBwYXJzZUludCgkMC5zbGljZSgyKSwgMTYpICsgJyUzQic7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBvdXQgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGMgPT09IDB4MkQgLy8gLVxuICAgICAgICAgICAgfHwgYyA9PT0gMHgyRSAvLyAuXG4gICAgICAgICAgICB8fCBjID09PSAweDVGIC8vIF9cbiAgICAgICAgICAgIHx8IGMgPT09IDB4N0UgLy8gflxuICAgICAgICAgICAgfHwgKGMgPj0gMHgzMCAmJiBjIDw9IDB4MzkpIC8vIDAtOVxuICAgICAgICAgICAgfHwgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NUEpIC8vIGEtelxuICAgICAgICAgICAgfHwgKGMgPj0gMHg2MSAmJiBjIDw9IDB4N0EpIC8vIEEtWlxuICAgICAgICAgICAgfHwgKGZvcm1hdCA9PT0gZm9ybWF0cy5SRkMxNzM4ICYmIChjID09PSAweDI4IHx8IGMgPT09IDB4MjkpKSAvLyAoIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBvdXQgKz0gc3RyaW5nLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IChzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG4gICAgICAgIC8qIGVzbGludCBvcGVyYXRvci1saW5lYnJlYWs6IFsyLCBcImJlZm9yZVwiXSAqL1xuICAgICAgICBvdXQgKz0gaGV4VGFibGVbMHhGMCB8IChjID4+IDE4KV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiAxMikgJiAweDNGKV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbnZhciBjb21wYWN0ID0gZnVuY3Rpb24gY29tcGFjdCh2YWx1ZSkge1xuICAgIHZhciBxdWV1ZSA9IFt7IG9iajogeyBvOiB2YWx1ZSB9LCBwcm9wOiAnbycgfV07XG4gICAgdmFyIHJlZnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZVtpXTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2pdO1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiByZWZzLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqOiBvYmosIHByb3A6IGtleSB9KTtcbiAgICAgICAgICAgICAgICByZWZzLnB1c2godmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBhY3RRdWV1ZShxdWV1ZSk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG52YXIgaXNSZWdFeHAgPSBmdW5jdGlvbiBpc1JlZ0V4cChvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufTtcblxudmFyIGlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhIShvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihvYmopKTtcbn07XG5cbnZhciBjb21iaW5lID0gZnVuY3Rpb24gY29tYmluZShhLCBiKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChhLCBiKTtcbn07XG5cbnZhciBtYXliZU1hcCA9IGZ1bmN0aW9uIG1heWJlTWFwKHZhbCwgZm4pIHtcbiAgICBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIG1hcHBlZC5wdXNoKGZuKHZhbFtpXSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXBwZWQ7XG4gICAgfVxuICAgIHJldHVybiBmbih2YWwpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgYXJyYXlUb09iamVjdDogYXJyYXlUb09iamVjdCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBjb21iaW5lOiBjb21iaW5lLFxuICAgIGNvbXBhY3Q6IGNvbXBhY3QsXG4gICAgZGVjb2RlOiBkZWNvZGUsXG4gICAgZW5jb2RlOiBlbmNvZGUsXG4gICAgaXNCdWZmZXI6IGlzQnVmZmVyLFxuICAgIGlzUmVnRXhwOiBpc1JlZ0V4cCxcbiAgICBtYXliZU1hcDogbWF5YmVNYXAsXG4gICAgbWVyZ2U6IG1lcmdlXG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGdldFNpZGVDaGFubmVsID0gcmVxdWlyZSgnc2lkZS1jaGFubmVsJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBhcnJheVByZWZpeEdlbmVyYXRvcnMgPSB7XG4gICAgYnJhY2tldHM6IGZ1bmN0aW9uIGJyYWNrZXRzKHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1tdJztcbiAgICB9LFxuICAgIGNvbW1hOiAnY29tbWEnLFxuICAgIGluZGljZXM6IGZ1bmN0aW9uIGluZGljZXMocHJlZml4LCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdbJyArIGtleSArICddJztcbiAgICB9LFxuICAgIHJlcGVhdDogZnVuY3Rpb24gcmVwZWF0KHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcHJlZml4O1xuICAgIH1cbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbnZhciBzcGxpdCA9IFN0cmluZy5wcm90b3R5cGUuc3BsaXQ7XG52YXIgcHVzaCA9IEFycmF5LnByb3RvdHlwZS5wdXNoO1xudmFyIHB1c2hUb0FycmF5ID0gZnVuY3Rpb24gKGFyciwgdmFsdWVPckFycmF5KSB7XG4gICAgcHVzaC5hcHBseShhcnIsIGlzQXJyYXkodmFsdWVPckFycmF5KSA/IHZhbHVlT3JBcnJheSA6IFt2YWx1ZU9yQXJyYXldKTtcbn07XG5cbnZhciB0b0lTTyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgZGVmYXVsdEZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhZGRRdWVyeVByZWZpeDogZmFsc2UsXG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBjaGFyc2V0OiAndXRmLTgnLFxuICAgIGNoYXJzZXRTZW50aW5lbDogZmFsc2UsXG4gICAgZGVsaW1pdGVyOiAnJicsXG4gICAgZW5jb2RlOiB0cnVlLFxuICAgIGVuY29kZXI6IHV0aWxzLmVuY29kZSxcbiAgICBlbmNvZGVWYWx1ZXNPbmx5OiBmYWxzZSxcbiAgICBmb3JtYXQ6IGRlZmF1bHRGb3JtYXQsXG4gICAgZm9ybWF0dGVyOiBmb3JtYXRzLmZvcm1hdHRlcnNbZGVmYXVsdEZvcm1hdF0sXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGluZGljZXM6IGZhbHNlLFxuICAgIHNlcmlhbGl6ZURhdGU6IGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSkge1xuICAgICAgICByZXR1cm4gdG9JU08uY2FsbChkYXRlKTtcbiAgICB9LFxuICAgIHNraXBOdWxsczogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSA9IGZ1bmN0aW9uIGlzTm9uTnVsbGlzaFByaW1pdGl2ZSh2KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ251bWJlcidcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJ1xuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gJ3N5bWJvbCdcbiAgICAgICAgfHwgdHlwZW9mIHYgPT09ICdiaWdpbnQnO1xufTtcblxudmFyIHNlbnRpbmVsID0ge307XG5cbnZhciBzdHJpbmdpZnkgPSBmdW5jdGlvbiBzdHJpbmdpZnkoXG4gICAgb2JqZWN0LFxuICAgIHByZWZpeCxcbiAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgIGNvbW1hUm91bmRUcmlwLFxuICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICBza2lwTnVsbHMsXG4gICAgZW5jb2RlcixcbiAgICBmaWx0ZXIsXG4gICAgc29ydCxcbiAgICBhbGxvd0RvdHMsXG4gICAgc2VyaWFsaXplRGF0ZSxcbiAgICBmb3JtYXQsXG4gICAgZm9ybWF0dGVyLFxuICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgY2hhcnNldCxcbiAgICBzaWRlQ2hhbm5lbFxuKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcblxuICAgIHZhciB0bXBTYyA9IHNpZGVDaGFubmVsO1xuICAgIHZhciBzdGVwID0gMDtcbiAgICB2YXIgZmluZEZsYWcgPSBmYWxzZTtcbiAgICB3aGlsZSAoKHRtcFNjID0gdG1wU2MuZ2V0KHNlbnRpbmVsKSkgIT09IHZvaWQgdW5kZWZpbmVkICYmICFmaW5kRmxhZykge1xuICAgICAgICAvLyBXaGVyZSBvYmplY3QgbGFzdCBhcHBlYXJlZCBpbiB0aGUgcmVmIHRyZWVcbiAgICAgICAgdmFyIHBvcyA9IHRtcFNjLmdldChvYmplY3QpO1xuICAgICAgICBzdGVwICs9IDE7XG4gICAgICAgIGlmICh0eXBlb2YgcG9zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaWYgKHBvcyA9PT0gc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDeWNsaWMgb2JqZWN0IHZhbHVlJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmRGbGFnID0gdHJ1ZTsgLy8gQnJlYWsgd2hpbGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRtcFNjLmdldChzZW50aW5lbCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzdGVwID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIG9iaiA9IHV0aWxzLm1heWJlTWFwKG9iaiwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZURhdGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpY3ROdWxsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVyICYmICFlbmNvZGVWYWx1ZXNPbmx5ID8gZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICdrZXknLCBmb3JtYXQpIDogcHJlZml4O1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKGlzTm9uTnVsbGlzaFByaW1pdGl2ZShvYmopIHx8IHV0aWxzLmlzQnVmZmVyKG9iaikpIHtcbiAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZSA9IGVuY29kZVZhbHVlc09ubHkgPyBwcmVmaXggOiBlbmNvZGVyKHByZWZpeCwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ2tleScsIGZvcm1hdCk7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBlbmNvZGVWYWx1ZXNPbmx5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlc0FycmF5ID0gc3BsaXQuY2FsbChTdHJpbmcob2JqKSwgJywnKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVzSm9pbmVkID0gJyc7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXNBcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXNKb2luZWQgKz0gKGkgPT09IDAgPyAnJyA6ICcsJykgKyBmb3JtYXR0ZXIoZW5jb2Rlcih2YWx1ZXNBcnJheVtpXSwgZGVmYXVsdHMuZW5jb2RlciwgY2hhcnNldCwgJ3ZhbHVlJywgZm9ybWF0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArIChjb21tYVJvdW5kVHJpcCAmJiBpc0FycmF5KG9iaikgJiYgdmFsdWVzQXJyYXkubGVuZ3RoID09PSAxID8gJ1tdJyA6ICcnKSArICc9JyArIHZhbHVlc0pvaW5lZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihrZXlWYWx1ZSkgKyAnPScgKyBmb3JtYXR0ZXIoZW5jb2RlcihvYmosIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQsICd2YWx1ZScsIGZvcm1hdCkpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdjb21tYScgJiYgaXNBcnJheShvYmopKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gam9pbiBlbGVtZW50cyBpblxuICAgICAgICBvYmpLZXlzID0gW3sgdmFsdWU6IG9iai5sZW5ndGggPiAwID8gb2JqLmpvaW4oJywnKSB8fCBudWxsIDogdm9pZCB1bmRlZmluZWQgfV07XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgb2JqS2V5cyA9IGZpbHRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIG9iaktleXMgPSBzb3J0ID8ga2V5cy5zb3J0KHNvcnQpIDoga2V5cztcbiAgICB9XG5cbiAgICB2YXIgYWRqdXN0ZWRQcmVmaXggPSBjb21tYVJvdW5kVHJpcCAmJiBpc0FycmF5KG9iaikgJiYgb2JqLmxlbmd0aCA9PT0gMSA/IHByZWZpeCArICdbXScgOiBwcmVmaXg7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9iaktleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgdmFyIGtleSA9IG9iaktleXNbal07XG4gICAgICAgIHZhciB2YWx1ZSA9IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkudmFsdWUgIT09ICd1bmRlZmluZWQnID8ga2V5LnZhbHVlIDogb2JqW2tleV07XG5cbiAgICAgICAgaWYgKHNraXBOdWxscyAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIga2V5UHJlZml4ID0gaXNBcnJheShvYmopXG4gICAgICAgICAgICA/IHR5cGVvZiBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnZnVuY3Rpb24nID8gZ2VuZXJhdGVBcnJheVByZWZpeChhZGp1c3RlZFByZWZpeCwga2V5KSA6IGFkanVzdGVkUHJlZml4XG4gICAgICAgICAgICA6IGFkanVzdGVkUHJlZml4ICsgKGFsbG93RG90cyA/ICcuJyArIGtleSA6ICdbJyArIGtleSArICddJyk7XG5cbiAgICAgICAgc2lkZUNoYW5uZWwuc2V0KG9iamVjdCwgc3RlcCk7XG4gICAgICAgIHZhciB2YWx1ZVNpZGVDaGFubmVsID0gZ2V0U2lkZUNoYW5uZWwoKTtcbiAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbC5zZXQoc2VudGluZWwsIHNpZGVDaGFubmVsKTtcbiAgICAgICAgcHVzaFRvQXJyYXkodmFsdWVzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGtleVByZWZpeCxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBjb21tYVJvdW5kVHJpcCxcbiAgICAgICAgICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgIGVuY29kZXIsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgYWxsb3dEb3RzLFxuICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgIGVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBjaGFyc2V0LFxuICAgICAgICAgICAgdmFsdWVTaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVzO1xufTtcblxudmFyIG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMgPSBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zKG9wdHMpIHtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIH1cblxuICAgIGlmIChvcHRzLmVuY29kZXIgIT09IG51bGwgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG9wdHMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBjaGFyc2V0ID0gb3B0cy5jaGFyc2V0IHx8IGRlZmF1bHRzLmNoYXJzZXQ7XG4gICAgaWYgKHR5cGVvZiBvcHRzLmNoYXJzZXQgIT09ICd1bmRlZmluZWQnICYmIG9wdHMuY2hhcnNldCAhPT0gJ3V0Zi04JyAmJiBvcHRzLmNoYXJzZXQgIT09ICdpc28tODg1OS0xJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzWydkZWZhdWx0J107XG4gICAgaWYgKHR5cGVvZiBvcHRzLmZvcm1hdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKCFoYXMuY2FsbChmb3JtYXRzLmZvcm1hdHRlcnMsIG9wdHMuZm9ybWF0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGZvcm1hdCA9IG9wdHMuZm9ybWF0O1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cbiAgICB2YXIgZmlsdGVyID0gZGVmYXVsdHMuZmlsdGVyO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5maWx0ZXIgPT09ICdmdW5jdGlvbicgfHwgaXNBcnJheShvcHRzLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0cy5maWx0ZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkUXVlcnlQcmVmaXg6IHR5cGVvZiBvcHRzLmFkZFF1ZXJ5UHJlZml4ID09PSAnYm9vbGVhbicgPyBvcHRzLmFkZFF1ZXJ5UHJlZml4IDogZGVmYXVsdHMuYWRkUXVlcnlQcmVmaXgsXG4gICAgICAgIGFsbG93RG90czogdHlwZW9mIG9wdHMuYWxsb3dEb3RzID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmFsbG93RG90cyA6ICEhb3B0cy5hbGxvd0RvdHMsXG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIGNoYXJzZXRTZW50aW5lbDogdHlwZW9mIG9wdHMuY2hhcnNldFNlbnRpbmVsID09PSAnYm9vbGVhbicgPyBvcHRzLmNoYXJzZXRTZW50aW5lbCA6IGRlZmF1bHRzLmNoYXJzZXRTZW50aW5lbCxcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZGVsaW1pdGVyIDogb3B0cy5kZWxpbWl0ZXIsXG4gICAgICAgIGVuY29kZTogdHlwZW9mIG9wdHMuZW5jb2RlID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZSA6IGRlZmF1bHRzLmVuY29kZSxcbiAgICAgICAgZW5jb2RlcjogdHlwZW9mIG9wdHMuZW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZW5jb2RlciA6IGRlZmF1bHRzLmVuY29kZXIsXG4gICAgICAgIGVuY29kZVZhbHVlc09ubHk6IHR5cGVvZiBvcHRzLmVuY29kZVZhbHVlc09ubHkgPT09ICdib29sZWFuJyA/IG9wdHMuZW5jb2RlVmFsdWVzT25seSA6IGRlZmF1bHRzLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgIGZpbHRlcjogZmlsdGVyLFxuICAgICAgICBmb3JtYXQ6IGZvcm1hdCxcbiAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsXG4gICAgICAgIHNlcmlhbGl6ZURhdGU6IHR5cGVvZiBvcHRzLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlLFxuICAgICAgICBza2lwTnVsbHM6IHR5cGVvZiBvcHRzLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHMsXG4gICAgICAgIHNvcnQ6IHR5cGVvZiBvcHRzLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNvcnQgOiBudWxsLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRzKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cyk7XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0cyAmJiBvcHRzLmFycmF5Rm9ybWF0IGluIGFycmF5UHJlZml4R2VuZXJhdG9ycykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuYXJyYXlGb3JtYXQ7XG4gICAgfSBlbHNlIGlmIChvcHRzICYmICdpbmRpY2VzJyBpbiBvcHRzKSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gb3B0cy5pbmRpY2VzID8gJ2luZGljZXMnIDogJ3JlcGVhdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSAnaW5kaWNlcyc7XG4gICAgfVxuXG4gICAgdmFyIGdlbmVyYXRlQXJyYXlQcmVmaXggPSBhcnJheVByZWZpeEdlbmVyYXRvcnNbYXJyYXlGb3JtYXRdO1xuICAgIGlmIChvcHRzICYmICdjb21tYVJvdW5kVHJpcCcgaW4gb3B0cyAmJiB0eXBlb2Ygb3B0cy5jb21tYVJvdW5kVHJpcCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Bjb21tYVJvdW5kVHJpcGAgbXVzdCBiZSBhIGJvb2xlYW4sIG9yIGFic2VudCcpO1xuICAgIH1cbiAgICB2YXIgY29tbWFSb3VuZFRyaXAgPSBnZW5lcmF0ZUFycmF5UHJlZml4ID09PSAnY29tbWEnICYmIG9wdHMgJiYgb3B0cy5jb21tYVJvdW5kVHJpcDtcblxuICAgIGlmICghb2JqS2V5cykge1xuICAgICAgICBvYmpLZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zb3J0KSB7XG4gICAgICAgIG9iaktleXMuc29ydChvcHRpb25zLnNvcnQpO1xuICAgIH1cblxuICAgIHZhciBzaWRlQ2hhbm5lbCA9IGdldFNpZGVDaGFubmVsKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2ldO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNraXBOdWxscyAmJiBvYmpba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaFRvQXJyYXkoa2V5cywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgb2JqW2tleV0sXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgY29tbWFSb3VuZFRyaXAsXG4gICAgICAgICAgICBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2tpcE51bGxzLFxuICAgICAgICAgICAgb3B0aW9ucy5lbmNvZGUgPyBvcHRpb25zLmVuY29kZXIgOiBudWxsLFxuICAgICAgICAgICAgb3B0aW9ucy5maWx0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLnNvcnQsXG4gICAgICAgICAgICBvcHRpb25zLmFsbG93RG90cyxcbiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0LFxuICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXR0ZXIsXG4gICAgICAgICAgICBvcHRpb25zLmVuY29kZVZhbHVlc09ubHksXG4gICAgICAgICAgICBvcHRpb25zLmNoYXJzZXQsXG4gICAgICAgICAgICBzaWRlQ2hhbm5lbFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKG9wdGlvbnMuZGVsaW1pdGVyKTtcbiAgICB2YXIgcHJlZml4ID0gb3B0aW9ucy5hZGRRdWVyeVByZWZpeCA9PT0gdHJ1ZSA/ICc/JyA6ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpLCB0aGUgXCJudW1lcmljIGVudGl0eVwiIHJlcHJlc2VudGF0aW9uIG9mIGEgY2hlY2ttYXJrXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0ImJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgnXHUyNzEzJylcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lRTIlOUMlOTMmJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGFsbG93UHJvdG90eXBlczogZmFsc2UsXG4gICAgYWxsb3dTcGFyc2U6IGZhbHNlLFxuICAgIGFycmF5TGltaXQ6IDIwLFxuICAgIGNoYXJzZXQ6ICd1dGYtOCcsXG4gICAgY2hhcnNldFNlbnRpbmVsOiBmYWxzZSxcbiAgICBjb21tYTogZmFsc2UsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiBmYWxzZSxcbiAgICBpbnRlcnByZXROdW1lcmljRW50aXRpZXM6IGZhbHNlLFxuICAgIHBhcmFtZXRlckxpbWl0OiAxMDAwLFxuICAgIHBhcnNlQXJyYXlzOiB0cnVlLFxuICAgIHBsYWluT2JqZWN0czogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGludGVycHJldE51bWVyaWNFbnRpdGllcyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYjKFxcZCspOy9nLCBmdW5jdGlvbiAoJDAsIG51bWJlclN0cikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChudW1iZXJTdHIsIDEwKSk7XG4gICAgfSk7XG59O1xuXG52YXIgcGFyc2VBcnJheVZhbHVlID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgb3B0aW9ucy5jb21tYSAmJiB2YWwuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBUaGlzIGlzIHdoYXQgYnJvd3NlcnMgd2lsbCBzdWJtaXQgd2hlbiB0aGUgXHUyNzEzIGNoYXJhY3RlciBvY2N1cnMgaW4gYW5cbi8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBib2R5IGFuZCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZ1xuLy8gdGhlIGZvcm0gaXMgaXNvLTg4NTktMSwgb3Igd2hlbiB0aGUgc3VibWl0dGVkIGZvcm0gaGFzIGFuIGFjY2VwdC1jaGFyc2V0XG4vLyBhdHRyaWJ1dGUgb2YgaXNvLTg4NTktMS4gUHJlc3VtYWJseSBhbHNvIHdpdGggb3RoZXIgY2hhcnNldHMgdGhhdCBkbyBub3QgY29udGFpblxuLy8gdGhlIFx1MjcxMyBjaGFyYWN0ZXIsIHN1Y2ggYXMgdXMtYXNjaWkuXG52YXIgaXNvU2VudGluZWwgPSAndXRmOD0lMjYlMjMxMDAwMyUzQic7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKVxuXG4vLyBUaGVzZSBhcmUgdGhlIHBlcmNlbnQtZW5jb2RlZCB1dGYtOCBvY3RldHMgcmVwcmVzZW50aW5nIGEgY2hlY2ttYXJrLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgYWN0dWFsbHkgaXMgdXRmLTggZW5jb2RlZC5cbnZhciBjaGFyc2V0U2VudGluZWwgPSAndXRmOD0lRTIlOUMlOTMnOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJ1x1MjcxMycpXG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIHZhciBjbGVhblN0ciA9IG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPyBzdHIucmVwbGFjZSgvXlxcPy8sICcnKSA6IHN0cjtcbiAgICB2YXIgbGltaXQgPSBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSBJbmZpbml0eSA/IHVuZGVmaW5lZCA6IG9wdGlvbnMucGFyYW1ldGVyTGltaXQ7XG4gICAgdmFyIHBhcnRzID0gY2xlYW5TdHIuc3BsaXQob3B0aW9ucy5kZWxpbWl0ZXIsIGxpbWl0KTtcbiAgICB2YXIgc2tpcEluZGV4ID0gLTE7IC8vIEtlZXAgdHJhY2sgb2Ygd2hlcmUgdGhlIHV0Zjggc2VudGluZWwgd2FzIGZvdW5kXG4gICAgdmFyIGk7XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdGlvbnMuY2hhcnNldDtcbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocGFydHNbaV0uaW5kZXhPZigndXRmOD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0c1tpXSA9PT0gY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAndXRmLTgnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydHNbaV0gPT09IGlzb1NlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAnaXNvLTg4NTktMSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXBJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgaSA9IHBhcnRzLmxlbmd0aDsgLy8gVGhlIGVzbGludCBzZXR0aW5ncyBkbyBub3QgYWxsb3cgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGkgPT09IHNraXBJbmRleCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcblxuICAgICAgICB2YXIgYnJhY2tldEVxdWFsc1BvcyA9IHBhcnQuaW5kZXhPZignXT0nKTtcbiAgICAgICAgdmFyIHBvcyA9IGJyYWNrZXRFcXVhbHNQb3MgPT09IC0xID8gcGFydC5pbmRleE9mKCc9JykgOiBicmFja2V0RXF1YWxzUG9zICsgMTtcblxuICAgICAgICB2YXIga2V5LCB2YWw7XG4gICAgICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydCwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCwgJ2tleScpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgPyBudWxsIDogJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydC5zbGljZSgwLCBwb3MpLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAna2V5Jyk7XG4gICAgICAgICAgICB2YWwgPSB1dGlscy5tYXliZU1hcChcbiAgICAgICAgICAgICAgICBwYXJzZUFycmF5VmFsdWUocGFydC5zbGljZShwb3MgKyAxKSwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVuY29kZWRWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZGVjb2RlcihlbmNvZGVkVmFsLCBkZWZhdWx0cy5kZWNvZGVyLCBjaGFyc2V0LCAndmFsdWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCAmJiBvcHRpb25zLmludGVycHJldE51bWVyaWNFbnRpdGllcyAmJiBjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIHZhbCA9IGludGVycHJldE51bWVyaWNFbnRpdGllcyh2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnQuaW5kZXhPZignW109JykgPiAtMSkge1xuICAgICAgICAgICAgdmFsID0gaXNBcnJheSh2YWwpID8gW3ZhbF0gOiB2YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzLmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmNvbWJpbmUob2JqW2tleV0sIHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgcGFyc2VPYmplY3QgPSBmdW5jdGlvbiAoY2hhaW4sIHZhbCwgb3B0aW9ucywgdmFsdWVzUGFyc2VkKSB7XG4gICAgdmFyIGxlYWYgPSB2YWx1ZXNQYXJzZWQgPyB2YWwgOiBwYXJzZUFycmF5VmFsdWUodmFsLCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIGkgPSBjaGFpbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgb2JqO1xuICAgICAgICB2YXIgcm9vdCA9IGNoYWluW2ldO1xuXG4gICAgICAgIGlmIChyb290ID09PSAnW10nICYmIG9wdGlvbnMucGFyc2VBcnJheXMpIHtcbiAgICAgICAgICAgIG9iaiA9IFtdLmNvbmNhdChsZWFmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgICAgICAgICAgdmFyIGNsZWFuUm9vdCA9IHJvb3QuY2hhckF0KDApID09PSAnWycgJiYgcm9vdC5jaGFyQXQocm9vdC5sZW5ndGggLSAxKSA9PT0gJ10nID8gcm9vdC5zbGljZSgxLCAtMSkgOiByb290O1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQoY2xlYW5Sb290LCAxMCk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMucGFyc2VBcnJheXMgJiYgY2xlYW5Sb290ID09PSAnJykge1xuICAgICAgICAgICAgICAgIG9iaiA9IHsgMDogbGVhZiB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgU3RyaW5nKGluZGV4KSA9PT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbGVhblJvb3QgIT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAgICAgICAgICAgb2JqW2NsZWFuUm9vdF0gPSBsZWFmO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGVhZiA9IG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gbGVhZjtcbn07XG5cbnZhciBwYXJzZUtleXMgPSBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nS2V5cyhnaXZlbktleSwgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpIHtcbiAgICBpZiAoIWdpdmVuS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2Zvcm0gZG90IG5vdGF0aW9uIHRvIGJyYWNrZXQgbm90YXRpb25cbiAgICB2YXIga2V5ID0gb3B0aW9ucy5hbGxvd0RvdHMgPyBnaXZlbktleS5yZXBsYWNlKC9cXC4oW14uW10rKS9nLCAnWyQxXScpIDogZ2l2ZW5LZXk7XG5cbiAgICAvLyBUaGUgcmVnZXggY2h1bmtzXG5cbiAgICB2YXIgYnJhY2tldHMgPSAvKFxcW1teW1xcXV0qXSkvO1xuICAgIHZhciBjaGlsZCA9IC8oXFxbW15bXFxdXSpdKS9nO1xuXG4gICAgLy8gR2V0IHRoZSBwYXJlbnRcblxuICAgIHZhciBzZWdtZW50ID0gb3B0aW9ucy5kZXB0aCA+IDAgJiYgYnJhY2tldHMuZXhlYyhrZXkpO1xuICAgIHZhciBwYXJlbnQgPSBzZWdtZW50ID8ga2V5LnNsaWNlKDAsIHNlZ21lbnQuaW5kZXgpIDoga2V5O1xuXG4gICAgLy8gU3Rhc2ggdGhlIHBhcmVudCBpZiBpdCBleGlzdHNcblxuICAgIHZhciBrZXlzID0gW107XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICAvLyBJZiB3ZSBhcmVuJ3QgdXNpbmcgcGxhaW4gb2JqZWN0cywgb3B0aW9uYWxseSBwcmVmaXgga2V5cyB0aGF0IHdvdWxkIG92ZXJ3cml0ZSBvYmplY3QgcHJvdG90eXBlIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBwYXJlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAga2V5cy5wdXNoKHBhcmVudCk7XG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGNoaWxkcmVuIGFwcGVuZGluZyB0byB0aGUgYXJyYXkgdW50aWwgd2UgaGl0IGRlcHRoXG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKG9wdGlvbnMuZGVwdGggPiAwICYmIChzZWdtZW50ID0gY2hpbGQuZXhlYyhrZXkpKSAhPT0gbnVsbCAmJiBpIDwgb3B0aW9ucy5kZXB0aCkge1xuICAgICAgICBpICs9IDE7XG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc2VnbWVudFsxXS5zbGljZSgxLCAtMSkpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleXMucHVzaChzZWdtZW50WzFdKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSdzIGEgcmVtYWluZGVyLCBqdXN0IGFkZCB3aGF0ZXZlciBpcyBsZWZ0XG5cbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBrZXlzLnB1c2goJ1snICsga2V5LnNsaWNlKHNlZ21lbnQuaW5kZXgpICsgJ10nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VPYmplY3Qoa2V5cywgdmFsLCBvcHRpb25zLCB2YWx1ZXNQYXJzZWQpO1xufTtcblxudmFyIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWNvZGVyICE9PSBudWxsICYmIG9wdHMuZGVjb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaGFyc2V0IG9wdGlvbiBtdXN0IGJlIGVpdGhlciB1dGYtOCwgaXNvLTg4NTktMSwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHZhciBjaGFyc2V0ID0gdHlwZW9mIG9wdHMuY2hhcnNldCA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5jaGFyc2V0IDogb3B0cy5jaGFyc2V0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dEb3RzOiB0eXBlb2Ygb3B0cy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuYWxsb3dEb3RzIDogISFvcHRzLmFsbG93RG90cyxcbiAgICAgICAgYWxsb3dQcm90b3R5cGVzOiB0eXBlb2Ygb3B0cy5hbGxvd1Byb3RvdHlwZXMgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dQcm90b3R5cGVzIDogZGVmYXVsdHMuYWxsb3dQcm90b3R5cGVzLFxuICAgICAgICBhbGxvd1NwYXJzZTogdHlwZW9mIG9wdHMuYWxsb3dTcGFyc2UgPT09ICdib29sZWFuJyA/IG9wdHMuYWxsb3dTcGFyc2UgOiBkZWZhdWx0cy5hbGxvd1NwYXJzZSxcbiAgICAgICAgYXJyYXlMaW1pdDogdHlwZW9mIG9wdHMuYXJyYXlMaW1pdCA9PT0gJ251bWJlcicgPyBvcHRzLmFycmF5TGltaXQgOiBkZWZhdWx0cy5hcnJheUxpbWl0LFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGNvbW1hOiB0eXBlb2Ygb3B0cy5jb21tYSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jb21tYSA6IGRlZmF1bHRzLmNvbW1hLFxuICAgICAgICBkZWNvZGVyOiB0eXBlb2Ygb3B0cy5kZWNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0cy5kZWNvZGVyIDogZGVmYXVsdHMuZGVjb2RlcixcbiAgICAgICAgZGVsaW1pdGVyOiB0eXBlb2Ygb3B0cy5kZWxpbWl0ZXIgPT09ICdzdHJpbmcnIHx8IHV0aWxzLmlzUmVnRXhwKG9wdHMuZGVsaW1pdGVyKSA/IG9wdHMuZGVsaW1pdGVyIDogZGVmYXVsdHMuZGVsaW1pdGVyLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW1wbGljaXQtY29lcmNpb24sIG5vLWV4dHJhLXBhcmVuc1xuICAgICAgICBkZXB0aDogKHR5cGVvZiBvcHRzLmRlcHRoID09PSAnbnVtYmVyJyB8fCBvcHRzLmRlcHRoID09PSBmYWxzZSkgPyArb3B0cy5kZXB0aCA6IGRlZmF1bHRzLmRlcHRoLFxuICAgICAgICBpZ25vcmVRdWVyeVByZWZpeDogb3B0cy5pZ25vcmVRdWVyeVByZWZpeCA9PT0gdHJ1ZSxcbiAgICAgICAgaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiB0eXBlb2Ygb3B0cy5pbnRlcnByZXROdW1lcmljRW50aXRpZXMgPT09ICdib29sZWFuJyA/IG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzIDogZGVmYXVsdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzLFxuICAgICAgICBwYXJhbWV0ZXJMaW1pdDogdHlwZW9mIG9wdHMucGFyYW1ldGVyTGltaXQgPT09ICdudW1iZXInID8gb3B0cy5wYXJhbWV0ZXJMaW1pdCA6IGRlZmF1bHRzLnBhcmFtZXRlckxpbWl0LFxuICAgICAgICBwYXJzZUFycmF5czogb3B0cy5wYXJzZUFycmF5cyAhPT0gZmFsc2UsXG4gICAgICAgIHBsYWluT2JqZWN0czogdHlwZW9mIG9wdHMucGxhaW5PYmplY3RzID09PSAnYm9vbGVhbicgPyBvcHRzLnBsYWluT2JqZWN0cyA6IGRlZmF1bHRzLnBsYWluT2JqZWN0cyxcbiAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nOiB0eXBlb2Ygb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgPT09ICdib29sZWFuJyA/IG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nIDogZGVmYXVsdHMuc3RyaWN0TnVsbEhhbmRsaW5nXG4gICAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuICAgIHZhciBvcHRpb25zID0gbm9ybWFsaXplUGFyc2VPcHRpb25zKG9wdHMpO1xuXG4gICAgaWYgKHN0ciA9PT0gJycgfHwgc3RyID09PSBudWxsIHx8IHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcE9iaiA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gcGFyc2VWYWx1ZXMoc3RyLCBvcHRpb25zKSA6IHN0cjtcbiAgICB2YXIgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGtleXMgYW5kIHNldHVwIHRoZSBuZXcgb2JqZWN0XG5cbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHRlbXBPYmopO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHBhcnNlS2V5cyhrZXksIHRlbXBPYmpba2V5XSwgb3B0aW9ucywgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycpO1xuICAgICAgICBvYmogPSB1dGlscy5tZXJnZShvYmosIG5ld09iaiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dTcGFyc2UgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMuY29tcGFjdChvYmopO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xudmFyIHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0czogZm9ybWF0cyxcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcbn07XG4iLCAiLyohXG4gKiBib2R5LXBhcnNlclxuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgYnl0ZXMgPSByZXF1aXJlKCdieXRlcycpXG52YXIgY29udGVudFR5cGUgPSByZXF1aXJlKCdjb250ZW50LXR5cGUnKVxudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnaHR0cC1lcnJvcnMnKVxudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYm9keS1wYXJzZXI6dXJsZW5jb2RlZCcpXG52YXIgZGVwcmVjYXRlID0gcmVxdWlyZSgnZGVwZCcpKCdib2R5LXBhcnNlcicpXG52YXIgcmVhZCA9IHJlcXVpcmUoJy4uL3JlYWQnKVxudmFyIHR5cGVpcyA9IHJlcXVpcmUoJ3R5cGUtaXMnKVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdXJsZW5jb2RlZFxuXG4vKipcbiAqIENhY2hlIG9mIHBhcnNlciBtb2R1bGVzLlxuICovXG5cbnZhciBwYXJzZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4vKipcbiAqIENyZWF0ZSBhIG1pZGRsZXdhcmUgdG8gcGFyc2UgdXJsZW5jb2RlZCBib2RpZXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gdXJsZW5jb2RlZCAob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge31cblxuICAvLyBub3RpY2UgYmVjYXVzZSBvcHRpb24gZGVmYXVsdCB3aWxsIGZsaXAgaW4gbmV4dCBtYWpvclxuICBpZiAob3B0cy5leHRlbmRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZGVwcmVjYXRlKCd1bmRlZmluZWQgZXh0ZW5kZWQ6IHByb3ZpZGUgZXh0ZW5kZWQgb3B0aW9uJylcbiAgfVxuXG4gIHZhciBleHRlbmRlZCA9IG9wdHMuZXh0ZW5kZWQgIT09IGZhbHNlXG4gIHZhciBpbmZsYXRlID0gb3B0cy5pbmZsYXRlICE9PSBmYWxzZVxuICB2YXIgbGltaXQgPSB0eXBlb2Ygb3B0cy5saW1pdCAhPT0gJ251bWJlcidcbiAgICA/IGJ5dGVzLnBhcnNlKG9wdHMubGltaXQgfHwgJzEwMGtiJylcbiAgICA6IG9wdHMubGltaXRcbiAgdmFyIHR5cGUgPSBvcHRzLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgdmFyIHZlcmlmeSA9IG9wdHMudmVyaWZ5IHx8IGZhbHNlXG5cbiAgaWYgKHZlcmlmeSAhPT0gZmFsc2UgJiYgdHlwZW9mIHZlcmlmeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiB2ZXJpZnkgbXVzdCBiZSBmdW5jdGlvbicpXG4gIH1cblxuICAvLyBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIHF1ZXJ5IHBhcnNlclxuICB2YXIgcXVlcnlwYXJzZSA9IGV4dGVuZGVkXG4gICAgPyBleHRlbmRlZHBhcnNlcihvcHRzKVxuICAgIDogc2ltcGxlcGFyc2VyKG9wdHMpXG5cbiAgLy8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9uXG4gIHZhciBzaG91bGRQYXJzZSA9IHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nXG4gICAgPyB0eXBlQ2hlY2tlcih0eXBlKVxuICAgIDogdHlwZVxuXG4gIGZ1bmN0aW9uIHBhcnNlIChib2R5KSB7XG4gICAgcmV0dXJuIGJvZHkubGVuZ3RoXG4gICAgICA/IHF1ZXJ5cGFyc2UoYm9keSlcbiAgICAgIDoge31cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiB1cmxlbmNvZGVkUGFyc2VyIChyZXEsIHJlcywgbmV4dCkge1xuICAgIGlmIChyZXEuX2JvZHkpIHtcbiAgICAgIGRlYnVnKCdib2R5IGFscmVhZHkgcGFyc2VkJylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgcmVxLmJvZHkgPSByZXEuYm9keSB8fCB7fVxuXG4gICAgLy8gc2tpcCByZXF1ZXN0cyB3aXRob3V0IGJvZGllc1xuICAgIGlmICghdHlwZWlzLmhhc0JvZHkocmVxKSkge1xuICAgICAgZGVidWcoJ3NraXAgZW1wdHkgYm9keScpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGRlYnVnKCdjb250ZW50LXR5cGUgJWonLCByZXEuaGVhZGVyc1snY29udGVudC10eXBlJ10pXG5cbiAgICAvLyBkZXRlcm1pbmUgaWYgcmVxdWVzdCBzaG91bGQgYmUgcGFyc2VkXG4gICAgaWYgKCFzaG91bGRQYXJzZShyZXEpKSB7XG4gICAgICBkZWJ1Zygnc2tpcCBwYXJzaW5nJylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gYXNzZXJ0IGNoYXJzZXRcbiAgICB2YXIgY2hhcnNldCA9IGdldENoYXJzZXQocmVxKSB8fCAndXRmLTgnXG4gICAgaWYgKGNoYXJzZXQgIT09ICd1dGYtOCcpIHtcbiAgICAgIGRlYnVnKCdpbnZhbGlkIGNoYXJzZXQnKVxuICAgICAgbmV4dChjcmVhdGVFcnJvcig0MTUsICd1bnN1cHBvcnRlZCBjaGFyc2V0IFwiJyArIGNoYXJzZXQudG9VcHBlckNhc2UoKSArICdcIicsIHtcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgdHlwZTogJ2NoYXJzZXQudW5zdXBwb3J0ZWQnXG4gICAgICB9KSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHJlYWRcbiAgICByZWFkKHJlcSwgcmVzLCBuZXh0LCBwYXJzZSwgZGVidWcsIHtcbiAgICAgIGRlYnVnOiBkZWJ1ZyxcbiAgICAgIGVuY29kaW5nOiBjaGFyc2V0LFxuICAgICAgaW5mbGF0ZTogaW5mbGF0ZSxcbiAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgIHZlcmlmeTogdmVyaWZ5XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgZXh0ZW5kZWQgcXVlcnkgcGFyc2VyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKi9cblxuZnVuY3Rpb24gZXh0ZW5kZWRwYXJzZXIgKG9wdGlvbnMpIHtcbiAgdmFyIHBhcmFtZXRlckxpbWl0ID0gb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCAhPT0gdW5kZWZpbmVkXG4gICAgPyBvcHRpb25zLnBhcmFtZXRlckxpbWl0XG4gICAgOiAxMDAwXG4gIHZhciBwYXJzZSA9IHBhcnNlcigncXMnKVxuXG4gIGlmIChpc05hTihwYXJhbWV0ZXJMaW1pdCkgfHwgcGFyYW1ldGVyTGltaXQgPCAxKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHBhcmFtZXRlckxpbWl0IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICB9XG5cbiAgaWYgKGlzRmluaXRlKHBhcmFtZXRlckxpbWl0KSkge1xuICAgIHBhcmFtZXRlckxpbWl0ID0gcGFyYW1ldGVyTGltaXQgfCAwXG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcXVlcnlwYXJzZSAoYm9keSkge1xuICAgIHZhciBwYXJhbUNvdW50ID0gcGFyYW1ldGVyQ291bnQoYm9keSwgcGFyYW1ldGVyTGltaXQpXG5cbiAgICBpZiAocGFyYW1Db3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWJ1ZygndG9vIG1hbnkgcGFyYW1ldGVycycpXG4gICAgICB0aHJvdyBjcmVhdGVFcnJvcig0MTMsICd0b28gbWFueSBwYXJhbWV0ZXJzJywge1xuICAgICAgICB0eXBlOiAncGFyYW1ldGVycy50b28ubWFueSdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdmFyIGFycmF5TGltaXQgPSBNYXRoLm1heCgxMDAsIHBhcmFtQ291bnQpXG5cbiAgICBkZWJ1ZygncGFyc2UgZXh0ZW5kZWQgdXJsZW5jb2RpbmcnKVxuICAgIHJldHVybiBwYXJzZShib2R5LCB7XG4gICAgICBhbGxvd1Byb3RvdHlwZXM6IHRydWUsXG4gICAgICBhcnJheUxpbWl0OiBhcnJheUxpbWl0LFxuICAgICAgZGVwdGg6IEluZmluaXR5LFxuICAgICAgcGFyYW1ldGVyTGltaXQ6IHBhcmFtZXRlckxpbWl0XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgY2hhcnNldCBvZiBhIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlcVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0Q2hhcnNldCAocmVxKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChjb250ZW50VHlwZS5wYXJzZShyZXEpLnBhcmFtZXRlcnMuY2hhcnNldCB8fCAnJykudG9Mb3dlckNhc2UoKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzLCBzdG9wcGluZyBvbmNlIGxpbWl0IHJlYWNoZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9keVxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJhbWV0ZXJDb3VudCAoYm9keSwgbGltaXQpIHtcbiAgdmFyIGNvdW50ID0gMFxuICB2YXIgaW5kZXggPSAwXG5cbiAgd2hpbGUgKChpbmRleCA9IGJvZHkuaW5kZXhPZignJicsIGluZGV4KSkgIT09IC0xKSB7XG4gICAgY291bnQrK1xuICAgIGluZGV4KytcblxuICAgIGlmIChjb3VudCA9PT0gbGltaXQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY291bnRcbn1cblxuLyoqXG4gKiBHZXQgcGFyc2VyIGZvciBtb2R1bGUgbmFtZSBkeW5hbWljYWxseS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZXIgKG5hbWUpIHtcbiAgdmFyIG1vZCA9IHBhcnNlcnNbbmFtZV1cblxuICBpZiAobW9kICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbW9kLnBhcnNlXG4gIH1cblxuICAvLyB0aGlzIHVzZXMgYSBzd2l0Y2ggZm9yIHN0YXRpYyByZXF1aXJlIGFuYWx5c2lzXG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ3FzJzpcbiAgICAgIG1vZCA9IHJlcXVpcmUoJ3FzJylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAncXVlcnlzdHJpbmcnOlxuICAgICAgbW9kID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKVxuICAgICAgYnJlYWtcbiAgfVxuXG4gIC8vIHN0b3JlIHRvIHByZXZlbnQgaW52b2tpbmcgcmVxdWlyZSgpXG4gIHBhcnNlcnNbbmFtZV0gPSBtb2RcblxuICByZXR1cm4gbW9kLnBhcnNlXG59XG5cbi8qKlxuICogR2V0IHRoZSBzaW1wbGUgcXVlcnkgcGFyc2VyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKi9cblxuZnVuY3Rpb24gc2ltcGxlcGFyc2VyIChvcHRpb25zKSB7XG4gIHZhciBwYXJhbWV0ZXJMaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdFxuICAgIDogMTAwMFxuICB2YXIgcGFyc2UgPSBwYXJzZXIoJ3F1ZXJ5c3RyaW5nJylcblxuICBpZiAoaXNOYU4ocGFyYW1ldGVyTGltaXQpIHx8IHBhcmFtZXRlckxpbWl0IDwgMSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBwYXJhbWV0ZXJMaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgfVxuXG4gIGlmIChpc0Zpbml0ZShwYXJhbWV0ZXJMaW1pdCkpIHtcbiAgICBwYXJhbWV0ZXJMaW1pdCA9IHBhcmFtZXRlckxpbWl0IHwgMFxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHF1ZXJ5cGFyc2UgKGJvZHkpIHtcbiAgICB2YXIgcGFyYW1Db3VudCA9IHBhcmFtZXRlckNvdW50KGJvZHksIHBhcmFtZXRlckxpbWl0KVxuXG4gICAgaWYgKHBhcmFtQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVidWcoJ3RvbyBtYW55IHBhcmFtZXRlcnMnKVxuICAgICAgdGhyb3cgY3JlYXRlRXJyb3IoNDEzLCAndG9vIG1hbnkgcGFyYW1ldGVycycsIHtcbiAgICAgICAgdHlwZTogJ3BhcmFtZXRlcnMudG9vLm1hbnknXG4gICAgICB9KVxuICAgIH1cblxuICAgIGRlYnVnKCdwYXJzZSB1cmxlbmNvZGluZycpXG4gICAgcmV0dXJuIHBhcnNlKGJvZHksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7IG1heEtleXM6IHBhcmFtZXRlckxpbWl0IH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNpbXBsZSB0eXBlIGNoZWNrZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICovXG5cbmZ1bmN0aW9uIHR5cGVDaGVja2VyICh0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjaGVja1R5cGUgKHJlcSkge1xuICAgIHJldHVybiBCb29sZWFuKHR5cGVpcyhyZXEsIHR5cGUpKVxuICB9XG59XG4iLCAiLyohXG4gKiBib2R5LXBhcnNlclxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnYm9keS1wYXJzZXInKVxuXG4vKipcbiAqIENhY2hlIG9mIGxvYWRlZCBwYXJzZXJzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgcGFyc2VycyA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuLyoqXG4gKiBAdHlwZWRlZiBQYXJzZXJzXG4gKiBAdHlwZSB7ZnVuY3Rpb259XG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBqc29uXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByYXdcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHRleHRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHVybGVuY29kZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHR5cGUge1BhcnNlcnN9XG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGJvZHlQYXJzZXIsXG4gICdib2R5UGFyc2VyOiB1c2UgaW5kaXZpZHVhbCBqc29uL3VybGVuY29kZWQgbWlkZGxld2FyZXMnKVxuXG4vKipcbiAqIEpTT04gcGFyc2VyLlxuICogQHB1YmxpY1xuICovXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnanNvbicsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGNyZWF0ZVBhcnNlckdldHRlcignanNvbicpXG59KVxuXG4vKipcbiAqIFJhdyBwYXJzZXIuXG4gKiBAcHVibGljXG4gKi9cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdyYXcnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBjcmVhdGVQYXJzZXJHZXR0ZXIoJ3JhdycpXG59KVxuXG4vKipcbiAqIFRleHQgcGFyc2VyLlxuICogQHB1YmxpY1xuICovXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAndGV4dCcsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGNyZWF0ZVBhcnNlckdldHRlcigndGV4dCcpXG59KVxuXG4vKipcbiAqIFVSTC1lbmNvZGVkIHBhcnNlci5cbiAqIEBwdWJsaWNcbiAqL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ3VybGVuY29kZWQnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBjcmVhdGVQYXJzZXJHZXR0ZXIoJ3VybGVuY29kZWQnKVxufSlcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIGpzb24gYW5kIHVybGVuY29kZWQgYm9kaWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQGRlcHJlY2F0ZWRcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBib2R5UGFyc2VyIChvcHRpb25zKSB7XG4gIC8vIHVzZSBkZWZhdWx0IHR5cGUgZm9yIHBhcnNlcnNcbiAgdmFyIG9wdHMgPSBPYmplY3QuY3JlYXRlKG9wdGlvbnMgfHwgbnVsbCwge1xuICAgIHR5cGU6IHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9XG4gIH0pXG5cbiAgdmFyIF91cmxlbmNvZGVkID0gZXhwb3J0cy51cmxlbmNvZGVkKG9wdHMpXG4gIHZhciBfanNvbiA9IGV4cG9ydHMuanNvbihvcHRzKVxuXG4gIHJldHVybiBmdW5jdGlvbiBib2R5UGFyc2VyIChyZXEsIHJlcywgbmV4dCkge1xuICAgIF9qc29uKHJlcSwgcmVzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICBfdXJsZW5jb2RlZChyZXEsIHJlcywgbmV4dClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZ2V0dGVyIGZvciBsb2FkaW5nIGEgcGFyc2VyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVQYXJzZXJHZXR0ZXIgKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldCAoKSB7XG4gICAgcmV0dXJuIGxvYWRQYXJzZXIobmFtZSlcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYSBwYXJzZXIgbW9kdWxlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkUGFyc2VyIChwYXJzZXJOYW1lKSB7XG4gIHZhciBwYXJzZXIgPSBwYXJzZXJzW3BhcnNlck5hbWVdXG5cbiAgaWYgKHBhcnNlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgLy8gdGhpcyB1c2VzIGEgc3dpdGNoIGZvciBzdGF0aWMgcmVxdWlyZSBhbmFseXNpc1xuICBzd2l0Y2ggKHBhcnNlck5hbWUpIHtcbiAgICBjYXNlICdqc29uJzpcbiAgICAgIHBhcnNlciA9IHJlcXVpcmUoJy4vbGliL3R5cGVzL2pzb24nKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdyYXcnOlxuICAgICAgcGFyc2VyID0gcmVxdWlyZSgnLi9saWIvdHlwZXMvcmF3JylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAndGV4dCc6XG4gICAgICBwYXJzZXIgPSByZXF1aXJlKCcuL2xpYi90eXBlcy90ZXh0JylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAndXJsZW5jb2RlZCc6XG4gICAgICBwYXJzZXIgPSByZXF1aXJlKCcuL2xpYi90eXBlcy91cmxlbmNvZGVkJylcbiAgICAgIGJyZWFrXG4gIH1cblxuICAvLyBzdG9yZSB0byBwcmV2ZW50IGludm9raW5nIHJlcXVpcmUoKVxuICByZXR1cm4gKHBhcnNlcnNbcGFyc2VyTmFtZV0gPSBwYXJzZXIpXG59XG4iLCAiLyohXG4gKiBtZXJnZS1kZXNjcmlwdG9yc1xuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZVxuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuLyoqXG4gKiBNZXJnZSB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgb2YgYHNyY2AgaW50byBgZGVzdGBcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGVzdCBPYmplY3QgdG8gYWRkIGRlc2NyaXB0b3JzIHRvXG4gKiBAcGFyYW0ge29iamVjdH0gc3JjIE9iamVjdCB0byBjbG9uZSBkZXNjcmlwdG9ycyBmcm9tXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyZWRlZmluZT10cnVlXSBSZWRlZmluZSBgZGVzdGAgcHJvcGVydGllcyB3aXRoIGBzcmNgIHByb3BlcnRpZXNcbiAqIEByZXR1cm5zIHtvYmplY3R9IFJlZmVyZW5jZSB0byBkZXN0XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gbWVyZ2UoZGVzdCwgc3JjLCByZWRlZmluZSkge1xuICBpZiAoIWRlc3QpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBkZXN0IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIGlmICghc3JjKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3JjIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIGlmIChyZWRlZmluZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gRGVmYXVsdCB0byB0cnVlXG4gICAgcmVkZWZpbmUgPSB0cnVlXG4gIH1cblxuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzcmMpLmZvckVhY2goZnVuY3Rpb24gZm9yRWFjaE93blByb3BlcnR5TmFtZShuYW1lKSB7XG4gICAgaWYgKCFyZWRlZmluZSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRlc3QsIG5hbWUpKSB7XG4gICAgICAvLyBTa2lwIGRlc3JpcHRvclxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ29weSBkZXNjcmlwdG9yXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNyYywgbmFtZSlcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVzdCwgbmFtZSwgZGVzY3JpcHRvcilcbiAgfSlcblxuICByZXR1cm4gZGVzdFxufVxuIiwgIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbCkgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigoPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIGlmIChtcyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtcyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICByZXR1cm4gcGx1cmFsKG1zLCBkLCAnZGF5JykgfHxcbiAgICBwbHVyYWwobXMsIGgsICdob3VyJykgfHxcbiAgICBwbHVyYWwobXMsIG0sICdtaW51dGUnKSB8fFxuICAgIHBsdXJhbChtcywgcywgJ3NlY29uZCcpIHx8XG4gICAgbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG4sIG5hbWUpIHtcbiAgaWYgKG1zIDwgbikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAobXMgPCBuICogMS41KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IobXMgLyBuKSArICcgJyArIG5hbWU7XG4gIH1cbiAgcmV0dXJuIE1hdGguY2VpbChtcyAvIG4pICsgJyAnICsgbmFtZSArICdzJztcbn1cbiIsICJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gY3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Z1snZGVmYXVsdCddID0gY3JlYXRlRGVidWc7XG5leHBvcnRzLmNvZXJjZSA9IGNvZXJjZTtcbmV4cG9ydHMuZGlzYWJsZSA9IGRpc2FibGU7XG5leHBvcnRzLmVuYWJsZSA9IGVuYWJsZTtcbmV4cG9ydHMuZW5hYmxlZCA9IGVuYWJsZWQ7XG5leHBvcnRzLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblxuLyoqXG4gKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cbiAqL1xuXG5leHBvcnRzLm5hbWVzID0gW107XG5leHBvcnRzLnNraXBzID0gW107XG5cbi8qKlxuICogTWFwIG9mIHNwZWNpYWwgXCIlblwiIGhhbmRsaW5nIGZ1bmN0aW9ucywgZm9yIHRoZSBkZWJ1ZyBcImZvcm1hdFwiIGFyZ3VtZW50LlxuICpcbiAqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMgPSB7fTtcblxuLyoqXG4gKiBQcmV2aW91cyBsb2cgdGltZXN0YW1wLlxuICovXG5cbnZhciBwcmV2VGltZTtcblxuLyoqXG4gKiBTZWxlY3QgYSBjb2xvci5cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNlbGVjdENvbG9yKG5hbWVzcGFjZSkge1xuICB2YXIgaGFzaCA9IDAsIGk7XG5cbiAgZm9yIChpIGluIG5hbWVzcGFjZSkge1xuICAgIGhhc2ggID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBuYW1lc3BhY2UuY2hhckNvZGVBdChpKTtcbiAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG5cbiAgcmV0dXJuIGV4cG9ydHMuY29sb3JzW01hdGguYWJzKGhhc2gpICUgZXhwb3J0cy5jb2xvcnMubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGVidWcobmFtZXNwYWNlKSB7XG5cbiAgZnVuY3Rpb24gZGVidWcoKSB7XG4gICAgLy8gZGlzYWJsZWQ/XG4gICAgaWYgKCFkZWJ1Zy5lbmFibGVkKSByZXR1cm47XG5cbiAgICB2YXIgc2VsZiA9IGRlYnVnO1xuXG4gICAgLy8gc2V0IGBkaWZmYCB0aW1lc3RhbXBcbiAgICB2YXIgY3VyciA9ICtuZXcgRGF0ZSgpO1xuICAgIHZhciBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG4gICAgc2VsZi5kaWZmID0gbXM7XG4gICAgc2VsZi5wcmV2ID0gcHJldlRpbWU7XG4gICAgc2VsZi5jdXJyID0gY3VycjtcbiAgICBwcmV2VGltZSA9IGN1cnI7XG5cbiAgICAvLyB0dXJuIHRoZSBgYXJndW1lbnRzYCBpbnRvIGEgcHJvcGVyIEFycmF5XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cblxuICAgIGFyZ3NbMF0gPSBleHBvcnRzLmNvZXJjZShhcmdzWzBdKTtcblxuICAgIGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIGFyZ3NbMF0pIHtcbiAgICAgIC8vIGFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG4gICAgICBhcmdzLnVuc2hpZnQoJyVPJyk7XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCBmdW5jdGlvbihtYXRjaCwgZm9ybWF0KSB7XG4gICAgICAvLyBpZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG4gICAgICBpZiAobWF0Y2ggPT09ICclJScpIHJldHVybiBtYXRjaDtcbiAgICAgIGluZGV4Kys7XG4gICAgICB2YXIgZm9ybWF0dGVyID0gZXhwb3J0cy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG4gICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGZvcm1hdHRlcikge1xuICAgICAgICB2YXIgdmFsID0gYXJnc1tpbmRleF07XG4gICAgICAgIG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuICAgICAgICAvLyBub3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG4gICAgICAgIGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcblxuICAgIC8vIGFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG4gICAgZXhwb3J0cy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cbiAgICB2YXIgbG9nRm4gPSBkZWJ1Zy5sb2cgfHwgZXhwb3J0cy5sb2cgfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKTtcbiAgICBsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgfVxuXG4gIGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgZGVidWcuZW5hYmxlZCA9IGV4cG9ydHMuZW5hYmxlZChuYW1lc3BhY2UpO1xuICBkZWJ1Zy51c2VDb2xvcnMgPSBleHBvcnRzLnVzZUNvbG9ycygpO1xuICBkZWJ1Zy5jb2xvciA9IHNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cbiAgLy8gZW52LXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciBkZWJ1ZyBpbnN0YW5jZXNcbiAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBleHBvcnRzLmluaXQpIHtcbiAgICBleHBvcnRzLmluaXQoZGVidWcpO1xuICB9XG5cbiAgcmV0dXJuIGRlYnVnO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcbiAqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcbiAgZXhwb3J0cy5zYXZlKG5hbWVzcGFjZXMpO1xuXG4gIGV4cG9ydHMubmFtZXMgPSBbXTtcbiAgZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4gIHZhciBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG4gIHZhciBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGlmICghc3BsaXRbaV0pIGNvbnRpbnVlOyAvLyBpZ25vcmUgZW1wdHkgc3RyaW5nc1xuICAgIG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuICAgIGlmIChuYW1lc3BhY2VzWzBdID09PSAnLScpIHtcbiAgICAgIGV4cG9ydHMuc2tpcHMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMuc3Vic3RyKDEpICsgJyQnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gIGV4cG9ydHMuZW5hYmxlKCcnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuICB2YXIgaSwgbGVuO1xuICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGV4cG9ydHMuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBmb3IgKGkgPSAwLCBsZW4gPSBleHBvcnRzLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGV4cG9ydHMubmFtZXNbaV0udGVzdChuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYHZhbGAuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gdmFsXG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuICByZXR1cm4gdmFsO1xufVxuIiwgIi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZVxuICAgICAgICAgICAgICAgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZS5zdG9yYWdlXG4gICAgICAgICAgICAgICAgICA/IGNocm9tZS5zdG9yYWdlLmxvY2FsXG4gICAgICAgICAgICAgICAgICA6IGxvY2Fsc3RvcmFnZSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcbiAgJ2xpZ2h0c2VhZ3JlZW4nLFxuICAnZm9yZXN0Z3JlZW4nLFxuICAnZ29sZGVucm9kJyxcbiAgJ2RvZGdlcmJsdWUnLFxuICAnZGFya29yY2hpZCcsXG4gICdjcmltc29uJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG4gIC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcbiAgLy8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2VcbiAgLy8gZXhwbGljaXRseVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgd2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gaXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcbiAgLy8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcbiAgcmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG4gICAgLy8gaXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG4gICAgLy8gaXMgZmlyZWZveCA+PSB2MzE/XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG4gICAgLy8gZG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24odikge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVyci5tZXNzYWdlO1xuICB9XG59O1xuXG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG4gIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuICBhcmdzWzBdID0gKHVzZUNvbG9ycyA/ICclYycgOiAnJylcbiAgICArIHRoaXMubmFtZXNwYWNlXG4gICAgKyAodXNlQ29sb3JzID8gJyAlYycgOiAnICcpXG4gICAgKyBhcmdzWzBdXG4gICAgKyAodXNlQ29sb3JzID8gJyVjICcgOiAnICcpXG4gICAgKyAnKycgKyBleHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHJldHVybjtcblxuICB2YXIgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG4gIGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpXG5cbiAgLy8gdGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcbiAgLy8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuICAvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxhc3RDID0gMDtcbiAgYXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgaWYgKCclJScgPT09IG1hdGNoKSByZXR1cm47XG4gICAgaW5kZXgrKztcbiAgICBpZiAoJyVjJyA9PT0gbWF0Y2gpIHtcbiAgICAgIC8vIHdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuICAgICAgLy8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcbiAgICAgIGxhc3RDID0gaW5kZXg7XG4gICAgfVxuICB9KTtcblxuICBhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5sb2coKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmxvZ2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gbG9nKCkge1xuICAvLyB0aGlzIGhhY2tlcnkgaXMgcmVxdWlyZWQgZm9yIElFOC85LCB3aGVyZVxuICAvLyB0aGUgYGNvbnNvbGUubG9nYCBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgJ2FwcGx5J1xuICByZXR1cm4gJ29iamVjdCcgPT09IHR5cGVvZiBjb25zb2xlXG4gICAgJiYgY29uc29sZS5sb2dcbiAgICAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmxvZywgY29uc29sZSwgYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG4gIHRyeSB7XG4gICAgaWYgKG51bGwgPT0gbmFtZXNwYWNlcykge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZyA9IG5hbWVzcGFjZXM7XG4gICAgfVxuICB9IGNhdGNoKGUpIHt9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcbiAgdmFyIHI7XG4gIHRyeSB7XG4gICAgciA9IGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZztcbiAgfSBjYXRjaChlKSB7fVxuXG4gIC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcbiAgaWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG4gICAgciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuICB9XG5cbiAgcmV0dXJuIHI7XG59XG5cbi8qKlxuICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBsb2NhbFN0b3JhZ2UuZGVidWdgIGluaXRpYWxseS5cbiAqL1xuXG5leHBvcnRzLmVuYWJsZShsb2FkKCkpO1xuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgfSBjYXRjaCAoZSkge31cbn1cbiIsICIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIHR0eSA9IHJlcXVpcmUoJ3R0eScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGVidWcnKTtcbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFs2LCAyLCAzLCA0LCA1LCAxXTtcblxuLyoqXG4gKiBCdWlsZCB1cCB0aGUgZGVmYXVsdCBgaW5zcGVjdE9wdHNgIG9iamVjdCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogICAkIERFQlVHX0NPTE9SUz1ubyBERUJVR19ERVBUSD0xMCBERUJVR19TSE9XX0hJRERFTj1lbmFibGVkIG5vZGUgc2NyaXB0LmpzXG4gKi9cblxuZXhwb3J0cy5pbnNwZWN0T3B0cyA9IE9iamVjdC5rZXlzKHByb2Nlc3MuZW52KS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gL15kZWJ1Z18vaS50ZXN0KGtleSk7XG59KS5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwga2V5KSB7XG4gIC8vIGNhbWVsLWNhc2VcbiAgdmFyIHByb3AgPSBrZXlcbiAgICAuc3Vic3RyaW5nKDYpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXyhbYS16XSkvZywgZnVuY3Rpb24gKF8sIGspIHsgcmV0dXJuIGsudG9VcHBlckNhc2UoKSB9KTtcblxuICAvLyBjb2VyY2Ugc3RyaW5nIHZhbHVlIGludG8gSlMgdmFsdWVcbiAgdmFyIHZhbCA9IHByb2Nlc3MuZW52W2tleV07XG4gIGlmICgvXih5ZXN8b258dHJ1ZXxlbmFibGVkKSQvaS50ZXN0KHZhbCkpIHZhbCA9IHRydWU7XG4gIGVsc2UgaWYgKC9eKG5vfG9mZnxmYWxzZXxkaXNhYmxlZCkkL2kudGVzdCh2YWwpKSB2YWwgPSBmYWxzZTtcbiAgZWxzZSBpZiAodmFsID09PSAnbnVsbCcpIHZhbCA9IG51bGw7XG4gIGVsc2UgdmFsID0gTnVtYmVyKHZhbCk7XG5cbiAgb2JqW3Byb3BdID0gdmFsO1xuICByZXR1cm4gb2JqO1xufSwge30pO1xuXG4vKipcbiAqIFRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgdGhlIGBkZWJ1ZygpYCBjYWxscyB0by5cbiAqIFNldCB0aGUgYERFQlVHX0ZEYCBlbnYgdmFyaWFibGUgdG8gb3ZlcnJpZGUgd2l0aCBhbm90aGVyIHZhbHVlLiBpLmUuOlxuICpcbiAqICAgJCBERUJVR19GRD0zIG5vZGUgc2NyaXB0LmpzIDM+ZGVidWcubG9nXG4gKi9cblxudmFyIGZkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuREVCVUdfRkQsIDEwKSB8fCAyO1xuXG5pZiAoMSAhPT0gZmQgJiYgMiAhPT0gZmQpIHtcbiAgdXRpbC5kZXByZWNhdGUoZnVuY3Rpb24oKXt9LCAnZXhjZXB0IGZvciBzdGRlcnIoMikgYW5kIHN0ZG91dCgxKSwgYW55IG90aGVyIHVzYWdlIG9mIERFQlVHX0ZEIGlzIGRlcHJlY2F0ZWQuIE92ZXJyaWRlIGRlYnVnLmxvZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbG9nIGZ1bmN0aW9uIChodHRwczovL2dpdC5pby9kZWJ1Z19mZCknKSgpXG59XG5cbnZhciBzdHJlYW0gPSAxID09PSBmZCA/IHByb2Nlc3Muc3Rkb3V0IDpcbiAgICAgICAgICAgICAyID09PSBmZCA/IHByb2Nlc3Muc3RkZXJyIDpcbiAgICAgICAgICAgICBjcmVhdGVXcml0YWJsZVN0ZGlvU3RyZWFtKGZkKTtcblxuLyoqXG4gKiBJcyBzdGRvdXQgYSBUVFk/IENvbG9yZWQgb3V0cHV0IGlzIGVuYWJsZWQgd2hlbiBgdHJ1ZWAuXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuICByZXR1cm4gJ2NvbG9ycycgaW4gZXhwb3J0cy5pbnNwZWN0T3B0c1xuICAgID8gQm9vbGVhbihleHBvcnRzLmluc3BlY3RPcHRzLmNvbG9ycylcbiAgICA6IHR0eS5pc2F0dHkoZmQpO1xufVxuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGwgb24gYSBzaW5nbGUgbGluZS5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMubyA9IGZ1bmN0aW9uKHYpIHtcbiAgdGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcbiAgcmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKVxuICAgIC5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKHN0cikge1xuICAgICAgcmV0dXJuIHN0ci50cmltKClcbiAgICB9KS5qb2luKCcgJyk7XG59O1xuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGxvd2luZyBtdWx0aXBsZSBsaW5lcyBpZiBuZWVkZWQuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLk8gPSBmdW5jdGlvbih2KSB7XG4gIHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG4gIHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cyk7XG59O1xuXG4vKipcbiAqIEFkZHMgQU5TSSBjb2xvciBlc2NhcGUgY29kZXMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuICB2YXIgbmFtZSA9IHRoaXMubmFtZXNwYWNlO1xuICB2YXIgdXNlQ29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cbiAgaWYgKHVzZUNvbG9ycykge1xuICAgIHZhciBjID0gdGhpcy5jb2xvcjtcbiAgICB2YXIgcHJlZml4ID0gJyAgXFx1MDAxYlszJyArIGMgKyAnOzFtJyArIG5hbWUgKyAnICcgKyAnXFx1MDAxYlswbSc7XG5cbiAgICBhcmdzWzBdID0gcHJlZml4ICsgYXJnc1swXS5zcGxpdCgnXFxuJykuam9pbignXFxuJyArIHByZWZpeCk7XG4gICAgYXJncy5wdXNoKCdcXHUwMDFiWzMnICsgYyArICdtKycgKyBleHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZikgKyAnXFx1MDAxYlswbScpO1xuICB9IGVsc2Uge1xuICAgIGFyZ3NbMF0gPSBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKClcbiAgICAgICsgJyAnICsgbmFtZSArICcgJyArIGFyZ3NbMF07XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2VzIGB1dGlsLmZvcm1hdCgpYCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCB3cml0ZXMgdG8gYHN0cmVhbWAuXG4gKi9cblxuZnVuY3Rpb24gbG9nKCkge1xuICByZXR1cm4gc3RyZWFtLndyaXRlKHV0aWwuZm9ybWF0LmFwcGx5KHV0aWwsIGFyZ3VtZW50cykgKyAnXFxuJyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICBpZiAobnVsbCA9PSBuYW1lc3BhY2VzKSB7XG4gICAgLy8gSWYgeW91IHNldCBhIHByb2Nlc3MuZW52IGZpZWxkIHRvIG51bGwgb3IgdW5kZWZpbmVkLCBpdCBnZXRzIGNhc3QgdG8gdGhlXG4gICAgLy8gc3RyaW5nICdudWxsJyBvciAndW5kZWZpbmVkJy4gSnVzdCBkZWxldGUgaW5zdGVhZC5cbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuREVCVUc7XG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5lbnYuREVCVUcgPSBuYW1lc3BhY2VzO1xuICB9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LkRFQlVHO1xufVxuXG4vKipcbiAqIENvcGllZCBmcm9tIGBub2RlL3NyYy9ub2RlLmpzYC5cbiAqXG4gKiBYWFg6IEl0J3MgbGFtZSB0aGF0IG5vZGUgZG9lc24ndCBleHBvc2UgdGhpcyBBUEkgb3V0LW9mLXRoZS1ib3guIEl0IGFsc29cbiAqIHJlbGllcyBvbiB0aGUgdW5kb2N1bWVudGVkIGB0dHlfd3JhcC5ndWVzc0hhbmRsZVR5cGUoKWAgd2hpY2ggaXMgYWxzbyBsYW1lLlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVdyaXRhYmxlU3RkaW9TdHJlYW0gKGZkKSB7XG4gIHZhciBzdHJlYW07XG4gIHZhciB0dHlfd3JhcCA9IHByb2Nlc3MuYmluZGluZygndHR5X3dyYXAnKTtcblxuICAvLyBOb3RlIHN0cmVhbS5fdHlwZSBpcyB1c2VkIGZvciB0ZXN0LW1vZHVsZS1sb2FkLWxpc3QuanNcblxuICBzd2l0Y2ggKHR0eV93cmFwLmd1ZXNzSGFuZGxlVHlwZShmZCkpIHtcbiAgICBjYXNlICdUVFknOlxuICAgICAgc3RyZWFtID0gbmV3IHR0eS5Xcml0ZVN0cmVhbShmZCk7XG4gICAgICBzdHJlYW0uX3R5cGUgPSAndHR5JztcblxuICAgICAgLy8gSGFjayB0byBoYXZlIHN0cmVhbSBub3Qga2VlcCB0aGUgZXZlbnQgbG9vcCBhbGl2ZS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzE3MjZcbiAgICAgIGlmIChzdHJlYW0uX2hhbmRsZSAmJiBzdHJlYW0uX2hhbmRsZS51bnJlZikge1xuICAgICAgICBzdHJlYW0uX2hhbmRsZS51bnJlZigpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdGSUxFJzpcbiAgICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gICAgICBzdHJlYW0gPSBuZXcgZnMuU3luY1dyaXRlU3RyZWFtKGZkLCB7IGF1dG9DbG9zZTogZmFsc2UgfSk7XG4gICAgICBzdHJlYW0uX3R5cGUgPSAnZnMnO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdQSVBFJzpcbiAgICBjYXNlICdUQ1AnOlxuICAgICAgdmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpO1xuICAgICAgc3RyZWFtID0gbmV3IG5ldC5Tb2NrZXQoe1xuICAgICAgICBmZDogZmQsXG4gICAgICAgIHJlYWRhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICAvLyBGSVhNRSBTaG91bGQgcHJvYmFibHkgaGF2ZSBhbiBvcHRpb24gaW4gbmV0LlNvY2tldCB0byBjcmVhdGUgYVxuICAgICAgLy8gc3RyZWFtIGZyb20gYW4gZXhpc3RpbmcgZmQgd2hpY2ggaXMgd3JpdGFibGUgb25seS4gQnV0IGZvciBub3dcbiAgICAgIC8vIHdlJ2xsIGp1c3QgYWRkIHRoaXMgaGFjayBhbmQgc2V0IHRoZSBgcmVhZGFibGVgIG1lbWJlciB0byBmYWxzZS5cbiAgICAgIC8vIFRlc3Q6IC4vbm9kZSB0ZXN0L2ZpeHR1cmVzL2VjaG8uanMgPCAvZXRjL3Bhc3N3ZFxuICAgICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBzdHJlYW0ucmVhZCA9IG51bGw7XG4gICAgICBzdHJlYW0uX3R5cGUgPSAncGlwZSc7XG5cbiAgICAgIC8vIEZJWE1FIEhhY2sgdG8gaGF2ZSBzdHJlYW0gbm90IGtlZXAgdGhlIGV2ZW50IGxvb3AgYWxpdmUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzI2XG4gICAgICBpZiAoc3RyZWFtLl9oYW5kbGUgJiYgc3RyZWFtLl9oYW5kbGUudW5yZWYpIHtcbiAgICAgICAgc3RyZWFtLl9oYW5kbGUudW5yZWYoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIFByb2JhYmx5IGFuIGVycm9yIG9uIGluIHV2X2d1ZXNzX2hhbmRsZSgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltcGxlbWVudCBtZS4gVW5rbm93biBzdHJlYW0gZmlsZSB0eXBlIScpO1xuICB9XG5cbiAgLy8gRm9yIHN1cHBvcnRpbmcgbGVnYWN5IEFQSSB3ZSBwdXQgdGhlIEZEIGhlcmUuXG4gIHN0cmVhbS5mZCA9IGZkO1xuXG4gIHN0cmVhbS5faXNTdGRpbyA9IHRydWU7XG5cbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuLyoqXG4gKiBJbml0IGxvZ2ljIGZvciBgZGVidWdgIGluc3RhbmNlcy5cbiAqXG4gKiBDcmVhdGUgYSBuZXcgYGluc3BlY3RPcHRzYCBvYmplY3QgaW4gY2FzZSBgdXNlQ29sb3JzYCBpcyBzZXRcbiAqIGRpZmZlcmVudGx5IGZvciBhIHBhcnRpY3VsYXIgYGRlYnVnYCBpbnN0YW5jZS5cbiAqL1xuXG5mdW5jdGlvbiBpbml0IChkZWJ1Zykge1xuICBkZWJ1Zy5pbnNwZWN0T3B0cyA9IHt9O1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXhwb3J0cy5pbnNwZWN0T3B0cyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGRlYnVnLmluc3BlY3RPcHRzW2tleXNbaV1dID0gZXhwb3J0cy5pbnNwZWN0T3B0c1trZXlzW2ldXTtcbiAgfVxufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgcHJvY2Vzcy5lbnYuREVCVUdgIGluaXRpYWxseS5cbiAqL1xuXG5leHBvcnRzLmVuYWJsZShsb2FkKCkpO1xuIiwgIi8qKlxuICogRGV0ZWN0IEVsZWN0cm9uIHJlbmRlcmVyIHByb2Nlc3MsIHdoaWNoIGlzIG5vZGUsIGJ1dCB3ZSBzaG91bGRcbiAqIHRyZWF0IGFzIGEgYnJvd3Nlci5cbiAqL1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYnJvd3Nlci5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUuanMnKTtcbn1cbiIsICIvKiFcbiAqIGVuY29kZXVybFxuICogQ29weXJpZ2h0KGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZW5jb2RlVXJsXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIG5vbi1VUkwgY29kZSBwb2ludHMsICphZnRlciogZW5jb2RpbmcgKGkuZS4gbm90IGluY2x1ZGluZyBcIiVcIilcbiAqIGFuZCBpbmNsdWRpbmcgaW52YWxpZCBlc2NhcGUgc2VxdWVuY2VzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRU5DT0RFX0NIQVJTX1JFR0VYUCA9IC8oPzpbXlxceDIxXFx4MjVcXHgyNi1cXHgzQlxceDNEXFx4M0YtXFx4NUJcXHg1RFxceDVGXFx4NjEtXFx4N0FcXHg3RV18JSg/OlteMC05QS1GYS1mXXxbMC05QS1GYS1mXVteMC05QS1GYS1mXXwkKSkrL2dcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggdW5tYXRjaGVkIHN1cnJvZ2F0ZSBwYWlyLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgVU5NQVRDSEVEX1NVUlJPR0FURV9QQUlSX1JFR0VYUCA9IC8oXnxbXlxcdUQ4MDAtXFx1REJGRl0pW1xcdURDMDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REJGRl0oW15cXHVEQzAwLVxcdURGRkZdfCQpL2dcblxuLyoqXG4gKiBTdHJpbmcgdG8gcmVwbGFjZSB1bm1hdGNoZWQgc3Vycm9nYXRlIHBhaXIgd2l0aC5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFVOTUFUQ0hFRF9TVVJST0dBVEVfUEFJUl9SRVBMQUNFID0gJyQxXFx1RkZGRCQyJ1xuXG4vKipcbiAqIEVuY29kZSBhIFVSTCB0byBhIHBlcmNlbnQtZW5jb2RlZCBmb3JtLCBleGNsdWRpbmcgYWxyZWFkeS1lbmNvZGVkIHNlcXVlbmNlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSBhbiBhbHJlYWR5LWVuY29kZWQgVVJMIGFuZCBlbmNvZGUgYWxsIHRoZSBub24tVVJMXG4gKiBjb2RlIHBvaW50cy4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBlbmNvZGUgdGhlIFwiJVwiIGNoYXJhY3RlciB1bmxlc3MgaXQgaXNcbiAqIG5vdCBwYXJ0IG9mIGEgdmFsaWQgc2VxdWVuY2UgKGAlMjBgIHdpbGwgYmUgbGVmdCBhcy1pcywgYnV0IGAlZm9vYCB3aWxsXG4gKiBiZSBlbmNvZGVkIGFzIGAlMjVmb29gKS5cbiAqXG4gKiBUaGlzIGVuY29kZSBpcyBtZWFudCB0byBiZSBcInNhZmVcIiBhbmQgZG9lcyBub3QgdGhyb3cgZXJyb3JzLiBJdCB3aWxsIHRyeSBhc1xuICogaGFyZCBhcyBpdCBjYW4gdG8gcHJvcGVybHkgZW5jb2RlIHRoZSBnaXZlbiBVUkwsIGluY2x1ZGluZyByZXBsYWNpbmcgYW55IHJhdyxcbiAqIHVucGFpcmVkIHN1cnJvZ2F0ZSBwYWlycyB3aXRoIHRoZSBVbmljb2RlIHJlcGxhY2VtZW50IGNoYXJhY3RlciBwcmlvciB0b1xuICogZW5jb2RpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuY29kZVVybCAodXJsKSB7XG4gIHJldHVybiBTdHJpbmcodXJsKVxuICAgIC5yZXBsYWNlKFVOTUFUQ0hFRF9TVVJST0dBVEVfUEFJUl9SRUdFWFAsIFVOTUFUQ0hFRF9TVVJST0dBVEVfUEFJUl9SRVBMQUNFKVxuICAgIC5yZXBsYWNlKEVOQ09ERV9DSEFSU19SRUdFWFAsIGVuY29kZVVSSSlcbn1cbiIsICIvKiFcbiAqIGVzY2FwZS1odG1sXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBBbmRyZWFzIEx1YmJlXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBUaWFuY2hlbmcgXCJUaW1vdGh5XCIgR3VcbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgbWF0Y2hIdG1sUmVnRXhwID0gL1tcIicmPD5dLztcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVzY2FwZUh0bWw7XG5cbi8qKlxuICogRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGh0bWwuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUgZm9yIGluc2VydGluZyBpbnRvIEhUTUxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHN0cmluZykge1xuICB2YXIgc3RyID0gJycgKyBzdHJpbmc7XG4gIHZhciBtYXRjaCA9IG1hdGNoSHRtbFJlZ0V4cC5leGVjKHN0cik7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICB2YXIgZXNjYXBlO1xuICB2YXIgaHRtbCA9ICcnO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEluZGV4ID0gMDtcblxuICBmb3IgKGluZGV4ID0gbWF0Y2guaW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaW5kZXgpKSB7XG4gICAgICBjYXNlIDM0OiAvLyBcIlxuICAgICAgICBlc2NhcGUgPSAnJnF1b3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OiAvLyAmXG4gICAgICAgIGVzY2FwZSA9ICcmYW1wOyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOTogLy8gJ1xuICAgICAgICBlc2NhcGUgPSAnJiMzOTsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjA6IC8vIDxcbiAgICAgICAgZXNjYXBlID0gJyZsdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6IC8vID5cbiAgICAgICAgZXNjYXBlID0gJyZndDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChsYXN0SW5kZXggIT09IGluZGV4KSB7XG4gICAgICBodG1sICs9IHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCk7XG4gICAgfVxuXG4gICAgbGFzdEluZGV4ID0gaW5kZXggKyAxO1xuICAgIGh0bWwgKz0gZXNjYXBlO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gaW5kZXhcbiAgICA/IGh0bWwgKyBzdHIuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXgpXG4gICAgOiBodG1sO1xufVxuIiwgIi8qIVxuICogcGFyc2V1cmxcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG52YXIgcGFyc2UgPSB1cmwucGFyc2VcbnZhciBVcmwgPSB1cmwuVXJsXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZXVybFxubW9kdWxlLmV4cG9ydHMub3JpZ2luYWwgPSBvcmlnaW5hbHVybFxuXG4vKipcbiAqIFBhcnNlIHRoZSBgcmVxYCB1cmwgd2l0aCBtZW1vaXphdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1NlcnZlclJlcXVlc3R9IHJlcVxuICogQHJldHVybiB7T2JqZWN0fVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHBhcnNldXJsIChyZXEpIHtcbiAgdmFyIHVybCA9IHJlcS51cmxcblxuICBpZiAodXJsID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBVUkwgaXMgdW5kZWZpbmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgdmFyIHBhcnNlZCA9IHJlcS5fcGFyc2VkVXJsXG5cbiAgaWYgKGZyZXNoKHVybCwgcGFyc2VkKSkge1xuICAgIC8vIFJldHVybiBjYWNoZWQgVVJMIHBhcnNlXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9XG5cbiAgLy8gUGFyc2UgdGhlIFVSTFxuICBwYXJzZWQgPSBmYXN0cGFyc2UodXJsKVxuICBwYXJzZWQuX3JhdyA9IHVybFxuXG4gIHJldHVybiAocmVxLl9wYXJzZWRVcmwgPSBwYXJzZWQpXG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBgcmVxYCBvcmlnaW5hbCB1cmwgd2l0aCBmYWxsYmFjayBhbmQgbWVtb2l6YXRpb24uXG4gKlxuICogQHBhcmFtIHtTZXJ2ZXJSZXF1ZXN0fSByZXFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBvcmlnaW5hbHVybCAocmVxKSB7XG4gIHZhciB1cmwgPSByZXEub3JpZ2luYWxVcmxcblxuICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAvLyBGYWxsYmFja1xuICAgIHJldHVybiBwYXJzZXVybChyZXEpXG4gIH1cblxuICB2YXIgcGFyc2VkID0gcmVxLl9wYXJzZWRPcmlnaW5hbFVybFxuXG4gIGlmIChmcmVzaCh1cmwsIHBhcnNlZCkpIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIFVSTCBwYXJzZVxuICAgIHJldHVybiBwYXJzZWRcbiAgfVxuXG4gIC8vIFBhcnNlIHRoZSBVUkxcbiAgcGFyc2VkID0gZmFzdHBhcnNlKHVybClcbiAgcGFyc2VkLl9yYXcgPSB1cmxcblxuICByZXR1cm4gKHJlcS5fcGFyc2VkT3JpZ2luYWxVcmwgPSBwYXJzZWQpXG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBgc3RyYCB1cmwgd2l0aCBmYXN0LXBhdGggc2hvcnQtY3V0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZmFzdHBhcnNlIChzdHIpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnIHx8IHN0ci5jaGFyQ29kZUF0KDApICE9PSAweDJmIC8qIC8gKi8pIHtcbiAgICByZXR1cm4gcGFyc2Uoc3RyKVxuICB9XG5cbiAgdmFyIHBhdGhuYW1lID0gc3RyXG4gIHZhciBxdWVyeSA9IG51bGxcbiAgdmFyIHNlYXJjaCA9IG51bGxcblxuICAvLyBUaGlzIHRha2VzIHRoZSByZWdleHAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvcHVsbC83ODc4XG4gIC8vIFdoaWNoIGlzIC9eKFxcL1tePyNcXHNdKikoXFw/W14jXFxzXSopPyQvXG4gIC8vIEFuZCB1bnJvbGxzIGl0IGludG8gYSBmb3IgbG9vcFxuICBmb3IgKHZhciBpID0gMTsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaSkpIHtcbiAgICAgIGNhc2UgMHgzZjogLyogPyAgKi9cbiAgICAgICAgaWYgKHNlYXJjaCA9PT0gbnVsbCkge1xuICAgICAgICAgIHBhdGhuYW1lID0gc3RyLnN1YnN0cmluZygwLCBpKVxuICAgICAgICAgIHF1ZXJ5ID0gc3RyLnN1YnN0cmluZyhpICsgMSlcbiAgICAgICAgICBzZWFyY2ggPSBzdHIuc3Vic3RyaW5nKGkpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMHgwOTogLyogXFx0ICovXG4gICAgICBjYXNlIDB4MGE6IC8qIFxcbiAqL1xuICAgICAgY2FzZSAweDBjOiAvKiBcXGYgKi9cbiAgICAgIGNhc2UgMHgwZDogLyogXFxyICovXG4gICAgICBjYXNlIDB4MjA6IC8qICAgICovXG4gICAgICBjYXNlIDB4MjM6IC8qICMgICovXG4gICAgICBjYXNlIDB4YTA6XG4gICAgICBjYXNlIDB4ZmVmZjpcbiAgICAgICAgcmV0dXJuIHBhcnNlKHN0cilcbiAgICB9XG4gIH1cblxuICB2YXIgdXJsID0gVXJsICE9PSB1bmRlZmluZWRcbiAgICA/IG5ldyBVcmwoKVxuICAgIDoge31cblxuICB1cmwucGF0aCA9IHN0clxuICB1cmwuaHJlZiA9IHN0clxuICB1cmwucGF0aG5hbWUgPSBwYXRobmFtZVxuXG4gIGlmIChzZWFyY2ggIT09IG51bGwpIHtcbiAgICB1cmwucXVlcnkgPSBxdWVyeVxuICAgIHVybC5zZWFyY2ggPSBzZWFyY2hcbiAgfVxuXG4gIHJldHVybiB1cmxcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgcGFyc2VkIGlzIHN0aWxsIGZyZXNoIGZvciB1cmwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICogQHBhcmFtIHtvYmplY3R9IHBhcnNlZFVybFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZnJlc2ggKHVybCwgcGFyc2VkVXJsKSB7XG4gIHJldHVybiB0eXBlb2YgcGFyc2VkVXJsID09PSAnb2JqZWN0JyAmJlxuICAgIHBhcnNlZFVybCAhPT0gbnVsbCAmJlxuICAgIChVcmwgPT09IHVuZGVmaW5lZCB8fCBwYXJzZWRVcmwgaW5zdGFuY2VvZiBVcmwpICYmXG4gICAgcGFyc2VkVXJsLl9yYXcgPT09IHVybFxufVxuIiwgIi8qIVxuICogZmluYWxoYW5kbGVyXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDIyIERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdmaW5hbGhhbmRsZXInKVxudmFyIGVuY29kZVVybCA9IHJlcXVpcmUoJ2VuY29kZXVybCcpXG52YXIgZXNjYXBlSHRtbCA9IHJlcXVpcmUoJ2VzY2FwZS1odG1sJylcbnZhciBvbkZpbmlzaGVkID0gcmVxdWlyZSgnb24tZmluaXNoZWQnKVxudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgncGFyc2V1cmwnKVxudmFyIHN0YXR1c2VzID0gcmVxdWlyZSgnc3RhdHVzZXMnKVxudmFyIHVucGlwZSA9IHJlcXVpcmUoJ3VucGlwZScpXG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIERPVUJMRV9TUEFDRV9SRUdFWFAgPSAvXFx4MjB7Mn0vZ1xudmFyIE5FV0xJTkVfUkVHRVhQID0gL1xcbi9nXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgZGVmZXIgPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nXG4gID8gc2V0SW1tZWRpYXRlXG4gIDogZnVuY3Rpb24gKGZuKSB7IHByb2Nlc3MubmV4dFRpY2soZm4uYmluZC5hcHBseShmbiwgYXJndW1lbnRzKSkgfVxudmFyIGlzRmluaXNoZWQgPSBvbkZpbmlzaGVkLmlzRmluaXNoZWRcblxuLyoqXG4gKiBDcmVhdGUgYSBtaW5pbWFsIEhUTUwgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlSHRtbERvY3VtZW50IChtZXNzYWdlKSB7XG4gIHZhciBib2R5ID0gZXNjYXBlSHRtbChtZXNzYWdlKVxuICAgIC5yZXBsYWNlKE5FV0xJTkVfUkVHRVhQLCAnPGJyPicpXG4gICAgLnJlcGxhY2UoRE9VQkxFX1NQQUNFX1JFR0VYUCwgJyAmbmJzcDsnKVxuXG4gIHJldHVybiAnPCFET0NUWVBFIGh0bWw+XFxuJyArXG4gICAgJzxodG1sIGxhbmc9XCJlblwiPlxcbicgK1xuICAgICc8aGVhZD5cXG4nICtcbiAgICAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XFxuJyArXG4gICAgJzx0aXRsZT5FcnJvcjwvdGl0bGU+XFxuJyArXG4gICAgJzwvaGVhZD5cXG4nICtcbiAgICAnPGJvZHk+XFxuJyArXG4gICAgJzxwcmU+JyArIGJvZHkgKyAnPC9wcmU+XFxuJyArXG4gICAgJzwvYm9keT5cXG4nICtcbiAgICAnPC9odG1sPlxcbidcbn1cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpbmFsaGFuZGxlclxuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgZmluYWwgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtSZXF1ZXN0fSByZXFcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZmluYWxoYW5kbGVyIChyZXEsIHJlcywgb3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge31cblxuICAvLyBnZXQgZW52aXJvbm1lbnRcbiAgdmFyIGVudiA9IG9wdHMuZW52IHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCdcblxuICAvLyBnZXQgZXJyb3IgY2FsbGJhY2tcbiAgdmFyIG9uZXJyb3IgPSBvcHRzLm9uZXJyb3JcblxuICByZXR1cm4gZnVuY3Rpb24gKGVycikge1xuICAgIHZhciBoZWFkZXJzXG4gICAgdmFyIG1zZ1xuICAgIHZhciBzdGF0dXNcblxuICAgIC8vIGlnbm9yZSA0MDQgb24gaW4tZmxpZ2h0IHJlc3BvbnNlXG4gICAgaWYgKCFlcnIgJiYgaGVhZGVyc1NlbnQocmVzKSkge1xuICAgICAgZGVidWcoJ2Nhbm5vdCA0MDQgYWZ0ZXIgaGVhZGVycyBzZW50JylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHVuaGFuZGxlZCBlcnJvclxuICAgIGlmIChlcnIpIHtcbiAgICAgIC8vIHJlc3BlY3Qgc3RhdHVzIGNvZGUgZnJvbSBlcnJvclxuICAgICAgc3RhdHVzID0gZ2V0RXJyb3JTdGF0dXNDb2RlKGVycilcblxuICAgICAgaWYgKHN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIHRvIHN0YXR1cyBjb2RlIG9uIHJlc3BvbnNlXG4gICAgICAgIHN0YXR1cyA9IGdldFJlc3BvbnNlU3RhdHVzQ29kZShyZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZXNwZWN0IGhlYWRlcnMgZnJvbSBlcnJvclxuICAgICAgICBoZWFkZXJzID0gZ2V0RXJyb3JIZWFkZXJzKGVycilcbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IGVycm9yIG1lc3NhZ2VcbiAgICAgIG1zZyA9IGdldEVycm9yTWVzc2FnZShlcnIsIHN0YXR1cywgZW52KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub3QgZm91bmRcbiAgICAgIHN0YXR1cyA9IDQwNFxuICAgICAgbXNnID0gJ0Nhbm5vdCAnICsgcmVxLm1ldGhvZCArICcgJyArIGVuY29kZVVybChnZXRSZXNvdXJjZU5hbWUocmVxKSlcbiAgICB9XG5cbiAgICBkZWJ1ZygnZGVmYXVsdCAlcycsIHN0YXR1cylcblxuICAgIC8vIHNjaGVkdWxlIG9uZXJyb3IgY2FsbGJhY2tcbiAgICBpZiAoZXJyICYmIG9uZXJyb3IpIHtcbiAgICAgIGRlZmVyKG9uZXJyb3IsIGVyciwgcmVxLCByZXMpXG4gICAgfVxuXG4gICAgLy8gY2Fubm90IGFjdHVhbGx5IHJlc3BvbmRcbiAgICBpZiAoaGVhZGVyc1NlbnQocmVzKSkge1xuICAgICAgZGVidWcoJ2Nhbm5vdCAlZCBhZnRlciBoZWFkZXJzIHNlbnQnLCBzdGF0dXMpXG4gICAgICByZXEuc29ja2V0LmRlc3Ryb3koKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gc2VuZCByZXNwb25zZVxuICAgIHNlbmQocmVxLCByZXMsIHN0YXR1cywgaGVhZGVycywgbXNnKVxuICB9XG59XG5cbi8qKlxuICogR2V0IGhlYWRlcnMgZnJvbSBFcnJvciBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEVycm9ySGVhZGVycyAoZXJyKSB7XG4gIGlmICghZXJyLmhlYWRlcnMgfHwgdHlwZW9mIGVyci5oZWFkZXJzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHZhciBoZWFkZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGVyci5oZWFkZXJzKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldXG4gICAgaGVhZGVyc1trZXldID0gZXJyLmhlYWRlcnNba2V5XVxuICB9XG5cbiAgcmV0dXJuIGhlYWRlcnNcbn1cblxuLyoqXG4gKiBHZXQgbWVzc2FnZSBmcm9tIEVycm9yIG9iamVjdCwgZmFsbGJhY2sgdG8gc3RhdHVzIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gKiBAcGFyYW0ge3N0cmluZ30gZW52XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZSAoZXJyLCBzdGF0dXMsIGVudikge1xuICB2YXIgbXNnXG5cbiAgaWYgKGVudiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gdXNlIGVyci5zdGFjaywgd2hpY2ggdHlwaWNhbGx5IGluY2x1ZGVzIGVyci5tZXNzYWdlXG4gICAgbXNnID0gZXJyLnN0YWNrXG5cbiAgICAvLyBmYWxsYmFjayB0byBlcnIudG9TdHJpbmcoKSB3aGVuIHBvc3NpYmxlXG4gICAgaWYgKCFtc2cgJiYgdHlwZW9mIGVyci50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbXNnID0gZXJyLnRvU3RyaW5nKClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbXNnIHx8IHN0YXR1c2VzLm1lc3NhZ2Vbc3RhdHVzXVxufVxuXG4vKipcbiAqIEdldCBzdGF0dXMgY29kZSBmcm9tIEVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXJyb3JTdGF0dXNDb2RlIChlcnIpIHtcbiAgLy8gY2hlY2sgZXJyLnN0YXR1c1xuICBpZiAodHlwZW9mIGVyci5zdGF0dXMgPT09ICdudW1iZXInICYmIGVyci5zdGF0dXMgPj0gNDAwICYmIGVyci5zdGF0dXMgPCA2MDApIHtcbiAgICByZXR1cm4gZXJyLnN0YXR1c1xuICB9XG5cbiAgLy8gY2hlY2sgZXJyLnN0YXR1c0NvZGVcbiAgaWYgKHR5cGVvZiBlcnIuc3RhdHVzQ29kZSA9PT0gJ251bWJlcicgJiYgZXJyLnN0YXR1c0NvZGUgPj0gNDAwICYmIGVyci5zdGF0dXNDb2RlIDwgNjAwKSB7XG4gICAgcmV0dXJuIGVyci5zdGF0dXNDb2RlXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogR2V0IHJlc291cmNlIG5hbWUgZm9yIHRoZSByZXF1ZXN0LlxuICpcbiAqIFRoaXMgaXMgdHlwaWNhbGx5IGp1c3QgdGhlIG9yaWdpbmFsIHBhdGhuYW1lIG9mIHRoZSByZXF1ZXN0XG4gKiBidXQgd2lsbCBmYWxsYmFjayB0byBcInJlc291cmNlXCIgaXMgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqXG4gKiBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gcmVxXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldFJlc291cmNlTmFtZSAocmVxKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlVXJsLm9yaWdpbmFsKHJlcSkucGF0aG5hbWVcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiAncmVzb3VyY2UnXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgc3RhdHVzIGNvZGUgZnJvbSByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge091dGdvaW5nTWVzc2FnZX0gcmVzXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldFJlc3BvbnNlU3RhdHVzQ29kZSAocmVzKSB7XG4gIHZhciBzdGF0dXMgPSByZXMuc3RhdHVzQ29kZVxuXG4gIC8vIGRlZmF1bHQgc3RhdHVzIGNvZGUgdG8gNTAwIGlmIG91dHNpZGUgdmFsaWQgcmFuZ2VcbiAgaWYgKHR5cGVvZiBzdGF0dXMgIT09ICdudW1iZXInIHx8IHN0YXR1cyA8IDQwMCB8fCBzdGF0dXMgPiA1OTkpIHtcbiAgICBzdGF0dXMgPSA1MDBcbiAgfVxuXG4gIHJldHVybiBzdGF0dXNcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHJlc3BvbnNlIGhlYWRlcnMgaGF2ZSBiZWVuIHNlbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGhlYWRlcnNTZW50IChyZXMpIHtcbiAgcmV0dXJuIHR5cGVvZiByZXMuaGVhZGVyc1NlbnQgIT09ICdib29sZWFuJ1xuICAgID8gQm9vbGVhbihyZXMuX2hlYWRlcilcbiAgICA6IHJlcy5oZWFkZXJzU2VudFxufVxuXG4vKipcbiAqIFNlbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IHJlcVxuICogQHBhcmFtIHtPdXRnb2luZ01lc3NhZ2V9IHJlc1xuICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICogQHBhcmFtIHtvYmplY3R9IGhlYWRlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNlbmQgKHJlcSwgcmVzLCBzdGF0dXMsIGhlYWRlcnMsIG1lc3NhZ2UpIHtcbiAgZnVuY3Rpb24gd3JpdGUgKCkge1xuICAgIC8vIHJlc3BvbnNlIGJvZHlcbiAgICB2YXIgYm9keSA9IGNyZWF0ZUh0bWxEb2N1bWVudChtZXNzYWdlKVxuXG4gICAgLy8gcmVzcG9uc2Ugc3RhdHVzXG4gICAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNcbiAgICByZXMuc3RhdHVzTWVzc2FnZSA9IHN0YXR1c2VzLm1lc3NhZ2Vbc3RhdHVzXVxuXG4gICAgLy8gcmVtb3ZlIGFueSBjb250ZW50IGhlYWRlcnNcbiAgICByZXMucmVtb3ZlSGVhZGVyKCdDb250ZW50LUVuY29kaW5nJylcbiAgICByZXMucmVtb3ZlSGVhZGVyKCdDb250ZW50LUxhbmd1YWdlJylcbiAgICByZXMucmVtb3ZlSGVhZGVyKCdDb250ZW50LVJhbmdlJylcblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnNcbiAgICBzZXRIZWFkZXJzKHJlcywgaGVhZGVycylcblxuICAgIC8vIHNlY3VyaXR5IGhlYWRlcnNcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsIFwiZGVmYXVsdC1zcmMgJ25vbmUnXCIpXG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJylcblxuICAgIC8vIHN0YW5kYXJkIGhlYWRlcnNcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JylcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHksICd1dGY4JykpXG5cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICByZXMuZW5kKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcy5lbmQoYm9keSwgJ3V0ZjgnKVxuICB9XG5cbiAgaWYgKGlzRmluaXNoZWQocmVxKSkge1xuICAgIHdyaXRlKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIHVucGlwZSBldmVyeXRoaW5nIGZyb20gdGhlIHJlcXVlc3RcbiAgdW5waXBlKHJlcSlcblxuICAvLyBmbHVzaCB0aGUgcmVxdWVzdFxuICBvbkZpbmlzaGVkKHJlcSwgd3JpdGUpXG4gIHJlcS5yZXN1bWUoKVxufVxuXG4vKipcbiAqIFNldCByZXNwb25zZSBoZWFkZXJzIGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T3V0Z29pbmdNZXNzYWdlfSByZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNldEhlYWRlcnMgKHJlcywgaGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycylcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV1cbiAgICByZXMuc2V0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKVxuICB9XG59XG4iLCAiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNOYU4odmFsKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKCg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgaWYgKG1zID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtcyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHJldHVybiBwbHVyYWwobXMsIGQsICdkYXknKSB8fFxuICAgIHBsdXJhbChtcywgaCwgJ2hvdXInKSB8fFxuICAgIHBsdXJhbChtcywgbSwgJ21pbnV0ZScpIHx8XG4gICAgcGx1cmFsKG1zLCBzLCAnc2Vjb25kJykgfHxcbiAgICBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbiwgbmFtZSkge1xuICBpZiAobXMgPCBuKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChtcyA8IG4gKiAxLjUpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihtcyAvIG4pICsgJyAnICsgbmFtZTtcbiAgfVxuICByZXR1cm4gTWF0aC5jZWlsKG1zIC8gbikgKyAnICcgKyBuYW1lICsgJ3MnO1xufVxuIiwgIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnWydkZWZhdWx0J10gPSBjcmVhdGVEZWJ1ZztcbmV4cG9ydHMuY29lcmNlID0gY29lcmNlO1xuZXhwb3J0cy5kaXNhYmxlID0gZGlzYWJsZTtcbmV4cG9ydHMuZW5hYmxlID0gZW5hYmxlO1xuZXhwb3J0cy5lbmFibGVkID0gZW5hYmxlZDtcbmV4cG9ydHMuaHVtYW5pemUgPSByZXF1aXJlKCdtcycpO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuICovXG5cbmV4cG9ydHMubmFtZXMgPSBbXTtcbmV4cG9ydHMuc2tpcHMgPSBbXTtcblxuLyoqXG4gKiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG4gKlxuICogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycyA9IHt9O1xuXG4vKipcbiAqIFByZXZpb3VzIGxvZyB0aW1lc3RhbXAuXG4gKi9cblxudmFyIHByZXZUaW1lO1xuXG4vKipcbiAqIFNlbGVjdCBhIGNvbG9yLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG4gIHZhciBoYXNoID0gMCwgaTtcblxuICBmb3IgKGkgaW4gbmFtZXNwYWNlKSB7XG4gICAgaGFzaCAgPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBleHBvcnRzLmNvbG9ycy5sZW5ndGhdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblxuICBmdW5jdGlvbiBkZWJ1ZygpIHtcbiAgICAvLyBkaXNhYmxlZD9cbiAgICBpZiAoIWRlYnVnLmVuYWJsZWQpIHJldHVybjtcblxuICAgIHZhciBzZWxmID0gZGVidWc7XG5cbiAgICAvLyBzZXQgYGRpZmZgIHRpbWVzdGFtcFxuICAgIHZhciBjdXJyID0gK25ldyBEYXRlKCk7XG4gICAgdmFyIG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcbiAgICBzZWxmLmRpZmYgPSBtcztcbiAgICBzZWxmLnByZXYgPSBwcmV2VGltZTtcbiAgICBzZWxmLmN1cnIgPSBjdXJyO1xuICAgIHByZXZUaW1lID0gY3VycjtcblxuICAgIC8vIHR1cm4gdGhlIGBhcmd1bWVudHNgIGludG8gYSBwcm9wZXIgQXJyYXlcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgYXJnc1swXSA9IGV4cG9ydHMuY29lcmNlKGFyZ3NbMF0pO1xuXG4gICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgYXJnc1swXSkge1xuICAgICAgLy8gYW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cbiAgICAgIGFyZ3MudW5zaGlmdCgnJU8nKTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgYXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIGZ1bmN0aW9uKG1hdGNoLCBmb3JtYXQpIHtcbiAgICAgIC8vIGlmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcbiAgICAgIGlmIChtYXRjaCA9PT0gJyUlJykgcmV0dXJuIG1hdGNoO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHZhciBmb3JtYXR0ZXIgPSBleHBvcnRzLmZvcm1hdHRlcnNbZm9ybWF0XTtcbiAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZm9ybWF0dGVyKSB7XG4gICAgICAgIHZhciB2YWwgPSBhcmdzW2luZGV4XTtcbiAgICAgICAgbWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG4gICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcbiAgICAgICAgYXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpbmRleC0tO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuXG4gICAgLy8gYXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcbiAgICBleHBvcnRzLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuICAgIHZhciBsb2dGbiA9IGRlYnVnLmxvZyB8fCBleHBvcnRzLmxvZyB8fCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuICAgIGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICB9XG5cbiAgZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICBkZWJ1Zy5lbmFibGVkID0gZXhwb3J0cy5lbmFibGVkKG5hbWVzcGFjZSk7XG4gIGRlYnVnLnVzZUNvbG9ycyA9IGV4cG9ydHMudXNlQ29sb3JzKCk7XG4gIGRlYnVnLmNvbG9yID0gc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblxuICAvLyBlbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGV4cG9ydHMuaW5pdCkge1xuICAgIGV4cG9ydHMuaW5pdChkZWJ1Zyk7XG4gIH1cblxuICByZXR1cm4gZGVidWc7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuICogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuICBleHBvcnRzLnNhdmUobmFtZXNwYWNlcyk7XG5cbiAgZXhwb3J0cy5uYW1lcyA9IFtdO1xuICBleHBvcnRzLnNraXBzID0gW107XG5cbiAgdmFyIHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcbiAgdmFyIGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKCFzcGxpdFtpXSkgY29udGludWU7IC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG4gICAgbmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG4gICAgaWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuICAgICAgZXhwb3J0cy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0cy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgZXhwb3J0cy5lbmFibGUoJycpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG4gIHZhciBpLCBsZW47XG4gIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZXhwb3J0cy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZXhwb3J0cy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvZXJjZSBgdmFsYC5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWxcbiAqIEByZXR1cm4ge01peGVkfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG4gIHJldHVybiB2YWw7XG59XG4iLCAiLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZGVidWcnKTtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lXG4gICAgICAgICAgICAgICAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY2hyb21lLnN0b3JhZ2VcbiAgICAgICAgICAgICAgICAgID8gY2hyb21lLnN0b3JhZ2UubG9jYWxcbiAgICAgICAgICAgICAgICAgIDogbG9jYWxzdG9yYWdlKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuICAnbGlnaHRzZWFncmVlbicsXG4gICdmb3Jlc3RncmVlbicsXG4gICdnb2xkZW5yb2QnLFxuICAnZG9kZ2VyYmx1ZScsXG4gICdkYXJrb3JjaGlkJyxcbiAgJ2NyaW1zb24nXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgLy8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuICAvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuICAvLyBleHBsaWNpdGx5XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBpcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuICAvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuICByZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcbiAgICAvLyBpcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG4gICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcbiAgICAvLyBpcyBmaXJlZm94ID49IHYzMT9cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcbiAgICAvLyBkb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbih2KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyLm1lc3NhZ2U7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcbiAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG4gIGFyZ3NbMF0gPSAodXNlQ29sb3JzID8gJyVjJyA6ICcnKVxuICAgICsgdGhpcy5uYW1lc3BhY2VcbiAgICArICh1c2VDb2xvcnMgPyAnICVjJyA6ICcgJylcbiAgICArIGFyZ3NbMF1cbiAgICArICh1c2VDb2xvcnMgPyAnJWMgJyA6ICcgJylcbiAgICArICcrJyArIGV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuICBpZiAoIXVzZUNvbG9ycykgcmV0dXJuO1xuXG4gIHZhciBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcbiAgYXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0JylcblxuICAvLyB0aGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuICAvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG4gIC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEMgPSAwO1xuICBhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICBpZiAoJyUlJyA9PT0gbWF0Y2gpIHJldHVybjtcbiAgICBpbmRleCsrO1xuICAgIGlmICgnJWMnID09PSBtYXRjaCkge1xuICAgICAgLy8gd2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG4gICAgICAvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuICAgICAgbGFzdEMgPSBpbmRleDtcbiAgICB9XG4gIH0pO1xuXG4gIGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmxvZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUubG9nYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBsb2coKSB7XG4gIC8vIHRoaXMgaGFja2VyeSBpcyByZXF1aXJlZCBmb3IgSUU4LzksIHdoZXJlXG4gIC8vIHRoZSBgY29uc29sZS5sb2dgIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSAnYXBwbHknXG4gIHJldHVybiAnb2JqZWN0JyA9PT0gdHlwZW9mIGNvbnNvbGVcbiAgICAmJiBjb25zb2xlLmxvZ1xuICAgICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGUubG9nLCBjb25zb2xlLCBhcmd1bWVudHMpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcbiAgdHJ5IHtcbiAgICBpZiAobnVsbCA9PSBuYW1lc3BhY2VzKSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLmRlYnVnID0gbmFtZXNwYWNlcztcbiAgICB9XG4gIH0gY2F0Y2goZSkge31cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuICB2YXIgcjtcbiAgdHJ5IHtcbiAgICByID0gZXhwb3J0cy5zdG9yYWdlLmRlYnVnO1xuICB9IGNhdGNoKGUpIHt9XG5cbiAgLy8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuICBpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcbiAgICByID0gcHJvY2Vzcy5lbnYuREVCVUc7XG4gIH1cblxuICByZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBFbmFibGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gYGxvY2FsU3RvcmFnZS5kZWJ1Z2AgaW5pdGlhbGx5LlxuICovXG5cbmV4cG9ydHMuZW5hYmxlKGxvYWQoKSk7XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICB9IGNhdGNoIChlKSB7fVxufVxuIiwgIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kZWJ1ZycpO1xuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gWzYsIDIsIDMsIDQsIDUsIDFdO1xuXG4vKipcbiAqIEJ1aWxkIHVwIHRoZSBkZWZhdWx0IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiAgICQgREVCVUdfQ09MT1JTPW5vIERFQlVHX0RFUFRIPTEwIERFQlVHX1NIT1dfSElEREVOPWVuYWJsZWQgbm9kZSBzY3JpcHQuanNcbiAqL1xuXG5leHBvcnRzLmluc3BlY3RPcHRzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAvXmRlYnVnXy9pLnRlc3Qoa2V5KTtcbn0pLnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgLy8gY2FtZWwtY2FzZVxuICB2YXIgcHJvcCA9IGtleVxuICAgIC5zdWJzdHJpbmcoNilcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9fKFthLXpdKS9nLCBmdW5jdGlvbiAoXywgaykgeyByZXR1cm4gay50b1VwcGVyQ2FzZSgpIH0pO1xuXG4gIC8vIGNvZXJjZSBzdHJpbmcgdmFsdWUgaW50byBKUyB2YWx1ZVxuICB2YXIgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcbiAgaWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkgdmFsID0gdHJ1ZTtcbiAgZWxzZSBpZiAoL14obm98b2ZmfGZhbHNlfGRpc2FibGVkKSQvaS50ZXN0KHZhbCkpIHZhbCA9IGZhbHNlO1xuICBlbHNlIGlmICh2YWwgPT09ICdudWxsJykgdmFsID0gbnVsbDtcbiAgZWxzZSB2YWwgPSBOdW1iZXIodmFsKTtcblxuICBvYmpbcHJvcF0gPSB2YWw7XG4gIHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8qKlxuICogVGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSB0aGUgYGRlYnVnKClgIGNhbGxzIHRvLlxuICogU2V0IHRoZSBgREVCVUdfRkRgIGVudiB2YXJpYWJsZSB0byBvdmVycmlkZSB3aXRoIGFub3RoZXIgdmFsdWUuIGkuZS46XG4gKlxuICogICAkIERFQlVHX0ZEPTMgbm9kZSBzY3JpcHQuanMgMz5kZWJ1Zy5sb2dcbiAqL1xuXG52YXIgZmQgPSBwYXJzZUludChwcm9jZXNzLmVudi5ERUJVR19GRCwgMTApIHx8IDI7XG5cbmlmICgxICE9PSBmZCAmJiAyICE9PSBmZCkge1xuICB1dGlsLmRlcHJlY2F0ZShmdW5jdGlvbigpe30sICdleGNlcHQgZm9yIHN0ZGVycigyKSBhbmQgc3Rkb3V0KDEpLCBhbnkgb3RoZXIgdXNhZ2Ugb2YgREVCVUdfRkQgaXMgZGVwcmVjYXRlZC4gT3ZlcnJpZGUgZGVidWcubG9nIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBsb2cgZnVuY3Rpb24gKGh0dHBzOi8vZ2l0LmlvL2RlYnVnX2ZkKScpKClcbn1cblxudmFyIHN0cmVhbSA9IDEgPT09IGZkID8gcHJvY2Vzcy5zdGRvdXQgOlxuICAgICAgICAgICAgIDIgPT09IGZkID8gcHJvY2Vzcy5zdGRlcnIgOlxuICAgICAgICAgICAgIGNyZWF0ZVdyaXRhYmxlU3RkaW9TdHJlYW0oZmQpO1xuXG4vKipcbiAqIElzIHN0ZG91dCBhIFRUWT8gQ29sb3JlZCBvdXRwdXQgaXMgZW5hYmxlZCB3aGVuIGB0cnVlYC5cbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG4gIHJldHVybiAnY29sb3JzJyBpbiBleHBvcnRzLmluc3BlY3RPcHRzXG4gICAgPyBCb29sZWFuKGV4cG9ydHMuaW5zcGVjdE9wdHMuY29sb3JzKVxuICAgIDogdHR5LmlzYXR0eShmZCk7XG59XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbCBvbiBhIHNpbmdsZSBsaW5lLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5vID0gZnVuY3Rpb24odikge1xuICB0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuICByZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG4gICAgLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24oc3RyKSB7XG4gICAgICByZXR1cm4gc3RyLnRyaW0oKVxuICAgIH0pLmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuTyA9IGZ1bmN0aW9uKHYpIHtcbiAgdGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcbiAgcmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKTtcbn07XG5cbi8qKlxuICogQWRkcyBBTlNJIGNvbG9yIGVzY2FwZSBjb2RlcyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG4gIHZhciBuYW1lID0gdGhpcy5uYW1lc3BhY2U7XG4gIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuICBpZiAodXNlQ29sb3JzKSB7XG4gICAgdmFyIGMgPSB0aGlzLmNvbG9yO1xuICAgIHZhciBwcmVmaXggPSAnICBcXHUwMDFiWzMnICsgYyArICc7MW0nICsgbmFtZSArICcgJyArICdcXHUwMDFiWzBtJztcblxuICAgIGFyZ3NbMF0gPSBwcmVmaXggKyBhcmdzWzBdLnNwbGl0KCdcXG4nKS5qb2luKCdcXG4nICsgcHJlZml4KTtcbiAgICBhcmdzLnB1c2goJ1xcdTAwMWJbMycgKyBjICsgJ20rJyArIGV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSArICdcXHUwMDFiWzBtJyk7XG4gIH0gZWxzZSB7XG4gICAgYXJnc1swXSA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxuICAgICAgKyAnICcgKyBuYW1lICsgJyAnICsgYXJnc1swXTtcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgYHV0aWwuZm9ybWF0KClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBgc3RyZWFtYC5cbiAqL1xuXG5mdW5jdGlvbiBsb2coKSB7XG4gIHJldHVybiBzdHJlYW0ud3JpdGUodXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG4gIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAvLyBJZiB5b3Ugc2V0IGEgcHJvY2Vzcy5lbnYgZmllbGQgdG8gbnVsbCBvciB1bmRlZmluZWQsIGl0IGdldHMgY2FzdCB0byB0aGVcbiAgICAvLyBzdHJpbmcgJ251bGwnIG9yICd1bmRlZmluZWQnLiBKdXN0IGRlbGV0ZSBpbnN0ZWFkLlxuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmVudi5ERUJVRyA9IG5hbWVzcGFjZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuREVCVUc7XG59XG5cbi8qKlxuICogQ29waWVkIGZyb20gYG5vZGUvc3JjL25vZGUuanNgLlxuICpcbiAqIFhYWDogSXQncyBsYW1lIHRoYXQgbm9kZSBkb2Vzbid0IGV4cG9zZSB0aGlzIEFQSSBvdXQtb2YtdGhlLWJveC4gSXQgYWxzb1xuICogcmVsaWVzIG9uIHRoZSB1bmRvY3VtZW50ZWQgYHR0eV93cmFwLmd1ZXNzSGFuZGxlVHlwZSgpYCB3aGljaCBpcyBhbHNvIGxhbWUuXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlV3JpdGFibGVTdGRpb1N0cmVhbSAoZmQpIHtcbiAgdmFyIHN0cmVhbTtcbiAgdmFyIHR0eV93cmFwID0gcHJvY2Vzcy5iaW5kaW5nKCd0dHlfd3JhcCcpO1xuXG4gIC8vIE5vdGUgc3RyZWFtLl90eXBlIGlzIHVzZWQgZm9yIHRlc3QtbW9kdWxlLWxvYWQtbGlzdC5qc1xuXG4gIHN3aXRjaCAodHR5X3dyYXAuZ3Vlc3NIYW5kbGVUeXBlKGZkKSkge1xuICAgIGNhc2UgJ1RUWSc6XG4gICAgICBzdHJlYW0gPSBuZXcgdHR5LldyaXRlU3RyZWFtKGZkKTtcbiAgICAgIHN0cmVhbS5fdHlwZSA9ICd0dHknO1xuXG4gICAgICAvLyBIYWNrIHRvIGhhdmUgc3RyZWFtIG5vdCBrZWVwIHRoZSBldmVudCBsb29wIGFsaXZlLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcyNlxuICAgICAgaWYgKHN0cmVhbS5faGFuZGxlICYmIHN0cmVhbS5faGFuZGxlLnVucmVmKSB7XG4gICAgICAgIHN0cmVhbS5faGFuZGxlLnVucmVmKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ0ZJTEUnOlxuICAgICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgICAgIHN0cmVhbSA9IG5ldyBmcy5TeW5jV3JpdGVTdHJlYW0oZmQsIHsgYXV0b0Nsb3NlOiBmYWxzZSB9KTtcbiAgICAgIHN0cmVhbS5fdHlwZSA9ICdmcyc7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ1BJUEUnOlxuICAgIGNhc2UgJ1RDUCc6XG4gICAgICB2YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG4gICAgICBzdHJlYW0gPSBuZXcgbmV0LlNvY2tldCh7XG4gICAgICAgIGZkOiBmZCxcbiAgICAgICAgcmVhZGFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZJWE1FIFNob3VsZCBwcm9iYWJseSBoYXZlIGFuIG9wdGlvbiBpbiBuZXQuU29ja2V0IHRvIGNyZWF0ZSBhXG4gICAgICAvLyBzdHJlYW0gZnJvbSBhbiBleGlzdGluZyBmZCB3aGljaCBpcyB3cml0YWJsZSBvbmx5LiBCdXQgZm9yIG5vd1xuICAgICAgLy8gd2UnbGwganVzdCBhZGQgdGhpcyBoYWNrIGFuZCBzZXQgdGhlIGByZWFkYWJsZWAgbWVtYmVyIHRvIGZhbHNlLlxuICAgICAgLy8gVGVzdDogLi9ub2RlIHRlc3QvZml4dHVyZXMvZWNoby5qcyA8IC9ldGMvcGFzc3dkXG4gICAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZWFkID0gbnVsbDtcbiAgICAgIHN0cmVhbS5fdHlwZSA9ICdwaXBlJztcblxuICAgICAgLy8gRklYTUUgSGFjayB0byBoYXZlIHN0cmVhbSBub3Qga2VlcCB0aGUgZXZlbnQgbG9vcCBhbGl2ZS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzE3MjZcbiAgICAgIGlmIChzdHJlYW0uX2hhbmRsZSAmJiBzdHJlYW0uX2hhbmRsZS51bnJlZikge1xuICAgICAgICBzdHJlYW0uX2hhbmRsZS51bnJlZigpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gUHJvYmFibHkgYW4gZXJyb3Igb24gaW4gdXZfZ3Vlc3NfaGFuZGxlKClcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW1wbGVtZW50IG1lLiBVbmtub3duIHN0cmVhbSBmaWxlIHR5cGUhJyk7XG4gIH1cblxuICAvLyBGb3Igc3VwcG9ydGluZyBsZWdhY3kgQVBJIHdlIHB1dCB0aGUgRkQgaGVyZS5cbiAgc3RyZWFtLmZkID0gZmQ7XG5cbiAgc3RyZWFtLl9pc1N0ZGlvID0gdHJ1ZTtcblxuICByZXR1cm4gc3RyZWFtO1xufVxuXG4vKipcbiAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICpcbiAqIENyZWF0ZSBhIG5ldyBgaW5zcGVjdE9wdHNgIG9iamVjdCBpbiBjYXNlIGB1c2VDb2xvcnNgIGlzIHNldFxuICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGluaXQgKGRlYnVnKSB7XG4gIGRlYnVnLmluc3BlY3RPcHRzID0ge307XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhleHBvcnRzLmluc3BlY3RPcHRzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVidWcuaW5zcGVjdE9wdHNba2V5c1tpXV0gPSBleHBvcnRzLmluc3BlY3RPcHRzW2tleXNbaV1dO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBwcm9jZXNzLmVudi5ERUJVR2AgaW5pdGlhbGx5LlxuICovXG5cbmV4cG9ydHMuZW5hYmxlKGxvYWQoKSk7XG4iLCAiLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9icm93c2VyLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbm9kZS5qcycpO1xufVxuIiwgIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEV4cG9zZSBgYXJyYXlGbGF0dGVuYC5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBhcnJheUZsYXR0ZW5cblxuLyoqXG4gKiBSZWN1cnNpdmUgZmxhdHRlbiBmdW5jdGlvbiB3aXRoIGRlcHRoLlxuICpcbiAqIEBwYXJhbSAge0FycmF5fSAgYXJyYXlcbiAqIEBwYXJhbSAge0FycmF5fSAgcmVzdWx0XG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGRlcHRoXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbldpdGhEZXB0aCAoYXJyYXksIHJlc3VsdCwgZGVwdGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2ldXG5cbiAgICBpZiAoZGVwdGggPiAwICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBmbGF0dGVuV2l0aERlcHRoKHZhbHVlLCByZXN1bHQsIGRlcHRoIC0gMSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZSBmbGF0dGVuIGZ1bmN0aW9uLiBPbWl0dGluZyBkZXB0aCBpcyBzbGlnaHRseSBmYXN0ZXIuXG4gKlxuICogQHBhcmFtICB7QXJyYXl9IGFycmF5XG4gKiBAcGFyYW0gIHtBcnJheX0gcmVzdWx0XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbkZvcmV2ZXIgKGFycmF5LCByZXN1bHQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2ldXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZsYXR0ZW5Gb3JldmVyKHZhbHVlLCByZXN1bHQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGFuIGFycmF5LCB3aXRoIHRoZSBhYmlsaXR5IHRvIGRlZmluZSBhIGRlcHRoLlxuICpcbiAqIEBwYXJhbSAge0FycmF5fSAgYXJyYXlcbiAqIEBwYXJhbSAge051bWJlcn0gZGVwdGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBhcnJheUZsYXR0ZW4gKGFycmF5LCBkZXB0aCkge1xuICBpZiAoZGVwdGggPT0gbnVsbCkge1xuICAgIHJldHVybiBmbGF0dGVuRm9yZXZlcihhcnJheSwgW10pXG4gIH1cblxuICByZXR1cm4gZmxhdHRlbldpdGhEZXB0aChhcnJheSwgW10sIGRlcHRoKVxufVxuIiwgIi8qKlxuICogRXhwb3NlIGBwYXRodG9SZWdleHBgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aHRvUmVnZXhwO1xuXG4vKipcbiAqIE1hdGNoIG1hdGNoaW5nIGdyb3VwcyBpbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqL1xudmFyIE1BVENISU5HX0dST1VQX1JFR0VYUCA9IC9cXCgoPyFcXD8pL2c7XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSBnaXZlbiBwYXRoIHN0cmluZyxcbiAqIHJldHVybmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqXG4gKiBBbiBlbXB0eSBhcnJheSBzaG91bGQgYmUgcGFzc2VkLFxuICogd2hpY2ggd2lsbCBjb250YWluIHRoZSBwbGFjZWhvbGRlclxuICoga2V5IG5hbWVzLiBGb3IgZXhhbXBsZSBcIi91c2VyLzppZFwiIHdpbGxcbiAqIHRoZW4gY29udGFpbiBbXCJpZFwiXS5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd8UmVnRXhwfEFycmF5fSBwYXRoXG4gKiBAcGFyYW0gIHtBcnJheX0ga2V5c1xuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtSZWdFeHB9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXRodG9SZWdleHAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAga2V5cyA9IGtleXMgfHwgW107XG4gIHZhciBzdHJpY3QgPSBvcHRpb25zLnN0cmljdDtcbiAgdmFyIGVuZCA9IG9wdGlvbnMuZW5kICE9PSBmYWxzZTtcbiAgdmFyIGZsYWdzID0gb3B0aW9ucy5zZW5zaXRpdmUgPyAnJyA6ICdpJztcbiAgdmFyIGV4dHJhT2Zmc2V0ID0gMDtcbiAgdmFyIGtleXNPZmZzZXQgPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbmFtZSA9IDA7XG4gIHZhciBtO1xuXG4gIGlmIChwYXRoIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgd2hpbGUgKG0gPSBNQVRDSElOR19HUk9VUF9SRUdFWFAuZXhlYyhwYXRoLnNvdXJjZSkpIHtcbiAgICAgIGtleXMucHVzaCh7XG4gICAgICAgIG5hbWU6IG5hbWUrKyxcbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICBvZmZzZXQ6IG0uaW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAvLyBNYXAgYXJyYXkgcGFydHMgaW50byByZWdleHBzIGFuZCByZXR1cm4gdGhlaXIgc291cmNlLiBXZSBhbHNvIHBhc3NcbiAgICAvLyB0aGUgc2FtZSBrZXlzIGFuZCBvcHRpb25zIGluc3RhbmNlIGludG8gZXZlcnkgZ2VuZXJhdGlvbiB0byBnZXRcbiAgICAvLyBjb25zaXN0ZW50IG1hdGNoaW5nIGdyb3VwcyBiZWZvcmUgd2Ugam9pbiB0aGUgc291cmNlcyB0b2dldGhlci5cbiAgICBwYXRoID0gcGF0aC5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gcGF0aHRvUmVnZXhwKHZhbHVlLCBrZXlzLCBvcHRpb25zKS5zb3VyY2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFJlZ0V4cCgnKD86JyArIHBhdGguam9pbignfCcpICsgJyknLCBmbGFncyk7XG4gIH1cblxuICBwYXRoID0gKCdeJyArIHBhdGggKyAoc3RyaWN0ID8gJycgOiBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPT09ICcvJyA/ICc/JyA6ICcvPycpKVxuICAgIC5yZXBsYWNlKC9cXC9cXCgvZywgJy8oPzonKVxuICAgIC5yZXBsYWNlKC8oW1xcL1xcLl0pL2csICdcXFxcJDEnKVxuICAgIC5yZXBsYWNlKC8oXFxcXFxcLyk/KFxcXFxcXC4pPzooXFx3KykoXFwoLio/XFwpKT8oXFwqKT8oXFw/KT8vZywgZnVuY3Rpb24gKG1hdGNoLCBzbGFzaCwgZm9ybWF0LCBrZXksIGNhcHR1cmUsIHN0YXIsIG9wdGlvbmFsLCBvZmZzZXQpIHtcbiAgICAgIHNsYXNoID0gc2xhc2ggfHwgJyc7XG4gICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICBjYXB0dXJlID0gY2FwdHVyZSB8fCAnKFteXFxcXC8nICsgZm9ybWF0ICsgJ10rPyknO1xuICAgICAgb3B0aW9uYWwgPSBvcHRpb25hbCB8fCAnJztcblxuICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgbmFtZToga2V5LFxuICAgICAgICBvcHRpb25hbDogISFvcHRpb25hbCxcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXQgKyBleHRyYU9mZnNldFxuICAgICAgfSk7XG5cbiAgICAgIHZhciByZXN1bHQgPSAnJ1xuICAgICAgICArIChvcHRpb25hbCA/ICcnIDogc2xhc2gpXG4gICAgICAgICsgJyg/OidcbiAgICAgICAgKyBmb3JtYXQgKyAob3B0aW9uYWwgPyBzbGFzaCA6ICcnKSArIGNhcHR1cmVcbiAgICAgICAgKyAoc3RhciA/ICcoKD86W1xcXFwvJyArIGZvcm1hdCArICddLis/KT8pJyA6ICcnKVxuICAgICAgICArICcpJ1xuICAgICAgICArIG9wdGlvbmFsO1xuXG4gICAgICBleHRyYU9mZnNldCArPSByZXN1bHQubGVuZ3RoIC0gbWF0Y2gubGVuZ3RoO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pXG4gICAgLnJlcGxhY2UoL1xcKi9nLCBmdW5jdGlvbiAoc3RhciwgaW5kZXgpIHtcbiAgICAgIHZhciBsZW4gPSBrZXlzLmxlbmd0aFxuXG4gICAgICB3aGlsZSAobGVuLS0gPiBrZXlzT2Zmc2V0ICYmIGtleXNbbGVuXS5vZmZzZXQgPiBpbmRleCkge1xuICAgICAgICBrZXlzW2xlbl0ub2Zmc2V0ICs9IDM7IC8vIFJlcGxhY2VtZW50IGxlbmd0aCBtaW51cyBhc3RlcmlzayBsZW5ndGguXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnKC4qKSc7XG4gICAgfSk7XG5cbiAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGhhbmRsaW5nIHVubmFtZWQgbWF0Y2hpbmcgZ3JvdXBzLlxuICB3aGlsZSAobSA9IE1BVENISU5HX0dST1VQX1JFR0VYUC5leGVjKHBhdGgpKSB7XG4gICAgdmFyIGVzY2FwZUNvdW50ID0gMDtcbiAgICB2YXIgaW5kZXggPSBtLmluZGV4O1xuXG4gICAgd2hpbGUgKHBhdGguY2hhckF0KC0taW5kZXgpID09PSAnXFxcXCcpIHtcbiAgICAgIGVzY2FwZUNvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0byBlc2NhcGUgdGhlIGJyYWNrZXQuXG4gICAgaWYgKGVzY2FwZUNvdW50ICUgMiA9PT0gMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGtleXNPZmZzZXQgKyBpID09PSBrZXlzLmxlbmd0aCB8fCBrZXlzW2tleXNPZmZzZXQgKyBpXS5vZmZzZXQgPiBtLmluZGV4KSB7XG4gICAgICBrZXlzLnNwbGljZShrZXlzT2Zmc2V0ICsgaSwgMCwge1xuICAgICAgICBuYW1lOiBuYW1lKyssIC8vIFVubmFtZWQgbWF0Y2hpbmcgZ3JvdXBzIG11c3QgYmUgY29uc2lzdGVudGx5IGxpbmVhci5cbiAgICAgICAgb3B0aW9uYWw6IGZhbHNlLFxuICAgICAgICBvZmZzZXQ6IG0uaW5kZXhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIC8vIElmIHRoZSBwYXRoIGlzIG5vbi1lbmRpbmcsIG1hdGNoIHVudGlsIHRoZSBlbmQgb3IgYSBzbGFzaC5cbiAgcGF0aCArPSAoZW5kID8gJyQnIDogKHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gJy8nID8gJycgOiAnKD89XFxcXC98JCknKSk7XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAocGF0aCwgZmxhZ3MpO1xufTtcbiIsICIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHBhdGhSZWdleHAgPSByZXF1aXJlKCdwYXRoLXRvLXJlZ2V4cCcpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZXhwcmVzczpyb3V0ZXI6bGF5ZXInKTtcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gTGF5ZXI7XG5cbmZ1bmN0aW9uIExheWVyKHBhdGgsIG9wdGlvbnMsIGZuKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBMYXllcikpIHtcbiAgICByZXR1cm4gbmV3IExheWVyKHBhdGgsIG9wdGlvbnMsIGZuKTtcbiAgfVxuXG4gIGRlYnVnKCduZXcgJW8nLCBwYXRoKVxuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgdGhpcy5oYW5kbGUgPSBmbjtcbiAgdGhpcy5uYW1lID0gZm4ubmFtZSB8fCAnPGFub255bW91cz4nO1xuICB0aGlzLnBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5wYXRoID0gdW5kZWZpbmVkO1xuICB0aGlzLnJlZ2V4cCA9IHBhdGhSZWdleHAocGF0aCwgdGhpcy5rZXlzID0gW10sIG9wdHMpO1xuXG4gIC8vIHNldCBmYXN0IHBhdGggZmxhZ3NcbiAgdGhpcy5yZWdleHAuZmFzdF9zdGFyID0gcGF0aCA9PT0gJyonXG4gIHRoaXMucmVnZXhwLmZhc3Rfc2xhc2ggPSBwYXRoID09PSAnLycgJiYgb3B0cy5lbmQgPT09IGZhbHNlXG59XG5cbi8qKlxuICogSGFuZGxlIHRoZSBlcnJvciBmb3IgdGhlIGxheWVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAcGFyYW0ge1JlcXVlc3R9IHJlcVxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5MYXllci5wcm90b3R5cGUuaGFuZGxlX2Vycm9yID0gZnVuY3Rpb24gaGFuZGxlX2Vycm9yKGVycm9yLCByZXEsIHJlcywgbmV4dCkge1xuICB2YXIgZm4gPSB0aGlzLmhhbmRsZTtcblxuICBpZiAoZm4ubGVuZ3RoICE9PSA0KSB7XG4gICAgLy8gbm90IGEgc3RhbmRhcmQgZXJyb3IgaGFuZGxlclxuICAgIHJldHVybiBuZXh0KGVycm9yKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgZm4oZXJyb3IsIHJlcSwgcmVzLCBuZXh0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbmV4dChlcnIpO1xuICB9XG59O1xuXG4vKipcbiAqIEhhbmRsZSB0aGUgcmVxdWVzdCBmb3IgdGhlIGxheWVyLlxuICpcbiAqIEBwYXJhbSB7UmVxdWVzdH0gcmVxXG4gKiBAcGFyYW0ge1Jlc3BvbnNlfSByZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG5leHRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkxheWVyLnByb3RvdHlwZS5oYW5kbGVfcmVxdWVzdCA9IGZ1bmN0aW9uIGhhbmRsZShyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgZm4gPSB0aGlzLmhhbmRsZTtcblxuICBpZiAoZm4ubGVuZ3RoID4gMykge1xuICAgIC8vIG5vdCBhIHN0YW5kYXJkIHJlcXVlc3QgaGFuZGxlclxuICAgIHJldHVybiBuZXh0KCk7XG4gIH1cblxuICB0cnkge1xuICAgIGZuKHJlcSwgcmVzLCBuZXh0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbmV4dChlcnIpO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgcm91dGUgbWF0Y2hlcyBgcGF0aGAsIGlmIHNvXG4gKiBwb3B1bGF0ZSBgLnBhcmFtc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5MYXllci5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbiBtYXRjaChwYXRoKSB7XG4gIHZhciBtYXRjaFxuXG4gIGlmIChwYXRoICE9IG51bGwpIHtcbiAgICAvLyBmYXN0IHBhdGggbm9uLWVuZGluZyBtYXRjaCBmb3IgLyAoYW55IHBhdGggbWF0Y2hlcylcbiAgICBpZiAodGhpcy5yZWdleHAuZmFzdF9zbGFzaCkge1xuICAgICAgdGhpcy5wYXJhbXMgPSB7fVxuICAgICAgdGhpcy5wYXRoID0gJydcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gZmFzdCBwYXRoIGZvciAqIChldmVyeXRoaW5nIG1hdGNoZWQgaW4gYSBwYXJhbSlcbiAgICBpZiAodGhpcy5yZWdleHAuZmFzdF9zdGFyKSB7XG4gICAgICB0aGlzLnBhcmFtcyA9IHsnMCc6IGRlY29kZV9wYXJhbShwYXRoKX1cbiAgICAgIHRoaXMucGF0aCA9IHBhdGhcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gbWF0Y2ggdGhlIHBhdGhcbiAgICBtYXRjaCA9IHRoaXMucmVnZXhwLmV4ZWMocGF0aClcbiAgfVxuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhdGggPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gc3RvcmUgdmFsdWVzXG4gIHRoaXMucGFyYW1zID0ge307XG4gIHRoaXMucGF0aCA9IG1hdGNoWzBdXG5cbiAgdmFyIGtleXMgPSB0aGlzLmtleXM7XG4gIHZhciBwYXJhbXMgPSB0aGlzLnBhcmFtcztcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IG1hdGNoLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaSAtIDFdO1xuICAgIHZhciBwcm9wID0ga2V5Lm5hbWU7XG4gICAgdmFyIHZhbCA9IGRlY29kZV9wYXJhbShtYXRjaFtpXSlcblxuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCB8fCAhKGhhc093blByb3BlcnR5LmNhbGwocGFyYW1zLCBwcm9wKSkpIHtcbiAgICAgIHBhcmFtc1twcm9wXSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogRGVjb2RlIHBhcmFtIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZGVjb2RlX3BhcmFtKHZhbCkge1xuICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycgfHwgdmFsLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFVSSUVycm9yKSB7XG4gICAgICBlcnIubWVzc2FnZSA9ICdGYWlsZWQgdG8gZGVjb2RlIHBhcmFtIFxcJycgKyB2YWwgKyAnXFwnJztcbiAgICAgIGVyci5zdGF0dXMgPSBlcnIuc3RhdHVzQ29kZSA9IDQwMDtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cbiIsICIvKiFcbiAqIG1ldGhvZHNcbiAqIENvcHlyaWdodChjKSAyMDEzLTIwMTQgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDE1LTIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEN1cnJlbnROb2RlTWV0aG9kcygpIHx8IGdldEJhc2ljTm9kZU1ldGhvZHMoKTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgTm9kZS5qcyBtZXRob2RzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Tm9kZU1ldGhvZHMoKSB7XG4gIHJldHVybiBodHRwLk1FVEhPRFMgJiYgaHR0cC5NRVRIT0RTLm1hcChmdW5jdGlvbiBsb3dlckNhc2VNZXRob2QobWV0aG9kKSB7XG4gICAgcmV0dXJuIG1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIFwiYmFzaWNcIiBOb2RlLmpzIG1ldGhvZHMsIGEgc25hcHNob3QgZnJvbSBOb2RlLmpzIDAuMTAuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEJhc2ljTm9kZU1ldGhvZHMoKSB7XG4gIHJldHVybiBbXG4gICAgJ2dldCcsXG4gICAgJ3Bvc3QnLFxuICAgICdwdXQnLFxuICAgICdoZWFkJyxcbiAgICAnZGVsZXRlJyxcbiAgICAnb3B0aW9ucycsXG4gICAgJ3RyYWNlJyxcbiAgICAnY29weScsXG4gICAgJ2xvY2snLFxuICAgICdta2NvbCcsXG4gICAgJ21vdmUnLFxuICAgICdwdXJnZScsXG4gICAgJ3Byb3BmaW5kJyxcbiAgICAncHJvcHBhdGNoJyxcbiAgICAndW5sb2NrJyxcbiAgICAncmVwb3J0JyxcbiAgICAnbWthY3Rpdml0eScsXG4gICAgJ2NoZWNrb3V0JyxcbiAgICAnbWVyZ2UnLFxuICAgICdtLXNlYXJjaCcsXG4gICAgJ25vdGlmeScsXG4gICAgJ3N1YnNjcmliZScsXG4gICAgJ3Vuc3Vic2NyaWJlJyxcbiAgICAncGF0Y2gnLFxuICAgICdzZWFyY2gnLFxuICAgICdjb25uZWN0J1xuICBdO1xufVxuIiwgIi8qIVxuICogZXhwcmVzc1xuICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMyBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTMgUm9tYW4gU2h0eWxtYW5cbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdleHByZXNzOnJvdXRlcjpyb3V0ZScpO1xudmFyIGZsYXR0ZW4gPSByZXF1aXJlKCdhcnJheS1mbGF0dGVuJyk7XG52YXIgTGF5ZXIgPSByZXF1aXJlKCcuL2xheWVyJyk7XG52YXIgbWV0aG9kcyA9IHJlcXVpcmUoJ21ldGhvZHMnKTtcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gUm91dGU7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBgUm91dGVgIHdpdGggdGhlIGdpdmVuIGBwYXRoYCxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFJvdXRlKHBhdGgpIHtcbiAgdGhpcy5wYXRoID0gcGF0aDtcbiAgdGhpcy5zdGFjayA9IFtdO1xuXG4gIGRlYnVnKCduZXcgJW8nLCBwYXRoKVxuXG4gIC8vIHJvdXRlIGhhbmRsZXJzIGZvciB2YXJpb3VzIGh0dHAgbWV0aG9kc1xuICB0aGlzLm1ldGhvZHMgPSB7fTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHJvdXRlIGhhbmRsZXMgYSBnaXZlbiBtZXRob2QuXG4gKiBAcHJpdmF0ZVxuICovXG5cblJvdXRlLnByb3RvdHlwZS5faGFuZGxlc19tZXRob2QgPSBmdW5jdGlvbiBfaGFuZGxlc19tZXRob2QobWV0aG9kKSB7XG4gIGlmICh0aGlzLm1ldGhvZHMuX2FsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIG5hbWUgPSBtZXRob2QudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobmFtZSA9PT0gJ2hlYWQnICYmICF0aGlzLm1ldGhvZHNbJ2hlYWQnXSkge1xuICAgIG5hbWUgPSAnZ2V0JztcbiAgfVxuXG4gIHJldHVybiBCb29sZWFuKHRoaXMubWV0aG9kc1tuYW1lXSk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge0FycmF5fSBzdXBwb3J0ZWQgSFRUUCBtZXRob2RzXG4gKiBAcHJpdmF0ZVxuICovXG5cblJvdXRlLnByb3RvdHlwZS5fb3B0aW9ucyA9IGZ1bmN0aW9uIF9vcHRpb25zKCkge1xuICB2YXIgbWV0aG9kcyA9IE9iamVjdC5rZXlzKHRoaXMubWV0aG9kcyk7XG5cbiAgLy8gYXBwZW5kIGF1dG9tYXRpYyBoZWFkXG4gIGlmICh0aGlzLm1ldGhvZHMuZ2V0ICYmICF0aGlzLm1ldGhvZHMuaGVhZCkge1xuICAgIG1ldGhvZHMucHVzaCgnaGVhZCcpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gbWFrZSB1cHBlciBjYXNlXG4gICAgbWV0aG9kc1tpXSA9IG1ldGhvZHNbaV0udG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIHJldHVybiBtZXRob2RzO1xufTtcblxuLyoqXG4gKiBkaXNwYXRjaCByZXEsIHJlcyBpbnRvIHRoaXMgcm91dGVcbiAqIEBwcml2YXRlXG4gKi9cblxuUm91dGUucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2gocmVxLCByZXMsIGRvbmUpIHtcbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBzdGFjayA9IHRoaXMuc3RhY2s7XG4gIHZhciBzeW5jID0gMFxuXG4gIGlmIChzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZG9uZSgpO1xuICB9XG5cbiAgdmFyIG1ldGhvZCA9IHJlcS5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgaWYgKG1ldGhvZCA9PT0gJ2hlYWQnICYmICF0aGlzLm1ldGhvZHNbJ2hlYWQnXSkge1xuICAgIG1ldGhvZCA9ICdnZXQnO1xuICB9XG5cbiAgcmVxLnJvdXRlID0gdGhpcztcblxuICBuZXh0KCk7XG5cbiAgZnVuY3Rpb24gbmV4dChlcnIpIHtcbiAgICAvLyBzaWduYWwgdG8gZXhpdCByb3V0ZVxuICAgIGlmIChlcnIgJiYgZXJyID09PSAncm91dGUnKSB7XG4gICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH1cblxuICAgIC8vIHNpZ25hbCB0byBleGl0IHJvdXRlclxuICAgIGlmIChlcnIgJiYgZXJyID09PSAncm91dGVyJykge1xuICAgICAgcmV0dXJuIGRvbmUoZXJyKVxuICAgIH1cblxuICAgIC8vIG1heCBzeW5jIHN0YWNrXG4gICAgaWYgKCsrc3luYyA+IDEwMCkge1xuICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShuZXh0LCBlcnIpXG4gICAgfVxuXG4gICAgdmFyIGxheWVyID0gc3RhY2tbaWR4KytdXG5cbiAgICAvLyBlbmQgb2YgbGF5ZXJzXG4gICAgaWYgKCFsYXllcikge1xuICAgICAgcmV0dXJuIGRvbmUoZXJyKVxuICAgIH1cblxuICAgIGlmIChsYXllci5tZXRob2QgJiYgbGF5ZXIubWV0aG9kICE9PSBtZXRob2QpIHtcbiAgICAgIG5leHQoZXJyKVxuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICBsYXllci5oYW5kbGVfZXJyb3IoZXJyLCByZXEsIHJlcywgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLmhhbmRsZV9yZXF1ZXN0KHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9XG5cbiAgICBzeW5jID0gMFxuICB9XG59O1xuXG4vKipcbiAqIEFkZCBhIGhhbmRsZXIgZm9yIGFsbCBIVFRQIHZlcmJzIHRvIHRoaXMgcm91dGUuXG4gKlxuICogQmVoYXZlcyBqdXN0IGxpa2UgbWlkZGxld2FyZSBhbmQgY2FuIHJlc3BvbmQgb3IgY2FsbCBgbmV4dGBcbiAqIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuXG4gKlxuICogWW91IGNhbiB1c2UgbXVsdGlwbGUgYC5hbGxgIGNhbGwgdG8gYWRkIG11bHRpcGxlIGhhbmRsZXJzLlxuICpcbiAqICAgZnVuY3Rpb24gY2hlY2tfc29tZXRoaW5nKHJlcSwgcmVzLCBuZXh0KXtcbiAqICAgICBuZXh0KCk7XG4gKiAgIH07XG4gKlxuICogICBmdW5jdGlvbiB2YWxpZGF0ZV91c2VyKHJlcSwgcmVzLCBuZXh0KXtcbiAqICAgICBuZXh0KCk7XG4gKiAgIH07XG4gKlxuICogICByb3V0ZVxuICogICAuYWxsKHZhbGlkYXRlX3VzZXIpXG4gKiAgIC5hbGwoY2hlY2tfc29tZXRoaW5nKVxuICogICAuZ2V0KGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KXtcbiAqICAgICByZXMuc2VuZCgnaGVsbG8gd29ybGQnKTtcbiAqICAgfSk7XG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlclxuICogQHJldHVybiB7Um91dGV9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Sb3V0ZS5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb24gYWxsKCkge1xuICB2YXIgaGFuZGxlcyA9IGZsYXR0ZW4oc2xpY2UuY2FsbChhcmd1bWVudHMpKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaGFuZGxlID0gaGFuZGxlc1tpXTtcblxuICAgIGlmICh0eXBlb2YgaGFuZGxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwoaGFuZGxlKTtcbiAgICAgIHZhciBtc2cgPSAnUm91dGUuYWxsKCkgcmVxdWlyZXMgYSBjYWxsYmFjayBmdW5jdGlvbiBidXQgZ290IGEgJyArIHR5cGVcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobXNnKTtcbiAgICB9XG5cbiAgICB2YXIgbGF5ZXIgPSBMYXllcignLycsIHt9LCBoYW5kbGUpO1xuICAgIGxheWVyLm1ldGhvZCA9IHVuZGVmaW5lZDtcblxuICAgIHRoaXMubWV0aG9kcy5fYWxsID0gdHJ1ZTtcbiAgICB0aGlzLnN0YWNrLnB1c2gobGF5ZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKXtcbiAgUm91dGUucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbigpe1xuICAgIHZhciBoYW5kbGVzID0gZmxhdHRlbihzbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYW5kbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGFuZGxlID0gaGFuZGxlc1tpXTtcblxuICAgICAgaWYgKHR5cGVvZiBoYW5kbGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIHR5cGUgPSB0b1N0cmluZy5jYWxsKGhhbmRsZSk7XG4gICAgICAgIHZhciBtc2cgPSAnUm91dGUuJyArIG1ldGhvZCArICcoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGJ1dCBnb3QgYSAnICsgdHlwZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cblxuICAgICAgZGVidWcoJyVzICVvJywgbWV0aG9kLCB0aGlzLnBhdGgpXG5cbiAgICAgIHZhciBsYXllciA9IExheWVyKCcvJywge30sIGhhbmRsZSk7XG4gICAgICBsYXllci5tZXRob2QgPSBtZXRob2Q7XG5cbiAgICAgIHRoaXMubWV0aG9kc1ttZXRob2RdID0gdHJ1ZTtcbiAgICAgIHRoaXMuc3RhY2sucHVzaChsYXllcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KTtcbiIsICIvKipcbiAqIE1lcmdlIG9iamVjdCBiIHdpdGggb2JqZWN0IGEuXG4gKlxuICogICAgIHZhciBhID0geyBmb286ICdiYXInIH1cbiAqICAgICAgICwgYiA9IHsgYmFyOiAnYmF6JyB9O1xuICpcbiAqICAgICBtZXJnZShhLCBiKTtcbiAqICAgICAvLyA9PiB7IGZvbzogJ2JhcicsIGJhcjogJ2JheicgfVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhXG4gKiBAcGFyYW0ge09iamVjdH0gYlxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhLCBiKXtcbiAgaWYgKGEgJiYgYikge1xuICAgIGZvciAodmFyIGtleSBpbiBiKSB7XG4gICAgICBhW2tleV0gPSBiW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBhO1xufTtcbiIsICIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZScpO1xudmFyIExheWVyID0gcmVxdWlyZSgnLi9sYXllcicpO1xudmFyIG1ldGhvZHMgPSByZXF1aXJlKCdtZXRob2RzJyk7XG52YXIgbWl4aW4gPSByZXF1aXJlKCd1dGlscy1tZXJnZScpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZXhwcmVzczpyb3V0ZXInKTtcbnZhciBkZXByZWNhdGUgPSByZXF1aXJlKCdkZXBkJykoJ2V4cHJlc3MnKTtcbnZhciBmbGF0dGVuID0gcmVxdWlyZSgnYXJyYXktZmxhdHRlbicpO1xudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgncGFyc2V1cmwnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJ3NldHByb3RvdHlwZW9mJylcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgb2JqZWN0UmVnRXhwID0gL15cXFtvYmplY3QgKFxcUyspXFxdJC87XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJvdXRlcmAgd2l0aCB0aGUgZ2l2ZW4gYG9wdGlvbnNgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge1JvdXRlcn0gd2hpY2ggaXMgYW4gY2FsbGFibGUgZnVuY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuXG52YXIgcHJvdG8gPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGZ1bmN0aW9uIHJvdXRlcihyZXEsIHJlcywgbmV4dCkge1xuICAgIHJvdXRlci5oYW5kbGUocmVxLCByZXMsIG5leHQpO1xuICB9XG5cbiAgLy8gbWl4aW4gUm91dGVyIGNsYXNzIGZ1bmN0aW9uc1xuICBzZXRQcm90b3R5cGVPZihyb3V0ZXIsIHByb3RvKVxuXG4gIHJvdXRlci5wYXJhbXMgPSB7fTtcbiAgcm91dGVyLl9wYXJhbXMgPSBbXTtcbiAgcm91dGVyLmNhc2VTZW5zaXRpdmUgPSBvcHRzLmNhc2VTZW5zaXRpdmU7XG4gIHJvdXRlci5tZXJnZVBhcmFtcyA9IG9wdHMubWVyZ2VQYXJhbXM7XG4gIHJvdXRlci5zdHJpY3QgPSBvcHRzLnN0cmljdDtcbiAgcm91dGVyLnN0YWNrID0gW107XG5cbiAgcmV0dXJuIHJvdXRlcjtcbn07XG5cbi8qKlxuICogTWFwIHRoZSBnaXZlbiBwYXJhbSBwbGFjZWhvbGRlciBgbmFtZWAocykgdG8gdGhlIGdpdmVuIGNhbGxiYWNrLlxuICpcbiAqIFBhcmFtZXRlciBtYXBwaW5nIGlzIHVzZWQgdG8gcHJvdmlkZSBwcmUtY29uZGl0aW9ucyB0byByb3V0ZXNcbiAqIHdoaWNoIHVzZSBub3JtYWxpemVkIHBsYWNlaG9sZGVycy4gRm9yIGV4YW1wbGUgYSBfOnVzZXJfaWRfIHBhcmFtZXRlclxuICogY291bGQgYXV0b21hdGljYWxseSBsb2FkIGEgdXNlcidzIGluZm9ybWF0aW9uIGZyb20gdGhlIGRhdGFiYXNlIHdpdGhvdXRcbiAqIGFueSBhZGRpdGlvbmFsIGNvZGUsXG4gKlxuICogVGhlIGNhbGxiYWNrIHVzZXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIG1pZGRsZXdhcmUsIHRoZSBvbmx5IGRpZmZlcmVuY2VcbiAqIGJlaW5nIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBwbGFjZWhvbGRlciBpcyBwYXNzZWQsIGluIHRoaXMgY2FzZSB0aGUgX2lkX1xuICogb2YgdGhlIHVzZXIuIE9uY2UgdGhlIGBuZXh0KClgIGZ1bmN0aW9uIGlzIGludm9rZWQsIGp1c3QgbGlrZSBtaWRkbGV3YXJlXG4gKiBpdCB3aWxsIGNvbnRpbnVlIG9uIHRvIGV4ZWN1dGUgdGhlIHJvdXRlLCBvciBzdWJzZXF1ZW50IHBhcmFtZXRlciBmdW5jdGlvbnMuXG4gKlxuICogSnVzdCBsaWtlIGluIG1pZGRsZXdhcmUsIHlvdSBtdXN0IGVpdGhlciByZXNwb25kIHRvIHRoZSByZXF1ZXN0IG9yIGNhbGwgbmV4dFxuICogdG8gYXZvaWQgc3RhbGxpbmcgdGhlIHJlcXVlc3QuXG4gKlxuICogIGFwcC5wYXJhbSgndXNlcl9pZCcsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0LCBpZCl7XG4gKiAgICBVc2VyLmZpbmQoaWQsIGZ1bmN0aW9uKGVyciwgdXNlcil7XG4gKiAgICAgIGlmIChlcnIpIHtcbiAqICAgICAgICByZXR1cm4gbmV4dChlcnIpO1xuICogICAgICB9IGVsc2UgaWYgKCF1c2VyKSB7XG4gKiAgICAgICAgcmV0dXJuIG5leHQobmV3IEVycm9yKCdmYWlsZWQgdG8gbG9hZCB1c2VyJykpO1xuICogICAgICB9XG4gKiAgICAgIHJlcS51c2VyID0gdXNlcjtcbiAqICAgICAgbmV4dCgpO1xuICogICAgfSk7XG4gKiAgfSk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbnByb3RvLnBhcmFtID0gZnVuY3Rpb24gcGFyYW0obmFtZSwgZm4pIHtcbiAgLy8gcGFyYW0gbG9naWNcbiAgaWYgKHR5cGVvZiBuYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGVwcmVjYXRlKCdyb3V0ZXIucGFyYW0oZm4pOiBSZWZhY3RvciB0byB1c2UgcGF0aCBwYXJhbXMnKTtcbiAgICB0aGlzLl9wYXJhbXMucHVzaChuYW1lKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBhcHBseSBwYXJhbSBmdW5jdGlvbnNcbiAgdmFyIHBhcmFtcyA9IHRoaXMuX3BhcmFtcztcbiAgdmFyIGxlbiA9IHBhcmFtcy5sZW5ndGg7XG4gIHZhciByZXQ7XG5cbiAgaWYgKG5hbWVbMF0gPT09ICc6Jykge1xuICAgIGRlcHJlY2F0ZSgncm91dGVyLnBhcmFtKCcgKyBKU09OLnN0cmluZ2lmeShuYW1lKSArICcsIGZuKTogVXNlIHJvdXRlci5wYXJhbSgnICsgSlNPTi5zdHJpbmdpZnkobmFtZS5zbGljZSgxKSkgKyAnLCBmbikgaW5zdGVhZCcpXG4gICAgbmFtZSA9IG5hbWUuc2xpY2UoMSlcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAocmV0ID0gcGFyYW1zW2ldKG5hbWUsIGZuKSkge1xuICAgICAgZm4gPSByZXQ7XG4gICAgfVxuICB9XG5cbiAgLy8gZW5zdXJlIHdlIGVuZCB1cCB3aXRoIGFcbiAgLy8gbWlkZGxld2FyZSBmdW5jdGlvblxuICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGZuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBhcmFtKCkgY2FsbCBmb3IgJyArIG5hbWUgKyAnLCBnb3QgJyArIGZuKTtcbiAgfVxuXG4gICh0aGlzLnBhcmFtc1tuYW1lXSA9IHRoaXMucGFyYW1zW25hbWVdIHx8IFtdKS5wdXNoKGZuKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxLCByZXMgaW50byB0aGUgcm91dGVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5wcm90by5oYW5kbGUgPSBmdW5jdGlvbiBoYW5kbGUocmVxLCByZXMsIG91dCkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgZGVidWcoJ2Rpc3BhdGNoaW5nICVzICVzJywgcmVxLm1ldGhvZCwgcmVxLnVybCk7XG5cbiAgdmFyIGlkeCA9IDA7XG4gIHZhciBwcm90b2hvc3QgPSBnZXRQcm90b2hvc3QocmVxLnVybCkgfHwgJydcbiAgdmFyIHJlbW92ZWQgPSAnJztcbiAgdmFyIHNsYXNoQWRkZWQgPSBmYWxzZTtcbiAgdmFyIHN5bmMgPSAwXG4gIHZhciBwYXJhbWNhbGxlZCA9IHt9O1xuXG4gIC8vIHN0b3JlIG9wdGlvbnMgZm9yIE9QVElPTlMgcmVxdWVzdFxuICAvLyBvbmx5IHVzZWQgaWYgT1BUSU9OUyByZXF1ZXN0XG4gIHZhciBvcHRpb25zID0gW107XG5cbiAgLy8gbWlkZGxld2FyZSBhbmQgcm91dGVzXG4gIHZhciBzdGFjayA9IHNlbGYuc3RhY2s7XG5cbiAgLy8gbWFuYWdlIGludGVyLXJvdXRlciB2YXJpYWJsZXNcbiAgdmFyIHBhcmVudFBhcmFtcyA9IHJlcS5wYXJhbXM7XG4gIHZhciBwYXJlbnRVcmwgPSByZXEuYmFzZVVybCB8fCAnJztcbiAgdmFyIGRvbmUgPSByZXN0b3JlKG91dCwgcmVxLCAnYmFzZVVybCcsICduZXh0JywgJ3BhcmFtcycpO1xuXG4gIC8vIHNldHVwIG5leHQgbGF5ZXJcbiAgcmVxLm5leHQgPSBuZXh0O1xuXG4gIC8vIGZvciBvcHRpb25zIHJlcXVlc3RzLCByZXNwb25kIHdpdGggYSBkZWZhdWx0IGlmIG5vdGhpbmcgZWxzZSByZXNwb25kc1xuICBpZiAocmVxLm1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgZG9uZSA9IHdyYXAoZG9uZSwgZnVuY3Rpb24ob2xkLCBlcnIpIHtcbiAgICAgIGlmIChlcnIgfHwgb3B0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiBvbGQoZXJyKTtcbiAgICAgIHNlbmRPcHRpb25zUmVzcG9uc2UocmVzLCBvcHRpb25zLCBvbGQpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gc2V0dXAgYmFzaWMgcmVxIHZhbHVlc1xuICByZXEuYmFzZVVybCA9IHBhcmVudFVybDtcbiAgcmVxLm9yaWdpbmFsVXJsID0gcmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmw7XG5cbiAgbmV4dCgpO1xuXG4gIGZ1bmN0aW9uIG5leHQoZXJyKSB7XG4gICAgdmFyIGxheWVyRXJyb3IgPSBlcnIgPT09ICdyb3V0ZSdcbiAgICAgID8gbnVsbFxuICAgICAgOiBlcnI7XG5cbiAgICAvLyByZW1vdmUgYWRkZWQgc2xhc2hcbiAgICBpZiAoc2xhc2hBZGRlZCkge1xuICAgICAgcmVxLnVybCA9IHJlcS51cmwuc2xpY2UoMSlcbiAgICAgIHNsYXNoQWRkZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyByZXN0b3JlIGFsdGVyZWQgcmVxLnVybFxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmVxLmJhc2VVcmwgPSBwYXJlbnRVcmw7XG4gICAgICByZXEudXJsID0gcHJvdG9ob3N0ICsgcmVtb3ZlZCArIHJlcS51cmwuc2xpY2UocHJvdG9ob3N0Lmxlbmd0aClcbiAgICAgIHJlbW92ZWQgPSAnJztcbiAgICB9XG5cbiAgICAvLyBzaWduYWwgdG8gZXhpdCByb3V0ZXJcbiAgICBpZiAobGF5ZXJFcnJvciA9PT0gJ3JvdXRlcicpIHtcbiAgICAgIHNldEltbWVkaWF0ZShkb25lLCBudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gbm8gbW9yZSBtYXRjaGluZyBsYXllcnNcbiAgICBpZiAoaWR4ID49IHN0YWNrLmxlbmd0aCkge1xuICAgICAgc2V0SW1tZWRpYXRlKGRvbmUsIGxheWVyRXJyb3IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG1heCBzeW5jIHN0YWNrXG4gICAgaWYgKCsrc3luYyA+IDEwMCkge1xuICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShuZXh0LCBlcnIpXG4gICAgfVxuXG4gICAgLy8gZ2V0IHBhdGhuYW1lIG9mIHJlcXVlc3RcbiAgICB2YXIgcGF0aCA9IGdldFBhdGhuYW1lKHJlcSk7XG5cbiAgICBpZiAocGF0aCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZG9uZShsYXllckVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIG5leHQgbWF0Y2hpbmcgbGF5ZXJcbiAgICB2YXIgbGF5ZXI7XG4gICAgdmFyIG1hdGNoO1xuICAgIHZhciByb3V0ZTtcblxuICAgIHdoaWxlIChtYXRjaCAhPT0gdHJ1ZSAmJiBpZHggPCBzdGFjay5sZW5ndGgpIHtcbiAgICAgIGxheWVyID0gc3RhY2tbaWR4KytdO1xuICAgICAgbWF0Y2ggPSBtYXRjaExheWVyKGxheWVyLCBwYXRoKTtcbiAgICAgIHJvdXRlID0gbGF5ZXIucm91dGU7XG5cbiAgICAgIGlmICh0eXBlb2YgbWF0Y2ggIT09ICdib29sZWFuJykge1xuICAgICAgICAvLyBob2xkIG9uIHRvIGxheWVyRXJyb3JcbiAgICAgICAgbGF5ZXJFcnJvciA9IGxheWVyRXJyb3IgfHwgbWF0Y2g7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaCAhPT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyb3V0ZSkge1xuICAgICAgICAvLyBwcm9jZXNzIG5vbi1yb3V0ZSBoYW5kbGVycyBub3JtYWxseVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxheWVyRXJyb3IpIHtcbiAgICAgICAgLy8gcm91dGVzIGRvIG5vdCBtYXRjaCB3aXRoIGEgcGVuZGluZyBlcnJvclxuICAgICAgICBtYXRjaCA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1ldGhvZCA9IHJlcS5tZXRob2Q7XG4gICAgICB2YXIgaGFzX21ldGhvZCA9IHJvdXRlLl9oYW5kbGVzX21ldGhvZChtZXRob2QpO1xuXG4gICAgICAvLyBidWlsZCB1cCBhdXRvbWF0aWMgb3B0aW9ucyByZXNwb25zZVxuICAgICAgaWYgKCFoYXNfbWV0aG9kICYmIG1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgICAgIGFwcGVuZE1ldGhvZHMob3B0aW9ucywgcm91dGUuX29wdGlvbnMoKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRvbid0IGV2ZW4gYm90aGVyIG1hdGNoaW5nIHJvdXRlXG4gICAgICBpZiAoIWhhc19tZXRob2QgJiYgbWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBubyBtYXRjaFxuICAgIGlmIChtYXRjaCAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGRvbmUobGF5ZXJFcnJvcik7XG4gICAgfVxuXG4gICAgLy8gc3RvcmUgcm91dGUgZm9yIGRpc3BhdGNoIG9uIGNoYW5nZVxuICAgIGlmIChyb3V0ZSkge1xuICAgICAgcmVxLnJvdXRlID0gcm91dGU7XG4gICAgfVxuXG4gICAgLy8gQ2FwdHVyZSBvbmUtdGltZSBsYXllciB2YWx1ZXNcbiAgICByZXEucGFyYW1zID0gc2VsZi5tZXJnZVBhcmFtc1xuICAgICAgPyBtZXJnZVBhcmFtcyhsYXllci5wYXJhbXMsIHBhcmVudFBhcmFtcylcbiAgICAgIDogbGF5ZXIucGFyYW1zO1xuICAgIHZhciBsYXllclBhdGggPSBsYXllci5wYXRoO1xuXG4gICAgLy8gdGhpcyBzaG91bGQgYmUgZG9uZSBmb3IgdGhlIGxheWVyXG4gICAgc2VsZi5wcm9jZXNzX3BhcmFtcyhsYXllciwgcGFyYW1jYWxsZWQsIHJlcSwgcmVzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIG5leHQobGF5ZXJFcnJvciB8fCBlcnIpXG4gICAgICB9IGVsc2UgaWYgKHJvdXRlKSB7XG4gICAgICAgIGxheWVyLmhhbmRsZV9yZXF1ZXN0KHJlcSwgcmVzLCBuZXh0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpbV9wcmVmaXgobGF5ZXIsIGxheWVyRXJyb3IsIGxheWVyUGF0aCwgcGF0aClcbiAgICAgIH1cblxuICAgICAgc3luYyA9IDBcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaW1fcHJlZml4KGxheWVyLCBsYXllckVycm9yLCBsYXllclBhdGgsIHBhdGgpIHtcbiAgICBpZiAobGF5ZXJQYXRoLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gVmFsaWRhdGUgcGF0aCBpcyBhIHByZWZpeCBtYXRjaFxuICAgICAgaWYgKGxheWVyUGF0aCAhPT0gcGF0aC5zbGljZSgwLCBsYXllclBhdGgubGVuZ3RoKSkge1xuICAgICAgICBuZXh0KGxheWVyRXJyb3IpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBwYXRoIGJyZWFrcyBvbiBhIHBhdGggc2VwYXJhdG9yXG4gICAgICB2YXIgYyA9IHBhdGhbbGF5ZXJQYXRoLmxlbmd0aF1cbiAgICAgIGlmIChjICYmIGMgIT09ICcvJyAmJiBjICE9PSAnLicpIHJldHVybiBuZXh0KGxheWVyRXJyb3IpXG5cbiAgICAgIC8vIFRyaW0gb2ZmIHRoZSBwYXJ0IG9mIHRoZSB1cmwgdGhhdCBtYXRjaGVzIHRoZSByb3V0ZVxuICAgICAgLy8gbWlkZGxld2FyZSAoLnVzZSBzdHVmZikgbmVlZHMgdG8gaGF2ZSB0aGUgcGF0aCBzdHJpcHBlZFxuICAgICAgZGVidWcoJ3RyaW0gcHJlZml4ICglcykgZnJvbSB1cmwgJXMnLCBsYXllclBhdGgsIHJlcS51cmwpO1xuICAgICAgcmVtb3ZlZCA9IGxheWVyUGF0aDtcbiAgICAgIHJlcS51cmwgPSBwcm90b2hvc3QgKyByZXEudXJsLnNsaWNlKHByb3RvaG9zdC5sZW5ndGggKyByZW1vdmVkLmxlbmd0aClcblxuICAgICAgLy8gRW5zdXJlIGxlYWRpbmcgc2xhc2hcbiAgICAgIGlmICghcHJvdG9ob3N0ICYmIHJlcS51cmxbMF0gIT09ICcvJykge1xuICAgICAgICByZXEudXJsID0gJy8nICsgcmVxLnVybDtcbiAgICAgICAgc2xhc2hBZGRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIGJhc2UgVVJMIChubyB0cmFpbGluZyBzbGFzaClcbiAgICAgIHJlcS5iYXNlVXJsID0gcGFyZW50VXJsICsgKHJlbW92ZWRbcmVtb3ZlZC5sZW5ndGggLSAxXSA9PT0gJy8nXG4gICAgICAgID8gcmVtb3ZlZC5zdWJzdHJpbmcoMCwgcmVtb3ZlZC5sZW5ndGggLSAxKVxuICAgICAgICA6IHJlbW92ZWQpO1xuICAgIH1cblxuICAgIGRlYnVnKCclcyAlcyA6ICVzJywgbGF5ZXIubmFtZSwgbGF5ZXJQYXRoLCByZXEub3JpZ2luYWxVcmwpO1xuXG4gICAgaWYgKGxheWVyRXJyb3IpIHtcbiAgICAgIGxheWVyLmhhbmRsZV9lcnJvcihsYXllckVycm9yLCByZXEsIHJlcywgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLmhhbmRsZV9yZXF1ZXN0KHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUHJvY2VzcyBhbnkgcGFyYW1ldGVycyBmb3IgdGhlIGxheWVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5wcm90by5wcm9jZXNzX3BhcmFtcyA9IGZ1bmN0aW9uIHByb2Nlc3NfcGFyYW1zKGxheWVyLCBjYWxsZWQsIHJlcSwgcmVzLCBkb25lKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLnBhcmFtcztcblxuICAvLyBjYXB0dXJlZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGxheWVyLCBrZXlzIGFuZCB2YWx1ZXNcbiAgdmFyIGtleXMgPSBsYXllci5rZXlzO1xuXG4gIC8vIGZhc3QgdHJhY2tcbiAgaWYgKCFrZXlzIHx8IGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGRvbmUoKTtcbiAgfVxuXG4gIHZhciBpID0gMDtcbiAgdmFyIG5hbWU7XG4gIHZhciBwYXJhbUluZGV4ID0gMDtcbiAgdmFyIGtleTtcbiAgdmFyIHBhcmFtVmFsO1xuICB2YXIgcGFyYW1DYWxsYmFja3M7XG4gIHZhciBwYXJhbUNhbGxlZDtcblxuICAvLyBwcm9jZXNzIHBhcmFtcyBpbiBvcmRlclxuICAvLyBwYXJhbSBjYWxsYmFja3MgY2FuIGJlIGFzeW5jXG4gIGZ1bmN0aW9uIHBhcmFtKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBkb25lKGVycik7XG4gICAgfVxuXG4gICAgaWYgKGkgPj0ga2V5cy5sZW5ndGggKSB7XG4gICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH1cblxuICAgIHBhcmFtSW5kZXggPSAwO1xuICAgIGtleSA9IGtleXNbaSsrXTtcbiAgICBuYW1lID0ga2V5Lm5hbWU7XG4gICAgcGFyYW1WYWwgPSByZXEucGFyYW1zW25hbWVdO1xuICAgIHBhcmFtQ2FsbGJhY2tzID0gcGFyYW1zW25hbWVdO1xuICAgIHBhcmFtQ2FsbGVkID0gY2FsbGVkW25hbWVdO1xuXG4gICAgaWYgKHBhcmFtVmFsID09PSB1bmRlZmluZWQgfHwgIXBhcmFtQ2FsbGJhY2tzKSB7XG4gICAgICByZXR1cm4gcGFyYW0oKTtcbiAgICB9XG5cbiAgICAvLyBwYXJhbSBwcmV2aW91c2x5IGNhbGxlZCB3aXRoIHNhbWUgdmFsdWUgb3IgZXJyb3Igb2NjdXJyZWRcbiAgICBpZiAocGFyYW1DYWxsZWQgJiYgKHBhcmFtQ2FsbGVkLm1hdGNoID09PSBwYXJhbVZhbFxuICAgICAgfHwgKHBhcmFtQ2FsbGVkLmVycm9yICYmIHBhcmFtQ2FsbGVkLmVycm9yICE9PSAncm91dGUnKSkpIHtcbiAgICAgIC8vIHJlc3RvcmUgdmFsdWVcbiAgICAgIHJlcS5wYXJhbXNbbmFtZV0gPSBwYXJhbUNhbGxlZC52YWx1ZTtcblxuICAgICAgLy8gbmV4dCBwYXJhbVxuICAgICAgcmV0dXJuIHBhcmFtKHBhcmFtQ2FsbGVkLmVycm9yKTtcbiAgICB9XG5cbiAgICBjYWxsZWRbbmFtZV0gPSBwYXJhbUNhbGxlZCA9IHtcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgbWF0Y2g6IHBhcmFtVmFsLFxuICAgICAgdmFsdWU6IHBhcmFtVmFsXG4gICAgfTtcblxuICAgIHBhcmFtQ2FsbGJhY2soKTtcbiAgfVxuXG4gIC8vIHNpbmdsZSBwYXJhbSBjYWxsYmFja3NcbiAgZnVuY3Rpb24gcGFyYW1DYWxsYmFjayhlcnIpIHtcbiAgICB2YXIgZm4gPSBwYXJhbUNhbGxiYWNrc1twYXJhbUluZGV4KytdO1xuXG4gICAgLy8gc3RvcmUgdXBkYXRlZCB2YWx1ZVxuICAgIHBhcmFtQ2FsbGVkLnZhbHVlID0gcmVxLnBhcmFtc1trZXkubmFtZV07XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICAvLyBzdG9yZSBlcnJvclxuICAgICAgcGFyYW1DYWxsZWQuZXJyb3IgPSBlcnI7XG4gICAgICBwYXJhbShlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZm4pIHJldHVybiBwYXJhbSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZuKHJlcSwgcmVzLCBwYXJhbUNhbGxiYWNrLCBwYXJhbVZhbCwga2V5Lm5hbWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHBhcmFtQ2FsbGJhY2soZSk7XG4gICAgfVxuICB9XG5cbiAgcGFyYW0oKTtcbn07XG5cbi8qKlxuICogVXNlIHRoZSBnaXZlbiBtaWRkbGV3YXJlIGZ1bmN0aW9uLCB3aXRoIG9wdGlvbmFsIHBhdGgsIGRlZmF1bHRpbmcgdG8gXCIvXCIuXG4gKlxuICogVXNlIChsaWtlIGAuYWxsYCkgd2lsbCBydW4gZm9yIGFueSBodHRwIE1FVEhPRCwgYnV0IGl0IHdpbGwgbm90IGFkZFxuICogaGFuZGxlcnMgZm9yIHRob3NlIG1ldGhvZHMgc28gT1BUSU9OUyByZXF1ZXN0cyB3aWxsIG5vdCBjb25zaWRlciBgLnVzZWBcbiAqIGZ1bmN0aW9ucyBldmVuIGlmIHRoZXkgY291bGQgcmVzcG9uZC5cbiAqXG4gKiBUaGUgb3RoZXIgZGlmZmVyZW5jZSBpcyB0aGF0IF9yb3V0ZV8gcGF0aCBpcyBzdHJpcHBlZCBhbmQgbm90IHZpc2libGVcbiAqIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uLiBUaGUgbWFpbiBlZmZlY3Qgb2YgdGhpcyBmZWF0dXJlIGlzIHRoYXQgbW91bnRlZFxuICogaGFuZGxlcnMgY2FuIG9wZXJhdGUgd2l0aG91dCBhbnkgY29kZSBjaGFuZ2VzIHJlZ2FyZGxlc3Mgb2YgdGhlIFwicHJlZml4XCJcbiAqIHBhdGhuYW1lLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5wcm90by51c2UgPSBmdW5jdGlvbiB1c2UoZm4pIHtcbiAgdmFyIG9mZnNldCA9IDA7XG4gIHZhciBwYXRoID0gJy8nO1xuXG4gIC8vIGRlZmF1bHQgcGF0aCB0byAnLydcbiAgLy8gZGlzYW1iaWd1YXRlIHJvdXRlci51c2UoW2ZuXSlcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBhcmcgPSBmbjtcblxuICAgIHdoaWxlIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnLmxlbmd0aCAhPT0gMCkge1xuICAgICAgYXJnID0gYXJnWzBdO1xuICAgIH1cblxuICAgIC8vIGZpcnN0IGFyZyBpcyB0aGUgcGF0aFxuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvZmZzZXQgPSAxO1xuICAgICAgcGF0aCA9IGZuO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjYWxsYmFja3MgPSBmbGF0dGVuKHNsaWNlLmNhbGwoYXJndW1lbnRzLCBvZmZzZXQpKTtcblxuICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JvdXRlci51c2UoKSByZXF1aXJlcyBhIG1pZGRsZXdhcmUgZnVuY3Rpb24nKVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZm4gPSBjYWxsYmFja3NbaV07XG5cbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSb3V0ZXIudXNlKCkgcmVxdWlyZXMgYSBtaWRkbGV3YXJlIGZ1bmN0aW9uIGJ1dCBnb3QgYSAnICsgZ2V0dHlwZShmbikpXG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBtaWRkbGV3YXJlXG4gICAgZGVidWcoJ3VzZSAlbyAlcycsIHBhdGgsIGZuLm5hbWUgfHwgJzxhbm9ueW1vdXM+JylcblxuICAgIHZhciBsYXllciA9IG5ldyBMYXllcihwYXRoLCB7XG4gICAgICBzZW5zaXRpdmU6IHRoaXMuY2FzZVNlbnNpdGl2ZSxcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICBlbmQ6IGZhbHNlXG4gICAgfSwgZm4pO1xuXG4gICAgbGF5ZXIucm91dGUgPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnN0YWNrLnB1c2gobGF5ZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBSb3V0ZSBmb3IgdGhlIGdpdmVuIHBhdGguXG4gKlxuICogRWFjaCByb3V0ZSBjb250YWlucyBhIHNlcGFyYXRlIG1pZGRsZXdhcmUgc3RhY2sgYW5kIFZFUkIgaGFuZGxlcnMuXG4gKlxuICogU2VlIHRoZSBSb3V0ZSBhcGkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiBhZGRpbmcgaGFuZGxlcnNcbiAqIGFuZCBtaWRkbGV3YXJlIHRvIHJvdXRlcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHJldHVybiB7Um91dGV9XG4gKiBAcHVibGljXG4gKi9cblxucHJvdG8ucm91dGUgPSBmdW5jdGlvbiByb3V0ZShwYXRoKSB7XG4gIHZhciByb3V0ZSA9IG5ldyBSb3V0ZShwYXRoKTtcblxuICB2YXIgbGF5ZXIgPSBuZXcgTGF5ZXIocGF0aCwge1xuICAgIHNlbnNpdGl2ZTogdGhpcy5jYXNlU2Vuc2l0aXZlLFxuICAgIHN0cmljdDogdGhpcy5zdHJpY3QsXG4gICAgZW5kOiB0cnVlXG4gIH0sIHJvdXRlLmRpc3BhdGNoLmJpbmQocm91dGUpKTtcblxuICBsYXllci5yb3V0ZSA9IHJvdXRlO1xuXG4gIHRoaXMuc3RhY2sucHVzaChsYXllcik7XG4gIHJldHVybiByb3V0ZTtcbn07XG5cbi8vIGNyZWF0ZSBSb3V0ZXIjVkVSQiBmdW5jdGlvbnNcbm1ldGhvZHMuY29uY2F0KCdhbGwnKS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCl7XG4gIHByb3RvW21ldGhvZF0gPSBmdW5jdGlvbihwYXRoKXtcbiAgICB2YXIgcm91dGUgPSB0aGlzLnJvdXRlKHBhdGgpXG4gICAgcm91dGVbbWV0aG9kXS5hcHBseShyb3V0ZSwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn0pO1xuXG4vLyBhcHBlbmQgbWV0aG9kcyB0byBhIGxpc3Qgb2YgbWV0aG9kc1xuZnVuY3Rpb24gYXBwZW5kTWV0aG9kcyhsaXN0LCBhZGRpdGlvbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFkZGl0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG1ldGhvZCA9IGFkZGl0aW9uW2ldO1xuICAgIGlmIChsaXN0LmluZGV4T2YobWV0aG9kKSA9PT0gLTEpIHtcbiAgICAgIGxpc3QucHVzaChtZXRob2QpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBnZXQgcGF0aG5hbWUgb2YgcmVxdWVzdFxuZnVuY3Rpb24gZ2V0UGF0aG5hbWUocmVxKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlVXJsKHJlcSkucGF0aG5hbWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLy8gR2V0IGdldCBwcm90b2NvbCArIGhvc3QgZm9yIGEgVVJMXG5mdW5jdGlvbiBnZXRQcm90b2hvc3QodXJsKSB7XG4gIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyB8fCB1cmwubGVuZ3RoID09PSAwIHx8IHVybFswXSA9PT0gJy8nKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgdmFyIHNlYXJjaEluZGV4ID0gdXJsLmluZGV4T2YoJz8nKVxuICB2YXIgcGF0aExlbmd0aCA9IHNlYXJjaEluZGV4ICE9PSAtMVxuICAgID8gc2VhcmNoSW5kZXhcbiAgICA6IHVybC5sZW5ndGhcbiAgdmFyIGZxZG5JbmRleCA9IHVybC5zbGljZSgwLCBwYXRoTGVuZ3RoKS5pbmRleE9mKCc6Ly8nKVxuXG4gIHJldHVybiBmcWRuSW5kZXggIT09IC0xXG4gICAgPyB1cmwuc3Vic3RyaW5nKDAsIHVybC5pbmRleE9mKCcvJywgMyArIGZxZG5JbmRleCkpXG4gICAgOiB1bmRlZmluZWRcbn1cblxuLy8gZ2V0IHR5cGUgZm9yIGVycm9yIG1lc3NhZ2VcbmZ1bmN0aW9uIGdldHR5cGUob2JqKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIG9iajtcblxuICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIC8vIGluc3BlY3QgW1tDbGFzc11dIGZvciBvYmplY3RzXG4gIHJldHVybiB0b1N0cmluZy5jYWxsKG9iailcbiAgICAucmVwbGFjZShvYmplY3RSZWdFeHAsICckMScpO1xufVxuXG4vKipcbiAqIE1hdGNoIHBhdGggdG8gYSBsYXllci5cbiAqXG4gKiBAcGFyYW0ge0xheWVyfSBsYXllclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWF0Y2hMYXllcihsYXllciwgcGF0aCkge1xuICB0cnkge1xuICAgIHJldHVybiBsYXllci5tYXRjaChwYXRoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxufVxuXG4vLyBtZXJnZSBwYXJhbXMgd2l0aCBwYXJlbnQgcGFyYW1zXG5mdW5jdGlvbiBtZXJnZVBhcmFtcyhwYXJhbXMsIHBhcmVudCkge1xuICBpZiAodHlwZW9mIHBhcmVudCAhPT0gJ29iamVjdCcgfHwgIXBhcmVudCkge1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvLyBtYWtlIGNvcHkgb2YgcGFyZW50IGZvciBiYXNlXG4gIHZhciBvYmogPSBtaXhpbih7fSwgcGFyZW50KTtcblxuICAvLyBzaW1wbGUgbm9uLW51bWVyaWMgbWVyZ2luZ1xuICBpZiAoISgwIGluIHBhcmFtcykgfHwgISgwIGluIHBhcmVudCkpIHtcbiAgICByZXR1cm4gbWl4aW4ob2JqLCBwYXJhbXMpO1xuICB9XG5cbiAgdmFyIGkgPSAwO1xuICB2YXIgbyA9IDA7XG5cbiAgLy8gZGV0ZXJtaW5lIG51bWVyaWMgZ2Fwc1xuICB3aGlsZSAoaSBpbiBwYXJhbXMpIHtcbiAgICBpKys7XG4gIH1cblxuICB3aGlsZSAobyBpbiBwYXJlbnQpIHtcbiAgICBvKys7XG4gIH1cblxuICAvLyBvZmZzZXQgbnVtZXJpYyBpbmRpY2VzIGluIHBhcmFtcyBiZWZvcmUgbWVyZ2VcbiAgZm9yIChpLS07IGkgPj0gMDsgaS0tKSB7XG4gICAgcGFyYW1zW2kgKyBvXSA9IHBhcmFtc1tpXTtcblxuICAgIC8vIGNyZWF0ZSBob2xlcyBmb3IgdGhlIG1lcmdlIHdoZW4gbmVjZXNzYXJ5XG4gICAgaWYgKGkgPCBvKSB7XG4gICAgICBkZWxldGUgcGFyYW1zW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhpbihvYmosIHBhcmFtcyk7XG59XG5cbi8vIHJlc3RvcmUgb2JqIHByb3BzIGFmdGVyIGZ1bmN0aW9uXG5mdW5jdGlvbiByZXN0b3JlKGZuLCBvYmopIHtcbiAgdmFyIHByb3BzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAyKTtcbiAgdmFyIHZhbHMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDIpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICBwcm9wc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgdmFsc1tpXSA9IG9ialtwcm9wc1tpXV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIC8vIHJlc3RvcmUgdmFsc1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9ialtwcm9wc1tpXV0gPSB2YWxzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG4vLyBzZW5kIGFuIE9QVElPTlMgcmVzcG9uc2VcbmZ1bmN0aW9uIHNlbmRPcHRpb25zUmVzcG9uc2UocmVzLCBvcHRpb25zLCBuZXh0KSB7XG4gIHRyeSB7XG4gICAgdmFyIGJvZHkgPSBvcHRpb25zLmpvaW4oJywnKTtcbiAgICByZXMuc2V0KCdBbGxvdycsIGJvZHkpO1xuICAgIHJlcy5zZW5kKGJvZHkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBuZXh0KGVycik7XG4gIH1cbn1cblxuLy8gd3JhcCBhIGZ1bmN0aW9uXG5mdW5jdGlvbiB3cmFwKG9sZCwgZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHByb3h5KCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggKyAxKTtcblxuICAgIGFyZ3NbMF0gPSBvbGQ7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJnc1tpICsgMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgZm4uYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG59XG4iLCAiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJ3NldHByb3RvdHlwZW9mJylcblxuLyoqXG4gKiBJbml0aWFsaXphdGlvbiBtaWRkbGV3YXJlLCBleHBvc2luZyB0aGVcbiAqIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRvIGVhY2ggb3RoZXIsIGFzIHdlbGxcbiAqIGFzIGRlZmF1bHRpbmcgdGhlIFgtUG93ZXJlZC1CeSBoZWFkZXIgZmllbGQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXBwXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuaW5pdCA9IGZ1bmN0aW9uKGFwcCl7XG4gIHJldHVybiBmdW5jdGlvbiBleHByZXNzSW5pdChyZXEsIHJlcywgbmV4dCl7XG4gICAgaWYgKGFwcC5lbmFibGVkKCd4LXBvd2VyZWQtYnknKSkgcmVzLnNldEhlYWRlcignWC1Qb3dlcmVkLUJ5JywgJ0V4cHJlc3MnKTtcbiAgICByZXEucmVzID0gcmVzO1xuICAgIHJlcy5yZXEgPSByZXE7XG4gICAgcmVxLm5leHQgPSBuZXh0O1xuXG4gICAgc2V0UHJvdG90eXBlT2YocmVxLCBhcHAucmVxdWVzdClcbiAgICBzZXRQcm90b3R5cGVPZihyZXMsIGFwcC5yZXNwb25zZSlcblxuICAgIHJlcy5sb2NhbHMgPSByZXMubG9jYWxzIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBuZXh0KCk7XG4gIH07XG59O1xuXG4iLCAiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIG1lcmdlID0gcmVxdWlyZSgndXRpbHMtbWVyZ2UnKVxudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgncGFyc2V1cmwnKTtcbnZhciBxcyA9IHJlcXVpcmUoJ3FzJyk7XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHF1ZXJ5KG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBtZXJnZSh7fSwgb3B0aW9ucylcbiAgdmFyIHF1ZXJ5cGFyc2UgPSBxcy5wYXJzZTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBxdWVyeXBhcnNlID0gb3B0aW9ucztcbiAgICBvcHRzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKG9wdHMgIT09IHVuZGVmaW5lZCAmJiBvcHRzLmFsbG93UHJvdG90eXBlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gYmFjay1jb21wYXQgZm9yIHFzIG1vZHVsZVxuICAgIG9wdHMuYWxsb3dQcm90b3R5cGVzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBxdWVyeShyZXEsIHJlcywgbmV4dCl7XG4gICAgaWYgKCFyZXEucXVlcnkpIHtcbiAgICAgIHZhciB2YWwgPSBwYXJzZVVybChyZXEpLnF1ZXJ5O1xuICAgICAgcmVxLnF1ZXJ5ID0gcXVlcnlwYXJzZSh2YWwsIG9wdHMpO1xuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfTtcbn07XG4iLCAiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2V4cHJlc3M6dmlldycpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkaXJuYW1lID0gcGF0aC5kaXJuYW1lO1xudmFyIGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZTtcbnZhciBleHRuYW1lID0gcGF0aC5leHRuYW1lO1xudmFyIGpvaW4gPSBwYXRoLmpvaW47XG52YXIgcmVzb2x2ZSA9IHBhdGgucmVzb2x2ZTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpZXc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgVmlld2Agd2l0aCB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogICAtIGBkZWZhdWx0RW5naW5lYCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBlbmdpbmUgbmFtZVxuICogICAtIGBlbmdpbmVzYCB0ZW1wbGF0ZSBlbmdpbmUgcmVxdWlyZSgpIGNhY2hlXG4gKiAgIC0gYHJvb3RgIHJvb3QgcGF0aCBmb3IgdmlldyBsb29rdXBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBWaWV3KG5hbWUsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHRoaXMuZGVmYXVsdEVuZ2luZSA9IG9wdHMuZGVmYXVsdEVuZ2luZTtcbiAgdGhpcy5leHQgPSBleHRuYW1lKG5hbWUpO1xuICB0aGlzLm5hbWUgPSBuYW1lO1xuICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG5cbiAgaWYgKCF0aGlzLmV4dCAmJiAhdGhpcy5kZWZhdWx0RW5naW5lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBkZWZhdWx0IGVuZ2luZSB3YXMgc3BlY2lmaWVkIGFuZCBubyBleHRlbnNpb24gd2FzIHByb3ZpZGVkLicpO1xuICB9XG5cbiAgdmFyIGZpbGVOYW1lID0gbmFtZTtcblxuICBpZiAoIXRoaXMuZXh0KSB7XG4gICAgLy8gZ2V0IGV4dGVuc2lvbiBmcm9tIGRlZmF1bHQgZW5naW5lIG5hbWVcbiAgICB0aGlzLmV4dCA9IHRoaXMuZGVmYXVsdEVuZ2luZVswXSAhPT0gJy4nXG4gICAgICA/ICcuJyArIHRoaXMuZGVmYXVsdEVuZ2luZVxuICAgICAgOiB0aGlzLmRlZmF1bHRFbmdpbmU7XG5cbiAgICBmaWxlTmFtZSArPSB0aGlzLmV4dDtcbiAgfVxuXG4gIGlmICghb3B0cy5lbmdpbmVzW3RoaXMuZXh0XSkge1xuICAgIC8vIGxvYWQgZW5naW5lXG4gICAgdmFyIG1vZCA9IHRoaXMuZXh0LnNsaWNlKDEpXG4gICAgZGVidWcoJ3JlcXVpcmUgXCIlc1wiJywgbW9kKVxuXG4gICAgLy8gZGVmYXVsdCBlbmdpbmUgZXhwb3J0XG4gICAgdmFyIGZuID0gcmVxdWlyZShtb2QpLl9fZXhwcmVzc1xuXG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2R1bGUgXCInICsgbW9kICsgJ1wiIGRvZXMgbm90IHByb3ZpZGUgYSB2aWV3IGVuZ2luZS4nKVxuICAgIH1cblxuICAgIG9wdHMuZW5naW5lc1t0aGlzLmV4dF0gPSBmblxuICB9XG5cbiAgLy8gc3RvcmUgbG9hZGVkIGVuZ2luZVxuICB0aGlzLmVuZ2luZSA9IG9wdHMuZW5naW5lc1t0aGlzLmV4dF07XG5cbiAgLy8gbG9va3VwIHBhdGhcbiAgdGhpcy5wYXRoID0gdGhpcy5sb29rdXAoZmlsZU5hbWUpO1xufVxuXG4vKipcbiAqIExvb2t1cCB2aWV3IGJ5IHRoZSBnaXZlbiBgbmFtZWBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHByaXZhdGVcbiAqL1xuXG5WaWV3LnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbiBsb29rdXAobmFtZSkge1xuICB2YXIgcGF0aDtcbiAgdmFyIHJvb3RzID0gW10uY29uY2F0KHRoaXMucm9vdCk7XG5cbiAgZGVidWcoJ2xvb2t1cCBcIiVzXCInLCBuYW1lKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aCAmJiAhcGF0aDsgaSsrKSB7XG4gICAgdmFyIHJvb3QgPSByb290c1tpXTtcblxuICAgIC8vIHJlc29sdmUgdGhlIHBhdGhcbiAgICB2YXIgbG9jID0gcmVzb2x2ZShyb290LCBuYW1lKTtcbiAgICB2YXIgZGlyID0gZGlybmFtZShsb2MpO1xuICAgIHZhciBmaWxlID0gYmFzZW5hbWUobG9jKTtcblxuICAgIC8vIHJlc29sdmUgdGhlIGZpbGVcbiAgICBwYXRoID0gdGhpcy5yZXNvbHZlKGRpciwgZmlsZSk7XG4gIH1cblxuICByZXR1cm4gcGF0aDtcbn07XG5cbi8qKlxuICogUmVuZGVyIHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcHJpdmF0ZVxuICovXG5cblZpZXcucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcihvcHRpb25zLCBjYWxsYmFjaykge1xuICBkZWJ1ZygncmVuZGVyIFwiJXNcIicsIHRoaXMucGF0aCk7XG4gIHRoaXMuZW5naW5lKHRoaXMucGF0aCwgb3B0aW9ucywgY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBmaWxlIHdpdGhpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlXG4gKiBAcHJpdmF0ZVxuICovXG5cblZpZXcucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlKGRpciwgZmlsZSkge1xuICB2YXIgZXh0ID0gdGhpcy5leHQ7XG5cbiAgLy8gPHBhdGg+LjxleHQ+XG4gIHZhciBwYXRoID0gam9pbihkaXIsIGZpbGUpO1xuICB2YXIgc3RhdCA9IHRyeVN0YXQocGF0aCk7XG5cbiAgaWYgKHN0YXQgJiYgc3RhdC5pc0ZpbGUoKSkge1xuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgLy8gPHBhdGg+L2luZGV4LjxleHQ+XG4gIHBhdGggPSBqb2luKGRpciwgYmFzZW5hbWUoZmlsZSwgZXh0KSwgJ2luZGV4JyArIGV4dCk7XG4gIHN0YXQgPSB0cnlTdGF0KHBhdGgpO1xuXG4gIGlmIChzdGF0ICYmIHN0YXQuaXNGaWxlKCkpIHtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm4gYSBzdGF0LCBtYXliZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHJldHVybiB7ZnMuU3RhdHN9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRyeVN0YXQocGF0aCkge1xuICBkZWJ1Zygnc3RhdCBcIiVzXCInLCBwYXRoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBmcy5zdGF0U3luYyhwYXRoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsICIvKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cbnZhciBidWZmZXIgPSByZXF1aXJlKCdidWZmZXInKVxudmFyIEJ1ZmZlciA9IGJ1ZmZlci5CdWZmZXJcblxuLy8gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgT2JqZWN0LmtleXMgZm9yIG9sZCBicm93c2Vyc1xuZnVuY3Rpb24gY29weVByb3BzIChzcmMsIGRzdCkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgZHN0W2tleV0gPSBzcmNba2V5XVxuICB9XG59XG5pZiAoQnVmZmVyLmZyb20gJiYgQnVmZmVyLmFsbG9jICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZSAmJiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KSB7XG4gIG1vZHVsZS5leHBvcnRzID0gYnVmZmVyXG59IGVsc2Uge1xuICAvLyBDb3B5IHByb3BlcnRpZXMgZnJvbSByZXF1aXJlKCdidWZmZXInKVxuICBjb3B5UHJvcHMoYnVmZmVyLCBleHBvcnRzKVxuICBleHBvcnRzLkJ1ZmZlciA9IFNhZmVCdWZmZXJcbn1cblxuZnVuY3Rpb24gU2FmZUJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEJ1ZmZlci5wcm90b3R5cGUpXG5cbi8vIENvcHkgc3RhdGljIG1ldGhvZHMgZnJvbSBCdWZmZXJcbmNvcHlQcm9wcyhCdWZmZXIsIFNhZmVCdWZmZXIpXG5cblNhZmVCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBidWYuZmlsbCgwKVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKHNpemUpXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKVxufVxuIiwgIi8qIVxuICogY29udGVudC1kaXNwb3NpdGlvblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50RGlzcG9zaXRpb25cbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcGFyc2VcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgYmFzZW5hbWUgPSByZXF1aXJlKCdwYXRoJykuYmFzZW5hbWVcbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBub24gYXR0ci1jaGFyLCAqYWZ0ZXIqIGVuY29kZVVSSUNvbXBvbmVudCAoaS5lLiBub3QgaW5jbHVkaW5nIFwiJVwiKVxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRU5DT0RFX1VSTF9BVFRSX0NIQVJfUkVHRVhQID0gL1tcXHgwMC1cXHgyMFwiJygpKiwvOjs8PT4/QFtcXFxcXFxde31cXHg3Zl0vZyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggcGVyY2VudCBlbmNvZGluZyBlc2NhcGUuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBIRVhfRVNDQVBFX1JFR0VYUCA9IC8lWzAtOUEtRmEtZl17Mn0vXG52YXIgSEVYX0VTQ0FQRV9SRVBMQUNFX1JFR0VYUCA9IC8lKFswLTlBLUZhLWZdezJ9KS9nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIG5vbi1sYXRpbjEgY2hhcmFjdGVycy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIE5PTl9MQVRJTjFfUkVHRVhQID0gL1teXFx4MjAtXFx4N2VcXHhhMC1cXHhmZl0vZ1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBxdW90ZWQtcGFpciBpbiBSRkMgMjYxNlxuICpcbiAqIHF1b3RlZC1wYWlyID0gXCJcXFwiIENIQVJcbiAqIENIQVIgICAgICAgID0gPGFueSBVUy1BU0NJSSBjaGFyYWN0ZXIgKG9jdGV0cyAwIC0gMTI3KT5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFFFU0NfUkVHRVhQID0gL1xcXFwoW1xcdTAwMDAtXFx1MDA3Zl0pL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNoYXJzIHRoYXQgbXVzdCBiZSBxdW90ZWQtcGFpciBpbiBSRkMgMjYxNlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgUVVPVEVfUkVHRVhQID0gLyhbXFxcXFwiXSkvZ1xuXG4vKipcbiAqIFJlZ0V4cCBmb3IgdmFyaW91cyBSRkMgMjYxNiBncmFtbWFyXG4gKlxuICogcGFyYW1ldGVyICAgICA9IHRva2VuIFwiPVwiICggdG9rZW4gfCBxdW90ZWQtc3RyaW5nIClcbiAqIHRva2VuICAgICAgICAgPSAxKjxhbnkgQ0hBUiBleGNlcHQgQ1RMcyBvciBzZXBhcmF0b3JzPlxuICogc2VwYXJhdG9ycyAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAqICAgICAgICAgICAgICAgfCBcIixcIiB8IFwiO1wiIHwgXCI6XCIgfCBcIlxcXCIgfCA8XCI+XG4gKiAgICAgICAgICAgICAgIHwgXCIvXCIgfCBcIltcIiB8IFwiXVwiIHwgXCI/XCIgfCBcIj1cIlxuICogICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKiBxdW90ZWQtc3RyaW5nID0gKCA8XCI+ICoocWR0ZXh0IHwgcXVvdGVkLXBhaXIgKSA8XCI+IClcbiAqIHFkdGV4dCAgICAgICAgPSA8YW55IFRFWFQgZXhjZXB0IDxcIj4+XG4gKiBxdW90ZWQtcGFpciAgID0gXCJcXFwiIENIQVJcbiAqIENIQVIgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuICogVEVYVCAgICAgICAgICA9IDxhbnkgT0NURVQgZXhjZXB0IENUTHMsIGJ1dCBpbmNsdWRpbmcgTFdTPlxuICogTFdTICAgICAgICAgICA9IFtDUkxGXSAxKiggU1AgfCBIVCApXG4gKiBDUkxGICAgICAgICAgID0gQ1IgTEZcbiAqIENSICAgICAgICAgICAgPSA8VVMtQVNDSUkgQ1IsIGNhcnJpYWdlIHJldHVybiAoMTMpPlxuICogTEYgICAgICAgICAgICA9IDxVUy1BU0NJSSBMRiwgbGluZWZlZWQgKDEwKT5cbiAqIFNQICAgICAgICAgICAgPSA8VVMtQVNDSUkgU1AsIHNwYWNlICgzMik+XG4gKiBIVCAgICAgICAgICAgID0gPFVTLUFTQ0lJIEhULCBob3Jpem9udGFsLXRhYiAoOSk+XG4gKiBDVEwgICAgICAgICAgID0gPGFueSBVUy1BU0NJSSBjb250cm9sIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAzMSkgYW5kIERFTCAoMTI3KT5cbiAqIE9DVEVUICAgICAgICAgPSA8YW55IDgtYml0IHNlcXVlbmNlIG9mIGRhdGE+XG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBQQVJBTV9SRUdFWFAgPSAvO1tcXHgwOVxceDIwXSooWyEjJCUmJyorLjAtOUEtWl5fYGEtenx+LV0rKVtcXHgwOVxceDIwXSo9W1xceDA5XFx4MjBdKihcIig/OltcXHgyMCFcXHgyMy1cXHg1YlxceDVkLVxceDdlXFx4ODAtXFx4ZmZdfFxcXFxbXFx4MjAtXFx4N2VdKSpcInxbISMkJSYnKisuMC05QS1aXl9gYS16fH4tXSspW1xceDA5XFx4MjBdKi9nIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxudmFyIFRFWFRfUkVHRVhQID0gL15bXFx4MjAtXFx4N2VcXHg4MC1cXHhmZl0rJC9cbnZhciBUT0tFTl9SRUdFWFAgPSAvXlshIyQlJicqKy4wLTlBLVpeX2BhLXp8fi1dKyQvXG5cbi8qKlxuICogUmVnRXhwIGZvciB2YXJpb3VzIFJGQyA1OTg3IGdyYW1tYXJcbiAqXG4gKiBleHQtdmFsdWUgICAgID0gY2hhcnNldCAgXCInXCIgWyBsYW5ndWFnZSBdIFwiJ1wiIHZhbHVlLWNoYXJzXG4gKiBjaGFyc2V0ICAgICAgID0gXCJVVEYtOFwiIC8gXCJJU08tODg1OS0xXCIgLyBtaW1lLWNoYXJzZXRcbiAqIG1pbWUtY2hhcnNldCAgPSAxKm1pbWUtY2hhcnNldGNcbiAqIG1pbWUtY2hhcnNldGMgPSBBTFBIQSAvIERJR0lUXG4gKiAgICAgICAgICAgICAgIC8gXCIhXCIgLyBcIiNcIiAvIFwiJFwiIC8gXCIlXCIgLyBcIiZcIlxuICogICAgICAgICAgICAgICAvIFwiK1wiIC8gXCItXCIgLyBcIl5cIiAvIFwiX1wiIC8gXCJgXCJcbiAqICAgICAgICAgICAgICAgLyBcIntcIiAvIFwifVwiIC8gXCJ+XCJcbiAqIGxhbmd1YWdlICAgICAgPSAoIDIqM0FMUEhBIFsgZXh0bGFuZyBdIClcbiAqICAgICAgICAgICAgICAgLyA0QUxQSEFcbiAqICAgICAgICAgICAgICAgLyA1KjhBTFBIQVxuICogZXh0bGFuZyAgICAgICA9ICozKCBcIi1cIiAzQUxQSEEgKVxuICogdmFsdWUtY2hhcnMgICA9ICooIHBjdC1lbmNvZGVkIC8gYXR0ci1jaGFyIClcbiAqIHBjdC1lbmNvZGVkICAgPSBcIiVcIiBIRVhESUcgSEVYRElHXG4gKiBhdHRyLWNoYXIgICAgID0gQUxQSEEgLyBESUdJVFxuICogICAgICAgICAgICAgICAvIFwiIVwiIC8gXCIjXCIgLyBcIiRcIiAvIFwiJlwiIC8gXCIrXCIgLyBcIi1cIiAvIFwiLlwiXG4gKiAgICAgICAgICAgICAgIC8gXCJeXCIgLyBcIl9cIiAvIFwiYFwiIC8gXCJ8XCIgLyBcIn5cIlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRVhUX1ZBTFVFX1JFR0VYUCA9IC9eKFtBLVphLXowLTkhIyQlJitcXC1eX2B7fX5dKyknKD86W0EtWmEtel17MiwzfSg/Oi1bQS1aYS16XXszfSl7MCwzfXxbQS1aYS16XXs0LDh9fCknKCg/OiVbMC05QS1GYS1mXXsyfXxbQS1aYS16MC05ISMkJisuXl9gfH4tXSkrKSQvXG5cbi8qKlxuICogUmVnRXhwIGZvciB2YXJpb3VzIFJGQyA2MjY2IGdyYW1tYXJcbiAqXG4gKiBkaXNwb3NpdGlvbi10eXBlID0gXCJpbmxpbmVcIiB8IFwiYXR0YWNobWVudFwiIHwgZGlzcC1leHQtdHlwZVxuICogZGlzcC1leHQtdHlwZSAgICA9IHRva2VuXG4gKiBkaXNwb3NpdGlvbi1wYXJtID0gZmlsZW5hbWUtcGFybSB8IGRpc3AtZXh0LXBhcm1cbiAqIGZpbGVuYW1lLXBhcm0gICAgPSBcImZpbGVuYW1lXCIgXCI9XCIgdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgfCBcImZpbGVuYW1lKlwiIFwiPVwiIGV4dC12YWx1ZVxuICogZGlzcC1leHQtcGFybSAgICA9IHRva2VuIFwiPVwiIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgIHwgZXh0LXRva2VuIFwiPVwiIGV4dC12YWx1ZVxuICogZXh0LXRva2VuICAgICAgICA9IDx0aGUgY2hhcmFjdGVycyBpbiB0b2tlbiwgZm9sbG93ZWQgYnkgXCIqXCI+XG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBESVNQT1NJVElPTl9UWVBFX1JFR0VYUCA9IC9eKFshIyQlJicqKy4wLTlBLVpeX2BhLXp8fi1dKylbXFx4MDlcXHgyMF0qKD86JHw7KS8gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG5cbi8qKlxuICogQ3JlYXRlIGFuIGF0dGFjaG1lbnQgQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtmaWxlbmFtZV1cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy50eXBlPWF0dGFjaG1lbnRdXG4gKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSBbb3B0aW9ucy5mYWxsYmFjaz10cnVlXVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNvbnRlbnREaXNwb3NpdGlvbiAoZmlsZW5hbWUsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9XG5cbiAgLy8gZ2V0IHR5cGVcbiAgdmFyIHR5cGUgPSBvcHRzLnR5cGUgfHwgJ2F0dGFjaG1lbnQnXG5cbiAgLy8gZ2V0IHBhcmFtZXRlcnNcbiAgdmFyIHBhcmFtcyA9IGNyZWF0ZXBhcmFtcyhmaWxlbmFtZSwgb3B0cy5mYWxsYmFjaylcblxuICAvLyBmb3JtYXQgaW50byBzdHJpbmdcbiAgcmV0dXJuIGZvcm1hdChuZXcgQ29udGVudERpc3Bvc2l0aW9uKHR5cGUsIHBhcmFtcykpXG59XG5cbi8qKlxuICogQ3JlYXRlIHBhcmFtZXRlcnMgb2JqZWN0IGZyb20gZmlsZW5hbWUgYW5kIGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmlsZW5hbWVdXG4gKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSBbZmFsbGJhY2s9dHJ1ZV1cbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlcGFyYW1zIChmaWxlbmFtZSwgZmFsbGJhY2spIHtcbiAgaWYgKGZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBwYXJhbXMgPSB7fVxuXG4gIGlmICh0eXBlb2YgZmlsZW5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmlsZW5hbWUgbXVzdCBiZSBhIHN0cmluZycpXG4gIH1cblxuICAvLyBmYWxsYmFjayBkZWZhdWx0cyB0byB0cnVlXG4gIGlmIChmYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZmFsbGJhY2sgPSB0cnVlXG4gIH1cblxuICBpZiAodHlwZW9mIGZhbGxiYWNrICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgZmFsbGJhY2sgIT09ICdib29sZWFuJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZhbGxiYWNrIG11c3QgYmUgYSBzdHJpbmcgb3IgYm9vbGVhbicpXG4gIH1cblxuICBpZiAodHlwZW9mIGZhbGxiYWNrID09PSAnc3RyaW5nJyAmJiBOT05fTEFUSU4xX1JFR0VYUC50ZXN0KGZhbGxiYWNrKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZhbGxiYWNrIG11c3QgYmUgSVNPLTg4NTktMSBzdHJpbmcnKVxuICB9XG5cbiAgLy8gcmVzdHJpY3QgdG8gZmlsZSBiYXNlIG5hbWVcbiAgdmFyIG5hbWUgPSBiYXNlbmFtZShmaWxlbmFtZSlcblxuICAvLyBkZXRlcm1pbmUgaWYgbmFtZSBpcyBzdWl0YWJsZSBmb3IgcXVvdGVkIHN0cmluZ1xuICB2YXIgaXNRdW90ZWRTdHJpbmcgPSBURVhUX1JFR0VYUC50ZXN0KG5hbWUpXG5cbiAgLy8gZ2VuZXJhdGUgZmFsbGJhY2sgbmFtZVxuICB2YXIgZmFsbGJhY2tOYW1lID0gdHlwZW9mIGZhbGxiYWNrICE9PSAnc3RyaW5nJ1xuICAgID8gZmFsbGJhY2sgJiYgZ2V0bGF0aW4xKG5hbWUpXG4gICAgOiBiYXNlbmFtZShmYWxsYmFjaylcbiAgdmFyIGhhc0ZhbGxiYWNrID0gdHlwZW9mIGZhbGxiYWNrTmFtZSA9PT0gJ3N0cmluZycgJiYgZmFsbGJhY2tOYW1lICE9PSBuYW1lXG5cbiAgLy8gc2V0IGV4dGVuZGVkIGZpbGVuYW1lIHBhcmFtZXRlclxuICBpZiAoaGFzRmFsbGJhY2sgfHwgIWlzUXVvdGVkU3RyaW5nIHx8IEhFWF9FU0NBUEVfUkVHRVhQLnRlc3QobmFtZSkpIHtcbiAgICBwYXJhbXNbJ2ZpbGVuYW1lKiddID0gbmFtZVxuICB9XG5cbiAgLy8gc2V0IGZpbGVuYW1lIHBhcmFtZXRlclxuICBpZiAoaXNRdW90ZWRTdHJpbmcgfHwgaGFzRmFsbGJhY2spIHtcbiAgICBwYXJhbXMuZmlsZW5hbWUgPSBoYXNGYWxsYmFja1xuICAgICAgPyBmYWxsYmFja05hbWVcbiAgICAgIDogbmFtZVxuICB9XG5cbiAgcmV0dXJuIHBhcmFtc1xufVxuXG4vKipcbiAqIEZvcm1hdCBvYmplY3QgdG8gQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9ialxuICogQHBhcmFtIHtzdHJpbmd9IG9iai50eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gW29iai5wYXJhbWV0ZXJzXVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXQgKG9iaikge1xuICB2YXIgcGFyYW1ldGVycyA9IG9iai5wYXJhbWV0ZXJzXG4gIHZhciB0eXBlID0gb2JqLnR5cGVcblxuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnIHx8ICFUT0tFTl9SRUdFWFAudGVzdCh0eXBlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgdHlwZScpXG4gIH1cblxuICAvLyBzdGFydCB3aXRoIG5vcm1hbGl6ZWQgdHlwZVxuICB2YXIgc3RyaW5nID0gU3RyaW5nKHR5cGUpLnRvTG93ZXJDYXNlKClcblxuICAvLyBhcHBlbmQgcGFyYW1ldGVyc1xuICBpZiAocGFyYW1ldGVycyAmJiB0eXBlb2YgcGFyYW1ldGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgcGFyYW1cbiAgICB2YXIgcGFyYW1zID0gT2JqZWN0LmtleXMocGFyYW1ldGVycykuc29ydCgpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFyYW0gPSBwYXJhbXNbaV1cblxuICAgICAgdmFyIHZhbCA9IHBhcmFtLnN1YnN0cigtMSkgPT09ICcqJ1xuICAgICAgICA/IHVzdHJpbmcocGFyYW1ldGVyc1twYXJhbV0pXG4gICAgICAgIDogcXN0cmluZyhwYXJhbWV0ZXJzW3BhcmFtXSlcblxuICAgICAgc3RyaW5nICs9ICc7ICcgKyBwYXJhbSArICc9JyArIHZhbFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHJpbmdcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBSRkMgNTk4NyBmaWVsZCB2YWx1ZSAoZ3JhY2VmdWxseSkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBkZWNvZGVmaWVsZCAoc3RyKSB7XG4gIHZhciBtYXRjaCA9IEVYVF9WQUxVRV9SRUdFWFAuZXhlYyhzdHIpXG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgZXh0ZW5kZWQgZmllbGQgdmFsdWUnKVxuICB9XG5cbiAgdmFyIGNoYXJzZXQgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gIHZhciBlbmNvZGVkID0gbWF0Y2hbMl1cbiAgdmFyIHZhbHVlXG5cbiAgLy8gdG8gYmluYXJ5IHN0cmluZ1xuICB2YXIgYmluYXJ5ID0gZW5jb2RlZC5yZXBsYWNlKEhFWF9FU0NBUEVfUkVQTEFDRV9SRUdFWFAsIHBkZWNvZGUpXG5cbiAgc3dpdGNoIChjaGFyc2V0KSB7XG4gICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgICB2YWx1ZSA9IGdldGxhdGluMShiaW5hcnkpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIHZhbHVlID0gQnVmZmVyLmZyb20oYmluYXJ5LCAnYmluYXJ5JykudG9TdHJpbmcoJ3V0ZjgnKVxuICAgICAgYnJlYWtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5zdXBwb3J0ZWQgY2hhcnNldCBpbiBleHRlbmRlZCBmaWVsZCcpXG4gIH1cblxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBHZXQgSVNPLTg4NTktMSB2ZXJzaW9uIG9mIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldGxhdGluMSAodmFsKSB7XG4gIC8vIHNpbXBsZSBVbmljb2RlIC0+IElTTy04ODU5LTEgdHJhbnNmb3JtYXRpb25cbiAgcmV0dXJuIFN0cmluZyh2YWwpLnJlcGxhY2UoTk9OX0xBVElOMV9SRUdFWFAsICc/Jylcbn1cblxuLyoqXG4gKiBQYXJzZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7b2JqZWN0fVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHBhcnNlIChzdHJpbmcpIHtcbiAgaWYgKCFzdHJpbmcgfHwgdHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzdHJpbmcgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgdmFyIG1hdGNoID0gRElTUE9TSVRJT05fVFlQRV9SRUdFWFAuZXhlYyhzdHJpbmcpXG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgdHlwZSBmb3JtYXQnKVxuICB9XG5cbiAgLy8gbm9ybWFsaXplIHR5cGVcbiAgdmFyIGluZGV4ID0gbWF0Y2hbMF0ubGVuZ3RoXG4gIHZhciB0eXBlID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuXG4gIHZhciBrZXlcbiAgdmFyIG5hbWVzID0gW11cbiAgdmFyIHBhcmFtcyA9IHt9XG4gIHZhciB2YWx1ZVxuXG4gIC8vIGNhbGN1bGF0ZSBpbmRleCB0byBzdGFydCBhdFxuICBpbmRleCA9IFBBUkFNX1JFR0VYUC5sYXN0SW5kZXggPSBtYXRjaFswXS5zdWJzdHIoLTEpID09PSAnOydcbiAgICA/IGluZGV4IC0gMVxuICAgIDogaW5kZXhcblxuICAvLyBtYXRjaCBwYXJhbWV0ZXJzXG4gIHdoaWxlICgobWF0Y2ggPSBQQVJBTV9SRUdFWFAuZXhlYyhzdHJpbmcpKSkge1xuICAgIGlmIChtYXRjaC5pbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIGZvcm1hdCcpXG4gICAgfVxuXG4gICAgaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAga2V5ID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIHZhbHVlID0gbWF0Y2hbMl1cblxuICAgIGlmIChuYW1lcy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGR1cGxpY2F0ZSBwYXJhbWV0ZXInKVxuICAgIH1cblxuICAgIG5hbWVzLnB1c2goa2V5KVxuXG4gICAgaWYgKGtleS5pbmRleE9mKCcqJykgKyAxID09PSBrZXkubGVuZ3RoKSB7XG4gICAgICAvLyBkZWNvZGUgZXh0ZW5kZWQgdmFsdWVcbiAgICAgIGtleSA9IGtleS5zbGljZSgwLCAtMSlcbiAgICAgIHZhbHVlID0gZGVjb2RlZmllbGQodmFsdWUpXG5cbiAgICAgIC8vIG92ZXJ3cml0ZSBleGlzdGluZyB2YWx1ZVxuICAgICAgcGFyYW1zW2tleV0gPSB2YWx1ZVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtc1trZXldID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAodmFsdWVbMF0gPT09ICdcIicpIHtcbiAgICAgIC8vIHJlbW92ZSBxdW90ZXMgYW5kIGVzY2FwZXNcbiAgICAgIHZhbHVlID0gdmFsdWVcbiAgICAgICAgLnN1YnN0cigxLCB2YWx1ZS5sZW5ndGggLSAyKVxuICAgICAgICAucmVwbGFjZShRRVNDX1JFR0VYUCwgJyQxJylcbiAgICB9XG5cbiAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gIH1cblxuICBpZiAoaW5kZXggIT09IC0xICYmIGluZGV4ICE9PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgZm9ybWF0JylcbiAgfVxuXG4gIHJldHVybiBuZXcgQ29udGVudERpc3Bvc2l0aW9uKHR5cGUsIHBhcmFtcylcbn1cblxuLyoqXG4gKiBQZXJjZW50IGRlY29kZSBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtzdHJpbmd9IGhleFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwZGVjb2RlIChzdHIsIGhleCkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSlcbn1cblxuLyoqXG4gKiBQZXJjZW50IGVuY29kZSBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGVuY29kZSAoY2hhcikge1xuICByZXR1cm4gJyUnICsgU3RyaW5nKGNoYXIpXG4gICAgLmNoYXJDb2RlQXQoMClcbiAgICAudG9TdHJpbmcoMTYpXG4gICAgLnRvVXBwZXJDYXNlKClcbn1cblxuLyoqXG4gKiBRdW90ZSBhIHN0cmluZyBmb3IgSFRUUC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHFzdHJpbmcgKHZhbCkge1xuICB2YXIgc3RyID0gU3RyaW5nKHZhbClcblxuICByZXR1cm4gJ1wiJyArIHN0ci5yZXBsYWNlKFFVT1RFX1JFR0VYUCwgJ1xcXFwkMScpICsgJ1wiJ1xufVxuXG4vKipcbiAqIEVuY29kZSBhIFVuaWNvZGUgc3RyaW5nIGZvciBIVFRQIChSRkMgNTk4NykuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB1c3RyaW5nICh2YWwpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyh2YWwpXG5cbiAgLy8gcGVyY2VudCBlbmNvZGUgYXMgVVRGLThcbiAgdmFyIGVuY29kZWQgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyKVxuICAgIC5yZXBsYWNlKEVOQ09ERV9VUkxfQVRUUl9DSEFSX1JFR0VYUCwgcGVuY29kZSlcblxuICByZXR1cm4gJ1VURi04XFwnXFwnJyArIGVuY29kZWRcbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgcGFyc2VkIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyIGZvciB2OCBvcHRpbWl6YXRpb25cbiAqXG4gKiBAcHVibGljXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHBhcmFtZXRlcnNcbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIENvbnRlbnREaXNwb3NpdGlvbiAodHlwZSwgcGFyYW1ldGVycykge1xuICB0aGlzLnR5cGUgPSB0eXBlXG4gIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnNcbn1cbiIsICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oKD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICBpZiAobXMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtcyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgcmV0dXJuIHBsdXJhbChtcywgZCwgJ2RheScpIHx8XG4gICAgcGx1cmFsKG1zLCBoLCAnaG91cicpIHx8XG4gICAgcGx1cmFsKG1zLCBtLCAnbWludXRlJykgfHxcbiAgICBwbHVyYWwobXMsIHMsICdzZWNvbmQnKSB8fFxuICAgIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBuLCBuYW1lKSB7XG4gIGlmIChtcyA8IG4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1zIDwgbiAqIDEuNSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKG1zIC8gbikgKyAnICcgKyBuYW1lO1xuICB9XG4gIHJldHVybiBNYXRoLmNlaWwobXMgLyBuKSArICcgJyArIG5hbWUgKyAncyc7XG59XG4iLCAiXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbW1vbiBsb2dpYyBmb3IgYm90aCB0aGUgTm9kZS5qcyBhbmQgd2ViIGJyb3dzZXJcbiAqIGltcGxlbWVudGF0aW9ucyBvZiBgZGVidWcoKWAuXG4gKlxuICogRXhwb3NlIGBkZWJ1ZygpYCBhcyB0aGUgbW9kdWxlLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZURlYnVnLmRlYnVnID0gY3JlYXRlRGVidWdbJ2RlZmF1bHQnXSA9IGNyZWF0ZURlYnVnO1xuZXhwb3J0cy5jb2VyY2UgPSBjb2VyY2U7XG5leHBvcnRzLmRpc2FibGUgPSBkaXNhYmxlO1xuZXhwb3J0cy5lbmFibGUgPSBlbmFibGU7XG5leHBvcnRzLmVuYWJsZWQgPSBlbmFibGVkO1xuZXhwb3J0cy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cbi8qKlxuICogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG4gKi9cblxuZXhwb3J0cy5uYW1lcyA9IFtdO1xuZXhwb3J0cy5za2lwcyA9IFtdO1xuXG4vKipcbiAqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cbiAqXG4gKiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzID0ge307XG5cbi8qKlxuICogUHJldmlvdXMgbG9nIHRpbWVzdGFtcC5cbiAqL1xuXG52YXIgcHJldlRpbWU7XG5cbi8qKlxuICogU2VsZWN0IGEgY29sb3IuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcbiAgdmFyIGhhc2ggPSAwLCBpO1xuXG4gIGZvciAoaSBpbiBuYW1lc3BhY2UpIHtcbiAgICBoYXNoICA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzLmNvbG9yc1tNYXRoLmFicyhoYXNoKSAlIGV4cG9ydHMuY29sb3JzLmxlbmd0aF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVidWdnZXIgd2l0aCB0aGUgZ2l2ZW4gYG5hbWVzcGFjZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXG4gIGZ1bmN0aW9uIGRlYnVnKCkge1xuICAgIC8vIGRpc2FibGVkP1xuICAgIGlmICghZGVidWcuZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgdmFyIHNlbGYgPSBkZWJ1ZztcblxuICAgIC8vIHNldCBgZGlmZmAgdGltZXN0YW1wXG4gICAgdmFyIGN1cnIgPSArbmV3IERhdGUoKTtcbiAgICB2YXIgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuICAgIHNlbGYuZGlmZiA9IG1zO1xuICAgIHNlbGYucHJldiA9IHByZXZUaW1lO1xuICAgIHNlbGYuY3VyciA9IGN1cnI7XG4gICAgcHJldlRpbWUgPSBjdXJyO1xuXG4gICAgLy8gdHVybiB0aGUgYGFyZ3VtZW50c2AgaW50byBhIHByb3BlciBBcnJheVxuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBhcmdzWzBdID0gZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7XG5cbiAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhcmdzWzBdKSB7XG4gICAgICAvLyBhbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuICAgICAgYXJncy51bnNoaWZ0KCclTycpO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgZnVuY3Rpb24obWF0Y2gsIGZvcm1hdCkge1xuICAgICAgLy8gaWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuICAgICAgaWYgKG1hdGNoID09PSAnJSUnKSByZXR1cm4gbWF0Y2g7XG4gICAgICBpbmRleCsrO1xuICAgICAgdmFyIGZvcm1hdHRlciA9IGV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBmb3JtYXR0ZXIpIHtcbiAgICAgICAgdmFyIHZhbCA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICBtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cbiAgICAgICAgLy8gbm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIGluZGV4LS07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG5cbiAgICAvLyBhcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuICAgIGV4cG9ydHMuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG4gICAgdmFyIGxvZ0ZuID0gZGVidWcubG9nIHx8IGV4cG9ydHMubG9nIHx8IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XG4gICAgbG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH1cblxuICBkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gIGRlYnVnLmVuYWJsZWQgPSBleHBvcnRzLmVuYWJsZWQobmFtZXNwYWNlKTtcbiAgZGVidWcudXNlQ29sb3JzID0gZXhwb3J0cy51c2VDb2xvcnMoKTtcbiAgZGVidWcuY29sb3IgPSBzZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXG4gIC8vIGVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG4gIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZXhwb3J0cy5pbml0KSB7XG4gICAgZXhwb3J0cy5pbml0KGRlYnVnKTtcbiAgfVxuXG4gIHJldHVybiBkZWJ1Zztcbn1cblxuLyoqXG4gKiBFbmFibGVzIGEgZGVidWcgbW9kZSBieSBuYW1lc3BhY2VzLiBUaGlzIGNhbiBpbmNsdWRlIG1vZGVzXG4gKiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG4gIGV4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTtcblxuICBleHBvcnRzLm5hbWVzID0gW107XG4gIGV4cG9ydHMuc2tpcHMgPSBbXTtcblxuICB2YXIgc3BsaXQgPSAodHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcyA6ICcnKS5zcGxpdCgvW1xccyxdKy8pO1xuICB2YXIgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoIXNwbGl0W2ldKSBjb250aW51ZTsgLy8gaWdub3JlIGVtcHR5IHN0cmluZ3NcbiAgICBuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcbiAgICBpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG4gICAgICBleHBvcnRzLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICBleHBvcnRzLmVuYWJsZSgnJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcbiAgdmFyIGksIGxlbjtcbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgZm9yIChpID0gMCwgbGVuID0gZXhwb3J0cy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ29lcmNlIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2VyY2UodmFsKSB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcbiAgcmV0dXJuIHZhbDtcbn1cbiIsICIvKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kZWJ1ZycpO1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWVcbiAgICAgICAgICAgICAgICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiBjaHJvbWUuc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgPyBjaHJvbWUuc3RvcmFnZS5sb2NhbFxuICAgICAgICAgICAgICAgICAgOiBsb2NhbHN0b3JhZ2UoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG4gICdsaWdodHNlYWdyZWVuJyxcbiAgJ2ZvcmVzdGdyZWVuJyxcbiAgJ2dvbGRlbnJvZCcsXG4gICdkb2RnZXJibHVlJyxcbiAgJ2RhcmtvcmNoaWQnLFxuICAnY3JpbXNvbidcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuICAvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG4gIC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG4gIC8vIGV4cGxpY2l0bHlcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmIHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGlzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG4gIC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG4gIHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuICAgIC8vIGlzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuICAgIC8vIGlzIGZpcmVmb3ggPj0gdjMxP1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuICAgIC8vIGRvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcbiAgICAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uKHYpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnIubWVzc2FnZTtcbiAgfVxufTtcblxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuICB2YXIgdXNlQ29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cbiAgYXJnc1swXSA9ICh1c2VDb2xvcnMgPyAnJWMnIDogJycpXG4gICAgKyB0aGlzLm5hbWVzcGFjZVxuICAgICsgKHVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKVxuICAgICsgYXJnc1swXVxuICAgICsgKHVzZUNvbG9ycyA/ICclYyAnIDogJyAnKVxuICAgICsgJysnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG4gIGlmICghdXNlQ29sb3JzKSByZXR1cm47XG5cbiAgdmFyIGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuICBhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKVxuXG4gIC8vIHRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG4gIC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cbiAgLy8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0QyA9IDA7XG4gIGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBmdW5jdGlvbihtYXRjaCkge1xuICAgIGlmICgnJSUnID09PSBtYXRjaCkgcmV0dXJuO1xuICAgIGluZGV4Kys7XG4gICAgaWYgKCclYycgPT09IG1hdGNoKSB7XG4gICAgICAvLyB3ZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcbiAgICAgIC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG4gICAgICBsYXN0QyA9IGluZGV4O1xuICAgIH1cbiAgfSk7XG5cbiAgYXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUubG9nKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5sb2dgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgLy8gdGhpcyBoYWNrZXJ5IGlzIHJlcXVpcmVkIGZvciBJRTgvOSwgd2hlcmVcbiAgLy8gdGhlIGBjb25zb2xlLmxvZ2AgZnVuY3Rpb24gZG9lc24ndCBoYXZlICdhcHBseSdcbiAgcmV0dXJuICdvYmplY3QnID09PSB0eXBlb2YgY29uc29sZVxuICAgICYmIGNvbnNvbGUubG9nXG4gICAgJiYgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5sb2csIGNvbnNvbGUsIGFyZ3VtZW50cyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuICB0cnkge1xuICAgIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRzLnN0b3JhZ2UuZGVidWcgPSBuYW1lc3BhY2VzO1xuICAgIH1cbiAgfSBjYXRjaChlKSB7fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIHIgPSBleHBvcnRzLnN0b3JhZ2UuZGVidWc7XG4gIH0gY2F0Y2goZSkge31cblxuICAvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG4gIGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuICAgIHIgPSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfVxuXG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIEVuYWJsZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiBgbG9jYWxTdG9yYWdlLmRlYnVnYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG4iLCAiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciB0dHkgPSByZXF1aXJlKCd0dHknKTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIC9eZGVidWdfL2kudGVzdChrZXkpO1xufSkucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAvLyBjYW1lbC1jYXNlXG4gIHZhciBwcm9wID0ga2V5XG4gICAgLnN1YnN0cmluZyg2KVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL18oW2Etel0pL2csIGZ1bmN0aW9uIChfLCBrKSB7IHJldHVybiBrLnRvVXBwZXJDYXNlKCkgfSk7XG5cbiAgLy8gY29lcmNlIHN0cmluZyB2YWx1ZSBpbnRvIEpTIHZhbHVlXG4gIHZhciB2YWwgPSBwcm9jZXNzLmVudltrZXldO1xuICBpZiAoL14oeWVzfG9ufHRydWV8ZW5hYmxlZCkkL2kudGVzdCh2YWwpKSB2YWwgPSB0cnVlO1xuICBlbHNlIGlmICgvXihub3xvZmZ8ZmFsc2V8ZGlzYWJsZWQpJC9pLnRlc3QodmFsKSkgdmFsID0gZmFsc2U7XG4gIGVsc2UgaWYgKHZhbCA9PT0gJ251bGwnKSB2YWwgPSBudWxsO1xuICBlbHNlIHZhbCA9IE51bWJlcih2YWwpO1xuXG4gIG9ialtwcm9wXSA9IHZhbDtcbiAgcmV0dXJuIG9iajtcbn0sIHt9KTtcblxuLyoqXG4gKiBUaGUgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIHRoZSBgZGVidWcoKWAgY2FsbHMgdG8uXG4gKiBTZXQgdGhlIGBERUJVR19GRGAgZW52IHZhcmlhYmxlIHRvIG92ZXJyaWRlIHdpdGggYW5vdGhlciB2YWx1ZS4gaS5lLjpcbiAqXG4gKiAgICQgREVCVUdfRkQ9MyBub2RlIHNjcmlwdC5qcyAzPmRlYnVnLmxvZ1xuICovXG5cbnZhciBmZCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkRFQlVHX0ZELCAxMCkgfHwgMjtcblxuaWYgKDEgIT09IGZkICYmIDIgIT09IGZkKSB7XG4gIHV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uKCl7fSwgJ2V4Y2VwdCBmb3Igc3RkZXJyKDIpIGFuZCBzdGRvdXQoMSksIGFueSBvdGhlciB1c2FnZSBvZiBERUJVR19GRCBpcyBkZXByZWNhdGVkLiBPdmVycmlkZSBkZWJ1Zy5sb2cgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGxvZyBmdW5jdGlvbiAoaHR0cHM6Ly9naXQuaW8vZGVidWdfZmQpJykoKVxufVxuXG52YXIgc3RyZWFtID0gMSA9PT0gZmQgPyBwcm9jZXNzLnN0ZG91dCA6XG4gICAgICAgICAgICAgMiA9PT0gZmQgPyBwcm9jZXNzLnN0ZGVyciA6XG4gICAgICAgICAgICAgY3JlYXRlV3JpdGFibGVTdGRpb1N0cmVhbShmZCk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcbiAgcmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHNcbiAgICA/IEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpXG4gICAgOiB0dHkuaXNhdHR5KGZkKTtcbn1cblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsIG9uIGEgc2luZ2xlIGxpbmUuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbih2KSB7XG4gIHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG4gIHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cylcbiAgICAuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihzdHIpIHtcbiAgICAgIHJldHVybiBzdHIudHJpbSgpXG4gICAgfSkuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsb3dpbmcgbXVsdGlwbGUgbGluZXMgaWYgbmVlZGVkLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5PID0gZnVuY3Rpb24odikge1xuICB0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuICByZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLm5hbWVzcGFjZTtcbiAgdmFyIHVzZUNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXG4gIGlmICh1c2VDb2xvcnMpIHtcbiAgICB2YXIgYyA9IHRoaXMuY29sb3I7XG4gICAgdmFyIHByZWZpeCA9ICcgIFxcdTAwMWJbMycgKyBjICsgJzsxbScgKyBuYW1lICsgJyAnICsgJ1xcdTAwMWJbMG0nO1xuXG4gICAgYXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuICAgIGFyZ3MucHVzaCgnXFx1MDAxYlszJyArIGMgKyAnbSsnICsgZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMWJbMG0nKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzWzBdID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG4gICAgICArICcgJyArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlcyBgdXRpbC5mb3JtYXQoKWAgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhbmQgd3JpdGVzIHRvIGBzdHJlYW1gLlxuICovXG5cbmZ1bmN0aW9uIGxvZygpIHtcbiAgcmV0dXJuIHN0cmVhbS53cml0ZSh1dGlsLmZvcm1hdC5hcHBseSh1dGlsLCBhcmd1bWVudHMpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcbiAgaWYgKG51bGwgPT0gbmFtZXNwYWNlcykge1xuICAgIC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuICAgIC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5ERUJVRztcbn1cblxuLyoqXG4gKiBDb3BpZWQgZnJvbSBgbm9kZS9zcmMvbm9kZS5qc2AuXG4gKlxuICogWFhYOiBJdCdzIGxhbWUgdGhhdCBub2RlIGRvZXNuJ3QgZXhwb3NlIHRoaXMgQVBJIG91dC1vZi10aGUtYm94LiBJdCBhbHNvXG4gKiByZWxpZXMgb24gdGhlIHVuZG9jdW1lbnRlZCBgdHR5X3dyYXAuZ3Vlc3NIYW5kbGVUeXBlKClgIHdoaWNoIGlzIGFsc28gbGFtZS5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVXcml0YWJsZVN0ZGlvU3RyZWFtIChmZCkge1xuICB2YXIgc3RyZWFtO1xuICB2YXIgdHR5X3dyYXAgPSBwcm9jZXNzLmJpbmRpbmcoJ3R0eV93cmFwJyk7XG5cbiAgLy8gTm90ZSBzdHJlYW0uX3R5cGUgaXMgdXNlZCBmb3IgdGVzdC1tb2R1bGUtbG9hZC1saXN0LmpzXG5cbiAgc3dpdGNoICh0dHlfd3JhcC5ndWVzc0hhbmRsZVR5cGUoZmQpKSB7XG4gICAgY2FzZSAnVFRZJzpcbiAgICAgIHN0cmVhbSA9IG5ldyB0dHkuV3JpdGVTdHJlYW0oZmQpO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ3R0eSc7XG5cbiAgICAgIC8vIEhhY2sgdG8gaGF2ZSBzdHJlYW0gbm90IGtlZXAgdGhlIGV2ZW50IGxvb3AgYWxpdmUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzI2XG4gICAgICBpZiAoc3RyZWFtLl9oYW5kbGUgJiYgc3RyZWFtLl9oYW5kbGUudW5yZWYpIHtcbiAgICAgICAgc3RyZWFtLl9oYW5kbGUudW5yZWYoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnRklMRSc6XG4gICAgICB2YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuICAgICAgc3RyZWFtID0gbmV3IGZzLlN5bmNXcml0ZVN0cmVhbShmZCwgeyBhdXRvQ2xvc2U6IGZhbHNlIH0pO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ2ZzJztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnUElQRSc6XG4gICAgY2FzZSAnVENQJzpcbiAgICAgIHZhciBuZXQgPSByZXF1aXJlKCduZXQnKTtcbiAgICAgIHN0cmVhbSA9IG5ldyBuZXQuU29ja2V0KHtcbiAgICAgICAgZmQ6IGZkLFxuICAgICAgICByZWFkYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgLy8gRklYTUUgU2hvdWxkIHByb2JhYmx5IGhhdmUgYW4gb3B0aW9uIGluIG5ldC5Tb2NrZXQgdG8gY3JlYXRlIGFcbiAgICAgIC8vIHN0cmVhbSBmcm9tIGFuIGV4aXN0aW5nIGZkIHdoaWNoIGlzIHdyaXRhYmxlIG9ubHkuIEJ1dCBmb3Igbm93XG4gICAgICAvLyB3ZSdsbCBqdXN0IGFkZCB0aGlzIGhhY2sgYW5kIHNldCB0aGUgYHJlYWRhYmxlYCBtZW1iZXIgdG8gZmFsc2UuXG4gICAgICAvLyBUZXN0OiAuL25vZGUgdGVzdC9maXh0dXJlcy9lY2hvLmpzIDwgL2V0Yy9wYXNzd2RcbiAgICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlYWQgPSBudWxsO1xuICAgICAgc3RyZWFtLl90eXBlID0gJ3BpcGUnO1xuXG4gICAgICAvLyBGSVhNRSBIYWNrIHRvIGhhdmUgc3RyZWFtIG5vdCBrZWVwIHRoZSBldmVudCBsb29wIGFsaXZlLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcyNlxuICAgICAgaWYgKHN0cmVhbS5faGFuZGxlICYmIHN0cmVhbS5faGFuZGxlLnVucmVmKSB7XG4gICAgICAgIHN0cmVhbS5faGFuZGxlLnVucmVmKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBQcm9iYWJseSBhbiBlcnJvciBvbiBpbiB1dl9ndWVzc19oYW5kbGUoKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbXBsZW1lbnQgbWUuIFVua25vd24gc3RyZWFtIGZpbGUgdHlwZSEnKTtcbiAgfVxuXG4gIC8vIEZvciBzdXBwb3J0aW5nIGxlZ2FjeSBBUEkgd2UgcHV0IHRoZSBGRCBoZXJlLlxuICBzdHJlYW0uZmQgPSBmZDtcblxuICBzdHJlYW0uX2lzU3RkaW8gPSB0cnVlO1xuXG4gIHJldHVybiBzdHJlYW07XG59XG5cbi8qKlxuICogSW5pdCBsb2dpYyBmb3IgYGRlYnVnYCBpbnN0YW5jZXMuXG4gKlxuICogQ3JlYXRlIGEgbmV3IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGluIGNhc2UgYHVzZUNvbG9yc2AgaXMgc2V0XG4gKiBkaWZmZXJlbnRseSBmb3IgYSBwYXJ0aWN1bGFyIGBkZWJ1Z2AgaW5zdGFuY2UuXG4gKi9cblxuZnVuY3Rpb24gaW5pdCAoZGVidWcpIHtcbiAgZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuaW5zcGVjdE9wdHMpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWJ1Zy5pbnNwZWN0T3B0c1trZXlzW2ldXSA9IGV4cG9ydHMuaW5zcGVjdE9wdHNba2V5c1tpXV07XG4gIH1cbn1cblxuLyoqXG4gKiBFbmFibGUgbmFtZXNwYWNlcyBsaXN0ZWQgaW4gYHByb2Nlc3MuZW52LkRFQlVHYCBpbml0aWFsbHkuXG4gKi9cblxuZXhwb3J0cy5lbmFibGUobG9hZCgpKTtcbiIsICIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciBwcm9jZXNzLCB3aGljaCBpcyBub2RlLCBidXQgd2Ugc2hvdWxkXG4gKiB0cmVhdCBhcyBhIGJyb3dzZXIuXG4gKi9cblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLCAiLyohXG4gKiBldGFnXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV0YWdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbnZhciBTdGF0cyA9IHJlcXVpcmUoJ2ZzJykuU3RhdHNcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbi8qKlxuICogR2VuZXJhdGUgYW4gZW50aXR5IHRhZy5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcnxzdHJpbmd9IGVudGl0eVxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBlbnRpdHl0YWcgKGVudGl0eSkge1xuICBpZiAoZW50aXR5Lmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGZhc3QtcGF0aCBlbXB0eVxuICAgIHJldHVybiAnXCIwLTJqbWo3bDVyU3cweVZiL3ZsV0FZa0svWUJ3a1wiJ1xuICB9XG5cbiAgLy8gY29tcHV0ZSBoYXNoIG9mIGVudGl0eVxuICB2YXIgaGFzaCA9IGNyeXB0b1xuICAgIC5jcmVhdGVIYXNoKCdzaGExJylcbiAgICAudXBkYXRlKGVudGl0eSwgJ3V0ZjgnKVxuICAgIC5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgLnN1YnN0cmluZygwLCAyNylcblxuICAvLyBjb21wdXRlIGxlbmd0aCBvZiBlbnRpdHlcbiAgdmFyIGxlbiA9IHR5cGVvZiBlbnRpdHkgPT09ICdzdHJpbmcnXG4gICAgPyBCdWZmZXIuYnl0ZUxlbmd0aChlbnRpdHksICd1dGY4JylcbiAgICA6IGVudGl0eS5sZW5ndGhcblxuICByZXR1cm4gJ1wiJyArIGxlbi50b1N0cmluZygxNikgKyAnLScgKyBoYXNoICsgJ1wiJ1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHNpbXBsZSBFVGFnLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEJ1ZmZlcnxTdGF0c30gZW50aXR5XG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLndlYWtdXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZXRhZyAoZW50aXR5LCBvcHRpb25zKSB7XG4gIGlmIChlbnRpdHkgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IGVudGl0eSBpcyByZXF1aXJlZCcpXG4gIH1cblxuICAvLyBzdXBwb3J0IGZzLlN0YXRzIG9iamVjdFxuICB2YXIgaXNTdGF0cyA9IGlzc3RhdHMoZW50aXR5KVxuICB2YXIgd2VhayA9IG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMud2VhayA9PT0gJ2Jvb2xlYW4nXG4gICAgPyBvcHRpb25zLndlYWtcbiAgICA6IGlzU3RhdHNcblxuICAvLyB2YWxpZGF0ZSBhcmd1bWVudFxuICBpZiAoIWlzU3RhdHMgJiYgdHlwZW9mIGVudGl0eSAhPT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0J1ZmZlcihlbnRpdHkpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgZW50aXR5IG11c3QgYmUgc3RyaW5nLCBCdWZmZXIsIG9yIGZzLlN0YXRzJylcbiAgfVxuXG4gIC8vIGdlbmVyYXRlIGVudGl0eSB0YWdcbiAgdmFyIHRhZyA9IGlzU3RhdHNcbiAgICA/IHN0YXR0YWcoZW50aXR5KVxuICAgIDogZW50aXR5dGFnKGVudGl0eSlcblxuICByZXR1cm4gd2Vha1xuICAgID8gJ1cvJyArIHRhZ1xuICAgIDogdGFnXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIG9iamVjdCBpcyBhIFN0YXRzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNzdGF0cyAob2JqKSB7XG4gIC8vIGdlbnVpbmUgZnMuU3RhdHNcbiAgaWYgKHR5cGVvZiBTdGF0cyA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmogaW5zdGFuY2VvZiBTdGF0cykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBxdWFjayBxdWFja1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmXG4gICAgJ2N0aW1lJyBpbiBvYmogJiYgdG9TdHJpbmcuY2FsbChvYmouY3RpbWUpID09PSAnW29iamVjdCBEYXRlXScgJiZcbiAgICAnbXRpbWUnIGluIG9iaiAmJiB0b1N0cmluZy5jYWxsKG9iai5tdGltZSkgPT09ICdbb2JqZWN0IERhdGVdJyAmJlxuICAgICdpbm8nIGluIG9iaiAmJiB0eXBlb2Ygb2JqLmlubyA9PT0gJ251bWJlcicgJiZcbiAgICAnc2l6ZScgaW4gb2JqICYmIHR5cGVvZiBvYmouc2l6ZSA9PT0gJ251bWJlcidcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHRhZyBmb3IgYSBzdGF0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0YXR0YWcgKHN0YXQpIHtcbiAgdmFyIG10aW1lID0gc3RhdC5tdGltZS5nZXRUaW1lKCkudG9TdHJpbmcoMTYpXG4gIHZhciBzaXplID0gc3RhdC5zaXplLnRvU3RyaW5nKDE2KVxuXG4gIHJldHVybiAnXCInICsgc2l6ZSArICctJyArIG10aW1lICsgJ1wiJ1xufVxuIiwgIi8qIVxuICogZnJlc2hcbiAqIENvcHlyaWdodChjKSAyMDEyIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNi0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBSZWdFeHAgdG8gY2hlY2sgZm9yIG5vLWNhY2hlIHRva2VuIGluIENhY2hlLUNvbnRyb2wuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBDQUNIRV9DT05UUk9MX05PX0NBQ0hFX1JFR0VYUCA9IC8oPzpefCwpXFxzKj9uby1jYWNoZVxccyo/KD86LHwkKS9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZXNoXG5cbi8qKlxuICogQ2hlY2sgZnJlc2huZXNzIG9mIHRoZSByZXNwb25zZSB1c2luZyByZXF1ZXN0IGFuZCByZXNwb25zZSBoZWFkZXJzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXFIZWFkZXJzXG4gKiBAcGFyYW0ge09iamVjdH0gcmVzSGVhZGVyc1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmcmVzaCAocmVxSGVhZGVycywgcmVzSGVhZGVycykge1xuICAvLyBmaWVsZHNcbiAgdmFyIG1vZGlmaWVkU2luY2UgPSByZXFIZWFkZXJzWydpZi1tb2RpZmllZC1zaW5jZSddXG4gIHZhciBub25lTWF0Y2ggPSByZXFIZWFkZXJzWydpZi1ub25lLW1hdGNoJ11cblxuICAvLyB1bmNvbmRpdGlvbmFsIHJlcXVlc3RcbiAgaWYgKCFtb2RpZmllZFNpbmNlICYmICFub25lTWF0Y2gpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIEFsd2F5cyByZXR1cm4gc3RhbGUgd2hlbiBDYWNoZS1Db250cm9sOiBuby1jYWNoZVxuICAvLyB0byBzdXBwb3J0IGVuZC10by1lbmQgcmVsb2FkIHJlcXVlc3RzXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyNjE2I3NlY3Rpb24tMTQuOS40XG4gIHZhciBjYWNoZUNvbnRyb2wgPSByZXFIZWFkZXJzWydjYWNoZS1jb250cm9sJ11cbiAgaWYgKGNhY2hlQ29udHJvbCAmJiBDQUNIRV9DT05UUk9MX05PX0NBQ0hFX1JFR0VYUC50ZXN0KGNhY2hlQ29udHJvbCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIGlmLW5vbmUtbWF0Y2hcbiAgaWYgKG5vbmVNYXRjaCAmJiBub25lTWF0Y2ggIT09ICcqJykge1xuICAgIHZhciBldGFnID0gcmVzSGVhZGVyc1snZXRhZyddXG5cbiAgICBpZiAoIWV0YWcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHZhciBldGFnU3RhbGUgPSB0cnVlXG4gICAgdmFyIG1hdGNoZXMgPSBwYXJzZVRva2VuTGlzdChub25lTWF0Y2gpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbWF0Y2ggPSBtYXRjaGVzW2ldXG4gICAgICBpZiAobWF0Y2ggPT09IGV0YWcgfHwgbWF0Y2ggPT09ICdXLycgKyBldGFnIHx8ICdXLycgKyBtYXRjaCA9PT0gZXRhZykge1xuICAgICAgICBldGFnU3RhbGUgPSBmYWxzZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChldGFnU3RhbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmLW1vZGlmaWVkLXNpbmNlXG4gIGlmIChtb2RpZmllZFNpbmNlKSB7XG4gICAgdmFyIGxhc3RNb2RpZmllZCA9IHJlc0hlYWRlcnNbJ2xhc3QtbW9kaWZpZWQnXVxuICAgIHZhciBtb2RpZmllZFN0YWxlID0gIWxhc3RNb2RpZmllZCB8fCAhKHBhcnNlSHR0cERhdGUobGFzdE1vZGlmaWVkKSA8PSBwYXJzZUh0dHBEYXRlKG1vZGlmaWVkU2luY2UpKVxuXG4gICAgaWYgKG1vZGlmaWVkU3RhbGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogUGFyc2UgYW4gSFRUUCBEYXRlIGludG8gYSBudW1iZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGVcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VIdHRwRGF0ZSAoZGF0ZSkge1xuICB2YXIgdGltZXN0YW1wID0gZGF0ZSAmJiBEYXRlLnBhcnNlKGRhdGUpXG5cbiAgLy8gaXN0YW5idWwgaWdub3JlIG5leHQ6IGd1YXJkIGFnYWluc3QgZGF0ZS5qcyBEYXRlLnBhcnNlIHBhdGNoaW5nXG4gIHJldHVybiB0eXBlb2YgdGltZXN0YW1wID09PSAnbnVtYmVyJ1xuICAgID8gdGltZXN0YW1wXG4gICAgOiBOYU5cbn1cblxuLyoqXG4gKiBQYXJzZSBhIEhUVFAgdG9rZW4gbGlzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlVG9rZW5MaXN0IChzdHIpIHtcbiAgdmFyIGVuZCA9IDBcbiAgdmFyIGxpc3QgPSBbXVxuICB2YXIgc3RhcnQgPSAwXG5cbiAgLy8gZ2F0aGVyIHRva2Vuc1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc3dpdGNoIChzdHIuY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSAweDIwOiAvKiAgICovXG4gICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgICAgICAgc3RhcnQgPSBlbmQgPSBpICsgMVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDB4MmM6IC8qICwgKi9cbiAgICAgICAgbGlzdC5wdXNoKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG4gICAgICAgIHN0YXJ0ID0gZW5kID0gaSArIDFcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGVuZCA9IGkgKyAxXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgLy8gZmluYWwgdG9rZW5cbiAgbGlzdC5wdXNoKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG5cbiAgcmV0dXJuIGxpc3Rcbn1cbiIsICJ2YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmZ1bmN0aW9uIE1pbWUoKSB7XG4gIC8vIE1hcCBvZiBleHRlbnNpb24gLT4gbWltZSB0eXBlXG4gIHRoaXMudHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vIE1hcCBvZiBtaW1lIHR5cGUgLT4gZXh0ZW5zaW9uXG4gIHRoaXMuZXh0ZW5zaW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbi8qKlxuICogRGVmaW5lIG1pbWV0eXBlIC0+IGV4dGVuc2lvbiBtYXBwaW5ncy4gIEVhY2gga2V5IGlzIGEgbWltZS10eXBlIHRoYXQgbWFwc1xuICogdG8gYW4gYXJyYXkgb2YgZXh0ZW5zaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUuICBUaGUgZmlyc3QgZXh0ZW5zaW9uIGlzXG4gKiB1c2VkIGFzIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgdGhlIHR5cGUuXG4gKlxuICogZS5nLiBtaW1lLmRlZmluZSh7J2F1ZGlvL29nZycsIFsnb2dhJywgJ29nZycsICdzcHgnXX0pO1xuICpcbiAqIEBwYXJhbSBtYXAgKE9iamVjdCkgdHlwZSBkZWZpbml0aW9uc1xuICovXG5NaW1lLnByb3RvdHlwZS5kZWZpbmUgPSBmdW5jdGlvbiAobWFwKSB7XG4gIGZvciAodmFyIHR5cGUgaW4gbWFwKSB7XG4gICAgdmFyIGV4dHMgPSBtYXBbdHlwZV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuREVCVUdfTUlNRSAmJiB0aGlzLnR5cGVzW2V4dHNbaV1dKSB7XG4gICAgICAgIGNvbnNvbGUud2FybigodGhpcy5fbG9hZGluZyB8fCBcImRlZmluZSgpXCIpLnJlcGxhY2UoLy4qXFwvLywgJycpLCAnY2hhbmdlcyBcIicgKyBleHRzW2ldICsgJ1wiIGV4dGVuc2lvbiB0eXBlIGZyb20gJyArXG4gICAgICAgICAgdGhpcy50eXBlc1tleHRzW2ldXSArICcgdG8gJyArIHR5cGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnR5cGVzW2V4dHNbaV1dID0gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGV4dGVuc2lvbiBpcyB0aGUgZmlyc3Qgb25lIHdlIGVuY291bnRlclxuICAgIGlmICghdGhpcy5leHRlbnNpb25zW3R5cGVdKSB7XG4gICAgICB0aGlzLmV4dGVuc2lvbnNbdHlwZV0gPSBleHRzWzBdO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMb2FkIGFuIEFwYWNoZTItc3R5bGUgXCIudHlwZXNcIiBmaWxlXG4gKlxuICogVGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIChpdCdzIGV4cGVjdGVkKS4gIFdoZXJlIGZpbGVzIGRlY2xhcmVcbiAqIG92ZXJsYXBwaW5nIHR5cGVzL2V4dGVuc2lvbnMsIHRoZSBsYXN0IGZpbGUgd2lucy5cbiAqXG4gKiBAcGFyYW0gZmlsZSAoU3RyaW5nKSBwYXRoIG9mIGZpbGUgdG8gbG9hZC5cbiAqL1xuTWltZS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKGZpbGUpIHtcbiAgdGhpcy5fbG9hZGluZyA9IGZpbGU7XG4gIC8vIFJlYWQgZmlsZSBhbmQgc3BsaXQgaW50byBsaW5lc1xuICB2YXIgbWFwID0ge30sXG4gICAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICdhc2NpaScpLFxuICAgICAgbGluZXMgPSBjb250ZW50LnNwbGl0KC9bXFxyXFxuXSsvKTtcblxuICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAvLyBDbGVhbiB1cCB3aGl0ZXNwYWNlL2NvbW1lbnRzLCBhbmQgc3BsaXQgaW50byBmaWVsZHNcbiAgICB2YXIgZmllbGRzID0gbGluZS5yZXBsYWNlKC9cXHMqIy4qfF5cXHMqfFxccyokL2csICcnKS5zcGxpdCgvXFxzKy8pO1xuICAgIG1hcFtmaWVsZHMuc2hpZnQoKV0gPSBmaWVsZHM7XG4gIH0pO1xuXG4gIHRoaXMuZGVmaW5lKG1hcCk7XG5cbiAgdGhpcy5fbG9hZGluZyA9IG51bGw7XG59O1xuXG4vKipcbiAqIExvb2t1cCBhIG1pbWUgdHlwZSBiYXNlZCBvbiBleHRlbnNpb25cbiAqL1xuTWltZS5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24ocGF0aCwgZmFsbGJhY2spIHtcbiAgdmFyIGV4dCA9IHBhdGgucmVwbGFjZSgvXi4qW1xcLlxcL1xcXFxdLywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIHRoaXMudHlwZXNbZXh0XSB8fCBmYWxsYmFjayB8fCB0aGlzLmRlZmF1bHRfdHlwZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGZpbGUgZXh0ZW5zaW9uIGFzc29jaWF0ZWQgd2l0aCBhIG1pbWUgdHlwZVxuICovXG5NaW1lLnByb3RvdHlwZS5leHRlbnNpb24gPSBmdW5jdGlvbihtaW1lVHlwZSkge1xuICB2YXIgdHlwZSA9IG1pbWVUeXBlLm1hdGNoKC9eXFxzKihbXjtcXHNdKikoPzo7fFxcc3wkKS8pWzFdLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiB0aGlzLmV4dGVuc2lvbnNbdHlwZV07XG59O1xuXG4vLyBEZWZhdWx0IGluc3RhbmNlXG52YXIgbWltZSA9IG5ldyBNaW1lKCk7XG5cbi8vIERlZmluZSBidWlsdC1pbiB0eXBlc1xubWltZS5kZWZpbmUocmVxdWlyZSgnLi90eXBlcy5qc29uJykpO1xuXG4vLyBEZWZhdWx0IHR5cGVcbm1pbWUuZGVmYXVsdF90eXBlID0gbWltZS5sb29rdXAoJ2JpbicpO1xuXG4vL1xuLy8gQWRkaXRpb25hbCBBUEkgc3BlY2lmaWMgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2Vcbi8vXG5cbm1pbWUuTWltZSA9IE1pbWU7XG5cbi8qKlxuICogTG9va3VwIGEgY2hhcnNldCBiYXNlZCBvbiBtaW1lIHR5cGUuXG4gKi9cbm1pbWUuY2hhcnNldHMgPSB7XG4gIGxvb2t1cDogZnVuY3Rpb24obWltZVR5cGUsIGZhbGxiYWNrKSB7XG4gICAgLy8gQXNzdW1lIHRleHQgdHlwZXMgYXJlIHV0ZjhcbiAgICByZXR1cm4gKC9edGV4dFxcL3xeYXBwbGljYXRpb25cXC8oamF2YXNjcmlwdHxqc29uKS8pLnRlc3QobWltZVR5cGUpID8gJ1VURi04JyA6IGZhbGxiYWNrO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbWU7XG4iLCAiLyoqXG4gKiBIZWxwZXJzLlxuICovXG5cbnZhciBzID0gMTAwMDtcbnZhciBtID0gcyAqIDYwO1xudmFyIGggPSBtICogNjA7XG52YXIgZCA9IGggKiAyNDtcbnZhciB3ID0gZCAqIDc7XG52YXIgeSA9IGQgKiAzNjUuMjU7XG5cbi8qKlxuICogUGFyc2Ugb3IgZm9ybWF0IHRoZSBnaXZlbiBgdmFsYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAtIGBsb25nYCB2ZXJib3NlIGZvcm1hdHRpbmcgW2ZhbHNlXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAdGhyb3dzIHtFcnJvcn0gdGhyb3cgYW4gZXJyb3IgaWYgdmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSBudW1iZXJcbiAqIEByZXR1cm4ge1N0cmluZ3xOdW1iZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIi8qIVxuICogcmFuZ2UtcGFyc2VyXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNS0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJhbmdlUGFyc2VyXG5cbi8qKlxuICogUGFyc2UgXCJSYW5nZVwiIGhlYWRlciBgc3RyYCByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gZmlsZSBgc2l6ZWAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHNpemVcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHJhbmdlUGFyc2VyIChzaXplLCBzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyIG11c3QgYmUgYSBzdHJpbmcnKVxuICB9XG5cbiAgdmFyIGluZGV4ID0gc3RyLmluZGV4T2YoJz0nKVxuXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gLTJcbiAgfVxuXG4gIC8vIHNwbGl0IHRoZSByYW5nZSBzdHJpbmdcbiAgdmFyIGFyciA9IHN0ci5zbGljZShpbmRleCArIDEpLnNwbGl0KCcsJylcbiAgdmFyIHJhbmdlcyA9IFtdXG5cbiAgLy8gYWRkIHJhbmdlcyB0eXBlXG4gIHJhbmdlcy50eXBlID0gc3RyLnNsaWNlKDAsIGluZGV4KVxuXG4gIC8vIHBhcnNlIGFsbCByYW5nZXNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmFuZ2UgPSBhcnJbaV0uc3BsaXQoJy0nKVxuICAgIHZhciBzdGFydCA9IHBhcnNlSW50KHJhbmdlWzBdLCAxMClcbiAgICB2YXIgZW5kID0gcGFyc2VJbnQocmFuZ2VbMV0sIDEwKVxuXG4gICAgLy8gLW5ublxuICAgIGlmIChpc05hTihzdGFydCkpIHtcbiAgICAgIHN0YXJ0ID0gc2l6ZSAtIGVuZFxuICAgICAgZW5kID0gc2l6ZSAtIDFcbiAgICAvLyBubm4tXG4gICAgfSBlbHNlIGlmIChpc05hTihlbmQpKSB7XG4gICAgICBlbmQgPSBzaXplIC0gMVxuICAgIH1cblxuICAgIC8vIGxpbWl0IGxhc3QtYnl0ZS1wb3MgdG8gY3VycmVudCBsZW5ndGhcbiAgICBpZiAoZW5kID4gc2l6ZSAtIDEpIHtcbiAgICAgIGVuZCA9IHNpemUgLSAxXG4gICAgfVxuXG4gICAgLy8gaW52YWxpZCBvciB1bnNhdGlzaWZpYWJsZVxuICAgIGlmIChpc05hTihzdGFydCkgfHwgaXNOYU4oZW5kKSB8fCBzdGFydCA+IGVuZCB8fCBzdGFydCA8IDApIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgLy8gYWRkIHJhbmdlXG4gICAgcmFuZ2VzLnB1c2goe1xuICAgICAgc3RhcnQ6IHN0YXJ0LFxuICAgICAgZW5kOiBlbmRcbiAgICB9KVxuICB9XG5cbiAgaWYgKHJhbmdlcy5sZW5ndGggPCAxKSB7XG4gICAgLy8gdW5zYXRpc2lmaWFibGVcbiAgICByZXR1cm4gLTFcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnMuY29tYmluZVxuICAgID8gY29tYmluZVJhbmdlcyhyYW5nZXMpXG4gICAgOiByYW5nZXNcbn1cblxuLyoqXG4gKiBDb21iaW5lIG92ZXJsYXBwaW5nICYgYWRqYWNlbnQgcmFuZ2VzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb21iaW5lUmFuZ2VzIChyYW5nZXMpIHtcbiAgdmFyIG9yZGVyZWQgPSByYW5nZXMubWFwKG1hcFdpdGhJbmRleCkuc29ydChzb3J0QnlSYW5nZVN0YXJ0KVxuXG4gIGZvciAodmFyIGogPSAwLCBpID0gMTsgaSA8IG9yZGVyZWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcmFuZ2UgPSBvcmRlcmVkW2ldXG4gICAgdmFyIGN1cnJlbnQgPSBvcmRlcmVkW2pdXG5cbiAgICBpZiAocmFuZ2Uuc3RhcnQgPiBjdXJyZW50LmVuZCArIDEpIHtcbiAgICAgIC8vIG5leHQgcmFuZ2VcbiAgICAgIG9yZGVyZWRbKytqXSA9IHJhbmdlXG4gICAgfSBlbHNlIGlmIChyYW5nZS5lbmQgPiBjdXJyZW50LmVuZCkge1xuICAgICAgLy8gZXh0ZW5kIHJhbmdlXG4gICAgICBjdXJyZW50LmVuZCA9IHJhbmdlLmVuZFxuICAgICAgY3VycmVudC5pbmRleCA9IE1hdGgubWluKGN1cnJlbnQuaW5kZXgsIHJhbmdlLmluZGV4KVxuICAgIH1cbiAgfVxuXG4gIC8vIHRyaW0gb3JkZXJlZCBhcnJheVxuICBvcmRlcmVkLmxlbmd0aCA9IGogKyAxXG5cbiAgLy8gZ2VuZXJhdGUgY29tYmluZWQgcmFuZ2VcbiAgdmFyIGNvbWJpbmVkID0gb3JkZXJlZC5zb3J0KHNvcnRCeVJhbmdlSW5kZXgpLm1hcChtYXBXaXRob3V0SW5kZXgpXG5cbiAgLy8gY29weSByYW5nZXMgdHlwZVxuICBjb21iaW5lZC50eXBlID0gcmFuZ2VzLnR5cGVcblxuICByZXR1cm4gY29tYmluZWRcbn1cblxuLyoqXG4gKiBNYXAgZnVuY3Rpb24gdG8gYWRkIGluZGV4IHZhbHVlIHRvIHJhbmdlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWFwV2l0aEluZGV4IChyYW5nZSwgaW5kZXgpIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogcmFuZ2Uuc3RhcnQsXG4gICAgZW5kOiByYW5nZS5lbmQsXG4gICAgaW5kZXg6IGluZGV4XG4gIH1cbn1cblxuLyoqXG4gKiBNYXAgZnVuY3Rpb24gdG8gcmVtb3ZlIGluZGV4IHZhbHVlIGZyb20gcmFuZ2VzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBtYXBXaXRob3V0SW5kZXggKHJhbmdlKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHJhbmdlLnN0YXJ0LFxuICAgIGVuZDogcmFuZ2UuZW5kXG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IGZ1bmN0aW9uIHRvIHNvcnQgcmFuZ2VzIGJ5IGluZGV4LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzb3J0QnlSYW5nZUluZGV4IChhLCBiKSB7XG4gIHJldHVybiBhLmluZGV4IC0gYi5pbmRleFxufVxuXG4vKipcbiAqIFNvcnQgZnVuY3Rpb24gdG8gc29ydCByYW5nZXMgYnkgc3RhcnQgcG9zaXRpb24uXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNvcnRCeVJhbmdlU3RhcnQgKGEsIGIpIHtcbiAgcmV0dXJuIGEuc3RhcnQgLSBiLnN0YXJ0XG59XG4iLCAiLyohXG4gKiBzZW5kXG4gKiBDb3B5cmlnaHQoYykgMjAxMiBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAyMiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnaHR0cC1lcnJvcnMnKVxudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnc2VuZCcpXG52YXIgZGVwcmVjYXRlID0gcmVxdWlyZSgnZGVwZCcpKCdzZW5kJylcbnZhciBkZXN0cm95ID0gcmVxdWlyZSgnZGVzdHJveScpXG52YXIgZW5jb2RlVXJsID0gcmVxdWlyZSgnZW5jb2RldXJsJylcbnZhciBlc2NhcGVIdG1sID0gcmVxdWlyZSgnZXNjYXBlLWh0bWwnKVxudmFyIGV0YWcgPSByZXF1aXJlKCdldGFnJylcbnZhciBmcmVzaCA9IHJlcXVpcmUoJ2ZyZXNoJylcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJylcbnZhciBtaW1lID0gcmVxdWlyZSgnbWltZScpXG52YXIgbXMgPSByZXF1aXJlKCdtcycpXG52YXIgb25GaW5pc2hlZCA9IHJlcXVpcmUoJ29uLWZpbmlzaGVkJylcbnZhciBwYXJzZVJhbmdlID0gcmVxdWlyZSgncmFuZ2UtcGFyc2VyJylcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpXG52YXIgc3RhdHVzZXMgPSByZXF1aXJlKCdzdGF0dXNlcycpXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG5cbi8qKlxuICogUGF0aCBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZXh0bmFtZSA9IHBhdGguZXh0bmFtZVxudmFyIGpvaW4gPSBwYXRoLmpvaW5cbnZhciBub3JtYWxpemUgPSBwYXRoLm5vcm1hbGl6ZVxudmFyIHJlc29sdmUgPSBwYXRoLnJlc29sdmVcbnZhciBzZXAgPSBwYXRoLnNlcFxuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgaWRlbnRpZnlpbmcgYSBieXRlcyBSYW5nZSBoZWFkZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBCWVRFU19SQU5HRV9SRUdFWFAgPSAvXiAqYnl0ZXM9L1xuXG4vKipcbiAqIE1heGltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhlIG1heCBhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBNQVhfTUFYQUdFID0gNjAgKiA2MCAqIDI0ICogMzY1ICogMTAwMCAvLyAxIHllYXJcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYSBwYXRoIHdpdGggYSBkaXJlY3RvcnkgdXAgY29tcG9uZW50LlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgVVBfUEFUSF9SRUdFWFAgPSAvKD86XnxbXFxcXC9dKVxcLlxcLig/OltcXFxcL118JCkvXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBzZW5kXG5tb2R1bGUuZXhwb3J0cy5taW1lID0gbWltZVxuXG4vKipcbiAqIFJldHVybiBhIGBTZW5kU3RyZWFtYCBmb3IgYHJlcWAgYW5kIGBwYXRoYC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7U2VuZFN0cmVhbX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzZW5kIChyZXEsIHBhdGgsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBTZW5kU3RyZWFtKHJlcSwgcGF0aCwgb3B0aW9ucylcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgYFNlbmRTdHJlYW1gIHdpdGggdGhlIGdpdmVuIGBwYXRoYC5cbiAqXG4gKiBAcGFyYW0ge1JlcXVlc3R9IHJlcVxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gU2VuZFN0cmVhbSAocmVxLCBwYXRoLCBvcHRpb25zKSB7XG4gIFN0cmVhbS5jYWxsKHRoaXMpXG5cbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9XG5cbiAgdGhpcy5vcHRpb25zID0gb3B0c1xuICB0aGlzLnBhdGggPSBwYXRoXG4gIHRoaXMucmVxID0gcmVxXG5cbiAgdGhpcy5fYWNjZXB0UmFuZ2VzID0gb3B0cy5hY2NlcHRSYW5nZXMgIT09IHVuZGVmaW5lZFxuICAgID8gQm9vbGVhbihvcHRzLmFjY2VwdFJhbmdlcylcbiAgICA6IHRydWVcblxuICB0aGlzLl9jYWNoZUNvbnRyb2wgPSBvcHRzLmNhY2hlQ29udHJvbCAhPT0gdW5kZWZpbmVkXG4gICAgPyBCb29sZWFuKG9wdHMuY2FjaGVDb250cm9sKVxuICAgIDogdHJ1ZVxuXG4gIHRoaXMuX2V0YWcgPSBvcHRzLmV0YWcgIT09IHVuZGVmaW5lZFxuICAgID8gQm9vbGVhbihvcHRzLmV0YWcpXG4gICAgOiB0cnVlXG5cbiAgdGhpcy5fZG90ZmlsZXMgPSBvcHRzLmRvdGZpbGVzICE9PSB1bmRlZmluZWRcbiAgICA/IG9wdHMuZG90ZmlsZXNcbiAgICA6ICdpZ25vcmUnXG5cbiAgaWYgKHRoaXMuX2RvdGZpbGVzICE9PSAnaWdub3JlJyAmJiB0aGlzLl9kb3RmaWxlcyAhPT0gJ2FsbG93JyAmJiB0aGlzLl9kb3RmaWxlcyAhPT0gJ2RlbnknKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZG90ZmlsZXMgb3B0aW9uIG11c3QgYmUgXCJhbGxvd1wiLCBcImRlbnlcIiwgb3IgXCJpZ25vcmVcIicpXG4gIH1cblxuICB0aGlzLl9oaWRkZW4gPSBCb29sZWFuKG9wdHMuaGlkZGVuKVxuXG4gIGlmIChvcHRzLmhpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZGVwcmVjYXRlKCdoaWRkZW46IHVzZSBkb3RmaWxlczogXFwnJyArICh0aGlzLl9oaWRkZW4gPyAnYWxsb3cnIDogJ2lnbm9yZScpICsgJ1xcJyBpbnN0ZWFkJylcbiAgfVxuXG4gIC8vIGxlZ2FjeSBzdXBwb3J0XG4gIGlmIChvcHRzLmRvdGZpbGVzID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9kb3RmaWxlcyA9IHVuZGVmaW5lZFxuICB9XG5cbiAgdGhpcy5fZXh0ZW5zaW9ucyA9IG9wdHMuZXh0ZW5zaW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgPyBub3JtYWxpemVMaXN0KG9wdHMuZXh0ZW5zaW9ucywgJ2V4dGVuc2lvbnMgb3B0aW9uJylcbiAgICA6IFtdXG5cbiAgdGhpcy5faW1tdXRhYmxlID0gb3B0cy5pbW11dGFibGUgIT09IHVuZGVmaW5lZFxuICAgID8gQm9vbGVhbihvcHRzLmltbXV0YWJsZSlcbiAgICA6IGZhbHNlXG5cbiAgdGhpcy5faW5kZXggPSBvcHRzLmluZGV4ICE9PSB1bmRlZmluZWRcbiAgICA/IG5vcm1hbGl6ZUxpc3Qob3B0cy5pbmRleCwgJ2luZGV4IG9wdGlvbicpXG4gICAgOiBbJ2luZGV4Lmh0bWwnXVxuXG4gIHRoaXMuX2xhc3RNb2RpZmllZCA9IG9wdHMubGFzdE1vZGlmaWVkICE9PSB1bmRlZmluZWRcbiAgICA/IEJvb2xlYW4ob3B0cy5sYXN0TW9kaWZpZWQpXG4gICAgOiB0cnVlXG5cbiAgdGhpcy5fbWF4YWdlID0gb3B0cy5tYXhBZ2UgfHwgb3B0cy5tYXhhZ2VcbiAgdGhpcy5fbWF4YWdlID0gdHlwZW9mIHRoaXMuX21heGFnZSA9PT0gJ3N0cmluZydcbiAgICA/IG1zKHRoaXMuX21heGFnZSlcbiAgICA6IE51bWJlcih0aGlzLl9tYXhhZ2UpXG4gIHRoaXMuX21heGFnZSA9ICFpc05hTih0aGlzLl9tYXhhZ2UpXG4gICAgPyBNYXRoLm1pbihNYXRoLm1heCgwLCB0aGlzLl9tYXhhZ2UpLCBNQVhfTUFYQUdFKVxuICAgIDogMFxuXG4gIHRoaXMuX3Jvb3QgPSBvcHRzLnJvb3RcbiAgICA/IHJlc29sdmUob3B0cy5yb290KVxuICAgIDogbnVsbFxuXG4gIGlmICghdGhpcy5fcm9vdCAmJiBvcHRzLmZyb20pIHtcbiAgICB0aGlzLmZyb20ob3B0cy5mcm9tKVxuICB9XG59XG5cbi8qKlxuICogSW5oZXJpdHMgZnJvbSBgU3RyZWFtYC5cbiAqL1xuXG51dGlsLmluaGVyaXRzKFNlbmRTdHJlYW0sIFN0cmVhbSlcblxuLyoqXG4gKiBFbmFibGUgb3IgZGlzYWJsZSBldGFnIGdlbmVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSB2YWxcbiAqIEByZXR1cm4ge1NlbmRTdHJlYW19XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmV0YWcgPSBkZXByZWNhdGUuZnVuY3Rpb24oZnVuY3Rpb24gZXRhZyAodmFsKSB7XG4gIHRoaXMuX2V0YWcgPSBCb29sZWFuKHZhbClcbiAgZGVidWcoJ2V0YWcgJXMnLCB0aGlzLl9ldGFnKVxuICByZXR1cm4gdGhpc1xufSwgJ3NlbmQuZXRhZzogcGFzcyBldGFnIGFzIG9wdGlvbicpXG5cbi8qKlxuICogRW5hYmxlIG9yIGRpc2FibGUgXCJoaWRkZW5cIiAoZG90KSBmaWxlcy5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHBhdGhcbiAqIEByZXR1cm4ge1NlbmRTdHJlYW19XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmhpZGRlbiA9IGRlcHJlY2F0ZS5mdW5jdGlvbihmdW5jdGlvbiBoaWRkZW4gKHZhbCkge1xuICB0aGlzLl9oaWRkZW4gPSBCb29sZWFuKHZhbClcbiAgdGhpcy5fZG90ZmlsZXMgPSB1bmRlZmluZWRcbiAgZGVidWcoJ2hpZGRlbiAlcycsIHRoaXMuX2hpZGRlbilcbiAgcmV0dXJuIHRoaXNcbn0sICdzZW5kLmhpZGRlbjogdXNlIGRvdGZpbGVzIG9wdGlvbicpXG5cbi8qKlxuICogU2V0IGluZGV4IGBwYXRoc2AsIHNldCB0byBhIGZhbHN5XG4gKiB2YWx1ZSB0byBkaXNhYmxlIGluZGV4IHN1cHBvcnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8Qm9vbGVhbnxBcnJheX0gcGF0aHNcbiAqIEByZXR1cm4ge1NlbmRTdHJlYW19XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmluZGV4ID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGZ1bmN0aW9uIGluZGV4IChwYXRocykge1xuICB2YXIgaW5kZXggPSAhcGF0aHMgPyBbXSA6IG5vcm1hbGl6ZUxpc3QocGF0aHMsICdwYXRocyBhcmd1bWVudCcpXG4gIGRlYnVnKCdpbmRleCAlbycsIHBhdGhzKVxuICB0aGlzLl9pbmRleCA9IGluZGV4XG4gIHJldHVybiB0aGlzXG59LCAnc2VuZC5pbmRleDogcGFzcyBpbmRleCBhcyBvcHRpb24nKVxuXG4vKipcbiAqIFNldCByb290IGBwYXRoYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHJldHVybiB7U2VuZFN0cmVhbX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUucm9vdCA9IGZ1bmN0aW9uIHJvb3QgKHBhdGgpIHtcbiAgdGhpcy5fcm9vdCA9IHJlc29sdmUoU3RyaW5nKHBhdGgpKVxuICBkZWJ1Zygncm9vdCAlcycsIHRoaXMuX3Jvb3QpXG4gIHJldHVybiB0aGlzXG59XG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmZyb20gPSBkZXByZWNhdGUuZnVuY3Rpb24oU2VuZFN0cmVhbS5wcm90b3R5cGUucm9vdCxcbiAgJ3NlbmQuZnJvbTogcGFzcyByb290IGFzIG9wdGlvbicpXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnJvb3QgPSBkZXByZWNhdGUuZnVuY3Rpb24oU2VuZFN0cmVhbS5wcm90b3R5cGUucm9vdCxcbiAgJ3NlbmQucm9vdDogcGFzcyByb290IGFzIG9wdGlvbicpXG5cbi8qKlxuICogU2V0IG1heC1hZ2UgdG8gYG1heEFnZWAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1heEFnZVxuICogQHJldHVybiB7U2VuZFN0cmVhbX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUubWF4YWdlID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGZ1bmN0aW9uIG1heGFnZSAobWF4QWdlKSB7XG4gIHRoaXMuX21heGFnZSA9IHR5cGVvZiBtYXhBZ2UgPT09ICdzdHJpbmcnXG4gICAgPyBtcyhtYXhBZ2UpXG4gICAgOiBOdW1iZXIobWF4QWdlKVxuICB0aGlzLl9tYXhhZ2UgPSAhaXNOYU4odGhpcy5fbWF4YWdlKVxuICAgID8gTWF0aC5taW4oTWF0aC5tYXgoMCwgdGhpcy5fbWF4YWdlKSwgTUFYX01BWEFHRSlcbiAgICA6IDBcbiAgZGVidWcoJ21heC1hZ2UgJWQnLCB0aGlzLl9tYXhhZ2UpXG4gIHJldHVybiB0aGlzXG59LCAnc2VuZC5tYXhhZ2U6IHBhc3MgbWF4QWdlIGFzIG9wdGlvbicpXG5cbi8qKlxuICogRW1pdCBlcnJvciB3aXRoIGBzdGF0dXNgLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAqIEBwYXJhbSB7RXJyb3J9IFtlcnJdXG4gKiBAcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gZXJyb3IgKHN0YXR1cywgZXJyKSB7XG4gIC8vIGVtaXQgaWYgbGlzdGVuZXJzIGluc3RlYWQgb2YgcmVzcG9uZGluZ1xuICBpZiAoaGFzTGlzdGVuZXJzKHRoaXMsICdlcnJvcicpKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBjcmVhdGVIdHRwRXJyb3Ioc3RhdHVzLCBlcnIpKVxuICB9XG5cbiAgdmFyIHJlcyA9IHRoaXMucmVzXG4gIHZhciBtc2cgPSBzdGF0dXNlcy5tZXNzYWdlW3N0YXR1c10gfHwgU3RyaW5nKHN0YXR1cylcbiAgdmFyIGRvYyA9IGNyZWF0ZUh0bWxEb2N1bWVudCgnRXJyb3InLCBlc2NhcGVIdG1sKG1zZykpXG5cbiAgLy8gY2xlYXIgZXhpc3RpbmcgaGVhZGVyc1xuICBjbGVhckhlYWRlcnMocmVzKVxuXG4gIC8vIGFkZCBlcnJvciBoZWFkZXJzXG4gIGlmIChlcnIgJiYgZXJyLmhlYWRlcnMpIHtcbiAgICBzZXRIZWFkZXJzKHJlcywgZXJyLmhlYWRlcnMpXG4gIH1cblxuICAvLyBzZW5kIGJhc2ljIHJlc3BvbnNlXG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzXG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnKVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIEJ1ZmZlci5ieXRlTGVuZ3RoKGRvYykpXG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtU2VjdXJpdHktUG9saWN5JywgXCJkZWZhdWx0LXNyYyAnbm9uZSdcIilcbiAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJylcbiAgcmVzLmVuZChkb2MpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHBhdGhuYW1lIGVuZHMgd2l0aCBcIi9cIi5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5oYXNUcmFpbGluZ1NsYXNoID0gZnVuY3Rpb24gaGFzVHJhaWxpbmdTbGFzaCAoKSB7XG4gIHJldHVybiB0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdID09PSAnLydcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGlzIGEgY29uZGl0aW9uYWwgR0VUIHJlcXVlc3QuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmlzQ29uZGl0aW9uYWxHRVQgPSBmdW5jdGlvbiBpc0NvbmRpdGlvbmFsR0VUICgpIHtcbiAgcmV0dXJuIHRoaXMucmVxLmhlYWRlcnNbJ2lmLW1hdGNoJ10gfHxcbiAgICB0aGlzLnJlcS5oZWFkZXJzWydpZi11bm1vZGlmaWVkLXNpbmNlJ10gfHxcbiAgICB0aGlzLnJlcS5oZWFkZXJzWydpZi1ub25lLW1hdGNoJ10gfHxcbiAgICB0aGlzLnJlcS5oZWFkZXJzWydpZi1tb2RpZmllZC1zaW5jZSddXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgcHJlY29uZGl0aW9ucyBmYWlsZWQuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUuaXNQcmVjb25kaXRpb25GYWlsdXJlID0gZnVuY3Rpb24gaXNQcmVjb25kaXRpb25GYWlsdXJlICgpIHtcbiAgdmFyIHJlcSA9IHRoaXMucmVxXG4gIHZhciByZXMgPSB0aGlzLnJlc1xuXG4gIC8vIGlmLW1hdGNoXG4gIHZhciBtYXRjaCA9IHJlcS5oZWFkZXJzWydpZi1tYXRjaCddXG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBldGFnID0gcmVzLmdldEhlYWRlcignRVRhZycpXG4gICAgcmV0dXJuICFldGFnIHx8IChtYXRjaCAhPT0gJyonICYmIHBhcnNlVG9rZW5MaXN0KG1hdGNoKS5ldmVyeShmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaCAhPT0gZXRhZyAmJiBtYXRjaCAhPT0gJ1cvJyArIGV0YWcgJiYgJ1cvJyArIG1hdGNoICE9PSBldGFnXG4gICAgfSkpXG4gIH1cblxuICAvLyBpZi11bm1vZGlmaWVkLXNpbmNlXG4gIHZhciB1bm1vZGlmaWVkU2luY2UgPSBwYXJzZUh0dHBEYXRlKHJlcS5oZWFkZXJzWydpZi11bm1vZGlmaWVkLXNpbmNlJ10pXG4gIGlmICghaXNOYU4odW5tb2RpZmllZFNpbmNlKSkge1xuICAgIHZhciBsYXN0TW9kaWZpZWQgPSBwYXJzZUh0dHBEYXRlKHJlcy5nZXRIZWFkZXIoJ0xhc3QtTW9kaWZpZWQnKSlcbiAgICByZXR1cm4gaXNOYU4obGFzdE1vZGlmaWVkKSB8fCBsYXN0TW9kaWZpZWQgPiB1bm1vZGlmaWVkU2luY2VcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIFN0cmlwIHZhcmlvdXMgY29udGVudCBoZWFkZXIgZmllbGRzIGZvciBhIGNoYW5nZSBpbiBlbnRpdHkuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVDb250ZW50SGVhZGVyRmllbGRzID0gZnVuY3Rpb24gcmVtb3ZlQ29udGVudEhlYWRlckZpZWxkcyAoKSB7XG4gIHZhciByZXMgPSB0aGlzLnJlc1xuXG4gIHJlcy5yZW1vdmVIZWFkZXIoJ0NvbnRlbnQtRW5jb2RpbmcnKVxuICByZXMucmVtb3ZlSGVhZGVyKCdDb250ZW50LUxhbmd1YWdlJylcbiAgcmVzLnJlbW92ZUhlYWRlcignQ29udGVudC1MZW5ndGgnKVxuICByZXMucmVtb3ZlSGVhZGVyKCdDb250ZW50LVJhbmdlJylcbiAgcmVzLnJlbW92ZUhlYWRlcignQ29udGVudC1UeXBlJylcbn1cblxuLyoqXG4gKiBSZXNwb25kIHdpdGggMzA0IG5vdCBtb2RpZmllZC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5ub3RNb2RpZmllZCA9IGZ1bmN0aW9uIG5vdE1vZGlmaWVkICgpIHtcbiAgdmFyIHJlcyA9IHRoaXMucmVzXG4gIGRlYnVnKCdub3QgbW9kaWZpZWQnKVxuICB0aGlzLnJlbW92ZUNvbnRlbnRIZWFkZXJGaWVsZHMoKVxuICByZXMuc3RhdHVzQ29kZSA9IDMwNFxuICByZXMuZW5kKClcbn1cblxuLyoqXG4gKiBSYWlzZSBlcnJvciB0aGF0IGhlYWRlcnMgYWxyZWFkeSBzZW50LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmhlYWRlcnNBbHJlYWR5U2VudCA9IGZ1bmN0aW9uIGhlYWRlcnNBbHJlYWR5U2VudCAoKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0NhblxcJ3Qgc2V0IGhlYWRlcnMgYWZ0ZXIgdGhleSBhcmUgc2VudC4nKVxuICBkZWJ1ZygnaGVhZGVycyBhbHJlYWR5IHNlbnQnKVxuICB0aGlzLmVycm9yKDUwMCwgZXJyKVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIGNhY2hlYWJsZSwgYWthXG4gKiByZXNwb25kZWQgd2l0aCAyeHggb3IgMzA0IChzZWUgUkZDIDI2MTYgc2VjdGlvbiAxNC4yezUsNn0pLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5pc0NhY2hhYmxlID0gZnVuY3Rpb24gaXNDYWNoYWJsZSAoKSB7XG4gIHZhciBzdGF0dXNDb2RlID0gdGhpcy5yZXMuc3RhdHVzQ29kZVxuICByZXR1cm4gKHN0YXR1c0NvZGUgPj0gMjAwICYmIHN0YXR1c0NvZGUgPCAzMDApIHx8XG4gICAgc3RhdHVzQ29kZSA9PT0gMzA0XG59XG5cbi8qKlxuICogSGFuZGxlIHN0YXQoKSBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5vblN0YXRFcnJvciA9IGZ1bmN0aW9uIG9uU3RhdEVycm9yIChlcnJvcikge1xuICBzd2l0Y2ggKGVycm9yLmNvZGUpIHtcbiAgICBjYXNlICdFTkFNRVRPT0xPTkcnOlxuICAgIGNhc2UgJ0VOT0VOVCc6XG4gICAgY2FzZSAnRU5PVERJUic6XG4gICAgICB0aGlzLmVycm9yKDQwNCwgZXJyb3IpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLmVycm9yKDUwMCwgZXJyb3IpXG4gICAgICBicmVha1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGNhY2hlIGlzIGZyZXNoLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5pc0ZyZXNoID0gZnVuY3Rpb24gaXNGcmVzaCAoKSB7XG4gIHJldHVybiBmcmVzaCh0aGlzLnJlcS5oZWFkZXJzLCB7XG4gICAgZXRhZzogdGhpcy5yZXMuZ2V0SGVhZGVyKCdFVGFnJyksXG4gICAgJ2xhc3QtbW9kaWZpZWQnOiB0aGlzLnJlcy5nZXRIZWFkZXIoJ0xhc3QtTW9kaWZpZWQnKVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByYW5nZSBpcyBmcmVzaC5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUuaXNSYW5nZUZyZXNoID0gZnVuY3Rpb24gaXNSYW5nZUZyZXNoICgpIHtcbiAgdmFyIGlmUmFuZ2UgPSB0aGlzLnJlcS5oZWFkZXJzWydpZi1yYW5nZSddXG5cbiAgaWYgKCFpZlJhbmdlKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIGlmLXJhbmdlIGFzIGV0YWdcbiAgaWYgKGlmUmFuZ2UuaW5kZXhPZignXCInKSAhPT0gLTEpIHtcbiAgICB2YXIgZXRhZyA9IHRoaXMucmVzLmdldEhlYWRlcignRVRhZycpXG4gICAgcmV0dXJuIEJvb2xlYW4oZXRhZyAmJiBpZlJhbmdlLmluZGV4T2YoZXRhZykgIT09IC0xKVxuICB9XG5cbiAgLy8gaWYtcmFuZ2UgYXMgbW9kaWZpZWQgZGF0ZVxuICB2YXIgbGFzdE1vZGlmaWVkID0gdGhpcy5yZXMuZ2V0SGVhZGVyKCdMYXN0LU1vZGlmaWVkJylcbiAgcmV0dXJuIHBhcnNlSHR0cERhdGUobGFzdE1vZGlmaWVkKSA8PSBwYXJzZUh0dHBEYXRlKGlmUmFuZ2UpXG59XG5cbi8qKlxuICogUmVkaXJlY3QgdG8gcGF0aC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5yZWRpcmVjdCA9IGZ1bmN0aW9uIHJlZGlyZWN0IChwYXRoKSB7XG4gIHZhciByZXMgPSB0aGlzLnJlc1xuXG4gIGlmIChoYXNMaXN0ZW5lcnModGhpcywgJ2RpcmVjdG9yeScpKSB7XG4gICAgdGhpcy5lbWl0KCdkaXJlY3RvcnknLCByZXMsIHBhdGgpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGhpcy5oYXNUcmFpbGluZ1NsYXNoKCkpIHtcbiAgICB0aGlzLmVycm9yKDQwMylcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBsb2MgPSBlbmNvZGVVcmwoY29sbGFwc2VMZWFkaW5nU2xhc2hlcyh0aGlzLnBhdGggKyAnLycpKVxuICB2YXIgZG9jID0gY3JlYXRlSHRtbERvY3VtZW50KCdSZWRpcmVjdGluZycsICdSZWRpcmVjdGluZyB0byA8YSBocmVmPVwiJyArIGVzY2FwZUh0bWwobG9jKSArICdcIj4nICtcbiAgICBlc2NhcGVIdG1sKGxvYykgKyAnPC9hPicpXG5cbiAgLy8gcmVkaXJlY3RcbiAgcmVzLnN0YXR1c0NvZGUgPSAzMDFcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcpXG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgQnVmZmVyLmJ5dGVMZW5ndGgoZG9jKSlcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBcImRlZmF1bHQtc3JjICdub25lJ1wiKVxuICByZXMuc2V0SGVhZGVyKCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKVxuICByZXMuc2V0SGVhZGVyKCdMb2NhdGlvbicsIGxvYylcbiAgcmVzLmVuZChkb2MpXG59XG5cbi8qKlxuICogUGlwZSB0byBgcmVzLlxuICpcbiAqIEBwYXJhbSB7U3RyZWFtfSByZXNcbiAqIEByZXR1cm4ge1N0cmVhbX0gcmVzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiBwaXBlIChyZXMpIHtcbiAgLy8gcm9vdCBwYXRoXG4gIHZhciByb290ID0gdGhpcy5fcm9vdFxuXG4gIC8vIHJlZmVyZW5jZXNcbiAgdGhpcy5yZXMgPSByZXNcblxuICAvLyBkZWNvZGUgdGhlIHBhdGhcbiAgdmFyIHBhdGggPSBkZWNvZGUodGhpcy5wYXRoKVxuICBpZiAocGF0aCA9PT0gLTEpIHtcbiAgICB0aGlzLmVycm9yKDQwMClcbiAgICByZXR1cm4gcmVzXG4gIH1cblxuICAvLyBudWxsIGJ5dGUocylcbiAgaWYgKH5wYXRoLmluZGV4T2YoJ1xcMCcpKSB7XG4gICAgdGhpcy5lcnJvcig0MDApXG4gICAgcmV0dXJuIHJlc1xuICB9XG5cbiAgdmFyIHBhcnRzXG4gIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgLy8gbm9ybWFsaXplXG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHBhdGggPSBub3JtYWxpemUoJy4nICsgc2VwICsgcGF0aClcbiAgICB9XG5cbiAgICAvLyBtYWxpY2lvdXMgcGF0aFxuICAgIGlmIChVUF9QQVRIX1JFR0VYUC50ZXN0KHBhdGgpKSB7XG4gICAgICBkZWJ1ZygnbWFsaWNpb3VzIHBhdGggXCIlc1wiJywgcGF0aClcbiAgICAgIHRoaXMuZXJyb3IoNDAzKVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cblxuICAgIC8vIGV4cGxvZGUgcGF0aCBwYXJ0c1xuICAgIHBhcnRzID0gcGF0aC5zcGxpdChzZXApXG5cbiAgICAvLyBqb2luIC8gbm9ybWFsaXplIGZyb20gb3B0aW9uYWwgcm9vdCBkaXJcbiAgICBwYXRoID0gbm9ybWFsaXplKGpvaW4ocm9vdCwgcGF0aCkpXG4gIH0gZWxzZSB7XG4gICAgLy8gXCIuLlwiIGlzIG1hbGljaW91cyB3aXRob3V0IFwicm9vdFwiXG4gICAgaWYgKFVQX1BBVEhfUkVHRVhQLnRlc3QocGF0aCkpIHtcbiAgICAgIGRlYnVnKCdtYWxpY2lvdXMgcGF0aCBcIiVzXCInLCBwYXRoKVxuICAgICAgdGhpcy5lcnJvcig0MDMpXG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgLy8gZXhwbG9kZSBwYXRoIHBhcnRzXG4gICAgcGFydHMgPSBub3JtYWxpemUocGF0aCkuc3BsaXQoc2VwKVxuXG4gICAgLy8gcmVzb2x2ZSB0aGUgcGF0aFxuICAgIHBhdGggPSByZXNvbHZlKHBhdGgpXG4gIH1cblxuICAvLyBkb3RmaWxlIGhhbmRsaW5nXG4gIGlmIChjb250YWluc0RvdEZpbGUocGFydHMpKSB7XG4gICAgdmFyIGFjY2VzcyA9IHRoaXMuX2RvdGZpbGVzXG5cbiAgICAvLyBsZWdhY3kgc3VwcG9ydFxuICAgIGlmIChhY2Nlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWNjZXNzID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1bMF0gPT09ICcuJ1xuICAgICAgICA/ICh0aGlzLl9oaWRkZW4gPyAnYWxsb3cnIDogJ2lnbm9yZScpXG4gICAgICAgIDogJ2FsbG93J1xuICAgIH1cblxuICAgIGRlYnVnKCclcyBkb3RmaWxlIFwiJXNcIicsIGFjY2VzcywgcGF0aClcbiAgICBzd2l0Y2ggKGFjY2Vzcykge1xuICAgICAgY2FzZSAnYWxsb3cnOlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnZGVueSc6XG4gICAgICAgIHRoaXMuZXJyb3IoNDAzKVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICBjYXNlICdpZ25vcmUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5lcnJvcig0MDQpXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG4gIH1cblxuICAvLyBpbmRleCBmaWxlIHN1cHBvcnRcbiAgaWYgKHRoaXMuX2luZGV4Lmxlbmd0aCAmJiB0aGlzLmhhc1RyYWlsaW5nU2xhc2goKSkge1xuICAgIHRoaXMuc2VuZEluZGV4KHBhdGgpXG4gICAgcmV0dXJuIHJlc1xuICB9XG5cbiAgdGhpcy5zZW5kRmlsZShwYXRoKVxuICByZXR1cm4gcmVzXG59XG5cbi8qKlxuICogVHJhbnNmZXIgYHBhdGhgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiBzZW5kIChwYXRoLCBzdGF0KSB7XG4gIHZhciBsZW4gPSBzdGF0LnNpemVcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcbiAgdmFyIG9wdHMgPSB7fVxuICB2YXIgcmVzID0gdGhpcy5yZXNcbiAgdmFyIHJlcSA9IHRoaXMucmVxXG4gIHZhciByYW5nZXMgPSByZXEuaGVhZGVycy5yYW5nZVxuICB2YXIgb2Zmc2V0ID0gb3B0aW9ucy5zdGFydCB8fCAwXG5cbiAgaWYgKGhlYWRlcnNTZW50KHJlcykpIHtcbiAgICAvLyBpbXBvc3NpYmxlIHRvIHNlbmQgbm93XG4gICAgdGhpcy5oZWFkZXJzQWxyZWFkeVNlbnQoKVxuICAgIHJldHVyblxuICB9XG5cbiAgZGVidWcoJ3BpcGUgXCIlc1wiJywgcGF0aClcblxuICAvLyBzZXQgaGVhZGVyIGZpZWxkc1xuICB0aGlzLnNldEhlYWRlcihwYXRoLCBzdGF0KVxuXG4gIC8vIHNldCBjb250ZW50LXR5cGVcbiAgdGhpcy50eXBlKHBhdGgpXG5cbiAgLy8gY29uZGl0aW9uYWwgR0VUIHN1cHBvcnRcbiAgaWYgKHRoaXMuaXNDb25kaXRpb25hbEdFVCgpKSB7XG4gICAgaWYgKHRoaXMuaXNQcmVjb25kaXRpb25GYWlsdXJlKCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoNDEyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDYWNoYWJsZSgpICYmIHRoaXMuaXNGcmVzaCgpKSB7XG4gICAgICB0aGlzLm5vdE1vZGlmaWVkKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8vIGFkanVzdCBsZW4gdG8gc3RhcnQvZW5kIG9wdGlvbnNcbiAgbGVuID0gTWF0aC5tYXgoMCwgbGVuIC0gb2Zmc2V0KVxuICBpZiAob3B0aW9ucy5lbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBieXRlcyA9IG9wdGlvbnMuZW5kIC0gb2Zmc2V0ICsgMVxuICAgIGlmIChsZW4gPiBieXRlcykgbGVuID0gYnl0ZXNcbiAgfVxuXG4gIC8vIFJhbmdlIHN1cHBvcnRcbiAgaWYgKHRoaXMuX2FjY2VwdFJhbmdlcyAmJiBCWVRFU19SQU5HRV9SRUdFWFAudGVzdChyYW5nZXMpKSB7XG4gICAgLy8gcGFyc2VcbiAgICByYW5nZXMgPSBwYXJzZVJhbmdlKGxlbiwgcmFuZ2VzLCB7XG4gICAgICBjb21iaW5lOiB0cnVlXG4gICAgfSlcblxuICAgIC8vIElmLVJhbmdlIHN1cHBvcnRcbiAgICBpZiAoIXRoaXMuaXNSYW5nZUZyZXNoKCkpIHtcbiAgICAgIGRlYnVnKCdyYW5nZSBzdGFsZScpXG4gICAgICByYW5nZXMgPSAtMlxuICAgIH1cblxuICAgIC8vIHVuc2F0aXNmaWFibGVcbiAgICBpZiAocmFuZ2VzID09PSAtMSkge1xuICAgICAgZGVidWcoJ3JhbmdlIHVuc2F0aXNmaWFibGUnKVxuXG4gICAgICAvLyBDb250ZW50LVJhbmdlXG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVJhbmdlJywgY29udGVudFJhbmdlKCdieXRlcycsIGxlbikpXG5cbiAgICAgIC8vIDQxNiBSZXF1ZXN0ZWQgUmFuZ2UgTm90IFNhdGlzZmlhYmxlXG4gICAgICByZXR1cm4gdGhpcy5lcnJvcig0MTYsIHtcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1SYW5nZSc6IHJlcy5nZXRIZWFkZXIoJ0NvbnRlbnQtUmFuZ2UnKSB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIHZhbGlkIChzeW50YWN0aWNhbGx5IGludmFsaWQvbXVsdGlwbGUgcmFuZ2VzIGFyZSB0cmVhdGVkIGFzIGEgcmVndWxhciByZXNwb25zZSlcbiAgICBpZiAocmFuZ2VzICE9PSAtMiAmJiByYW5nZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBkZWJ1ZygncmFuZ2UgJWonLCByYW5nZXMpXG5cbiAgICAgIC8vIENvbnRlbnQtUmFuZ2VcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gMjA2XG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVJhbmdlJywgY29udGVudFJhbmdlKCdieXRlcycsIGxlbiwgcmFuZ2VzWzBdKSlcblxuICAgICAgLy8gYWRqdXN0IGZvciByZXF1ZXN0ZWQgcmFuZ2VcbiAgICAgIG9mZnNldCArPSByYW5nZXNbMF0uc3RhcnRcbiAgICAgIGxlbiA9IHJhbmdlc1swXS5lbmQgLSByYW5nZXNbMF0uc3RhcnQgKyAxXG4gICAgfVxuICB9XG5cbiAgLy8gY2xvbmUgb3B0aW9uc1xuICBmb3IgKHZhciBwcm9wIGluIG9wdGlvbnMpIHtcbiAgICBvcHRzW3Byb3BdID0gb3B0aW9uc1twcm9wXVxuICB9XG5cbiAgLy8gc2V0IHJlYWQgb3B0aW9uc1xuICBvcHRzLnN0YXJ0ID0gb2Zmc2V0XG4gIG9wdHMuZW5kID0gTWF0aC5tYXgob2Zmc2V0LCBvZmZzZXQgKyBsZW4gLSAxKVxuXG4gIC8vIGNvbnRlbnQtbGVuZ3RoXG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgbGVuKVxuXG4gIC8vIEhFQUQgc3VwcG9ydFxuICBpZiAocmVxLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgcmVzLmVuZCgpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0aGlzLnN0cmVhbShwYXRoLCBvcHRzKVxufVxuXG4vKipcbiAqIFRyYW5zZmVyIGZpbGUgZm9yIGBwYXRoYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQGFwaSBwcml2YXRlXG4gKi9cblNlbmRTdHJlYW0ucHJvdG90eXBlLnNlbmRGaWxlID0gZnVuY3Rpb24gc2VuZEZpbGUgKHBhdGgpIHtcbiAgdmFyIGkgPSAwXG4gIHZhciBzZWxmID0gdGhpc1xuXG4gIGRlYnVnKCdzdGF0IFwiJXNcIicsIHBhdGgpXG4gIGZzLnN0YXQocGF0aCwgZnVuY3Rpb24gb25zdGF0IChlcnIsIHN0YXQpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRU5PRU5UJyAmJiAhZXh0bmFtZShwYXRoKSAmJiBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gIT09IHNlcCkge1xuICAgICAgLy8gbm90IGZvdW5kLCBjaGVjayBleHRlbnNpb25zXG4gICAgICByZXR1cm4gbmV4dChlcnIpXG4gICAgfVxuICAgIGlmIChlcnIpIHJldHVybiBzZWxmLm9uU3RhdEVycm9yKGVycilcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gc2VsZi5yZWRpcmVjdChwYXRoKVxuICAgIHNlbGYuZW1pdCgnZmlsZScsIHBhdGgsIHN0YXQpXG4gICAgc2VsZi5zZW5kKHBhdGgsIHN0YXQpXG4gIH0pXG5cbiAgZnVuY3Rpb24gbmV4dCAoZXJyKSB7XG4gICAgaWYgKHNlbGYuX2V4dGVuc2lvbnMubGVuZ3RoIDw9IGkpIHtcbiAgICAgIHJldHVybiBlcnJcbiAgICAgICAgPyBzZWxmLm9uU3RhdEVycm9yKGVycilcbiAgICAgICAgOiBzZWxmLmVycm9yKDQwNClcbiAgICB9XG5cbiAgICB2YXIgcCA9IHBhdGggKyAnLicgKyBzZWxmLl9leHRlbnNpb25zW2krK11cblxuICAgIGRlYnVnKCdzdGF0IFwiJXNcIicsIHApXG4gICAgZnMuc3RhdChwLCBmdW5jdGlvbiAoZXJyLCBzdGF0KSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gbmV4dCgpXG4gICAgICBzZWxmLmVtaXQoJ2ZpbGUnLCBwLCBzdGF0KVxuICAgICAgc2VsZi5zZW5kKHAsIHN0YXQpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFRyYW5zZmVyIGluZGV4IGZvciBgcGF0aGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5zZW5kSW5kZXggPSBmdW5jdGlvbiBzZW5kSW5kZXggKHBhdGgpIHtcbiAgdmFyIGkgPSAtMVxuICB2YXIgc2VsZiA9IHRoaXNcblxuICBmdW5jdGlvbiBuZXh0IChlcnIpIHtcbiAgICBpZiAoKytpID49IHNlbGYuX2luZGV4Lmxlbmd0aCkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIHNlbGYub25TdGF0RXJyb3IoZXJyKVxuICAgICAgcmV0dXJuIHNlbGYuZXJyb3IoNDA0KVxuICAgIH1cblxuICAgIHZhciBwID0gam9pbihwYXRoLCBzZWxmLl9pbmRleFtpXSlcblxuICAgIGRlYnVnKCdzdGF0IFwiJXNcIicsIHApXG4gICAgZnMuc3RhdChwLCBmdW5jdGlvbiAoZXJyLCBzdGF0KSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSByZXR1cm4gbmV4dCgpXG4gICAgICBzZWxmLmVtaXQoJ2ZpbGUnLCBwLCBzdGF0KVxuICAgICAgc2VsZi5zZW5kKHAsIHN0YXQpXG4gICAgfSlcbiAgfVxuXG4gIG5leHQoKVxufVxuXG4vKipcbiAqIFN0cmVhbSBgcGF0aGAgdG8gdGhlIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUuc3RyZWFtID0gZnVuY3Rpb24gc3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpc1xuICB2YXIgcmVzID0gdGhpcy5yZXNcblxuICAvLyBwaXBlXG4gIHZhciBzdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgsIG9wdGlvbnMpXG4gIHRoaXMuZW1pdCgnc3RyZWFtJywgc3RyZWFtKVxuICBzdHJlYW0ucGlwZShyZXMpXG5cbiAgLy8gY2xlYW51cFxuICBmdW5jdGlvbiBjbGVhbnVwICgpIHtcbiAgICBkZXN0cm95KHN0cmVhbSwgdHJ1ZSlcbiAgfVxuXG4gIC8vIHJlc3BvbnNlIGZpbmlzaGVkLCBjbGVhbnVwXG4gIG9uRmluaXNoZWQocmVzLCBjbGVhbnVwKVxuXG4gIC8vIGVycm9yIGhhbmRsaW5nXG4gIHN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiBvbmVycm9yIChlcnIpIHtcbiAgICAvLyBjbGVhbiB1cCBzdHJlYW0gZWFybHlcbiAgICBjbGVhbnVwKClcblxuICAgIC8vIGVycm9yXG4gICAgc2VsZi5vblN0YXRFcnJvcihlcnIpXG4gIH0pXG5cbiAgLy8gZW5kXG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gb25lbmQgKCkge1xuICAgIHNlbGYuZW1pdCgnZW5kJylcbiAgfSlcbn1cblxuLyoqXG4gKiBTZXQgY29udGVudC10eXBlIGJhc2VkIG9uIGBwYXRoYFxuICogaWYgaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiB0eXBlIChwYXRoKSB7XG4gIHZhciByZXMgPSB0aGlzLnJlc1xuXG4gIGlmIChyZXMuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKSkgcmV0dXJuXG5cbiAgdmFyIHR5cGUgPSBtaW1lLmxvb2t1cChwYXRoKVxuXG4gIGlmICghdHlwZSkge1xuICAgIGRlYnVnKCdubyBjb250ZW50LXR5cGUnKVxuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGNoYXJzZXQgPSBtaW1lLmNoYXJzZXRzLmxvb2t1cCh0eXBlKVxuXG4gIGRlYnVnKCdjb250ZW50LXR5cGUgJXMnLCB0eXBlKVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCB0eXBlICsgKGNoYXJzZXQgPyAnOyBjaGFyc2V0PScgKyBjaGFyc2V0IDogJycpKVxufVxuXG4vKipcbiAqIFNldCByZXNwb25zZSBoZWFkZXIgZmllbGRzLCBtb3N0XG4gKiBmaWVsZHMgbWF5IGJlIHByZS1kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUuc2V0SGVhZGVyID0gZnVuY3Rpb24gc2V0SGVhZGVyIChwYXRoLCBzdGF0KSB7XG4gIHZhciByZXMgPSB0aGlzLnJlc1xuXG4gIHRoaXMuZW1pdCgnaGVhZGVycycsIHJlcywgcGF0aCwgc3RhdClcblxuICBpZiAodGhpcy5fYWNjZXB0UmFuZ2VzICYmICFyZXMuZ2V0SGVhZGVyKCdBY2NlcHQtUmFuZ2VzJykpIHtcbiAgICBkZWJ1ZygnYWNjZXB0IHJhbmdlcycpXG4gICAgcmVzLnNldEhlYWRlcignQWNjZXB0LVJhbmdlcycsICdieXRlcycpXG4gIH1cblxuICBpZiAodGhpcy5fY2FjaGVDb250cm9sICYmICFyZXMuZ2V0SGVhZGVyKCdDYWNoZS1Db250cm9sJykpIHtcbiAgICB2YXIgY2FjaGVDb250cm9sID0gJ3B1YmxpYywgbWF4LWFnZT0nICsgTWF0aC5mbG9vcih0aGlzLl9tYXhhZ2UgLyAxMDAwKVxuXG4gICAgaWYgKHRoaXMuX2ltbXV0YWJsZSkge1xuICAgICAgY2FjaGVDb250cm9sICs9ICcsIGltbXV0YWJsZSdcbiAgICB9XG5cbiAgICBkZWJ1ZygnY2FjaGUtY29udHJvbCAlcycsIGNhY2hlQ29udHJvbClcbiAgICByZXMuc2V0SGVhZGVyKCdDYWNoZS1Db250cm9sJywgY2FjaGVDb250cm9sKVxuICB9XG5cbiAgaWYgKHRoaXMuX2xhc3RNb2RpZmllZCAmJiAhcmVzLmdldEhlYWRlcignTGFzdC1Nb2RpZmllZCcpKSB7XG4gICAgdmFyIG1vZGlmaWVkID0gc3RhdC5tdGltZS50b1VUQ1N0cmluZygpXG4gICAgZGVidWcoJ21vZGlmaWVkICVzJywgbW9kaWZpZWQpXG4gICAgcmVzLnNldEhlYWRlcignTGFzdC1Nb2RpZmllZCcsIG1vZGlmaWVkKVxuICB9XG5cbiAgaWYgKHRoaXMuX2V0YWcgJiYgIXJlcy5nZXRIZWFkZXIoJ0VUYWcnKSkge1xuICAgIHZhciB2YWwgPSBldGFnKHN0YXQpXG4gICAgZGVidWcoJ2V0YWcgJXMnLCB2YWwpXG4gICAgcmVzLnNldEhlYWRlcignRVRhZycsIHZhbClcbiAgfVxufVxuXG4vKipcbiAqIENsZWFyIGFsbCBoZWFkZXJzIGZyb20gYSByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNsZWFySGVhZGVycyAocmVzKSB7XG4gIHZhciBoZWFkZXJzID0gZ2V0SGVhZGVyTmFtZXMocmVzKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy5yZW1vdmVIZWFkZXIoaGVhZGVyc1tpXSlcbiAgfVxufVxuXG4vKipcbiAqIENvbGxhcHNlIGFsbCBsZWFkaW5nIHNsYXNoZXMgaW50byBhIHNpbmdsZSBzbGFzaFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbGxhcHNlTGVhZGluZ1NsYXNoZXMgKHN0cikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHJbaV0gIT09ICcvJykge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaSA+IDFcbiAgICA/ICcvJyArIHN0ci5zdWJzdHIoaSlcbiAgICA6IHN0clxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBwYXRoIHBhcnRzIGNvbnRhaW4gYSBkb3RmaWxlLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbnRhaW5zRG90RmlsZSAocGFydHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwYXJ0ID0gcGFydHNbaV1cbiAgICBpZiAocGFydC5sZW5ndGggPiAxICYmIHBhcnRbMF0gPT09ICcuJykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBDb250ZW50LVJhbmdlIGhlYWRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEBwYXJhbSB7YXJyYXl9IFtyYW5nZV1cbiAqL1xuXG5mdW5jdGlvbiBjb250ZW50UmFuZ2UgKHR5cGUsIHNpemUsIHJhbmdlKSB7XG4gIHJldHVybiB0eXBlICsgJyAnICsgKHJhbmdlID8gcmFuZ2Uuc3RhcnQgKyAnLScgKyByYW5nZS5lbmQgOiAnKicpICsgJy8nICsgc2l6ZVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG1pbmltYWwgSFRNTCBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBib2R5XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUh0bWxEb2N1bWVudCAodGl0bGUsIGJvZHkpIHtcbiAgcmV0dXJuICc8IURPQ1RZUEUgaHRtbD5cXG4nICtcbiAgICAnPGh0bWwgbGFuZz1cImVuXCI+XFxuJyArXG4gICAgJzxoZWFkPlxcbicgK1xuICAgICc8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cXG4nICtcbiAgICAnPHRpdGxlPicgKyB0aXRsZSArICc8L3RpdGxlPlxcbicgK1xuICAgICc8L2hlYWQ+XFxuJyArXG4gICAgJzxib2R5PlxcbicgK1xuICAgICc8cHJlPicgKyBib2R5ICsgJzwvcHJlPlxcbicgK1xuICAgICc8L2JvZHk+XFxuJyArXG4gICAgJzwvaHRtbD5cXG4nXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgSHR0cEVycm9yIG9iamVjdCBmcm9tIHNpbXBsZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICogQHBhcmFtIHtFcnJvcnxvYmplY3R9IGVyclxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVIdHRwRXJyb3IgKHN0YXR1cywgZXJyKSB7XG4gIGlmICghZXJyKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVycm9yKHN0YXR1cylcbiAgfVxuXG4gIHJldHVybiBlcnIgaW5zdGFuY2VvZiBFcnJvclxuICAgID8gY3JlYXRlRXJyb3Ioc3RhdHVzLCBlcnIsIHsgZXhwb3NlOiBmYWxzZSB9KVxuICAgIDogY3JlYXRlRXJyb3Ioc3RhdHVzLCBlcnIpXG59XG5cbi8qKlxuICogZGVjb2RlVVJJQ29tcG9uZW50LlxuICpcbiAqIEFsbG93cyBWOCB0byBvbmx5IGRlb3B0aW1pemUgdGhpcyBmbiBpbnN0ZWFkIG9mIGFsbFxuICogb2Ygc2VuZCgpLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBkZWNvZGUgKHBhdGgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHBhdGgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAtMVxuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBoZWFkZXIgbmFtZXMgb24gYSByZXNwbnNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNcbiAqIEByZXR1cm5zIHthcnJheVtzdHJpbmddfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRIZWFkZXJOYW1lcyAocmVzKSB7XG4gIHJldHVybiB0eXBlb2YgcmVzLmdldEhlYWRlck5hbWVzICE9PSAnZnVuY3Rpb24nXG4gICAgPyBPYmplY3Qua2V5cyhyZXMuX2hlYWRlcnMgfHwge30pXG4gICAgOiByZXMuZ2V0SGVhZGVyTmFtZXMoKVxufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBlbWl0dGVyIGhhcyBsaXN0ZW5lcnMgb2YgYSBnaXZlbiB0eXBlLlxuICpcbiAqIFRoZSB3YXkgdG8gZG8gdGhpcyBjaGVjayBpcyBkb25lIHRocmVlIGRpZmZlcmVudCB3YXlzIGluIE5vZGUuanMgPj0gMC44XG4gKiBzbyB0aGlzIGNvbnNvbGlkYXRlcyB0aGVtIGludG8gYSBtaW5pbWFsIHNldCB1c2luZyBpbnN0YW5jZSBtZXRob2RzLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGhhc0xpc3RlbmVycyAoZW1pdHRlciwgdHlwZSkge1xuICB2YXIgY291bnQgPSB0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ICE9PSAnZnVuY3Rpb24nXG4gICAgPyBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGhcbiAgICA6IGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKVxuXG4gIHJldHVybiBjb3VudCA+IDBcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHJlc3BvbnNlIGhlYWRlcnMgaGF2ZSBiZWVuIHNlbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGhlYWRlcnNTZW50IChyZXMpIHtcbiAgcmV0dXJuIHR5cGVvZiByZXMuaGVhZGVyc1NlbnQgIT09ICdib29sZWFuJ1xuICAgID8gQm9vbGVhbihyZXMuX2hlYWRlcilcbiAgICA6IHJlcy5oZWFkZXJzU2VudFxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUgaW5kZXggb3B0aW9uIGludG8gYW4gYXJyYXkuXG4gKlxuICogQHBhcmFtIHtib29sZWFufHN0cmluZ3xhcnJheX0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVMaXN0ICh2YWwsIG5hbWUpIHtcbiAgdmFyIGxpc3QgPSBbXS5jb25jYXQodmFsIHx8IFtdKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0eXBlb2YgbGlzdFtpXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobmFtZSArICcgbXVzdCBiZSBhcnJheSBvZiBzdHJpbmdzIG9yIGZhbHNlJylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGlzdFxufVxuXG4vKipcbiAqIFBhcnNlIGFuIEhUVFAgRGF0ZSBpbnRvIGEgbnVtYmVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlSHR0cERhdGUgKGRhdGUpIHtcbiAgdmFyIHRpbWVzdGFtcCA9IGRhdGUgJiYgRGF0ZS5wYXJzZShkYXRlKVxuXG4gIHJldHVybiB0eXBlb2YgdGltZXN0YW1wID09PSAnbnVtYmVyJ1xuICAgID8gdGltZXN0YW1wXG4gICAgOiBOYU5cbn1cblxuLyoqXG4gKiBQYXJzZSBhIEhUVFAgdG9rZW4gbGlzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlVG9rZW5MaXN0IChzdHIpIHtcbiAgdmFyIGVuZCA9IDBcbiAgdmFyIGxpc3QgPSBbXVxuICB2YXIgc3RhcnQgPSAwXG5cbiAgLy8gZ2F0aGVyIHRva2Vuc1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc3dpdGNoIChzdHIuY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSAweDIwOiAvKiAgICovXG4gICAgICAgIGlmIChzdGFydCA9PT0gZW5kKSB7XG4gICAgICAgICAgc3RhcnQgPSBlbmQgPSBpICsgMVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDB4MmM6IC8qICwgKi9cbiAgICAgICAgaWYgKHN0YXJ0ICE9PSBlbmQpIHtcbiAgICAgICAgICBsaXN0LnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgZW5kKSlcbiAgICAgICAgfVxuICAgICAgICBzdGFydCA9IGVuZCA9IGkgKyAxXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbmQgPSBpICsgMVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmFsIHRva2VuXG4gIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgbGlzdC5wdXNoKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG4gIH1cblxuICByZXR1cm4gbGlzdFxufVxuXG4vKipcbiAqIFNldCBhbiBvYmplY3Qgb2YgaGVhZGVycyBvbiBhIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNldEhlYWRlcnMgKHJlcywgaGVhZGVycykge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV1cbiAgICByZXMuc2V0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKVxuICB9XG59XG4iLCAiLyohXG4gKiBmb3J3YXJkZWRcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTcgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZm9yd2FyZGVkXG5cbi8qKlxuICogR2V0IGFsbCBhZGRyZXNzZXMgaW4gdGhlIHJlcXVlc3QsIHVzaW5nIHRoZSBgWC1Gb3J3YXJkZWQtRm9yYCBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlcVxuICogQHJldHVybiB7YXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9yd2FyZGVkIChyZXEpIHtcbiAgaWYgKCFyZXEpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCByZXEgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgLy8gc2ltcGxlIGhlYWRlciBwYXJzaW5nXG4gIHZhciBwcm94eUFkZHJzID0gcGFyc2UocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddIHx8ICcnKVxuICB2YXIgc29ja2V0QWRkciA9IGdldFNvY2tldEFkZHIocmVxKVxuICB2YXIgYWRkcnMgPSBbc29ja2V0QWRkcl0uY29uY2F0KHByb3h5QWRkcnMpXG5cbiAgLy8gcmV0dXJuIGFsbCBhZGRyZXNzZXNcbiAgcmV0dXJuIGFkZHJzXG59XG5cbi8qKlxuICogR2V0IHRoZSBzb2NrZXQgYWRkcmVzcyBmb3IgYSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0U29ja2V0QWRkciAocmVxKSB7XG4gIHJldHVybiByZXEuc29ja2V0XG4gICAgPyByZXEuc29ja2V0LnJlbW90ZUFkZHJlc3NcbiAgICA6IHJlcS5jb25uZWN0aW9uLnJlbW90ZUFkZHJlc3Ncbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgWC1Gb3J3YXJkZWQtRm9yIGhlYWRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlIChoZWFkZXIpIHtcbiAgdmFyIGVuZCA9IGhlYWRlci5sZW5ndGhcbiAgdmFyIGxpc3QgPSBbXVxuICB2YXIgc3RhcnQgPSBoZWFkZXIubGVuZ3RoXG5cbiAgLy8gZ2F0aGVyIGFkZHJlc3NlcywgYmFja3dhcmRzXG4gIGZvciAodmFyIGkgPSBoZWFkZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBzd2l0Y2ggKGhlYWRlci5jaGFyQ29kZUF0KGkpKSB7XG4gICAgICBjYXNlIDB4MjA6IC8qICAgKi9cbiAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICAgICAgICBzdGFydCA9IGVuZCA9IGlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAweDJjOiAvKiAsICovXG4gICAgICAgIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgICAgICAgbGlzdC5wdXNoKGhlYWRlci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgPSBlbmQgPSBpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdGFydCA9IGlcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyBmaW5hbCBhZGRyZXNzXG4gIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgbGlzdC5wdXNoKGhlYWRlci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG4gIH1cblxuICByZXR1cm4gbGlzdFxufVxuIiwgIihmdW5jdGlvbigpIHtcbiAgdmFyIGV4cGFuZElQdjYsIGlwYWRkciwgaXB2NFBhcnQsIGlwdjRSZWdleGVzLCBpcHY2UGFydCwgaXB2NlJlZ2V4ZXMsIG1hdGNoQ0lEUiwgcm9vdCwgem9uZUluZGV4O1xuXG4gIGlwYWRkciA9IHt9O1xuXG4gIHJvb3QgPSB0aGlzO1xuXG4gIGlmICgodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUgIT09IG51bGwpICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBpcGFkZHI7XG4gIH0gZWxzZSB7XG4gICAgcm9vdFsnaXBhZGRyJ10gPSBpcGFkZHI7XG4gIH1cblxuICBtYXRjaENJRFIgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCBwYXJ0U2l6ZSwgY2lkckJpdHMpIHtcbiAgICB2YXIgcGFydCwgc2hpZnQ7XG4gICAgaWYgKGZpcnN0Lmxlbmd0aCAhPT0gc2Vjb25kLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiBjYW5ub3QgbWF0Y2ggQ0lEUiBmb3Igb2JqZWN0cyB3aXRoIGRpZmZlcmVudCBsZW5ndGhzXCIpO1xuICAgIH1cbiAgICBwYXJ0ID0gMDtcbiAgICB3aGlsZSAoY2lkckJpdHMgPiAwKSB7XG4gICAgICBzaGlmdCA9IHBhcnRTaXplIC0gY2lkckJpdHM7XG4gICAgICBpZiAoc2hpZnQgPCAwKSB7XG4gICAgICAgIHNoaWZ0ID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChmaXJzdFtwYXJ0XSA+PiBzaGlmdCAhPT0gc2Vjb25kW3BhcnRdID4+IHNoaWZ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNpZHJCaXRzIC09IHBhcnRTaXplO1xuICAgICAgcGFydCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBpcGFkZHIuc3VibmV0TWF0Y2ggPSBmdW5jdGlvbihhZGRyZXNzLCByYW5nZUxpc3QsIGRlZmF1bHROYW1lKSB7XG4gICAgdmFyIGssIGxlbiwgcmFuZ2VOYW1lLCByYW5nZVN1Ym5ldHMsIHN1Ym5ldDtcbiAgICBpZiAoZGVmYXVsdE5hbWUgPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdE5hbWUgPSAndW5pY2FzdCc7XG4gICAgfVxuICAgIGZvciAocmFuZ2VOYW1lIGluIHJhbmdlTGlzdCkge1xuICAgICAgcmFuZ2VTdWJuZXRzID0gcmFuZ2VMaXN0W3JhbmdlTmFtZV07XG4gICAgICBpZiAocmFuZ2VTdWJuZXRzWzBdICYmICEocmFuZ2VTdWJuZXRzWzBdIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgIHJhbmdlU3VibmV0cyA9IFtyYW5nZVN1Ym5ldHNdO1xuICAgICAgfVxuICAgICAgZm9yIChrID0gMCwgbGVuID0gcmFuZ2VTdWJuZXRzLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7XG4gICAgICAgIHN1Ym5ldCA9IHJhbmdlU3VibmV0c1trXTtcbiAgICAgICAgaWYgKGFkZHJlc3Mua2luZCgpID09PSBzdWJuZXRbMF0ua2luZCgpKSB7XG4gICAgICAgICAgaWYgKGFkZHJlc3MubWF0Y2guYXBwbHkoYWRkcmVzcywgc3VibmV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJhbmdlTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHROYW1lO1xuICB9O1xuXG4gIGlwYWRkci5JUHY0ID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIElQdjQob2N0ZXRzKSB7XG4gICAgICB2YXIgaywgbGVuLCBvY3RldDtcbiAgICAgIGlmIChvY3RldHMubGVuZ3RoICE9PSA0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogaXB2NCBvY3RldCBjb3VudCBzaG91bGQgYmUgNFwiKTtcbiAgICAgIH1cbiAgICAgIGZvciAoayA9IDAsIGxlbiA9IG9jdGV0cy5sZW5ndGg7IGsgPCBsZW47IGsrKykge1xuICAgICAgICBvY3RldCA9IG9jdGV0c1trXTtcbiAgICAgICAgaWYgKCEoKDAgPD0gb2N0ZXQgJiYgb2N0ZXQgPD0gMjU1KSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IGlwdjQgb2N0ZXQgc2hvdWxkIGZpdCBpbiA4IGJpdHNcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMub2N0ZXRzID0gb2N0ZXRzO1xuICAgIH1cblxuICAgIElQdjQucHJvdG90eXBlLmtpbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAnaXB2NCc7XG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5vY3RldHMuam9pbihcIi5cIik7XG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnRvTm9ybWFsaXplZFN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUudG9CeXRlQXJyYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm9jdGV0cy5zbGljZSgwKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbihvdGhlciwgY2lkclJhbmdlKSB7XG4gICAgICB2YXIgcmVmO1xuICAgICAgaWYgKGNpZHJSYW5nZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJlZiA9IG90aGVyLCBvdGhlciA9IHJlZlswXSwgY2lkclJhbmdlID0gcmVmWzFdO1xuICAgICAgfVxuICAgICAgaWYgKG90aGVyLmtpbmQoKSAhPT0gJ2lwdjQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogY2Fubm90IG1hdGNoIGlwdjQgYWRkcmVzcyB3aXRoIG5vbi1pcHY0IG9uZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaENJRFIodGhpcy5vY3RldHMsIG90aGVyLm9jdGV0cywgOCwgY2lkclJhbmdlKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUuU3BlY2lhbFJhbmdlcyA9IHtcbiAgICAgIHVuc3BlY2lmaWVkOiBbW25ldyBJUHY0KFswLCAwLCAwLCAwXSksIDhdXSxcbiAgICAgIGJyb2FkY2FzdDogW1tuZXcgSVB2NChbMjU1LCAyNTUsIDI1NSwgMjU1XSksIDMyXV0sXG4gICAgICBtdWx0aWNhc3Q6IFtbbmV3IElQdjQoWzIyNCwgMCwgMCwgMF0pLCA0XV0sXG4gICAgICBsaW5rTG9jYWw6IFtbbmV3IElQdjQoWzE2OSwgMjU0LCAwLCAwXSksIDE2XV0sXG4gICAgICBsb29wYmFjazogW1tuZXcgSVB2NChbMTI3LCAwLCAwLCAwXSksIDhdXSxcbiAgICAgIGNhcnJpZXJHcmFkZU5hdDogW1tuZXcgSVB2NChbMTAwLCA2NCwgMCwgMF0pLCAxMF1dLFxuICAgICAgXCJwcml2YXRlXCI6IFtbbmV3IElQdjQoWzEwLCAwLCAwLCAwXSksIDhdLCBbbmV3IElQdjQoWzE3MiwgMTYsIDAsIDBdKSwgMTJdLCBbbmV3IElQdjQoWzE5MiwgMTY4LCAwLCAwXSksIDE2XV0sXG4gICAgICByZXNlcnZlZDogW1tuZXcgSVB2NChbMTkyLCAwLCAwLCAwXSksIDI0XSwgW25ldyBJUHY0KFsxOTIsIDAsIDIsIDBdKSwgMjRdLCBbbmV3IElQdjQoWzE5MiwgODgsIDk5LCAwXSksIDI0XSwgW25ldyBJUHY0KFsxOTgsIDUxLCAxMDAsIDBdKSwgMjRdLCBbbmV3IElQdjQoWzIwMywgMCwgMTEzLCAwXSksIDI0XSwgW25ldyBJUHY0KFsyNDAsIDAsIDAsIDBdKSwgNF1dXG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnJhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXBhZGRyLnN1Ym5ldE1hdGNoKHRoaXMsIHRoaXMuU3BlY2lhbFJhbmdlcyk7XG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnRvSVB2NE1hcHBlZEFkZHJlc3MgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpcGFkZHIuSVB2Ni5wYXJzZShcIjo6ZmZmZjpcIiArICh0aGlzLnRvU3RyaW5nKCkpKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUucHJlZml4TGVuZ3RoRnJvbVN1Ym5ldE1hc2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjaWRyLCBpLCBrLCBvY3RldCwgc3RvcCwgemVyb3MsIHplcm90YWJsZTtcbiAgICAgIHplcm90YWJsZSA9IHtcbiAgICAgICAgMDogOCxcbiAgICAgICAgMTI4OiA3LFxuICAgICAgICAxOTI6IDYsXG4gICAgICAgIDIyNDogNSxcbiAgICAgICAgMjQwOiA0LFxuICAgICAgICAyNDg6IDMsXG4gICAgICAgIDI1MjogMixcbiAgICAgICAgMjU0OiAxLFxuICAgICAgICAyNTU6IDBcbiAgICAgIH07XG4gICAgICBjaWRyID0gMDtcbiAgICAgIHN0b3AgPSBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGsgPSAzOyBrID49IDA7IGkgPSBrICs9IC0xKSB7XG4gICAgICAgIG9jdGV0ID0gdGhpcy5vY3RldHNbaV07XG4gICAgICAgIGlmIChvY3RldCBpbiB6ZXJvdGFibGUpIHtcbiAgICAgICAgICB6ZXJvcyA9IHplcm90YWJsZVtvY3RldF07XG4gICAgICAgICAgaWYgKHN0b3AgJiYgemVyb3MgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoemVyb3MgIT09IDgpIHtcbiAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaWRyICs9IHplcm9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMzIgLSBjaWRyO1xuICAgIH07XG5cbiAgICByZXR1cm4gSVB2NDtcblxuICB9KSgpO1xuXG4gIGlwdjRQYXJ0ID0gXCIoMD9cXFxcZCt8MHhbYS1mMC05XSspXCI7XG5cbiAgaXB2NFJlZ2V4ZXMgPSB7XG4gICAgZm91ck9jdGV0OiBuZXcgUmVnRXhwKFwiXlwiICsgaXB2NFBhcnQgKyBcIlxcXFwuXCIgKyBpcHY0UGFydCArIFwiXFxcXC5cIiArIGlwdjRQYXJ0ICsgXCJcXFxcLlwiICsgaXB2NFBhcnQgKyBcIiRcIiwgJ2knKSxcbiAgICBsb25nVmFsdWU6IG5ldyBSZWdFeHAoXCJeXCIgKyBpcHY0UGFydCArIFwiJFwiLCAnaScpXG4gIH07XG5cbiAgaXBhZGRyLklQdjQucGFyc2VyID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIG1hdGNoLCBwYXJzZUludEF1dG8sIHBhcnQsIHNoaWZ0LCB2YWx1ZTtcbiAgICBwYXJzZUludEF1dG8gPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIGlmIChzdHJpbmdbMF0gPT09IFwiMFwiICYmIHN0cmluZ1sxXSAhPT0gXCJ4XCIpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHN0cmluZywgOCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoc3RyaW5nKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChpcHY0UmVnZXhlcy5mb3VyT2N0ZXQpKSB7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaywgbGVuLCByZWYsIHJlc3VsdHM7XG4gICAgICAgIHJlZiA9IG1hdGNoLnNsaWNlKDEsIDYpO1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoayA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGsgPCBsZW47IGsrKykge1xuICAgICAgICAgIHBhcnQgPSByZWZba107XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSW50QXV0byhwYXJ0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goaXB2NFJlZ2V4ZXMubG9uZ1ZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBwYXJzZUludEF1dG8obWF0Y2hbMV0pO1xuICAgICAgaWYgKHZhbHVlID4gMHhmZmZmZmZmZiB8fCB2YWx1ZSA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiBhZGRyZXNzIG91dHNpZGUgZGVmaW5lZCByYW5nZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaywgcmVzdWx0cztcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKHNoaWZ0ID0gayA9IDA7IGsgPD0gMjQ7IHNoaWZ0ID0gayArPSA4KSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKCh2YWx1ZSA+PiBzaGlmdCkgJiAweGZmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCkpLnJldmVyc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5JUHY2ID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIElQdjYocGFydHMsIHpvbmVJZCkge1xuICAgICAgdmFyIGksIGssIGwsIGxlbiwgcGFydCwgcmVmO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMTYpIHtcbiAgICAgICAgdGhpcy5wYXJ0cyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSBrID0gMDsgayA8PSAxNDsgaSA9IGsgKz0gMikge1xuICAgICAgICAgIHRoaXMucGFydHMucHVzaCgocGFydHNbaV0gPDwgOCkgfCBwYXJ0c1tpICsgMV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnRzLmxlbmd0aCA9PT0gOCkge1xuICAgICAgICB0aGlzLnBhcnRzID0gcGFydHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IGlwdjYgcGFydCBjb3VudCBzaG91bGQgYmUgOCBvciAxNlwiKTtcbiAgICAgIH1cbiAgICAgIHJlZiA9IHRoaXMucGFydHM7XG4gICAgICBmb3IgKGwgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBsIDwgbGVuOyBsKyspIHtcbiAgICAgICAgcGFydCA9IHJlZltsXTtcbiAgICAgICAgaWYgKCEoKDAgPD0gcGFydCAmJiBwYXJ0IDw9IDB4ZmZmZikpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiBpcHY2IHBhcnQgc2hvdWxkIGZpdCBpbiAxNiBiaXRzXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoem9uZUlkKSB7XG4gICAgICAgIHRoaXMuem9uZUlkID0gem9uZUlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIElQdjYucHJvdG90eXBlLmtpbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAnaXB2Nic7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50b05vcm1hbGl6ZWRTdHJpbmcoKS5yZXBsYWNlKC8oKF58OikoMCg6fCQpKSspLywgJzo6Jyk7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnRvUkZDNTk1MlN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJlc3RNYXRjaEluZGV4LCBiZXN0TWF0Y2hMZW5ndGgsIG1hdGNoLCByZWdleCwgc3RyaW5nO1xuICAgICAgcmVnZXggPSAvKChefDopKDAoOnwkKSl7Mix9KS9nO1xuICAgICAgc3RyaW5nID0gdGhpcy50b05vcm1hbGl6ZWRTdHJpbmcoKTtcbiAgICAgIGJlc3RNYXRjaEluZGV4ID0gMDtcbiAgICAgIGJlc3RNYXRjaExlbmd0aCA9IC0xO1xuICAgICAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKSkpIHtcbiAgICAgICAgaWYgKG1hdGNoWzBdLmxlbmd0aCA+IGJlc3RNYXRjaExlbmd0aCkge1xuICAgICAgICAgIGJlc3RNYXRjaEluZGV4ID0gbWF0Y2guaW5kZXg7XG4gICAgICAgICAgYmVzdE1hdGNoTGVuZ3RoID0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYmVzdE1hdGNoTGVuZ3RoIDwgMCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgYmVzdE1hdGNoSW5kZXgpICsgJzo6JyArIHN0cmluZy5zdWJzdHJpbmcoYmVzdE1hdGNoSW5kZXggKyBiZXN0TWF0Y2hMZW5ndGgpO1xuICAgIH07XG5cbiAgICBJUHY2LnByb3RvdHlwZS50b0J5dGVBcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGJ5dGVzLCBrLCBsZW4sIHBhcnQsIHJlZjtcbiAgICAgIGJ5dGVzID0gW107XG4gICAgICByZWYgPSB0aGlzLnBhcnRzO1xuICAgICAgZm9yIChrID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7XG4gICAgICAgIHBhcnQgPSByZWZba107XG4gICAgICAgIGJ5dGVzLnB1c2gocGFydCA+PiA4KTtcbiAgICAgICAgYnl0ZXMucHVzaChwYXJ0ICYgMHhmZik7XG4gICAgICB9XG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnRvTm9ybWFsaXplZFN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGFkZHIsIHBhcnQsIHN1ZmZpeDtcbiAgICAgIGFkZHIgPSAoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaywgbGVuLCByZWYsIHJlc3VsdHM7XG4gICAgICAgIHJlZiA9IHRoaXMucGFydHM7XG4gICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgZm9yIChrID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7XG4gICAgICAgICAgcGFydCA9IHJlZltrXTtcbiAgICAgICAgICByZXN1bHRzLnB1c2gocGFydC50b1N0cmluZygxNikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfSkuY2FsbCh0aGlzKSkuam9pbihcIjpcIik7XG4gICAgICBzdWZmaXggPSAnJztcbiAgICAgIGlmICh0aGlzLnpvbmVJZCkge1xuICAgICAgICBzdWZmaXggPSAnJScgKyB0aGlzLnpvbmVJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhZGRyICsgc3VmZml4O1xuICAgIH07XG5cbiAgICBJUHY2LnByb3RvdHlwZS50b0ZpeGVkTGVuZ3RoU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYWRkciwgcGFydCwgc3VmZml4O1xuICAgICAgYWRkciA9ICgoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBrLCBsZW4sIHJlZiwgcmVzdWx0cztcbiAgICAgICAgcmVmID0gdGhpcy5wYXJ0cztcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGsgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgICBwYXJ0ID0gcmVmW2tdO1xuICAgICAgICAgIHJlc3VsdHMucHVzaChwYXJ0LnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCAnMCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pLmNhbGwodGhpcykpLmpvaW4oXCI6XCIpO1xuICAgICAgc3VmZml4ID0gJyc7XG4gICAgICBpZiAodGhpcy56b25lSWQpIHtcbiAgICAgICAgc3VmZml4ID0gJyUnICsgdGhpcy56b25lSWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWRkciArIHN1ZmZpeDtcbiAgICB9O1xuXG4gICAgSVB2Ni5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbihvdGhlciwgY2lkclJhbmdlKSB7XG4gICAgICB2YXIgcmVmO1xuICAgICAgaWYgKGNpZHJSYW5nZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJlZiA9IG90aGVyLCBvdGhlciA9IHJlZlswXSwgY2lkclJhbmdlID0gcmVmWzFdO1xuICAgICAgfVxuICAgICAgaWYgKG90aGVyLmtpbmQoKSAhPT0gJ2lwdjYnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogY2Fubm90IG1hdGNoIGlwdjYgYWRkcmVzcyB3aXRoIG5vbi1pcHY2IG9uZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaENJRFIodGhpcy5wYXJ0cywgb3RoZXIucGFydHMsIDE2LCBjaWRyUmFuZ2UpO1xuICAgIH07XG5cbiAgICBJUHY2LnByb3RvdHlwZS5TcGVjaWFsUmFuZ2VzID0ge1xuICAgICAgdW5zcGVjaWZpZWQ6IFtuZXcgSVB2NihbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pLCAxMjhdLFxuICAgICAgbGlua0xvY2FsOiBbbmV3IElQdjYoWzB4ZmU4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pLCAxMF0sXG4gICAgICBtdWx0aWNhc3Q6IFtuZXcgSVB2NihbMHhmZjAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSksIDhdLFxuICAgICAgbG9vcGJhY2s6IFtuZXcgSVB2NihbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMV0pLCAxMjhdLFxuICAgICAgdW5pcXVlTG9jYWw6IFtuZXcgSVB2NihbMHhmYzAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSksIDddLFxuICAgICAgaXB2NE1hcHBlZDogW25ldyBJUHY2KFswLCAwLCAwLCAwLCAwLCAweGZmZmYsIDAsIDBdKSwgOTZdLFxuICAgICAgcmZjNjE0NTogW25ldyBJUHY2KFswLCAwLCAwLCAwLCAweGZmZmYsIDAsIDAsIDBdKSwgOTZdLFxuICAgICAgcmZjNjA1MjogW25ldyBJUHY2KFsweDY0LCAweGZmOWIsIDAsIDAsIDAsIDAsIDAsIDBdKSwgOTZdLFxuICAgICAgJzZ0bzQnOiBbbmV3IElQdjYoWzB4MjAwMiwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pLCAxNl0sXG4gICAgICB0ZXJlZG86IFtuZXcgSVB2NihbMHgyMDAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSksIDMyXSxcbiAgICAgIHJlc2VydmVkOiBbW25ldyBJUHY2KFsweDIwMDEsIDB4ZGI4LCAwLCAwLCAwLCAwLCAwLCAwXSksIDMyXV1cbiAgICB9O1xuXG4gICAgSVB2Ni5wcm90b3R5cGUucmFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpcGFkZHIuc3VibmV0TWF0Y2godGhpcywgdGhpcy5TcGVjaWFsUmFuZ2VzKTtcbiAgICB9O1xuXG4gICAgSVB2Ni5wcm90b3R5cGUuaXNJUHY0TWFwcGVkQWRkcmVzcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMucmFuZ2UoKSA9PT0gJ2lwdjRNYXBwZWQnO1xuICAgIH07XG5cbiAgICBJUHY2LnByb3RvdHlwZS50b0lQdjRBZGRyZXNzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaGlnaCwgbG93LCByZWY7XG4gICAgICBpZiAoIXRoaXMuaXNJUHY0TWFwcGVkQWRkcmVzcygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogdHJ5aW5nIHRvIGNvbnZlcnQgYSBnZW5lcmljIGlwdjYgYWRkcmVzcyB0byBpcHY0XCIpO1xuICAgICAgfVxuICAgICAgcmVmID0gdGhpcy5wYXJ0cy5zbGljZSgtMiksIGhpZ2ggPSByZWZbMF0sIGxvdyA9IHJlZlsxXTtcbiAgICAgIHJldHVybiBuZXcgaXBhZGRyLklQdjQoW2hpZ2ggPj4gOCwgaGlnaCAmIDB4ZmYsIGxvdyA+PiA4LCBsb3cgJiAweGZmXSk7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnByZWZpeExlbmd0aEZyb21TdWJuZXRNYXNrID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY2lkciwgaSwgaywgcGFydCwgc3RvcCwgemVyb3MsIHplcm90YWJsZTtcbiAgICAgIHplcm90YWJsZSA9IHtcbiAgICAgICAgMDogMTYsXG4gICAgICAgIDMyNzY4OiAxNSxcbiAgICAgICAgNDkxNTI6IDE0LFxuICAgICAgICA1NzM0NDogMTMsXG4gICAgICAgIDYxNDQwOiAxMixcbiAgICAgICAgNjM0ODg6IDExLFxuICAgICAgICA2NDUxMjogMTAsXG4gICAgICAgIDY1MDI0OiA5LFxuICAgICAgICA2NTI4MDogOCxcbiAgICAgICAgNjU0MDg6IDcsXG4gICAgICAgIDY1NDcyOiA2LFxuICAgICAgICA2NTUwNDogNSxcbiAgICAgICAgNjU1MjA6IDQsXG4gICAgICAgIDY1NTI4OiAzLFxuICAgICAgICA2NTUzMjogMixcbiAgICAgICAgNjU1MzQ6IDEsXG4gICAgICAgIDY1NTM1OiAwXG4gICAgICB9O1xuICAgICAgY2lkciA9IDA7XG4gICAgICBzdG9wID0gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBrID0gNzsgayA+PSAwOyBpID0gayArPSAtMSkge1xuICAgICAgICBwYXJ0ID0gdGhpcy5wYXJ0c1tpXTtcbiAgICAgICAgaWYgKHBhcnQgaW4gemVyb3RhYmxlKSB7XG4gICAgICAgICAgemVyb3MgPSB6ZXJvdGFibGVbcGFydF07XG4gICAgICAgICAgaWYgKHN0b3AgJiYgemVyb3MgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoemVyb3MgIT09IDE2KSB7XG4gICAgICAgICAgICBzdG9wID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2lkciArPSB6ZXJvcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDEyOCAtIGNpZHI7XG4gICAgfTtcblxuICAgIHJldHVybiBJUHY2O1xuXG4gIH0pKCk7XG5cbiAgaXB2NlBhcnQgPSBcIig/OlswLTlhLWZdKzo6PykrXCI7XG5cbiAgem9uZUluZGV4ID0gXCIlWzAtOWEtel17MSx9XCI7XG5cbiAgaXB2NlJlZ2V4ZXMgPSB7XG4gICAgem9uZUluZGV4OiBuZXcgUmVnRXhwKHpvbmVJbmRleCwgJ2knKSxcbiAgICBcIm5hdGl2ZVwiOiBuZXcgUmVnRXhwKFwiXig6Oik/KFwiICsgaXB2NlBhcnQgKyBcIik/KFswLTlhLWZdKyk/KDo6KT8oXCIgKyB6b25lSW5kZXggKyBcIik/JFwiLCAnaScpLFxuICAgIHRyYW5zaXRpb25hbDogbmV3IFJlZ0V4cCgoXCJeKCg/OlwiICsgaXB2NlBhcnQgKyBcIil8KD86OjopKD86XCIgKyBpcHY2UGFydCArIFwiKT8pXCIpICsgKGlwdjRQYXJ0ICsgXCJcXFxcLlwiICsgaXB2NFBhcnQgKyBcIlxcXFwuXCIgKyBpcHY0UGFydCArIFwiXFxcXC5cIiArIGlwdjRQYXJ0KSArIChcIihcIiArIHpvbmVJbmRleCArIFwiKT8kXCIpLCAnaScpXG4gIH07XG5cbiAgZXhwYW5kSVB2NiA9IGZ1bmN0aW9uKHN0cmluZywgcGFydHMpIHtcbiAgICB2YXIgY29sb25Db3VudCwgbGFzdENvbG9uLCBwYXJ0LCByZXBsYWNlbWVudCwgcmVwbGFjZW1lbnRDb3VudCwgem9uZUlkO1xuICAgIGlmIChzdHJpbmcuaW5kZXhPZignOjonKSAhPT0gc3RyaW5nLmxhc3RJbmRleE9mKCc6OicpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgem9uZUlkID0gKHN0cmluZy5tYXRjaChpcHY2UmVnZXhlc1snem9uZUluZGV4J10pIHx8IFtdKVswXTtcbiAgICBpZiAoem9uZUlkKSB7XG4gICAgICB6b25lSWQgPSB6b25lSWQuc3Vic3RyaW5nKDEpO1xuICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoLyUuKyQvLCAnJyk7XG4gICAgfVxuICAgIGNvbG9uQ291bnQgPSAwO1xuICAgIGxhc3RDb2xvbiA9IC0xO1xuICAgIHdoaWxlICgobGFzdENvbG9uID0gc3RyaW5nLmluZGV4T2YoJzonLCBsYXN0Q29sb24gKyAxKSkgPj0gMCkge1xuICAgICAgY29sb25Db3VudCsrO1xuICAgIH1cbiAgICBpZiAoc3RyaW5nLnN1YnN0cigwLCAyKSA9PT0gJzo6Jykge1xuICAgICAgY29sb25Db3VudC0tO1xuICAgIH1cbiAgICBpZiAoc3RyaW5nLnN1YnN0cigtMiwgMikgPT09ICc6OicpIHtcbiAgICAgIGNvbG9uQ291bnQtLTtcbiAgICB9XG4gICAgaWYgKGNvbG9uQ291bnQgPiBwYXJ0cykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJlcGxhY2VtZW50Q291bnQgPSBwYXJ0cyAtIGNvbG9uQ291bnQ7XG4gICAgcmVwbGFjZW1lbnQgPSAnOic7XG4gICAgd2hpbGUgKHJlcGxhY2VtZW50Q291bnQtLSkge1xuICAgICAgcmVwbGFjZW1lbnQgKz0gJzA6JztcbiAgICB9XG4gICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoJzo6JywgcmVwbGFjZW1lbnQpO1xuICAgIGlmIChzdHJpbmdbMF0gPT09ICc6Jykge1xuICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKDEpO1xuICAgIH1cbiAgICBpZiAoc3RyaW5nW3N0cmluZy5sZW5ndGggLSAxXSA9PT0gJzonKSB7XG4gICAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2UoMCwgLTEpO1xuICAgIH1cbiAgICBwYXJ0cyA9IChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBrLCBsZW4sIHJlZiwgcmVzdWx0cztcbiAgICAgIHJlZiA9IHN0cmluZy5zcGxpdChcIjpcIik7XG4gICAgICByZXN1bHRzID0gW107XG4gICAgICBmb3IgKGsgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgcGFydCA9IHJlZltrXTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSW50KHBhcnQsIDE2KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9KSgpO1xuICAgIHJldHVybiB7XG4gICAgICBwYXJ0czogcGFydHMsXG4gICAgICB6b25lSWQ6IHpvbmVJZFxuICAgIH07XG4gIH07XG5cbiAgaXBhZGRyLklQdjYucGFyc2VyID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGFkZHIsIGssIGxlbiwgbWF0Y2gsIG9jdGV0LCBvY3RldHMsIHpvbmVJZDtcbiAgICBpZiAoaXB2NlJlZ2V4ZXNbJ25hdGl2ZSddLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIGV4cGFuZElQdjYoc3RyaW5nLCA4KTtcbiAgICB9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGlwdjZSZWdleGVzWyd0cmFuc2l0aW9uYWwnXSkpIHtcbiAgICAgIHpvbmVJZCA9IG1hdGNoWzZdIHx8ICcnO1xuICAgICAgYWRkciA9IGV4cGFuZElQdjYobWF0Y2hbMV0uc2xpY2UoMCwgLTEpICsgem9uZUlkLCA2KTtcbiAgICAgIGlmIChhZGRyLnBhcnRzKSB7XG4gICAgICAgIG9jdGV0cyA9IFtwYXJzZUludChtYXRjaFsyXSksIHBhcnNlSW50KG1hdGNoWzNdKSwgcGFyc2VJbnQobWF0Y2hbNF0pLCBwYXJzZUludChtYXRjaFs1XSldO1xuICAgICAgICBmb3IgKGsgPSAwLCBsZW4gPSBvY3RldHMubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgICBvY3RldCA9IG9jdGV0c1trXTtcbiAgICAgICAgICBpZiAoISgoMCA8PSBvY3RldCAmJiBvY3RldCA8PSAyNTUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFkZHIucGFydHMucHVzaChvY3RldHNbMF0gPDwgOCB8IG9jdGV0c1sxXSk7XG4gICAgICAgIGFkZHIucGFydHMucHVzaChvY3RldHNbMl0gPDwgOCB8IG9jdGV0c1szXSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGFydHM6IGFkZHIucGFydHMsXG4gICAgICAgICAgem9uZUlkOiBhZGRyLnpvbmVJZFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBpcGFkZHIuSVB2NC5pc0lQdjQgPSBpcGFkZHIuSVB2Ni5pc0lQdjYgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIoc3RyaW5nKSAhPT0gbnVsbDtcbiAgfTtcblxuICBpcGFkZHIuSVB2NC5pc1ZhbGlkID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGU7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyB0aGlzKHRoaXMucGFyc2VyKHN0cmluZykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICBlID0gZXJyb3IxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBpcGFkZHIuSVB2NC5pc1ZhbGlkRm91clBhcnREZWNpbWFsID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgaWYgKGlwYWRkci5JUHY0LmlzVmFsaWQoc3RyaW5nKSAmJiBzdHJpbmcubWF0Y2goL14oMHxbMS05XVxcZCopKFxcLigwfFsxLTldXFxkKikpezN9JC8pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBpcGFkZHIuSVB2Ni5pc1ZhbGlkID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGFkZHIsIGU7XG4gICAgaWYgKHR5cGVvZiBzdHJpbmcgPT09IFwic3RyaW5nXCIgJiYgc3RyaW5nLmluZGV4T2YoXCI6XCIpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYWRkciA9IHRoaXMucGFyc2VyKHN0cmluZyk7XG4gICAgICBuZXcgdGhpcyhhZGRyLnBhcnRzLCBhZGRyLnpvbmVJZCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgIGUgPSBlcnJvcjE7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5JUHY0LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIHBhcnRzO1xuICAgIHBhcnRzID0gdGhpcy5wYXJzZXIoc3RyaW5nKTtcbiAgICBpZiAocGFydHMgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogc3RyaW5nIGlzIG5vdCBmb3JtYXR0ZWQgbGlrZSBpcCBhZGRyZXNzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMocGFydHMpO1xuICB9O1xuXG4gIGlwYWRkci5JUHY2LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGFkZHI7XG4gICAgYWRkciA9IHRoaXMucGFyc2VyKHN0cmluZyk7XG4gICAgaWYgKGFkZHIucGFydHMgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogc3RyaW5nIGlzIG5vdCBmb3JtYXR0ZWQgbGlrZSBpcCBhZGRyZXNzXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMoYWRkci5wYXJ0cywgYWRkci56b25lSWQpO1xuICB9O1xuXG4gIGlwYWRkci5JUHY0LnBhcnNlQ0lEUiA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBtYXNrTGVuZ3RoLCBtYXRjaCwgcGFyc2VkO1xuICAgIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaCgvXiguKylcXC8oXFxkKykkLykpIHtcbiAgICAgIG1hc2tMZW5ndGggPSBwYXJzZUludChtYXRjaFsyXSk7XG4gICAgICBpZiAobWFza0xlbmd0aCA+PSAwICYmIG1hc2tMZW5ndGggPD0gMzIpIHtcbiAgICAgICAgcGFyc2VkID0gW3RoaXMucGFyc2UobWF0Y2hbMV0pLCBtYXNrTGVuZ3RoXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHBhcnNlZCwgJ3RvU3RyaW5nJywge1xuICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmpvaW4oJy8nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFyc2VkO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHN0cmluZyBpcyBub3QgZm9ybWF0dGVkIGxpa2UgYW4gSVB2NCBDSURSIHJhbmdlXCIpO1xuICB9O1xuXG4gIGlwYWRkci5JUHY0LnN1Ym5ldE1hc2tGcm9tUHJlZml4TGVuZ3RoID0gZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIGZpbGxlZE9jdGV0Q291bnQsIGosIG9jdGV0cztcbiAgICBwcmVmaXggPSBwYXJzZUludChwcmVmaXgpO1xuICAgIGlmIChwcmVmaXggPCAwIHx8IHByZWZpeCA+IDMyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lwYWRkcjogaW52YWxpZCBJUHY0IHByZWZpeCBsZW5ndGgnKTtcbiAgICB9XG4gICAgb2N0ZXRzID0gWzAsIDAsIDAsIDBdO1xuICAgIGogPSAwO1xuICAgIGZpbGxlZE9jdGV0Q291bnQgPSBNYXRoLmZsb29yKHByZWZpeCAvIDgpO1xuICAgIHdoaWxlIChqIDwgZmlsbGVkT2N0ZXRDb3VudCkge1xuICAgICAgb2N0ZXRzW2pdID0gMjU1O1xuICAgICAgaisrO1xuICAgIH1cbiAgICBpZiAoZmlsbGVkT2N0ZXRDb3VudCA8IDQpIHtcbiAgICAgIG9jdGV0c1tmaWxsZWRPY3RldENvdW50XSA9IE1hdGgucG93KDIsIHByZWZpeCAlIDgpIC0gMSA8PCA4IC0gKHByZWZpeCAlIDgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMob2N0ZXRzKTtcbiAgfTtcblxuICBpcGFkZHIuSVB2NC5icm9hZGNhc3RBZGRyZXNzRnJvbUNJRFIgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICB2YXIgY2lkciwgZXJyb3IsIGksIGlwSW50ZXJmYWNlT2N0ZXRzLCBvY3RldHMsIHN1Ym5ldE1hc2tPY3RldHM7XG4gICAgdHJ5IHtcbiAgICAgIGNpZHIgPSB0aGlzLnBhcnNlQ0lEUihzdHJpbmcpO1xuICAgICAgaXBJbnRlcmZhY2VPY3RldHMgPSBjaWRyWzBdLnRvQnl0ZUFycmF5KCk7XG4gICAgICBzdWJuZXRNYXNrT2N0ZXRzID0gdGhpcy5zdWJuZXRNYXNrRnJvbVByZWZpeExlbmd0aChjaWRyWzFdKS50b0J5dGVBcnJheSgpO1xuICAgICAgb2N0ZXRzID0gW107XG4gICAgICBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgNCkge1xuICAgICAgICBvY3RldHMucHVzaChwYXJzZUludChpcEludGVyZmFjZU9jdGV0c1tpXSwgMTApIHwgcGFyc2VJbnQoc3VibmV0TWFza09jdGV0c1tpXSwgMTApIF4gMjU1KTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyB0aGlzKG9jdGV0cyk7XG4gICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaXBhZGRyOiB0aGUgYWRkcmVzcyBkb2VzIG5vdCBoYXZlIElQdjQgQ0lEUiBmb3JtYXQnKTtcbiAgICB9XG4gIH07XG5cbiAgaXBhZGRyLklQdjQubmV0d29ya0FkZHJlc3NGcm9tQ0lEUiA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBjaWRyLCBlcnJvciwgaSwgaXBJbnRlcmZhY2VPY3RldHMsIG9jdGV0cywgc3VibmV0TWFza09jdGV0cztcbiAgICB0cnkge1xuICAgICAgY2lkciA9IHRoaXMucGFyc2VDSURSKHN0cmluZyk7XG4gICAgICBpcEludGVyZmFjZU9jdGV0cyA9IGNpZHJbMF0udG9CeXRlQXJyYXkoKTtcbiAgICAgIHN1Ym5ldE1hc2tPY3RldHMgPSB0aGlzLnN1Ym5ldE1hc2tGcm9tUHJlZml4TGVuZ3RoKGNpZHJbMV0pLnRvQnl0ZUFycmF5KCk7XG4gICAgICBvY3RldHMgPSBbXTtcbiAgICAgIGkgPSAwO1xuICAgICAgd2hpbGUgKGkgPCA0KSB7XG4gICAgICAgIG9jdGV0cy5wdXNoKHBhcnNlSW50KGlwSW50ZXJmYWNlT2N0ZXRzW2ldLCAxMCkgJiBwYXJzZUludChzdWJuZXRNYXNrT2N0ZXRzW2ldLCAxMCkpO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IHRoaXMob2N0ZXRzKTtcbiAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgIGVycm9yID0gZXJyb3IxO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpcGFkZHI6IHRoZSBhZGRyZXNzIGRvZXMgbm90IGhhdmUgSVB2NCBDSURSIGZvcm1hdCcpO1xuICAgIH1cbiAgfTtcblxuICBpcGFkZHIuSVB2Ni5wYXJzZUNJRFIgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICB2YXIgbWFza0xlbmd0aCwgbWF0Y2gsIHBhcnNlZDtcbiAgICBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goL14oLispXFwvKFxcZCspJC8pKSB7XG4gICAgICBtYXNrTGVuZ3RoID0gcGFyc2VJbnQobWF0Y2hbMl0pO1xuICAgICAgaWYgKG1hc2tMZW5ndGggPj0gMCAmJiBtYXNrTGVuZ3RoIDw9IDEyOCkge1xuICAgICAgICBwYXJzZWQgPSBbdGhpcy5wYXJzZShtYXRjaFsxXSksIG1hc2tMZW5ndGhdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFyc2VkLCAndG9TdHJpbmcnLCB7XG4gICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuam9pbignLycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogc3RyaW5nIGlzIG5vdCBmb3JtYXR0ZWQgbGlrZSBhbiBJUHY2IENJRFIgcmFuZ2VcIik7XG4gIH07XG5cbiAgaXBhZGRyLmlzVmFsaWQgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICByZXR1cm4gaXBhZGRyLklQdjYuaXNWYWxpZChzdHJpbmcpIHx8IGlwYWRkci5JUHY0LmlzVmFsaWQoc3RyaW5nKTtcbiAgfTtcblxuICBpcGFkZHIucGFyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICBpZiAoaXBhZGRyLklQdjYuaXNWYWxpZChzdHJpbmcpKSB7XG4gICAgICByZXR1cm4gaXBhZGRyLklQdjYucGFyc2Uoc3RyaW5nKTtcbiAgICB9IGVsc2UgaWYgKGlwYWRkci5JUHY0LmlzVmFsaWQoc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIGlwYWRkci5JUHY0LnBhcnNlKHN0cmluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogdGhlIGFkZHJlc3MgaGFzIG5laXRoZXIgSVB2NiBub3IgSVB2NCBmb3JtYXRcIik7XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5wYXJzZUNJRFIgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICB2YXIgZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGlwYWRkci5JUHY2LnBhcnNlQ0lEUihzdHJpbmcpO1xuICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgZSA9IGVycm9yMTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBpcGFkZHIuSVB2NC5wYXJzZUNJRFIoc3RyaW5nKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICBlID0gZXJyb3IxO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHRoZSBhZGRyZXNzIGhhcyBuZWl0aGVyIElQdjYgbm9yIElQdjQgQ0lEUiBmb3JtYXRcIik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5mcm9tQnl0ZUFycmF5ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICB2YXIgbGVuZ3RoO1xuICAgIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID09PSA0KSB7XG4gICAgICByZXR1cm4gbmV3IGlwYWRkci5JUHY0KGJ5dGVzKTtcbiAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gMTYpIHtcbiAgICAgIHJldHVybiBuZXcgaXBhZGRyLklQdjYoYnl0ZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHRoZSBiaW5hcnkgaW5wdXQgaXMgbmVpdGhlciBhbiBJUHY2IG5vciBJUHY0IGFkZHJlc3NcIik7XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5wcm9jZXNzID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGFkZHI7XG4gICAgYWRkciA9IHRoaXMucGFyc2Uoc3RyaW5nKTtcbiAgICBpZiAoYWRkci5raW5kKCkgPT09ICdpcHY2JyAmJiBhZGRyLmlzSVB2NE1hcHBlZEFkZHJlc3MoKSkge1xuICAgICAgcmV0dXJuIGFkZHIudG9JUHY0QWRkcmVzcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYWRkcjtcbiAgICB9XG4gIH07XG5cbn0pLmNhbGwodGhpcyk7XG4iLCAiLyohXG4gKiBwcm94eS1hZGRyXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByb3h5YWRkclxubW9kdWxlLmV4cG9ydHMuYWxsID0gYWxsYWRkcnNcbm1vZHVsZS5leHBvcnRzLmNvbXBpbGUgPSBjb21waWxlXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGZvcndhcmRlZCA9IHJlcXVpcmUoJ2ZvcndhcmRlZCcpXG52YXIgaXBhZGRyID0gcmVxdWlyZSgnaXBhZGRyLmpzJylcblxuLyoqXG4gKiBWYXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBESUdJVF9SRUdFWFAgPSAvXlswLTldKyQvXG52YXIgaXNpcCA9IGlwYWRkci5pc1ZhbGlkXG52YXIgcGFyc2VpcCA9IGlwYWRkci5wYXJzZVxuXG4vKipcbiAqIFByZS1kZWZpbmVkIElQIHJhbmdlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIElQX1JBTkdFUyA9IHtcbiAgbGlua2xvY2FsOiBbJzE2OS4yNTQuMC4wLzE2JywgJ2ZlODA6Oi8xMCddLFxuICBsb29wYmFjazogWycxMjcuMC4wLjEvOCcsICc6OjEvMTI4J10sXG4gIHVuaXF1ZWxvY2FsOiBbJzEwLjAuMC4wLzgnLCAnMTcyLjE2LjAuMC8xMicsICcxOTIuMTY4LjAuMC8xNicsICdmYzAwOjovNyddXG59XG5cbi8qKlxuICogR2V0IGFsbCBhZGRyZXNzZXMgaW4gdGhlIHJlcXVlc3QsIG9wdGlvbmFsbHkgc3RvcHBpbmdcbiAqIGF0IHRoZSBmaXJzdCB1bnRydXN0ZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlcXVlc3RcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl8U3RyaW5nfSBbdHJ1c3RdXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gYWxsYWRkcnMgKHJlcSwgdHJ1c3QpIHtcbiAgLy8gZ2V0IGFkZHJlc3Nlc1xuICB2YXIgYWRkcnMgPSBmb3J3YXJkZWQocmVxKVxuXG4gIGlmICghdHJ1c3QpIHtcbiAgICAvLyBSZXR1cm4gYWxsIGFkZHJlc3Nlc1xuICAgIHJldHVybiBhZGRyc1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0cnVzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRydXN0ID0gY29tcGlsZSh0cnVzdClcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWRkcnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgaWYgKHRydXN0KGFkZHJzW2ldLCBpKSkgY29udGludWVcblxuICAgIGFkZHJzLmxlbmd0aCA9IGkgKyAxXG4gIH1cblxuICByZXR1cm4gYWRkcnNcbn1cblxuLyoqXG4gKiBDb21waWxlIGFyZ3VtZW50IGludG8gdHJ1c3QgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IHZhbFxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb21waWxlICh2YWwpIHtcbiAgaWYgKCF2YWwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBpcyByZXF1aXJlZCcpXG4gIH1cblxuICB2YXIgdHJ1c3RcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnVzdCA9IFt2YWxdXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgdHJ1c3QgPSB2YWwuc2xpY2UoKVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Vuc3VwcG9ydGVkIHRydXN0IGFyZ3VtZW50JylcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJ1c3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YWwgPSB0cnVzdFtpXVxuXG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoSVBfUkFOR0VTLCB2YWwpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIFNwbGljZSBpbiBwcmUtZGVmaW5lZCByYW5nZVxuICAgIHZhbCA9IElQX1JBTkdFU1t2YWxdXG4gICAgdHJ1c3Quc3BsaWNlLmFwcGx5KHRydXN0LCBbaSwgMV0uY29uY2F0KHZhbCkpXG4gICAgaSArPSB2YWwubGVuZ3RoIC0gMVxuICB9XG5cbiAgcmV0dXJuIGNvbXBpbGVUcnVzdChjb21waWxlUmFuZ2VTdWJuZXRzKHRydXN0KSlcbn1cblxuLyoqXG4gKiBDb21waWxlIGBhcnJgIGVsZW1lbnRzIGludG8gcmFuZ2Ugc3VibmV0cy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29tcGlsZVJhbmdlU3VibmV0cyAoYXJyKSB7XG4gIHZhciByYW5nZVN1Ym5ldHMgPSBuZXcgQXJyYXkoYXJyLmxlbmd0aClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIHJhbmdlU3VibmV0c1tpXSA9IHBhcnNlaXBOb3RhdGlvbihhcnJbaV0pXG4gIH1cblxuICByZXR1cm4gcmFuZ2VTdWJuZXRzXG59XG5cbi8qKlxuICogQ29tcGlsZSByYW5nZSBzdWJuZXQgYXJyYXkgaW50byB0cnVzdCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSByYW5nZVN1Ym5ldHNcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29tcGlsZVRydXN0IChyYW5nZVN1Ym5ldHMpIHtcbiAgLy8gUmV0dXJuIG9wdGltaXplZCBmdW5jdGlvbiBiYXNlZCBvbiBsZW5ndGhcbiAgdmFyIGxlbiA9IHJhbmdlU3VibmV0cy5sZW5ndGhcbiAgcmV0dXJuIGxlbiA9PT0gMFxuICAgID8gdHJ1c3ROb25lXG4gICAgOiBsZW4gPT09IDFcbiAgICAgID8gdHJ1c3RTaW5nbGUocmFuZ2VTdWJuZXRzWzBdKVxuICAgICAgOiB0cnVzdE11bHRpKHJhbmdlU3VibmV0cylcbn1cblxuLyoqXG4gKiBQYXJzZSBJUCBub3RhdGlvbiBzdHJpbmcgaW50byByYW5nZSBzdWJuZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5vdGVcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VpcE5vdGF0aW9uIChub3RlKSB7XG4gIHZhciBwb3MgPSBub3RlLmxhc3RJbmRleE9mKCcvJylcbiAgdmFyIHN0ciA9IHBvcyAhPT0gLTFcbiAgICA/IG5vdGUuc3Vic3RyaW5nKDAsIHBvcylcbiAgICA6IG5vdGVcblxuICBpZiAoIWlzaXAoc3RyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgSVAgYWRkcmVzczogJyArIHN0cilcbiAgfVxuXG4gIHZhciBpcCA9IHBhcnNlaXAoc3RyKVxuXG4gIGlmIChwb3MgPT09IC0xICYmIGlwLmtpbmQoKSA9PT0gJ2lwdjYnICYmIGlwLmlzSVB2NE1hcHBlZEFkZHJlc3MoKSkge1xuICAgIC8vIFN0b3JlIGFzIElQdjRcbiAgICBpcCA9IGlwLnRvSVB2NEFkZHJlc3MoKVxuICB9XG5cbiAgdmFyIG1heCA9IGlwLmtpbmQoKSA9PT0gJ2lwdjYnXG4gICAgPyAxMjhcbiAgICA6IDMyXG5cbiAgdmFyIHJhbmdlID0gcG9zICE9PSAtMVxuICAgID8gbm90ZS5zdWJzdHJpbmcocG9zICsgMSwgbm90ZS5sZW5ndGgpXG4gICAgOiBudWxsXG5cbiAgaWYgKHJhbmdlID09PSBudWxsKSB7XG4gICAgcmFuZ2UgPSBtYXhcbiAgfSBlbHNlIGlmIChESUdJVF9SRUdFWFAudGVzdChyYW5nZSkpIHtcbiAgICByYW5nZSA9IHBhcnNlSW50KHJhbmdlLCAxMClcbiAgfSBlbHNlIGlmIChpcC5raW5kKCkgPT09ICdpcHY0JyAmJiBpc2lwKHJhbmdlKSkge1xuICAgIHJhbmdlID0gcGFyc2VOZXRtYXNrKHJhbmdlKVxuICB9IGVsc2Uge1xuICAgIHJhbmdlID0gbnVsbFxuICB9XG5cbiAgaWYgKHJhbmdlIDw9IDAgfHwgcmFuZ2UgPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHJhbmdlIG9uIGFkZHJlc3M6ICcgKyBub3RlKVxuICB9XG5cbiAgcmV0dXJuIFtpcCwgcmFuZ2VdXG59XG5cbi8qKlxuICogUGFyc2UgbmV0bWFzayBzdHJpbmcgaW50byBDSURSIHJhbmdlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuZXRtYXNrXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlTmV0bWFzayAobmV0bWFzaykge1xuICB2YXIgaXAgPSBwYXJzZWlwKG5ldG1hc2spXG4gIHZhciBraW5kID0gaXAua2luZCgpXG5cbiAgcmV0dXJuIGtpbmQgPT09ICdpcHY0J1xuICAgID8gaXAucHJlZml4TGVuZ3RoRnJvbVN1Ym5ldE1hc2soKVxuICAgIDogbnVsbFxufVxuXG4vKipcbiAqIERldGVybWluZSBhZGRyZXNzIG9mIHByb3hpZWQgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdFxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheXxTdHJpbmd9IHRydXN0XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcHJveHlhZGRyIChyZXEsIHRydXN0KSB7XG4gIGlmICghcmVxKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVxIGFyZ3VtZW50IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIGlmICghdHJ1c3QpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0cnVzdCBhcmd1bWVudCBpcyByZXF1aXJlZCcpXG4gIH1cblxuICB2YXIgYWRkcnMgPSBhbGxhZGRycyhyZXEsIHRydXN0KVxuICB2YXIgYWRkciA9IGFkZHJzW2FkZHJzLmxlbmd0aCAtIDFdXG5cbiAgcmV0dXJuIGFkZHJcbn1cblxuLyoqXG4gKiBTdGF0aWMgdHJ1c3QgZnVuY3Rpb24gdG8gdHJ1c3Qgbm90aGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRydXN0Tm9uZSAoKSB7XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENvbXBpbGUgdHJ1c3QgZnVuY3Rpb24gZm9yIG11bHRpcGxlIHN1Ym5ldHMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gc3VibmV0c1xuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0cnVzdE11bHRpIChzdWJuZXRzKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cnVzdCAoYWRkcikge1xuICAgIGlmICghaXNpcChhZGRyKSkgcmV0dXJuIGZhbHNlXG5cbiAgICB2YXIgaXAgPSBwYXJzZWlwKGFkZHIpXG4gICAgdmFyIGlwY29udlxuICAgIHZhciBraW5kID0gaXAua2luZCgpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1Ym5ldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzdWJuZXQgPSBzdWJuZXRzW2ldXG4gICAgICB2YXIgc3VibmV0aXAgPSBzdWJuZXRbMF1cbiAgICAgIHZhciBzdWJuZXRraW5kID0gc3VibmV0aXAua2luZCgpXG4gICAgICB2YXIgc3VibmV0cmFuZ2UgPSBzdWJuZXRbMV1cbiAgICAgIHZhciB0cnVzdGVkID0gaXBcblxuICAgICAgaWYgKGtpbmQgIT09IHN1Ym5ldGtpbmQpIHtcbiAgICAgICAgaWYgKHN1Ym5ldGtpbmQgPT09ICdpcHY0JyAmJiAhaXAuaXNJUHY0TWFwcGVkQWRkcmVzcygpKSB7XG4gICAgICAgICAgLy8gSW5jb21wYXRpYmxlIElQIGFkZHJlc3Nlc1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlwY29udikge1xuICAgICAgICAgIC8vIENvbnZlcnQgSVAgdG8gbWF0Y2ggc3VibmV0IElQIGtpbmRcbiAgICAgICAgICBpcGNvbnYgPSBzdWJuZXRraW5kID09PSAnaXB2NCdcbiAgICAgICAgICAgID8gaXAudG9JUHY0QWRkcmVzcygpXG4gICAgICAgICAgICA6IGlwLnRvSVB2NE1hcHBlZEFkZHJlc3MoKVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ1c3RlZCA9IGlwY29udlxuICAgICAgfVxuXG4gICAgICBpZiAodHJ1c3RlZC5tYXRjaChzdWJuZXRpcCwgc3VibmV0cmFuZ2UpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBDb21waWxlIHRydXN0IGZ1bmN0aW9uIGZvciBzaW5nbGUgc3VibmV0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdWJuZXRcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdHJ1c3RTaW5nbGUgKHN1Ym5ldCkge1xuICB2YXIgc3VibmV0aXAgPSBzdWJuZXRbMF1cbiAgdmFyIHN1Ym5ldGtpbmQgPSBzdWJuZXRpcC5raW5kKClcbiAgdmFyIHN1Ym5ldGlzaXB2NCA9IHN1Ym5ldGtpbmQgPT09ICdpcHY0J1xuICB2YXIgc3VibmV0cmFuZ2UgPSBzdWJuZXRbMV1cblxuICByZXR1cm4gZnVuY3Rpb24gdHJ1c3QgKGFkZHIpIHtcbiAgICBpZiAoIWlzaXAoYWRkcikpIHJldHVybiBmYWxzZVxuXG4gICAgdmFyIGlwID0gcGFyc2VpcChhZGRyKVxuICAgIHZhciBraW5kID0gaXAua2luZCgpXG5cbiAgICBpZiAoa2luZCAhPT0gc3VibmV0a2luZCkge1xuICAgICAgaWYgKHN1Ym5ldGlzaXB2NCAmJiAhaXAuaXNJUHY0TWFwcGVkQWRkcmVzcygpKSB7XG4gICAgICAgIC8vIEluY29tcGF0aWJsZSBJUCBhZGRyZXNzZXNcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgSVAgdG8gbWF0Y2ggc3VibmV0IElQIGtpbmRcbiAgICAgIGlwID0gc3VibmV0aXNpcHY0XG4gICAgICAgID8gaXAudG9JUHY0QWRkcmVzcygpXG4gICAgICAgIDogaXAudG9JUHY0TWFwcGVkQWRkcmVzcygpXG4gICAgfVxuXG4gICAgcmV0dXJuIGlwLm1hdGNoKHN1Ym5ldGlwLCBzdWJuZXRyYW5nZSlcbiAgfVxufVxuIiwgIi8qIVxuICogZXhwcmVzc1xuICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMyBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXJcbnZhciBjb250ZW50RGlzcG9zaXRpb24gPSByZXF1aXJlKCdjb250ZW50LWRpc3Bvc2l0aW9uJyk7XG52YXIgY29udGVudFR5cGUgPSByZXF1aXJlKCdjb250ZW50LXR5cGUnKTtcbnZhciBkZXByZWNhdGUgPSByZXF1aXJlKCdkZXBkJykoJ2V4cHJlc3MnKTtcbnZhciBmbGF0dGVuID0gcmVxdWlyZSgnYXJyYXktZmxhdHRlbicpO1xudmFyIG1pbWUgPSByZXF1aXJlKCdzZW5kJykubWltZTtcbnZhciBldGFnID0gcmVxdWlyZSgnZXRhZycpO1xudmFyIHByb3h5YWRkciA9IHJlcXVpcmUoJ3Byb3h5LWFkZHInKTtcbnZhciBxcyA9IHJlcXVpcmUoJ3FzJyk7XG52YXIgcXVlcnlzdHJpbmcgPSByZXF1aXJlKCdxdWVyeXN0cmluZycpO1xuXG4vKipcbiAqIFJldHVybiBzdHJvbmcgRVRhZyBmb3IgYGJvZHlgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEJ1ZmZlcn0gYm9keVxuICogQHBhcmFtIHtTdHJpbmd9IFtlbmNvZGluZ11cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuZXRhZyA9IGNyZWF0ZUVUYWdHZW5lcmF0b3IoeyB3ZWFrOiBmYWxzZSB9KVxuXG4vKipcbiAqIFJldHVybiB3ZWFrIEVUYWcgZm9yIGBib2R5YC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xCdWZmZXJ9IGJvZHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZW5jb2RpbmddXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLndldGFnID0gY3JlYXRlRVRhZ0dlbmVyYXRvcih7IHdlYWs6IHRydWUgfSlcblxuLyoqXG4gKiBDaGVjayBpZiBgcGF0aGAgbG9va3MgYWJzb2x1dGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKXtcbiAgaWYgKCcvJyA9PT0gcGF0aFswXSkgcmV0dXJuIHRydWU7XG4gIGlmICgnOicgPT09IHBhdGhbMV0gJiYgKCdcXFxcJyA9PT0gcGF0aFsyXSB8fCAnLycgPT09IHBhdGhbMl0pKSByZXR1cm4gdHJ1ZTsgLy8gV2luZG93cyBkZXZpY2UgcGF0aFxuICBpZiAoJ1xcXFxcXFxcJyA9PT0gcGF0aC5zdWJzdHJpbmcoMCwgMikpIHJldHVybiB0cnVlOyAvLyBNaWNyb3NvZnQgQXp1cmUgYWJzb2x1dGUgcGF0aFxufTtcblxuLyoqXG4gKiBGbGF0dGVuIHRoZSBnaXZlbiBgYXJyYC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5mbGF0dGVuID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGZsYXR0ZW4sXG4gICd1dGlscy5mbGF0dGVuOiB1c2UgYXJyYXktZmxhdHRlbiBucG0gbW9kdWxlIGluc3RlYWQnKTtcblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGdpdmVuIGB0eXBlYCwgZm9yIGV4YW1wbGUgXCJodG1sXCIgYmVjb21lcyBcInRleHQvaHRtbFwiLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLm5vcm1hbGl6ZVR5cGUgPSBmdW5jdGlvbih0eXBlKXtcbiAgcmV0dXJuIH50eXBlLmluZGV4T2YoJy8nKVxuICAgID8gYWNjZXB0UGFyYW1zKHR5cGUpXG4gICAgOiB7IHZhbHVlOiBtaW1lLmxvb2t1cCh0eXBlKSwgcGFyYW1zOiB7fSB9O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYHR5cGVzYCwgZm9yIGV4YW1wbGUgXCJodG1sXCIgYmVjb21lcyBcInRleHQvaHRtbFwiLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHR5cGVzXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMubm9ybWFsaXplVHlwZXMgPSBmdW5jdGlvbih0eXBlcyl7XG4gIHZhciByZXQgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgKytpKSB7XG4gICAgcmV0LnB1c2goZXhwb3J0cy5ub3JtYWxpemVUeXBlKHR5cGVzW2ldKSk7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciBhcHByb3ByaWF0ZSBmb3IgdGhlIGZpbGVuYW1lLlxuICogbm9uLWFzY2lpIGZpbGVuYW1lcyBhcmUgdXJsZW5jb2RlZCBhbmQgYSBmaWxlbmFtZSogcGFyYW1ldGVyIGlzIGFkZGVkXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmNvbnRlbnREaXNwb3NpdGlvbiA9IGRlcHJlY2F0ZS5mdW5jdGlvbihjb250ZW50RGlzcG9zaXRpb24sXG4gICd1dGlscy5jb250ZW50RGlzcG9zaXRpb246IHVzZSBjb250ZW50LWRpc3Bvc2l0aW9uIG5wbSBtb2R1bGUgaW5zdGVhZCcpO1xuXG4vKipcbiAqIFBhcnNlIGFjY2VwdCBwYXJhbXMgYHN0cmAgcmV0dXJuaW5nIGFuXG4gKiBvYmplY3Qgd2l0aCBgLnZhbHVlYCwgYC5xdWFsaXR5YCBhbmQgYC5wYXJhbXNgLlxuICogYWxzbyBpbmNsdWRlcyBgLm9yaWdpbmFsSW5kZXhgIGZvciBzdGFibGUgc29ydGluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gYWNjZXB0UGFyYW1zKHN0ciwgaW5kZXgpIHtcbiAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KC8gKjsgKi8pO1xuICB2YXIgcmV0ID0geyB2YWx1ZTogcGFydHNbMF0sIHF1YWxpdHk6IDEsIHBhcmFtczoge30sIG9yaWdpbmFsSW5kZXg6IGluZGV4IH07XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBwbXMgPSBwYXJ0c1tpXS5zcGxpdCgvICo9ICovKTtcbiAgICBpZiAoJ3EnID09PSBwbXNbMF0pIHtcbiAgICAgIHJldC5xdWFsaXR5ID0gcGFyc2VGbG9hdChwbXNbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucGFyYW1zW3Btc1swXV0gPSBwbXNbMV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBDb21waWxlIFwiZXRhZ1wiIHZhbHVlIHRvIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSAge0Jvb2xlYW58U3RyaW5nfEZ1bmN0aW9ufSB2YWxcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5jb21waWxlRVRhZyA9IGZ1bmN0aW9uKHZhbCkge1xuICB2YXIgZm47XG5cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgc3dpdGNoICh2YWwpIHtcbiAgICBjYXNlIHRydWU6XG4gICAgY2FzZSAnd2Vhayc6XG4gICAgICBmbiA9IGV4cG9ydHMud2V0YWc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGZhbHNlOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc3Ryb25nJzpcbiAgICAgIGZuID0gZXhwb3J0cy5ldGFnO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Vua25vd24gdmFsdWUgZm9yIGV0YWcgZnVuY3Rpb246ICcgKyB2YWwpO1xuICB9XG5cbiAgcmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIENvbXBpbGUgXCJxdWVyeSBwYXJzZXJcIiB2YWx1ZSB0byBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd8RnVuY3Rpb259IHZhbFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmNvbXBpbGVRdWVyeVBhcnNlciA9IGZ1bmN0aW9uIGNvbXBpbGVRdWVyeVBhcnNlcih2YWwpIHtcbiAgdmFyIGZuO1xuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIHN3aXRjaCAodmFsKSB7XG4gICAgY2FzZSB0cnVlOlxuICAgIGNhc2UgJ3NpbXBsZSc6XG4gICAgICBmbiA9IHF1ZXJ5c3RyaW5nLnBhcnNlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBmYWxzZTpcbiAgICAgIGZuID0gbmV3T2JqZWN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZXh0ZW5kZWQnOlxuICAgICAgZm4gPSBwYXJzZUV4dGVuZGVkUXVlcnlTdHJpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW5rbm93biB2YWx1ZSBmb3IgcXVlcnkgcGFyc2VyIGZ1bmN0aW9uOiAnICsgdmFsKTtcbiAgfVxuXG4gIHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBDb21waWxlIFwicHJveHkgdHJ1c3RcIiB2YWx1ZSB0byBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gIHtCb29sZWFufFN0cmluZ3xOdW1iZXJ8QXJyYXl8RnVuY3Rpb259IHZhbFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmNvbXBpbGVUcnVzdCA9IGZ1bmN0aW9uKHZhbCkge1xuICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbDtcblxuICBpZiAodmFsID09PSB0cnVlKSB7XG4gICAgLy8gU3VwcG9ydCBwbGFpbiB0cnVlL2ZhbHNlXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCl7IHJldHVybiB0cnVlIH07XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAvLyBTdXBwb3J0IHRydXN0aW5nIGhvcCBjb3VudFxuICAgIHJldHVybiBmdW5jdGlvbihhLCBpKXsgcmV0dXJuIGkgPCB2YWwgfTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIC8vIFN1cHBvcnQgY29tbWEtc2VwYXJhdGVkIHZhbHVlc1xuICAgIHZhbCA9IHZhbC5zcGxpdCgnLCcpXG4gICAgICAubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2LnRyaW0oKSB9KVxuICB9XG5cbiAgcmV0dXJuIHByb3h5YWRkci5jb21waWxlKHZhbCB8fCBbXSk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBjaGFyc2V0IGluIGEgZ2l2ZW4gQ29udGVudC1UeXBlIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtTdHJpbmd9IGNoYXJzZXRcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuc2V0Q2hhcnNldCA9IGZ1bmN0aW9uIHNldENoYXJzZXQodHlwZSwgY2hhcnNldCkge1xuICBpZiAoIXR5cGUgfHwgIWNoYXJzZXQpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIC8vIHBhcnNlIHR5cGVcbiAgdmFyIHBhcnNlZCA9IGNvbnRlbnRUeXBlLnBhcnNlKHR5cGUpO1xuXG4gIC8vIHNldCBjaGFyc2V0XG4gIHBhcnNlZC5wYXJhbWV0ZXJzLmNoYXJzZXQgPSBjaGFyc2V0O1xuXG4gIC8vIGZvcm1hdCB0eXBlXG4gIHJldHVybiBjb250ZW50VHlwZS5mb3JtYXQocGFyc2VkKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuIEVUYWcgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBnZW5lcmF0aW5nIEVUYWdzIHdpdGhcbiAqIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRVRhZ0dlbmVyYXRvciAob3B0aW9ucykge1xuICByZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGVFVGFnIChib2R5LCBlbmNvZGluZykge1xuICAgIHZhciBidWYgPSAhQnVmZmVyLmlzQnVmZmVyKGJvZHkpXG4gICAgICA/IEJ1ZmZlci5mcm9tKGJvZHksIGVuY29kaW5nKVxuICAgICAgOiBib2R5XG5cbiAgICByZXR1cm4gZXRhZyhidWYsIG9wdGlvbnMpXG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBleHRlbmRlZCBxdWVyeSBzdHJpbmcgd2l0aCBxcy5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlRXh0ZW5kZWRRdWVyeVN0cmluZyhzdHIpIHtcbiAgcmV0dXJuIHFzLnBhcnNlKHN0ciwge1xuICAgIGFsbG93UHJvdG90eXBlczogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gbmV3IGVtcHR5IG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBuZXdPYmplY3QoKSB7XG4gIHJldHVybiB7fTtcbn1cbiIsICIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGZpbmFsaGFuZGxlciA9IHJlcXVpcmUoJ2ZpbmFsaGFuZGxlcicpO1xudmFyIFJvdXRlciA9IHJlcXVpcmUoJy4vcm91dGVyJyk7XG52YXIgbWV0aG9kcyA9IHJlcXVpcmUoJ21ldGhvZHMnKTtcbnZhciBtaWRkbGV3YXJlID0gcmVxdWlyZSgnLi9taWRkbGV3YXJlL2luaXQnKTtcbnZhciBxdWVyeSA9IHJlcXVpcmUoJy4vbWlkZGxld2FyZS9xdWVyeScpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZXhwcmVzczphcHBsaWNhdGlvbicpO1xudmFyIFZpZXcgPSByZXF1aXJlKCcuL3ZpZXcnKTtcbnZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xudmFyIGNvbXBpbGVFVGFnID0gcmVxdWlyZSgnLi91dGlscycpLmNvbXBpbGVFVGFnO1xudmFyIGNvbXBpbGVRdWVyeVBhcnNlciA9IHJlcXVpcmUoJy4vdXRpbHMnKS5jb21waWxlUXVlcnlQYXJzZXI7XG52YXIgY29tcGlsZVRydXN0ID0gcmVxdWlyZSgnLi91dGlscycpLmNvbXBpbGVUcnVzdDtcbnZhciBkZXByZWNhdGUgPSByZXF1aXJlKCdkZXBkJykoJ2V4cHJlc3MnKTtcbnZhciBmbGF0dGVuID0gcmVxdWlyZSgnYXJyYXktZmxhdHRlbicpO1xudmFyIG1lcmdlID0gcmVxdWlyZSgndXRpbHMtbWVyZ2UnKTtcbnZhciByZXNvbHZlID0gcmVxdWlyZSgncGF0aCcpLnJlc29sdmU7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCdzZXRwcm90b3R5cGVvZicpXG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG4vKipcbiAqIEFwcGxpY2F0aW9uIHByb3RvdHlwZS5cbiAqL1xuXG52YXIgYXBwID0gZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8qKlxuICogVmFyaWFibGUgZm9yIHRydXN0IHByb3h5IGluaGVyaXRhbmNlIGJhY2stY29tcGF0XG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciB0cnVzdFByb3h5RGVmYXVsdFN5bWJvbCA9ICdAQHN5bWJvbDp0cnVzdF9wcm94eV9kZWZhdWx0JztcblxuLyoqXG4gKiBJbml0aWFsaXplIHRoZSBzZXJ2ZXIuXG4gKlxuICogICAtIHNldHVwIGRlZmF1bHQgY29uZmlndXJhdGlvblxuICogICAtIHNldHVwIGRlZmF1bHQgbWlkZGxld2FyZVxuICogICAtIHNldHVwIHJvdXRlIHJlZmxlY3Rpb24gbWV0aG9kc1xuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuYXBwLmluaXQgPSBmdW5jdGlvbiBpbml0KCkge1xuICB0aGlzLmNhY2hlID0ge307XG4gIHRoaXMuZW5naW5lcyA9IHt9O1xuICB0aGlzLnNldHRpbmdzID0ge307XG5cbiAgdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbigpO1xufTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJpdmF0ZVxuICovXG5cbmFwcC5kZWZhdWx0Q29uZmlndXJhdGlvbiA9IGZ1bmN0aW9uIGRlZmF1bHRDb25maWd1cmF0aW9uKCkge1xuICB2YXIgZW52ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50JztcblxuICAvLyBkZWZhdWx0IHNldHRpbmdzXG4gIHRoaXMuZW5hYmxlKCd4LXBvd2VyZWQtYnknKTtcbiAgdGhpcy5zZXQoJ2V0YWcnLCAnd2VhaycpO1xuICB0aGlzLnNldCgnZW52JywgZW52KTtcbiAgdGhpcy5zZXQoJ3F1ZXJ5IHBhcnNlcicsICdleHRlbmRlZCcpO1xuICB0aGlzLnNldCgnc3ViZG9tYWluIG9mZnNldCcsIDIpO1xuICB0aGlzLnNldCgndHJ1c3QgcHJveHknLCBmYWxzZSk7XG5cbiAgLy8gdHJ1c3QgcHJveHkgaW5oZXJpdCBiYWNrLWNvbXBhdFxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5zZXR0aW5ncywgdHJ1c3RQcm94eURlZmF1bHRTeW1ib2wsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IHRydWVcbiAgfSk7XG5cbiAgZGVidWcoJ2Jvb3RpbmcgaW4gJXMgbW9kZScsIGVudik7XG5cbiAgdGhpcy5vbignbW91bnQnLCBmdW5jdGlvbiBvbm1vdW50KHBhcmVudCkge1xuICAgIC8vIGluaGVyaXQgdHJ1c3QgcHJveHlcbiAgICBpZiAodGhpcy5zZXR0aW5nc1t0cnVzdFByb3h5RGVmYXVsdFN5bWJvbF0gPT09IHRydWVcbiAgICAgICYmIHR5cGVvZiBwYXJlbnQuc2V0dGluZ3NbJ3RydXN0IHByb3h5IGZuJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnNldHRpbmdzWyd0cnVzdCBwcm94eSddO1xuICAgICAgZGVsZXRlIHRoaXMuc2V0dGluZ3NbJ3RydXN0IHByb3h5IGZuJ107XG4gICAgfVxuXG4gICAgLy8gaW5oZXJpdCBwcm90b3NcbiAgICBzZXRQcm90b3R5cGVPZih0aGlzLnJlcXVlc3QsIHBhcmVudC5yZXF1ZXN0KVxuICAgIHNldFByb3RvdHlwZU9mKHRoaXMucmVzcG9uc2UsIHBhcmVudC5yZXNwb25zZSlcbiAgICBzZXRQcm90b3R5cGVPZih0aGlzLmVuZ2luZXMsIHBhcmVudC5lbmdpbmVzKVxuICAgIHNldFByb3RvdHlwZU9mKHRoaXMuc2V0dGluZ3MsIHBhcmVudC5zZXR0aW5ncylcbiAgfSk7XG5cbiAgLy8gc2V0dXAgbG9jYWxzXG4gIHRoaXMubG9jYWxzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAvLyB0b3AtbW9zdCBhcHAgaXMgbW91bnRlZCBhdCAvXG4gIHRoaXMubW91bnRwYXRoID0gJy8nO1xuXG4gIC8vIGRlZmF1bHQgbG9jYWxzXG4gIHRoaXMubG9jYWxzLnNldHRpbmdzID0gdGhpcy5zZXR0aW5ncztcblxuICAvLyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgdGhpcy5zZXQoJ3ZpZXcnLCBWaWV3KTtcbiAgdGhpcy5zZXQoJ3ZpZXdzJywgcmVzb2x2ZSgndmlld3MnKSk7XG4gIHRoaXMuc2V0KCdqc29ucCBjYWxsYmFjayBuYW1lJywgJ2NhbGxiYWNrJyk7XG5cbiAgaWYgKGVudiA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdGhpcy5lbmFibGUoJ3ZpZXcgY2FjaGUnKTtcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncm91dGVyJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1xcJ2FwcC5yb3V0ZXJcXCcgaXMgZGVwcmVjYXRlZCFcXG5QbGVhc2Ugc2VlIHRoZSAzLnggdG8gNC54IG1pZ3JhdGlvbiBndWlkZSBmb3IgZGV0YWlscyBvbiBob3cgdG8gdXBkYXRlIHlvdXIgYXBwLicpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIGxhemlseSBhZGRzIHRoZSBiYXNlIHJvdXRlciBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGFkZGVkLlxuICpcbiAqIFdlIGNhbm5vdCBhZGQgdGhlIGJhc2Ugcm91dGVyIGluIHRoZSBkZWZhdWx0Q29uZmlndXJhdGlvbiBiZWNhdXNlXG4gKiBpdCByZWFkcyBhcHAgc2V0dGluZ3Mgd2hpY2ggbWlnaHQgYmUgc2V0IGFmdGVyIHRoYXQgaGFzIHJ1bi5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5hcHAubGF6eXJvdXRlciA9IGZ1bmN0aW9uIGxhenlyb3V0ZXIoKSB7XG4gIGlmICghdGhpcy5fcm91dGVyKSB7XG4gICAgdGhpcy5fcm91dGVyID0gbmV3IFJvdXRlcih7XG4gICAgICBjYXNlU2Vuc2l0aXZlOiB0aGlzLmVuYWJsZWQoJ2Nhc2Ugc2Vuc2l0aXZlIHJvdXRpbmcnKSxcbiAgICAgIHN0cmljdDogdGhpcy5lbmFibGVkKCdzdHJpY3Qgcm91dGluZycpXG4gICAgfSk7XG5cbiAgICB0aGlzLl9yb3V0ZXIudXNlKHF1ZXJ5KHRoaXMuZ2V0KCdxdWVyeSBwYXJzZXIgZm4nKSkpO1xuICAgIHRoaXMuX3JvdXRlci51c2UobWlkZGxld2FyZS5pbml0KHRoaXMpKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcSwgcmVzIHBhaXIgaW50byB0aGUgYXBwbGljYXRpb24uIFN0YXJ0cyBwaXBlbGluZSBwcm9jZXNzaW5nLlxuICpcbiAqIElmIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCB0aGVuIGRlZmF1bHQgZXJyb3IgaGFuZGxlcnMgd2lsbCByZXNwb25kXG4gKiBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IgYnViYmxpbmcgdGhyb3VnaCB0aGUgc3RhY2suXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5hcHAuaGFuZGxlID0gZnVuY3Rpb24gaGFuZGxlKHJlcSwgcmVzLCBjYWxsYmFjaykge1xuICB2YXIgcm91dGVyID0gdGhpcy5fcm91dGVyO1xuXG4gIC8vIGZpbmFsIGhhbmRsZXJcbiAgdmFyIGRvbmUgPSBjYWxsYmFjayB8fCBmaW5hbGhhbmRsZXIocmVxLCByZXMsIHtcbiAgICBlbnY6IHRoaXMuZ2V0KCdlbnYnKSxcbiAgICBvbmVycm9yOiBsb2dlcnJvci5iaW5kKHRoaXMpXG4gIH0pO1xuXG4gIC8vIG5vIHJvdXRlc1xuICBpZiAoIXJvdXRlcikge1xuICAgIGRlYnVnKCdubyByb3V0ZXMgZGVmaW5lZCBvbiBhcHAnKTtcbiAgICBkb25lKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcm91dGVyLmhhbmRsZShyZXEsIHJlcywgZG9uZSk7XG59O1xuXG4vKipcbiAqIFByb3h5IGBSb3V0ZXIjdXNlKClgIHRvIGFkZCBtaWRkbGV3YXJlIHRvIHRoZSBhcHAgcm91dGVyLlxuICogU2VlIFJvdXRlciN1c2UoKSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLlxuICpcbiAqIElmIHRoZSBfZm5fIHBhcmFtZXRlciBpcyBhbiBleHByZXNzIGFwcCwgdGhlbiBpdCB3aWxsIGJlXG4gKiBtb3VudGVkIGF0IHRoZSBfcm91dGVfIHNwZWNpZmllZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cblxuYXBwLnVzZSA9IGZ1bmN0aW9uIHVzZShmbikge1xuICB2YXIgb2Zmc2V0ID0gMDtcbiAgdmFyIHBhdGggPSAnLyc7XG5cbiAgLy8gZGVmYXVsdCBwYXRoIHRvICcvJ1xuICAvLyBkaXNhbWJpZ3VhdGUgYXBwLnVzZShbZm5dKVxuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGFyZyA9IGZuO1xuXG4gICAgd2hpbGUgKEFycmF5LmlzQXJyYXkoYXJnKSAmJiBhcmcubGVuZ3RoICE9PSAwKSB7XG4gICAgICBhcmcgPSBhcmdbMF07XG4gICAgfVxuXG4gICAgLy8gZmlyc3QgYXJnIGlzIHRoZSBwYXRoXG4gICAgaWYgKHR5cGVvZiBhcmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9mZnNldCA9IDE7XG4gICAgICBwYXRoID0gZm47XG4gICAgfVxuICB9XG5cbiAgdmFyIGZucyA9IGZsYXR0ZW4oc2xpY2UuY2FsbChhcmd1bWVudHMsIG9mZnNldCkpO1xuXG4gIGlmIChmbnMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXBwLnVzZSgpIHJlcXVpcmVzIGEgbWlkZGxld2FyZSBmdW5jdGlvbicpXG4gIH1cblxuICAvLyBzZXR1cCByb3V0ZXJcbiAgdGhpcy5sYXp5cm91dGVyKCk7XG4gIHZhciByb3V0ZXIgPSB0aGlzLl9yb3V0ZXI7XG5cbiAgZm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgLy8gbm9uLWV4cHJlc3MgYXBwXG4gICAgaWYgKCFmbiB8fCAhZm4uaGFuZGxlIHx8ICFmbi5zZXQpIHtcbiAgICAgIHJldHVybiByb3V0ZXIudXNlKHBhdGgsIGZuKTtcbiAgICB9XG5cbiAgICBkZWJ1ZygnLnVzZSBhcHAgdW5kZXIgJXMnLCBwYXRoKTtcbiAgICBmbi5tb3VudHBhdGggPSBwYXRoO1xuICAgIGZuLnBhcmVudCA9IHRoaXM7XG5cbiAgICAvLyByZXN0b3JlIC5hcHAgcHJvcGVydHkgb24gcmVxIGFuZCByZXNcbiAgICByb3V0ZXIudXNlKHBhdGgsIGZ1bmN0aW9uIG1vdW50ZWRfYXBwKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgICB2YXIgb3JpZyA9IHJlcS5hcHA7XG4gICAgICBmbi5oYW5kbGUocmVxLCByZXMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgc2V0UHJvdG90eXBlT2YocmVxLCBvcmlnLnJlcXVlc3QpXG4gICAgICAgIHNldFByb3RvdHlwZU9mKHJlcywgb3JpZy5yZXNwb25zZSlcbiAgICAgICAgbmV4dChlcnIpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBtb3VudGVkIGFuIGFwcFxuICAgIGZuLmVtaXQoJ21vdW50JywgdGhpcyk7XG4gIH0sIHRoaXMpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQcm94eSB0byB0aGUgYXBwIGBSb3V0ZXIjcm91dGUoKWBcbiAqIFJldHVybnMgYSBuZXcgYFJvdXRlYCBpbnN0YW5jZSBmb3IgdGhlIF9wYXRoXy5cbiAqXG4gKiBSb3V0ZXMgYXJlIGlzb2xhdGVkIG1pZGRsZXdhcmUgc3RhY2tzIGZvciBzcGVjaWZpYyBwYXRocy5cbiAqIFNlZSB0aGUgUm91dGUgYXBpIGRvY3MgZm9yIGRldGFpbHMuXG4gKlxuICogQHB1YmxpY1xuICovXG5cbmFwcC5yb3V0ZSA9IGZ1bmN0aW9uIHJvdXRlKHBhdGgpIHtcbiAgdGhpcy5sYXp5cm91dGVyKCk7XG4gIHJldHVybiB0aGlzLl9yb3V0ZXIucm91dGUocGF0aCk7XG59O1xuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBnaXZlbiB0ZW1wbGF0ZSBlbmdpbmUgY2FsbGJhY2sgYGZuYFxuICogYXMgYGV4dGAuXG4gKlxuICogQnkgZGVmYXVsdCB3aWxsIGByZXF1aXJlKClgIHRoZSBlbmdpbmUgYmFzZWQgb24gdGhlXG4gKiBmaWxlIGV4dGVuc2lvbi4gRm9yIGV4YW1wbGUgaWYgeW91IHRyeSB0byByZW5kZXJcbiAqIGEgXCJmb28uZWpzXCIgZmlsZSBFeHByZXNzIHdpbGwgaW52b2tlIHRoZSBmb2xsb3dpbmcgaW50ZXJuYWxseTpcbiAqXG4gKiAgICAgYXBwLmVuZ2luZSgnZWpzJywgcmVxdWlyZSgnZWpzJykuX19leHByZXNzKTtcbiAqXG4gKiBGb3IgZW5naW5lcyB0aGF0IGRvIG5vdCBwcm92aWRlIGAuX19leHByZXNzYCBvdXQgb2YgdGhlIGJveCxcbiAqIG9yIGlmIHlvdSB3aXNoIHRvIFwibWFwXCIgYSBkaWZmZXJlbnQgZXh0ZW5zaW9uIHRvIHRoZSB0ZW1wbGF0ZSBlbmdpbmVcbiAqIHlvdSBtYXkgdXNlIHRoaXMgbWV0aG9kLiBGb3IgZXhhbXBsZSBtYXBwaW5nIHRoZSBFSlMgdGVtcGxhdGUgZW5naW5lIHRvXG4gKiBcIi5odG1sXCIgZmlsZXM6XG4gKlxuICogICAgIGFwcC5lbmdpbmUoJ2h0bWwnLCByZXF1aXJlKCdlanMnKS5yZW5kZXJGaWxlKTtcbiAqXG4gKiBJbiB0aGlzIGNhc2UgRUpTIHByb3ZpZGVzIGEgYC5yZW5kZXJGaWxlKClgIG1ldGhvZCB3aXRoXG4gKiB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBFeHByZXNzIGV4cGVjdHM6IGAocGF0aCwgb3B0aW9ucywgY2FsbGJhY2spYCxcbiAqIHRob3VnaCBub3RlIHRoYXQgaXQgYWxpYXNlcyB0aGlzIG1ldGhvZCBhcyBgZWpzLl9fZXhwcmVzc2AgaW50ZXJuYWxseVxuICogc28gaWYgeW91J3JlIHVzaW5nIFwiLmVqc1wiIGV4dGVuc2lvbnMgeW91IGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuXG4gKlxuICogU29tZSB0ZW1wbGF0ZSBlbmdpbmVzIGRvIG5vdCBmb2xsb3cgdGhpcyBjb252ZW50aW9uLCB0aGVcbiAqIFtDb25zb2xpZGF0ZS5qc10oaHR0cHM6Ly9naXRodWIuY29tL3RqL2NvbnNvbGlkYXRlLmpzKVxuICogbGlicmFyeSB3YXMgY3JlYXRlZCB0byBtYXAgYWxsIG9mIG5vZGUncyBwb3B1bGFyIHRlbXBsYXRlXG4gKiBlbmdpbmVzIHRvIGZvbGxvdyB0aGlzIGNvbnZlbnRpb24sIHRodXMgYWxsb3dpbmcgdGhlbSB0b1xuICogd29yayBzZWFtbGVzc2x5IHdpdGhpbiBFeHByZXNzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBleHRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5lbmdpbmUgPSBmdW5jdGlvbiBlbmdpbmUoZXh0LCBmbikge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsYmFjayBmdW5jdGlvbiByZXF1aXJlZCcpO1xuICB9XG5cbiAgLy8gZ2V0IGZpbGUgZXh0ZW5zaW9uXG4gIHZhciBleHRlbnNpb24gPSBleHRbMF0gIT09ICcuJ1xuICAgID8gJy4nICsgZXh0XG4gICAgOiBleHQ7XG5cbiAgLy8gc3RvcmUgZW5naW5lXG4gIHRoaXMuZW5naW5lc1tleHRlbnNpb25dID0gZm47XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFByb3h5IHRvIGBSb3V0ZXIjcGFyYW0oKWAgd2l0aCBvbmUgYWRkZWQgYXBpIGZlYXR1cmUuIFRoZSBfbmFtZV8gcGFyYW1ldGVyXG4gKiBjYW4gYmUgYW4gYXJyYXkgb2YgbmFtZXMuXG4gKlxuICogU2VlIHRoZSBSb3V0ZXIjcGFyYW0oKSBkb2NzIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5wYXJhbSA9IGZ1bmN0aW9uIHBhcmFtKG5hbWUsIGZuKSB7XG4gIHRoaXMubGF6eXJvdXRlcigpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhcmFtKG5hbWVbaV0sIGZuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX3JvdXRlci5wYXJhbShuYW1lLCBmbik7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFzc2lnbiBgc2V0dGluZ2AgdG8gYHZhbGAsIG9yIHJldHVybiBgc2V0dGluZ2AncyB2YWx1ZS5cbiAqXG4gKiAgICBhcHAuc2V0KCdmb28nLCAnYmFyJyk7XG4gKiAgICBhcHAuc2V0KCdmb28nKTtcbiAqICAgIC8vID0+IFwiYmFyXCJcbiAqXG4gKiBNb3VudGVkIHNlcnZlcnMgaW5oZXJpdCB0aGVpciBwYXJlbnQgc2VydmVyJ3Mgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNldHRpbmdcbiAqIEBwYXJhbSB7Kn0gW3ZhbF1cbiAqIEByZXR1cm4ge1NlcnZlcn0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxuYXBwLnNldCA9IGZ1bmN0aW9uIHNldChzZXR0aW5nLCB2YWwpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBhcHAuZ2V0KHNldHRpbmcpXG4gICAgdmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc1xuXG4gICAgd2hpbGUgKHNldHRpbmdzICYmIHNldHRpbmdzICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgc2V0dGluZykpIHtcbiAgICAgICAgcmV0dXJuIHNldHRpbmdzW3NldHRpbmddXG4gICAgICB9XG5cbiAgICAgIHNldHRpbmdzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHNldHRpbmdzKVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGRlYnVnKCdzZXQgXCIlc1wiIHRvICVvJywgc2V0dGluZywgdmFsKTtcblxuICAvLyBzZXQgdmFsdWVcbiAgdGhpcy5zZXR0aW5nc1tzZXR0aW5nXSA9IHZhbDtcblxuICAvLyB0cmlnZ2VyIG1hdGNoZWQgc2V0dGluZ3NcbiAgc3dpdGNoIChzZXR0aW5nKSB7XG4gICAgY2FzZSAnZXRhZyc6XG4gICAgICB0aGlzLnNldCgnZXRhZyBmbicsIGNvbXBpbGVFVGFnKHZhbCkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncXVlcnkgcGFyc2VyJzpcbiAgICAgIHRoaXMuc2V0KCdxdWVyeSBwYXJzZXIgZm4nLCBjb21waWxlUXVlcnlQYXJzZXIodmFsKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0cnVzdCBwcm94eSc6XG4gICAgICB0aGlzLnNldCgndHJ1c3QgcHJveHkgZm4nLCBjb21waWxlVHJ1c3QodmFsKSk7XG5cbiAgICAgIC8vIHRydXN0IHByb3h5IGluaGVyaXQgYmFjay1jb21wYXRcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnNldHRpbmdzLCB0cnVzdFByb3h5RGVmYXVsdFN5bWJvbCwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgYXBwJ3MgYWJzb2x1dGUgcGF0aG5hbWVcbiAqIGJhc2VkIG9uIHRoZSBwYXJlbnQocykgdGhhdCBoYXZlXG4gKiBtb3VudGVkIGl0LlxuICpcbiAqIEZvciBleGFtcGxlIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXNcbiAqIG1vdW50ZWQgYXMgXCIvYWRtaW5cIiwgd2hpY2ggaXRzZWxmXG4gKiB3YXMgbW91bnRlZCBhcyBcIi9ibG9nXCIgdGhlbiB0aGVcbiAqIHJldHVybiB2YWx1ZSB3b3VsZCBiZSBcIi9ibG9nL2FkbWluXCIuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5hcHAucGF0aCA9IGZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiB0aGlzLnBhcmVudFxuICAgID8gdGhpcy5wYXJlbnQucGF0aCgpICsgdGhpcy5tb3VudHBhdGhcbiAgICA6ICcnO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBgc2V0dGluZ2AgaXMgZW5hYmxlZCAodHJ1dGh5KS5cbiAqXG4gKiAgICBhcHAuZW5hYmxlZCgnZm9vJylcbiAqICAgIC8vID0+IGZhbHNlXG4gKlxuICogICAgYXBwLmVuYWJsZSgnZm9vJylcbiAqICAgIGFwcC5lbmFibGVkKCdmb28nKVxuICogICAgLy8gPT4gdHJ1ZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5nXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmFwcC5lbmFibGVkID0gZnVuY3Rpb24gZW5hYmxlZChzZXR0aW5nKSB7XG4gIHJldHVybiBCb29sZWFuKHRoaXMuc2V0KHNldHRpbmcpKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYHNldHRpbmdgIGlzIGRpc2FibGVkLlxuICpcbiAqICAgIGFwcC5kaXNhYmxlZCgnZm9vJylcbiAqICAgIC8vID0+IHRydWVcbiAqXG4gKiAgICBhcHAuZW5hYmxlKCdmb28nKVxuICogICAgYXBwLmRpc2FibGVkKCdmb28nKVxuICogICAgLy8gPT4gZmFsc2VcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2V0dGluZ1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5hcHAuZGlzYWJsZWQgPSBmdW5jdGlvbiBkaXNhYmxlZChzZXR0aW5nKSB7XG4gIHJldHVybiAhdGhpcy5zZXQoc2V0dGluZyk7XG59O1xuXG4vKipcbiAqIEVuYWJsZSBgc2V0dGluZ2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNldHRpbmdcbiAqIEByZXR1cm4ge2FwcH0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxuYXBwLmVuYWJsZSA9IGZ1bmN0aW9uIGVuYWJsZShzZXR0aW5nKSB7XG4gIHJldHVybiB0aGlzLnNldChzZXR0aW5nLCB0cnVlKTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSBgc2V0dGluZ2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNldHRpbmdcbiAqIEByZXR1cm4ge2FwcH0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxuYXBwLmRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKHNldHRpbmcpIHtcbiAgcmV0dXJuIHRoaXMuc2V0KHNldHRpbmcsIGZhbHNlKTtcbn07XG5cbi8qKlxuICogRGVsZWdhdGUgYC5WRVJCKC4uLilgIGNhbGxzIHRvIGByb3V0ZXIuVkVSQiguLi4pYC5cbiAqL1xuXG5tZXRob2RzLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKXtcbiAgYXBwW21ldGhvZF0gPSBmdW5jdGlvbihwYXRoKXtcbiAgICBpZiAobWV0aG9kID09PSAnZ2V0JyAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAvLyBhcHAuZ2V0KHNldHRpbmcpXG4gICAgICByZXR1cm4gdGhpcy5zZXQocGF0aCk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXp5cm91dGVyKCk7XG5cbiAgICB2YXIgcm91dGUgPSB0aGlzLl9yb3V0ZXIucm91dGUocGF0aCk7XG4gICAgcm91dGVbbWV0aG9kXS5hcHBseShyb3V0ZSwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn0pO1xuXG4vKipcbiAqIFNwZWNpYWwtY2FzZWQgXCJhbGxcIiBtZXRob2QsIGFwcGx5aW5nIHRoZSBnaXZlbiByb3V0ZSBgcGF0aGAsXG4gKiBtaWRkbGV3YXJlLCBhbmQgY2FsbGJhY2sgdG8gX2V2ZXJ5XyBIVFRQIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtGdW5jdGlvbn0gLi4uXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5hbGwgPSBmdW5jdGlvbiBhbGwocGF0aCkge1xuICB0aGlzLmxhenlyb3V0ZXIoKTtcblxuICB2YXIgcm91dGUgPSB0aGlzLl9yb3V0ZXIucm91dGUocGF0aCk7XG4gIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgIHJvdXRlW21ldGhvZHNbaV1dLmFwcGx5KHJvdXRlLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZGVsIC0+IGRlbGV0ZSBhbGlhc1xuXG5hcHAuZGVsID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGFwcC5kZWxldGUsICdhcHAuZGVsOiBVc2UgYXBwLmRlbGV0ZSBpbnN0ZWFkJyk7XG5cbi8qKlxuICogUmVuZGVyIHRoZSBnaXZlbiB2aWV3IGBuYW1lYCBuYW1lIHdpdGggYG9wdGlvbnNgXG4gKiBhbmQgYSBjYWxsYmFjayBhY2NlcHRpbmcgYW4gZXJyb3IgYW5kIHRoZVxuICogcmVuZGVyZWQgdGVtcGxhdGUgc3RyaW5nLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgYXBwLnJlbmRlcignZW1haWwnLCB7IG5hbWU6ICdUb2JpJyB9LCBmdW5jdGlvbihlcnIsIGh0bWwpe1xuICogICAgICAvLyAuLi5cbiAqICAgIH0pXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBvcHRpb25zIG9yIGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIobmFtZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGNhY2hlID0gdGhpcy5jYWNoZTtcbiAgdmFyIGRvbmUgPSBjYWxsYmFjaztcbiAgdmFyIGVuZ2luZXMgPSB0aGlzLmVuZ2luZXM7XG4gIHZhciBvcHRzID0gb3B0aW9ucztcbiAgdmFyIHJlbmRlck9wdGlvbnMgPSB7fTtcbiAgdmFyIHZpZXc7XG5cbiAgLy8gc3VwcG9ydCBjYWxsYmFjayBmdW5jdGlvbiBhcyBzZWNvbmQgYXJnXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBvcHRpb25zO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIC8vIG1lcmdlIGFwcC5sb2NhbHNcbiAgbWVyZ2UocmVuZGVyT3B0aW9ucywgdGhpcy5sb2NhbHMpO1xuXG4gIC8vIG1lcmdlIG9wdGlvbnMuX2xvY2Fsc1xuICBpZiAob3B0cy5fbG9jYWxzKSB7XG4gICAgbWVyZ2UocmVuZGVyT3B0aW9ucywgb3B0cy5fbG9jYWxzKTtcbiAgfVxuXG4gIC8vIG1lcmdlIG9wdGlvbnNcbiAgbWVyZ2UocmVuZGVyT3B0aW9ucywgb3B0cyk7XG5cbiAgLy8gc2V0IC5jYWNoZSB1bmxlc3MgZXhwbGljaXRseSBwcm92aWRlZFxuICBpZiAocmVuZGVyT3B0aW9ucy5jYWNoZSA9PSBudWxsKSB7XG4gICAgcmVuZGVyT3B0aW9ucy5jYWNoZSA9IHRoaXMuZW5hYmxlZCgndmlldyBjYWNoZScpO1xuICB9XG5cbiAgLy8gcHJpbWVkIGNhY2hlXG4gIGlmIChyZW5kZXJPcHRpb25zLmNhY2hlKSB7XG4gICAgdmlldyA9IGNhY2hlW25hbWVdO1xuICB9XG5cbiAgLy8gdmlld1xuICBpZiAoIXZpZXcpIHtcbiAgICB2YXIgVmlldyA9IHRoaXMuZ2V0KCd2aWV3Jyk7XG5cbiAgICB2aWV3ID0gbmV3IFZpZXcobmFtZSwge1xuICAgICAgZGVmYXVsdEVuZ2luZTogdGhpcy5nZXQoJ3ZpZXcgZW5naW5lJyksXG4gICAgICByb290OiB0aGlzLmdldCgndmlld3MnKSxcbiAgICAgIGVuZ2luZXM6IGVuZ2luZXNcbiAgICB9KTtcblxuICAgIGlmICghdmlldy5wYXRoKSB7XG4gICAgICB2YXIgZGlycyA9IEFycmF5LmlzQXJyYXkodmlldy5yb290KSAmJiB2aWV3LnJvb3QubGVuZ3RoID4gMVxuICAgICAgICA/ICdkaXJlY3RvcmllcyBcIicgKyB2aWV3LnJvb3Quc2xpY2UoMCwgLTEpLmpvaW4oJ1wiLCBcIicpICsgJ1wiIG9yIFwiJyArIHZpZXcucm9vdFt2aWV3LnJvb3QubGVuZ3RoIC0gMV0gKyAnXCInXG4gICAgICAgIDogJ2RpcmVjdG9yeSBcIicgKyB2aWV3LnJvb3QgKyAnXCInXG4gICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9va3VwIHZpZXcgXCInICsgbmFtZSArICdcIiBpbiB2aWV3cyAnICsgZGlycyk7XG4gICAgICBlcnIudmlldyA9IHZpZXc7XG4gICAgICByZXR1cm4gZG9uZShlcnIpO1xuICAgIH1cblxuICAgIC8vIHByaW1lIHRoZSBjYWNoZVxuICAgIGlmIChyZW5kZXJPcHRpb25zLmNhY2hlKSB7XG4gICAgICBjYWNoZVtuYW1lXSA9IHZpZXc7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVuZGVyXG4gIHRyeVJlbmRlcih2aWV3LCByZW5kZXJPcHRpb25zLCBkb25lKTtcbn07XG5cbi8qKlxuICogTGlzdGVuIGZvciBjb25uZWN0aW9ucy5cbiAqXG4gKiBBIG5vZGUgYGh0dHAuU2VydmVyYCBpcyByZXR1cm5lZCwgd2l0aCB0aGlzXG4gKiBhcHBsaWNhdGlvbiAod2hpY2ggaXMgYSBgRnVuY3Rpb25gKSBhcyBpdHNcbiAqIGNhbGxiYWNrLiBJZiB5b3Ugd2lzaCB0byBjcmVhdGUgYm90aCBhbiBIVFRQXG4gKiBhbmQgSFRUUFMgc2VydmVyIHlvdSBtYXkgZG8gc28gd2l0aCB0aGUgXCJodHRwXCJcbiAqIGFuZCBcImh0dHBzXCIgbW9kdWxlcyBhcyBzaG93biBoZXJlOlxuICpcbiAqICAgIHZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpXG4gKiAgICAgICwgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpXG4gKiAgICAgICwgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKVxuICogICAgICAsIGFwcCA9IGV4cHJlc3MoKTtcbiAqXG4gKiAgICBodHRwLmNyZWF0ZVNlcnZlcihhcHApLmxpc3Rlbig4MCk7XG4gKiAgICBodHRwcy5jcmVhdGVTZXJ2ZXIoeyAuLi4gfSwgYXBwKS5saXN0ZW4oNDQzKTtcbiAqXG4gKiBAcmV0dXJuIHtodHRwLlNlcnZlcn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5hcHAubGlzdGVuID0gZnVuY3Rpb24gbGlzdGVuKCkge1xuICB2YXIgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIodGhpcyk7XG4gIHJldHVybiBzZXJ2ZXIubGlzdGVuLmFwcGx5KHNlcnZlciwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogTG9nIGVycm9yIHVzaW5nIGNvbnNvbGUuZXJyb3IuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvZ2Vycm9yKGVycikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodGhpcy5nZXQoJ2VudicpICE9PSAndGVzdCcpIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrIHx8IGVyci50b1N0cmluZygpKTtcbn1cblxuLyoqXG4gKiBUcnkgcmVuZGVyaW5nIGEgdmlldy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdHJ5UmVuZGVyKHZpZXcsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHRyeSB7XG4gICAgdmlldy5yZW5kZXIob3B0aW9ucywgY2FsbGJhY2spO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBuZWdvdGlhdG9yXG4gKiBDb3B5cmlnaHQoYykgMjAxMiBJc2FhYyBaLiBTY2hsdWV0ZXJcbiAqIENvcHlyaWdodChjKSAyMDE0IEZlZGVyaWNvIFJvbWVyb1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcHJlZmVycmVkQ2hhcnNldHM7XG5tb2R1bGUuZXhwb3J0cy5wcmVmZXJyZWRDaGFyc2V0cyA9IHByZWZlcnJlZENoYXJzZXRzO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBzaW1wbGVDaGFyc2V0UmVnRXhwID0gL15cXHMqKFteXFxzO10rKVxccyooPzo7KC4qKSk/JC87XG5cbi8qKlxuICogUGFyc2UgdGhlIEFjY2VwdC1DaGFyc2V0IGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VBY2NlcHRDaGFyc2V0KGFjY2VwdCkge1xuICB2YXIgYWNjZXB0cyA9IGFjY2VwdC5zcGxpdCgnLCcpO1xuXG4gIGZvciAodmFyIGkgPSAwLCBqID0gMDsgaSA8IGFjY2VwdHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgY2hhcnNldCA9IHBhcnNlQ2hhcnNldChhY2NlcHRzW2ldLnRyaW0oKSwgaSk7XG5cbiAgICBpZiAoY2hhcnNldCkge1xuICAgICAgYWNjZXB0c1tqKytdID0gY2hhcnNldDtcbiAgICB9XG4gIH1cblxuICAvLyB0cmltIGFjY2VwdHNcbiAgYWNjZXB0cy5sZW5ndGggPSBqO1xuXG4gIHJldHVybiBhY2NlcHRzO1xufVxuXG4vKipcbiAqIFBhcnNlIGEgY2hhcnNldCBmcm9tIHRoZSBBY2NlcHQtQ2hhcnNldCBoZWFkZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlQ2hhcnNldChzdHIsIGkpIHtcbiAgdmFyIG1hdGNoID0gc2ltcGxlQ2hhcnNldFJlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBjaGFyc2V0ID0gbWF0Y2hbMV07XG4gIHZhciBxID0gMTtcbiAgaWYgKG1hdGNoWzJdKSB7XG4gICAgdmFyIHBhcmFtcyA9IG1hdGNoWzJdLnNwbGl0KCc7JylcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHAgPSBwYXJhbXNbal0udHJpbSgpLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAocFswXSA9PT0gJ3EnKSB7XG4gICAgICAgIHEgPSBwYXJzZUZsb2F0KHBbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgcTogcSxcbiAgICBpOiBpXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcmlvcml0eSBvZiBhIGNoYXJzZXQuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldENoYXJzZXRQcmlvcml0eShjaGFyc2V0LCBhY2NlcHRlZCwgaW5kZXgpIHtcbiAgdmFyIHByaW9yaXR5ID0ge286IC0xLCBxOiAwLCBzOiAwfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFjY2VwdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwZWMgPSBzcGVjaWZ5KGNoYXJzZXQsIGFjY2VwdGVkW2ldLCBpbmRleCk7XG5cbiAgICBpZiAoc3BlYyAmJiAocHJpb3JpdHkucyAtIHNwZWMucyB8fCBwcmlvcml0eS5xIC0gc3BlYy5xIHx8IHByaW9yaXR5Lm8gLSBzcGVjLm8pIDwgMCkge1xuICAgICAgcHJpb3JpdHkgPSBzcGVjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmlvcml0eTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNwZWNpZmljaXR5IG9mIHRoZSBjaGFyc2V0LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzcGVjaWZ5KGNoYXJzZXQsIHNwZWMsIGluZGV4KSB7XG4gIHZhciBzID0gMDtcbiAgaWYoc3BlYy5jaGFyc2V0LnRvTG93ZXJDYXNlKCkgPT09IGNoYXJzZXQudG9Mb3dlckNhc2UoKSl7XG4gICAgcyB8PSAxO1xuICB9IGVsc2UgaWYgKHNwZWMuY2hhcnNldCAhPT0gJyonICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGk6IGluZGV4LFxuICAgIG86IHNwZWMuaSxcbiAgICBxOiBzcGVjLnEsXG4gICAgczogc1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcmVmZXJyZWQgY2hhcnNldHMgZnJvbSBhbiBBY2NlcHQtQ2hhcnNldCBoZWFkZXIuXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcHJlZmVycmVkQ2hhcnNldHMoYWNjZXB0LCBwcm92aWRlZCkge1xuICAvLyBSRkMgMjYxNiBzZWMgMTQuMjogbm8gaGVhZGVyID0gKlxuICB2YXIgYWNjZXB0cyA9IHBhcnNlQWNjZXB0Q2hhcnNldChhY2NlcHQgPT09IHVuZGVmaW5lZCA/ICcqJyA6IGFjY2VwdCB8fCAnJyk7XG5cbiAgaWYgKCFwcm92aWRlZCkge1xuICAgIC8vIHNvcnRlZCBsaXN0IG9mIGFsbCBjaGFyc2V0c1xuICAgIHJldHVybiBhY2NlcHRzXG4gICAgICAuZmlsdGVyKGlzUXVhbGl0eSlcbiAgICAgIC5zb3J0KGNvbXBhcmVTcGVjcylcbiAgICAgIC5tYXAoZ2V0RnVsbENoYXJzZXQpO1xuICB9XG5cbiAgdmFyIHByaW9yaXRpZXMgPSBwcm92aWRlZC5tYXAoZnVuY3Rpb24gZ2V0UHJpb3JpdHkodHlwZSwgaW5kZXgpIHtcbiAgICByZXR1cm4gZ2V0Q2hhcnNldFByaW9yaXR5KHR5cGUsIGFjY2VwdHMsIGluZGV4KTtcbiAgfSk7XG5cbiAgLy8gc29ydGVkIGxpc3Qgb2YgYWNjZXB0ZWQgY2hhcnNldHNcbiAgcmV0dXJuIHByaW9yaXRpZXMuZmlsdGVyKGlzUXVhbGl0eSkuc29ydChjb21wYXJlU3BlY3MpLm1hcChmdW5jdGlvbiBnZXRDaGFyc2V0KHByaW9yaXR5KSB7XG4gICAgcmV0dXJuIHByb3ZpZGVkW3ByaW9yaXRpZXMuaW5kZXhPZihwcmlvcml0eSldO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb21wYXJlIHR3byBzcGVjcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29tcGFyZVNwZWNzKGEsIGIpIHtcbiAgcmV0dXJuIChiLnEgLSBhLnEpIHx8IChiLnMgLSBhLnMpIHx8IChhLm8gLSBiLm8pIHx8IChhLmkgLSBiLmkpIHx8IDA7XG59XG5cbi8qKlxuICogR2V0IGZ1bGwgY2hhcnNldCBzdHJpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEZ1bGxDaGFyc2V0KHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMuY2hhcnNldDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHNwZWMgaGFzIGFueSBxdWFsaXR5LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc1F1YWxpdHkoc3BlYykge1xuICByZXR1cm4gc3BlYy5xID4gMDtcbn1cbiIsICIvKipcbiAqIG5lZ290aWF0b3JcbiAqIENvcHlyaWdodChjKSAyMDEyIElzYWFjIFouIFNjaGx1ZXRlclxuICogQ29weXJpZ2h0KGMpIDIwMTQgRmVkZXJpY28gUm9tZXJvXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwcmVmZXJyZWRFbmNvZGluZ3M7XG5tb2R1bGUuZXhwb3J0cy5wcmVmZXJyZWRFbmNvZGluZ3MgPSBwcmVmZXJyZWRFbmNvZGluZ3M7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHNpbXBsZUVuY29kaW5nUmVnRXhwID0gL15cXHMqKFteXFxzO10rKVxccyooPzo7KC4qKSk/JC87XG5cbi8qKlxuICogUGFyc2UgdGhlIEFjY2VwdC1FbmNvZGluZyBoZWFkZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlQWNjZXB0RW5jb2RpbmcoYWNjZXB0KSB7XG4gIHZhciBhY2NlcHRzID0gYWNjZXB0LnNwbGl0KCcsJyk7XG4gIHZhciBoYXNJZGVudGl0eSA9IGZhbHNlO1xuICB2YXIgbWluUXVhbGl0eSA9IDE7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgYWNjZXB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbmNvZGluZyA9IHBhcnNlRW5jb2RpbmcoYWNjZXB0c1tpXS50cmltKCksIGkpO1xuXG4gICAgaWYgKGVuY29kaW5nKSB7XG4gICAgICBhY2NlcHRzW2orK10gPSBlbmNvZGluZztcbiAgICAgIGhhc0lkZW50aXR5ID0gaGFzSWRlbnRpdHkgfHwgc3BlY2lmeSgnaWRlbnRpdHknLCBlbmNvZGluZyk7XG4gICAgICBtaW5RdWFsaXR5ID0gTWF0aC5taW4obWluUXVhbGl0eSwgZW5jb2RpbmcucSB8fCAxKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWhhc0lkZW50aXR5KSB7XG4gICAgLypcbiAgICAgKiBJZiBpZGVudGl0eSBkb2Vzbid0IGV4cGxpY2l0bHkgYXBwZWFyIGluIHRoZSBhY2NlcHQtZW5jb2RpbmcgaGVhZGVyLFxuICAgICAqIGl0J3MgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgYWNjZXB0YWJsZSBlbmNvZGluZyB3aXRoIHRoZSBsb3dlc3QgcVxuICAgICAqL1xuICAgIGFjY2VwdHNbaisrXSA9IHtcbiAgICAgIGVuY29kaW5nOiAnaWRlbnRpdHknLFxuICAgICAgcTogbWluUXVhbGl0eSxcbiAgICAgIGk6IGlcbiAgICB9O1xuICB9XG5cbiAgLy8gdHJpbSBhY2NlcHRzXG4gIGFjY2VwdHMubGVuZ3RoID0gajtcblxuICByZXR1cm4gYWNjZXB0cztcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBlbmNvZGluZyBmcm9tIHRoZSBBY2NlcHQtRW5jb2RpbmcgaGVhZGVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUVuY29kaW5nKHN0ciwgaSkge1xuICB2YXIgbWF0Y2ggPSBzaW1wbGVFbmNvZGluZ1JlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBlbmNvZGluZyA9IG1hdGNoWzFdO1xuICB2YXIgcSA9IDE7XG4gIGlmIChtYXRjaFsyXSkge1xuICAgIHZhciBwYXJhbXMgPSBtYXRjaFsyXS5zcGxpdCgnOycpO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgcCA9IHBhcmFtc1tqXS50cmltKCkuc3BsaXQoJz0nKTtcbiAgICAgIGlmIChwWzBdID09PSAncScpIHtcbiAgICAgICAgcSA9IHBhcnNlRmxvYXQocFsxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgIHE6IHEsXG4gICAgaTogaVxuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJpb3JpdHkgb2YgYW4gZW5jb2RpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEVuY29kaW5nUHJpb3JpdHkoZW5jb2RpbmcsIGFjY2VwdGVkLCBpbmRleCkge1xuICB2YXIgcHJpb3JpdHkgPSB7bzogLTEsIHE6IDAsIHM6IDB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjZXB0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc3BlYyA9IHNwZWNpZnkoZW5jb2RpbmcsIGFjY2VwdGVkW2ldLCBpbmRleCk7XG5cbiAgICBpZiAoc3BlYyAmJiAocHJpb3JpdHkucyAtIHNwZWMucyB8fCBwcmlvcml0eS5xIC0gc3BlYy5xIHx8IHByaW9yaXR5Lm8gLSBzcGVjLm8pIDwgMCkge1xuICAgICAgcHJpb3JpdHkgPSBzcGVjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmlvcml0eTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNwZWNpZmljaXR5IG9mIHRoZSBlbmNvZGluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BlY2lmeShlbmNvZGluZywgc3BlYywgaW5kZXgpIHtcbiAgdmFyIHMgPSAwO1xuICBpZihzcGVjLmVuY29kaW5nLnRvTG93ZXJDYXNlKCkgPT09IGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpe1xuICAgIHMgfD0gMTtcbiAgfSBlbHNlIGlmIChzcGVjLmVuY29kaW5nICE9PSAnKicgKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaTogaW5kZXgsXG4gICAgbzogc3BlYy5pLFxuICAgIHE6IHNwZWMucSxcbiAgICBzOiBzXG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBwcmVmZXJyZWQgZW5jb2RpbmdzIGZyb20gYW4gQWNjZXB0LUVuY29kaW5nIGhlYWRlci5cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwcmVmZXJyZWRFbmNvZGluZ3MoYWNjZXB0LCBwcm92aWRlZCkge1xuICB2YXIgYWNjZXB0cyA9IHBhcnNlQWNjZXB0RW5jb2RpbmcoYWNjZXB0IHx8ICcnKTtcblxuICBpZiAoIXByb3ZpZGVkKSB7XG4gICAgLy8gc29ydGVkIGxpc3Qgb2YgYWxsIGVuY29kaW5nc1xuICAgIHJldHVybiBhY2NlcHRzXG4gICAgICAuZmlsdGVyKGlzUXVhbGl0eSlcbiAgICAgIC5zb3J0KGNvbXBhcmVTcGVjcylcbiAgICAgIC5tYXAoZ2V0RnVsbEVuY29kaW5nKTtcbiAgfVxuXG4gIHZhciBwcmlvcml0aWVzID0gcHJvdmlkZWQubWFwKGZ1bmN0aW9uIGdldFByaW9yaXR5KHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGdldEVuY29kaW5nUHJpb3JpdHkodHlwZSwgYWNjZXB0cywgaW5kZXgpO1xuICB9KTtcblxuICAvLyBzb3J0ZWQgbGlzdCBvZiBhY2NlcHRlZCBlbmNvZGluZ3NcbiAgcmV0dXJuIHByaW9yaXRpZXMuZmlsdGVyKGlzUXVhbGl0eSkuc29ydChjb21wYXJlU3BlY3MpLm1hcChmdW5jdGlvbiBnZXRFbmNvZGluZyhwcmlvcml0eSkge1xuICAgIHJldHVybiBwcm92aWRlZFtwcmlvcml0aWVzLmluZGV4T2YocHJpb3JpdHkpXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28gc3BlY3MuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbXBhcmVTcGVjcyhhLCBiKSB7XG4gIHJldHVybiAoYi5xIC0gYS5xKSB8fCAoYi5zIC0gYS5zKSB8fCAoYS5vIC0gYi5vKSB8fCAoYS5pIC0gYi5pKSB8fCAwO1xufVxuXG4vKipcbiAqIEdldCBmdWxsIGVuY29kaW5nIHN0cmluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RnVsbEVuY29kaW5nKHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMuZW5jb2Rpbmc7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzcGVjIGhhcyBhbnkgcXVhbGl0eS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNRdWFsaXR5KHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMucSA+IDA7XG59XG4iLCAiLyoqXG4gKiBuZWdvdGlhdG9yXG4gKiBDb3B5cmlnaHQoYykgMjAxMiBJc2FhYyBaLiBTY2hsdWV0ZXJcbiAqIENvcHlyaWdodChjKSAyMDE0IEZlZGVyaWNvIFJvbWVyb1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcHJlZmVycmVkTGFuZ3VhZ2VzO1xubW9kdWxlLmV4cG9ydHMucHJlZmVycmVkTGFuZ3VhZ2VzID0gcHJlZmVycmVkTGFuZ3VhZ2VzO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBzaW1wbGVMYW5ndWFnZVJlZ0V4cCA9IC9eXFxzKihbXlxcc1xcLTtdKykoPzotKFteXFxzO10rKSk/XFxzKig/OjsoLiopKT8kLztcblxuLyoqXG4gKiBQYXJzZSB0aGUgQWNjZXB0LUxhbmd1YWdlIGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VBY2NlcHRMYW5ndWFnZShhY2NlcHQpIHtcbiAgdmFyIGFjY2VwdHMgPSBhY2NlcHQuc3BsaXQoJywnKTtcblxuICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxhbmd1YWdlID0gcGFyc2VMYW5ndWFnZShhY2NlcHRzW2ldLnRyaW0oKSwgaSk7XG5cbiAgICBpZiAobGFuZ3VhZ2UpIHtcbiAgICAgIGFjY2VwdHNbaisrXSA9IGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRyaW0gYWNjZXB0c1xuICBhY2NlcHRzLmxlbmd0aCA9IGo7XG5cbiAgcmV0dXJuIGFjY2VwdHM7XG59XG5cbi8qKlxuICogUGFyc2UgYSBsYW5ndWFnZSBmcm9tIHRoZSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUxhbmd1YWdlKHN0ciwgaSkge1xuICB2YXIgbWF0Y2ggPSBzaW1wbGVMYW5ndWFnZVJlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBwcmVmaXggPSBtYXRjaFsxXVxuICB2YXIgc3VmZml4ID0gbWF0Y2hbMl1cbiAgdmFyIGZ1bGwgPSBwcmVmaXhcblxuICBpZiAoc3VmZml4KSBmdWxsICs9IFwiLVwiICsgc3VmZml4O1xuXG4gIHZhciBxID0gMTtcbiAgaWYgKG1hdGNoWzNdKSB7XG4gICAgdmFyIHBhcmFtcyA9IG1hdGNoWzNdLnNwbGl0KCc7JylcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHBhcmFtcy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIHAgPSBwYXJhbXNbal0uc3BsaXQoJz0nKTtcbiAgICAgIGlmIChwWzBdID09PSAncScpIHEgPSBwYXJzZUZsb2F0KHBbMV0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcHJlZml4OiBwcmVmaXgsXG4gICAgc3VmZml4OiBzdWZmaXgsXG4gICAgcTogcSxcbiAgICBpOiBpLFxuICAgIGZ1bGw6IGZ1bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByaW9yaXR5IG9mIGEgbGFuZ3VhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldExhbmd1YWdlUHJpb3JpdHkobGFuZ3VhZ2UsIGFjY2VwdGVkLCBpbmRleCkge1xuICB2YXIgcHJpb3JpdHkgPSB7bzogLTEsIHE6IDAsIHM6IDB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjZXB0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc3BlYyA9IHNwZWNpZnkobGFuZ3VhZ2UsIGFjY2VwdGVkW2ldLCBpbmRleCk7XG5cbiAgICBpZiAoc3BlYyAmJiAocHJpb3JpdHkucyAtIHNwZWMucyB8fCBwcmlvcml0eS5xIC0gc3BlYy5xIHx8IHByaW9yaXR5Lm8gLSBzcGVjLm8pIDwgMCkge1xuICAgICAgcHJpb3JpdHkgPSBzcGVjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmlvcml0eTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNwZWNpZmljaXR5IG9mIHRoZSBsYW5ndWFnZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BlY2lmeShsYW5ndWFnZSwgc3BlYywgaW5kZXgpIHtcbiAgdmFyIHAgPSBwYXJzZUxhbmd1YWdlKGxhbmd1YWdlKVxuICBpZiAoIXApIHJldHVybiBudWxsO1xuICB2YXIgcyA9IDA7XG4gIGlmKHNwZWMuZnVsbC50b0xvd2VyQ2FzZSgpID09PSBwLmZ1bGwudG9Mb3dlckNhc2UoKSl7XG4gICAgcyB8PSA0O1xuICB9IGVsc2UgaWYgKHNwZWMucHJlZml4LnRvTG93ZXJDYXNlKCkgPT09IHAuZnVsbC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcyB8PSAyO1xuICB9IGVsc2UgaWYgKHNwZWMuZnVsbC50b0xvd2VyQ2FzZSgpID09PSBwLnByZWZpeC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcyB8PSAxO1xuICB9IGVsc2UgaWYgKHNwZWMuZnVsbCAhPT0gJyonICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGk6IGluZGV4LFxuICAgIG86IHNwZWMuaSxcbiAgICBxOiBzcGVjLnEsXG4gICAgczogc1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcHJlZmVycmVkIGxhbmd1YWdlcyBmcm9tIGFuIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIuXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcHJlZmVycmVkTGFuZ3VhZ2VzKGFjY2VwdCwgcHJvdmlkZWQpIHtcbiAgLy8gUkZDIDI2MTYgc2VjIDE0LjQ6IG5vIGhlYWRlciA9ICpcbiAgdmFyIGFjY2VwdHMgPSBwYXJzZUFjY2VwdExhbmd1YWdlKGFjY2VwdCA9PT0gdW5kZWZpbmVkID8gJyonIDogYWNjZXB0IHx8ICcnKTtcblxuICBpZiAoIXByb3ZpZGVkKSB7XG4gICAgLy8gc29ydGVkIGxpc3Qgb2YgYWxsIGxhbmd1YWdlc1xuICAgIHJldHVybiBhY2NlcHRzXG4gICAgICAuZmlsdGVyKGlzUXVhbGl0eSlcbiAgICAgIC5zb3J0KGNvbXBhcmVTcGVjcylcbiAgICAgIC5tYXAoZ2V0RnVsbExhbmd1YWdlKTtcbiAgfVxuXG4gIHZhciBwcmlvcml0aWVzID0gcHJvdmlkZWQubWFwKGZ1bmN0aW9uIGdldFByaW9yaXR5KHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGdldExhbmd1YWdlUHJpb3JpdHkodHlwZSwgYWNjZXB0cywgaW5kZXgpO1xuICB9KTtcblxuICAvLyBzb3J0ZWQgbGlzdCBvZiBhY2NlcHRlZCBsYW5ndWFnZXNcbiAgcmV0dXJuIHByaW9yaXRpZXMuZmlsdGVyKGlzUXVhbGl0eSkuc29ydChjb21wYXJlU3BlY3MpLm1hcChmdW5jdGlvbiBnZXRMYW5ndWFnZShwcmlvcml0eSkge1xuICAgIHJldHVybiBwcm92aWRlZFtwcmlvcml0aWVzLmluZGV4T2YocHJpb3JpdHkpXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29tcGFyZSB0d28gc3BlY3MuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbXBhcmVTcGVjcyhhLCBiKSB7XG4gIHJldHVybiAoYi5xIC0gYS5xKSB8fCAoYi5zIC0gYS5zKSB8fCAoYS5vIC0gYi5vKSB8fCAoYS5pIC0gYi5pKSB8fCAwO1xufVxuXG4vKipcbiAqIEdldCBmdWxsIGxhbmd1YWdlIHN0cmluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RnVsbExhbmd1YWdlKHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMuZnVsbDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHNwZWMgaGFzIGFueSBxdWFsaXR5LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc1F1YWxpdHkoc3BlYykge1xuICByZXR1cm4gc3BlYy5xID4gMDtcbn1cbiIsICIvKipcbiAqIG5lZ290aWF0b3JcbiAqIENvcHlyaWdodChjKSAyMDEyIElzYWFjIFouIFNjaGx1ZXRlclxuICogQ29weXJpZ2h0KGMpIDIwMTQgRmVkZXJpY28gUm9tZXJvXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwcmVmZXJyZWRNZWRpYVR5cGVzO1xubW9kdWxlLmV4cG9ydHMucHJlZmVycmVkTWVkaWFUeXBlcyA9IHByZWZlcnJlZE1lZGlhVHlwZXM7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHNpbXBsZU1lZGlhVHlwZVJlZ0V4cCA9IC9eXFxzKihbXlxcc1xcLztdKylcXC8oW147XFxzXSspXFxzKig/OjsoLiopKT8kLztcblxuLyoqXG4gKiBQYXJzZSB0aGUgQWNjZXB0IGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VBY2NlcHQoYWNjZXB0KSB7XG4gIHZhciBhY2NlcHRzID0gc3BsaXRNZWRpYVR5cGVzKGFjY2VwdCk7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgYWNjZXB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtZWRpYVR5cGUgPSBwYXJzZU1lZGlhVHlwZShhY2NlcHRzW2ldLnRyaW0oKSwgaSk7XG5cbiAgICBpZiAobWVkaWFUeXBlKSB7XG4gICAgICBhY2NlcHRzW2orK10gPSBtZWRpYVR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gdHJpbSBhY2NlcHRzXG4gIGFjY2VwdHMubGVuZ3RoID0gajtcblxuICByZXR1cm4gYWNjZXB0cztcbn1cblxuLyoqXG4gKiBQYXJzZSBhIG1lZGlhIHR5cGUgZnJvbSB0aGUgQWNjZXB0IGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VNZWRpYVR5cGUoc3RyLCBpKSB7XG4gIHZhciBtYXRjaCA9IHNpbXBsZU1lZGlhVHlwZVJlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2YXIgcSA9IDE7XG4gIHZhciBzdWJ0eXBlID0gbWF0Y2hbMl07XG4gIHZhciB0eXBlID0gbWF0Y2hbMV07XG5cbiAgaWYgKG1hdGNoWzNdKSB7XG4gICAgdmFyIGt2cHMgPSBzcGxpdFBhcmFtZXRlcnMobWF0Y2hbM10pLm1hcChzcGxpdEtleVZhbHVlUGFpcik7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGt2cHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBwYWlyID0ga3Zwc1tqXTtcbiAgICAgIHZhciBrZXkgPSBwYWlyWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgdmFsID0gcGFpclsxXTtcblxuICAgICAgLy8gZ2V0IHRoZSB2YWx1ZSwgdW53cmFwcGluZyBxdW90ZXNcbiAgICAgIHZhciB2YWx1ZSA9IHZhbCAmJiB2YWxbMF0gPT09ICdcIicgJiYgdmFsW3ZhbC5sZW5ndGggLSAxXSA9PT0gJ1wiJ1xuICAgICAgICA/IHZhbC5zdWJzdHIoMSwgdmFsLmxlbmd0aCAtIDIpXG4gICAgICAgIDogdmFsO1xuXG4gICAgICBpZiAoa2V5ID09PSAncScpIHtcbiAgICAgICAgcSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gc3RvcmUgcGFyYW1ldGVyXG4gICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBzdWJ0eXBlOiBzdWJ0eXBlLFxuICAgIHBhcmFtczogcGFyYW1zLFxuICAgIHE6IHEsXG4gICAgaTogaVxuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJpb3JpdHkgb2YgYSBtZWRpYSB0eXBlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRNZWRpYVR5cGVQcmlvcml0eSh0eXBlLCBhY2NlcHRlZCwgaW5kZXgpIHtcbiAgdmFyIHByaW9yaXR5ID0ge286IC0xLCBxOiAwLCBzOiAwfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFjY2VwdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwZWMgPSBzcGVjaWZ5KHR5cGUsIGFjY2VwdGVkW2ldLCBpbmRleCk7XG5cbiAgICBpZiAoc3BlYyAmJiAocHJpb3JpdHkucyAtIHNwZWMucyB8fCBwcmlvcml0eS5xIC0gc3BlYy5xIHx8IHByaW9yaXR5Lm8gLSBzcGVjLm8pIDwgMCkge1xuICAgICAgcHJpb3JpdHkgPSBzcGVjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmlvcml0eTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNwZWNpZmljaXR5IG9mIHRoZSBtZWRpYSB0eXBlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzcGVjaWZ5KHR5cGUsIHNwZWMsIGluZGV4KSB7XG4gIHZhciBwID0gcGFyc2VNZWRpYVR5cGUodHlwZSk7XG4gIHZhciBzID0gMDtcblxuICBpZiAoIXApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmKHNwZWMudHlwZS50b0xvd2VyQ2FzZSgpID09IHAudHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcyB8PSA0XG4gIH0gZWxzZSBpZihzcGVjLnR5cGUgIT0gJyonKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZihzcGVjLnN1YnR5cGUudG9Mb3dlckNhc2UoKSA9PSBwLnN1YnR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgIHMgfD0gMlxuICB9IGVsc2UgaWYoc3BlYy5zdWJ0eXBlICE9ICcqJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzcGVjLnBhcmFtcyk7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoa2V5cy5ldmVyeShmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIHNwZWMucGFyYW1zW2tdID09ICcqJyB8fCAoc3BlYy5wYXJhbXNba10gfHwgJycpLnRvTG93ZXJDYXNlKCkgPT0gKHAucGFyYW1zW2tdIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIH0pKSB7XG4gICAgICBzIHw9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGk6IGluZGV4LFxuICAgIG86IHNwZWMuaSxcbiAgICBxOiBzcGVjLnEsXG4gICAgczogcyxcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgcHJlZmVycmVkIG1lZGlhIHR5cGVzIGZyb20gYW4gQWNjZXB0IGhlYWRlci5cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwcmVmZXJyZWRNZWRpYVR5cGVzKGFjY2VwdCwgcHJvdmlkZWQpIHtcbiAgLy8gUkZDIDI2MTYgc2VjIDE0LjI6IG5vIGhlYWRlciA9ICovKlxuICB2YXIgYWNjZXB0cyA9IHBhcnNlQWNjZXB0KGFjY2VwdCA9PT0gdW5kZWZpbmVkID8gJyovKicgOiBhY2NlcHQgfHwgJycpO1xuXG4gIGlmICghcHJvdmlkZWQpIHtcbiAgICAvLyBzb3J0ZWQgbGlzdCBvZiBhbGwgdHlwZXNcbiAgICByZXR1cm4gYWNjZXB0c1xuICAgICAgLmZpbHRlcihpc1F1YWxpdHkpXG4gICAgICAuc29ydChjb21wYXJlU3BlY3MpXG4gICAgICAubWFwKGdldEZ1bGxUeXBlKTtcbiAgfVxuXG4gIHZhciBwcmlvcml0aWVzID0gcHJvdmlkZWQubWFwKGZ1bmN0aW9uIGdldFByaW9yaXR5KHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGdldE1lZGlhVHlwZVByaW9yaXR5KHR5cGUsIGFjY2VwdHMsIGluZGV4KTtcbiAgfSk7XG5cbiAgLy8gc29ydGVkIGxpc3Qgb2YgYWNjZXB0ZWQgdHlwZXNcbiAgcmV0dXJuIHByaW9yaXRpZXMuZmlsdGVyKGlzUXVhbGl0eSkuc29ydChjb21wYXJlU3BlY3MpLm1hcChmdW5jdGlvbiBnZXRUeXBlKHByaW9yaXR5KSB7XG4gICAgcmV0dXJuIHByb3ZpZGVkW3ByaW9yaXRpZXMuaW5kZXhPZihwcmlvcml0eSldO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb21wYXJlIHR3byBzcGVjcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29tcGFyZVNwZWNzKGEsIGIpIHtcbiAgcmV0dXJuIChiLnEgLSBhLnEpIHx8IChiLnMgLSBhLnMpIHx8IChhLm8gLSBiLm8pIHx8IChhLmkgLSBiLmkpIHx8IDA7XG59XG5cbi8qKlxuICogR2V0IGZ1bGwgdHlwZSBzdHJpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEZ1bGxUeXBlKHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMudHlwZSArICcvJyArIHNwZWMuc3VidHlwZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHNwZWMgaGFzIGFueSBxdWFsaXR5LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc1F1YWxpdHkoc3BlYykge1xuICByZXR1cm4gc3BlYy5xID4gMDtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgbnVtYmVyIG9mIHF1b3RlcyBpbiBhIHN0cmluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcXVvdGVDb3VudChzdHJpbmcpIHtcbiAgdmFyIGNvdW50ID0gMDtcbiAgdmFyIGluZGV4ID0gMDtcblxuICB3aGlsZSAoKGluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1wiJywgaW5kZXgpKSAhPT0gLTEpIHtcbiAgICBjb3VudCsrO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICByZXR1cm4gY291bnQ7XG59XG5cbi8qKlxuICogU3BsaXQgYSBrZXkgdmFsdWUgcGFpci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRLZXlWYWx1ZVBhaXIoc3RyKSB7XG4gIHZhciBpbmRleCA9IHN0ci5pbmRleE9mKCc9Jyk7XG4gIHZhciBrZXk7XG4gIHZhciB2YWw7XG5cbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIGtleSA9IHN0cjtcbiAgfSBlbHNlIHtcbiAgICBrZXkgPSBzdHIuc3Vic3RyKDAsIGluZGV4KTtcbiAgICB2YWwgPSBzdHIuc3Vic3RyKGluZGV4ICsgMSk7XG4gIH1cblxuICByZXR1cm4gW2tleSwgdmFsXTtcbn1cblxuLyoqXG4gKiBTcGxpdCBhbiBBY2NlcHQgaGVhZGVyIGludG8gbWVkaWEgdHlwZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNwbGl0TWVkaWFUeXBlcyhhY2NlcHQpIHtcbiAgdmFyIGFjY2VwdHMgPSBhY2NlcHQuc3BsaXQoJywnKTtcblxuICBmb3IgKHZhciBpID0gMSwgaiA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHF1b3RlQ291bnQoYWNjZXB0c1tqXSkgJSAyID09IDApIHtcbiAgICAgIGFjY2VwdHNbKytqXSA9IGFjY2VwdHNbaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjY2VwdHNbal0gKz0gJywnICsgYWNjZXB0c1tpXTtcbiAgICB9XG4gIH1cblxuICAvLyB0cmltIGFjY2VwdHNcbiAgYWNjZXB0cy5sZW5ndGggPSBqICsgMTtcblxuICByZXR1cm4gYWNjZXB0cztcbn1cblxuLyoqXG4gKiBTcGxpdCBhIHN0cmluZyBvZiBwYXJhbWV0ZXJzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzcGxpdFBhcmFtZXRlcnMoc3RyKSB7XG4gIHZhciBwYXJhbWV0ZXJzID0gc3RyLnNwbGl0KCc7Jyk7XG5cbiAgZm9yICh2YXIgaSA9IDEsIGogPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChxdW90ZUNvdW50KHBhcmFtZXRlcnNbal0pICUgMiA9PSAwKSB7XG4gICAgICBwYXJhbWV0ZXJzWysral0gPSBwYXJhbWV0ZXJzW2ldO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbWV0ZXJzW2pdICs9ICc7JyArIHBhcmFtZXRlcnNbaV07XG4gICAgfVxuICB9XG5cbiAgLy8gdHJpbSBwYXJhbWV0ZXJzXG4gIHBhcmFtZXRlcnMubGVuZ3RoID0gaiArIDE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGFyYW1ldGVyc1tpXSA9IHBhcmFtZXRlcnNbaV0udHJpbSgpO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtZXRlcnM7XG59XG4iLCAiLyohXG4gKiBuZWdvdGlhdG9yXG4gKiBDb3B5cmlnaHQoYykgMjAxMiBGZWRlcmljbyBSb21lcm9cbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSXNhYWMgWi4gU2NobHVldGVyXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJlZmVycmVkQ2hhcnNldHMgPSByZXF1aXJlKCcuL2xpYi9jaGFyc2V0JylcbnZhciBwcmVmZXJyZWRFbmNvZGluZ3MgPSByZXF1aXJlKCcuL2xpYi9lbmNvZGluZycpXG52YXIgcHJlZmVycmVkTGFuZ3VhZ2VzID0gcmVxdWlyZSgnLi9saWIvbGFuZ3VhZ2UnKVxudmFyIHByZWZlcnJlZE1lZGlhVHlwZXMgPSByZXF1aXJlKCcuL2xpYi9tZWRpYVR5cGUnKVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gTmVnb3RpYXRvcjtcbm1vZHVsZS5leHBvcnRzLk5lZ290aWF0b3IgPSBOZWdvdGlhdG9yO1xuXG4vKipcbiAqIENyZWF0ZSBhIE5lZ290aWF0b3IgaW5zdGFuY2UgZnJvbSBhIHJlcXVlc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxdWVzdFxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIE5lZ290aWF0b3IocmVxdWVzdCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTmVnb3RpYXRvcikpIHtcbiAgICByZXR1cm4gbmV3IE5lZ290aWF0b3IocmVxdWVzdCk7XG4gIH1cblxuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xufVxuXG5OZWdvdGlhdG9yLnByb3RvdHlwZS5jaGFyc2V0ID0gZnVuY3Rpb24gY2hhcnNldChhdmFpbGFibGUpIHtcbiAgdmFyIHNldCA9IHRoaXMuY2hhcnNldHMoYXZhaWxhYmxlKTtcbiAgcmV0dXJuIHNldCAmJiBzZXRbMF07XG59O1xuXG5OZWdvdGlhdG9yLnByb3RvdHlwZS5jaGFyc2V0cyA9IGZ1bmN0aW9uIGNoYXJzZXRzKGF2YWlsYWJsZSkge1xuICByZXR1cm4gcHJlZmVycmVkQ2hhcnNldHModGhpcy5yZXF1ZXN0LmhlYWRlcnNbJ2FjY2VwdC1jaGFyc2V0J10sIGF2YWlsYWJsZSk7XG59O1xuXG5OZWdvdGlhdG9yLnByb3RvdHlwZS5lbmNvZGluZyA9IGZ1bmN0aW9uIGVuY29kaW5nKGF2YWlsYWJsZSkge1xuICB2YXIgc2V0ID0gdGhpcy5lbmNvZGluZ3MoYXZhaWxhYmxlKTtcbiAgcmV0dXJuIHNldCAmJiBzZXRbMF07XG59O1xuXG5OZWdvdGlhdG9yLnByb3RvdHlwZS5lbmNvZGluZ3MgPSBmdW5jdGlvbiBlbmNvZGluZ3MoYXZhaWxhYmxlKSB7XG4gIHJldHVybiBwcmVmZXJyZWRFbmNvZGluZ3ModGhpcy5yZXF1ZXN0LmhlYWRlcnNbJ2FjY2VwdC1lbmNvZGluZyddLCBhdmFpbGFibGUpO1xufTtcblxuTmVnb3RpYXRvci5wcm90b3R5cGUubGFuZ3VhZ2UgPSBmdW5jdGlvbiBsYW5ndWFnZShhdmFpbGFibGUpIHtcbiAgdmFyIHNldCA9IHRoaXMubGFuZ3VhZ2VzKGF2YWlsYWJsZSk7XG4gIHJldHVybiBzZXQgJiYgc2V0WzBdO1xufTtcblxuTmVnb3RpYXRvci5wcm90b3R5cGUubGFuZ3VhZ2VzID0gZnVuY3Rpb24gbGFuZ3VhZ2VzKGF2YWlsYWJsZSkge1xuICByZXR1cm4gcHJlZmVycmVkTGFuZ3VhZ2VzKHRoaXMucmVxdWVzdC5oZWFkZXJzWydhY2NlcHQtbGFuZ3VhZ2UnXSwgYXZhaWxhYmxlKTtcbn07XG5cbk5lZ290aWF0b3IucHJvdG90eXBlLm1lZGlhVHlwZSA9IGZ1bmN0aW9uIG1lZGlhVHlwZShhdmFpbGFibGUpIHtcbiAgdmFyIHNldCA9IHRoaXMubWVkaWFUeXBlcyhhdmFpbGFibGUpO1xuICByZXR1cm4gc2V0ICYmIHNldFswXTtcbn07XG5cbk5lZ290aWF0b3IucHJvdG90eXBlLm1lZGlhVHlwZXMgPSBmdW5jdGlvbiBtZWRpYVR5cGVzKGF2YWlsYWJsZSkge1xuICByZXR1cm4gcHJlZmVycmVkTWVkaWFUeXBlcyh0aGlzLnJlcXVlc3QuaGVhZGVycy5hY2NlcHQsIGF2YWlsYWJsZSk7XG59O1xuXG4vLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuTmVnb3RpYXRvci5wcm90b3R5cGUucHJlZmVycmVkQ2hhcnNldCA9IE5lZ290aWF0b3IucHJvdG90eXBlLmNoYXJzZXQ7XG5OZWdvdGlhdG9yLnByb3RvdHlwZS5wcmVmZXJyZWRDaGFyc2V0cyA9IE5lZ290aWF0b3IucHJvdG90eXBlLmNoYXJzZXRzO1xuTmVnb3RpYXRvci5wcm90b3R5cGUucHJlZmVycmVkRW5jb2RpbmcgPSBOZWdvdGlhdG9yLnByb3RvdHlwZS5lbmNvZGluZztcbk5lZ290aWF0b3IucHJvdG90eXBlLnByZWZlcnJlZEVuY29kaW5ncyA9IE5lZ290aWF0b3IucHJvdG90eXBlLmVuY29kaW5ncztcbk5lZ290aWF0b3IucHJvdG90eXBlLnByZWZlcnJlZExhbmd1YWdlID0gTmVnb3RpYXRvci5wcm90b3R5cGUubGFuZ3VhZ2U7XG5OZWdvdGlhdG9yLnByb3RvdHlwZS5wcmVmZXJyZWRMYW5ndWFnZXMgPSBOZWdvdGlhdG9yLnByb3RvdHlwZS5sYW5ndWFnZXM7XG5OZWdvdGlhdG9yLnByb3RvdHlwZS5wcmVmZXJyZWRNZWRpYVR5cGUgPSBOZWdvdGlhdG9yLnByb3RvdHlwZS5tZWRpYVR5cGU7XG5OZWdvdGlhdG9yLnByb3RvdHlwZS5wcmVmZXJyZWRNZWRpYVR5cGVzID0gTmVnb3RpYXRvci5wcm90b3R5cGUubWVkaWFUeXBlcztcbiIsICIvKiFcbiAqIGFjY2VwdHNcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBOZWdvdGlhdG9yID0gcmVxdWlyZSgnbmVnb3RpYXRvcicpXG52YXIgbWltZSA9IHJlcXVpcmUoJ21pbWUtdHlwZXMnKVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gQWNjZXB0c1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBBY2NlcHRzIG9iamVjdCBmb3IgdGhlIGdpdmVuIHJlcS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gQWNjZXB0cyAocmVxKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBY2NlcHRzKSkge1xuICAgIHJldHVybiBuZXcgQWNjZXB0cyhyZXEpXG4gIH1cblxuICB0aGlzLmhlYWRlcnMgPSByZXEuaGVhZGVyc1xuICB0aGlzLm5lZ290aWF0b3IgPSBuZXcgTmVnb3RpYXRvcihyZXEpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIGB0eXBlKHMpYCBpcyBhY2NlcHRhYmxlLCByZXR1cm5pbmdcbiAqIHRoZSBiZXN0IG1hdGNoIHdoZW4gdHJ1ZSwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLCBpbiB3aGljaFxuICogY2FzZSB5b3Ugc2hvdWxkIHJlc3BvbmQgd2l0aCA0MDYgXCJOb3QgQWNjZXB0YWJsZVwiLlxuICpcbiAqIFRoZSBgdHlwZWAgdmFsdWUgbWF5IGJlIGEgc2luZ2xlIG1pbWUgdHlwZSBzdHJpbmdcbiAqIHN1Y2ggYXMgXCJhcHBsaWNhdGlvbi9qc29uXCIsIHRoZSBleHRlbnNpb24gbmFtZVxuICogc3VjaCBhcyBcImpzb25cIiBvciBhbiBhcnJheSBgW1wianNvblwiLCBcImh0bWxcIiwgXCJ0ZXh0L3BsYWluXCJdYC4gV2hlbiBhIGxpc3RcbiAqIG9yIGFycmF5IGlzIGdpdmVuIHRoZSBfYmVzdF8gbWF0Y2gsIGlmIGFueSBpcyByZXR1cm5lZC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0L2h0bWxcbiAqICAgICB0aGlzLnR5cGVzKCdodG1sJyk7XG4gKiAgICAgLy8gPT4gXCJodG1sXCJcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0LyosIGFwcGxpY2F0aW9uL2pzb25cbiAqICAgICB0aGlzLnR5cGVzKCdodG1sJyk7XG4gKiAgICAgLy8gPT4gXCJodG1sXCJcbiAqICAgICB0aGlzLnR5cGVzKCd0ZXh0L2h0bWwnKTtcbiAqICAgICAvLyA9PiBcInRleHQvaHRtbFwiXG4gKiAgICAgdGhpcy50eXBlcygnanNvbicsICd0ZXh0Jyk7XG4gKiAgICAgLy8gPT4gXCJqc29uXCJcbiAqICAgICB0aGlzLnR5cGVzKCdhcHBsaWNhdGlvbi9qc29uJyk7XG4gKiAgICAgLy8gPT4gXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0LyosIGFwcGxpY2F0aW9uL2pzb25cbiAqICAgICB0aGlzLnR5cGVzKCdpbWFnZS9wbmcnKTtcbiAqICAgICB0aGlzLnR5cGVzKCdwbmcnKTtcbiAqICAgICAvLyA9PiB1bmRlZmluZWRcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0Lyo7cT0uNSwgYXBwbGljYXRpb24vanNvblxuICogICAgIHRoaXMudHlwZXMoWydodG1sJywgJ2pzb24nXSk7XG4gKiAgICAgdGhpcy50eXBlcygnaHRtbCcsICdqc29uJyk7XG4gKiAgICAgLy8gPT4gXCJqc29uXCJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gdHlwZXMuLi5cbiAqIEByZXR1cm4ge1N0cmluZ3xBcnJheXxCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbkFjY2VwdHMucHJvdG90eXBlLnR5cGUgPVxuQWNjZXB0cy5wcm90b3R5cGUudHlwZXMgPSBmdW5jdGlvbiAodHlwZXNfKSB7XG4gIHZhciB0eXBlcyA9IHR5cGVzX1xuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAodHlwZXMgJiYgIUFycmF5LmlzQXJyYXkodHlwZXMpKSB7XG4gICAgdHlwZXMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vIHR5cGVzLCByZXR1cm4gYWxsIHJlcXVlc3RlZCB0eXBlc1xuICBpZiAoIXR5cGVzIHx8IHR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0aGlzLm5lZ290aWF0b3IubWVkaWFUeXBlcygpXG4gIH1cblxuICAvLyBubyBhY2NlcHQgaGVhZGVyLCByZXR1cm4gZmlyc3QgZ2l2ZW4gdHlwZVxuICBpZiAoIXRoaXMuaGVhZGVycy5hY2NlcHQpIHtcbiAgICByZXR1cm4gdHlwZXNbMF1cbiAgfVxuXG4gIHZhciBtaW1lcyA9IHR5cGVzLm1hcChleHRUb01pbWUpXG4gIHZhciBhY2NlcHRzID0gdGhpcy5uZWdvdGlhdG9yLm1lZGlhVHlwZXMobWltZXMuZmlsdGVyKHZhbGlkTWltZSkpXG4gIHZhciBmaXJzdCA9IGFjY2VwdHNbMF1cblxuICByZXR1cm4gZmlyc3RcbiAgICA/IHR5cGVzW21pbWVzLmluZGV4T2YoZmlyc3QpXVxuICAgIDogZmFsc2Vcbn1cblxuLyoqXG4gKiBSZXR1cm4gYWNjZXB0ZWQgZW5jb2RpbmdzIG9yIGJlc3QgZml0IGJhc2VkIG9uIGBlbmNvZGluZ3NgLlxuICpcbiAqIEdpdmVuIGBBY2NlcHQtRW5jb2Rpbmc6IGd6aXAsIGRlZmxhdGVgXG4gKiBhbiBhcnJheSBzb3J0ZWQgYnkgcXVhbGl0eSBpcyByZXR1cm5lZDpcbiAqXG4gKiAgICAgWydnemlwJywgJ2RlZmxhdGUnXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBlbmNvZGluZ3MuLi5cbiAqIEByZXR1cm4ge1N0cmluZ3xBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5BY2NlcHRzLnByb3RvdHlwZS5lbmNvZGluZyA9XG5BY2NlcHRzLnByb3RvdHlwZS5lbmNvZGluZ3MgPSBmdW5jdGlvbiAoZW5jb2RpbmdzXykge1xuICB2YXIgZW5jb2RpbmdzID0gZW5jb2RpbmdzX1xuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAoZW5jb2RpbmdzICYmICFBcnJheS5pc0FycmF5KGVuY29kaW5ncykpIHtcbiAgICBlbmNvZGluZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuY29kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgZW5jb2RpbmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuICB9XG5cbiAgLy8gbm8gZW5jb2RpbmdzLCByZXR1cm4gYWxsIHJlcXVlc3RlZCBlbmNvZGluZ3NcbiAgaWYgKCFlbmNvZGluZ3MgfHwgZW5jb2RpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0aGlzLm5lZ290aWF0b3IuZW5jb2RpbmdzKClcbiAgfVxuXG4gIHJldHVybiB0aGlzLm5lZ290aWF0b3IuZW5jb2RpbmdzKGVuY29kaW5ncylbMF0gfHwgZmFsc2Vcbn1cblxuLyoqXG4gKiBSZXR1cm4gYWNjZXB0ZWQgY2hhcnNldHMgb3IgYmVzdCBmaXQgYmFzZWQgb24gYGNoYXJzZXRzYC5cbiAqXG4gKiBHaXZlbiBgQWNjZXB0LUNoYXJzZXQ6IHV0Zi04LCBpc28tODg1OS0xO3E9MC4yLCB1dGYtNztxPTAuNWBcbiAqIGFuIGFycmF5IHNvcnRlZCBieSBxdWFsaXR5IGlzIHJldHVybmVkOlxuICpcbiAqICAgICBbJ3V0Zi04JywgJ3V0Zi03JywgJ2lzby04ODU5LTEnXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBjaGFyc2V0cy4uLlxuICogQHJldHVybiB7U3RyaW5nfEFycmF5fVxuICogQHB1YmxpY1xuICovXG5cbkFjY2VwdHMucHJvdG90eXBlLmNoYXJzZXQgPVxuQWNjZXB0cy5wcm90b3R5cGUuY2hhcnNldHMgPSBmdW5jdGlvbiAoY2hhcnNldHNfKSB7XG4gIHZhciBjaGFyc2V0cyA9IGNoYXJzZXRzX1xuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAoY2hhcnNldHMgJiYgIUFycmF5LmlzQXJyYXkoY2hhcnNldHMpKSB7XG4gICAgY2hhcnNldHMgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGFyc2V0c1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vIGNoYXJzZXRzLCByZXR1cm4gYWxsIHJlcXVlc3RlZCBjaGFyc2V0c1xuICBpZiAoIWNoYXJzZXRzIHx8IGNoYXJzZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0aGlzLm5lZ290aWF0b3IuY2hhcnNldHMoKVxuICB9XG5cbiAgcmV0dXJuIHRoaXMubmVnb3RpYXRvci5jaGFyc2V0cyhjaGFyc2V0cylbMF0gfHwgZmFsc2Vcbn1cblxuLyoqXG4gKiBSZXR1cm4gYWNjZXB0ZWQgbGFuZ3VhZ2VzIG9yIGJlc3QgZml0IGJhc2VkIG9uIGBsYW5nc2AuXG4gKlxuICogR2l2ZW4gYEFjY2VwdC1MYW5ndWFnZTogZW47cT0wLjgsIGVzLCBwdGBcbiAqIGFuIGFycmF5IHNvcnRlZCBieSBxdWFsaXR5IGlzIHJldHVybmVkOlxuICpcbiAqICAgICBbJ2VzJywgJ3B0JywgJ2VuJ11cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gbGFuZ3MuLi5cbiAqIEByZXR1cm4ge0FycmF5fFN0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5BY2NlcHRzLnByb3RvdHlwZS5sYW5nID1cbkFjY2VwdHMucHJvdG90eXBlLmxhbmdzID1cbkFjY2VwdHMucHJvdG90eXBlLmxhbmd1YWdlID1cbkFjY2VwdHMucHJvdG90eXBlLmxhbmd1YWdlcyA9IGZ1bmN0aW9uIChsYW5ndWFnZXNfKSB7XG4gIHZhciBsYW5ndWFnZXMgPSBsYW5ndWFnZXNfXG5cbiAgLy8gc3VwcG9ydCBmbGF0dGVuZWQgYXJndW1lbnRzXG4gIGlmIChsYW5ndWFnZXMgJiYgIUFycmF5LmlzQXJyYXkobGFuZ3VhZ2VzKSkge1xuICAgIGxhbmd1YWdlcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsYW5ndWFnZXNbaV0gPSBhcmd1bWVudHNbaV1cbiAgICB9XG4gIH1cblxuICAvLyBubyBsYW5ndWFnZXMsIHJldHVybiBhbGwgcmVxdWVzdGVkIGxhbmd1YWdlc1xuICBpZiAoIWxhbmd1YWdlcyB8fCBsYW5ndWFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRoaXMubmVnb3RpYXRvci5sYW5ndWFnZXMoKVxuICB9XG5cbiAgcmV0dXJuIHRoaXMubmVnb3RpYXRvci5sYW5ndWFnZXMobGFuZ3VhZ2VzKVswXSB8fCBmYWxzZVxufVxuXG4vKipcbiAqIENvbnZlcnQgZXh0bmFtZXMgdG8gbWltZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBleHRUb01pbWUgKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gbWltZS5sb29rdXAodHlwZSlcbiAgICA6IHR5cGVcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBtaW1lIGlzIHZhbGlkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHZhbGlkTWltZSAodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnXG59XG4iLCAiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBhY2NlcHRzID0gcmVxdWlyZSgnYWNjZXB0cycpO1xudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnZXhwcmVzcycpO1xudmFyIGlzSVAgPSByZXF1aXJlKCduZXQnKS5pc0lQO1xudmFyIHR5cGVpcyA9IHJlcXVpcmUoJ3R5cGUtaXMnKTtcbnZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xudmFyIGZyZXNoID0gcmVxdWlyZSgnZnJlc2gnKTtcbnZhciBwYXJzZVJhbmdlID0gcmVxdWlyZSgncmFuZ2UtcGFyc2VyJyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCdwYXJzZXVybCcpO1xudmFyIHByb3h5YWRkciA9IHJlcXVpcmUoJ3Byb3h5LWFkZHInKTtcblxuLyoqXG4gKiBSZXF1ZXN0IHByb3RvdHlwZS5cbiAqIEBwdWJsaWNcbiAqL1xuXG52YXIgcmVxID0gT2JqZWN0LmNyZWF0ZShodHRwLkluY29taW5nTWVzc2FnZS5wcm90b3R5cGUpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXFcblxuLyoqXG4gKiBSZXR1cm4gcmVxdWVzdCBoZWFkZXIuXG4gKlxuICogVGhlIGBSZWZlcnJlcmAgaGVhZGVyIGZpZWxkIGlzIHNwZWNpYWwtY2FzZWQsXG4gKiBib3RoIGBSZWZlcnJlcmAgYW5kIGBSZWZlcmVyYCBhcmUgaW50ZXJjaGFuZ2VhYmxlLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICByZXEuZ2V0KCdDb250ZW50LVR5cGUnKTtcbiAqICAgICAvLyA9PiBcInRleHQvcGxhaW5cIlxuICpcbiAqICAgICByZXEuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAqICAgICAvLyA9PiBcInRleHQvcGxhaW5cIlxuICpcbiAqICAgICByZXEuZ2V0KCdTb21ldGhpbmcnKTtcbiAqICAgICAvLyA9PiB1bmRlZmluZWRcbiAqXG4gKiBBbGlhc2VkIGFzIGByZXEuaGVhZGVyKClgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmdldCA9XG5yZXEuaGVhZGVyID0gZnVuY3Rpb24gaGVhZGVyKG5hbWUpIHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbmFtZSBhcmd1bWVudCBpcyByZXF1aXJlZCB0byByZXEuZ2V0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbmFtZSBtdXN0IGJlIGEgc3RyaW5nIHRvIHJlcS5nZXQnKTtcbiAgfVxuXG4gIHZhciBsYyA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICBzd2l0Y2ggKGxjKSB7XG4gICAgY2FzZSAncmVmZXJlcic6XG4gICAgY2FzZSAncmVmZXJyZXInOlxuICAgICAgcmV0dXJuIHRoaXMuaGVhZGVycy5yZWZlcnJlclxuICAgICAgICB8fCB0aGlzLmhlYWRlcnMucmVmZXJlcjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyc1tsY107XG4gIH1cbn07XG5cbi8qKlxuICogVG8gZG86IHVwZGF0ZSBkb2NzLlxuICpcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBgdHlwZShzKWAgaXMgYWNjZXB0YWJsZSwgcmV0dXJuaW5nXG4gKiB0aGUgYmVzdCBtYXRjaCB3aGVuIHRydWUsIG90aGVyd2lzZSBgdW5kZWZpbmVkYCwgaW4gd2hpY2hcbiAqIGNhc2UgeW91IHNob3VsZCByZXNwb25kIHdpdGggNDA2IFwiTm90IEFjY2VwdGFibGVcIi5cbiAqXG4gKiBUaGUgYHR5cGVgIHZhbHVlIG1heSBiZSBhIHNpbmdsZSBNSU1FIHR5cGUgc3RyaW5nXG4gKiBzdWNoIGFzIFwiYXBwbGljYXRpb24vanNvblwiLCBhbiBleHRlbnNpb24gbmFtZVxuICogc3VjaCBhcyBcImpzb25cIiwgYSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBzdWNoIGFzIFwianNvbiwgaHRtbCwgdGV4dC9wbGFpblwiLFxuICogYW4gYXJndW1lbnQgbGlzdCBzdWNoIGFzIGBcImpzb25cIiwgXCJodG1sXCIsIFwidGV4dC9wbGFpblwiYCxcbiAqIG9yIGFuIGFycmF5IGBbXCJqc29uXCIsIFwiaHRtbFwiLCBcInRleHQvcGxhaW5cIl1gLiBXaGVuIGEgbGlzdFxuICogb3IgYXJyYXkgaXMgZ2l2ZW4sIHRoZSBfYmVzdF8gbWF0Y2gsIGlmIGFueSBpcyByZXR1cm5lZC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0L2h0bWxcbiAqICAgICByZXEuYWNjZXB0cygnaHRtbCcpO1xuICogICAgIC8vID0+IFwiaHRtbFwiXG4gKlxuICogICAgIC8vIEFjY2VwdDogdGV4dC8qLCBhcHBsaWNhdGlvbi9qc29uXG4gKiAgICAgcmVxLmFjY2VwdHMoJ2h0bWwnKTtcbiAqICAgICAvLyA9PiBcImh0bWxcIlxuICogICAgIHJlcS5hY2NlcHRzKCd0ZXh0L2h0bWwnKTtcbiAqICAgICAvLyA9PiBcInRleHQvaHRtbFwiXG4gKiAgICAgcmVxLmFjY2VwdHMoJ2pzb24sIHRleHQnKTtcbiAqICAgICAvLyA9PiBcImpzb25cIlxuICogICAgIHJlcS5hY2NlcHRzKCdhcHBsaWNhdGlvbi9qc29uJyk7XG4gKiAgICAgLy8gPT4gXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0LyosIGFwcGxpY2F0aW9uL2pzb25cbiAqICAgICByZXEuYWNjZXB0cygnaW1hZ2UvcG5nJyk7XG4gKiAgICAgcmVxLmFjY2VwdHMoJ3BuZycpO1xuICogICAgIC8vID0+IHVuZGVmaW5lZFxuICpcbiAqICAgICAvLyBBY2NlcHQ6IHRleHQvKjtxPS41LCBhcHBsaWNhdGlvbi9qc29uXG4gKiAgICAgcmVxLmFjY2VwdHMoWydodG1sJywgJ2pzb24nXSk7XG4gKiAgICAgcmVxLmFjY2VwdHMoJ2h0bWwnLCAnanNvbicpO1xuICogICAgIHJlcS5hY2NlcHRzKCdodG1sLCBqc29uJyk7XG4gKiAgICAgLy8gPT4gXCJqc29uXCJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gdHlwZShzKVxuICogQHJldHVybiB7U3RyaW5nfEFycmF5fEJvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmFjY2VwdHMgPSBmdW5jdGlvbigpe1xuICB2YXIgYWNjZXB0ID0gYWNjZXB0cyh0aGlzKTtcbiAgcmV0dXJuIGFjY2VwdC50eXBlcy5hcHBseShhY2NlcHQsIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBgZW5jb2RpbmdgcyBhcmUgYWNjZXB0ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IC4uLmVuY29kaW5nXG4gKiBAcmV0dXJuIHtTdHJpbmd8QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmFjY2VwdHNFbmNvZGluZ3MgPSBmdW5jdGlvbigpe1xuICB2YXIgYWNjZXB0ID0gYWNjZXB0cyh0aGlzKTtcbiAgcmV0dXJuIGFjY2VwdC5lbmNvZGluZ3MuYXBwbHkoYWNjZXB0LCBhcmd1bWVudHMpO1xufTtcblxucmVxLmFjY2VwdHNFbmNvZGluZyA9IGRlcHJlY2F0ZS5mdW5jdGlvbihyZXEuYWNjZXB0c0VuY29kaW5ncyxcbiAgJ3JlcS5hY2NlcHRzRW5jb2Rpbmc6IFVzZSBhY2NlcHRzRW5jb2RpbmdzIGluc3RlYWQnKTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gYGNoYXJzZXRgcyBhcmUgYWNjZXB0YWJsZSxcbiAqIG90aGVyd2lzZSB5b3Ugc2hvdWxkIHJlc3BvbmQgd2l0aCA0MDYgXCJOb3QgQWNjZXB0YWJsZVwiLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSAuLi5jaGFyc2V0XG4gKiBAcmV0dXJuIHtTdHJpbmd8QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmFjY2VwdHNDaGFyc2V0cyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBhY2NlcHQgPSBhY2NlcHRzKHRoaXMpO1xuICByZXR1cm4gYWNjZXB0LmNoYXJzZXRzLmFwcGx5KGFjY2VwdCwgYXJndW1lbnRzKTtcbn07XG5cbnJlcS5hY2NlcHRzQ2hhcnNldCA9IGRlcHJlY2F0ZS5mdW5jdGlvbihyZXEuYWNjZXB0c0NoYXJzZXRzLFxuICAncmVxLmFjY2VwdHNDaGFyc2V0OiBVc2UgYWNjZXB0c0NoYXJzZXRzIGluc3RlYWQnKTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gYGxhbmdgcyBhcmUgYWNjZXB0YWJsZSxcbiAqIG90aGVyd2lzZSB5b3Ugc2hvdWxkIHJlc3BvbmQgd2l0aCA0MDYgXCJOb3QgQWNjZXB0YWJsZVwiLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSAuLi5sYW5nXG4gKiBAcmV0dXJuIHtTdHJpbmd8QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmFjY2VwdHNMYW5ndWFnZXMgPSBmdW5jdGlvbigpe1xuICB2YXIgYWNjZXB0ID0gYWNjZXB0cyh0aGlzKTtcbiAgcmV0dXJuIGFjY2VwdC5sYW5ndWFnZXMuYXBwbHkoYWNjZXB0LCBhcmd1bWVudHMpO1xufTtcblxucmVxLmFjY2VwdHNMYW5ndWFnZSA9IGRlcHJlY2F0ZS5mdW5jdGlvbihyZXEuYWNjZXB0c0xhbmd1YWdlcyxcbiAgJ3JlcS5hY2NlcHRzTGFuZ3VhZ2U6IFVzZSBhY2NlcHRzTGFuZ3VhZ2VzIGluc3RlYWQnKTtcblxuLyoqXG4gKiBQYXJzZSBSYW5nZSBoZWFkZXIgZmllbGQsIGNhcHBpbmcgdG8gdGhlIGdpdmVuIGBzaXplYC5cbiAqXG4gKiBVbnNwZWNpZmllZCByYW5nZXMgc3VjaCBhcyBcIjAtXCIgcmVxdWlyZSBrbm93bGVkZ2Ugb2YgeW91ciByZXNvdXJjZSBsZW5ndGguIEluXG4gKiB0aGUgY2FzZSBvZiBhIGJ5dGUgcmFuZ2UgdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcy4gSWYgdGhlXG4gKiBSYW5nZSBoZWFkZXIgZmllbGQgaXMgbm90IGdpdmVuIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLCBgLTFgIHdoZW4gdW5zYXRpc2ZpYWJsZSxcbiAqIGFuZCBgLTJgIHdoZW4gc3ludGFjdGljYWxseSBpbnZhbGlkLlxuICpcbiAqIFdoZW4gcmFuZ2VzIGFyZSByZXR1cm5lZCwgdGhlIGFycmF5IGhhcyBhIFwidHlwZVwiIHByb3BlcnR5IHdoaWNoIGlzIHRoZSB0eXBlIG9mXG4gKiByYW5nZSB0aGF0IGlzIHJlcXVpcmVkIChtb3N0IGNvbW1vbmx5LCBcImJ5dGVzXCIpLiBFYWNoIGFycmF5IGVsZW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIGEgXCJzdGFydFwiIGFuZCBcImVuZFwiIHByb3BlcnR5IGZvciB0aGUgcG9ydGlvbiBvZiB0aGUgcmFuZ2UuXG4gKlxuICogVGhlIFwiY29tYmluZVwiIG9wdGlvbiBjYW4gYmUgc2V0IHRvIGB0cnVlYCBhbmQgb3ZlcmxhcHBpbmcgJiBhZGphY2VudCByYW5nZXNcbiAqIHdpbGwgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSByYW5nZS5cbiAqXG4gKiBOT1RFOiByZW1lbWJlciB0aGF0IHJhbmdlcyBhcmUgaW5jbHVzaXZlLCBzbyBmb3IgZXhhbXBsZSBcIlJhbmdlOiB1c2Vycz0wLTNcIlxuICogc2hvdWxkIHJlc3BvbmQgd2l0aCA0IHVzZXJzIHdoZW4gYXZhaWxhYmxlLCBub3QgMy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jb21iaW5lPWZhbHNlXVxuICogQHJldHVybiB7bnVtYmVyfGFycmF5fVxuICogQHB1YmxpY1xuICovXG5cbnJlcS5yYW5nZSA9IGZ1bmN0aW9uIHJhbmdlKHNpemUsIG9wdGlvbnMpIHtcbiAgdmFyIHJhbmdlID0gdGhpcy5nZXQoJ1JhbmdlJyk7XG4gIGlmICghcmFuZ2UpIHJldHVybjtcbiAgcmV0dXJuIHBhcnNlUmFuZ2Uoc2l6ZSwgcmFuZ2UsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHBhcmFtIGBuYW1lYCB3aGVuIHByZXNlbnQgb3IgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogIC0gQ2hlY2tzIHJvdXRlIHBsYWNlaG9sZGVycywgZXg6IF8vdXNlci86aWRfXG4gKiAgLSBDaGVja3MgYm9keSBwYXJhbXMsIGV4OiBpZD0xMiwge1wiaWRcIjoxMn1cbiAqICAtIENoZWNrcyBxdWVyeSBzdHJpbmcgcGFyYW1zLCBleDogP2lkPTEyXG4gKlxuICogVG8gdXRpbGl6ZSByZXF1ZXN0IGJvZGllcywgYHJlcS5ib2R5YFxuICogc2hvdWxkIGJlIGFuIG9iamVjdC4gVGhpcyBjYW4gYmUgZG9uZSBieSB1c2luZ1xuICogdGhlIGBib2R5UGFyc2VyKClgIG1pZGRsZXdhcmUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7TWl4ZWR9IFtkZWZhdWx0VmFsdWVdXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLnBhcmFtID0gZnVuY3Rpb24gcGFyYW0obmFtZSwgZGVmYXVsdFZhbHVlKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLnBhcmFtcyB8fCB7fTtcbiAgdmFyIGJvZHkgPSB0aGlzLmJvZHkgfHwge307XG4gIHZhciBxdWVyeSA9IHRoaXMucXVlcnkgfHwge307XG5cbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgPyAnbmFtZSdcbiAgICA6ICduYW1lLCBkZWZhdWx0JztcbiAgZGVwcmVjYXRlKCdyZXEucGFyYW0oJyArIGFyZ3MgKyAnKTogVXNlIHJlcS5wYXJhbXMsIHJlcS5ib2R5LCBvciByZXEucXVlcnkgaW5zdGVhZCcpO1xuXG4gIGlmIChudWxsICE9IHBhcmFtc1tuYW1lXSAmJiBwYXJhbXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHJldHVybiBwYXJhbXNbbmFtZV07XG4gIGlmIChudWxsICE9IGJvZHlbbmFtZV0pIHJldHVybiBib2R5W25hbWVdO1xuICBpZiAobnVsbCAhPSBxdWVyeVtuYW1lXSkgcmV0dXJuIHF1ZXJ5W25hbWVdO1xuXG4gIHJldHVybiBkZWZhdWx0VmFsdWU7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBpbmNvbWluZyByZXF1ZXN0IGNvbnRhaW5zIHRoZSBcIkNvbnRlbnQtVHlwZVwiXG4gKiBoZWFkZXIgZmllbGQsIGFuZCBpdCBjb250YWlucyB0aGUgZ2l2ZW4gbWltZSBgdHlwZWAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgICAvLyBXaXRoIENvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XG4gKiAgICAgIHJlcS5pcygnaHRtbCcpO1xuICogICAgICByZXEuaXMoJ3RleHQvaHRtbCcpO1xuICogICAgICByZXEuaXMoJ3RleHQvKicpO1xuICogICAgICAvLyA9PiB0cnVlXG4gKlxuICogICAgICAvLyBXaGVuIENvbnRlbnQtVHlwZSBpcyBhcHBsaWNhdGlvbi9qc29uXG4gKiAgICAgIHJlcS5pcygnanNvbicpO1xuICogICAgICByZXEuaXMoJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAqICAgICAgcmVxLmlzKCdhcHBsaWNhdGlvbi8qJyk7XG4gKiAgICAgIC8vID0+IHRydWVcbiAqXG4gKiAgICAgIHJlcS5pcygnaHRtbCcpO1xuICogICAgICAvLyA9PiBmYWxzZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSB0eXBlcy4uLlxuICogQHJldHVybiB7U3RyaW5nfGZhbHNlfG51bGx9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLmlzID0gZnVuY3Rpb24gaXModHlwZXMpIHtcbiAgdmFyIGFyciA9IHR5cGVzO1xuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAoIUFycmF5LmlzQXJyYXkodHlwZXMpKSB7XG4gICAgYXJyID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcnJbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHR5cGVpcyh0aGlzLCBhcnIpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHByb3RvY29sIHN0cmluZyBcImh0dHBcIiBvciBcImh0dHBzXCJcbiAqIHdoZW4gcmVxdWVzdGVkIHdpdGggVExTLiBXaGVuIHRoZSBcInRydXN0IHByb3h5XCJcbiAqIHNldHRpbmcgdHJ1c3RzIHRoZSBzb2NrZXQgYWRkcmVzcywgdGhlXG4gKiBcIlgtRm9yd2FyZGVkLVByb3RvXCIgaGVhZGVyIGZpZWxkIHdpbGwgYmUgdHJ1c3RlZFxuICogYW5kIHVzZWQgaWYgcHJlc2VudC5cbiAqXG4gKiBJZiB5b3UncmUgcnVubmluZyBiZWhpbmQgYSByZXZlcnNlIHByb3h5IHRoYXRcbiAqIHN1cHBsaWVzIGh0dHBzIGZvciB5b3UgdGhpcyBtYXkgYmUgZW5hYmxlZC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ3Byb3RvY29sJywgZnVuY3Rpb24gcHJvdG9jb2woKXtcbiAgdmFyIHByb3RvID0gdGhpcy5jb25uZWN0aW9uLmVuY3J5cHRlZFxuICAgID8gJ2h0dHBzJ1xuICAgIDogJ2h0dHAnO1xuICB2YXIgdHJ1c3QgPSB0aGlzLmFwcC5nZXQoJ3RydXN0IHByb3h5IGZuJyk7XG5cbiAgaWYgKCF0cnVzdCh0aGlzLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcywgMCkpIHtcbiAgICByZXR1cm4gcHJvdG87XG4gIH1cblxuICAvLyBOb3RlOiBYLUZvcndhcmRlZC1Qcm90byBpcyBub3JtYWxseSBvbmx5IGV2ZXIgYVxuICAvLyAgICAgICBzaW5nbGUgdmFsdWUsIGJ1dCB0aGlzIGlzIHRvIGJlIHNhZmUuXG4gIHZhciBoZWFkZXIgPSB0aGlzLmdldCgnWC1Gb3J3YXJkZWQtUHJvdG8nKSB8fCBwcm90b1xuICB2YXIgaW5kZXggPSBoZWFkZXIuaW5kZXhPZignLCcpXG5cbiAgcmV0dXJuIGluZGV4ICE9PSAtMVxuICAgID8gaGVhZGVyLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpXG4gICAgOiBoZWFkZXIudHJpbSgpXG59KTtcblxuLyoqXG4gKiBTaG9ydC1oYW5kIGZvcjpcbiAqXG4gKiAgICByZXEucHJvdG9jb2wgPT09ICdodHRwcydcbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmRlZmluZUdldHRlcihyZXEsICdzZWN1cmUnLCBmdW5jdGlvbiBzZWN1cmUoKXtcbiAgcmV0dXJuIHRoaXMucHJvdG9jb2wgPT09ICdodHRwcyc7XG59KTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIHJlbW90ZSBhZGRyZXNzIGZyb20gdGhlIHRydXN0ZWQgcHJveHkuXG4gKlxuICogVGhlIGlzIHRoZSByZW1vdGUgYWRkcmVzcyBvbiB0aGUgc29ja2V0IHVubGVzc1xuICogXCJ0cnVzdCBwcm94eVwiIGlzIHNldC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ2lwJywgZnVuY3Rpb24gaXAoKXtcbiAgdmFyIHRydXN0ID0gdGhpcy5hcHAuZ2V0KCd0cnVzdCBwcm94eSBmbicpO1xuICByZXR1cm4gcHJveHlhZGRyKHRoaXMsIHRydXN0KTtcbn0pO1xuXG4vKipcbiAqIFdoZW4gXCJ0cnVzdCBwcm94eVwiIGlzIHNldCwgdHJ1c3RlZCBwcm94eSBhZGRyZXNzZXMgKyBjbGllbnQuXG4gKlxuICogRm9yIGV4YW1wbGUgaWYgdGhlIHZhbHVlIHdlcmUgXCJjbGllbnQsIHByb3h5MSwgcHJveHkyXCJcbiAqIHlvdSB3b3VsZCByZWNlaXZlIHRoZSBhcnJheSBgW1wiY2xpZW50XCIsIFwicHJveHkxXCIsIFwicHJveHkyXCJdYFxuICogd2hlcmUgXCJwcm94eTJcIiBpcyB0aGUgZnVydGhlc3QgZG93bi1zdHJlYW0gYW5kIFwicHJveHkxXCIgYW5kXG4gKiBcInByb3h5MlwiIHdlcmUgdHJ1c3RlZC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5kZWZpbmVHZXR0ZXIocmVxLCAnaXBzJywgZnVuY3Rpb24gaXBzKCkge1xuICB2YXIgdHJ1c3QgPSB0aGlzLmFwcC5nZXQoJ3RydXN0IHByb3h5IGZuJyk7XG4gIHZhciBhZGRycyA9IHByb3h5YWRkci5hbGwodGhpcywgdHJ1c3QpO1xuXG4gIC8vIHJldmVyc2UgdGhlIG9yZGVyICh0byBmYXJ0aGVzdCAtPiBjbG9zZXN0KVxuICAvLyBhbmQgcmVtb3ZlIHNvY2tldCBhZGRyZXNzXG4gIGFkZHJzLnJldmVyc2UoKS5wb3AoKVxuXG4gIHJldHVybiBhZGRyc1xufSk7XG5cbi8qKlxuICogUmV0dXJuIHN1YmRvbWFpbnMgYXMgYW4gYXJyYXkuXG4gKlxuICogU3ViZG9tYWlucyBhcmUgdGhlIGRvdC1zZXBhcmF0ZWQgcGFydHMgb2YgdGhlIGhvc3QgYmVmb3JlIHRoZSBtYWluIGRvbWFpbiBvZlxuICogdGhlIGFwcC4gQnkgZGVmYXVsdCwgdGhlIGRvbWFpbiBvZiB0aGUgYXBwIGlzIGFzc3VtZWQgdG8gYmUgdGhlIGxhc3QgdHdvXG4gKiBwYXJ0cyBvZiB0aGUgaG9zdC4gVGhpcyBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nIFwic3ViZG9tYWluIG9mZnNldFwiLlxuICpcbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgZG9tYWluIGlzIFwidG9iaS5mZXJyZXRzLmV4YW1wbGUuY29tXCI6XG4gKiBJZiBcInN1YmRvbWFpbiBvZmZzZXRcIiBpcyBub3Qgc2V0LCByZXEuc3ViZG9tYWlucyBpcyBgW1wiZmVycmV0c1wiLCBcInRvYmlcIl1gLlxuICogSWYgXCJzdWJkb21haW4gb2Zmc2V0XCIgaXMgMywgcmVxLnN1YmRvbWFpbnMgaXMgYFtcInRvYmlcIl1gLlxuICpcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5cbmRlZmluZUdldHRlcihyZXEsICdzdWJkb21haW5zJywgZnVuY3Rpb24gc3ViZG9tYWlucygpIHtcbiAgdmFyIGhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZTtcblxuICBpZiAoIWhvc3RuYW1lKSByZXR1cm4gW107XG5cbiAgdmFyIG9mZnNldCA9IHRoaXMuYXBwLmdldCgnc3ViZG9tYWluIG9mZnNldCcpO1xuICB2YXIgc3ViZG9tYWlucyA9ICFpc0lQKGhvc3RuYW1lKVxuICAgID8gaG9zdG5hbWUuc3BsaXQoJy4nKS5yZXZlcnNlKClcbiAgICA6IFtob3N0bmFtZV07XG5cbiAgcmV0dXJuIHN1YmRvbWFpbnMuc2xpY2Uob2Zmc2V0KTtcbn0pO1xuXG4vKipcbiAqIFNob3J0LWhhbmQgZm9yIGB1cmwucGFyc2UocmVxLnVybCkucGF0aG5hbWVgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5kZWZpbmVHZXR0ZXIocmVxLCAncGF0aCcsIGZ1bmN0aW9uIHBhdGgoKSB7XG4gIHJldHVybiBwYXJzZSh0aGlzKS5wYXRobmFtZTtcbn0pO1xuXG4vKipcbiAqIFBhcnNlIHRoZSBcIkhvc3RcIiBoZWFkZXIgZmllbGQgdG8gYSBob3N0bmFtZS5cbiAqXG4gKiBXaGVuIHRoZSBcInRydXN0IHByb3h5XCIgc2V0dGluZyB0cnVzdHMgdGhlIHNvY2tldFxuICogYWRkcmVzcywgdGhlIFwiWC1Gb3J3YXJkZWQtSG9zdFwiIGhlYWRlciBmaWVsZCB3aWxsXG4gKiBiZSB0cnVzdGVkLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5kZWZpbmVHZXR0ZXIocmVxLCAnaG9zdG5hbWUnLCBmdW5jdGlvbiBob3N0bmFtZSgpe1xuICB2YXIgdHJ1c3QgPSB0aGlzLmFwcC5nZXQoJ3RydXN0IHByb3h5IGZuJyk7XG4gIHZhciBob3N0ID0gdGhpcy5nZXQoJ1gtRm9yd2FyZGVkLUhvc3QnKTtcblxuICBpZiAoIWhvc3QgfHwgIXRydXN0KHRoaXMuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzLCAwKSkge1xuICAgIGhvc3QgPSB0aGlzLmdldCgnSG9zdCcpO1xuICB9IGVsc2UgaWYgKGhvc3QuaW5kZXhPZignLCcpICE9PSAtMSkge1xuICAgIC8vIE5vdGU6IFgtRm9yd2FyZGVkLUhvc3QgaXMgbm9ybWFsbHkgb25seSBldmVyIGFcbiAgICAvLyAgICAgICBzaW5nbGUgdmFsdWUsIGJ1dCB0aGlzIGlzIHRvIGJlIHNhZmUuXG4gICAgaG9zdCA9IGhvc3Quc3Vic3RyaW5nKDAsIGhvc3QuaW5kZXhPZignLCcpKS50cmltUmlnaHQoKVxuICB9XG5cbiAgaWYgKCFob3N0KSByZXR1cm47XG5cbiAgLy8gSVB2NiBsaXRlcmFsIHN1cHBvcnRcbiAgdmFyIG9mZnNldCA9IGhvc3RbMF0gPT09ICdbJ1xuICAgID8gaG9zdC5pbmRleE9mKCddJykgKyAxXG4gICAgOiAwO1xuICB2YXIgaW5kZXggPSBob3N0LmluZGV4T2YoJzonLCBvZmZzZXQpO1xuXG4gIHJldHVybiBpbmRleCAhPT0gLTFcbiAgICA/IGhvc3Quc3Vic3RyaW5nKDAsIGluZGV4KVxuICAgIDogaG9zdDtcbn0pO1xuXG4vLyBUT0RPOiBjaGFuZ2UgcmVxLmhvc3QgdG8gcmV0dXJuIGhvc3QgaW4gbmV4dCBtYWpvclxuXG5kZWZpbmVHZXR0ZXIocmVxLCAnaG9zdCcsIGRlcHJlY2F0ZS5mdW5jdGlvbihmdW5jdGlvbiBob3N0KCl7XG4gIHJldHVybiB0aGlzLmhvc3RuYW1lO1xufSwgJ3JlcS5ob3N0OiBVc2UgcmVxLmhvc3RuYW1lIGluc3RlYWQnKSk7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgZnJlc2gsIGFrYVxuICogTGFzdC1Nb2RpZmllZCBhbmQvb3IgdGhlIEVUYWdcbiAqIHN0aWxsIG1hdGNoLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ2ZyZXNoJywgZnVuY3Rpb24oKXtcbiAgdmFyIG1ldGhvZCA9IHRoaXMubWV0aG9kO1xuICB2YXIgcmVzID0gdGhpcy5yZXNcbiAgdmFyIHN0YXR1cyA9IHJlcy5zdGF0dXNDb2RlXG5cbiAgLy8gR0VUIG9yIEhFQUQgZm9yIHdlYWsgZnJlc2huZXNzIHZhbGlkYXRpb24gb25seVxuICBpZiAoJ0dFVCcgIT09IG1ldGhvZCAmJiAnSEVBRCcgIT09IG1ldGhvZCkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIDJ4eCBvciAzMDQgYXMgcGVyIHJmYzI2MTYgMTQuMjZcbiAgaWYgKChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCkgfHwgMzA0ID09PSBzdGF0dXMpIHtcbiAgICByZXR1cm4gZnJlc2godGhpcy5oZWFkZXJzLCB7XG4gICAgICAnZXRhZyc6IHJlcy5nZXQoJ0VUYWcnKSxcbiAgICAgICdsYXN0LW1vZGlmaWVkJzogcmVzLmdldCgnTGFzdC1Nb2RpZmllZCcpXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn0pO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIHN0YWxlLCBha2FcbiAqIFwiTGFzdC1Nb2RpZmllZFwiIGFuZCAvIG9yIHRoZSBcIkVUYWdcIiBmb3IgdGhlXG4gKiByZXNvdXJjZSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmRlZmluZUdldHRlcihyZXEsICdzdGFsZScsIGZ1bmN0aW9uIHN0YWxlKCl7XG4gIHJldHVybiAhdGhpcy5mcmVzaDtcbn0pO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IHdhcyBhbiBfWE1MSHR0cFJlcXVlc3RfLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ3hocicsIGZ1bmN0aW9uIHhocigpe1xuICB2YXIgdmFsID0gdGhpcy5nZXQoJ1gtUmVxdWVzdGVkLVdpdGgnKSB8fCAnJztcbiAgcmV0dXJuIHZhbC50b0xvd2VyQ2FzZSgpID09PSAneG1saHR0cHJlcXVlc3QnO1xufSk7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIGdldHRlciBvbiBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRlclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lR2V0dGVyKG9iaiwgbmFtZSwgZ2V0dGVyKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGdldHRlclxuICB9KTtcbn1cbiIsICIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG4vKipcbiAqIFNpZ24gdGhlIGdpdmVuIGB2YWxgIHdpdGggYHNlY3JldGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHBhcmFtIHtTdHJpbmd9IHNlY3JldFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5zaWduID0gZnVuY3Rpb24odmFsLCBzZWNyZXQpe1xuICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHZhbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNvb2tpZSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIGFzIGEgc3RyaW5nLlwiKTtcbiAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiBzZWNyZXQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZWNyZXQgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXCIpO1xuICByZXR1cm4gdmFsICsgJy4nICsgY3J5cHRvXG4gICAgLmNyZWF0ZUhtYWMoJ3NoYTI1NicsIHNlY3JldClcbiAgICAudXBkYXRlKHZhbClcbiAgICAuZGlnZXN0KCdiYXNlNjQnKVxuICAgIC5yZXBsYWNlKC9cXD0rJC8sICcnKTtcbn07XG5cbi8qKlxuICogVW5zaWduIGFuZCBkZWNvZGUgdGhlIGdpdmVuIGB2YWxgIHdpdGggYHNlY3JldGAsXG4gKiByZXR1cm5pbmcgYGZhbHNlYCBpZiB0aGUgc2lnbmF0dXJlIGlzIGludmFsaWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbFxuICogQHBhcmFtIHtTdHJpbmd9IHNlY3JldFxuICogQHJldHVybiB7U3RyaW5nfEJvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnVuc2lnbiA9IGZ1bmN0aW9uKHZhbCwgc2VjcmV0KXtcbiAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiB2YWwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTaWduZWQgY29va2llIHN0cmluZyBtdXN0IGJlIHByb3ZpZGVkLlwiKTtcbiAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiBzZWNyZXQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZWNyZXQgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXCIpO1xuICB2YXIgc3RyID0gdmFsLnNsaWNlKDAsIHZhbC5sYXN0SW5kZXhPZignLicpKVxuICAgICwgbWFjID0gZXhwb3J0cy5zaWduKHN0ciwgc2VjcmV0KTtcbiAgXG4gIHJldHVybiBzaGExKG1hYykgPT0gc2hhMSh2YWwpID8gc3RyIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzaGExKHN0cil7XG4gIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMScpLnVwZGF0ZShzdHIpLmRpZ2VzdCgnaGV4Jyk7XG59XG4iLCAiLyohXG4gKiBjb29raWVcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgUm9tYW4gU2h0eWxtYW5cbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIF9fdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGZpZWxkLWNvbnRlbnQgaW4gUkZDIDcyMzAgc2VjIDMuMlxuICpcbiAqIGZpZWxkLWNvbnRlbnQgPSBmaWVsZC12Y2hhciBbIDEqKCBTUCAvIEhUQUIgKSBmaWVsZC12Y2hhciBdXG4gKiBmaWVsZC12Y2hhciAgID0gVkNIQVIgLyBvYnMtdGV4dFxuICogb2JzLXRleHQgICAgICA9ICV4ODAtRkZcbiAqL1xuXG52YXIgZmllbGRDb250ZW50UmVnRXhwID0gL15bXFx1MDAwOVxcdTAwMjAtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl0rJC87XG5cbi8qKlxuICogUGFyc2UgYSBjb29raWUgaGVhZGVyLlxuICpcbiAqIFBhcnNlIHRoZSBnaXZlbiBjb29raWUgaGVhZGVyIHN0cmluZyBpbnRvIGFuIG9iamVjdFxuICogVGhlIG9iamVjdCBoYXMgdGhlIHZhcmlvdXMgY29va2llcyBhcyBrZXlzKG5hbWVzKSA9PiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHN0ciBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICB2YXIgb2JqID0ge31cbiAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG4gIHZhciBkZWMgPSBvcHQuZGVjb2RlIHx8IGRlY29kZTtcblxuICB2YXIgaW5kZXggPSAwXG4gIHdoaWxlIChpbmRleCA8IHN0ci5sZW5ndGgpIHtcbiAgICB2YXIgZXFJZHggPSBzdHIuaW5kZXhPZignPScsIGluZGV4KVxuXG4gICAgLy8gbm8gbW9yZSBjb29raWUgcGFpcnNcbiAgICBpZiAoZXFJZHggPT09IC0xKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIHZhciBlbmRJZHggPSBzdHIuaW5kZXhPZignOycsIGluZGV4KVxuXG4gICAgaWYgKGVuZElkeCA9PT0gLTEpIHtcbiAgICAgIGVuZElkeCA9IHN0ci5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKGVuZElkeCA8IGVxSWR4KSB7XG4gICAgICAvLyBiYWNrdHJhY2sgb24gcHJpb3Igc2VtaWNvbG9uXG4gICAgICBpbmRleCA9IHN0ci5sYXN0SW5kZXhPZignOycsIGVxSWR4IC0gMSkgKyAxXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhciBrZXkgPSBzdHIuc2xpY2UoaW5kZXgsIGVxSWR4KS50cmltKClcblxuICAgIC8vIG9ubHkgYXNzaWduIG9uY2VcbiAgICBpZiAodW5kZWZpbmVkID09PSBvYmpba2V5XSkge1xuICAgICAgdmFyIHZhbCA9IHN0ci5zbGljZShlcUlkeCArIDEsIGVuZElkeCkudHJpbSgpXG5cbiAgICAgIC8vIHF1b3RlZCB2YWx1ZXNcbiAgICAgIGlmICh2YWwuY2hhckNvZGVBdCgwKSA9PT0gMHgyMikge1xuICAgICAgICB2YWwgPSB2YWwuc2xpY2UoMSwgLTEpXG4gICAgICB9XG5cbiAgICAgIG9ialtrZXldID0gdHJ5RGVjb2RlKHZhbCwgZGVjKTtcbiAgICB9XG5cbiAgICBpbmRleCA9IGVuZElkeCArIDFcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGRhdGEgaW50byBhIGNvb2tpZSBoZWFkZXIuXG4gKlxuICogU2VyaWFsaXplIHRoZSBhIG5hbWUgdmFsdWUgcGFpciBpbnRvIGEgY29va2llIHN0cmluZyBzdWl0YWJsZSBmb3JcbiAqIGh0dHAgaGVhZGVycy4gQW4gb3B0aW9uYWwgb3B0aW9ucyBvYmplY3Qgc3BlY2lmaWVkIGNvb2tpZSBwYXJhbWV0ZXJzLlxuICpcbiAqIHNlcmlhbGl6ZSgnZm9vJywgJ2JhcicsIHsgaHR0cE9ubHk6IHRydWUgfSlcbiAqICAgPT4gXCJmb289YmFyOyBodHRwT25seVwiXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzZXJpYWxpemUobmFtZSwgdmFsLCBvcHRpb25zKSB7XG4gIHZhciBvcHQgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZW5jID0gb3B0LmVuY29kZSB8fCBlbmNvZGU7XG5cbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZW5jb2RlIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3QobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBuYW1lIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHZhciB2YWx1ZSA9IGVuYyh2YWwpO1xuXG4gIGlmICh2YWx1ZSAmJiAhZmllbGRDb250ZW50UmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgdmFsIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHZhciBzdHIgPSBuYW1lICsgJz0nICsgdmFsdWU7XG5cbiAgaWYgKG51bGwgIT0gb3B0Lm1heEFnZSkge1xuICAgIHZhciBtYXhBZ2UgPSBvcHQubWF4QWdlIC0gMDtcblxuICAgIGlmIChpc05hTihtYXhBZ2UpIHx8ICFpc0Zpbml0ZShtYXhBZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gbWF4QWdlIGlzIGludmFsaWQnKVxuICAgIH1cblxuICAgIHN0ciArPSAnOyBNYXgtQWdlPScgKyBNYXRoLmZsb29yKG1heEFnZSk7XG4gIH1cblxuICBpZiAob3B0LmRvbWFpbikge1xuICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LmRvbWFpbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBkb21haW4gaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBEb21haW49JyArIG9wdC5kb21haW47XG4gIH1cblxuICBpZiAob3B0LnBhdGgpIHtcbiAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG9wdC5wYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHBhdGggaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBQYXRoPScgKyBvcHQucGF0aDtcbiAgfVxuXG4gIGlmIChvcHQuZXhwaXJlcykge1xuICAgIHZhciBleHBpcmVzID0gb3B0LmV4cGlyZXNcblxuICAgIGlmICghaXNEYXRlKGV4cGlyZXMpIHx8IGlzTmFOKGV4cGlyZXMudmFsdWVPZigpKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIGV4cGlyZXMgaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBFeHBpcmVzPScgKyBleHBpcmVzLnRvVVRDU3RyaW5nKClcbiAgfVxuXG4gIGlmIChvcHQuaHR0cE9ubHkpIHtcbiAgICBzdHIgKz0gJzsgSHR0cE9ubHknO1xuICB9XG5cbiAgaWYgKG9wdC5zZWN1cmUpIHtcbiAgICBzdHIgKz0gJzsgU2VjdXJlJztcbiAgfVxuXG4gIGlmIChvcHQucHJpb3JpdHkpIHtcbiAgICB2YXIgcHJpb3JpdHkgPSB0eXBlb2Ygb3B0LnByaW9yaXR5ID09PSAnc3RyaW5nJ1xuICAgICAgPyBvcHQucHJpb3JpdHkudG9Mb3dlckNhc2UoKVxuICAgICAgOiBvcHQucHJpb3JpdHlcblxuICAgIHN3aXRjaCAocHJpb3JpdHkpIHtcbiAgICAgIGNhc2UgJ2xvdyc6XG4gICAgICAgIHN0ciArPSAnOyBQcmlvcml0eT1Mb3cnXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdtZWRpdW0nOlxuICAgICAgICBzdHIgKz0gJzsgUHJpb3JpdHk9TWVkaXVtJ1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnaGlnaCc6XG4gICAgICAgIHN0ciArPSAnOyBQcmlvcml0eT1IaWdoJ1xuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHByaW9yaXR5IGlzIGludmFsaWQnKVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHQuc2FtZVNpdGUpIHtcbiAgICB2YXIgc2FtZVNpdGUgPSB0eXBlb2Ygb3B0LnNhbWVTaXRlID09PSAnc3RyaW5nJ1xuICAgICAgPyBvcHQuc2FtZVNpdGUudG9Mb3dlckNhc2UoKSA6IG9wdC5zYW1lU2l0ZTtcblxuICAgIHN3aXRjaCAoc2FtZVNpdGUpIHtcbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGF4JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPUxheCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RyaWN0JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1Ob25lJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogVVJMLWRlY29kZSBzdHJpbmcgdmFsdWUuIE9wdGltaXplZCB0byBza2lwIG5hdGl2ZSBjYWxsIHdoZW4gbm8gJS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGRlY29kZSAoc3RyKSB7XG4gIHJldHVybiBzdHIuaW5kZXhPZignJScpICE9PSAtMVxuICAgID8gZGVjb2RlVVJJQ29tcG9uZW50KHN0cilcbiAgICA6IHN0clxufVxuXG4vKipcbiAqIFVSTC1lbmNvZGUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBlbmNvZGUgKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbClcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdmFsdWUgaXMgYSBEYXRlLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzRGF0ZSAodmFsKSB7XG4gIHJldHVybiBfX3RvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRGF0ZV0nIHx8XG4gICAgdmFsIGluc3RhbmNlb2YgRGF0ZVxufVxuXG4vKipcbiAqIFRyeSBkZWNvZGluZyBhIHN0cmluZyB1c2luZyBhIGRlY29kaW5nIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRlY29kZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0cnlEZWNvZGUoc3RyLCBkZWNvZGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlKHN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG4iLCAiLyohXG4gKiB2YXJ5XG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZhcnlcbm1vZHVsZS5leHBvcnRzLmFwcGVuZCA9IGFwcGVuZFxuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBmaWVsZC1uYW1lIGluIFJGQyA3MjMwIHNlYyAzLjJcbiAqXG4gKiBmaWVsZC1uYW1lICAgID0gdG9rZW5cbiAqIHRva2VuICAgICAgICAgPSAxKnRjaGFyXG4gKiB0Y2hhciAgICAgICAgID0gXCIhXCIgLyBcIiNcIiAvIFwiJFwiIC8gXCIlXCIgLyBcIiZcIiAvIFwiJ1wiIC8gXCIqXCJcbiAqICAgICAgICAgICAgICAgLyBcIitcIiAvIFwiLVwiIC8gXCIuXCIgLyBcIl5cIiAvIFwiX1wiIC8gXCJgXCIgLyBcInxcIiAvIFwiflwiXG4gKiAgICAgICAgICAgICAgIC8gRElHSVQgLyBBTFBIQVxuICogICAgICAgICAgICAgICA7IGFueSBWQ0hBUiwgZXhjZXB0IGRlbGltaXRlcnNcbiAqL1xuXG52YXIgRklFTERfTkFNRV9SRUdFWFAgPSAvXlshIyQlJicqK1xcLS5eX2B8fjAtOUEtWmEtel0rJC9cblxuLyoqXG4gKiBBcHBlbmQgYSBmaWVsZCB0byBhIHZhcnkgaGVhZGVyLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGFwcGVuZCAoaGVhZGVyLCBmaWVsZCkge1xuICBpZiAodHlwZW9mIGhlYWRlciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdoZWFkZXIgYXJndW1lbnQgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKCFmaWVsZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpZWxkIGFyZ3VtZW50IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIGdldCBmaWVsZHMgYXJyYXlcbiAgdmFyIGZpZWxkcyA9ICFBcnJheS5pc0FycmF5KGZpZWxkKVxuICAgID8gcGFyc2UoU3RyaW5nKGZpZWxkKSlcbiAgICA6IGZpZWxkXG5cbiAgLy8gYXNzZXJ0IG9uIGludmFsaWQgZmllbGQgbmFtZXNcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBmaWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICBpZiAoIUZJRUxEX05BTUVfUkVHRVhQLnRlc3QoZmllbGRzW2pdKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmllbGQgYXJndW1lbnQgY29udGFpbnMgYW4gaW52YWxpZCBoZWFkZXIgbmFtZScpXG4gICAgfVxuICB9XG5cbiAgLy8gZXhpc3RpbmcsIHVuc3BlY2lmaWVkIHZhcnlcbiAgaWYgKGhlYWRlciA9PT0gJyonKSB7XG4gICAgcmV0dXJuIGhlYWRlclxuICB9XG5cbiAgLy8gZW51bWVyYXRlIGN1cnJlbnQgdmFsdWVzXG4gIHZhciB2YWwgPSBoZWFkZXJcbiAgdmFyIHZhbHMgPSBwYXJzZShoZWFkZXIudG9Mb3dlckNhc2UoKSlcblxuICAvLyB1bnNwZWNpZmllZCB2YXJ5XG4gIGlmIChmaWVsZHMuaW5kZXhPZignKicpICE9PSAtMSB8fCB2YWxzLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gJyonXG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBmbGQgPSBmaWVsZHNbaV0udG9Mb3dlckNhc2UoKVxuXG4gICAgLy8gYXBwZW5kIHZhbHVlIChjYXNlLXByZXNlcnZpbmcpXG4gICAgaWYgKHZhbHMuaW5kZXhPZihmbGQpID09PSAtMSkge1xuICAgICAgdmFscy5wdXNoKGZsZClcbiAgICAgIHZhbCA9IHZhbFxuICAgICAgICA/IHZhbCArICcsICcgKyBmaWVsZHNbaV1cbiAgICAgICAgOiBmaWVsZHNbaV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbi8qKlxuICogUGFyc2UgYSB2YXJ5IGhlYWRlciBpbnRvIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZSAoaGVhZGVyKSB7XG4gIHZhciBlbmQgPSAwXG4gIHZhciBsaXN0ID0gW11cbiAgdmFyIHN0YXJ0ID0gMFxuXG4gIC8vIGdhdGhlciB0b2tlbnNcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhlYWRlci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHN3aXRjaCAoaGVhZGVyLmNoYXJDb2RlQXQoaSkpIHtcbiAgICAgIGNhc2UgMHgyMDogLyogICAqL1xuICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgICAgICAgIHN0YXJ0ID0gZW5kID0gaSArIDFcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAweDJjOiAvKiAsICovXG4gICAgICAgIGxpc3QucHVzaChoZWFkZXIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKVxuICAgICAgICBzdGFydCA9IGVuZCA9IGkgKyAxXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbmQgPSBpICsgMVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmFsIHRva2VuXG4gIGxpc3QucHVzaChoZWFkZXIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKVxuXG4gIHJldHVybiBsaXN0XG59XG5cbi8qKlxuICogTWFyayB0aGF0IGEgcmVxdWVzdCBpcyB2YXJpZWQgb24gYSBoZWFkZXIgZmllbGQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlc1xuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGZpZWxkXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gdmFyeSAocmVzLCBmaWVsZCkge1xuICBpZiAoIXJlcyB8fCAhcmVzLmdldEhlYWRlciB8fCAhcmVzLnNldEhlYWRlcikge1xuICAgIC8vIHF1YWNrIHF1YWNrXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVzIGFyZ3VtZW50IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIGdldCBleGlzdGluZyBoZWFkZXJcbiAgdmFyIHZhbCA9IHJlcy5nZXRIZWFkZXIoJ1ZhcnknKSB8fCAnJ1xuICB2YXIgaGVhZGVyID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgPyB2YWwuam9pbignLCAnKVxuICAgIDogU3RyaW5nKHZhbClcblxuICAvLyBzZXQgbmV3IGhlYWRlclxuICBpZiAoKHZhbCA9IGFwcGVuZChoZWFkZXIsIGZpZWxkKSkpIHtcbiAgICByZXMuc2V0SGVhZGVyKCdWYXJ5JywgdmFsKVxuICB9XG59XG4iLCAiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG52YXIgY29udGVudERpc3Bvc2l0aW9uID0gcmVxdWlyZSgnY29udGVudC1kaXNwb3NpdGlvbicpO1xudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnaHR0cC1lcnJvcnMnKVxudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnZXhwcmVzcycpO1xudmFyIGVuY29kZVVybCA9IHJlcXVpcmUoJ2VuY29kZXVybCcpO1xudmFyIGVzY2FwZUh0bWwgPSByZXF1aXJlKCdlc2NhcGUtaHRtbCcpO1xudmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG52YXIgaXNBYnNvbHV0ZSA9IHJlcXVpcmUoJy4vdXRpbHMnKS5pc0Fic29sdXRlO1xudmFyIG9uRmluaXNoZWQgPSByZXF1aXJlKCdvbi1maW5pc2hlZCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgc3RhdHVzZXMgPSByZXF1aXJlKCdzdGF0dXNlcycpXG52YXIgbWVyZ2UgPSByZXF1aXJlKCd1dGlscy1tZXJnZScpO1xudmFyIHNpZ24gPSByZXF1aXJlKCdjb29raWUtc2lnbmF0dXJlJykuc2lnbjtcbnZhciBub3JtYWxpemVUeXBlID0gcmVxdWlyZSgnLi91dGlscycpLm5vcm1hbGl6ZVR5cGU7XG52YXIgbm9ybWFsaXplVHlwZXMgPSByZXF1aXJlKCcuL3V0aWxzJykubm9ybWFsaXplVHlwZXM7XG52YXIgc2V0Q2hhcnNldCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5zZXRDaGFyc2V0O1xudmFyIGNvb2tpZSA9IHJlcXVpcmUoJ2Nvb2tpZScpO1xudmFyIHNlbmQgPSByZXF1aXJlKCdzZW5kJyk7XG52YXIgZXh0bmFtZSA9IHBhdGguZXh0bmFtZTtcbnZhciBtaW1lID0gc2VuZC5taW1lO1xudmFyIHJlc29sdmUgPSBwYXRoLnJlc29sdmU7XG52YXIgdmFyeSA9IHJlcXVpcmUoJ3ZhcnknKTtcblxuLyoqXG4gKiBSZXNwb25zZSBwcm90b3R5cGUuXG4gKiBAcHVibGljXG4gKi9cblxudmFyIHJlcyA9IE9iamVjdC5jcmVhdGUoaHR0cC5TZXJ2ZXJSZXNwb25zZS5wcm90b3R5cGUpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXNcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgY2hhcnNldFJlZ0V4cCA9IC87XFxzKmNoYXJzZXRcXHMqPS87XG5cbi8qKlxuICogU2V0IHN0YXR1cyBgY29kZWAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfVxuICogQHB1YmxpY1xuICovXG5cbnJlcy5zdGF0dXMgPSBmdW5jdGlvbiBzdGF0dXMoY29kZSkge1xuICBpZiAoKHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyB8fCBNYXRoLmZsb29yKGNvZGUpICE9PSBjb2RlKSAmJiBjb2RlID4gOTkgJiYgY29kZSA8IDEwMDApIHtcbiAgICBkZXByZWNhdGUoJ3Jlcy5zdGF0dXMoJyArIEpTT04uc3RyaW5naWZ5KGNvZGUpICsgJyk6IHVzZSByZXMuc3RhdHVzKCcgKyBNYXRoLmZsb29yKGNvZGUpICsgJykgaW5zdGVhZCcpXG4gIH1cbiAgdGhpcy5zdGF0dXNDb2RlID0gY29kZTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBMaW5rIGhlYWRlciBmaWVsZCB3aXRoIHRoZSBnaXZlbiBgbGlua3NgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgIHJlcy5saW5rcyh7XG4gKiAgICAgIG5leHQ6ICdodHRwOi8vYXBpLmV4YW1wbGUuY29tL3VzZXJzP3BhZ2U9MicsXG4gKiAgICAgIGxhc3Q6ICdodHRwOi8vYXBpLmV4YW1wbGUuY29tL3VzZXJzP3BhZ2U9NSdcbiAqICAgIH0pO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBsaW5rc1xuICogQHJldHVybiB7U2VydmVyUmVzcG9uc2V9XG4gKiBAcHVibGljXG4gKi9cblxucmVzLmxpbmtzID0gZnVuY3Rpb24obGlua3Mpe1xuICB2YXIgbGluayA9IHRoaXMuZ2V0KCdMaW5rJykgfHwgJyc7XG4gIGlmIChsaW5rKSBsaW5rICs9ICcsICc7XG4gIHJldHVybiB0aGlzLnNldCgnTGluaycsIGxpbmsgKyBPYmplY3Qua2V5cyhsaW5rcykubWFwKGZ1bmN0aW9uKHJlbCl7XG4gICAgcmV0dXJuICc8JyArIGxpbmtzW3JlbF0gKyAnPjsgcmVsPVwiJyArIHJlbCArICdcIic7XG4gIH0pLmpvaW4oJywgJykpO1xufTtcblxuLyoqXG4gKiBTZW5kIGEgcmVzcG9uc2UuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgIHJlcy5zZW5kKEJ1ZmZlci5mcm9tKCd3YWhvbycpKTtcbiAqICAgICByZXMuc2VuZCh7IHNvbWU6ICdqc29uJyB9KTtcbiAqICAgICByZXMuc2VuZCgnPHA+c29tZSBodG1sPC9wPicpO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxib29sZWFufG9iamVjdHxCdWZmZXJ9IGJvZHlcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuc2VuZCA9IGZ1bmN0aW9uIHNlbmQoYm9keSkge1xuICB2YXIgY2h1bmsgPSBib2R5O1xuICB2YXIgZW5jb2Rpbmc7XG4gIHZhciByZXEgPSB0aGlzLnJlcTtcbiAgdmFyIHR5cGU7XG5cbiAgLy8gc2V0dGluZ3NcbiAgdmFyIGFwcCA9IHRoaXMuYXBwO1xuXG4gIC8vIGFsbG93IHN0YXR1cyAvIGJvZHlcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAvLyByZXMuc2VuZChib2R5LCBzdGF0dXMpIGJhY2t3YXJkcyBjb21wYXRcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGRlcHJlY2F0ZSgncmVzLnNlbmQoYm9keSwgc3RhdHVzKTogVXNlIHJlcy5zdGF0dXMoc3RhdHVzKS5zZW5kKGJvZHkpIGluc3RlYWQnKTtcbiAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IGFyZ3VtZW50c1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVwcmVjYXRlKCdyZXMuc2VuZChzdGF0dXMsIGJvZHkpOiBVc2UgcmVzLnN0YXR1cyhzdGF0dXMpLnNlbmQoYm9keSkgaW5zdGVhZCcpO1xuICAgICAgdGhpcy5zdGF0dXNDb2RlID0gYXJndW1lbnRzWzBdO1xuICAgICAgY2h1bmsgPSBhcmd1bWVudHNbMV07XG4gICAgfVxuICB9XG5cbiAgLy8gZGlzYW1iaWd1YXRlIHJlcy5zZW5kKHN0YXR1cykgYW5kIHJlcy5zZW5kKHN0YXR1cywgbnVtKVxuICBpZiAodHlwZW9mIGNodW5rID09PSAnbnVtYmVyJyAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gcmVzLnNlbmQoc3RhdHVzKSB3aWxsIHNldCBzdGF0dXMgbWVzc2FnZSBhcyB0ZXh0IHN0cmluZ1xuICAgIGlmICghdGhpcy5nZXQoJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgICB0aGlzLnR5cGUoJ3R4dCcpO1xuICAgIH1cblxuICAgIGRlcHJlY2F0ZSgncmVzLnNlbmQoc3RhdHVzKTogVXNlIHJlcy5zZW5kU3RhdHVzKHN0YXR1cykgaW5zdGVhZCcpO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IGNodW5rO1xuICAgIGNodW5rID0gc3RhdHVzZXMubWVzc2FnZVtjaHVua11cbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIGNodW5rKSB7XG4gICAgLy8gc3RyaW5nIGRlZmF1bHRpbmcgdG8gaHRtbFxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBpZiAoIXRoaXMuZ2V0KCdDb250ZW50LVR5cGUnKSkge1xuICAgICAgICB0aGlzLnR5cGUoJ2h0bWwnKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgICBjaHVuayA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgICAgIGlmICghdGhpcy5nZXQoJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgICAgICAgdGhpcy50eXBlKCdiaW4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanNvbihjaHVuayk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIC8vIHdyaXRlIHN0cmluZ3MgaW4gdXRmLThcbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgICB0eXBlID0gdGhpcy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuXG4gICAgLy8gcmVmbGVjdCB0aGlzIGluIGNvbnRlbnQtdHlwZVxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuc2V0KCdDb250ZW50LVR5cGUnLCBzZXRDaGFyc2V0KHR5cGUsICd1dGYtOCcpKTtcbiAgICB9XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgaWYgRVRhZyBzaG91bGQgYmUgZ2VuZXJhdGVkXG4gIHZhciBldGFnRm4gPSBhcHAuZ2V0KCdldGFnIGZuJylcbiAgdmFyIGdlbmVyYXRlRVRhZyA9ICF0aGlzLmdldCgnRVRhZycpICYmIHR5cGVvZiBldGFnRm4gPT09ICdmdW5jdGlvbidcblxuICAvLyBwb3B1bGF0ZSBDb250ZW50LUxlbmd0aFxuICB2YXIgbGVuXG4gIGlmIChjaHVuayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICAgIC8vIGdldCBsZW5ndGggb2YgQnVmZmVyXG4gICAgICBsZW4gPSBjaHVuay5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKCFnZW5lcmF0ZUVUYWcgJiYgY2h1bmsubGVuZ3RoIDwgMTAwMCkge1xuICAgICAgLy8ganVzdCBjYWxjdWxhdGUgbGVuZ3RoIHdoZW4gbm8gRVRhZyArIHNtYWxsIGNodW5rXG4gICAgICBsZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aChjaHVuaywgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnZlcnQgY2h1bmsgdG8gQnVmZmVyIGFuZCBjYWxjdWxhdGVcbiAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKVxuICAgICAgZW5jb2RpbmcgPSB1bmRlZmluZWQ7XG4gICAgICBsZW4gPSBjaHVuay5sZW5ndGhcbiAgICB9XG5cbiAgICB0aGlzLnNldCgnQ29udGVudC1MZW5ndGgnLCBsZW4pO1xuICB9XG5cbiAgLy8gcG9wdWxhdGUgRVRhZ1xuICB2YXIgZXRhZztcbiAgaWYgKGdlbmVyYXRlRVRhZyAmJiBsZW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICgoZXRhZyA9IGV0YWdGbihjaHVuaywgZW5jb2RpbmcpKSkge1xuICAgICAgdGhpcy5zZXQoJ0VUYWcnLCBldGFnKTtcbiAgICB9XG4gIH1cblxuICAvLyBmcmVzaG5lc3NcbiAgaWYgKHJlcS5mcmVzaCkgdGhpcy5zdGF0dXNDb2RlID0gMzA0O1xuXG4gIC8vIHN0cmlwIGlycmVsZXZhbnQgaGVhZGVyc1xuICBpZiAoMjA0ID09PSB0aGlzLnN0YXR1c0NvZGUgfHwgMzA0ID09PSB0aGlzLnN0YXR1c0NvZGUpIHtcbiAgICB0aGlzLnJlbW92ZUhlYWRlcignQ29udGVudC1UeXBlJyk7XG4gICAgdGhpcy5yZW1vdmVIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJyk7XG4gICAgdGhpcy5yZW1vdmVIZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJyk7XG4gICAgY2h1bmsgPSAnJztcbiAgfVxuXG4gIC8vIGFsdGVyIGhlYWRlcnMgZm9yIDIwNVxuICBpZiAodGhpcy5zdGF0dXNDb2RlID09PSAyMDUpIHtcbiAgICB0aGlzLnNldCgnQ29udGVudC1MZW5ndGgnLCAnMCcpXG4gICAgdGhpcy5yZW1vdmVIZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJylcbiAgICBjaHVuayA9ICcnXG4gIH1cblxuICBpZiAocmVxLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgLy8gc2tpcCBib2R5IGZvciBIRUFEXG4gICAgdGhpcy5lbmQoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyByZXNwb25kXG4gICAgdGhpcy5lbmQoY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZW5kIEpTT04gcmVzcG9uc2UuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgIHJlcy5qc29uKG51bGwpO1xuICogICAgIHJlcy5qc29uKHsgdXNlcjogJ3RqJyB9KTtcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8Ym9vbGVhbnxvYmplY3R9IG9ialxuICogQHB1YmxpY1xuICovXG5cbnJlcy5qc29uID0gZnVuY3Rpb24ganNvbihvYmopIHtcbiAgdmFyIHZhbCA9IG9iajtcblxuICAvLyBhbGxvdyBzdGF0dXMgLyBib2R5XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgLy8gcmVzLmpzb24oYm9keSwgc3RhdHVzKSBiYWNrd2FyZHMgY29tcGF0XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdudW1iZXInKSB7XG4gICAgICBkZXByZWNhdGUoJ3Jlcy5qc29uKG9iaiwgc3RhdHVzKTogVXNlIHJlcy5zdGF0dXMoc3RhdHVzKS5qc29uKG9iaikgaW5zdGVhZCcpO1xuICAgICAgdGhpcy5zdGF0dXNDb2RlID0gYXJndW1lbnRzWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXByZWNhdGUoJ3Jlcy5qc29uKHN0YXR1cywgb2JqKTogVXNlIHJlcy5zdGF0dXMoc3RhdHVzKS5qc29uKG9iaikgaW5zdGVhZCcpO1xuICAgICAgdGhpcy5zdGF0dXNDb2RlID0gYXJndW1lbnRzWzBdO1xuICAgICAgdmFsID0gYXJndW1lbnRzWzFdO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNldHRpbmdzXG4gIHZhciBhcHAgPSB0aGlzLmFwcDtcbiAgdmFyIGVzY2FwZSA9IGFwcC5nZXQoJ2pzb24gZXNjYXBlJylcbiAgdmFyIHJlcGxhY2VyID0gYXBwLmdldCgnanNvbiByZXBsYWNlcicpO1xuICB2YXIgc3BhY2VzID0gYXBwLmdldCgnanNvbiBzcGFjZXMnKTtcbiAgdmFyIGJvZHkgPSBzdHJpbmdpZnkodmFsLCByZXBsYWNlciwgc3BhY2VzLCBlc2NhcGUpXG5cbiAgLy8gY29udGVudC10eXBlXG4gIGlmICghdGhpcy5nZXQoJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgdGhpcy5zZXQoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5zZW5kKGJvZHkpO1xufTtcblxuLyoqXG4gKiBTZW5kIEpTT04gcmVzcG9uc2Ugd2l0aCBKU09OUCBjYWxsYmFjayBzdXBwb3J0LlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICByZXMuanNvbnAobnVsbCk7XG4gKiAgICAgcmVzLmpzb25wKHsgdXNlcjogJ3RqJyB9KTtcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8Ym9vbGVhbnxvYmplY3R9IG9ialxuICogQHB1YmxpY1xuICovXG5cbnJlcy5qc29ucCA9IGZ1bmN0aW9uIGpzb25wKG9iaikge1xuICB2YXIgdmFsID0gb2JqO1xuXG4gIC8vIGFsbG93IHN0YXR1cyAvIGJvZHlcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAvLyByZXMuanNvbnAoYm9keSwgc3RhdHVzKSBiYWNrd2FyZHMgY29tcGF0XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT09ICdudW1iZXInKSB7XG4gICAgICBkZXByZWNhdGUoJ3Jlcy5qc29ucChvYmosIHN0YXR1cyk6IFVzZSByZXMuc3RhdHVzKHN0YXR1cykuanNvbnAob2JqKSBpbnN0ZWFkJyk7XG4gICAgICB0aGlzLnN0YXR1c0NvZGUgPSBhcmd1bWVudHNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlcHJlY2F0ZSgncmVzLmpzb25wKHN0YXR1cywgb2JqKTogVXNlIHJlcy5zdGF0dXMoc3RhdHVzKS5qc29ucChvYmopIGluc3RlYWQnKTtcbiAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhbCA9IGFyZ3VtZW50c1sxXTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXR0aW5nc1xuICB2YXIgYXBwID0gdGhpcy5hcHA7XG4gIHZhciBlc2NhcGUgPSBhcHAuZ2V0KCdqc29uIGVzY2FwZScpXG4gIHZhciByZXBsYWNlciA9IGFwcC5nZXQoJ2pzb24gcmVwbGFjZXInKTtcbiAgdmFyIHNwYWNlcyA9IGFwcC5nZXQoJ2pzb24gc3BhY2VzJyk7XG4gIHZhciBib2R5ID0gc3RyaW5naWZ5KHZhbCwgcmVwbGFjZXIsIHNwYWNlcywgZXNjYXBlKVxuICB2YXIgY2FsbGJhY2sgPSB0aGlzLnJlcS5xdWVyeVthcHAuZ2V0KCdqc29ucCBjYWxsYmFjayBuYW1lJyldO1xuXG4gIC8vIGNvbnRlbnQtdHlwZVxuICBpZiAoIXRoaXMuZ2V0KCdDb250ZW50LVR5cGUnKSkge1xuICAgIHRoaXMuc2V0KCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKTtcbiAgICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgfVxuXG4gIC8vIGZpeHVwIGNhbGxiYWNrXG4gIGlmIChBcnJheS5pc0FycmF5KGNhbGxiYWNrKSkge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2tbMF07XG4gIH1cblxuICAvLyBqc29ucFxuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnc3RyaW5nJyAmJiBjYWxsYmFjay5sZW5ndGggIT09IDApIHtcbiAgICB0aGlzLnNldCgnWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG4gICAgdGhpcy5zZXQoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcblxuICAgIC8vIHJlc3RyaWN0IGNhbGxiYWNrIGNoYXJzZXRcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrLnJlcGxhY2UoL1teXFxbXFxdXFx3JC5dL2csICcnKTtcblxuICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGVtcHR5IGFyZ3VtZW50XG4gICAgICBib2R5ID0gJydcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gcmVwbGFjZSBjaGFycyBub3QgYWxsb3dlZCBpbiBKYXZhU2NyaXB0IHRoYXQgYXJlIGluIEpTT05cbiAgICAgIGJvZHkgPSBib2R5XG4gICAgICAgIC5yZXBsYWNlKC9cXHUyMDI4L2csICdcXFxcdTIwMjgnKVxuICAgICAgICAucmVwbGFjZSgvXFx1MjAyOS9nLCAnXFxcXHUyMDI5JylcbiAgICB9XG5cbiAgICAvLyB0aGUgLyoqLyBpcyBhIHNwZWNpZmljIHNlY3VyaXR5IG1pdGlnYXRpb24gZm9yIFwiUm9zZXR0YSBGbGFzaCBKU09OUCBhYnVzZVwiXG4gICAgLy8gdGhlIHR5cGVvZiBjaGVjayBpcyBqdXN0IHRvIHJlZHVjZSBjbGllbnQgZXJyb3Igbm9pc2VcbiAgICBib2R5ID0gJy8qKi8gdHlwZW9mICcgKyBjYWxsYmFjayArICcgPT09IFxcJ2Z1bmN0aW9uXFwnICYmICcgKyBjYWxsYmFjayArICcoJyArIGJvZHkgKyAnKTsnO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuc2VuZChib2R5KTtcbn07XG5cbi8qKlxuICogU2VuZCBnaXZlbiBIVFRQIHN0YXR1cyBjb2RlLlxuICpcbiAqIFNldHMgdGhlIHJlc3BvbnNlIHN0YXR1cyB0byBgc3RhdHVzQ29kZWAgYW5kIHRoZSBib2R5IG9mIHRoZVxuICogcmVzcG9uc2UgdG8gdGhlIHN0YW5kYXJkIGRlc2NyaXB0aW9uIGZyb20gbm9kZSdzIGh0dHAuU1RBVFVTX0NPREVTXG4gKiBvciB0aGUgc3RhdHVzQ29kZSBudW1iZXIgaWYgbm8gZGVzY3JpcHRpb24uXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgIHJlcy5zZW5kU3RhdHVzKDIwMCk7XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c0NvZGVcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuc2VuZFN0YXR1cyA9IGZ1bmN0aW9uIHNlbmRTdGF0dXMoc3RhdHVzQ29kZSkge1xuICB2YXIgYm9keSA9IHN0YXR1c2VzLm1lc3NhZ2Vbc3RhdHVzQ29kZV0gfHwgU3RyaW5nKHN0YXR1c0NvZGUpXG5cbiAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgdGhpcy50eXBlKCd0eHQnKTtcblxuICByZXR1cm4gdGhpcy5zZW5kKGJvZHkpO1xufTtcblxuLyoqXG4gKiBUcmFuc2ZlciB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gYHBhdGhgLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgX0NvbnRlbnQtVHlwZV8gcmVzcG9uc2UgaGVhZGVyIGZpZWxkLlxuICogVGhlIGNhbGxiYWNrIGBjYWxsYmFjayhlcnIpYCBpcyBpbnZva2VkIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlXG4gKiBvciB3aGVuIGFuIGVycm9yIG9jY3Vycy4gQmUgc3VyZSB0byBjaGVjayBgcmVzLmhlYWRlcnNTZW50YFxuICogaWYgeW91IHdpc2ggdG8gYXR0ZW1wdCByZXNwb25kaW5nLCBhcyB0aGUgaGVhZGVyIGFuZCBzb21lIGRhdGFcbiAqIG1heSBoYXZlIGFscmVhZHkgYmVlbiB0cmFuc2ZlcnJlZC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAgLSBgbWF4QWdlYCAgIGRlZmF1bHRpbmcgdG8gMCAoY2FuIGJlIHN0cmluZyBjb252ZXJ0ZWQgYnkgYG1zYClcbiAqICAgLSBgcm9vdGAgICAgIHJvb3QgZGlyZWN0b3J5IGZvciByZWxhdGl2ZSBmaWxlbmFtZXNcbiAqICAgLSBgaGVhZGVyc2AgIG9iamVjdCBvZiBoZWFkZXJzIHRvIHNlcnZlIHdpdGggZmlsZVxuICogICAtIGBkb3RmaWxlc2Agc2VydmUgZG90ZmlsZXMsIGRlZmF1bHRpbmcgdG8gZmFsc2U7IGNhbiBiZSBgXCJhbGxvd1wiYCB0byBzZW5kIHRoZW1cbiAqXG4gKiBPdGhlciBvcHRpb25zIGFyZSBwYXNzZWQgYWxvbmcgdG8gYHNlbmRgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IGByZXMuc2VuZEZpbGUoKWAgbWF5XG4gKiAgYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBmb3IgdGhlIGBzdGF0aWMoKWAgbWlkZGxld2FyZSBmb3JcbiAqICBkeW5hbWljIHNpdHVhdGlvbnMuIFRoZSBjb2RlIGJhY2tpbmcgYHJlcy5zZW5kRmlsZSgpYCBpcyBhY3R1YWxseVxuICogIHRoZSBzYW1lIGNvZGUsIHNvIEhUVFAgY2FjaGUgc3VwcG9ydCBldGMgaXMgaWRlbnRpY2FsLlxuICpcbiAqICAgICBhcHAuZ2V0KCcvdXNlci86dWlkL3Bob3Rvcy86ZmlsZScsIGZ1bmN0aW9uKHJlcSwgcmVzKXtcbiAqICAgICAgIHZhciB1aWQgPSByZXEucGFyYW1zLnVpZFxuICogICAgICAgICAsIGZpbGUgPSByZXEucGFyYW1zLmZpbGU7XG4gKlxuICogICAgICAgcmVxLnVzZXIubWF5Vmlld0ZpbGVzRnJvbSh1aWQsIGZ1bmN0aW9uKHllcyl7XG4gKiAgICAgICAgIGlmICh5ZXMpIHtcbiAqICAgICAgICAgICByZXMuc2VuZEZpbGUoJy91cGxvYWRzLycgKyB1aWQgKyAnLycgKyBmaWxlKTtcbiAqICAgICAgICAgfSBlbHNlIHtcbiAqICAgICAgICAgICByZXMuc2VuZCg0MDMsICdTb3JyeSEgeW91IGNhbnQgc2VlIHRoYXQuJyk7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH0pO1xuICogICAgIH0pO1xuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuc2VuZEZpbGUgPSBmdW5jdGlvbiBzZW5kRmlsZShwYXRoLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZG9uZSA9IGNhbGxiYWNrO1xuICB2YXIgcmVxID0gdGhpcy5yZXE7XG4gIHZhciByZXMgPSB0aGlzO1xuICB2YXIgbmV4dCA9IHJlcS5uZXh0O1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKCFwYXRoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGF0aCBhcmd1bWVudCBpcyByZXF1aXJlZCB0byByZXMuc2VuZEZpbGUnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXRoIG11c3QgYmUgYSBzdHJpbmcgdG8gcmVzLnNlbmRGaWxlJylcbiAgfVxuXG4gIC8vIHN1cHBvcnQgZnVuY3Rpb24gYXMgc2Vjb25kIGFyZ1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkb25lID0gb3B0aW9ucztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICBpZiAoIW9wdHMucm9vdCAmJiAhaXNBYnNvbHV0ZShwYXRoKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhdGggbXVzdCBiZSBhYnNvbHV0ZSBvciBzcGVjaWZ5IHJvb3QgdG8gcmVzLnNlbmRGaWxlJyk7XG4gIH1cblxuICAvLyBjcmVhdGUgZmlsZSBzdHJlYW1cbiAgdmFyIHBhdGhuYW1lID0gZW5jb2RlVVJJKHBhdGgpO1xuICB2YXIgZmlsZSA9IHNlbmQocmVxLCBwYXRobmFtZSwgb3B0cyk7XG5cbiAgLy8gdHJhbnNmZXJcbiAgc2VuZGZpbGUocmVzLCBmaWxlLCBvcHRzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybiBkb25lKGVycik7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ0VJU0RJUicpIHJldHVybiBuZXh0KCk7XG5cbiAgICAvLyBuZXh0KCkgYWxsIGJ1dCB3cml0ZSBlcnJvcnNcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlICE9PSAnRUNPTk5BQk9SVEVEJyAmJiBlcnIuc3lzY2FsbCAhPT0gJ3dyaXRlJykge1xuICAgICAgbmV4dChlcnIpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIFRyYW5zZmVyIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBgcGF0aGAuXG4gKlxuICogQXV0b21hdGljYWxseSBzZXRzIHRoZSBfQ29udGVudC1UeXBlXyByZXNwb25zZSBoZWFkZXIgZmllbGQuXG4gKiBUaGUgY2FsbGJhY2sgYGNhbGxiYWNrKGVycilgIGlzIGludm9rZWQgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGVcbiAqIG9yIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiBCZSBzdXJlIHRvIGNoZWNrIGByZXMuaGVhZGVyc1NlbnRgXG4gKiBpZiB5b3Ugd2lzaCB0byBhdHRlbXB0IHJlc3BvbmRpbmcsIGFzIHRoZSBoZWFkZXIgYW5kIHNvbWUgZGF0YVxuICogbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHRyYW5zZmVycmVkLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogICAtIGBtYXhBZ2VgICAgZGVmYXVsdGluZyB0byAwIChjYW4gYmUgc3RyaW5nIGNvbnZlcnRlZCBieSBgbXNgKVxuICogICAtIGByb290YCAgICAgcm9vdCBkaXJlY3RvcnkgZm9yIHJlbGF0aXZlIGZpbGVuYW1lc1xuICogICAtIGBoZWFkZXJzYCAgb2JqZWN0IG9mIGhlYWRlcnMgdG8gc2VydmUgd2l0aCBmaWxlXG4gKiAgIC0gYGRvdGZpbGVzYCBzZXJ2ZSBkb3RmaWxlcywgZGVmYXVsdGluZyB0byBmYWxzZTsgY2FuIGJlIGBcImFsbG93XCJgIHRvIHNlbmQgdGhlbVxuICpcbiAqIE90aGVyIG9wdGlvbnMgYXJlIHBhc3NlZCBhbG9uZyB0byBgc2VuZGAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgYHJlcy5zZW5kZmlsZSgpYCBtYXlcbiAqICBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZvciB0aGUgYHN0YXRpYygpYCBtaWRkbGV3YXJlIGZvclxuICogIGR5bmFtaWMgc2l0dWF0aW9ucy4gVGhlIGNvZGUgYmFja2luZyBgcmVzLnNlbmRmaWxlKClgIGlzIGFjdHVhbGx5XG4gKiAgdGhlIHNhbWUgY29kZSwgc28gSFRUUCBjYWNoZSBzdXBwb3J0IGV0YyBpcyBpZGVudGljYWwuXG4gKlxuICogICAgIGFwcC5nZXQoJy91c2VyLzp1aWQvcGhvdG9zLzpmaWxlJywgZnVuY3Rpb24ocmVxLCByZXMpe1xuICogICAgICAgdmFyIHVpZCA9IHJlcS5wYXJhbXMudWlkXG4gKiAgICAgICAgICwgZmlsZSA9IHJlcS5wYXJhbXMuZmlsZTtcbiAqXG4gKiAgICAgICByZXEudXNlci5tYXlWaWV3RmlsZXNGcm9tKHVpZCwgZnVuY3Rpb24oeWVzKXtcbiAqICAgICAgICAgaWYgKHllcykge1xuICogICAgICAgICAgIHJlcy5zZW5kZmlsZSgnL3VwbG9hZHMvJyArIHVpZCArICcvJyArIGZpbGUpO1xuICogICAgICAgICB9IGVsc2Uge1xuICogICAgICAgICAgIHJlcy5zZW5kKDQwMywgJ1NvcnJ5ISB5b3UgY2FudCBzZWUgdGhhdC4nKTtcbiAqICAgICAgICAgfVxuICogICAgICAgfSk7XG4gKiAgICAgfSk7XG4gKlxuICogQHB1YmxpY1xuICovXG5cbnJlcy5zZW5kZmlsZSA9IGZ1bmN0aW9uIChwYXRoLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZG9uZSA9IGNhbGxiYWNrO1xuICB2YXIgcmVxID0gdGhpcy5yZXE7XG4gIHZhciByZXMgPSB0aGlzO1xuICB2YXIgbmV4dCA9IHJlcS5uZXh0O1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc3VwcG9ydCBmdW5jdGlvbiBhcyBzZWNvbmQgYXJnXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBvcHRpb25zO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBmaWxlIHN0cmVhbVxuICB2YXIgZmlsZSA9IHNlbmQocmVxLCBwYXRoLCBvcHRzKTtcblxuICAvLyB0cmFuc2ZlclxuICBzZW5kZmlsZShyZXMsIGZpbGUsIG9wdHMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuIGRvbmUoZXJyKTtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRUlTRElSJykgcmV0dXJuIG5leHQoKTtcblxuICAgIC8vIG5leHQoKSBhbGwgYnV0IHdyaXRlIGVycm9yc1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgIT09ICdFQ09OTkFCT1JURUQnICYmIGVyci5zeXNjYWxsICE9PSAnd3JpdGUnKSB7XG4gICAgICBuZXh0KGVycik7XG4gICAgfVxuICB9KTtcbn07XG5cbnJlcy5zZW5kZmlsZSA9IGRlcHJlY2F0ZS5mdW5jdGlvbihyZXMuc2VuZGZpbGUsXG4gICdyZXMuc2VuZGZpbGU6IFVzZSByZXMuc2VuZEZpbGUgaW5zdGVhZCcpO1xuXG4vKipcbiAqIFRyYW5zZmVyIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBgcGF0aGAgYXMgYW4gYXR0YWNobWVudC5cbiAqXG4gKiBPcHRpb25hbGx5IHByb3ZpZGluZyBhbiBhbHRlcm5hdGUgYXR0YWNobWVudCBgZmlsZW5hbWVgLFxuICogYW5kIG9wdGlvbmFsIGNhbGxiYWNrIGBjYWxsYmFjayhlcnIpYC4gVGhlIGNhbGxiYWNrIGlzIGludm9rZWRcbiAqIHdoZW4gdGhlIGRhdGEgdHJhbnNmZXIgaXMgY29tcGxldGUsIG9yIHdoZW4gYW4gZXJyb3IgaGFzXG4gKiBvY2N1cnJlZC4gQmUgc3VyZSB0byBjaGVjayBgcmVzLmhlYWRlcnNTZW50YCBpZiB5b3UgcGxhbiB0byByZXNwb25kLlxuICpcbiAqIE9wdGlvbmFsbHkgcHJvdmlkaW5nIGFuIGBvcHRpb25zYCBvYmplY3QgdG8gdXNlIHdpdGggYHJlcy5zZW5kRmlsZSgpYC5cbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIGBDb250ZW50LURpc3Bvc2l0aW9uYCBoZWFkZXIsIG92ZXJyaWRpbmdcbiAqIGFueSBgQ29udGVudC1EaXNwb3NpdGlvbmAgaGVhZGVyIHBhc3NlZCBhcyBoZWFkZXIgb3B0aW9ucyBpbiBvcmRlclxuICogdG8gc2V0IHRoZSBhdHRhY2htZW50IGFuZCBmaWxlbmFtZS5cbiAqXG4gKiBUaGlzIG1ldGhvZCB1c2VzIGByZXMuc2VuZEZpbGUoKWAuXG4gKlxuICogQHB1YmxpY1xuICovXG5cbnJlcy5kb3dubG9hZCA9IGZ1bmN0aW9uIGRvd25sb2FkIChwYXRoLCBmaWxlbmFtZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGRvbmUgPSBjYWxsYmFjaztcbiAgdmFyIG5hbWUgPSBmaWxlbmFtZTtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IG51bGxcblxuICAvLyBzdXBwb3J0IGZ1bmN0aW9uIGFzIHNlY29uZCBvciB0aGlyZCBhcmdcbiAgaWYgKHR5cGVvZiBmaWxlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBmaWxlbmFtZTtcbiAgICBuYW1lID0gbnVsbDtcbiAgICBvcHRzID0gbnVsbFxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZG9uZSA9IG9wdGlvbnNcbiAgICBvcHRzID0gbnVsbFxuICB9XG5cbiAgLy8gc3VwcG9ydCBvcHRpb25hbCBmaWxlbmFtZSwgd2hlcmUgb3B0aW9ucyBtYXkgYmUgaW4gaXQncyBwbGFjZVxuICBpZiAodHlwZW9mIGZpbGVuYW1lID09PSAnb2JqZWN0JyAmJlxuICAgICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyB8fCBvcHRpb25zID09PSB1bmRlZmluZWQpKSB7XG4gICAgbmFtZSA9IG51bGxcbiAgICBvcHRzID0gZmlsZW5hbWVcbiAgfVxuXG4gIC8vIHNldCBDb250ZW50LURpc3Bvc2l0aW9uIHdoZW4gZmlsZSBpcyBzZW50XG4gIHZhciBoZWFkZXJzID0ge1xuICAgICdDb250ZW50LURpc3Bvc2l0aW9uJzogY29udGVudERpc3Bvc2l0aW9uKG5hbWUgfHwgcGF0aClcbiAgfTtcblxuICAvLyBtZXJnZSB1c2VyLXByb3ZpZGVkIGhlYWRlcnNcbiAgaWYgKG9wdHMgJiYgb3B0cy5oZWFkZXJzKSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRzLmhlYWRlcnMpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXVxuICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpICE9PSAnY29udGVudC1kaXNwb3NpdGlvbicpIHtcbiAgICAgICAgaGVhZGVyc1trZXldID0gb3B0cy5oZWFkZXJzW2tleV1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBtZXJnZSB1c2VyLXByb3ZpZGVkIG9wdGlvbnNcbiAgb3B0cyA9IE9iamVjdC5jcmVhdGUob3B0cylcbiAgb3B0cy5oZWFkZXJzID0gaGVhZGVyc1xuXG4gIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCBmb3Igc2VuZEZpbGVcbiAgdmFyIGZ1bGxQYXRoID0gIW9wdHMucm9vdFxuICAgID8gcmVzb2x2ZShwYXRoKVxuICAgIDogcGF0aFxuXG4gIC8vIHNlbmQgZmlsZVxuICByZXR1cm4gdGhpcy5zZW5kRmlsZShmdWxsUGF0aCwgb3B0cywgZG9uZSlcbn07XG5cbi8qKlxuICogU2V0IF9Db250ZW50LVR5cGVfIHJlc3BvbnNlIGhlYWRlciB3aXRoIGB0eXBlYCB0aHJvdWdoIGBtaW1lLmxvb2t1cCgpYFxuICogd2hlbiBpdCBkb2VzIG5vdCBjb250YWluIFwiL1wiLCBvciBzZXQgdGhlIENvbnRlbnQtVHlwZSB0byBgdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICByZXMudHlwZSgnLmh0bWwnKTtcbiAqICAgICByZXMudHlwZSgnaHRtbCcpO1xuICogICAgIHJlcy50eXBlKCdqc29uJyk7XG4gKiAgICAgcmVzLnR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAqICAgICByZXMudHlwZSgncG5nJyk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuY29udGVudFR5cGUgPVxucmVzLnR5cGUgPSBmdW5jdGlvbiBjb250ZW50VHlwZSh0eXBlKSB7XG4gIHZhciBjdCA9IHR5cGUuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gbWltZS5sb29rdXAodHlwZSlcbiAgICA6IHR5cGU7XG5cbiAgcmV0dXJuIHRoaXMuc2V0KCdDb250ZW50LVR5cGUnLCBjdCk7XG59O1xuXG4vKipcbiAqIFJlc3BvbmQgdG8gdGhlIEFjY2VwdGFibGUgZm9ybWF0cyB1c2luZyBhbiBgb2JqYFxuICogb2YgbWltZS10eXBlIGNhbGxiYWNrcy5cbiAqXG4gKiBUaGlzIG1ldGhvZCB1c2VzIGByZXEuYWNjZXB0ZWRgLCBhbiBhcnJheSBvZlxuICogYWNjZXB0YWJsZSB0eXBlcyBvcmRlcmVkIGJ5IHRoZWlyIHF1YWxpdHkgdmFsdWVzLlxuICogV2hlbiBcIkFjY2VwdFwiIGlzIG5vdCBwcmVzZW50IHRoZSBfZmlyc3RfIGNhbGxiYWNrXG4gKiBpcyBpbnZva2VkLCBvdGhlcndpc2UgdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQuIFdoZW5cbiAqIG5vIG1hdGNoIGlzIHBlcmZvcm1lZCB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGhcbiAqIDQwNiBcIk5vdCBBY2NlcHRhYmxlXCIuXG4gKlxuICogQ29udGVudC1UeXBlIGlzIHNldCBmb3IgeW91LCBob3dldmVyIGlmIHlvdSBjaG9vc2VcbiAqIHlvdSBtYXkgYWx0ZXIgdGhpcyB3aXRoaW4gdGhlIGNhbGxiYWNrIHVzaW5nIGByZXMudHlwZSgpYFxuICogb3IgYHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIC4uLilgLlxuICpcbiAqICAgIHJlcy5mb3JtYXQoe1xuICogICAgICAndGV4dC9wbGFpbic6IGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgcmVzLnNlbmQoJ2hleScpO1xuICogICAgICB9LFxuICpcbiAqICAgICAgJ3RleHQvaHRtbCc6IGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgcmVzLnNlbmQoJzxwPmhleTwvcD4nKTtcbiAqICAgICAgfSxcbiAqXG4gKiAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogZnVuY3Rpb24gKCkge1xuICogICAgICAgIHJlcy5zZW5kKHsgbWVzc2FnZTogJ2hleScgfSk7XG4gKiAgICAgIH1cbiAqICAgIH0pO1xuICpcbiAqIEluIGFkZGl0aW9uIHRvIGNhbm9uaWNhbGl6ZWQgTUlNRSB0eXBlcyB5b3UgbWF5XG4gKiBhbHNvIHVzZSBleHRuYW1lcyBtYXBwZWQgdG8gdGhlc2UgdHlwZXM6XG4gKlxuICogICAgcmVzLmZvcm1hdCh7XG4gKiAgICAgIHRleHQ6IGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgcmVzLnNlbmQoJ2hleScpO1xuICogICAgICB9LFxuICpcbiAqICAgICAgaHRtbDogZnVuY3Rpb24oKXtcbiAqICAgICAgICByZXMuc2VuZCgnPHA+aGV5PC9wPicpO1xuICogICAgICB9LFxuICpcbiAqICAgICAganNvbjogZnVuY3Rpb24oKXtcbiAqICAgICAgICByZXMuc2VuZCh7IG1lc3NhZ2U6ICdoZXknIH0pO1xuICogICAgICB9XG4gKiAgICB9KTtcbiAqXG4gKiBCeSBkZWZhdWx0IEV4cHJlc3MgcGFzc2VzIGFuIGBFcnJvcmBcbiAqIHdpdGggYSBgLnN0YXR1c2Agb2YgNDA2IHRvIGBuZXh0KGVycilgXG4gKiBpZiBhIG1hdGNoIGlzIG5vdCBtYWRlLiBJZiB5b3UgcHJvdmlkZVxuICogYSBgLmRlZmF1bHRgIGNhbGxiYWNrIGl0IHdpbGwgYmUgaW52b2tlZFxuICogaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtTZXJ2ZXJSZXNwb25zZX0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxucmVzLmZvcm1hdCA9IGZ1bmN0aW9uKG9iail7XG4gIHZhciByZXEgPSB0aGlzLnJlcTtcbiAgdmFyIG5leHQgPSByZXEubmV4dDtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iailcbiAgICAuZmlsdGVyKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2ICE9PSAnZGVmYXVsdCcgfSlcblxuICB2YXIga2V5ID0ga2V5cy5sZW5ndGggPiAwXG4gICAgPyByZXEuYWNjZXB0cyhrZXlzKVxuICAgIDogZmFsc2U7XG5cbiAgdGhpcy52YXJ5KFwiQWNjZXB0XCIpO1xuXG4gIGlmIChrZXkpIHtcbiAgICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgbm9ybWFsaXplVHlwZShrZXkpLnZhbHVlKTtcbiAgICBvYmpba2V5XShyZXEsIHRoaXMsIG5leHQpO1xuICB9IGVsc2UgaWYgKG9iai5kZWZhdWx0KSB7XG4gICAgb2JqLmRlZmF1bHQocmVxLCB0aGlzLCBuZXh0KVxuICB9IGVsc2Uge1xuICAgIG5leHQoY3JlYXRlRXJyb3IoNDA2LCB7XG4gICAgICB0eXBlczogbm9ybWFsaXplVHlwZXMoa2V5cykubWFwKGZ1bmN0aW9uIChvKSB7IHJldHVybiBvLnZhbHVlIH0pXG4gICAgfSkpXG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IF9Db250ZW50LURpc3Bvc2l0aW9uXyBoZWFkZXIgdG8gX2F0dGFjaG1lbnRfIHdpdGggb3B0aW9uYWwgYGZpbGVuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmlsZW5hbWVcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfVxuICogQHB1YmxpY1xuICovXG5cbnJlcy5hdHRhY2htZW50ID0gZnVuY3Rpb24gYXR0YWNobWVudChmaWxlbmFtZSkge1xuICBpZiAoZmlsZW5hbWUpIHtcbiAgICB0aGlzLnR5cGUoZXh0bmFtZShmaWxlbmFtZSkpO1xuICB9XG5cbiAgdGhpcy5zZXQoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCBjb250ZW50RGlzcG9zaXRpb24oZmlsZW5hbWUpKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQXBwZW5kIGFkZGl0aW9uYWwgaGVhZGVyIGBmaWVsZGAgd2l0aCB2YWx1ZSBgdmFsYC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgIHJlcy5hcHBlbmQoJ0xpbmsnLCBbJzxodHRwOi8vbG9jYWxob3N0Lz4nLCAnPGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC8+J10pO1xuICogICAgcmVzLmFwcGVuZCgnU2V0LUNvb2tpZScsICdmb289YmFyOyBQYXRoPS87IEh0dHBPbmx5Jyk7XG4gKiAgICByZXMuYXBwZW5kKCdXYXJuaW5nJywgJzE5OSBNaXNjZWxsYW5lb3VzIHdhcm5pbmcnKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSB2YWxcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKGZpZWxkLCB2YWwpIHtcbiAgdmFyIHByZXYgPSB0aGlzLmdldChmaWVsZCk7XG4gIHZhciB2YWx1ZSA9IHZhbDtcblxuICBpZiAocHJldikge1xuICAgIC8vIGNvbmNhdCB0aGUgbmV3IGFuZCBwcmV2IHZhbHNcbiAgICB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocHJldikgPyBwcmV2LmNvbmNhdCh2YWwpXG4gICAgICA6IEFycmF5LmlzQXJyYXkodmFsKSA/IFtwcmV2XS5jb25jYXQodmFsKVxuICAgICAgICA6IFtwcmV2LCB2YWxdXG4gIH1cblxuICByZXR1cm4gdGhpcy5zZXQoZmllbGQsIHZhbHVlKTtcbn07XG5cbi8qKlxuICogU2V0IGhlYWRlciBgZmllbGRgIHRvIGB2YWxgLCBvciBwYXNzXG4gKiBhbiBvYmplY3Qgb2YgaGVhZGVyIGZpZWxkcy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICByZXMuc2V0KCdGb28nLCBbJ2JhcicsICdiYXonXSk7XG4gKiAgICByZXMuc2V0KCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICogICAgcmVzLnNldCh7IEFjY2VwdDogJ3RleHQvcGxhaW4nLCAnWC1BUEktS2V5JzogJ3RvYmknIH0pO1xuICpcbiAqIEFsaWFzZWQgYXMgYHJlcy5oZWFkZXIoKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBmaWVsZFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHZhbFxuICogQHJldHVybiB7U2VydmVyUmVzcG9uc2V9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbnJlcy5zZXQgPVxucmVzLmhlYWRlciA9IGZ1bmN0aW9uIGhlYWRlcihmaWVsZCwgdmFsKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgdmFyIHZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgICA/IHZhbC5tYXAoU3RyaW5nKVxuICAgICAgOiBTdHJpbmcodmFsKTtcblxuICAgIC8vIGFkZCBjaGFyc2V0IHRvIGNvbnRlbnQtdHlwZVxuICAgIGlmIChmaWVsZC50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbnRlbnQtVHlwZSBjYW5ub3QgYmUgc2V0IHRvIGFuIEFycmF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIWNoYXJzZXRSZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIGNoYXJzZXQgPSBtaW1lLmNoYXJzZXRzLmxvb2t1cCh2YWx1ZS5zcGxpdCgnOycpWzBdKTtcbiAgICAgICAgaWYgKGNoYXJzZXQpIHZhbHVlICs9ICc7IGNoYXJzZXQ9JyArIGNoYXJzZXQudG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldEhlYWRlcihmaWVsZCwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGtleSBpbiBmaWVsZCkge1xuICAgICAgdGhpcy5zZXQoa2V5LCBmaWVsZFtrZXldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEdldCB2YWx1ZSBmb3IgaGVhZGVyIGBmaWVsZGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZpZWxkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxucmVzLmdldCA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgcmV0dXJuIHRoaXMuZ2V0SGVhZGVyKGZpZWxkKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgY29va2llIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7U2VydmVyUmVzcG9uc2V9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbnJlcy5jbGVhckNvb2tpZSA9IGZ1bmN0aW9uIGNsZWFyQ29va2llKG5hbWUsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBtZXJnZSh7IGV4cGlyZXM6IG5ldyBEYXRlKDEpLCBwYXRoOiAnLycgfSwgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHRoaXMuY29va2llKG5hbWUsICcnLCBvcHRzKTtcbn07XG5cbi8qKlxuICogU2V0IGNvb2tpZSBgbmFtZWAgdG8gYHZhbHVlYCwgd2l0aCB0aGUgZ2l2ZW4gYG9wdGlvbnNgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogICAgLSBgbWF4QWdlYCAgIG1heC1hZ2UgaW4gbWlsbGlzZWNvbmRzLCBjb252ZXJ0ZWQgdG8gYGV4cGlyZXNgXG4gKiAgICAtIGBzaWduZWRgICAgc2lnbiB0aGUgY29va2llXG4gKiAgICAtIGBwYXRoYCAgICAgZGVmYXVsdHMgdG8gXCIvXCJcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAvLyBcIlJlbWVtYmVyIE1lXCIgZm9yIDE1IG1pbnV0ZXNcbiAqICAgIHJlcy5jb29raWUoJ3JlbWVtYmVybWUnLCAnMScsIHsgZXhwaXJlczogbmV3IERhdGUoRGF0ZS5ub3coKSArIDkwMDAwMCksIGh0dHBPbmx5OiB0cnVlIH0pO1xuICpcbiAqICAgIC8vIHNhbWUgYXMgYWJvdmVcbiAqICAgIHJlcy5jb29raWUoJ3JlbWVtYmVybWUnLCAnMScsIHsgbWF4QWdlOiA5MDAwMDAsIGh0dHBPbmx5OiB0cnVlIH0pXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuY29va2llID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gbWVyZ2Uoe30sIG9wdGlvbnMpO1xuICB2YXIgc2VjcmV0ID0gdGhpcy5yZXEuc2VjcmV0O1xuICB2YXIgc2lnbmVkID0gb3B0cy5zaWduZWQ7XG5cbiAgaWYgKHNpZ25lZCAmJiAhc2VjcmV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb29raWVQYXJzZXIoXCJzZWNyZXRcIikgcmVxdWlyZWQgZm9yIHNpZ25lZCBjb29raWVzJyk7XG4gIH1cblxuICB2YXIgdmFsID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgID8gJ2o6JyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICAgIDogU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoc2lnbmVkKSB7XG4gICAgdmFsID0gJ3M6JyArIHNpZ24odmFsLCBzZWNyZXQpO1xuICB9XG5cbiAgaWYgKG9wdHMubWF4QWdlICE9IG51bGwpIHtcbiAgICB2YXIgbWF4QWdlID0gb3B0cy5tYXhBZ2UgLSAwXG5cbiAgICBpZiAoIWlzTmFOKG1heEFnZSkpIHtcbiAgICAgIG9wdHMuZXhwaXJlcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBtYXhBZ2UpXG4gICAgICBvcHRzLm1heEFnZSA9IE1hdGguZmxvb3IobWF4QWdlIC8gMTAwMClcbiAgICB9XG4gIH1cblxuICBpZiAob3B0cy5wYXRoID09IG51bGwpIHtcbiAgICBvcHRzLnBhdGggPSAnLyc7XG4gIH1cblxuICB0aGlzLmFwcGVuZCgnU2V0LUNvb2tpZScsIGNvb2tpZS5zZXJpYWxpemUobmFtZSwgU3RyaW5nKHZhbCksIG9wdHMpKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBsb2NhdGlvbiBoZWFkZXIgdG8gYHVybGAuXG4gKlxuICogVGhlIGdpdmVuIGB1cmxgIGNhbiBhbHNvIGJlIFwiYmFja1wiLCB3aGljaCByZWRpcmVjdHNcbiAqIHRvIHRoZSBfUmVmZXJyZXJfIG9yIF9SZWZlcmVyXyBoZWFkZXJzIG9yIFwiL1wiLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgIHJlcy5sb2NhdGlvbignL2Zvby9iYXInKS47XG4gKiAgICByZXMubG9jYXRpb24oJ2h0dHA6Ly9leGFtcGxlLmNvbScpO1xuICogICAgcmVzLmxvY2F0aW9uKCcuLi9sb2dpbicpO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmxcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMubG9jYXRpb24gPSBmdW5jdGlvbiBsb2NhdGlvbih1cmwpIHtcbiAgdmFyIGxvYyA9IHVybDtcblxuICAvLyBcImJhY2tcIiBpcyBhbiBhbGlhcyBmb3IgdGhlIHJlZmVycmVyXG4gIGlmICh1cmwgPT09ICdiYWNrJykge1xuICAgIGxvYyA9IHRoaXMucmVxLmdldCgnUmVmZXJyZXInKSB8fCAnLyc7XG4gIH1cblxuICAvLyBzZXQgbG9jYXRpb25cbiAgcmV0dXJuIHRoaXMuc2V0KCdMb2NhdGlvbicsIGVuY29kZVVybChsb2MpKTtcbn07XG5cbi8qKlxuICogUmVkaXJlY3QgdG8gdGhlIGdpdmVuIGB1cmxgIHdpdGggb3B0aW9uYWwgcmVzcG9uc2UgYHN0YXR1c2BcbiAqIGRlZmF1bHRpbmcgdG8gMzAyLlxuICpcbiAqIFRoZSByZXN1bHRpbmcgYHVybGAgaXMgZGV0ZXJtaW5lZCBieSBgcmVzLmxvY2F0aW9uKClgLCBzb1xuICogaXQgd2lsbCBwbGF5IG5pY2VseSB3aXRoIG1vdW50ZWQgYXBwcywgcmVsYXRpdmUgcGF0aHMsXG4gKiBgXCJiYWNrXCJgIGV0Yy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICByZXMucmVkaXJlY3QoJy9mb28vYmFyJyk7XG4gKiAgICByZXMucmVkaXJlY3QoJ2h0dHA6Ly9leGFtcGxlLmNvbScpO1xuICogICAgcmVzLnJlZGlyZWN0KDMwMSwgJ2h0dHA6Ly9leGFtcGxlLmNvbScpO1xuICogICAgcmVzLnJlZGlyZWN0KCcuLi9sb2dpbicpOyAvLyAvYmxvZy9wb3N0LzEgLT4gL2Jsb2cvbG9naW5cbiAqXG4gKiBAcHVibGljXG4gKi9cblxucmVzLnJlZGlyZWN0ID0gZnVuY3Rpb24gcmVkaXJlY3QodXJsKSB7XG4gIHZhciBhZGRyZXNzID0gdXJsO1xuICB2YXIgYm9keTtcbiAgdmFyIHN0YXR1cyA9IDMwMjtcblxuICAvLyBhbGxvdyBzdGF0dXMgLyB1cmxcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHN0YXR1cyA9IGFyZ3VtZW50c1swXTtcbiAgICAgIGFkZHJlc3MgPSBhcmd1bWVudHNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlcHJlY2F0ZSgncmVzLnJlZGlyZWN0KHVybCwgc3RhdHVzKTogVXNlIHJlcy5yZWRpcmVjdChzdGF0dXMsIHVybCkgaW5zdGVhZCcpO1xuICAgICAgc3RhdHVzID0gYXJndW1lbnRzWzFdO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNldCBsb2NhdGlvbiBoZWFkZXJcbiAgYWRkcmVzcyA9IHRoaXMubG9jYXRpb24oYWRkcmVzcykuZ2V0KCdMb2NhdGlvbicpO1xuXG4gIC8vIFN1cHBvcnQgdGV4dC97cGxhaW4saHRtbH0gYnkgZGVmYXVsdFxuICB0aGlzLmZvcm1hdCh7XG4gICAgdGV4dDogZnVuY3Rpb24oKXtcbiAgICAgIGJvZHkgPSBzdGF0dXNlcy5tZXNzYWdlW3N0YXR1c10gKyAnLiBSZWRpcmVjdGluZyB0byAnICsgYWRkcmVzc1xuICAgIH0sXG5cbiAgICBodG1sOiBmdW5jdGlvbigpe1xuICAgICAgdmFyIHUgPSBlc2NhcGVIdG1sKGFkZHJlc3MpO1xuICAgICAgYm9keSA9ICc8cD4nICsgc3RhdHVzZXMubWVzc2FnZVtzdGF0dXNdICsgJy4gUmVkaXJlY3RpbmcgdG8gPGEgaHJlZj1cIicgKyB1ICsgJ1wiPicgKyB1ICsgJzwvYT48L3A+J1xuICAgIH0sXG5cbiAgICBkZWZhdWx0OiBmdW5jdGlvbigpe1xuICAgICAgYm9keSA9ICcnO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUmVzcG9uZFxuICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHRoaXMuc2V0KCdDb250ZW50LUxlbmd0aCcsIEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHkpKTtcblxuICBpZiAodGhpcy5yZXEubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICB0aGlzLmVuZCgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZW5kKGJvZHkpO1xuICB9XG59O1xuXG4vKipcbiAqIEFkZCBgZmllbGRgIHRvIFZhcnkuIElmIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgVmFyeSBzZXQsIHRoZW5cbiAqIHRoaXMgY2FsbCBpcyBzaW1wbHkgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gZmllbGRcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMudmFyeSA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgLy8gY2hlY2tzIGZvciBiYWNrLWNvbXBhdFxuICBpZiAoIWZpZWxkIHx8IChBcnJheS5pc0FycmF5KGZpZWxkKSAmJiAhZmllbGQubGVuZ3RoKSkge1xuICAgIGRlcHJlY2F0ZSgncmVzLnZhcnkoKTogUHJvdmlkZSBhIGZpZWxkIG5hbWUnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhcnkodGhpcywgZmllbGQpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW5kZXIgYHZpZXdgIHdpdGggdGhlIGdpdmVuIGBvcHRpb25zYCBhbmQgb3B0aW9uYWwgY2FsbGJhY2sgYGZuYC5cbiAqIFdoZW4gYSBjYWxsYmFjayBmdW5jdGlvbiBpcyBnaXZlbiBhIHJlc3BvbnNlIHdpbGwgX25vdF8gYmUgbWFkZVxuICogYXV0b21hdGljYWxseSwgb3RoZXJ3aXNlIGEgcmVzcG9uc2Ugb2YgXzIwMF8gYW5kIF90ZXh0L2h0bWxfIGlzIGdpdmVuLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGNhY2hlYCAgICAgYm9vbGVhbiBoaW50aW5nIHRvIHRoZSBlbmdpbmUgaXQgc2hvdWxkIGNhY2hlXG4gKiAgLSBgZmlsZW5hbWVgICBmaWxlbmFtZSBvZiB0aGUgdmlldyBiZWluZyByZW5kZXJlZFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKHZpZXcsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBhcHAgPSB0aGlzLnJlcS5hcHA7XG4gIHZhciBkb25lID0gY2FsbGJhY2s7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJlcSA9IHRoaXMucmVxO1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gc3VwcG9ydCBjYWxsYmFjayBmdW5jdGlvbiBhcyBzZWNvbmQgYXJnXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBvcHRpb25zO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIC8vIG1lcmdlIHJlcy5sb2NhbHNcbiAgb3B0cy5fbG9jYWxzID0gc2VsZi5sb2NhbHM7XG5cbiAgLy8gZGVmYXVsdCBjYWxsYmFjayB0byByZXNwb25kXG4gIGRvbmUgPSBkb25lIHx8IGZ1bmN0aW9uIChlcnIsIHN0cikge1xuICAgIGlmIChlcnIpIHJldHVybiByZXEubmV4dChlcnIpO1xuICAgIHNlbGYuc2VuZChzdHIpO1xuICB9O1xuXG4gIC8vIHJlbmRlclxuICBhcHAucmVuZGVyKHZpZXcsIG9wdHMsIGRvbmUpO1xufTtcblxuLy8gcGlwZSB0aGUgc2VuZCBmaWxlIHN0cmVhbVxuZnVuY3Rpb24gc2VuZGZpbGUocmVzLCBmaWxlLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZG9uZSA9IGZhbHNlO1xuICB2YXIgc3RyZWFtaW5nO1xuXG4gIC8vIHJlcXVlc3QgYWJvcnRlZFxuICBmdW5jdGlvbiBvbmFib3J0ZWQoKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcblxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcpO1xuICAgIGVyci5jb2RlID0gJ0VDT05OQUJPUlRFRCc7XG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxuXG4gIC8vIGRpcmVjdG9yeVxuICBmdW5jdGlvbiBvbmRpcmVjdG9yeSgpIHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgIGRvbmUgPSB0cnVlO1xuXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignRUlTRElSLCByZWFkJyk7XG4gICAgZXJyLmNvZGUgPSAnRUlTRElSJztcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgLy8gZXJyb3JzXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXJyKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgLy8gZW5kZWRcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgLy8gZmlsZVxuICBmdW5jdGlvbiBvbmZpbGUoKSB7XG4gICAgc3RyZWFtaW5nID0gZmFsc2U7XG4gIH1cblxuICAvLyBmaW5pc2hlZFxuICBmdW5jdGlvbiBvbmZpbmlzaChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRUNPTk5SRVNFVCcpIHJldHVybiBvbmFib3J0ZWQoKTtcbiAgICBpZiAoZXJyKSByZXR1cm4gb25lcnJvcihlcnIpO1xuICAgIGlmIChkb25lKSByZXR1cm47XG5cbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHN0cmVhbWluZyAhPT0gZmFsc2UgJiYgIWRvbmUpIHtcbiAgICAgICAgb25hYm9ydGVkKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHN0cmVhbWluZ1xuICBmdW5jdGlvbiBvbnN0cmVhbSgpIHtcbiAgICBzdHJlYW1pbmcgPSB0cnVlO1xuICB9XG5cbiAgZmlsZS5vbignZGlyZWN0b3J5Jywgb25kaXJlY3RvcnkpO1xuICBmaWxlLm9uKCdlbmQnLCBvbmVuZCk7XG4gIGZpbGUub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGZpbGUub24oJ2ZpbGUnLCBvbmZpbGUpO1xuICBmaWxlLm9uKCdzdHJlYW0nLCBvbnN0cmVhbSk7XG4gIG9uRmluaXNoZWQocmVzLCBvbmZpbmlzaCk7XG5cbiAgaWYgKG9wdGlvbnMuaGVhZGVycykge1xuICAgIC8vIHNldCBoZWFkZXJzIG9uIHN1Y2Nlc3NmdWwgdHJhbnNmZXJcbiAgICBmaWxlLm9uKCdoZWFkZXJzJywgZnVuY3Rpb24gaGVhZGVycyhyZXMpIHtcbiAgICAgIHZhciBvYmogPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgayA9IGtleXNbaV07XG4gICAgICAgIHJlcy5zZXRIZWFkZXIoaywgb2JqW2tdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIHBpcGVcbiAgZmlsZS5waXBlKHJlcyk7XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IEpTT04sIGxpa2UgSlNPTi5zdHJpbmdpZnksIGJ1dCB2OCBvcHRpbWl6ZWQsIHdpdGggdGhlXG4gKiBhYmlsaXR5IHRvIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgY2FuIHRyaWdnZXIgSFRNTCBzbmlmZmluZy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSByZXBsYWNlclxuICogQHBhcmFtIHtudW1iZXJ9IHNwYWNlc1xuICogQHBhcmFtIHtib29sZWFufSBlc2NhcGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0cmluZ2lmeSAodmFsdWUsIHJlcGxhY2VyLCBzcGFjZXMsIGVzY2FwZSkge1xuICAvLyB2OCBjaGVja3MgYXJndW1lbnRzLmxlbmd0aCBmb3Igb3B0aW1pemluZyBzaW1wbGUgY2FsbFxuICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00NzMwXG4gIHZhciBqc29uID0gcmVwbGFjZXIgfHwgc3BhY2VzXG4gICAgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIsIHNwYWNlcylcbiAgICA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICBpZiAoZXNjYXBlICYmIHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykge1xuICAgIGpzb24gPSBqc29uLnJlcGxhY2UoL1s8PiZdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgICBzd2l0Y2ggKGMuY2hhckNvZGVBdCgwKSkge1xuICAgICAgICBjYXNlIDB4M2M6XG4gICAgICAgICAgcmV0dXJuICdcXFxcdTAwM2MnXG4gICAgICAgIGNhc2UgMHgzZTpcbiAgICAgICAgICByZXR1cm4gJ1xcXFx1MDAzZSdcbiAgICAgICAgY2FzZSAweDI2OlxuICAgICAgICAgIHJldHVybiAnXFxcXHUwMDI2J1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogdW5yZWFjaGFibGUgZGVmYXVsdCAqL1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBjXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBqc29uXG59XG4iLCAiLyohXG4gKiBzZXJ2ZS1zdGF0aWNcbiAqIENvcHlyaWdodChjKSAyMDEwIFNlbmNoYSBJbmMuXG4gKiBDb3B5cmlnaHQoYykgMjAxMSBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGVuY29kZVVybCA9IHJlcXVpcmUoJ2VuY29kZXVybCcpXG52YXIgZXNjYXBlSHRtbCA9IHJlcXVpcmUoJ2VzY2FwZS1odG1sJylcbnZhciBwYXJzZVVybCA9IHJlcXVpcmUoJ3BhcnNldXJsJylcbnZhciByZXNvbHZlID0gcmVxdWlyZSgncGF0aCcpLnJlc29sdmVcbnZhciBzZW5kID0gcmVxdWlyZSgnc2VuZCcpXG52YXIgdXJsID0gcmVxdWlyZSgndXJsJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlcnZlU3RhdGljXG5tb2R1bGUuZXhwb3J0cy5taW1lID0gc2VuZC5taW1lXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHNlcnZlU3RhdGljIChyb290LCBvcHRpb25zKSB7XG4gIGlmICghcm9vdCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Jvb3QgcGF0aCByZXF1aXJlZCcpXG4gIH1cblxuICBpZiAodHlwZW9mIHJvb3QgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncm9vdCBwYXRoIG11c3QgYmUgYSBzdHJpbmcnKVxuICB9XG5cbiAgLy8gY29weSBvcHRpb25zIG9iamVjdFxuICB2YXIgb3B0cyA9IE9iamVjdC5jcmVhdGUob3B0aW9ucyB8fCBudWxsKVxuXG4gIC8vIGZhbGwtdGhvdWdoXG4gIHZhciBmYWxsdGhyb3VnaCA9IG9wdHMuZmFsbHRocm91Z2ggIT09IGZhbHNlXG5cbiAgLy8gZGVmYXVsdCByZWRpcmVjdFxuICB2YXIgcmVkaXJlY3QgPSBvcHRzLnJlZGlyZWN0ICE9PSBmYWxzZVxuXG4gIC8vIGhlYWRlcnMgbGlzdGVuZXJcbiAgdmFyIHNldEhlYWRlcnMgPSBvcHRzLnNldEhlYWRlcnNcblxuICBpZiAoc2V0SGVhZGVycyAmJiB0eXBlb2Ygc2V0SGVhZGVycyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBzZXRIZWFkZXJzIG11c3QgYmUgZnVuY3Rpb24nKVxuICB9XG5cbiAgLy8gc2V0dXAgb3B0aW9ucyBmb3Igc2VuZFxuICBvcHRzLm1heGFnZSA9IG9wdHMubWF4YWdlIHx8IG9wdHMubWF4QWdlIHx8IDBcbiAgb3B0cy5yb290ID0gcmVzb2x2ZShyb290KVxuXG4gIC8vIGNvbnN0cnVjdCBkaXJlY3RvcnkgbGlzdGVuZXJcbiAgdmFyIG9uRGlyZWN0b3J5ID0gcmVkaXJlY3RcbiAgICA/IGNyZWF0ZVJlZGlyZWN0RGlyZWN0b3J5TGlzdGVuZXIoKVxuICAgIDogY3JlYXRlTm90Rm91bmREaXJlY3RvcnlMaXN0ZW5lcigpXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHNlcnZlU3RhdGljIChyZXEsIHJlcywgbmV4dCkge1xuICAgIGlmIChyZXEubWV0aG9kICE9PSAnR0VUJyAmJiByZXEubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgIGlmIChmYWxsdGhyb3VnaCkge1xuICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICB9XG5cbiAgICAgIC8vIG1ldGhvZCBub3QgYWxsb3dlZFxuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDVcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0FsbG93JywgJ0dFVCwgSEVBRCcpXG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsICcwJylcbiAgICAgIHJlcy5lbmQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGZvcndhcmRFcnJvciA9ICFmYWxsdGhyb3VnaFxuICAgIHZhciBvcmlnaW5hbFVybCA9IHBhcnNlVXJsLm9yaWdpbmFsKHJlcSlcbiAgICB2YXIgcGF0aCA9IHBhcnNlVXJsKHJlcSkucGF0aG5hbWVcblxuICAgIC8vIG1ha2Ugc3VyZSByZWRpcmVjdCBvY2N1cnMgYXQgbW91bnRcbiAgICBpZiAocGF0aCA9PT0gJy8nICYmIG9yaWdpbmFsVXJsLnBhdGhuYW1lLnN1YnN0cigtMSkgIT09ICcvJykge1xuICAgICAgcGF0aCA9ICcnXG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIHNlbmQgc3RyZWFtXG4gICAgdmFyIHN0cmVhbSA9IHNlbmQocmVxLCBwYXRoLCBvcHRzKVxuXG4gICAgLy8gYWRkIGRpcmVjdG9yeSBoYW5kbGVyXG4gICAgc3RyZWFtLm9uKCdkaXJlY3RvcnknLCBvbkRpcmVjdG9yeSlcblxuICAgIC8vIGFkZCBoZWFkZXJzIGxpc3RlbmVyXG4gICAgaWYgKHNldEhlYWRlcnMpIHtcbiAgICAgIHN0cmVhbS5vbignaGVhZGVycycsIHNldEhlYWRlcnMpXG4gICAgfVxuXG4gICAgLy8gYWRkIGZpbGUgbGlzdGVuZXIgZm9yIGZhbGx0aHJvdWdoXG4gICAgaWYgKGZhbGx0aHJvdWdoKSB7XG4gICAgICBzdHJlYW0ub24oJ2ZpbGUnLCBmdW5jdGlvbiBvbkZpbGUgKCkge1xuICAgICAgICAvLyBvbmNlIGZpbGUgaXMgZGV0ZXJtaW5lZCwgYWx3YXlzIGZvcndhcmQgZXJyb3JcbiAgICAgICAgZm9yd2FyZEVycm9yID0gdHJ1ZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBmb3J3YXJkIGVycm9yc1xuICAgIHN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiBlcnJvciAoZXJyKSB7XG4gICAgICBpZiAoZm9yd2FyZEVycm9yIHx8ICEoZXJyLnN0YXR1c0NvZGUgPCA1MDApKSB7XG4gICAgICAgIG5leHQoZXJyKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbmV4dCgpXG4gICAgfSlcblxuICAgIC8vIHBpcGVcbiAgICBzdHJlYW0ucGlwZShyZXMpXG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsYXBzZSBhbGwgbGVhZGluZyBzbGFzaGVzIGludG8gYSBzaW5nbGUgc2xhc2hcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbGxhcHNlTGVhZGluZ1NsYXNoZXMgKHN0cikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSAhPT0gMHgyZiAvKiAvICovKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpID4gMVxuICAgID8gJy8nICsgc3RyLnN1YnN0cihpKVxuICAgIDogc3RyXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbWluaW1hbCBIVE1MIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGJvZHlcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlSHRtbERvY3VtZW50ICh0aXRsZSwgYm9keSkge1xuICByZXR1cm4gJzwhRE9DVFlQRSBodG1sPlxcbicgK1xuICAgICc8aHRtbCBsYW5nPVwiZW5cIj5cXG4nICtcbiAgICAnPGhlYWQ+XFxuJyArXG4gICAgJzxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxcbicgK1xuICAgICc8dGl0bGU+JyArIHRpdGxlICsgJzwvdGl0bGU+XFxuJyArXG4gICAgJzwvaGVhZD5cXG4nICtcbiAgICAnPGJvZHk+XFxuJyArXG4gICAgJzxwcmU+JyArIGJvZHkgKyAnPC9wcmU+XFxuJyArXG4gICAgJzwvYm9keT5cXG4nICtcbiAgICAnPC9odG1sPlxcbidcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkaXJlY3RvcnkgbGlzdGVuZXIgdGhhdCBqdXN0IDQwNHMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZU5vdEZvdW5kRGlyZWN0b3J5TGlzdGVuZXIgKCkge1xuICByZXR1cm4gZnVuY3Rpb24gbm90Rm91bmQgKCkge1xuICAgIHRoaXMuZXJyb3IoNDA0KVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZGlyZWN0b3J5IGxpc3RlbmVyIHRoYXQgcGVyZm9ybXMgYSByZWRpcmVjdC5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlUmVkaXJlY3REaXJlY3RvcnlMaXN0ZW5lciAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiByZWRpcmVjdCAocmVzKSB7XG4gICAgaWYgKHRoaXMuaGFzVHJhaWxpbmdTbGFzaCgpKSB7XG4gICAgICB0aGlzLmVycm9yKDQwNClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBvcmlnaW5hbCBVUkxcbiAgICB2YXIgb3JpZ2luYWxVcmwgPSBwYXJzZVVybC5vcmlnaW5hbCh0aGlzLnJlcSlcblxuICAgIC8vIGFwcGVuZCB0cmFpbGluZyBzbGFzaFxuICAgIG9yaWdpbmFsVXJsLnBhdGggPSBudWxsXG4gICAgb3JpZ2luYWxVcmwucGF0aG5hbWUgPSBjb2xsYXBzZUxlYWRpbmdTbGFzaGVzKG9yaWdpbmFsVXJsLnBhdGhuYW1lICsgJy8nKVxuXG4gICAgLy8gcmVmb3JtYXQgdGhlIFVSTFxuICAgIHZhciBsb2MgPSBlbmNvZGVVcmwodXJsLmZvcm1hdChvcmlnaW5hbFVybCkpXG4gICAgdmFyIGRvYyA9IGNyZWF0ZUh0bWxEb2N1bWVudCgnUmVkaXJlY3RpbmcnLCAnUmVkaXJlY3RpbmcgdG8gPGEgaHJlZj1cIicgKyBlc2NhcGVIdG1sKGxvYykgKyAnXCI+JyArXG4gICAgICBlc2NhcGVIdG1sKGxvYykgKyAnPC9hPicpXG5cbiAgICAvLyBzZW5kIHJlZGlyZWN0IHJlc3BvbnNlXG4gICAgcmVzLnN0YXR1c0NvZGUgPSAzMDFcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sOyBjaGFyc2V0PVVURi04JylcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIEJ1ZmZlci5ieXRlTGVuZ3RoKGRvYykpXG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBcImRlZmF1bHQtc3JjICdub25lJ1wiKVxuICAgIHJlcy5zZXRIZWFkZXIoJ1gtQ29udGVudC1UeXBlLU9wdGlvbnMnLCAnbm9zbmlmZicpXG4gICAgcmVzLnNldEhlYWRlcignTG9jYXRpb24nLCBsb2MpXG4gICAgcmVzLmVuZChkb2MpXG4gIH1cbn1cbiIsICIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgYm9keVBhcnNlciA9IHJlcXVpcmUoJ2JvZHktcGFyc2VyJylcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgbWl4aW4gPSByZXF1aXJlKCdtZXJnZS1kZXNjcmlwdG9ycycpO1xudmFyIHByb3RvID0gcmVxdWlyZSgnLi9hcHBsaWNhdGlvbicpO1xudmFyIFJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZXIvcm91dGUnKTtcbnZhciBSb3V0ZXIgPSByZXF1aXJlKCcuL3JvdXRlcicpO1xudmFyIHJlcSA9IHJlcXVpcmUoJy4vcmVxdWVzdCcpO1xudmFyIHJlcyA9IHJlcXVpcmUoJy4vcmVzcG9uc2UnKTtcblxuLyoqXG4gKiBFeHBvc2UgYGNyZWF0ZUFwcGxpY2F0aW9uKClgLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUFwcGxpY2F0aW9uO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBleHByZXNzIGFwcGxpY2F0aW9uLlxuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVBcHBsaWNhdGlvbigpIHtcbiAgdmFyIGFwcCA9IGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgYXBwLmhhbmRsZShyZXEsIHJlcywgbmV4dCk7XG4gIH07XG5cbiAgbWl4aW4oYXBwLCBFdmVudEVtaXR0ZXIucHJvdG90eXBlLCBmYWxzZSk7XG4gIG1peGluKGFwcCwgcHJvdG8sIGZhbHNlKTtcblxuICAvLyBleHBvc2UgdGhlIHByb3RvdHlwZSB0aGF0IHdpbGwgZ2V0IHNldCBvbiByZXF1ZXN0c1xuICBhcHAucmVxdWVzdCA9IE9iamVjdC5jcmVhdGUocmVxLCB7XG4gICAgYXBwOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiBhcHAgfVxuICB9KVxuXG4gIC8vIGV4cG9zZSB0aGUgcHJvdG90eXBlIHRoYXQgd2lsbCBnZXQgc2V0IG9uIHJlc3BvbnNlc1xuICBhcHAucmVzcG9uc2UgPSBPYmplY3QuY3JlYXRlKHJlcywge1xuICAgIGFwcDogeyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogYXBwIH1cbiAgfSlcblxuICBhcHAuaW5pdCgpO1xuICByZXR1cm4gYXBwO1xufVxuXG4vKipcbiAqIEV4cG9zZSB0aGUgcHJvdG90eXBlcy5cbiAqL1xuXG5leHBvcnRzLmFwcGxpY2F0aW9uID0gcHJvdG87XG5leHBvcnRzLnJlcXVlc3QgPSByZXE7XG5leHBvcnRzLnJlc3BvbnNlID0gcmVzO1xuXG4vKipcbiAqIEV4cG9zZSBjb25zdHJ1Y3RvcnMuXG4gKi9cblxuZXhwb3J0cy5Sb3V0ZSA9IFJvdXRlO1xuZXhwb3J0cy5Sb3V0ZXIgPSBSb3V0ZXI7XG5cbi8qKlxuICogRXhwb3NlIG1pZGRsZXdhcmVcbiAqL1xuXG5leHBvcnRzLmpzb24gPSBib2R5UGFyc2VyLmpzb25cbmV4cG9ydHMucXVlcnkgPSByZXF1aXJlKCcuL21pZGRsZXdhcmUvcXVlcnknKTtcbmV4cG9ydHMucmF3ID0gYm9keVBhcnNlci5yYXdcbmV4cG9ydHMuc3RhdGljID0gcmVxdWlyZSgnc2VydmUtc3RhdGljJyk7XG5leHBvcnRzLnRleHQgPSBib2R5UGFyc2VyLnRleHRcbmV4cG9ydHMudXJsZW5jb2RlZCA9IGJvZHlQYXJzZXIudXJsZW5jb2RlZFxuXG4vKipcbiAqIFJlcGxhY2UgcmVtb3ZlZCBtaWRkbGV3YXJlIHdpdGggYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZS5cbiAqL1xuXG52YXIgcmVtb3ZlZE1pZGRsZXdhcmVzID0gW1xuICAnYm9keVBhcnNlcicsXG4gICdjb21wcmVzcycsXG4gICdjb29raWVTZXNzaW9uJyxcbiAgJ3Nlc3Npb24nLFxuICAnbG9nZ2VyJyxcbiAgJ2Nvb2tpZVBhcnNlcicsXG4gICdmYXZpY29uJyxcbiAgJ3Jlc3BvbnNlVGltZScsXG4gICdlcnJvckhhbmRsZXInLFxuICAndGltZW91dCcsXG4gICdtZXRob2RPdmVycmlkZScsXG4gICd2aG9zdCcsXG4gICdjc3JmJyxcbiAgJ2RpcmVjdG9yeScsXG4gICdsaW1pdCcsXG4gICdtdWx0aXBhcnQnLFxuICAnc3RhdGljQ2FjaGUnXG5dXG5cbnJlbW92ZWRNaWRkbGV3YXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vc3QgbWlkZGxld2FyZSAobGlrZSAnICsgbmFtZSArICcpIGlzIG5vIGxvbmdlciBidW5kbGVkIHdpdGggRXhwcmVzcyBhbmQgbXVzdCBiZSBpbnN0YWxsZWQgc2VwYXJhdGVseS4gUGxlYXNlIHNlZSBodHRwczovL2dpdGh1Yi5jb20vc2VuY2hhbGFicy9jb25uZWN0I21pZGRsZXdhcmUuJyk7XG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59KTtcbiIsICIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvZXhwcmVzcycpO1xuIiwgIlx1RkVGRm1vZHVsZS5leHBvcnRzID0gKGNvbnRlbnQpID0+IHtcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnRlbnQubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgLy8gSWYgPyBpcyBlbmNvdW50ZXJlZCBpdCdzIGRlZmluaXRlbHkgbm90IHV0ZjghXG4gICAgICAgIGlmIChjb250ZW50W2JdID09PSBcIlx1RkZGRFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59IiwgIlx1RkVGRmNvbnN0IGZsYWcgPSBcImdpXCI7XG5cbmNvbnN0IHNoYXJlZFJlZ2V4ID0ge1xuICAgIGN6ZWNoOiBuZXcgUmVnRXhwKC9qc2VtfGpzaS8sIGZsYWcpLFxuICAgIGh1bmdhcmlhbjogbmV3IFJlZ0V4cCgvXFxzbmVtXFxzLywgZmxhZyksXG4gICAgc2xvdmFrOiBuZXcgUmVnRXhwKC9wb3JpYWRrdXxteXNsXHUwMEVEbXxcXHNzbWVcXHMvLCBmbGFnKSxcbiAgICBzbG92ZW5pYW46IG5ldyBSZWdFeHAoL1xcc2thalxcc3xsYWhrb3x6ZGFqLywgZmxhZyksXG4gICAgYWxiYW5pYW46IG5ldyBSZWdFeHAoL251ay8sIGZsYWcpLFxuICAgIGVuZ2xpc2g6IG5ldyBSZWdFeHAoLyB0aGUgLywgZmxhZyksXG4gICAgZnJlbmNoOiBuZXcgUmVnRXhwKC9jJ2VzdC8sIGZsYWcpLFxuICAgIHBvcnR1Z3Vlc2U6IG5ldyBSZWdFeHAoLyBuXHUwMEUzbyAvLCBmbGFnKSxcbiAgICBzcGFuaXNoOiBuZXcgUmVnRXhwKC9lc3RhYmF8XFxzbXV5XFxzfHNpZW1wcmV8YWhvcmEvLCBmbGFnKSxcbiAgICBnZXJtYW46IG5ldyBSZWdFeHAoL1xcc2Rhc1xccy8sIGZsYWcpLFxuICAgIGl0YWxpYW46IG5ldyBSZWdFeHAoL1xcc2NoZVxccy8sIGZsYWcpLFxuICAgIGRhbmlzaDogbmV3IFJlZ0V4cCgvaHZhZHxub2dldC8sIGZsYWcpLFxuICAgIG5vcndlZ2lhbjogbmV3IFJlZ0V4cCgvZGVnLywgZmxhZyksXG4gICAgc3dlZGlzaDogbmV3IFJlZ0V4cCgvIGphZyAvLCBmbGFnKSxcbiAgICBkdXRjaDogbmV3IFJlZ0V4cCgvIGhldCAvLCBmbGFnKSxcbiAgICBmaW5uaXNoOiBuZXcgUmVnRXhwKC9oXHUwMEU0bi8sIGZsYWcpLFxuICAgIFwic2VyYm8tY3JvYXRpYW5cIjogbmV3IFJlZ0V4cCgvIHNhbSB8IGtha28gLywgZmxhZyksXG4gICAgZXN0b25pYW46IG5ldyBSZWdFeHAoL1xcc3NlZGFcXHN8XFxzcG9sZVxcc3xtaWRhZ2kvLCBmbGFnKSxcbiAgICBpY2VsYW5kaWM6IG5ldyBSZWdFeHAoL1x1MDBERWFcdTAwRjAvLCBmbGFnKSxcbiAgICBcIm1hbGF5LWluZG9uZXNpYW5cIjogbmV3IFJlZ0V4cCgvdGlkYWsvLCBmbGFnKSxcbiAgICB0dXJraXNoOiBuZXcgUmVnRXhwKC8gYmlyIC8sIGZsYWcpLFxuICAgIGxpdGh1YW5pYW46IG5ldyBSZWdFeHAoL3RhaXB8XFxzdGFpXFxzLywgZmxhZyksXG4gICAgYmVuZ2FsaTogbmV3IFJlZ0V4cCgvXHUwOThGXHUwOTlGXHUwOUJFLywgZmxhZyksXG4gICAgaGluZGk6IG5ldyBSZWdFeHAoL1x1MDkzOVx1MDk0OFx1MDkwMi8sIGZsYWcpLFxuICAgIHVyZHU6IG5ldyBSZWdFeHAoL1x1MDYyN1x1MDZDQ1x1MDZBOS8sIGZsYWcpLFxuICAgIHZpZXRuYW1lc2U6IG5ldyBSZWdFeHAoLyBraFx1MDBGNG5nIC8sIGZsYWcpXG59O1xuXG5jb25zdCBzaGFyZWRGcmVxdWVuY3kgPSB7XG4gICAgcG9saXNoOiB7IGxvdzogMC4wMDQzNTUsIGhpZ2g6IDAuMDA1MTAyIH0sXG4gICAgY3plY2g6IHsgbG93OiAwLjAwNDQzMywgaGlnaDogMC4wMDczMjQgfSxcbiAgICBodW5nYXJpYW46IHsgbG93OiAwLjAwNDk5NCwgaGlnaDogMC4wMDUxODMgfSxcbiAgICByb21hbmlhbjogeyBsb3c6IDAuMDAzMzE5LCBoaWdoOiAwLjAwNDE5MCB9LFxuICAgIHNsb3ZhazogeyBsb3c6IDAuMDAxNzM2LCBoaWdoOiAwLjAwMjU1NyB9LFxuICAgIHNsb3ZlbmlhbjogeyBsb3c6IDAuMDA0MTExLCBoaWdoOiAwLjAwNDk1OSB9LFxuICAgIGFsYmFuaWFuOiB7IGxvdzogMC4wMDM3NzMsIGhpZ2g6IDAuMDA3MzEzIH0sXG4gICAgdWtyYWluaWFuOiB7IGxvdzogMC4wMDI5MzMsIGhpZ2g6IDAuMDA1Mzg5IH0sXG4gICAgZW5nbGlzaDogeyBsb3c6IDAuMDA0Njc5LCBoaWdoOiAwLjAwNzU4MCB9LFxuICAgIGZyZW5jaDogeyBsb3c6IDAuMDAzMDE2LCBoaWdoOiAwLjAwNDgyNSB9LFxuICAgIHBvcnR1Z3Vlc2U6IHsgbG93OiAwLjAwMzQwNiwgaGlnaDogMC4wMDUwMzIgfSxcbiAgICBzcGFuaXNoOiB7IGxvdzogMC4wMDIzNDgsIGhpZ2g6IDAuMDAyODgxIH0sXG4gICAgZ2VybWFuOiB7IGxvdzogMC4wMDQwNDQsIGhpZ2g6IDAuMDA0MzkxIH0sXG4gICAgaXRhbGlhbjogeyBsb3c6IDAuMDAzODg5LCBoaWdoOiAwLjAwNTE3NSB9LFxuICAgIGRhbmlzaDogeyBsb3c6IDAuMDAzNjMwLCBoaWdoOiAwLjAwNDE4OSB9LFxuICAgIG5vcndlZ2lhbjogeyBsb3c6IDAuMDAyNDEwLCBoaWdoOiAwLjAwMzkxOCB9LFxuICAgIHN3ZWRpc2g6IHsgbG93OiAwLjAwNDkxNiwgaGlnaDogMC4wMDcyMjEgfSxcbiAgICBkdXRjaDogeyBsb3c6IDAuMDAzNTAxLCBoaWdoOiAwLjAwNDE1MCB9LFxuICAgIGZpbm5pc2g6IHsgbG93OiAwLjAwMzMwOCwgaGlnaDogMC4wMDUxMzUgfSxcbiAgICBcInNlcmJvLWNyb2F0aWFuXCI6IHsgbG93OiAwLjAwMjU2OCwgaGlnaDogMC4wMDUxODIgfSxcbiAgICBlc3RvbmlhbjogeyBsb3c6IDAuMDAyODkyLCBoaWdoOiAwLjAwMzk2MyB9LFxuICAgIGljZWxhbmRpYzogeyBsb3c6IDAuMDA0MzY2LCBoaWdoOiAwLjAwNDM2NiB9LFxuICAgIFwibWFsYXktaW5kb25lc2lhblwiOiB7IGxvdzogMC4wMDI4MjUsIGhpZ2g6IDAuMDAzOTMyIH0sXG4gICAgZ3JlZWs6IHsgbG93OiAwLjAwMzQ0MCwgaGlnaDogMC4wMDQ4NjIgfSxcbiAgICB0dXJraXNoOiB7IGxvdzogMC4wMDI5MTUsIGhpZ2g6IDAuMDA0NTg4IH0sXG4gICAgaGVicmV3OiB7IGxvdzogMC4wMDM2NjMsIGhpZ2g6IDAuMDA0NjY2IH0sXG4gICAgbGl0aHVhbmlhbjogeyBsb3c6IDAuMDAzMjc3LCBoaWdoOiAwLjAwMzc2OCB9LFxuICAgIGJlbmdhbGk6IHsgbG93OiAwLjAwMzE1NSwgaGlnaDogMC4wMDUyMzYgfSxcbiAgICBoaW5kaTogeyBsb3c6IDAuMDA0MTU5LCBoaWdoOiAwLjAwNjQ3OCB9LFxuICAgIHVyZHU6IHsgbG93OiAwLjAwNDExOCwgaGlnaDogMC4wMDU4NTEgfSxcbiAgICB2aWV0bmFtZXNlOiB7IGxvdzogMC4wMDMzODcsIGhpZ2g6IDAuMDA1MTkxIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gW1xuICAgIHtcbiAgICAgICAgbmFtZTogXCJwb2xpc2hcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9zaVx1MDExOS8sIGZsYWcpLFxuICAgICAgICBpc29SZWdleDogbmV3IFJlZ0V4cCgvc2lcdTAwRUEvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjUwXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LnBvbGlzaCxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kucG9saXNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiY3plY2hcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBzaGFyZWRSZWdleC5jemVjaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LmN6ZWNoLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTBcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuY3plY2gsXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmN6ZWNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaHVuZ2FyaWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguaHVuZ2FyaWFuLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXguaHVuZ2FyaWFuLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTBcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaHVuZ2FyaWFuLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5odW5nYXJpYW5cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJyb21hbmlhblwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IG5ldyBSZWdFeHAoL3N1bnR8ZVx1MDE1RnRpLywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9zdW50fGVcdTAwQkF0aS8sIGZsYWcpLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTBcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kucm9tYW5pYW4sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LnJvbWFuaWFuXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwic2xvdmFrXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguc2xvdmFrLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXguc2xvdmFrLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTBcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuc2xvdmFrLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5zbG92YWtcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJzbG92ZW5pYW5cIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBzaGFyZWRSZWdleC5zbG92ZW5pYW4sXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5zbG92ZW5pYW4sXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MFwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5zbG92ZW5pYW4sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LnNsb3ZlbmlhblxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImFsYmFuaWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguYWxiYW5pYW4sXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5hbGJhbmlhbixcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjUwXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmFsYmFuaWFuLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5hbGJhbmlhblxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcInJ1c3NpYW5cIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9cdTA0NDdcdTA0NDJcdTA0M0UvLCBmbGFnKSxcbiAgICAgICAgaXNvUmVnZXg6IG5ldyBSZWdFeHAoL1x1MDBGN1x1MDBGMlx1MDBFRS8sIGZsYWcpLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTFcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiB7IGxvdzogMC4wMDQ5NjUsIGhpZ2g6IDAuMDA1MzQxIH0sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogeyBsb3c6IDAuMDAzODg0LCBoaWdoOiAwLjAwMzk4NiB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwidWtyYWluaWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogbmV3IFJlZ0V4cCgvXHUwNDMyXHUwNDU2XHUwNDNEfFx1MDQzMFx1MDQzQlx1MDQzNS8sIGZsYWcpLFxuICAgICAgICBpc29SZWdleDogbmV3IFJlZ0V4cCgvXHUwMEUyXHUwMEIzXHUwMEVEfFx1MDBFMFx1MDBFQlx1MDBFNS8sIGZsYWcpLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTFcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kudWtyYWluaWFuLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS51a3JhaW5pYW5cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJidWxnYXJpYW5cIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9cdTA0NDJcdTA0M0VcdTA0MzJcdTA0MzB8XHUwNDNBXHUwNDMwXHUwNDNBXHUwNDMyXHUwNDNFLywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9cdTAwRjJcdTAwRUVcdTAwRTJcdTAwRTB8XHUwMEU0XHUwMEVFXHUwMEUxXHUwMEYwXHUwMEU1fFx1MDBFQWFcdTAwRUFcdTAwRTJvLywgZmxhZyksXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MVwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHsgbG93OiAwLjAwNTIyNSwgaGlnaDogMC4wMDU2MjggfSxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiB7IGxvdzogMC4wMDI3NjcsIGhpZ2g6IDAuMDA0OTUxIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJlbmdsaXNoXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguZW5nbGlzaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LmVuZ2xpc2gsXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MlwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5lbmdsaXNoLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5lbmdsaXNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiZnJlbmNoXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguZnJlbmNoLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXguZnJlbmNoLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZnJlbmNoLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5mcmVuY2hcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJwb3J0dWd1ZXNlXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXgucG9ydHVndWVzZSxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LnBvcnR1Z3Vlc2UsXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MlwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5wb3J0dWd1ZXNlLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5wb3J0dWd1ZXNlXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwic3BhbmlzaFwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LnNwYW5pc2gsXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5zcGFuaXNoLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuc3BhbmlzaCxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuc3BhbmlzaFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImdlcm1hblwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4Lmdlcm1hbixcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4Lmdlcm1hbixcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjUyXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5Lmdlcm1hbixcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZ2VybWFuXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaXRhbGlhblwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4Lml0YWxpYW4sXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5pdGFsaWFuLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaXRhbGlhbixcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaXRhbGlhblxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImRhbmlzaFwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LmRhbmlzaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LmRhbmlzaCxcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjUyXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmRhbmlzaCxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZGFuaXNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwibm9yd2VnaWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXgubm9yd2VnaWFuLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXgubm9yd2VnaWFuLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kubm9yd2VnaWFuLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5ub3J3ZWdpYW5cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJzd2VkaXNoXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguc3dlZGlzaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LnN3ZWRpc2gsXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MlwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5zd2VkaXNoLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5zd2VkaXNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiZHV0Y2hcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBzaGFyZWRSZWdleC5kdXRjaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LmR1dGNoLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZHV0Y2gsXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmR1dGNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiZmlubmlzaFwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LmZpbm5pc2gsXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5maW5uaXNoLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZmlubmlzaCxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZmlubmlzaFxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcInNlcmJvLWNyb2F0aWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXhbXCJzZXJiby1jcm9hdGlhblwiXSxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4W1wic2VyYm8tY3JvYXRpYW5cIl0sXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1MlwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeVtcInNlcmJvLWNyb2F0aWFuXCJdLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeVtcInNlcmJvLWNyb2F0aWFuXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiZXN0b25pYW5cIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBzaGFyZWRSZWdleC5lc3RvbmlhbixcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LmVzdG9uaWFuLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZXN0b25pYW4sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmVzdG9uaWFuXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaWNlbGFuZGljXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguaWNlbGFuZGljLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXguaWNlbGFuZGljLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaWNlbGFuZGljLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5pY2VsYW5kaWNcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJtYWxheS1pbmRvbmVzaWFuXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXhbXCJtYWxheS1pbmRvbmVzaWFuXCJdLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXhbXCJtYWxheS1pbmRvbmVzaWFuXCJdLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTJcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3lbXCJtYWxheS1pbmRvbmVzaWFuXCJdLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeVtcIm1hbGF5LWluZG9uZXNpYW5cIl1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJncmVla1wiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IG5ldyBSZWdFeHAoL1x1MDNCNVx1MDNBRlx1MDNCRFx1MDNCMVx1MDNCOS8sIGZsYWcpLFxuICAgICAgICBpc29SZWdleDogbmV3IFJlZ0V4cCgvXHUwMEU1XHUwMERGXHUwMEVEXHUwMEUxXHUwMEU5LywgZmxhZyksXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1M1wiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS5ncmVlayxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuZ3JlZWtcbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJ0dXJraXNoXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXgudHVya2lzaCxcbiAgICAgICAgaXNvUmVnZXg6IHNoYXJlZFJlZ2V4LnR1cmtpc2gsXG4gICAgICAgIGVuY29kaW5nOiBcIkNQMTI1NFwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS50dXJraXNoLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS50dXJraXNoXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiaGVicmV3XCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogbmV3IFJlZ0V4cCgvXHUwNUQwXHUwNUVBXHUwNUQ0LywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9cdTAwRTBcdTAwRkFcdTAwRTQvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjU1XCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmhlYnJldyxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaGVicmV3XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiYXJhYmljXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogbmV3IFJlZ0V4cCgvXHUwNjQ3XHUwNjMwXHUwNjI3LywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9cdTAwRTVcdTAwRjBcdTAwRTcvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiQ1AxMjU2XCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogeyBsb3c6IDAuMDAzNTIyLCBoaWdoOiAwLjAwNDM0OCB9LFxuICAgICAgICBpc29GcmVxdWVuY3k6IHsgbG93OiAwLjAwMzc3MywgaGlnaDogMC4wMDU1NTkgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImZhcnNpLXBlcnNpYW5cIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9cdTA2MjdcdTA2NDhcdTA2NDYvLCBmbGFnKSxcbiAgICAgICAgaXNvUmVnZXg6IG5ldyBSZWdFeHAoL1x1MDBFN1x1MDBFRFx1MDBFNC8sIGZsYWcpLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTZcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiB7IGxvdzogMC4wMDI3NjEsIGhpZ2g6IDAuMDA0ODU2IH0sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogeyBsb3c6IDAuMDAzMDEwLCBoaWdoOiAwLjAwNjY0NiB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwibGl0aHVhbmlhblwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LmxpdGh1YW5pYW4sXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5saXRodWFuaWFuLFxuICAgICAgICBlbmNvZGluZzogXCJDUDEyNTdcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kubGl0aHVhbmlhbixcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kubGl0aHVhbmlhblxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImNoaW5lc2Utc2ltcGxpZmllZFwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IG5ldyBSZWdFeHAoL1x1NEU0OC8sIGZsYWcpLFxuICAgICAgICBpc29SZWdleDogbmV3IFJlZ0V4cCgvXHUwMEI0XHUwMEYzfFx1MDBCNlx1MDBBRnxcdTAwQzVcdTAwQUUvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiR0IxODAzMFwiLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHsgbG93OiAwLjAwOTU2NywgaGlnaDogMC4wMTE1MDIgfSxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiB7IGxvdzogMC4wMDMxMzcsIGhpZ2g6IDAuMDA1MDA5IH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJjaGluZXNlLXRyYWRpdGlvbmFsXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogbmV3IFJlZ0V4cCgvXHU1MDExLywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9cdTAwQTZiLywgZmxhZyksXG4gICAgICAgIGVuY29kaW5nOiBcIkJJRzVcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiB7IGxvdzogMC4wMTI0ODQsIGhpZ2g6IDAuMDE0OTY0IH0sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogeyBsb3c6IDAuMDA1MDYzLCBoaWdoOiAwLjAwNTgyMiB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiamFwYW5lc2VcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9cdTMwNjkvLCBmbGFnKSxcbiAgICAgICAgaXNvUmVnZXg6IG5ldyBSZWdFeHAoL1x1MjAxQVx1MDBCQnxcdTAwODJcdTAwQzFcdTAwODJcdTAwQzQvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiU2hpZnQtSklTXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogeyBsb3c6IDAuMDA0MjU3LCBoaWdoOiAwLjAwNjU4NSB9LFxuICAgICAgICBpc29GcmVxdWVuY3k6IHsgbG93OiAwLjAwNDI4NiwgaGlnaDogMC4wMDQ2NTMgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImtvcmVhblwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IG5ldyBSZWdFeHAoL1x1QjNDNC8sIGZsYWcpLFxuICAgICAgICBpc29SZWdleDogbmV3IFJlZ0V4cCgvXHUwMEUwXHUwMEY2XHUwMEJFXHUwMEVFfFx1MDBFNVx1MDBCRVx1MDBERnxcdTAwQTFcdTAwQkNcdTAwQUQvLCBmbGFnKSxcbiAgICAgICAgZW5jb2Rpbmc6IFwiRVVDLUtSXCIsXG4gICAgICAgIHV0ZkZyZXF1ZW5jeTogeyBsb3c6IDAuMDEwOTEwLCBoaWdoOiAwLjAxMzY3MCB9LFxuICAgICAgICBpc29GcmVxdWVuY3k6IHsgbG93OiAwLjAwNDExOCwgaGlnaDogMC4wMDQ5NjEgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcInRoYWlcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBuZXcgUmVnRXhwKC9cdTBFNDFcdTBFMkVcdTBFMjNcdTBFNENcdTBFMjNcdTBFMzVcdTBFNDh8XHUwRTFFXHUwRTJEXHUwRTE1XHUwRTQwXHUwRTE1XHUwRTJEXHUwRTIzXHUwRTRDLywgZmxhZyksXG4gICAgICAgIGlzb1JlZ2V4OiBuZXcgUmVnRXhwKC9cdTAwRTFcdTAwRUVcdTAwRTNcdTAwRUNcdTAwRTNcdTAwRjVcdTAwRTh8XHUwMEJFXHUwMEVEXHUwMEI1XHUwMEUwXHUwMEI1XHUwMEVEXHUwMEUzXHUwMEVDXHUwMEFELywgZmxhZyksXG4gICAgICAgIGVuY29kaW5nOiBcIlRJUy02MjBcIixcbiAgICAgICAgdXRmRnJlcXVlbmN5OiB7IGxvdzogMC4wMDMxOTQsIGhpZ2g6IDAuMDAzNDY4IH0sXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogeyBsb3c6IDAuMDAyMDkxLCBoaWdoOiAwLjAwMjMwMyB9XG4gICAgfSxcbiAgICAvLyBUaGUgZm9sbG93aW5nIGxhbmd1YWdlcyBkb24ndCBzZWVtIHRvIGhhdmUgdGhlaXIgb3duIGVuY29kaW5nXG4gICAgLy8gU3VidGl0bGUgZmlsZXMgaW4gdGhlc2UgbGFuZ3VhZ2VzIHNlZW0gdG8gYWxtb3N0IGV4Y2x1c2l2ZWx5IHVzZSBVVEYgZW5jb2RpbmcuXG4gICAge1xuICAgICAgICBuYW1lOiBcImJlbmdhbGlcIixcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHV0ZlJlZ2V4OiBzaGFyZWRSZWdleC5iZW5nYWxpLFxuICAgICAgICBpc29SZWdleDogc2hhcmVkUmVnZXguYmVuZ2FsaSxcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuYmVuZ2FsaSxcbiAgICAgICAgaXNvRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuYmVuZ2FsaVxuICAgIH0sXG4gICAge1xuICAgICAgICBuYW1lOiBcImhpbmRpXCIsXG4gICAgICAgIGNvdW50OiAwLFxuICAgICAgICB1dGZSZWdleDogc2hhcmVkUmVnZXguaGluZGksXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC5oaW5kaSxcbiAgICAgICAgdXRmRnJlcXVlbmN5OiBzaGFyZWRGcmVxdWVuY3kuaGluZGksXG4gICAgICAgIGlzb0ZyZXF1ZW5jeTogc2hhcmVkRnJlcXVlbmN5LmhpbmRpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwidXJkdVwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LnVyZHUsXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC51cmR1LFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS51cmR1LFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS51cmR1XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwidmlldG5hbWVzZVwiLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgdXRmUmVnZXg6IHNoYXJlZFJlZ2V4LnZpZXRuYW1lc2UsXG4gICAgICAgIGlzb1JlZ2V4OiBzaGFyZWRSZWdleC52aWV0bmFtZXNlLFxuICAgICAgICB1dGZGcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS52aWV0bmFtZXNlLFxuICAgICAgICBpc29GcmVxdWVuY3k6IHNoYXJlZEZyZXF1ZW5jeS52aWV0bmFtZXNlXG4gICAgfSxcbl07IiwgImNvbnN0IGxhbmd1YWdlQXJyID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy9sYW5ndWFnZU9iamVjdC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoZGF0YSwgZW5jb2RpbmcpID0+IHtcbiAgY29uc3QgbmV3TGFuZ3VhZ2VBcnIgPSBbXTtcblxuICAvLyBDbG9uaW5nIHRoZSBsYW5ndWFnZSBhcnJheSBhbmQgbWFraW5nIHN1cmUgdGhhdCBcImNvdW50XCIgaGFzIG5vIHJlZmVyZW5jZSB0byBcImxhbmd1YWdlQXJyXCIhXG4gIGxhbmd1YWdlQXJyLmZvckVhY2goKG9iaikgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZWRMYW5nT2JqID0ge307XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgIT09IFwiY291bnRcIikge1xuICAgICAgICB1cGRhdGVkTGFuZ09ialtrZXldID0gb2JqW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGVkTGFuZ09iai5jb3VudCA9IDA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbmV3TGFuZ3VhZ2VBcnIucHVzaCh1cGRhdGVkTGFuZ09iaik7XG4gIH0pO1xuXG4gIGNvbnN0IHJlZ2V4ID0gZW5jb2RpbmcgPyBcInV0ZlJlZ2V4XCIgOiBcImlzb1JlZ2V4XCI7XG5cbiAgLy8gUG9wdWxhdGluZyB0aGUgY291bnQgcHJvcGVydHkgb2YgdGhlIGxhbmd1YWdlIGFycmF5XG4gIG5ld0xhbmd1YWdlQXJyLmZvckVhY2goKGxhbmcpID0+IHtcbiAgICBpZiAobGFuZ1tyZWdleF0pIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBkYXRhLmNvbnRlbnQubWF0Y2gobGFuZ1tyZWdleF0pO1xuXG4gICAgICBpZiAobWF0Y2hlcykgbGFuZy5jb3VudCA9IG1hdGNoZXMubGVuZ3RoO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5ld0xhbmd1YWdlQXJyO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IChkYXRhLCBmaWxlSW5mbykgPT4ge1xuICBjb25zdCBjaGFyUmVnZXggPSBuZXcgUmVnRXhwKFxuICAgIC9cXGR8XFxufFxcc3xcXC18XFwufFxcLHxcXDp8XFw7fFxcP3xcXCF8XFw8fFxcPnxcXFt8XFxdfFxce3xcXH18XFwmfFxcPXxcXHwvLFxuICAgIFwiZ1wiXG4gICk7XG4gIGNvbnN0IHRvdGFsQ2hhcmFjdGVycyA9IGRhdGEuY29udGVudC5yZXBsYWNlKGNoYXJSZWdleCwgXCJcIikubGVuZ3RoO1xuICBjb25zdCBsYW5nQXJyID0gZGF0YS5sYW5ndWFnZUFycjtcbiAgY29uc3QgcG9zID0gZGF0YS5wb3M7XG5cbiAgY29uc3Qgc2Vjb25kTGFuZ3VhZ2UgPSBsYW5nQXJyLnJlZHVjZSgoYWNjLCB2YWwpID0+IHtcbiAgICBpZiAoYWNjLm5hbWUgPT09IGZpbGVJbmZvLmxhbmd1YWdlKSByZXR1cm4gdmFsO1xuICAgIGlmICh2YWwubmFtZSA9PT0gZmlsZUluZm8ubGFuZ3VhZ2UpIHJldHVybiBhY2M7XG5cbiAgICByZXR1cm4gYWNjLmNvdW50ID49IHZhbC5jb3VudCA/IGFjYyA6IHZhbDtcbiAgfSk7XG5cbiAgY29uc3QgbGFuZ3VhZ2VSYXRpbyA9XG4gICAgbGFuZ0Fycltwb3NdLmNvdW50IC8gKHNlY29uZExhbmd1YWdlLmNvdW50ICsgbGFuZ0Fycltwb3NdLmNvdW50KTtcbiAgY29uc3QgY2hhcmFjdGVyV29yZFJhdGlvID0gbGFuZ0Fycltwb3NdLmNvdW50IC8gdG90YWxDaGFyYWN0ZXJzO1xuXG4gIGxldCBsb3dlckxpbWl0ID0gbnVsbDtcbiAgbGV0IHVwcGVyTGltaXQgPSBudWxsO1xuICBjb25zdCBtdWx0aXBsaWVyID0gMC44O1xuXG4gIGlmIChmaWxlSW5mby5lbmNvZGluZyA9PT0gXCJVVEYtOFwiIHx8IGZpbGVJbmZvLmVuY29kaW5nID09PSBcIlVURi0xNkxFXCIpIHtcbiAgICBsb3dlckxpbWl0ID0gbGFuZ0Fycltwb3NdLnV0ZkZyZXF1ZW5jeVxuICAgICAgPyBsYW5nQXJyW3Bvc10udXRmRnJlcXVlbmN5LmxvdyAqIG11bHRpcGxpZXJcbiAgICAgIDogbnVsbDtcbiAgICB1cHBlckxpbWl0ID0gbGFuZ0Fycltwb3NdLnV0ZkZyZXF1ZW5jeVxuICAgICAgPyAobGFuZ0Fycltwb3NdLnV0ZkZyZXF1ZW5jeS5sb3cgKyBsYW5nQXJyW3Bvc10udXRmRnJlcXVlbmN5LmhpZ2gpIC8gMlxuICAgICAgOiBudWxsO1xuICB9IGVsc2Uge1xuICAgIGxvd2VyTGltaXQgPSBsYW5nQXJyW3Bvc10uaXNvRnJlcXVlbmN5XG4gICAgICA/IGxhbmdBcnJbcG9zXS5pc29GcmVxdWVuY3kubG93ICogbXVsdGlwbGllclxuICAgICAgOiBudWxsO1xuICAgIHVwcGVyTGltaXQgPSBsYW5nQXJyW3Bvc10uaXNvRnJlcXVlbmN5XG4gICAgICA/IChsYW5nQXJyW3Bvc10uaXNvRnJlcXVlbmN5LmxvdyArIGxhbmdBcnJbcG9zXS5pc29GcmVxdWVuY3kuaGlnaCkgLyAyXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBsZXQgY29uZmlkZW5jZVNjb3JlO1xuXG4gIGlmICghbG93ZXJMaW1pdCB8fCAhdXBwZXJMaW1pdCkge1xuICAgIGNvbmZpZGVuY2VTY29yZSA9IG51bGw7XG4gIH0gZWxzZSBpZiAoY2hhcmFjdGVyV29yZFJhdGlvID49IHVwcGVyTGltaXQpIHtcbiAgICBjb25maWRlbmNlU2NvcmUgPSAxO1xuICB9IGVsc2UgaWYgKGNoYXJhY3RlcldvcmRSYXRpbyA+IGxvd2VyTGltaXQpIHtcbiAgICBjb25zdCByYW5nZSA9IHVwcGVyTGltaXQgLSBsb3dlckxpbWl0O1xuICAgIGNvbnN0IHN1cnBsdXMgPSBjaGFyYWN0ZXJXb3JkUmF0aW8gLSBsb3dlckxpbWl0O1xuICAgIGNvbnN0IGNvbmZpZGVuY2VSYWlzZVBlcmNlbnRhZ2UgPSBzdXJwbHVzIC8gcmFuZ2U7XG4gICAgY29uc3QgY29uZmlkZW5jZVJhaXNlID0gKDEgLSBsYW5ndWFnZVJhdGlvKSAqIGNvbmZpZGVuY2VSYWlzZVBlcmNlbnRhZ2U7XG4gICAgY29uZmlkZW5jZVNjb3JlID0gTnVtYmVyKChsYW5ndWFnZVJhdGlvICsgY29uZmlkZW5jZVJhaXNlKS50b0ZpeGVkKDIpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWRlbmNlU2NvcmUgPSBOdW1iZXIoXG4gICAgICAobGFuZ3VhZ2VSYXRpbyAqIChjaGFyYWN0ZXJXb3JkUmF0aW8gLyBsb3dlckxpbWl0KSkudG9GaXhlZCgyKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29uZmlkZW5jZVNjb3JlO1xufTtcbiIsICJtb2R1bGUuZXhwb3J0cyA9IFtcbiAge1xuICAgIGVuY29kaW5nOiBcIlVURi1FQkNESUNcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjIyMSAxMTUgMTAyIDExNVwiKSxcbiAgfSxcbiAge1xuICAgIGVuY29kaW5nOiBcIkdCLTE4MDMwXCIsXG4gICAgcmVnZXg6IG5ldyBSZWdFeHAoXCIxMzIgNDkgMTQ5IDUxXCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiVVRGLTMyTEVcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjI1NSAyNTQgMCAwXCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiVVRGLTMyQkVcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjAgMCAyNTQgMjU1XCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiVVRGLThcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjIzOSAxODcgMTkxXCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiVVRGLTdcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjQzIDQ3IDExOFwiKSxcbiAgfSxcbiAge1xuICAgIGVuY29kaW5nOiBcIlVURi0xXCIsXG4gICAgcmVnZXg6IG5ldyBSZWdFeHAoXCIyNDcgMTAwIDc2XCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiU0NTVVwiLFxuICAgIHJlZ2V4OiBuZXcgUmVnRXhwKFwiMTQgMjU0IDI1NVwiKSxcbiAgfSxcbiAge1xuICAgIGVuY29kaW5nOiBcIkJPQ1UtMVwiLFxuICAgIHJlZ2V4OiBuZXcgUmVnRXhwKFwiMjUxIDIzOCA0MFwiKSxcbiAgfSxcbiAge1xuICAgIGVuY29kaW5nOiBcIlVURi0xNkJFXCIsXG4gICAgcmVnZXg6IG5ldyBSZWdFeHAoXCIyNTQgMjU1XCIpLFxuICB9LFxuICB7XG4gICAgZW5jb2Rpbmc6IFwiVVRGLTE2TEVcIixcbiAgICByZWdleDogbmV3IFJlZ0V4cChcIjI1NSAyNTRcIiksXG4gIH0sXG5dO1xuIiwgImNvbnN0IGNvdW50QWxsTWF0Y2hlcyA9IHJlcXVpcmUoXCIuL3Byb2Nlc3NpbmctY29udGVudC9jb3VudEFsbE1hdGNoZXMuanNcIik7XG5jb25zdCBjYWxjdWxhdGVDb25maWRlbmNlU2NvcmUgPSByZXF1aXJlKFwiLi9wcm9jZXNzaW5nLWNvbnRlbnQvY2FsY3VsYXRlQ29uZmlkZW5jZVNjb3JlLmpzXCIpO1xuY29uc3QgYnl0ZU9yZGVyTWFya09iamVjdCA9IHJlcXVpcmUoXCIuLi9jb25maWcvYnl0ZU9yZGVyTWFya09iamVjdC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoZGF0YSwgZmlsZUluZm8pID0+IHtcbiAgZGF0YS5sYW5ndWFnZUFyciA9IGNvdW50QWxsTWF0Y2hlcyhkYXRhLCBmaWxlSW5mby5lbmNvZGluZyk7XG5cbiAgZmlsZUluZm8ubGFuZ3VhZ2UgPSBkYXRhLmxhbmd1YWdlQXJyLnJlZHVjZSgoYWNjLCB2YWwpID0+XG4gICAgYWNjLmNvdW50ID4gdmFsLmNvdW50ID8gYWNjIDogdmFsXG4gICkubmFtZTtcblxuICAvLyBcInBvc1wiIGdpdmVzIHVzIHRoZSBwb3NpdGlvbiBpbiB0aGUgbGFuZ3VhZ2UgYXJyYXkgdGhhdCBoYXMgdGhlIG1vc3QgbWF0Y2hlc1xuICBkYXRhLnBvcyA9IGRhdGEubGFuZ3VhZ2VBcnIuZmluZEluZGV4KFxuICAgIChlbGVtKSA9PiBlbGVtLm5hbWUgPT09IGZpbGVJbmZvLmxhbmd1YWdlXG4gICk7XG5cbiAgLy8gRGV0ZXJtaW5lIHRoZSBlbmNvZGluZ1xuICBpZiAoIWZpbGVJbmZvLmVuY29kaW5nKSB7XG4gICAgZmlsZUluZm8uZW5jb2RpbmcgPSBkYXRhLmxhbmd1YWdlQXJyW2RhdGEucG9zXS5lbmNvZGluZztcbiAgfVxuXG4gIGNvbnN0IGNhbGN1bGF0aW9ucyA9IGNhbGN1bGF0ZUNvbmZpZGVuY2VTY29yZShkYXRhLCBmaWxlSW5mbyk7XG5cbiAgaWYgKGZpbGVJbmZvLmNvbmZpZGVuY2UuZW5jb2RpbmcpIHtcbiAgICBmaWxlSW5mby5jb25maWRlbmNlLmxhbmd1YWdlID0gY2FsY3VsYXRpb25zO1xuICB9IGVsc2Uge1xuICAgIGZpbGVJbmZvLmNvbmZpZGVuY2UuZW5jb2RpbmcgPSBjYWxjdWxhdGlvbnM7XG4gICAgZmlsZUluZm8uY29uZmlkZW5jZS5sYW5ndWFnZSA9IGNhbGN1bGF0aW9ucztcbiAgfVxuXG4gIC8vIEVkZ2UgY2FzZSwgd2hlbiBubyBtYXRjaGVzIHdlcmUgZm91bmRcbiAgaWYgKCFkYXRhLmxhbmd1YWdlQXJyW2RhdGEucG9zXS5jb3VudCkge1xuICAgIGZpbGVJbmZvLmxhbmd1YWdlID0gbnVsbDtcbiAgICBmaWxlSW5mby5jb25maWRlbmNlLmxhbmd1YWdlID0gbnVsbDtcblxuICAgIGlmICghYnl0ZU9yZGVyTWFya09iamVjdC5zb21lKG9iaiA9PiBvYmouZW5jb2RpbmcgPT09IGZpbGVJbmZvLmVuY29kaW5nKSkge1xuICAgICAgZmlsZUluZm8uZW5jb2RpbmcgPSBudWxsO1xuICAgICAgZmlsZUluZm8uY29uZmlkZW5jZS5lbmNvZGluZyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbGVJbmZvO1xufTtcbiIsICJjb25zdCBieXRlT3JkZXJNYXJrcyA9IHJlcXVpcmUoXCIuLi9jb25maWcvYnl0ZU9yZGVyTWFya09iamVjdC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSAodUludDhTdGFydCkgPT4ge1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYnl0ZU9yZGVyTWFya3MpIHtcbiAgICBpZiAoZWxlbWVudC5yZWdleC50ZXN0KHVJbnQ4U3RhcnQpKSByZXR1cm4gZWxlbWVudC5lbmNvZGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcbiIsICJjb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IGNoZWNrVVRGID0gcmVxdWlyZShcIi4vY29tcG9uZW50cy9jaGVja1VURi5qc1wiKTtcbmNvbnN0IHByb2Nlc3NDb250ZW50ID0gcmVxdWlyZShcIi4vY29tcG9uZW50cy9wcm9jZXNzQ29udGVudC5qc1wiKTtcbmNvbnN0IGNoZWNrQnl0ZU9yZGVyTWFyayA9IHJlcXVpcmUoXCIuL2NvbXBvbmVudHMvY2hlY2tCeXRlT3JkZXJNYXJrLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmaWxlUGF0aCkgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBpc0VtcHR5ID0gdHJ1ZTtcbiAgICBjb25zdCBmaWxlSW5mbyA9IHtcbiAgICAgIGVuY29kaW5nOiBudWxsLFxuICAgICAgbGFuZ3VhZ2U6IG51bGwsXG4gICAgICBjb25maWRlbmNlOiB7XG4gICAgICAgIGVuY29kaW5nOiBudWxsLFxuICAgICAgICBsYW5ndWFnZTogbnVsbCxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBkYXRhID0ge307XG5cbiAgICAvLyBSZWFkaW5nIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIGFuZCBjaGVja2luZyBpZiB0aGV5IGNvaW5jaWRlIHdpdGggb25lIG9mIHRoZSBwcmVkZWZpbmVkIGJ5dGUgb3JkZXIgbWFya3MuXG4gICAgY29uc3QgcmVhZFN0cmVhbSA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZmlsZVBhdGgsIHsgc3RhcnQ6IDAsIGVuZDogMyB9KTtcblxuICAgIHJlYWRTdHJlYW0ub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChidWZmZXIpIHtcbiAgICAgIGlzRW1wdHkgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHVJbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgY29uc3QgdUludDhTdHJpbmcgPSB1SW50OEFycmF5LmpvaW4oXCIgXCIpO1xuICAgICAgY29uc3QgYnl0ZU9yZGVyTWFyayA9IGNoZWNrQnl0ZU9yZGVyTWFyayh1SW50OFN0cmluZyk7XG5cbiAgICAgIGlmIChieXRlT3JkZXJNYXJrKSB7XG4gICAgICAgIGZpbGVJbmZvLmVuY29kaW5nID0gYnl0ZU9yZGVyTWFyaztcbiAgICAgICAgZmlsZUluZm8uY29uZmlkZW5jZS5lbmNvZGluZyA9IDE7XG5cbiAgICAgICAgLy8gTm9kZS5qcyBvbmx5IHN1cHBvcnRzIFVURi04IGFuZCBVVEYtMTZMRS4gSWYgb25lIG9mIHRoZW0gaGFzIGJlZW4gZGV0ZWN0ZWQsIHdlIGtub3cgaG93IHRvIHJlYWQgdGhlIGNvbnRlbnRcbiAgICAgICAgaWYgKGZpbGVJbmZvLmVuY29kaW5nID09PSBcIlVURi04XCIgfHwgZmlsZUluZm8uZW5jb2RpbmcgPT09IFwiVVRGLTE2TEVcIikge1xuICAgICAgICAgIGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBmaWxlSW5mby5lbmNvZGluZywgKGVyciwgdXRmQ29udGVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikgcmVqZWN0KGVycik7XG4gICAgICAgICAgICBkYXRhLmNvbnRlbnQgPSB1dGZDb250ZW50O1xuICAgICAgICAgICAgcmVzb2x2ZShwcm9jZXNzQ29udGVudChkYXRhLCBmaWxlSW5mbykpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gSWYgdGhlIGVuY29kaW5nIGluIHRoZSBieXRlT3JkZXJNYXJrT2JqZWN0IGlzIG5vdCBVVEYtOCBvciBVVEYtMTZMRSB3ZSByZXR1cm4gdGhlIGVuY29kaW5nIHdpdGhvdXQgdGhlIGxhbmd1YWdlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGZpbGVJbmZvLmVuY29kaW5nID09PSBcIkdCLTE4MDMwXCIpIHtcbiAgICAgICAgICAgIGZpbGVJbmZvLmxhbmd1YWdlID0gXCJjaGluZXNlLXNpbXBsaWZpZWRcIjtcbiAgICAgICAgICAgIGZpbGVJbmZvLmNvbmZpZGVuY2UubGFuZ3VhZ2UgPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGZpbGVJbmZvKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnMucmVhZEZpbGUoZmlsZVBhdGgsIFwiVVRGLThcIiwgKGVyciwgdXRmQ29udGVudCkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpO1xuXG4gICAgICAgICAgY29uc3QgdXRmOCA9IGNoZWNrVVRGKHV0ZkNvbnRlbnQpO1xuXG4gICAgICAgICAgaWYgKHV0ZjgpIHtcbiAgICAgICAgICAgIGZpbGVJbmZvLmVuY29kaW5nID0gXCJVVEYtOFwiO1xuICAgICAgICAgICAgZmlsZUluZm8uY29uZmlkZW5jZS5lbmNvZGluZyA9IDE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHV0ZjgpIHtcbiAgICAgICAgICAgIGRhdGEuY29udGVudCA9IHV0ZkNvbnRlbnQ7XG4gICAgICAgICAgICByZXNvbHZlKHByb2Nlc3NDb250ZW50KGRhdGEsIGZpbGVJbmZvKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcImxhdGluMVwiLCAoZXJyLCBpc29Db250ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpO1xuXG4gICAgICAgICAgICAgIGRhdGEuY29udGVudCA9IGlzb0NvbnRlbnQ7XG4gICAgICAgICAgICAgIHJlc29sdmUocHJvY2Vzc0NvbnRlbnQoZGF0YSwgZmlsZUluZm8pKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVhZFN0cmVhbS5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZihpc0VtcHR5KSByZXNvbHZlKGZpbGVJbmZvKVxuICAgIH0pXG4gICAgLy8gVGhpcyBjYXRjaGVzIGFueSBlcnJvcnMgdGhhdCBoYXBwZW4gd2hpbGUgY3JlYXRpbmcgdGhlIHJlYWRhYmxlIHN0cmVhbSAodXN1YWxseSBpbnZhbGlkIG5hbWVzKVxuICAgIHJlYWRTdHJlYW0ub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbiAgLCBwcmVmaXggPSAnfic7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgc3RvcmFnZSBmb3Igb3VyIGBFRWAgb2JqZWN0cy5cbiAqIEFuIGBFdmVudHNgIGluc3RhbmNlIGlzIGEgcGxhaW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgYXJlIGV2ZW50IG5hbWVzLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRXZlbnRzKCkge31cblxuLy9cbi8vIFdlIHRyeSB0byBub3QgaW5oZXJpdCBmcm9tIGBPYmplY3QucHJvdG90eXBlYC4gSW4gc29tZSBlbmdpbmVzIGNyZWF0aW5nIGFuXG4vLyBpbnN0YW5jZSBpbiB0aGlzIHdheSBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBPYmplY3QuY3JlYXRlKG51bGwpYCBkaXJlY3RseS5cbi8vIElmIGBPYmplY3QuY3JlYXRlKG51bGwpYCBpcyBub3Qgc3VwcG9ydGVkIHdlIHByZWZpeCB0aGUgZXZlbnQgbmFtZXMgd2l0aCBhXG4vLyBjaGFyYWN0ZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWx0LWluIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBub3Rcbi8vIG92ZXJyaWRkZW4gb3IgdXNlZCBhcyBhbiBhdHRhY2sgdmVjdG9yLlxuLy9cbmlmIChPYmplY3QuY3JlYXRlKSB7XG4gIEV2ZW50cy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vXG4gIC8vIFRoaXMgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgYF9fcHJvdG9fX2AgcHJvcGVydHkgaXMgc3RpbGwgaW5oZXJpdGVkIGluXG4gIC8vIHNvbWUgb2xkIGJyb3dzZXJzIGxpa2UgQW5kcm9pZCA0LCBpUGhvbmUgNS4xLCBPcGVyYSAxMSBhbmQgU2FmYXJpIDUuXG4gIC8vXG4gIGlmICghbmV3IEV2ZW50cygpLl9fcHJvdG9fXykgcHJlZml4ID0gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIEVFKGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHRoaXMuZm4gPSBmbjtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5vbmNlID0gb25jZSB8fCBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlciBSZWZlcmVuY2UgdG8gdGhlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlLlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb25jZSBTcGVjaWZ5IGlmIHRoZSBsaXN0ZW5lciBpcyBhIG9uZS10aW1lIGxpc3RlbmVyLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGFkZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVyID0gbmV3IEVFKGZuLCBjb250ZXh0IHx8IGVtaXR0ZXIsIG9uY2UpXG4gICAgLCBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghZW1pdHRlci5fZXZlbnRzW2V2dF0pIGVtaXR0ZXIuX2V2ZW50c1tldnRdID0gbGlzdGVuZXIsIGVtaXR0ZXIuX2V2ZW50c0NvdW50Kys7XG4gIGVsc2UgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XS5mbikgZW1pdHRlci5fZXZlbnRzW2V2dF0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2UgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBbZW1pdHRlci5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXTtcblxuICByZXR1cm4gZW1pdHRlcjtcbn1cblxuLyoqXG4gKiBDbGVhciBldmVudCBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZ0IFRoZSBFdmVudCBuYW1lLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2xlYXJFdmVudChlbWl0dGVyLCBldnQpIHtcbiAgaWYgKC0tZW1pdHRlci5fZXZlbnRzQ291bnQgPT09IDApIGVtaXR0ZXIuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgZWxzZSBkZWxldGUgZW1pdHRlci5fZXZlbnRzW2V2dF07XG59XG5cbi8qKlxuICogTWluaW1hbCBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UgdGhhdCBpcyBtb2xkZWQgYWdhaW5zdCB0aGUgTm9kZS5qc1xuICogYEV2ZW50RW1pdHRlcmAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBhcnJheSBsaXN0aW5nIHRoZSBldmVudHMgZm9yIHdoaWNoIHRoZSBlbWl0dGVyIGhhcyByZWdpc3RlcmVkXG4gKiBsaXN0ZW5lcnMuXG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmV2ZW50TmFtZXMgPSBmdW5jdGlvbiBldmVudE5hbWVzKCkge1xuICB2YXIgbmFtZXMgPSBbXVxuICAgICwgZXZlbnRzXG4gICAgLCBuYW1lO1xuXG4gIGlmICh0aGlzLl9ldmVudHNDb3VudCA9PT0gMCkgcmV0dXJuIG5hbWVzO1xuXG4gIGZvciAobmFtZSBpbiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzKSkge1xuICAgIGlmIChoYXMuY2FsbChldmVudHMsIG5hbWUpKSBuYW1lcy5wdXNoKHByZWZpeCA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgcmV0dXJuIG5hbWVzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV2ZW50cykpO1xuICB9XG5cbiAgcmV0dXJuIG5hbWVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxpc3RlbmVycyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtBcnJheX0gVGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudCkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudFxuICAgICwgaGFuZGxlcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWhhbmRsZXJzKSByZXR1cm4gW107XG4gIGlmIChoYW5kbGVycy5mbikgcmV0dXJuIFtoYW5kbGVycy5mbl07XG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBoYW5kbGVyc1tpXS5mbjtcbiAgfVxuXG4gIHJldHVybiBlZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzIGxpc3RlbmluZyB0byBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbiBsaXN0ZW5lckNvdW50KGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoIWxpc3RlbmVycykgcmV0dXJuIDA7XG4gIGlmIChsaXN0ZW5lcnMuZm4pIHJldHVybiAxO1xuICByZXR1cm4gbGlzdGVuZXJzLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQ2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZXZlbnQgaGFkIGxpc3RlbmVycywgZWxzZSBgZmFsc2VgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50LCBhMSwgYTIsIGEzLCBhNCwgYTUpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKGxpc3RlbmVycy5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnMuZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgY2FzZSAxOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQpLCB0cnVlO1xuICAgICAgY2FzZSAyOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExKSwgdHJ1ZTtcbiAgICAgIGNhc2UgMzogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIpLCB0cnVlO1xuICAgICAgY2FzZSA0OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMpLCB0cnVlO1xuICAgICAgY2FzZSA1OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgNjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCwgYTUpLCB0cnVlO1xuICAgIH1cblxuICAgIGZvciAoaSA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMuZm4uYXBwbHkobGlzdGVuZXJzLmNvbnRleHQsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIHZhciBsZW5ndGggPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAsIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0ub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzW2ldLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgICBzd2l0Y2ggKGxlbikge1xuICAgICAgICBjYXNlIDE6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0KTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMjogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgMzogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMik7IGJyZWFrO1xuICAgICAgICBjYXNlIDQ6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIsIGEzKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKCFhcmdzKSBmb3IgKGogPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGlzdGVuZXJzW2ldLmZuLmFwcGx5KGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCB0byBpbnZva2UgdGhlIGxpc3RlbmVyIHdpdGguXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBvbmUtdGltZSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gb25jZShldmVudCwgZm4sIGNvbnRleHQpIHtcbiAgcmV0dXJuIGFkZExpc3RlbmVyKHRoaXMsIGV2ZW50LCBmbiwgY29udGV4dCwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IG1hdGNoIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgT25seSByZW1vdmUgdGhlIGxpc3RlbmVycyB0aGF0IGhhdmUgdGhpcyBjb250ZXh0LlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIE9ubHkgcmVtb3ZlIG9uZS10aW1lIGxpc3RlbmVycy5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKGV2ZW50LCBmbiwgY29udGV4dCwgb25jZSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gdGhpcztcbiAgaWYgKCFmbikge1xuICAgIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgaWYgKFxuICAgICAgbGlzdGVuZXJzLmZuID09PSBmbiAmJlxuICAgICAgKCFvbmNlIHx8IGxpc3RlbmVycy5vbmNlKSAmJlxuICAgICAgKCFjb250ZXh0IHx8IGxpc3RlbmVycy5jb250ZXh0ID09PSBjb250ZXh0KVxuICAgICkge1xuICAgICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMCwgZXZlbnRzID0gW10sIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuIHx8XG4gICAgICAgIChvbmNlICYmICFsaXN0ZW5lcnNbaV0ub25jZSkgfHxcbiAgICAgICAgKGNvbnRleHQgJiYgbGlzdGVuZXJzW2ldLmNvbnRleHQgIT09IGNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgZXZlbnRzLnB1c2gobGlzdGVuZXJzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vIFJlc2V0IHRoZSBhcnJheSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgaWYgd2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycy5cbiAgICAvL1xuICAgIGlmIChldmVudHMubGVuZ3RoKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGV2ZW50cy5sZW5ndGggPT09IDEgPyBldmVudHNbMF0gOiBldmVudHM7XG4gICAgZWxzZSBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMsIG9yIHRob3NlIG9mIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IFtldmVudF0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfSBgdGhpc2AuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQ7XG5cbiAgaWYgKGV2ZW50KSB7XG4gICAgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcbiAgICBpZiAodGhpcy5fZXZlbnRzW2V2dF0pIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9ldmVudHMgPSBuZXcgRXZlbnRzKCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vL1xuLy8gQWxpYXMgbWV0aG9kcyBuYW1lcyBiZWNhdXNlIHBlb3BsZSByb2xsIGxpa2UgdGhhdC5cbi8vXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEFsbG93IGBFdmVudEVtaXR0ZXJgIHRvIGJlIGltcG9ydGVkIGFzIG1vZHVsZSBuYW1lc3BhY2UuXG4vL1xuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsICIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2hlY2sgaWYgd2UncmUgcmVxdWlyZWQgdG8gYWRkIGEgcG9ydCBudW1iZXIuXG4gKlxuICogQHNlZSBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RlZmF1bHQtcG9ydFxuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBwb3J0IFBvcnQgbnVtYmVyIHdlIG5lZWQgdG8gY2hlY2tcbiAqIEBwYXJhbSB7U3RyaW5nfSBwcm90b2NvbCBQcm90b2NvbCB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluc3QuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gSXMgaXQgYSBkZWZhdWx0IHBvcnQgZm9yIHRoZSBnaXZlbiBwcm90b2NvbFxuICogQGFwaSBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVxdWlyZWQocG9ydCwgcHJvdG9jb2wpIHtcbiAgcHJvdG9jb2wgPSBwcm90b2NvbC5zcGxpdCgnOicpWzBdO1xuICBwb3J0ID0gK3BvcnQ7XG5cbiAgaWYgKCFwb3J0KSByZXR1cm4gZmFsc2U7XG5cbiAgc3dpdGNoIChwcm90b2NvbCkge1xuICAgIGNhc2UgJ2h0dHAnOlxuICAgIGNhc2UgJ3dzJzpcbiAgICByZXR1cm4gcG9ydCAhPT0gODA7XG5cbiAgICBjYXNlICdodHRwcyc6XG4gICAgY2FzZSAnd3NzJzpcbiAgICByZXR1cm4gcG9ydCAhPT0gNDQzO1xuXG4gICAgY2FzZSAnZnRwJzpcbiAgICByZXR1cm4gcG9ydCAhPT0gMjE7XG5cbiAgICBjYXNlICdnb3BoZXInOlxuICAgIHJldHVybiBwb3J0ICE9PSA3MDtcblxuICAgIGNhc2UgJ2ZpbGUnOlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBwb3J0ICE9PSAwO1xufTtcbiIsICJ2YXIgY29tbW9uICAgPSBleHBvcnRzLFxuICAgIHVybCAgICAgID0gcmVxdWlyZSgndXJsJyksXG4gICAgZXh0ZW5kICAgPSByZXF1aXJlKCd1dGlsJykuX2V4dGVuZCxcbiAgICByZXF1aXJlZCA9IHJlcXVpcmUoJ3JlcXVpcmVzLXBvcnQnKTtcblxudmFyIHVwZ3JhZGVIZWFkZXIgPSAvKF58LClcXHMqdXBncmFkZVxccyooJHwsKS9pLFxuICAgIGlzU1NMID0gL15odHRwc3x3c3MvO1xuXG4vKipcbiAqIFNpbXBsZSBSZWdleCBmb3IgdGVzdGluZyBpZiBwcm90b2NvbCBpcyBodHRwc1xuICovXG5jb21tb24uaXNTU0wgPSBpc1NTTDtcbi8qKlxuICogQ29waWVzIHRoZSByaWdodCBoZWFkZXJzIGZyb20gYG9wdGlvbnNgIGFuZCBgcmVxYCB0b1xuICogYG91dGdvaW5nYCB3aGljaCBpcyB0aGVuIHVzZWQgdG8gZmlyZSB0aGUgcHJveGllZFxuICogcmVxdWVzdC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICBjb21tb24uc2V0dXBPdXRnb2luZyhvdXRnb2luZywgb3B0aW9ucywgcmVxKVxuICogICAgLy8gPT4geyBob3N0OiAuLi4sIGhvc3RuYW1lOiAuLi59XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IE91dGdvaW5nIEJhc2Ugb2JqZWN0IHRvIGJlIGZpbGxlZCB3aXRoIHJlcXVpcmVkIHByb3BlcnRpZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIENvbmZpZyBvYmplY3QgcGFzc2VkIHRvIHRoZSBwcm94eVxuICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBPYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBGb3J3YXJkIFN0cmluZyB0byBzZWxlY3QgZm9yd2FyZCBvciB0YXJnZXRcbiAqXHUwMEEwXG4gKiBAcmV0dXJuIHtPYmplY3R9IE91dGdvaW5nIE9iamVjdCB3aXRoIGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIHNldFxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmNvbW1vbi5zZXR1cE91dGdvaW5nID0gZnVuY3Rpb24ob3V0Z29pbmcsIG9wdGlvbnMsIHJlcSwgZm9yd2FyZCkge1xuICBvdXRnb2luZy5wb3J0ID0gb3B0aW9uc1tmb3J3YXJkIHx8ICd0YXJnZXQnXS5wb3J0IHx8XG4gICAgICAgICAgICAgICAgICAoaXNTU0wudGVzdChvcHRpb25zW2ZvcndhcmQgfHwgJ3RhcmdldCddLnByb3RvY29sKSA/IDQ0MyA6IDgwKTtcblxuICBbJ2hvc3QnLCAnaG9zdG5hbWUnLCAnc29ja2V0UGF0aCcsICdwZngnLCAna2V5JyxcbiAgICAncGFzc3BocmFzZScsICdjZXJ0JywgJ2NhJywgJ2NpcGhlcnMnLCAnc2VjdXJlUHJvdG9jb2wnXS5mb3JFYWNoKFxuICAgIGZ1bmN0aW9uKGUpIHsgb3V0Z29pbmdbZV0gPSBvcHRpb25zW2ZvcndhcmQgfHwgJ3RhcmdldCddW2VdOyB9XG4gICk7XG5cbiAgb3V0Z29pbmcubWV0aG9kID0gb3B0aW9ucy5tZXRob2QgfHwgcmVxLm1ldGhvZDtcbiAgb3V0Z29pbmcuaGVhZGVycyA9IGV4dGVuZCh7fSwgcmVxLmhlYWRlcnMpO1xuXG4gIGlmIChvcHRpb25zLmhlYWRlcnMpe1xuICAgIGV4dGVuZChvdXRnb2luZy5oZWFkZXJzLCBvcHRpb25zLmhlYWRlcnMpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgIG91dGdvaW5nLmF1dGggPSBvcHRpb25zLmF1dGg7XG4gIH1cbiAgXG4gIGlmIChvcHRpb25zLmNhKSB7XG4gICAgICBvdXRnb2luZy5jYSA9IG9wdGlvbnMuY2E7XG4gIH1cblxuICBpZiAoaXNTU0wudGVzdChvcHRpb25zW2ZvcndhcmQgfHwgJ3RhcmdldCddLnByb3RvY29sKSkge1xuICAgIG91dGdvaW5nLnJlamVjdFVuYXV0aG9yaXplZCA9ICh0eXBlb2Ygb3B0aW9ucy5zZWN1cmUgPT09IFwidW5kZWZpbmVkXCIpID8gdHJ1ZSA6IG9wdGlvbnMuc2VjdXJlO1xuICB9XG5cblxuICBvdXRnb2luZy5hZ2VudCA9IG9wdGlvbnMuYWdlbnQgfHwgZmFsc2U7XG4gIG91dGdvaW5nLmxvY2FsQWRkcmVzcyA9IG9wdGlvbnMubG9jYWxBZGRyZXNzO1xuXG4gIC8vXG4gIC8vIFJlbWFyazogSWYgd2UgYXJlIGZhbHNlIGFuZCBub3QgdXBncmFkaW5nLCBzZXQgdGhlIGNvbm5lY3Rpb246IGNsb3NlLiBUaGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkb1xuICAvLyBhcyBub2RlIGNvcmUgZG9lc24ndCBoYW5kbGUgdGhpcyBDT01QTEVURUxZIHByb3Blcmx5IHlldC5cbiAgLy9cbiAgaWYgKCFvdXRnb2luZy5hZ2VudCkge1xuICAgIG91dGdvaW5nLmhlYWRlcnMgPSBvdXRnb2luZy5oZWFkZXJzIHx8IHt9O1xuICAgIGlmICh0eXBlb2Ygb3V0Z29pbmcuaGVhZGVycy5jb25uZWN0aW9uICE9PSAnc3RyaW5nJ1xuICAgICAgICB8fCAhdXBncmFkZUhlYWRlci50ZXN0KG91dGdvaW5nLmhlYWRlcnMuY29ubmVjdGlvbilcbiAgICAgICApIHsgb3V0Z29pbmcuaGVhZGVycy5jb25uZWN0aW9uID0gJ2Nsb3NlJzsgfVxuICB9XG5cblxuICAvLyB0aGUgZmluYWwgcGF0aCBpcyB0YXJnZXQgcGF0aCArIHJlbGF0aXZlIHBhdGggcmVxdWVzdGVkIGJ5IHVzZXI6XG4gIHZhciB0YXJnZXQgPSBvcHRpb25zW2ZvcndhcmQgfHwgJ3RhcmdldCddO1xuICB2YXIgdGFyZ2V0UGF0aCA9IHRhcmdldCAmJiBvcHRpb25zLnByZXBlbmRQYXRoICE9PSBmYWxzZVxuICAgID8gKHRhcmdldC5wYXRoIHx8ICcnKVxuICAgIDogJyc7XG5cbiAgLy9cbiAgLy8gUmVtYXJrOiBDYW4gd2Ugc29tZWhvdyBub3QgdXNlIHVybC5wYXJzZSBhcyBhIHBlcmYgb3B0aW1pemF0aW9uP1xuICAvL1xuICB2YXIgb3V0Z29pbmdQYXRoID0gIW9wdGlvbnMudG9Qcm94eVxuICAgID8gKHVybC5wYXJzZShyZXEudXJsKS5wYXRoIHx8ICcnKVxuICAgIDogcmVxLnVybDtcblxuICAvL1xuICAvLyBSZW1hcms6IGlnbm9yZVBhdGggd2lsbCBqdXN0IHN0cmFpZ2h0IHVwIGlnbm9yZSB3aGF0ZXZlciB0aGUgcmVxdWVzdCdzXG4gIC8vIHBhdGggaXMuIFRoaXMgY2FuIGJlIGxhYmVsZWQgYXMgRk9PVC1HVU4gbWF0ZXJpYWwgaWYgeW91IGRvIG5vdCBrbm93IHdoYXRcbiAgLy8geW91IGFyZSBkb2luZyBhbmQgYXJlIHVzaW5nIGNvbmZsaWN0aW5nIG9wdGlvbnMuXG4gIC8vXG4gIG91dGdvaW5nUGF0aCA9ICFvcHRpb25zLmlnbm9yZVBhdGggPyBvdXRnb2luZ1BhdGggOiAnJztcblxuICBvdXRnb2luZy5wYXRoID0gY29tbW9uLnVybEpvaW4odGFyZ2V0UGF0aCwgb3V0Z29pbmdQYXRoKTtcblxuICBpZiAob3B0aW9ucy5jaGFuZ2VPcmlnaW4pIHtcbiAgICBvdXRnb2luZy5oZWFkZXJzLmhvc3QgPVxuICAgICAgcmVxdWlyZWQob3V0Z29pbmcucG9ydCwgb3B0aW9uc1tmb3J3YXJkIHx8ICd0YXJnZXQnXS5wcm90b2NvbCkgJiYgIWhhc1BvcnQob3V0Z29pbmcuaG9zdClcbiAgICAgICAgPyBvdXRnb2luZy5ob3N0ICsgJzonICsgb3V0Z29pbmcucG9ydFxuICAgICAgICA6IG91dGdvaW5nLmhvc3Q7XG4gIH1cbiAgcmV0dXJuIG91dGdvaW5nO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHByb3BlciBjb25maWd1cmF0aW9uIGZvciBzb2NrZXRzLFxuICogc2V0IG5vIGRlbGF5IGFuZCBzZXQga2VlcCBhbGl2ZSwgYWxzbyBzZXRcbiAqIHRoZSB0aW1lb3V0IHRvIDAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgY29tbW9uLnNldHVwU29ja2V0KHNvY2tldClcbiAqICAgIC8vID0+IFNvY2tldFxuICpcbiAqIEBwYXJhbSB7U29ja2V0fSBTb2NrZXQgaW5zdGFuY2UgdG8gc2V0dXBcbiAqXHUwMEEwXG4gKiBAcmV0dXJuIHtTb2NrZXR9IFJldHVybiB0aGUgY29uZmlndXJlZCBzb2NrZXQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuY29tbW9uLnNldHVwU29ja2V0ID0gZnVuY3Rpb24oc29ja2V0KSB7XG4gIHNvY2tldC5zZXRUaW1lb3V0KDApO1xuICBzb2NrZXQuc2V0Tm9EZWxheSh0cnVlKTtcblxuICBzb2NrZXQuc2V0S2VlcEFsaXZlKHRydWUsIDApO1xuXG4gIHJldHVybiBzb2NrZXQ7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcG9ydCBudW1iZXIgZnJvbSB0aGUgaG9zdC4gT3IgZ3Vlc3MgaXQgYmFzZWQgb24gdGhlIGNvbm5lY3Rpb24gdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlcXVlc3R9IHJlcSBJbmNvbWluZyBIVFRQIHJlcXVlc3QuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSBUaGUgcG9ydCBudW1iZXIuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cbmNvbW1vbi5nZXRQb3J0ID0gZnVuY3Rpb24ocmVxKSB7XG4gIHZhciByZXMgPSByZXEuaGVhZGVycy5ob3N0ID8gcmVxLmhlYWRlcnMuaG9zdC5tYXRjaCgvOihcXGQrKS8pIDogJyc7XG5cbiAgcmV0dXJuIHJlcyA/XG4gICAgcmVzWzFdIDpcbiAgICBjb21tb24uaGFzRW5jcnlwdGVkQ29ubmVjdGlvbihyZXEpID8gJzQ0MycgOiAnODAnO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBoYXMgYW4gZW5jcnlwdGVkIGNvbm5lY3Rpb24uXG4gKlxuICogQHBhcmFtIHtSZXF1ZXN0fSByZXEgSW5jb21pbmcgSFRUUCByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gaXMgZW5jcnlwdGVkIG9yIG5vdC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuY29tbW9uLmhhc0VuY3J5cHRlZENvbm5lY3Rpb24gPSBmdW5jdGlvbihyZXEpIHtcbiAgcmV0dXJuIEJvb2xlYW4ocmVxLmNvbm5lY3Rpb24uZW5jcnlwdGVkIHx8IHJlcS5jb25uZWN0aW9uLnBhaXIpO1xufTtcblxuLyoqXG4gKiBPUy1hZ25vc3RpYyBqb2luIChkb2Vzbid0IGJyZWFrIG9uIFVSTHMgbGlrZSBwYXRoLmpvaW4gZG9lcyBvbiBXaW5kb3dzKT5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBnZW5lcmF0ZWQgcGF0aC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5jb21tb24udXJsSm9pbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vXG4gICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gbWVzcyB3aXRoIHRoZSBxdWVyeSBzdHJpbmcuIEFsbCB3ZSB3YW50IHRvIHRvdWNoIGlzIHRoZSBwYXRoLlxuICAgIC8vXG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxcbiAgICAgIGxhc3RJbmRleCA9IGFyZ3MubGVuZ3RoIC0gMSxcbiAgICAgIGxhc3QgPSBhcmdzW2xhc3RJbmRleF0sXG4gICAgICBsYXN0U2VncyA9IGxhc3Quc3BsaXQoJz8nKSxcbiAgICAgIHJldFNlZ3M7XG5cbiAgYXJnc1tsYXN0SW5kZXhdID0gbGFzdFNlZ3Muc2hpZnQoKTtcblxuICAvL1xuICAvLyBKb2luIGFsbCBzdHJpbmdzLCBidXQgcmVtb3ZlIGVtcHR5IHN0cmluZ3Mgc28gd2UgZG9uJ3QgZ2V0IGV4dHJhIHNsYXNoZXMgZnJvbVxuICAvLyBqb2luaW5nIGUuZy4gWycnLCAnYW0nXVxuICAvL1xuICByZXRTZWdzID0gW1xuICAgIGFyZ3MuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy8nKVxuICAgICAgICAucmVwbGFjZSgvXFwvKy9nLCAnLycpXG4gICAgICAgIC5yZXBsYWNlKCdodHRwOi8nLCAnaHR0cDovLycpXG4gICAgICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJylcbiAgXTtcblxuICAvLyBPbmx5IGpvaW4gdGhlIHF1ZXJ5IHN0cmluZyBpZiBpdCBleGlzdHMgc28gd2UgZG9uJ3QgaGF2ZSB0cmFpbGluZyBhICc/J1xuICAvLyBvbiBldmVyeSByZXF1ZXN0XG5cbiAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgPyBpbiB0aGUgVVJMLlxuICByZXRTZWdzLnB1c2guYXBwbHkocmV0U2VncywgbGFzdFNlZ3MpO1xuXG4gIHJldHVybiByZXRTZWdzLmpvaW4oJz8nKVxufTtcblxuLyoqXG4gKiBSZXdyaXRlcyBvciByZW1vdmVzIHRoZSBkb21haW4gb2YgYSBjb29raWUgaGVhZGVyXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IEhlYWRlclxuICogQHBhcmFtIHtPYmplY3R9IENvbmZpZywgbWFwcGluZyBvZiBkb21haW4gdG8gcmV3cml0dGVuIGRvbWFpbi5cbiAqICAgICAgICAgICAgICAgICAnKicga2V5IHRvIG1hdGNoIGFueSBkb21haW4sIG51bGwgdmFsdWUgdG8gcmVtb3ZlIHRoZSBkb21haW4uXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cbmNvbW1vbi5yZXdyaXRlQ29va2llUHJvcGVydHkgPSBmdW5jdGlvbiByZXdyaXRlQ29va2llUHJvcGVydHkoaGVhZGVyLCBjb25maWcsIHByb3BlcnR5KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcikpIHtcbiAgICByZXR1cm4gaGVhZGVyLm1hcChmdW5jdGlvbiAoaGVhZGVyRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHJld3JpdGVDb29raWVQcm9wZXJ0eShoZWFkZXJFbGVtZW50LCBjb25maWcsIHByb3BlcnR5KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gaGVhZGVyLnJlcGxhY2UobmV3IFJlZ0V4cChcIig7XFxcXHMqXCIgKyBwcm9wZXJ0eSArIFwiPSkoW147XSspXCIsICdpJyksIGZ1bmN0aW9uKG1hdGNoLCBwcmVmaXgsIHByZXZpb3VzVmFsdWUpIHtcbiAgICB2YXIgbmV3VmFsdWU7XG4gICAgaWYgKHByZXZpb3VzVmFsdWUgaW4gY29uZmlnKSB7XG4gICAgICBuZXdWYWx1ZSA9IGNvbmZpZ1twcmV2aW91c1ZhbHVlXTtcbiAgICB9IGVsc2UgaWYgKCcqJyBpbiBjb25maWcpIHtcbiAgICAgIG5ld1ZhbHVlID0gY29uZmlnWycqJ107XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vbm8gbWF0Y2gsIHJldHVybiBwcmV2aW91cyB2YWx1ZVxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgIC8vcmVwbGFjZSB2YWx1ZVxuICAgICAgcmV0dXJuIHByZWZpeCArIG5ld1ZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL3JlbW92ZSB2YWx1ZVxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBob3N0IGFuZCBzZWUgaWYgaXQgcG90ZW50aWFsbHkgaGFzIGEgcG9ydCBpbiBpdCAoa2VlcCBpdCBzaW1wbGUpXG4gKlxuICogQHJldHVybnMge0Jvb2xlYW59IFdoZXRoZXIgd2UgaGF2ZSBvbmUgb3Igbm90XG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGhhc1BvcnQoaG9zdCkge1xuICByZXR1cm4gISF+aG9zdC5pbmRleE9mKCc6Jyk7XG59O1xuIiwgInZhciB1cmwgICAgPSByZXF1aXJlKCd1cmwnKSxcbiAgICBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcblxuXG52YXIgcmVkaXJlY3RSZWdleCA9IC9eMjAxfDMwKDF8Mnw3fDgpJC87XG5cbi8qIVxuICogQXJyYXkgb2YgcGFzc2VzLlxuICpcbiAqIEEgYHBhc3NgIGlzIGp1c3QgYSBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIG9uIGByZXEsIHJlcywgb3B0aW9uc2BcbiAqIHNvIHRoYXQgeW91IGNhbiBlYXNpbHkgYWRkIG5ldyBjaGVja3Mgd2hpbGUgc3RpbGwga2VlcGluZyB0aGUgYmFzZVxuICogZmxleGlibGUuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7IC8vIDwtLVxuXG4gIC8qKlxuICAgKiBJZiBpcyBhIEhUVFAgMS4wIHJlcXVlc3QsIHJlbW92ZSBjaHVuayBoZWFkZXJzXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtwcm94eVJlc3BvbnNlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0IGZyb20gdGhlIHByb3h5IHJlcXVlc3RcbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuICByZW1vdmVDaHVua2VkOiBmdW5jdGlvbiByZW1vdmVDaHVua2VkKHJlcSwgcmVzLCBwcm94eVJlcykge1xuICAgIGlmIChyZXEuaHR0cFZlcnNpb24gPT09ICcxLjAnKSB7XG4gICAgICBkZWxldGUgcHJveHlSZXMuaGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIElmIGlzIGEgSFRUUCAxLjAgcmVxdWVzdCwgc2V0IHRoZSBjb3JyZWN0IGNvbm5lY3Rpb24gaGVhZGVyXG4gICAqIG9yIGlmIGNvbm5lY3Rpb24gaGVhZGVyIG5vdCBwcmVzZW50LCB0aGVuIHVzZSBga2VlcC1hbGl2ZWBcbiAgICpcbiAgICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBvYmplY3RcbiAgICpcdTAwQTBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gUmVzIFJlc3BvbnNlIG9iamVjdFxuICAgKiBAcGFyYW0ge3Byb3h5UmVzcG9uc2V9IFJlcyBSZXNwb25zZSBvYmplY3QgZnJvbSB0aGUgcHJveHkgcmVxdWVzdFxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIHNldENvbm5lY3Rpb246IGZ1bmN0aW9uIHNldENvbm5lY3Rpb24ocmVxLCByZXMsIHByb3h5UmVzKSB7XG4gICAgaWYgKHJlcS5odHRwVmVyc2lvbiA9PT0gJzEuMCcpIHtcbiAgICAgIHByb3h5UmVzLmhlYWRlcnMuY29ubmVjdGlvbiA9IHJlcS5oZWFkZXJzLmNvbm5lY3Rpb24gfHwgJ2Nsb3NlJztcbiAgICB9IGVsc2UgaWYgKHJlcS5odHRwVmVyc2lvbiAhPT0gJzIuMCcgJiYgIXByb3h5UmVzLmhlYWRlcnMuY29ubmVjdGlvbikge1xuICAgICAgcHJveHlSZXMuaGVhZGVycy5jb25uZWN0aW9uID0gcmVxLmhlYWRlcnMuY29ubmVjdGlvbiB8fCAna2VlcC1hbGl2ZSc7XG4gICAgfVxuICB9LFxuXG4gIHNldFJlZGlyZWN0SG9zdFJld3JpdGU6IGZ1bmN0aW9uIHNldFJlZGlyZWN0SG9zdFJld3JpdGUocmVxLCByZXMsIHByb3h5UmVzLCBvcHRpb25zKSB7XG4gICAgaWYgKChvcHRpb25zLmhvc3RSZXdyaXRlIHx8IG9wdGlvbnMuYXV0b1Jld3JpdGUgfHwgb3B0aW9ucy5wcm90b2NvbFJld3JpdGUpXG4gICAgICAgICYmIHByb3h5UmVzLmhlYWRlcnNbJ2xvY2F0aW9uJ11cbiAgICAgICAgJiYgcmVkaXJlY3RSZWdleC50ZXN0KHByb3h5UmVzLnN0YXR1c0NvZGUpKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gdXJsLnBhcnNlKG9wdGlvbnMudGFyZ2V0KTtcbiAgICAgIHZhciB1ID0gdXJsLnBhcnNlKHByb3h5UmVzLmhlYWRlcnNbJ2xvY2F0aW9uJ10pO1xuXG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIHJlZGlyZWN0ZWQgaG9zdCBtYXRjaGVzIHRoZSB0YXJnZXQgaG9zdCBiZWZvcmUgcmV3cml0aW5nXG4gICAgICBpZiAodGFyZ2V0Lmhvc3QgIT0gdS5ob3N0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuaG9zdFJld3JpdGUpIHtcbiAgICAgICAgdS5ob3N0ID0gb3B0aW9ucy5ob3N0UmV3cml0ZTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5hdXRvUmV3cml0ZSkge1xuICAgICAgICB1Lmhvc3QgPSByZXEuaGVhZGVyc1snaG9zdCddO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMucHJvdG9jb2xSZXdyaXRlKSB7XG4gICAgICAgIHUucHJvdG9jb2wgPSBvcHRpb25zLnByb3RvY29sUmV3cml0ZTtcbiAgICAgIH1cblxuICAgICAgcHJveHlSZXMuaGVhZGVyc1snbG9jYXRpb24nXSA9IHUuZm9ybWF0KCk7XG4gICAgfVxuICB9LFxuICAvKipcbiAgICogQ29weSBoZWFkZXJzIGZyb20gcHJveHlSZXNwb25zZSB0byByZXNwb25zZVxuICAgKiBzZXQgZWFjaCBoZWFkZXIgaW4gcmVzcG9uc2Ugb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7SW5jb21pbmdNZXNzYWdlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7cHJveHlSZXNwb25zZX0gUmVzIFJlc3BvbnNlIG9iamVjdCBmcm9tIHRoZSBwcm94eSByZXF1ZXN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIG9wdGlvbnMuY29va2llRG9tYWluUmV3cml0ZTogQ29uZmlnIHRvIHJld3JpdGUgY29va2llIGRvbWFpblxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIHdyaXRlSGVhZGVyczogZnVuY3Rpb24gd3JpdGVIZWFkZXJzKHJlcSwgcmVzLCBwcm94eVJlcywgb3B0aW9ucykge1xuICAgIHZhciByZXdyaXRlQ29va2llRG9tYWluQ29uZmlnID0gb3B0aW9ucy5jb29raWVEb21haW5SZXdyaXRlLFxuICAgICAgICByZXdyaXRlQ29va2llUGF0aENvbmZpZyA9IG9wdGlvbnMuY29va2llUGF0aFJld3JpdGUsXG4gICAgICAgIHByZXNlcnZlSGVhZGVyS2V5Q2FzZSA9IG9wdGlvbnMucHJlc2VydmVIZWFkZXJLZXlDYXNlLFxuICAgICAgICByYXdIZWFkZXJLZXlNYXAsXG4gICAgICAgIHNldEhlYWRlciA9IGZ1bmN0aW9uKGtleSwgaGVhZGVyKSB7XG4gICAgICAgICAgaWYgKGhlYWRlciA9PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgICBpZiAocmV3cml0ZUNvb2tpZURvbWFpbkNvbmZpZyAmJiBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICAgICAgICBoZWFkZXIgPSBjb21tb24ucmV3cml0ZUNvb2tpZVByb3BlcnR5KGhlYWRlciwgcmV3cml0ZUNvb2tpZURvbWFpbkNvbmZpZywgJ2RvbWFpbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmV3cml0ZUNvb2tpZVBhdGhDb25maWcgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICAgICAgaGVhZGVyID0gY29tbW9uLnJld3JpdGVDb29raWVQcm9wZXJ0eShoZWFkZXIsIHJld3JpdGVDb29raWVQYXRoQ29uZmlnLCAncGF0aCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMuc2V0SGVhZGVyKFN0cmluZyhrZXkpLnRyaW0oKSwgaGVhZGVyKTtcbiAgICAgICAgfTtcblxuICAgIGlmICh0eXBlb2YgcmV3cml0ZUNvb2tpZURvbWFpbkNvbmZpZyA9PT0gJ3N0cmluZycpIHsgLy9hbHNvIHRlc3QgZm9yICcnXG4gICAgICByZXdyaXRlQ29va2llRG9tYWluQ29uZmlnID0geyAnKic6IHJld3JpdGVDb29raWVEb21haW5Db25maWcgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJld3JpdGVDb29raWVQYXRoQ29uZmlnID09PSAnc3RyaW5nJykgeyAvL2Fsc28gdGVzdCBmb3IgJydcbiAgICAgIHJld3JpdGVDb29raWVQYXRoQ29uZmlnID0geyAnKic6IHJld3JpdGVDb29raWVQYXRoQ29uZmlnIH07XG4gICAgfVxuXG4gICAgLy8gbWVzc2FnZS5yYXdIZWFkZXJzIGlzIGFkZGVkIGluOiB2MC4xMS42XG4gICAgLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX3Jhd2hlYWRlcnNcbiAgICBpZiAocHJlc2VydmVIZWFkZXJLZXlDYXNlICYmIHByb3h5UmVzLnJhd0hlYWRlcnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICByYXdIZWFkZXJLZXlNYXAgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJveHlSZXMucmF3SGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICB2YXIga2V5ID0gcHJveHlSZXMucmF3SGVhZGVyc1tpXTtcbiAgICAgICAgcmF3SGVhZGVyS2V5TWFwW2tleS50b0xvd2VyQ2FzZSgpXSA9IGtleTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhwcm94eVJlcy5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgdmFyIGhlYWRlciA9IHByb3h5UmVzLmhlYWRlcnNba2V5XTtcbiAgICAgIGlmIChwcmVzZXJ2ZUhlYWRlcktleUNhc2UgJiYgcmF3SGVhZGVyS2V5TWFwKSB7XG4gICAgICAgIGtleSA9IHJhd0hlYWRlcktleU1hcFtrZXldIHx8IGtleTtcbiAgICAgIH1cbiAgICAgIHNldEhlYWRlcihrZXksIGhlYWRlcik7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc3RhdHVzQ29kZSBmcm9tIHRoZSBwcm94eVJlc3BvbnNlXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtwcm94eVJlc3BvbnNlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0IGZyb20gdGhlIHByb3h5IHJlcXVlc3RcbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuICB3cml0ZVN0YXR1c0NvZGU6IGZ1bmN0aW9uIHdyaXRlU3RhdHVzQ29kZShyZXEsIHJlcywgcHJveHlSZXMpIHtcbiAgICAvLyBGcm9tIE5vZGUuanMgZG9jczogcmVzcG9uc2Uud3JpdGVIZWFkKHN0YXR1c0NvZGVbLCBzdGF0dXNNZXNzYWdlXVssIGhlYWRlcnNdKVxuICAgIGlmKHByb3h5UmVzLnN0YXR1c01lc3NhZ2UpIHtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gcHJveHlSZXMuc3RhdHVzQ29kZTtcbiAgICAgIHJlcy5zdGF0dXNNZXNzYWdlID0gcHJveHlSZXMuc3RhdHVzTWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSBwcm94eVJlcy5zdGF0dXNDb2RlO1xuICAgIH1cbiAgfVxuXG59O1xuIiwgIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0bGV0IGVuYWJsZWRDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcblx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0aWYgKCFkZWJ1Zy5lbmFibGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VsZiA9IGRlYnVnO1xuXG5cdFx0XHQvLyBTZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdGNvbnN0IG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcblx0XHRcdHNlbGYuZGlmZiA9IG1zO1xuXHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRzZWxmLmN1cnIgPSBjdXJyO1xuXHRcdFx0cHJldlRpbWUgPSBjdXJyO1xuXG5cdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdC8vIEFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG5cdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgKG1hdGNoLCBmb3JtYXQpID0+IHtcblx0XHRcdFx0Ly8gSWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlciA9IGNyZWF0ZURlYnVnLmZvcm1hdHRlcnNbZm9ybWF0XTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHRcdFx0XHQvLyBOb3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG5cdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdGluZGV4LS07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG5cdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdGNvbnN0IGxvZ0ZuID0gc2VsZi5sb2cgfHwgY3JlYXRlRGVidWcubG9nO1xuXHRcdFx0bG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cdFx0fVxuXG5cdFx0ZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHRcdGRlYnVnLnVzZUNvbG9ycyA9IGNyZWF0ZURlYnVnLnVzZUNvbG9ycygpO1xuXHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRkZWJ1Zy5leHRlbmQgPSBleHRlbmQ7XG5cdFx0ZGVidWcuZGVzdHJveSA9IGNyZWF0ZURlYnVnLmRlc3Ryb3k7IC8vIFhYWCBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmIChlbmFibGVPdmVycmlkZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBlbmFibGVPdmVycmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobmFtZXNwYWNlc0NhY2hlICE9PSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0bmFtZXNwYWNlc0NhY2hlID0gY3JlYXRlRGVidWcubmFtZXNwYWNlcztcblx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZW5hYmxlZENhY2hlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogdiA9PiB7XG5cdFx0XHRcdGVuYWJsZU92ZXJyaWRlID0gdjtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG5cdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5pbml0KGRlYnVnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVidWc7XG5cdH1cblxuXHRmdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlLCBkZWxpbWl0ZXIpIHtcblx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0bmV3RGVidWcubG9nID0gdGhpcy5sb2c7XG5cdFx0cmV0dXJuIG5ld0RlYnVnO1xuXHR9XG5cblx0LyoqXG5cdCogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuXHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG5cdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcblxuXHRcdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdGxldCBpO1xuXHRcdGNvbnN0IHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcblx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmICghc3BsaXRbaV0pIHtcblx0XHRcdFx0Ly8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuXG5cdFx0XHRpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnNsaWNlKDEpICsgJyQnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuXHQqXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZGlzYWJsZSgpIHtcblx0XHRjb25zdCBuYW1lc3BhY2VzID0gW1xuXHRcdFx0Li4uY3JlYXRlRGVidWcubmFtZXMubWFwKHRvTmFtZXNwYWNlKSxcblx0XHRcdC4uLmNyZWF0ZURlYnVnLnNraXBzLm1hcCh0b05hbWVzcGFjZSkubWFwKG5hbWVzcGFjZSA9PiAnLScgKyBuYW1lc3BhY2UpXG5cdFx0XS5qb2luKCcsJyk7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlKCcnKTtcblx0XHRyZXR1cm4gbmFtZXNwYWNlcztcblx0fVxuXG5cdC8qKlxuXHQqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdCogQHJldHVybiB7Qm9vbGVhbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHRpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGxldCBpO1xuXHRcdGxldCBsZW47XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcubmFtZXNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0KiBDb252ZXJ0IHJlZ2V4cCB0byBuYW1lc3BhY2Vcblx0KlxuXHQqIEBwYXJhbSB7UmVnRXhwfSByZWd4ZXBcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiB0b05hbWVzcGFjZShyZWdleHApIHtcblx0XHRyZXR1cm4gcmVnZXhwLnRvU3RyaW5nKClcblx0XHRcdC5zdWJzdHJpbmcoMiwgcmVnZXhwLnRvU3RyaW5nKCkubGVuZ3RoIC0gMilcblx0XHRcdC5yZXBsYWNlKC9cXC5cXCpcXD8kLywgJyonKTtcblx0fVxuXG5cdC8qKlxuXHQqIENvZXJjZSBgdmFsYC5cblx0KlxuXHQqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuXHQqIEByZXR1cm4ge01peGVkfVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0aWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCogWFhYIERPIE5PVCBVU0UuIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3R1YiBmdW5jdGlvbi5cblx0KiBYWFggSXQgV0lMTCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cdCovXG5cdGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdH1cblxuXHRjcmVhdGVEZWJ1Zy5lbmFibGUoY3JlYXRlRGVidWcubG9hZCgpKTtcblxuXHRyZXR1cm4gY3JlYXRlRGVidWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dXA7XG4iLCAiLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gbG9jYWxzdG9yYWdlKCk7XG5leHBvcnRzLmRlc3Ryb3kgPSAoKCkgPT4ge1xuXHRsZXQgd2FybmVkID0gZmFsc2U7XG5cblx0cmV0dXJuICgpID0+IHtcblx0XHRpZiAoIXdhcm5lZCkge1xuXHRcdFx0d2FybmVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHRcdH1cblx0fTtcbn0pKCk7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gW1xuXHQnIzAwMDBDQycsXG5cdCcjMDAwMEZGJyxcblx0JyMwMDMzQ0MnLFxuXHQnIzAwMzNGRicsXG5cdCcjMDA2NkNDJyxcblx0JyMwMDY2RkYnLFxuXHQnIzAwOTlDQycsXG5cdCcjMDA5OUZGJyxcblx0JyMwMENDMDAnLFxuXHQnIzAwQ0MzMycsXG5cdCcjMDBDQzY2Jyxcblx0JyMwMENDOTknLFxuXHQnIzAwQ0NDQycsXG5cdCcjMDBDQ0ZGJyxcblx0JyMzMzAwQ0MnLFxuXHQnIzMzMDBGRicsXG5cdCcjMzMzM0NDJyxcblx0JyMzMzMzRkYnLFxuXHQnIzMzNjZDQycsXG5cdCcjMzM2NkZGJyxcblx0JyMzMzk5Q0MnLFxuXHQnIzMzOTlGRicsXG5cdCcjMzNDQzAwJyxcblx0JyMzM0NDMzMnLFxuXHQnIzMzQ0M2NicsXG5cdCcjMzNDQzk5Jyxcblx0JyMzM0NDQ0MnLFxuXHQnIzMzQ0NGRicsXG5cdCcjNjYwMENDJyxcblx0JyM2NjAwRkYnLFxuXHQnIzY2MzNDQycsXG5cdCcjNjYzM0ZGJyxcblx0JyM2NkNDMDAnLFxuXHQnIzY2Q0MzMycsXG5cdCcjOTkwMENDJyxcblx0JyM5OTAwRkYnLFxuXHQnIzk5MzNDQycsXG5cdCcjOTkzM0ZGJyxcblx0JyM5OUNDMDAnLFxuXHQnIzk5Q0MzMycsXG5cdCcjQ0MwMDAwJyxcblx0JyNDQzAwMzMnLFxuXHQnI0NDMDA2NicsXG5cdCcjQ0MwMDk5Jyxcblx0JyNDQzAwQ0MnLFxuXHQnI0NDMDBGRicsXG5cdCcjQ0MzMzAwJyxcblx0JyNDQzMzMzMnLFxuXHQnI0NDMzM2NicsXG5cdCcjQ0MzMzk5Jyxcblx0JyNDQzMzQ0MnLFxuXHQnI0NDMzNGRicsXG5cdCcjQ0M2NjAwJyxcblx0JyNDQzY2MzMnLFxuXHQnI0NDOTkwMCcsXG5cdCcjQ0M5OTMzJyxcblx0JyNDQ0NDMDAnLFxuXHQnI0NDQ0MzMycsXG5cdCcjRkYwMDAwJyxcblx0JyNGRjAwMzMnLFxuXHQnI0ZGMDA2NicsXG5cdCcjRkYwMDk5Jyxcblx0JyNGRjAwQ0MnLFxuXHQnI0ZGMDBGRicsXG5cdCcjRkYzMzAwJyxcblx0JyNGRjMzMzMnLFxuXHQnI0ZGMzM2NicsXG5cdCcjRkYzMzk5Jyxcblx0JyNGRjMzQ0MnLFxuXHQnI0ZGMzNGRicsXG5cdCcjRkY2NjAwJyxcblx0JyNGRjY2MzMnLFxuXHQnI0ZGOTkwMCcsXG5cdCcjRkY5OTMzJyxcblx0JyNGRkNDMDAnLFxuXHQnI0ZGQ0MzMydcbl07XG5cbi8qKlxuICogQ3VycmVudGx5IG9ubHkgV2ViS2l0LWJhc2VkIFdlYiBJbnNwZWN0b3JzLCBGaXJlZm94ID49IHYzMSxcbiAqIGFuZCB0aGUgRmlyZWJ1ZyBleHRlbnNpb24gKGFueSBGaXJlZm94IHZlcnNpb24pIGFyZSBrbm93blxuICogdG8gc3VwcG9ydCBcIiVjXCIgQ1NTIGN1c3RvbWl6YXRpb25zLlxuICpcbiAqIFRPRE86IGFkZCBhIGBsb2NhbFN0b3JhZ2VgIHZhcmlhYmxlIHRvIGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgY29sb3JzXG4gKi9cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0Ly8gTkI6IEluIGFuIEVsZWN0cm9uIHByZWxvYWQgc2NyaXB0LCBkb2N1bWVudCB3aWxsIGJlIGRlZmluZWQgYnV0IG5vdCBmdWxseVxuXHQvLyBpbml0aWFsaXplZC4gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBDaHJvbWUsIHdlJ2xsIGp1c3QgZGV0ZWN0IHRoaXMgY2FzZVxuXHQvLyBleHBsaWNpdGx5XG5cdGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cucHJvY2VzcyAmJiAod2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCB3aW5kb3cucHJvY2Vzcy5fX253anMpKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSBkbyBub3Qgc3VwcG9ydCBjb2xvcnMuXG5cdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvKGVkZ2V8dHJpZGVudClcXC8oXFxkKykvKSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIElzIHdlYmtpdD8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTY0NTk2MDYvMzc2NzczXG5cdC8vIGRvY3VtZW50IGlzIHVuZGVmaW5lZCBpbiByZWFjdC1uYXRpdmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvcHVsbC8xNjMyXG5cdHJldHVybiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5XZWJraXRBcHBlYXJhbmNlKSB8fFxuXHRcdC8vIElzIGZpcmVidWc/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM5ODEyMC8zNzY3NzNcblx0XHQodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNvbnNvbGUgJiYgKHdpbmRvdy5jb25zb2xlLmZpcmVidWcgfHwgKHdpbmRvdy5jb25zb2xlLmV4Y2VwdGlvbiAmJiB3aW5kb3cuY29uc29sZS50YWJsZSkpKSB8fFxuXHRcdC8vIElzIGZpcmVmb3ggPj0gdjMxP1xuXHRcdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvVG9vbHMvV2ViX0NvbnNvbGUjU3R5bGluZ19tZXNzYWdlc1xuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pICYmIHBhcnNlSW50KFJlZ0V4cC4kMSwgMTApID49IDMxKSB8fFxuXHRcdC8vIERvdWJsZSBjaGVjayB3ZWJraXQgaW4gdXNlckFnZW50IGp1c3QgaW4gY2FzZSB3ZSBhcmUgaW4gYSB3b3JrZXJcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2FwcGxld2Via2l0XFwvKFxcZCspLykpO1xufVxuXG4vKipcbiAqIENvbG9yaXplIGxvZyBhcmd1bWVudHMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRhcmdzWzBdID0gKHRoaXMudXNlQ29sb3JzID8gJyVjJyA6ICcnKSArXG5cdFx0dGhpcy5uYW1lc3BhY2UgK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICcgJWMnIDogJyAnKSArXG5cdFx0YXJnc1swXSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyVjICcgOiAnICcpICtcblx0XHQnKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO1xuXG5cdGlmICghdGhpcy51c2VDb2xvcnMpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBjID0gJ2NvbG9yOiAnICsgdGhpcy5jb2xvcjtcblx0YXJncy5zcGxpY2UoMSwgMCwgYywgJ2NvbG9yOiBpbmhlcml0Jyk7XG5cblx0Ly8gVGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcblx0Ly8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuXHQvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cblx0bGV0IGluZGV4ID0gMDtcblx0bGV0IGxhc3RDID0gMDtcblx0YXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIG1hdGNoID0+IHtcblx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aW5kZXgrKztcblx0XHRpZiAobWF0Y2ggPT09ICclYycpIHtcblx0XHRcdC8vIFdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuXHRcdFx0Ly8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcblx0XHRcdGxhc3RDID0gaW5kZXg7XG5cdFx0fVxuXHR9KTtcblxuXHRhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5kZWJ1ZygpYCB3aGVuIGF2YWlsYWJsZS5cbiAqIE5vLW9wIHdoZW4gYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhIFwiZnVuY3Rpb25cIi5cbiAqIElmIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYXZhaWxhYmxlLCBmYWxscyBiYWNrXG4gKiB0byBgY29uc29sZS5sb2dgLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cbmV4cG9ydHMubG9nID0gY29uc29sZS5kZWJ1ZyB8fCBjb25zb2xlLmxvZyB8fCAoKCkgPT4ge30pO1xuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdHRyeSB7XG5cdFx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5zZXRJdGVtKCdkZWJ1ZycsIG5hbWVzcGFjZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVidWcnKTtcblx0XHR9XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdGxldCByO1xuXHR0cnkge1xuXHRcdHIgPSBleHBvcnRzLnN0b3JhZ2UuZ2V0SXRlbSgnZGVidWcnKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cblxuXHQvLyBJZiBkZWJ1ZyBpc24ndCBzZXQgaW4gTFMsIGFuZCB3ZSdyZSBpbiBFbGVjdHJvbiwgdHJ5IHRvIGxvYWQgJERFQlVHXG5cdGlmICghciAmJiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2VudicgaW4gcHJvY2Vzcykge1xuXHRcdHIgPSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxuXG5cdHJldHVybiByO1xufVxuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcblx0dHJ5IHtcblx0XHQvLyBUVk1MS2l0IChBcHBsZSBUViBKUyBSdW50aW1lKSBkb2VzIG5vdCBoYXZlIGEgd2luZG93IG9iamVjdCwganVzdCBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0XG5cdFx0Ly8gVGhlIEJyb3dzZXIgYWxzbyBoYXMgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dC5cblx0XHRyZXR1cm4gbG9jYWxTdG9yYWdlO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlaiB0byBgSlNPTi5zdHJpbmdpZnkoKWAsIHNpbmNlIG5vIFdlYiBJbnNwZWN0b3JzIGRvIHRoYXQgYnkgZGVmYXVsdC5cbiAqL1xuXG5mb3JtYXR0ZXJzLmogPSBmdW5jdGlvbiAodikge1xuXHR0cnkge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRyZXR1cm4gJ1tVbmV4cGVjdGVkSlNPTlBhcnNlRXJyb3JdOiAnICsgZXJyb3IubWVzc2FnZTtcblx0fVxufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gKGZsYWcsIGFyZ3YgPSBwcm9jZXNzLmFyZ3YpID0+IHtcblx0Y29uc3QgcHJlZml4ID0gZmxhZy5zdGFydHNXaXRoKCctJykgPyAnJyA6IChmbGFnLmxlbmd0aCA9PT0gMSA/ICctJyA6ICctLScpO1xuXHRjb25zdCBwb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZihwcmVmaXggKyBmbGFnKTtcblx0Y29uc3QgdGVybWluYXRvclBvc2l0aW9uID0gYXJndi5pbmRleE9mKCctLScpO1xuXHRyZXR1cm4gcG9zaXRpb24gIT09IC0xICYmICh0ZXJtaW5hdG9yUG9zaXRpb24gPT09IC0xIHx8IHBvc2l0aW9uIDwgdGVybWluYXRvclBvc2l0aW9uKTtcbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuY29uc3Qgb3MgPSByZXF1aXJlKCdvcycpO1xuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCBoYXNGbGFnID0gcmVxdWlyZSgnaGFzLWZsYWcnKTtcblxuY29uc3Qge2Vudn0gPSBwcm9jZXNzO1xuXG5sZXQgZm9yY2VDb2xvcjtcbmlmIChoYXNGbGFnKCduby1jb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ25vLWNvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPWZhbHNlJykgfHxcblx0aGFzRmxhZygnY29sb3I9bmV2ZXInKSkge1xuXHRmb3JjZUNvbG9yID0gMDtcbn0gZWxzZSBpZiAoaGFzRmxhZygnY29sb3InKSB8fFxuXHRoYXNGbGFnKCdjb2xvcnMnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj10cnVlJykgfHxcblx0aGFzRmxhZygnY29sb3I9YWx3YXlzJykpIHtcblx0Zm9yY2VDb2xvciA9IDE7XG59XG5cbmlmICgnRk9SQ0VfQ09MT1InIGluIGVudikge1xuXHRpZiAoZW52LkZPUkNFX0NPTE9SID09PSAndHJ1ZScpIHtcblx0XHRmb3JjZUNvbG9yID0gMTtcblx0fSBlbHNlIGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICdmYWxzZScpIHtcblx0XHRmb3JjZUNvbG9yID0gMDtcblx0fSBlbHNlIHtcblx0XHRmb3JjZUNvbG9yID0gZW52LkZPUkNFX0NPTE9SLmxlbmd0aCA9PT0gMCA/IDEgOiBNYXRoLm1pbihwYXJzZUludChlbnYuRk9SQ0VfQ09MT1IsIDEwKSwgMyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpIHtcblx0aWYgKGxldmVsID09PSAwKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRsZXZlbCxcblx0XHRoYXNCYXNpYzogdHJ1ZSxcblx0XHRoYXMyNTY6IGxldmVsID49IDIsXG5cdFx0aGFzMTZtOiBsZXZlbCA+PSAzXG5cdH07XG59XG5cbmZ1bmN0aW9uIHN1cHBvcnRzQ29sb3IoaGF2ZVN0cmVhbSwgc3RyZWFtSXNUVFkpIHtcblx0aWYgKGZvcmNlQ29sb3IgPT09IDApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGlmIChoYXNGbGFnKCdjb2xvcj0xNm0nKSB8fFxuXHRcdGhhc0ZsYWcoJ2NvbG9yPWZ1bGwnKSB8fFxuXHRcdGhhc0ZsYWcoJ2NvbG9yPXRydWVjb2xvcicpKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoaGFzRmxhZygnY29sb3I9MjU2JykpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXG5cdGlmIChoYXZlU3RyZWFtICYmICFzdHJlYW1Jc1RUWSAmJiBmb3JjZUNvbG9yID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGNvbnN0IG1pbiA9IGZvcmNlQ29sb3IgfHwgMDtcblxuXHRpZiAoZW52LlRFUk0gPT09ICdkdW1iJykge1xuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTA1ODYgaXMgdGhlIGZpcnN0IFdpbmRvd3MgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDI1NiBjb2xvcnMuXG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxNDkzMSBpcyB0aGUgZmlyc3QgcmVsZWFzZSB0aGF0IHN1cHBvcnRzIDE2bS9UcnVlQ29sb3IuXG5cdFx0Y29uc3Qgb3NSZWxlYXNlID0gb3MucmVsZWFzZSgpLnNwbGl0KCcuJyk7XG5cdFx0aWYgKFxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVswXSkgPj0gMTAgJiZcblx0XHRcdE51bWJlcihvc1JlbGVhc2VbMl0pID49IDEwNTg2XG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gTnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTQ5MzEgPyAzIDogMjtcblx0XHR9XG5cblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ0knIGluIGVudikge1xuXHRcdGlmIChbJ1RSQVZJUycsICdDSVJDTEVDSScsICdBUFBWRVlPUicsICdHSVRMQUJfQ0knLCAnR0lUSFVCX0FDVElPTlMnLCAnQlVJTERLSVRFJ10uc29tZShzaWduID0+IHNpZ24gaW4gZW52KSB8fCBlbnYuQ0lfTkFNRSA9PT0gJ2NvZGVzaGlwJykge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmICgnVEVBTUNJVFlfVkVSU0lPTicgaW4gZW52KSB7XG5cdFx0cmV0dXJuIC9eKDlcXC4oMCpbMS05XVxcZCopXFwufFxcZHsyLH1cXC4pLy50ZXN0KGVudi5URUFNQ0lUWV9WRVJTSU9OKSA/IDEgOiAwO1xuXHR9XG5cblx0aWYgKGVudi5DT0xPUlRFUk0gPT09ICd0cnVlY29sb3InKSB7XG5cdFx0cmV0dXJuIDM7XG5cdH1cblxuXHRpZiAoJ1RFUk1fUFJPR1JBTScgaW4gZW52KSB7XG5cdFx0Y29uc3QgdmVyc2lvbiA9IHBhcnNlSW50KChlbnYuVEVSTV9QUk9HUkFNX1ZFUlNJT04gfHwgJycpLnNwbGl0KCcuJylbMF0sIDEwKTtcblxuXHRcdHN3aXRjaCAoZW52LlRFUk1fUFJPR1JBTSkge1xuXHRcdFx0Y2FzZSAnaVRlcm0uYXBwJzpcblx0XHRcdFx0cmV0dXJuIHZlcnNpb24gPj0gMyA/IDMgOiAyO1xuXHRcdFx0Y2FzZSAnQXBwbGVfVGVybWluYWwnOlxuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdC8vIE5vIGRlZmF1bHRcblx0XHR9XG5cdH1cblxuXHRpZiAoLy0yNTYoY29sb3IpPyQvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKC9ec2NyZWVufF54dGVybXxednQxMDB8XnZ0MjIwfF5yeHZ0fGNvbG9yfGFuc2l8Y3lnd2lufGxpbnV4L2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdGlmICgnQ09MT1JURVJNJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gMTtcblx0fVxuXG5cdHJldHVybiBtaW47XG59XG5cbmZ1bmN0aW9uIGdldFN1cHBvcnRMZXZlbChzdHJlYW0pIHtcblx0Y29uc3QgbGV2ZWwgPSBzdXBwb3J0c0NvbG9yKHN0cmVhbSwgc3RyZWFtICYmIHN0cmVhbS5pc1RUWSk7XG5cdHJldHVybiB0cmFuc2xhdGVMZXZlbChsZXZlbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRzdXBwb3J0c0NvbG9yOiBnZXRTdXBwb3J0TGV2ZWwsXG5cdHN0ZG91dDogdHJhbnNsYXRlTGV2ZWwoc3VwcG9ydHNDb2xvcih0cnVlLCB0dHkuaXNhdHR5KDEpKSksXG5cdHN0ZGVycjogdHJhbnNsYXRlTGV2ZWwoc3VwcG9ydHNDb2xvcih0cnVlLCB0dHkuaXNhdHR5KDIpKSlcbn07XG4iLCAiLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbmNvbnN0IHR0eSA9IHJlcXVpcmUoJ3R0eScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5sb2cgPSBsb2c7XG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuZGVzdHJveSA9IHV0aWwuZGVwcmVjYXRlKFxuXHQoKSA9PiB7fSxcblx0J0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nXG4pO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFs2LCAyLCAzLCA0LCA1LCAxXTtcblxudHJ5IHtcblx0Ly8gT3B0aW9uYWwgZGVwZW5kZW5jeSAoYXMgaW4sIGRvZXNuJ3QgbmVlZCB0byBiZSBpbnN0YWxsZWQsIE5PVCBsaWtlIG9wdGlvbmFsRGVwZW5kZW5jaWVzIGluIHBhY2thZ2UuanNvbilcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuXHRjb25zdCBzdXBwb3J0c0NvbG9yID0gcmVxdWlyZSgnc3VwcG9ydHMtY29sb3InKTtcblxuXHRpZiAoc3VwcG9ydHNDb2xvciAmJiAoc3VwcG9ydHNDb2xvci5zdGRlcnIgfHwgc3VwcG9ydHNDb2xvcikubGV2ZWwgPj0gMikge1xuXHRcdGV4cG9ydHMuY29sb3JzID0gW1xuXHRcdFx0MjAsXG5cdFx0XHQyMSxcblx0XHRcdDI2LFxuXHRcdFx0MjcsXG5cdFx0XHQzMixcblx0XHRcdDMzLFxuXHRcdFx0MzgsXG5cdFx0XHQzOSxcblx0XHRcdDQwLFxuXHRcdFx0NDEsXG5cdFx0XHQ0Mixcblx0XHRcdDQzLFxuXHRcdFx0NDQsXG5cdFx0XHQ0NSxcblx0XHRcdDU2LFxuXHRcdFx0NTcsXG5cdFx0XHQ2Mixcblx0XHRcdDYzLFxuXHRcdFx0NjgsXG5cdFx0XHQ2OSxcblx0XHRcdDc0LFxuXHRcdFx0NzUsXG5cdFx0XHQ3Nixcblx0XHRcdDc3LFxuXHRcdFx0NzgsXG5cdFx0XHQ3OSxcblx0XHRcdDgwLFxuXHRcdFx0ODEsXG5cdFx0XHQ5Mixcblx0XHRcdDkzLFxuXHRcdFx0OTgsXG5cdFx0XHQ5OSxcblx0XHRcdDExMixcblx0XHRcdDExMyxcblx0XHRcdDEyOCxcblx0XHRcdDEyOSxcblx0XHRcdDEzNCxcblx0XHRcdDEzNSxcblx0XHRcdDE0OCxcblx0XHRcdDE0OSxcblx0XHRcdDE2MCxcblx0XHRcdDE2MSxcblx0XHRcdDE2Mixcblx0XHRcdDE2Myxcblx0XHRcdDE2NCxcblx0XHRcdDE2NSxcblx0XHRcdDE2Nixcblx0XHRcdDE2Nyxcblx0XHRcdDE2OCxcblx0XHRcdDE2OSxcblx0XHRcdDE3MCxcblx0XHRcdDE3MSxcblx0XHRcdDE3Mixcblx0XHRcdDE3Myxcblx0XHRcdDE3OCxcblx0XHRcdDE3OSxcblx0XHRcdDE4NCxcblx0XHRcdDE4NSxcblx0XHRcdDE5Nixcblx0XHRcdDE5Nyxcblx0XHRcdDE5OCxcblx0XHRcdDE5OSxcblx0XHRcdDIwMCxcblx0XHRcdDIwMSxcblx0XHRcdDIwMixcblx0XHRcdDIwMyxcblx0XHRcdDIwNCxcblx0XHRcdDIwNSxcblx0XHRcdDIwNixcblx0XHRcdDIwNyxcblx0XHRcdDIwOCxcblx0XHRcdDIwOSxcblx0XHRcdDIxNCxcblx0XHRcdDIxNSxcblx0XHRcdDIyMCxcblx0XHRcdDIyMVxuXHRcdF07XG5cdH1cbn0gY2F0Y2ggKGVycm9yKSB7XG5cdC8vIFN3YWxsb3cgLSB3ZSBvbmx5IGNhcmUgaWYgYHN1cHBvcnRzLWNvbG9yYCBpcyBhdmFpbGFibGU7IGl0IGRvZXNuJ3QgaGF2ZSB0byBiZS5cbn1cblxuLyoqXG4gKiBCdWlsZCB1cCB0aGUgZGVmYXVsdCBgaW5zcGVjdE9wdHNgIG9iamVjdCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogICAkIERFQlVHX0NPTE9SUz1ubyBERUJVR19ERVBUSD0xMCBERUJVR19TSE9XX0hJRERFTj1lbmFibGVkIG5vZGUgc2NyaXB0LmpzXG4gKi9cblxuZXhwb3J0cy5pbnNwZWN0T3B0cyA9IE9iamVjdC5rZXlzKHByb2Nlc3MuZW52KS5maWx0ZXIoa2V5ID0+IHtcblx0cmV0dXJuIC9eZGVidWdfL2kudGVzdChrZXkpO1xufSkucmVkdWNlKChvYmosIGtleSkgPT4ge1xuXHQvLyBDYW1lbC1jYXNlXG5cdGNvbnN0IHByb3AgPSBrZXlcblx0XHQuc3Vic3RyaW5nKDYpXG5cdFx0LnRvTG93ZXJDYXNlKClcblx0XHQucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGspID0+IHtcblx0XHRcdHJldHVybiBrLnRvVXBwZXJDYXNlKCk7XG5cdFx0fSk7XG5cblx0Ly8gQ29lcmNlIHN0cmluZyB2YWx1ZSBpbnRvIEpTIHZhbHVlXG5cdGxldCB2YWwgPSBwcm9jZXNzLmVudltrZXldO1xuXHRpZiAoL14oeWVzfG9ufHRydWV8ZW5hYmxlZCkkL2kudGVzdCh2YWwpKSB7XG5cdFx0dmFsID0gdHJ1ZTtcblx0fSBlbHNlIGlmICgvXihub3xvZmZ8ZmFsc2V8ZGlzYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IGZhbHNlO1xuXHR9IGVsc2UgaWYgKHZhbCA9PT0gJ251bGwnKSB7XG5cdFx0dmFsID0gbnVsbDtcblx0fSBlbHNlIHtcblx0XHR2YWwgPSBOdW1iZXIodmFsKTtcblx0fVxuXG5cdG9ialtwcm9wXSA9IHZhbDtcblx0cmV0dXJuIG9iajtcbn0sIHt9KTtcblxuLyoqXG4gKiBJcyBzdGRvdXQgYSBUVFk/IENvbG9yZWQgb3V0cHV0IGlzIGVuYWJsZWQgd2hlbiBgdHJ1ZWAuXG4gKi9cblxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHRyZXR1cm4gJ2NvbG9ycycgaW4gZXhwb3J0cy5pbnNwZWN0T3B0cyA/XG5cdFx0Qm9vbGVhbihleHBvcnRzLmluc3BlY3RPcHRzLmNvbG9ycykgOlxuXHRcdHR0eS5pc2F0dHkocHJvY2Vzcy5zdGRlcnIuZmQpO1xufVxuXG4vKipcbiAqIEFkZHMgQU5TSSBjb2xvciBlc2NhcGUgY29kZXMgaWYgZW5hYmxlZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdEFyZ3MoYXJncykge1xuXHRjb25zdCB7bmFtZXNwYWNlOiBuYW1lLCB1c2VDb2xvcnN9ID0gdGhpcztcblxuXHRpZiAodXNlQ29sb3JzKSB7XG5cdFx0Y29uc3QgYyA9IHRoaXMuY29sb3I7XG5cdFx0Y29uc3QgY29sb3JDb2RlID0gJ1xcdTAwMUJbMycgKyAoYyA8IDggPyBjIDogJzg7NTsnICsgYyk7XG5cdFx0Y29uc3QgcHJlZml4ID0gYCAgJHtjb2xvckNvZGV9OzFtJHtuYW1lfSBcXHUwMDFCWzBtYDtcblxuXHRcdGFyZ3NbMF0gPSBwcmVmaXggKyBhcmdzWzBdLnNwbGl0KCdcXG4nKS5qb2luKCdcXG4nICsgcHJlZml4KTtcblx0XHRhcmdzLnB1c2goY29sb3JDb2RlICsgJ20rJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZikgKyAnXFx1MDAxQlswbScpO1xuXHR9IGVsc2Uge1xuXHRcdGFyZ3NbMF0gPSBnZXREYXRlKCkgKyBuYW1lICsgJyAnICsgYXJnc1swXTtcblx0fVxufVxuXG5mdW5jdGlvbiBnZXREYXRlKCkge1xuXHRpZiAoZXhwb3J0cy5pbnNwZWN0T3B0cy5oaWRlRGF0ZSkge1xuXHRcdHJldHVybiAnJztcblx0fVxuXHRyZXR1cm4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpICsgJyAnO1xufVxuXG4vKipcbiAqIEludm9rZXMgYHV0aWwuZm9ybWF0KClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBzdGRlcnIuXG4gKi9cblxuZnVuY3Rpb24gbG9nKC4uLmFyZ3MpIHtcblx0cmV0dXJuIHByb2Nlc3Muc3RkZXJyLndyaXRlKHV0aWwuZm9ybWF0KC4uLmFyZ3MpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0cHJvY2Vzcy5lbnYuREVCVUcgPSBuYW1lc3BhY2VzO1xuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuXHRcdC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG5cdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcblx0cmV0dXJuIHByb2Nlc3MuZW52LkRFQlVHO1xufVxuXG4vKipcbiAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICpcbiAqIENyZWF0ZSBhIG5ldyBgaW5zcGVjdE9wdHNgIG9iamVjdCBpbiBjYXNlIGB1c2VDb2xvcnNgIGlzIHNldFxuICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGluaXQoZGVidWcpIHtcblx0ZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuXHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXhwb3J0cy5pbnNwZWN0T3B0cyk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGRlYnVnLmluc3BlY3RPcHRzW2tleXNbaV1dID0gZXhwb3J0cy5pbnNwZWN0T3B0c1trZXlzW2ldXTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGwgb24gYSBzaW5nbGUgbGluZS5cbiAqL1xuXG5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG5cdFx0LnNwbGl0KCdcXG4nKVxuXHRcdC5tYXAoc3RyID0+IHN0ci50cmltKCkpXG5cdFx0LmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogTWFwICVPIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cbiAqL1xuXG5mb3JtYXR0ZXJzLk8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcbiIsICIvKipcbiAqIERldGVjdCBFbGVjdHJvbiByZW5kZXJlciAvIG53anMgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbmlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHByb2Nlc3MuYnJvd3NlciA9PT0gdHJ1ZSB8fCBwcm9jZXNzLl9fbndqcykge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYnJvd3Nlci5qcycpO1xufSBlbHNlIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL25vZGUuanMnKTtcbn1cbiIsICJ2YXIgZGVidWc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIWRlYnVnKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8qIGVzbGludCBnbG9iYWwtcmVxdWlyZTogb2ZmICovXG4gICAgICBkZWJ1ZyA9IHJlcXVpcmUoXCJkZWJ1Z1wiKShcImZvbGxvdy1yZWRpcmVjdHNcIik7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyAvKiAqLyB9XG4gICAgaWYgKHR5cGVvZiBkZWJ1ZyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHsgLyogKi8gfTtcbiAgICB9XG4gIH1cbiAgZGVidWcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn07XG4iLCAidmFyIHVybCA9IHJlcXVpcmUoXCJ1cmxcIik7XG52YXIgVVJMID0gdXJsLlVSTDtcbnZhciBodHRwID0gcmVxdWlyZShcImh0dHBcIik7XG52YXIgaHR0cHMgPSByZXF1aXJlKFwiaHR0cHNcIik7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKFwic3RyZWFtXCIpLldyaXRhYmxlO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG52YXIgZGVidWcgPSByZXF1aXJlKFwiLi9kZWJ1Z1wiKTtcblxuLy8gQ3JlYXRlIGhhbmRsZXJzIHRoYXQgcGFzcyBldmVudHMgZnJvbSBuYXRpdmUgcmVxdWVzdHNcbnZhciBldmVudHMgPSBbXCJhYm9ydFwiLCBcImFib3J0ZWRcIiwgXCJjb25uZWN0XCIsIFwiZXJyb3JcIiwgXCJzb2NrZXRcIiwgXCJ0aW1lb3V0XCJdO1xudmFyIGV2ZW50SGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGV2ZW50SGFuZGxlcnNbZXZlbnRdID0gZnVuY3Rpb24gKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICB0aGlzLl9yZWRpcmVjdGFibGUuZW1pdChldmVudCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gIH07XG59KTtcblxudmFyIEludmFsaWRVcmxFcnJvciA9IGNyZWF0ZUVycm9yVHlwZShcbiAgXCJFUlJfSU5WQUxJRF9VUkxcIixcbiAgXCJJbnZhbGlkIFVSTFwiLFxuICBUeXBlRXJyb3Jcbik7XG4vLyBFcnJvciB0eXBlcyB3aXRoIGNvZGVzXG52YXIgUmVkaXJlY3Rpb25FcnJvciA9IGNyZWF0ZUVycm9yVHlwZShcbiAgXCJFUlJfRlJfUkVESVJFQ1RJT05fRkFJTFVSRVwiLFxuICBcIlJlZGlyZWN0ZWQgcmVxdWVzdCBmYWlsZWRcIlxuKTtcbnZhciBUb29NYW55UmVkaXJlY3RzRXJyb3IgPSBjcmVhdGVFcnJvclR5cGUoXG4gIFwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUU1wiLFxuICBcIk1heGltdW0gbnVtYmVyIG9mIHJlZGlyZWN0cyBleGNlZWRlZFwiXG4pO1xudmFyIE1heEJvZHlMZW5ndGhFeGNlZWRlZEVycm9yID0gY3JlYXRlRXJyb3JUeXBlKFxuICBcIkVSUl9GUl9NQVhfQk9EWV9MRU5HVEhfRVhDRUVERURcIixcbiAgXCJSZXF1ZXN0IGJvZHkgbGFyZ2VyIHRoYW4gbWF4Qm9keUxlbmd0aCBsaW1pdFwiXG4pO1xudmFyIFdyaXRlQWZ0ZXJFbmRFcnJvciA9IGNyZWF0ZUVycm9yVHlwZShcbiAgXCJFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORFwiLFxuICBcIndyaXRlIGFmdGVyIGVuZFwiXG4pO1xuXG4vLyBBbiBIVFRQKFMpIHJlcXVlc3QgdGhhdCBjYW4gYmUgcmVkaXJlY3RlZFxuZnVuY3Rpb24gUmVkaXJlY3RhYmxlUmVxdWVzdChvcHRpb25zLCByZXNwb25zZUNhbGxiYWNrKSB7XG4gIC8vIEluaXRpYWxpemUgdGhlIHJlcXVlc3RcbiAgV3JpdGFibGUuY2FsbCh0aGlzKTtcbiAgdGhpcy5fc2FuaXRpemVPcHRpb25zKG9wdGlvbnMpO1xuICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgdGhpcy5fZW5kZWQgPSBmYWxzZTtcbiAgdGhpcy5fZW5kaW5nID0gZmFsc2U7XG4gIHRoaXMuX3JlZGlyZWN0Q291bnQgPSAwO1xuICB0aGlzLl9yZWRpcmVjdHMgPSBbXTtcbiAgdGhpcy5fcmVxdWVzdEJvZHlMZW5ndGggPSAwO1xuICB0aGlzLl9yZXF1ZXN0Qm9keUJ1ZmZlcnMgPSBbXTtcblxuICAvLyBBdHRhY2ggYSBjYWxsYmFjayBpZiBwYXNzZWRcbiAgaWYgKHJlc3BvbnNlQ2FsbGJhY2spIHtcbiAgICB0aGlzLm9uKFwicmVzcG9uc2VcIiwgcmVzcG9uc2VDYWxsYmFjayk7XG4gIH1cblxuICAvLyBSZWFjdCB0byByZXNwb25zZXMgb2YgbmF0aXZlIHJlcXVlc3RzXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fb25OYXRpdmVSZXNwb25zZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgIHNlbGYuX3Byb2Nlc3NSZXNwb25zZShyZXNwb25zZSk7XG4gIH07XG5cbiAgLy8gUGVyZm9ybSB0aGUgZmlyc3QgcmVxdWVzdFxuICB0aGlzLl9wZXJmb3JtUmVxdWVzdCgpO1xufVxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFdyaXRhYmxlLnByb3RvdHlwZSk7XG5cblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICBhYm9ydFJlcXVlc3QodGhpcy5fY3VycmVudFJlcXVlc3QpO1xuICB0aGlzLmVtaXQoXCJhYm9ydFwiKTtcbn07XG5cbi8vIFdyaXRlcyBidWZmZXJlZCBkYXRhIHRvIHRoZSBjdXJyZW50IG5hdGl2ZSByZXF1ZXN0XG5SZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChkYXRhLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgLy8gV3JpdGluZyBpcyBub3QgYWxsb3dlZCBpZiBlbmQgaGFzIGJlZW4gY2FsbGVkXG4gIGlmICh0aGlzLl9lbmRpbmcpIHtcbiAgICB0aHJvdyBuZXcgV3JpdGVBZnRlckVuZEVycm9yKCk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBpbnB1dCBhbmQgc2hpZnQgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnlcbiAgaWYgKCFpc1N0cmluZyhkYXRhKSAmJiAhaXNCdWZmZXIoZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiZGF0YSBzaG91bGQgYmUgYSBzdHJpbmcsIEJ1ZmZlciBvciBVaW50OEFycmF5XCIpO1xuICB9XG4gIGlmIChpc0Z1bmN0aW9uKGVuY29kaW5nKSkge1xuICAgIGNhbGxiYWNrID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgLy8gSWdub3JlIGVtcHR5IGJ1ZmZlcnMsIHNpbmNlIHdyaXRpbmcgdGhlbSBkb2Vzbid0IGludm9rZSB0aGUgY2FsbGJhY2tcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8yMjA2NlxuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICAvLyBPbmx5IHdyaXRlIHdoZW4gd2UgZG9uJ3QgZXhjZWVkIHRoZSBtYXhpbXVtIGJvZHkgbGVuZ3RoXG4gIGlmICh0aGlzLl9yZXF1ZXN0Qm9keUxlbmd0aCArIGRhdGEubGVuZ3RoIDw9IHRoaXMuX29wdGlvbnMubWF4Qm9keUxlbmd0aCkge1xuICAgIHRoaXMuX3JlcXVlc3RCb2R5TGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgIHRoaXMuX3JlcXVlc3RCb2R5QnVmZmVycy5wdXNoKHsgZGF0YTogZGF0YSwgZW5jb2Rpbmc6IGVuY29kaW5nIH0pO1xuICAgIHRoaXMuX2N1cnJlbnRSZXF1ZXN0LndyaXRlKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjayk7XG4gIH1cbiAgLy8gRXJyb3Igd2hlbiB3ZSBleGNlZWQgdGhlIG1heGltdW0gYm9keSBsZW5ndGhcbiAgZWxzZSB7XG4gICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgbmV3IE1heEJvZHlMZW5ndGhFeGNlZWRlZEVycm9yKCkpO1xuICAgIHRoaXMuYWJvcnQoKTtcbiAgfVxufTtcblxuLy8gRW5kcyB0aGUgY3VycmVudCBuYXRpdmUgcmVxdWVzdFxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAvLyBTaGlmdCBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeVxuICBpZiAoaXNGdW5jdGlvbihkYXRhKSkge1xuICAgIGNhbGxiYWNrID0gZGF0YTtcbiAgICBkYXRhID0gZW5jb2RpbmcgPSBudWxsO1xuICB9XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24oZW5jb2RpbmcpKSB7XG4gICAgY2FsbGJhY2sgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICAvLyBXcml0ZSBkYXRhIGlmIG5lZWRlZCBhbmQgZW5kXG4gIGlmICghZGF0YSkge1xuICAgIHRoaXMuX2VuZGVkID0gdGhpcy5fZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9jdXJyZW50UmVxdWVzdC5lbmQobnVsbCwgbnVsbCwgY2FsbGJhY2spO1xuICB9XG4gIGVsc2Uge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgY3VycmVudFJlcXVlc3QgPSB0aGlzLl9jdXJyZW50UmVxdWVzdDtcbiAgICB0aGlzLndyaXRlKGRhdGEsIGVuY29kaW5nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9lbmRlZCA9IHRydWU7XG4gICAgICBjdXJyZW50UmVxdWVzdC5lbmQobnVsbCwgbnVsbCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHRoaXMuX2VuZGluZyA9IHRydWU7XG4gIH1cbn07XG5cbi8vIFNldHMgYSBoZWFkZXIgdmFsdWUgb24gdGhlIGN1cnJlbnQgbmF0aXZlIHJlcXVlc3RcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLnNldEhlYWRlciA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICB0aGlzLl9vcHRpb25zLmhlYWRlcnNbbmFtZV0gPSB2YWx1ZTtcbiAgdGhpcy5fY3VycmVudFJlcXVlc3Quc2V0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbn07XG5cbi8vIENsZWFycyBhIGhlYWRlciB2YWx1ZSBvbiB0aGUgY3VycmVudCBuYXRpdmUgcmVxdWVzdFxuUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUucmVtb3ZlSGVhZGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgZGVsZXRlIHRoaXMuX29wdGlvbnMuaGVhZGVyc1tuYW1lXTtcbiAgdGhpcy5fY3VycmVudFJlcXVlc3QucmVtb3ZlSGVhZGVyKG5hbWUpO1xufTtcblxuLy8gR2xvYmFsIHRpbWVvdXQgZm9yIGFsbCB1bmRlcmx5aW5nIHJlcXVlc3RzXG5SZWRpcmVjdGFibGVSZXF1ZXN0LnByb3RvdHlwZS5zZXRUaW1lb3V0ID0gZnVuY3Rpb24gKG1zZWNzLCBjYWxsYmFjaykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gRGVzdHJveXMgdGhlIHNvY2tldCBvbiB0aW1lb3V0XG4gIGZ1bmN0aW9uIGRlc3Ryb3lPblRpbWVvdXQoc29ja2V0KSB7XG4gICAgc29ja2V0LnNldFRpbWVvdXQobXNlY3MpO1xuICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcihcInRpbWVvdXRcIiwgc29ja2V0LmRlc3Ryb3kpO1xuICAgIHNvY2tldC5hZGRMaXN0ZW5lcihcInRpbWVvdXRcIiwgc29ja2V0LmRlc3Ryb3kpO1xuICB9XG5cbiAgLy8gU2V0cyB1cCBhIHRpbWVyIHRvIHRyaWdnZXIgYSB0aW1lb3V0IGV2ZW50XG4gIGZ1bmN0aW9uIHN0YXJ0VGltZXIoc29ja2V0KSB7XG4gICAgaWYgKHNlbGYuX3RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChzZWxmLl90aW1lb3V0KTtcbiAgICB9XG4gICAgc2VsZi5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5lbWl0KFwidGltZW91dFwiKTtcbiAgICAgIGNsZWFyVGltZXIoKTtcbiAgICB9LCBtc2Vjcyk7XG4gICAgZGVzdHJveU9uVGltZW91dChzb2NrZXQpO1xuICB9XG5cbiAgLy8gU3RvcHMgYSB0aW1lb3V0IGZyb20gdHJpZ2dlcmluZ1xuICBmdW5jdGlvbiBjbGVhclRpbWVyKCkge1xuICAgIC8vIENsZWFyIHRoZSB0aW1lb3V0XG4gICAgaWYgKHNlbGYuX3RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChzZWxmLl90aW1lb3V0KTtcbiAgICAgIHNlbGYuX3RpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIGFsbCBhdHRhY2hlZCBsaXN0ZW5lcnNcbiAgICBzZWxmLnJlbW92ZUxpc3RlbmVyKFwiYWJvcnRcIiwgY2xlYXJUaW1lcik7XG4gICAgc2VsZi5yZW1vdmVMaXN0ZW5lcihcImVycm9yXCIsIGNsZWFyVGltZXIpO1xuICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoXCJyZXNwb25zZVwiLCBjbGVhclRpbWVyKTtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHNlbGYucmVtb3ZlTGlzdGVuZXIoXCJ0aW1lb3V0XCIsIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgaWYgKCFzZWxmLnNvY2tldCkge1xuICAgICAgc2VsZi5fY3VycmVudFJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoXCJzb2NrZXRcIiwgc3RhcnRUaW1lcik7XG4gICAgfVxuICB9XG5cbiAgLy8gQXR0YWNoIGNhbGxiYWNrIGlmIHBhc3NlZFxuICBpZiAoY2FsbGJhY2spIHtcbiAgICB0aGlzLm9uKFwidGltZW91dFwiLCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyBTdGFydCB0aGUgdGltZXIgaWYgb3Igd2hlbiB0aGUgc29ja2V0IGlzIG9wZW5lZFxuICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICBzdGFydFRpbWVyKHRoaXMuc29ja2V0KTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aGlzLl9jdXJyZW50UmVxdWVzdC5vbmNlKFwic29ja2V0XCIsIHN0YXJ0VGltZXIpO1xuICB9XG5cbiAgLy8gQ2xlYW4gdXAgb24gZXZlbnRzXG4gIHRoaXMub24oXCJzb2NrZXRcIiwgZGVzdHJveU9uVGltZW91dCk7XG4gIHRoaXMub24oXCJhYm9ydFwiLCBjbGVhclRpbWVyKTtcbiAgdGhpcy5vbihcImVycm9yXCIsIGNsZWFyVGltZXIpO1xuICB0aGlzLm9uKFwicmVzcG9uc2VcIiwgY2xlYXJUaW1lcik7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBQcm94eSBhbGwgb3RoZXIgcHVibGljIENsaWVudFJlcXVlc3QgbWV0aG9kc1xuW1xuICBcImZsdXNoSGVhZGVyc1wiLCBcImdldEhlYWRlclwiLFxuICBcInNldE5vRGVsYXlcIiwgXCJzZXRTb2NrZXRLZWVwQWxpdmVcIixcbl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gIFJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UmVxdWVzdFttZXRob2RdKGEsIGIpO1xuICB9O1xufSk7XG5cbi8vIFByb3h5IGFsbCBwdWJsaWMgQ2xpZW50UmVxdWVzdCBwcm9wZXJ0aWVzXG5bXCJhYm9ydGVkXCIsIFwiY29ubmVjdGlvblwiLCBcInNvY2tldFwiXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVkaXJlY3RhYmxlUmVxdWVzdC5wcm90b3R5cGUsIHByb3BlcnR5LCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9jdXJyZW50UmVxdWVzdFtwcm9wZXJ0eV07IH0sXG4gIH0pO1xufSk7XG5cblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLl9zYW5pdGl6ZU9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAvLyBFbnN1cmUgaGVhZGVycyBhcmUgYWx3YXlzIHByZXNlbnRcbiAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSB7fTtcbiAgfVxuXG4gIC8vIFNpbmNlIGh0dHAucmVxdWVzdCB0cmVhdHMgaG9zdCBhcyBhbiBhbGlhcyBvZiBob3N0bmFtZSxcbiAgLy8gYnV0IHRoZSB1cmwgbW9kdWxlIGludGVycHJldHMgaG9zdCBhcyBob3N0bmFtZSBwbHVzIHBvcnQsXG4gIC8vIGVsaW1pbmF0ZSB0aGUgaG9zdCBwcm9wZXJ0eSB0byBhdm9pZCBjb25mdXNpb24uXG4gIGlmIChvcHRpb25zLmhvc3QpIHtcbiAgICAvLyBVc2UgaG9zdG5hbWUgaWYgc2V0LCBiZWNhdXNlIGl0IGhhcyBwcmVjZWRlbmNlXG4gICAgaWYgKCFvcHRpb25zLmhvc3RuYW1lKSB7XG4gICAgICBvcHRpb25zLmhvc3RuYW1lID0gb3B0aW9ucy5ob3N0O1xuICAgIH1cbiAgICBkZWxldGUgb3B0aW9ucy5ob3N0O1xuICB9XG5cbiAgLy8gQ29tcGxldGUgdGhlIFVSTCBvYmplY3Qgd2hlbiBuZWNlc3NhcnlcbiAgaWYgKCFvcHRpb25zLnBhdGhuYW1lICYmIG9wdGlvbnMucGF0aCkge1xuICAgIHZhciBzZWFyY2hQb3MgPSBvcHRpb25zLnBhdGguaW5kZXhPZihcIj9cIik7XG4gICAgaWYgKHNlYXJjaFBvcyA8IDApIHtcbiAgICAgIG9wdGlvbnMucGF0aG5hbWUgPSBvcHRpb25zLnBhdGg7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgb3B0aW9ucy5wYXRobmFtZSA9IG9wdGlvbnMucGF0aC5zdWJzdHJpbmcoMCwgc2VhcmNoUG9zKTtcbiAgICAgIG9wdGlvbnMuc2VhcmNoID0gb3B0aW9ucy5wYXRoLnN1YnN0cmluZyhzZWFyY2hQb3MpO1xuICAgIH1cbiAgfVxufTtcblxuXG4vLyBFeGVjdXRlcyB0aGUgbmV4dCBuYXRpdmUgcmVxdWVzdCAoaW5pdGlhbCBvciByZWRpcmVjdClcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLl9wZXJmb3JtUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gTG9hZCB0aGUgbmF0aXZlIHByb3RvY29sXG4gIHZhciBwcm90b2NvbCA9IHRoaXMuX29wdGlvbnMucHJvdG9jb2w7XG4gIHZhciBuYXRpdmVQcm90b2NvbCA9IHRoaXMuX29wdGlvbnMubmF0aXZlUHJvdG9jb2xzW3Byb3RvY29sXTtcbiAgaWYgKCFuYXRpdmVQcm90b2NvbCkge1xuICAgIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBUeXBlRXJyb3IoXCJVbnN1cHBvcnRlZCBwcm90b2NvbCBcIiArIHByb3RvY29sKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgc3BlY2lmaWVkLCB1c2UgdGhlIGFnZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3RvY29sXG4gIC8vIChIVFRQIGFuZCBIVFRQUyB1c2UgZGlmZmVyZW50IHR5cGVzIG9mIGFnZW50cylcbiAgaWYgKHRoaXMuX29wdGlvbnMuYWdlbnRzKSB7XG4gICAgdmFyIHNjaGVtZSA9IHByb3RvY29sLnNsaWNlKDAsIC0xKTtcbiAgICB0aGlzLl9vcHRpb25zLmFnZW50ID0gdGhpcy5fb3B0aW9ucy5hZ2VudHNbc2NoZW1lXTtcbiAgfVxuXG4gIC8vIENyZWF0ZSB0aGUgbmF0aXZlIHJlcXVlc3QgYW5kIHNldCB1cCBpdHMgZXZlbnQgaGFuZGxlcnNcbiAgdmFyIHJlcXVlc3QgPSB0aGlzLl9jdXJyZW50UmVxdWVzdCA9XG4gICAgICAgIG5hdGl2ZVByb3RvY29sLnJlcXVlc3QodGhpcy5fb3B0aW9ucywgdGhpcy5fb25OYXRpdmVSZXNwb25zZSk7XG4gIHJlcXVlc3QuX3JlZGlyZWN0YWJsZSA9IHRoaXM7XG4gIGZvciAodmFyIGV2ZW50IG9mIGV2ZW50cykge1xuICAgIHJlcXVlc3Qub24oZXZlbnQsIGV2ZW50SGFuZGxlcnNbZXZlbnRdKTtcbiAgfVxuXG4gIC8vIFJGQzcyMzBcdTAwQTc1LjMuMTogV2hlbiBtYWtpbmcgYSByZXF1ZXN0IGRpcmVjdGx5IHRvIGFuIG9yaWdpbiBzZXJ2ZXIsIFtcdTIwMjZdXG4gIC8vIGEgY2xpZW50IE1VU1Qgc2VuZCBvbmx5IHRoZSBhYnNvbHV0ZSBwYXRoIFtcdTIwMjZdIGFzIHRoZSByZXF1ZXN0LXRhcmdldC5cbiAgdGhpcy5fY3VycmVudFVybCA9IC9eXFwvLy50ZXN0KHRoaXMuX29wdGlvbnMucGF0aCkgP1xuICAgIHVybC5mb3JtYXQodGhpcy5fb3B0aW9ucykgOlxuICAgIC8vIFdoZW4gbWFraW5nIGEgcmVxdWVzdCB0byBhIHByb3h5LCBbXHUyMDI2XVxuICAgIC8vIGEgY2xpZW50IE1VU1Qgc2VuZCB0aGUgdGFyZ2V0IFVSSSBpbiBhYnNvbHV0ZS1mb3JtIFtcdTIwMjZdLlxuICAgIHRoaXMuX29wdGlvbnMucGF0aDtcblxuICAvLyBFbmQgYSByZWRpcmVjdGVkIHJlcXVlc3RcbiAgLy8gKFRoZSBmaXJzdCByZXF1ZXN0IG11c3QgYmUgZW5kZWQgZXhwbGljaXRseSB3aXRoIFJlZGlyZWN0YWJsZVJlcXVlc3QjZW5kKVxuICBpZiAodGhpcy5faXNSZWRpcmVjdCkge1xuICAgIC8vIFdyaXRlIHRoZSByZXF1ZXN0IGVudGl0eSBhbmQgZW5kXG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgYnVmZmVycyA9IHRoaXMuX3JlcXVlc3RCb2R5QnVmZmVycztcbiAgICAoZnVuY3Rpb24gd3JpdGVOZXh0KGVycm9yKSB7XG4gICAgICAvLyBPbmx5IHdyaXRlIGlmIHRoaXMgcmVxdWVzdCBoYXMgbm90IGJlZW4gcmVkaXJlY3RlZCB5ZXRcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocmVxdWVzdCA9PT0gc2VsZi5fY3VycmVudFJlcXVlc3QpIHtcbiAgICAgICAgLy8gUmVwb3J0IGFueSB3cml0ZSBlcnJvcnNcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHNlbGYuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXcml0ZSB0aGUgbmV4dCBidWZmZXIgaWYgdGhlcmUgYXJlIHN0aWxsIGxlZnRcbiAgICAgICAgZWxzZSBpZiAoaSA8IGJ1ZmZlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGJ1ZmZlciA9IGJ1ZmZlcnNbaSsrXTtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgIGlmICghcmVxdWVzdC5maW5pc2hlZCkge1xuICAgICAgICAgICAgcmVxdWVzdC53cml0ZShidWZmZXIuZGF0YSwgYnVmZmVyLmVuY29kaW5nLCB3cml0ZU5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbmQgdGhlIHJlcXVlc3QgaWYgYGVuZGAgaGFzIGJlZW4gY2FsbGVkIG9uIHVzXG4gICAgICAgIGVsc2UgaWYgKHNlbGYuX2VuZGVkKSB7XG4gICAgICAgICAgcmVxdWVzdC5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0oKSk7XG4gIH1cbn07XG5cbi8vIFByb2Nlc3NlcyBhIHJlc3BvbnNlIGZyb20gdGhlIGN1cnJlbnQgbmF0aXZlIHJlcXVlc3RcblJlZGlyZWN0YWJsZVJlcXVlc3QucHJvdG90eXBlLl9wcm9jZXNzUmVzcG9uc2UgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgLy8gU3RvcmUgdGhlIHJlZGlyZWN0ZWQgcmVzcG9uc2VcbiAgdmFyIHN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlO1xuICBpZiAodGhpcy5fb3B0aW9ucy50cmFja1JlZGlyZWN0cykge1xuICAgIHRoaXMuX3JlZGlyZWN0cy5wdXNoKHtcbiAgICAgIHVybDogdGhpcy5fY3VycmVudFVybCxcbiAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBzdGF0dXNDb2RlOiBzdGF0dXNDb2RlLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gUkZDNzIzMVx1MDBBNzYuNDogVGhlIDN4eCAoUmVkaXJlY3Rpb24pIGNsYXNzIG9mIHN0YXR1cyBjb2RlIGluZGljYXRlc1xuICAvLyB0aGF0IGZ1cnRoZXIgYWN0aW9uIG5lZWRzIHRvIGJlIHRha2VuIGJ5IHRoZSB1c2VyIGFnZW50IGluIG9yZGVyIHRvXG4gIC8vIGZ1bGZpbGwgdGhlIHJlcXVlc3QuIElmIGEgTG9jYXRpb24gaGVhZGVyIGZpZWxkIGlzIHByb3ZpZGVkLFxuICAvLyB0aGUgdXNlciBhZ2VudCBNQVkgYXV0b21hdGljYWxseSByZWRpcmVjdCBpdHMgcmVxdWVzdCB0byB0aGUgVVJJXG4gIC8vIHJlZmVyZW5jZWQgYnkgdGhlIExvY2F0aW9uIGZpZWxkIHZhbHVlLFxuICAvLyBldmVuIGlmIHRoZSBzcGVjaWZpYyBzdGF0dXMgY29kZSBpcyBub3QgdW5kZXJzdG9vZC5cblxuICAvLyBJZiB0aGUgcmVzcG9uc2UgaXMgbm90IGEgcmVkaXJlY3Q7IHJldHVybiBpdCBhcy1pc1xuICB2YXIgbG9jYXRpb24gPSByZXNwb25zZS5oZWFkZXJzLmxvY2F0aW9uO1xuICBpZiAoIWxvY2F0aW9uIHx8IHRoaXMuX29wdGlvbnMuZm9sbG93UmVkaXJlY3RzID09PSBmYWxzZSB8fFxuICAgICAgc3RhdHVzQ29kZSA8IDMwMCB8fCBzdGF0dXNDb2RlID49IDQwMCkge1xuICAgIHJlc3BvbnNlLnJlc3BvbnNlVXJsID0gdGhpcy5fY3VycmVudFVybDtcbiAgICByZXNwb25zZS5yZWRpcmVjdHMgPSB0aGlzLl9yZWRpcmVjdHM7XG4gICAgdGhpcy5lbWl0KFwicmVzcG9uc2VcIiwgcmVzcG9uc2UpO1xuXG4gICAgLy8gQ2xlYW4gdXBcbiAgICB0aGlzLl9yZXF1ZXN0Qm9keUJ1ZmZlcnMgPSBbXTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgcmVzcG9uc2UgaXMgYSByZWRpcmVjdCwgc28gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdFxuICBhYm9ydFJlcXVlc3QodGhpcy5fY3VycmVudFJlcXVlc3QpO1xuICAvLyBEaXNjYXJkIHRoZSByZW1haW5kZXIgb2YgdGhlIHJlc3BvbnNlIHRvIGF2b2lkIHdhaXRpbmcgZm9yIGRhdGFcbiAgcmVzcG9uc2UuZGVzdHJveSgpO1xuXG4gIC8vIFJGQzcyMzFcdTAwQTc2LjQ6IEEgY2xpZW50IFNIT1VMRCBkZXRlY3QgYW5kIGludGVydmVuZVxuICAvLyBpbiBjeWNsaWNhbCByZWRpcmVjdGlvbnMgKGkuZS4sIFwiaW5maW5pdGVcIiByZWRpcmVjdGlvbiBsb29wcykuXG4gIGlmICgrK3RoaXMuX3JlZGlyZWN0Q291bnQgPiB0aGlzLl9vcHRpb25zLm1heFJlZGlyZWN0cykge1xuICAgIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBUb29NYW55UmVkaXJlY3RzRXJyb3IoKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU3RvcmUgdGhlIHJlcXVlc3QgaGVhZGVycyBpZiBhcHBsaWNhYmxlXG4gIHZhciByZXF1ZXN0SGVhZGVycztcbiAgdmFyIGJlZm9yZVJlZGlyZWN0ID0gdGhpcy5fb3B0aW9ucy5iZWZvcmVSZWRpcmVjdDtcbiAgaWYgKGJlZm9yZVJlZGlyZWN0KSB7XG4gICAgcmVxdWVzdEhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIC8vIFRoZSBIb3N0IGhlYWRlciB3YXMgc2V0IGJ5IG5hdGl2ZVByb3RvY29sLnJlcXVlc3RcbiAgICAgIEhvc3Q6IHJlc3BvbnNlLnJlcS5nZXRIZWFkZXIoXCJob3N0XCIpLFxuICAgIH0sIHRoaXMuX29wdGlvbnMuaGVhZGVycyk7XG4gIH1cblxuICAvLyBSRkM3MjMxXHUwMEE3Ni40OiBBdXRvbWF0aWMgcmVkaXJlY3Rpb24gbmVlZHMgdG8gZG9uZSB3aXRoXG4gIC8vIGNhcmUgZm9yIG1ldGhvZHMgbm90IGtub3duIHRvIGJlIHNhZmUsIFtcdTIwMjZdXG4gIC8vIFJGQzcyMzFcdTAwQTc2LjQuMlx1MjAxMzM6IEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIGEgdXNlciBhZ2VudCBNQVkgY2hhbmdlXG4gIC8vIHRoZSByZXF1ZXN0IG1ldGhvZCBmcm9tIFBPU1QgdG8gR0VUIGZvciB0aGUgc3Vic2VxdWVudCByZXF1ZXN0LlxuICB2YXIgbWV0aG9kID0gdGhpcy5fb3B0aW9ucy5tZXRob2Q7XG4gIGlmICgoc3RhdHVzQ29kZSA9PT0gMzAxIHx8IHN0YXR1c0NvZGUgPT09IDMwMikgJiYgdGhpcy5fb3B0aW9ucy5tZXRob2QgPT09IFwiUE9TVFwiIHx8XG4gICAgICAvLyBSRkM3MjMxXHUwMEE3Ni40LjQ6IFRoZSAzMDMgKFNlZSBPdGhlcikgc3RhdHVzIGNvZGUgaW5kaWNhdGVzIHRoYXRcbiAgICAgIC8vIHRoZSBzZXJ2ZXIgaXMgcmVkaXJlY3RpbmcgdGhlIHVzZXIgYWdlbnQgdG8gYSBkaWZmZXJlbnQgcmVzb3VyY2UgW1x1MjAyNl1cbiAgICAgIC8vIEEgdXNlciBhZ2VudCBjYW4gcGVyZm9ybSBhIHJldHJpZXZhbCByZXF1ZXN0IHRhcmdldGluZyB0aGF0IFVSSVxuICAgICAgLy8gKGEgR0VUIG9yIEhFQUQgcmVxdWVzdCBpZiB1c2luZyBIVFRQKSBbXHUyMDI2XVxuICAgICAgKHN0YXR1c0NvZGUgPT09IDMwMykgJiYgIS9eKD86R0VUfEhFQUQpJC8udGVzdCh0aGlzLl9vcHRpb25zLm1ldGhvZCkpIHtcbiAgICB0aGlzLl9vcHRpb25zLm1ldGhvZCA9IFwiR0VUXCI7XG4gICAgLy8gRHJvcCBhIHBvc3NpYmxlIGVudGl0eSBhbmQgaGVhZGVycyByZWxhdGVkIHRvIGl0XG4gICAgdGhpcy5fcmVxdWVzdEJvZHlCdWZmZXJzID0gW107XG4gICAgcmVtb3ZlTWF0Y2hpbmdIZWFkZXJzKC9eY29udGVudC0vaSwgdGhpcy5fb3B0aW9ucy5oZWFkZXJzKTtcbiAgfVxuXG4gIC8vIERyb3AgdGhlIEhvc3QgaGVhZGVyLCBhcyB0aGUgcmVkaXJlY3QgbWlnaHQgbGVhZCB0byBhIGRpZmZlcmVudCBob3N0XG4gIHZhciBjdXJyZW50SG9zdEhlYWRlciA9IHJlbW92ZU1hdGNoaW5nSGVhZGVycygvXmhvc3QkL2ksIHRoaXMuX29wdGlvbnMuaGVhZGVycyk7XG5cbiAgLy8gSWYgdGhlIHJlZGlyZWN0IGlzIHJlbGF0aXZlLCBjYXJyeSBvdmVyIHRoZSBob3N0IG9mIHRoZSBsYXN0IHJlcXVlc3RcbiAgdmFyIGN1cnJlbnRVcmxQYXJ0cyA9IHVybC5wYXJzZSh0aGlzLl9jdXJyZW50VXJsKTtcbiAgdmFyIGN1cnJlbnRIb3N0ID0gY3VycmVudEhvc3RIZWFkZXIgfHwgY3VycmVudFVybFBhcnRzLmhvc3Q7XG4gIHZhciBjdXJyZW50VXJsID0gL15cXHcrOi8udGVzdChsb2NhdGlvbikgPyB0aGlzLl9jdXJyZW50VXJsIDpcbiAgICB1cmwuZm9ybWF0KE9iamVjdC5hc3NpZ24oY3VycmVudFVybFBhcnRzLCB7IGhvc3Q6IGN1cnJlbnRIb3N0IH0pKTtcblxuICAvLyBEZXRlcm1pbmUgdGhlIFVSTCBvZiB0aGUgcmVkaXJlY3Rpb25cbiAgdmFyIHJlZGlyZWN0VXJsO1xuICB0cnkge1xuICAgIHJlZGlyZWN0VXJsID0gdXJsLnJlc29sdmUoY3VycmVudFVybCwgbG9jYXRpb24pO1xuICB9XG4gIGNhdGNoIChjYXVzZSkge1xuICAgIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBSZWRpcmVjdGlvbkVycm9yKHsgY2F1c2U6IGNhdXNlIH0pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBDcmVhdGUgdGhlIHJlZGlyZWN0ZWQgcmVxdWVzdFxuICBkZWJ1ZyhcInJlZGlyZWN0aW5nIHRvXCIsIHJlZGlyZWN0VXJsKTtcbiAgdGhpcy5faXNSZWRpcmVjdCA9IHRydWU7XG4gIHZhciByZWRpcmVjdFVybFBhcnRzID0gdXJsLnBhcnNlKHJlZGlyZWN0VXJsKTtcbiAgT2JqZWN0LmFzc2lnbih0aGlzLl9vcHRpb25zLCByZWRpcmVjdFVybFBhcnRzKTtcblxuICAvLyBEcm9wIGNvbmZpZGVudGlhbCBoZWFkZXJzIHdoZW4gcmVkaXJlY3RpbmcgdG8gYSBsZXNzIHNlY3VyZSBwcm90b2NvbFxuICAvLyBvciB0byBhIGRpZmZlcmVudCBkb21haW4gdGhhdCBpcyBub3QgYSBzdXBlcmRvbWFpblxuICBpZiAocmVkaXJlY3RVcmxQYXJ0cy5wcm90b2NvbCAhPT0gY3VycmVudFVybFBhcnRzLnByb3RvY29sICYmXG4gICAgIHJlZGlyZWN0VXJsUGFydHMucHJvdG9jb2wgIT09IFwiaHR0cHM6XCIgfHxcbiAgICAgcmVkaXJlY3RVcmxQYXJ0cy5ob3N0ICE9PSBjdXJyZW50SG9zdCAmJlxuICAgICAhaXNTdWJkb21haW4ocmVkaXJlY3RVcmxQYXJ0cy5ob3N0LCBjdXJyZW50SG9zdCkpIHtcbiAgICByZW1vdmVNYXRjaGluZ0hlYWRlcnMoL14oPzphdXRob3JpemF0aW9ufGNvb2tpZSkkL2ksIHRoaXMuX29wdGlvbnMuaGVhZGVycyk7XG4gIH1cblxuICAvLyBFdmFsdWF0ZSB0aGUgYmVmb3JlUmVkaXJlY3QgY2FsbGJhY2tcbiAgaWYgKGlzRnVuY3Rpb24oYmVmb3JlUmVkaXJlY3QpKSB7XG4gICAgdmFyIHJlc3BvbnNlRGV0YWlscyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBzdGF0dXNDb2RlOiBzdGF0dXNDb2RlLFxuICAgIH07XG4gICAgdmFyIHJlcXVlc3REZXRhaWxzID0ge1xuICAgICAgdXJsOiBjdXJyZW50VXJsLFxuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBiZWZvcmVSZWRpcmVjdCh0aGlzLl9vcHRpb25zLCByZXNwb25zZURldGFpbHMsIHJlcXVlc3REZXRhaWxzKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2FuaXRpemVPcHRpb25zKHRoaXMuX29wdGlvbnMpO1xuICB9XG5cbiAgLy8gUGVyZm9ybSB0aGUgcmVkaXJlY3RlZCByZXF1ZXN0XG4gIHRyeSB7XG4gICAgdGhpcy5fcGVyZm9ybVJlcXVlc3QoKTtcbiAgfVxuICBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBuZXcgUmVkaXJlY3Rpb25FcnJvcih7IGNhdXNlOiBjYXVzZSB9KSk7XG4gIH1cbn07XG5cbi8vIFdyYXBzIHRoZSBrZXkvdmFsdWUgb2JqZWN0IG9mIHByb3RvY29scyB3aXRoIHJlZGlyZWN0IGZ1bmN0aW9uYWxpdHlcbmZ1bmN0aW9uIHdyYXAocHJvdG9jb2xzKSB7XG4gIC8vIERlZmF1bHQgc2V0dGluZ3NcbiAgdmFyIGV4cG9ydHMgPSB7XG4gICAgbWF4UmVkaXJlY3RzOiAyMSxcbiAgICBtYXhCb2R5TGVuZ3RoOiAxMCAqIDEwMjQgKiAxMDI0LFxuICB9O1xuXG4gIC8vIFdyYXAgZWFjaCBwcm90b2NvbFxuICB2YXIgbmF0aXZlUHJvdG9jb2xzID0ge307XG4gIE9iamVjdC5rZXlzKHByb3RvY29scykuZm9yRWFjaChmdW5jdGlvbiAoc2NoZW1lKSB7XG4gICAgdmFyIHByb3RvY29sID0gc2NoZW1lICsgXCI6XCI7XG4gICAgdmFyIG5hdGl2ZVByb3RvY29sID0gbmF0aXZlUHJvdG9jb2xzW3Byb3RvY29sXSA9IHByb3RvY29sc1tzY2hlbWVdO1xuICAgIHZhciB3cmFwcGVkUHJvdG9jb2wgPSBleHBvcnRzW3NjaGVtZV0gPSBPYmplY3QuY3JlYXRlKG5hdGl2ZVByb3RvY29sKTtcblxuICAgIC8vIEV4ZWN1dGVzIGEgcmVxdWVzdCwgZm9sbG93aW5nIHJlZGlyZWN0c1xuICAgIGZ1bmN0aW9uIHJlcXVlc3QoaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgICAvLyBQYXJzZSBwYXJhbWV0ZXJzXG4gICAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICAgIHZhciBwYXJzZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyc2VkID0gdXJsVG9PcHRpb25zKG5ldyBVUkwoaW5wdXQpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICBwYXJzZWQgPSB1cmwucGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNTdHJpbmcocGFyc2VkLnByb3RvY29sKSkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVXJsRXJyb3IoeyBpbnB1dCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dCA9IHBhcnNlZDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKFVSTCAmJiAoaW5wdXQgaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgICAgIGlucHV0ID0gdXJsVG9PcHRpb25zKGlucHV0KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSBpbnB1dDtcbiAgICAgICAgaW5wdXQgPSB7IHByb3RvY29sOiBwcm90b2NvbCB9O1xuICAgICAgfVxuICAgICAgaWYgKGlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICBvcHRpb25zID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIG1heFJlZGlyZWN0czogZXhwb3J0cy5tYXhSZWRpcmVjdHMsXG4gICAgICAgIG1heEJvZHlMZW5ndGg6IGV4cG9ydHMubWF4Qm9keUxlbmd0aCxcbiAgICAgIH0sIGlucHV0LCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMubmF0aXZlUHJvdG9jb2xzID0gbmF0aXZlUHJvdG9jb2xzO1xuICAgICAgaWYgKCFpc1N0cmluZyhvcHRpb25zLmhvc3QpICYmICFpc1N0cmluZyhvcHRpb25zLmhvc3RuYW1lKSkge1xuICAgICAgICBvcHRpb25zLmhvc3RuYW1lID0gXCI6OjFcIjtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0LmVxdWFsKG9wdGlvbnMucHJvdG9jb2wsIHByb3RvY29sLCBcInByb3RvY29sIG1pc21hdGNoXCIpO1xuICAgICAgZGVidWcoXCJvcHRpb25zXCIsIG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIG5ldyBSZWRpcmVjdGFibGVSZXF1ZXN0KG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlcyBhIEdFVCByZXF1ZXN0LCBmb2xsb3dpbmcgcmVkaXJlY3RzXG4gICAgZnVuY3Rpb24gZ2V0KGlucHV0LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgdmFyIHdyYXBwZWRSZXF1ZXN0ID0gd3JhcHBlZFByb3RvY29sLnJlcXVlc3QoaW5wdXQsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgICAgIHdyYXBwZWRSZXF1ZXN0LmVuZCgpO1xuICAgICAgcmV0dXJuIHdyYXBwZWRSZXF1ZXN0O1xuICAgIH1cblxuICAgIC8vIEV4cG9zZSB0aGUgcHJvcGVydGllcyBvbiB0aGUgd3JhcHBlZCBwcm90b2NvbFxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdyYXBwZWRQcm90b2NvbCwge1xuICAgICAgcmVxdWVzdDogeyB2YWx1ZTogcmVxdWVzdCwgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9LFxuICAgICAgZ2V0OiB7IHZhbHVlOiBnZXQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSxcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBleHBvcnRzO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gbm9vcCgpIHsgLyogZW1wdHkgKi8gfVxuXG4vLyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL21hc3Rlci9saWIvaW50ZXJuYWwvdXJsLmpzXG5mdW5jdGlvbiB1cmxUb09wdGlvbnModXJsT2JqZWN0KSB7XG4gIHZhciBvcHRpb25zID0ge1xuICAgIHByb3RvY29sOiB1cmxPYmplY3QucHJvdG9jb2wsXG4gICAgaG9zdG5hbWU6IHVybE9iamVjdC5ob3N0bmFtZS5zdGFydHNXaXRoKFwiW1wiKSA/XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgdXJsT2JqZWN0Lmhvc3RuYW1lLnNsaWNlKDEsIC0xKSA6XG4gICAgICB1cmxPYmplY3QuaG9zdG5hbWUsXG4gICAgaGFzaDogdXJsT2JqZWN0Lmhhc2gsXG4gICAgc2VhcmNoOiB1cmxPYmplY3Quc2VhcmNoLFxuICAgIHBhdGhuYW1lOiB1cmxPYmplY3QucGF0aG5hbWUsXG4gICAgcGF0aDogdXJsT2JqZWN0LnBhdGhuYW1lICsgdXJsT2JqZWN0LnNlYXJjaCxcbiAgICBocmVmOiB1cmxPYmplY3QuaHJlZixcbiAgfTtcbiAgaWYgKHVybE9iamVjdC5wb3J0ICE9PSBcIlwiKSB7XG4gICAgb3B0aW9ucy5wb3J0ID0gTnVtYmVyKHVybE9iamVjdC5wb3J0KTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTWF0Y2hpbmdIZWFkZXJzKHJlZ2V4LCBoZWFkZXJzKSB7XG4gIHZhciBsYXN0VmFsdWU7XG4gIGZvciAodmFyIGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgaWYgKHJlZ2V4LnRlc3QoaGVhZGVyKSkge1xuICAgICAgbGFzdFZhbHVlID0gaGVhZGVyc1toZWFkZXJdO1xuICAgICAgZGVsZXRlIGhlYWRlcnNbaGVhZGVyXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChsYXN0VmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGxhc3RWYWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgP1xuICAgIHVuZGVmaW5lZCA6IFN0cmluZyhsYXN0VmFsdWUpLnRyaW0oKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JUeXBlKGNvZGUsIG1lc3NhZ2UsIGJhc2VDbGFzcykge1xuICAvLyBDcmVhdGUgY29uc3RydWN0b3JcbiAgZnVuY3Rpb24gQ3VzdG9tRXJyb3IocHJvcGVydGllcykge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcGVydGllcyB8fCB7fSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmNhdXNlID8gbWVzc2FnZSArIFwiOiBcIiArIHRoaXMuY2F1c2UubWVzc2FnZSA6IG1lc3NhZ2U7XG4gIH1cblxuICAvLyBBdHRhY2ggY29uc3RydWN0b3IgYW5kIHNldCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgQ3VzdG9tRXJyb3IucHJvdG90eXBlID0gbmV3IChiYXNlQ2xhc3MgfHwgRXJyb3IpKCk7XG4gIEN1c3RvbUVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1c3RvbUVycm9yO1xuICBDdXN0b21FcnJvci5wcm90b3R5cGUubmFtZSA9IFwiRXJyb3IgW1wiICsgY29kZSArIFwiXVwiO1xuICByZXR1cm4gQ3VzdG9tRXJyb3I7XG59XG5cbmZ1bmN0aW9uIGFib3J0UmVxdWVzdChyZXF1ZXN0KSB7XG4gIGZvciAodmFyIGV2ZW50IG9mIGV2ZW50cykge1xuICAgIHJlcXVlc3QucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGV2ZW50SGFuZGxlcnNbZXZlbnRdKTtcbiAgfVxuICByZXF1ZXN0Lm9uKFwiZXJyb3JcIiwgbm9vcCk7XG4gIHJlcXVlc3QuYWJvcnQoKTtcbn1cblxuZnVuY3Rpb24gaXNTdWJkb21haW4oc3ViZG9tYWluLCBkb21haW4pIHtcbiAgYXNzZXJ0KGlzU3RyaW5nKHN1YmRvbWFpbikgJiYgaXNTdHJpbmcoZG9tYWluKSk7XG4gIHZhciBkb3QgPSBzdWJkb21haW4ubGVuZ3RoIC0gZG9tYWluLmxlbmd0aCAtIDE7XG4gIHJldHVybiBkb3QgPiAwICYmIHN1YmRvbWFpbltkb3RdID09PSBcIi5cIiAmJiBzdWJkb21haW4uZW5kc1dpdGgoZG9tYWluKTtcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgKFwibGVuZ3RoXCIgaW4gdmFsdWUpO1xufVxuXG4vLyBFeHBvcnRzXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXAoeyBodHRwOiBodHRwLCBodHRwczogaHR0cHMgfSk7XG5tb2R1bGUuZXhwb3J0cy53cmFwID0gd3JhcDtcbiIsICJ2YXIgaHR0cE5hdGl2ZSAgID0gcmVxdWlyZSgnaHR0cCcpLFxuICAgIGh0dHBzTmF0aXZlICA9IHJlcXVpcmUoJ2h0dHBzJyksXG4gICAgd2ViX28gID0gcmVxdWlyZSgnLi93ZWItb3V0Z29pbmcnKSxcbiAgICBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKSxcbiAgICBmb2xsb3dSZWRpcmVjdHMgPSByZXF1aXJlKCdmb2xsb3ctcmVkaXJlY3RzJyk7XG5cbndlYl9vID0gT2JqZWN0LmtleXMod2ViX28pLm1hcChmdW5jdGlvbihwYXNzKSB7XG4gIHJldHVybiB3ZWJfb1twYXNzXTtcbn0pO1xuXG52YXIgbmF0aXZlQWdlbnRzID0geyBodHRwOiBodHRwTmF0aXZlLCBodHRwczogaHR0cHNOYXRpdmUgfTtcblxuLyohXG4gKiBBcnJheSBvZiBwYXNzZXMuXG4gKlxuICogQSBgcGFzc2AgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgb24gYHJlcSwgcmVzLCBvcHRpb25zYFxuICogc28gdGhhdCB5b3UgY2FuIGVhc2lseSBhZGQgbmV3IGNoZWNrcyB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoZSBiYXNlXG4gKiBmbGV4aWJsZS5cbiAqL1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8qKlxuICAgKiBTZXRzIGBjb250ZW50LWxlbmd0aGAgdG8gJzAnIGlmIHJlcXVlc3QgaXMgb2YgREVMRVRFIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBkZWxldGVMZW5ndGg6IGZ1bmN0aW9uIGRlbGV0ZUxlbmd0aChyZXEsIHJlcywgb3B0aW9ucykge1xuICAgIGlmKChyZXEubWV0aG9kID09PSAnREVMRVRFJyB8fCByZXEubWV0aG9kID09PSAnT1BUSU9OUycpXG4gICAgICAgJiYgIXJlcS5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddKSB7XG4gICAgICByZXEuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9ICcwJztcbiAgICAgIGRlbGV0ZSByZXEuaGVhZGVyc1sndHJhbnNmZXItZW5jb2RpbmcnXTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgdGltZW91dCBpbiByZXF1ZXN0IHNvY2tldCBpZiBpdCB3YXMgc3BlY2lmaWVkIGluIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Q2xpZW50UmVxdWVzdH0gUmVxIFJlcXVlc3Qgb2JqZWN0XG4gICAqXHUwMEEwQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IFJlcyBSZXNwb25zZSBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICB0aW1lb3V0OiBmdW5jdGlvbiB0aW1lb3V0KHJlcSwgcmVzLCBvcHRpb25zKSB7XG4gICAgaWYob3B0aW9ucy50aW1lb3V0KSB7XG4gICAgICByZXEuc29ja2V0LnNldFRpbWVvdXQob3B0aW9ucy50aW1lb3V0KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYHgtZm9yd2FyZGVkLSpgIGhlYWRlcnMgaWYgc3BlY2lmaWVkIGluIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBvYmplY3RcbiAgICpcdTAwQTBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gUmVzIFJlc3BvbnNlIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gT3B0aW9ucyBDb25maWcgb2JqZWN0IHBhc3NlZCB0byB0aGUgcHJveHlcbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIFhIZWFkZXJzOiBmdW5jdGlvbiBYSGVhZGVycyhyZXEsIHJlcywgb3B0aW9ucykge1xuICAgIGlmKCFvcHRpb25zLnhmd2QpIHJldHVybjtcblxuICAgIHZhciBlbmNyeXB0ZWQgPSByZXEuaXNTcGR5IHx8IGNvbW1vbi5oYXNFbmNyeXB0ZWRDb25uZWN0aW9uKHJlcSk7XG4gICAgdmFyIHZhbHVlcyA9IHtcbiAgICAgIGZvciAgOiByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzIHx8IHJlcS5zb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICAgIHBvcnQgOiBjb21tb24uZ2V0UG9ydChyZXEpLFxuICAgICAgcHJvdG86IGVuY3J5cHRlZCA/ICdodHRwcycgOiAnaHR0cCdcbiAgICB9O1xuXG4gICAgWydmb3InLCAncG9ydCcsICdwcm90byddLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gPVxuICAgICAgICAocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLScgKyBoZWFkZXJdIHx8ICcnKSArXG4gICAgICAgIChyZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gPyAnLCcgOiAnJykgK1xuICAgICAgICB2YWx1ZXNbaGVhZGVyXTtcbiAgICB9KTtcblxuICAgIHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1ob3N0J10gPSByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtaG9zdCddIHx8IHJlcS5oZWFkZXJzWydob3N0J10gfHwgJyc7XG4gIH0sXG5cbiAgLyoqXG4gICAqIERvZXMgdGhlIGFjdHVhbCBwcm94eWluZy4gSWYgYGZvcndhcmRgIGlzIGVuYWJsZWQgZmlyZXMgdXBcbiAgICogYSBGb3J3YXJkU3RyZWFtLCBzYW1lIGhhcHBlbnMgZm9yIFByb3h5U3RyZWFtLiBUaGUgcmVxdWVzdFxuICAgKiBqdXN0IGRpZXMgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7SW5jb21pbmdNZXNzYWdlfSBSZXMgUmVzcG9uc2Ugb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIENvbmZpZyBvYmplY3QgcGFzc2VkIHRvIHRoZSBwcm94eVxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG5cbiAgc3RyZWFtOiBmdW5jdGlvbiBzdHJlYW0ocmVxLCByZXMsIG9wdGlvbnMsIF8sIHNlcnZlciwgY2xiKSB7XG5cbiAgICAvLyBBbmQgd2UgYmVnaW4hXG4gICAgc2VydmVyLmVtaXQoJ3N0YXJ0JywgcmVxLCByZXMsIG9wdGlvbnMudGFyZ2V0IHx8IG9wdGlvbnMuZm9yd2FyZCk7XG5cbiAgICB2YXIgYWdlbnRzID0gb3B0aW9ucy5mb2xsb3dSZWRpcmVjdHMgPyBmb2xsb3dSZWRpcmVjdHMgOiBuYXRpdmVBZ2VudHM7XG4gICAgdmFyIGh0dHAgPSBhZ2VudHMuaHR0cDtcbiAgICB2YXIgaHR0cHMgPSBhZ2VudHMuaHR0cHM7XG5cbiAgICBpZihvcHRpb25zLmZvcndhcmQpIHtcbiAgICAgIC8vIElmIGZvcndhcmQgZW5hYmxlLCBzbyBqdXN0IHBpcGUgdGhlIHJlcXVlc3RcbiAgICAgIHZhciBmb3J3YXJkUmVxID0gKG9wdGlvbnMuZm9yd2FyZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyBodHRwcyA6IGh0dHApLnJlcXVlc3QoXG4gICAgICAgIGNvbW1vbi5zZXR1cE91dGdvaW5nKG9wdGlvbnMuc3NsIHx8IHt9LCBvcHRpb25zLCByZXEsICdmb3J3YXJkJylcbiAgICAgICk7XG5cbiAgICAgIC8vIGVycm9yIGhhbmRsZXIgKGUuZy4gRUNPTk5SRVNFVCwgRUNPTk5SRUZVU0VEKVxuICAgICAgLy8gSGFuZGxlIGVycm9ycyBvbiBpbmNvbWluZyByZXF1ZXN0IGFzIHdlbGwgYXMgaXQgbWFrZXMgc2Vuc2UgdG9cbiAgICAgIHZhciBmb3J3YXJkRXJyb3IgPSBjcmVhdGVFcnJvckhhbmRsZXIoZm9yd2FyZFJlcSwgb3B0aW9ucy5mb3J3YXJkKTtcbiAgICAgIHJlcS5vbignZXJyb3InLCBmb3J3YXJkRXJyb3IpO1xuICAgICAgZm9yd2FyZFJlcS5vbignZXJyb3InLCBmb3J3YXJkRXJyb3IpO1xuXG4gICAgICAob3B0aW9ucy5idWZmZXIgfHwgcmVxKS5waXBlKGZvcndhcmRSZXEpO1xuICAgICAgaWYoIW9wdGlvbnMudGFyZ2V0KSB7IHJldHVybiByZXMuZW5kKCk7IH1cbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IGluaXRhbGl6YXRpb25cbiAgICB2YXIgcHJveHlSZXEgPSAob3B0aW9ucy50YXJnZXQucHJvdG9jb2wgPT09ICdodHRwczonID8gaHR0cHMgOiBodHRwKS5yZXF1ZXN0KFxuICAgICAgY29tbW9uLnNldHVwT3V0Z29pbmcob3B0aW9ucy5zc2wgfHwge30sIG9wdGlvbnMsIHJlcSlcbiAgICApO1xuXG4gICAgLy8gRW5hYmxlIGRldmVsb3BlcnMgdG8gbW9kaWZ5IHRoZSBwcm94eVJlcSBiZWZvcmUgaGVhZGVycyBhcmUgc2VudFxuICAgIHByb3h5UmVxLm9uKCdzb2NrZXQnLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICAgIGlmKHNlcnZlciAmJiAhcHJveHlSZXEuZ2V0SGVhZGVyKCdleHBlY3QnKSkge1xuICAgICAgICBzZXJ2ZXIuZW1pdCgncHJveHlSZXEnLCBwcm94eVJlcSwgcmVxLCByZXMsIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gYWxsb3cgb3V0Z29pbmcgc29ja2V0IHRvIHRpbWVvdXQgc28gdGhhdCB3ZSBjb3VsZFxuICAgIC8vIHNob3cgYW4gZXJyb3IgcGFnZSBhdCB0aGUgaW5pdGlhbCByZXF1ZXN0XG4gICAgaWYob3B0aW9ucy5wcm94eVRpbWVvdXQpIHtcbiAgICAgIHByb3h5UmVxLnNldFRpbWVvdXQob3B0aW9ucy5wcm94eVRpbWVvdXQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgcHJveHlSZXEuYWJvcnQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB3ZSBhYm9ydCBwcm94eSBpZiByZXF1ZXN0IGlzIGFib3J0ZWRcbiAgICByZXEub24oJ2Fib3J0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm94eVJlcS5hYm9ydCgpO1xuICAgIH0pO1xuXG4gICAgLy8gaGFuZGxlIGVycm9ycyBpbiBwcm94eSBhbmQgaW5jb21pbmcgcmVxdWVzdCwganVzdCBsaWtlIGZvciBmb3J3YXJkIHByb3h5XG4gICAgdmFyIHByb3h5RXJyb3IgPSBjcmVhdGVFcnJvckhhbmRsZXIocHJveHlSZXEsIG9wdGlvbnMudGFyZ2V0KTtcbiAgICByZXEub24oJ2Vycm9yJywgcHJveHlFcnJvcik7XG4gICAgcHJveHlSZXEub24oJ2Vycm9yJywgcHJveHlFcnJvcik7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVFcnJvckhhbmRsZXIocHJveHlSZXEsIHVybCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHByb3h5RXJyb3IoZXJyKSB7XG4gICAgICAgIGlmIChyZXEuc29ja2V0LmRlc3Ryb3llZCAmJiBlcnIuY29kZSA9PT0gJ0VDT05OUkVTRVQnKSB7XG4gICAgICAgICAgc2VydmVyLmVtaXQoJ2Vjb25ucmVzZXQnLCBlcnIsIHJlcSwgcmVzLCB1cmwpO1xuICAgICAgICAgIHJldHVybiBwcm94eVJlcS5hYm9ydCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsYikge1xuICAgICAgICAgIGNsYihlcnIsIHJlcSwgcmVzLCB1cmwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlcnZlci5lbWl0KCdlcnJvcicsIGVyciwgcmVxLCByZXMsIHVybCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAob3B0aW9ucy5idWZmZXIgfHwgcmVxKS5waXBlKHByb3h5UmVxKTtcblxuICAgIHByb3h5UmVxLm9uKCdyZXNwb25zZScsIGZ1bmN0aW9uKHByb3h5UmVzKSB7XG4gICAgICBpZihzZXJ2ZXIpIHsgc2VydmVyLmVtaXQoJ3Byb3h5UmVzJywgcHJveHlSZXMsIHJlcSwgcmVzKTsgfVxuXG4gICAgICBpZighcmVzLmhlYWRlcnNTZW50ICYmICFvcHRpb25zLnNlbGZIYW5kbGVSZXNwb25zZSkge1xuICAgICAgICBmb3IodmFyIGk9MDsgaSA8IHdlYl9vLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYod2ViX29baV0ocmVxLCByZXMsIHByb3h5UmVzLCBvcHRpb25zKSkgeyBicmVhazsgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzLmZpbmlzaGVkKSB7XG4gICAgICAgIC8vIEFsbG93IHVzIHRvIGxpc3RlbiB3aGVuIHRoZSBwcm94eSBoYXMgY29tcGxldGVkXG4gICAgICAgIHByb3h5UmVzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHNlcnZlcikgc2VydmVyLmVtaXQoJ2VuZCcsIHJlcSwgcmVzLCBwcm94eVJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBXZSBwaXBlIHRvIHRoZSByZXNwb25zZSB1bmxlc3MgaXRzIGV4cGVjdGVkIHRvIGJlIGhhbmRsZWQgYnkgdGhlIHVzZXJcbiAgICAgICAgaWYgKCFvcHRpb25zLnNlbGZIYW5kbGVSZXNwb25zZSkgcHJveHlSZXMucGlwZShyZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNlcnZlcikgc2VydmVyLmVtaXQoJ2VuZCcsIHJlcSwgcmVzLCBwcm94eVJlcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxufTtcbiIsICJ2YXIgaHR0cCAgID0gcmVxdWlyZSgnaHR0cCcpLFxuICAgIGh0dHBzICA9IHJlcXVpcmUoJ2h0dHBzJyksXG4gICAgY29tbW9uID0gcmVxdWlyZSgnLi4vY29tbW9uJyk7XG5cbi8qIVxuICogQXJyYXkgb2YgcGFzc2VzLlxuICpcbiAqIEEgYHBhc3NgIGlzIGp1c3QgYSBmdW5jdGlvbiB0aGF0IGlzIGV4ZWN1dGVkIG9uIGByZXEsIHNvY2tldCwgb3B0aW9uc2BcbiAqIHNvIHRoYXQgeW91IGNhbiBlYXNpbHkgYWRkIG5ldyBjaGVja3Mgd2hpbGUgc3RpbGwga2VlcGluZyB0aGUgYmFzZVxuICogZmxleGlibGUuXG4gKi9cblxuLypcbiAqIFdlYnNvY2tldHMgUGFzc2VzXG4gKlxuICovXG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIC8qKlxuICAgKiBXZWJTb2NrZXQgcmVxdWVzdHMgbXVzdCBoYXZlIHRoZSBgR0VUYCBtZXRob2QgYW5kXG4gICAqIHRoZSBgdXBncmFkZTp3ZWJzb2NrZXRgIGhlYWRlclxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7U29ja2V0fSBXZWJzb2NrZXRcbiAgICpcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIGNoZWNrTWV0aG9kQW5kSGVhZGVyIDogZnVuY3Rpb24gY2hlY2tNZXRob2RBbmRIZWFkZXIocmVxLCBzb2NrZXQpIHtcbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gJ0dFVCcgfHwgIXJlcS5oZWFkZXJzLnVwZ3JhZGUpIHtcbiAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocmVxLmhlYWRlcnMudXBncmFkZS50b0xvd2VyQ2FzZSgpICE9PSAnd2Vic29ja2V0Jykge1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBgeC1mb3J3YXJkZWQtKmAgaGVhZGVycyBpZiBzcGVjaWZpZWQgaW4gY29uZmlnLlxuICAgKlxuICAgKiBAcGFyYW0ge0NsaWVudFJlcXVlc3R9IFJlcSBSZXF1ZXN0IG9iamVjdFxuICAgKlx1MDBBMEBwYXJhbSB7U29ja2V0fSBXZWJzb2NrZXRcbiAgICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBYSGVhZGVycyA6IGZ1bmN0aW9uIFhIZWFkZXJzKHJlcSwgc29ja2V0LCBvcHRpb25zKSB7XG4gICAgaWYoIW9wdGlvbnMueGZ3ZCkgcmV0dXJuO1xuXG4gICAgdmFyIHZhbHVlcyA9IHtcbiAgICAgIGZvciAgOiByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzIHx8IHJlcS5zb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICAgIHBvcnQgOiBjb21tb24uZ2V0UG9ydChyZXEpLFxuICAgICAgcHJvdG86IGNvbW1vbi5oYXNFbmNyeXB0ZWRDb25uZWN0aW9uKHJlcSkgPyAnd3NzJyA6ICd3cydcbiAgICB9O1xuXG4gICAgWydmb3InLCAncG9ydCcsICdwcm90byddLmZvckVhY2goZnVuY3Rpb24oaGVhZGVyKSB7XG4gICAgICByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gPVxuICAgICAgICAocmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLScgKyBoZWFkZXJdIHx8ICcnKSArXG4gICAgICAgIChyZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtJyArIGhlYWRlcl0gPyAnLCcgOiAnJykgK1xuICAgICAgICB2YWx1ZXNbaGVhZGVyXTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogRG9lcyB0aGUgYWN0dWFsIHByb3h5aW5nLiBNYWtlIHRoZSByZXF1ZXN0IGFuZCB1cGdyYWRlIGl0XG4gICAqIHNlbmQgdGhlIFN3aXRjaGluZyBQcm90b2NvbHMgcmVxdWVzdCBhbmQgcGlwZSB0aGUgc29ja2V0cy5cbiAgICpcbiAgICogQHBhcmFtIHtDbGllbnRSZXF1ZXN0fSBSZXEgUmVxdWVzdCBvYmplY3RcbiAgICpcdTAwQTBAcGFyYW0ge1NvY2tldH0gV2Vic29ja2V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIENvbmZpZyBvYmplY3QgcGFzc2VkIHRvIHRoZSBwcm94eVxuICAgKlxuICAgKiBAYXBpIHByaXZhdGVcbiAgICovXG4gIHN0cmVhbSA6IGZ1bmN0aW9uIHN0cmVhbShyZXEsIHNvY2tldCwgb3B0aW9ucywgaGVhZCwgc2VydmVyLCBjbGIpIHtcblxuICAgIHZhciBjcmVhdGVIdHRwSGVhZGVyID0gZnVuY3Rpb24obGluZSwgaGVhZGVycykge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGhlYWRlcnMpLnJlZHVjZShmdW5jdGlvbiAoaGVhZCwga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGhlYWRlcnNba2V5XTtcblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgaGVhZC5wdXNoKGtleSArICc6ICcgKyB2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhlYWQ7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaGVhZC5wdXNoKGtleSArICc6ICcgKyB2YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWQ7XG4gICAgICB9LCBbbGluZV0pXG4gICAgICAuam9pbignXFxyXFxuJykgKyAnXFxyXFxuXFxyXFxuJztcbiAgICB9XG5cbiAgICBjb21tb24uc2V0dXBTb2NrZXQoc29ja2V0KTtcblxuICAgIGlmIChoZWFkICYmIGhlYWQubGVuZ3RoKSBzb2NrZXQudW5zaGlmdChoZWFkKTtcblxuXG4gICAgdmFyIHByb3h5UmVxID0gKGNvbW1vbi5pc1NTTC50ZXN0KG9wdGlvbnMudGFyZ2V0LnByb3RvY29sKSA/IGh0dHBzIDogaHR0cCkucmVxdWVzdChcbiAgICAgIGNvbW1vbi5zZXR1cE91dGdvaW5nKG9wdGlvbnMuc3NsIHx8IHt9LCBvcHRpb25zLCByZXEpXG4gICAgKTtcblxuICAgIC8vIEVuYWJsZSBkZXZlbG9wZXJzIHRvIG1vZGlmeSB0aGUgcHJveHlSZXEgYmVmb3JlIGhlYWRlcnMgYXJlIHNlbnRcbiAgICBpZiAoc2VydmVyKSB7IHNlcnZlci5lbWl0KCdwcm94eVJlcVdzJywgcHJveHlSZXEsIHJlcSwgc29ja2V0LCBvcHRpb25zLCBoZWFkKTsgfVxuXG4gICAgLy8gRXJyb3IgSGFuZGxlclxuICAgIHByb3h5UmVxLm9uKCdlcnJvcicsIG9uT3V0Z29pbmdFcnJvcik7XG4gICAgcHJveHlSZXEub24oJ3Jlc3BvbnNlJywgZnVuY3Rpb24gKHJlcykge1xuICAgICAgLy8gaWYgdXBncmFkZSBldmVudCBpc24ndCBnb2luZyB0byBoYXBwZW4sIGNsb3NlIHRoZSBzb2NrZXRcbiAgICAgIGlmICghcmVzLnVwZ3JhZGUpIHtcbiAgICAgICAgc29ja2V0LndyaXRlKGNyZWF0ZUh0dHBIZWFkZXIoJ0hUVFAvJyArIHJlcy5odHRwVmVyc2lvbiArICcgJyArIHJlcy5zdGF0dXNDb2RlICsgJyAnICsgcmVzLnN0YXR1c01lc3NhZ2UsIHJlcy5oZWFkZXJzKSk7XG4gICAgICAgIHJlcy5waXBlKHNvY2tldCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBwcm94eVJlcS5vbigndXBncmFkZScsIGZ1bmN0aW9uKHByb3h5UmVzLCBwcm94eVNvY2tldCwgcHJveHlIZWFkKSB7XG4gICAgICBwcm94eVNvY2tldC5vbignZXJyb3InLCBvbk91dGdvaW5nRXJyb3IpO1xuXG4gICAgICAvLyBBbGxvdyB1cyB0byBsaXN0ZW4gd2hlbiB0aGUgd2Vic29ja2V0IGhhcyBjb21wbGV0ZWRcbiAgICAgIHByb3h5U29ja2V0Lm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlcnZlci5lbWl0KCdjbG9zZScsIHByb3h5UmVzLCBwcm94eVNvY2tldCwgcHJveHlIZWFkKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGUgcGlwZSBiZWxvdyB3aWxsIGVuZCBwcm94eVNvY2tldCBpZiBzb2NrZXQgY2xvc2VzIGNsZWFubHksIGJ1dCBub3RcbiAgICAgIC8vIGlmIGl0IGVycm9ycyAoZWcsIHZhbmlzaGVzIGZyb20gdGhlIG5ldCBhbmQgc3RhcnRzIHJldHVybmluZ1xuICAgICAgLy8gRUhPU1RVTlJFQUNIKS4gV2UgbmVlZCB0byBkbyB0aGF0IGV4cGxpY2l0bHkuXG4gICAgICBzb2NrZXQub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBwcm94eVNvY2tldC5lbmQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb21tb24uc2V0dXBTb2NrZXQocHJveHlTb2NrZXQpO1xuXG4gICAgICBpZiAocHJveHlIZWFkICYmIHByb3h5SGVhZC5sZW5ndGgpIHByb3h5U29ja2V0LnVuc2hpZnQocHJveHlIZWFkKTtcblxuICAgICAgLy9cbiAgICAgIC8vIFJlbWFyazogSGFuZGxlIHdyaXRpbmcgdGhlIGhlYWRlcnMgdG8gdGhlIHNvY2tldCB3aGVuIHN3aXRjaGluZyBwcm90b2NvbHNcbiAgICAgIC8vIEFsc28gaGFuZGxlcyB3aGVuIGEgaGVhZGVyIGlzIGFuIGFycmF5XG4gICAgICAvL1xuICAgICAgc29ja2V0LndyaXRlKGNyZWF0ZUh0dHBIZWFkZXIoJ0hUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzJywgcHJveHlSZXMuaGVhZGVycykpO1xuXG4gICAgICBwcm94eVNvY2tldC5waXBlKHNvY2tldCkucGlwZShwcm94eVNvY2tldCk7XG5cbiAgICAgIHNlcnZlci5lbWl0KCdvcGVuJywgcHJveHlTb2NrZXQpO1xuICAgICAgc2VydmVyLmVtaXQoJ3Byb3h5U29ja2V0JywgcHJveHlTb2NrZXQpOyAgLy9ERVBSRUNBVEVELlxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb3h5UmVxLmVuZCgpOyAvLyBYWFg6IENIRUNLIElGIFRISVMgSVMgVEhJUyBDT1JSRUNUXG5cbiAgICBmdW5jdGlvbiBvbk91dGdvaW5nRXJyb3IoZXJyKSB7XG4gICAgICBpZiAoY2xiKSB7XG4gICAgICAgIGNsYihlcnIsIHJlcSwgc29ja2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5lbWl0KCdlcnJvcicsIGVyciwgcmVxLCBzb2NrZXQpO1xuICAgICAgfVxuICAgICAgc29ja2V0LmVuZCgpO1xuICAgIH1cbiAgfVxufTtcbiIsICJ2YXIgaHR0cFByb3h5ID0gbW9kdWxlLmV4cG9ydHMsXG4gICAgZXh0ZW5kICAgID0gcmVxdWlyZSgndXRpbCcpLl9leHRlbmQsXG4gICAgcGFyc2VfdXJsID0gcmVxdWlyZSgndXJsJykucGFyc2UsXG4gICAgRUUzICAgICAgID0gcmVxdWlyZSgnZXZlbnRlbWl0dGVyMycpLFxuICAgIGh0dHAgICAgICA9IHJlcXVpcmUoJ2h0dHAnKSxcbiAgICBodHRwcyAgICAgPSByZXF1aXJlKCdodHRwcycpLFxuICAgIHdlYiAgICAgICA9IHJlcXVpcmUoJy4vcGFzc2VzL3dlYi1pbmNvbWluZycpLFxuICAgIHdzICAgICAgICA9IHJlcXVpcmUoJy4vcGFzc2VzL3dzLWluY29taW5nJyk7XG5cbmh0dHBQcm94eS5TZXJ2ZXIgPSBQcm94eVNlcnZlcjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZSBsb2FkZXIgZm9yXG4gKiBlaXRoZXIgYHdzYCBvciBgd2ViYCdzICBwYXNzZXMuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgaHR0cFByb3h5LmNyZWF0ZVJpZ2h0UHJveHkoJ3dzJylcbiAqICAgIC8vID0+IFtGdW5jdGlvbl1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gVHlwZSBFaXRoZXIgJ3dzJyBvciAnd2ViJ1xuICpcdTAwQTBcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBMb2FkZXIgRnVuY3Rpb24gdGhhdCB3aGVuIGNhbGxlZCByZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciB0aGUgcmlnaHQgcGFzc2VzXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlUmlnaHRQcm94eSh0eXBlKSB7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ocmVxLCByZXMgLyosIFtoZWFkXSwgW29wdHNdICovKSB7XG4gICAgICB2YXIgcGFzc2VzID0gKHR5cGUgPT09ICd3cycpID8gdGhpcy53c1Bhc3NlcyA6IHRoaXMud2ViUGFzc2VzLFxuICAgICAgICAgIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cyksXG4gICAgICAgICAgY250ciA9IGFyZ3MubGVuZ3RoIC0gMSxcbiAgICAgICAgICBoZWFkLCBjYmw7XG5cbiAgICAgIC8qIG9wdGlvbmFsIGFyZ3MgcGFyc2UgYmVnaW4gKi9cbiAgICAgIGlmKHR5cGVvZiBhcmdzW2NudHJdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNibCA9IGFyZ3NbY250cl07XG5cbiAgICAgICAgY250ci0tO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVxdWVzdE9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgaWYoXG4gICAgICAgICEoYXJnc1tjbnRyXSBpbnN0YW5jZW9mIEJ1ZmZlcikgJiZcbiAgICAgICAgYXJnc1tjbnRyXSAhPT0gcmVzXG4gICAgICApIHtcbiAgICAgICAgLy9Db3B5IGdsb2JhbCBvcHRpb25zXG4gICAgICAgIHJlcXVlc3RPcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcbiAgICAgICAgLy9PdmVyd3JpdGUgd2l0aCByZXF1ZXN0IG9wdGlvbnNcbiAgICAgICAgZXh0ZW5kKHJlcXVlc3RPcHRpb25zLCBhcmdzW2NudHJdKTtcblxuICAgICAgICBjbnRyLS07XG4gICAgICB9XG5cbiAgICAgIGlmKGFyZ3NbY250cl0gaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgaGVhZCA9IGFyZ3NbY250cl07XG4gICAgICB9XG5cbiAgICAgIC8qIG9wdGlvbmFsIGFyZ3MgcGFyc2UgZW5kICovXG5cbiAgICAgIFsndGFyZ2V0JywgJ2ZvcndhcmQnXS5mb3JFYWNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0T3B0aW9uc1tlXSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgcmVxdWVzdE9wdGlvbnNbZV0gPSBwYXJzZV91cmwocmVxdWVzdE9wdGlvbnNbZV0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghcmVxdWVzdE9wdGlvbnMudGFyZ2V0ICYmICFyZXF1ZXN0T3B0aW9ucy5mb3J3YXJkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgYSBwcm9wZXIgVVJMIGFzIHRhcmdldCcpKTtcbiAgICAgIH1cblxuICAgICAgZm9yKHZhciBpPTA7IGkgPCBwYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgb2YgcGFzc2VzIGZ1bmN0aW9uc1xuICAgICAgICAgKiBwYXNzKHJlcSwgcmVzLCBvcHRpb25zLCBoZWFkKVxuICAgICAgICAgKlxuICAgICAgICAgKiBJbiBXZWJTb2NrZXRzIGNhc2UgdGhlIGByZXNgIHZhcmlhYmxlXG4gICAgICAgICAqIHJlZmVyIHRvIHRoZSBjb25uZWN0aW9uIHNvY2tldFxuICAgICAgICAgKiBwYXNzKHJlcSwgc29ja2V0LCBvcHRpb25zLCBoZWFkKVxuICAgICAgICAgKi9cbiAgICAgICAgaWYocGFzc2VzW2ldKHJlcSwgcmVzLCByZXF1ZXN0T3B0aW9ucywgaGVhZCwgdGhpcywgY2JsKSkgeyAvLyBwYXNzZXMgY2FuIHJldHVybiBhIHRydXRoeSB2YWx1ZSB0byBoYWx0IHRoZSBsb29wXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xufVxuaHR0cFByb3h5LmNyZWF0ZVJpZ2h0UHJveHkgPSBjcmVhdGVSaWdodFByb3h5O1xuXG5mdW5jdGlvbiBQcm94eVNlcnZlcihvcHRpb25zKSB7XG4gIEVFMy5jYWxsKHRoaXMpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnByZXBlbmRQYXRoID0gb3B0aW9ucy5wcmVwZW5kUGF0aCA9PT0gZmFsc2UgPyBmYWxzZSA6IHRydWU7XG5cbiAgdGhpcy53ZWIgPSB0aGlzLnByb3h5UmVxdWVzdCAgICAgICAgICAgPSBjcmVhdGVSaWdodFByb3h5KCd3ZWInKShvcHRpb25zKTtcbiAgdGhpcy53cyAgPSB0aGlzLnByb3h5V2Vic29ja2V0UmVxdWVzdCAgPSBjcmVhdGVSaWdodFByb3h5KCd3cycpKG9wdGlvbnMpO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gIHRoaXMud2ViUGFzc2VzID0gT2JqZWN0LmtleXMod2ViKS5tYXAoZnVuY3Rpb24ocGFzcykge1xuICAgIHJldHVybiB3ZWJbcGFzc107XG4gIH0pO1xuXG4gIHRoaXMud3NQYXNzZXMgPSBPYmplY3Qua2V5cyh3cykubWFwKGZ1bmN0aW9uKHBhc3MpIHtcbiAgICByZXR1cm4gd3NbcGFzc107XG4gIH0pO1xuXG4gIHRoaXMub24oJ2Vycm9yJywgdGhpcy5vbkVycm9yLCB0aGlzKTtcblxufVxuXG5yZXF1aXJlKCd1dGlsJykuaW5oZXJpdHMoUHJveHlTZXJ2ZXIsIEVFMyk7XG5cblByb3h5U2VydmVyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAvL1xuICAvLyBSZW1hcms6IFJlcGxpY2F0ZSBub2RlIGNvcmUgYmVoYXZpb3IgdXNpbmcgRUUzXG4gIC8vIHNvIHdlIGZvcmNlIHBlb3BsZSB0byBoYW5kbGUgdGhlaXIgb3duIGVycm9yc1xuICAvL1xuICBpZih0aGlzLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGggPT09IDEpIHtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn07XG5cblByb3h5U2VydmVyLnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbihwb3J0LCBob3N0bmFtZSkge1xuICB2YXIgc2VsZiAgICA9IHRoaXMsXG4gICAgICBjbG9zdXJlID0gZnVuY3Rpb24ocmVxLCByZXMpIHsgc2VsZi53ZWIocmVxLCByZXMpOyB9O1xuXG4gIHRoaXMuX3NlcnZlciAgPSB0aGlzLm9wdGlvbnMuc3NsID9cbiAgICBodHRwcy5jcmVhdGVTZXJ2ZXIodGhpcy5vcHRpb25zLnNzbCwgY2xvc3VyZSkgOlxuICAgIGh0dHAuY3JlYXRlU2VydmVyKGNsb3N1cmUpO1xuXG4gIGlmKHRoaXMub3B0aW9ucy53cykge1xuICAgIHRoaXMuX3NlcnZlci5vbigndXBncmFkZScsIGZ1bmN0aW9uKHJlcSwgc29ja2V0LCBoZWFkKSB7IHNlbGYud3MocmVxLCBzb2NrZXQsIGhlYWQpOyB9KTtcbiAgfVxuXG4gIHRoaXMuX3NlcnZlci5saXN0ZW4ocG9ydCwgaG9zdG5hbWUpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuUHJveHlTZXJ2ZXIucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAodGhpcy5fc2VydmVyKSB7XG4gICAgdGhpcy5fc2VydmVyLmNsb3NlKGRvbmUpO1xuICB9XG5cbiAgLy8gV3JhcCBjYWxsYmFjayB0byBudWxsaWZ5IHNlcnZlciBhZnRlciBhbGwgb3BlbiBjb25uZWN0aW9ucyBhcmUgY2xvc2VkLlxuICBmdW5jdGlvbiBkb25lKCkge1xuICAgIHNlbGYuX3NlcnZlciA9IG51bGw7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfTtcbn07XG5cblByb3h5U2VydmVyLnByb3RvdHlwZS5iZWZvcmUgPSBmdW5jdGlvbih0eXBlLCBwYXNzTmFtZSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGUgIT09ICd3cycgJiYgdHlwZSAhPT0gJ3dlYicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGUgbXVzdCBiZSBgd2ViYCBvciBgd3NgJyk7XG4gIH1cbiAgdmFyIHBhc3NlcyA9ICh0eXBlID09PSAnd3MnKSA/IHRoaXMud3NQYXNzZXMgOiB0aGlzLndlYlBhc3NlcyxcbiAgICAgIGkgPSBmYWxzZTtcblxuICBwYXNzZXMuZm9yRWFjaChmdW5jdGlvbih2LCBpZHgpIHtcbiAgICBpZih2Lm5hbWUgPT09IHBhc3NOYW1lKSBpID0gaWR4O1xuICB9KVxuXG4gIGlmKGkgPT09IGZhbHNlKSB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1Y2ggcGFzcycpO1xuXG4gIHBhc3Nlcy5zcGxpY2UoaSwgMCwgY2FsbGJhY2spO1xufTtcblByb3h5U2VydmVyLnByb3RvdHlwZS5hZnRlciA9IGZ1bmN0aW9uKHR5cGUsIHBhc3NOYW1lLCBjYWxsYmFjaykge1xuICBpZiAodHlwZSAhPT0gJ3dzJyAmJiB0eXBlICE9PSAnd2ViJykge1xuICAgIHRocm93IG5ldyBFcnJvcigndHlwZSBtdXN0IGJlIGB3ZWJgIG9yIGB3c2AnKTtcbiAgfVxuICB2YXIgcGFzc2VzID0gKHR5cGUgPT09ICd3cycpID8gdGhpcy53c1Bhc3NlcyA6IHRoaXMud2ViUGFzc2VzLFxuICAgICAgaSA9IGZhbHNlO1xuXG4gIHBhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKHYsIGlkeCkge1xuICAgIGlmKHYubmFtZSA9PT0gcGFzc05hbWUpIGkgPSBpZHg7XG4gIH0pXG5cbiAgaWYoaSA9PT0gZmFsc2UpIHRocm93IG5ldyBFcnJvcignTm8gc3VjaCBwYXNzJyk7XG5cbiAgcGFzc2VzLnNwbGljZShpKyssIDAsIGNhbGxiYWNrKTtcbn07XG4iLCAiIC8vIFVzZSBleHBsaWNpdCAvaW5kZXguanMgdG8gaGVscCBicm93c2VyaWZ5IG5lZ29jaWF0aW9uIGluIHJlcXVpcmUgJy9saWIvaHR0cC1wcm94eScgKCEpXG52YXIgUHJveHlTZXJ2ZXIgPSByZXF1aXJlKCcuL2h0dHAtcHJveHkvaW5kZXguanMnKS5TZXJ2ZXI7XG5cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBwcm94eSBzZXJ2ZXIuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgaHR0cFByb3h5LmNyZWF0ZVByb3h5U2VydmVyKHsgLi4gfSwgODAwMClcbiAqICAgIC8vID0+ICd7IHdlYjogW0Z1bmN0aW9uXSwgd3M6IFtGdW5jdGlvbl0gLi4uIH0nXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IE9wdGlvbnMgQ29uZmlnIG9iamVjdCBwYXNzZWQgdG8gdGhlIHByb3h5XG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBQcm94eSBQcm94eSBvYmplY3Qgd2l0aCBoYW5kbGVycyBmb3IgYHdzYCBhbmQgYHdlYmAgcmVxdWVzdHNcbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblxuZnVuY3Rpb24gY3JlYXRlUHJveHlTZXJ2ZXIob3B0aW9ucykge1xuICAvKlxuICAgKiAgYG9wdGlvbnNgIGlzIG5lZWRlZCBhbmQgaXQgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgbGF5b3V0OlxuICAgKlxuICAgKiAge1xuICAgKiAgICB0YXJnZXQgOiA8dXJsIHN0cmluZyB0byBiZSBwYXJzZWQgd2l0aCB0aGUgdXJsIG1vZHVsZT5cbiAgICogICAgZm9yd2FyZDogPHVybCBzdHJpbmcgdG8gYmUgcGFyc2VkIHdpdGggdGhlIHVybCBtb2R1bGU+XG4gICAqICAgIGFnZW50ICA6IDxvYmplY3QgdG8gYmUgcGFzc2VkIHRvIGh0dHAocykucmVxdWVzdD5cbiAgICogICAgc3NsICAgIDogPG9iamVjdCB0byBiZSBwYXNzZWQgdG8gaHR0cHMuY3JlYXRlU2VydmVyKCk+XG4gICAqICAgIHdzICAgICA6IDx0cnVlL2ZhbHNlLCBpZiB5b3Ugd2FudCB0byBwcm94eSB3ZWJzb2NrZXRzPlxuICAgKiAgICB4ZndkICAgOiA8dHJ1ZS9mYWxzZSwgYWRkcyB4LWZvcndhcmQgaGVhZGVycz5cbiAgICogICAgc2VjdXJlIDogPHRydWUvZmFsc2UsIHZlcmlmeSBTU0wgY2VydGlmaWNhdGU+XG4gICAqICAgIHRvUHJveHk6IDx0cnVlL2ZhbHNlLCBleHBsaWNpdGx5IHNwZWNpZnkgaWYgd2UgYXJlIHByb3h5aW5nIHRvIGFub3RoZXIgcHJveHk+XG4gICAqICAgIHByZXBlbmRQYXRoOiA8dHJ1ZS9mYWxzZSwgRGVmYXVsdDogdHJ1ZSAtIHNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0byBwcmVwZW5kIHRoZSB0YXJnZXQncyBwYXRoIHRvIHRoZSBwcm94eSBwYXRoPlxuICAgKiAgICBpZ25vcmVQYXRoOiA8dHJ1ZS9mYWxzZSwgRGVmYXVsdDogZmFsc2UgLSBzcGVjaWZ5IHdoZXRoZXIgeW91IHdhbnQgdG8gaWdub3JlIHRoZSBwcm94eSBwYXRoIG9mIHRoZSBpbmNvbWluZyByZXF1ZXN0PlxuICAgKiAgICBsb2NhbEFkZHJlc3MgOiA8TG9jYWwgaW50ZXJmYWNlIHN0cmluZyB0byBiaW5kIGZvciBvdXRnb2luZyBjb25uZWN0aW9ucz5cbiAgICogICAgY2hhbmdlT3JpZ2luOiA8dHJ1ZS9mYWxzZSwgRGVmYXVsdDogZmFsc2UgLSBjaGFuZ2VzIHRoZSBvcmlnaW4gb2YgdGhlIGhvc3QgaGVhZGVyIHRvIHRoZSB0YXJnZXQgVVJMPlxuICAgKiAgICBwcmVzZXJ2ZUhlYWRlcktleUNhc2U6IDx0cnVlL2ZhbHNlLCBEZWZhdWx0OiBmYWxzZSAtIHNwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0byBrZWVwIGxldHRlciBjYXNlIG9mIHJlc3BvbnNlIGhlYWRlciBrZXkgPlxuICAgKiAgICBhdXRoICAgOiBCYXNpYyBhdXRoZW50aWNhdGlvbiBpLmUuICd1c2VyOnBhc3N3b3JkJyB0byBjb21wdXRlIGFuIEF1dGhvcml6YXRpb24gaGVhZGVyLlxuICAgKiAgICBob3N0UmV3cml0ZTogcmV3cml0ZXMgdGhlIGxvY2F0aW9uIGhvc3RuYW1lIG9uICgyMDEvMzAxLzMwMi8zMDcvMzA4KSByZWRpcmVjdHMsIERlZmF1bHQ6IG51bGwuXG4gICAqICAgIGF1dG9SZXdyaXRlOiByZXdyaXRlcyB0aGUgbG9jYXRpb24gaG9zdC9wb3J0IG9uICgyMDEvMzAxLzMwMi8zMDcvMzA4KSByZWRpcmVjdHMgYmFzZWQgb24gcmVxdWVzdGVkIGhvc3QvcG9ydC4gRGVmYXVsdDogZmFsc2UuXG4gICAqICAgIHByb3RvY29sUmV3cml0ZTogcmV3cml0ZXMgdGhlIGxvY2F0aW9uIHByb3RvY29sIG9uICgyMDEvMzAxLzMwMi8zMDcvMzA4KSByZWRpcmVjdHMgdG8gJ2h0dHAnIG9yICdodHRwcycuIERlZmF1bHQ6IG51bGwuXG4gICAqICB9XG4gICAqXG4gICAqICBOT1RFOiBgb3B0aW9ucy53c2AgYW5kIGBvcHRpb25zLnNzbGAgYXJlIG9wdGlvbmFsLlxuICAgKiAgICBgb3B0aW9ucy50YXJnZXQgYW5kIGBvcHRpb25zLmZvcndhcmRgIGNhbm5vdCBiZVxuICAgKiAgICBib3RoIG1pc3NpbmdcbiAgICogIH1cbiAgICovXG5cbiAgcmV0dXJuIG5ldyBQcm94eVNlcnZlcihvcHRpb25zKTtcbn1cblxuXG5Qcm94eVNlcnZlci5jcmVhdGVQcm94eVNlcnZlciA9IGNyZWF0ZVByb3h5U2VydmVyO1xuUHJveHlTZXJ2ZXIuY3JlYXRlU2VydmVyICAgICAgPSBjcmVhdGVQcm94eVNlcnZlcjtcblByb3h5U2VydmVyLmNyZWF0ZVByb3h5ICAgICAgID0gY3JlYXRlUHJveHlTZXJ2ZXI7XG5cblxuXG5cbi8qKlxuICogRXhwb3J0IHRoZSBwcm94eSBcIlNlcnZlclwiIGFzIHRoZSBtYWluIGV4cG9ydC5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBQcm94eVNlcnZlcjtcblxuIiwgIi8qIVxuICogQ2Fyb24gZGltb25pbywgY29uIG9jY2hpIGRpIGJyYWdpYVxuICogbG9ybyBhY2Nlbm5hbmRvLCB0dXR0ZSBsZSByYWNjb2dsaWU7XG4gKiBiYXR0ZSBjb2wgcmVtbyBxdWFsdW5xdWUgc1x1MjAxOWFkYWdpYSBcbiAqXG4gKiBDaGFyb24gdGhlIGRlbW9uLCB3aXRoIHRoZSBleWVzIG9mIGdsZWRlLFxuICogQmVja29uaW5nIHRvIHRoZW0sIGNvbGxlY3RzIHRoZW0gYWxsIHRvZ2V0aGVyLFxuICogQmVhdHMgd2l0aCBoaXMgb2FyIHdob2V2ZXIgbGFncyBiZWhpbmRcbiAqICAgICAgICAgIFxuICogICAgICAgICAgRGFudGUgLSBUaGUgRGl2aW5lIENvbWVkeSAoQ2FudG8gSUlJKVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvaHR0cC1wcm94eScpOyIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gdmFsdWUgPT4ge1xuXHRpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuXHRyZXR1cm4gcHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn07XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkVSUk9SUyA9IHZvaWQgMDtcbnZhciBFUlJPUlM7XG4oZnVuY3Rpb24gKEVSUk9SUykge1xuICAgIEVSUk9SU1tcIkVSUl9DT05GSUdfRkFDVE9SWV9UQVJHRVRfTUlTU0lOR1wiXSA9IFwiW0hQTV0gTWlzc2luZyBcXFwidGFyZ2V0XFxcIiBvcHRpb24uIEV4YW1wbGU6IHt0YXJnZXQ6IFxcXCJodHRwOi8vd3d3LmV4YW1wbGUub3JnXFxcIn1cIjtcbiAgICBFUlJPUlNbXCJFUlJfQ09OVEVYVF9NQVRDSEVSX0dFTkVSSUNcIl0gPSBcIltIUE1dIEludmFsaWQgY29udGV4dC4gRXhwZWN0aW5nIHNvbWV0aGluZyBsaWtlOiBcXFwiL2FwaVxcXCIgb3IgW1xcXCIvYXBpXFxcIiwgXFxcIi9hamF4XFxcIl1cIjtcbiAgICBFUlJPUlNbXCJFUlJfQ09OVEVYVF9NQVRDSEVSX0lOVkFMSURfQVJSQVlcIl0gPSBcIltIUE1dIEludmFsaWQgY29udGV4dC4gRXhwZWN0aW5nIHNvbWV0aGluZyBsaWtlOiBbXFxcIi9hcGlcXFwiLCBcXFwiL2FqYXhcXFwiXSBvciBbXFxcIi9hcGkvKipcXFwiLCBcXFwiISoqLmh0bWxcXFwiXVwiO1xuICAgIEVSUk9SU1tcIkVSUl9QQVRIX1JFV1JJVEVSX0NPTkZJR1wiXSA9IFwiW0hQTV0gSW52YWxpZCBwYXRoUmV3cml0ZSBjb25maWcuIEV4cGVjdGluZyBvYmplY3Qgd2l0aCBwYXRoUmV3cml0ZSBjb25maWcgb3IgYSByZXdyaXRlIGZ1bmN0aW9uXCI7XG59KShFUlJPUlMgPSBleHBvcnRzLkVSUk9SUyB8fCAoZXhwb3J0cy5FUlJPUlMgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLXJlc3QtcGFyYW1zICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEFycm93ID0gZXhwb3J0cy5nZXRJbnN0YW5jZSA9IHZvaWQgMDtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKFwidXRpbFwiKTtcbmxldCBsb2dnZXJJbnN0YW5jZTtcbmNvbnN0IGRlZmF1bHRQcm92aWRlciA9IHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTogbm8tY29uc29sZVxuICAgIGxvZzogY29uc29sZS5sb2csXG4gICAgZGVidWc6IGNvbnNvbGUubG9nLFxuICAgIGluZm86IGNvbnNvbGUuaW5mbyxcbiAgICB3YXJuOiBjb25zb2xlLndhcm4sXG4gICAgZXJyb3I6IGNvbnNvbGUuZXJyb3IsXG59O1xuLy8gbG9nIGxldmVsICd3ZWlnaHQnXG52YXIgTEVWRUxTO1xuKGZ1bmN0aW9uIChMRVZFTFMpIHtcbiAgICBMRVZFTFNbTEVWRUxTW1wiZGVidWdcIl0gPSAxMF0gPSBcImRlYnVnXCI7XG4gICAgTEVWRUxTW0xFVkVMU1tcImluZm9cIl0gPSAyMF0gPSBcImluZm9cIjtcbiAgICBMRVZFTFNbTEVWRUxTW1wid2FyblwiXSA9IDMwXSA9IFwid2FyblwiO1xuICAgIExFVkVMU1tMRVZFTFNbXCJlcnJvclwiXSA9IDUwXSA9IFwiZXJyb3JcIjtcbiAgICBMRVZFTFNbTEVWRUxTW1wic2lsZW50XCJdID0gODBdID0gXCJzaWxlbnRcIjtcbn0pKExFVkVMUyB8fCAoTEVWRUxTID0ge30pKTtcbmZ1bmN0aW9uIGdldEluc3RhbmNlKCkge1xuICAgIGlmICghbG9nZ2VySW5zdGFuY2UpIHtcbiAgICAgICAgbG9nZ2VySW5zdGFuY2UgPSBuZXcgTG9nZ2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBsb2dnZXJJbnN0YW5jZTtcbn1cbmV4cG9ydHMuZ2V0SW5zdGFuY2UgPSBnZXRJbnN0YW5jZTtcbmNsYXNzIExvZ2dlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2V0TGV2ZWwoJ2luZm8nKTtcbiAgICAgICAgdGhpcy5zZXRQcm92aWRlcigoKSA9PiBkZWZhdWx0UHJvdmlkZXIpO1xuICAgIH1cbiAgICAvLyBsb2cgd2lsbCBsb2cgbWVzc2FnZXMsIHJlZ2FyZGxlc3Mgb2YgbG9nTGV2ZWxzXG4gICAgbG9nKCkge1xuICAgICAgICB0aGlzLnByb3ZpZGVyLmxvZyh0aGlzLl9pbnRlcnBvbGF0ZS5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbiAgICB9XG4gICAgZGVidWcoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93TGV2ZWwoJ2RlYnVnJykpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXIuZGVidWcodGhpcy5faW50ZXJwb2xhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5mbygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dMZXZlbCgnaW5mbycpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVyLmluZm8odGhpcy5faW50ZXJwb2xhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2FybigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dMZXZlbCgnd2FybicpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3ZpZGVyLndhcm4odGhpcy5faW50ZXJwb2xhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXJyb3IoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zaG93TGV2ZWwoJ2Vycm9yJykpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXIuZXJyb3IodGhpcy5faW50ZXJwb2xhdGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0TGV2ZWwodikge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkTGV2ZWwodikpIHtcbiAgICAgICAgICAgIHRoaXMubG9nTGV2ZWwgPSB2O1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFByb3ZpZGVyKGZuKSB7XG4gICAgICAgIGlmIChmbiAmJiB0aGlzLmlzVmFsaWRQcm92aWRlcihmbikpIHtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXIgPSBmbihkZWZhdWx0UHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlzVmFsaWRQcm92aWRlcihmblByb3ZpZGVyKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgICAgIGlmIChmblByb3ZpZGVyICYmIHR5cGVvZiBmblByb3ZpZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tIUE1dIExvZyBwcm92aWRlciBjb25maWcgZXJyb3IuIEV4cGVjdGluZyBhIGZ1bmN0aW9uLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlzVmFsaWRMZXZlbChsZXZlbE5hbWUpIHtcbiAgICAgICAgY29uc3QgdmFsaWRMZXZlbHMgPSBPYmplY3Qua2V5cyhMRVZFTFMpO1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRMZXZlbHMuaW5jbHVkZXMobGV2ZWxOYW1lKTtcbiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tIUE1dIExvZyBsZXZlbCBlcnJvci4gSW52YWxpZCBsb2dMZXZlbC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVjaWRlIHRvIGxvZyBvciBub3QgdG8gbG9nLCBiYXNlZCBvbiB0aGUgbG9nIGxldmVscyAnd2VpZ2h0J1xuICAgICAqIEBwYXJhbSAge1N0cmluZ30gIHNob3dMZXZlbCBbZGVidWcsIGluZm8sIHdhcm4sIGVycm9yLCBzaWxlbnRdXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICAgKi9cbiAgICBfc2hvd0xldmVsKHNob3dMZXZlbCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMb2dMZXZlbCA9IExFVkVMU1t0aGlzLmxvZ0xldmVsXTtcbiAgICAgICAgaWYgKGN1cnJlbnRMb2dMZXZlbCAmJiBjdXJyZW50TG9nTGV2ZWwgPD0gTEVWRUxTW3Nob3dMZXZlbF0pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gbWFrZSBzdXJlIGxvZ2dlZCBtZXNzYWdlcyBhbmQgaXRzIGRhdGEgYXJlIHJldHVybiBpbnRlcnBvbGF0ZWRcbiAgICAvLyBtYWtlIGl0IHBvc3NpYmxlIGZvciBhZGRpdGlvbmFsIGxvZyBkYXRhLCBzdWNoIGRhdGUvdGltZSBvciBjdXN0b20gcHJlZml4LlxuICAgIF9pbnRlcnBvbGF0ZShmb3JtYXQsIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdXRpbC5mb3JtYXQoZm9ybWF0LCAuLi5hcmdzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vKipcbiAqIC0+IG5vcm1hbCBwcm94eVxuICogPT4gcm91dGVyXG4gKiB+PiBwYXRoUmV3cml0ZVxuICogXHUyMjQ4PiByb3V0ZXIgKyBwYXRoUmV3cml0ZVxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gb3JpZ2luYWxQYXRoXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG5ld1BhdGhcbiAqIEBwYXJhbSAge1N0cmluZ30gb3JpZ2luYWxUYXJnZXRcbiAqIEBwYXJhbSAge1N0cmluZ30gbmV3VGFyZ2V0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldEFycm93KG9yaWdpbmFsUGF0aCwgbmV3UGF0aCwgb3JpZ2luYWxUYXJnZXQsIG5ld1RhcmdldCkge1xuICAgIGNvbnN0IGFycm93ID0gWyc+J107XG4gICAgY29uc3QgaXNOZXdUYXJnZXQgPSBvcmlnaW5hbFRhcmdldCAhPT0gbmV3VGFyZ2V0OyAvLyByb3V0ZXJcbiAgICBjb25zdCBpc05ld1BhdGggPSBvcmlnaW5hbFBhdGggIT09IG5ld1BhdGg7IC8vIHBhdGhSZXdyaXRlXG4gICAgaWYgKGlzTmV3UGF0aCAmJiAhaXNOZXdUYXJnZXQpIHtcbiAgICAgICAgYXJyb3cudW5zaGlmdCgnficpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNOZXdQYXRoICYmIGlzTmV3VGFyZ2V0KSB7XG4gICAgICAgIGFycm93LnVuc2hpZnQoJz0nKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNOZXdQYXRoICYmIGlzTmV3VGFyZ2V0KSB7XG4gICAgICAgIGFycm93LnVuc2hpZnQoJ1x1MjI0OCcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXJyb3cudW5zaGlmdCgnLScpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyb3cuam9pbignJyk7XG59XG5leHBvcnRzLmdldEFycm93ID0gZ2V0QXJyb3c7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUNvbmZpZyA9IHZvaWQgMDtcbmNvbnN0IGlzUGxhaW5PYmogPSByZXF1aXJlKFwiaXMtcGxhaW4tb2JqXCIpO1xuY29uc3QgdXJsID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgbG9nZ2VyXzEgPSByZXF1aXJlKFwiLi9sb2dnZXJcIik7XG5jb25zdCBsb2dnZXIgPSAoMCwgbG9nZ2VyXzEuZ2V0SW5zdGFuY2UpKCk7XG5mdW5jdGlvbiBjcmVhdGVDb25maWcoY29udGV4dCwgb3B0cykge1xuICAgIC8vIHN0cnVjdHVyZSBvZiBjb25maWcgb2JqZWN0IHRvIGJlIHJldHVybmVkXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICBjb250ZXh0OiB1bmRlZmluZWQsXG4gICAgICAgIG9wdGlvbnM6IHt9LFxuICAgIH07XG4gICAgLy8gYXBwLnVzZSgnL2FwaScsIHByb3h5KHt0YXJnZXQ6J2h0dHA6Ly9sb2NhbGhvc3Q6OTAwMCd9KSk7XG4gICAgaWYgKGlzQ29udGV4dGxlc3MoY29udGV4dCwgb3B0cykpIHtcbiAgICAgICAgY29uZmlnLmNvbnRleHQgPSAnLyc7XG4gICAgICAgIGNvbmZpZy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihjb25maWcub3B0aW9ucywgY29udGV4dCk7XG4gICAgICAgIC8vIGFwcC51c2UoJy9hcGknLCBwcm94eSgnaHR0cDovL2xvY2FsaG9zdDo5MDAwJykpO1xuICAgICAgICAvLyBhcHAudXNlKHByb3h5KCdodHRwOi8vbG9jYWxob3N0OjkwMDAvYXBpJykpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1N0cmluZ1Nob3J0SGFuZChjb250ZXh0KSkge1xuICAgICAgICBjb25zdCBvVXJsID0gdXJsLnBhcnNlKGNvbnRleHQpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBbb1VybC5wcm90b2NvbCwgJy8vJywgb1VybC5ob3N0XS5qb2luKCcnKTtcbiAgICAgICAgY29uZmlnLmNvbnRleHQgPSBvVXJsLnBhdGhuYW1lIHx8ICcvJztcbiAgICAgICAgY29uZmlnLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKGNvbmZpZy5vcHRpb25zLCB7IHRhcmdldCB9LCBvcHRzKTtcbiAgICAgICAgaWYgKG9VcmwucHJvdG9jb2wgPT09ICd3czonIHx8IG9VcmwucHJvdG9jb2wgPT09ICd3c3M6Jykge1xuICAgICAgICAgICAgY29uZmlnLm9wdGlvbnMud3MgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFwcC51c2UoJy9hcGknLCBwcm94eSh7dGFyZ2V0OidodHRwOi8vbG9jYWxob3N0OjkwMDAnfSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uZmlnLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICBjb25maWcub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oY29uZmlnLm9wdGlvbnMsIG9wdHMpO1xuICAgIH1cbiAgICBjb25maWd1cmVMb2dnZXIoY29uZmlnLm9wdGlvbnMpO1xuICAgIGlmICghY29uZmlnLm9wdGlvbnMudGFyZ2V0ICYmICFjb25maWcub3B0aW9ucy5yb3V0ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yc18xLkVSUk9SUy5FUlJfQ09ORklHX0ZBQ1RPUllfVEFSR0VUX01JU1NJTkcpO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xufVxuZXhwb3J0cy5jcmVhdGVDb25maWcgPSBjcmVhdGVDb25maWc7XG4vKipcbiAqIENoZWNrcyBpZiBhIFN0cmluZyBvbmx5IHRhcmdldC9jb25maWcgaXMgcHJvdmlkZWQuXG4gKiBUaGlzIGNhbiBiZSBqdXN0IHRoZSBob3N0IG9yIHdpdGggdGhlIG9wdGlvbmFsIHBhdGguXG4gKlxuICogQGV4YW1wbGVcbiAqICAgICAgYXBwLnVzZSgnL2FwaScsIHByb3h5KCdodHRwOi8vbG9jYWxob3N0OjkwMDAnKSk7XG4gKiAgICAgIGFwcC51c2UocHJveHkoJ2h0dHA6Ly9sb2NhbGhvc3Q6OTAwMC9hcGknKSk7XG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSAgY29udGV4dCBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gaXNTdHJpbmdTaG9ydEhhbmQoY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICEhdXJsLnBhcnNlKGNvbnRleHQpLmhvc3Q7XG4gICAgfVxufVxuLyoqXG4gKiBDaGVja3MgaWYgYSBPYmplY3Qgb25seSBjb25maWcgaXMgcHJvdmlkZWQsIHdpdGhvdXQgYSBjb250ZXh0LlxuICogSW4gdGhpcyBjYXNlIHRoZSBhbGwgcGF0aHMgd2lsbCBiZSBwcm94aWVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgICAgYXBwLnVzZSgnL2FwaScsIHByb3h5KHt0YXJnZXQ6J2h0dHA6Ly9sb2NhbGhvc3Q6OTAwMCd9KSk7XG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSAgY29udGV4dCBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHsqfSAgICAgICBvcHRzICAgIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgICAgW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBpc0NvbnRleHRsZXNzKGNvbnRleHQsIG9wdHMpIHtcbiAgICByZXR1cm4gaXNQbGFpbk9iaihjb250ZXh0KSAmJiAob3B0cyA9PSBudWxsIHx8IE9iamVjdC5rZXlzKG9wdHMpLmxlbmd0aCA9PT0gMCk7XG59XG5mdW5jdGlvbiBjb25maWd1cmVMb2dnZXIob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmxvZ0xldmVsKSB7XG4gICAgICAgIGxvZ2dlci5zZXRMZXZlbChvcHRpb25zLmxvZ0xldmVsKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubG9nUHJvdmlkZXIpIHtcbiAgICAgICAgbG9nZ2VyLnNldFByb3ZpZGVyKG9wdGlvbnMubG9nUHJvdmlkZXIpO1xuICAgIH1cbn1cbiIsICIvKiFcbiAqIGlzLWV4dGdsb2IgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLWV4dGdsb2I+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEpvbiBTY2hsaW5rZXJ0LlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNFeHRnbG9iKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgc3RyID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBtYXRjaDtcbiAgd2hpbGUgKChtYXRjaCA9IC8oXFxcXCkufChbQD8hKypdXFwoLipcXCkpL2cuZXhlYyhzdHIpKSkge1xuICAgIGlmIChtYXRjaFsyXSkgcmV0dXJuIHRydWU7XG4gICAgc3RyID0gc3RyLnNsaWNlKG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG4iLCAiLyohXG4gKiBpcy1nbG9iIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1nbG9iPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC5cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuXG52YXIgaXNFeHRnbG9iID0gcmVxdWlyZSgnaXMtZXh0Z2xvYicpO1xudmFyIGNoYXJzID0geyAneyc6ICd9JywgJygnOiAnKScsICdbJzogJ10nfTtcbnZhciBzdHJpY3RDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcGlwZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZVNxdWFyZUluZGV4ID0gLTI7XG4gIHZhciBjbG9zZUN1cmx5SW5kZXggPSAtMjtcbiAgdmFyIGNsb3NlUGFyZW5JbmRleCA9IC0yO1xuICB2YXIgYmFja1NsYXNoSW5kZXggPSAtMjtcbiAgd2hpbGUgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIGlmIChzdHJbaW5kZXhdID09PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bXFxdLispXS8udGVzdChzdHJbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlU3F1YXJlSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICdbJyAmJiBzdHJbaW5kZXggKyAxXSAhPT0gJ10nKSB7XG4gICAgICBpZiAoY2xvc2VTcXVhcmVJbmRleCA8IGluZGV4KSB7XG4gICAgICAgIGNsb3NlU3F1YXJlSW5kZXggPSBzdHIuaW5kZXhPZignXScsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9zZVNxdWFyZUluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlU3F1YXJlSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrU2xhc2hJbmRleCA9IHN0ci5pbmRleE9mKCdcXFxcJywgaW5kZXgpO1xuICAgICAgICBpZiAoYmFja1NsYXNoSW5kZXggPT09IC0xIHx8IGJhY2tTbGFzaEluZGV4ID4gY2xvc2VTcXVhcmVJbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsb3NlQ3VybHlJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJ3snICYmIHN0cltpbmRleCArIDFdICE9PSAnfScpIHtcbiAgICAgIGNsb3NlQ3VybHlJbmRleCA9IHN0ci5pbmRleE9mKCd9JywgaW5kZXgpO1xuICAgICAgaWYgKGNsb3NlQ3VybHlJbmRleCA+IGluZGV4KSB7XG4gICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBpbmRleCk7XG4gICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZUN1cmx5SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjbG9zZVBhcmVuSW5kZXggIT09IC0xICYmIHN0cltpbmRleF0gPT09ICcoJyAmJiBzdHJbaW5kZXggKyAxXSA9PT0gJz8nICYmIC9bOiE9XS8udGVzdChzdHJbaW5kZXggKyAyXSkgJiYgc3RyW2luZGV4ICsgM10gIT09ICcpJykge1xuICAgICAgY2xvc2VQYXJlbkluZGV4ID0gc3RyLmluZGV4T2YoJyknLCBpbmRleCk7XG4gICAgICBpZiAoY2xvc2VQYXJlbkluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgYmFja1NsYXNoSW5kZXggPSBzdHIuaW5kZXhPZignXFxcXCcsIGluZGV4KTtcbiAgICAgICAgaWYgKGJhY2tTbGFzaEluZGV4ID09PSAtMSB8fCBiYWNrU2xhc2hJbmRleCA+IGNsb3NlUGFyZW5JbmRleCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBpcGVJbmRleCAhPT0gLTEgJiYgc3RyW2luZGV4XSA9PT0gJygnICYmIHN0cltpbmRleCArIDFdICE9PSAnfCcpIHtcbiAgICAgIGlmIChwaXBlSW5kZXggPCBpbmRleCkge1xuICAgICAgICBwaXBlSW5kZXggPSBzdHIuaW5kZXhPZignfCcsIGluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChwaXBlSW5kZXggIT09IC0xICYmIHN0cltwaXBlSW5kZXggKyAxXSAhPT0gJyknKSB7XG4gICAgICAgIGNsb3NlUGFyZW5JbmRleCA9IHN0ci5pbmRleE9mKCcpJywgcGlwZUluZGV4KTtcbiAgICAgICAgaWYgKGNsb3NlUGFyZW5JbmRleCA+IHBpcGVJbmRleCkge1xuICAgICAgICAgIGJhY2tTbGFzaEluZGV4ID0gc3RyLmluZGV4T2YoJ1xcXFwnLCBwaXBlSW5kZXgpO1xuICAgICAgICAgIGlmIChiYWNrU2xhc2hJbmRleCA9PT0gLTEgfHwgYmFja1NsYXNoSW5kZXggPiBjbG9zZVBhcmVuSW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIHJlbGF4ZWRDaGVjayA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoc3RyWzBdID09PSAnIScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgaWYgKC9bKj97fSgpW1xcXV0vLnRlc3Qoc3RyW2luZGV4XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzdHJbaW5kZXhdID09PSAnXFxcXCcpIHtcbiAgICAgIHZhciBvcGVuID0gc3RyW2luZGV4ICsgMV07XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgdmFyIGNsb3NlID0gY2hhcnNbb3Blbl07XG5cbiAgICAgIGlmIChjbG9zZSkge1xuICAgICAgICB2YXIgbiA9IHN0ci5pbmRleE9mKGNsb3NlLCBpbmRleCk7XG4gICAgICAgIGlmIChuICE9PSAtMSkge1xuICAgICAgICAgIGluZGV4ID0gbiArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0cltpbmRleF0gPT09ICchJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0dsb2Ioc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzRXh0Z2xvYihzdHIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgY2hlY2sgPSBzdHJpY3RDaGVjaztcblxuICAvLyBvcHRpb25hbGx5IHJlbGF4IGNoZWNrXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc3RyaWN0ID09PSBmYWxzZSkge1xuICAgIGNoZWNrID0gcmVsYXhlZENoZWNrO1xuICB9XG5cbiAgcmV0dXJuIGNoZWNrKHN0cik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5pc0ludGVnZXIgPSBudW0gPT4ge1xuICBpZiAodHlwZW9mIG51bSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcihudW0pO1xuICB9XG4gIGlmICh0eXBlb2YgbnVtID09PSAnc3RyaW5nJyAmJiBudW0udHJpbSgpICE9PSAnJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcihudW0pKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEZpbmQgYSBub2RlIG9mIHRoZSBnaXZlbiB0eXBlXG4gKi9cblxuZXhwb3J0cy5maW5kID0gKG5vZGUsIHR5cGUpID0+IG5vZGUubm9kZXMuZmluZChub2RlID0+IG5vZGUudHlwZSA9PT0gdHlwZSk7XG5cbi8qKlxuICogRmluZCBhIG5vZGUgb2YgdGhlIGdpdmVuIHR5cGVcbiAqL1xuXG5leHBvcnRzLmV4Y2VlZHNMaW1pdCA9IChtaW4sIG1heCwgc3RlcCA9IDEsIGxpbWl0KSA9PiB7XG4gIGlmIChsaW1pdCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFleHBvcnRzLmlzSW50ZWdlcihtaW4pIHx8ICFleHBvcnRzLmlzSW50ZWdlcihtYXgpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoKE51bWJlcihtYXgpIC0gTnVtYmVyKG1pbikpIC8gTnVtYmVyKHN0ZXApKSA+PSBsaW1pdDtcbn07XG5cbi8qKlxuICogRXNjYXBlIHRoZSBnaXZlbiBub2RlIHdpdGggJ1xcXFwnIGJlZm9yZSBub2RlLnZhbHVlXG4gKi9cblxuZXhwb3J0cy5lc2NhcGVOb2RlID0gKGJsb2NrLCBuID0gMCwgdHlwZSkgPT4ge1xuICBsZXQgbm9kZSA9IGJsb2NrLm5vZGVzW25dO1xuICBpZiAoIW5vZGUpIHJldHVybjtcblxuICBpZiAoKHR5cGUgJiYgbm9kZS50eXBlID09PSB0eXBlKSB8fCBub2RlLnR5cGUgPT09ICdvcGVuJyB8fCBub2RlLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICBpZiAobm9kZS5lc2NhcGVkICE9PSB0cnVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gJ1xcXFwnICsgbm9kZS52YWx1ZTtcbiAgICAgIG5vZGUuZXNjYXBlZCA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnJhY2Ugbm9kZSBzaG91bGQgYmUgZW5jbG9zZWQgaW4gbGl0ZXJhbCBicmFjZXNcbiAqL1xuXG5leHBvcnRzLmVuY2xvc2VCcmFjZSA9IG5vZGUgPT4ge1xuICBpZiAobm9kZS50eXBlICE9PSAnYnJhY2UnKSByZXR1cm4gZmFsc2U7XG4gIGlmICgobm9kZS5jb21tYXMgPj4gMCArIG5vZGUucmFuZ2VzID4+IDApID09PSAwKSB7XG4gICAgbm9kZS5pbnZhbGlkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIGJyYWNlIG5vZGUgaXMgaW52YWxpZC5cbiAqL1xuXG5leHBvcnRzLmlzSW52YWxpZEJyYWNlID0gYmxvY2sgPT4ge1xuICBpZiAoYmxvY2sudHlwZSAhPT0gJ2JyYWNlJykgcmV0dXJuIGZhbHNlO1xuICBpZiAoYmxvY2suaW52YWxpZCA9PT0gdHJ1ZSB8fCBibG9jay5kb2xsYXIpIHJldHVybiB0cnVlO1xuICBpZiAoKGJsb2NrLmNvbW1hcyA+PiAwICsgYmxvY2sucmFuZ2VzID4+IDApID09PSAwKSB7XG4gICAgYmxvY2suaW52YWxpZCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGJsb2NrLm9wZW4gIT09IHRydWUgfHwgYmxvY2suY2xvc2UgIT09IHRydWUpIHtcbiAgICBibG9jay5pbnZhbGlkID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhIG5vZGUgaXMgYW4gb3BlbiBvciBjbG9zZSBub2RlXG4gKi9cblxuZXhwb3J0cy5pc09wZW5PckNsb3NlID0gbm9kZSA9PiB7XG4gIGlmIChub2RlLnR5cGUgPT09ICdvcGVuJyB8fCBub2RlLnR5cGUgPT09ICdjbG9zZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gbm9kZS5vcGVuID09PSB0cnVlIHx8IG5vZGUuY2xvc2UgPT09IHRydWU7XG59O1xuXG4vKipcbiAqIFJlZHVjZSBhbiBhcnJheSBvZiB0ZXh0IG5vZGVzLlxuICovXG5cbmV4cG9ydHMucmVkdWNlID0gbm9kZXMgPT4gbm9kZXMucmVkdWNlKChhY2MsIG5vZGUpID0+IHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3RleHQnKSBhY2MucHVzaChub2RlLnZhbHVlKTtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ3JhbmdlJykgbm9kZS50eXBlID0gJ3RleHQnO1xuICByZXR1cm4gYWNjO1xufSwgW10pO1xuXG4vKipcbiAqIEZsYXR0ZW4gYW4gYXJyYXlcbiAqL1xuXG5leHBvcnRzLmZsYXR0ZW4gPSAoLi4uYXJncykgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgY29uc3QgZmxhdCA9IGFyciA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBlbGUgPSBhcnJbaV07XG4gICAgICBBcnJheS5pc0FycmF5KGVsZSkgPyBmbGF0KGVsZSwgcmVzdWx0KSA6IGVsZSAhPT0gdm9pZCAwICYmIHJlc3VsdC5wdXNoKGVsZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIGZsYXQoYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKGFzdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCBzdHJpbmdpZnkgPSAobm9kZSwgcGFyZW50ID0ge30pID0+IHtcbiAgICBsZXQgaW52YWxpZEJsb2NrID0gb3B0aW9ucy5lc2NhcGVJbnZhbGlkICYmIHV0aWxzLmlzSW52YWxpZEJyYWNlKHBhcmVudCk7XG4gICAgbGV0IGludmFsaWROb2RlID0gbm9kZS5pbnZhbGlkID09PSB0cnVlICYmIG9wdGlvbnMuZXNjYXBlSW52YWxpZCA9PT0gdHJ1ZTtcbiAgICBsZXQgb3V0cHV0ID0gJyc7XG5cbiAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgaWYgKChpbnZhbGlkQmxvY2sgfHwgaW52YWxpZE5vZGUpICYmIHV0aWxzLmlzT3Blbk9yQ2xvc2Uobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuICdcXFxcJyArIG5vZGUudmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS52YWx1ZSkge1xuICAgICAgcmV0dXJuIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMpIHtcbiAgICAgIGZvciAobGV0IGNoaWxkIG9mIG5vZGUubm9kZXMpIHtcbiAgICAgICAgb3V0cHV0ICs9IHN0cmluZ2lmeShjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShhc3QpO1xufTtcblxuIiwgIi8qIVxuICogaXMtbnVtYmVyIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1udW1iZXI+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihudW0pIHtcbiAgaWYgKHR5cGVvZiBudW0gPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIG51bSAtIG51bSA9PT0gMDtcbiAgfVxuICBpZiAodHlwZW9mIG51bSA9PT0gJ3N0cmluZycgJiYgbnVtLnRyaW0oKSAhPT0gJycpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlID8gTnVtYmVyLmlzRmluaXRlKCtudW0pIDogaXNGaW5pdGUoK251bSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcbiIsICIvKiFcbiAqIHRvLXJlZ2V4LXJhbmdlIDxodHRwczovL2dpdGh1Yi5jb20vbWljcm9tYXRjaC90by1yZWdleC1yYW5nZT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBpc051bWJlciA9IHJlcXVpcmUoJ2lzLW51bWJlcicpO1xuXG5jb25zdCB0b1JlZ2V4UmFuZ2UgPSAobWluLCBtYXgsIG9wdGlvbnMpID0+IHtcbiAgaWYgKGlzTnVtYmVyKG1pbikgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndG9SZWdleFJhbmdlOiBleHBlY3RlZCB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYmUgYSBudW1iZXInKTtcbiAgfVxuXG4gIGlmIChtYXggPT09IHZvaWQgMCB8fCBtaW4gPT09IG1heCkge1xuICAgIHJldHVybiBTdHJpbmcobWluKTtcbiAgfVxuXG4gIGlmIChpc051bWJlcihtYXgpID09PSBmYWxzZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RvUmVnZXhSYW5nZTogZXhwZWN0ZWQgdGhlIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIG51bWJlci4nKTtcbiAgfVxuXG4gIGxldCBvcHRzID0geyByZWxheFplcm9zOiB0cnVlLCAuLi5vcHRpb25zIH07XG4gIGlmICh0eXBlb2Ygb3B0cy5zdHJpY3RaZXJvcyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgb3B0cy5yZWxheFplcm9zID0gb3B0cy5zdHJpY3RaZXJvcyA9PT0gZmFsc2U7XG4gIH1cblxuICBsZXQgcmVsYXggPSBTdHJpbmcob3B0cy5yZWxheFplcm9zKTtcbiAgbGV0IHNob3J0aGFuZCA9IFN0cmluZyhvcHRzLnNob3J0aGFuZCk7XG4gIGxldCBjYXB0dXJlID0gU3RyaW5nKG9wdHMuY2FwdHVyZSk7XG4gIGxldCB3cmFwID0gU3RyaW5nKG9wdHMud3JhcCk7XG4gIGxldCBjYWNoZUtleSA9IG1pbiArICc6JyArIG1heCArICc9JyArIHJlbGF4ICsgc2hvcnRoYW5kICsgY2FwdHVyZSArIHdyYXA7XG5cbiAgaWYgKHRvUmVnZXhSYW5nZS5jYWNoZS5oYXNPd25Qcm9wZXJ0eShjYWNoZUtleSkpIHtcbiAgICByZXR1cm4gdG9SZWdleFJhbmdlLmNhY2hlW2NhY2hlS2V5XS5yZXN1bHQ7XG4gIH1cblxuICBsZXQgYSA9IE1hdGgubWluKG1pbiwgbWF4KTtcbiAgbGV0IGIgPSBNYXRoLm1heChtaW4sIG1heCk7XG5cbiAgaWYgKE1hdGguYWJzKGEgLSBiKSA9PT0gMSkge1xuICAgIGxldCByZXN1bHQgPSBtaW4gKyAnfCcgKyBtYXg7XG4gICAgaWYgKG9wdHMuY2FwdHVyZSkge1xuICAgICAgcmV0dXJuIGAoJHtyZXN1bHR9KWA7XG4gICAgfVxuICAgIGlmIChvcHRzLndyYXAgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gYCg/OiR7cmVzdWx0fSlgO1xuICB9XG5cbiAgbGV0IGlzUGFkZGVkID0gaGFzUGFkZGluZyhtaW4pIHx8IGhhc1BhZGRpbmcobWF4KTtcbiAgbGV0IHN0YXRlID0geyBtaW4sIG1heCwgYSwgYiB9O1xuICBsZXQgcG9zaXRpdmVzID0gW107XG4gIGxldCBuZWdhdGl2ZXMgPSBbXTtcblxuICBpZiAoaXNQYWRkZWQpIHtcbiAgICBzdGF0ZS5pc1BhZGRlZCA9IGlzUGFkZGVkO1xuICAgIHN0YXRlLm1heExlbiA9IFN0cmluZyhzdGF0ZS5tYXgpLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChhIDwgMCkge1xuICAgIGxldCBuZXdNaW4gPSBiIDwgMCA/IE1hdGguYWJzKGIpIDogMTtcbiAgICBuZWdhdGl2ZXMgPSBzcGxpdFRvUGF0dGVybnMobmV3TWluLCBNYXRoLmFicyhhKSwgc3RhdGUsIG9wdHMpO1xuICAgIGEgPSBzdGF0ZS5hID0gMDtcbiAgfVxuXG4gIGlmIChiID49IDApIHtcbiAgICBwb3NpdGl2ZXMgPSBzcGxpdFRvUGF0dGVybnMoYSwgYiwgc3RhdGUsIG9wdHMpO1xuICB9XG5cbiAgc3RhdGUubmVnYXRpdmVzID0gbmVnYXRpdmVzO1xuICBzdGF0ZS5wb3NpdGl2ZXMgPSBwb3NpdGl2ZXM7XG4gIHN0YXRlLnJlc3VsdCA9IGNvbGxhdGVQYXR0ZXJucyhuZWdhdGl2ZXMsIHBvc2l0aXZlcywgb3B0cyk7XG5cbiAgaWYgKG9wdHMuY2FwdHVyZSA9PT0gdHJ1ZSkge1xuICAgIHN0YXRlLnJlc3VsdCA9IGAoJHtzdGF0ZS5yZXN1bHR9KWA7XG4gIH0gZWxzZSBpZiAob3B0cy53cmFwICE9PSBmYWxzZSAmJiAocG9zaXRpdmVzLmxlbmd0aCArIG5lZ2F0aXZlcy5sZW5ndGgpID4gMSkge1xuICAgIHN0YXRlLnJlc3VsdCA9IGAoPzoke3N0YXRlLnJlc3VsdH0pYDtcbiAgfVxuXG4gIHRvUmVnZXhSYW5nZS5jYWNoZVtjYWNoZUtleV0gPSBzdGF0ZTtcbiAgcmV0dXJuIHN0YXRlLnJlc3VsdDtcbn07XG5cbmZ1bmN0aW9uIGNvbGxhdGVQYXR0ZXJucyhuZWcsIHBvcywgb3B0aW9ucykge1xuICBsZXQgb25seU5lZ2F0aXZlID0gZmlsdGVyUGF0dGVybnMobmVnLCBwb3MsICctJywgZmFsc2UsIG9wdGlvbnMpIHx8IFtdO1xuICBsZXQgb25seVBvc2l0aXZlID0gZmlsdGVyUGF0dGVybnMocG9zLCBuZWcsICcnLCBmYWxzZSwgb3B0aW9ucykgfHwgW107XG4gIGxldCBpbnRlcnNlY3RlZCA9IGZpbHRlclBhdHRlcm5zKG5lZywgcG9zLCAnLT8nLCB0cnVlLCBvcHRpb25zKSB8fCBbXTtcbiAgbGV0IHN1YnBhdHRlcm5zID0gb25seU5lZ2F0aXZlLmNvbmNhdChpbnRlcnNlY3RlZCkuY29uY2F0KG9ubHlQb3NpdGl2ZSk7XG4gIHJldHVybiBzdWJwYXR0ZXJucy5qb2luKCd8Jyk7XG59XG5cbmZ1bmN0aW9uIHNwbGl0VG9SYW5nZXMobWluLCBtYXgpIHtcbiAgbGV0IG5pbmVzID0gMTtcbiAgbGV0IHplcm9zID0gMTtcblxuICBsZXQgc3RvcCA9IGNvdW50TmluZXMobWluLCBuaW5lcyk7XG4gIGxldCBzdG9wcyA9IG5ldyBTZXQoW21heF0pO1xuXG4gIHdoaWxlIChtaW4gPD0gc3RvcCAmJiBzdG9wIDw9IG1heCkge1xuICAgIHN0b3BzLmFkZChzdG9wKTtcbiAgICBuaW5lcyArPSAxO1xuICAgIHN0b3AgPSBjb3VudE5pbmVzKG1pbiwgbmluZXMpO1xuICB9XG5cbiAgc3RvcCA9IGNvdW50WmVyb3MobWF4ICsgMSwgemVyb3MpIC0gMTtcblxuICB3aGlsZSAobWluIDwgc3RvcCAmJiBzdG9wIDw9IG1heCkge1xuICAgIHN0b3BzLmFkZChzdG9wKTtcbiAgICB6ZXJvcyArPSAxO1xuICAgIHN0b3AgPSBjb3VudFplcm9zKG1heCArIDEsIHplcm9zKSAtIDE7XG4gIH1cblxuICBzdG9wcyA9IFsuLi5zdG9wc107XG4gIHN0b3BzLnNvcnQoY29tcGFyZSk7XG4gIHJldHVybiBzdG9wcztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgcmFuZ2UgdG8gYSByZWdleCBwYXR0ZXJuXG4gKiBAcGFyYW0ge051bWJlcn0gYHN0YXJ0YFxuICogQHBhcmFtIHtOdW1iZXJ9IGBzdG9wYFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIHJhbmdlVG9QYXR0ZXJuKHN0YXJ0LCBzdG9wLCBvcHRpb25zKSB7XG4gIGlmIChzdGFydCA9PT0gc3RvcCkge1xuICAgIHJldHVybiB7IHBhdHRlcm46IHN0YXJ0LCBjb3VudDogW10sIGRpZ2l0czogMCB9O1xuICB9XG5cbiAgbGV0IHppcHBlZCA9IHppcChzdGFydCwgc3RvcCk7XG4gIGxldCBkaWdpdHMgPSB6aXBwZWQubGVuZ3RoO1xuICBsZXQgcGF0dGVybiA9ICcnO1xuICBsZXQgY291bnQgPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlnaXRzOyBpKyspIHtcbiAgICBsZXQgW3N0YXJ0RGlnaXQsIHN0b3BEaWdpdF0gPSB6aXBwZWRbaV07XG5cbiAgICBpZiAoc3RhcnREaWdpdCA9PT0gc3RvcERpZ2l0KSB7XG4gICAgICBwYXR0ZXJuICs9IHN0YXJ0RGlnaXQ7XG5cbiAgICB9IGVsc2UgaWYgKHN0YXJ0RGlnaXQgIT09ICcwJyB8fCBzdG9wRGlnaXQgIT09ICc5Jykge1xuICAgICAgcGF0dGVybiArPSB0b0NoYXJhY3RlckNsYXNzKHN0YXJ0RGlnaXQsIHN0b3BEaWdpdCwgb3B0aW9ucyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH1cblxuICBpZiAoY291bnQpIHtcbiAgICBwYXR0ZXJuICs9IG9wdGlvbnMuc2hvcnRoYW5kID09PSB0cnVlID8gJ1xcXFxkJyA6ICdbMC05XSc7XG4gIH1cblxuICByZXR1cm4geyBwYXR0ZXJuLCBjb3VudDogW2NvdW50XSwgZGlnaXRzIH07XG59XG5cbmZ1bmN0aW9uIHNwbGl0VG9QYXR0ZXJucyhtaW4sIG1heCwgdG9rLCBvcHRpb25zKSB7XG4gIGxldCByYW5nZXMgPSBzcGxpdFRvUmFuZ2VzKG1pbiwgbWF4KTtcbiAgbGV0IHRva2VucyA9IFtdO1xuICBsZXQgc3RhcnQgPSBtaW47XG4gIGxldCBwcmV2O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IG1heCA9IHJhbmdlc1tpXTtcbiAgICBsZXQgb2JqID0gcmFuZ2VUb1BhdHRlcm4oU3RyaW5nKHN0YXJ0KSwgU3RyaW5nKG1heCksIG9wdGlvbnMpO1xuICAgIGxldCB6ZXJvcyA9ICcnO1xuXG4gICAgaWYgKCF0b2suaXNQYWRkZWQgJiYgcHJldiAmJiBwcmV2LnBhdHRlcm4gPT09IG9iai5wYXR0ZXJuKSB7XG4gICAgICBpZiAocHJldi5jb3VudC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHByZXYuY291bnQucG9wKCk7XG4gICAgICB9XG5cbiAgICAgIHByZXYuY291bnQucHVzaChvYmouY291bnRbMF0pO1xuICAgICAgcHJldi5zdHJpbmcgPSBwcmV2LnBhdHRlcm4gKyB0b1F1YW50aWZpZXIocHJldi5jb3VudCk7XG4gICAgICBzdGFydCA9IG1heCArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodG9rLmlzUGFkZGVkKSB7XG4gICAgICB6ZXJvcyA9IHBhZFplcm9zKG1heCwgdG9rLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBvYmouc3RyaW5nID0gemVyb3MgKyBvYmoucGF0dGVybiArIHRvUXVhbnRpZmllcihvYmouY291bnQpO1xuICAgIHRva2Vucy5wdXNoKG9iaik7XG4gICAgc3RhcnQgPSBtYXggKyAxO1xuICAgIHByZXYgPSBvYmo7XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJQYXR0ZXJucyhhcnIsIGNvbXBhcmlzb24sIHByZWZpeCwgaW50ZXJzZWN0aW9uLCBvcHRpb25zKSB7XG4gIGxldCByZXN1bHQgPSBbXTtcblxuICBmb3IgKGxldCBlbGUgb2YgYXJyKSB7XG4gICAgbGV0IHsgc3RyaW5nIH0gPSBlbGU7XG5cbiAgICAvLyBvbmx5IHB1c2ggaWYgX2JvdGhfIGFyZSBuZWdhdGl2ZS4uLlxuICAgIGlmICghaW50ZXJzZWN0aW9uICYmICFjb250YWlucyhjb21wYXJpc29uLCAnc3RyaW5nJywgc3RyaW5nKSkge1xuICAgICAgcmVzdWx0LnB1c2gocHJlZml4ICsgc3RyaW5nKTtcbiAgICB9XG5cbiAgICAvLyBvciBfYm90aF8gYXJlIHBvc2l0aXZlXG4gICAgaWYgKGludGVyc2VjdGlvbiAmJiBjb250YWlucyhjb21wYXJpc29uLCAnc3RyaW5nJywgc3RyaW5nKSkge1xuICAgICAgcmVzdWx0LnB1c2gocHJlZml4ICsgc3RyaW5nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBaaXAgc3RyaW5nc1xuICovXG5cbmZ1bmN0aW9uIHppcChhLCBiKSB7XG4gIGxldCBhcnIgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSBhcnIucHVzaChbYVtpXSwgYltpXV0pO1xuICByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgcmV0dXJuIGEgPiBiID8gMSA6IGIgPiBhID8gLTEgOiAwO1xufVxuXG5mdW5jdGlvbiBjb250YWlucyhhcnIsIGtleSwgdmFsKSB7XG4gIHJldHVybiBhcnIuc29tZShlbGUgPT4gZWxlW2tleV0gPT09IHZhbCk7XG59XG5cbmZ1bmN0aW9uIGNvdW50TmluZXMobWluLCBsZW4pIHtcbiAgcmV0dXJuIE51bWJlcihTdHJpbmcobWluKS5zbGljZSgwLCAtbGVuKSArICc5Jy5yZXBlYXQobGVuKSk7XG59XG5cbmZ1bmN0aW9uIGNvdW50WmVyb3MoaW50ZWdlciwgemVyb3MpIHtcbiAgcmV0dXJuIGludGVnZXIgLSAoaW50ZWdlciAlIE1hdGgucG93KDEwLCB6ZXJvcykpO1xufVxuXG5mdW5jdGlvbiB0b1F1YW50aWZpZXIoZGlnaXRzKSB7XG4gIGxldCBbc3RhcnQgPSAwLCBzdG9wID0gJyddID0gZGlnaXRzO1xuICBpZiAoc3RvcCB8fCBzdGFydCA+IDEpIHtcbiAgICByZXR1cm4gYHske3N0YXJ0ICsgKHN0b3AgPyAnLCcgKyBzdG9wIDogJycpfX1gO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gdG9DaGFyYWN0ZXJDbGFzcyhhLCBiLCBvcHRpb25zKSB7XG4gIHJldHVybiBgWyR7YX0keyhiIC0gYSA9PT0gMSkgPyAnJyA6ICctJ30ke2J9XWA7XG59XG5cbmZ1bmN0aW9uIGhhc1BhZGRpbmcoc3RyKSB7XG4gIHJldHVybiAvXi0/KDArKVxcZC8udGVzdChzdHIpO1xufVxuXG5mdW5jdGlvbiBwYWRaZXJvcyh2YWx1ZSwgdG9rLCBvcHRpb25zKSB7XG4gIGlmICghdG9rLmlzUGFkZGVkKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgbGV0IGRpZmYgPSBNYXRoLmFicyh0b2subWF4TGVuIC0gU3RyaW5nKHZhbHVlKS5sZW5ndGgpO1xuICBsZXQgcmVsYXggPSBvcHRpb25zLnJlbGF4WmVyb3MgIT09IGZhbHNlO1xuXG4gIHN3aXRjaCAoZGlmZikge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiAnJztcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gcmVsYXggPyAnMD8nIDogJzAnO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiByZWxheCA/ICcwezAsMn0nIDogJzAwJztcbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gcmVsYXggPyBgMHswLCR7ZGlmZn19YCA6IGAweyR7ZGlmZn19YDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDYWNoZVxuICovXG5cbnRvUmVnZXhSYW5nZS5jYWNoZSA9IHt9O1xudG9SZWdleFJhbmdlLmNsZWFyQ2FjaGUgPSAoKSA9PiAodG9SZWdleFJhbmdlLmNhY2hlID0ge30pO1xuXG4vKipcbiAqIEV4cG9zZSBgdG9SZWdleFJhbmdlYFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdG9SZWdleFJhbmdlO1xuIiwgIi8qIVxuICogZmlsbC1yYW5nZSA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvZmlsbC1yYW5nZT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgSm9uIFNjaGxpbmtlcnQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuY29uc3QgdG9SZWdleFJhbmdlID0gcmVxdWlyZSgndG8tcmVnZXgtcmFuZ2UnKTtcblxuY29uc3QgaXNPYmplY3QgPSB2YWwgPT4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbmNvbnN0IHRyYW5zZm9ybSA9IHRvTnVtYmVyID0+IHtcbiAgcmV0dXJuIHZhbHVlID0+IHRvTnVtYmVyID09PSB0cnVlID8gTnVtYmVyKHZhbHVlKSA6IFN0cmluZyh2YWx1ZSk7XG59O1xuXG5jb25zdCBpc1ZhbGlkVmFsdWUgPSB2YWx1ZSA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlICE9PSAnJyk7XG59O1xuXG5jb25zdCBpc051bWJlciA9IG51bSA9PiBOdW1iZXIuaXNJbnRlZ2VyKCtudW0pO1xuXG5jb25zdCB6ZXJvcyA9IGlucHV0ID0+IHtcbiAgbGV0IHZhbHVlID0gYCR7aW5wdXR9YDtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGlmICh2YWx1ZVswXSA9PT0gJy0nKSB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICBpZiAodmFsdWUgPT09ICcwJykgcmV0dXJuIGZhbHNlO1xuICB3aGlsZSAodmFsdWVbKytpbmRleF0gPT09ICcwJyk7XG4gIHJldHVybiBpbmRleCA+IDA7XG59O1xuXG5jb25zdCBzdHJpbmdpZnkgPSAoc3RhcnQsIGVuZCwgb3B0aW9ucykgPT4ge1xuICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBvcHRpb25zLnN0cmluZ2lmeSA9PT0gdHJ1ZTtcbn07XG5cbmNvbnN0IHBhZCA9IChpbnB1dCwgbWF4TGVuZ3RoLCB0b051bWJlcikgPT4ge1xuICBpZiAobWF4TGVuZ3RoID4gMCkge1xuICAgIGxldCBkYXNoID0gaW5wdXRbMF0gPT09ICctJyA/ICctJyA6ICcnO1xuICAgIGlmIChkYXNoKSBpbnB1dCA9IGlucHV0LnNsaWNlKDEpO1xuICAgIGlucHV0ID0gKGRhc2ggKyBpbnB1dC5wYWRTdGFydChkYXNoID8gbWF4TGVuZ3RoIC0gMSA6IG1heExlbmd0aCwgJzAnKSk7XG4gIH1cbiAgaWYgKHRvTnVtYmVyID09PSBmYWxzZSkge1xuICAgIHJldHVybiBTdHJpbmcoaW5wdXQpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn07XG5cbmNvbnN0IHRvTWF4TGVuID0gKGlucHV0LCBtYXhMZW5ndGgpID0+IHtcbiAgbGV0IG5lZ2F0aXZlID0gaW5wdXRbMF0gPT09ICctJyA/ICctJyA6ICcnO1xuICBpZiAobmVnYXRpdmUpIHtcbiAgICBpbnB1dCA9IGlucHV0LnNsaWNlKDEpO1xuICAgIG1heExlbmd0aC0tO1xuICB9XG4gIHdoaWxlIChpbnB1dC5sZW5ndGggPCBtYXhMZW5ndGgpIGlucHV0ID0gJzAnICsgaW5wdXQ7XG4gIHJldHVybiBuZWdhdGl2ZSA/ICgnLScgKyBpbnB1dCkgOiBpbnB1dDtcbn07XG5cbmNvbnN0IHRvU2VxdWVuY2UgPSAocGFydHMsIG9wdGlvbnMpID0+IHtcbiAgcGFydHMubmVnYXRpdmVzLnNvcnQoKGEsIGIpID0+IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcbiAgcGFydHMucG9zaXRpdmVzLnNvcnQoKGEsIGIpID0+IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcblxuICBsZXQgcHJlZml4ID0gb3B0aW9ucy5jYXB0dXJlID8gJycgOiAnPzonO1xuICBsZXQgcG9zaXRpdmVzID0gJyc7XG4gIGxldCBuZWdhdGl2ZXMgPSAnJztcbiAgbGV0IHJlc3VsdDtcblxuICBpZiAocGFydHMucG9zaXRpdmVzLmxlbmd0aCkge1xuICAgIHBvc2l0aXZlcyA9IHBhcnRzLnBvc2l0aXZlcy5qb2luKCd8Jyk7XG4gIH1cblxuICBpZiAocGFydHMubmVnYXRpdmVzLmxlbmd0aCkge1xuICAgIG5lZ2F0aXZlcyA9IGAtKCR7cHJlZml4fSR7cGFydHMubmVnYXRpdmVzLmpvaW4oJ3wnKX0pYDtcbiAgfVxuXG4gIGlmIChwb3NpdGl2ZXMgJiYgbmVnYXRpdmVzKSB7XG4gICAgcmVzdWx0ID0gYCR7cG9zaXRpdmVzfXwke25lZ2F0aXZlc31gO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9IHBvc2l0aXZlcyB8fCBuZWdhdGl2ZXM7XG4gIH1cblxuICBpZiAob3B0aW9ucy53cmFwKSB7XG4gICAgcmV0dXJuIGAoJHtwcmVmaXh9JHtyZXN1bHR9KWA7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgdG9SYW5nZSA9IChhLCBiLCBpc051bWJlcnMsIG9wdGlvbnMpID0+IHtcbiAgaWYgKGlzTnVtYmVycykge1xuICAgIHJldHVybiB0b1JlZ2V4UmFuZ2UoYSwgYiwgeyB3cmFwOiBmYWxzZSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIGxldCBzdGFydCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7XG4gIGlmIChhID09PSBiKSByZXR1cm4gc3RhcnQ7XG5cbiAgbGV0IHN0b3AgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO1xuICByZXR1cm4gYFske3N0YXJ0fS0ke3N0b3B9XWA7XG59O1xuXG5jb25zdCB0b1JlZ2V4ID0gKHN0YXJ0LCBlbmQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RhcnQpKSB7XG4gICAgbGV0IHdyYXAgPSBvcHRpb25zLndyYXAgPT09IHRydWU7XG4gICAgbGV0IHByZWZpeCA9IG9wdGlvbnMuY2FwdHVyZSA/ICcnIDogJz86JztcbiAgICByZXR1cm4gd3JhcCA/IGAoJHtwcmVmaXh9JHtzdGFydC5qb2luKCd8Jyl9KWAgOiBzdGFydC5qb2luKCd8Jyk7XG4gIH1cbiAgcmV0dXJuIHRvUmVnZXhSYW5nZShzdGFydCwgZW5kLCBvcHRpb25zKTtcbn07XG5cbmNvbnN0IHJhbmdlRXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICByZXR1cm4gbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgcmFuZ2UgYXJndW1lbnRzOiAnICsgdXRpbC5pbnNwZWN0KC4uLmFyZ3MpKTtcbn07XG5cbmNvbnN0IGludmFsaWRSYW5nZSA9IChzdGFydCwgZW5kLCBvcHRpb25zKSA9PiB7XG4gIGlmIChvcHRpb25zLnN0cmljdFJhbmdlcyA9PT0gdHJ1ZSkgdGhyb3cgcmFuZ2VFcnJvcihbc3RhcnQsIGVuZF0pO1xuICByZXR1cm4gW107XG59O1xuXG5jb25zdCBpbnZhbGlkU3RlcCA9IChzdGVwLCBvcHRpb25zKSA9PiB7XG4gIGlmIChvcHRpb25zLnN0cmljdFJhbmdlcyA9PT0gdHJ1ZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIHN0ZXAgXCIke3N0ZXB9XCIgdG8gYmUgYSBudW1iZXJgKTtcbiAgfVxuICByZXR1cm4gW107XG59O1xuXG5jb25zdCBmaWxsTnVtYmVycyA9IChzdGFydCwgZW5kLCBzdGVwID0gMSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCBhID0gTnVtYmVyKHN0YXJ0KTtcbiAgbGV0IGIgPSBOdW1iZXIoZW5kKTtcblxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoYSkgfHwgIU51bWJlci5pc0ludGVnZXIoYikpIHtcbiAgICBpZiAob3B0aW9ucy5zdHJpY3RSYW5nZXMgPT09IHRydWUpIHRocm93IHJhbmdlRXJyb3IoW3N0YXJ0LCBlbmRdKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyBmaXggbmVnYXRpdmUgemVyb1xuICBpZiAoYSA9PT0gMCkgYSA9IDA7XG4gIGlmIChiID09PSAwKSBiID0gMDtcblxuICBsZXQgZGVzY2VuZGluZyA9IGEgPiBiO1xuICBsZXQgc3RhcnRTdHJpbmcgPSBTdHJpbmcoc3RhcnQpO1xuICBsZXQgZW5kU3RyaW5nID0gU3RyaW5nKGVuZCk7XG4gIGxldCBzdGVwU3RyaW5nID0gU3RyaW5nKHN0ZXApO1xuICBzdGVwID0gTWF0aC5tYXgoTWF0aC5hYnMoc3RlcCksIDEpO1xuXG4gIGxldCBwYWRkZWQgPSB6ZXJvcyhzdGFydFN0cmluZykgfHwgemVyb3MoZW5kU3RyaW5nKSB8fCB6ZXJvcyhzdGVwU3RyaW5nKTtcbiAgbGV0IG1heExlbiA9IHBhZGRlZCA/IE1hdGgubWF4KHN0YXJ0U3RyaW5nLmxlbmd0aCwgZW5kU3RyaW5nLmxlbmd0aCwgc3RlcFN0cmluZy5sZW5ndGgpIDogMDtcbiAgbGV0IHRvTnVtYmVyID0gcGFkZGVkID09PSBmYWxzZSAmJiBzdHJpbmdpZnkoc3RhcnQsIGVuZCwgb3B0aW9ucykgPT09IGZhbHNlO1xuICBsZXQgZm9ybWF0ID0gb3B0aW9ucy50cmFuc2Zvcm0gfHwgdHJhbnNmb3JtKHRvTnVtYmVyKTtcblxuICBpZiAob3B0aW9ucy50b1JlZ2V4ICYmIHN0ZXAgPT09IDEpIHtcbiAgICByZXR1cm4gdG9SYW5nZSh0b01heExlbihzdGFydCwgbWF4TGVuKSwgdG9NYXhMZW4oZW5kLCBtYXhMZW4pLCB0cnVlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IHsgbmVnYXRpdmVzOiBbXSwgcG9zaXRpdmVzOiBbXSB9O1xuICBsZXQgcHVzaCA9IG51bSA9PiBwYXJ0c1tudW0gPCAwID8gJ25lZ2F0aXZlcycgOiAncG9zaXRpdmVzJ10ucHVzaChNYXRoLmFicyhudW0pKTtcbiAgbGV0IHJhbmdlID0gW107XG4gIGxldCBpbmRleCA9IDA7XG5cbiAgd2hpbGUgKGRlc2NlbmRpbmcgPyBhID49IGIgOiBhIDw9IGIpIHtcbiAgICBpZiAob3B0aW9ucy50b1JlZ2V4ID09PSB0cnVlICYmIHN0ZXAgPiAxKSB7XG4gICAgICBwdXNoKGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZS5wdXNoKHBhZChmb3JtYXQoYSwgaW5kZXgpLCBtYXhMZW4sIHRvTnVtYmVyKSk7XG4gICAgfVxuICAgIGEgPSBkZXNjZW5kaW5nID8gYSAtIHN0ZXAgOiBhICsgc3RlcDtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBzdGVwID4gMVxuICAgICAgPyB0b1NlcXVlbmNlKHBhcnRzLCBvcHRpb25zKVxuICAgICAgOiB0b1JlZ2V4KHJhbmdlLCBudWxsLCB7IHdyYXA6IGZhbHNlLCAuLi5vcHRpb25zIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJhbmdlO1xufTtcblxuY29uc3QgZmlsbExldHRlcnMgPSAoc3RhcnQsIGVuZCwgc3RlcCA9IDEsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoKCFpc051bWJlcihzdGFydCkgJiYgc3RhcnQubGVuZ3RoID4gMSkgfHwgKCFpc051bWJlcihlbmQpICYmIGVuZC5sZW5ndGggPiAxKSkge1xuICAgIHJldHVybiBpbnZhbGlkUmFuZ2Uoc3RhcnQsIGVuZCwgb3B0aW9ucyk7XG4gIH1cblxuXG4gIGxldCBmb3JtYXQgPSBvcHRpb25zLnRyYW5zZm9ybSB8fCAodmFsID0+IFN0cmluZy5mcm9tQ2hhckNvZGUodmFsKSk7XG4gIGxldCBhID0gYCR7c3RhcnR9YC5jaGFyQ29kZUF0KDApO1xuICBsZXQgYiA9IGAke2VuZH1gLmNoYXJDb2RlQXQoMCk7XG5cbiAgbGV0IGRlc2NlbmRpbmcgPSBhID4gYjtcbiAgbGV0IG1pbiA9IE1hdGgubWluKGEsIGIpO1xuICBsZXQgbWF4ID0gTWF0aC5tYXgoYSwgYik7XG5cbiAgaWYgKG9wdGlvbnMudG9SZWdleCAmJiBzdGVwID09PSAxKSB7XG4gICAgcmV0dXJuIHRvUmFuZ2UobWluLCBtYXgsIGZhbHNlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGxldCByYW5nZSA9IFtdO1xuICBsZXQgaW5kZXggPSAwO1xuXG4gIHdoaWxlIChkZXNjZW5kaW5nID8gYSA+PSBiIDogYSA8PSBiKSB7XG4gICAgcmFuZ2UucHVzaChmb3JtYXQoYSwgaW5kZXgpKTtcbiAgICBhID0gZGVzY2VuZGluZyA/IGEgLSBzdGVwIDogYSArIHN0ZXA7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIGlmIChvcHRpb25zLnRvUmVnZXggPT09IHRydWUpIHtcbiAgICByZXR1cm4gdG9SZWdleChyYW5nZSwgbnVsbCwgeyB3cmFwOiBmYWxzZSwgb3B0aW9ucyB9KTtcbiAgfVxuXG4gIHJldHVybiByYW5nZTtcbn07XG5cbmNvbnN0IGZpbGwgPSAoc3RhcnQsIGVuZCwgc3RlcCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChlbmQgPT0gbnVsbCAmJiBpc1ZhbGlkVmFsdWUoc3RhcnQpKSB7XG4gICAgcmV0dXJuIFtzdGFydF07XG4gIH1cblxuICBpZiAoIWlzVmFsaWRWYWx1ZShzdGFydCkgfHwgIWlzVmFsaWRWYWx1ZShlbmQpKSB7XG4gICAgcmV0dXJuIGludmFsaWRSYW5nZShzdGFydCwgZW5kLCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RlcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmaWxsKHN0YXJ0LCBlbmQsIDEsIHsgdHJhbnNmb3JtOiBzdGVwIH0pO1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KHN0ZXApKSB7XG4gICAgcmV0dXJuIGZpbGwoc3RhcnQsIGVuZCwgMCwgc3RlcCk7XG4gIH1cblxuICBsZXQgb3B0cyA9IHsgLi4ub3B0aW9ucyB9O1xuICBpZiAob3B0cy5jYXB0dXJlID09PSB0cnVlKSBvcHRzLndyYXAgPSB0cnVlO1xuICBzdGVwID0gc3RlcCB8fCBvcHRzLnN0ZXAgfHwgMTtcblxuICBpZiAoIWlzTnVtYmVyKHN0ZXApKSB7XG4gICAgaWYgKHN0ZXAgIT0gbnVsbCAmJiAhaXNPYmplY3Qoc3RlcCkpIHJldHVybiBpbnZhbGlkU3RlcChzdGVwLCBvcHRzKTtcbiAgICByZXR1cm4gZmlsbChzdGFydCwgZW5kLCAxLCBzdGVwKTtcbiAgfVxuXG4gIGlmIChpc051bWJlcihzdGFydCkgJiYgaXNOdW1iZXIoZW5kKSkge1xuICAgIHJldHVybiBmaWxsTnVtYmVycyhzdGFydCwgZW5kLCBzdGVwLCBvcHRzKTtcbiAgfVxuXG4gIHJldHVybiBmaWxsTGV0dGVycyhzdGFydCwgZW5kLCBNYXRoLm1heChNYXRoLmFicyhzdGVwKSwgMSksIG9wdHMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmaWxsO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZmlsbCA9IHJlcXVpcmUoJ2ZpbGwtcmFuZ2UnKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5jb25zdCBjb21waWxlID0gKGFzdCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCB3YWxrID0gKG5vZGUsIHBhcmVudCA9IHt9KSA9PiB7XG4gICAgbGV0IGludmFsaWRCbG9jayA9IHV0aWxzLmlzSW52YWxpZEJyYWNlKHBhcmVudCk7XG4gICAgbGV0IGludmFsaWROb2RlID0gbm9kZS5pbnZhbGlkID09PSB0cnVlICYmIG9wdGlvbnMuZXNjYXBlSW52YWxpZCA9PT0gdHJ1ZTtcbiAgICBsZXQgaW52YWxpZCA9IGludmFsaWRCbG9jayA9PT0gdHJ1ZSB8fCBpbnZhbGlkTm9kZSA9PT0gdHJ1ZTtcbiAgICBsZXQgcHJlZml4ID0gb3B0aW9ucy5lc2NhcGVJbnZhbGlkID09PSB0cnVlID8gJ1xcXFwnIDogJyc7XG4gICAgbGV0IG91dHB1dCA9ICcnO1xuXG4gICAgaWYgKG5vZGUuaXNPcGVuID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ICsgbm9kZS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKG5vZGUuaXNDbG9zZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHByZWZpeCArIG5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ29wZW4nKSB7XG4gICAgICByZXR1cm4gaW52YWxpZCA/IChwcmVmaXggKyBub2RlLnZhbHVlKSA6ICcoJztcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICByZXR1cm4gaW52YWxpZCA/IChwcmVmaXggKyBub2RlLnZhbHVlKSA6ICcpJztcbiAgICB9XG5cbiAgICBpZiAobm9kZS50eXBlID09PSAnY29tbWEnKSB7XG4gICAgICByZXR1cm4gbm9kZS5wcmV2LnR5cGUgPT09ICdjb21tYScgPyAnJyA6IChpbnZhbGlkID8gbm9kZS52YWx1ZSA6ICd8Jyk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgIHJldHVybiBub2RlLnZhbHVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLm5vZGVzICYmIG5vZGUucmFuZ2VzID4gMCkge1xuICAgICAgbGV0IGFyZ3MgPSB1dGlscy5yZWR1Y2Uobm9kZS5ub2Rlcyk7XG4gICAgICBsZXQgcmFuZ2UgPSBmaWxsKC4uLmFyZ3MsIHsgLi4ub3B0aW9ucywgd3JhcDogZmFsc2UsIHRvUmVnZXg6IHRydWUgfSk7XG5cbiAgICAgIGlmIChyYW5nZS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MubGVuZ3RoID4gMSAmJiByYW5nZS5sZW5ndGggPiAxID8gYCgke3JhbmdlfSlgIDogcmFuZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMpIHtcbiAgICAgIGZvciAobGV0IGNoaWxkIG9mIG5vZGUubm9kZXMpIHtcbiAgICAgICAgb3V0cHV0ICs9IHdhbGsoY2hpbGQsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIHJldHVybiB3YWxrKGFzdCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBpbGU7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmaWxsID0gcmVxdWlyZSgnZmlsbC1yYW5nZScpO1xuY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG5jb25zdCBhcHBlbmQgPSAocXVldWUgPSAnJywgc3Rhc2ggPSAnJywgZW5jbG9zZSA9IGZhbHNlKSA9PiB7XG4gIGxldCByZXN1bHQgPSBbXTtcblxuICBxdWV1ZSA9IFtdLmNvbmNhdChxdWV1ZSk7XG4gIHN0YXNoID0gW10uY29uY2F0KHN0YXNoKTtcblxuICBpZiAoIXN0YXNoLmxlbmd0aCkgcmV0dXJuIHF1ZXVlO1xuICBpZiAoIXF1ZXVlLmxlbmd0aCkge1xuICAgIHJldHVybiBlbmNsb3NlID8gdXRpbHMuZmxhdHRlbihzdGFzaCkubWFwKGVsZSA9PiBgeyR7ZWxlfX1gKSA6IHN0YXNoO1xuICB9XG5cbiAgZm9yIChsZXQgaXRlbSBvZiBxdWV1ZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBmb3IgKGxldCB2YWx1ZSBvZiBpdGVtKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGFwcGVuZCh2YWx1ZSwgc3Rhc2gsIGVuY2xvc2UpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgZWxlIG9mIHN0YXNoKSB7XG4gICAgICAgIGlmIChlbmNsb3NlID09PSB0cnVlICYmIHR5cGVvZiBlbGUgPT09ICdzdHJpbmcnKSBlbGUgPSBgeyR7ZWxlfX1gO1xuICAgICAgICByZXN1bHQucHVzaChBcnJheS5pc0FycmF5KGVsZSkgPyBhcHBlbmQoaXRlbSwgZWxlLCBlbmNsb3NlKSA6IChpdGVtICsgZWxlKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1dGlscy5mbGF0dGVuKHJlc3VsdCk7XG59O1xuXG5jb25zdCBleHBhbmQgPSAoYXN0LCBvcHRpb25zID0ge30pID0+IHtcbiAgbGV0IHJhbmdlTGltaXQgPSBvcHRpb25zLnJhbmdlTGltaXQgPT09IHZvaWQgMCA/IDEwMDAgOiBvcHRpb25zLnJhbmdlTGltaXQ7XG5cbiAgbGV0IHdhbGsgPSAobm9kZSwgcGFyZW50ID0ge30pID0+IHtcbiAgICBub2RlLnF1ZXVlID0gW107XG5cbiAgICBsZXQgcCA9IHBhcmVudDtcbiAgICBsZXQgcSA9IHBhcmVudC5xdWV1ZTtcblxuICAgIHdoaWxlIChwLnR5cGUgIT09ICdicmFjZScgJiYgcC50eXBlICE9PSAncm9vdCcgJiYgcC5wYXJlbnQpIHtcbiAgICAgIHAgPSBwLnBhcmVudDtcbiAgICAgIHEgPSBwLnF1ZXVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLmludmFsaWQgfHwgbm9kZS5kb2xsYXIpIHtcbiAgICAgIHEucHVzaChhcHBlbmQocS5wb3AoKSwgc3RyaW5naWZ5KG5vZGUsIG9wdGlvbnMpKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUudHlwZSA9PT0gJ2JyYWNlJyAmJiBub2RlLmludmFsaWQgIT09IHRydWUgJiYgbm9kZS5ub2Rlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHEucHVzaChhcHBlbmQocS5wb3AoKSwgWyd7fSddKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG5vZGUubm9kZXMgJiYgbm9kZS5yYW5nZXMgPiAwKSB7XG4gICAgICBsZXQgYXJncyA9IHV0aWxzLnJlZHVjZShub2RlLm5vZGVzKTtcblxuICAgICAgaWYgKHV0aWxzLmV4Y2VlZHNMaW1pdCguLi5hcmdzLCBvcHRpb25zLnN0ZXAsIHJhbmdlTGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdleHBhbmRlZCBhcnJheSBsZW5ndGggZXhjZWVkcyByYW5nZSBsaW1pdC4gVXNlIG9wdGlvbnMucmFuZ2VMaW1pdCB0byBpbmNyZWFzZSBvciBkaXNhYmxlIHRoZSBsaW1pdC4nKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHJhbmdlID0gZmlsbCguLi5hcmdzLCBvcHRpb25zKTtcbiAgICAgIGlmIChyYW5nZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmFuZ2UgPSBzdHJpbmdpZnkobm9kZSwgb3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIHEucHVzaChhcHBlbmQocS5wb3AoKSwgcmFuZ2UpKTtcbiAgICAgIG5vZGUubm9kZXMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZW5jbG9zZSA9IHV0aWxzLmVuY2xvc2VCcmFjZShub2RlKTtcbiAgICBsZXQgcXVldWUgPSBub2RlLnF1ZXVlO1xuICAgIGxldCBibG9jayA9IG5vZGU7XG5cbiAgICB3aGlsZSAoYmxvY2sudHlwZSAhPT0gJ2JyYWNlJyAmJiBibG9jay50eXBlICE9PSAncm9vdCcgJiYgYmxvY2sucGFyZW50KSB7XG4gICAgICBibG9jayA9IGJsb2NrLnBhcmVudDtcbiAgICAgIHF1ZXVlID0gYmxvY2sucXVldWU7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLm5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgY2hpbGQgPSBub2RlLm5vZGVzW2ldO1xuXG4gICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ2NvbW1hJyAmJiBub2RlLnR5cGUgPT09ICdicmFjZScpIHtcbiAgICAgICAgaWYgKGkgPT09IDEpIHF1ZXVlLnB1c2goJycpO1xuICAgICAgICBxdWV1ZS5wdXNoKCcnKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZC50eXBlID09PSAnY2xvc2UnKSB7XG4gICAgICAgIHEucHVzaChhcHBlbmQocS5wb3AoKSwgcXVldWUsIGVuY2xvc2UpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZC52YWx1ZSAmJiBjaGlsZC50eXBlICE9PSAnb3BlbicpIHtcbiAgICAgICAgcXVldWUucHVzaChhcHBlbmQocXVldWUucG9wKCksIGNoaWxkLnZhbHVlKSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQubm9kZXMpIHtcbiAgICAgICAgd2FsayhjaGlsZCwgbm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHF1ZXVlO1xuICB9O1xuXG4gIHJldHVybiB1dGlscy5mbGF0dGVuKHdhbGsoYXN0KSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cGFuZDtcbiIsICIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RIOiAxMDI0ICogNjQsXG5cbiAgLy8gRGlnaXRzXG4gIENIQVJfMDogJzAnLCAvKiAwICovXG4gIENIQVJfOTogJzknLCAvKiA5ICovXG5cbiAgLy8gQWxwaGFiZXQgY2hhcnMuXG4gIENIQVJfVVBQRVJDQVNFX0E6ICdBJywgLyogQSAqL1xuICBDSEFSX0xPV0VSQ0FTRV9BOiAnYScsIC8qIGEgKi9cbiAgQ0hBUl9VUFBFUkNBU0VfWjogJ1onLCAvKiBaICovXG4gIENIQVJfTE9XRVJDQVNFX1o6ICd6JywgLyogeiAqL1xuXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUzogJygnLCAvKiAoICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVM6ICcpJywgLyogKSAqL1xuXG4gIENIQVJfQVNURVJJU0s6ICcqJywgLyogKiAqL1xuXG4gIC8vIE5vbi1hbHBoYWJldGljIGNoYXJzLlxuICBDSEFSX0FNUEVSU0FORDogJyYnLCAvKiAmICovXG4gIENIQVJfQVQ6ICdAJywgLyogQCAqL1xuICBDSEFSX0JBQ0tTTEFTSDogJ1xcXFwnLCAvKiBcXCAqL1xuICBDSEFSX0JBQ0tUSUNLOiAnYCcsIC8qIGAgKi9cbiAgQ0hBUl9DQVJSSUFHRV9SRVRVUk46ICdcXHInLCAvKiBcXHIgKi9cbiAgQ0hBUl9DSVJDVU1GTEVYX0FDQ0VOVDogJ14nLCAvKiBeICovXG4gIENIQVJfQ09MT046ICc6JywgLyogOiAqL1xuICBDSEFSX0NPTU1BOiAnLCcsIC8qICwgKi9cbiAgQ0hBUl9ET0xMQVI6ICckJywgLyogLiAqL1xuICBDSEFSX0RPVDogJy4nLCAvKiAuICovXG4gIENIQVJfRE9VQkxFX1FVT1RFOiAnXCInLCAvKiBcIiAqL1xuICBDSEFSX0VRVUFMOiAnPScsIC8qID0gKi9cbiAgQ0hBUl9FWENMQU1BVElPTl9NQVJLOiAnIScsIC8qICEgKi9cbiAgQ0hBUl9GT1JNX0ZFRUQ6ICdcXGYnLCAvKiBcXGYgKi9cbiAgQ0hBUl9GT1JXQVJEX1NMQVNIOiAnLycsIC8qIC8gKi9cbiAgQ0hBUl9IQVNIOiAnIycsIC8qICMgKi9cbiAgQ0hBUl9IWVBIRU5fTUlOVVM6ICctJywgLyogLSAqL1xuICBDSEFSX0xFRlRfQU5HTEVfQlJBQ0tFVDogJzwnLCAvKiA8ICovXG4gIENIQVJfTEVGVF9DVVJMWV9CUkFDRTogJ3snLCAvKiB7ICovXG4gIENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVDogJ1snLCAvKiBbICovXG4gIENIQVJfTElORV9GRUVEOiAnXFxuJywgLyogXFxuICovXG4gIENIQVJfTk9fQlJFQUtfU1BBQ0U6ICdcXHUwMEEwJywgLyogXFx1MDBBMCAqL1xuICBDSEFSX1BFUkNFTlQ6ICclJywgLyogJSAqL1xuICBDSEFSX1BMVVM6ICcrJywgLyogKyAqL1xuICBDSEFSX1FVRVNUSU9OX01BUks6ICc/JywgLyogPyAqL1xuICBDSEFSX1JJR0hUX0FOR0xFX0JSQUNLRVQ6ICc+JywgLyogPiAqL1xuICBDSEFSX1JJR0hUX0NVUkxZX0JSQUNFOiAnfScsIC8qIH0gKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVDogJ10nLCAvKiBdICovXG4gIENIQVJfU0VNSUNPTE9OOiAnOycsIC8qIDsgKi9cbiAgQ0hBUl9TSU5HTEVfUVVPVEU6ICdcXCcnLCAvKiAnICovXG4gIENIQVJfU1BBQ0U6ICcgJywgLyogICAqL1xuICBDSEFSX1RBQjogJ1xcdCcsIC8qIFxcdCAqL1xuICBDSEFSX1VOREVSU0NPUkU6ICdfJywgLyogXyAqL1xuICBDSEFSX1ZFUlRJQ0FMX0xJTkU6ICd8JywgLyogfCAqL1xuICBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRTogJ1xcdUZFRkYnIC8qIFxcdUZFRkYgKi9cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IHtcbiAgTUFYX0xFTkdUSCxcbiAgQ0hBUl9CQUNLU0xBU0gsIC8qIFxcICovXG4gIENIQVJfQkFDS1RJQ0ssIC8qIGAgKi9cbiAgQ0hBUl9DT01NQSwgLyogLCAqL1xuICBDSEFSX0RPVCwgLyogLiAqL1xuICBDSEFSX0xFRlRfUEFSRU5USEVTRVMsIC8qICggKi9cbiAgQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUywgLyogKSAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UsIC8qIHsgKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSwgLyogfSAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQsIC8qIFsgKi9cbiAgQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCwgLyogXSAqL1xuICBDSEFSX0RPVUJMRV9RVU9URSwgLyogXCIgKi9cbiAgQ0hBUl9TSU5HTEVfUVVPVEUsIC8qICcgKi9cbiAgQ0hBUl9OT19CUkVBS19TUEFDRSxcbiAgQ0hBUl9aRVJPX1dJRFRIX05PQlJFQUtfU1BBQ0Vcbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG4vKipcbiAqIHBhcnNlXG4gKi9cblxuY29uc3QgcGFyc2UgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIH1cblxuICBsZXQgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIGxldCBtYXggPSB0eXBlb2Ygb3B0cy5tYXhMZW5ndGggPT09ICdudW1iZXInID8gTWF0aC5taW4oTUFYX0xFTkdUSCwgb3B0cy5tYXhMZW5ndGgpIDogTUFYX0xFTkdUSDtcbiAgaWYgKGlucHV0Lmxlbmd0aCA+IG1heCkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW5wdXQgbGVuZ3RoICgke2lucHV0Lmxlbmd0aH0pLCBleGNlZWRzIG1heCBjaGFyYWN0ZXJzICgke21heH0pYCk7XG4gIH1cblxuICBsZXQgYXN0ID0geyB0eXBlOiAncm9vdCcsIGlucHV0LCBub2RlczogW10gfTtcbiAgbGV0IHN0YWNrID0gW2FzdF07XG4gIGxldCBibG9jayA9IGFzdDtcbiAgbGV0IHByZXYgPSBhc3Q7XG4gIGxldCBicmFja2V0cyA9IDA7XG4gIGxldCBsZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBkZXB0aCA9IDA7XG4gIGxldCB2YWx1ZTtcbiAgbGV0IG1lbW8gPSB7fTtcblxuICAvKipcbiAgICogSGVscGVyc1xuICAgKi9cblxuICBjb25zdCBhZHZhbmNlID0gKCkgPT4gaW5wdXRbaW5kZXgrK107XG4gIGNvbnN0IHB1c2ggPSBub2RlID0+IHtcbiAgICBpZiAobm9kZS50eXBlID09PSAndGV4dCcgJiYgcHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgcHJldi50eXBlID0gJ3RleHQnO1xuICAgIH1cblxuICAgIGlmIChwcmV2ICYmIHByZXYudHlwZSA9PT0gJ3RleHQnICYmIG5vZGUudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICBwcmV2LnZhbHVlICs9IG5vZGUudmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYmxvY2subm9kZXMucHVzaChub2RlKTtcbiAgICBub2RlLnBhcmVudCA9IGJsb2NrO1xuICAgIG5vZGUucHJldiA9IHByZXY7XG4gICAgcHJldiA9IG5vZGU7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG5cbiAgcHVzaCh7IHR5cGU6ICdib3MnIH0pO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIGJsb2NrID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgdmFsdWUgPSBhZHZhbmNlKCk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZhbGlkIGNoYXJzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfWkVST19XSURUSF9OT0JSRUFLX1NQQUNFIHx8IHZhbHVlID09PSBDSEFSX05PX0JSRUFLX1NQQUNFKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVkIGNoYXJzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfQkFDS1NMQVNIKSB7XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogKG9wdGlvbnMua2VlcEVzY2FwaW5nID8gdmFsdWUgOiAnJykgKyBhZHZhbmNlKCkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSaWdodCBzcXVhcmUgYnJhY2tldCAobGl0ZXJhbCk6ICddJ1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogJ1xcXFwnICsgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMZWZ0IHNxdWFyZSBicmFja2V0OiAnWydcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICBicmFja2V0cysrO1xuXG4gICAgICBsZXQgY2xvc2VkID0gdHJ1ZTtcbiAgICAgIGxldCBuZXh0O1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGggJiYgKG5leHQgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIHZhbHVlICs9IG5leHQ7XG5cbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfTEVGVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgICAgIGJyYWNrZXRzKys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9CQUNLU0xBU0gpIHtcbiAgICAgICAgICB2YWx1ZSArPSBhZHZhbmNlKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dCA9PT0gQ0hBUl9SSUdIVF9TUVVBUkVfQlJBQ0tFVCkge1xuICAgICAgICAgIGJyYWNrZXRzLS07XG5cbiAgICAgICAgICBpZiAoYnJhY2tldHMgPT09IDApIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcmVudGhlc2VzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUykge1xuICAgICAgYmxvY2sgPSBwdXNoKHsgdHlwZTogJ3BhcmVuJywgbm9kZXM6IFtdIH0pO1xuICAgICAgc3RhY2sucHVzaChibG9jayk7XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9SSUdIVF9QQVJFTlRIRVNFUykge1xuICAgICAgaWYgKGJsb2NrLnR5cGUgIT09ICdwYXJlbicpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYmxvY2sgPSBzdGFjay5wb3AoKTtcbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgYmxvY2sgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1b3RlczogJ3xcInxgXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfRE9VQkxFX1FVT1RFIHx8IHZhbHVlID09PSBDSEFSX1NJTkdMRV9RVU9URSB8fCB2YWx1ZSA9PT0gQ0hBUl9CQUNLVElDSykge1xuICAgICAgbGV0IG9wZW4gPSB2YWx1ZTtcbiAgICAgIGxldCBuZXh0O1xuXG4gICAgICBpZiAob3B0aW9ucy5rZWVwUXVvdGVzICE9PSB0cnVlKSB7XG4gICAgICAgIHZhbHVlID0gJyc7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCAmJiAobmV4dCA9IGFkdmFuY2UoKSkpIHtcbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfQkFDS1NMQVNIKSB7XG4gICAgICAgICAgdmFsdWUgKz0gbmV4dCArIGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuZXh0ID09PSBvcGVuKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMua2VlcFF1b3RlcyA9PT0gdHJ1ZSkgdmFsdWUgKz0gbmV4dDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlICs9IG5leHQ7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGVmdCBjdXJseSBicmFjZTogJ3snXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfTEVGVF9DVVJMWV9CUkFDRSkge1xuICAgICAgZGVwdGgrKztcblxuICAgICAgbGV0IGRvbGxhciA9IHByZXYudmFsdWUgJiYgcHJldi52YWx1ZS5zbGljZSgtMSkgPT09ICckJyB8fCBibG9jay5kb2xsYXIgPT09IHRydWU7XG4gICAgICBsZXQgYnJhY2UgPSB7XG4gICAgICAgIHR5cGU6ICdicmFjZScsXG4gICAgICAgIG9wZW46IHRydWUsXG4gICAgICAgIGNsb3NlOiBmYWxzZSxcbiAgICAgICAgZG9sbGFyLFxuICAgICAgICBkZXB0aCxcbiAgICAgICAgY29tbWFzOiAwLFxuICAgICAgICByYW5nZXM6IDAsXG4gICAgICAgIG5vZGVzOiBbXVxuICAgICAgfTtcblxuICAgICAgYmxvY2sgPSBwdXNoKGJyYWNlKTtcbiAgICAgIHN0YWNrLnB1c2goYmxvY2spO1xuICAgICAgcHVzaCh7IHR5cGU6ICdvcGVuJywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSaWdodCBjdXJseSBicmFjZTogJ30nXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfUklHSFRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgIGlmIChibG9jay50eXBlICE9PSAnYnJhY2UnKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IHR5cGUgPSAnY2xvc2UnO1xuICAgICAgYmxvY2sgPSBzdGFjay5wb3AoKTtcbiAgICAgIGJsb2NrLmNsb3NlID0gdHJ1ZTtcblxuICAgICAgcHVzaCh7IHR5cGUsIHZhbHVlIH0pO1xuICAgICAgZGVwdGgtLTtcblxuICAgICAgYmxvY2sgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbW1hOiAnLCdcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gQ0hBUl9DT01NQSAmJiBkZXB0aCA+IDApIHtcbiAgICAgIGlmIChibG9jay5yYW5nZXMgPiAwKSB7XG4gICAgICAgIGJsb2NrLnJhbmdlcyA9IDA7XG4gICAgICAgIGxldCBvcGVuID0gYmxvY2subm9kZXMuc2hpZnQoKTtcbiAgICAgICAgYmxvY2subm9kZXMgPSBbb3BlbiwgeyB0eXBlOiAndGV4dCcsIHZhbHVlOiBzdHJpbmdpZnkoYmxvY2spIH1dO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2NvbW1hJywgdmFsdWUgfSk7XG4gICAgICBibG9jay5jb21tYXMrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvdDogJy4nXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09IENIQVJfRE9UICYmIGRlcHRoID4gMCAmJiBibG9jay5jb21tYXMgPT09IDApIHtcbiAgICAgIGxldCBzaWJsaW5ncyA9IGJsb2NrLm5vZGVzO1xuXG4gICAgICBpZiAoZGVwdGggPT09IDAgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ2RvdCcpIHtcbiAgICAgICAgYmxvY2sucmFuZ2UgPSBbXTtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgcHJldi50eXBlID0gJ3JhbmdlJztcblxuICAgICAgICBpZiAoYmxvY2subm9kZXMubGVuZ3RoICE9PSAzICYmIGJsb2NrLm5vZGVzLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICAgIGJsb2NrLmludmFsaWQgPSB0cnVlO1xuICAgICAgICAgIGJsb2NrLnJhbmdlcyA9IDA7XG4gICAgICAgICAgcHJldi50eXBlID0gJ3RleHQnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYmxvY2sucmFuZ2VzKys7XG4gICAgICAgIGJsb2NrLmFyZ3MgPSBbXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2LnR5cGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgc2libGluZ3MucG9wKCk7XG5cbiAgICAgICAgbGV0IGJlZm9yZSA9IHNpYmxpbmdzW3NpYmxpbmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICBiZWZvcmUudmFsdWUgKz0gcHJldi52YWx1ZSArIHZhbHVlO1xuICAgICAgICBwcmV2ID0gYmVmb3JlO1xuICAgICAgICBibG9jay5yYW5nZXMtLTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAnZG90JywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXh0XG4gICAgICovXG5cbiAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8vIE1hcmsgaW1iYWxhbmNlZCBicmFjZXMgYW5kIGJyYWNrZXRzIGFzIGludmFsaWRcbiAgZG8ge1xuICAgIGJsb2NrID0gc3RhY2sucG9wKCk7XG5cbiAgICBpZiAoYmxvY2sudHlwZSAhPT0gJ3Jvb3QnKSB7XG4gICAgICBibG9jay5ub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICBpZiAoIW5vZGUubm9kZXMpIHtcbiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnb3BlbicpIG5vZGUuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAnY2xvc2UnKSBub2RlLmlzQ2xvc2UgPSB0cnVlO1xuICAgICAgICAgIGlmICghbm9kZS5ub2Rlcykgbm9kZS50eXBlID0gJ3RleHQnO1xuICAgICAgICAgIG5vZGUuaW52YWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBnZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBibG9jayBvbiBwYXJlbnQubm9kZXMgKGJsb2NrJ3Mgc2libGluZ3MpXG4gICAgICBsZXQgcGFyZW50ID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgICBsZXQgaW5kZXggPSBwYXJlbnQubm9kZXMuaW5kZXhPZihibG9jayk7XG4gICAgICAvLyByZXBsYWNlIHRoZSAoaW52YWxpZCkgYmxvY2sgd2l0aCBpdCdzIG5vZGVzXG4gICAgICBwYXJlbnQubm9kZXMuc3BsaWNlKGluZGV4LCAxLCAuLi5ibG9jay5ub2Rlcyk7XG4gICAgfVxuICB9IHdoaWxlIChzdGFjay5sZW5ndGggPiAwKTtcblxuICBwdXNoKHsgdHlwZTogJ2VvcycgfSk7XG4gIHJldHVybiBhc3Q7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3Qgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9saWIvc3RyaW5naWZ5Jyk7XG5jb25zdCBjb21waWxlID0gcmVxdWlyZSgnLi9saWIvY29tcGlsZScpO1xuY29uc3QgZXhwYW5kID0gcmVxdWlyZSgnLi9saWIvZXhwYW5kJyk7XG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vbGliL3BhcnNlJyk7XG5cbi8qKlxuICogRXhwYW5kIHRoZSBnaXZlbiBwYXR0ZXJuIG9yIGNyZWF0ZSBhIHJlZ2V4LWNvbXBhdGlibGUgc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcygne2EsYixjfScsIHsgY29tcGlsZTogdHJ1ZSB9KSk7IC8vPT4gWycoYXxifGMpJ11cbiAqIGNvbnNvbGUubG9nKGJyYWNlcygne2EsYixjfScpKTsgLy89PiBbJ2EnLCAnYicsICdjJ11cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IGJyYWNlcyA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGxldCBvdXRwdXQgPSBbXTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICBmb3IgKGxldCBwYXR0ZXJuIG9mIGlucHV0KSB7XG4gICAgICBsZXQgcmVzdWx0ID0gYnJhY2VzLmNyZWF0ZShwYXR0ZXJuLCBvcHRpb25zKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgICAgb3V0cHV0LnB1c2goLi4ucmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dC5wdXNoKHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IFtdLmNvbmNhdChicmFjZXMuY3JlYXRlKGlucHV0LCBvcHRpb25zKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmV4cGFuZCA9PT0gdHJ1ZSAmJiBvcHRpb25zLm5vZHVwZXMgPT09IHRydWUpIHtcbiAgICBvdXRwdXQgPSBbLi4ubmV3IFNldChvdXRwdXQpXTtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgd2l0aCB0aGUgZ2l2ZW4gYG9wdGlvbnNgLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBicmFjZXMucGFyc2UocGF0dGVybiwgWywgb3B0aW9uc10pO1xuICogY29uc3QgYXN0ID0gYnJhY2VzLnBhcnNlKCdhL3tiLGN9L2QnKTtcbiAqIGNvbnNvbGUubG9nKGFzdCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXR0ZXJuIEJyYWNlIHBhdHRlcm4gdG8gcGFyc2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gQVNUXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5wYXJzZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiBwYXJzZShpbnB1dCwgb3B0aW9ucyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJyYWNlcyBzdHJpbmcgZnJvbSBhbiBBU1QsIG9yIGFuIEFTVCBub2RlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbiAqIGxldCBhc3QgPSBicmFjZXMucGFyc2UoJ2Zvby97YSxifS9iYXInKTtcbiAqIGNvbnNvbGUubG9nKHN0cmluZ2lmeShhc3Qubm9kZXNbMl0pKTsgLy89PiAne2EsYn0nXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIEJyYWNlIHBhdHRlcm4gb3IgQVNULlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgZXhwYW5kZWQgdmFsdWVzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMuc3RyaW5naWZ5ID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5KGJyYWNlcy5wYXJzZShpbnB1dCwgb3B0aW9ucyksIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzdHJpbmdpZnkoaW5wdXQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBDb21waWxlcyBhIGJyYWNlIHBhdHRlcm4gaW50byBhIHJlZ2V4LWNvbXBhdGlibGUsIG9wdGltaXplZCBzdHJpbmcuXG4gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIG1haW4gW2JyYWNlc10oI2JyYWNlcykgZnVuY3Rpb24gYnkgZGVmYXVsdC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMuY29tcGlsZSgnYS97YixjfS9kJykpO1xuICogLy89PiBbJ2EvKGJ8YykvZCddXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgaW5wdXRgIEJyYWNlIHBhdHRlcm4gb3IgQVNULlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgZXhwYW5kZWQgdmFsdWVzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMuY29tcGlsZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgaW5wdXQgPSBicmFjZXMucGFyc2UoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBjb21waWxlKGlucHV0LCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogRXhwYW5kcyBhIGJyYWNlIHBhdHRlcm4gaW50byBhbiBhcnJheS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZVxuICogbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbiB3aGVuIGBvcHRpb25zLmV4cGFuZGAgaXMgdHJ1ZS4gQmVmb3JlXG4gKiB1c2luZyB0aGlzIG1ldGhvZCBpdCdzIHJlY29tbWVuZGVkIHRoYXQgeW91IHJlYWQgdGhlIFtwZXJmb3JtYW5jZSBub3Rlc10oI3BlcmZvcm1hbmNlKSlcbiAqIGFuZCBhZHZhbnRhZ2VzIG9mIHVzaW5nIFsuY29tcGlsZV0oI2NvbXBpbGUpIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGJyYWNlcyA9IHJlcXVpcmUoJ2JyYWNlcycpO1xuICogY29uc29sZS5sb2coYnJhY2VzLmV4cGFuZCgnYS97YixjfS9kJykpO1xuICogLy89PiBbJ2EvYi9kJywgJ2EvYy9kJ107XG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgQnJhY2UgcGF0dGVyblxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7QXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2YgZXhwYW5kZWQgdmFsdWVzLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5icmFjZXMuZXhwYW5kID0gKGlucHV0LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICBpbnB1dCA9IGJyYWNlcy5wYXJzZShpbnB1dCwgb3B0aW9ucyk7XG4gIH1cblxuICBsZXQgcmVzdWx0ID0gZXhwYW5kKGlucHV0LCBvcHRpb25zKTtcblxuICAvLyBmaWx0ZXIgb3V0IGVtcHR5IHN0cmluZ3MgaWYgc3BlY2lmaWVkXG4gIGlmIChvcHRpb25zLm5vZW1wdHkgPT09IHRydWUpIHtcbiAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG5cbiAgLy8gZmlsdGVyIG91dCBkdXBsaWNhdGVzIGlmIHNwZWNpZmllZFxuICBpZiAob3B0aW9ucy5ub2R1cGVzID09PSB0cnVlKSB7XG4gICAgcmVzdWx0ID0gWy4uLm5ldyBTZXQocmVzdWx0KV07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBicmFjZSBwYXR0ZXJuIGFuZCByZXR1cm5zIGVpdGhlciBhbiBleHBhbmRlZCBhcnJheVxuICogKGlmIGBvcHRpb25zLmV4cGFuZGAgaXMgdHJ1ZSksIGEgaGlnaGx5IG9wdGltaXplZCByZWdleC1jb21wYXRpYmxlIHN0cmluZy5cbiAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBbYnJhY2VzXSgjYnJhY2VzKSBmdW5jdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYnJhY2VzID0gcmVxdWlyZSgnYnJhY2VzJyk7XG4gKiBjb25zb2xlLmxvZyhicmFjZXMuY3JlYXRlKCd1c2VyLXsyMDAuLjMwMH0vcHJvamVjdC17YSxiLGN9LXsxLi4xMH0nKSlcbiAqIC8vPT4gJ3VzZXItKDIwWzAtOV18MlsxLTldWzAtOV18MzAwKS9wcm9qZWN0LShhfGJ8YyktKFsxLTldfDEwKSdcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBCcmFjZSBwYXR0ZXJuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBleHBhbmRlZCB2YWx1ZXMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmJyYWNlcy5jcmVhdGUgPSAoaW5wdXQsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBpZiAoaW5wdXQgPT09ICcnIHx8IGlucHV0Lmxlbmd0aCA8IDMpIHtcbiAgICByZXR1cm4gW2lucHV0XTtcbiAgfVxuXG4gcmV0dXJuIG9wdGlvbnMuZXhwYW5kICE9PSB0cnVlXG4gICAgPyBicmFjZXMuY29tcGlsZShpbnB1dCwgb3B0aW9ucylcbiAgICA6IGJyYWNlcy5leHBhbmQoaW5wdXQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgXCJicmFjZXNcIlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gYnJhY2VzO1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IFdJTl9TTEFTSCA9ICdcXFxcXFxcXC8nO1xuY29uc3QgV0lOX05PX1NMQVNIID0gYFteJHtXSU5fU0xBU0h9XWA7XG5cbi8qKlxuICogUG9zaXggZ2xvYiByZWdleFxuICovXG5cbmNvbnN0IERPVF9MSVRFUkFMID0gJ1xcXFwuJztcbmNvbnN0IFBMVVNfTElURVJBTCA9ICdcXFxcKyc7XG5jb25zdCBRTUFSS19MSVRFUkFMID0gJ1xcXFw/JztcbmNvbnN0IFNMQVNIX0xJVEVSQUwgPSAnXFxcXC8nO1xuY29uc3QgT05FX0NIQVIgPSAnKD89LiknO1xuY29uc3QgUU1BUksgPSAnW14vXSc7XG5jb25zdCBFTkRfQU5DSE9SID0gYCg/OiR7U0xBU0hfTElURVJBTH18JClgO1xuY29uc3QgU1RBUlRfQU5DSE9SID0gYCg/Ol58JHtTTEFTSF9MSVRFUkFMfSlgO1xuY29uc3QgRE9UU19TTEFTSCA9IGAke0RPVF9MSVRFUkFMfXsxLDJ9JHtFTkRfQU5DSE9SfWA7XG5jb25zdCBOT19ET1QgPSBgKD8hJHtET1RfTElURVJBTH0pYDtcbmNvbnN0IE5PX0RPVFMgPSBgKD8hJHtTVEFSVF9BTkNIT1J9JHtET1RTX1NMQVNIfSlgO1xuY29uc3QgTk9fRE9UX1NMQVNIID0gYCg/ISR7RE9UX0xJVEVSQUx9ezAsMX0ke0VORF9BTkNIT1J9KWA7XG5jb25zdCBOT19ET1RTX1NMQVNIID0gYCg/ISR7RE9UU19TTEFTSH0pYDtcbmNvbnN0IFFNQVJLX05PX0RPVCA9IGBbXi4ke1NMQVNIX0xJVEVSQUx9XWA7XG5jb25zdCBTVEFSID0gYCR7UU1BUkt9Kj9gO1xuXG5jb25zdCBQT1NJWF9DSEFSUyA9IHtcbiAgRE9UX0xJVEVSQUwsXG4gIFBMVVNfTElURVJBTCxcbiAgUU1BUktfTElURVJBTCxcbiAgU0xBU0hfTElURVJBTCxcbiAgT05FX0NIQVIsXG4gIFFNQVJLLFxuICBFTkRfQU5DSE9SLFxuICBET1RTX1NMQVNILFxuICBOT19ET1QsXG4gIE5PX0RPVFMsXG4gIE5PX0RPVF9TTEFTSCxcbiAgTk9fRE9UU19TTEFTSCxcbiAgUU1BUktfTk9fRE9ULFxuICBTVEFSLFxuICBTVEFSVF9BTkNIT1Jcbn07XG5cbi8qKlxuICogV2luZG93cyBnbG9iIHJlZ2V4XG4gKi9cblxuY29uc3QgV0lORE9XU19DSEFSUyA9IHtcbiAgLi4uUE9TSVhfQ0hBUlMsXG5cbiAgU0xBU0hfTElURVJBTDogYFske1dJTl9TTEFTSH1dYCxcbiAgUU1BUks6IFdJTl9OT19TTEFTSCxcbiAgU1RBUjogYCR7V0lOX05PX1NMQVNIfSo/YCxcbiAgRE9UU19TTEFTSDogYCR7RE9UX0xJVEVSQUx9ezEsMn0oPzpbJHtXSU5fU0xBU0h9XXwkKWAsXG4gIE5PX0RPVDogYCg/ISR7RE9UX0xJVEVSQUx9KWAsXG4gIE5PX0RPVFM6IGAoPyEoPzpefFske1dJTl9TTEFTSH1dKSR7RE9UX0xJVEVSQUx9ezEsMn0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLFxuICBOT19ET1RfU0xBU0g6IGAoPyEke0RPVF9MSVRFUkFMfXswLDF9KD86WyR7V0lOX1NMQVNIfV18JCkpYCxcbiAgTk9fRE9UU19TTEFTSDogYCg/ISR7RE9UX0xJVEVSQUx9ezEsMn0oPzpbJHtXSU5fU0xBU0h9XXwkKSlgLFxuICBRTUFSS19OT19ET1Q6IGBbXi4ke1dJTl9TTEFTSH1dYCxcbiAgU1RBUlRfQU5DSE9SOiBgKD86XnxbJHtXSU5fU0xBU0h9XSlgLFxuICBFTkRfQU5DSE9SOiBgKD86WyR7V0lOX1NMQVNIfV18JClgXG59O1xuXG4vKipcbiAqIFBPU0lYIEJyYWNrZXQgUmVnZXhcbiAqL1xuXG5jb25zdCBQT1NJWF9SRUdFWF9TT1VSQ0UgPSB7XG4gIGFsbnVtOiAnYS16QS1aMC05JyxcbiAgYWxwaGE6ICdhLXpBLVonLFxuICBhc2NpaTogJ1xcXFx4MDAtXFxcXHg3RicsXG4gIGJsYW5rOiAnIFxcXFx0JyxcbiAgY250cmw6ICdcXFxceDAwLVxcXFx4MUZcXFxceDdGJyxcbiAgZGlnaXQ6ICcwLTknLFxuICBncmFwaDogJ1xcXFx4MjEtXFxcXHg3RScsXG4gIGxvd2VyOiAnYS16JyxcbiAgcHJpbnQ6ICdcXFxceDIwLVxcXFx4N0UgJyxcbiAgcHVuY3Q6ICdcXFxcLSFcIiMkJSZcXCcoKVxcXFwqKywuLzo7PD0+P0BbXFxcXF1eX2B7fH1+JyxcbiAgc3BhY2U6ICcgXFxcXHRcXFxcclxcXFxuXFxcXHZcXFxcZicsXG4gIHVwcGVyOiAnQS1aJyxcbiAgd29yZDogJ0EtWmEtejAtOV8nLFxuICB4ZGlnaXQ6ICdBLUZhLWYwLTknXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSDogMTAyNCAqIDY0LFxuICBQT1NJWF9SRUdFWF9TT1VSQ0UsXG5cbiAgLy8gcmVndWxhciBleHByZXNzaW9uc1xuICBSRUdFWF9CQUNLU0xBU0g6IC9cXFxcKD8hWyorP14ke30ofClbXFxdXSkvZyxcbiAgUkVHRVhfTk9OX1NQRUNJQUxfQ0hBUlM6IC9eW15AIVtcXF0uLCQqKz9ee30oKXxcXFxcL10rLyxcbiAgUkVHRVhfU1BFQ0lBTF9DSEFSUzogL1stKis/Ll4ke30ofClbXFxdXS8sXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfQkFDS1JFRjogLyhcXFxcPykoKFxcVykoXFwzKikpL2csXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMOiAvKFstKis/Ll4ke30ofClbXFxdXSkvZyxcbiAgUkVHRVhfUkVNT1ZFX0JBQ0tTTEFTSDogLyg/OlxcWy4qP1teXFxcXF1cXF18XFxcXCg/PS4pKS9nLFxuXG4gIC8vIFJlcGxhY2UgZ2xvYnMgd2l0aCBlcXVpdmFsZW50IHBhdHRlcm5zIHRvIHJlZHVjZSBwYXJzaW5nIHRpbWUuXG4gIFJFUExBQ0VNRU5UUzoge1xuICAgICcqKionOiAnKicsXG4gICAgJyoqLyoqJzogJyoqJyxcbiAgICAnKiovKiovKionOiAnKionXG4gIH0sXG5cbiAgLy8gRGlnaXRzXG4gIENIQVJfMDogNDgsIC8qIDAgKi9cbiAgQ0hBUl85OiA1NywgLyogOSAqL1xuXG4gIC8vIEFscGhhYmV0IGNoYXJzLlxuICBDSEFSX1VQUEVSQ0FTRV9BOiA2NSwgLyogQSAqL1xuICBDSEFSX0xPV0VSQ0FTRV9BOiA5NywgLyogYSAqL1xuICBDSEFSX1VQUEVSQ0FTRV9aOiA5MCwgLyogWiAqL1xuICBDSEFSX0xPV0VSQ0FTRV9aOiAxMjIsIC8qIHogKi9cblxuICBDSEFSX0xFRlRfUEFSRU5USEVTRVM6IDQwLCAvKiAoICovXG4gIENIQVJfUklHSFRfUEFSRU5USEVTRVM6IDQxLCAvKiApICovXG5cbiAgQ0hBUl9BU1RFUklTSzogNDIsIC8qICogKi9cblxuICAvLyBOb24tYWxwaGFiZXRpYyBjaGFycy5cbiAgQ0hBUl9BTVBFUlNBTkQ6IDM4LCAvKiAmICovXG4gIENIQVJfQVQ6IDY0LCAvKiBAICovXG4gIENIQVJfQkFDS1dBUkRfU0xBU0g6IDkyLCAvKiBcXCAqL1xuICBDSEFSX0NBUlJJQUdFX1JFVFVSTjogMTMsIC8qIFxcciAqL1xuICBDSEFSX0NJUkNVTUZMRVhfQUNDRU5UOiA5NCwgLyogXiAqL1xuICBDSEFSX0NPTE9OOiA1OCwgLyogOiAqL1xuICBDSEFSX0NPTU1BOiA0NCwgLyogLCAqL1xuICBDSEFSX0RPVDogNDYsIC8qIC4gKi9cbiAgQ0hBUl9ET1VCTEVfUVVPVEU6IDM0LCAvKiBcIiAqL1xuICBDSEFSX0VRVUFMOiA2MSwgLyogPSAqL1xuICBDSEFSX0VYQ0xBTUFUSU9OX01BUks6IDMzLCAvKiAhICovXG4gIENIQVJfRk9STV9GRUVEOiAxMiwgLyogXFxmICovXG4gIENIQVJfRk9SV0FSRF9TTEFTSDogNDcsIC8qIC8gKi9cbiAgQ0hBUl9HUkFWRV9BQ0NFTlQ6IDk2LCAvKiBgICovXG4gIENIQVJfSEFTSDogMzUsIC8qICMgKi9cbiAgQ0hBUl9IWVBIRU5fTUlOVVM6IDQ1LCAvKiAtICovXG4gIENIQVJfTEVGVF9BTkdMRV9CUkFDS0VUOiA2MCwgLyogPCAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0U6IDEyMywgLyogeyAqL1xuICBDSEFSX0xFRlRfU1FVQVJFX0JSQUNLRVQ6IDkxLCAvKiBbICovXG4gIENIQVJfTElORV9GRUVEOiAxMCwgLyogXFxuICovXG4gIENIQVJfTk9fQlJFQUtfU1BBQ0U6IDE2MCwgLyogXFx1MDBBMCAqL1xuICBDSEFSX1BFUkNFTlQ6IDM3LCAvKiAlICovXG4gIENIQVJfUExVUzogNDMsIC8qICsgKi9cbiAgQ0hBUl9RVUVTVElPTl9NQVJLOiA2MywgLyogPyAqL1xuICBDSEFSX1JJR0hUX0FOR0xFX0JSQUNLRVQ6IDYyLCAvKiA+ICovXG4gIENIQVJfUklHSFRfQ1VSTFlfQlJBQ0U6IDEyNSwgLyogfSAqL1xuICBDSEFSX1JJR0hUX1NRVUFSRV9CUkFDS0VUOiA5MywgLyogXSAqL1xuICBDSEFSX1NFTUlDT0xPTjogNTksIC8qIDsgKi9cbiAgQ0hBUl9TSU5HTEVfUVVPVEU6IDM5LCAvKiAnICovXG4gIENIQVJfU1BBQ0U6IDMyLCAvKiAgICovXG4gIENIQVJfVEFCOiA5LCAvKiBcXHQgKi9cbiAgQ0hBUl9VTkRFUlNDT1JFOiA5NSwgLyogXyAqL1xuICBDSEFSX1ZFUlRJQ0FMX0xJTkU6IDEyNCwgLyogfCAqL1xuICBDSEFSX1pFUk9fV0lEVEhfTk9CUkVBS19TUEFDRTogNjUyNzksIC8qIFxcdUZFRkYgKi9cblxuICBTRVA6IHBhdGguc2VwLFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgRVhUR0xPQl9DSEFSU1xuICAgKi9cblxuICBleHRnbG9iQ2hhcnMoY2hhcnMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJyEnOiB7IHR5cGU6ICduZWdhdGUnLCBvcGVuOiAnKD86KD8hKD86JywgY2xvc2U6IGApKSR7Y2hhcnMuU1RBUn0pYCB9LFxuICAgICAgJz8nOiB7IHR5cGU6ICdxbWFyaycsIG9wZW46ICcoPzonLCBjbG9zZTogJyk/JyB9LFxuICAgICAgJysnOiB7IHR5cGU6ICdwbHVzJywgb3BlbjogJyg/OicsIGNsb3NlOiAnKSsnIH0sXG4gICAgICAnKic6IHsgdHlwZTogJ3N0YXInLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpKicgfSxcbiAgICAgICdAJzogeyB0eXBlOiAnYXQnLCBvcGVuOiAnKD86JywgY2xvc2U6ICcpJyB9XG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlIEdMT0JfQ0hBUlNcbiAgICovXG5cbiAgZ2xvYkNoYXJzKHdpbjMyKSB7XG4gICAgcmV0dXJuIHdpbjMyID09PSB0cnVlID8gV0lORE9XU19DSEFSUyA6IFBPU0lYX0NIQVJTO1xuICB9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHdpbjMyID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbmNvbnN0IHtcbiAgUkVHRVhfQkFDS1NMQVNILFxuICBSRUdFWF9SRU1PVkVfQkFDS1NMQVNILFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTLFxuICBSRUdFWF9TUEVDSUFMX0NIQVJTX0dMT0JBTFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5cbmV4cG9ydHMuaXNPYmplY3QgPSB2YWwgPT4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5leHBvcnRzLmhhc1JlZ2V4Q2hhcnMgPSBzdHIgPT4gUkVHRVhfU1BFQ0lBTF9DSEFSUy50ZXN0KHN0cik7XG5leHBvcnRzLmlzUmVnZXhDaGFyID0gc3RyID0+IHN0ci5sZW5ndGggPT09IDEgJiYgZXhwb3J0cy5oYXNSZWdleENoYXJzKHN0cik7XG5leHBvcnRzLmVzY2FwZVJlZ2V4ID0gc3RyID0+IHN0ci5yZXBsYWNlKFJFR0VYX1NQRUNJQUxfQ0hBUlNfR0xPQkFMLCAnXFxcXCQxJyk7XG5leHBvcnRzLnRvUG9zaXhTbGFzaGVzID0gc3RyID0+IHN0ci5yZXBsYWNlKFJFR0VYX0JBQ0tTTEFTSCwgJy8nKTtcblxuZXhwb3J0cy5yZW1vdmVCYWNrc2xhc2hlcyA9IHN0ciA9PiB7XG4gIHJldHVybiBzdHIucmVwbGFjZShSRUdFWF9SRU1PVkVfQkFDS1NMQVNILCBtYXRjaCA9PiB7XG4gICAgcmV0dXJuIG1hdGNoID09PSAnXFxcXCcgPyAnJyA6IG1hdGNoO1xuICB9KTtcbn07XG5cbmV4cG9ydHMuc3VwcG9ydHNMb29rYmVoaW5kcyA9ICgpID0+IHtcbiAgY29uc3Qgc2VncyA9IHByb2Nlc3MudmVyc2lvbi5zbGljZSgxKS5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICBpZiAoc2Vncy5sZW5ndGggPT09IDMgJiYgc2Vnc1swXSA+PSA5IHx8IChzZWdzWzBdID09PSA4ICYmIHNlZ3NbMV0gPj0gMTApKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0cy5pc1dpbmRvd3MgPSBvcHRpb25zID0+IHtcbiAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMud2luZG93cyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMud2luZG93cztcbiAgfVxuICByZXR1cm4gd2luMzIgPT09IHRydWUgfHwgcGF0aC5zZXAgPT09ICdcXFxcJztcbn07XG5cbmV4cG9ydHMuZXNjYXBlTGFzdCA9IChpbnB1dCwgY2hhciwgbGFzdElkeCkgPT4ge1xuICBjb25zdCBpZHggPSBpbnB1dC5sYXN0SW5kZXhPZihjaGFyLCBsYXN0SWR4KTtcbiAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiBpbnB1dDtcbiAgaWYgKGlucHV0W2lkeCAtIDFdID09PSAnXFxcXCcpIHJldHVybiBleHBvcnRzLmVzY2FwZUxhc3QoaW5wdXQsIGNoYXIsIGlkeCAtIDEpO1xuICByZXR1cm4gYCR7aW5wdXQuc2xpY2UoMCwgaWR4KX1cXFxcJHtpbnB1dC5zbGljZShpZHgpfWA7XG59O1xuXG5leHBvcnRzLnJlbW92ZVByZWZpeCA9IChpbnB1dCwgc3RhdGUgPSB7fSkgPT4ge1xuICBsZXQgb3V0cHV0ID0gaW5wdXQ7XG4gIGlmIChvdXRwdXQuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIG91dHB1dCA9IG91dHB1dC5zbGljZSgyKTtcbiAgICBzdGF0ZS5wcmVmaXggPSAnLi8nO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5leHBvcnRzLndyYXBPdXRwdXQgPSAoaW5wdXQsIHN0YXRlID0ge30sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCBwcmVwZW5kID0gb3B0aW9ucy5jb250YWlucyA/ICcnIDogJ14nO1xuICBjb25zdCBhcHBlbmQgPSBvcHRpb25zLmNvbnRhaW5zID8gJycgOiAnJCc7XG5cbiAgbGV0IG91dHB1dCA9IGAke3ByZXBlbmR9KD86JHtpbnB1dH0pJHthcHBlbmR9YDtcbiAgaWYgKHN0YXRlLm5lZ2F0ZWQgPT09IHRydWUpIHtcbiAgICBvdXRwdXQgPSBgKD86Xig/ISR7b3V0cHV0fSkuKiQpYDtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuY29uc3Qge1xuICBDSEFSX0FTVEVSSVNLLCAgICAgICAgICAgICAvKiAqICovXG4gIENIQVJfQVQsICAgICAgICAgICAgICAgICAgIC8qIEAgKi9cbiAgQ0hBUl9CQUNLV0FSRF9TTEFTSCwgICAgICAgLyogXFwgKi9cbiAgQ0hBUl9DT01NQSwgICAgICAgICAgICAgICAgLyogLCAqL1xuICBDSEFSX0RPVCwgICAgICAgICAgICAgICAgICAvKiAuICovXG4gIENIQVJfRVhDTEFNQVRJT05fTUFSSywgICAgIC8qICEgKi9cbiAgQ0hBUl9GT1JXQVJEX1NMQVNILCAgICAgICAgLyogLyAqL1xuICBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UsICAgICAvKiB7ICovXG4gIENIQVJfTEVGVF9QQVJFTlRIRVNFUywgICAgIC8qICggKi9cbiAgQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VULCAgLyogWyAqL1xuICBDSEFSX1BMVVMsICAgICAgICAgICAgICAgICAvKiArICovXG4gIENIQVJfUVVFU1RJT05fTUFSSywgICAgICAgIC8qID8gKi9cbiAgQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSwgICAgLyogfSAqL1xuICBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTLCAgICAvKiApICovXG4gIENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQgIC8qIF0gKi9cbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xuXG5jb25zdCBpc1BhdGhTZXBhcmF0b3IgPSBjb2RlID0+IHtcbiAgcmV0dXJuIGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCB8fCBjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIO1xufTtcblxuY29uc3QgZGVwdGggPSB0b2tlbiA9PiB7XG4gIGlmICh0b2tlbi5pc1ByZWZpeCAhPT0gdHJ1ZSkge1xuICAgIHRva2VuLmRlcHRoID0gdG9rZW4uaXNHbG9ic3RhciA/IEluZmluaXR5IDogMTtcbiAgfVxufTtcblxuLyoqXG4gKiBRdWlja2x5IHNjYW5zIGEgZ2xvYiBwYXR0ZXJuIGFuZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgaGFuZGZ1bCBvZlxuICogdXNlZnVsIHByb3BlcnRpZXMsIGxpa2UgYGlzR2xvYmAsIGBwYXRoYCAodGhlIGxlYWRpbmcgbm9uLWdsb2IsIGlmIGl0IGV4aXN0cyksXG4gKiBgZ2xvYmAgKHRoZSBhY3R1YWwgcGF0dGVybiksIGBuZWdhdGVkYCAodHJ1ZSBpZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBgIWAgYnV0IG5vdFxuICogd2l0aCBgIShgKSBhbmQgYG5lZ2F0ZWRFeHRnbG9iYCAodHJ1ZSBpZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBgIShgKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcG0gPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIGNvbnNvbGUubG9nKHBtLnNjYW4oJ2Zvby9iYXIvKi5qcycpKTtcbiAqIHsgaXNHbG9iOiB0cnVlLCBpbnB1dDogJ2Zvby9iYXIvKi5qcycsIGJhc2U6ICdmb28vYmFyJywgZ2xvYjogJyouanMnIH1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJgXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggdG9rZW5zIGFuZCByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5jb25zdCBzY2FuID0gKGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aCAtIDE7XG4gIGNvbnN0IHNjYW5Ub0VuZCA9IG9wdHMucGFydHMgPT09IHRydWUgfHwgb3B0cy5zY2FuVG9FbmQgPT09IHRydWU7XG4gIGNvbnN0IHNsYXNoZXMgPSBbXTtcbiAgY29uc3QgdG9rZW5zID0gW107XG4gIGNvbnN0IHBhcnRzID0gW107XG5cbiAgbGV0IHN0ciA9IGlucHV0O1xuICBsZXQgaW5kZXggPSAtMTtcbiAgbGV0IHN0YXJ0ID0gMDtcbiAgbGV0IGxhc3RJbmRleCA9IDA7XG4gIGxldCBpc0JyYWNlID0gZmFsc2U7XG4gIGxldCBpc0JyYWNrZXQgPSBmYWxzZTtcbiAgbGV0IGlzR2xvYiA9IGZhbHNlO1xuICBsZXQgaXNFeHRnbG9iID0gZmFsc2U7XG4gIGxldCBpc0dsb2JzdGFyID0gZmFsc2U7XG4gIGxldCBicmFjZUVzY2FwZWQgPSBmYWxzZTtcbiAgbGV0IGJhY2tzbGFzaGVzID0gZmFsc2U7XG4gIGxldCBuZWdhdGVkID0gZmFsc2U7XG4gIGxldCBuZWdhdGVkRXh0Z2xvYiA9IGZhbHNlO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgbGV0IGJyYWNlcyA9IDA7XG4gIGxldCBwcmV2O1xuICBsZXQgY29kZTtcbiAgbGV0IHRva2VuID0geyB2YWx1ZTogJycsIGRlcHRoOiAwLCBpc0dsb2I6IGZhbHNlIH07XG5cbiAgY29uc3QgZW9zID0gKCkgPT4gaW5kZXggPj0gbGVuZ3RoO1xuICBjb25zdCBwZWVrID0gKCkgPT4gc3RyLmNoYXJDb2RlQXQoaW5kZXggKyAxKTtcbiAgY29uc3QgYWR2YW5jZSA9ICgpID0+IHtcbiAgICBwcmV2ID0gY29kZTtcbiAgICByZXR1cm4gc3RyLmNoYXJDb2RlQXQoKytpbmRleCk7XG4gIH07XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgY29kZSA9IGFkdmFuY2UoKTtcbiAgICBsZXQgbmV4dDtcblxuICAgIGlmIChjb2RlID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgIGNvZGUgPSBhZHZhbmNlKCk7XG5cbiAgICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgICAgYnJhY2VFc2NhcGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChicmFjZUVzY2FwZWQgPT09IHRydWUgfHwgY29kZSA9PT0gQ0hBUl9MRUZUX0NVUkxZX0JSQUNFKSB7XG4gICAgICBicmFjZXMrKztcblxuICAgICAgd2hpbGUgKGVvcygpICE9PSB0cnVlICYmIChjb2RlID0gYWR2YW5jZSgpKSkge1xuICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgICAgIGJhY2tzbGFzaGVzID0gdG9rZW4uYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICAgIGFkdmFuY2UoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBDSEFSX0xFRlRfQ1VSTFlfQlJBQ0UpIHtcbiAgICAgICAgICBicmFjZXMrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChicmFjZUVzY2FwZWQgIT09IHRydWUgJiYgY29kZSA9PT0gQ0hBUl9ET1QgJiYgKGNvZGUgPSBhZHZhbmNlKCkpID09PSBDSEFSX0RPVCkge1xuICAgICAgICAgIGlzQnJhY2UgPSB0b2tlbi5pc0JyYWNlID0gdHJ1ZTtcbiAgICAgICAgICBpc0dsb2IgPSB0b2tlbi5pc0dsb2IgPSB0cnVlO1xuICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJyYWNlRXNjYXBlZCAhPT0gdHJ1ZSAmJiBjb2RlID09PSBDSEFSX0NPTU1BKSB7XG4gICAgICAgICAgaXNCcmFjZSA9IHRva2VuLmlzQnJhY2UgPSB0cnVlO1xuICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9SSUdIVF9DVVJMWV9CUkFDRSkge1xuICAgICAgICAgIGJyYWNlcy0tO1xuXG4gICAgICAgICAgaWYgKGJyYWNlcyA9PT0gMCkge1xuICAgICAgICAgICAgYnJhY2VFc2NhcGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpc0JyYWNlID0gdG9rZW4uaXNCcmFjZSA9IHRydWU7XG4gICAgICAgICAgICBmaW5pc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkge1xuICAgICAgc2xhc2hlcy5wdXNoKGluZGV4KTtcbiAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgIHRva2VuID0geyB2YWx1ZTogJycsIGRlcHRoOiAwLCBpc0dsb2I6IGZhbHNlIH07XG5cbiAgICAgIGlmIChmaW5pc2hlZCA9PT0gdHJ1ZSkgY29udGludWU7XG4gICAgICBpZiAocHJldiA9PT0gQ0hBUl9ET1QgJiYgaW5kZXggPT09IChzdGFydCArIDEpKSB7XG4gICAgICAgIHN0YXJ0ICs9IDI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsYXN0SW5kZXggPSBpbmRleCArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5ub2V4dCAhPT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaXNFeHRnbG9iQ2hhciA9IGNvZGUgPT09IENIQVJfUExVU1xuICAgICAgICB8fCBjb2RlID09PSBDSEFSX0FUXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfQVNURVJJU0tcbiAgICAgICAgfHwgY29kZSA9PT0gQ0hBUl9RVUVTVElPTl9NQVJLXG4gICAgICAgIHx8IGNvZGUgPT09IENIQVJfRVhDTEFNQVRJT05fTUFSSztcblxuICAgICAgaWYgKGlzRXh0Z2xvYkNoYXIgPT09IHRydWUgJiYgcGVlaygpID09PSBDSEFSX0xFRlRfUEFSRU5USEVTRVMpIHtcbiAgICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgICAgaXNFeHRnbG9iID0gdG9rZW4uaXNFeHRnbG9iID0gdHJ1ZTtcbiAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9FWENMQU1BVElPTl9NQVJLICYmIGluZGV4ID09PSBzdGFydCkge1xuICAgICAgICAgIG5lZ2F0ZWRFeHRnbG9iID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkge1xuICAgICAgICAgICAgICBiYWNrc2xhc2hlcyA9IHRva2VuLmJhY2tzbGFzaGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29kZSA9IGFkdmFuY2UoKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX1JJR0hUX1BBUkVOVEhFU0VTKSB7XG4gICAgICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX0FTVEVSSVNLKSB7XG4gICAgICBpZiAocHJldiA9PT0gQ0hBUl9BU1RFUklTSykgaXNHbG9ic3RhciA9IHRva2VuLmlzR2xvYnN0YXIgPSB0cnVlO1xuICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcbiAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSBDSEFSX1FVRVNUSU9OX01BUkspIHtcbiAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICBmaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoY29kZSA9PT0gQ0hBUl9MRUZUX1NRVUFSRV9CUkFDS0VUKSB7XG4gICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKG5leHQgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgIGlmIChuZXh0ID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7XG4gICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgYWR2YW5jZSgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHQgPT09IENIQVJfUklHSFRfU1FVQVJFX0JSQUNLRVQpIHtcbiAgICAgICAgICBpc0JyYWNrZXQgPSB0b2tlbi5pc0JyYWNrZXQgPSB0cnVlO1xuICAgICAgICAgIGlzR2xvYiA9IHRva2VuLmlzR2xvYiA9IHRydWU7XG4gICAgICAgICAgZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2FuVG9FbmQgPT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChvcHRzLm5vbmVnYXRlICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfRVhDTEFNQVRJT05fTUFSSyAmJiBpbmRleCA9PT0gc3RhcnQpIHtcbiAgICAgIG5lZ2F0ZWQgPSB0b2tlbi5uZWdhdGVkID0gdHJ1ZTtcbiAgICAgIHN0YXJ0Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5ub3BhcmVuICE9PSB0cnVlICYmIGNvZGUgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUykge1xuICAgICAgaXNHbG9iID0gdG9rZW4uaXNHbG9iID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICB3aGlsZSAoZW9zKCkgIT09IHRydWUgJiYgKGNvZGUgPSBhZHZhbmNlKCkpKSB7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfTEVGVF9QQVJFTlRIRVNFUykge1xuICAgICAgICAgICAgYmFja3NsYXNoZXMgPSB0b2tlbi5iYWNrc2xhc2hlcyA9IHRydWU7XG4gICAgICAgICAgICBjb2RlID0gYWR2YW5jZSgpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfUklHSFRfUEFSRU5USEVTRVMpIHtcbiAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChpc0dsb2IgPT09IHRydWUpIHtcbiAgICAgIGZpbmlzaGVkID0gdHJ1ZTtcblxuICAgICAgaWYgKHNjYW5Ub0VuZCA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdHMubm9leHQgPT09IHRydWUpIHtcbiAgICBpc0V4dGdsb2IgPSBmYWxzZTtcbiAgICBpc0dsb2IgPSBmYWxzZTtcbiAgfVxuXG4gIGxldCBiYXNlID0gc3RyO1xuICBsZXQgcHJlZml4ID0gJyc7XG4gIGxldCBnbG9iID0gJyc7XG5cbiAgaWYgKHN0YXJ0ID4gMCkge1xuICAgIHByZWZpeCA9IHN0ci5zbGljZSgwLCBzdGFydCk7XG4gICAgc3RyID0gc3RyLnNsaWNlKHN0YXJ0KTtcbiAgICBsYXN0SW5kZXggLT0gc3RhcnQ7XG4gIH1cblxuICBpZiAoYmFzZSAmJiBpc0dsb2IgPT09IHRydWUgJiYgbGFzdEluZGV4ID4gMCkge1xuICAgIGJhc2UgPSBzdHIuc2xpY2UoMCwgbGFzdEluZGV4KTtcbiAgICBnbG9iID0gc3RyLnNsaWNlKGxhc3RJbmRleCk7XG4gIH0gZWxzZSBpZiAoaXNHbG9iID09PSB0cnVlKSB7XG4gICAgYmFzZSA9ICcnO1xuICAgIGdsb2IgPSBzdHI7XG4gIH0gZWxzZSB7XG4gICAgYmFzZSA9IHN0cjtcbiAgfVxuXG4gIGlmIChiYXNlICYmIGJhc2UgIT09ICcnICYmIGJhc2UgIT09ICcvJyAmJiBiYXNlICE9PSBzdHIpIHtcbiAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGJhc2UuY2hhckNvZGVBdChiYXNlLmxlbmd0aCAtIDEpKSkge1xuICAgICAgYmFzZSA9IGJhc2Uuc2xpY2UoMCwgLTEpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLnVuZXNjYXBlID09PSB0cnVlKSB7XG4gICAgaWYgKGdsb2IpIGdsb2IgPSB1dGlscy5yZW1vdmVCYWNrc2xhc2hlcyhnbG9iKTtcblxuICAgIGlmIChiYXNlICYmIGJhY2tzbGFzaGVzID09PSB0cnVlKSB7XG4gICAgICBiYXNlID0gdXRpbHMucmVtb3ZlQmFja3NsYXNoZXMoYmFzZSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgcHJlZml4LFxuICAgIGlucHV0LFxuICAgIHN0YXJ0LFxuICAgIGJhc2UsXG4gICAgZ2xvYixcbiAgICBpc0JyYWNlLFxuICAgIGlzQnJhY2tldCxcbiAgICBpc0dsb2IsXG4gICAgaXNFeHRnbG9iLFxuICAgIGlzR2xvYnN0YXIsXG4gICAgbmVnYXRlZCxcbiAgICBuZWdhdGVkRXh0Z2xvYlxuICB9O1xuXG4gIGlmIChvcHRzLnRva2VucyA9PT0gdHJ1ZSkge1xuICAgIHN0YXRlLm1heERlcHRoID0gMDtcbiAgICBpZiAoIWlzUGF0aFNlcGFyYXRvcihjb2RlKSkge1xuICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgIH1cbiAgICBzdGF0ZS50b2tlbnMgPSB0b2tlbnM7XG4gIH1cblxuICBpZiAob3B0cy5wYXJ0cyA9PT0gdHJ1ZSB8fCBvcHRzLnRva2VucyA9PT0gdHJ1ZSkge1xuICAgIGxldCBwcmV2SW5kZXg7XG5cbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBzbGFzaGVzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgIGNvbnN0IG4gPSBwcmV2SW5kZXggPyBwcmV2SW5kZXggKyAxIDogc3RhcnQ7XG4gICAgICBjb25zdCBpID0gc2xhc2hlc1tpZHhdO1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC5zbGljZShuLCBpKTtcbiAgICAgIGlmIChvcHRzLnRva2Vucykge1xuICAgICAgICBpZiAoaWR4ID09PSAwICYmIHN0YXJ0ICE9PSAwKSB7XG4gICAgICAgICAgdG9rZW5zW2lkeF0uaXNQcmVmaXggPSB0cnVlO1xuICAgICAgICAgIHRva2Vuc1tpZHhdLnZhbHVlID0gcHJlZml4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRva2Vuc1tpZHhdLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZGVwdGgodG9rZW5zW2lkeF0pO1xuICAgICAgICBzdGF0ZS5tYXhEZXB0aCArPSB0b2tlbnNbaWR4XS5kZXB0aDtcbiAgICAgIH1cbiAgICAgIGlmIChpZHggIT09IDAgfHwgdmFsdWUgIT09ICcnKSB7XG4gICAgICAgIHBhcnRzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgICAgcHJldkluZGV4ID0gaTtcbiAgICB9XG5cbiAgICBpZiAocHJldkluZGV4ICYmIHByZXZJbmRleCArIDEgPCBpbnB1dC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gaW5wdXQuc2xpY2UocHJldkluZGV4ICsgMSk7XG4gICAgICBwYXJ0cy5wdXNoKHZhbHVlKTtcblxuICAgICAgaWYgKG9wdHMudG9rZW5zKSB7XG4gICAgICAgIHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZGVwdGgodG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXSk7XG4gICAgICAgIHN0YXRlLm1heERlcHRoICs9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0uZGVwdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGUuc2xhc2hlcyA9IHNsYXNoZXM7XG4gICAgc3RhdGUucGFydHMgPSBwYXJ0cztcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gc2NhbjtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCB7XG4gIE1BWF9MRU5HVEgsXG4gIFBPU0lYX1JFR0VYX1NPVVJDRSxcbiAgUkVHRVhfTk9OX1NQRUNJQUxfQ0hBUlMsXG4gIFJFR0VYX1NQRUNJQUxfQ0hBUlNfQkFDS1JFRixcbiAgUkVQTEFDRU1FTlRTXG59ID0gY29uc3RhbnRzO1xuXG4vKipcbiAqIEhlbHBlcnNcbiAqL1xuXG5jb25zdCBleHBhbmRSYW5nZSA9IChhcmdzLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5leHBhbmRSYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBvcHRpb25zLmV4cGFuZFJhbmdlKC4uLmFyZ3MsIG9wdGlvbnMpO1xuICB9XG5cbiAgYXJncy5zb3J0KCk7XG4gIGNvbnN0IHZhbHVlID0gYFske2FyZ3Muam9pbignLScpfV1gO1xuXG4gIHRyeSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldyAqL1xuICAgIG5ldyBSZWdFeHAodmFsdWUpO1xuICB9IGNhdGNoIChleCkge1xuICAgIHJldHVybiBhcmdzLm1hcCh2ID0+IHV0aWxzLmVzY2FwZVJlZ2V4KHYpKS5qb2luKCcuLicpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgdGhlIG1lc3NhZ2UgZm9yIGEgc3ludGF4IGVycm9yXG4gKi9cblxuY29uc3Qgc3ludGF4RXJyb3IgPSAodHlwZSwgY2hhcikgPT4ge1xuICByZXR1cm4gYE1pc3NpbmcgJHt0eXBlfTogXCIke2NoYXJ9XCIgLSB1c2UgXCJcXFxcXFxcXCR7Y2hhcn1cIiB0byBtYXRjaCBsaXRlcmFsIGNoYXJhY3RlcnNgO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gaW5wdXQgc3RyaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5cbmNvbnN0IHBhcnNlID0gKGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGlucHV0ID0gUkVQTEFDRU1FTlRTW2lucHV0XSB8fCBpbnB1dDtcblxuICBjb25zdCBvcHRzID0geyAuLi5vcHRpb25zIH07XG4gIGNvbnN0IG1heCA9IHR5cGVvZiBvcHRzLm1heExlbmd0aCA9PT0gJ251bWJlcicgPyBNYXRoLm1pbihNQVhfTEVOR1RILCBvcHRzLm1heExlbmd0aCkgOiBNQVhfTEVOR1RIO1xuXG4gIGxldCBsZW4gPSBpbnB1dC5sZW5ndGg7XG4gIGlmIChsZW4gPiBtYXgpIHtcbiAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoYElucHV0IGxlbmd0aDogJHtsZW59LCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBsZW5ndGg6ICR7bWF4fWApO1xuICB9XG5cbiAgY29uc3QgYm9zID0geyB0eXBlOiAnYm9zJywgdmFsdWU6ICcnLCBvdXRwdXQ6IG9wdHMucHJlcGVuZCB8fCAnJyB9O1xuICBjb25zdCB0b2tlbnMgPSBbYm9zXTtcblxuICBjb25zdCBjYXB0dXJlID0gb3B0cy5jYXB0dXJlID8gJycgOiAnPzonO1xuICBjb25zdCB3aW4zMiA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKTtcblxuICAvLyBjcmVhdGUgY29uc3RhbnRzIGJhc2VkIG9uIHBsYXRmb3JtLCBmb3Igd2luZG93cyBvciBwb3NpeFxuICBjb25zdCBQTEFURk9STV9DSEFSUyA9IGNvbnN0YW50cy5nbG9iQ2hhcnMod2luMzIpO1xuICBjb25zdCBFWFRHTE9CX0NIQVJTID0gY29uc3RhbnRzLmV4dGdsb2JDaGFycyhQTEFURk9STV9DSEFSUyk7XG5cbiAgY29uc3Qge1xuICAgIERPVF9MSVRFUkFMLFxuICAgIFBMVVNfTElURVJBTCxcbiAgICBTTEFTSF9MSVRFUkFMLFxuICAgIE9ORV9DSEFSLFxuICAgIERPVFNfU0xBU0gsXG4gICAgTk9fRE9ULFxuICAgIE5PX0RPVF9TTEFTSCxcbiAgICBOT19ET1RTX1NMQVNILFxuICAgIFFNQVJLLFxuICAgIFFNQVJLX05PX0RPVCxcbiAgICBTVEFSLFxuICAgIFNUQVJUX0FOQ0hPUlxuICB9ID0gUExBVEZPUk1fQ0hBUlM7XG5cbiAgY29uc3QgZ2xvYnN0YXIgPSBvcHRzID0+IHtcbiAgICByZXR1cm4gYCgke2NhcHR1cmV9KD86KD8hJHtTVEFSVF9BTkNIT1J9JHtvcHRzLmRvdCA/IERPVFNfU0xBU0ggOiBET1RfTElURVJBTH0pLikqPylgO1xuICB9O1xuXG4gIGNvbnN0IG5vZG90ID0gb3B0cy5kb3QgPyAnJyA6IE5PX0RPVDtcbiAgY29uc3QgcW1hcmtOb0RvdCA9IG9wdHMuZG90ID8gUU1BUksgOiBRTUFSS19OT19ET1Q7XG4gIGxldCBzdGFyID0gb3B0cy5iYXNoID09PSB0cnVlID8gZ2xvYnN0YXIob3B0cykgOiBTVEFSO1xuXG4gIGlmIChvcHRzLmNhcHR1cmUpIHtcbiAgICBzdGFyID0gYCgke3N0YXJ9KWA7XG4gIH1cblxuICAvLyBtaW5pbWF0Y2ggb3B0aW9ucyBzdXBwb3J0XG4gIGlmICh0eXBlb2Ygb3B0cy5ub2V4dCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgb3B0cy5ub2V4dGdsb2IgPSBvcHRzLm5vZXh0O1xuICB9XG5cbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgaW5wdXQsXG4gICAgaW5kZXg6IC0xLFxuICAgIHN0YXJ0OiAwLFxuICAgIGRvdDogb3B0cy5kb3QgPT09IHRydWUsXG4gICAgY29uc3VtZWQ6ICcnLFxuICAgIG91dHB1dDogJycsXG4gICAgcHJlZml4OiAnJyxcbiAgICBiYWNrdHJhY2s6IGZhbHNlLFxuICAgIG5lZ2F0ZWQ6IGZhbHNlLFxuICAgIGJyYWNrZXRzOiAwLFxuICAgIGJyYWNlczogMCxcbiAgICBwYXJlbnM6IDAsXG4gICAgcXVvdGVzOiAwLFxuICAgIGdsb2JzdGFyOiBmYWxzZSxcbiAgICB0b2tlbnNcbiAgfTtcblxuICBpbnB1dCA9IHV0aWxzLnJlbW92ZVByZWZpeChpbnB1dCwgc3RhdGUpO1xuICBsZW4gPSBpbnB1dC5sZW5ndGg7XG5cbiAgY29uc3QgZXh0Z2xvYnMgPSBbXTtcbiAgY29uc3QgYnJhY2VzID0gW107XG4gIGNvbnN0IHN0YWNrID0gW107XG4gIGxldCBwcmV2ID0gYm9zO1xuICBsZXQgdmFsdWU7XG5cbiAgLyoqXG4gICAqIFRva2VuaXppbmcgaGVscGVyc1xuICAgKi9cblxuICBjb25zdCBlb3MgPSAoKSA9PiBzdGF0ZS5pbmRleCA9PT0gbGVuIC0gMTtcbiAgY29uc3QgcGVlayA9IHN0YXRlLnBlZWsgPSAobiA9IDEpID0+IGlucHV0W3N0YXRlLmluZGV4ICsgbl07XG4gIGNvbnN0IGFkdmFuY2UgPSBzdGF0ZS5hZHZhbmNlID0gKCkgPT4gaW5wdXRbKytzdGF0ZS5pbmRleF0gfHwgJyc7XG4gIGNvbnN0IHJlbWFpbmluZyA9ICgpID0+IGlucHV0LnNsaWNlKHN0YXRlLmluZGV4ICsgMSk7XG4gIGNvbnN0IGNvbnN1bWUgPSAodmFsdWUgPSAnJywgbnVtID0gMCkgPT4ge1xuICAgIHN0YXRlLmNvbnN1bWVkICs9IHZhbHVlO1xuICAgIHN0YXRlLmluZGV4ICs9IG51bTtcbiAgfTtcblxuICBjb25zdCBhcHBlbmQgPSB0b2tlbiA9PiB7XG4gICAgc3RhdGUub3V0cHV0ICs9IHRva2VuLm91dHB1dCAhPSBudWxsID8gdG9rZW4ub3V0cHV0IDogdG9rZW4udmFsdWU7XG4gICAgY29uc3VtZSh0b2tlbi52YWx1ZSk7XG4gIH07XG5cbiAgY29uc3QgbmVnYXRlID0gKCkgPT4ge1xuICAgIGxldCBjb3VudCA9IDE7XG5cbiAgICB3aGlsZSAocGVlaygpID09PSAnIScgJiYgKHBlZWsoMikgIT09ICcoJyB8fCBwZWVrKDMpID09PSAnPycpKSB7XG4gICAgICBhZHZhbmNlKCk7XG4gICAgICBzdGF0ZS5zdGFydCsrO1xuICAgICAgY291bnQrKztcbiAgICB9XG5cbiAgICBpZiAoY291bnQgJSAyID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3RhdGUubmVnYXRlZCA9IHRydWU7XG4gICAgc3RhdGUuc3RhcnQrKztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBpbmNyZW1lbnQgPSB0eXBlID0+IHtcbiAgICBzdGF0ZVt0eXBlXSsrO1xuICAgIHN0YWNrLnB1c2godHlwZSk7XG4gIH07XG5cbiAgY29uc3QgZGVjcmVtZW50ID0gdHlwZSA9PiB7XG4gICAgc3RhdGVbdHlwZV0tLTtcbiAgICBzdGFjay5wb3AoKTtcbiAgfTtcblxuICAvKipcbiAgICogUHVzaCB0b2tlbnMgb250byB0aGUgdG9rZW5zIGFycmF5LiBUaGlzIGhlbHBlciBzcGVlZHMgdXBcbiAgICogdG9rZW5pemluZyBieSAxKSBoZWxwaW5nIHVzIGF2b2lkIGJhY2t0cmFja2luZyBhcyBtdWNoIGFzIHBvc3NpYmxlLFxuICAgKiBhbmQgMikgaGVscGluZyB1cyBhdm9pZCBjcmVhdGluZyBleHRyYSB0b2tlbnMgd2hlbiBjb25zZWN1dGl2ZVxuICAgKiBjaGFyYWN0ZXJzIGFyZSBwbGFpbiB0ZXh0LiBUaGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlIGFuZCBzaW1wbGlmaWVzXG4gICAqIGxvb2tiZWhpbmRzLlxuICAgKi9cblxuICBjb25zdCBwdXNoID0gdG9rID0+IHtcbiAgICBpZiAocHJldi50eXBlID09PSAnZ2xvYnN0YXInKSB7XG4gICAgICBjb25zdCBpc0JyYWNlID0gc3RhdGUuYnJhY2VzID4gMCAmJiAodG9rLnR5cGUgPT09ICdjb21tYScgfHwgdG9rLnR5cGUgPT09ICdicmFjZScpO1xuICAgICAgY29uc3QgaXNFeHRnbG9iID0gdG9rLmV4dGdsb2IgPT09IHRydWUgfHwgKGV4dGdsb2JzLmxlbmd0aCAmJiAodG9rLnR5cGUgPT09ICdwaXBlJyB8fCB0b2sudHlwZSA9PT0gJ3BhcmVuJykpO1xuXG4gICAgICBpZiAodG9rLnR5cGUgIT09ICdzbGFzaCcgJiYgdG9rLnR5cGUgIT09ICdwYXJlbicgJiYgIWlzQnJhY2UgJiYgIWlzRXh0Z2xvYikge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLXByZXYub3V0cHV0Lmxlbmd0aCk7XG4gICAgICAgIHByZXYudHlwZSA9ICdzdGFyJztcbiAgICAgICAgcHJldi52YWx1ZSA9ICcqJztcbiAgICAgICAgcHJldi5vdXRwdXQgPSBzdGFyO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJldi5vdXRwdXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4dGdsb2JzLmxlbmd0aCAmJiB0b2sudHlwZSAhPT0gJ3BhcmVuJykge1xuICAgICAgZXh0Z2xvYnNbZXh0Z2xvYnMubGVuZ3RoIC0gMV0uaW5uZXIgKz0gdG9rLnZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0b2sudmFsdWUgfHwgdG9rLm91dHB1dCkgYXBwZW5kKHRvayk7XG4gICAgaWYgKHByZXYgJiYgcHJldi50eXBlID09PSAndGV4dCcgJiYgdG9rLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcHJldi52YWx1ZSArPSB0b2sudmFsdWU7XG4gICAgICBwcmV2Lm91dHB1dCA9IChwcmV2Lm91dHB1dCB8fCAnJykgKyB0b2sudmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdG9rLnByZXYgPSBwcmV2O1xuICAgIHRva2Vucy5wdXNoKHRvayk7XG4gICAgcHJldiA9IHRvaztcbiAgfTtcblxuICBjb25zdCBleHRnbG9iT3BlbiA9ICh0eXBlLCB2YWx1ZSkgPT4ge1xuICAgIGNvbnN0IHRva2VuID0geyAuLi5FWFRHTE9CX0NIQVJTW3ZhbHVlXSwgY29uZGl0aW9uczogMSwgaW5uZXI6ICcnIH07XG5cbiAgICB0b2tlbi5wcmV2ID0gcHJldjtcbiAgICB0b2tlbi5wYXJlbnMgPSBzdGF0ZS5wYXJlbnM7XG4gICAgdG9rZW4ub3V0cHV0ID0gc3RhdGUub3V0cHV0O1xuICAgIGNvbnN0IG91dHB1dCA9IChvcHRzLmNhcHR1cmUgPyAnKCcgOiAnJykgKyB0b2tlbi5vcGVuO1xuXG4gICAgaW5jcmVtZW50KCdwYXJlbnMnKTtcbiAgICBwdXNoKHsgdHlwZSwgdmFsdWUsIG91dHB1dDogc3RhdGUub3V0cHV0ID8gJycgOiBPTkVfQ0hBUiB9KTtcbiAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgZXh0Z2xvYjogdHJ1ZSwgdmFsdWU6IGFkdmFuY2UoKSwgb3V0cHV0IH0pO1xuICAgIGV4dGdsb2JzLnB1c2godG9rZW4pO1xuICB9O1xuXG4gIGNvbnN0IGV4dGdsb2JDbG9zZSA9IHRva2VuID0+IHtcbiAgICBsZXQgb3V0cHV0ID0gdG9rZW4uY2xvc2UgKyAob3B0cy5jYXB0dXJlID8gJyknIDogJycpO1xuICAgIGxldCByZXN0O1xuXG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICduZWdhdGUnKSB7XG4gICAgICBsZXQgZXh0Z2xvYlN0YXIgPSBzdGFyO1xuXG4gICAgICBpZiAodG9rZW4uaW5uZXIgJiYgdG9rZW4uaW5uZXIubGVuZ3RoID4gMSAmJiB0b2tlbi5pbm5lci5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgIGV4dGdsb2JTdGFyID0gZ2xvYnN0YXIob3B0cyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChleHRnbG9iU3RhciAhPT0gc3RhciB8fCBlb3MoKSB8fCAvXlxcKSskLy50ZXN0KHJlbWFpbmluZygpKSkge1xuICAgICAgICBvdXRwdXQgPSB0b2tlbi5jbG9zZSA9IGApJCkpJHtleHRnbG9iU3Rhcn1gO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4uaW5uZXIuaW5jbHVkZXMoJyonKSAmJiAocmVzdCA9IHJlbWFpbmluZygpKSAmJiAvXlxcLlteXFxcXC8uXSskLy50ZXN0KHJlc3QpKSB7XG4gICAgICAgIC8vIEFueSBub24tbWFnaWNhbCBzdHJpbmcgKGAudHNgKSBvciBldmVuIG5lc3RlZCBleHByZXNzaW9uIChgLnt0cyx0c3h9YCkgY2FuIGZvbGxvdyBhZnRlciB0aGUgY2xvc2luZyBwYXJlbnRoZXNpcy5cbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHBhcnNlIHRoZSBzdHJpbmcgYW5kIHVzZSBpdCBpbiB0aGUgb3V0cHV0IG9mIHRoZSBvcmlnaW5hbCBwYXR0ZXJuLlxuICAgICAgICAvLyBTdWl0YWJsZSBwYXR0ZXJuczogYC8hKCouZCkudHNgLCBgLyEoKi5kKS57dHMsdHN4fWAsIGAqKi8hKCotZGJnKS5AKGpzKWAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIERpc2FibGluZyB0aGUgYGZhc3RwYXRoc2Agb3B0aW9uIGR1ZSB0byBhIHByb2JsZW0gd2l0aCBwYXJzaW5nIHN0cmluZ3MgYXMgYC50c2AgaW4gdGhlIHBhdHRlcm4gbGlrZSBgKiovISgqLmQpLnRzYC5cbiAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHBhcnNlKHJlc3QsIHsgLi4ub3B0aW9ucywgZmFzdHBhdGhzOiBmYWxzZSB9KS5vdXRwdXQ7XG5cbiAgICAgICAgb3V0cHV0ID0gdG9rZW4uY2xvc2UgPSBgKSR7ZXhwcmVzc2lvbn0pJHtleHRnbG9iU3Rhcn0pYDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRva2VuLnByZXYudHlwZSA9PT0gJ2JvcycpIHtcbiAgICAgICAgc3RhdGUubmVnYXRlZEV4dGdsb2IgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1c2goeyB0eXBlOiAncGFyZW4nLCBleHRnbG9iOiB0cnVlLCB2YWx1ZSwgb3V0cHV0IH0pO1xuICAgIGRlY3JlbWVudCgncGFyZW5zJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZhc3QgcGF0aHNcbiAgICovXG5cbiAgaWYgKG9wdHMuZmFzdHBhdGhzICE9PSBmYWxzZSAmJiAhLyheWyohXXxbLygpW1xcXXt9XCJdKS8udGVzdChpbnB1dCkpIHtcbiAgICBsZXQgYmFja3NsYXNoZXMgPSBmYWxzZTtcblxuICAgIGxldCBvdXRwdXQgPSBpbnB1dC5yZXBsYWNlKFJFR0VYX1NQRUNJQUxfQ0hBUlNfQkFDS1JFRiwgKG0sIGVzYywgY2hhcnMsIGZpcnN0LCByZXN0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGZpcnN0ID09PSAnXFxcXCcpIHtcbiAgICAgICAgYmFja3NsYXNoZXMgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0ID09PSAnPycpIHtcbiAgICAgICAgaWYgKGVzYykge1xuICAgICAgICAgIHJldHVybiBlc2MgKyBmaXJzdCArIChyZXN0ID8gUU1BUksucmVwZWF0KHJlc3QubGVuZ3RoKSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcW1hcmtOb0RvdCArIChyZXN0ID8gUU1BUksucmVwZWF0KHJlc3QubGVuZ3RoKSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUU1BUksucmVwZWF0KGNoYXJzLmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdCA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBET1RfTElURVJBTC5yZXBlYXQoY2hhcnMubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpcnN0ID09PSAnKicpIHtcbiAgICAgICAgaWYgKGVzYykge1xuICAgICAgICAgIHJldHVybiBlc2MgKyBmaXJzdCArIChyZXN0ID8gc3RhciA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlc2MgPyBtIDogYFxcXFwke219YDtcbiAgICB9KTtcblxuICAgIGlmIChiYWNrc2xhc2hlcyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKG9wdHMudW5lc2NhcGUgPT09IHRydWUpIHtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoL1xcXFwrL2csIG0gPT4ge1xuICAgICAgICAgIHJldHVybiBtLmxlbmd0aCAlIDIgPT09IDAgPyAnXFxcXFxcXFwnIDogKG0gPyAnXFxcXCcgOiAnJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvdXRwdXQgPT09IGlucHV0ICYmIG9wdHMuY29udGFpbnMgPT09IHRydWUpIHtcbiAgICAgIHN0YXRlLm91dHB1dCA9IGlucHV0O1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIHN0YXRlLm91dHB1dCA9IHV0aWxzLndyYXBPdXRwdXQob3V0cHV0LCBzdGF0ZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRva2VuaXplIGlucHV0IHVudGlsIHdlIHJlYWNoIGVuZC1vZi1zdHJpbmdcbiAgICovXG5cbiAgd2hpbGUgKCFlb3MoKSkge1xuICAgIHZhbHVlID0gYWR2YW5jZSgpO1xuXG4gICAgaWYgKHZhbHVlID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVzY2FwZWQgY2hhcmFjdGVyc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnXFxcXCcpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBwZWVrKCk7XG5cbiAgICAgIGlmIChuZXh0ID09PSAnLycgJiYgb3B0cy5iYXNoICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV4dCA9PT0gJy4nIHx8IG5leHQgPT09ICc7Jykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgIHZhbHVlICs9ICdcXFxcJztcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb2xsYXBzZSBzbGFzaGVzIHRvIHJlZHVjZSBwb3RlbnRpYWwgZm9yIGV4cGxvaXRzXG4gICAgICBjb25zdCBtYXRjaCA9IC9eXFxcXCsvLmV4ZWMocmVtYWluaW5nKCkpO1xuICAgICAgbGV0IHNsYXNoZXMgPSAwO1xuXG4gICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMF0ubGVuZ3RoID4gMikge1xuICAgICAgICBzbGFzaGVzID0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICBzdGF0ZS5pbmRleCArPSBzbGFzaGVzO1xuICAgICAgICBpZiAoc2xhc2hlcyAlIDIgIT09IDApIHtcbiAgICAgICAgICB2YWx1ZSArPSAnXFxcXCc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMudW5lc2NhcGUgPT09IHRydWUpIHtcbiAgICAgICAgdmFsdWUgPSBhZHZhbmNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSArPSBhZHZhbmNlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZS5icmFja2V0cyA9PT0gMCkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgd2UncmUgaW5zaWRlIGEgcmVnZXggY2hhcmFjdGVyIGNsYXNzLCBjb250aW51ZVxuICAgICAqIHVudGlsIHdlIHJlYWNoIHRoZSBjbG9zaW5nIGJyYWNrZXQuXG4gICAgICovXG5cbiAgICBpZiAoc3RhdGUuYnJhY2tldHMgPiAwICYmICh2YWx1ZSAhPT0gJ10nIHx8IHByZXYudmFsdWUgPT09ICdbJyB8fCBwcmV2LnZhbHVlID09PSAnW14nKSkge1xuICAgICAgaWYgKG9wdHMucG9zaXggIT09IGZhbHNlICYmIHZhbHVlID09PSAnOicpIHtcbiAgICAgICAgY29uc3QgaW5uZXIgPSBwcmV2LnZhbHVlLnNsaWNlKDEpO1xuICAgICAgICBpZiAoaW5uZXIuaW5jbHVkZXMoJ1snKSkge1xuICAgICAgICAgIHByZXYucG9zaXggPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKGlubmVyLmluY2x1ZGVzKCc6JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHByZXYudmFsdWUubGFzdEluZGV4T2YoJ1snKTtcbiAgICAgICAgICAgIGNvbnN0IHByZSA9IHByZXYudmFsdWUuc2xpY2UoMCwgaWR4KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBwcmV2LnZhbHVlLnNsaWNlKGlkeCArIDIpO1xuICAgICAgICAgICAgY29uc3QgcG9zaXggPSBQT1NJWF9SRUdFWF9TT1VSQ0VbcmVzdF07XG4gICAgICAgICAgICBpZiAocG9zaXgpIHtcbiAgICAgICAgICAgICAgcHJldi52YWx1ZSA9IHByZSArIHBvc2l4O1xuICAgICAgICAgICAgICBzdGF0ZS5iYWNrdHJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICBhZHZhbmNlKCk7XG5cbiAgICAgICAgICAgICAgaWYgKCFib3Mub3V0cHV0ICYmIHRva2Vucy5pbmRleE9mKHByZXYpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgYm9zLm91dHB1dCA9IE9ORV9DSEFSO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoKHZhbHVlID09PSAnWycgJiYgcGVlaygpICE9PSAnOicpIHx8ICh2YWx1ZSA9PT0gJy0nICYmIHBlZWsoKSA9PT0gJ10nKSkge1xuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPT09ICddJyAmJiAocHJldi52YWx1ZSA9PT0gJ1snIHx8IHByZXYudmFsdWUgPT09ICdbXicpKSB7XG4gICAgICAgIHZhbHVlID0gYFxcXFwke3ZhbHVlfWA7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLnBvc2l4ID09PSB0cnVlICYmIHZhbHVlID09PSAnIScgJiYgcHJldi52YWx1ZSA9PT0gJ1snKSB7XG4gICAgICAgIHZhbHVlID0gJ14nO1xuICAgICAgfVxuXG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgYXBwZW5kKHsgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB3ZSdyZSBpbnNpZGUgYSBxdW90ZWQgc3RyaW5nLCBjb250aW51ZVxuICAgICAqIHVudGlsIHdlIHJlYWNoIHRoZSBjbG9zaW5nIGRvdWJsZSBxdW90ZS5cbiAgICAgKi9cblxuICAgIGlmIChzdGF0ZS5xdW90ZXMgPT09IDEgJiYgdmFsdWUgIT09ICdcIicpIHtcbiAgICAgIHZhbHVlID0gdXRpbHMuZXNjYXBlUmVnZXgodmFsdWUpO1xuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgIGFwcGVuZCh7IHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG91YmxlIHF1b3Rlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnXCInKSB7XG4gICAgICBzdGF0ZS5xdW90ZXMgPSBzdGF0ZS5xdW90ZXMgPT09IDEgPyAwIDogMTtcbiAgICAgIGlmIChvcHRzLmtlZXBRdW90ZXMgPT09IHRydWUpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJlbnRoZXNlc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnKCcpIHtcbiAgICAgIGluY3JlbWVudCgncGFyZW5zJyk7XG4gICAgICBwdXNoKHsgdHlwZTogJ3BhcmVuJywgdmFsdWUgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICcpJykge1xuICAgICAgaWYgKHN0YXRlLnBhcmVucyA9PT0gMCAmJiBvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzeW50YXhFcnJvcignb3BlbmluZycsICcoJykpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHRnbG9iID0gZXh0Z2xvYnNbZXh0Z2xvYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoZXh0Z2xvYiAmJiBzdGF0ZS5wYXJlbnMgPT09IGV4dGdsb2IucGFyZW5zICsgMSkge1xuICAgICAgICBleHRnbG9iQ2xvc2UoZXh0Z2xvYnMucG9wKCkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdwYXJlbicsIHZhbHVlLCBvdXRwdXQ6IHN0YXRlLnBhcmVucyA/ICcpJyA6ICdcXFxcKScgfSk7XG4gICAgICBkZWNyZW1lbnQoJ3BhcmVucycpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3F1YXJlIGJyYWNrZXRzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICdbJykge1xuICAgICAgaWYgKG9wdHMubm9icmFja2V0ID09PSB0cnVlIHx8ICFyZW1haW5pbmcoKS5pbmNsdWRlcygnXScpKSB7XG4gICAgICAgIGlmIChvcHRzLm5vYnJhY2tldCAhPT0gdHJ1ZSAmJiBvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdjbG9zaW5nJywgJ10nKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jcmVtZW50KCdicmFja2V0cycpO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2JyYWNrZXQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSA9PT0gJ10nKSB7XG4gICAgICBpZiAob3B0cy5ub2JyYWNrZXQgPT09IHRydWUgfHwgKHByZXYgJiYgcHJldi50eXBlID09PSAnYnJhY2tldCcgJiYgcHJldi52YWx1ZS5sZW5ndGggPT09IDEpKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlLCBvdXRwdXQ6IGBcXFxcJHt2YWx1ZX1gIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlLmJyYWNrZXRzID09PSAwKSB7XG4gICAgICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdvcGVuaW5nJywgJ1snKSk7XG4gICAgICAgIH1cblxuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiBgXFxcXCR7dmFsdWV9YCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGRlY3JlbWVudCgnYnJhY2tldHMnKTtcblxuICAgICAgY29uc3QgcHJldlZhbHVlID0gcHJldi52YWx1ZS5zbGljZSgxKTtcbiAgICAgIGlmIChwcmV2LnBvc2l4ICE9PSB0cnVlICYmIHByZXZWYWx1ZVswXSA9PT0gJ14nICYmICFwcmV2VmFsdWUuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICB2YWx1ZSA9IGAvJHt2YWx1ZX1gO1xuICAgICAgfVxuXG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgYXBwZW5kKHsgdmFsdWUgfSk7XG5cbiAgICAgIC8vIHdoZW4gbGl0ZXJhbCBicmFja2V0cyBhcmUgZXhwbGljaXRseSBkaXNhYmxlZFxuICAgICAgLy8gYXNzdW1lIHdlIHNob3VsZCBtYXRjaCB3aXRoIGEgcmVnZXggY2hhcmFjdGVyIGNsYXNzXG4gICAgICBpZiAob3B0cy5saXRlcmFsQnJhY2tldHMgPT09IGZhbHNlIHx8IHV0aWxzLmhhc1JlZ2V4Q2hhcnMocHJldlZhbHVlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXNjYXBlZCA9IHV0aWxzLmVzY2FwZVJlZ2V4KHByZXYudmFsdWUpO1xuICAgICAgc3RhdGUub3V0cHV0ID0gc3RhdGUub3V0cHV0LnNsaWNlKDAsIC1wcmV2LnZhbHVlLmxlbmd0aCk7XG5cbiAgICAgIC8vIHdoZW4gbGl0ZXJhbCBicmFja2V0cyBhcmUgZXhwbGljaXRseSBlbmFibGVkXG4gICAgICAvLyBhc3N1bWUgd2Ugc2hvdWxkIGVzY2FwZSB0aGUgYnJhY2tldHMgdG8gbWF0Y2ggbGl0ZXJhbCBjaGFyYWN0ZXJzXG4gICAgICBpZiAob3B0cy5saXRlcmFsQnJhY2tldHMgPT09IHRydWUpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IGVzY2FwZWQ7XG4gICAgICAgIHByZXYudmFsdWUgPSBlc2NhcGVkO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gd2hlbiB0aGUgdXNlciBzcGVjaWZpZXMgbm90aGluZywgdHJ5IHRvIG1hdGNoIGJvdGhcbiAgICAgIHByZXYudmFsdWUgPSBgKCR7Y2FwdHVyZX0ke2VzY2FwZWR9fCR7cHJldi52YWx1ZX0pYDtcbiAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2LnZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnJhY2VzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICd7JyAmJiBvcHRzLm5vYnJhY2UgIT09IHRydWUpIHtcbiAgICAgIGluY3JlbWVudCgnYnJhY2VzJyk7XG5cbiAgICAgIGNvbnN0IG9wZW4gPSB7XG4gICAgICAgIHR5cGU6ICdicmFjZScsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBvdXRwdXQ6ICcoJyxcbiAgICAgICAgb3V0cHV0SW5kZXg6IHN0YXRlLm91dHB1dC5sZW5ndGgsXG4gICAgICAgIHRva2Vuc0luZGV4OiBzdGF0ZS50b2tlbnMubGVuZ3RoXG4gICAgICB9O1xuXG4gICAgICBicmFjZXMucHVzaChvcGVuKTtcbiAgICAgIHB1c2gob3Blbik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICd9Jykge1xuICAgICAgY29uc3QgYnJhY2UgPSBicmFjZXNbYnJhY2VzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAob3B0cy5ub2JyYWNlID09PSB0cnVlIHx8ICFicmFjZSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSwgb3V0cHV0OiB2YWx1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBvdXRwdXQgPSAnKSc7XG5cbiAgICAgIGlmIChicmFjZS5kb3RzID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGFyciA9IHRva2Vucy5zbGljZSgpO1xuICAgICAgICBjb25zdCByYW5nZSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0b2tlbnMucG9wKCk7XG4gICAgICAgICAgaWYgKGFycltpXS50eXBlID09PSAnYnJhY2UnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGFycltpXS50eXBlICE9PSAnZG90cycpIHtcbiAgICAgICAgICAgIHJhbmdlLnVuc2hpZnQoYXJyW2ldLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvdXRwdXQgPSBleHBhbmRSYW5nZShyYW5nZSwgb3B0cyk7XG4gICAgICAgIHN0YXRlLmJhY2t0cmFjayA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChicmFjZS5jb21tYSAhPT0gdHJ1ZSAmJiBicmFjZS5kb3RzICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG91dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCBicmFjZS5vdXRwdXRJbmRleCk7XG4gICAgICAgIGNvbnN0IHRva3MgPSBzdGF0ZS50b2tlbnMuc2xpY2UoYnJhY2UudG9rZW5zSW5kZXgpO1xuICAgICAgICBicmFjZS52YWx1ZSA9IGJyYWNlLm91dHB1dCA9ICdcXFxceyc7XG4gICAgICAgIHZhbHVlID0gb3V0cHV0ID0gJ1xcXFx9JztcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gb3V0O1xuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdG9rcykge1xuICAgICAgICAgIHN0YXRlLm91dHB1dCArPSAodC5vdXRwdXQgfHwgdC52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdicmFjZScsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgICBkZWNyZW1lbnQoJ2JyYWNlcycpO1xuICAgICAgYnJhY2VzLnBvcCgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGlwZXNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ3wnKSB7XG4gICAgICBpZiAoZXh0Z2xvYnMubGVuZ3RoID4gMCkge1xuICAgICAgICBleHRnbG9ic1tleHRnbG9icy5sZW5ndGggLSAxXS5jb25kaXRpb25zKys7XG4gICAgICB9XG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbW1hc1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnLCcpIHtcbiAgICAgIGxldCBvdXRwdXQgPSB2YWx1ZTtcblxuICAgICAgY29uc3QgYnJhY2UgPSBicmFjZXNbYnJhY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGJyYWNlICYmIHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdID09PSAnYnJhY2VzJykge1xuICAgICAgICBicmFjZS5jb21tYSA9IHRydWU7XG4gICAgICAgIG91dHB1dCA9ICd8JztcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdjb21tYScsIHZhbHVlLCBvdXRwdXQgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTbGFzaGVzXG4gICAgICovXG5cbiAgICBpZiAodmFsdWUgPT09ICcvJykge1xuICAgICAgLy8gaWYgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2xvYiBpcyBcIi4vXCIsIGFkdmFuY2UgdGhlIHN0YXJ0XG4gICAgICAvLyB0byB0aGUgY3VycmVudCBpbmRleCwgYW5kIGRvbid0IGFkZCB0aGUgXCIuL1wiIGNoYXJhY3RlcnNcbiAgICAgIC8vIHRvIHRoZSBzdGF0ZS4gVGhpcyBncmVhdGx5IHNpbXBsaWZpZXMgbG9va2JlaGluZHMgd2hlblxuICAgICAgLy8gY2hlY2tpbmcgZm9yIEJPUyBjaGFyYWN0ZXJzIGxpa2UgXCIhXCIgYW5kIFwiLlwiIChub3QgXCIuL1wiKVxuICAgICAgaWYgKHByZXYudHlwZSA9PT0gJ2RvdCcgJiYgc3RhdGUuaW5kZXggPT09IHN0YXRlLnN0YXJ0ICsgMSkge1xuICAgICAgICBzdGF0ZS5zdGFydCA9IHN0YXRlLmluZGV4ICsgMTtcbiAgICAgICAgc3RhdGUuY29uc3VtZWQgPSAnJztcbiAgICAgICAgc3RhdGUub3V0cHV0ID0gJyc7XG4gICAgICAgIHRva2Vucy5wb3AoKTtcbiAgICAgICAgcHJldiA9IGJvczsgLy8gcmVzZXQgXCJwcmV2XCIgdG8gdGhlIGZpcnN0IHRva2VuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3NsYXNoJywgdmFsdWUsIG91dHB1dDogU0xBU0hfTElURVJBTCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvdHNcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJy4nKSB7XG4gICAgICBpZiAoc3RhdGUuYnJhY2VzID4gMCAmJiBwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICAgIGlmIChwcmV2LnZhbHVlID09PSAnLicpIHByZXYub3V0cHV0ID0gRE9UX0xJVEVSQUw7XG4gICAgICAgIGNvbnN0IGJyYWNlID0gYnJhY2VzW2JyYWNlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgcHJldi50eXBlID0gJ2RvdHMnO1xuICAgICAgICBwcmV2Lm91dHB1dCArPSB2YWx1ZTtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgYnJhY2UuZG90cyA9IHRydWU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHN0YXRlLmJyYWNlcyArIHN0YXRlLnBhcmVucykgPT09IDAgJiYgcHJldi50eXBlICE9PSAnYm9zJyAmJiBwcmV2LnR5cGUgIT09ICdzbGFzaCcpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dDogRE9UX0xJVEVSQUwgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ2RvdCcsIHZhbHVlLCBvdXRwdXQ6IERPVF9MSVRFUkFMIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlc3Rpb24gbWFya3NcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJz8nKSB7XG4gICAgICBjb25zdCBpc0dyb3VwID0gcHJldiAmJiBwcmV2LnZhbHVlID09PSAnKCc7XG4gICAgICBpZiAoIWlzR3JvdXAgJiYgb3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAnKCcgJiYgcGVlaygyKSAhPT0gJz8nKSB7XG4gICAgICAgIGV4dGdsb2JPcGVuKCdxbWFyaycsIHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2ICYmIHByZXYudHlwZSA9PT0gJ3BhcmVuJykge1xuICAgICAgICBjb25zdCBuZXh0ID0gcGVlaygpO1xuICAgICAgICBsZXQgb3V0cHV0ID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKG5leHQgPT09ICc8JyAmJiAhdXRpbHMuc3VwcG9ydHNMb29rYmVoaW5kcygpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb2RlLmpzIHYxMCBvciBoaWdoZXIgaXMgcmVxdWlyZWQgZm9yIHJlZ2V4IGxvb2tiZWhpbmRzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKHByZXYudmFsdWUgPT09ICcoJyAmJiAhL1shPTw6XS8udGVzdChuZXh0KSkgfHwgKG5leHQgPT09ICc8JyAmJiAhLzwoWyE9XXxcXHcrPikvLnRlc3QocmVtYWluaW5nKCkpKSkge1xuICAgICAgICAgIG91dHB1dCA9IGBcXFxcJHt2YWx1ZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaCh7IHR5cGU6ICd0ZXh0JywgdmFsdWUsIG91dHB1dCB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRzLmRvdCAhPT0gdHJ1ZSAmJiAocHJldi50eXBlID09PSAnc2xhc2gnIHx8IHByZXYudHlwZSA9PT0gJ2JvcycpKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAncW1hcmsnLCB2YWx1ZSwgb3V0cHV0OiBRTUFSS19OT19ET1QgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3FtYXJrJywgdmFsdWUsIG91dHB1dDogUU1BUksgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGNsYW1hdGlvblxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnIScpIHtcbiAgICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJykge1xuICAgICAgICBpZiAocGVlaygyKSAhPT0gJz8nIHx8ICEvWyE9PDpdLy50ZXN0KHBlZWsoMykpKSB7XG4gICAgICAgICAgZXh0Z2xvYk9wZW4oJ25lZ2F0ZScsIHZhbHVlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAob3B0cy5ub25lZ2F0ZSAhPT0gdHJ1ZSAmJiBzdGF0ZS5pbmRleCA9PT0gMCkge1xuICAgICAgICBuZWdhdGUoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGx1c1xuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlID09PSAnKycpIHtcbiAgICAgIGlmIChvcHRzLm5vZXh0Z2xvYiAhPT0gdHJ1ZSAmJiBwZWVrKCkgPT09ICcoJyAmJiBwZWVrKDIpICE9PSAnPycpIHtcbiAgICAgICAgZXh0Z2xvYk9wZW4oJ3BsdXMnLCB2YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHByZXYgJiYgcHJldi52YWx1ZSA9PT0gJygnKSB8fCBvcHRzLnJlZ2V4ID09PSBmYWxzZSkge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3BsdXMnLCB2YWx1ZSwgb3V0cHV0OiBQTFVTX0xJVEVSQUwgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHByZXYgJiYgKHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnIHx8IHByZXYudHlwZSA9PT0gJ3BhcmVuJyB8fCBwcmV2LnR5cGUgPT09ICdicmFjZScpKSB8fCBzdGF0ZS5wYXJlbnMgPiAwKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAncGx1cycsIHZhbHVlIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHVzaCh7IHR5cGU6ICdwbHVzJywgdmFsdWU6IFBMVVNfTElURVJBTCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHRcbiAgICAgKi9cblxuICAgIGlmICh2YWx1ZSA9PT0gJ0AnKSB7XG4gICAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgcGVlaygpID09PSAnKCcgJiYgcGVlaygyKSAhPT0gJz8nKSB7XG4gICAgICAgIHB1c2goeyB0eXBlOiAnYXQnLCBleHRnbG9iOiB0cnVlLCB2YWx1ZSwgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dFxuICAgICAqL1xuXG4gICAgaWYgKHZhbHVlICE9PSAnKicpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJyQnIHx8IHZhbHVlID09PSAnXicpIHtcbiAgICAgICAgdmFsdWUgPSBgXFxcXCR7dmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWF0Y2ggPSBSRUdFWF9OT05fU1BFQ0lBTF9DSEFSUy5leGVjKHJlbWFpbmluZygpKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICB2YWx1ZSArPSBtYXRjaFswXTtcbiAgICAgICAgc3RhdGUuaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBwdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZSB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJzXG4gICAgICovXG5cbiAgICBpZiAocHJldiAmJiAocHJldi50eXBlID09PSAnZ2xvYnN0YXInIHx8IHByZXYuc3RhciA9PT0gdHJ1ZSkpIHtcbiAgICAgIHByZXYudHlwZSA9ICdzdGFyJztcbiAgICAgIHByZXYuc3RhciA9IHRydWU7XG4gICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgcHJldi5vdXRwdXQgPSBzdGFyO1xuICAgICAgc3RhdGUuYmFja3RyYWNrID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHJlc3QgPSByZW1haW5pbmcoKTtcbiAgICBpZiAob3B0cy5ub2V4dGdsb2IgIT09IHRydWUgJiYgL15cXChbXj9dLy50ZXN0KHJlc3QpKSB7XG4gICAgICBleHRnbG9iT3Blbignc3RhcicsIHZhbHVlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcmV2LnR5cGUgPT09ICdzdGFyJykge1xuICAgICAgaWYgKG9wdHMubm9nbG9ic3RhciA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByaW9yID0gcHJldi5wcmV2O1xuICAgICAgY29uc3QgYmVmb3JlID0gcHJpb3IucHJldjtcbiAgICAgIGNvbnN0IGlzU3RhcnQgPSBwcmlvci50eXBlID09PSAnc2xhc2gnIHx8IHByaW9yLnR5cGUgPT09ICdib3MnO1xuICAgICAgY29uc3QgYWZ0ZXJTdGFyID0gYmVmb3JlICYmIChiZWZvcmUudHlwZSA9PT0gJ3N0YXInIHx8IGJlZm9yZS50eXBlID09PSAnZ2xvYnN0YXInKTtcblxuICAgICAgaWYgKG9wdHMuYmFzaCA9PT0gdHJ1ZSAmJiAoIWlzU3RhcnQgfHwgKHJlc3RbMF0gJiYgcmVzdFswXSAhPT0gJy8nKSkpIHtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdzdGFyJywgdmFsdWUsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0JyYWNlID0gc3RhdGUuYnJhY2VzID4gMCAmJiAocHJpb3IudHlwZSA9PT0gJ2NvbW1hJyB8fCBwcmlvci50eXBlID09PSAnYnJhY2UnKTtcbiAgICAgIGNvbnN0IGlzRXh0Z2xvYiA9IGV4dGdsb2JzLmxlbmd0aCAmJiAocHJpb3IudHlwZSA9PT0gJ3BpcGUnIHx8IHByaW9yLnR5cGUgPT09ICdwYXJlbicpO1xuICAgICAgaWYgKCFpc1N0YXJ0ICYmIHByaW9yLnR5cGUgIT09ICdwYXJlbicgJiYgIWlzQnJhY2UgJiYgIWlzRXh0Z2xvYikge1xuICAgICAgICBwdXNoKHsgdHlwZTogJ3N0YXInLCB2YWx1ZSwgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHN0cmlwIGNvbnNlY3V0aXZlIGAvKiovYFxuICAgICAgd2hpbGUgKHJlc3Quc2xpY2UoMCwgMykgPT09ICcvKionKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gaW5wdXRbc3RhdGUuaW5kZXggKyA0XTtcbiAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyICE9PSAnLycpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXN0ID0gcmVzdC5zbGljZSgzKTtcbiAgICAgICAgY29uc3VtZSgnLyoqJywgMyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnYm9zJyAmJiBlb3MoKSkge1xuICAgICAgICBwcmV2LnR5cGUgPSAnZ2xvYnN0YXInO1xuICAgICAgICBwcmV2LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICBwcmV2Lm91dHB1dCA9IGdsb2JzdGFyKG9wdHMpO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBwcmV2Lm91dHB1dDtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnc2xhc2gnICYmIHByaW9yLnByZXYudHlwZSAhPT0gJ2JvcycgJiYgIWFmdGVyU3RhciAmJiBlb3MoKSkge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLShwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dCkubGVuZ3RoKTtcbiAgICAgICAgcHJpb3Iub3V0cHV0ID0gYCg/OiR7cHJpb3Iub3V0cHV0fWA7XG5cbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi5vdXRwdXQgPSBnbG9ic3RhcihvcHRzKSArIChvcHRzLnN0cmljdFNsYXNoZXMgPyAnKScgOiAnfCQpJyk7XG4gICAgICAgIHByZXYudmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IHByaW9yLm91dHB1dCArIHByZXYub3V0cHV0O1xuICAgICAgICBjb25zdW1lKHZhbHVlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnc2xhc2gnICYmIHByaW9yLnByZXYudHlwZSAhPT0gJ2JvcycgJiYgcmVzdFswXSA9PT0gJy8nKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlc3RbMV0gIT09IHZvaWQgMCA/ICd8JCcgOiAnJztcblxuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBzdGF0ZS5vdXRwdXQuc2xpY2UoMCwgLShwcmlvci5vdXRwdXQgKyBwcmV2Lm91dHB1dCkubGVuZ3RoKTtcbiAgICAgICAgcHJpb3Iub3V0cHV0ID0gYCg/OiR7cHJpb3Iub3V0cHV0fWA7XG5cbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi5vdXRwdXQgPSBgJHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9fCR7U0xBU0hfTElURVJBTH0ke2VuZH0pYDtcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcblxuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gcHJpb3Iub3V0cHV0ICsgcHJldi5vdXRwdXQ7XG4gICAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcblxuICAgICAgICBjb25zdW1lKHZhbHVlICsgYWR2YW5jZSgpKTtcblxuICAgICAgICBwdXNoKHsgdHlwZTogJ3NsYXNoJywgdmFsdWU6ICcvJywgb3V0cHV0OiAnJyB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmlvci50eXBlID09PSAnYm9zJyAmJiByZXN0WzBdID09PSAnLycpIHtcbiAgICAgICAgcHJldi50eXBlID0gJ2dsb2JzdGFyJztcbiAgICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgcHJldi5vdXRwdXQgPSBgKD86Xnwke1NMQVNIX0xJVEVSQUx9fCR7Z2xvYnN0YXIob3B0cyl9JHtTTEFTSF9MSVRFUkFMfSlgO1xuICAgICAgICBzdGF0ZS5vdXRwdXQgPSBwcmV2Lm91dHB1dDtcbiAgICAgICAgc3RhdGUuZ2xvYnN0YXIgPSB0cnVlO1xuICAgICAgICBjb25zdW1lKHZhbHVlICsgYWR2YW5jZSgpKTtcbiAgICAgICAgcHVzaCh7IHR5cGU6ICdzbGFzaCcsIHZhbHVlOiAnLycsIG91dHB1dDogJycgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyByZW1vdmUgc2luZ2xlIHN0YXIgZnJvbSBvdXRwdXRcbiAgICAgIHN0YXRlLm91dHB1dCA9IHN0YXRlLm91dHB1dC5zbGljZSgwLCAtcHJldi5vdXRwdXQubGVuZ3RoKTtcblxuICAgICAgLy8gcmVzZXQgcHJldmlvdXMgdG9rZW4gdG8gZ2xvYnN0YXJcbiAgICAgIHByZXYudHlwZSA9ICdnbG9ic3Rhcic7XG4gICAgICBwcmV2Lm91dHB1dCA9IGdsb2JzdGFyKG9wdHMpO1xuICAgICAgcHJldi52YWx1ZSArPSB2YWx1ZTtcblxuICAgICAgLy8gcmVzZXQgb3V0cHV0IHdpdGggZ2xvYnN0YXJcbiAgICAgIHN0YXRlLm91dHB1dCArPSBwcmV2Lm91dHB1dDtcbiAgICAgIHN0YXRlLmdsb2JzdGFyID0gdHJ1ZTtcbiAgICAgIGNvbnN1bWUodmFsdWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW4gPSB7IHR5cGU6ICdzdGFyJywgdmFsdWUsIG91dHB1dDogc3RhciB9O1xuXG4gICAgaWYgKG9wdHMuYmFzaCA9PT0gdHJ1ZSkge1xuICAgICAgdG9rZW4ub3V0cHV0ID0gJy4qPyc7XG4gICAgICBpZiAocHJldi50eXBlID09PSAnYm9zJyB8fCBwcmV2LnR5cGUgPT09ICdzbGFzaCcpIHtcbiAgICAgICAgdG9rZW4ub3V0cHV0ID0gbm9kb3QgKyB0b2tlbi5vdXRwdXQ7XG4gICAgICB9XG4gICAgICBwdXNoKHRva2VuKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcmV2ICYmIChwcmV2LnR5cGUgPT09ICdicmFja2V0JyB8fCBwcmV2LnR5cGUgPT09ICdwYXJlbicpICYmIG9wdHMucmVnZXggPT09IHRydWUpIHtcbiAgICAgIHRva2VuLm91dHB1dCA9IHZhbHVlO1xuICAgICAgcHVzaCh0b2tlbik7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuaW5kZXggPT09IHN0YXRlLnN0YXJ0IHx8IHByZXYudHlwZSA9PT0gJ3NsYXNoJyB8fCBwcmV2LnR5cGUgPT09ICdkb3QnKSB7XG4gICAgICBpZiAocHJldi50eXBlID09PSAnZG90Jykge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gTk9fRE9UX1NMQVNIO1xuICAgICAgICBwcmV2Lm91dHB1dCArPSBOT19ET1RfU0xBU0g7XG5cbiAgICAgIH0gZWxzZSBpZiAob3B0cy5kb3QgPT09IHRydWUpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IE5PX0RPVFNfU0xBU0g7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IE5PX0RPVFNfU0xBU0g7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLm91dHB1dCArPSBub2RvdDtcbiAgICAgICAgcHJldi5vdXRwdXQgKz0gbm9kb3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChwZWVrKCkgIT09ICcqJykge1xuICAgICAgICBzdGF0ZS5vdXRwdXQgKz0gT05FX0NIQVI7XG4gICAgICAgIHByZXYub3V0cHV0ICs9IE9ORV9DSEFSO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1c2godG9rZW4pO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLmJyYWNrZXRzID4gMCkge1xuICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnXScpKTtcbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy5lc2NhcGVMYXN0KHN0YXRlLm91dHB1dCwgJ1snKTtcbiAgICBkZWNyZW1lbnQoJ2JyYWNrZXRzJyk7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUucGFyZW5zID4gMCkge1xuICAgIGlmIChvcHRzLnN0cmljdEJyYWNrZXRzID09PSB0cnVlKSB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ludGF4RXJyb3IoJ2Nsb3NpbmcnLCAnKScpKTtcbiAgICBzdGF0ZS5vdXRwdXQgPSB1dGlscy5lc2NhcGVMYXN0KHN0YXRlLm91dHB1dCwgJygnKTtcbiAgICBkZWNyZW1lbnQoJ3BhcmVucycpO1xuICB9XG5cbiAgd2hpbGUgKHN0YXRlLmJyYWNlcyA+IDApIHtcbiAgICBpZiAob3B0cy5zdHJpY3RCcmFja2V0cyA9PT0gdHJ1ZSkgdGhyb3cgbmV3IFN5bnRheEVycm9yKHN5bnRheEVycm9yKCdjbG9zaW5nJywgJ30nKSk7XG4gICAgc3RhdGUub3V0cHV0ID0gdXRpbHMuZXNjYXBlTGFzdChzdGF0ZS5vdXRwdXQsICd7Jyk7XG4gICAgZGVjcmVtZW50KCdicmFjZXMnKTtcbiAgfVxuXG4gIGlmIChvcHRzLnN0cmljdFNsYXNoZXMgIT09IHRydWUgJiYgKHByZXYudHlwZSA9PT0gJ3N0YXInIHx8IHByZXYudHlwZSA9PT0gJ2JyYWNrZXQnKSkge1xuICAgIHB1c2goeyB0eXBlOiAnbWF5YmVfc2xhc2gnLCB2YWx1ZTogJycsIG91dHB1dDogYCR7U0xBU0hfTElURVJBTH0/YCB9KTtcbiAgfVxuXG4gIC8vIHJlYnVpbGQgdGhlIG91dHB1dCBpZiB3ZSBoYWQgdG8gYmFja3RyYWNrIGF0IGFueSBwb2ludFxuICBpZiAoc3RhdGUuYmFja3RyYWNrID09PSB0cnVlKSB7XG4gICAgc3RhdGUub3V0cHV0ID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHN0YXRlLnRva2Vucykge1xuICAgICAgc3RhdGUub3V0cHV0ICs9IHRva2VuLm91dHB1dCAhPSBudWxsID8gdG9rZW4ub3V0cHV0IDogdG9rZW4udmFsdWU7XG5cbiAgICAgIGlmICh0b2tlbi5zdWZmaXgpIHtcbiAgICAgICAgc3RhdGUub3V0cHV0ICs9IHRva2VuLnN1ZmZpeDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIEZhc3QgcGF0aHMgZm9yIGNyZWF0aW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGNvbW1vbiBnbG9iIHBhdHRlcm5zLlxuICogVGhpcyBjYW4gc2lnbmlmaWNhbnRseSBzcGVlZCB1cCBwcm9jZXNzaW5nIGFuZCBoYXMgdmVyeSBsaXR0bGUgZG93bnNpZGVcbiAqIGltcGFjdCB3aGVuIG5vbmUgb2YgdGhlIGZhc3QgcGF0aHMgbWF0Y2guXG4gKi9cblxucGFyc2UuZmFzdHBhdGhzID0gKGlucHV0LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IG9wdHMgPSB7IC4uLm9wdGlvbnMgfTtcbiAgY29uc3QgbWF4ID0gdHlwZW9mIG9wdHMubWF4TGVuZ3RoID09PSAnbnVtYmVyJyA/IE1hdGgubWluKE1BWF9MRU5HVEgsIG9wdHMubWF4TGVuZ3RoKSA6IE1BWF9MRU5HVEg7XG4gIGNvbnN0IGxlbiA9IGlucHV0Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IG1heCkge1xuICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihgSW5wdXQgbGVuZ3RoOiAke2xlbn0sIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIGxlbmd0aDogJHttYXh9YCk7XG4gIH1cblxuICBpbnB1dCA9IFJFUExBQ0VNRU5UU1tpbnB1dF0gfHwgaW5wdXQ7XG4gIGNvbnN0IHdpbjMyID0gdXRpbHMuaXNXaW5kb3dzKG9wdGlvbnMpO1xuXG4gIC8vIGNyZWF0ZSBjb25zdGFudHMgYmFzZWQgb24gcGxhdGZvcm0sIGZvciB3aW5kb3dzIG9yIHBvc2l4XG4gIGNvbnN0IHtcbiAgICBET1RfTElURVJBTCxcbiAgICBTTEFTSF9MSVRFUkFMLFxuICAgIE9ORV9DSEFSLFxuICAgIERPVFNfU0xBU0gsXG4gICAgTk9fRE9ULFxuICAgIE5PX0RPVFMsXG4gICAgTk9fRE9UU19TTEFTSCxcbiAgICBTVEFSLFxuICAgIFNUQVJUX0FOQ0hPUlxuICB9ID0gY29uc3RhbnRzLmdsb2JDaGFycyh3aW4zMik7XG5cbiAgY29uc3Qgbm9kb3QgPSBvcHRzLmRvdCA/IE5PX0RPVFMgOiBOT19ET1Q7XG4gIGNvbnN0IHNsYXNoRG90ID0gb3B0cy5kb3QgPyBOT19ET1RTX1NMQVNIIDogTk9fRE9UO1xuICBjb25zdCBjYXB0dXJlID0gb3B0cy5jYXB0dXJlID8gJycgOiAnPzonO1xuICBjb25zdCBzdGF0ZSA9IHsgbmVnYXRlZDogZmFsc2UsIHByZWZpeDogJycgfTtcbiAgbGV0IHN0YXIgPSBvcHRzLmJhc2ggPT09IHRydWUgPyAnLio/JyA6IFNUQVI7XG5cbiAgaWYgKG9wdHMuY2FwdHVyZSkge1xuICAgIHN0YXIgPSBgKCR7c3Rhcn0pYDtcbiAgfVxuXG4gIGNvbnN0IGdsb2JzdGFyID0gb3B0cyA9PiB7XG4gICAgaWYgKG9wdHMubm9nbG9ic3RhciA9PT0gdHJ1ZSkgcmV0dXJuIHN0YXI7XG4gICAgcmV0dXJuIGAoJHtjYXB0dXJlfSg/Oig/ISR7U1RBUlRfQU5DSE9SfSR7b3B0cy5kb3QgPyBET1RTX1NMQVNIIDogRE9UX0xJVEVSQUx9KS4pKj8pYDtcbiAgfTtcblxuICBjb25zdCBjcmVhdGUgPSBzdHIgPT4ge1xuICAgIHN3aXRjaCAoc3RyKSB7XG4gICAgICBjYXNlICcqJzpcbiAgICAgICAgcmV0dXJuIGAke25vZG90fSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJy4qJzpcbiAgICAgICAgcmV0dXJuIGAke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyouKic6XG4gICAgICAgIHJldHVybiBgJHtub2RvdH0ke3N0YXJ9JHtET1RfTElURVJBTH0ke09ORV9DSEFSfSR7c3Rhcn1gO1xuXG4gICAgICBjYXNlICcqLyonOlxuICAgICAgICByZXR1cm4gYCR7bm9kb3R9JHtzdGFyfSR7U0xBU0hfTElURVJBTH0ke09ORV9DSEFSfSR7c2xhc2hEb3R9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyoqJzpcbiAgICAgICAgcmV0dXJuIG5vZG90ICsgZ2xvYnN0YXIob3B0cyk7XG5cbiAgICAgIGNhc2UgJyoqLyonOlxuICAgICAgICByZXR1cm4gYCg/OiR7bm9kb3R9JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KT8ke3NsYXNoRG90fSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGNhc2UgJyoqLyouKic6XG4gICAgICAgIHJldHVybiBgKD86JHtub2RvdH0ke2dsb2JzdGFyKG9wdHMpfSR7U0xBU0hfTElURVJBTH0pPyR7c2xhc2hEb3R9JHtzdGFyfSR7RE9UX0xJVEVSQUx9JHtPTkVfQ0hBUn0ke3N0YXJ9YDtcblxuICAgICAgY2FzZSAnKiovLionOlxuICAgICAgICByZXR1cm4gYCg/OiR7bm9kb3R9JHtnbG9ic3RhcihvcHRzKX0ke1NMQVNIX0xJVEVSQUx9KT8ke0RPVF9MSVRFUkFMfSR7T05FX0NIQVJ9JHtzdGFyfWA7XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSAvXiguKj8pXFwuKFxcdyspJC8uZXhlYyhzdHIpO1xuICAgICAgICBpZiAoIW1hdGNoKSByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc291cmNlID0gY3JlYXRlKG1hdGNoWzFdKTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHJldHVybjtcblxuICAgICAgICByZXR1cm4gc291cmNlICsgRE9UX0xJVEVSQUwgKyBtYXRjaFsyXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb3V0cHV0ID0gdXRpbHMucmVtb3ZlUHJlZml4KGlucHV0LCBzdGF0ZSk7XG4gIGxldCBzb3VyY2UgPSBjcmVhdGUob3V0cHV0KTtcblxuICBpZiAoc291cmNlICYmIG9wdHMuc3RyaWN0U2xhc2hlcyAhPT0gdHJ1ZSkge1xuICAgIHNvdXJjZSArPSBgJHtTTEFTSF9MSVRFUkFMfT9gO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2U7XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3Qgc2NhbiA9IHJlcXVpcmUoJy4vc2NhbicpO1xuY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJyk7XG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiB2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0Y2hlciBmdW5jdGlvbiBmcm9tIG9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMuIFRoZVxuICogcmV0dXJuZWQgZnVuY3Rpb24gdGFrZXMgYSBzdHJpbmcgdG8gbWF0Y2ggYXMgaXRzIGZpcnN0IGFyZ3VtZW50LFxuICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgbWF0Y2guIFRoZSByZXR1cm5lZCBtYXRjaGVyXG4gKiBmdW5jdGlvbiBhbHNvIHRha2VzIGEgYm9vbGVhbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRoYXQsIHdoZW4gdHJ1ZSxcbiAqIHJldHVybnMgYW4gb2JqZWN0IHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2goZ2xvYlssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCBpc01hdGNoID0gcGljb21hdGNoKCcqLiEoKmEpJyk7XG4gKiBjb25zb2xlLmxvZyhpc01hdGNoKCdhLmEnKSk7IC8vPT4gZmFsc2VcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYicpKTsgLy89PiB0cnVlXG4gKiBgYGBcbiAqIEBuYW1lIHBpY29tYXRjaFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBnbG9ic2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtGdW5jdGlvbj19IFJldHVybnMgYSBtYXRjaGVyIGZ1bmN0aW9uLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5jb25zdCBwaWNvbWF0Y2ggPSAoZ2xvYiwgb3B0aW9ucywgcmV0dXJuU3RhdGUgPSBmYWxzZSkgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShnbG9iKSkge1xuICAgIGNvbnN0IGZucyA9IGdsb2IubWFwKGlucHV0ID0+IHBpY29tYXRjaChpbnB1dCwgb3B0aW9ucywgcmV0dXJuU3RhdGUpKTtcbiAgICBjb25zdCBhcnJheU1hdGNoZXIgPSBzdHIgPT4ge1xuICAgICAgZm9yIChjb25zdCBpc01hdGNoIG9mIGZucykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IGlzTWF0Y2goc3RyKTtcbiAgICAgICAgaWYgKHN0YXRlKSByZXR1cm4gc3RhdGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICByZXR1cm4gYXJyYXlNYXRjaGVyO1xuICB9XG5cbiAgY29uc3QgaXNTdGF0ZSA9IGlzT2JqZWN0KGdsb2IpICYmIGdsb2IudG9rZW5zICYmIGdsb2IuaW5wdXQ7XG5cbiAgaWYgKGdsb2IgPT09ICcnIHx8ICh0eXBlb2YgZ2xvYiAhPT0gJ3N0cmluZycgJiYgIWlzU3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgcGF0dGVybiB0byBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBwb3NpeCA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKTtcbiAgY29uc3QgcmVnZXggPSBpc1N0YXRlXG4gICAgPyBwaWNvbWF0Y2guY29tcGlsZVJlKGdsb2IsIG9wdGlvbnMpXG4gICAgOiBwaWNvbWF0Y2gubWFrZVJlKGdsb2IsIG9wdGlvbnMsIGZhbHNlLCB0cnVlKTtcblxuICBjb25zdCBzdGF0ZSA9IHJlZ2V4LnN0YXRlO1xuICBkZWxldGUgcmVnZXguc3RhdGU7XG5cbiAgbGV0IGlzSWdub3JlZCA9ICgpID0+IGZhbHNlO1xuICBpZiAob3B0cy5pZ25vcmUpIHtcbiAgICBjb25zdCBpZ25vcmVPcHRzID0geyAuLi5vcHRpb25zLCBpZ25vcmU6IG51bGwsIG9uTWF0Y2g6IG51bGwsIG9uUmVzdWx0OiBudWxsIH07XG4gICAgaXNJZ25vcmVkID0gcGljb21hdGNoKG9wdHMuaWdub3JlLCBpZ25vcmVPcHRzLCByZXR1cm5TdGF0ZSk7XG4gIH1cblxuICBjb25zdCBtYXRjaGVyID0gKGlucHV0LCByZXR1cm5PYmplY3QgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IHsgaXNNYXRjaCwgbWF0Y2gsIG91dHB1dCB9ID0gcGljb21hdGNoLnRlc3QoaW5wdXQsIHJlZ2V4LCBvcHRpb25zLCB7IGdsb2IsIHBvc2l4IH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IHsgZ2xvYiwgc3RhdGUsIHJlZ2V4LCBwb3NpeCwgaW5wdXQsIG91dHB1dCwgbWF0Y2gsIGlzTWF0Y2ggfTtcblxuICAgIGlmICh0eXBlb2Ygb3B0cy5vblJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3B0cy5vblJlc3VsdChyZXN1bHQpO1xuICAgIH1cblxuICAgIGlmIChpc01hdGNoID09PSBmYWxzZSkge1xuICAgICAgcmVzdWx0LmlzTWF0Y2ggPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXR1cm5PYmplY3QgPyByZXN1bHQgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaXNJZ25vcmVkKGlucHV0KSkge1xuICAgICAgaWYgKHR5cGVvZiBvcHRzLm9uSWdub3JlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdHMub25JZ25vcmUocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5pc01hdGNoID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmV0dXJuT2JqZWN0ID8gcmVzdWx0IDogZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcHRzLm9uTWF0Y2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdHMub25NYXRjaChyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuT2JqZWN0ID8gcmVzdWx0IDogdHJ1ZTtcbiAgfTtcblxuICBpZiAocmV0dXJuU3RhdGUpIHtcbiAgICBtYXRjaGVyLnN0YXRlID0gc3RhdGU7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlcjtcbn07XG5cbi8qKlxuICogVGVzdCBgaW5wdXRgIHdpdGggdGhlIGdpdmVuIGByZWdleGAuIFRoaXMgaXMgdXNlZCBieSB0aGUgbWFpblxuICogYHBpY29tYXRjaCgpYCBmdW5jdGlvbiB0byB0ZXN0IHRoZSBpbnB1dCBzdHJpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLnRlc3QoaW5wdXQsIHJlZ2V4Wywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC50ZXN0KCdmb28vYmFyJywgL14oPzooW14vXSo/KVxcLyhbXi9dKj8pKSQvKSk7XG4gKiAvLyB7IGlzTWF0Y2g6IHRydWUsIG1hdGNoOiBbICdmb28vJywgJ2ZvbycsICdiYXInIF0sIG91dHB1dDogJ2Zvby9iYXInIH1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgU3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1JlZ0V4cH0gYHJlZ2V4YFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIG1hdGNoaW5nIGluZm8uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnBpY29tYXRjaC50ZXN0ID0gKGlucHV0LCByZWdleCwgb3B0aW9ucywgeyBnbG9iLCBwb3NpeCB9ID0ge30pID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBpbnB1dCB0byBiZSBhIHN0cmluZycpO1xuICB9XG5cbiAgaWYgKGlucHV0ID09PSAnJykge1xuICAgIHJldHVybiB7IGlzTWF0Y2g6IGZhbHNlLCBvdXRwdXQ6ICcnIH07XG4gIH1cblxuICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3QgZm9ybWF0ID0gb3B0cy5mb3JtYXQgfHwgKHBvc2l4ID8gdXRpbHMudG9Qb3NpeFNsYXNoZXMgOiBudWxsKTtcbiAgbGV0IG1hdGNoID0gaW5wdXQgPT09IGdsb2I7XG4gIGxldCBvdXRwdXQgPSAobWF0Y2ggJiYgZm9ybWF0KSA/IGZvcm1hdChpbnB1dCkgOiBpbnB1dDtcblxuICBpZiAobWF0Y2ggPT09IGZhbHNlKSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0ID8gZm9ybWF0KGlucHV0KSA6IGlucHV0O1xuICAgIG1hdGNoID0gb3V0cHV0ID09PSBnbG9iO1xuICB9XG5cbiAgaWYgKG1hdGNoID09PSBmYWxzZSB8fCBvcHRzLmNhcHR1cmUgPT09IHRydWUpIHtcbiAgICBpZiAob3B0cy5tYXRjaEJhc2UgPT09IHRydWUgfHwgb3B0cy5iYXNlbmFtZSA9PT0gdHJ1ZSkge1xuICAgICAgbWF0Y2ggPSBwaWNvbWF0Y2gubWF0Y2hCYXNlKGlucHV0LCByZWdleCwgb3B0aW9ucywgcG9zaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWMob3V0cHV0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBpc01hdGNoOiBCb29sZWFuKG1hdGNoKSwgbWF0Y2gsIG91dHB1dCB9O1xufTtcblxuLyoqXG4gKiBNYXRjaCB0aGUgYmFzZW5hbWUgb2YgYSBmaWxlcGF0aC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2gubWF0Y2hCYXNlKGlucHV0LCBnbG9iWywgb3B0aW9uc10pO1xuICogY29uc29sZS5sb2cocGljb21hdGNoLm1hdGNoQmFzZSgnZm9vL2Jhci5qcycsICcqLmpzJyk7IC8vIHRydWVcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBpbnB1dGAgU3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1JlZ0V4cHxTdHJpbmd9IGBnbG9iYCBHbG9iIHBhdHRlcm4gb3IgcmVnZXggY3JlYXRlZCBieSBbLm1ha2VSZV0oI21ha2VSZSkuXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gubWF0Y2hCYXNlID0gKGlucHV0LCBnbG9iLCBvcHRpb25zLCBwb3NpeCA9IHV0aWxzLmlzV2luZG93cyhvcHRpb25zKSkgPT4ge1xuICBjb25zdCByZWdleCA9IGdsb2IgaW5zdGFuY2VvZiBSZWdFeHAgPyBnbG9iIDogcGljb21hdGNoLm1ha2VSZShnbG9iLCBvcHRpb25zKTtcbiAgcmV0dXJuIHJlZ2V4LnRlc3QocGF0aC5iYXNlbmFtZShpbnB1dCkpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgKiphbnkqKiBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgIG1hdGNoIHRoZSBzcGVjaWZpZWQgYHN0cmluZ2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuICogLy8gcGljb21hdGNoLmlzTWF0Y2goc3RyaW5nLCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2guaXNNYXRjaCgnYS5hJywgWydiLionLCAnKi5hJ10pKTsgLy89PiB0cnVlXG4gKiBjb25zb2xlLmxvZyhwaWNvbWF0Y2guaXNNYXRjaCgnYS5hJywgJ2IuKicpKTsgLy89PiBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gc3RyIFRoZSBzdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBwYXR0ZXJucyBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKS5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgcGF0dGVybnMgbWF0Y2ggYHN0cmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLmlzTWF0Y2ggPSAoc3RyLCBwYXR0ZXJucywgb3B0aW9ucykgPT4gcGljb21hdGNoKHBhdHRlcm5zLCBvcHRpb25zKShzdHIpO1xuXG4vKipcbiAqIFBhcnNlIGEgZ2xvYiBwYXR0ZXJuIHRvIGNyZWF0ZSB0aGUgc291cmNlIHN0cmluZyBmb3IgYSByZWd1bGFyXG4gKiBleHByZXNzaW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IHBpY29tYXRjaC5wYXJzZShwYXR0ZXJuWywgb3B0aW9uc10pO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggdXNlZnVsIHByb3BlcnRpZXMgYW5kIG91dHB1dCB0byBiZSB1c2VkIGFzIGEgcmVnZXggc291cmNlIHN0cmluZy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLnBhcnNlID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0dGVybikpIHJldHVybiBwYXR0ZXJuLm1hcChwID0+IHBpY29tYXRjaC5wYXJzZShwLCBvcHRpb25zKSk7XG4gIHJldHVybiBwYXJzZShwYXR0ZXJuLCB7IC4uLm9wdGlvbnMsIGZhc3RwYXRoczogZmFsc2UgfSk7XG59O1xuXG4vKipcbiAqIFNjYW4gYSBnbG9iIHBhdHRlcm4gdG8gc2VwYXJhdGUgdGhlIHBhdHRlcm4gaW50byBzZWdtZW50cy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2guc2NhbihpbnB1dFssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCByZXN1bHQgPSBwaWNvbWF0Y2guc2NhbignIS4vZm9vLyouanMnKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gKiB7IHByZWZpeDogJyEuLycsXG4gKiAgIGlucHV0OiAnIS4vZm9vLyouanMnLFxuICogICBzdGFydDogMyxcbiAqICAgYmFzZTogJ2ZvbycsXG4gKiAgIGdsb2I6ICcqLmpzJyxcbiAqICAgaXNCcmFjZTogZmFsc2UsXG4gKiAgIGlzQnJhY2tldDogZmFsc2UsXG4gKiAgIGlzR2xvYjogdHJ1ZSxcbiAqICAgaXNFeHRnbG9iOiBmYWxzZSxcbiAqICAgaXNHbG9ic3RhcjogZmFsc2UsXG4gKiAgIG5lZ2F0ZWQ6IHRydWUgfVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBHbG9iIHBhdHRlcm4gdG8gc2Nhbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2guc2NhbiA9IChpbnB1dCwgb3B0aW9ucykgPT4gc2NhbihpbnB1dCwgb3B0aW9ucyk7XG5cbi8qKlxuICogQ29tcGlsZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBgc3RhdGVgIG9iamVjdCByZXR1cm5lZCBieSB0aGVcbiAqIFtwYXJzZSgpXSgjcGFyc2UpIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYHN0YXRlYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHBhcmFtIHtCb29sZWFufSBgcmV0dXJuT3V0cHV0YCBJbnRlbmRlZCBmb3IgaW1wbGVtZW50b3JzLCB0aGlzIGFyZ3VtZW50IGFsbG93cyB5b3UgdG8gcmV0dXJuIHRoZSByYXcgb3V0cHV0IGZyb20gdGhlIHBhcnNlci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVyblN0YXRlYCBBZGRzIHRoZSBzdGF0ZSB0byBhIGBzdGF0ZWAgcHJvcGVydHkgb24gdGhlIHJldHVybmVkIHJlZ2V4LiBVc2VmdWwgZm9yIGltcGxlbWVudG9ycyBhbmQgZGVidWdnaW5nLlxuICogQHJldHVybiB7UmVnRXhwfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2guY29tcGlsZVJlID0gKHN0YXRlLCBvcHRpb25zLCByZXR1cm5PdXRwdXQgPSBmYWxzZSwgcmV0dXJuU3RhdGUgPSBmYWxzZSkgPT4ge1xuICBpZiAocmV0dXJuT3V0cHV0ID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHN0YXRlLm91dHB1dDtcbiAgfVxuXG4gIGNvbnN0IG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuICBjb25zdCBwcmVwZW5kID0gb3B0cy5jb250YWlucyA/ICcnIDogJ14nO1xuICBjb25zdCBhcHBlbmQgPSBvcHRzLmNvbnRhaW5zID8gJycgOiAnJCc7XG5cbiAgbGV0IHNvdXJjZSA9IGAke3ByZXBlbmR9KD86JHtzdGF0ZS5vdXRwdXR9KSR7YXBwZW5kfWA7XG4gIGlmIChzdGF0ZSAmJiBzdGF0ZS5uZWdhdGVkID09PSB0cnVlKSB7XG4gICAgc291cmNlID0gYF4oPyEke3NvdXJjZX0pLiokYDtcbiAgfVxuXG4gIGNvbnN0IHJlZ2V4ID0gcGljb21hdGNoLnRvUmVnZXgoc291cmNlLCBvcHRpb25zKTtcbiAgaWYgKHJldHVyblN0YXRlID09PSB0cnVlKSB7XG4gICAgcmVnZXguc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIHJldHVybiByZWdleDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gYSBwYXJzZWQgZ2xvYiBwYXR0ZXJuLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBwaWNvbWF0Y2ggPSByZXF1aXJlKCdwaWNvbWF0Y2gnKTtcbiAqIGNvbnN0IHN0YXRlID0gcGljb21hdGNoLnBhcnNlKCcqLmpzJyk7XG4gKiAvLyBwaWNvbWF0Y2guY29tcGlsZVJlKHN0YXRlWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKHBpY29tYXRjaC5jb21waWxlUmUoc3RhdGUpKTtcbiAqIC8vPT4gL14oPzooPyFcXC4pKD89LilbXi9dKj9cXC5qcykkL1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHN0YXRlYCBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIGAucGFyc2VgIG1ldGhvZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYHJldHVybk91dHB1dGAgSW1wbGVtZW50b3JzIG1heSB1c2UgdGhpcyBhcmd1bWVudCB0byByZXR1cm4gdGhlIGNvbXBpbGVkIG91dHB1dCwgaW5zdGVhZCBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVGhpcyBpcyBub3QgZXhwb3NlZCBvbiB0aGUgb3B0aW9ucyB0byBwcmV2ZW50IGVuZC11c2VycyBmcm9tIG11dGF0aW5nIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGByZXR1cm5TdGF0ZWAgSW1wbGVtZW50b3JzIG1heSB1c2UgdGhpcyBhcmd1bWVudCB0byByZXR1cm4gdGhlIHN0YXRlIGZyb20gdGhlIHBhcnNlZCBnbG9iIHdpdGggdGhlIHJldHVybmVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm4ge1JlZ0V4cH0gUmV0dXJucyBhIHJlZ2V4IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gcGF0dGVybi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxucGljb21hdGNoLm1ha2VSZSA9IChpbnB1dCwgb3B0aW9ucyA9IHt9LCByZXR1cm5PdXRwdXQgPSBmYWxzZSwgcmV0dXJuU3RhdGUgPSBmYWxzZSkgPT4ge1xuICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuXG4gIGxldCBwYXJzZWQgPSB7IG5lZ2F0ZWQ6IGZhbHNlLCBmYXN0cGF0aHM6IHRydWUgfTtcblxuICBpZiAob3B0aW9ucy5mYXN0cGF0aHMgIT09IGZhbHNlICYmIChpbnB1dFswXSA9PT0gJy4nIHx8IGlucHV0WzBdID09PSAnKicpKSB7XG4gICAgcGFyc2VkLm91dHB1dCA9IHBhcnNlLmZhc3RwYXRocyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cblxuICBpZiAoIXBhcnNlZC5vdXRwdXQpIHtcbiAgICBwYXJzZWQgPSBwYXJzZShpbnB1dCwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gcGljb21hdGNoLmNvbXBpbGVSZShwYXJzZWQsIG9wdGlvbnMsIHJldHVybk91dHB1dCwgcmV0dXJuU3RhdGUpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gZnJvbSB0aGUgZ2l2ZW4gcmVnZXggc291cmNlIHN0cmluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcGljb21hdGNoID0gcmVxdWlyZSgncGljb21hdGNoJyk7XG4gKiAvLyBwaWNvbWF0Y2gudG9SZWdleChzb3VyY2VbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc3QgeyBvdXRwdXQgfSA9IHBpY29tYXRjaC5wYXJzZSgnKi5qcycpO1xuICogY29uc29sZS5sb2cocGljb21hdGNoLnRvUmVnZXgob3V0cHV0KSk7XG4gKiAvLz0+IC9eKD86KD8hXFwuKSg/PS4pW14vXSo/XFwuanMpJC9cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzb3VyY2VgIFJlZ3VsYXIgZXhwcmVzc2lvbiBzb3VyY2Ugc3RyaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7UmVnRXhwfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5waWNvbWF0Y2gudG9SZWdleCA9IChzb3VyY2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChzb3VyY2UsIG9wdHMuZmxhZ3MgfHwgKG9wdHMubm9jYXNlID8gJ2knIDogJycpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWJ1ZyA9PT0gdHJ1ZSkgdGhyb3cgZXJyO1xuICAgIHJldHVybiAvJF4vO1xuICB9XG59O1xuXG4vKipcbiAqIFBpY29tYXRjaCBjb25zdGFudHMuXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblxucGljb21hdGNoLmNvbnN0YW50cyA9IGNvbnN0YW50cztcblxuLyoqXG4gKiBFeHBvc2UgXCJwaWNvbWF0Y2hcIlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcGljb21hdGNoO1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9waWNvbWF0Y2gnKTtcbiIsICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5jb25zdCBicmFjZXMgPSByZXF1aXJlKCdicmFjZXMnKTtcbmNvbnN0IHBpY29tYXRjaCA9IHJlcXVpcmUoJ3BpY29tYXRjaCcpO1xuY29uc3QgdXRpbHMgPSByZXF1aXJlKCdwaWNvbWF0Y2gvbGliL3V0aWxzJyk7XG5jb25zdCBpc0VtcHR5U3RyaW5nID0gdmFsID0+IHZhbCA9PT0gJycgfHwgdmFsID09PSAnLi8nO1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IG1hdGNoIG9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0obGlzdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0oWydhLmpzJywgJ2EudHh0J10sIFsnKi5qcyddKSk7XG4gKiAvLz0+IFsgJ2EuanMnIF1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXk8c3RyaW5nPn0gYGxpc3RgIExpc3Qgb2Ygc3RyaW5ncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5PHN0cmluZz59IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucylcbiAqIEByZXR1cm4ge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIG1hdGNoZXNcbiAqIEBzdW1tYXJ5IGZhbHNlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmNvbnN0IG1pY3JvbWF0Y2ggPSAobGlzdCwgcGF0dGVybnMsIG9wdGlvbnMpID0+IHtcbiAgcGF0dGVybnMgPSBbXS5jb25jYXQocGF0dGVybnMpO1xuICBsaXN0ID0gW10uY29uY2F0KGxpc3QpO1xuXG4gIGxldCBvbWl0ID0gbmV3IFNldCgpO1xuICBsZXQga2VlcCA9IG5ldyBTZXQoKTtcbiAgbGV0IGl0ZW1zID0gbmV3IFNldCgpO1xuICBsZXQgbmVnYXRpdmVzID0gMDtcblxuICBsZXQgb25SZXN1bHQgPSBzdGF0ZSA9PiB7XG4gICAgaXRlbXMuYWRkKHN0YXRlLm91dHB1dCk7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5vblJlc3VsdCkge1xuICAgICAgb3B0aW9ucy5vblJlc3VsdChzdGF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgaXNNYXRjaCA9IHBpY29tYXRjaChTdHJpbmcocGF0dGVybnNbaV0pLCB7IC4uLm9wdGlvbnMsIG9uUmVzdWx0IH0sIHRydWUpO1xuICAgIGxldCBuZWdhdGVkID0gaXNNYXRjaC5zdGF0ZS5uZWdhdGVkIHx8IGlzTWF0Y2guc3RhdGUubmVnYXRlZEV4dGdsb2I7XG4gICAgaWYgKG5lZ2F0ZWQpIG5lZ2F0aXZlcysrO1xuXG4gICAgZm9yIChsZXQgaXRlbSBvZiBsaXN0KSB7XG4gICAgICBsZXQgbWF0Y2hlZCA9IGlzTWF0Y2goaXRlbSwgdHJ1ZSk7XG5cbiAgICAgIGxldCBtYXRjaCA9IG5lZ2F0ZWQgPyAhbWF0Y2hlZC5pc01hdGNoIDogbWF0Y2hlZC5pc01hdGNoO1xuICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgIGlmIChuZWdhdGVkKSB7XG4gICAgICAgIG9taXQuYWRkKG1hdGNoZWQub3V0cHV0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9taXQuZGVsZXRlKG1hdGNoZWQub3V0cHV0KTtcbiAgICAgICAga2VlcC5hZGQobWF0Y2hlZC5vdXRwdXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxldCByZXN1bHQgPSBuZWdhdGl2ZXMgPT09IHBhdHRlcm5zLmxlbmd0aCA/IFsuLi5pdGVtc10gOiBbLi4ua2VlcF07XG4gIGxldCBtYXRjaGVzID0gcmVzdWx0LmZpbHRlcihpdGVtID0+ICFvbWl0LmhhcyhpdGVtKSk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgbWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAob3B0aW9ucy5mYWlsZ2xvYiA9PT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBtYXRjaGVzIGZvdW5kIGZvciBcIiR7cGF0dGVybnMuam9pbignLCAnKX1cImApO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm5vbnVsbCA9PT0gdHJ1ZSB8fCBvcHRpb25zLm51bGxnbG9iID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy51bmVzY2FwZSA/IHBhdHRlcm5zLm1hcChwID0+IHAucmVwbGFjZSgvXFxcXC9nLCAnJykpIDogcGF0dGVybnM7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1hdGNoZXM7XG59O1xuXG4vKipcbiAqIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKi9cblxubWljcm9tYXRjaC5tYXRjaCA9IG1pY3JvbWF0Y2g7XG5cbi8qKlxuICogUmV0dXJucyBhIG1hdGNoZXIgZnVuY3Rpb24gZnJvbSB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybmAgYW5kIGBvcHRpb25zYC5cbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiB0YWtlcyBhIHN0cmluZyB0byBtYXRjaCBhcyBpdHMgb25seSBhcmd1bWVudCBhbmQgcmV0dXJuc1xuICogdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgbWF0Y2guXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1tID0gcmVxdWlyZSgnbWljcm9tYXRjaCcpO1xuICogLy8gbW0ubWF0Y2hlcihwYXR0ZXJuWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnN0IGlzTWF0Y2ggPSBtbS5tYXRjaGVyKCcqLiEoKmEpJyk7XG4gKiBjb25zb2xlLmxvZyhpc01hdGNoKCdhLmEnKSk7IC8vPT4gZmFsc2VcbiAqIGNvbnNvbGUubG9nKGlzTWF0Y2goJ2EuYicpKTsgLy89PiB0cnVlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgR2xvYiBwYXR0ZXJuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gUmV0dXJucyBhIG1hdGNoZXIgZnVuY3Rpb24uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gubWF0Y2hlciA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiBwaWNvbWF0Y2gocGF0dGVybiwgb3B0aW9ucyk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmICoqYW55Kiogb2YgdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5zYCBtYXRjaCB0aGUgc3BlY2lmaWVkIGBzdHJpbmdgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmlzTWF0Y2goc3RyaW5nLCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5pc01hdGNoKCdhLmEnLCBbJ2IuKicsICcqLmEnXSkpOyAvLz0+IHRydWVcbiAqIGNvbnNvbGUubG9nKG1tLmlzTWF0Y2goJ2EuYScsICdiLionKSk7IC8vPT4gZmFsc2VcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBzdHJgIFRoZSBzdHJpbmcgdG8gdGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgW29wdGlvbnNdYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykuXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBhdHRlcm5zIG1hdGNoIGBzdHJgXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guaXNNYXRjaCA9IChzdHIsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiBwaWNvbWF0Y2gocGF0dGVybnMsIG9wdGlvbnMpKHN0cik7XG5cbi8qKlxuICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqL1xuXG5taWNyb21hdGNoLmFueSA9IG1pY3JvbWF0Y2guaXNNYXRjaDtcblxuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJpbmdzIHRoYXQgXyoqZG8gbm90IG1hdGNoIGFueSoqXyBvZiB0aGUgZ2l2ZW4gYHBhdHRlcm5zYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5ub3QobGlzdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0ubm90KFsnYS5hJywgJ2IuYicsICdjLmMnXSwgJyouYScpKTtcbiAqIC8vPT4gWydiLmInLCAnYy5jJ11cbiAqIGBgYFxuICogQHBhcmFtIHtBcnJheX0gYGxpc3RgIEFycmF5IG9mIHN0cmluZ3MgdG8gbWF0Y2guXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm4gdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtBcnJheX0gUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgKipkbyBub3QgbWF0Y2gqKiB0aGUgZ2l2ZW4gcGF0dGVybnMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2gubm90ID0gKGxpc3QsIHBhdHRlcm5zLCBvcHRpb25zID0ge30pID0+IHtcbiAgcGF0dGVybnMgPSBbXS5jb25jYXQocGF0dGVybnMpLm1hcChTdHJpbmcpO1xuICBsZXQgcmVzdWx0ID0gbmV3IFNldCgpO1xuICBsZXQgaXRlbXMgPSBbXTtcblxuICBsZXQgb25SZXN1bHQgPSBzdGF0ZSA9PiB7XG4gICAgaWYgKG9wdGlvbnMub25SZXN1bHQpIG9wdGlvbnMub25SZXN1bHQoc3RhdGUpO1xuICAgIGl0ZW1zLnB1c2goc3RhdGUub3V0cHV0KTtcbiAgfTtcblxuICBsZXQgbWF0Y2hlcyA9IG5ldyBTZXQobWljcm9tYXRjaChsaXN0LCBwYXR0ZXJucywgeyAuLi5vcHRpb25zLCBvblJlc3VsdCB9KSk7XG5cbiAgZm9yIChsZXQgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmICghbWF0Y2hlcy5oYXMoaXRlbSkpIHtcbiAgICAgIHJlc3VsdC5hZGQoaXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4ucmVzdWx0XTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgc3RyaW5nYCBjb250YWlucyB0aGUgZ2l2ZW4gcGF0dGVybi4gU2ltaWxhclxuICogdG8gWy5pc01hdGNoXSgjaXNNYXRjaCkgYnV0IHRoZSBwYXR0ZXJuIGNhbiBtYXRjaCBhbnkgcGFydCBvZiB0aGUgc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5jb250YWlucyhzdHJpbmcsIHBhdHRlcm5bLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uY29udGFpbnMoJ2FhL2JiL2NjJywgJypiJykpO1xuICogLy89PiB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5jb250YWlucygnYWEvYmIvY2MnLCAnKmQnKSk7XG4gKiAvLz0+IGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgc3RyYCBUaGUgc3RyaW5nIHRvIG1hdGNoLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgR2xvYiBwYXR0ZXJuIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgcGF0dGVybnMgbWF0Y2hlcyBhbnkgcGFydCBvZiBgc3RyYC5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5jb250YWlucyA9IChzdHIsIHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgYSBzdHJpbmc6IFwiJHt1dGlsLmluc3BlY3Qoc3RyKX1cImApO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zb21lKHAgPT4gbWljcm9tYXRjaC5jb250YWlucyhzdHIsIHAsIG9wdGlvbnMpKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoaXNFbXB0eVN0cmluZyhzdHIpIHx8IGlzRW1wdHlTdHJpbmcocGF0dGVybikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc3RyLmluY2x1ZGVzKHBhdHRlcm4pIHx8IChzdHIuc3RhcnRzV2l0aCgnLi8nKSAmJiBzdHIuc2xpY2UoMikuaW5jbHVkZXMocGF0dGVybikpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWljcm9tYXRjaC5pc01hdGNoKHN0ciwgcGF0dGVybiwgeyAuLi5vcHRpb25zLCBjb250YWluczogdHJ1ZSB9KTtcbn07XG5cbi8qKlxuICogRmlsdGVyIHRoZSBrZXlzIG9mIHRoZSBnaXZlbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gYGdsb2JgIHBhdHRlcm5cbiAqIGFuZCBgb3B0aW9uc2AuIERvZXMgbm90IGF0dGVtcHQgdG8gbWF0Y2ggbmVzdGVkIGtleXMuIElmIHlvdSBuZWVkIHRoaXMgZmVhdHVyZSxcbiAqIHVzZSBbZ2xvYi1vYmplY3RdW10gaW5zdGVhZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5tYXRjaEtleXMob2JqZWN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zdCBvYmogPSB7IGFhOiAnYScsIGFiOiAnYicsIGFjOiAnYycgfTtcbiAqIGNvbnNvbGUubG9nKG1tLm1hdGNoS2V5cyhvYmosICcqYicpKTtcbiAqIC8vPT4geyBhYjogJ2InIH1cbiAqIGBgYFxuICogQHBhcmFtIHtPYmplY3R9IGBvYmplY3RgIFRoZSBvYmplY3Qgd2l0aCBrZXlzIHRvIGZpbHRlci5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgcGF0dGVybnNgIE9uZSBvciBtb3JlIGdsb2IgcGF0dGVybnMgdG8gdXNlIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggb25seSBrZXlzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm5zLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLm1hdGNoS2V5cyA9IChvYmosIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGlmICghdXRpbHMuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHRoZSBmaXJzdCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3QnKTtcbiAgfVxuICBsZXQga2V5cyA9IG1pY3JvbWF0Y2goT2JqZWN0LmtleXMob2JqKSwgcGF0dGVybnMsIG9wdGlvbnMpO1xuICBsZXQgcmVzID0ge307XG4gIGZvciAobGV0IGtleSBvZiBrZXlzKSByZXNba2V5XSA9IG9ialtrZXldO1xuICByZXR1cm4gcmVzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgc29tZSBvZiB0aGUgc3RyaW5ncyBpbiB0aGUgZ2l2ZW4gYGxpc3RgIG1hdGNoIGFueSBvZiB0aGUgZ2l2ZW4gZ2xvYiBgcGF0dGVybnNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLnNvbWUobGlzdCwgcGF0dGVybnNbLCBvcHRpb25zXSk7XG4gKlxuICogY29uc29sZS5sb2cobW0uc29tZShbJ2Zvby5qcycsICdiYXIuanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uc29tZShbJ2Zvby5qcyddLCBbJyouanMnLCAnIWZvby5qcyddKSk7XG4gKiAvLyBmYWxzZVxuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYGxpc3RgIFRoZSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyB0byB0ZXN0LiBSZXR1cm5zIGFzIHNvb24gYXMgdGhlIGZpcnN0IG1hdGNoIGlzIGZvdW5kLlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGBwYXR0ZXJuc2AgT25lIG9yIG1vcmUgZ2xvYiBwYXR0ZXJucyB0byB1c2UgZm9yIG1hdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYCBTZWUgYXZhaWxhYmxlIFtvcHRpb25zXSgjb3B0aW9ucykgZm9yIGNoYW5naW5nIGhvdyBtYXRjaGVzIGFyZSBwZXJmb3JtZWRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBhbnkgYHBhdHRlcm5zYCBtYXRjaGVzIGFueSBvZiB0aGUgc3RyaW5ncyBpbiBgbGlzdGBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5zb21lID0gKGxpc3QsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGxldCBpdGVtcyA9IFtdLmNvbmNhdChsaXN0KTtcblxuICBmb3IgKGxldCBwYXR0ZXJuIG9mIFtdLmNvbmNhdChwYXR0ZXJucykpIHtcbiAgICBsZXQgaXNNYXRjaCA9IHBpY29tYXRjaChTdHJpbmcocGF0dGVybiksIG9wdGlvbnMpO1xuICAgIGlmIChpdGVtcy5zb21lKGl0ZW0gPT4gaXNNYXRjaChpdGVtKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBldmVyeSBzdHJpbmcgaW4gdGhlIGdpdmVuIGBsaXN0YCBtYXRjaGVzXG4gKiBhbnkgb2YgdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5zYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW0gPSByZXF1aXJlKCdtaWNyb21hdGNoJyk7XG4gKiAvLyBtbS5ldmVyeShsaXN0LCBwYXR0ZXJuc1ssIG9wdGlvbnNdKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeSgnZm9vLmpzJywgWydmb28uanMnXSkpO1xuICogLy8gdHJ1ZVxuICogY29uc29sZS5sb2cobW0uZXZlcnkoWydmb28uanMnLCAnYmFyLmpzJ10sIFsnKi5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBjb25zb2xlLmxvZyhtbS5ldmVyeShbJ2Zvby5qcycsICdiYXIuanMnXSwgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqIGNvbnNvbGUubG9nKG1tLmV2ZXJ5KFsnZm9vLmpzJ10sIFsnKi5qcycsICchZm9vLmpzJ10pKTtcbiAqIC8vIGZhbHNlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgbGlzdGAgVGhlIHN0cmluZyBvciBhcnJheSBvZiBzdHJpbmdzIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFsbCBgcGF0dGVybnNgIG1hdGNoZXMgYWxsIG9mIHRoZSBzdHJpbmdzIGluIGBsaXN0YFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmV2ZXJ5ID0gKGxpc3QsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGxldCBpdGVtcyA9IFtdLmNvbmNhdChsaXN0KTtcblxuICBmb3IgKGxldCBwYXR0ZXJuIG9mIFtdLmNvbmNhdChwYXR0ZXJucykpIHtcbiAgICBsZXQgaXNNYXRjaCA9IHBpY29tYXRjaChTdHJpbmcocGF0dGVybiksIG9wdGlvbnMpO1xuICAgIGlmICghaXRlbXMuZXZlcnkoaXRlbSA9PiBpc01hdGNoKGl0ZW0pKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmICoqYWxsKiogb2YgdGhlIGdpdmVuIGBwYXR0ZXJuc2AgbWF0Y2hcbiAqIHRoZSBzcGVjaWZpZWQgc3RyaW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmFsbChzdHJpbmcsIHBhdHRlcm5zWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWydmb28uanMnXSkpO1xuICogLy8gdHJ1ZVxuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWycqLmpzJywgJyFmb28uanMnXSkpO1xuICogLy8gZmFsc2VcbiAqXG4gKiBjb25zb2xlLmxvZyhtbS5hbGwoJ2Zvby5qcycsIFsnKi5qcycsICdmb28uanMnXSkpO1xuICogLy8gdHJ1ZVxuICpcbiAqIGNvbnNvbGUubG9nKG1tLmFsbCgnZm9vLmpzJywgWycqLmpzJywgJ2YqJywgJypvKicsICcqby5qcyddKSk7XG4gKiAvLyB0cnVlXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBgc3RyYCBUaGUgc3RyaW5nIHRvIHRlc3QuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gYHBhdHRlcm5zYCBPbmUgb3IgbW9yZSBnbG9iIHBhdHRlcm5zIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIFNlZSBhdmFpbGFibGUgW29wdGlvbnNdKCNvcHRpb25zKSBmb3IgY2hhbmdpbmcgaG93IG1hdGNoZXMgYXJlIHBlcmZvcm1lZFxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwYXR0ZXJucyBtYXRjaCBgc3RyYFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmFsbCA9IChzdHIsIHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIGEgc3RyaW5nOiBcIiR7dXRpbC5pbnNwZWN0KHN0cil9XCJgKTtcbiAgfVxuXG4gIHJldHVybiBbXS5jb25jYXQocGF0dGVybnMpLmV2ZXJ5KHAgPT4gcGljb21hdGNoKHAsIG9wdGlvbnMpKHN0cikpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIG1hdGNoZXMgY2FwdHVyZWQgYnkgYHBhdHRlcm5gIGluIGBzdHJpbmcsIG9yIGBudWxsYCBpZiB0aGUgcGF0dGVybiBkaWQgbm90IG1hdGNoLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLmNhcHR1cmUocGF0dGVybiwgc3RyaW5nWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLmNhcHR1cmUoJ3Rlc3QvKi5qcycsICd0ZXN0L2Zvby5qcycpKTtcbiAqIC8vPT4gWydmb28nXVxuICogY29uc29sZS5sb2cobW0uY2FwdHVyZSgndGVzdC8qLmpzJywgJ2Zvby9iYXIuY3NzJykpO1xuICogLy89PiBudWxsXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgZ2xvYmAgR2xvYiBwYXR0ZXJuIHRvIHVzZSBmb3IgbWF0Y2hpbmcuXG4gKiBAcGFyYW0ge1N0cmluZ30gYGlucHV0YCBTdHJpbmcgdG8gbWF0Y2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2AgU2VlIGF2YWlsYWJsZSBbb3B0aW9uc10oI29wdGlvbnMpIGZvciBjaGFuZ2luZyBob3cgbWF0Y2hlcyBhcmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJuIHtBcnJheXxudWxsfSBSZXR1cm5zIGFuIGFycmF5IG9mIGNhcHR1cmVzIGlmIHRoZSBpbnB1dCBtYXRjaGVzIHRoZSBnbG9iIHBhdHRlcm4sIG90aGVyd2lzZSBgbnVsbGAuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1pY3JvbWF0Y2guY2FwdHVyZSA9IChnbG9iLCBpbnB1dCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcG9zaXggPSB1dGlscy5pc1dpbmRvd3Mob3B0aW9ucyk7XG4gIGxldCByZWdleCA9IHBpY29tYXRjaC5tYWtlUmUoU3RyaW5nKGdsb2IpLCB7IC4uLm9wdGlvbnMsIGNhcHR1cmU6IHRydWUgfSk7XG4gIGxldCBtYXRjaCA9IHJlZ2V4LmV4ZWMocG9zaXggPyB1dGlscy50b1Bvc2l4U2xhc2hlcyhpbnB1dCkgOiBpbnB1dCk7XG5cbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIG1hdGNoLnNsaWNlKDEpLm1hcCh2ID0+IHYgPT09IHZvaWQgMCA/ICcnIDogdik7XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIGdpdmVuIGdsb2IgYHBhdHRlcm5gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIC8vIG1tLm1ha2VSZShwYXR0ZXJuWywgb3B0aW9uc10pO1xuICpcbiAqIGNvbnNvbGUubG9nKG1tLm1ha2VSZSgnKi5qcycpKTtcbiAqIC8vPT4gL14oPzooXFwuW1xcXFxcXC9dKT8oPyFcXC4pKD89LilbXlxcL10qP1xcLmpzKSQvXG4gKiBgYGBcbiAqIEBwYXJhbSB7U3RyaW5nfSBgcGF0dGVybmAgQSBnbG9iIHBhdHRlcm4gdG8gY29udmVydCB0byByZWdleC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBgb3B0aW9uc2BcbiAqIEByZXR1cm4ge1JlZ0V4cH0gUmV0dXJucyBhIHJlZ2V4IGNyZWF0ZWQgZnJvbSB0aGUgZ2l2ZW4gcGF0dGVybi5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5tYWtlUmUgPSAoLi4uYXJncykgPT4gcGljb21hdGNoLm1ha2VSZSguLi5hcmdzKTtcblxuLyoqXG4gKiBTY2FuIGEgZ2xvYiBwYXR0ZXJuIHRvIHNlcGFyYXRlIHRoZSBwYXR0ZXJuIGludG8gc2VnbWVudHMuIFVzZWRcbiAqIGJ5IHRoZSBbc3BsaXRdKCNzcGxpdCkgbWV0aG9kLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIGNvbnN0IHN0YXRlID0gbW0uc2NhbihwYXR0ZXJuWywgb3B0aW9uc10pO1xuICogYGBgXG4gKiBAcGFyYW0ge1N0cmluZ30gYHBhdHRlcm5gXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgXG4gKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGhcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubWljcm9tYXRjaC5zY2FuID0gKC4uLmFyZ3MpID0+IHBpY29tYXRjaC5zY2FuKC4uLmFyZ3MpO1xuXG4vKipcbiAqIFBhcnNlIGEgZ2xvYiBwYXR0ZXJuIHRvIGNyZWF0ZSB0aGUgc291cmNlIHN0cmluZyBmb3IgYSByZWd1bGFyXG4gKiBleHByZXNzaW9uLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtbSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIGNvbnN0IHN0YXRlID0gbW0ucGFyc2UocGF0dGVyblssIG9wdGlvbnNdKTtcbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBnbG9iYFxuICogQHBhcmFtIHtPYmplY3R9IGBvcHRpb25zYFxuICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHVzZWZ1bCBwcm9wZXJ0aWVzIGFuZCBvdXRwdXQgdG8gYmUgdXNlZCBhcyByZWdleCBzb3VyY2Ugc3RyaW5nLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLnBhcnNlID0gKHBhdHRlcm5zLCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXMgPSBbXTtcbiAgZm9yIChsZXQgcGF0dGVybiBvZiBbXS5jb25jYXQocGF0dGVybnMgfHwgW10pKSB7XG4gICAgZm9yIChsZXQgc3RyIG9mIGJyYWNlcyhTdHJpbmcocGF0dGVybiksIG9wdGlvbnMpKSB7XG4gICAgICByZXMucHVzaChwaWNvbWF0Y2gucGFyc2Uoc3RyLCBvcHRpb25zKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgdGhlIGdpdmVuIGJyYWNlIGBwYXR0ZXJuYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeyBicmFjZXMgfSA9IHJlcXVpcmUoJ21pY3JvbWF0Y2gnKTtcbiAqIGNvbnNvbGUubG9nKGJyYWNlcygnZm9vL3thLGIsY30vYmFyJykpO1xuICogLy89PiBbICdmb28vKGF8YnxjKS9iYXInIF1cbiAqXG4gKiBjb25zb2xlLmxvZyhicmFjZXMoJ2Zvby97YSxiLGN9L2JhcicsIHsgZXhwYW5kOiB0cnVlIH0pKTtcbiAqIC8vPT4gWyAnZm9vL2EvYmFyJywgJ2Zvby9iL2JhcicsICdmb28vYy9iYXInIF1cbiAqIGBgYFxuICogQHBhcmFtIHtTdHJpbmd9IGBwYXR0ZXJuYCBTdHJpbmcgd2l0aCBicmFjZSBwYXR0ZXJuIHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0ge09iamVjdH0gYG9wdGlvbnNgIEFueSBbb3B0aW9uc10oI29wdGlvbnMpIHRvIGNoYW5nZSBob3cgZXhwYW5zaW9uIGlzIHBlcmZvcm1lZC4gU2VlIHRoZSBbYnJhY2VzXVtdIGxpYnJhcnkgZm9yIGFsbCBhdmFpbGFibGUgb3B0aW9ucy5cbiAqIEByZXR1cm4ge0FycmF5fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5taWNyb21hdGNoLmJyYWNlcyA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiB7XG4gIGlmICh0eXBlb2YgcGF0dGVybiAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7XG4gIGlmICgob3B0aW9ucyAmJiBvcHRpb25zLm5vYnJhY2UgPT09IHRydWUpIHx8ICEvXFx7LipcXH0vLnRlc3QocGF0dGVybikpIHtcbiAgICByZXR1cm4gW3BhdHRlcm5dO1xuICB9XG4gIHJldHVybiBicmFjZXMocGF0dGVybiwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIEV4cGFuZCBicmFjZXNcbiAqL1xuXG5taWNyb21hdGNoLmJyYWNlRXhwYW5kID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYSBzdHJpbmcnKTtcbiAgcmV0dXJuIG1pY3JvbWF0Y2guYnJhY2VzKHBhdHRlcm4sIHsgLi4ub3B0aW9ucywgZXhwYW5kOiB0cnVlIH0pO1xufTtcblxuLyoqXG4gKiBFeHBvc2UgbWljcm9tYXRjaFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gbWljcm9tYXRjaDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubWF0Y2ggPSB2b2lkIDA7XG5jb25zdCBpc0dsb2IgPSByZXF1aXJlKFwiaXMtZ2xvYlwiKTtcbmNvbnN0IG1pY3JvbWF0Y2ggPSByZXF1aXJlKFwibWljcm9tYXRjaFwiKTtcbmNvbnN0IHVybCA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmZ1bmN0aW9uIG1hdGNoKGNvbnRleHQsIHVyaSwgcmVxKSB7XG4gICAgLy8gc2luZ2xlIHBhdGhcbiAgICBpZiAoaXNTdHJpbmdQYXRoKGNvbnRleHQpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFNpbmdsZVN0cmluZ1BhdGgoY29udGV4dCwgdXJpKTtcbiAgICB9XG4gICAgLy8gc2luZ2xlIGdsb2IgcGF0aFxuICAgIGlmIChpc0dsb2JQYXRoKGNvbnRleHQpKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFNpbmdsZUdsb2JQYXRoKGNvbnRleHQsIHVyaSk7XG4gICAgfVxuICAgIC8vIG11bHRpIHBhdGhcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBpZiAoY29udGV4dC5ldmVyeShpc1N0cmluZ1BhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hNdWx0aVBhdGgoY29udGV4dCwgdXJpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGV4dC5ldmVyeShpc0dsb2JQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoTXVsdGlHbG9iUGF0aChjb250ZXh0LCB1cmkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcnNfMS5FUlJPUlMuRVJSX0NPTlRFWFRfTUFUQ0hFUl9JTlZBTElEX0FSUkFZKTtcbiAgICB9XG4gICAgLy8gY3VzdG9tIG1hdGNoaW5nXG4gICAgaWYgKHR5cGVvZiBjb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHBhdGhuYW1lID0gZ2V0VXJsUGF0aE5hbWUodXJpKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQocGF0aG5hbWUsIHJlcSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihlcnJvcnNfMS5FUlJPUlMuRVJSX0NPTlRFWFRfTUFUQ0hFUl9HRU5FUklDKTtcbn1cbmV4cG9ydHMubWF0Y2ggPSBtYXRjaDtcbi8qKlxuICogQHBhcmFtICB7U3RyaW5nfSBjb250ZXh0ICcvYXBpJ1xuICogQHBhcmFtICB7U3RyaW5nfSB1cmkgICAgICdodHRwOi8vZXhhbXBsZS5vcmcvYXBpL2IvYy9kLmh0bWwnXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBtYXRjaFNpbmdsZVN0cmluZ1BhdGgoY29udGV4dCwgdXJpKSB7XG4gICAgY29uc3QgcGF0aG5hbWUgPSBnZXRVcmxQYXRoTmFtZSh1cmkpO1xuICAgIHJldHVybiBwYXRobmFtZS5pbmRleE9mKGNvbnRleHQpID09PSAwO1xufVxuZnVuY3Rpb24gbWF0Y2hTaW5nbGVHbG9iUGF0aChwYXR0ZXJuLCB1cmkpIHtcbiAgICBjb25zdCBwYXRobmFtZSA9IGdldFVybFBhdGhOYW1lKHVyaSk7XG4gICAgY29uc3QgbWF0Y2hlcyA9IG1pY3JvbWF0Y2goW3BhdGhuYW1lXSwgcGF0dGVybik7XG4gICAgcmV0dXJuIG1hdGNoZXMgJiYgbWF0Y2hlcy5sZW5ndGggPiAwO1xufVxuZnVuY3Rpb24gbWF0Y2hNdWx0aUdsb2JQYXRoKHBhdHRlcm5MaXN0LCB1cmkpIHtcbiAgICByZXR1cm4gbWF0Y2hTaW5nbGVHbG9iUGF0aChwYXR0ZXJuTGlzdCwgdXJpKTtcbn1cbi8qKlxuICogQHBhcmFtICB7U3RyaW5nfSBjb250ZXh0TGlzdCBbJy9hcGknLCAnL2FqYXgnXVxuICogQHBhcmFtICB7U3RyaW5nfSB1cmkgICAgICdodHRwOi8vZXhhbXBsZS5vcmcvYXBpL2IvYy9kLmh0bWwnXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBtYXRjaE11bHRpUGF0aChjb250ZXh0TGlzdCwgdXJpKSB7XG4gICAgbGV0IGlzTXVsdGlQYXRoID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBjb250ZXh0IG9mIGNvbnRleHRMaXN0KSB7XG4gICAgICAgIGlmIChtYXRjaFNpbmdsZVN0cmluZ1BhdGgoY29udGV4dCwgdXJpKSkge1xuICAgICAgICAgICAgaXNNdWx0aVBhdGggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzTXVsdGlQYXRoO1xufVxuLyoqXG4gKiBQYXJzZXMgVVJJIGFuZCByZXR1cm5zIFJGQyAzOTg2IHBhdGhcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHVyaSBmcm9tIHJlcS51cmxcbiAqIEByZXR1cm4ge1N0cmluZ30gICAgIFJGQyAzOTg2IHBhdGhcbiAqL1xuZnVuY3Rpb24gZ2V0VXJsUGF0aE5hbWUodXJpKSB7XG4gICAgcmV0dXJuIHVyaSAmJiB1cmwucGFyc2UodXJpKS5wYXRobmFtZTtcbn1cbmZ1bmN0aW9uIGlzU3RyaW5nUGF0aChjb250ZXh0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJyAmJiAhaXNHbG9iKGNvbnRleHQpO1xufVxuZnVuY3Rpb24gaXNHbG9iUGF0aChjb250ZXh0KSB7XG4gICAgcmV0dXJuIGlzR2xvYihjb250ZXh0KTtcbn1cbiIsICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0SGFuZGxlcnMgPSBleHBvcnRzLmluaXQgPSB2b2lkIDA7XG5jb25zdCBsb2dnZXJfMSA9IHJlcXVpcmUoXCIuL2xvZ2dlclwiKTtcbmNvbnN0IGxvZ2dlciA9ICgwLCBsb2dnZXJfMS5nZXRJbnN0YW5jZSkoKTtcbmZ1bmN0aW9uIGluaXQocHJveHksIG9wdGlvbikge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gZ2V0SGFuZGxlcnMob3B0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBPYmplY3Qua2V5cyhoYW5kbGVycykpIHtcbiAgICAgICAgcHJveHkub24oZXZlbnROYW1lLCBoYW5kbGVyc1tldmVudE5hbWVdKTtcbiAgICB9XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2svd2VicGFjay1kZXYtc2VydmVyL2lzc3Vlcy8xNjQyXG4gICAgcHJveHkub24oJ2Vjb25ucmVzZXQnLCAoZXJyb3IsIHJlcSwgcmVzLCB0YXJnZXQpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbSFBNXSBFQ09OTlJFU0VUOiAlT2AsIGVycm9yKTtcbiAgICB9KTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay93ZWJwYWNrLWRldi1zZXJ2ZXIvaXNzdWVzLzE2NDIjaXNzdWVjb21tZW50LTExMDQzMjUxMjBcbiAgICBwcm94eS5vbigncHJveHlSZXFXcycsIChwcm94eVJlcSwgcmVxLCBzb2NrZXQsIG9wdGlvbnMsIGhlYWQpID0+IHtcbiAgICAgICAgc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBbSFBNXSBXZWJTb2NrZXQgZXJyb3I6ICVPYCwgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICBsb2dnZXIuZGVidWcoJ1tIUE1dIFN1YnNjcmliZWQgdG8gaHR0cC1wcm94eSBldmVudHM6JywgT2JqZWN0LmtleXMoaGFuZGxlcnMpKTtcbn1cbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5mdW5jdGlvbiBnZXRIYW5kbGVycyhvcHRpb25zKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqaXRzdS9ub2RlLWh0dHAtcHJveHkjbGlzdGVuaW5nLWZvci1wcm94eS1ldmVudHNcbiAgICBjb25zdCBwcm94eUV2ZW50c01hcCA9IHtcbiAgICAgICAgZXJyb3I6ICdvbkVycm9yJyxcbiAgICAgICAgcHJveHlSZXE6ICdvblByb3h5UmVxJyxcbiAgICAgICAgcHJveHlSZXFXczogJ29uUHJveHlSZXFXcycsXG4gICAgICAgIHByb3h5UmVzOiAnb25Qcm94eVJlcycsXG4gICAgICAgIG9wZW46ICdvbk9wZW4nLFxuICAgICAgICBjbG9zZTogJ29uQ2xvc2UnLFxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlcnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtldmVudE5hbWUsIG9uRXZlbnROYW1lXSBvZiBPYmplY3QuZW50cmllcyhwcm94eUV2ZW50c01hcCkpIHtcbiAgICAgICAgLy8gYWxsIGhhbmRsZXJzIGZvciB0aGUgaHR0cC1wcm94eSBldmVudHMgYXJlIHByZWZpeGVkIHdpdGggJ29uJy5cbiAgICAgICAgLy8gbG9vcCB0aHJvdWdoIG9wdGlvbnMgYW5kIHRyeSB0byBmaW5kIHRoZXNlIGhhbmRsZXJzXG4gICAgICAgIC8vIGFuZCBhZGQgdGhlbSB0byB0aGUgaGFuZGxlcnMgb2JqZWN0IGZvciBzdWJzY3JpcHRpb24gaW4gaW5pdCgpLlxuICAgICAgICBjb25zdCBmbkhhbmRsZXIgPSBvcHRpb25zID8gb3B0aW9uc1tvbkV2ZW50TmFtZV0gOiBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIGZuSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaGFuZGxlcnNbZXZlbnROYW1lXSA9IGZuSGFuZGxlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgZGVmYXVsdCBlcnJvciBoYW5kbGVyIGluIGFic2VuY2Ugb2YgZXJyb3IgaGFuZGxlclxuICAgIGlmICh0eXBlb2YgaGFuZGxlcnMuZXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGFuZGxlcnMuZXJyb3IgPSBkZWZhdWx0RXJyb3JIYW5kbGVyO1xuICAgIH1cbiAgICAvLyBhZGQgZGVmYXVsdCBjbG9zZSBoYW5kbGVyIGluIGFic2VuY2Ugb2YgY2xvc2UgaGFuZGxlclxuICAgIGlmICh0eXBlb2YgaGFuZGxlcnMuY2xvc2UgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGFuZGxlcnMuY2xvc2UgPSBsb2dDbG9zZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhbmRsZXJzO1xufVxuZXhwb3J0cy5nZXRIYW5kbGVycyA9IGdldEhhbmRsZXJzO1xuZnVuY3Rpb24gZGVmYXVsdEVycm9ySGFuZGxlcihlcnIsIHJlcSwgcmVzKSB7XG4gICAgLy8gUmUtdGhyb3cgZXJyb3IuIE5vdCByZWNvdmVyYWJsZSBzaW5jZSByZXEgJiByZXMgYXJlIGVtcHR5LlxuICAgIGlmICghcmVxICYmICFyZXMpIHtcbiAgICAgICAgdGhyb3cgZXJyOyAvLyBcIkVycm9yOiBNdXN0IHByb3ZpZGUgYSBwcm9wZXIgVVJMIGFzIHRhcmdldFwiXG4gICAgfVxuICAgIGNvbnN0IGhvc3QgPSByZXEuaGVhZGVycyAmJiByZXEuaGVhZGVycy5ob3N0O1xuICAgIGNvbnN0IGNvZGUgPSBlcnIuY29kZTtcbiAgICBpZiAocmVzLndyaXRlSGVhZCAmJiAhcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIGlmICgvSFBFX0lOVkFMSUQvLnRlc3QoY29kZSkpIHtcbiAgICAgICAgICAgIHJlcy53cml0ZUhlYWQoNTAyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ0VDT05OUkVTRVQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0VOT1RGT1VORCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnRUNPTk5SRUZVU0VEJzpcbiAgICAgICAgICAgICAgICBjYXNlICdFVElNRURPVVQnOlxuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVIZWFkKDUwNCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUhlYWQoNTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXMuZW5kKGBFcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcHJveHk6ICR7aG9zdH0ke3JlcS51cmx9YCk7XG59XG5mdW5jdGlvbiBsb2dDbG9zZShyZXEsIHNvY2tldCwgaGVhZCkge1xuICAgIC8vIHZpZXcgZGlzY29ubmVjdGVkIHdlYnNvY2tldCBjb25uZWN0aW9uc1xuICAgIGxvZ2dlci5pbmZvKCdbSFBNXSBDbGllbnQgZGlzY29ubmVjdGVkJyk7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZVBhdGhSZXdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IGlzUGxhaW5PYmogPSByZXF1aXJlKFwiaXMtcGxhaW4tb2JqXCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG5jb25zdCBsb2dnZXJfMSA9IHJlcXVpcmUoXCIuL2xvZ2dlclwiKTtcbmNvbnN0IGxvZ2dlciA9ICgwLCBsb2dnZXJfMS5nZXRJbnN0YW5jZSkoKTtcbi8qKlxuICogQ3JlYXRlIHJld3JpdGUgZnVuY3Rpb24sIHRvIGNhY2hlIHBhcnNlZCByZXdyaXRlIHJ1bGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXdyaXRlQ29uZmlnXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gRnVuY3Rpb24gdG8gcmV3cml0ZSBwYXRoczsgVGhpcyBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IGBwYXRoYCAocmVxdWVzdC51cmwpIGFzIHBhcmFtZXRlclxuICovXG5mdW5jdGlvbiBjcmVhdGVQYXRoUmV3cml0ZXIocmV3cml0ZUNvbmZpZykge1xuICAgIGxldCBydWxlc0NhY2hlO1xuICAgIGlmICghaXNWYWxpZFJld3JpdGVDb25maWcocmV3cml0ZUNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJld3JpdGVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY3VzdG9tUmV3cml0ZUZuID0gcmV3cml0ZUNvbmZpZztcbiAgICAgICAgcmV0dXJuIGN1c3RvbVJld3JpdGVGbjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJ1bGVzQ2FjaGUgPSBwYXJzZVBhdGhSZXdyaXRlUnVsZXMocmV3cml0ZUNvbmZpZyk7XG4gICAgICAgIHJldHVybiByZXdyaXRlUGF0aDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmV3cml0ZVBhdGgocGF0aCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gcGF0aDtcbiAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzQ2FjaGUpIHtcbiAgICAgICAgICAgIGlmIChydWxlLnJlZ2V4LnRlc3QocGF0aCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShydWxlLnJlZ2V4LCBydWxlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1tIUE1dIFJld3JpdGluZyBwYXRoIGZyb20gXCIlc1wiIHRvIFwiJXNcIicsIHBhdGgsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLmNyZWF0ZVBhdGhSZXdyaXRlciA9IGNyZWF0ZVBhdGhSZXdyaXRlcjtcbmZ1bmN0aW9uIGlzVmFsaWRSZXdyaXRlQ29uZmlnKHJld3JpdGVDb25maWcpIHtcbiAgICBpZiAodHlwZW9mIHJld3JpdGVDb25maWcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUGxhaW5PYmoocmV3cml0ZUNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHJld3JpdGVDb25maWcpLmxlbmd0aCAhPT0gMDtcbiAgICB9XG4gICAgZWxzZSBpZiAocmV3cml0ZUNvbmZpZyA9PT0gdW5kZWZpbmVkIHx8IHJld3JpdGVDb25maWcgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yc18xLkVSUk9SUy5FUlJfUEFUSF9SRVdSSVRFUl9DT05GSUcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlUGF0aFJld3JpdGVSdWxlcyhyZXdyaXRlQ29uZmlnKSB7XG4gICAgY29uc3QgcnVsZXMgPSBbXTtcbiAgICBpZiAoaXNQbGFpbk9iaihyZXdyaXRlQ29uZmlnKSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXldIG9mIE9iamVjdC5lbnRyaWVzKHJld3JpdGVDb25maWcpKSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICByZWdleDogbmV3IFJlZ0V4cChrZXkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXdyaXRlQ29uZmlnW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbSFBNXSBQcm94eSByZXdyaXRlIHJ1bGUgY3JlYXRlZDogXCIlc1wiIH4+IFwiJXNcIicsIGtleSwgcmV3cml0ZUNvbmZpZ1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnVsZXM7XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFRhcmdldCA9IHZvaWQgMDtcbmNvbnN0IGlzUGxhaW5PYmogPSByZXF1aXJlKFwiaXMtcGxhaW4tb2JqXCIpO1xuY29uc3QgbG9nZ2VyXzEgPSByZXF1aXJlKFwiLi9sb2dnZXJcIik7XG5jb25zdCBsb2dnZXIgPSAoMCwgbG9nZ2VyXzEuZ2V0SW5zdGFuY2UpKCk7XG5hc3luYyBmdW5jdGlvbiBnZXRUYXJnZXQocmVxLCBjb25maWcpIHtcbiAgICBsZXQgbmV3VGFyZ2V0O1xuICAgIGNvbnN0IHJvdXRlciA9IGNvbmZpZy5yb3V0ZXI7XG4gICAgaWYgKGlzUGxhaW5PYmoocm91dGVyKSkge1xuICAgICAgICBuZXdUYXJnZXQgPSBnZXRUYXJnZXRGcm9tUHJveHlUYWJsZShyZXEsIHJvdXRlcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiByb3V0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbmV3VGFyZ2V0ID0gYXdhaXQgcm91dGVyKHJlcSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdUYXJnZXQ7XG59XG5leHBvcnRzLmdldFRhcmdldCA9IGdldFRhcmdldDtcbmZ1bmN0aW9uIGdldFRhcmdldEZyb21Qcm94eVRhYmxlKHJlcSwgdGFibGUpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGNvbnN0IGhvc3QgPSByZXEuaGVhZGVycy5ob3N0O1xuICAgIGNvbnN0IHBhdGggPSByZXEudXJsO1xuICAgIGNvbnN0IGhvc3RBbmRQYXRoID0gaG9zdCArIHBhdGg7XG4gICAgZm9yIChjb25zdCBba2V5XSBvZiBPYmplY3QuZW50cmllcyh0YWJsZSkpIHtcbiAgICAgICAgaWYgKGNvbnRhaW5zUGF0aChrZXkpKSB7XG4gICAgICAgICAgICBpZiAoaG9zdEFuZFBhdGguaW5kZXhPZihrZXkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBtYXRjaCAnbG9jYWxob3N0OjMwMDAvYXBpJ1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRhYmxlW2tleV07XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbSFBNXSBSb3V0ZXIgdGFibGUgbWF0Y2g6IFwiJXNcIicsIGtleSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBob3N0KSB7XG4gICAgICAgICAgICAgICAgLy8gbWF0Y2ggJ2xvY2FsaG9zdDozMDAwJ1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRhYmxlW2tleV07XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbSFBNXSBSb3V0ZXIgdGFibGUgbWF0Y2g6IFwiJXNcIicsIGhvc3QpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjb250YWluc1BhdGgodikge1xuICAgIHJldHVybiB2LmluZGV4T2YoJy8nKSA+IC0xO1xufVxuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwUHJveHlNaWRkbGV3YXJlID0gdm9pZCAwO1xuY29uc3QgaHR0cFByb3h5ID0gcmVxdWlyZShcImh0dHAtcHJveHlcIik7XG5jb25zdCBjb25maWdfZmFjdG9yeV8xID0gcmVxdWlyZShcIi4vY29uZmlnLWZhY3RvcnlcIik7XG5jb25zdCBjb250ZXh0TWF0Y2hlciA9IHJlcXVpcmUoXCIuL2NvbnRleHQtbWF0Y2hlclwiKTtcbmNvbnN0IGhhbmRsZXJzID0gcmVxdWlyZShcIi4vX2hhbmRsZXJzXCIpO1xuY29uc3QgbG9nZ2VyXzEgPSByZXF1aXJlKFwiLi9sb2dnZXJcIik7XG5jb25zdCBQYXRoUmV3cml0ZXIgPSByZXF1aXJlKFwiLi9wYXRoLXJld3JpdGVyXCIpO1xuY29uc3QgUm91dGVyID0gcmVxdWlyZShcIi4vcm91dGVyXCIpO1xuY2xhc3MgSHR0cFByb3h5TWlkZGxld2FyZSB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dCwgb3B0cykge1xuICAgICAgICB0aGlzLmxvZ2dlciA9ICgwLCBsb2dnZXJfMS5nZXRJbnN0YW5jZSkoKTtcbiAgICAgICAgdGhpcy53c0ludGVybmFsU3Vic2NyaWJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNlcnZlck9uQ2xvc2VTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC93aWtpLyd0aGlzJy1pbi1UeXBlU2NyaXB0I3JlZC1mbGFncy1mb3ItdGhpc1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmUgPSBhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRQcm94eSh0aGlzLmNvbmZpZy5jb250ZXh0LCByZXEpKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlUHJveHlPcHRpb25zID0gYXdhaXQgdGhpcy5wcmVwYXJlUHJveHlSZXF1ZXN0KHJlcSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHkud2ViKHJlcSwgcmVzLCBhY3RpdmVQcm94eU9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEdldCB0aGUgc2VydmVyIG9iamVjdCB0byBzdWJzY3JpYmUgdG8gc2VydmVyIGV2ZW50cztcbiAgICAgICAgICAgICAqICd1cGdyYWRlJyBmb3Igd2Vic29ja2V0IGFuZCAnY2xvc2UnIGZvciBncmFjZWZ1bCBzaHV0ZG93blxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIE5PVEU6XG4gICAgICAgICAgICAgKiByZXEuc29ja2V0OiBub2RlID49IDEzXG4gICAgICAgICAgICAgKiByZXEuY29ubmVjdGlvbjogbm9kZSA8IDEzIChSZW1vdmUgdGhpcyB3aGVuIG5vZGUgMTIvMTMgc3VwcG9ydCBpcyBkcm9wcGVkKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXIgPSAoX2IgPSAoKF9hID0gcmVxLnNvY2tldCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogcmVxLmNvbm5lY3Rpb24pKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc2VydmVyO1xuICAgICAgICAgICAgaWYgKHNlcnZlciAmJiAhdGhpcy5zZXJ2ZXJPbkNsb3NlU3Vic2NyaWJlZCkge1xuICAgICAgICAgICAgICAgIHNlcnZlci5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1tIUE1dIHNlcnZlciBjbG9zZSBzaWduYWwgcmVjZWl2ZWQ6IGNsb3NpbmcgcHJveHkgc2VydmVyJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHkuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZlck9uQ2xvc2VTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnByb3h5T3B0aW9ucy53cyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIC8vIHVzZSBpbml0aWFsIHJlcXVlc3QgdG8gYWNjZXNzIHRoZSBzZXJ2ZXIgb2JqZWN0IHRvIHN1YnNjcmliZSB0byBodHRwIHVwZ3JhZGUgZXZlbnRcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGNoVXBncmFkZVJlcXVlc3Qoc2VydmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jYXRjaFVwZ3JhZGVSZXF1ZXN0ID0gKHNlcnZlcikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLndzSW50ZXJuYWxTdWJzY3JpYmVkKSB7XG4gICAgICAgICAgICAgICAgc2VydmVyLm9uKCd1cGdyYWRlJywgdGhpcy5oYW5kbGVVcGdyYWRlKTtcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGR1cGxpY2F0ZSB1cGdyYWRlIGhhbmRsaW5nO1xuICAgICAgICAgICAgICAgIC8vIGluIGNhc2UgZXh0ZXJuYWwgdXBncmFkZSBpcyBhbHNvIGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgICB0aGlzLndzSW50ZXJuYWxTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVVcGdyYWRlID0gYXN5bmMgKHJlcSwgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRQcm94eSh0aGlzLmNvbmZpZy5jb250ZXh0LCByZXEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlUHJveHlPcHRpb25zID0gYXdhaXQgdGhpcy5wcmVwYXJlUHJveHlSZXF1ZXN0KHJlcSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm94eS53cyhyZXEsIHNvY2tldCwgaGVhZCwgYWN0aXZlUHJveHlPcHRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdbSFBNXSBVcGdyYWRpbmcgdG8gV2ViU29ja2V0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZXRlcm1pbmUgd2hldGhlciByZXF1ZXN0IHNob3VsZCBiZSBwcm94aWVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGNvbnRleHQgW2Rlc2NyaXB0aW9uXVxuICAgICAgICAgKiBAcGFyYW0gIHtPYmplY3R9IHJlcSAgICAgW2Rlc2NyaXB0aW9uXVxuICAgICAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zaG91bGRQcm94eSA9IChjb250ZXh0LCByZXEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSByZXEub3JpZ2luYWxVcmwgfHwgcmVxLnVybDtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0TWF0Y2hlci5tYXRjaChjb250ZXh0LCBwYXRoLCByZXEpO1xuICAgICAgICB9O1xuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbHkgb3B0aW9uLnJvdXRlciBhbmQgb3B0aW9uLnBhdGhSZXdyaXRlXG4gICAgICAgICAqIE9yZGVyIG1hdHRlcnM6XG4gICAgICAgICAqICAgIFJvdXRlciB1c2VzIG9yaWdpbmFsIHBhdGggZm9yIHJvdXRpbmc7XG4gICAgICAgICAqICAgIE5PVCB0aGUgbW9kaWZpZWQgcGF0aCwgYWZ0ZXIgaXQgaGFzIGJlZW4gcmV3cml0dGVuIGJ5IHBhdGhSZXdyaXRlXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXFcbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBwcm94eSBvcHRpb25zXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnByZXBhcmVQcm94eVJlcXVlc3QgPSBhc3luYyAocmVxKSA9PiB7XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hpbXVyYWkvaHR0cC1wcm94eS1taWRkbGV3YXJlL2lzc3Vlcy8xN1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoaW11cmFpL2h0dHAtcHJveHktbWlkZGxld2FyZS9pc3N1ZXMvOTRcbiAgICAgICAgICAgIHJlcS51cmwgPSByZXEub3JpZ2luYWxVcmwgfHwgcmVxLnVybDtcbiAgICAgICAgICAgIC8vIHN0b3JlIHVyaSBiZWZvcmUgaXQgZ2V0cyByZXdyaXR0ZW4gZm9yIGxvZ2dpbmdcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUGF0aCA9IHJlcS51cmw7XG4gICAgICAgICAgICBjb25zdCBuZXdQcm94eU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3h5T3B0aW9ucyk7XG4gICAgICAgICAgICAvLyBBcHBseSBpbiBvcmRlcjpcbiAgICAgICAgICAgIC8vIDEuIG9wdGlvbi5yb3V0ZXJcbiAgICAgICAgICAgIC8vIDIuIG9wdGlvbi5wYXRoUmV3cml0ZVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVJvdXRlcihyZXEsIG5ld1Byb3h5T3B0aW9ucyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGx5UGF0aFJld3JpdGUocmVxLCB0aGlzLnBhdGhSZXdyaXRlcik7XG4gICAgICAgICAgICAvLyBkZWJ1ZyBsb2dnaW5nIGZvciBib3RoIGh0dHAocykgYW5kIHdlYnNvY2tldHNcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3h5T3B0aW9ucy5sb2dMZXZlbCA9PT0gJ2RlYnVnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycm93ID0gKDAsIGxvZ2dlcl8xLmdldEFycm93KShvcmlnaW5hbFBhdGgsIHJlcS51cmwsIHRoaXMucHJveHlPcHRpb25zLnRhcmdldCwgbmV3UHJveHlPcHRpb25zLnRhcmdldCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1tIUE1dICVzICVzICVzICVzJywgcmVxLm1ldGhvZCwgb3JpZ2luYWxQYXRoLCBhcnJvdywgbmV3UHJveHlPcHRpb25zLnRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3UHJveHlPcHRpb25zO1xuICAgICAgICB9O1xuICAgICAgICAvLyBNb2RpZnkgb3B0aW9uLnRhcmdldCB3aGVuIHJvdXRlciBwcmVzZW50LlxuICAgICAgICB0aGlzLmFwcGx5Um91dGVyID0gYXN5bmMgKHJlcSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IG5ld1RhcmdldDtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJvdXRlcikge1xuICAgICAgICAgICAgICAgIG5ld1RhcmdldCA9IGF3YWl0IFJvdXRlci5nZXRUYXJnZXQocmVxLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAobmV3VGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdbSFBNXSBSb3V0ZXIgbmV3IHRhcmdldDogJXMgLT4gXCIlc1wiJywgb3B0aW9ucy50YXJnZXQsIG5ld1RhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudGFyZ2V0ID0gbmV3VGFyZ2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gcmV3cml0ZSBwYXRoXG4gICAgICAgIHRoaXMuYXBwbHlQYXRoUmV3cml0ZSA9IGFzeW5jIChyZXEsIHBhdGhSZXdyaXRlcikgPT4ge1xuICAgICAgICAgICAgaWYgKHBhdGhSZXdyaXRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCBwYXRoUmV3cml0ZXIocmVxLnVybCwgcmVxKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcS51cmwgPSBwYXRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnW0hQTV0gcGF0aFJld3JpdGU6IE5vIHJld3JpdHRlbiBwYXRoIGZvdW5kLiAoJXMpJywgcmVxLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmxvZ0Vycm9yID0gKGVyciwgcmVxLCByZXMsIHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3QgaG9zdG5hbWUgPSAoKF9hID0gcmVxLmhlYWRlcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ob3N0KSB8fCByZXEuaG9zdG5hbWUgfHwgcmVxLmhvc3Q7IC8vICh3ZWJzb2NrZXQpIHx8IChub2RlMC4xMCB8fCBub2RlIDQvNSlcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RIcmVmID0gYCR7aG9zdG5hbWV9JHtyZXEudXJsfWA7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRIcmVmID0gYCR7dGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LmhyZWZ9YDsgLy8gdGFyZ2V0IGlzIHVuZGVmaW5lZCB3aGVuIHdlYnNvY2tldCBlcnJvcnNcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9ICdbSFBNXSBFcnJvciBvY2N1cnJlZCB3aGlsZSBwcm94eWluZyByZXF1ZXN0ICVzIHRvICVzIFslc10gKCVzKSc7XG4gICAgICAgICAgICBjb25zdCBlcnJSZWZlcmVuY2UgPSAnaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9lcnJvcnMuaHRtbCNlcnJvcnNfY29tbW9uX3N5c3RlbV9lcnJvcnMnOyAvLyBsaW5rIHRvIE5vZGUgQ29tbW9uIFN5c3RlbXMgRXJyb3JzIHBhZ2VcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSwgcmVxdWVzdEhyZWYsIHRhcmdldEhyZWYsIGVyci5jb2RlIHx8IGVyciwgZXJyUmVmZXJlbmNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb25maWcgPSAoMCwgY29uZmlnX2ZhY3RvcnlfMS5jcmVhdGVDb25maWcpKGNvbnRleHQsIG9wdHMpO1xuICAgICAgICB0aGlzLnByb3h5T3B0aW9ucyA9IHRoaXMuY29uZmlnLm9wdGlvbnM7XG4gICAgICAgIC8vIGNyZWF0ZSBwcm94eVxuICAgICAgICB0aGlzLnByb3h5ID0gaHR0cFByb3h5LmNyZWF0ZVByb3h5U2VydmVyKHt9KTtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgW0hQTV0gUHJveHkgY3JlYXRlZDogJHt0aGlzLmNvbmZpZy5jb250ZXh0fSAgLT4gJHt0aGlzLnByb3h5T3B0aW9ucy50YXJnZXR9YCk7XG4gICAgICAgIHRoaXMucGF0aFJld3JpdGVyID0gUGF0aFJld3JpdGVyLmNyZWF0ZVBhdGhSZXdyaXRlcih0aGlzLnByb3h5T3B0aW9ucy5wYXRoUmV3cml0ZSk7IC8vIHJldHVybnMgdW5kZWZpbmVkIHdoZW4gXCJwYXRoUmV3cml0ZVwiIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICAvLyBhdHRhY2ggaGFuZGxlciB0byBodHRwLXByb3h5IGV2ZW50c1xuICAgICAgICBoYW5kbGVycy5pbml0KHRoaXMucHJveHksIHRoaXMucHJveHlPcHRpb25zKTtcbiAgICAgICAgLy8gbG9nIGVycm9ycyBmb3IgZGVidWcgcHVycG9zZVxuICAgICAgICB0aGlzLnByb3h5Lm9uKCdlcnJvcicsIHRoaXMubG9nRXJyb3IpO1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vY2hpbXVyYWkvaHR0cC1wcm94eS1taWRkbGV3YXJlL2lzc3Vlcy8xOVxuICAgICAgICAvLyBleHBvc2UgZnVuY3Rpb24gdG8gdXBncmFkZSBleHRlcm5hbGx5XG4gICAgICAgIHRoaXMubWlkZGxld2FyZS51cGdyYWRlID0gKHJlcSwgc29ja2V0LCBoZWFkKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMud3NJbnRlcm5hbFN1YnNjcmliZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVVwZ3JhZGUocmVxLCBzb2NrZXQsIGhlYWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuSHR0cFByb3h5TWlkZGxld2FyZSA9IEh0dHBQcm94eU1pZGRsZXdhcmU7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlc3BvbnNlSW50ZXJjZXB0b3IgPSB2b2lkIDA7XG5jb25zdCB6bGliID0gcmVxdWlyZShcInpsaWJcIik7XG4vKipcbiAqIEludGVyY2VwdCByZXNwb25zZXMgZnJvbSB1cHN0cmVhbS5cbiAqIEF1dG9tYXRpY2FsbHkgZGVjb21wcmVzcyAoZGVmbGF0ZSwgZ3ppcCwgYnJvdGxpKS5cbiAqIEdpdmUgZGV2ZWxvcGVyIHRoZSBvcHBvcnR1bml0eSB0byBtb2RpZnkgaW50ZXJjZXB0ZWQgQnVmZmVyIGFuZCBodHRwLlNlcnZlclJlc3BvbnNlXG4gKlxuICogTk9URTogbXVzdCBzZXQgb3B0aW9ucy5zZWxmSGFuZGxlUmVzcG9uc2U9dHJ1ZSAocHJldmVudCBhdXRvbWF0aWMgY2FsbCBvZiByZXMuZW5kKCkpXG4gKi9cbmZ1bmN0aW9uIHJlc3BvbnNlSW50ZXJjZXB0b3IoaW50ZXJjZXB0b3IpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcHJveHlSZXMocHJveHlSZXMsIHJlcSwgcmVzKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUHJveHlSZXMgPSBwcm94eVJlcztcbiAgICAgICAgbGV0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKCcnLCAndXRmOCcpO1xuICAgICAgICAvLyBkZWNvbXByZXNzIHByb3h5IHJlc3BvbnNlXG4gICAgICAgIGNvbnN0IF9wcm94eVJlcyA9IGRlY29tcHJlc3MocHJveHlSZXMsIHByb3h5UmVzLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSk7XG4gICAgICAgIC8vIGNvbmNhdCBkYXRhIHN0cmVhbVxuICAgICAgICBfcHJveHlSZXMub24oJ2RhdGEnLCAoY2h1bmspID0+IChidWZmZXIgPSBCdWZmZXIuY29uY2F0KFtidWZmZXIsIGNodW5rXSkpKTtcbiAgICAgICAgX3Byb3h5UmVzLm9uKCdlbmQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBjb3B5IG9yaWdpbmFsIGhlYWRlcnNcbiAgICAgICAgICAgIGNvcHlIZWFkZXJzKHByb3h5UmVzLCByZXMpO1xuICAgICAgICAgICAgLy8gY2FsbCBpbnRlcmNlcHRvciB3aXRoIGludGVyY2VwdGVkIHJlc3BvbnNlIChidWZmZXIpXG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRlZEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGF3YWl0IGludGVyY2VwdG9yKGJ1ZmZlciwgb3JpZ2luYWxQcm94eVJlcywgcmVxLCByZXMpKTtcbiAgICAgICAgICAgIC8vIHNldCBjb3JyZWN0IGNvbnRlbnQtbGVuZ3RoICh3aXRoIGRvdWJsZSBieXRlIGNoYXJhY3RlciBzdXBwb3J0KVxuICAgICAgICAgICAgcmVzLnNldEhlYWRlcignY29udGVudC1sZW5ndGgnLCBCdWZmZXIuYnl0ZUxlbmd0aChpbnRlcmNlcHRlZEJ1ZmZlciwgJ3V0ZjgnKSk7XG4gICAgICAgICAgICByZXMud3JpdGUoaW50ZXJjZXB0ZWRCdWZmZXIpO1xuICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgX3Byb3h5UmVzLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVzLmVuZChgRXJyb3IgZmV0Y2hpbmcgcHJveGllZCByZXF1ZXN0OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5leHBvcnRzLnJlc3BvbnNlSW50ZXJjZXB0b3IgPSByZXNwb25zZUludGVyY2VwdG9yO1xuLyoqXG4gKiBTdHJlYW1pbmcgZGVjb21wcmVzc2lvbiBvZiBwcm94eSByZXNwb25zZVxuICogc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3N1cGVyc2V0L2Jsb2IvOTc3M2FiYTUyMmU5NTdlZDk0MjMwNDVjYTE1MzIxOTYzOGE4NWQyZi9zdXBlcnNldC1mcm9udGVuZC93ZWJwYWNrLnByb3h5LWNvbmZpZy5qcyNMMTE2XG4gKi9cbmZ1bmN0aW9uIGRlY29tcHJlc3MocHJveHlSZXMsIGNvbnRlbnRFbmNvZGluZykge1xuICAgIGxldCBfcHJveHlSZXMgPSBwcm94eVJlcztcbiAgICBsZXQgZGVjb21wcmVzcztcbiAgICBzd2l0Y2ggKGNvbnRlbnRFbmNvZGluZykge1xuICAgICAgICBjYXNlICdnemlwJzpcbiAgICAgICAgICAgIGRlY29tcHJlc3MgPSB6bGliLmNyZWF0ZUd1bnppcCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JyJzpcbiAgICAgICAgICAgIGRlY29tcHJlc3MgPSB6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkZWZsYXRlJzpcbiAgICAgICAgICAgIGRlY29tcHJlc3MgPSB6bGliLmNyZWF0ZUluZmxhdGUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChkZWNvbXByZXNzKSB7XG4gICAgICAgIF9wcm94eVJlcy5waXBlKGRlY29tcHJlc3MpO1xuICAgICAgICBfcHJveHlSZXMgPSBkZWNvbXByZXNzO1xuICAgIH1cbiAgICByZXR1cm4gX3Byb3h5UmVzO1xufVxuLyoqXG4gKiBDb3B5IG9yaWdpbmFsIGhlYWRlcnNcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3VwZXJzZXQvYmxvYi85NzczYWJhNTIyZTk1N2VkOTQyMzA0NWNhMTUzMjE5NjM4YTg1ZDJmL3N1cGVyc2V0LWZyb250ZW5kL3dlYnBhY2sucHJveHktY29uZmlnLmpzI0w3OFxuICovXG5mdW5jdGlvbiBjb3B5SGVhZGVycyhvcmlnaW5hbFJlc3BvbnNlLCByZXNwb25zZSkge1xuICAgIHJlc3BvbnNlLnN0YXR1c0NvZGUgPSBvcmlnaW5hbFJlc3BvbnNlLnN0YXR1c0NvZGU7XG4gICAgcmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSA9IG9yaWdpbmFsUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZTtcbiAgICBpZiAocmVzcG9uc2Uuc2V0SGVhZGVyKSB7XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMob3JpZ2luYWxSZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgICAgLy8gaWdub3JlIGNodW5rZWQsIGJyb3RsaSwgZ3ppcCwgZGVmbGF0ZSBoZWFkZXJzXG4gICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcigoa2V5KSA9PiAhWydjb250ZW50LWVuY29kaW5nJywgJ3RyYW5zZmVyLWVuY29kaW5nJ10uaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBvcmlnaW5hbFJlc3BvbnNlLmhlYWRlcnNba2V5XTtcbiAgICAgICAgICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBjb29raWUgZG9tYWluXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcCgoeCkgPT4geC5yZXBsYWNlKC9Eb21haW49W147XSs/L2ksICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IG9yaWdpbmFsUmVzcG9uc2UuaGVhZGVycztcbiAgICB9XG59XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmZpeFJlcXVlc3RCb2R5ID0gdm9pZCAwO1xuY29uc3QgcXVlcnlzdHJpbmcgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7XG4vKipcbiAqIEZpeCBwcm94aWVkIGJvZHkgaWYgYm9keVBhcnNlciBpcyBpbnZvbHZlZC5cbiAqL1xuZnVuY3Rpb24gZml4UmVxdWVzdEJvZHkocHJveHlSZXEsIHJlcSkge1xuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxLmJvZHk7XG4gICAgaWYgKCFyZXF1ZXN0Qm9keSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcHJveHlSZXEuZ2V0SGVhZGVyKCdDb250ZW50LVR5cGUnKTtcbiAgICBjb25zdCB3cml0ZUJvZHkgPSAoYm9keURhdGEpID0+IHtcbiAgICAgICAgLy8gZGVlcGNvZGUgaWdub3JlIENvbnRlbnRMZW5ndGhJbkNvZGU6IGJvZHlQYXJzZXIgZml4XG4gICAgICAgIHByb3h5UmVxLnNldEhlYWRlcignQ29udGVudC1MZW5ndGgnLCBCdWZmZXIuYnl0ZUxlbmd0aChib2R5RGF0YSkpO1xuICAgICAgICBwcm94eVJlcS53cml0ZShib2R5RGF0YSk7XG4gICAgfTtcbiAgICBpZiAoY29udGVudFR5cGUgJiYgY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgICB3cml0ZUJvZHkoSlNPTi5zdHJpbmdpZnkocmVxdWVzdEJvZHkpKTtcbiAgICB9XG4gICAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSkge1xuICAgICAgICB3cml0ZUJvZHkocXVlcnlzdHJpbmcuc3RyaW5naWZ5KHJlcXVlc3RCb2R5KSk7XG4gICAgfVxufVxuZXhwb3J0cy5maXhSZXF1ZXN0Qm9keSA9IGZpeFJlcXVlc3RCb2R5O1xuIiwgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5maXhSZXF1ZXN0Qm9keSA9IGV4cG9ydHMucmVzcG9uc2VJbnRlcmNlcHRvciA9IHZvaWQgMDtcbnZhciByZXNwb25zZV9pbnRlcmNlcHRvcl8xID0gcmVxdWlyZShcIi4vcmVzcG9uc2UtaW50ZXJjZXB0b3JcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJyZXNwb25zZUludGVyY2VwdG9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZXNwb25zZV9pbnRlcmNlcHRvcl8xLnJlc3BvbnNlSW50ZXJjZXB0b3I7IH0gfSk7XG52YXIgZml4X3JlcXVlc3RfYm9keV8xID0gcmVxdWlyZShcIi4vZml4LXJlcXVlc3QtYm9keVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZpeFJlcXVlc3RCb2R5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBmaXhfcmVxdWVzdF9ib2R5XzEuZml4UmVxdWVzdEJvZHk7IH0gfSk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9wdWJsaWNcIiksIGV4cG9ydHMpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZVByb3h5TWlkZGxld2FyZSA9IHZvaWQgMDtcbmNvbnN0IGh0dHBfcHJveHlfbWlkZGxld2FyZV8xID0gcmVxdWlyZShcIi4vaHR0cC1wcm94eS1taWRkbGV3YXJlXCIpO1xuZnVuY3Rpb24gY3JlYXRlUHJveHlNaWRkbGV3YXJlKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IG1pZGRsZXdhcmUgfSA9IG5ldyBodHRwX3Byb3h5X21pZGRsZXdhcmVfMS5IdHRwUHJveHlNaWRkbGV3YXJlKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtaWRkbGV3YXJlO1xufVxuZXhwb3J0cy5jcmVhdGVQcm94eU1pZGRsZXdhcmUgPSBjcmVhdGVQcm94eU1pZGRsZXdhcmU7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaGFuZGxlcnNcIiksIGV4cG9ydHMpO1xuIiwgIlxudmFyIFhNTF9DSEFSQUNURVJfTUFQID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyZhcG9zOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0Oydcbn07XG5cbmZ1bmN0aW9uIGVzY2FwZUZvclhNTChzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UoLyhbJlwiPD4nXSkvZywgZnVuY3Rpb24oc3RyLCBpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gWE1MX0NIQVJBQ1RFUl9NQVBbaXRlbV07XG4gICAgICAgICAgfSlcbiAgICAgICAgOiBzdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXNjYXBlRm9yWE1MO1xuIiwgInZhciBlc2NhcGVGb3JYTUwgPSByZXF1aXJlKCcuL2VzY2FwZUZvclhNTCcpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcblxudmFyIERFRkFVTFRfSU5ERU5UID0gJyAgICAnO1xuXG5mdW5jdGlvbiB4bWwoaW5wdXQsIG9wdGlvbnMpIHtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGluZGVudDogb3B0aW9uc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBzdHJlYW0gICAgICA9IG9wdGlvbnMuc3RyZWFtID8gbmV3IFN0cmVhbSgpIDogbnVsbCxcbiAgICAgICAgb3V0cHV0ICAgICAgPSBcIlwiLFxuICAgICAgICBpbnRlcnJ1cHRlZCA9IGZhbHNlLFxuICAgICAgICBpbmRlbnQgICAgICA9ICFvcHRpb25zLmluZGVudCA/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbnMuaW5kZW50ID09PSB0cnVlID8gREVGQVVMVF9JTkRFTlRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wdGlvbnMuaW5kZW50LFxuICAgICAgICBpbnN0YW50ICAgICA9IHRydWU7XG5cblxuICAgIGZ1bmN0aW9uIGRlbGF5IChmdW5jKSB7XG4gICAgICAgIGlmICghaW5zdGFudCkge1xuICAgICAgICAgICAgZnVuYygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGVuZCAoaW50ZXJydXB0LCBvdXQpIHtcbiAgICAgICAgaWYgKG91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvdXRwdXQgKz0gb3V0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnJ1cHQgJiYgIWludGVycnVwdGVkKSB7XG4gICAgICAgICAgICBzdHJlYW0gPSBzdHJlYW0gfHwgbmV3IFN0cmVhbSgpO1xuICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcnJ1cHQgJiYgaW50ZXJydXB0ZWQpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gb3V0cHV0O1xuICAgICAgICAgICAgZGVsYXkoZnVuY3Rpb24gKCkgeyBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpIH0pO1xuICAgICAgICAgICAgb3V0cHV0ID0gXCJcIjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZCAodmFsdWUsIGxhc3QpIHtcbiAgICAgICAgZm9ybWF0KGFwcGVuZCwgcmVzb2x2ZSh2YWx1ZSwgaW5kZW50LCBpbmRlbnQgPyAxIDogMCksIGxhc3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgICAgaWYgKHN0cmVhbSkge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBvdXRwdXQ7XG4gICAgICAgICAgICBkZWxheShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgZGF0YSk7XG4gICAgICAgICAgICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgICAgICAgICAgICAgc3RyZWFtLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgIHN0cmVhbS5lbWl0KCdjbG9zZScpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRYbWxEZWNsYXJhdGlvbihkZWNsYXJhdGlvbikge1xuICAgICAgICB2YXIgZW5jb2RpbmcgPSBkZWNsYXJhdGlvbi5lbmNvZGluZyB8fCAnVVRGLTgnLFxuICAgICAgICAgICAgYXR0ciA9ICB7IHZlcnNpb246ICcxLjAnLCBlbmNvZGluZzogZW5jb2RpbmcgfTtcblxuICAgICAgICBpZiAoZGVjbGFyYXRpb24uc3RhbmRhbG9uZSkge1xuICAgICAgICAgICAgYXR0ci5zdGFuZGFsb25lID0gZGVjbGFyYXRpb24uc3RhbmRhbG9uZVxuICAgICAgICB9XG5cbiAgICAgICAgYWRkKHsnP3htbCc6IHsgX2F0dHI6IGF0dHIgfSB9KTtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoJy8+JywgJz8+Jyk7XG4gICAgfVxuXG4gICAgLy8gZGlzYWJsZSBkZWxheSBkZWxheWVkXG4gICAgZGVsYXkoZnVuY3Rpb24gKCkgeyBpbnN0YW50ID0gZmFsc2UgfSk7XG5cbiAgICBpZiAob3B0aW9ucy5kZWNsYXJhdGlvbikge1xuICAgICAgICBhZGRYbWxEZWNsYXJhdGlvbihvcHRpb25zLmRlY2xhcmF0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQgJiYgaW5wdXQuZm9yRWFjaCkge1xuICAgICAgICBpbnB1dC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgaSkge1xuICAgICAgICAgICAgdmFyIGxhc3Q7XG4gICAgICAgICAgICBpZiAoaSArIDEgPT09IGlucHV0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICBsYXN0ID0gZW5kO1xuICAgICAgICAgICAgYWRkKHZhbHVlLCBsYXN0KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYWRkKGlucHV0LCBlbmQpO1xuICAgIH1cblxuICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgc3RyZWFtLnJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbn1cblxuZnVuY3Rpb24gZWxlbWVudCAoLyppbnB1dCwgXHUyMDI2Ki8pIHtcbiAgICB2YXIgaW5wdXQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLFxuICAgICAgICBzZWxmID0ge1xuICAgICAgICAgICAgX2VsZW06ICByZXNvbHZlKGlucHV0KVxuICAgICAgICB9O1xuXG4gICAgc2VsZi5wdXNoID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5hcHBlbmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBhc3NpZ25lZCB0byBhIHBhcmVudCFcIik7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB2YXIgaW5kZW50ID0gdGhpcy5fZWxlbS5pbmRlbnQ7XG4gICAgICAgIGZvcm1hdCh0aGlzLmFwcGVuZCwgcmVzb2x2ZShcbiAgICAgICAgICAgIGlucHV0LCBpbmRlbnQsIHRoaXMuX2VsZW0uaWNvdW50ICsgKGluZGVudCA/IDEgOiAwKSksXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7IHRoYXQuYXBwZW5kKHRydWUpIH0pO1xuICAgIH07XG5cbiAgICBzZWxmLmNsb3NlID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2goaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVuZCkge1xuICAgICAgICAgICAgdGhpcy5lbmQoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gc2VsZjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlX2luZGVudChjaGFyYWN0ZXIsIGNvdW50KSB7XG4gICAgcmV0dXJuIChuZXcgQXJyYXkoY291bnQgfHwgMCkuam9pbihjaGFyYWN0ZXIgfHwgJycpKVxufVxuXG5mdW5jdGlvbiByZXNvbHZlKGRhdGEsIGluZGVudCwgaW5kZW50X2NvdW50KSB7XG4gICAgaW5kZW50X2NvdW50ID0gaW5kZW50X2NvdW50IHx8IDA7XG4gICAgdmFyIGluZGVudF9zcGFjZXMgPSBjcmVhdGVfaW5kZW50KGluZGVudCwgaW5kZW50X2NvdW50KTtcbiAgICB2YXIgbmFtZTtcbiAgICB2YXIgdmFsdWVzID0gZGF0YTtcbiAgICB2YXIgaW50ZXJydXB0ID0gZmFsc2U7XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgICAgIG5hbWUgPSBrZXlzWzBdO1xuICAgICAgICB2YWx1ZXMgPSBkYXRhW25hbWVdO1xuXG4gICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLl9lbGVtKSB7XG4gICAgICAgICAgICB2YWx1ZXMuX2VsZW0ubmFtZSA9IG5hbWU7XG4gICAgICAgICAgICB2YWx1ZXMuX2VsZW0uaWNvdW50ID0gaW5kZW50X2NvdW50O1xuICAgICAgICAgICAgdmFsdWVzLl9lbGVtLmluZGVudCA9IGluZGVudDtcbiAgICAgICAgICAgIHZhbHVlcy5fZWxlbS5pbmRlbnRzID0gaW5kZW50X3NwYWNlcztcbiAgICAgICAgICAgIHZhbHVlcy5fZWxlbS5pbnRlcnJ1cHQgPSB2YWx1ZXM7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzLl9lbGVtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGF0dHJpYnV0ZXMgPSBbXSxcbiAgICAgICAgY29udGVudCA9IFtdO1xuXG4gICAgdmFyIGlzU3RyaW5nQ29udGVudDtcblxuICAgIGZ1bmN0aW9uIGdldF9hdHRyaWJ1dGVzKG9iail7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLnB1c2goYXR0cmlidXRlKGtleSwgb2JqW2tleV0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3dpdGNoKHR5cGVvZiB2YWx1ZXMpIHtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgIGlmICh2YWx1ZXMgPT09IG51bGwpIGJyZWFrO1xuXG4gICAgICAgICAgICBpZiAodmFsdWVzLl9hdHRyKSB7XG4gICAgICAgICAgICAgICAgZ2V0X2F0dHJpYnV0ZXModmFsdWVzLl9hdHRyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlcy5fY2RhdGEpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goXG4gICAgICAgICAgICAgICAgICAgICgnPCFbQ0RBVEFbJyArIHZhbHVlcy5fY2RhdGEpLnJlcGxhY2UoL1xcXVxcXT4vZywgJ11dXV0+PCFbQ0RBVEFbPicpICsgJ11dPidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWVzLmZvckVhY2gpIHtcbiAgICAgICAgICAgICAgICBpc1N0cmluZ0NvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goJycpO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfbmFtZSA9IE9iamVjdC5rZXlzKHZhbHVlKVswXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9uYW1lID09ICdfYXR0cicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYXR0cmlidXRlcyh2YWx1ZS5fYXR0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQucHVzaChyZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgaW5kZW50LCBpbmRlbnRfY291bnQgKyAxKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3N0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RyaW5nQ29udGVudD10cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC5wdXNoKGVzY2FwZUZvclhNTCh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzU3RyaW5nQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50LnB1c2goJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vc3RyaW5nXG4gICAgICAgICAgICBjb250ZW50LnB1c2goZXNjYXBlRm9yWE1MKHZhbHVlcykpO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogICAgICAgbmFtZSxcbiAgICAgICAgaW50ZXJydXB0OiAgaW50ZXJydXB0LFxuICAgICAgICBhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuICAgICAgICBjb250ZW50OiAgICBjb250ZW50LFxuICAgICAgICBpY291bnQ6ICAgICBpbmRlbnRfY291bnQsXG4gICAgICAgIGluZGVudHM6ICAgIGluZGVudF9zcGFjZXMsXG4gICAgICAgIGluZGVudDogICAgIGluZGVudFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdChhcHBlbmQsIGVsZW0sIGVuZCkge1xuXG4gICAgaWYgKHR5cGVvZiBlbGVtICE9ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBhcHBlbmQoZmFsc2UsIGVsZW0pO1xuICAgIH1cblxuICAgIHZhciBsZW4gPSBlbGVtLmludGVycnVwdCA/IDEgOiBlbGVtLmNvbnRlbnQubGVuZ3RoO1xuXG4gICAgZnVuY3Rpb24gcHJvY2VlZCAoKSB7XG4gICAgICAgIHdoaWxlIChlbGVtLmNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBlbGVtLmNvbnRlbnQuc2hpZnQoKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGludGVycnVwdCh2YWx1ZSkpIHJldHVybjtcblxuICAgICAgICAgICAgZm9ybWF0KGFwcGVuZCwgdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwZW5kKGZhbHNlLCAobGVuID4gMSA/IGVsZW0uaW5kZW50cyA6ICcnKVxuICAgICAgICAgICAgKyAoZWxlbS5uYW1lID8gJzwvJyArIGVsZW0ubmFtZSArICc+JyA6ICcnKVxuICAgICAgICAgICAgKyAoZWxlbS5pbmRlbnQgJiYgIWVuZCA/ICdcXG4nIDogJycpKTtcblxuICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICBlbmQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGludGVycnVwdCh2YWx1ZSkge1xuICAgICAgIGlmICh2YWx1ZS5pbnRlcnJ1cHQpIHtcbiAgICAgICAgICAgdmFsdWUuaW50ZXJydXB0LmFwcGVuZCA9IGFwcGVuZDtcbiAgICAgICAgICAgdmFsdWUuaW50ZXJydXB0LmVuZCA9IHByb2NlZWQ7XG4gICAgICAgICAgIHZhbHVlLmludGVycnVwdCA9IGZhbHNlO1xuICAgICAgICAgICBhcHBlbmQodHJ1ZSk7XG4gICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgIH1cbiAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXBwZW5kKGZhbHNlLCBlbGVtLmluZGVudHNcbiAgICAgICAgKyAoZWxlbS5uYW1lID8gJzwnICsgZWxlbS5uYW1lIDogJycpXG4gICAgICAgICsgKGVsZW0uYXR0cmlidXRlcy5sZW5ndGggPyAnICcgKyBlbGVtLmF0dHJpYnV0ZXMuam9pbignICcpIDogJycpXG4gICAgICAgICsgKGxlbiA/IChlbGVtLm5hbWUgPyAnPicgOiAnJykgOiAoZWxlbS5uYW1lID8gJy8+JyA6ICcnKSlcbiAgICAgICAgKyAoZWxlbS5pbmRlbnQgJiYgbGVuID4gMSA/ICdcXG4nIDogJycpKTtcblxuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHJldHVybiBhcHBlbmQoZmFsc2UsIGVsZW0uaW5kZW50ID8gJ1xcbicgOiAnJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnRlcnJ1cHQoZWxlbSkpIHtcbiAgICAgICAgcHJvY2VlZCgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYXR0cmlidXRlKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4ga2V5ICsgJz0nICsgJ1wiJyArIGVzY2FwZUZvclhNTCh2YWx1ZSkgKyAnXCInO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHhtbDtcbm1vZHVsZS5leHBvcnRzLmVsZW1lbnQgPSBtb2R1bGUuZXhwb3J0cy5FbGVtZW50ID0gZWxlbWVudDtcbiIsICJpbXBvcnQgeyBFZGl0b3IsIE1hcmtkb3duVmlldywgUGx1Z2luLCBNb2RhbCwgQXBwLCBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCBSZWFjdFBsYXllciBmcm9tICdyZWFjdC1wbGF5ZXIvbGF6eSdcclxuXHJcbmltcG9ydCB7IFZpZGVvVmlldywgVklERU9fVklFVyB9IGZyb20gJy4vdmlldy9WaWRlb1ZpZXcnO1xyXG5pbXBvcnQgeyBUaW1lc3RhbXBQbHVnaW5TZXR0aW5ncywgVGltZXN0YW1wUGx1Z2luU2V0dGluZ1RhYiwgREVGQVVMVF9TRVRUSU5HUyB9IGZyb20gJ3NldHRpbmdzJztcclxuXHJcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSBcImh0dHBcIjtcclxuaW1wb3J0IHsgQWRkcmVzc0luZm8gfSBmcm9tIFwibm9kZTpuZXRcIjtcclxuaW1wb3J0IHsgc2VydmVyLCBzdGFydFNlcnZlciwgUE9SVCwgbG9jYWxWaWRlb1JlZGlyZWN0LCBzdWJ0aXRsZVJlZGlyZWN0IH0gZnJvbSBcImhhbmRsZXJzL3NlcnZlclwiO1xyXG5pbXBvcnQgeyBpc0xvY2FsRmlsZSwgY2xlYW5VcmwsIGlzU2FtZVZpZGVvIH0gZnJvbSBcImhhbmRsZXJzL21pc2NcIjtcclxuaW1wb3J0IHsgZ2V0QmlsaUluZm8sIGlzQmlsaVVybCB9IGZyb20gJ2hhbmRsZXJzL2JpbGliaWxpJztcclxuXHJcbmNvbnN0IEVSUk9SUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcclxuXHRcIklOVkFMSURfVVJMXCI6IFwiXFxuPiBbIWVycm9yXSBJbnZhbGlkIFZpZGVvIFVSTFxcbj4gVGhlIGhpZ2hsaWdodGVkIGxpbmsgaXMgbm90IGEgdmFsaWQgdmlkZW8gdXJsLiBQbGVhc2UgdHJ5IGFnYWluIHdpdGggYSB2YWxpZCBsaW5rLlxcblwiLFxyXG5cdFwiTk9fQUNUSVZFX1ZJREVPXCI6IFwiXFxuPiBbIWNhdXRpb25dIFNlbGVjdCBWaWRlb1xcbj4gQSB2aWRlbyBuZWVkcyB0byBiZSBvcGVuZWQgYmVmb3JlIHVzaW5nIHRoaXMgaG90a2V5LlxcbiBIaWdobGlnaHQgeW91ciB2aWRlbyBsaW5rIGFuZCBpbnB1dCB5b3VyICdPcGVuIHZpZGVvIHBsYXllcicgaG90a2V5IHRvIHJlZ2lzdGVyIGEgdmlkZW8uXFxuXCIsXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpbWVzdGFtcFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7XHJcblx0c2V0dGluZ3M6IFRpbWVzdGFtcFBsdWdpblNldHRpbmdzO1xyXG5cdHBsYXllcjogUmVhY3RQbGF5ZXI7XHJcblx0c2V0UGxheWluZzogUmVhY3QuRGlzcGF0Y2g8UmVhY3QuU2V0U3RhdGVBY3Rpb248Ym9vbGVhbj4+O1xyXG5cdGVkaXRvcjogRWRpdG9yO1xyXG5cdHNlcnZlcjogaHR0cC5TZXJ2ZXI7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpIHtcclxuXHRcdC8vIFJlZ2lzdGVyIHZpZXdcclxuXHRcdHRoaXMucmVnaXN0ZXJWaWV3KFxyXG5cdFx0XHRWSURFT19WSUVXLFxyXG5cdFx0XHQobGVhZikgPT4gbmV3IFZpZGVvVmlldyhsZWFmKVxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBSZWdpc3RlciBzZXR0aW5nc1xyXG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuXHJcblx0XHQvLyBTdGFydCBsb2NhbCBzZXJ2ZXJcclxuXHRcdGlmICghc2VydmVyKSBhd2FpdCBzdGFydFNlcnZlcih0aGlzLnNldHRpbmdzLnBvcnQpO1xyXG5cdFx0dGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XHJcblxyXG5cdFx0Ly8gTWFya2Rvd24gcHJvY2Vzc29yIHRoYXQgdHVybnMgdGltZXN0YW1wcyBpbnRvIGJ1dHRvbnNcclxuXHRcdHRoaXMucmVnaXN0ZXJNYXJrZG93bkNvZGVCbG9ja1Byb2Nlc3NvcihcInRpbWVzdGFtcFwiLCAoc291cmNlLCBlbCwgY3R4KSA9PiB7XHJcblx0XHRcdC8vIE1hdGNoIG1tOnNzIG9yIGhoOm1tOnNzIHRpbWVzdGFtcCBmb3JtYXRcclxuXHRcdFx0Y29uc3QgcmVnRXhwID0gL1xcZCs6XFxkKzpcXGQrfFxcZCs6XFxkKy9nO1xyXG5cdFx0XHRjb25zdCByb3dzID0gc291cmNlLnNwbGl0KFwiXFxuXCIpLmZpbHRlcigocm93KSA9PiByb3cubGVuZ3RoID4gMCk7XHJcblx0XHRcdHJvd3MuZm9yRWFjaCgocm93KSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgbWF0Y2ggPSByb3cubWF0Y2gocmVnRXhwKTtcclxuXHRcdFx0XHRpZiAobWF0Y2gpIHtcclxuXHRcdFx0XHRcdC8vY3JlYXRlIGJ1dHRvbiBmb3IgZWFjaCB0aW1lc3RhbXBcclxuXHRcdFx0XHRcdGNvbnN0IGRpdiA9IGVsLmNyZWF0ZUVsKFwiZGl2XCIpO1xyXG5cdFx0XHRcdFx0Y29uc3QgYnV0dG9uID0gZGl2LmNyZWF0ZUVsKFwiYnV0dG9uXCIpO1xyXG5cdFx0XHRcdFx0YnV0dG9uLmlubmVyVGV4dCA9IG1hdGNoWzBdO1xyXG5cdFx0XHRcdFx0YnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2V0dGluZ3MudGltZXN0YW1wQ29sb3I7XHJcblx0XHRcdFx0XHRidXR0b24uc3R5bGUuY29sb3IgPSB0aGlzLnNldHRpbmdzLnRpbWVzdGFtcFRleHRDb2xvcjtcclxuXHJcblx0XHRcdFx0XHQvLyBjb252ZXJ0IHRpbWVzdGFtcCB0byBzZWNvbmRzIGFuZCBzZWVrIHRvIHRoYXQgcG9zaXRpb24gd2hlbiBjbGlja2VkXHJcblx0XHRcdFx0XHRidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgdGltZUFyciA9IG1hdGNoWzBdLnNwbGl0KFwiOlwiKS5tYXAoKHYpID0+IHBhcnNlSW50KHYpKTtcclxuXHRcdFx0XHRcdFx0Y29uc3QgW2hoLCBtbSwgc3NdID0gdGltZUFyci5sZW5ndGggPT09IDIgPyBbMCwgLi4udGltZUFycl0gOiB0aW1lQXJyO1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzZWNvbmRzID0gKGhoIHx8IDApICogMzYwMCArIChtbSB8fCAwKSAqIDYwICsgKHNzIHx8IDApO1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5wbGF5ZXIpIHRoaXMucGxheWVyLnNlZWtUbyhzZWNvbmRzKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0ZGl2LmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0fSk7XHJcblxyXG5cclxuXHRcdC8vIE1hcmtkb3duIHByb2Nlc3NvciB0aGF0IHR1cm5zIHZpZGVvIHVybHMgaW50byBidXR0b25zIHRvIG9wZW4gdmlld3Mgb2YgdGhlIHZpZGVvXHJcblx0XHR0aGlzLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IoXCJ0aW1lc3RhbXAtdXJsXCIsIChzb3VyY2UsIGVsLCBjdHgpID0+IHtcclxuXHRcdFx0Y29uc3QgdXJsID0gc291cmNlLnRyaW0oKTtcclxuXHRcdFx0Ly8gQ3JlYXRlcyBidXR0b24gZm9yIHZpZGVvIHVybFxyXG5cdFx0XHRjb25zdCBkaXYgPSBlbC5jcmVhdGVFbChcImRpdlwiKTtcclxuXHRcdFx0Y29uc3QgYnV0dG9uID0gZGl2LmNyZWF0ZUVsKFwiYnV0dG9uXCIpO1xyXG5cdFx0XHRidXR0b24uaW5uZXJUZXh0ID0gdXJsO1xyXG5cdFx0XHRidXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJHUkFZXCI7XHJcblx0XHRcdGJ1dHRvbi5zdHlsZS5jb2xvciA9IHRoaXMuc2V0dGluZ3MudXJsVGV4dENvbG9yO1xyXG5cdFx0XHRpZiAoaXNMb2NhbEZpbGUodXJsKSB8fCBSZWFjdFBsYXllci5jYW5QbGF5KHVybCkgfHwgaXNCaWxpVXJsKHVybCkpIHtcclxuXHRcdFx0YnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuc2V0dGluZ3MudXJsQ29sb3I7XHJcblx0XHRcdFxyXG5cdFx0XHRidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuXHRcdFx0XHRpZiAoaXNTYW1lVmlkZW8odGhpcy5wbGF5ZXIsIHVybCkpIHtcdFxyXG5cdFx0XHRcdFx0dGhpcy5wbGF5ZXI/LnNlZWtUbygwKTtcclxuXHRcdFx0XHQgIH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLmFjdGl2YXRlVmlldyh1cmwsIHRoaXMuZWRpdG9yKTtcclxuXHRcdFx0XHQgIH1cdFx0XHRcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAodGhpcy5lZGl0b3IpIHtcclxuXHRcdFx0XHRcdHRoaXMuZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24odGhpcy5lZGl0b3IuZ2V0U2VsZWN0aW9uKCkgKyBcIlxcblwiICsgRVJST1JTW1wiSU5WQUxJRF9VUkxcIl0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gQ29tbWFuZCB0aGF0IGdldHMgc2VsZWN0ZWQgdmlkZW8gbGluayBhbmQgc2VuZHMgaXQgdG8gdmlldyB3aGljaCBwYXNzZXMgaXQgdG8gUmVhY3QgY29tcG9uZW50XHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ3RyaWdnZXItcGxheWVyJyxcclxuXHRcdFx0bmFtZTogJ09wZW4gdmlkZW8gcGxheWVyIChjb3B5IHZpZGVvIHVybCBhbmQgdXNlIGhvdGtleSknLFxyXG5cdFx0XHRlZGl0b3JDYWxsYmFjazogYXN5bmMgKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpID0+IHtcclxuXHRcdFx0XHQvLyBHZXQgc2VsZWN0ZWQgdGV4dCBvciBjbGlwYm9hcmQgY29udGVudCBhbmQgbWF0Y2ggYWdhaW5zdCB2aWRlbyB1cmwgdG8gY29udmVydCBsaW5rIHRvIHZpZGVvIHZpZGVvIGlkXHJcblx0XHRcdFx0Y29uc3QgdXJsID0gZWRpdG9yLmdldFNlbGVjdGlvbigpLnRyaW0oKSB8fCAoYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpKS50cmltKCk7XHJcblxyXG5cdFx0XHRcdC8vIEFjdGl2YXRlIHRoZSB2aWV3IHdpdGggdGhlIHZhbGlkIGxpbmtcclxuXHRcdFx0XHRpZiAoaXNMb2NhbEZpbGUodXJsKSB8fCBSZWFjdFBsYXllci5jYW5QbGF5KHVybCkgfHwgaXNCaWxpVXJsKHVybCkpIHtcclxuXHRcdFx0XHRcdHRoaXMuYWN0aXZhdGVWaWV3KHVybCwgZWRpdG9yKTtcclxuXHRcdFx0XHRcdHRoaXMuc2V0dGluZ3Mubm90ZVRpdGxlID9cclxuXHRcdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXCJcXG5cIiArIHRoaXMuc2V0dGluZ3Mubm90ZVRpdGxlICsgXCJcXG5cIiArIFwiYGBgdGltZXN0YW1wLXVybCBcXG4gXCIgKyB1cmwgKyBcIlxcbiBgYGBcXG5cIikgOlxyXG5cdFx0XHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcImBgYHRpbWVzdGFtcC11cmwgXFxuIFwiICsgdXJsICsgXCJcXG4gYGBgXFxuXCIpXHJcblx0XHRcdFx0XHR0aGlzLmVkaXRvciA9IGVkaXRvcjtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oRVJST1JTW1wiSU5WQUxJRF9VUkxcIl0pXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGVkaXRvci5zZXRDdXJzb3IoZWRpdG9yLmdldEN1cnNvcigpLmxpbmUgKyAxKVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBUaGlzIGNvbW1hbmQgaW5zZXJ0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBwbGF5aW5nIHZpZGVvIGludG8gdGhlIGVkaXRvclxyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6ICd0aW1lc3RhbXAtaW5zZXJ0JyxcclxuXHRcdFx0bmFtZTogJ0luc2VydCB0aW1lc3RhbXAgYmFzZWQgb24gdmlkZW9zIGN1cnJlbnQgcGxheSB0aW1lJyxcclxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XHJcblx0XHRcdFx0aWYgKCF0aGlzLnBsYXllcikge1xyXG5cdFx0XHRcdFx0ZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oRVJST1JTW1wiTk9fQUNUSVZFX1ZJREVPXCJdKVxyXG5cdFx0XHRcdFx0cmV0dXJuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBjb252ZXJ0IGN1cnJlbnQgdmlkZW8gdGltZSBpbnRvIHRpbWVzdGFtcFxyXG5cdFx0XHRcdGNvbnN0IGxlYWRpbmdaZXJvID0gKG51bTogbnVtYmVyKSA9PiBudW0gPCAxMCA/IFwiMFwiICsgbnVtLnRvRml4ZWQoMCkgOiBudW0udG9GaXhlZCgwKTtcclxuXHRcdFx0XHRjb25zdCB0b3RhbFNlY29uZHMgPSBOdW1iZXIodGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKS50b0ZpeGVkKDIpKTtcclxuXHRcdFx0XHRjb25zdCBob3VycyA9IE1hdGguZmxvb3IodG90YWxTZWNvbmRzIC8gMzYwMCk7XHJcblx0XHRcdFx0Y29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHRvdGFsU2Vjb25kcyAtIChob3VycyAqIDM2MDApKSAvIDYwKTtcclxuXHRcdFx0XHRjb25zdCBzZWNvbmRzID0gdG90YWxTZWNvbmRzIC0gKGhvdXJzICogMzYwMCkgLSAobWludXRlcyAqIDYwKTtcclxuXHRcdFx0XHRjb25zdCB0aW1lID0gKGhvdXJzID4gMCA/IGxlYWRpbmdaZXJvKGhvdXJzKSArIFwiOlwiIDogXCJcIikgKyBsZWFkaW5nWmVybyhtaW51dGVzKSArIFwiOlwiICsgbGVhZGluZ1plcm8oc2Vjb25kcyk7XHJcblxyXG5cdFx0XHRcdC8vIGluc2VydCB0aW1lc3RhbXAgaW50byBlZGl0b3JcclxuXHRcdFx0XHRlZGl0b3IucmVwbGFjZVNlbGVjdGlvbihcImBgYHRpbWVzdGFtcCBcXG4gXCIgKyB0aW1lICsgXCJcXG4gYGBgXFxuXCIpXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vQ29tbWFuZCB0aGF0IHBsYXkvcGF1c2VzIHRoZSB2aWRlb1xyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6ICdwYXVzZS1wbGF5ZXInLFxyXG5cdFx0XHRuYW1lOiAnUGF1c2UgcGxheWVyJyxcclxuXHRcdFx0Y2FsbGJhY2s6ICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLnNldFBsYXlpbmcoIXRoaXMucGxheWVyLnByb3BzLnBsYXlpbmcpXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIFNlZWsgZm9yd2FyZCBieSBzZXQgYW1vdW50IG9mIHNlY29uZHNcclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiAnc2Vlay1mb3J3YXJkJyxcclxuXHRcdFx0bmFtZTogJ1NlZWsgRm9yd2FyZCcsXHJcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB7XHJcblx0XHRcdFx0aWYgKHRoaXMucGxheWVyKSB0aGlzLnBsYXllci5zZWVrVG8odGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKSArIHBhcnNlSW50KHRoaXMuc2V0dGluZ3MuZm9yd2FyZFNlZWspKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gU2VlayBiYWNrd2FyZHMgYnkgc2V0IGFtb3VudCBvZiBzZWNvbmRzXHJcblx0XHR0aGlzLmFkZENvbW1hbmQoe1xyXG5cdFx0XHRpZDogJ3NlZWstYmFja3dhcmQnLFxyXG5cdFx0XHRuYW1lOiAnU2VlayBCYWNrd2FyZCcsXHJcblx0XHRcdGNhbGxiYWNrOiAoKSA9PiB7XHJcblx0XHRcdFx0aWYgKHRoaXMucGxheWVyKSB0aGlzLnBsYXllci5zZWVrVG8odGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKSAtIHBhcnNlSW50KHRoaXMuc2V0dGluZ3MuYmFja3dhcmRzU2VlaykpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyAvLyBUaGlzIGFkZHMgYSBjb21wbGV4IGNvbW1hbmQgdGhhdCBjYW4gY2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYXBwIGFsbG93cyBleGVjdXRpb24gb2YgdGhlIGNvbW1hbmRcclxuXHRcdC8vIHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHQvLyBcdGlkOiAnb3Blbi1zYW1wbGUtbW9kYWwtY29tcGxleCcsXHJcblx0XHQvLyBcdG5hbWU6ICdPcGVuIHNhbXBsZSBtb2RhbCAoY29tcGxleCknLFxyXG5cdFx0Ly8gXHRlZGl0b3JDYWxsYmFjazogKGVkaXRvcjogRWRpdG9yLCB2aWV3OiBNYXJrZG93blZpZXcpID0+IHtcclxuXHRcdC8vIFx0XHR0aGlzLmVkaXRvciA9IGVkaXRvcjtcclxuXHRcdC8vIFx0XHRuZXcgU2FtcGxlTW9kYWwodGhpcy5hcHAsIHRoaXMuYWN0aXZhdGVWaWV3LmJpbmQodGhpcyksIGVkaXRvcikub3BlbigpO1xyXG5cdFx0Ly8gXHRcdC8vIFRoaXMgY29tbWFuZCB3aWxsIG9ubHkgc2hvdyB1cCBpbiBDb21tYW5kIFBhbGV0dGUgd2hlbiB0aGUgY2hlY2sgZnVuY3Rpb24gcmV0dXJucyB0cnVlXHJcblx0XHQvLyBcdFx0cmV0dXJuIHRydWU7XHJcblx0XHQvLyBcdH1cclxuXHRcdC8vIH0pO1xyXG5cclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiBcImFkZC1sb2NhbC1tZWRpYVwiLFxyXG5cdFx0XHRuYW1lOiBcIk9wZW4gTG9jYWwgTWVkaWFcIixcclxuXHRcdFx0ZWRpdG9yQ2FsbGJhY2s6IChlZGl0b3I6IEVkaXRvciwgdmlldzogTWFya2Rvd25WaWV3KSA9PiB7XHJcblx0XHRcdFx0Y29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcblx0XHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcImZpbGVcIik7XHJcblx0XHRcdFx0aW5wdXQuYWNjZXB0ID0gXCJ2aWRlby8qLCBhdWRpby8qLCAubXBkLCAuZmx2XCI7XHJcblx0XHRcdFx0aW5wdXQub25jaGFuZ2UgPSAoZTogYW55KSA9PiB7XHJcblx0XHRcdFx0ICB2YXIgdXJsID0gZS50YXJnZXQuZmlsZXNbMF0ucGF0aC50cmltKCk7XHJcblx0XHRcdFx0ICB0aGlzLmFjdGl2YXRlVmlldyh1cmwsIHRoaXMuZWRpdG9yKTtcclxuXHRcdFx0XHQgIGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKFwiXFxuXCIgKyBcImBgYHRpbWVzdGFtcC11cmwgXFxuIFwiICsgdXJsICsgXCJcXG4gYGBgXFxuXCIpO1xyXG5cdFx0XHRcdH07XHQgIFxyXG5cdFx0XHQgIGlucHV0LmNsaWNrKCk7XHJcblx0XHRcdH0sXHJcblx0XHQgIH0pO1xyXG5cclxuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XHJcblx0XHRcdGlkOiBcImFkZC1zdWJ0aXRsZXNcIixcclxuXHRcdFx0bmFtZTogXCJBZGQgc3VidGl0bGUgZmlsZVwiLFxyXG5cdFx0XHRjYWxsYmFjazogYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdGlmICghdGhpcy5wbGF5ZXIpIHtcclxuXHRcdFx0XHRcdHJldHVybiBuZXcgTm90aWNlKFwiUGxheWVyIGlzIG5vdCB3b3JraW5nIHJpZ2h0IG5vd1wiKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcblx0XHRcdFx0aW5wdXQudHlwZSA9IFwiZmlsZVwiO1xyXG5cdFx0XHRcdGlucHV0LmFjY2VwdCA9IFwiLnNydCwudnR0XCI7XHJcblx0XHRcdFx0aW5wdXQub25jaGFuZ2UgPSAoZTogYW55KSA9PiB7XHJcblx0XHRcdFx0dmFyIGZpbGVzID0gZS50YXJnZXQuZmlsZXM7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0dmFyIGZpbGUgPSBmaWxlc1tpXTtcclxuXHRcdFx0XHRcdHZhciB0cmFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0cmFja1wiKTtcclxuXHRcdFx0XHRcdHRyYWNrLmtpbmQgPSBcInN1YnRpdGxlc1wiO1xyXG5cdFx0XHRcdFx0dHJhY2subGFiZWwgPSBmaWxlLm5hbWU7XHJcblx0XHRcdFx0XHR0cmFjay5zcmMgPSBzdWJ0aXRsZVJlZGlyZWN0KGZpbGUucGF0aCk7XHJcblx0XHRcdFx0XHQvLyB0cmFjay5tb2RlID0gaSA9PSBmaWxlcy5sZW5ndGggLSAxID8gXCJzaG93aW5nXCIgOiBcImhpZGRlblwiO1xyXG5cdFx0XHRcdFx0dGhpcy5wbGF5ZXIuZ2V0SW50ZXJuYWxQbGF5ZXIoKS5hcHBlbmRDaGlsZCh0cmFjayk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdH07XHJcblx0XHRcclxuXHRcdFx0XHRpbnB1dC5jbGljaygpO1xyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcclxuXHRcdFx0aWQ6IFwidmlkZW8tc25hcHNob3RcIixcclxuXHRcdFx0bmFtZTogXCJUYWtlIGFuZCBjb3B5IHRvIGNsaXBib2FyZCBzbmFwc2hvdCBmcm9tIHZpZGVvXCIsXHJcblx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XHJcblx0XHRcdCAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2lsa2thby9jYXB0dXJlLXZpZGVvLWZyYW1lL2Jsb2IvbWFzdGVyL2NhcHR1cmUtdmlkZW8tZnJhbWUuanNcclxuXHRcdFx0ICBpZiAoIXRoaXMucGxheWVyKSByZXR1cm47XHJcblx0XHRcdCAgdmFyIHZpZGVvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcInZpZGVvXCIpO1x0ICBcdCAgXHJcblx0XHRcdCAgaWYgKCF2aWRlbyB8fCB2aWRlby52aWRlb0hlaWdodD09MCB8fCB2aWRlby52aWRlb1dpZHRoPT0wKSB7XHJcblx0XHRcdFx0cmV0dXJuIG5ldyBOb3RpY2UoXCJDdXJyZW50IHBsYXllciBpcyBub3Qgc3VwcG9ydGVkIGZvciB0YWtpbmcgc25hcHNob3QhXCIpO1xyXG5cdFx0XHQgIH1cclxuXHQgIFxyXG5cdFx0XHQgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xyXG5cdCAgXHJcblx0XHRcdCAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcclxuXHRcdFx0ICBjYW52YXMuaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XHJcblx0ICBcclxuXHRcdFx0ICBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLmRyYXdJbWFnZSh2aWRlbywgMCwgMCk7XHJcblx0XHRcdCAgXHJcblx0XHRcdCAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzYwNDAxMTMwXHJcblx0XHRcdCAgY2FudmFzLnRvQmxvYihhc3luYyAoYmxvYikgPT4ge1xyXG5cdFx0XHRcdG5hdmlnYXRvci5jbGlwYm9hcmRcclxuXHRcdFx0XHQgIC53cml0ZShbXHJcblx0XHRcdFx0XHRuZXcgQ2xpcGJvYXJkSXRlbSh7XHJcblx0XHRcdFx0XHQgIFtibG9iLnR5cGVdOiBibG9iLFxyXG5cdFx0XHRcdFx0fSksXHJcblx0XHRcdFx0ICBdKVxyXG5cdFx0XHRcdCAgLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0Ly8gZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJwYXN0ZVwiKTtcclxuXHRcdFx0XHRcdG5ldyBOb3RpY2UoXCJTbmFwc2hvdCBjb3BpZWQgdG8gY2xpcGJvYXJkIVwiKTtcclxuXHRcdFx0XHQgIH0pO1xyXG5cdFx0XHQgIH0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0ICB9KTtcclxuXHQgIFxyXG5cclxuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXHJcblx0XHR0aGlzLmFkZFNldHRpbmdUYWIobmV3IFRpbWVzdGFtcFBsdWdpblNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIG9udW5sb2FkKCkge1xyXG5cdFx0dGhpcy5wbGF5ZXIgPSBudWxsO1xyXG5cdFx0dGhpcy5lZGl0b3IgPSBudWxsO1xyXG5cdFx0dGhpcy5zZXRQbGF5aW5nID0gbnVsbDtcclxuXHRcdHRoaXMuYXBwLndvcmtzcGFjZS5kZXRhY2hMZWF2ZXNPZlR5cGUoVklERU9fVklFVyk7XHJcblx0XHR0aGlzLnNlcnZlci5jbG9zZSgpO1xyXG5cdH1cclxuXHJcblx0Ly8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHZhbGlkIHVybCBpcyBmb3VuZCA9PiBpdCBhY3RpdmF0ZXMgdGhlIFZpZXcgd2hpY2ggbG9hZHMgdGhlIFJlYWN0IHZpZXdcclxuXHRhc3luYyBhY3RpdmF0ZVZpZXcodXJsOiBzdHJpbmcsIGVkaXRvcjogRWRpdG9yKSB7XHJcblx0XHQvLyB0aGlzLmFwcC53b3Jrc3BhY2UuZGV0YWNoTGVhdmVzT2ZUeXBlKFZJREVPX1ZJRVcpO1xyXG5cdFx0aWYgKHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVklERU9fVklFVykubGVuZ3RoID09IDApIHtcclxuXHRcdFx0YXdhaXQgdGhpcy5hcHAud29ya3NwYWNlLmdldFJpZ2h0TGVhZihmYWxzZSkuc2V0Vmlld1N0YXRlKHtcclxuXHRcdFx0XHR0eXBlOiBWSURFT19WSUVXLFxyXG5cdFx0XHRcdGFjdGl2ZTogdHJ1ZSxcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHQvLyB0aGlzLmFwcC53b3Jrc3BhY2UucmV2ZWFsTGVhZihcclxuXHRcdC8vIFx0dGhpcy5hcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWSURFT19WSUVXKVswXVxyXG5cdFx0Ly8gKTtcclxuXHJcblx0XHQvLyBUaGlzIHRyaWdnZXJzIHRoZSBSZWFjdCBjb21wb25lbnQgdG8gYmUgbG9hZGVkXHJcblx0XHR0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZJREVPX1ZJRVcpLmZvckVhY2goYXN5bmMgKGxlYWYpID0+IHtcclxuXHRcdFx0aWYgKGxlYWYudmlldyBpbnN0YW5jZW9mIFZpZGVvVmlldykge1xyXG5cclxuXHRcdFx0XHR2YXIgbG9jYWxob3N0X3VybDogc3RyaW5nO1xyXG5cdFx0XHRcdHZhciBzdWJ0aXRsZXM6IGFueVtdID0gW107XHJcblxyXG5cdFx0XHRcdGlmIChpc0xvY2FsRmlsZSh1cmwpKSB7IFxyXG5cdFx0XHRcdFx0bG9jYWxob3N0X3VybCA9IGxvY2FsVmlkZW9SZWRpcmVjdCh1cmwpOyBcclxuXHRcdFx0XHRcdHVybCA9IHVybC50b1N0cmluZygpLnJlcGxhY2UoL15cXFwiKC4rKVxcXCIkLywgXCIkMVwiKTtcclxuXHJcblx0XHRcdFx0fSBlbHNlIGlmIChpc0JpbGlVcmwodXJsKSkge1xyXG5cdFx0XHRcdFx0dmFyIGJpbGlfaW5mbyA9IGF3YWl0IGdldEJpbGlJbmZvKHVybCk7XHJcblx0XHRcdFx0XHRsb2NhbGhvc3RfdXJsID0gYmlsaV9pbmZvLnVybDtcclxuXHRcdFx0XHRcdHN1YnRpdGxlcyA9IGJpbGlfaW5mby5zdWJ0aXRsZXM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGVsc2V7XHJcblx0XHRcdFx0XHR1cmwgPSBjbGVhblVybCh1cmwpXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRjb25zdCBzZXR1cFBsYXllciA9IChwbGF5ZXI6IFJlYWN0UGxheWVyLCBzZXRQbGF5aW5nOiBSZWFjdC5EaXNwYXRjaDxSZWFjdC5TZXRTdGF0ZUFjdGlvbjxib29sZWFuPj4pID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGxheWVyID0gcGxheWVyO1xyXG5cdFx0XHRcdFx0dGhpcy5zZXRQbGF5aW5nID0gc2V0UGxheWluZztcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNldHVwRXJyb3IgPSAoZXJyOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdGVkaXRvci5yZXBsYWNlU2VsZWN0aW9uKGVkaXRvci5nZXRTZWxlY3Rpb24oKSArIGBcXG4+IFshZXJyb3JdIFN0cmVhbWluZyBFcnJvciBcXG4+ICR7ZXJyfVxcbmApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3Qgc2F2ZVRpbWVPblVubG9hZCA9IGFzeW5jICgpID0+IHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLnBsYXllcikge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNldHRpbmdzLnVybFN0YXJ0VGltZU1hcC5zZXQodXJsLCBOdW1iZXIodGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKS50b0ZpeGVkKDApKSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRcclxuXHJcblx0XHRcdFx0Ly8gY3JlYXRlIGEgbmV3IHZpZGVvIGluc3RhbmNlLCBzZXRzIHVwIHN0YXRlL3VubG9hZCBmdW5jdGlvbmFsaXR5LCBhbmQgcGFzc2VzIGluIGEgc3RhcnQgdGltZSBpZiBhdmFpbGFibGUgZWxzZSAwXHJcblx0XHRcdFx0bGVhZi5zZXRFcGhlbWVyYWxTdGF0ZSh7XHJcblx0XHRcdFx0XHR1cmw6IGxvY2FsaG9zdF91cmwgfHwgdXJsLFxyXG5cdFx0XHRcdFx0bWFpbl91cmw6IGxvY2FsaG9zdF91cmwgPyB1cmwgOiBudWxsLFxyXG5cdFx0XHRcdFx0c2V0dXBQbGF5ZXIsXHJcblx0XHRcdFx0XHRzZXR1cEVycm9yLFxyXG5cdFx0XHRcdFx0c2F2ZVRpbWVPblVubG9hZCxcclxuXHRcdFx0XHRcdHN0YXJ0OiB0aGlzLnNldHRpbmdzLnN0YXJ0QXRMYXN0UG9zaXRpb24gPyB+fnRoaXMuc2V0dGluZ3MudXJsU3RhcnRUaW1lTWFwLmdldCh1cmwpIDogMCxcclxuXHRcdFx0XHRcdHN1YnRpdGxlczogc3VidGl0bGVzLFxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRhd2FpdCB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcclxuXHRcdC8vIEZpeCBmb3IgYSB3ZWlyZCBidWcgdGhhdCB0dXJucyBkZWZhdWx0IG1hcCBpbnRvIGEgbm9ybWFsIG9iamVjdCB3aGVuIGxvYWRlZFxyXG5cdFx0Y29uc3QgZGF0YSA9IGF3YWl0IHRoaXMubG9hZERhdGEoKVxyXG5cdFx0aWYgKGRhdGEpIHtcclxuXHRcdFx0Y29uc3QgbWFwID0gbmV3IE1hcChPYmplY3Qua2V5cyhkYXRhLnVybFN0YXJ0VGltZU1hcCkubWFwKGsgPT4gW2ssIGRhdGEudXJsU3RhcnRUaW1lTWFwW2tdXSkpXHJcblx0XHRcdHRoaXMuc2V0dGluZ3MgPSB7IC4uLkRFRkFVTFRfU0VUVElOR1MsIC4uLmRhdGEsIHVybFN0YXJ0VGltZU1hcDogbWFwIH07XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcclxuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XHJcblx0fVxyXG59XHJcblxyXG4vLyBjbGFzcyBTYW1wbGVNb2RhbCBleHRlbmRzIE1vZGFsIHtcclxuLy8gXHRlZGl0b3I6IEVkaXRvcjtcclxuLy8gXHRhY3RpdmF0ZVZpZXc6ICh1cmw6IHN0cmluZywgZWRpdG9yOiBFZGl0b3IpID0+IHZvaWQ7XHJcbi8vIFx0Y29uc3RydWN0b3IoYXBwOiBBcHAsIGFjdGl2YXRlVmlldzogKHVybDogc3RyaW5nLCBlZGl0b3I6IEVkaXRvcikgPT4gdm9pZCwgZWRpdG9yOiBFZGl0b3IpIHtcclxuLy8gXHRcdHN1cGVyKGFwcCk7XHJcbi8vIFx0XHR0aGlzLmFjdGl2YXRlVmlldyA9IGFjdGl2YXRlVmlldztcclxuLy8gXHRcdHRoaXMuZWRpdG9yID0gZWRpdG9yO1xyXG4vLyBcdH1cclxuXHJcbi8vIFx0b25PcGVuKCkge1xyXG4vLyBcdFx0Y29uc3QgeyBjb250ZW50RWwgfSA9IHRoaXM7XHJcbi8vIFx0XHQvLyBhZGQgYW4gaW5wdXQgZmllbGQgdG8gY29udGVudEVsXHJcblxyXG4vLyBcdFx0Y29uc3QgaW5wdXQgPSBjb250ZW50RWwuY3JlYXRlRWwoJ2lucHV0Jyk7XHJcbi8vIFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiZmlsZVwiKTtcclxuLy8gXHRcdGlucHV0Lm9uY2hhbmdlID0gKGU6IGFueSkgPT4ge1xyXG4vLyBcdFx0XHQvLyBhY2NlcHQgbG9jYWwgdmlkZW8gaW5wdXQgYW5kIG1ha2UgYSB1cmwgZnJvbSBpbnB1dFxyXG4vLyBcdFx0XHRjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGUudGFyZ2V0LmZpbGVzWzBdKTtcclxuLy8gXHRcdFx0dGhpcy5hY3RpdmF0ZVZpZXcodXJsLCB0aGlzLmVkaXRvcik7XHJcblxyXG4vLyBcdFx0XHQvLyBDYW4ndCBnZXQgdGhlIGJ1dHRvbnMgdG8gd29yayB3aXRoIGxvY2FsIHZpZGVvcyB1bmZvcnR1bmF0ZWx5XHJcbi8vIFx0XHRcdC8vIHRoaXMuZWRpdG9yLnJlcGxhY2VTZWxlY3Rpb24oXCJcXG5cIiArIFwiYGBgdGltZXN0YW1wLXVybCBcXG4gXCIgKyB1cmwudHJpbSgpICsgXCJcXG4gYGBgXFxuXCIpXHJcbi8vIFx0XHRcdHRoaXMuY2xvc2UoKTtcclxuLy8gXHRcdH1cclxuLy8gXHR9XHJcblxyXG4vLyBcdG9uQ2xvc2UoKSB7XHJcbi8vIFx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcclxuLy8gXHRcdGNvbnRlbnRFbC5lbXB0eSgpO1xyXG4vLyBcdH1cclxuLy8gfVxyXG4iLCAiaW1wb3J0IHsgSXRlbVZpZXcsIFdvcmtzcGFjZUxlYWYgfSBmcm9tICdvYnNpZGlhbic7XHJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XHJcbmltcG9ydCB7IGNyZWF0ZVJvb3QsIFJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcclxuXHJcbmltcG9ydCB7IFZpZGVvQ29udGFpbmVyLCBWaWRlb0NvbnRhaW5lclByb3BzIH0gZnJvbSBcIi4vVmlkZW9Db250YWluZXJcIlxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBWaWRlb1ZpZXdQcm9wcyBleHRlbmRzIFZpZGVvQ29udGFpbmVyUHJvcHMge1xyXG5cdHNhdmVUaW1lT25VbmxvYWQ6ICgpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBWSURFT19WSUVXID0gXCJ2aWRlby12aWV3XCI7XHJcbmV4cG9ydCBjbGFzcyBWaWRlb1ZpZXcgZXh0ZW5kcyBJdGVtVmlldyB7XHJcblx0Y29tcG9uZW50OiBSZWFjdERPTS5SZW5kZXJlclxyXG5cdHNhdmVUaW1lT25VbmxvYWQ6ICgpID0+IHZvaWRcclxuXHRyb290OiBSb290XHJcblx0Y29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZikge1xyXG5cdFx0c3VwZXIobGVhZik7XHJcblx0XHR0aGlzLnNhdmVUaW1lT25VbmxvYWQgPSAoKSA9PiB7IH07XHJcblx0XHR0aGlzLnJvb3QgPSBjcmVhdGVSb290KHRoaXMuY29udGFpbmVyRWwuY2hpbGRyZW5bMV0pXHJcblx0fVxyXG5cclxuXHRnZXRWaWV3VHlwZSgpIHtcclxuXHRcdHJldHVybiBWSURFT19WSUVXO1xyXG5cdH1cclxuXHJcblx0Z2V0RGlzcGxheVRleHQoKSB7XHJcblx0XHRyZXR1cm4gXCJUaW1lc3RhbXAgVmlkZW9cIjtcclxuXHR9XHJcblxyXG5cdGdldEljb24oKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBcInZpZGVvXCI7XHJcblx0fVxyXG5cclxuXHRzZXRFcGhlbWVyYWxTdGF0ZSh7IHVybCwgbWFpbl91cmwsIHNldHVwUGxheWVyLCBzZXR1cEVycm9yLCBzYXZlVGltZU9uVW5sb2FkLCBzdGFydCAsIHN1YnRpdGxlcyB9OiBWaWRlb1ZpZXdQcm9wcykge1xyXG5cclxuXHRcdC8vIEFsbG93cyB2aWV3IHRvIHNhdmUgdGhlIHBsYXliYWNrIHRpbWUgaW4gdGhlIHNldHRpbmcgc3RhdGUgd2hlbiB0aGUgdmlldyBpcyBjbG9zZWQgXHJcblx0XHR0aGlzLnNhdmVUaW1lT25VbmxvYWQgPSBzYXZlVGltZU9uVW5sb2FkO1xyXG5cclxuXHRcdC8vIENyZWF0ZSBhIHJvb3QgZWxlbWVudCBmb3IgdGhlIHZpZXcgdG8gcmVuZGVyIGludG9cclxuXHRcdHRoaXMucm9vdC5yZW5kZXIoXHJcblx0XHRcdDxWaWRlb0NvbnRhaW5lclxyXG5cdFx0XHRcdHVybD17dXJsfVxyXG5cdFx0XHRcdG1haW5fdXJsPXttYWluX3VybH1cclxuXHRcdFx0XHRzdGFydD17c3RhcnR9XHJcblx0XHRcdFx0c2V0dXBQbGF5ZXI9e3NldHVwUGxheWVyfVxyXG5cdFx0XHRcdHNldHVwRXJyb3I9e3NldHVwRXJyb3J9XHJcblx0XHRcdFx0c3VidGl0bGVzPXtzdWJ0aXRsZXN9XHJcblx0XHRcdC8+XHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgb25DbG9zZSgpIHtcclxuXHRcdGlmICh0aGlzLnNhdmVUaW1lT25VbmxvYWQpIGF3YWl0IHRoaXMuc2F2ZVRpbWVPblVubG9hZCgpO1xyXG5cdFx0dGhpcy5yb290LnVubW91bnQoKVxyXG5cdFx0UmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0aGlzLmNvbnRhaW5lckVsLmNoaWxkcmVuWzFdKTtcclxuXHR9XHJcbn1cclxuIiwgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xyXG5pbXBvcnQgeyB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xyXG5cclxuaW1wb3J0IFJlYWN0UGxheWVyIGZyb20gJ3JlYWN0LXBsYXllci9sYXp5J1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmlkZW9Db250YWluZXJQcm9wcyB7XHJcblx0dXJsOiBzdHJpbmc7XHJcblx0bWFpbl91cmw6IHN0cmluZztcclxuXHRzdGFydDogbnVtYmVyXHJcblx0c2V0dXBQbGF5ZXI6IChwbGF5ZXI6IFJlYWN0UGxheWVyLCBzZXRQbGF5aW5nOiBSZWFjdC5EaXNwYXRjaDxSZWFjdC5TZXRTdGF0ZUFjdGlvbjxib29sZWFuPj4pID0+IHZvaWQ7XHJcblx0c2V0dXBFcnJvcjogKGVycjogc3RyaW5nKSA9PiB2b2lkO1xyXG5cdHN1YnRpdGxlczogYW55W107XHJcblxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgVmlkZW9Db250YWluZXIgPSAoeyB1cmwsIG1haW5fdXJsLCBzZXR1cFBsYXllciwgc3RhcnQsIHNldHVwRXJyb3IsIHN1YnRpdGxlcyB9OiBWaWRlb0NvbnRhaW5lclByb3BzKTogSlNYLkVsZW1lbnQgPT4ge1xyXG5cdC8vIFJlZmVyZW5jZSB0byBwbGF5ZXIgcGFzc2VkIGJhY2sgdG8gdGhlIHNldHVwUGxheWVyIHByb3BcclxuXHRjb25zdCBwbGF5ZXJSZWYgPSB1c2VSZWY8UmVhY3RQbGF5ZXI+KCk7XHJcblxyXG5cdGNvbnN0IFtwbGF5aW5nLCBzZXRQbGF5aW5nXSA9IHVzZVN0YXRlKHRydWUpXHJcblxyXG5cdGNvbnN0IG9uUmVhZHkgPSAoKSA9PiB7XHJcblx0XHQvLyBTdGFydHMgcGxheWVyIGF0IGxhc3QgcGxheWVkIHRpbWUgaWYgdGhlIHZpZGVvIGhhcyBiZWVuIHBsYXllZCBiZWZvcmVcclxuXHRcdGlmIChzdGFydCAmJiBwbGF5ZXJSZWYuY3VycmVudC5nZXRDdXJyZW50VGltZSgpIDw9IDApIHBsYXllclJlZi5jdXJyZW50LnNlZWtUbyhzdGFydCk7XHJcblxyXG5cdFx0Ly8gU2V0cyB1cCB2aWRlbyBwbGF5ZXIgdG8gYmUgYWNjZXNzZWQgaW4gbWFpbi50c1xyXG5cdFx0aWYgKHBsYXllclJlZikgc2V0dXBQbGF5ZXIocGxheWVyUmVmLmN1cnJlbnQsIHNldFBsYXlpbmcpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIChcclxuXHRcdDw+XHJcblx0XHRcdDxSZWFjdFBsYXllclxyXG5cdFx0XHRcdHJlZj17cGxheWVyUmVmfVxyXG5cdFx0XHRcdHVybD17dXJsfVxyXG5cdFx0XHRcdG1haW5fdXJsPXttYWluX3VybH1cclxuXHRcdFx0XHRwbGF5aW5nPXtwbGF5aW5nfVxyXG5cdFx0XHRcdGNvbnRyb2xzPXt0cnVlfVxyXG5cdFx0XHRcdHdpZHRoPScxMDAlJ1xyXG5cdFx0XHRcdGhlaWdodD0nOTUlJ1xyXG5cdFx0XHRcdGNvbmZpZz17e1xyXG5cdFx0XHRcdFx0ZmlsZToge1xyXG5cdFx0XHRcdFx0ICAvLyBmb3JjZURBU0g6IGRhc2gsXHJcblx0XHRcdFx0XHQgIC8vIGZvcmNlRkxWOiB0cnVlLFxyXG5cdFx0XHRcdFx0ICAvLyBmb3JjZVZpZGVvOiB0cnVlLFxyXG5cdFx0XHRcdFx0ICAvLyBkYXNoVmVyc2lvbjpcIjQuNy4wXCIsXHJcblx0XHRcdFx0XHQgIGF0dHJpYnV0ZXM6IHtcclxuXHRcdFx0XHRcdFx0Y3Jvc3NPcmlnaW46IFwiYW5vbnltb3VzXCIsXHJcblx0XHRcdFx0XHQgIH0sXHJcblx0XHRcdFx0XHQgIHRyYWNrczogc3VidGl0bGVzLFxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHQgIH19XHJcblx0XHRcdFx0b25SZWFkeT17b25SZWFkeX1cclxuXHRcdFx0XHRvbkVycm9yPXsoZXJyKSA9PiBzZXR1cEVycm9yKGVyciA/XHJcblx0XHRcdFx0XHRlcnIubWVzc2FnZSA6XHJcblx0XHRcdFx0XHRgVmlkZW8gaXMgdW5wbGF5YWJsZSBkdWUgdG8gcHJpdmFjeSBzZXR0aW5ncywgc3RyZWFtaW5nIHBlcm1pc3Npb25zLCBldGMuYCl9IC8vIEVycm9yIGhhbmRsaW5nIGZvciBpbnZhbGlkIFVSTHNcclxuXHRcdFx0Lz5cclxuXHRcdDwvPlxyXG5cdClcclxufTtcclxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcclxuaW1wb3J0IFRpbWVzdGFtcFBsdWdpbiBmcm9tICcuL21haW4nO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUaW1lc3RhbXBQbHVnaW5TZXR0aW5ncyB7XHJcblx0bm90ZVRpdGxlOiBzdHJpbmc7XHJcblx0dXJsU3RhcnRUaW1lTWFwOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xyXG5cdHVybENvbG9yOiBzdHJpbmc7XHJcblx0dGltZXN0YW1wQ29sb3I6IHN0cmluZztcclxuXHR1cmxUZXh0Q29sb3I6IHN0cmluZztcclxuXHR0aW1lc3RhbXBUZXh0Q29sb3I6IHN0cmluZztcclxuXHRmb3J3YXJkU2Vlazogc3RyaW5nO1xyXG5cdGJhY2t3YXJkc1NlZWs6IHN0cmluZztcclxuXHRwb3J0OiBudW1iZXI7XHJcblx0c3RhcnRBdExhc3RQb3NpdGlvbjogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFRpbWVzdGFtcFBsdWdpblNldHRpbmdzID0ge1xyXG5cdG5vdGVUaXRsZTogXCJcIixcclxuXHR1cmxTdGFydFRpbWVNYXA6IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCksXHJcblx0dXJsQ29sb3I6ICdibHVlJyxcclxuXHR0aW1lc3RhbXBDb2xvcjogJ2dyZWVuJyxcclxuXHR1cmxUZXh0Q29sb3I6ICd3aGl0ZScsXHJcblx0dGltZXN0YW1wVGV4dENvbG9yOiAnd2hpdGUnLFxyXG5cdGZvcndhcmRTZWVrOiAnMTAnLFxyXG5cdGJhY2t3YXJkc1NlZWs6ICcxMCcsXHJcblx0cG9ydDogMTIzNDUsXHJcblx0c3RhcnRBdExhc3RQb3NpdGlvbjogdHJ1ZVxyXG59XHJcblxyXG5jb25zdCBDT0xPUlMgPSB7ICdibHVlJzogJ2JsdWUnLCAncmVkJzogJ3JlZCcsICdncmVlbic6ICdncmVlbicsICd5ZWxsb3cnOiAneWVsbG93JywgJ29yYW5nZSc6ICdvcmFuZ2UnLCAncHVycGxlJzogJ3B1cnBsZScsICdwaW5rJzogJ3BpbmsnLCAnZ3JleSc6ICdncmV5JywgJ2JsYWNrJzogJ2JsYWNrJywgJ3doaXRlJzogJ3doaXRlJyB9O1xyXG5cclxuY29uc3QgVElNRVMgPSB7ICc1JzogJzUnLCAnMTAnOiAnMTAnLCAnMTUnOiAnMTUnLCAnMjAnOiAnMjAnLCAnMjUnOiAnMjUnLCAnMzAnOiAnMzAnLCAnMzUnOiAnMzUnLCAnNDAnOiAnNDAnLCAnNDUnOiAnNDUnLCAnNTAnOiAnNTAnLCAnNTUnOiAnNTUnLCAnNjAnOiAnNjAnLCAnNjUnOiAnNjUnLCAnNzAnOiAnNzAnLCAnNzUnOiAnNzUnLCAnODAnOiAnODAnLCAnODUnOiAnODUnLCAnOTAnOiAnOTAnLCAnOTUnOiAnOTUnLCAnMTAwJzogJzEwMCcsICcxMDUnOiAnMTA1JywgJzExMCc6ICcxMTAnLCAnMTE1JzogJzExNScsICcxMjAnOiAnMTIwJyB9XHJcblxyXG5leHBvcnQgY2xhc3MgVGltZXN0YW1wUGx1Z2luU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xyXG5cdHBsdWdpbjogVGltZXN0YW1wUGx1Z2luO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBUaW1lc3RhbXBQbHVnaW4pIHtcclxuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcclxuXHRcdHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG5cdH1cclxuXHJcblx0ZGlzcGxheSgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHsgY29udGFpbmVyRWwgfSA9IHRoaXM7XHJcblxyXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcclxuXHJcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdUaW1lc3RhbXAgTm90ZXMgUGx1Z2luJyB9KTtcclxuXHJcblx0XHQvLyBDdXN0b21pemUgdGl0bGVcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVGl0bGUnKVxyXG5cdFx0XHQuc2V0RGVzYygnVGhpcyB0aXRsZSB3aWxsIGJlIHByaW50ZWQgYWZ0ZXIgb3BlbmluZyBhIHZpZGVvIHdpdGggdGhlIGhvdGtleS4gVXNlIDxicj4gZm9yIG5ldyBsaW5lcy4nKVxyXG5cdFx0XHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIHRpdGxlIHRlbXBsYXRlLicpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLm5vdGVUaXRsZSlcclxuXHRcdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5ub3RlVGl0bGUgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHQvLyBDdXN0b21pemUgIHVybCBidXR0b24gY29sb3JcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVVJMIEJ1dHRvbiBDb2xvcicpXHJcblx0XHRcdC5zZXREZXNjKCdQaWNrIGEgY29sb3IgZm9yIHRoZSB1cmwgYnV0dG9uLicpXHJcblx0XHRcdC5hZGREcm9wZG93bihkcm9wZG93biA9PiBkcm9wZG93blxyXG5cdFx0XHRcdC5hZGRPcHRpb25zKENPTE9SUylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXJsQ29sb3IpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudXJsQ29sb3IgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQpKTtcclxuXHJcblx0XHQvLyBDdXN0b21pemUgdXJsIHRleHQgY29sb3JcclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0XHQuc2V0TmFtZSgnVVJMIFRleHQgQ29sb3InKVxyXG5cdFx0XHQuc2V0RGVzYygnUGljayBhIGNvbG9yIGZvciB0aGUgVVJMIHRleHQgYnV0dG9uLicpXHJcblx0XHRcdC5hZGREcm9wZG93bihkcm9wZG93biA9PiBkcm9wZG93blxyXG5cdFx0XHRcdC5hZGRPcHRpb25zKENPTE9SUylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudXJsVGV4dENvbG9yKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnVybFRleHRDb2xvciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdCkpO1xyXG5cclxuXHRcdC8vIEN1c3RvbWl6ZSB0aW1lc3RhbXAgYnV0dG9uIGNvbG9yXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1RpbWVzdGFtcCBCdXR0b24gQ29sb3InKVxyXG5cdFx0XHQuc2V0RGVzYygnUGljayBhIGNvbG9yIGZvciB0aGUgdGltZXN0YW1wIGJ1dHRvbi4nKVxyXG5cdFx0XHQuYWRkRHJvcGRvd24oZHJvcGRvd24gPT4gZHJvcGRvd25cclxuXHRcdFx0XHQuYWRkT3B0aW9ucyhDT0xPUlMpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnRpbWVzdGFtcENvbG9yKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRpbWVzdGFtcENvbG9yID0gdmFsdWU7XHJcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0KSk7XHJcblxyXG5cdFx0Ly8gQ3VzdG9taXplIHRpbWVzdGFtcCB0ZXh0IGNvbG9yXHJcblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcclxuXHRcdFx0LnNldE5hbWUoJ1RpbWVzdGFtcCBUZXh0IENvbG9yJylcclxuXHRcdFx0LnNldERlc2MoJ1BpY2sgYSBjb2xvciBmb3IgdGhlIHRpbWVzdGFtcCB0ZXh0LicpXHJcblx0XHRcdC5hZGREcm9wZG93bihkcm9wZG93biA9PiBkcm9wZG93blxyXG5cdFx0XHRcdC5hZGRPcHRpb25zKENPTE9SUylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MudGltZXN0YW1wVGV4dENvbG9yKVxyXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcclxuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnRpbWVzdGFtcFRleHRDb2xvciA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdCkpO1xyXG5cclxuXHRcdC8vIEN1c3RvbWl6ZSBmb3J3YXJkIHNlZWsgdGltZVxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdGb3dhcmQgdGltZSBzZWVrJylcclxuXHRcdFx0LnNldERlc2MoJ1RoaXMgaXMgdGhlIGFtb3VudCBvZiBzZWNvbmRzIHRoZSB2aWRlbyB3aWxsIHNlZWsgZm9yd2FyZCB3aGVuIHByZXNzaW5nIHRoZSBzZWVrIGZvcndhcmQgY29tbWFuZC4nKVxyXG5cdFx0XHQuYWRkRHJvcGRvd24oZHJvcGRvd24gPT4gZHJvcGRvd25cclxuXHRcdFx0XHQuYWRkT3B0aW9ucyhUSU1FUylcclxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9yd2FyZFNlZWspXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuZm9yd2FyZFNlZWsgPSB2YWx1ZTtcclxuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQpKTtcclxuXHJcblx0XHQvLyBDdXN0b21pemUgYmFja3dhcmRzIHNlZWsgdGltZVxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdCYWNrd2FyZHMgdGltZSBzZWVrJylcclxuXHRcdFx0LnNldERlc2MoJ1RoaXMgaXMgdGhlIGFtb3VudCBvZiBzZWNvbmRzIHRoZSB2aWRlbyB3aWxsIHNlZWsgYmFja3dhcmRzIHdoZW4gcHJlc3NpbmcgdGhlIHNlZWsgYmFja3dhcmRzIGNvbW1hbmQuJylcclxuXHRcdFx0LmFkZERyb3Bkb3duKGRyb3Bkb3duID0+IGRyb3Bkb3duXHJcblx0XHRcdFx0LmFkZE9wdGlvbnMoVElNRVMpXHJcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmJhY2t3YXJkc1NlZWspXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYmFja3dhcmRzU2VlayA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdCkpO1xyXG5cclxuXHRcdC8vIEN1c3RvbWl6ZSBsb2NhbCBzZXJ2ZXIgcG9ydFxyXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXHJcblx0XHRcdC5zZXROYW1lKCdTZXJ2ZXIgUG9ydCcpXHJcblx0XHRcdC5zZXREZXNjKCdTZWxlY3QgYSBjdXN0b20gcG9ydCBmb3IgdGhlIGxvY2FsIHNlcnZlciB3aGVyZSBsb2NhbCB2aWRlb3Mgd2lsbCBiZSBzdHJlYW1lZCAod2lsbCBiZSBhc3NpZ25lZCByYW5kb21seSBpZiBsZWZ0IGVtcHR5KScpXHJcblx0XHRcdC5hZGRUZXh0KG51bWJlciA9PiBudW1iZXJcclxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIGEgcG9ydCBudW1iZXInKVxyXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5wb3J0LnRvU3RyaW5nKCkpXHJcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCFpc05hTihOdW1iZXIodmFsdWUpKSAmJiBOdW1iZXIodmFsdWUpIDwgNjU1MDApIHtcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucG9ydCA9IE51bWJlcih2YWx1ZSk7XHJcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pKTtcclxuXHJcblx0XHQvLyBUb2dnbGUgc3RhcnQgYXQgbGFzdCBwb3NpdGlvbiBvcHRpb25cclxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxyXG5cdFx0LnNldE5hbWUoJ1N0YXJ0IGF0IGxhc3QgcG9zaXRpb24nKVxyXG5cdFx0LnNldERlc2MoJ09wZW4gdmlkZW9zIGF0IHRoZSB0aW1lc3RhbXAgeW91IGxlZnQgb2ZmIG9uJylcclxuXHRcdC5hZGRUb2dnbGUoKHRvZ2dsZSk9PntcclxuXHRcdFx0dG9nZ2xlXHJcblx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zdGFydEF0TGFzdFBvc2l0aW9uKVxyXG5cdFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3Muc3RhcnRBdExhc3RQb3NpdGlvbiA9IHZhbHVlO1xyXG5cdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xyXG5cdFx0XHRcdHRoaXMuZGlzcGxheSgpO1xyXG5cdFx0XHR9KVxyXG5cdFx0fSlcclxuXHR9XHJcbn0iLCAiaW1wb3J0IGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcclxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XHJcbmltcG9ydCAqIGFzIG1pbWUgZnJvbSBcIm1pbWUtdHlwZXNcIjtcclxuaW1wb3J0IHsgTm90aWNlIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSBcImh0dHBcIjtcclxuaW1wb3J0IHsgQWRkcmVzc0luZm8gfSBmcm9tIFwibm9kZTpuZXRcIjtcclxuaW1wb3J0IGxhbmd1YWdlRW5jb2RpbmcgZnJvbSBcImRldGVjdC1maWxlLWVuY29kaW5nLWFuZC1sYW5ndWFnZVwiO1xyXG5pbXBvcnQgeyBiaWxpUmVkaXJlY3RzIH0gZnJvbSBcIi4vYmlsaWJpbGlcIjtcclxuXHJcbmV4cG9ydCB2YXIgc2VydmVyOiBodHRwLlNlcnZlciA9IHVuZGVmaW5lZDtcclxuZXhwb3J0IHZhciBQT1JUOiBudW1iZXI7XHJcbmV4cG9ydCB2YXIgSE9TVCA9IFwiMTI3LjAuMC4xXCI7XHJcblxyXG52YXIgbG9jYWxWaWRlb1JvdXRlID0gXCJsb2NhbHZpZGVvXCI7XHJcbnZhciBzdWJ0aXRsZVJvdXRlID0gXCJzdWJ0aXRsZXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2NhbFZpZGVvUmVkaXJlY3QodXJsOiBzdHJpbmcpIHtcclxuICB1cmwgPSB1cmwudG9TdHJpbmcoKS5yZXBsYWNlKC9eXFxcIiguKylcXFwiJC8sIFwiJDFcIik7XHJcbiAgcmV0dXJuIGBodHRwOi8vJHtIT1NUfToke1BPUlR9LyR7bG9jYWxWaWRlb1JvdXRlfS8ke3VybH1gO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3VidGl0bGVSZWRpcmVjdCh1cmw6IHN0cmluZykge1xyXG4gIHVybCA9IHVybC50b1N0cmluZygpLnJlcGxhY2UoL15cXFwiKC4rKVxcXCIkLywgXCIkMVwiKTtcclxuICByZXR1cm4gYGh0dHA6Ly8ke0hPU1R9OiR7UE9SVH0vJHtzdWJ0aXRsZVJvdXRlfS8ke3VybH1gO1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBjaGVja1BvcnQocG9ydDogbnVtYmVyKSB7XHJcbiAgaWYgKDAgPiBwb3J0IHx8IHBvcnQgPiA2NTUzNikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgIHZhciByZXEgPSBodHRwLmdldChgaHR0cDovLzEyNy4wLjAuMToke3BvcnR9YCwgZnVuY3Rpb24gKHJlcykge1xyXG4gICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT0gNDAwKSB7XHJcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXEub24oXCJlcnJvclwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICByZXNvbHZlKHBvcnQpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdGFydFNlcnZlcihwb3J0XzogYW55KSB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXMpID0+IHtcclxuICAgIHZhciBhcHA6IGV4cHJlc3MuQXBwbGljYXRpb24gPSBleHByZXNzKCk7XHJcbiAgICBzZXJ2ZXIgPSBhcHAubGlzdGVuKGF3YWl0IGNoZWNrUG9ydChwb3J0XyksIGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHNlcnZlcl9hZHJlc3MgPSBzZXJ2ZXIuYWRkcmVzcygpIGFzIEFkZHJlc3NJbmZvO1xyXG4gICAgICBQT1JUID0gc2VydmVyX2FkcmVzcy5wb3J0O1xyXG4gICAgICBjb25zb2xlLmxvZyhgUG9ydCAke1BPUlR9IGxpc3RlbmluZ2ApO1xyXG4gICAgICBuZXcgTm90aWNlKHBvcnRfID8gYExvY2FsIHNlcnZlciBzdGFydGVkIG9uIFBvcnQgJHtwb3J0X31gIDogYFBvcnQgJHtwb3J0X30gaXMgYWxyZWFkeSB1c2VkLCBsb2NhbCBzZXJ2ZXIgc3RhcnRlZCBhdCBwb3J0ICR7UE9SVH1gKTtcclxuICAgICAgcmVzKHNlcnZlcik7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhcHAuZ2V0KGAvJHtsb2NhbFZpZGVvUm91dGV9LypgLCBmdW5jdGlvbiAocmVxLCByZXMpIHtcclxuICAgICAgLy8gaHR0cHM6Ly9ibG9nLmxvZ3JvY2tldC5jb20vYnVpbGQtdmlkZW8tc3RyZWFtaW5nLXNlcnZlci1ub2RlL1xyXG4gICAgICB2YXIgcGF0aCA9IGRlY29kZVVSSShyZXEudXJsLnNwbGl0KGAvJHtsb2NhbFZpZGVvUm91dGV9L2ApWzFdKS5yZXBsYWNlKC9eXFxcIiguKylcXFwiJC8sIFwiJDFcIik7XHJcbiAgICAgIHZhciByYW5nZSA9IHJlcS5oZWFkZXJzLnJhbmdlO1xyXG5cclxuICAgICAgaWYgKCFyYW5nZSkge1xyXG4gICAgICAgIHJhbmdlID0gXCJieXRlcz0wLVwiO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZpZGVvU2l6ZSA9IGZzLnN0YXRTeW5jKHBhdGgpLnNpemU7XHJcblxyXG4gICAgICBjb25zdCBDSFVOS19TSVpFID0gMTAgKiogNiAqIDQ7IC8vIDRNQlxyXG4gICAgICBjb25zdCBzdGFydCA9IE51bWJlcihyYW5nZS5yZXBsYWNlKC9cXEQvZywgXCJcIikpO1xyXG4gICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihzdGFydCArIENIVU5LX1NJWkUsIHZpZGVvU2l6ZSAtIDEpO1xyXG5cclxuICAgICAgLy8gQ3JlYXRlIGhlYWRlcnNcclxuICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IGVuZCAtIHN0YXJ0ICsgMTtcclxuICAgICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgICBcIkNvbnRlbnQtUmFuZ2VcIjogYGJ5dGVzICR7c3RhcnR9LSR7ZW5kfS8ke3ZpZGVvU2l6ZX1gLFxyXG4gICAgICAgIFwiQWNjZXB0LVJhbmdlc1wiOiBcImJ5dGVzXCIsXHJcbiAgICAgICAgXCJDb250ZW50LUxlbmd0aFwiOiBjb250ZW50TGVuZ3RoLFxyXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IG1pbWUubG9va3VwKHBhdGgpIHx8IFwidmlkZW8vbXA0XCIsXHJcbiAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogXCIqXCIsXHJcbiAgICAgICAgLy8gXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogXCJhcHA6Ly9vYnNpZGlhbi5tZFwiLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gSFRUUCBTdGF0dXMgMjA2IGZvciBQYXJ0aWFsIENvbnRlbnRcclxuICAgICAgcmVzLndyaXRlSGVhZCgyMDYsIGhlYWRlcnMpO1xyXG5cclxuICAgICAgLy8gY3JlYXRlIHZpZGVvIHJlYWQgc3RyZWFtIGZvciB0aGlzIHBhcnRpY3VsYXIgY2h1bmtcclxuICAgICAgY29uc3QgdmlkZW9TdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHBhdGgsIHsgc3RhcnQsIGVuZCB9KTtcclxuXHJcbiAgICAgIC8vIFN0cmVhbSB0aGUgdmlkZW8gY2h1bmsgdG8gdGhlIGNsaWVudFxyXG4gICAgICB2aWRlb1N0cmVhbS5waXBlKHJlcyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhcHAuZ2V0KGAvJHtzdWJ0aXRsZVJvdXRlfS8qYCwgYXN5bmMgZnVuY3Rpb24gKHJlcSwgcmVzKSB7XHJcbiAgICAgIHZhciBwYXRoID0gZGVjb2RlVVJJKHJlcS51cmwuc3BsaXQoYC8ke3N1YnRpdGxlUm91dGV9L2ApWzFdKS5yZXBsYWNlKC9eXFxcIiguKylcXFwiJC8sIFwiJDFcIik7XHJcbiAgICAgIHZhciBzcnRfID0gZnMucmVhZEZpbGVTeW5jKHBhdGgpO1xyXG4gICAgICB2YXIgZW5jb2RpbmcgPSAoYXdhaXQgbGFuZ3VhZ2VFbmNvZGluZyhwYXRoKSkuZW5jb2Rpbmc7XHJcbiAgICAgIGxldCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKTsgLy8gZGVmYXVsdCAndXRmLTgnIG9yICd1dGY4J1xyXG4gICAgICB2YXIgc3J0ID0gZGVjb2Rlci5kZWNvZGUoc3J0Xyk7XHJcbiAgICAgIHZhciB2dHQ7XHJcbiAgICAgIGlmIChwYXRoLmVuZHNXaXRoKFwiLnNydFwiKSkge1xyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvc3J0LXRvLXZ0dC9ibG9iLzhiMGU0YmFjMjhmMTg2OTRlNzQxOTQ5YzUwYThjYmY3M2NkN2JiNmUvaW5kZXguanMjTDlcclxuICAgICAgICB2dHQgPVxyXG4gICAgICAgICAgXCJXRUJWVFQgRklMRVxcclxcblxcclxcblwiICtcclxuICAgICAgICAgIHNydFxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFx7XFxcXChbaWJ1XSlcXH0vZywgXCI8LyQxPlwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFx7XFxcXChbaWJ1XSkxXFx9L2csIFwiPCQxPlwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvXFx7KFtpYnVdKVxcfS9nLCBcIjwkMT5cIilcclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xce1xcLyhbaWJ1XSlcXH0vZywgXCI8LyQxPlwiKVxyXG4gICAgICAgICAgICAucmVwbGFjZSgvKFxcZFxcZDpcXGRcXGQ6XFxkXFxkKSwoXFxkXFxkXFxkKS9nLCBcIiQxLiQyXCIpXHJcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oXFxkXFxkOlxcZFxcZDpcXGRcXGRcXC5cXGRcXGRcXGQgLS0+IFxcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkXFxkXFxkKS9nLCBcIiQxIGFsaWduOm1pZGRsZSBsaW5lOjkwJVwiKSAvLyBmb3IgdXNpbmcgd2l0aCBhdWRpbyBwbGF5ZXJcclxuICAgICAgICAgICAgLmNvbmNhdChcIlxcclxcblxcclxcblwiKTtcclxuICAgICAgfSBlbHNlIGlmIChwYXRoLmVuZHNXaXRoKFwiLnZ0dFwiKSkge1xyXG4gICAgICAgIHZ0dCA9IHNydDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvdnR0XCIsXHJcbiAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogXCIqXCIsXHJcbiAgICAgIH07XHJcbiAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCBoZWFkZXJzKTtcclxuICAgICAgcmVzLmVuZCh2dHQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgYmlsaVJlZGlyZWN0cyhhcHApO1xyXG4gICAgXHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCB7IEFwcGxpY2F0aW9uIH0gZnJvbSBcImV4cHJlc3NcIjtcclxuaW1wb3J0IHsgY3JlYXRlUHJveHlNaWRkbGV3YXJlIH0gZnJvbSBcImh0dHAtcHJveHktbWlkZGxld2FyZVwiO1xyXG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSBcImh0dHAtcHJveHktbWlkZGxld2FyZS9kaXN0L3R5cGVzXCI7XHJcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gXCJodHRwc1wiO1xyXG5pbXBvcnQgeyBQT1JULCBIT1NUIH0gZnJvbSBcIi4vc2VydmVyXCI7XHJcbmltcG9ydCB4bWwgZnJvbSBcInhtbFwiO1xyXG5cclxuY29uc3QgYmlsaVVybFBhdHRlcm4gPSAvKGJpbGliaWxpXFwuY29tXFwvKHZpZGVvXFwvKT8oKChhdlxcZHs4fSl8KGJ2W0EtWmEtejAtOX1dezEwfSkpKFxcP3xcXC8pPykpfChiMjNcXC50dlxcLyhbQS1aYS16MC05XXs2fXxbQS1aYS16MC05XXsxMn0pJCkvaTtcclxuXHJcbnZhciBkYXNoQmFzZVVybFJvdXRlID0gXCJiaWxpUmVkaXJlY3RcIjtcclxudmFyIG1wZFJvdXRlID0gXCJiaWxpZ2V0bXBkXCI7XHJcbnZhciBiaWxpU3ViUm91dGUgPSBcImJpbGlzdWJ0b3Z0dFwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQmlsaVVybCh1cmw6IHN0cmluZykge1xyXG4gIGlmIChiaWxpVXJsUGF0dGVybi50ZXN0KHVybCkpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZWRpcmVjdF9iMjModXJsOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgaHR0cHMuZ2V0KCgvXihodHRwc3xodHRwKTpcXC9cXC8vLnRlc3QodXJsKSA/IFwiXCIgOiBcImh0dHBzOi8vXCIpICsgdXJsLCB7IG1ldGhvZDogXCJIRUFEXCIgfSwgYXN5bmMgKHJlcykgPT4ge1xyXG4gICAgICByZXNvbHZlKHJlcy5oZWFkZXJzLmxvY2F0aW9uKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vLyBodHRwczovL2dpdGh1Yi5jb20vMTAxNTc3MDQ5Mi9iaWxpYmlsaS1kb3dubG9hZC9ibG9iL21hc3Rlci9kb2MvYmlsaWJpbGktQXBpJUU2JTk2JTg3JUU2JUExJUEzLm1kXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRCaWxpSW5mbyh1cmw6IHN0cmluZykge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZTx7IHVybDogc3RyaW5nOyBzdWJ0aXRsZXM6IG9iamVjdFtdIH0+KGFzeW5jIChyZXMpID0+IHtcclxuICAgIGlmICgvYjIzXFwudHZcXC8oW0EtWmEtejAtOV17Nn0pLy50ZXN0KHVybCkpIHtcclxuICAgICAgdXJsID0gKGF3YWl0IHJlZGlyZWN0X2IyMyh1cmwpKS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBhcGlfdmlld19wYXJhbXM7XHJcbiAgICBpZiAodXJsLm1hdGNoKC9cXC9idltBLVphLXowLTl9XXsxMH0vZ2kpKSB7XHJcbiAgICAgIGFwaV92aWV3X3BhcmFtcyA9IHsgYnZpZDogdXJsLm1hdGNoKC9cXC9idltBLVphLXowLTl9XXsxMH0vZ2kpWzBdLnNsaWNlKDEpIH07XHJcbiAgICB9IGVsc2UgaWYgKHVybC5tYXRjaCgvXFwvYXZcXGR7OH0vZ2kpKSB7XHJcbiAgICAgIGFwaV92aWV3X3BhcmFtcyA9IHsgYWlkOiB1cmwubWF0Y2goL1xcL2F2XFxkezh9L2dpKVswXS5zbGljZSgzKSB9O1xyXG4gICAgfVxyXG4gICAgdmFyIHBhZ2VfbnVtYmVyID0gdXJsLm1hdGNoKC8oPzw9XFw/cD0pXFxkKy9pKT8uWzBdIHx8IFwiMVwiO1xyXG5cclxuICAgIHZhciBhcGlfdmlld191cmwgPSBcImh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3dlYi1pbnRlcmZhY2Uvdmlld1wiO1xyXG4gICAgdmFyIGNpZF9yZXMgPSBhd2FpdCAoYXdhaXQgZmV0Y2goYmlsaVVybFByb3h5KGAke2FwaV92aWV3X3VybH0/JHtuZXcgVVJMU2VhcmNoUGFyYW1zKGFwaV92aWV3X3BhcmFtcyl9YCkpKS5qc29uKCk7XHJcblxyXG4gICAgdmFyIHBhZ2UgPSBjaWRfcmVzLmRhdGEucGFnZXMuZmluZCgocDogYW55KSA9PiBwLnBhZ2UgPT0gcGFnZV9udW1iZXIpO1xyXG4gICAgdmFyIGNpZCA9IHBhZ2UuY2lkO1xyXG5cclxuICAgIHZhciBwYXJhbXMgPSB7IGJ2aWQ6IGFwaV92aWV3X3BhcmFtcy5idmlkIHx8IGNpZF9yZXMuZGF0YS5idmlkLCBjaWQ6IGNpZCB9O1xyXG5cclxuICAgIHZhciBzdWJ0aXRsZXM6IGFueVtdID0gW107XHJcbiAgICB2YXIgc3ViQXJyOiBhbnlbXTtcclxuICAgIGlmIChwYWdlX251bWJlciAhPT0gXCIxXCIpIHtcclxuICAgICAgdmFyIG5ld19yZXMgPSBhd2FpdCAoYXdhaXQgZmV0Y2goYmlsaVVybFByb3h5KGAke2FwaV92aWV3X3VybH0/JHtuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcyl9YCkpKS5qc29uKCk7XHJcbiAgICAgIHN1YkFyciA9IG5ld19yZXMuZGF0YS5zdWJ0aXRsZS5saXN0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3ViQXJyID0gY2lkX3Jlcy5kYXRhLnN1YnRpdGxlLmxpc3Q7XHJcbiAgICB9XHJcbiAgICBzdWJBcnIuZm9yRWFjaCgoc3ViLCBpKSA9PiB7XHJcbiAgICAgIHN1YnRpdGxlcy5wdXNoKHtcclxuICAgICAgICBraW5kOiBcInN1YnRpdGxlc1wiLFxyXG4gICAgICAgIHNyYzogYGh0dHA6Ly8ke0hPU1R9OiR7UE9SVH0vJHtiaWxpU3ViUm91dGV9L3N1YnRpdGxlX3VybD0ke3N1Yi5zdWJ0aXRsZV91cmx9YCxcclxuICAgICAgICBzcmNMYW5nOiBzdWIubGFuLFxyXG4gICAgICAgIGxhYmVsOiBzdWIubGFuLFxyXG4gICAgICAgIGRlZmF1bHQ6IGkgPT0gMCA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXMoe1xyXG4gICAgICB1cmw6IGBodHRwOi8vJHtIT1NUfToke1BPUlR9LyR7bXBkUm91dGV9LyR7bmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpfS5tcGRgLFxyXG4gICAgICBzdWJ0aXRsZXM6IHN1YnRpdGxlcyxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG52YXIgYmlsaVVybFByb3h5ID0gKHVybDogc3RyaW5nKSA9PiB7XHJcbiAgcmV0dXJuIGBodHRwOi8vJHtIT1NUfToke1BPUlR9LyR7ZGFzaEJhc2VVcmxSb3V0ZX0vYCArIG5ldyBVUkwodXJsKS5ob3N0ICsgbmV3IFVSTCh1cmwpLnBhdGhuYW1lICsgbmV3IFVSTCh1cmwpLnNlYXJjaDtcclxufTtcclxuXHJcbmZ1bmN0aW9uIGdldERhc2gocGFyYW1zOiBvYmplY3QpIHtcclxuICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPihhc3luYyAocmVzKSA9PiB7XHJcbiAgICBjb25zdCBhcGlfcGxheXVybF91cmwgPSBcImh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3BsYXllci9wbGF5dXJsXCI7XHJcbiAgICB2YXIgYXBpX3BsYXl1cmxfcGFyYW1zID0ge1xyXG4gICAgICAuLi5wYXJhbXMsXHJcbiAgICAgIGZudmFsOiBcIjE2XCIsXHJcbiAgICAgIHFuOiBcIjY0XCIsXHJcbiAgICAgIGZudmVyOiBcIjBcIixcclxuICAgICAgZm91cms6IFwiMVwiLFxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgdmFyIGRhc2hfcmVzID0gYXdhaXQgKGF3YWl0IGZldGNoKGJpbGlVcmxQcm94eShgJHthcGlfcGxheXVybF91cmx9PyR7bmV3IFVSTFNlYXJjaFBhcmFtcyhhcGlfcGxheXVybF9wYXJhbXMpfWApKSkuanNvbigpO1xyXG4gICAgdmFyIGRhc2ggPSBkYXNoX3Jlcy5kYXRhLmRhc2g7XHJcblxyXG4gICAgdmFyIHZpZGVvID0gW107XHJcbiAgICB2YXIgYXVkaW8gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXNoLnZpZGVvKSB7XHJcbiAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChkYXNoLnZpZGVvLCBrZXkpICYmIGRhc2gudmlkZW9ba2V5XS5jb2RlY3Muc3RhcnRzV2l0aChcImF2XCIpKSB7XHJcbiAgICAgICAgY29uc3QgZSA9IGRhc2gudmlkZW9ba2V5XTtcclxuICAgICAgICB2YXIgdmlkZW9feG1sX29iaiA9IHtcclxuICAgICAgICAgIFJlcHJlc2VudGF0aW9uOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBfYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGUuaWQsXHJcbiAgICAgICAgICAgICAgICBiYW5kd2lkdGg6IGUuYmFuZHdpZHRoLFxyXG4gICAgICAgICAgICAgICAgbWltZVR5cGU6IGUubWltZVR5cGUsXHJcbiAgICAgICAgICAgICAgICBjb2RlY3M6IGUuY29kZWNzLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IGUud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGUuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZnJhbWVSYXRlOiBlLmZyYW1lUmF0ZSxcclxuICAgICAgICAgICAgICAgIHNhcjogZS5zYXIsXHJcbiAgICAgICAgICAgICAgICBzdGFydFdpdGhTYXA6IGUuc3RhcnRXaXRoU2FwLFxyXG4gICAgICAgICAgICAgICAgY29kZWNpZDogZS5jb2RlY2lkLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBCYXNlVVJMOiBiaWxpVXJsUHJveHkoZS5iYXNlVXJsKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFNlZ21lbnRCYXNlOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIF9hdHRyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhSYW5nZTogZS5TZWdtZW50QmFzZS5pbmRleFJhbmdlLFxyXG4gICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemF0aW9uOiBlLlNlZ21lbnRCYXNlLkluaXRpYWxpemF0aW9uLFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZpZGVvLnB1c2godmlkZW9feG1sX29iaik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAoY29uc3Qga2V5IGluIGRhc2guYXVkaW8pIHtcclxuICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhc2guYXVkaW8sIGtleSkpIHtcclxuICAgICAgICBjb25zdCBlID0gZGFzaC5hdWRpb1trZXldO1xyXG5cclxuICAgICAgICB2YXIgYXVkaW9feG1sX29iaiA9IHtcclxuICAgICAgICAgIFJlcHJlc2VudGF0aW9uOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBfYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgaWQ6IGUuaWQsXHJcbiAgICAgICAgICAgICAgICBiYW5kd2lkdGg6IGUuYmFuZHdpZHRoLFxyXG4gICAgICAgICAgICAgICAgbWltZVR5cGU6IGUubWltZVR5cGUsXHJcbiAgICAgICAgICAgICAgICBjb2RlY3M6IGUuY29kZWNzLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoU2FwOiBlLnN0YXJ0V2l0aFNhcCxcclxuICAgICAgICAgICAgICAgIGNvZGVjaWQ6IGUuY29kZWNpZCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgQmFzZVVSTDogYmlsaVVybFByb3h5KGUuYmFzZVVybCksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBTZWdtZW50QmFzZTogW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICBfYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4UmFuZ2U6IGUuU2VnbWVudEJhc2UuaW5kZXhSYW5nZSxcclxuICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXphdGlvbjogZS5TZWdtZW50QmFzZS5Jbml0aWFsaXphdGlvbixcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICBhdWRpby5wdXNoKGF1ZGlvX3htbF9vYmopO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB2YXIgeG1sQXJyID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgTVBEOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIF9hdHRyOiB7XHJcbiAgICAgICAgICAgICAgeG1sbnM6IFwidXJuOm1wZWc6ZGFzaDpzY2hlbWE6bXBkOjIwMTFcIixcclxuICAgICAgICAgICAgICBwcm9maWxlczogXCJ1cm46bXBlZzpkYXNoOnByb2ZpbGU6aXNvZmYtb24tZGVtYW5kOjIwMTEsaHR0cDovL2Rhc2hpZi5vcmcvZ3VpZGVsaW5lcy9kYXNoMjY0XCIsXHJcbiAgICAgICAgICAgICAgdHlwZTogXCJzdGF0aWNcIixcclxuICAgICAgICAgICAgICBtaW5CdWZmZXJUaW1lOiBgUFQke2Rhc2gubWluQnVmZmVyVGltZX1TYCxcclxuICAgICAgICAgICAgICBtZWRpYVByZXNlbnRhdGlvbkR1cmF0aW9uOiBgUFQke2Rhc2guZHVyYXRpb259U2AsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBQZXJpb2Q6IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBfYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbjogYFBUJHtkYXNoLmR1cmF0aW9ufVNgLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIEFkYXB0YXRpb25TZXQ6IFtcclxuICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIF9hdHRyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogXCJ2aWRlb1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtU3dpdGNoaW5nOiBcInRydWVcIixcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAuLi52aWRlbyxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBBZGFwdGF0aW9uU2V0OiBbXHJcbiAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBfYXR0cjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IFwiYXVkaW9cIixcclxuICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbVN3aXRjaGluZzogXCJ0cnVlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgLi4uYXVkaW8sXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG4gICAgdmFyIHhtbF8gPSB4bWwoeG1sQXJyLCB0cnVlKTtcclxuICAgIHJlcyh4bWxfKTtcclxuICB9KTtcclxufVxyXG5cclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2FpZGVubHgvbXgtYmlsaS1wbHVnaW4vYmxvYi9tYXN0ZXIvc3JjL2Zha2UtYmlsaS9wcm94eS9mYWtlLnRzXHJcbmV4cG9ydCBmdW5jdGlvbiBiaWxpUmVkaXJlY3RzKGFwcDogQXBwbGljYXRpb24pIHtcclxuICB2YXIgdXNlcl9hZ2VudCA9IFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6MTA5LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvMTEyLjBcIjtcclxuXHJcbiAgY29uc3Qgb3B0aW9uczogT3B0aW9ucyA9IHtcclxuICAgIHRhcmdldDogXCJodHRwOi8vd3d3LmV4YW1wbGUub3JnXCIsXHJcbiAgICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICB3czogdHJ1ZSxcclxuICAgIHBhdGhSZXdyaXRlOiB7XHJcbiAgICAgIFtgXi8ke2Rhc2hCYXNlVXJsUm91dGV9Ly4rPy9gXTogXCIvXCIsXHJcbiAgICB9LFxyXG4gICAgcm91dGVyOiAocmVxKSA9PiB7XHJcbiAgICAgIHJldHVybiBcImh0dHBzOi8vXCIgKyByZXEucGFyYW1zLmhvc3Q7XHJcbiAgICB9LFxyXG4gICAgb25Qcm94eVJlcTogKHByb3h5UmVxKSA9PiB7XHJcbiAgICAgIHByb3h5UmVxLnNldEhlYWRlcihcInVzZXItYWdlbnRcIiwgdXNlcl9hZ2VudCk7XHJcbiAgICAgIHByb3h5UmVxLnNldEhlYWRlcihcInJlZmVyZXJcIiwgXCJodHRwczovL3d3dy5iaWxpYmlsaS5jb20vXCIpO1xyXG4gICAgICBwcm94eVJlcS5zZXRIZWFkZXIoXCJvcmlnaW5cIiwgXCJodHRwczovL3d3dy5iaWxpYmlsaS5jb20vXCIpO1xyXG4gICAgfSxcclxuICAgIG9uUHJveHlSZXM6IChwcm94eVJlcykgPT4ge1xyXG4gICAgICBwcm94eVJlcy5oZWFkZXJzW1wiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCJdID0gXCIqXCI7XHJcbiAgICB9LFxyXG4gIH07XHJcblxyXG4gIGFwcC51c2UoYC8ke2Rhc2hCYXNlVXJsUm91dGV9Lzpob3N0YCwgY3JlYXRlUHJveHlNaWRkbGV3YXJlKG9wdGlvbnMpKTtcclxuXHJcbiAgYXBwLmdldChgLyR7bXBkUm91dGV9LypgLCBhc3luYyAocmVxLCByZXMsIG5leHQpID0+IHtcclxuICAgIHZhciBwYXJhbXM6IGFueSA9IGRlY29kZVVSSShyZXEudXJsLnNwbGl0KGAvJHttcGRSb3V0ZX0vYClbMV0pLnNsaWNlKDAsIC00KTtcclxuICAgIHBhcmFtcyA9IE9iamVjdC5mcm9tRW50cmllcyhuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcykpO1xyXG4gICAgdmFyIG1wZCA9IGF3YWl0IGdldERhc2gocGFyYW1zKTtcclxuICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7XHJcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vZGFzaCt4bWxcIixcclxuICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogXCIqXCIsXHJcbiAgICB9KTtcclxuICAgIHJlcy5lbmQobXBkKTtcclxuICB9KTtcclxuXHJcbiAgYXBwLmdldChgLyR7YmlsaVN1YlJvdXRlfS8qYCwgYXN5bmMgZnVuY3Rpb24gKHJlcSwgcmVzKSB7XHJcbiAgICB2YXIgcGFyYW1zOiBhbnkgPSBkZWNvZGVVUkkocmVxLnVybC5zcGxpdChgLyR7YmlsaVN1YlJvdXRlfS9gKVsxXSk7XHJcbiAgICBwYXJhbXMgPSBPYmplY3QuZnJvbUVudHJpZXMobmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpKTtcclxuXHJcbiAgICB2YXIgc3ViX3VybCA9IHBhcmFtcy5zdWJ0aXRsZV91cmw7XHJcbiAgICBpZiAoIXBhcmFtcy5zdWJ0aXRsZV91cmwpIHtcclxuICAgICAgdmFyIHBhcmFtc19zdHIgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCgoeyBpbmRleCwgLi4ubyB9KSA9PiBvKShwYXJhbXMpKS50b1N0cmluZygpO1xyXG5cclxuICAgICAgdmFyIGFwaV92aWV3X3VybCA9IFwiaHR0cHM6Ly9hcGkuYmlsaWJpbGkuY29tL3gvd2ViLWludGVyZmFjZS92aWV3XCI7XHJcbiAgICAgIHZhciBmZXRjaF91cmwgPSBiaWxpVXJsUHJveHkoYCR7YXBpX3ZpZXdfdXJsfT8ke3BhcmFtc19zdHJ9YCk7XHJcbiAgICAgIHZhciBsaXN0X3JlcyA9IGF3YWl0IChhd2FpdCBmZXRjaChmZXRjaF91cmwpKS5qc29uKCk7XHJcblxyXG4gICAgICBzdWJfdXJsID0gbGlzdF9yZXMuZGF0YS5zdWJ0aXRsZS5saXN0W3BhcmFtcy5pbmRleF0uc3VidGl0bGVfdXJsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB2YXIgc3RyID0gXCJcIjtcclxuICAgIHZhciBzdWJqc29uID0gKGF3YWl0IChhd2FpdCBmZXRjaChzdWJfdXJsKSkuanNvbigpKS5ib2R5O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJqc29uLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHN1YiA9IHN1Ympzb25baV07XHJcbiAgICAgIHZhciBmcm9tdGltZSA9IG5ldyBEYXRlKHN1Yi5mcm9tICogMTAwMCkudG9JU09TdHJpbmcoKS5zbGljZSgxMSwgMjMpO1xyXG4gICAgICB2YXIgdG90aW1lID0gbmV3IERhdGUoc3ViLnRvICogMTAwMCkudG9JU09TdHJpbmcoKS5zbGljZSgxMSwgMjMpO1xyXG4gICAgICBzdHIgKz0gYCR7aSArIDF9XFxuYDtcclxuICAgICAgc3RyICs9IGAke2Zyb210aW1lfSAtLT4gJHt0b3RpbWV9XFxuYDtcclxuICAgICAgc3RyICs9IGAke3N1Yi5jb250ZW50fVxcblxcbmA7XHJcbiAgICB9XHJcbiAgICB2YXIgdnR0ID0gXCJXRUJWVFQgRklMRVxcclxcblxcclxcblwiICsgc3RyO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L3Z0dFwiLFxyXG4gICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiOiBcIipcIixcclxuICAgIH07XHJcbiAgICByZXMud3JpdGVIZWFkKDIwMCwgaGVhZGVycyk7XHJcbiAgICByZXMuZW5kKHZ0dCk7XHJcbiAgfSk7XHJcbn1cclxuIiwgImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xyXG5pbXBvcnQgUmVhY3RQbGF5ZXIgZnJvbSBcInJlYWN0LXBsYXllclwiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXJsKHVybDogc3RyaW5nKSB7XHJcbiAgdmFyIHVybHJlZ2V4ID0gbmV3IFJlZ0V4cChcclxuICAgIC8oKGh0dHBzOlxcL1xcL3d3d1xcLnxodHRwOlxcL1xcL3d3d1xcLnxodHRwczpcXC9cXC98aHR0cDpcXC9cXC8pP1thLXpBLVpdezIsfShcXC5bYS16QS1aXXsyLH0pKFxcLlthLXpBLVpdezIsfSk/XFwvW2EtekEtWjAtOV17Mix9fCgoaHR0cHM6XFwvXFwvd3d3XFwufGh0dHA6XFwvXFwvd3d3XFwufGh0dHBzOlxcL1xcL3xodHRwOlxcL1xcLyk/W2EtekEtWl17Mix9KFxcLlthLXpBLVpdezIsfSkoXFwuW2EtekEtWl17Mix9KT8pfChodHRwczpcXC9cXC93d3dcXC58aHR0cDpcXC9cXC93d3dcXC58aHR0cHM6XFwvXFwvfGh0dHA6XFwvXFwvKT9bYS16QS1aMC05XXsyLH1cXC5bYS16QS1aMC05XXsyLH1cXC5bYS16QS1aMC05XXsyLH0oXFwuW2EtekEtWjAtOV17Mix9KXxodHRwOlxcL1xcLzEyN1xcLjBcXC4wXFwuMTpbMC05XXxodHRwOlxcL1xcL2xvY2FsaG9zdDpbMC05XSlbXlxcc10rL2dpXHJcbiAgKTtcclxuICBpZiAodXJsLm1hdGNoKHVybHJlZ2V4KSkge1xyXG4gICAgdXJsID0gdXJsLm1hdGNoKHVybHJlZ2V4KVswXS50b1N0cmluZygpO1xyXG4gICAgdXJsID0gL15baHR0cHN8aHR0cF0vLnRlc3QodXJsKSA/IHVybCA6IFwiaHR0cHM6Ly9cIiArIHVybDtcclxuICB9XHJcbiAgcmV0dXJuIHVybDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTG9jYWxGaWxlKHBhdGg6IGZzLlBhdGhMaWtlKSB7XHJcbiAgdmFyIGNsZWFucGF0aCA9IHBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKC9eXFxcIiguKylcXFwiJC8sIFwiJDFcIik7IC8vIGZvciByZW1vdmluZyBxdW90ZXMgZnJvbSBsaW5rcyBjb3BpZWQgdmlhIFwiY29weSBhcyBwYXRoXCIgaW4gd2luZG93c1xyXG4gIGlmIChmcy5leGlzdHNTeW5jKGNsZWFucGF0aCkpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBpc1NhbWVWaWRlbyhyZWFjdHBsYXllcjogYW55LCBsYXN0TGluZTogc3RyaW5nKSB7XHJcbiAgaWYgKCFyZWFjdHBsYXllcikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICBsYXN0TGluZSA9IGxhc3RMaW5lLnRvU3RyaW5nKCkucmVwbGFjZSgvXlxcXCIoLispXFxcIiQvLCBcIiQxXCIpO1xyXG4gIHZhciB1cmwgPSByZWFjdHBsYXllcj8ucHJvcHM/Lm1haW5fdXJsIHx8IHJlYWN0cGxheWVyPy5wcm9wcz8udXJsO1xyXG4gIGlmICghdXJsKSByZXR1cm4gZmFsc2U7XHJcbiAgaWYgKHVybC5pbmNsdWRlcyhsYXN0TGluZSkgfHwgbGFzdExpbmUuaW5jbHVkZXModXJsKSkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICB2YXIgcGxheWVyID0gcmVhY3RwbGF5ZXIuZ2V0SW50ZXJuYWxQbGF5ZXIoKTtcclxuXHJcbiAgLy8geW91dHViZSBpZFxyXG4gIGlmIChwbGF5ZXI/LnBsYXllckluZm8pIHtcclxuICAgIGlmIChsYXN0TGluZS5pbmNsdWRlcyhwbGF5ZXIucGxheWVySW5mbz8udmlkZW9EYXRhPy52aWRlb19pZCkpIHtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFyIHNhbWUgPSBmYWxzZTtcclxuICB2YXIgcGF0dGVybnMgPSBbXHJcbiAgICAvLyBub2RlX21vZHVsZXMvcmVhY3QtcGxheWVyL2xhenkvcGF0dGVybnMuanNcclxuICAgIC92aW1lb1xcLmNvbVxcLyg/IXByb2dyZXNzaXZlX3JlZGlyZWN0KS4rLyxcclxuICAgIC9eaHR0cHM/OlxcL1xcLyh3d3dcXC4pP2ZhY2Vib29rXFwuY29tLipcXC8odmlkZW8ocyk/fHdhdGNofHN0b3J5KShcXC5waHA/fFxcLykuKyQvLFxyXG4gICAgL15odHRwcz86XFwvXFwvZmJcXC53YXRjaFxcLy4rJC8sXHJcbiAgICAvc3RyZWFtYWJsZVxcLmNvbVxcLyhbYS16MC05XSspJC8sXHJcbiAgICAvKD86d2lzdGlhXFwuKD86Y29tfG5ldCl8d2lcXC5zdClcXC8oPzptZWRpYXN8ZW1iZWQpXFwvKD86aWZyYW1lXFwvKT8oLiopJC8sXHJcbiAgICAvKD86d3d3XFwufGdvXFwuKT90d2l0Y2hcXC50dlxcL3ZpZGVvc1xcLyhcXGQrKSgkfFxcPykvLFxyXG4gICAgLyg/Ond3d1xcLnxnb1xcLik/dHdpdGNoXFwudHZcXC8oW2EtekEtWjAtOV9dKykoJHxcXD8pLyxcclxuICAgIC9eKD86KD86aHR0cHM/KTopPyg/OlxcL1xcLyk/KD86d3d3XFwuKT8oPzooPzpkYWlseW1vdGlvblxcLmNvbSg/OlxcL2VtYmVkKT9cXC92aWRlbyl8ZGFpXFwubHkpXFwvKFthLXpBLVowLTldKykoPzpfW1xcd18tXSspPyQvLFxyXG4gICAgL21peGNsb3VkXFwuY29tXFwvKFteL10rXFwvW14vXSspLyxcclxuICAgIC92aWR5YXJkLmNvbVxcLyg/OndhdGNoXFwvKT8oW2EtekEtWjAtOS1fXSspLyxcclxuICAgIC9eaHR0cHM/OlxcL1xcL1thLXpBLVpdK1xcLmthbHR1cmEuKGNvbXxvcmcpXFwvcFxcLyhbMC05XSspXFwvc3BcXC8oWzAtOV0rKTAwXFwvZW1iZWRJZnJhbWVKc1xcL3VpY29uZl9pZFxcLyhbMC05XSspXFwvcGFydG5lcl9pZFxcLyhbMC05XSspKC4qKWVudHJ5X2lkLihbYS16QS1aMC05LV9dLiopJC8sXHJcbiAgICAvL2h0dHBzOi8vZ2lzdC5naXRodWIuY29tL1RyZXZvckpUQ2xhcmtlL2ExNGMzN2RiM2MxMWVlMjNhNzAwXHJcbiAgICAvaHR0cHM/OlxcL1xcLyg/OndcXC58d3d3XFwufCkoPzpzb3VuZGNsb3VkXFwuY29tXFwvKSg/Oig/OnBsYXllclxcL1xcP3VybD1odHRwc1xcJTNBXFwvXFwvYXBpLnNvdW5kY2xvdWQuY29tXFwvdHJhY2tzXFwvKXwpKCgoXFx3fC0pW15BLXpdezd9KXwoW0EtWmEtejAtOV0rKD86Wy1fXVtBLVphLXowLTldKykqKD8hXFwvc2V0cyg/OlxcL3wkKSkoPzpcXC9bQS1aYS16MC05XSsoPzpbLV9dW0EtWmEtejAtOV0rKSopezEsMn0pKS8sXHJcbiAgXTtcclxuICBwYXR0ZXJucy5mb3JFYWNoKChwYXR0ZXJuKSA9PiB7XHJcbiAgICB2YXIgaWQgPSB1cmwubWF0Y2gocGF0dGVybik/LlsxXSB8fCBudWxsO1xyXG4gICAgaWYgKHBhdHRlcm4udGVzdChsYXN0TGluZSkgJiYgbmV3IFJlZ0V4cChpZCkudGVzdChsYXN0TGluZSkpIHtcclxuICAgICAgc2FtZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHNhbWU7XHJcbn1cclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFTQTtBQUFhLFFBQUksSUFBRSxPQUFPLElBQUk7QUFBakIsUUFBa0MsSUFBRSxPQUFPLElBQUk7QUFBL0MsUUFBK0QsSUFBRSxPQUFPLElBQUk7QUFBNUUsUUFBOEYsSUFBRSxPQUFPLElBQUk7QUFBM0csUUFBZ0ksSUFBRSxPQUFPLElBQUk7QUFBN0ksUUFBK0osSUFBRSxPQUFPLElBQUk7QUFBNUssUUFBOEwsSUFBRSxPQUFPLElBQUk7QUFBM00sUUFBNE4sSUFBRSxPQUFPLElBQUk7QUFBek8sUUFBOFAsSUFBRSxPQUFPLElBQUk7QUFBM1EsUUFBNlIsSUFBRSxPQUFPLElBQUk7QUFBMVMsUUFBd1QsSUFBRSxPQUFPLElBQUk7QUFBclUsUUFBbVYsSUFBRSxPQUFPO0FBQVMsZUFBVyxHQUFFO0FBQUMsVUFBRyxBQUFPLE1BQVAsUUFBVSxBQUFXLE9BQU8sTUFBbEI7QUFBb0IsZUFBTztBQUFLLFVBQUUsS0FBRyxFQUFFLE1BQUksRUFBRTtBQUFjLGFBQU0sQUFBYSxPQUFPLE1BQXBCLGFBQXNCLElBQUU7QUFBQTtBQUN0ZSxRQUFJLElBQUUsRUFBQyxXQUFVLFdBQVU7QUFBQyxhQUFNO0FBQUEsT0FBSSxvQkFBbUIsV0FBVTtBQUFBLE9BQUcscUJBQW9CLFdBQVU7QUFBQSxPQUFHLGlCQUFnQixXQUFVO0FBQUE7QUFBakksUUFBcUksSUFBRSxPQUFPO0FBQTlJLFFBQXFKLElBQUU7QUFBRyxlQUFXLEdBQUUsR0FBRSxHQUFFO0FBQUMsV0FBSyxRQUFNO0FBQUUsV0FBSyxVQUFRO0FBQUUsV0FBSyxPQUFLO0FBQUUsV0FBSyxVQUFRLEtBQUc7QUFBQTtBQUFFLE1BQUUs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LGlCQUFpQjtBQUFBLFVBQ2pCLGFBQWE7QUFBQSxVQUNiLFVBQVU7QUFBQSxVQUNWLGNBQWM7QUFBQSxVQUNkLFFBQVE7QUFBQSxVQUNSLGFBQWE7QUFBQSxVQUNiLHlCQUF5QjtBQUFBLFVBQ3pCLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLGNBQWM7QUFBQSxVQUNkLE9BQU87QUFBQSxVQUNQLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLHlCQUF5QjtBQUFBLFVBQ3pCLHVCQUF1QjtBQUFBLFVBQ3ZCLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULGNBQWM7QUFBQSxVQUNkLEtBQUs7QUFBQSxVQUNMLE1BQU07QUFBQSxVQUNOLFlBQVk7QUFBQSxVQUNaLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLFFBQVE7QUFBQSxVQUNSLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLGNBQWM7QUFBQSxVQUNkLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLFlBQVk7QUFBQSxVQUNaLGFBQWE7QUFBQSxVQUNiLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLFdBQVc7QUFBQSxVQUNYLElBQUk7QUFBQSxVQUNKLFFBQVE7QUFBQSxVQUNSLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLFdBQVc7QUFBQSxVQUNYLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLGFBQWE7QUFBQSxVQUNiLGNBQWM7QUFBQSxVQUNkLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLEtBQUs7QUFBQSxVQUNMLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxVQUNaLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULGFBQWE7QUFBQSxVQUNiLGFBQWE7QUFBQSxVQUNiLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFlBQVk7QUFBQSxVQUNaLFVBQVU7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLEtBQUs7QUFBQSxVQUNMLFVBQVU7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULE9BQU87QUFBQSxVQUNQLFFBQVE7QUFBQSxVQUNSLFdBQVc7QUFBQSxVQUNYLFVBQVU7QUFBQSxVQUNWLFVBQVU7QUFBQSxVQUNWLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFlBQVk7QUFBQSxVQUNaLEtBQUs7QUFBQSxVQUNMLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxVQUNQLFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE1BQU07QUFBQSxVQUNOLFFBQVE7QUFBQSxVQUNSLE9BQU87QUFBQSxVQUNQLE9BQU87QUFBQSxVQUNQLE9BQU87QUFB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LE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BRVAsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BRVosU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BRVYsWUFBWTtBQUFBLE1BRVosVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BRVgsU0FBVTtBQUFBLE1BQ1YsVUFBVztBQUFBLE1BQ1gsV0FBWTtBQUFBLE1BQ1osV0FBWTtBQUFBLE1BRVosVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLE1BRVosUUFBUTtBQUFBLE1BQ1IsU0FBUztBQUFBLE1BRVQsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLE1BRWIsV0FBVztBQUFBLE1BQ1gsZUFBZTtBQUFBLE1BQ2YsZUFBZTtBQUFBLE1BRWYsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BQ1QsU0FBUztBQUFBLE1BRVQsb0JBQW9CO0FBQUEsTUFDcEIsaUJBQWlCO0FBQUEsTUFDakIsdUJBQXVCO0FBQUEsTUFDdkIsWUFBWTtBQUFBLE1BQ1osc0JBQXNCO0FBQUEsTUFDdEIsUUFBUTtBQUFBLE1BRVIsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsY0FBYztBQUFBLE1BRWQsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLE1BQ1QsV0FBVztBQUFBLE1BRVgsZ0JBQWdCO0FBQUEsTUFFaEIsWUFBWTtBQUFBLE1BQ1osYUFBYTtBQUFBLE1BRWIsWUFBWTtBQUFBLE1BQ1osTUFBTTtBQUFBLE1BRU4scUJBQXFCO0FBQUEsTUFDckIsa0JBQWtCO0FBQUEsTUFDbEIsTUFBTTtBQUFBLE1BRU4sY0FBYztBQUFBLE1BQ2QsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BRVgsT0FBTztBQUFBLE1BQ1AsZUFBZTtBQUFBO0FBQUE7QUFBQTs7O0FDM0tuQjtBQUFBO0FBQUE7QUFHQSxZQUFPLFVBQVU7QUFBQSxNQUNmLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULGNBQWM7QUFBQSxRQUNaLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLE1BQ1QsZUFBZTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsUUFDYixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFVBQVU7QUFBQSxNQUNWLGVBQWU7QUFBQSxRQUNiLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsUUFDYixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFVBQVU7QUFBQSxNQUNWLGVBQWU7QUFBQSxRQUNiLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsUUFDYixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFVBQVU7QUFBQSxNQUNWLGVBQWU7QUFBQSxRQUNiLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxZQUFZO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFlBQVk7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxZQUFZO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFlBQVk7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxZQUFZO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLFlBQVk7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLFFBQ1gsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLGFBQWE7QUFBQSxRQUNYLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLFFBQ1gsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLGFBQWE7QUFBQSxRQUNYLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsTUFDVixZQUFZO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFVBQVU7QUFBQSxNQUNWLFlBQVk7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLE1BQ1YsWUFBWTtBQUFBLE1BQ1osVUFBVTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLGFBQWE7QUFBQSxNQUNiLFVBQVU7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLGFBQWE7QUFBQSxNQUNiLFVBQVU7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxXQUFXO0FBQUEsTUFDWCxhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxNQUNYLGFBQWE7QUFBQSxNQUNiLGVBQWU7QUFBQSxRQUNiLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsZUFBZTtBQUFBLFFBQ2IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxZQUFZO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLGNBQWM7QUFBQSxRQUNaLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxjQUFjO0FBQUEsUUFDWixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFdBQVc7QUFBQSxRQUNULFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsY0FBYztBQUFBLFFBQ1osUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxjQUFjO0FBQUEsUUFDWixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsU0FBUztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxVQUFVO0FBQUEsUUFDUixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFFBQVE7QUFBQSxRQUNOLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsbUJBQW1CO0FBQUEsUUFDakIsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxjQUFjO0FBQUEsUUFDWixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFNBQVM7QUFBQSxRQUNQLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsVUFBVTtBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxZQUFZO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFlBQVk7QUFBQSxRQUNWLFFBQVE7QUFBQSxRQUNSLFNBQVM7QUFBQTtBQUFBLE1BRVgsWUFBWTtBQUFBLFFBQ1YsUUFBUTtBQUFBLFFBQ1IsU0FBUztBQUFBO0FBQUEsTUFFWCxhQUFhO0FBQUEsUUFDWCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUE7QUFBQSxNQUVYLFNBQVM7QUFBQSxR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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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 diff --git a/main.ts b/main.ts index 0e623fa..c10f651 100644 --- a/main.ts +++ b/main.ts @@ -139,7 +139,7 @@ export default class TimestampPlugin extends Plugin { this.addCommand({ id: 'pause-player', name: 'Pause player', - editorCallback: (editor: Editor, view: MarkdownView) => { + callback: () => { this.setPlaying(!this.player.props.playing) } }); @@ -148,7 +148,7 @@ export default class TimestampPlugin extends Plugin { this.addCommand({ id: 'seek-forward', name: 'Seek Forward', - editorCallback: (editor: Editor, view: MarkdownView) => { + callback: () => { if (this.player) this.player.seekTo(this.player.getCurrentTime() + parseInt(this.settings.forwardSeek)); } }); @@ -157,7 +157,7 @@ export default class TimestampPlugin extends Plugin { this.addCommand({ id: 'seek-backward', name: 'Seek Backward', - editorCallback: (editor: Editor, view: MarkdownView) => { + callback: () => { if (this.player) this.player.seekTo(this.player.getCurrentTime() - parseInt(this.settings.backwardsSeek)); } }); @@ -194,6 +194,9 @@ export default class TimestampPlugin extends Plugin { id: "add-subtitles", name: "Add subtitle file", callback: async () => { + if (!this.player) { + return new Notice("Player is not working right now") + } var input = document.createElement("input"); input.type = "file"; input.accept = ".srt,.vtt"; @@ -213,6 +216,7 @@ export default class TimestampPlugin extends Plugin { input.click(); }, }); + this.addCommand({ id: "video-snapshot", name: "Take and copy to clipboard snapshot from video", @@ -262,16 +266,16 @@ export default class TimestampPlugin extends Plugin { // This is called when a valid url is found => it activates the View which loads the React view async activateView(url: string, editor: Editor) { - this.app.workspace.detachLeavesOfType(VIDEO_VIEW); - - await this.app.workspace.getRightLeaf(false).setViewState({ - type: VIDEO_VIEW, - active: true, - }); - - this.app.workspace.revealLeaf( - this.app.workspace.getLeavesOfType(VIDEO_VIEW)[0] - ); + // this.app.workspace.detachLeavesOfType(VIDEO_VIEW); + if (this.app.workspace.getLeavesOfType(VIDEO_VIEW).length == 0) { + await this.app.workspace.getRightLeaf(false).setViewState({ + type: VIDEO_VIEW, + active: true, + }); + } + // this.app.workspace.revealLeaf( + // this.app.workspace.getLeavesOfType(VIDEO_VIEW)[0] + // ); // This triggers the React component to be loaded this.app.workspace.getLeavesOfType(VIDEO_VIEW).forEach(async (leaf) => {